Merge branch 'openwrt:master' into master
This commit is contained in:
commit
5a55409e06
127 changed files with 4973 additions and 1392 deletions
|
@ -218,11 +218,6 @@ menu "Target Images"
|
|||
depends on GRUB_IMAGES || GRUB_EFI_IMAGES
|
||||
default y
|
||||
|
||||
config GRUB_SERIAL
|
||||
string "Serial port device"
|
||||
depends on GRUB_IMAGES || GRUB_EFI_IMAGES
|
||||
default "ttyS0"
|
||||
|
||||
config GRUB_BAUDRATE
|
||||
int "Serial port baud rate"
|
||||
depends on GRUB_IMAGES || GRUB_EFI_IMAGES
|
||||
|
@ -231,7 +226,8 @@ menu "Target Images"
|
|||
|
||||
config GRUB_FLOWCONTROL
|
||||
bool "Use RTE/CTS on serial console"
|
||||
depends on GRUB_SERIAL != ""
|
||||
depends on GRUB_IMAGES || GRUB_EFI_IMAGES
|
||||
depends on TARGET_SERIAL != ""
|
||||
|
||||
config GRUB_BOOTOPTS
|
||||
string "Extra kernel boot options"
|
||||
|
@ -277,6 +273,11 @@ menu "Target Images"
|
|||
depends on GRUB_IMAGES || GRUB_EFI_IMAGES
|
||||
select PACKAGE_kmod-e1000
|
||||
|
||||
config TARGET_SERIAL
|
||||
string "Serial port device"
|
||||
depends on TARGET_x86 || TARGET_armsr
|
||||
default "ttyS0"
|
||||
|
||||
config TARGET_IMAGES_GZIP
|
||||
bool "GZip images"
|
||||
depends on TARGET_ROOTFS_EXT4FS || TARGET_x86 || TARGET_armsr || TARGET_malta
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
LINUX_VERSION-5.15 = .139
|
||||
LINUX_KERNEL_HASH-5.15.139 = 9c68c10dfe18e59b892e940436dea6a18d167160d55e62563cf7282244d8044e
|
||||
LINUX_VERSION-5.15 = .140
|
||||
LINUX_KERNEL_HASH-5.15.140 = be2bee8b346f3ccb35879f16c80a323edda571e36190403805c14a9ea24e4a47
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
LINUX_VERSION-6.1 = .63
|
||||
LINUX_KERNEL_HASH-6.1.63 = c29d043b01dd4fcc61a24fd027c5c7912b15b1f10d8e3c83a0cb935885f0758d
|
||||
LINUX_VERSION-6.1 = .64
|
||||
LINUX_KERNEL_HASH-6.1.64 = 629daa38f3ea67f29610bfbd53f9f38f46834d3654451e9474100490c66dc7e7
|
||||
|
|
|
@ -11,6 +11,36 @@ get_dt_led_path() {
|
|||
echo "$ledpath"
|
||||
}
|
||||
|
||||
get_dt_led_color_func() {
|
||||
local enum
|
||||
local func
|
||||
local idx
|
||||
local label
|
||||
|
||||
[ -e "$1/function" ] && func=$(cat "$1/function")
|
||||
[ -e "$1/color" ] && idx=$((0x$(hexdump -n 4 -e '4/1 "%02x"' "$1/color")))
|
||||
[ -e "$1/function-enumerator" ] && \
|
||||
enum=$((0x$(hexdump -n 4 -e '4/1 "%02x"' "$1/function-enumerator")))
|
||||
|
||||
[ -z "$idx" ] && [ -z "$func" ] && return 2
|
||||
|
||||
if [ -n "$idx" ]; then
|
||||
for color in "white" "red" "green" "blue" "amber" \
|
||||
"violet" "yellow" "ir" "multicolor" "rgb" \
|
||||
"purple" "orange" "pink" "cyan" "lime"
|
||||
do
|
||||
[ $idx -eq 0 ] && label="$color" && break
|
||||
idx=$((idx-1))
|
||||
done
|
||||
fi
|
||||
|
||||
label="$label:$func"
|
||||
[ -n "$enum" ] && label="$label-$enum"
|
||||
echo "$label"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
get_dt_led() {
|
||||
local label
|
||||
local ledpath=$(get_dt_led_path $1)
|
||||
|
@ -18,6 +48,7 @@ get_dt_led() {
|
|||
[ -n "$ledpath" ] && \
|
||||
label=$(cat "$ledpath/label" 2>/dev/null) || \
|
||||
label=$(cat "$ledpath/chan-name" 2>/dev/null) || \
|
||||
label=$(get_dt_led_color_func "$ledpath") || \
|
||||
label=$(basename "$ledpath")
|
||||
|
||||
echo "$label"
|
||||
|
|
|
@ -1542,6 +1542,26 @@ endef
|
|||
|
||||
$(eval $(call KernelPackage,sfp))
|
||||
|
||||
|
||||
define KernelPackage/stmmac-core
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Synopsis Ethernet Controller core (NXP,STMMicro,others)
|
||||
DEPENDS:=@TARGET_x86_64||TARGET_armsr_armv8 +kmod-pcs-xpcs +kmod-ptp \
|
||||
+kmod-of-mdio
|
||||
KCONFIG:=CONFIG_STMMAC_ETH \
|
||||
CONFIG_STMMAC_SELFTESTS=n \
|
||||
CONFIG_STMMAC_PLATFORM \
|
||||
CONFIG_CONFIG_DWMAC_DWC_QOS_ETH=n \
|
||||
CONFIG_DWMAC_GENERIC
|
||||
FILES=$(LINUX_DIR)/drivers/net/ethernet/stmicro/stmmac/stmmac.ko \
|
||||
$(LINUX_DIR)/drivers/net/ethernet/stmicro/stmmac/stmmac-platform.ko \
|
||||
$(LINUX_DIR)/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.ko
|
||||
AUTOLOAD=$(call AutoLoad,40,stmmac stmmac-platform dwmac-generic)
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,stmmac-core))
|
||||
|
||||
|
||||
define KernelPackage/igc
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Intel(R) Ethernet Controller I225 Series support
|
||||
|
|
|
@ -15,9 +15,9 @@ PKG_LICENSE_FILES:=
|
|||
|
||||
PKG_SOURCE_URL:=https://github.com/kaloz/mwlwifi
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2023-11-20
|
||||
PKG_SOURCE_VERSION:=2a5a4ae31a2ad1b432a1dcb6ef6c3298e3330b2c
|
||||
PKG_MIRROR_HASH:=b1151051ed6eba063c05916d8dbc4f03f804772d217e8c65b7baa263ded7a961
|
||||
PKG_SOURCE_DATE:=2023-11-29
|
||||
PKG_SOURCE_VERSION:=ebf3167445f108346dcff9a31a708534c0bd7cc5
|
||||
PKG_MIRROR_HASH:=1d39ad25f4ad1fafff03a70341c2dabde8db4075f56163d40f8ae8aef2e2bb2d
|
||||
|
||||
PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
|
|
@ -111,10 +111,10 @@ cc1: all warnings being treated as errors
|
|||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
debugfs.c | 2 +-
|
||||
hif/fwcmd.c | 2 +-
|
||||
hif/pcie/pcie.c | 4 ++--
|
||||
hif/pcie/tx_ndp.c | 2 +-
|
||||
debugfs.c | 2 +-
|
||||
hif/fwcmd.c | 2 +-
|
||||
hif/pcie/8964/tx_ndp.c | 2 +-
|
||||
hif/pcie/pcie.c | 4 ++--
|
||||
4 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/debugfs.c
|
||||
|
@ -152,7 +152,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||
return -ENOMEM;
|
||||
--- a/hif/pcie/pcie.c
|
||||
+++ b/hif/pcie/pcie.c
|
||||
@@ -1464,8 +1464,8 @@ static void pcie_bf_mimo_ctrl_decode(str
|
||||
@@ -1466,8 +1466,8 @@ static void pcie_bf_mimo_ctrl_decode(struct mwl_priv *priv,
|
||||
&fp_data->f_pos);
|
||||
filp_close(fp_data, current->files);
|
||||
} else {
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
From ad911365cac3723d1c00d048905a5e22ff4a10f3 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
Date: Sun, 18 Jun 2023 17:53:27 +0200
|
||||
Subject: [PATCH 1/2] remove uaccess and get_fs calls from PCIe for Kenel >=
|
||||
5.18
|
||||
|
||||
Remove the calls to deprecated get_fs and force_uaccess_* API for modern
|
||||
kernels.
|
||||
|
||||
The get_fs functionality and the transitional force_uaccess_* calls have
|
||||
been removed Kernel 5.18 [1] while read and write operations have been
|
||||
refactored, so the code can work on kernel- and userspace data without
|
||||
the need to shifting the boundary using set_fs().
|
||||
|
||||
[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=967747bbc084b93b54e66f9047d342232314cd25
|
||||
|
||||
Signed-off-by: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
---
|
||||
hif/pcie/pcie.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/hif/pcie/pcie.c
|
||||
+++ b/hif/pcie/pcie.c
|
||||
@@ -1439,7 +1439,9 @@ static void pcie_bf_mimo_ctrl_decode(str
|
||||
const char filename[] = "/tmp/BF_MIMO_Ctrl_Field_Output.txt";
|
||||
char str_buf[256];
|
||||
char *buf = &str_buf[0];
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
|
||||
mm_segment_t oldfs;
|
||||
+#endif
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0)
|
||||
oldfs = get_fs();
|
||||
@@ -1447,7 +1449,7 @@ static void pcie_bf_mimo_ctrl_decode(str
|
||||
#elif LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0)
|
||||
oldfs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
-#else
|
||||
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
|
||||
oldfs = force_uaccess_begin();
|
||||
#endif
|
||||
|
||||
@@ -1471,7 +1473,7 @@ static void pcie_bf_mimo_ctrl_decode(str
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0)
|
||||
set_fs(oldfs);
|
||||
-#else
|
||||
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
|
||||
force_uaccess_end(oldfs);
|
||||
#endif
|
||||
}
|
|
@ -1,352 +0,0 @@
|
|||
From 61c75dce424c180b633c64613a1948df5a41cf1e Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
Date: Sun, 18 Jun 2023 17:59:07 +0200
|
||||
Subject: [PATCH 2/2] replace usage of the deprecated "pci-dma-compat.h" API
|
||||
|
||||
The pci-dma-compat API has been legacy for quite a while and was removed
|
||||
with 5.18 [1]. Migrate all calls, so the module can be compiled against
|
||||
modern kernel versions.
|
||||
|
||||
Replace some compat calls:
|
||||
* pci_set_dma_mask with dma_set_mask
|
||||
* pci_(un)map_single with dma_(un)map_single
|
||||
* pci_dma_mapping_error with dma_mapping_error
|
||||
* PCI_DMA_{FROM,TO}DEVICE with DMA_{FOM,TO}_DEVICE
|
||||
|
||||
[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=7968778914e53788a01c2dee2692cab157de9ac0
|
||||
|
||||
Signed-off-by: Stefan Kalscheuer <stefan@stklcode.de>
|
||||
---
|
||||
hif/pcie/pcie.c | 2 +-
|
||||
hif/pcie/rx.c | 20 ++++++++++----------
|
||||
hif/pcie/rx_ndp.c | 20 ++++++++++----------
|
||||
hif/pcie/tx.c | 22 +++++++++++-----------
|
||||
hif/pcie/tx_ndp.c | 14 +++++++-------
|
||||
5 files changed, 39 insertions(+), 39 deletions(-)
|
||||
|
||||
--- a/hif/pcie/pcie.c
|
||||
+++ b/hif/pcie/pcie.c
|
||||
@@ -1701,7 +1701,7 @@ static int pcie_probe(struct pci_dev *pd
|
||||
return rc;
|
||||
}
|
||||
|
||||
- rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
|
||||
+ rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
|
||||
if (rc) {
|
||||
pr_err("%s: 32-bit PCI DMA not supported\n",
|
||||
PCIE_DRV_NAME);
|
||||
--- a/hif/pcie/8864/rx.c
|
||||
+++ b/hif/pcie/8864/rx.c
|
||||
@@ -107,11 +107,11 @@ static int pcie_rx_ring_init(struct mwl_
|
||||
desc->prx_ring[i].rssi = 0x00;
|
||||
desc->prx_ring[i].pkt_len =
|
||||
cpu_to_le16(SYSADPT_MAX_AGGR_SIZE);
|
||||
- dma = pci_map_single(pcie_priv->pdev,
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev,
|
||||
rx_hndl->psk_buff->data,
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
return -ENOMEM;
|
||||
@@ -153,11 +153,11 @@ static void pcie_rx_ring_cleanup(struct
|
||||
if (!rx_hndl->psk_buff)
|
||||
continue;
|
||||
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu
|
||||
(rx_hndl->pdesc->pphys_buff_data),
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
+ DMA_FROM_DEVICE);
|
||||
|
||||
dev_kfree_skb_any(rx_hndl->psk_buff);
|
||||
|
||||
@@ -332,11 +332,11 @@ static inline int pcie_rx_refill(struct
|
||||
rx_hndl->pdesc->rssi = 0x00;
|
||||
rx_hndl->pdesc->pkt_len = cpu_to_le16(desc->rx_buf_size);
|
||||
|
||||
- dma = pci_map_single(pcie_priv->pdev,
|
||||
+ dma = dma_map_single(&pcie_priv->pdev->dev,
|
||||
rx_hndl->psk_buff->data,
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
dev_kfree_skb_any(rx_hndl->psk_buff);
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
@@ -410,10 +410,10 @@ void pcie_8864_rx_recv(unsigned long dat
|
||||
prx_skb = curr_hndl->psk_buff;
|
||||
if (!prx_skb)
|
||||
goto out;
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(curr_hndl->pdesc->pphys_buff_data),
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
+ DMA_FROM_DEVICE);
|
||||
pkt_len = le16_to_cpu(curr_hndl->pdesc->pkt_len);
|
||||
|
||||
if (skb_tailroom(prx_skb) < pkt_len) {
|
||||
--- a/hif/pcie/8864/tx.c
|
||||
+++ b/hif/pcie/8864/tx.c
|
||||
@@ -171,11 +171,11 @@ static void pcie_tx_ring_cleanup(struct
|
||||
desc->tx_hndl[i].psk_buff->data,
|
||||
le32_to_cpu(
|
||||
desc->ptx_ring[i].pkt_ptr));
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(
|
||||
desc->ptx_ring[i].pkt_ptr),
|
||||
desc->tx_hndl[i].psk_buff->len,
|
||||
- PCI_DMA_TODEVICE);
|
||||
+ DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(desc->tx_hndl[i].psk_buff);
|
||||
desc->ptx_ring[i].status =
|
||||
cpu_to_le32(EAGLE_TXD_STATUS_IDLE);
|
||||
@@ -291,9 +291,9 @@ static inline void pcie_tx_skb(struct mw
|
||||
tx_desc->type = tx_ctrl->type;
|
||||
tx_desc->xmit_control = tx_ctrl->xmit_control;
|
||||
tx_desc->sap_pkt_info = 0;
|
||||
- dma = pci_map_single(pcie_priv->pdev, tx_skb->data,
|
||||
- tx_skb->len, PCI_DMA_TODEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev, tx_skb->data,
|
||||
+ tx_skb->len, DMA_TO_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
dev_kfree_skb_any(tx_skb);
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
@@ -447,10 +447,10 @@ static void pcie_non_pfu_tx_done(struct
|
||||
(tx_desc->status & cpu_to_le32(EAGLE_TXD_STATUS_OK)) &&
|
||||
(!(tx_desc->status &
|
||||
cpu_to_le32(EAGLE_TXD_STATUS_FW_OWNED)))) {
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(tx_desc->pkt_ptr),
|
||||
le16_to_cpu(tx_desc->pkt_len),
|
||||
- PCI_DMA_TODEVICE);
|
||||
+ DMA_TO_DEVICE);
|
||||
done_skb = tx_hndl->psk_buff;
|
||||
rate = le32_to_cpu(tx_desc->rate_info);
|
||||
tx_desc->pkt_ptr = 0;
|
||||
@@ -925,4 +925,4 @@ void pcie_8864_tx_del_sta_amsdu_pkts(str
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&sta_info->amsdu_lock);
|
||||
-}
|
||||
\ No newline at end of file
|
||||
+}
|
||||
--- a/hif/pcie/8964/rx_ndp.c
|
||||
+++ b/hif/pcie/8964/rx_ndp.c
|
||||
@@ -86,11 +86,11 @@ static int pcie_rx_ring_init_ndp(struct
|
||||
}
|
||||
skb_reserve(psk_buff, MIN_BYTES_RX_HEADROOM);
|
||||
|
||||
- dma = pci_map_single(pcie_priv->pdev,
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev,
|
||||
psk_buff->data,
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
return -ENOMEM;
|
||||
@@ -120,11 +120,11 @@ static void pcie_rx_ring_cleanup_ndp(str
|
||||
if (desc->prx_ring) {
|
||||
for (i = 0; i < MAX_NUM_RX_DESC; i++) {
|
||||
if (desc->rx_vbuflist[i]) {
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(
|
||||
desc->prx_ring[i].data),
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
+ DMA_FROM_DEVICE);
|
||||
desc->rx_vbuflist[i] = NULL;
|
||||
}
|
||||
}
|
||||
@@ -411,11 +411,11 @@ static inline int pcie_rx_refill_ndp(str
|
||||
return -ENOMEM;
|
||||
skb_reserve(psk_buff, MIN_BYTES_RX_HEADROOM);
|
||||
|
||||
- dma = pci_map_single(pcie_priv->pdev,
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev,
|
||||
psk_buff->data,
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"refill: failed to map pci memory!\n");
|
||||
return -ENOMEM;
|
||||
@@ -520,10 +520,10 @@ recheck:
|
||||
break;
|
||||
}
|
||||
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(prx_desc->data),
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
+ DMA_FROM_DEVICE);
|
||||
|
||||
bad_mic = false;
|
||||
ctrl = le32_to_cpu(prx_ring_done->ctrl);
|
||||
--- a/hif/pcie/8964/tx_ndp.c
|
||||
+++ b/hif/pcie/8964/tx_ndp.c
|
||||
@@ -132,10 +132,10 @@ static void pcie_tx_ring_cleanup_ndp(str
|
||||
for (i = 0; i < MAX_TX_RING_SEND_SIZE; i++) {
|
||||
tx_skb = desc->tx_vbuflist[i];
|
||||
if (tx_skb) {
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
desc->pphys_tx_buflist[i],
|
||||
tx_skb->len,
|
||||
- PCI_DMA_TODEVICE);
|
||||
+ DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(tx_skb);
|
||||
desc->pphys_tx_buflist[i] = 0;
|
||||
desc->tx_vbuflist[i] = NULL;
|
||||
@@ -267,9 +267,9 @@ static inline int pcie_tx_skb_ndp(struct
|
||||
(TXRING_CTRL_TAG_MGMT << TXRING_CTRL_TAG_SHIFT));
|
||||
}
|
||||
|
||||
- dma = pci_map_single(pcie_priv->pdev, tx_skb->data,
|
||||
- tx_skb->len, PCI_DMA_TODEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev, tx_skb->data,
|
||||
+ tx_skb->len, DMA_TO_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
dev_kfree_skb_any(tx_skb);
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
@@ -451,10 +451,10 @@ void pcie_tx_done_ndp(struct ieee80211_h
|
||||
"buffer is NULL for tx done ring\n");
|
||||
break;
|
||||
}
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
desc->pphys_tx_buflist[index],
|
||||
skb->len,
|
||||
- PCI_DMA_TODEVICE);
|
||||
+ DMA_TO_DEVICE);
|
||||
desc->pphys_tx_buflist[index] = 0;
|
||||
desc->tx_vbuflist[index] = NULL;
|
||||
|
||||
--- a/hif/pcie/8997/rx.c
|
||||
+++ b/hif/pcie/8997/rx.c
|
||||
@@ -107,11 +107,11 @@ static int pcie_rx_ring_init(struct mwl_
|
||||
desc->prx_ring[i].rssi = 0x00;
|
||||
desc->prx_ring[i].pkt_len =
|
||||
cpu_to_le16(SYSADPT_MAX_AGGR_SIZE);
|
||||
- dma = pci_map_single(pcie_priv->pdev,
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev,
|
||||
rx_hndl->psk_buff->data,
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
return -ENOMEM;
|
||||
@@ -153,11 +153,11 @@ static void pcie_rx_ring_cleanup(struct
|
||||
if (!rx_hndl->psk_buff)
|
||||
continue;
|
||||
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu
|
||||
(rx_hndl->pdesc->pphys_buff_data),
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
+ DMA_FROM_DEVICE);
|
||||
|
||||
dev_kfree_skb_any(rx_hndl->psk_buff);
|
||||
|
||||
@@ -332,11 +332,11 @@ static inline int pcie_rx_refill(struct
|
||||
rx_hndl->pdesc->rssi = 0x00;
|
||||
rx_hndl->pdesc->pkt_len = cpu_to_le16(desc->rx_buf_size);
|
||||
|
||||
- dma = pci_map_single(pcie_priv->pdev,
|
||||
+ dma = dma_map_single(&pcie_priv->pdev->dev,
|
||||
rx_hndl->psk_buff->data,
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
dev_kfree_skb_any(rx_hndl->psk_buff);
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
@@ -410,10 +410,10 @@ void pcie_8997_rx_recv(unsigned long dat
|
||||
prx_skb = curr_hndl->psk_buff;
|
||||
if (!prx_skb)
|
||||
goto out;
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(curr_hndl->pdesc->pphys_buff_data),
|
||||
desc->rx_buf_size,
|
||||
- PCI_DMA_FROMDEVICE);
|
||||
+ DMA_FROM_DEVICE);
|
||||
pkt_len = le16_to_cpu(curr_hndl->pdesc->pkt_len);
|
||||
|
||||
if (skb_tailroom(prx_skb) < pkt_len) {
|
||||
--- a/hif/pcie/8997/tx.c
|
||||
+++ b/hif/pcie/8997/tx.c
|
||||
@@ -139,10 +139,10 @@ static void pcie_txbd_ring_delete(struct
|
||||
skb = pcie_priv->tx_buf_list[num];
|
||||
tx_desc = (struct pcie_tx_desc *)skb->data;
|
||||
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(tx_desc->pkt_ptr),
|
||||
skb->len,
|
||||
- PCI_DMA_TODEVICE);
|
||||
+ DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
pcie_priv->tx_buf_list[num] = NULL;
|
||||
@@ -222,9 +222,9 @@ static inline void pcie_tx_skb(struct mw
|
||||
tx_desc->type = tx_ctrl->type;
|
||||
tx_desc->xmit_control = tx_ctrl->xmit_control;
|
||||
tx_desc->sap_pkt_info = 0;
|
||||
- dma = pci_map_single(pcie_priv->pdev, tx_skb->data,
|
||||
- tx_skb->len, PCI_DMA_TODEVICE);
|
||||
- if (pci_dma_mapping_error(pcie_priv->pdev, dma)) {
|
||||
+ dma = dma_map_single(&(pcie_priv->pdev)->dev, tx_skb->data,
|
||||
+ tx_skb->len, DMA_TO_DEVICE);
|
||||
+ if (dma_mapping_error(&(pcie_priv->pdev)->dev, dma)) {
|
||||
dev_kfree_skb_any(tx_skb);
|
||||
wiphy_err(priv->hw->wiphy,
|
||||
"failed to map pci memory!\n");
|
||||
@@ -401,10 +401,10 @@ static void pcie_pfu_tx_done(struct mwl_
|
||||
pfu_dma = (struct pcie_pfu_dma_data *)done_skb->data;
|
||||
tx_desc = &pfu_dma->tx_desc;
|
||||
dma_data = &pfu_dma->dma_data;
|
||||
- pci_unmap_single(pcie_priv->pdev,
|
||||
+ dma_unmap_single(&(pcie_priv->pdev)->dev,
|
||||
le32_to_cpu(data_buf->paddr),
|
||||
le16_to_cpu(data_buf->len),
|
||||
- PCI_DMA_TODEVICE);
|
||||
+ DMA_TO_DEVICE);
|
||||
tx_desc->pkt_ptr = 0;
|
||||
tx_desc->pkt_len = 0;
|
||||
tx_desc->status = cpu_to_le32(EAGLE_TXD_STATUS_IDLE);
|
||||
@@ -875,4 +875,4 @@ void pcie_8997_tx_del_sta_amsdu_pkts(str
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&sta_info->amsdu_lock);
|
||||
-}
|
||||
\ No newline at end of file
|
||||
+}
|
|
@ -8,13 +8,13 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libbpf
|
||||
PKG_VERSION:=1.2.2
|
||||
PKG_VERSION:=1.3.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_URL:=https://github.com/libbpf/libbpf
|
||||
PKG_MIRROR_HASH:=d20f5a226e5729c87c367f3fba61c44d5e13176ef12637d0e0b30629fa3ab0d6
|
||||
PKG_MIRROR_HASH:=ff597a3635c2c099419d7e9e8bc44084f7f9e0c4ba2dcd571130165a19ed4ef4
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=1728e3e4bef0e138ea95ffe62163eb9a6ac6fa32
|
||||
PKG_SOURCE_VERSION:=v1.3.0
|
||||
PKG_ABI_VERSION:=$(firstword $(subst .,$(space),$(PKG_VERSION)))
|
||||
|
||||
PKG_MAINTAINER:=Tony Ambardar <itugrok@yahoo.com>
|
||||
|
|
|
@ -6,5 +6,5 @@
|
|||
|
||||
+CFLAGS = $(EXTRA_CFLAGS)
|
||||
CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89
|
||||
ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS)
|
||||
ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS)
|
||||
ALL_CFLAGS += $(CFLAGS) \
|
||||
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \
|
||||
|
|
|
@ -5,9 +5,9 @@ PKG_RELEASE=1
|
|||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/libubox.git
|
||||
PKG_MIRROR_HASH:=ec4487b5edc071a127b21a63666c20ac1ad516cd48629ee600a679040c709faf
|
||||
PKG_SOURCE_DATE:=2023-11-28
|
||||
PKG_SOURCE_VERSION:=e80dc00ee90c29ef56ae28f414b0e5bb361206e7
|
||||
PKG_MIRROR_HASH:=7b87783f968eeafd7ae79e5bb04e6c32b2aaaf0e6aca5be6e94b5393fc20807f
|
||||
PKG_SOURCE_DATE:=2023-11-30
|
||||
PKG_SOURCE_VERSION:=40acbe34632b8e4e860fe41bb14ab5d7d5c9cfe9
|
||||
PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE))
|
||||
CMAKE_INSTALL:=1
|
||||
|
||||
|
|
|
@ -11,9 +11,9 @@ PKG_NAME:=udebug
|
|||
CMAKE_INSTALL:=1
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/udebug.git
|
||||
PKG_MIRROR_HASH:=c0d3701516dcbe0fe2badbeda50076e4f07ec054c4a80621c7aaf4e83ea75d0c
|
||||
PKG_SOURCE_DATE:=2023-11-27
|
||||
PKG_SOURCE_VERSION:=d4b99820afd03a726ea50687d4393007da0fd0df
|
||||
PKG_MIRROR_HASH:=3f7d32cdfbcbc7a854deefb916a1ee5c5bf59fa154c36fb1e5ff491dae874b8e
|
||||
PKG_SOURCE_DATE:=2023-11-30
|
||||
PKG_SOURCE_VERSION:=b613879cb049123dd9dc68d5e6aef60141ebe483
|
||||
PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE))
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
|
|
@ -1,8 +1,28 @@
|
|||
config service procd
|
||||
option enabled 0
|
||||
|
||||
config service log
|
||||
option enabled 0
|
||||
option debug 0
|
||||
option kernel 1
|
||||
option syslog 1
|
||||
|
||||
config service hostapd
|
||||
option enabled 0
|
||||
option wpa_log 1
|
||||
option wpa_nl_rx 0
|
||||
option wpa_nl_tx 0
|
||||
option wpa_nl_ctrl 0
|
||||
|
||||
config service wpa_supplicant
|
||||
option enabled 0
|
||||
option wpa_log 1
|
||||
option wpa_nl_rx 0
|
||||
option wpa_nl_tx 0
|
||||
option wpa_nl_ctrl 0
|
||||
|
||||
config service netifd
|
||||
option enabled 0
|
||||
|
||||
config service umdns
|
||||
option enabled 0
|
||||
|
|
|
@ -782,33 +782,9 @@ let main_obj = {
|
|||
},
|
||||
};
|
||||
|
||||
function handle_debug_config(cfg) {
|
||||
hostapd.printf(`handle_debug_config: ${cfg}\n`);
|
||||
if (!cfg)
|
||||
return;
|
||||
|
||||
let data = cfg.service;
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
data = data.hostapd;
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
hostapd.udebug_set(!!+data.enabled);
|
||||
}
|
||||
|
||||
hostapd.data.ubus = ubus;
|
||||
hostapd.data.obj = ubus.publish("hostapd", main_obj);
|
||||
hostapd.data.debug_sub = ubus.subscriber((req) => {
|
||||
if (req.type != "config")
|
||||
return;
|
||||
|
||||
handle_debug_config(req.data);
|
||||
});
|
||||
|
||||
hostapd.data.debug_sub.subscribe("udebug");
|
||||
handle_debug_config(ubus.call("udebug", "get_config", {}));
|
||||
hostapd.udebug_set("hostapd", hostapd.data.ubus);
|
||||
|
||||
function bss_event(type, name, data) {
|
||||
let ubus = hostapd.data.ubus;
|
||||
|
@ -823,6 +799,7 @@ return {
|
|||
shutdown: function() {
|
||||
for (let phy in hostapd.data.config)
|
||||
iface_set_config(phy, null);
|
||||
hostapd.udebug_set(null);
|
||||
hostapd.ubus.disconnect();
|
||||
},
|
||||
bss_add: function(name, obj) {
|
||||
|
|
|
@ -244,32 +244,9 @@ let main_obj = {
|
|||
},
|
||||
};
|
||||
|
||||
function handle_debug_config(cfg) {
|
||||
if (!cfg)
|
||||
return;
|
||||
|
||||
let data = cfg.service;
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
data = data.wpa_supplicant;
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
wpas.udebug_set(!!+data.enabled);
|
||||
}
|
||||
|
||||
wpas.data.ubus = ubus;
|
||||
wpas.data.obj = ubus.publish("wpa_supplicant", main_obj);
|
||||
wpas.data.debug_sub = ubus.subscriber((req) => {
|
||||
if (req.type != "config")
|
||||
return;
|
||||
|
||||
handle_debug_config(req.data);
|
||||
});
|
||||
|
||||
wpas.data.debug_sub.subscribe("udebug");
|
||||
handle_debug_config(ubus.call("udebug", "get_config", {}));
|
||||
wpas.udebug_set("wpa_supplicant", wpas.data.ubus);
|
||||
|
||||
function iface_event(type, name, data) {
|
||||
let ubus = wpas.data.ubus;
|
||||
|
|
|
@ -16,8 +16,59 @@ static uc_vm_t vm;
|
|||
static struct uloop_timeout gc_timer;
|
||||
static struct udebug ud;
|
||||
static struct udebug_buf ud_log, ud_nl[3];
|
||||
|
||||
static const struct udebug_buf_meta meta_log = {
|
||||
.name = "wpa_log",
|
||||
.format = UDEBUG_FORMAT_STRING,
|
||||
};
|
||||
static const struct udebug_buf_meta meta_nl_ll = {
|
||||
.name = "wpa_nl_ctrl",
|
||||
.format = UDEBUG_FORMAT_PACKET,
|
||||
.sub_format = UDEBUG_DLT_NETLINK,
|
||||
};
|
||||
static const struct udebug_buf_meta meta_nl_tx = {
|
||||
.name = "wpa_nl_tx",
|
||||
.format = UDEBUG_FORMAT_PACKET,
|
||||
.sub_format = UDEBUG_DLT_NETLINK,
|
||||
};
|
||||
#define UDEBUG_FLAG_RX_FRAME (1ULL << 0)
|
||||
static const struct udebug_buf_flag rx_flags[] = {
|
||||
{ "rx_frame", UDEBUG_FLAG_RX_FRAME },
|
||||
};
|
||||
static const struct udebug_buf_meta meta_nl_rx = {
|
||||
.name = "wpa_nl_rx",
|
||||
.format = UDEBUG_FORMAT_PACKET,
|
||||
.sub_format = UDEBUG_DLT_NETLINK,
|
||||
.flags = rx_flags,
|
||||
.n_flags = ARRAY_SIZE(rx_flags),
|
||||
};
|
||||
static struct udebug_ubus_ring udebug_rings[] = {
|
||||
{
|
||||
.buf = &ud_log,
|
||||
.meta = &meta_log,
|
||||
.default_entries = 1024,
|
||||
.default_size = 64 * 1024
|
||||
},
|
||||
{
|
||||
.buf = &ud_nl[0],
|
||||
.meta = &meta_nl_rx,
|
||||
.default_entries = 1024,
|
||||
.default_size = 256 * 1024,
|
||||
},
|
||||
{
|
||||
.buf = &ud_nl[1],
|
||||
.meta = &meta_nl_tx,
|
||||
.default_entries = 1024,
|
||||
.default_size = 64 * 1024,
|
||||
},
|
||||
{
|
||||
.buf = &ud_nl[2],
|
||||
.meta = &meta_nl_ll,
|
||||
.default_entries = 1024,
|
||||
.default_size = 32 * 1024,
|
||||
}
|
||||
};
|
||||
char *udebug_service;
|
||||
struct udebug_ubus ud_ubus;
|
||||
|
||||
static void uc_gc_timer(struct uloop_timeout *timeout)
|
||||
{
|
||||
|
@ -301,68 +352,67 @@ static void udebug_netlink_hook(int tx, const void *data, size_t len)
|
|||
!(udebug_buf_flags(buf) & UDEBUG_FLAG_RX_FRAME))
|
||||
return;
|
||||
|
||||
if (!udebug_buf_valid(buf))
|
||||
return;
|
||||
|
||||
udebug_entry_init(buf);
|
||||
udebug_entry_append(buf, &hdr, sizeof(hdr));
|
||||
udebug_entry_append(buf, data, len);
|
||||
udebug_entry_add(buf);
|
||||
}
|
||||
|
||||
uc_value_t *uc_wpa_udebug_set(uc_vm_t *vm, size_t nargs)
|
||||
static void
|
||||
wpa_udebug_config(struct udebug_ubus *ctx, struct blob_attr *data,
|
||||
bool enabled)
|
||||
{
|
||||
static const struct udebug_buf_meta meta_log = {
|
||||
.name = "wpa_log",
|
||||
.format = UDEBUG_FORMAT_STRING,
|
||||
};
|
||||
static const struct udebug_buf_meta meta_nl_ll = {
|
||||
.name = "wpa_nl_ctrl",
|
||||
.format = UDEBUG_FORMAT_PACKET,
|
||||
.sub_format = UDEBUG_DLT_NETLINK,
|
||||
};
|
||||
static const struct udebug_buf_meta meta_nl_tx = {
|
||||
.name = "wpa_nl_tx",
|
||||
.format = UDEBUG_FORMAT_PACKET,
|
||||
.sub_format = UDEBUG_DLT_NETLINK,
|
||||
};
|
||||
static const struct udebug_buf_flag rx_flags[] = {
|
||||
{ "rx_frame", UDEBUG_FLAG_RX_FRAME },
|
||||
};
|
||||
static const struct udebug_buf_meta meta_nl_rx = {
|
||||
.name = "wpa_nl_rx",
|
||||
.format = UDEBUG_FORMAT_PACKET,
|
||||
.sub_format = UDEBUG_DLT_NETLINK,
|
||||
.flags = rx_flags,
|
||||
.n_flags = ARRAY_SIZE(rx_flags),
|
||||
};
|
||||
bool val = ucv_is_truish(uc_fn_arg(0));
|
||||
static bool enabled = false;
|
||||
|
||||
if (enabled == val)
|
||||
return ucv_boolean_new(true);
|
||||
|
||||
enabled = val;
|
||||
if (val) {
|
||||
udebug_init(&ud);
|
||||
udebug_auto_connect(&ud, NULL);
|
||||
udebug_buf_init(&ud_log, 1024, 64 * 1024);
|
||||
udebug_buf_add(&ud, &ud_log, &meta_log);
|
||||
udebug_buf_init(&ud_nl[0], 1024, 256 * 1024);
|
||||
udebug_buf_add(&ud, &ud_nl[0], &meta_nl_rx);
|
||||
udebug_buf_init(&ud_nl[1], 1024, 64 * 1024);
|
||||
udebug_buf_add(&ud, &ud_nl[1], &meta_nl_tx);
|
||||
udebug_buf_init(&ud_nl[2], 256, 32 * 1024);
|
||||
udebug_buf_add(&ud, &ud_nl[2], &meta_nl_ll);
|
||||
udebug_ubus_apply_config(&ud, udebug_rings, ARRAY_SIZE(udebug_rings),
|
||||
data, enabled);
|
||||
|
||||
if (udebug_buf_valid(&ud_log)) {
|
||||
wpa_printf_hook = udebug_printf_hook;
|
||||
wpa_hexdump_hook = udebug_hexdump_hook;
|
||||
wpa_netlink_hook = udebug_netlink_hook;
|
||||
} else {
|
||||
for (size_t i = 0; i < ARRAY_SIZE(ud_nl); i++)
|
||||
udebug_buf_free(&ud_nl[i]);
|
||||
udebug_buf_free(&ud_log);
|
||||
udebug_free(&ud);
|
||||
wpa_printf_hook = NULL;
|
||||
wpa_hexdump_hook = NULL;
|
||||
}
|
||||
|
||||
if (udebug_buf_valid(&ud_nl[0]) ||
|
||||
udebug_buf_valid(&ud_nl[1]) ||
|
||||
udebug_buf_valid(&ud_nl[2]))
|
||||
wpa_netlink_hook = udebug_netlink_hook;
|
||||
else
|
||||
wpa_netlink_hook = NULL;
|
||||
}
|
||||
|
||||
uc_value_t *uc_wpa_udebug_set(uc_vm_t *vm, size_t nargs)
|
||||
{
|
||||
uc_value_t *name = uc_fn_arg(0);
|
||||
uc_value_t *ubus = uc_fn_arg(1);
|
||||
static bool enabled = false;
|
||||
struct ubus_context *ctx;
|
||||
bool cur_en;
|
||||
|
||||
cur_en = ucv_type(name) == UC_STRING;
|
||||
ctx = ucv_resource_data(ubus, "ubus.connection");
|
||||
if (!ctx)
|
||||
cur_en = false;
|
||||
|
||||
if (enabled == cur_en)
|
||||
return ucv_boolean_new(true);
|
||||
|
||||
enabled = cur_en;
|
||||
if (enabled) {
|
||||
udebug_service = strdup(ucv_string_get(name));
|
||||
udebug_init(&ud);
|
||||
udebug_auto_connect(&ud, NULL);
|
||||
udebug_ubus_init(&ud_ubus, ctx, udebug_service, wpa_udebug_config);
|
||||
} else {
|
||||
udebug_ubus_free(&ud_ubus);
|
||||
for (size_t i = 0; i < ARRAY_SIZE(udebug_rings); i++)
|
||||
if (udebug_buf_valid(udebug_rings[i].buf))
|
||||
udebug_buf_free(udebug_rings[i].buf);
|
||||
udebug_free(&ud);
|
||||
free(udebug_service);
|
||||
}
|
||||
|
||||
return ucv_boolean_new(true);
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bpftools
|
||||
PKG_VERSION:=7.2.0
|
||||
PKG_VERSION:=7.3.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_URL:=https://github.com/libbpf/bpftool
|
||||
PKG_MIRROR_HASH:=c8fe336005019fee4d4fd416ce68a749fb479786dead69d6a0b3b04bcd903b98
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=19ff0564980a7429e730f6987a0b0bf418b3c676
|
||||
PKG_MIRROR_HASH:=f9b9871f64986dd2e5dab7060bb919398256ba93964da49c62efaf0e6bc9bbc4
|
||||
PKG_SOURCE_VERSION:=v7.3.0
|
||||
|
||||
PKG_MAINTAINER:=Tony Ambardar <itugrok@yahoo.com>
|
||||
|
||||
|
|
|
@ -6,5 +6,5 @@
|
|||
|
||||
+CFLAGS = $(EXTRA_CFLAGS)
|
||||
CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89
|
||||
ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS)
|
||||
ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS)
|
||||
ALL_CFLAGS += $(CFLAGS) \
|
||||
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=procd
|
||||
PKG_RELEASE:=3
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/procd.git
|
||||
PKG_MIRROR_HASH:=a7e42525ae65eb1342e593a714e88bc59e46467cbb5a7fd7d7aca4a9815b7c0d
|
||||
PKG_SOURCE_DATE:=2023-06-25
|
||||
PKG_SOURCE_VERSION:=2db836553e8fc318143b38dbc6e12b8625cf5c33
|
||||
PKG_MIRROR_HASH:=48e5d555b5beb15cf936e1d2433b8e614de64a4eaf25293f0211eeb9ac79d534
|
||||
PKG_SOURCE_DATE:=2023-11-28
|
||||
PKG_SOURCE_VERSION:=7e6c6efd6fbcc7955801c5e2ac915a90697e1fd9
|
||||
CMAKE_INSTALL:=1
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
@ -40,7 +40,7 @@ CMAKE_OPTIONS += -DEARLY_PATH="$(TARGET_INIT_PATH)"
|
|||
define Package/procd/Default
|
||||
SECTION:=base
|
||||
CATEGORY:=Base system
|
||||
DEPENDS:=+ubusd +ubus +libjson-script +ubox +libubox \
|
||||
DEPENDS:=+ubusd +ubus +libjson-script +ubox +libubox +libudebug \
|
||||
+libubus +libblobmsg-json +libjson-c +jshn
|
||||
TITLE:=OpenWrt system process manager
|
||||
USERID:=:dialout=20 :audio=29
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ubox
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/ubox.git
|
||||
PKG_SOURCE_DATE:=2022-08-13
|
||||
PKG_SOURCE_VERSION:=4c7b720b9c63b826fb9404e454ae54f2ef5649d5
|
||||
PKG_MIRROR_HASH:=35178148034dfef36c5fda2bc8217617920bc1a3b86f72efbe87e85048a6a2a8
|
||||
PKG_SOURCE_DATE:=2023-11-30
|
||||
PKG_SOURCE_VERSION:=c08709cceb554cba02c935d1442f6a042fe6b2a8
|
||||
PKG_MIRROR_HASH:=719ae701546df7c5972352d778a980cbc9f48623dda86443398698837124818b
|
||||
CMAKE_INSTALL:=1
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
@ -44,7 +44,7 @@ endef
|
|||
define Package/logd
|
||||
SECTION:=base
|
||||
CATEGORY:=Base system
|
||||
DEPENDS:=+libubox +libubus +libblobmsg-json
|
||||
DEPENDS:=+libubox +libubus +libblobmsg-json +libudebug
|
||||
TITLE:=OpenWrt system log implementation
|
||||
USERID:=logd=514:logd=514
|
||||
endef
|
||||
|
|
|
@ -12,9 +12,9 @@ PKG_RELEASE:=1
|
|||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=https://github.com/jow-/ucode.git
|
||||
PKG_SOURCE_DATE:=2023-11-07
|
||||
PKG_SOURCE_VERSION:=a6e75e02528e36f3610a7f0073453018336def2e
|
||||
PKG_MIRROR_HASH:=e1a0f98ba865ed5911d5db3bfca55a2f1b825992bf5f7c7e324928d9412d7ae2
|
||||
PKG_SOURCE_DATE:=2023-11-30
|
||||
PKG_SOURCE_VERSION:=6e89b89e95bbb140bbff5ab72b8c9632727bf6a6
|
||||
PKG_MIRROR_HASH:=20ba99f8c2591b581cdf0245dd40301e517659193cddaa3a3888125fcc85b2aa
|
||||
PKG_MAINTAINER:=Jo-Philipp Wich <jo@mein.io>
|
||||
PKG_LICENSE:=ISC
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
GRUB_SERIAL:=$(call qstrip,$(CONFIG_GRUB_SERIAL))
|
||||
GRUB_SERIAL:=$(call qstrip,$(CONFIG_TARGET_SERIAL))
|
||||
ifeq ($(GRUB_SERIAL),)
|
||||
$(error This platform requires CONFIG_GRUB_SERIAL be set!)
|
||||
$(error This platform requires CONFIG_TARGET_SERIAL be set!)
|
||||
endif
|
||||
|
||||
define Package/base-files/install-target
|
||||
|
|
|
@ -15,7 +15,7 @@ ifneq ($(CONFIG_GRUB_CONSOLE),)
|
|||
GRUB_TERMINALS += console
|
||||
endif
|
||||
|
||||
GRUB_SERIAL:=$(call qstrip,$(CONFIG_GRUB_SERIAL))
|
||||
GRUB_SERIAL:=$(call qstrip,$(CONFIG_TARGET_SERIAL))
|
||||
|
||||
GRUB_SERIAL_CONFIG := serial --unit=0 --speed=$(CONFIG_GRUB_BAUDRATE) --word=8 --parity=no --stop=1 --rtscts=$(if $(CONFIG_GRUB_FLOWCONTROL),on,off)
|
||||
GRUB_TERMINALS += serial
|
||||
|
|
|
@ -216,24 +216,6 @@ endef
|
|||
|
||||
$(eval $(call KernelPackage,imx7-ulp-wdt))
|
||||
|
||||
define KernelPackage/stmmac-core
|
||||
SUBMENU=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Synopsis Ethernet Controller core (NXP,STMMicro,others)
|
||||
DEPENDS:=@(TARGET_armsr_armv8) +kmod-pcs-xpcs +kmod-ptp \
|
||||
+kmod-of-mdio
|
||||
KCONFIG:=CONFIG_STMMAC_ETH \
|
||||
CONFIG_STMMAC_SELFTESTS=n \
|
||||
CONFIG_STMMAC_PLATFORM \
|
||||
CONFIG_CONFIG_DWMAC_DWC_QOS_ETH=n \
|
||||
CONFIG_DWMAC_GENERIC
|
||||
FILES=$(LINUX_DIR)/drivers/net/ethernet/stmicro/stmmac/stmmac.ko \
|
||||
$(LINUX_DIR)/drivers/net/ethernet/stmicro/stmmac/stmmac-platform.ko \
|
||||
$(LINUX_DIR)/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.ko
|
||||
AUTOLOAD=$(call AutoLoad,40,stmmac stmmac-platform dwmac-generic)
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,stmmac-core))
|
||||
|
||||
define KernelPackage/dwmac-imx
|
||||
SUBMENU=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=NXP i.MX8 Ethernet controller
|
||||
|
|
|
@ -266,7 +266,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|||
static inline int mmc_blk_part_switch(struct mmc_card *card,
|
||||
unsigned int part_type);
|
||||
static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
|
||||
@@ -2994,6 +3001,8 @@ static int mmc_blk_probe(struct mmc_card
|
||||
@@ -2996,6 +3003,8 @@ static int mmc_blk_probe(struct mmc_card
|
||||
{
|
||||
struct mmc_blk_data *md;
|
||||
int ret = 0;
|
||||
|
@ -275,7 +275,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|||
|
||||
/*
|
||||
* Check that the card supports the command class(es) we need.
|
||||
@@ -3001,7 +3010,16 @@ static int mmc_blk_probe(struct mmc_card
|
||||
@@ -3003,7 +3012,16 @@ static int mmc_blk_probe(struct mmc_card
|
||||
if (!(card->csd.cmdclass & CCC_BLOCK_READ))
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -293,7 +293,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|||
|
||||
card->complete_wq = alloc_workqueue("mmc_complete",
|
||||
WQ_MEM_RECLAIM | WQ_HIGHPRI, 0);
|
||||
@@ -3016,6 +3034,17 @@ static int mmc_blk_probe(struct mmc_card
|
||||
@@ -3018,6 +3036,17 @@ static int mmc_blk_probe(struct mmc_card
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
@ -325,7 +325,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|||
}
|
||||
--- a/drivers/mmc/core/quirks.h
|
||||
+++ b/drivers/mmc/core/quirks.h
|
||||
@@ -129,6 +129,14 @@ static const struct mmc_fixup __maybe_un
|
||||
@@ -130,6 +130,14 @@ static const struct mmc_fixup __maybe_un
|
||||
MMC_FIXUP(CID_NAME_ANY, CID_MANFID_SANDISK_SD, 0x5344, add_quirk_sd,
|
||||
MMC_QUIRK_BROKEN_SD_DISCARD),
|
||||
|
||||
|
@ -2007,12 +2007,12 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|||
sdhci_dumpregs(host);
|
||||
--- a/include/linux/mmc/card.h
|
||||
+++ b/include/linux/mmc/card.h
|
||||
@@ -296,6 +296,8 @@ struct mmc_card {
|
||||
#define MMC_QUIRK_BROKEN_SD_DISCARD (1<<14) /* Disable broken SD discard support */
|
||||
@@ -297,6 +297,8 @@ struct mmc_card {
|
||||
#define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */
|
||||
#define MMC_QUIRK_BROKEN_CACHE_FLUSH (1<<16) /* Don't flush cache until the write has occurred */
|
||||
|
||||
+#define MMC_QUIRK_ERASE_BROKEN (1<<31) /* Skip erase */
|
||||
+
|
||||
bool written_flag; /* Indicates eMMC has been written since power on */
|
||||
bool reenable_cmdq; /* Re-enable Command Queue */
|
||||
|
||||
unsigned int erase_size; /* erase size in sectors */
|
||||
|
|
|
@ -33,7 +33,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
|||
#define USB_VENDOR_ID_BELKIN 0x050d
|
||||
#define USB_DEVICE_ID_FLIP_KVM 0x3201
|
||||
|
||||
@@ -1368,6 +1371,9 @@
|
||||
@@ -1369,6 +1372,9 @@
|
||||
#define USB_VENDOR_ID_XIAOMI 0x2717
|
||||
#define USB_DEVICE_ID_MI_SILENT_MOUSE 0x5014
|
||||
|
||||
|
@ -53,7 +53,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2), HID_QUIRK_ALWAYS_POLL },
|
||||
@@ -198,6 +199,7 @@ static const struct hid_device_id hid_qu
|
||||
@@ -199,6 +200,7 @@ static const struct hid_device_id hid_qu
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_GROUP_AUDIO), HID_QUIRK_NOGET },
|
||||
|
|
|
@ -594,7 +594,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
VM_BUG_ON_PAGE(tail > 2 && page_tail->mapping != TAIL_MAPPING,
|
||||
--- a/mm/memcontrol.c
|
||||
+++ b/mm/memcontrol.c
|
||||
@@ -5178,6 +5178,7 @@ static void __mem_cgroup_free(struct mem
|
||||
@@ -5179,6 +5179,7 @@ static void __mem_cgroup_free(struct mem
|
||||
|
||||
static void mem_cgroup_free(struct mem_cgroup *memcg)
|
||||
{
|
||||
|
@ -602,7 +602,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
memcg_wb_domain_exit(memcg);
|
||||
__mem_cgroup_free(memcg);
|
||||
}
|
||||
@@ -5241,6 +5242,7 @@ static struct mem_cgroup *mem_cgroup_all
|
||||
@@ -5242,6 +5243,7 @@ static struct mem_cgroup *mem_cgroup_all
|
||||
memcg->deferred_split_queue.split_queue_len = 0;
|
||||
#endif
|
||||
idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
|
||||
|
|
|
@ -424,7 +424,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
/* will mmdrop() in finish_task_switch(). */
|
||||
--- a/mm/memcontrol.c
|
||||
+++ b/mm/memcontrol.c
|
||||
@@ -6212,6 +6212,30 @@ static void mem_cgroup_move_task(void)
|
||||
@@ -6213,6 +6213,30 @@ static void mem_cgroup_move_task(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -455,7 +455,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
static int seq_puts_memcg_tunable(struct seq_file *m, unsigned long value)
|
||||
{
|
||||
if (value == PAGE_COUNTER_MAX)
|
||||
@@ -6555,6 +6579,7 @@ struct cgroup_subsys memory_cgrp_subsys
|
||||
@@ -6556,6 +6580,7 @@ struct cgroup_subsys memory_cgrp_subsys
|
||||
.css_reset = mem_cgroup_css_reset,
|
||||
.css_rstat_flush = mem_cgroup_css_rstat_flush,
|
||||
.can_attach = mem_cgroup_can_attach,
|
||||
|
|
|
@ -318,7 +318,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
mctz = soft_limit_tree_from_page(page);
|
||||
if (!mctz)
|
||||
return;
|
||||
@@ -3433,6 +3443,9 @@ unsigned long mem_cgroup_soft_limit_recl
|
||||
@@ -3434,6 +3444,9 @@ unsigned long mem_cgroup_soft_limit_recl
|
||||
unsigned long excess;
|
||||
unsigned long nr_scanned;
|
||||
|
||||
|
@ -328,7 +328,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
if (order > 0)
|
||||
return 0;
|
||||
|
||||
@@ -5321,6 +5334,7 @@ static int mem_cgroup_css_online(struct
|
||||
@@ -5322,6 +5335,7 @@ static int mem_cgroup_css_online(struct
|
||||
if (unlikely(mem_cgroup_is_root(memcg)))
|
||||
queue_delayed_work(system_unbound_wq, &stats_flush_dwork,
|
||||
2UL*HZ);
|
||||
|
@ -336,7 +336,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -5347,6 +5361,7 @@ static void mem_cgroup_css_offline(struc
|
||||
@@ -5348,6 +5362,7 @@ static void mem_cgroup_css_offline(struc
|
||||
memcg_offline_kmem(memcg);
|
||||
reparent_shrinker_deferred(memcg);
|
||||
wb_memcg_offline(memcg);
|
||||
|
@ -344,7 +344,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||
|
||||
drain_all_stock(memcg);
|
||||
|
||||
@@ -5358,6 +5373,7 @@ static void mem_cgroup_css_released(stru
|
||||
@@ -5359,6 +5374,7 @@ static void mem_cgroup_css_released(stru
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_css(css);
|
||||
|
||||
invalidate_reclaim_iterators(memcg);
|
||||
|
|
|
@ -125,7 +125,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
pl = kzalloc(sizeof(*pl), GFP_KERNEL);
|
||||
if (!pl)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -946,9 +987,10 @@ EXPORT_SYMBOL_GPL(phylink_create);
|
||||
@@ -947,9 +988,10 @@ EXPORT_SYMBOL_GPL(phylink_create);
|
||||
* @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
* @pcs: a pointer to the &struct phylink_pcs
|
||||
*
|
||||
|
@ -139,7 +139,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
*
|
||||
* Please note that there are behavioural changes with the mac_config()
|
||||
* callback if a PCS is present (denoting a newer setup) so removing a PCS
|
||||
@@ -959,6 +1001,14 @@ void phylink_set_pcs(struct phylink *pl,
|
||||
@@ -960,6 +1002,14 @@ void phylink_set_pcs(struct phylink *pl,
|
||||
{
|
||||
pl->pcs = pcs;
|
||||
pl->pcs_ops = pcs->ops;
|
||||
|
|
|
@ -66,7 +66,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||
phy_interface_empty(config->supported_interfaces)) {
|
||||
dev_err(config->dev,
|
||||
"phylink: error: empty supported_interfaces but mac_select_pcs() method present\n");
|
||||
@@ -1220,6 +1227,7 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -1221,6 +1228,7 @@ struct phylink *phylink_create(struct ph
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
if (pl->pcs_ops) {
|
||||
err = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode,
|
||||
state->interface,
|
||||
@@ -1260,6 +1285,7 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -1261,6 +1286,7 @@ struct phylink *phylink_create(struct ph
|
||||
pl->link_config.speed = SPEED_UNKNOWN;
|
||||
pl->link_config.duplex = DUPLEX_UNKNOWN;
|
||||
pl->link_config.an_enabled = true;
|
||||
|
@ -83,7 +83,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
pl->mac_ops = mac_ops;
|
||||
__set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
|
||||
timer_setup(&pl->link_poll, phylink_fixed_poll, 0);
|
||||
@@ -1651,6 +1677,8 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -1652,6 +1678,8 @@ void phylink_start(struct phylink *pl)
|
||||
if (pl->netdev)
|
||||
netif_carrier_off(pl->netdev);
|
||||
|
||||
|
@ -92,7 +92,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
/* Apply the link configuration to the MAC when starting. This allows
|
||||
* a fixed-link to start with the correct parameters, and also
|
||||
* ensures that we set the appropriate advertisement for Serdes links.
|
||||
@@ -1661,6 +1689,8 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -1662,6 +1690,8 @@ void phylink_start(struct phylink *pl)
|
||||
*/
|
||||
phylink_mac_initial_config(pl, true);
|
||||
|
||||
|
@ -101,7 +101,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
|
||||
phylink_run_resolve(pl);
|
||||
|
||||
@@ -1680,16 +1710,9 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -1681,16 +1711,9 @@ void phylink_start(struct phylink *pl)
|
||||
poll = true;
|
||||
}
|
||||
|
||||
|
@ -120,7 +120,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
if (poll)
|
||||
mod_timer(&pl->link_poll, jiffies + HZ);
|
||||
if (pl->phydev)
|
||||
@@ -1726,6 +1749,10 @@ void phylink_stop(struct phylink *pl)
|
||||
@@ -1727,6 +1750,10 @@ void phylink_stop(struct phylink *pl)
|
||||
}
|
||||
|
||||
phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED);
|
||||
|
|
|
@ -0,0 +1,229 @@
|
|||
From ec51fbd1b8a2bca2948dede99c14ec63dc57ff6b Mon Sep 17 00:00:00 2001
|
||||
From: Bjørn Mork <bjorn@mork.no>
|
||||
Date: Fri, 6 Jan 2023 17:07:38 +0100
|
||||
Subject: [PATCH] r8152: add USB device driver for config selection
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Subclassing the generic USB device driver to override the
|
||||
default configuration selection regardless of matching interface
|
||||
drivers.
|
||||
|
||||
The r815x family devices expose a vendor specific function which
|
||||
the r8152 interface driver wants to handle. This is the preferred
|
||||
device mode. Additionally one or more USB class functions are
|
||||
usually supported for hosts lacking a vendor specific driver. The
|
||||
choice is USB configuration based, with one alternate function per
|
||||
configuration.
|
||||
|
||||
Example device with both NCM and ECM alternate cfgs:
|
||||
|
||||
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=5000 MxCh= 0
|
||||
D: Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 3
|
||||
P: Vendor=0bda ProdID=8156 Rev=31.00
|
||||
S: Manufacturer=Realtek
|
||||
S: Product=USB 10/100/1G/2.5G LAN
|
||||
S: SerialNumber=001000001
|
||||
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=256mA
|
||||
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=00 Driver=r8152
|
||||
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=83(I) Atr=03(Int.) MxPS= 2 Ivl=128ms
|
||||
C: #Ifs= 2 Cfg#= 2 Atr=a0 MxPwr=256mA
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver=
|
||||
E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms
|
||||
I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver=
|
||||
I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver=
|
||||
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
C: #Ifs= 2 Cfg#= 3 Atr=a0 MxPwr=256mA
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=06 Prot=00 Driver=
|
||||
E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms
|
||||
I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=00 Driver=
|
||||
I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=
|
||||
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
|
||||
A problem with this is that Linux will prefer class functions over
|
||||
vendor specific functions. Using the above example, Linux defaults
|
||||
to cfg #2, running the device in a sub-optimal NCM mode.
|
||||
|
||||
Previously we've attempted to work around the problem by
|
||||
blacklisting the devices in the ECM class driver "cdc_ether", and
|
||||
matching on the ECM class function in the vendor specific interface
|
||||
driver. The latter has been used to switch back to the vendor
|
||||
specific configuration when the driver is probed for a class
|
||||
function.
|
||||
|
||||
This workaround has several issues;
|
||||
- class driver blacklists is additional maintanence cruft in an
|
||||
unrelated driver
|
||||
- class driver blacklists prevents users from optionally running
|
||||
the devices in class mode
|
||||
- each device needs double match entries in the vendor driver
|
||||
- the initial probing as a class function slows down device
|
||||
discovery
|
||||
|
||||
Now these issues have become even worse with the introduction of
|
||||
firmware supporting both NCM and ECM, where NCM ends up as the
|
||||
default mode in Linux. To use the same workaround, we now have
|
||||
to blacklist the devices in to two different class drivers and
|
||||
add yet another match entry to the vendor specific driver.
|
||||
|
||||
This patch implements an alternative workaround strategy -
|
||||
independent of the interface drivers. It avoids adding a
|
||||
blacklist to the cdc_ncm driver and will let us remove the
|
||||
existing blacklist from the cdc_ether driver.
|
||||
|
||||
As an additional bonus, removing the blacklists allow users to
|
||||
select one of the other device modes if wanted.
|
||||
|
||||
Signed-off-by: Bjørn Mork <bjorn@mork.no>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 113 ++++++++++++++++++++++++++++------------
|
||||
1 file changed, 81 insertions(+), 32 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9625,6 +9625,9 @@ static int rtl8152_probe(struct usb_inte
|
||||
if (version == RTL_VER_UNKNOWN)
|
||||
return -ENODEV;
|
||||
|
||||
+ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
if (!rtl_vendor_mode(intf))
|
||||
return -ENODEV;
|
||||
|
||||
@@ -9834,43 +9837,35 @@ static void rtl8152_disconnect(struct us
|
||||
}
|
||||
}
|
||||
|
||||
-#define REALTEK_USB_DEVICE(vend, prod) { \
|
||||
- USB_DEVICE_INTERFACE_CLASS(vend, prod, USB_CLASS_VENDOR_SPEC), \
|
||||
-}, \
|
||||
-{ \
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_COMM, \
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), \
|
||||
-}
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
static const struct usb_device_id rtl8152_table[] = {
|
||||
/* Realtek */
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8053),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8155),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8156),
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8050) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8053) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8152) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8153) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) },
|
||||
|
||||
/* Microsoft */
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3054),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x721e),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0xa387),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601),
|
||||
+ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) },
|
||||
+ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6) },
|
||||
+ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) },
|
||||
+ { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3069) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3082) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7205) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) },
|
||||
+ { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) },
|
||||
+ { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -9890,7 +9885,61 @@ static struct usb_driver rtl8152_driver
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
};
|
||||
|
||||
-module_usb_driver(rtl8152_driver);
|
||||
+static int rtl8152_cfgselector_probe(struct usb_device *udev)
|
||||
+{
|
||||
+ struct usb_host_config *c;
|
||||
+ int i, num_configs;
|
||||
+
|
||||
+ /* The vendor mode is not always config #1, so to find it out. */
|
||||
+ c = udev->config;
|
||||
+ num_configs = udev->descriptor.bNumConfigurations;
|
||||
+ for (i = 0; i < num_configs; (i++, c++)) {
|
||||
+ struct usb_interface_descriptor *desc = NULL;
|
||||
+
|
||||
+ if (!c->desc.bNumInterfaces)
|
||||
+ continue;
|
||||
+ desc = &c->intf_cache[0]->altsetting->desc;
|
||||
+ if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (i == num_configs)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (usb_set_configuration(udev, c->desc.bConfigurationValue)) {
|
||||
+ dev_err(&udev->dev, "Failed to set configuration %d\n",
|
||||
+ c->desc.bConfigurationValue);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct usb_device_driver rtl8152_cfgselector_driver = {
|
||||
+ .name = MODULENAME "-cfgselector",
|
||||
+ .probe = rtl8152_cfgselector_probe,
|
||||
+ .id_table = rtl8152_table,
|
||||
+ .generic_subclass = 1,
|
||||
+};
|
||||
+
|
||||
+static int __init rtl8152_driver_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = usb_register_device_driver(&rtl8152_cfgselector_driver, THIS_MODULE);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ return usb_register(&rtl8152_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit rtl8152_driver_exit(void)
|
||||
+{
|
||||
+ usb_deregister(&rtl8152_driver);
|
||||
+ usb_deregister_device_driver(&rtl8152_cfgselector_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(rtl8152_driver_init);
|
||||
+module_exit(rtl8152_driver_exit);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
|
@ -0,0 +1,158 @@
|
|||
From 69649ef8405320f81497f4757faac8234f61b167 Mon Sep 17 00:00:00 2001
|
||||
From: Bjørn Mork <bjorn@mork.no>
|
||||
Date: Fri, 6 Jan 2023 17:07:39 +0100
|
||||
Subject: [PATCH] cdc_ether: no need to blacklist any r8152 devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The r8152 driver does not need this anymore.
|
||||
|
||||
Dropping blacklist entries adds optional support for these
|
||||
devices in ECM mode.
|
||||
|
||||
The 8153 devices are handled by the r8153_ecm driver when
|
||||
in ECM mode, and must still be blacklisted here.
|
||||
|
||||
Signed-off-by: Bjørn Mork <bjorn@mork.no>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/cdc_ether.c | 114 ------------------------------------
|
||||
1 file changed, 114 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/cdc_ether.c
|
||||
+++ b/drivers/net/usb/cdc_ether.c
|
||||
@@ -767,13 +767,6 @@ static const struct usb_device_id produc
|
||||
.driver_info = 0,
|
||||
},
|
||||
|
||||
-/* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
/* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */
|
||||
{
|
||||
USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
|
||||
@@ -781,119 +774,12 @@ static const struct usb_device_id produc
|
||||
.driver_info = 0,
|
||||
},
|
||||
|
||||
-/* Samsung USB Ethernet Adapters */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-#if IS_ENABLED(CONFIG_USB_RTL8152)
|
||||
-/* Linksys USB3GIGV1 Ethernet Adapter */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-#endif
|
||||
-
|
||||
-/* Lenovo ThinkPad OneLink+ Dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3054, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* ThinkPad USB-C Dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* ThinkPad Thunderbolt 3 Dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3069, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* ThinkPad Thunderbolt 3 Dock Gen 2 (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3082, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Lenovo USB C to Ethernet Adapter (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x720c, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Lenovo USB-C Travel Hub (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7214, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
/* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */
|
||||
{
|
||||
USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x721e, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
.driver_info = 0,
|
||||
},
|
||||
-
|
||||
-/* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Microsoft Surface 2 dock (based on Realtek RTL8152) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07ab, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153B) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x0927, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
|
||||
/* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */
|
||||
{
|
|
@ -0,0 +1,64 @@
|
|||
From 0d4cda805a183bbe523f2407edb5c14ade50b841 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 17 Jan 2023 11:03:44 +0800
|
||||
Subject: [PATCH] r8152: avoid to change cfg for all devices
|
||||
|
||||
The rtl8152_cfgselector_probe() should set the USB configuration to the
|
||||
vendor mode only for the devices which the driver (r8152) supports.
|
||||
Otherwise, no driver would be used for such devices.
|
||||
|
||||
Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection")
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Reviewed-by: Simon Horman <simon.horman@corigine.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 20 +++++++++++++++++---
|
||||
1 file changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9531,9 +9531,8 @@ static int rtl_fw_init(struct r8152 *tp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-u8 rtl8152_get_version(struct usb_interface *intf)
|
||||
+static u8 __rtl_get_hw_ver(struct usb_device *udev)
|
||||
{
|
||||
- struct usb_device *udev = interface_to_usbdev(intf);
|
||||
u32 ocp_data = 0;
|
||||
__le32 *tmp;
|
||||
u8 version;
|
||||
@@ -9603,10 +9602,19 @@ u8 rtl8152_get_version(struct usb_interf
|
||||
break;
|
||||
default:
|
||||
version = RTL_VER_UNKNOWN;
|
||||
- dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data);
|
||||
+ dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data);
|
||||
break;
|
||||
}
|
||||
|
||||
+ return version;
|
||||
+}
|
||||
+
|
||||
+u8 rtl8152_get_version(struct usb_interface *intf)
|
||||
+{
|
||||
+ u8 version;
|
||||
+
|
||||
+ version = __rtl_get_hw_ver(interface_to_usbdev(intf));
|
||||
+
|
||||
dev_dbg(&intf->dev, "Detected version 0x%04x\n", version);
|
||||
|
||||
return version;
|
||||
@@ -9890,6 +9898,12 @@ static int rtl8152_cfgselector_probe(str
|
||||
struct usb_host_config *c;
|
||||
int i, num_configs;
|
||||
|
||||
+ /* Switch the device to vendor mode, if and only if the vendor mode
|
||||
+ * driver supports it.
|
||||
+ */
|
||||
+ if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN)
|
||||
+ return 0;
|
||||
+
|
||||
/* The vendor mode is not always config #1, so to find it out. */
|
||||
c = udev->config;
|
||||
num_configs = udev->descriptor.bNumConfigurations;
|
|
@ -0,0 +1,71 @@
|
|||
From 95a4c1d617b92cdc4522297741b56e8f6cd01a1e Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Thu, 19 Jan 2023 15:40:42 +0800
|
||||
Subject: [PATCH] r8152: remove rtl_vendor_mode function
|
||||
|
||||
After commit ec51fbd1b8a2 ("r8152: add USB device driver for
|
||||
config selection"), the code about changing USB configuration
|
||||
in rtl_vendor_mode() wouldn't be run anymore. Therefore, the
|
||||
function could be removed.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 39 +--------------------------------------
|
||||
1 file changed, 1 insertion(+), 38 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -8267,43 +8267,6 @@ static bool rtl_check_vendor_ok(struct u
|
||||
return true;
|
||||
}
|
||||
|
||||
-static bool rtl_vendor_mode(struct usb_interface *intf)
|
||||
-{
|
||||
- struct usb_host_interface *alt = intf->cur_altsetting;
|
||||
- struct usb_device *udev;
|
||||
- struct usb_host_config *c;
|
||||
- int i, num_configs;
|
||||
-
|
||||
- if (alt->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC)
|
||||
- return rtl_check_vendor_ok(intf);
|
||||
-
|
||||
- /* The vendor mode is not always config #1, so to find it out. */
|
||||
- udev = interface_to_usbdev(intf);
|
||||
- c = udev->config;
|
||||
- num_configs = udev->descriptor.bNumConfigurations;
|
||||
- if (num_configs < 2)
|
||||
- return false;
|
||||
-
|
||||
- for (i = 0; i < num_configs; (i++, c++)) {
|
||||
- struct usb_interface_descriptor *desc = NULL;
|
||||
-
|
||||
- if (c->desc.bNumInterfaces > 0)
|
||||
- desc = &c->intf_cache[0]->altsetting->desc;
|
||||
- else
|
||||
- continue;
|
||||
-
|
||||
- if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
|
||||
- usb_driver_set_configuration(udev, c->desc.bConfigurationValue);
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (i == num_configs)
|
||||
- dev_err(&intf->dev, "Unexpected Device\n");
|
||||
-
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
static int rtl8152_pre_reset(struct usb_interface *intf)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
@@ -9636,7 +9599,7 @@ static int rtl8152_probe(struct usb_inte
|
||||
if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
return -ENODEV;
|
||||
|
||||
- if (!rtl_vendor_mode(intf))
|
||||
+ if (!rtl_check_vendor_ok(intf))
|
||||
return -ENODEV;
|
||||
|
||||
usb_reset_device(udev);
|
|
@ -0,0 +1,46 @@
|
|||
From 02767440e1dda9861a11ca1dbe0f19a760b1d5c2 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Thu, 19 Jan 2023 15:40:43 +0800
|
||||
Subject: [PATCH] r8152: reduce the control transfer of rtl8152_get_version()
|
||||
|
||||
Reduce the control transfer by moving calling rtl8152_get_version() in
|
||||
rtl8152_probe(). This could prevent from calling rtl8152_get_version()
|
||||
for unnecessary situations. For example, after setting config #2 for the
|
||||
device, there are two interfaces and rtl8152_probe() may be called
|
||||
twice. However, we don't need to call rtl8152_get_version() for this
|
||||
situation.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9588,20 +9588,21 @@ static int rtl8152_probe(struct usb_inte
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
- u8 version = rtl8152_get_version(intf);
|
||||
struct r8152 *tp;
|
||||
struct net_device *netdev;
|
||||
+ u8 version;
|
||||
int ret;
|
||||
|
||||
- if (version == RTL_VER_UNKNOWN)
|
||||
- return -ENODEV;
|
||||
-
|
||||
if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
return -ENODEV;
|
||||
|
||||
if (!rtl_check_vendor_ok(intf))
|
||||
return -ENODEV;
|
||||
|
||||
+ version = rtl8152_get_version(intf);
|
||||
+ if (version == RTL_VER_UNKNOWN)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
usb_reset_device(udev);
|
||||
netdev = alloc_etherdev(sizeof(struct r8152));
|
||||
if (!netdev) {
|
|
@ -0,0 +1,55 @@
|
|||
From 5cc33f139e11b893ff6dc60d8a0ae865a65521ac Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Thu, 6 Apr 2023 17:14:26 -0700
|
||||
Subject: [PATCH] r8152: Add __GFP_NOWARN to big allocations
|
||||
|
||||
When memory is a little tight on my system, it's pretty easy to see
|
||||
warnings that look like this.
|
||||
|
||||
ksoftirqd/0: page allocation failure: order:3, mode:0x40a20(GFP_ATOMIC|__GFP_COMP), nodemask=(null),cpuset=/,mems_allowed=0
|
||||
...
|
||||
Call trace:
|
||||
dump_backtrace+0x0/0x1e8
|
||||
show_stack+0x20/0x2c
|
||||
dump_stack_lvl+0x60/0x78
|
||||
dump_stack+0x18/0x38
|
||||
warn_alloc+0x104/0x174
|
||||
__alloc_pages+0x588/0x67c
|
||||
alloc_rx_agg+0xa0/0x190 [r8152 ...]
|
||||
r8152_poll+0x270/0x760 [r8152 ...]
|
||||
__napi_poll+0x44/0x1ec
|
||||
net_rx_action+0x100/0x300
|
||||
__do_softirq+0xec/0x38c
|
||||
run_ksoftirqd+0x38/0xec
|
||||
smpboot_thread_fn+0xb8/0x248
|
||||
kthread+0x134/0x154
|
||||
ret_from_fork+0x10/0x20
|
||||
|
||||
On a fragmented system it's normal that order 3 allocations will
|
||||
sometimes fail, especially atomic ones. The driver handles these
|
||||
failures fine and the WARN just creates spam in the logs for this
|
||||
case. The __GFP_NOWARN flag is exactly for this situation, so add it
|
||||
to the allocation.
|
||||
|
||||
NOTE: my testing is on a 5.15 system, but there should be no reason
|
||||
that this would be fundamentally different on a mainline kernel.
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Acked-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230406171411.1.I84dbef45786af440fd269b71e9436a96a8e7a152@changeid
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -1944,7 +1944,7 @@ static struct rx_agg *alloc_rx_agg(struc
|
||||
if (!rx_agg)
|
||||
return NULL;
|
||||
|
||||
- rx_agg->page = alloc_pages(mflags | __GFP_COMP, order);
|
||||
+ rx_agg->page = alloc_pages(mflags | __GFP_COMP | __GFP_NOWARN, order);
|
||||
if (!rx_agg->page)
|
||||
goto free_rx;
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
From 0fbd79c01a9a657348f7032df70c57a406468c86 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 2 May 2023 11:36:27 +0800
|
||||
Subject: [PATCH] r8152: fix the autosuspend doesn't work
|
||||
|
||||
Set supports_autosuspend = 1 for the rtl8152_cfgselector_driver.
|
||||
|
||||
Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection")
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9898,6 +9898,7 @@ static struct usb_device_driver rtl8152_
|
||||
.probe = rtl8152_cfgselector_probe,
|
||||
.id_table = rtl8152_table,
|
||||
.generic_subclass = 1,
|
||||
+ .supports_autosuspend = 1,
|
||||
};
|
||||
|
||||
static int __init rtl8152_driver_init(void)
|
|
@ -0,0 +1,70 @@
|
|||
From 57df0fb9d511f91202114813e90128d65c0589f0 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Wed, 26 Jul 2023 11:08:07 +0800
|
||||
Subject: [PATCH] r8152: adjust generic_ocp_write function
|
||||
|
||||
Reduce the control transfer if all bytes of first or the last DWORD are
|
||||
written.
|
||||
|
||||
The original method is to split the control transfer into three parts
|
||||
(the first DWORD, middle continuous data, and the last DWORD). However,
|
||||
they could be combined if whole bytes of the first DWORD or last DWORD
|
||||
are written. That is, the first DWORD or the last DWORD could be combined
|
||||
with the middle continuous data, if the byte_en is 0xff.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230726030808.9093-418-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 29 ++++++++++++++++++-----------
|
||||
1 file changed, 18 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -1310,16 +1310,24 @@ static int generic_ocp_write(struct r815
|
||||
byteen_end = byteen & BYTE_EN_END_MASK;
|
||||
|
||||
byen = byteen_start | (byteen_start << 4);
|
||||
- ret = set_registers(tp, index, type | byen, 4, data);
|
||||
- if (ret < 0)
|
||||
- goto error1;
|
||||
-
|
||||
- index += 4;
|
||||
- data += 4;
|
||||
- size -= 4;
|
||||
|
||||
- if (size) {
|
||||
+ /* Split the first DWORD if the byte_en is not 0xff */
|
||||
+ if (byen != BYTE_EN_DWORD) {
|
||||
+ ret = set_registers(tp, index, type | byen, 4, data);
|
||||
+ if (ret < 0)
|
||||
+ goto error1;
|
||||
+
|
||||
+ index += 4;
|
||||
+ data += 4;
|
||||
size -= 4;
|
||||
+ }
|
||||
+
|
||||
+ if (size) {
|
||||
+ byen = byteen_end | (byteen_end >> 4);
|
||||
+
|
||||
+ /* Split the last DWORD if the byte_en is not 0xff */
|
||||
+ if (byen != BYTE_EN_DWORD)
|
||||
+ size -= 4;
|
||||
|
||||
while (size) {
|
||||
if (size > limit) {
|
||||
@@ -1346,10 +1354,9 @@ static int generic_ocp_write(struct r815
|
||||
}
|
||||
}
|
||||
|
||||
- byen = byteen_end | (byteen_end >> 4);
|
||||
- ret = set_registers(tp, index, type | byen, 4, data);
|
||||
- if (ret < 0)
|
||||
- goto error1;
|
||||
+ /* Set the last DWORD */
|
||||
+ if (byen != BYTE_EN_DWORD)
|
||||
+ ret = set_registers(tp, index, type | byen, 4, data);
|
||||
}
|
||||
|
||||
error1:
|
|
@ -0,0 +1,129 @@
|
|||
From e5c266a61186b462c388c53a3564c375e72f2244 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Wed, 26 Jul 2023 11:08:08 +0800
|
||||
Subject: [PATCH] r8152: set bp in bulk
|
||||
|
||||
PLA_BP_0 ~ PLA_BP_15 (0xfc28 ~ 0xfc46) are continuous registers, so we
|
||||
could combine the control transfers into one control transfer.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230726030808.9093-419-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 75 ++++++++++++++---------------------------
|
||||
1 file changed, 25 insertions(+), 50 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -3977,29 +3977,10 @@ static void rtl_reset_bmu(struct r8152 *
|
||||
/* Clear the bp to stop the firmware before loading a new one */
|
||||
static void rtl_clear_bp(struct r8152 *tp, u16 type)
|
||||
{
|
||||
- switch (tp->version) {
|
||||
- case RTL_VER_01:
|
||||
- case RTL_VER_02:
|
||||
- case RTL_VER_07:
|
||||
- break;
|
||||
- case RTL_VER_03:
|
||||
- case RTL_VER_04:
|
||||
- case RTL_VER_05:
|
||||
- case RTL_VER_06:
|
||||
- ocp_write_byte(tp, type, PLA_BP_EN, 0);
|
||||
- break;
|
||||
- case RTL_VER_14:
|
||||
- ocp_write_word(tp, type, USB_BP2_EN, 0);
|
||||
+ u16 bp[16] = {0};
|
||||
+ u16 bp_num;
|
||||
|
||||
- ocp_write_word(tp, type, USB_BP_8, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_9, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_10, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_11, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_12, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_13, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_14, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_15, 0);
|
||||
- break;
|
||||
+ switch (tp->version) {
|
||||
case RTL_VER_08:
|
||||
case RTL_VER_09:
|
||||
case RTL_VER_10:
|
||||
@@ -4007,32 +3988,31 @@ static void rtl_clear_bp(struct r8152 *t
|
||||
case RTL_VER_12:
|
||||
case RTL_VER_13:
|
||||
case RTL_VER_15:
|
||||
- default:
|
||||
if (type == MCU_TYPE_USB) {
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
|
||||
-
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_8, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_9, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_10, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_11, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_12, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_13, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_14, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_15, 0);
|
||||
- } else {
|
||||
- ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
|
||||
+ bp_num = 16;
|
||||
+ break;
|
||||
}
|
||||
+ fallthrough;
|
||||
+ case RTL_VER_03:
|
||||
+ case RTL_VER_04:
|
||||
+ case RTL_VER_05:
|
||||
+ case RTL_VER_06:
|
||||
+ ocp_write_byte(tp, type, PLA_BP_EN, 0);
|
||||
+ fallthrough;
|
||||
+ case RTL_VER_01:
|
||||
+ case RTL_VER_02:
|
||||
+ case RTL_VER_07:
|
||||
+ bp_num = 8;
|
||||
+ break;
|
||||
+ case RTL_VER_14:
|
||||
+ default:
|
||||
+ ocp_write_word(tp, type, USB_BP2_EN, 0);
|
||||
+ bp_num = 16;
|
||||
break;
|
||||
}
|
||||
|
||||
- ocp_write_word(tp, type, PLA_BP_0, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_1, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_2, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_3, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_4, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_5, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_6, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_7, 0);
|
||||
+ generic_ocp_write(tp, PLA_BP_0, BYTE_EN_DWORD, bp_num << 1, bp, type);
|
||||
|
||||
/* wait 3 ms to make sure the firmware is stopped */
|
||||
usleep_range(3000, 6000);
|
||||
@@ -5009,10 +4989,9 @@ static void rtl8152_fw_phy_nc_apply(stru
|
||||
|
||||
static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac)
|
||||
{
|
||||
- u16 bp_en_addr, bp_index, type, bp_num, fw_ver_reg;
|
||||
+ u16 bp_en_addr, type, fw_ver_reg;
|
||||
u32 length;
|
||||
u8 *data;
|
||||
- int i;
|
||||
|
||||
switch (__le32_to_cpu(mac->blk_hdr.type)) {
|
||||
case RTL_FW_PLA:
|
||||
@@ -5054,12 +5033,8 @@ static void rtl8152_fw_mac_apply(struct
|
||||
ocp_write_word(tp, type, __le16_to_cpu(mac->bp_ba_addr),
|
||||
__le16_to_cpu(mac->bp_ba_value));
|
||||
|
||||
- bp_index = __le16_to_cpu(mac->bp_start);
|
||||
- bp_num = __le16_to_cpu(mac->bp_num);
|
||||
- for (i = 0; i < bp_num; i++) {
|
||||
- ocp_write_word(tp, type, bp_index, __le16_to_cpu(mac->bp[i]));
|
||||
- bp_index += 2;
|
||||
- }
|
||||
+ generic_ocp_write(tp, __le16_to_cpu(mac->bp_start), BYTE_EN_DWORD,
|
||||
+ __le16_to_cpu(mac->bp_num) << 1, mac->bp, type);
|
||||
|
||||
bp_en_addr = __le16_to_cpu(mac->bp_en_addr);
|
||||
if (bp_en_addr)
|
|
@ -0,0 +1,39 @@
|
|||
From 72f93a3136ee18fd59fa6579f84c07e93424681e Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Napolitano <anton@polit.no>
|
||||
Date: Sat, 26 Aug 2023 01:05:50 +0200
|
||||
Subject: [PATCH] r8152: add vendor/device ID pair for D-Link DUB-E250
|
||||
|
||||
The D-Link DUB-E250 is an RTL8156 based 2.5G Ethernet controller.
|
||||
|
||||
Add the vendor and product ID values to the driver. This makes Ethernet
|
||||
work with the adapter.
|
||||
|
||||
Signed-off-by: Antonio Napolitano <anton@polit.no>
|
||||
Link: https://lore.kernel.org/r/CV200KJEEUPC.WPKAHXCQJ05I@mercurius
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 1 +
|
||||
include/linux/usb/r8152.h | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
|
||||
--- a/include/linux/usb/r8152.h
|
||||
+++ b/include/linux/usb/r8152.h
|
||||
@@ -29,6 +29,7 @@
|
||||
#define VENDOR_ID_LINKSYS 0x13b1
|
||||
#define VENDOR_ID_NVIDIA 0x0955
|
||||
#define VENDOR_ID_TPLINK 0x2357
|
||||
+#define VENDOR_ID_DLINK 0x2001
|
||||
|
||||
#if IS_REACHABLE(CONFIG_USB_RTL8152)
|
||||
extern u8 rtl8152_get_version(struct usb_interface *intf);
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9820,6 +9820,7 @@ static const struct usb_device_id rtl815
|
||||
{ USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) },
|
||||
{ USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) },
|
||||
{ USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },
|
||||
+ { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) },
|
||||
{}
|
||||
};
|
||||
|
|
@ -0,0 +1,447 @@
|
|||
From 715f67f33af45ce2cc3a5b1ef133cc8c8e7787b0 Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Fri, 20 Oct 2023 14:06:58 -0700
|
||||
Subject: [PATCH] r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE
|
||||
|
||||
Whenever the RTL8152_UNPLUG is set that just tells the driver that all
|
||||
accesses will fail and we should just immediately bail. A future patch
|
||||
will use this same concept at a time when the driver hasn't actually
|
||||
been unplugged but is about to be reset. Rename the flag in
|
||||
preparation for the future patch.
|
||||
|
||||
This is a no-op change and just a search and replace.
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Grant Grundler <grundler@chromium.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 96 ++++++++++++++++++++---------------------
|
||||
1 file changed, 48 insertions(+), 48 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -763,7 +763,7 @@ enum rtl_register_content {
|
||||
|
||||
/* rtl8152 flags */
|
||||
enum rtl8152_flags {
|
||||
- RTL8152_UNPLUG = 0,
|
||||
+ RTL8152_INACCESSIBLE = 0,
|
||||
RTL8152_SET_RX_MODE,
|
||||
WORK_ENABLE,
|
||||
RTL8152_LINK_CHG,
|
||||
@@ -1241,7 +1241,7 @@ int set_registers(struct r8152 *tp, u16
|
||||
static void rtl_set_unplug(struct r8152 *tp)
|
||||
{
|
||||
if (tp->udev->state == USB_STATE_NOTATTACHED) {
|
||||
- set_bit(RTL8152_UNPLUG, &tp->flags);
|
||||
+ set_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
smp_mb__after_atomic();
|
||||
}
|
||||
}
|
||||
@@ -1252,7 +1252,7 @@ static int generic_ocp_read(struct r8152
|
||||
u16 limit = 64;
|
||||
int ret = 0;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
/* both size and indix must be 4 bytes align */
|
||||
@@ -1296,7 +1296,7 @@ static int generic_ocp_write(struct r815
|
||||
u16 byteen_start, byteen_end, byen;
|
||||
u16 limit = 512;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
/* both size and indix must be 4 bytes align */
|
||||
@@ -1533,7 +1533,7 @@ static int read_mii_word(struct net_devi
|
||||
struct r8152 *tp = netdev_priv(netdev);
|
||||
int ret;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
if (phy_id != R8152_PHY_ID)
|
||||
@@ -1549,7 +1549,7 @@ void write_mii_word(struct net_device *n
|
||||
{
|
||||
struct r8152 *tp = netdev_priv(netdev);
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (phy_id != R8152_PHY_ID)
|
||||
@@ -1754,7 +1754,7 @@ static void read_bulk_callback(struct ur
|
||||
if (!tp)
|
||||
return;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
@@ -1846,7 +1846,7 @@ static void write_bulk_callback(struct u
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
return;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (!skb_queue_empty(&tp->tx_queue))
|
||||
@@ -1867,7 +1867,7 @@ static void intr_callback(struct urb *ur
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
return;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
switch (status) {
|
||||
@@ -2611,7 +2611,7 @@ static void bottom_half(struct tasklet_s
|
||||
{
|
||||
struct r8152 *tp = from_tasklet(tp, t, tx_tl);
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
@@ -2654,7 +2654,7 @@ int r8152_submit_rx(struct r8152 *tp, st
|
||||
int ret;
|
||||
|
||||
/* The rx would be stopped, so skip submitting */
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags) ||
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) ||
|
||||
!test_bit(WORK_ENABLE, &tp->flags) || !netif_carrier_ok(tp->netdev))
|
||||
return 0;
|
||||
|
||||
@@ -3050,7 +3050,7 @@ static int rtl_enable(struct r8152 *tp)
|
||||
|
||||
static int rtl8152_enable(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
set_tx_qlen(tp);
|
||||
@@ -3137,7 +3137,7 @@ static int rtl8153_enable(struct r8152 *
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
set_tx_qlen(tp);
|
||||
@@ -3169,7 +3169,7 @@ static void rtl_disable(struct r8152 *tp
|
||||
u32 ocp_data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -3623,7 +3623,7 @@ static u16 r8153_phy_status(struct r8152
|
||||
}
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3655,7 +3655,7 @@ static void r8153b_ups_en(struct r8152 *
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 500; i++) {
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
|
||||
AUTOLOAD_DONE)
|
||||
@@ -3697,7 +3697,7 @@ static void r8153c_ups_en(struct r8152 *
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 500; i++) {
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
|
||||
AUTOLOAD_DONE)
|
||||
@@ -4042,8 +4042,8 @@ static int rtl_phy_patch_request(struct
|
||||
for (i = 0; wait && i < 5000; i++) {
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
- break;
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
+ return -ENODEV;
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT);
|
||||
@@ -6001,7 +6001,7 @@ static int rtl8156_enable(struct r8152 *
|
||||
u32 ocp_data;
|
||||
u16 speed;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
r8156_fc_parameter(tp);
|
||||
@@ -6059,7 +6059,7 @@ static int rtl8156b_enable(struct r8152
|
||||
u32 ocp_data;
|
||||
u16 speed;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
set_tx_qlen(tp);
|
||||
@@ -6245,7 +6245,7 @@ out:
|
||||
|
||||
static void rtl8152_up(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8152_aldps_en(tp, false);
|
||||
@@ -6255,7 +6255,7 @@ static void rtl8152_up(struct r8152 *tp)
|
||||
|
||||
static void rtl8152_down(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6270,7 +6270,7 @@ static void rtl8153_up(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153_u1u2en(tp, false);
|
||||
@@ -6310,7 +6310,7 @@ static void rtl8153_down(struct r8152 *t
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6331,7 +6331,7 @@ static void rtl8153b_up(struct r8152 *tp
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -6355,7 +6355,7 @@ static void rtl8153b_down(struct r8152 *
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6392,7 +6392,7 @@ static void rtl8153c_up(struct r8152 *tp
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -6473,7 +6473,7 @@ static void rtl8156_up(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -6546,7 +6546,7 @@ static void rtl8156_down(struct r8152 *t
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6684,7 +6684,7 @@ static void rtl_work_func_t(struct work_
|
||||
/* If the device is unplugged or !netif_running(), the workqueue
|
||||
* doesn't need to wake the device, and could return directly.
|
||||
*/
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags) || !netif_running(tp->netdev))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) || !netif_running(tp->netdev))
|
||||
return;
|
||||
|
||||
if (usb_autopm_get_interface(tp->intf) < 0)
|
||||
@@ -6723,7 +6723,7 @@ static void rtl_hw_phy_work_func_t(struc
|
||||
{
|
||||
struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work);
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (usb_autopm_get_interface(tp->intf) < 0)
|
||||
@@ -6850,7 +6850,7 @@ static int rtl8152_close(struct net_devi
|
||||
netif_stop_queue(netdev);
|
||||
|
||||
res = usb_autopm_get_interface(tp->intf);
|
||||
- if (res < 0 || test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (res < 0 || test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
rtl_stop_rx(tp);
|
||||
} else {
|
||||
@@ -6883,7 +6883,7 @@ static void r8152b_init(struct r8152 *tp
|
||||
u32 ocp_data;
|
||||
u16 data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
data = r8152_mdio_read(tp, MII_BMCR);
|
||||
@@ -6927,7 +6927,7 @@ static void r8153_init(struct r8152 *tp)
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153_u1u2en(tp, false);
|
||||
@@ -6938,7 +6938,7 @@ static void r8153_init(struct r8152 *tp)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7067,7 +7067,7 @@ static void r8153b_init(struct r8152 *tp
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -7078,7 +7078,7 @@ static void r8153b_init(struct r8152 *tp
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7149,7 +7149,7 @@ static void r8153c_init(struct r8152 *tp
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -7169,7 +7169,7 @@ static void r8153c_init(struct r8152 *tp
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -7998,7 +7998,7 @@ static void r8156_init(struct r8152 *tp)
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP);
|
||||
@@ -8019,7 +8019,7 @@ static void r8156_init(struct r8152 *tp)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -8094,7 +8094,7 @@ static void r8156b_init(struct r8152 *tp
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP);
|
||||
@@ -8128,7 +8128,7 @@ static void r8156b_init(struct r8152 *tp
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9153,7 +9153,7 @@ static int rtl8152_ioctl(struct net_devi
|
||||
struct mii_ioctl_data *data = if_mii(rq);
|
||||
int res;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
res = usb_autopm_get_interface(tp->intf);
|
||||
@@ -9255,7 +9255,7 @@ static const struct net_device_ops rtl81
|
||||
|
||||
static void rtl8152_unload(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (tp->version != RTL_VER_01)
|
||||
@@ -9264,7 +9264,7 @@ static void rtl8152_unload(struct r8152
|
||||
|
||||
static void rtl8153_unload(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153_power_cut_en(tp, false);
|
||||
@@ -9272,7 +9272,7 @@ static void rtl8153_unload(struct r8152
|
||||
|
||||
static void rtl8153b_unload(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_power_cut_en(tp, false);
|
|
@ -0,0 +1,398 @@
|
|||
From d9962b0d42029bcb40fe3c38bce06d1870fa4df4 Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Fri, 20 Oct 2023 14:06:59 -0700
|
||||
Subject: [PATCH] r8152: Block future register access if register access fails
|
||||
|
||||
Even though the functions to read/write registers can fail, most of
|
||||
the places in the r8152 driver that read/write register values don't
|
||||
check error codes. The lack of error code checking is problematic in
|
||||
at least two ways.
|
||||
|
||||
The first problem is that the r8152 driver often uses code patterns
|
||||
similar to this:
|
||||
x = read_register()
|
||||
x = x | SOME_BIT;
|
||||
write_register(x);
|
||||
|
||||
...with the above pattern, if the read_register() fails and returns
|
||||
garbage then we'll end up trying to write modified garbage back to the
|
||||
Realtek adapter. If the write_register() succeeds that's bad. Note
|
||||
that as of commit f53a7ad18959 ("r8152: Set memory to all 0xFFs on
|
||||
failed reg reads") the "garbage" returned by read_register() will at
|
||||
least be consistent garbage, but it is still garbage.
|
||||
|
||||
It turns out that this problem is very serious. Writing garbage to
|
||||
some of the hardware registers on the Ethernet adapter can put the
|
||||
adapter in such a bad state that it needs to be power cycled (fully
|
||||
unplugged and plugged in again) before it can enumerate again.
|
||||
|
||||
The second problem is that the r8152 driver generally has functions
|
||||
that are long sequences of register writes. Assuming everything will
|
||||
be OK if a random register write fails in the middle isn't a great
|
||||
assumption.
|
||||
|
||||
One might wonder if the above two problems are real. You could ask if
|
||||
we would really have a successful write after a failed read. It turns
|
||||
out that the answer appears to be "yes, this can happen". In fact,
|
||||
we've seen at least two distinct failure modes where this happens.
|
||||
|
||||
On a sc7180-trogdor Chromebook if you drop into kdb for a while and
|
||||
then resume, you can see:
|
||||
1. We get a "Tx timeout"
|
||||
2. The "Tx timeout" queues up a USB reset.
|
||||
3. In rtl8152_pre_reset() we try to reinit the hardware.
|
||||
4. The first several (2-9) register accesses fail with a timeout, then
|
||||
things recover.
|
||||
|
||||
The above test case was actually fixed by the patch ("r8152: Increase
|
||||
USB control msg timeout to 5000ms as per spec") but at least shows
|
||||
that we really can see successful calls after failed ones.
|
||||
|
||||
On a different (AMD) based Chromebook with a particular adapter, we
|
||||
found that during reboot tests we'd also sometimes get a transitory
|
||||
failure. In this case we saw -EPIPE being returned sometimes. Retrying
|
||||
worked, but retrying is not always safe for all register accesses
|
||||
since reading/writing some registers might have side effects (like
|
||||
registers that clear on read).
|
||||
|
||||
Let's fully lock out all register access if a register access fails.
|
||||
When we do this, we'll try to queue up a USB reset and try to unlock
|
||||
register access after the reset. This is slightly tricker than it
|
||||
sounds since the r8152 driver has an optimized reset sequence that
|
||||
only works reliably after probe happens. In order to handle this, we
|
||||
avoid the optimized reset if probe didn't finish. Instead, we simply
|
||||
retry the probe routine in this case.
|
||||
|
||||
When locking out access, we'll use the existing infrastructure that
|
||||
the driver was using when it detected we were unplugged. This keeps us
|
||||
from getting stuck in delay loops in some parts of the driver.
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Grant Grundler <grundler@chromium.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 207 ++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 176 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -772,6 +772,9 @@ enum rtl8152_flags {
|
||||
SCHEDULE_TASKLET,
|
||||
GREEN_ETHERNET,
|
||||
RX_EPROTO,
|
||||
+ IN_PRE_RESET,
|
||||
+ PROBED_WITH_NO_ERRORS,
|
||||
+ PROBE_SHOULD_RETRY,
|
||||
};
|
||||
|
||||
#define DEVICE_ID_THINKPAD_ONELINK_PLUS_DOCK 0x3054
|
||||
@@ -949,6 +952,8 @@ struct r8152 {
|
||||
u8 version;
|
||||
u8 duplex;
|
||||
u8 autoneg;
|
||||
+
|
||||
+ unsigned int reg_access_reset_count;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1196,6 +1201,96 @@ static unsigned int agg_buf_sz = 16384;
|
||||
|
||||
#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc))
|
||||
|
||||
+/* If register access fails then we block access and issue a reset. If this
|
||||
+ * happens too many times in a row without a successful access then we stop
|
||||
+ * trying to reset and just leave access blocked.
|
||||
+ */
|
||||
+#define REGISTER_ACCESS_MAX_RESETS 3
|
||||
+
|
||||
+static void rtl_set_inaccessible(struct r8152 *tp)
|
||||
+{
|
||||
+ set_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
+ smp_mb__after_atomic();
|
||||
+}
|
||||
+
|
||||
+static void rtl_set_accessible(struct r8152 *tp)
|
||||
+{
|
||||
+ clear_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
+ smp_mb__after_atomic();
|
||||
+}
|
||||
+
|
||||
+static
|
||||
+int r8152_control_msg(struct r8152 *tp, unsigned int pipe, __u8 request,
|
||||
+ __u8 requesttype, __u16 value, __u16 index, void *data,
|
||||
+ __u16 size, const char *msg_tag)
|
||||
+{
|
||||
+ struct usb_device *udev = tp->udev;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ ret = usb_control_msg(udev, pipe, request, requesttype,
|
||||
+ value, index, data, size,
|
||||
+ USB_CTRL_GET_TIMEOUT);
|
||||
+
|
||||
+ /* No need to issue a reset to report an error if the USB device got
|
||||
+ * unplugged; just return immediately.
|
||||
+ */
|
||||
+ if (ret == -ENODEV)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* If the write was successful then we're done */
|
||||
+ if (ret >= 0) {
|
||||
+ tp->reg_access_reset_count = 0;
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ dev_err(&udev->dev,
|
||||
+ "Failed to %s %d bytes at %#06x/%#06x (%d)\n",
|
||||
+ msg_tag, size, value, index, ret);
|
||||
+
|
||||
+ /* Block all future register access until we reset. Much of the code
|
||||
+ * in the driver doesn't check for errors. Notably, many parts of the
|
||||
+ * driver do a read/modify/write of a register value without
|
||||
+ * confirming that the read succeeded. Writing back modified garbage
|
||||
+ * like this can fully wedge the adapter, requiring a power cycle.
|
||||
+ */
|
||||
+ rtl_set_inaccessible(tp);
|
||||
+
|
||||
+ /* If probe hasn't yet finished, then we'll request a retry of the
|
||||
+ * whole probe routine if we get any control transfer errors. We
|
||||
+ * never have to clear this bit since we free/reallocate the whole "tp"
|
||||
+ * structure if we retry probe.
|
||||
+ */
|
||||
+ if (!test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) {
|
||||
+ set_bit(PROBE_SHOULD_RETRY, &tp->flags);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Failing to access registers in pre-reset is not surprising since we
|
||||
+ * wouldn't be resetting if things were behaving normally. The register
|
||||
+ * access we do in pre-reset isn't truly mandatory--we're just reusing
|
||||
+ * the disable() function and trying to be nice by powering the
|
||||
+ * adapter down before resetting it. Thus, if we're in pre-reset,
|
||||
+ * we'll return right away and not try to queue up yet another reset.
|
||||
+ * We know the post-reset is already coming.
|
||||
+ */
|
||||
+ if (test_bit(IN_PRE_RESET, &tp->flags))
|
||||
+ return ret;
|
||||
+
|
||||
+ if (tp->reg_access_reset_count < REGISTER_ACCESS_MAX_RESETS) {
|
||||
+ usb_queue_reset_device(tp->intf);
|
||||
+ tp->reg_access_reset_count++;
|
||||
+ } else if (tp->reg_access_reset_count == REGISTER_ACCESS_MAX_RESETS) {
|
||||
+ dev_err(&udev->dev,
|
||||
+ "Tried to reset %d times; giving up.\n",
|
||||
+ REGISTER_ACCESS_MAX_RESETS);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static
|
||||
int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
|
||||
{
|
||||
@@ -1206,9 +1301,10 @@ int get_registers(struct r8152 *tp, u16
|
||||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
|
||||
- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_in,
|
||||
- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
- value, index, tmp, size, USB_CTRL_GET_TIMEOUT);
|
||||
+ ret = r8152_control_msg(tp, tp->pipe_ctrl_in,
|
||||
+ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
+ value, index, tmp, size, "read");
|
||||
+
|
||||
if (ret < 0)
|
||||
memset(data, 0xff, size);
|
||||
else
|
||||
@@ -1229,9 +1325,9 @@ int set_registers(struct r8152 *tp, u16
|
||||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
|
||||
- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_out,
|
||||
- RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
|
||||
- value, index, tmp, size, USB_CTRL_SET_TIMEOUT);
|
||||
+ ret = r8152_control_msg(tp, tp->pipe_ctrl_out,
|
||||
+ RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
|
||||
+ value, index, tmp, size, "write");
|
||||
|
||||
kfree(tmp);
|
||||
|
||||
@@ -1240,10 +1336,8 @@ int set_registers(struct r8152 *tp, u16
|
||||
|
||||
static void rtl_set_unplug(struct r8152 *tp)
|
||||
{
|
||||
- if (tp->udev->state == USB_STATE_NOTATTACHED) {
|
||||
- set_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
- smp_mb__after_atomic();
|
||||
- }
|
||||
+ if (tp->udev->state == USB_STATE_NOTATTACHED)
|
||||
+ rtl_set_inaccessible(tp);
|
||||
}
|
||||
|
||||
static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
|
||||
@@ -8254,7 +8348,7 @@ static int rtl8152_pre_reset(struct usb_
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
struct net_device *netdev;
|
||||
|
||||
- if (!tp)
|
||||
+ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags))
|
||||
return 0;
|
||||
|
||||
netdev = tp->netdev;
|
||||
@@ -8269,7 +8363,9 @@ static int rtl8152_pre_reset(struct usb_
|
||||
napi_disable(&tp->napi);
|
||||
if (netif_carrier_ok(netdev)) {
|
||||
mutex_lock(&tp->control);
|
||||
+ set_bit(IN_PRE_RESET, &tp->flags);
|
||||
tp->rtl_ops.disable(tp);
|
||||
+ clear_bit(IN_PRE_RESET, &tp->flags);
|
||||
mutex_unlock(&tp->control);
|
||||
}
|
||||
|
||||
@@ -8282,9 +8378,11 @@ static int rtl8152_post_reset(struct usb
|
||||
struct net_device *netdev;
|
||||
struct sockaddr sa;
|
||||
|
||||
- if (!tp)
|
||||
+ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags))
|
||||
return 0;
|
||||
|
||||
+ rtl_set_accessible(tp);
|
||||
+
|
||||
/* reset the MAC address in case of policy change */
|
||||
if (determine_ethernet_addr(tp, &sa) >= 0) {
|
||||
rtnl_lock();
|
||||
@@ -9482,17 +9580,29 @@ static u8 __rtl_get_hw_ver(struct usb_de
|
||||
__le32 *tmp;
|
||||
u8 version;
|
||||
int ret;
|
||||
+ int i;
|
||||
|
||||
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
||||
if (!tmp)
|
||||
return 0;
|
||||
|
||||
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
||||
- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
- PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp),
|
||||
- USB_CTRL_GET_TIMEOUT);
|
||||
- if (ret > 0)
|
||||
- ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK;
|
||||
+ /* Retry up to 3 times in case there is a transitory error. We do this
|
||||
+ * since retrying a read of the version is always safe and this
|
||||
+ * function doesn't take advantage of r8152_control_msg().
|
||||
+ */
|
||||
+ for (i = 0; i < 3; i++) {
|
||||
+ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
||||
+ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
+ PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp),
|
||||
+ USB_CTRL_GET_TIMEOUT);
|
||||
+ if (ret > 0) {
|
||||
+ ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (i != 0 && ret > 0)
|
||||
+ dev_warn(&udev->dev, "Needed %d retries to read version\n", i);
|
||||
|
||||
kfree(tmp);
|
||||
|
||||
@@ -9566,25 +9676,14 @@ u8 rtl8152_get_version(struct usb_interf
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtl8152_get_version);
|
||||
|
||||
-static int rtl8152_probe(struct usb_interface *intf,
|
||||
- const struct usb_device_id *id)
|
||||
+static int rtl8152_probe_once(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id, u8 version)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct r8152 *tp;
|
||||
struct net_device *netdev;
|
||||
- u8 version;
|
||||
int ret;
|
||||
|
||||
- if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- if (!rtl_check_vendor_ok(intf))
|
||||
- return -ENODEV;
|
||||
-
|
||||
- version = rtl8152_get_version(intf);
|
||||
- if (version == RTL_VER_UNKNOWN)
|
||||
- return -ENODEV;
|
||||
-
|
||||
usb_reset_device(udev);
|
||||
netdev = alloc_etherdev(sizeof(struct r8152));
|
||||
if (!netdev) {
|
||||
@@ -9757,10 +9856,20 @@ static int rtl8152_probe(struct usb_inte
|
||||
else
|
||||
device_set_wakeup_enable(&udev->dev, false);
|
||||
|
||||
+ /* If we saw a control transfer error while probing then we may
|
||||
+ * want to try probe() again. Consider this an error.
|
||||
+ */
|
||||
+ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags))
|
||||
+ goto out2;
|
||||
+
|
||||
+ set_bit(PROBED_WITH_NO_ERRORS, &tp->flags);
|
||||
netif_info(tp, probe, netdev, "%s\n", DRIVER_VERSION);
|
||||
|
||||
return 0;
|
||||
|
||||
+out2:
|
||||
+ unregister_netdev(netdev);
|
||||
+
|
||||
out1:
|
||||
tasklet_kill(&tp->tx_tl);
|
||||
cancel_delayed_work_sync(&tp->hw_phy_work);
|
||||
@@ -9769,10 +9878,46 @@ out1:
|
||||
rtl8152_release_firmware(tp);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
out:
|
||||
+ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags))
|
||||
+ ret = -EAGAIN;
|
||||
+
|
||||
free_netdev(netdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#define RTL8152_PROBE_TRIES 3
|
||||
+
|
||||
+static int rtl8152_probe(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ u8 version;
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+
|
||||
+ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (!rtl_check_vendor_ok(intf))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ version = rtl8152_get_version(intf);
|
||||
+ if (version == RTL_VER_UNKNOWN)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ for (i = 0; i < RTL8152_PROBE_TRIES; i++) {
|
||||
+ ret = rtl8152_probe_once(intf, id, version);
|
||||
+ if (ret != -EAGAIN)
|
||||
+ break;
|
||||
+ }
|
||||
+ if (ret == -EAGAIN) {
|
||||
+ dev_err(&intf->dev,
|
||||
+ "r8152 failed probe after %d tries; giving up\n", i);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static void rtl8152_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
|
@ -0,0 +1,83 @@
|
|||
From 66eee612a1ba39f9a76a9ace4a34d012044767fb Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 26 Sep 2023 19:17:13 +0800
|
||||
Subject: [PATCH] r8152: break the loop when the budget is exhausted
|
||||
|
||||
[ Upstream commit 2cf51f931797d9a47e75d999d0993a68cbd2a560 ]
|
||||
|
||||
A bulk transfer of the USB may contain many packets. And, the total
|
||||
number of the packets in the bulk transfer may be more than budget.
|
||||
|
||||
Originally, only budget packets would be handled by napi_gro_receive(),
|
||||
and the other packets would be queued in the driver for next schedule.
|
||||
|
||||
This patch would break the loop about getting next bulk transfer, when
|
||||
the budget is exhausted. That is, only the current bulk transfer would
|
||||
be handled, and the other bulk transfers would be queued for next
|
||||
schedule. Besides, the packets which are more than the budget in the
|
||||
current bulk trasnfer would be still queued in the driver, as the
|
||||
original method.
|
||||
|
||||
In addition, a bulk transfer wouldn't contain more than 400 packets, so
|
||||
the check of queue length is unnecessary. Therefore, I replace it with
|
||||
WARN_ON_ONCE().
|
||||
|
||||
Fixes: cf74eb5a5bc8 ("eth: r8152: try to use a normal budget")
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230926111714.9448-433-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 18 +++++++++++++-----
|
||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -2539,7 +2539,7 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
}
|
||||
}
|
||||
|
||||
- if (list_empty(&tp->rx_done))
|
||||
+ if (list_empty(&tp->rx_done) || work_done >= budget)
|
||||
goto out1;
|
||||
|
||||
clear_bit(RX_EPROTO, &tp->flags);
|
||||
@@ -2555,6 +2555,15 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
struct urb *urb;
|
||||
u8 *rx_data;
|
||||
|
||||
+ /* A bulk transfer of USB may contain may packets, so the
|
||||
+ * total packets may more than the budget. Deal with all
|
||||
+ * packets in current bulk transfer, and stop to handle the
|
||||
+ * next bulk transfer until next schedule, if budget is
|
||||
+ * exhausted.
|
||||
+ */
|
||||
+ if (work_done >= budget)
|
||||
+ break;
|
||||
+
|
||||
list_del_init(cursor);
|
||||
|
||||
agg = list_entry(cursor, struct rx_agg, list);
|
||||
@@ -2574,9 +2583,7 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
unsigned int pkt_len, rx_frag_head_sz;
|
||||
struct sk_buff *skb;
|
||||
|
||||
- /* limit the skb numbers for rx_queue */
|
||||
- if (unlikely(skb_queue_len(&tp->rx_queue) >= 1000))
|
||||
- break;
|
||||
+ WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >= 1000);
|
||||
|
||||
pkt_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK;
|
||||
if (pkt_len < ETH_ZLEN)
|
||||
@@ -2654,9 +2661,10 @@ submit:
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Splice the remained list back to rx_done for next schedule */
|
||||
if (!list_empty(&rx_queue)) {
|
||||
spin_lock_irqsave(&tp->rx_lock, flags);
|
||||
- list_splice_tail(&rx_queue, &tp->rx_done);
|
||||
+ list_splice(&rx_queue, &tp->rx_done);
|
||||
spin_unlock_irqrestore(&tp->rx_lock, flags);
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
From 1b0fce8c8e69485e49a7d34aac3d4c2a2aa15d62 Mon Sep 17 00:00:00 2001
|
||||
From: Davide Tronchin <davide.tronchin.94@gmail.com>
|
||||
Date: Thu, 29 Jun 2023 12:37:36 +0200
|
||||
Subject: [PATCH] net: usb: cdc_ether: add u-blox 0x1313 composition.
|
||||
|
||||
Add CDC-ECM support for LARA-R6 01B.
|
||||
|
||||
The new LARA-R6 product variant identified by the "01B" string can be
|
||||
configured (by AT interface) in three different USB modes:
|
||||
* Default mode (Vendor ID: 0x1546 Product ID: 0x1311) with 4 serial
|
||||
interfaces
|
||||
* RmNet mode (Vendor ID: 0x1546 Product ID: 0x1312) with 4 serial
|
||||
interfaces and 1 RmNet virtual network interface
|
||||
* CDC-ECM mode (Vendor ID: 0x1546 Product ID: 0x1313) with 4 serial
|
||||
interface and 1 CDC-ECM virtual network interface
|
||||
The first 4 interfaces of all the 3 configurations (default, RmNet, ECM)
|
||||
are the same.
|
||||
|
||||
In CDC-ECM mode LARA-R6 01B exposes the following interfaces:
|
||||
If 0: Diagnostic
|
||||
If 1: AT parser
|
||||
If 2: AT parser
|
||||
If 3: AT parset/alternative functions
|
||||
If 4: CDC-ECM interface
|
||||
|
||||
Signed-off-by: Davide Tronchin <davide.tronchin.94@gmail.com>
|
||||
Reviewed-by: Simon Horman <simon.horman@corigine.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/cdc_ether.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/net/usb/cdc_ether.c
|
||||
+++ b/drivers/net/usb/cdc_ether.c
|
||||
@@ -878,6 +878,12 @@ static const struct usb_device_id produc
|
||||
USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
}, {
|
||||
+ /* U-blox LARA-R6 01B */
|
||||
+ USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1313, USB_CLASS_COMM,
|
||||
+ USB_CDC_SUBCLASS_ETHERNET,
|
||||
+ USB_CDC_PROTO_NONE),
|
||||
+ .driver_info = (unsigned long)&wwan_info,
|
||||
+}, {
|
||||
/* ZTE modules */
|
||||
USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_ETHERNET,
|
|
@ -17,7 +17,7 @@ Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|||
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -2275,6 +2275,23 @@ struct btmtk_section_map {
|
||||
@@ -2287,6 +2287,23 @@ struct btmtk_section_map {
|
||||
};
|
||||
} __packed;
|
||||
|
||||
|
@ -41,7 +41,7 @@ Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|||
static void btusb_mtk_wmt_recv(struct urb *urb)
|
||||
{
|
||||
struct hci_dev *hdev = urb->context;
|
||||
@@ -3926,6 +3943,7 @@ static int btusb_probe(struct usb_interf
|
||||
@@ -3941,6 +3958,7 @@ static int btusb_probe(struct usb_interf
|
||||
hdev->shutdown = btusb_mtk_shutdown;
|
||||
hdev->manufacturer = 70;
|
||||
hdev->cmd_timeout = btusb_mtk_cmd_timeout;
|
||||
|
|
|
@ -18,7 +18,7 @@ Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|||
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -2280,7 +2280,7 @@ static int btusb_set_bdaddr_mtk(struct h
|
||||
@@ -2292,7 +2292,7 @@ static int btusb_set_bdaddr_mtk(struct h
|
||||
struct sk_buff *skb;
|
||||
long ret;
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|||
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -464,6 +464,9 @@ static const struct usb_device_id blackl
|
||||
@@ -476,6 +476,9 @@ static const struct usb_device_id blackl
|
||||
{ USB_DEVICE(0x13d3, 0x3564), .driver_info = BTUSB_MEDIATEK |
|
||||
BTUSB_WIDEBAND_SPEECH |
|
||||
BTUSB_VALID_LE_STATES },
|
||||
|
|
|
@ -56,7 +56,7 @@ Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|||
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -455,6 +455,9 @@ static const struct usb_device_id blackl
|
||||
@@ -467,6 +467,9 @@ static const struct usb_device_id blackl
|
||||
BTUSB_VALID_LE_STATES },
|
||||
|
||||
/* Additional MediaTek MT7921 Bluetooth devices */
|
||||
|
|
|
@ -54,7 +54,7 @@ Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
|
|||
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -473,6 +473,9 @@ static const struct usb_device_id blackl
|
||||
@@ -485,6 +485,9 @@ static const struct usb_device_id blackl
|
||||
{ USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK |
|
||||
BTUSB_WIDEBAND_SPEECH |
|
||||
BTUSB_VALID_LE_STATES },
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
From 472d7b9e8141729ec1e3fe6821b88563f6379533 Mon Sep 17 00:00:00 2001
|
||||
From: Olliver Schinagl <oliver@schinagl.nl>
|
||||
Date: Tue, 30 Aug 2022 15:46:13 +0200
|
||||
Subject: [PATCH] dt-bindings: leds: Expand LED_COLOR_ID definitions
|
||||
|
||||
In commit 853a78a7d6c7 (dt-bindings: leds: Add LED_COLOR_ID definitions,
|
||||
Sun Jun 9 20:19:04 2019 +0200) the most basic color definitions where
|
||||
added. However, there's a little more very common LED colors.
|
||||
|
||||
While the documentation states 'add what is missing', engineers tend to
|
||||
be lazy and will just use what currently exists. So this patch will take
|
||||
(a) list from online retailers [0], [1], [2] and use the common LED colors from
|
||||
there, this being reasonable as this is what is currently available to purchase.
|
||||
|
||||
Note, that LIME seems to be the modern take to 'Yellow-green' or
|
||||
'Yellowish-green' from some older datasheets.
|
||||
|
||||
[0]: https://www.digikey.com/en/products/filter/led-lighting-color/125
|
||||
[1]: https://eu.mouser.com/c/optoelectronics/led-lighting/led-emitters/standard-leds-smd
|
||||
[2]: https://nl.farnell.com/en-NL/c/optoelectronics-displays/led-products/standard-single-colour-leds-under-75ma
|
||||
|
||||
Signed-off-by: Olliver Schinagl <oliver@schinagl.nl>
|
||||
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Acked-by: Alexander Dahl <ada@thorsis.com>
|
||||
Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20220830134613.1564059-1-oliver@schinagl.nl
|
||||
Signed-off-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
include/dt-bindings/leds/common.h | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/include/dt-bindings/leds/common.h
|
||||
+++ b/include/dt-bindings/leds/common.h
|
||||
@@ -33,7 +33,12 @@
|
||||
#define LED_COLOR_ID_MULTI 8 /* For multicolor LEDs */
|
||||
#define LED_COLOR_ID_RGB 9 /* For multicolor LEDs that can do arbitrary color,
|
||||
so this would include RGBW and similar */
|
||||
-#define LED_COLOR_ID_MAX 10
|
||||
+#define LED_COLOR_ID_PURPLE 10
|
||||
+#define LED_COLOR_ID_ORANGE 11
|
||||
+#define LED_COLOR_ID_PINK 12
|
||||
+#define LED_COLOR_ID_CYAN 13
|
||||
+#define LED_COLOR_ID_LIME 14
|
||||
+#define LED_COLOR_ID_MAX 15
|
||||
|
||||
/* Standard LED functions */
|
||||
/* Keyboard LEDs, usually it would be input4::capslock etc. */
|
|
@ -0,0 +1,29 @@
|
|||
From a067943129b4ec6b835e02cfd5fbef01093c1471 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 8 Oct 2023 16:40:13 +0200
|
||||
Subject: [PATCH] leds: core: Add more colors from DT bindings to led_colors
|
||||
|
||||
The colors are already part of DT bindings. Make sure the kernel is
|
||||
able to convert them to strings.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
Link: https://lore.kernel.org/r/20231008144014.1180334-1-megi@xff.cz
|
||||
Signed-off-by: Lee Jones <lee@kernel.org>
|
||||
---
|
||||
drivers/leds/led-core.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/leds/led-core.c
|
||||
+++ b/drivers/leds/led-core.c
|
||||
@@ -36,6 +36,11 @@ const char * const led_colors[LED_COLOR_
|
||||
[LED_COLOR_ID_IR] = "ir",
|
||||
[LED_COLOR_ID_MULTI] = "multicolor",
|
||||
[LED_COLOR_ID_RGB] = "rgb",
|
||||
+ [LED_COLOR_ID_PURPLE] = "purple",
|
||||
+ [LED_COLOR_ID_ORANGE] = "orange",
|
||||
+ [LED_COLOR_ID_PINK] = "pink",
|
||||
+ [LED_COLOR_ID_CYAN] = "cyan",
|
||||
+ [LED_COLOR_ID_LIME] = "lime",
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(led_colors);
|
||||
|
|
@ -325,7 +325,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||
mctz = soft_limit_tree.rb_tree_per_node[nid];
|
||||
if (!mctz)
|
||||
return;
|
||||
@@ -3523,6 +3533,9 @@ unsigned long mem_cgroup_soft_limit_recl
|
||||
@@ -3524,6 +3534,9 @@ unsigned long mem_cgroup_soft_limit_recl
|
||||
struct mem_cgroup_tree_per_node *mctz;
|
||||
unsigned long excess;
|
||||
|
||||
|
@ -335,7 +335,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||
if (order > 0)
|
||||
return 0;
|
||||
|
||||
@@ -5386,6 +5399,7 @@ static int mem_cgroup_css_online(struct
|
||||
@@ -5387,6 +5400,7 @@ static int mem_cgroup_css_online(struct
|
||||
if (unlikely(mem_cgroup_is_root(memcg)))
|
||||
queue_delayed_work(system_unbound_wq, &stats_flush_dwork,
|
||||
2UL*HZ);
|
||||
|
@ -343,7 +343,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||
return 0;
|
||||
offline_kmem:
|
||||
memcg_offline_kmem(memcg);
|
||||
@@ -5417,6 +5431,7 @@ static void mem_cgroup_css_offline(struc
|
||||
@@ -5418,6 +5432,7 @@ static void mem_cgroup_css_offline(struc
|
||||
memcg_offline_kmem(memcg);
|
||||
reparent_shrinker_deferred(memcg);
|
||||
wb_memcg_offline(memcg);
|
||||
|
@ -351,7 +351,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||
|
||||
drain_all_stock(memcg);
|
||||
|
||||
@@ -5428,6 +5443,7 @@ static void mem_cgroup_css_released(stru
|
||||
@@ -5429,6 +5444,7 @@ static void mem_cgroup_css_released(stru
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_css(css);
|
||||
|
||||
invalidate_reclaim_iterators(memcg);
|
||||
|
|
|
@ -76,7 +76,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
if (pl->pcs) {
|
||||
err = pl->pcs->ops->pcs_config(pl->pcs, pl->cur_link_an_mode,
|
||||
state->interface,
|
||||
@@ -1498,6 +1524,7 @@ struct phylink *phylink_create(struct ph
|
||||
@@ -1499,6 +1525,7 @@ struct phylink *phylink_create(struct ph
|
||||
pl->link_config.speed = SPEED_UNKNOWN;
|
||||
pl->link_config.duplex = DUPLEX_UNKNOWN;
|
||||
pl->link_config.an_enabled = true;
|
||||
|
@ -84,7 +84,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
pl->mac_ops = mac_ops;
|
||||
__set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
|
||||
timer_setup(&pl->link_poll, phylink_fixed_poll, 0);
|
||||
@@ -1899,6 +1926,8 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -1900,6 +1927,8 @@ void phylink_start(struct phylink *pl)
|
||||
if (pl->netdev)
|
||||
netif_carrier_off(pl->netdev);
|
||||
|
||||
|
@ -93,7 +93,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
/* Apply the link configuration to the MAC when starting. This allows
|
||||
* a fixed-link to start with the correct parameters, and also
|
||||
* ensures that we set the appropriate advertisement for Serdes links.
|
||||
@@ -1909,6 +1938,8 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -1910,6 +1939,8 @@ void phylink_start(struct phylink *pl)
|
||||
*/
|
||||
phylink_mac_initial_config(pl, true);
|
||||
|
||||
|
@ -102,7 +102,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED);
|
||||
|
||||
if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
|
||||
@@ -1927,15 +1958,9 @@ void phylink_start(struct phylink *pl)
|
||||
@@ -1928,15 +1959,9 @@ void phylink_start(struct phylink *pl)
|
||||
poll = true;
|
||||
}
|
||||
|
||||
|
@ -120,7 +120,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
if (poll)
|
||||
mod_timer(&pl->link_poll, jiffies + HZ);
|
||||
if (pl->phydev)
|
||||
@@ -1972,6 +1997,10 @@ void phylink_stop(struct phylink *pl)
|
||||
@@ -1973,6 +1998,10 @@ void phylink_stop(struct phylink *pl)
|
||||
}
|
||||
|
||||
phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED);
|
||||
|
|
|
@ -0,0 +1,229 @@
|
|||
From ec51fbd1b8a2bca2948dede99c14ec63dc57ff6b Mon Sep 17 00:00:00 2001
|
||||
From: Bjørn Mork <bjorn@mork.no>
|
||||
Date: Fri, 6 Jan 2023 17:07:38 +0100
|
||||
Subject: [PATCH] r8152: add USB device driver for config selection
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Subclassing the generic USB device driver to override the
|
||||
default configuration selection regardless of matching interface
|
||||
drivers.
|
||||
|
||||
The r815x family devices expose a vendor specific function which
|
||||
the r8152 interface driver wants to handle. This is the preferred
|
||||
device mode. Additionally one or more USB class functions are
|
||||
usually supported for hosts lacking a vendor specific driver. The
|
||||
choice is USB configuration based, with one alternate function per
|
||||
configuration.
|
||||
|
||||
Example device with both NCM and ECM alternate cfgs:
|
||||
|
||||
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=5000 MxCh= 0
|
||||
D: Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 3
|
||||
P: Vendor=0bda ProdID=8156 Rev=31.00
|
||||
S: Manufacturer=Realtek
|
||||
S: Product=USB 10/100/1G/2.5G LAN
|
||||
S: SerialNumber=001000001
|
||||
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=256mA
|
||||
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=00 Driver=r8152
|
||||
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=83(I) Atr=03(Int.) MxPS= 2 Ivl=128ms
|
||||
C: #Ifs= 2 Cfg#= 2 Atr=a0 MxPwr=256mA
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver=
|
||||
E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms
|
||||
I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver=
|
||||
I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver=
|
||||
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
C: #Ifs= 2 Cfg#= 3 Atr=a0 MxPwr=256mA
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=06 Prot=00 Driver=
|
||||
E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms
|
||||
I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=00 Driver=
|
||||
I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=
|
||||
E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
|
||||
|
||||
A problem with this is that Linux will prefer class functions over
|
||||
vendor specific functions. Using the above example, Linux defaults
|
||||
to cfg #2, running the device in a sub-optimal NCM mode.
|
||||
|
||||
Previously we've attempted to work around the problem by
|
||||
blacklisting the devices in the ECM class driver "cdc_ether", and
|
||||
matching on the ECM class function in the vendor specific interface
|
||||
driver. The latter has been used to switch back to the vendor
|
||||
specific configuration when the driver is probed for a class
|
||||
function.
|
||||
|
||||
This workaround has several issues;
|
||||
- class driver blacklists is additional maintanence cruft in an
|
||||
unrelated driver
|
||||
- class driver blacklists prevents users from optionally running
|
||||
the devices in class mode
|
||||
- each device needs double match entries in the vendor driver
|
||||
- the initial probing as a class function slows down device
|
||||
discovery
|
||||
|
||||
Now these issues have become even worse with the introduction of
|
||||
firmware supporting both NCM and ECM, where NCM ends up as the
|
||||
default mode in Linux. To use the same workaround, we now have
|
||||
to blacklist the devices in to two different class drivers and
|
||||
add yet another match entry to the vendor specific driver.
|
||||
|
||||
This patch implements an alternative workaround strategy -
|
||||
independent of the interface drivers. It avoids adding a
|
||||
blacklist to the cdc_ncm driver and will let us remove the
|
||||
existing blacklist from the cdc_ether driver.
|
||||
|
||||
As an additional bonus, removing the blacklists allow users to
|
||||
select one of the other device modes if wanted.
|
||||
|
||||
Signed-off-by: Bjørn Mork <bjorn@mork.no>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 113 ++++++++++++++++++++++++++++------------
|
||||
1 file changed, 81 insertions(+), 32 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9661,6 +9661,9 @@ static int rtl8152_probe(struct usb_inte
|
||||
if (version == RTL_VER_UNKNOWN)
|
||||
return -ENODEV;
|
||||
|
||||
+ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
if (!rtl_vendor_mode(intf))
|
||||
return -ENODEV;
|
||||
|
||||
@@ -9861,43 +9864,35 @@ static void rtl8152_disconnect(struct us
|
||||
}
|
||||
}
|
||||
|
||||
-#define REALTEK_USB_DEVICE(vend, prod) { \
|
||||
- USB_DEVICE_INTERFACE_CLASS(vend, prod, USB_CLASS_VENDOR_SPEC), \
|
||||
-}, \
|
||||
-{ \
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_COMM, \
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), \
|
||||
-}
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
static const struct usb_device_id rtl8152_table[] = {
|
||||
/* Realtek */
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8053),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8155),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8156),
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8050) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8053) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8152) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8153) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) },
|
||||
+ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) },
|
||||
|
||||
/* Microsoft */
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3054),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x721e),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0xa387),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff),
|
||||
- REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601),
|
||||
+ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) },
|
||||
+ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6) },
|
||||
+ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) },
|
||||
+ { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3069) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3082) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7205) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) },
|
||||
+ { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) },
|
||||
+ { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) },
|
||||
+ { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -9917,7 +9912,61 @@ static struct usb_driver rtl8152_driver
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
};
|
||||
|
||||
-module_usb_driver(rtl8152_driver);
|
||||
+static int rtl8152_cfgselector_probe(struct usb_device *udev)
|
||||
+{
|
||||
+ struct usb_host_config *c;
|
||||
+ int i, num_configs;
|
||||
+
|
||||
+ /* The vendor mode is not always config #1, so to find it out. */
|
||||
+ c = udev->config;
|
||||
+ num_configs = udev->descriptor.bNumConfigurations;
|
||||
+ for (i = 0; i < num_configs; (i++, c++)) {
|
||||
+ struct usb_interface_descriptor *desc = NULL;
|
||||
+
|
||||
+ if (!c->desc.bNumInterfaces)
|
||||
+ continue;
|
||||
+ desc = &c->intf_cache[0]->altsetting->desc;
|
||||
+ if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (i == num_configs)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (usb_set_configuration(udev, c->desc.bConfigurationValue)) {
|
||||
+ dev_err(&udev->dev, "Failed to set configuration %d\n",
|
||||
+ c->desc.bConfigurationValue);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct usb_device_driver rtl8152_cfgselector_driver = {
|
||||
+ .name = MODULENAME "-cfgselector",
|
||||
+ .probe = rtl8152_cfgselector_probe,
|
||||
+ .id_table = rtl8152_table,
|
||||
+ .generic_subclass = 1,
|
||||
+};
|
||||
+
|
||||
+static int __init rtl8152_driver_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = usb_register_device_driver(&rtl8152_cfgselector_driver, THIS_MODULE);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ return usb_register(&rtl8152_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit rtl8152_driver_exit(void)
|
||||
+{
|
||||
+ usb_deregister(&rtl8152_driver);
|
||||
+ usb_deregister_device_driver(&rtl8152_cfgselector_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(rtl8152_driver_init);
|
||||
+module_exit(rtl8152_driver_exit);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
|
@ -0,0 +1,158 @@
|
|||
From 69649ef8405320f81497f4757faac8234f61b167 Mon Sep 17 00:00:00 2001
|
||||
From: Bjørn Mork <bjorn@mork.no>
|
||||
Date: Fri, 6 Jan 2023 17:07:39 +0100
|
||||
Subject: [PATCH] cdc_ether: no need to blacklist any r8152 devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The r8152 driver does not need this anymore.
|
||||
|
||||
Dropping blacklist entries adds optional support for these
|
||||
devices in ECM mode.
|
||||
|
||||
The 8153 devices are handled by the r8153_ecm driver when
|
||||
in ECM mode, and must still be blacklisted here.
|
||||
|
||||
Signed-off-by: Bjørn Mork <bjorn@mork.no>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/cdc_ether.c | 114 ------------------------------------
|
||||
1 file changed, 114 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/cdc_ether.c
|
||||
+++ b/drivers/net/usb/cdc_ether.c
|
||||
@@ -768,13 +768,6 @@ static const struct usb_device_id produc
|
||||
.driver_info = 0,
|
||||
},
|
||||
|
||||
-/* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
/* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */
|
||||
{
|
||||
USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
|
||||
@@ -782,119 +775,12 @@ static const struct usb_device_id produc
|
||||
.driver_info = 0,
|
||||
},
|
||||
|
||||
-/* Samsung USB Ethernet Adapters */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-#if IS_ENABLED(CONFIG_USB_RTL8152)
|
||||
-/* Linksys USB3GIGV1 Ethernet Adapter */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-#endif
|
||||
-
|
||||
-/* Lenovo ThinkPad OneLink+ Dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3054, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* ThinkPad USB-C Dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* ThinkPad Thunderbolt 3 Dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3069, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* ThinkPad Thunderbolt 3 Dock Gen 2 (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3082, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Lenovo USB C to Ethernet Adapter (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x720c, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Lenovo USB-C Travel Hub (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7214, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
/* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */
|
||||
{
|
||||
USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x721e, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
.driver_info = 0,
|
||||
},
|
||||
-
|
||||
-/* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Microsoft Surface 2 dock (based on Realtek RTL8152) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07ab, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153B) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x0927, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
-/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
|
||||
/* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */
|
||||
{
|
|
@ -0,0 +1,64 @@
|
|||
From 0d4cda805a183bbe523f2407edb5c14ade50b841 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 17 Jan 2023 11:03:44 +0800
|
||||
Subject: [PATCH] r8152: avoid to change cfg for all devices
|
||||
|
||||
The rtl8152_cfgselector_probe() should set the USB configuration to the
|
||||
vendor mode only for the devices which the driver (r8152) supports.
|
||||
Otherwise, no driver would be used for such devices.
|
||||
|
||||
Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection")
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Reviewed-by: Simon Horman <simon.horman@corigine.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 20 +++++++++++++++++---
|
||||
1 file changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9542,9 +9542,8 @@ static int rtl_fw_init(struct r8152 *tp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-u8 rtl8152_get_version(struct usb_interface *intf)
|
||||
+static u8 __rtl_get_hw_ver(struct usb_device *udev)
|
||||
{
|
||||
- struct usb_device *udev = interface_to_usbdev(intf);
|
||||
u32 ocp_data = 0;
|
||||
__le32 *tmp;
|
||||
u8 version;
|
||||
@@ -9614,10 +9613,19 @@ u8 rtl8152_get_version(struct usb_interf
|
||||
break;
|
||||
default:
|
||||
version = RTL_VER_UNKNOWN;
|
||||
- dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data);
|
||||
+ dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data);
|
||||
break;
|
||||
}
|
||||
|
||||
+ return version;
|
||||
+}
|
||||
+
|
||||
+u8 rtl8152_get_version(struct usb_interface *intf)
|
||||
+{
|
||||
+ u8 version;
|
||||
+
|
||||
+ version = __rtl_get_hw_ver(interface_to_usbdev(intf));
|
||||
+
|
||||
dev_dbg(&intf->dev, "Detected version 0x%04x\n", version);
|
||||
|
||||
return version;
|
||||
@@ -9917,6 +9925,12 @@ static int rtl8152_cfgselector_probe(str
|
||||
struct usb_host_config *c;
|
||||
int i, num_configs;
|
||||
|
||||
+ /* Switch the device to vendor mode, if and only if the vendor mode
|
||||
+ * driver supports it.
|
||||
+ */
|
||||
+ if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN)
|
||||
+ return 0;
|
||||
+
|
||||
/* The vendor mode is not always config #1, so to find it out. */
|
||||
c = udev->config;
|
||||
num_configs = udev->descriptor.bNumConfigurations;
|
|
@ -0,0 +1,71 @@
|
|||
From 95a4c1d617b92cdc4522297741b56e8f6cd01a1e Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Thu, 19 Jan 2023 15:40:42 +0800
|
||||
Subject: [PATCH] r8152: remove rtl_vendor_mode function
|
||||
|
||||
After commit ec51fbd1b8a2 ("r8152: add USB device driver for
|
||||
config selection"), the code about changing USB configuration
|
||||
in rtl_vendor_mode() wouldn't be run anymore. Therefore, the
|
||||
function could be removed.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 39 +--------------------------------------
|
||||
1 file changed, 1 insertion(+), 38 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -8274,43 +8274,6 @@ static bool rtl_check_vendor_ok(struct u
|
||||
return true;
|
||||
}
|
||||
|
||||
-static bool rtl_vendor_mode(struct usb_interface *intf)
|
||||
-{
|
||||
- struct usb_host_interface *alt = intf->cur_altsetting;
|
||||
- struct usb_device *udev;
|
||||
- struct usb_host_config *c;
|
||||
- int i, num_configs;
|
||||
-
|
||||
- if (alt->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC)
|
||||
- return rtl_check_vendor_ok(intf);
|
||||
-
|
||||
- /* The vendor mode is not always config #1, so to find it out. */
|
||||
- udev = interface_to_usbdev(intf);
|
||||
- c = udev->config;
|
||||
- num_configs = udev->descriptor.bNumConfigurations;
|
||||
- if (num_configs < 2)
|
||||
- return false;
|
||||
-
|
||||
- for (i = 0; i < num_configs; (i++, c++)) {
|
||||
- struct usb_interface_descriptor *desc = NULL;
|
||||
-
|
||||
- if (c->desc.bNumInterfaces > 0)
|
||||
- desc = &c->intf_cache[0]->altsetting->desc;
|
||||
- else
|
||||
- continue;
|
||||
-
|
||||
- if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
|
||||
- usb_driver_set_configuration(udev, c->desc.bConfigurationValue);
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (i == num_configs)
|
||||
- dev_err(&intf->dev, "Unexpected Device\n");
|
||||
-
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
static int rtl8152_pre_reset(struct usb_interface *intf)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
@@ -9672,7 +9635,7 @@ static int rtl8152_probe(struct usb_inte
|
||||
if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
return -ENODEV;
|
||||
|
||||
- if (!rtl_vendor_mode(intf))
|
||||
+ if (!rtl_check_vendor_ok(intf))
|
||||
return -ENODEV;
|
||||
|
||||
usb_reset_device(udev);
|
|
@ -0,0 +1,46 @@
|
|||
From 02767440e1dda9861a11ca1dbe0f19a760b1d5c2 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Thu, 19 Jan 2023 15:40:43 +0800
|
||||
Subject: [PATCH] r8152: reduce the control transfer of rtl8152_get_version()
|
||||
|
||||
Reduce the control transfer by moving calling rtl8152_get_version() in
|
||||
rtl8152_probe(). This could prevent from calling rtl8152_get_version()
|
||||
for unnecessary situations. For example, after setting config #2 for the
|
||||
device, there are two interfaces and rtl8152_probe() may be called
|
||||
twice. However, we don't need to call rtl8152_get_version() for this
|
||||
situation.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9624,20 +9624,21 @@ static int rtl8152_probe(struct usb_inte
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
- u8 version = rtl8152_get_version(intf);
|
||||
struct r8152 *tp;
|
||||
struct net_device *netdev;
|
||||
+ u8 version;
|
||||
int ret;
|
||||
|
||||
- if (version == RTL_VER_UNKNOWN)
|
||||
- return -ENODEV;
|
||||
-
|
||||
if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
return -ENODEV;
|
||||
|
||||
if (!rtl_check_vendor_ok(intf))
|
||||
return -ENODEV;
|
||||
|
||||
+ version = rtl8152_get_version(intf);
|
||||
+ if (version == RTL_VER_UNKNOWN)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
usb_reset_device(udev);
|
||||
netdev = alloc_etherdev(sizeof(struct r8152));
|
||||
if (!netdev) {
|
|
@ -0,0 +1,55 @@
|
|||
From 5cc33f139e11b893ff6dc60d8a0ae865a65521ac Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Thu, 6 Apr 2023 17:14:26 -0700
|
||||
Subject: [PATCH] r8152: Add __GFP_NOWARN to big allocations
|
||||
|
||||
When memory is a little tight on my system, it's pretty easy to see
|
||||
warnings that look like this.
|
||||
|
||||
ksoftirqd/0: page allocation failure: order:3, mode:0x40a20(GFP_ATOMIC|__GFP_COMP), nodemask=(null),cpuset=/,mems_allowed=0
|
||||
...
|
||||
Call trace:
|
||||
dump_backtrace+0x0/0x1e8
|
||||
show_stack+0x20/0x2c
|
||||
dump_stack_lvl+0x60/0x78
|
||||
dump_stack+0x18/0x38
|
||||
warn_alloc+0x104/0x174
|
||||
__alloc_pages+0x588/0x67c
|
||||
alloc_rx_agg+0xa0/0x190 [r8152 ...]
|
||||
r8152_poll+0x270/0x760 [r8152 ...]
|
||||
__napi_poll+0x44/0x1ec
|
||||
net_rx_action+0x100/0x300
|
||||
__do_softirq+0xec/0x38c
|
||||
run_ksoftirqd+0x38/0xec
|
||||
smpboot_thread_fn+0xb8/0x248
|
||||
kthread+0x134/0x154
|
||||
ret_from_fork+0x10/0x20
|
||||
|
||||
On a fragmented system it's normal that order 3 allocations will
|
||||
sometimes fail, especially atomic ones. The driver handles these
|
||||
failures fine and the WARN just creates spam in the logs for this
|
||||
case. The __GFP_NOWARN flag is exactly for this situation, so add it
|
||||
to the allocation.
|
||||
|
||||
NOTE: my testing is on a 5.15 system, but there should be no reason
|
||||
that this would be fundamentally different on a mainline kernel.
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Acked-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230406171411.1.I84dbef45786af440fd269b71e9436a96a8e7a152@changeid
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -1947,7 +1947,7 @@ static struct rx_agg *alloc_rx_agg(struc
|
||||
if (!rx_agg)
|
||||
return NULL;
|
||||
|
||||
- rx_agg->page = alloc_pages(mflags | __GFP_COMP, order);
|
||||
+ rx_agg->page = alloc_pages(mflags | __GFP_COMP | __GFP_NOWARN, order);
|
||||
if (!rx_agg->page)
|
||||
goto free_rx;
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
From 0fbd79c01a9a657348f7032df70c57a406468c86 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 2 May 2023 11:36:27 +0800
|
||||
Subject: [PATCH] r8152: fix the autosuspend doesn't work
|
||||
|
||||
Set supports_autosuspend = 1 for the rtl8152_cfgselector_driver.
|
||||
|
||||
Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection")
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9925,6 +9925,7 @@ static struct usb_device_driver rtl8152_
|
||||
.probe = rtl8152_cfgselector_probe,
|
||||
.id_table = rtl8152_table,
|
||||
.generic_subclass = 1,
|
||||
+ .supports_autosuspend = 1,
|
||||
};
|
||||
|
||||
static int __init rtl8152_driver_init(void)
|
|
@ -0,0 +1,70 @@
|
|||
From 57df0fb9d511f91202114813e90128d65c0589f0 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Wed, 26 Jul 2023 11:08:07 +0800
|
||||
Subject: [PATCH] r8152: adjust generic_ocp_write function
|
||||
|
||||
Reduce the control transfer if all bytes of first or the last DWORD are
|
||||
written.
|
||||
|
||||
The original method is to split the control transfer into three parts
|
||||
(the first DWORD, middle continuous data, and the last DWORD). However,
|
||||
they could be combined if whole bytes of the first DWORD or last DWORD
|
||||
are written. That is, the first DWORD or the last DWORD could be combined
|
||||
with the middle continuous data, if the byte_en is 0xff.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230726030808.9093-418-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 29 ++++++++++++++++++-----------
|
||||
1 file changed, 18 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -1313,16 +1313,24 @@ static int generic_ocp_write(struct r815
|
||||
byteen_end = byteen & BYTE_EN_END_MASK;
|
||||
|
||||
byen = byteen_start | (byteen_start << 4);
|
||||
- ret = set_registers(tp, index, type | byen, 4, data);
|
||||
- if (ret < 0)
|
||||
- goto error1;
|
||||
-
|
||||
- index += 4;
|
||||
- data += 4;
|
||||
- size -= 4;
|
||||
|
||||
- if (size) {
|
||||
+ /* Split the first DWORD if the byte_en is not 0xff */
|
||||
+ if (byen != BYTE_EN_DWORD) {
|
||||
+ ret = set_registers(tp, index, type | byen, 4, data);
|
||||
+ if (ret < 0)
|
||||
+ goto error1;
|
||||
+
|
||||
+ index += 4;
|
||||
+ data += 4;
|
||||
size -= 4;
|
||||
+ }
|
||||
+
|
||||
+ if (size) {
|
||||
+ byen = byteen_end | (byteen_end >> 4);
|
||||
+
|
||||
+ /* Split the last DWORD if the byte_en is not 0xff */
|
||||
+ if (byen != BYTE_EN_DWORD)
|
||||
+ size -= 4;
|
||||
|
||||
while (size) {
|
||||
if (size > limit) {
|
||||
@@ -1349,10 +1357,9 @@ static int generic_ocp_write(struct r815
|
||||
}
|
||||
}
|
||||
|
||||
- byen = byteen_end | (byteen_end >> 4);
|
||||
- ret = set_registers(tp, index, type | byen, 4, data);
|
||||
- if (ret < 0)
|
||||
- goto error1;
|
||||
+ /* Set the last DWORD */
|
||||
+ if (byen != BYTE_EN_DWORD)
|
||||
+ ret = set_registers(tp, index, type | byen, 4, data);
|
||||
}
|
||||
|
||||
error1:
|
|
@ -0,0 +1,129 @@
|
|||
From e5c266a61186b462c388c53a3564c375e72f2244 Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Wed, 26 Jul 2023 11:08:08 +0800
|
||||
Subject: [PATCH] r8152: set bp in bulk
|
||||
|
||||
PLA_BP_0 ~ PLA_BP_15 (0xfc28 ~ 0xfc46) are continuous registers, so we
|
||||
could combine the control transfers into one control transfer.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230726030808.9093-419-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 75 ++++++++++++++---------------------------
|
||||
1 file changed, 25 insertions(+), 50 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -3984,29 +3984,10 @@ static void rtl_reset_bmu(struct r8152 *
|
||||
/* Clear the bp to stop the firmware before loading a new one */
|
||||
static void rtl_clear_bp(struct r8152 *tp, u16 type)
|
||||
{
|
||||
- switch (tp->version) {
|
||||
- case RTL_VER_01:
|
||||
- case RTL_VER_02:
|
||||
- case RTL_VER_07:
|
||||
- break;
|
||||
- case RTL_VER_03:
|
||||
- case RTL_VER_04:
|
||||
- case RTL_VER_05:
|
||||
- case RTL_VER_06:
|
||||
- ocp_write_byte(tp, type, PLA_BP_EN, 0);
|
||||
- break;
|
||||
- case RTL_VER_14:
|
||||
- ocp_write_word(tp, type, USB_BP2_EN, 0);
|
||||
+ u16 bp[16] = {0};
|
||||
+ u16 bp_num;
|
||||
|
||||
- ocp_write_word(tp, type, USB_BP_8, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_9, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_10, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_11, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_12, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_13, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_14, 0);
|
||||
- ocp_write_word(tp, type, USB_BP_15, 0);
|
||||
- break;
|
||||
+ switch (tp->version) {
|
||||
case RTL_VER_08:
|
||||
case RTL_VER_09:
|
||||
case RTL_VER_10:
|
||||
@@ -4014,32 +3995,31 @@ static void rtl_clear_bp(struct r8152 *t
|
||||
case RTL_VER_12:
|
||||
case RTL_VER_13:
|
||||
case RTL_VER_15:
|
||||
- default:
|
||||
if (type == MCU_TYPE_USB) {
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
|
||||
-
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_8, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_9, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_10, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_11, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_12, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_13, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_14, 0);
|
||||
- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_15, 0);
|
||||
- } else {
|
||||
- ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
|
||||
+ bp_num = 16;
|
||||
+ break;
|
||||
}
|
||||
+ fallthrough;
|
||||
+ case RTL_VER_03:
|
||||
+ case RTL_VER_04:
|
||||
+ case RTL_VER_05:
|
||||
+ case RTL_VER_06:
|
||||
+ ocp_write_byte(tp, type, PLA_BP_EN, 0);
|
||||
+ fallthrough;
|
||||
+ case RTL_VER_01:
|
||||
+ case RTL_VER_02:
|
||||
+ case RTL_VER_07:
|
||||
+ bp_num = 8;
|
||||
+ break;
|
||||
+ case RTL_VER_14:
|
||||
+ default:
|
||||
+ ocp_write_word(tp, type, USB_BP2_EN, 0);
|
||||
+ bp_num = 16;
|
||||
break;
|
||||
}
|
||||
|
||||
- ocp_write_word(tp, type, PLA_BP_0, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_1, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_2, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_3, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_4, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_5, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_6, 0);
|
||||
- ocp_write_word(tp, type, PLA_BP_7, 0);
|
||||
+ generic_ocp_write(tp, PLA_BP_0, BYTE_EN_DWORD, bp_num << 1, bp, type);
|
||||
|
||||
/* wait 3 ms to make sure the firmware is stopped */
|
||||
usleep_range(3000, 6000);
|
||||
@@ -5016,10 +4996,9 @@ static void rtl8152_fw_phy_nc_apply(stru
|
||||
|
||||
static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac)
|
||||
{
|
||||
- u16 bp_en_addr, bp_index, type, bp_num, fw_ver_reg;
|
||||
+ u16 bp_en_addr, type, fw_ver_reg;
|
||||
u32 length;
|
||||
u8 *data;
|
||||
- int i;
|
||||
|
||||
switch (__le32_to_cpu(mac->blk_hdr.type)) {
|
||||
case RTL_FW_PLA:
|
||||
@@ -5061,12 +5040,8 @@ static void rtl8152_fw_mac_apply(struct
|
||||
ocp_write_word(tp, type, __le16_to_cpu(mac->bp_ba_addr),
|
||||
__le16_to_cpu(mac->bp_ba_value));
|
||||
|
||||
- bp_index = __le16_to_cpu(mac->bp_start);
|
||||
- bp_num = __le16_to_cpu(mac->bp_num);
|
||||
- for (i = 0; i < bp_num; i++) {
|
||||
- ocp_write_word(tp, type, bp_index, __le16_to_cpu(mac->bp[i]));
|
||||
- bp_index += 2;
|
||||
- }
|
||||
+ generic_ocp_write(tp, __le16_to_cpu(mac->bp_start), BYTE_EN_DWORD,
|
||||
+ __le16_to_cpu(mac->bp_num) << 1, mac->bp, type);
|
||||
|
||||
bp_en_addr = __le16_to_cpu(mac->bp_en_addr);
|
||||
if (bp_en_addr)
|
|
@ -0,0 +1,39 @@
|
|||
From cf74eb5a5bc867258e7d0b0d1c3c4a60e1e3de2f Mon Sep 17 00:00:00 2001
|
||||
From: Jakub Kicinski <kuba@kernel.org>
|
||||
Date: Mon, 14 Aug 2023 08:35:21 -0700
|
||||
Subject: [PATCH] eth: r8152: try to use a normal budget
|
||||
|
||||
Mario reports that loading r8152 on his system leads to a:
|
||||
|
||||
netif_napi_add_weight() called with weight 256
|
||||
|
||||
warning getting printed. We don't have any solid data
|
||||
on why such high budget was chosen, and it may cause
|
||||
stalls in processing other softirqs and rt threads.
|
||||
So try to switch back to the default (64) weight.
|
||||
|
||||
If this slows down someone's system we should investigate
|
||||
which part of stopping starting the NAPI poll in this
|
||||
driver are expensive.
|
||||
|
||||
Reported-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Link: https://lore.kernel.org/all/0bfd445a-81f7-f702-08b0-bd5a72095e49@amd.com/
|
||||
Acked-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230814153521.2697982-1-kuba@kernel.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9770,8 +9770,7 @@ static int rtl8152_probe(struct usb_inte
|
||||
|
||||
usb_set_intfdata(intf, tp);
|
||||
|
||||
- netif_napi_add_weight(netdev, &tp->napi, r8152_poll,
|
||||
- tp->support_2500full ? 256 : 64);
|
||||
+ netif_napi_add(netdev, &tp->napi, r8152_poll);
|
||||
|
||||
ret = register_netdev(netdev);
|
||||
if (ret != 0) {
|
|
@ -0,0 +1,39 @@
|
|||
From 72f93a3136ee18fd59fa6579f84c07e93424681e Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Napolitano <anton@polit.no>
|
||||
Date: Sat, 26 Aug 2023 01:05:50 +0200
|
||||
Subject: [PATCH] r8152: add vendor/device ID pair for D-Link DUB-E250
|
||||
|
||||
The D-Link DUB-E250 is an RTL8156 based 2.5G Ethernet controller.
|
||||
|
||||
Add the vendor and product ID values to the driver. This makes Ethernet
|
||||
work with the adapter.
|
||||
|
||||
Signed-off-by: Antonio Napolitano <anton@polit.no>
|
||||
Link: https://lore.kernel.org/r/CV200KJEEUPC.WPKAHXCQJ05I@mercurius
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 1 +
|
||||
include/linux/usb/r8152.h | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
|
||||
--- a/include/linux/usb/r8152.h
|
||||
+++ b/include/linux/usb/r8152.h
|
||||
@@ -29,6 +29,7 @@
|
||||
#define VENDOR_ID_LINKSYS 0x13b1
|
||||
#define VENDOR_ID_NVIDIA 0x0955
|
||||
#define VENDOR_ID_TPLINK 0x2357
|
||||
+#define VENDOR_ID_DLINK 0x2001
|
||||
|
||||
#if IS_REACHABLE(CONFIG_USB_RTL8152)
|
||||
extern u8 rtl8152_get_version(struct usb_interface *intf);
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -9846,6 +9846,7 @@ static const struct usb_device_id rtl815
|
||||
{ USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) },
|
||||
{ USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) },
|
||||
{ USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },
|
||||
+ { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) },
|
||||
{}
|
||||
};
|
||||
|
|
@ -0,0 +1,447 @@
|
|||
From 715f67f33af45ce2cc3a5b1ef133cc8c8e7787b0 Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Fri, 20 Oct 2023 14:06:58 -0700
|
||||
Subject: [PATCH] r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE
|
||||
|
||||
Whenever the RTL8152_UNPLUG is set that just tells the driver that all
|
||||
accesses will fail and we should just immediately bail. A future patch
|
||||
will use this same concept at a time when the driver hasn't actually
|
||||
been unplugged but is about to be reset. Rename the flag in
|
||||
preparation for the future patch.
|
||||
|
||||
This is a no-op change and just a search and replace.
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Grant Grundler <grundler@chromium.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 96 ++++++++++++++++++++---------------------
|
||||
1 file changed, 48 insertions(+), 48 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -763,7 +763,7 @@ enum rtl_register_content {
|
||||
|
||||
/* rtl8152 flags */
|
||||
enum rtl8152_flags {
|
||||
- RTL8152_UNPLUG = 0,
|
||||
+ RTL8152_INACCESSIBLE = 0,
|
||||
RTL8152_SET_RX_MODE,
|
||||
WORK_ENABLE,
|
||||
RTL8152_LINK_CHG,
|
||||
@@ -1244,7 +1244,7 @@ int set_registers(struct r8152 *tp, u16
|
||||
static void rtl_set_unplug(struct r8152 *tp)
|
||||
{
|
||||
if (tp->udev->state == USB_STATE_NOTATTACHED) {
|
||||
- set_bit(RTL8152_UNPLUG, &tp->flags);
|
||||
+ set_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
smp_mb__after_atomic();
|
||||
}
|
||||
}
|
||||
@@ -1255,7 +1255,7 @@ static int generic_ocp_read(struct r8152
|
||||
u16 limit = 64;
|
||||
int ret = 0;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
/* both size and indix must be 4 bytes align */
|
||||
@@ -1299,7 +1299,7 @@ static int generic_ocp_write(struct r815
|
||||
u16 byteen_start, byteen_end, byen;
|
||||
u16 limit = 512;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
/* both size and indix must be 4 bytes align */
|
||||
@@ -1536,7 +1536,7 @@ static int read_mii_word(struct net_devi
|
||||
struct r8152 *tp = netdev_priv(netdev);
|
||||
int ret;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
if (phy_id != R8152_PHY_ID)
|
||||
@@ -1552,7 +1552,7 @@ void write_mii_word(struct net_device *n
|
||||
{
|
||||
struct r8152 *tp = netdev_priv(netdev);
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (phy_id != R8152_PHY_ID)
|
||||
@@ -1757,7 +1757,7 @@ static void read_bulk_callback(struct ur
|
||||
if (!tp)
|
||||
return;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
@@ -1849,7 +1849,7 @@ static void write_bulk_callback(struct u
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
return;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (!skb_queue_empty(&tp->tx_queue))
|
||||
@@ -1870,7 +1870,7 @@ static void intr_callback(struct urb *ur
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
return;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
switch (status) {
|
||||
@@ -2614,7 +2614,7 @@ static void bottom_half(struct tasklet_s
|
||||
{
|
||||
struct r8152 *tp = from_tasklet(tp, t, tx_tl);
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (!test_bit(WORK_ENABLE, &tp->flags))
|
||||
@@ -2657,7 +2657,7 @@ int r8152_submit_rx(struct r8152 *tp, st
|
||||
int ret;
|
||||
|
||||
/* The rx would be stopped, so skip submitting */
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags) ||
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) ||
|
||||
!test_bit(WORK_ENABLE, &tp->flags) || !netif_carrier_ok(tp->netdev))
|
||||
return 0;
|
||||
|
||||
@@ -3057,7 +3057,7 @@ static int rtl_enable(struct r8152 *tp)
|
||||
|
||||
static int rtl8152_enable(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
set_tx_qlen(tp);
|
||||
@@ -3144,7 +3144,7 @@ static int rtl8153_enable(struct r8152 *
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
set_tx_qlen(tp);
|
||||
@@ -3176,7 +3176,7 @@ static void rtl_disable(struct r8152 *tp
|
||||
u32 ocp_data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -3630,7 +3630,7 @@ static u16 r8153_phy_status(struct r8152
|
||||
}
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3662,7 +3662,7 @@ static void r8153b_ups_en(struct r8152 *
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 500; i++) {
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
|
||||
AUTOLOAD_DONE)
|
||||
@@ -3704,7 +3704,7 @@ static void r8153c_ups_en(struct r8152 *
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 500; i++) {
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
|
||||
AUTOLOAD_DONE)
|
||||
@@ -4049,8 +4049,8 @@ static int rtl_phy_patch_request(struct
|
||||
for (i = 0; wait && i < 5000; i++) {
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
- break;
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
+ return -ENODEV;
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT);
|
||||
@@ -6008,7 +6008,7 @@ static int rtl8156_enable(struct r8152 *
|
||||
u32 ocp_data;
|
||||
u16 speed;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
r8156_fc_parameter(tp);
|
||||
@@ -6066,7 +6066,7 @@ static int rtl8156b_enable(struct r8152
|
||||
u32 ocp_data;
|
||||
u16 speed;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
set_tx_qlen(tp);
|
||||
@@ -6252,7 +6252,7 @@ out:
|
||||
|
||||
static void rtl8152_up(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8152_aldps_en(tp, false);
|
||||
@@ -6262,7 +6262,7 @@ static void rtl8152_up(struct r8152 *tp)
|
||||
|
||||
static void rtl8152_down(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6277,7 +6277,7 @@ static void rtl8153_up(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153_u1u2en(tp, false);
|
||||
@@ -6317,7 +6317,7 @@ static void rtl8153_down(struct r8152 *t
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6338,7 +6338,7 @@ static void rtl8153b_up(struct r8152 *tp
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -6362,7 +6362,7 @@ static void rtl8153b_down(struct r8152 *
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6399,7 +6399,7 @@ static void rtl8153c_up(struct r8152 *tp
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -6480,7 +6480,7 @@ static void rtl8156_up(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -6553,7 +6553,7 @@ static void rtl8156_down(struct r8152 *t
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
return;
|
||||
}
|
||||
@@ -6691,7 +6691,7 @@ static void rtl_work_func_t(struct work_
|
||||
/* If the device is unplugged or !netif_running(), the workqueue
|
||||
* doesn't need to wake the device, and could return directly.
|
||||
*/
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags) || !netif_running(tp->netdev))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) || !netif_running(tp->netdev))
|
||||
return;
|
||||
|
||||
if (usb_autopm_get_interface(tp->intf) < 0)
|
||||
@@ -6730,7 +6730,7 @@ static void rtl_hw_phy_work_func_t(struc
|
||||
{
|
||||
struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work);
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (usb_autopm_get_interface(tp->intf) < 0)
|
||||
@@ -6857,7 +6857,7 @@ static int rtl8152_close(struct net_devi
|
||||
netif_stop_queue(netdev);
|
||||
|
||||
res = usb_autopm_get_interface(tp->intf);
|
||||
- if (res < 0 || test_bit(RTL8152_UNPLUG, &tp->flags)) {
|
||||
+ if (res < 0 || test_bit(RTL8152_INACCESSIBLE, &tp->flags)) {
|
||||
rtl_drop_queued_tx(tp);
|
||||
rtl_stop_rx(tp);
|
||||
} else {
|
||||
@@ -6890,7 +6890,7 @@ static void r8152b_init(struct r8152 *tp
|
||||
u32 ocp_data;
|
||||
u16 data;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
data = r8152_mdio_read(tp, MII_BMCR);
|
||||
@@ -6934,7 +6934,7 @@ static void r8153_init(struct r8152 *tp)
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153_u1u2en(tp, false);
|
||||
@@ -6945,7 +6945,7 @@ static void r8153_init(struct r8152 *tp)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7074,7 +7074,7 @@ static void r8153b_init(struct r8152 *tp
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -7085,7 +7085,7 @@ static void r8153b_init(struct r8152 *tp
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7156,7 +7156,7 @@ static void r8153c_init(struct r8152 *tp
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_u1u2en(tp, false);
|
||||
@@ -7176,7 +7176,7 @@ static void r8153c_init(struct r8152 *tp
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -8005,7 +8005,7 @@ static void r8156_init(struct r8152 *tp)
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP);
|
||||
@@ -8026,7 +8026,7 @@ static void r8156_init(struct r8152 *tp)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -8101,7 +8101,7 @@ static void r8156b_init(struct r8152 *tp
|
||||
u16 data;
|
||||
int i;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP);
|
||||
@@ -8135,7 +8135,7 @@ static void r8156b_init(struct r8152 *tp
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9164,7 +9164,7 @@ static int rtl8152_ioctl(struct net_devi
|
||||
struct mii_ioctl_data *data = if_mii(rq);
|
||||
int res;
|
||||
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return -ENODEV;
|
||||
|
||||
res = usb_autopm_get_interface(tp->intf);
|
||||
@@ -9266,7 +9266,7 @@ static const struct net_device_ops rtl81
|
||||
|
||||
static void rtl8152_unload(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
if (tp->version != RTL_VER_01)
|
||||
@@ -9275,7 +9275,7 @@ static void rtl8152_unload(struct r8152
|
||||
|
||||
static void rtl8153_unload(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153_power_cut_en(tp, false);
|
||||
@@ -9283,7 +9283,7 @@ static void rtl8153_unload(struct r8152
|
||||
|
||||
static void rtl8153b_unload(struct r8152 *tp)
|
||||
{
|
||||
- if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
return;
|
||||
|
||||
r8153b_power_cut_en(tp, false);
|
|
@ -0,0 +1,398 @@
|
|||
From d9962b0d42029bcb40fe3c38bce06d1870fa4df4 Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Fri, 20 Oct 2023 14:06:59 -0700
|
||||
Subject: [PATCH] r8152: Block future register access if register access fails
|
||||
|
||||
Even though the functions to read/write registers can fail, most of
|
||||
the places in the r8152 driver that read/write register values don't
|
||||
check error codes. The lack of error code checking is problematic in
|
||||
at least two ways.
|
||||
|
||||
The first problem is that the r8152 driver often uses code patterns
|
||||
similar to this:
|
||||
x = read_register()
|
||||
x = x | SOME_BIT;
|
||||
write_register(x);
|
||||
|
||||
...with the above pattern, if the read_register() fails and returns
|
||||
garbage then we'll end up trying to write modified garbage back to the
|
||||
Realtek adapter. If the write_register() succeeds that's bad. Note
|
||||
that as of commit f53a7ad18959 ("r8152: Set memory to all 0xFFs on
|
||||
failed reg reads") the "garbage" returned by read_register() will at
|
||||
least be consistent garbage, but it is still garbage.
|
||||
|
||||
It turns out that this problem is very serious. Writing garbage to
|
||||
some of the hardware registers on the Ethernet adapter can put the
|
||||
adapter in such a bad state that it needs to be power cycled (fully
|
||||
unplugged and plugged in again) before it can enumerate again.
|
||||
|
||||
The second problem is that the r8152 driver generally has functions
|
||||
that are long sequences of register writes. Assuming everything will
|
||||
be OK if a random register write fails in the middle isn't a great
|
||||
assumption.
|
||||
|
||||
One might wonder if the above two problems are real. You could ask if
|
||||
we would really have a successful write after a failed read. It turns
|
||||
out that the answer appears to be "yes, this can happen". In fact,
|
||||
we've seen at least two distinct failure modes where this happens.
|
||||
|
||||
On a sc7180-trogdor Chromebook if you drop into kdb for a while and
|
||||
then resume, you can see:
|
||||
1. We get a "Tx timeout"
|
||||
2. The "Tx timeout" queues up a USB reset.
|
||||
3. In rtl8152_pre_reset() we try to reinit the hardware.
|
||||
4. The first several (2-9) register accesses fail with a timeout, then
|
||||
things recover.
|
||||
|
||||
The above test case was actually fixed by the patch ("r8152: Increase
|
||||
USB control msg timeout to 5000ms as per spec") but at least shows
|
||||
that we really can see successful calls after failed ones.
|
||||
|
||||
On a different (AMD) based Chromebook with a particular adapter, we
|
||||
found that during reboot tests we'd also sometimes get a transitory
|
||||
failure. In this case we saw -EPIPE being returned sometimes. Retrying
|
||||
worked, but retrying is not always safe for all register accesses
|
||||
since reading/writing some registers might have side effects (like
|
||||
registers that clear on read).
|
||||
|
||||
Let's fully lock out all register access if a register access fails.
|
||||
When we do this, we'll try to queue up a USB reset and try to unlock
|
||||
register access after the reset. This is slightly tricker than it
|
||||
sounds since the r8152 driver has an optimized reset sequence that
|
||||
only works reliably after probe happens. In order to handle this, we
|
||||
avoid the optimized reset if probe didn't finish. Instead, we simply
|
||||
retry the probe routine in this case.
|
||||
|
||||
When locking out access, we'll use the existing infrastructure that
|
||||
the driver was using when it detected we were unplugged. This keeps us
|
||||
from getting stuck in delay loops in some parts of the driver.
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Grant Grundler <grundler@chromium.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 207 ++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 176 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -772,6 +772,9 @@ enum rtl8152_flags {
|
||||
SCHEDULE_TASKLET,
|
||||
GREEN_ETHERNET,
|
||||
RX_EPROTO,
|
||||
+ IN_PRE_RESET,
|
||||
+ PROBED_WITH_NO_ERRORS,
|
||||
+ PROBE_SHOULD_RETRY,
|
||||
};
|
||||
|
||||
#define DEVICE_ID_LENOVO_USB_C_TRAVEL_HUB 0x721e
|
||||
@@ -952,6 +955,8 @@ struct r8152 {
|
||||
u8 version;
|
||||
u8 duplex;
|
||||
u8 autoneg;
|
||||
+
|
||||
+ unsigned int reg_access_reset_count;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1199,6 +1204,96 @@ static unsigned int agg_buf_sz = 16384;
|
||||
|
||||
#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc))
|
||||
|
||||
+/* If register access fails then we block access and issue a reset. If this
|
||||
+ * happens too many times in a row without a successful access then we stop
|
||||
+ * trying to reset and just leave access blocked.
|
||||
+ */
|
||||
+#define REGISTER_ACCESS_MAX_RESETS 3
|
||||
+
|
||||
+static void rtl_set_inaccessible(struct r8152 *tp)
|
||||
+{
|
||||
+ set_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
+ smp_mb__after_atomic();
|
||||
+}
|
||||
+
|
||||
+static void rtl_set_accessible(struct r8152 *tp)
|
||||
+{
|
||||
+ clear_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
+ smp_mb__after_atomic();
|
||||
+}
|
||||
+
|
||||
+static
|
||||
+int r8152_control_msg(struct r8152 *tp, unsigned int pipe, __u8 request,
|
||||
+ __u8 requesttype, __u16 value, __u16 index, void *data,
|
||||
+ __u16 size, const char *msg_tag)
|
||||
+{
|
||||
+ struct usb_device *udev = tp->udev;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ ret = usb_control_msg(udev, pipe, request, requesttype,
|
||||
+ value, index, data, size,
|
||||
+ USB_CTRL_GET_TIMEOUT);
|
||||
+
|
||||
+ /* No need to issue a reset to report an error if the USB device got
|
||||
+ * unplugged; just return immediately.
|
||||
+ */
|
||||
+ if (ret == -ENODEV)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* If the write was successful then we're done */
|
||||
+ if (ret >= 0) {
|
||||
+ tp->reg_access_reset_count = 0;
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ dev_err(&udev->dev,
|
||||
+ "Failed to %s %d bytes at %#06x/%#06x (%d)\n",
|
||||
+ msg_tag, size, value, index, ret);
|
||||
+
|
||||
+ /* Block all future register access until we reset. Much of the code
|
||||
+ * in the driver doesn't check for errors. Notably, many parts of the
|
||||
+ * driver do a read/modify/write of a register value without
|
||||
+ * confirming that the read succeeded. Writing back modified garbage
|
||||
+ * like this can fully wedge the adapter, requiring a power cycle.
|
||||
+ */
|
||||
+ rtl_set_inaccessible(tp);
|
||||
+
|
||||
+ /* If probe hasn't yet finished, then we'll request a retry of the
|
||||
+ * whole probe routine if we get any control transfer errors. We
|
||||
+ * never have to clear this bit since we free/reallocate the whole "tp"
|
||||
+ * structure if we retry probe.
|
||||
+ */
|
||||
+ if (!test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) {
|
||||
+ set_bit(PROBE_SHOULD_RETRY, &tp->flags);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Failing to access registers in pre-reset is not surprising since we
|
||||
+ * wouldn't be resetting if things were behaving normally. The register
|
||||
+ * access we do in pre-reset isn't truly mandatory--we're just reusing
|
||||
+ * the disable() function and trying to be nice by powering the
|
||||
+ * adapter down before resetting it. Thus, if we're in pre-reset,
|
||||
+ * we'll return right away and not try to queue up yet another reset.
|
||||
+ * We know the post-reset is already coming.
|
||||
+ */
|
||||
+ if (test_bit(IN_PRE_RESET, &tp->flags))
|
||||
+ return ret;
|
||||
+
|
||||
+ if (tp->reg_access_reset_count < REGISTER_ACCESS_MAX_RESETS) {
|
||||
+ usb_queue_reset_device(tp->intf);
|
||||
+ tp->reg_access_reset_count++;
|
||||
+ } else if (tp->reg_access_reset_count == REGISTER_ACCESS_MAX_RESETS) {
|
||||
+ dev_err(&udev->dev,
|
||||
+ "Tried to reset %d times; giving up.\n",
|
||||
+ REGISTER_ACCESS_MAX_RESETS);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static
|
||||
int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
|
||||
{
|
||||
@@ -1209,9 +1304,10 @@ int get_registers(struct r8152 *tp, u16
|
||||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
|
||||
- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_in,
|
||||
- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
- value, index, tmp, size, USB_CTRL_GET_TIMEOUT);
|
||||
+ ret = r8152_control_msg(tp, tp->pipe_ctrl_in,
|
||||
+ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
+ value, index, tmp, size, "read");
|
||||
+
|
||||
if (ret < 0)
|
||||
memset(data, 0xff, size);
|
||||
else
|
||||
@@ -1232,9 +1328,9 @@ int set_registers(struct r8152 *tp, u16
|
||||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
|
||||
- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_out,
|
||||
- RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
|
||||
- value, index, tmp, size, USB_CTRL_SET_TIMEOUT);
|
||||
+ ret = r8152_control_msg(tp, tp->pipe_ctrl_out,
|
||||
+ RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
|
||||
+ value, index, tmp, size, "write");
|
||||
|
||||
kfree(tmp);
|
||||
|
||||
@@ -1243,10 +1339,8 @@ int set_registers(struct r8152 *tp, u16
|
||||
|
||||
static void rtl_set_unplug(struct r8152 *tp)
|
||||
{
|
||||
- if (tp->udev->state == USB_STATE_NOTATTACHED) {
|
||||
- set_bit(RTL8152_INACCESSIBLE, &tp->flags);
|
||||
- smp_mb__after_atomic();
|
||||
- }
|
||||
+ if (tp->udev->state == USB_STATE_NOTATTACHED)
|
||||
+ rtl_set_inaccessible(tp);
|
||||
}
|
||||
|
||||
static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
|
||||
@@ -8261,7 +8355,7 @@ static int rtl8152_pre_reset(struct usb_
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
struct net_device *netdev;
|
||||
|
||||
- if (!tp)
|
||||
+ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags))
|
||||
return 0;
|
||||
|
||||
netdev = tp->netdev;
|
||||
@@ -8276,7 +8370,9 @@ static int rtl8152_pre_reset(struct usb_
|
||||
napi_disable(&tp->napi);
|
||||
if (netif_carrier_ok(netdev)) {
|
||||
mutex_lock(&tp->control);
|
||||
+ set_bit(IN_PRE_RESET, &tp->flags);
|
||||
tp->rtl_ops.disable(tp);
|
||||
+ clear_bit(IN_PRE_RESET, &tp->flags);
|
||||
mutex_unlock(&tp->control);
|
||||
}
|
||||
|
||||
@@ -8289,9 +8385,11 @@ static int rtl8152_post_reset(struct usb
|
||||
struct net_device *netdev;
|
||||
struct sockaddr sa;
|
||||
|
||||
- if (!tp)
|
||||
+ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags))
|
||||
return 0;
|
||||
|
||||
+ rtl_set_accessible(tp);
|
||||
+
|
||||
/* reset the MAC address in case of policy change */
|
||||
if (determine_ethernet_addr(tp, &sa) >= 0) {
|
||||
rtnl_lock();
|
||||
@@ -9493,17 +9591,29 @@ static u8 __rtl_get_hw_ver(struct usb_de
|
||||
__le32 *tmp;
|
||||
u8 version;
|
||||
int ret;
|
||||
+ int i;
|
||||
|
||||
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
||||
if (!tmp)
|
||||
return 0;
|
||||
|
||||
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
||||
- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
- PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp),
|
||||
- USB_CTRL_GET_TIMEOUT);
|
||||
- if (ret > 0)
|
||||
- ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK;
|
||||
+ /* Retry up to 3 times in case there is a transitory error. We do this
|
||||
+ * since retrying a read of the version is always safe and this
|
||||
+ * function doesn't take advantage of r8152_control_msg().
|
||||
+ */
|
||||
+ for (i = 0; i < 3; i++) {
|
||||
+ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
||||
+ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
|
||||
+ PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp),
|
||||
+ USB_CTRL_GET_TIMEOUT);
|
||||
+ if (ret > 0) {
|
||||
+ ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (i != 0 && ret > 0)
|
||||
+ dev_warn(&udev->dev, "Needed %d retries to read version\n", i);
|
||||
|
||||
kfree(tmp);
|
||||
|
||||
@@ -9602,25 +9712,14 @@ static bool rtl8152_supports_lenovo_macp
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int rtl8152_probe(struct usb_interface *intf,
|
||||
- const struct usb_device_id *id)
|
||||
+static int rtl8152_probe_once(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id, u8 version)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct r8152 *tp;
|
||||
struct net_device *netdev;
|
||||
- u8 version;
|
||||
int ret;
|
||||
|
||||
- if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- if (!rtl_check_vendor_ok(intf))
|
||||
- return -ENODEV;
|
||||
-
|
||||
- version = rtl8152_get_version(intf);
|
||||
- if (version == RTL_VER_UNKNOWN)
|
||||
- return -ENODEV;
|
||||
-
|
||||
usb_reset_device(udev);
|
||||
netdev = alloc_etherdev(sizeof(struct r8152));
|
||||
if (!netdev) {
|
||||
@@ -9783,10 +9882,20 @@ static int rtl8152_probe(struct usb_inte
|
||||
else
|
||||
device_set_wakeup_enable(&udev->dev, false);
|
||||
|
||||
+ /* If we saw a control transfer error while probing then we may
|
||||
+ * want to try probe() again. Consider this an error.
|
||||
+ */
|
||||
+ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags))
|
||||
+ goto out2;
|
||||
+
|
||||
+ set_bit(PROBED_WITH_NO_ERRORS, &tp->flags);
|
||||
netif_info(tp, probe, netdev, "%s\n", DRIVER_VERSION);
|
||||
|
||||
return 0;
|
||||
|
||||
+out2:
|
||||
+ unregister_netdev(netdev);
|
||||
+
|
||||
out1:
|
||||
tasklet_kill(&tp->tx_tl);
|
||||
cancel_delayed_work_sync(&tp->hw_phy_work);
|
||||
@@ -9795,10 +9904,46 @@ out1:
|
||||
rtl8152_release_firmware(tp);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
out:
|
||||
+ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags))
|
||||
+ ret = -EAGAIN;
|
||||
+
|
||||
free_netdev(netdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#define RTL8152_PROBE_TRIES 3
|
||||
+
|
||||
+static int rtl8152_probe(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ u8 version;
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+
|
||||
+ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (!rtl_check_vendor_ok(intf))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ version = rtl8152_get_version(intf);
|
||||
+ if (version == RTL_VER_UNKNOWN)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ for (i = 0; i < RTL8152_PROBE_TRIES; i++) {
|
||||
+ ret = rtl8152_probe_once(intf, id, version);
|
||||
+ if (ret != -EAGAIN)
|
||||
+ break;
|
||||
+ }
|
||||
+ if (ret == -EAGAIN) {
|
||||
+ dev_err(&intf->dev,
|
||||
+ "r8152 failed probe after %d tries; giving up\n", i);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static void rtl8152_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
|
@ -0,0 +1,83 @@
|
|||
From 66eee612a1ba39f9a76a9ace4a34d012044767fb Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 26 Sep 2023 19:17:13 +0800
|
||||
Subject: [PATCH] r8152: break the loop when the budget is exhausted
|
||||
|
||||
[ Upstream commit 2cf51f931797d9a47e75d999d0993a68cbd2a560 ]
|
||||
|
||||
A bulk transfer of the USB may contain many packets. And, the total
|
||||
number of the packets in the bulk transfer may be more than budget.
|
||||
|
||||
Originally, only budget packets would be handled by napi_gro_receive(),
|
||||
and the other packets would be queued in the driver for next schedule.
|
||||
|
||||
This patch would break the loop about getting next bulk transfer, when
|
||||
the budget is exhausted. That is, only the current bulk transfer would
|
||||
be handled, and the other bulk transfers would be queued for next
|
||||
schedule. Besides, the packets which are more than the budget in the
|
||||
current bulk trasnfer would be still queued in the driver, as the
|
||||
original method.
|
||||
|
||||
In addition, a bulk transfer wouldn't contain more than 400 packets, so
|
||||
the check of queue length is unnecessary. Therefore, I replace it with
|
||||
WARN_ON_ONCE().
|
||||
|
||||
Fixes: cf74eb5a5bc8 ("eth: r8152: try to use a normal budget")
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230926111714.9448-433-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 18 +++++++++++++-----
|
||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -2542,7 +2542,7 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
}
|
||||
}
|
||||
|
||||
- if (list_empty(&tp->rx_done))
|
||||
+ if (list_empty(&tp->rx_done) || work_done >= budget)
|
||||
goto out1;
|
||||
|
||||
clear_bit(RX_EPROTO, &tp->flags);
|
||||
@@ -2558,6 +2558,15 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
struct urb *urb;
|
||||
u8 *rx_data;
|
||||
|
||||
+ /* A bulk transfer of USB may contain may packets, so the
|
||||
+ * total packets may more than the budget. Deal with all
|
||||
+ * packets in current bulk transfer, and stop to handle the
|
||||
+ * next bulk transfer until next schedule, if budget is
|
||||
+ * exhausted.
|
||||
+ */
|
||||
+ if (work_done >= budget)
|
||||
+ break;
|
||||
+
|
||||
list_del_init(cursor);
|
||||
|
||||
agg = list_entry(cursor, struct rx_agg, list);
|
||||
@@ -2577,9 +2586,7 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
unsigned int pkt_len, rx_frag_head_sz;
|
||||
struct sk_buff *skb;
|
||||
|
||||
- /* limit the skb numbers for rx_queue */
|
||||
- if (unlikely(skb_queue_len(&tp->rx_queue) >= 1000))
|
||||
- break;
|
||||
+ WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >= 1000);
|
||||
|
||||
pkt_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK;
|
||||
if (pkt_len < ETH_ZLEN)
|
||||
@@ -2657,9 +2664,10 @@ submit:
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Splice the remained list back to rx_done for next schedule */
|
||||
if (!list_empty(&rx_queue)) {
|
||||
spin_lock_irqsave(&tp->rx_lock, flags);
|
||||
- list_splice_tail(&rx_queue, &tp->rx_done);
|
||||
+ list_splice(&rx_queue, &tp->rx_done);
|
||||
spin_unlock_irqrestore(&tp->rx_lock, flags);
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
From 1b0fce8c8e69485e49a7d34aac3d4c2a2aa15d62 Mon Sep 17 00:00:00 2001
|
||||
From: Davide Tronchin <davide.tronchin.94@gmail.com>
|
||||
Date: Thu, 29 Jun 2023 12:37:36 +0200
|
||||
Subject: [PATCH] net: usb: cdc_ether: add u-blox 0x1313 composition.
|
||||
|
||||
Add CDC-ECM support for LARA-R6 01B.
|
||||
|
||||
The new LARA-R6 product variant identified by the "01B" string can be
|
||||
configured (by AT interface) in three different USB modes:
|
||||
* Default mode (Vendor ID: 0x1546 Product ID: 0x1311) with 4 serial
|
||||
interfaces
|
||||
* RmNet mode (Vendor ID: 0x1546 Product ID: 0x1312) with 4 serial
|
||||
interfaces and 1 RmNet virtual network interface
|
||||
* CDC-ECM mode (Vendor ID: 0x1546 Product ID: 0x1313) with 4 serial
|
||||
interface and 1 CDC-ECM virtual network interface
|
||||
The first 4 interfaces of all the 3 configurations (default, RmNet, ECM)
|
||||
are the same.
|
||||
|
||||
In CDC-ECM mode LARA-R6 01B exposes the following interfaces:
|
||||
If 0: Diagnostic
|
||||
If 1: AT parser
|
||||
If 2: AT parser
|
||||
If 3: AT parset/alternative functions
|
||||
If 4: CDC-ECM interface
|
||||
|
||||
Signed-off-by: Davide Tronchin <davide.tronchin.94@gmail.com>
|
||||
Reviewed-by: Simon Horman <simon.horman@corigine.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/usb/cdc_ether.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/net/usb/cdc_ether.c
|
||||
+++ b/drivers/net/usb/cdc_ether.c
|
||||
@@ -879,6 +879,12 @@ static const struct usb_device_id produc
|
||||
USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
}, {
|
||||
+ /* U-blox LARA-R6 01B */
|
||||
+ USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1313, USB_CLASS_COMM,
|
||||
+ USB_CDC_SUBCLASS_ETHERNET,
|
||||
+ USB_CDC_PROTO_NONE),
|
||||
+ .driver_info = (unsigned long)&wwan_info,
|
||||
+}, {
|
||||
/* ZTE modules */
|
||||
USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_ETHERNET,
|
|
@ -0,0 +1,122 @@
|
|||
From 788d30daa8f97f06166b6a63f0e51f2a4c2f036a Mon Sep 17 00:00:00 2001
|
||||
From: Hayes Wang <hayeswang@realtek.com>
|
||||
Date: Tue, 26 Sep 2023 19:17:14 +0800
|
||||
Subject: [PATCH] r8152: use napi_gro_frags
|
||||
|
||||
Use napi_gro_frags() for the skb of fragments when the work_done is less
|
||||
than budget.
|
||||
|
||||
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
||||
Link: https://lore.kernel.org/r/20230926111714.9448-434-nic_swsd@realtek.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/usb/r8152.c | 67 ++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 50 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -2583,8 +2583,9 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
while (urb->actual_length > len_used) {
|
||||
struct net_device *netdev = tp->netdev;
|
||||
struct net_device_stats *stats = &netdev->stats;
|
||||
- unsigned int pkt_len, rx_frag_head_sz;
|
||||
+ unsigned int pkt_len, rx_frag_head_sz, len;
|
||||
struct sk_buff *skb;
|
||||
+ bool use_frags;
|
||||
|
||||
WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >= 1000);
|
||||
|
||||
@@ -2597,45 +2598,77 @@ static int rx_bottom(struct r8152 *tp, i
|
||||
break;
|
||||
|
||||
pkt_len -= ETH_FCS_LEN;
|
||||
+ len = pkt_len;
|
||||
rx_data += sizeof(struct rx_desc);
|
||||
|
||||
- if (!agg_free || tp->rx_copybreak > pkt_len)
|
||||
- rx_frag_head_sz = pkt_len;
|
||||
+ if (!agg_free || tp->rx_copybreak > len)
|
||||
+ use_frags = false;
|
||||
else
|
||||
- rx_frag_head_sz = tp->rx_copybreak;
|
||||
+ use_frags = true;
|
||||
+
|
||||
+ if (use_frags) {
|
||||
+ /* If the budget is exhausted, the packet
|
||||
+ * would be queued in the driver. That is,
|
||||
+ * napi_gro_frags() wouldn't be called, so
|
||||
+ * we couldn't use napi_get_frags().
|
||||
+ */
|
||||
+ if (work_done >= budget) {
|
||||
+ rx_frag_head_sz = tp->rx_copybreak;
|
||||
+ skb = napi_alloc_skb(napi,
|
||||
+ rx_frag_head_sz);
|
||||
+ } else {
|
||||
+ rx_frag_head_sz = 0;
|
||||
+ skb = napi_get_frags(napi);
|
||||
+ }
|
||||
+ } else {
|
||||
+ rx_frag_head_sz = 0;
|
||||
+ skb = napi_alloc_skb(napi, len);
|
||||
+ }
|
||||
|
||||
- skb = napi_alloc_skb(napi, rx_frag_head_sz);
|
||||
if (!skb) {
|
||||
stats->rx_dropped++;
|
||||
goto find_next_rx;
|
||||
}
|
||||
|
||||
skb->ip_summed = r8152_rx_csum(tp, rx_desc);
|
||||
- memcpy(skb->data, rx_data, rx_frag_head_sz);
|
||||
- skb_put(skb, rx_frag_head_sz);
|
||||
- pkt_len -= rx_frag_head_sz;
|
||||
- rx_data += rx_frag_head_sz;
|
||||
- if (pkt_len) {
|
||||
+ rtl_rx_vlan_tag(rx_desc, skb);
|
||||
+
|
||||
+ if (use_frags) {
|
||||
+ if (rx_frag_head_sz) {
|
||||
+ memcpy(skb->data, rx_data,
|
||||
+ rx_frag_head_sz);
|
||||
+ skb_put(skb, rx_frag_head_sz);
|
||||
+ len -= rx_frag_head_sz;
|
||||
+ rx_data += rx_frag_head_sz;
|
||||
+ skb->protocol = eth_type_trans(skb,
|
||||
+ netdev);
|
||||
+ }
|
||||
+
|
||||
skb_add_rx_frag(skb, 0, agg->page,
|
||||
agg_offset(agg, rx_data),
|
||||
- pkt_len,
|
||||
- SKB_DATA_ALIGN(pkt_len));
|
||||
+ len, SKB_DATA_ALIGN(len));
|
||||
get_page(agg->page);
|
||||
+ } else {
|
||||
+ memcpy(skb->data, rx_data, len);
|
||||
+ skb_put(skb, len);
|
||||
+ skb->protocol = eth_type_trans(skb, netdev);
|
||||
}
|
||||
|
||||
- skb->protocol = eth_type_trans(skb, netdev);
|
||||
- rtl_rx_vlan_tag(rx_desc, skb);
|
||||
if (work_done < budget) {
|
||||
+ if (use_frags)
|
||||
+ napi_gro_frags(napi);
|
||||
+ else
|
||||
+ napi_gro_receive(napi, skb);
|
||||
+
|
||||
work_done++;
|
||||
stats->rx_packets++;
|
||||
- stats->rx_bytes += skb->len;
|
||||
- napi_gro_receive(napi, skb);
|
||||
+ stats->rx_bytes += pkt_len;
|
||||
} else {
|
||||
__skb_queue_tail(&tp->rx_queue, skb);
|
||||
}
|
||||
|
||||
find_next_rx:
|
||||
- rx_data = rx_agg_align(rx_data + pkt_len + ETH_FCS_LEN);
|
||||
+ rx_data = rx_agg_align(rx_data + len + ETH_FCS_LEN);
|
||||
rx_desc = (struct rx_desc *)rx_data;
|
||||
len_used = agg_offset(agg, rx_data);
|
||||
len_used += sizeof(struct rx_desc);
|
|
@ -0,0 +1,29 @@
|
|||
From a067943129b4ec6b835e02cfd5fbef01093c1471 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megi@xff.cz>
|
||||
Date: Sun, 8 Oct 2023 16:40:13 +0200
|
||||
Subject: [PATCH] leds: core: Add more colors from DT bindings to led_colors
|
||||
|
||||
The colors are already part of DT bindings. Make sure the kernel is
|
||||
able to convert them to strings.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
Link: https://lore.kernel.org/r/20231008144014.1180334-1-megi@xff.cz
|
||||
Signed-off-by: Lee Jones <lee@kernel.org>
|
||||
---
|
||||
drivers/leds/led-core.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/leds/led-core.c
|
||||
+++ b/drivers/leds/led-core.c
|
||||
@@ -36,6 +36,11 @@ const char * const led_colors[LED_COLOR_
|
||||
[LED_COLOR_ID_IR] = "ir",
|
||||
[LED_COLOR_ID_MULTI] = "multicolor",
|
||||
[LED_COLOR_ID_RGB] = "rgb",
|
||||
+ [LED_COLOR_ID_PURPLE] = "purple",
|
||||
+ [LED_COLOR_ID_ORANGE] = "orange",
|
||||
+ [LED_COLOR_ID_PINK] = "pink",
|
||||
+ [LED_COLOR_ID_CYAN] = "cyan",
|
||||
+ [LED_COLOR_ID_LIME] = "lime",
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(led_colors);
|
||||
|
|
@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
#include <linux/crc32.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/uaccess.h>
|
||||
@@ -6896,6 +6897,22 @@ static void rtl_tally_reset(struct r8152
|
||||
@@ -6980,6 +6981,22 @@ static void rtl_tally_reset(struct r8152
|
||||
ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
static void r8152b_init(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
@@ -6937,6 +6954,8 @@ static void r8152b_init(struct r8152 *tp
|
||||
@@ -7021,6 +7038,8 @@ static void r8152b_init(struct r8152 *tp
|
||||
ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
|
||||
ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
|
||||
|
@ -54,7 +54,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
}
|
||||
|
||||
static void r8153_init(struct r8152 *tp)
|
||||
@@ -7077,6 +7096,8 @@ static void r8153_init(struct r8152 *tp)
|
||||
@@ -7161,6 +7180,8 @@ static void r8153_init(struct r8152 *tp)
|
||||
tp->coalesce = COALESCE_SLOW;
|
||||
break;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
}
|
||||
|
||||
static void r8153b_init(struct r8152 *tp)
|
||||
@@ -7159,6 +7180,8 @@ static void r8153b_init(struct r8152 *tp
|
||||
@@ -7243,6 +7264,8 @@ static void r8153b_init(struct r8152 *tp
|
||||
rtl_tally_reset(tp);
|
||||
|
||||
tp->coalesce = 15000; /* 15 us */
|
||||
|
|
|
@ -65,7 +65,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||
static void phylink_mac_pcs_get_state(struct phylink *pl,
|
||||
struct phylink_link_state *state)
|
||||
{
|
||||
@@ -3014,6 +3013,52 @@ void phylink_mii_c22_pcs_get_state(struc
|
||||
@@ -3015,6 +3014,52 @@ void phylink_mii_c22_pcs_get_state(struc
|
||||
EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_get_state);
|
||||
|
||||
/**
|
||||
|
@ -118,7 +118,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||
* phylink_mii_c22_pcs_set_advertisement() - configure the clause 37 PCS
|
||||
* advertisement
|
||||
* @pcs: a pointer to a &struct mdio_device.
|
||||
@@ -3085,6 +3130,46 @@ int phylink_mii_c22_pcs_set_advertisemen
|
||||
@@ -3086,6 +3131,46 @@ int phylink_mii_c22_pcs_set_advertisemen
|
||||
EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_set_advertisement);
|
||||
|
||||
/**
|
||||
|
|
|
@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
#include <linux/crc32.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/uaccess.h>
|
||||
@@ -6903,6 +6904,22 @@ static void rtl_tally_reset(struct r8152
|
||||
@@ -7020,6 +7021,22 @@ static void rtl_tally_reset(struct r8152
|
||||
ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
static void r8152b_init(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
@@ -6944,6 +6961,8 @@ static void r8152b_init(struct r8152 *tp
|
||||
@@ -7061,6 +7078,8 @@ static void r8152b_init(struct r8152 *tp
|
||||
ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
|
||||
ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
|
||||
|
@ -54,7 +54,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
}
|
||||
|
||||
static void r8153_init(struct r8152 *tp)
|
||||
@@ -7084,6 +7103,8 @@ static void r8153_init(struct r8152 *tp)
|
||||
@@ -7201,6 +7220,8 @@ static void r8153_init(struct r8152 *tp)
|
||||
tp->coalesce = COALESCE_SLOW;
|
||||
break;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
|||
}
|
||||
|
||||
static void r8153b_init(struct r8152 *tp)
|
||||
@@ -7166,6 +7187,8 @@ static void r8153b_init(struct r8152 *tp
|
||||
@@ -7283,6 +7304,8 @@ static void r8153b_init(struct r8152 *tp
|
||||
rtl_tally_reset(tp);
|
||||
|
||||
tp->coalesce = 15000; /* 15 us */
|
||||
|
|
|
@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||
|
||||
--- a/net/netfilter/nf_tables_api.c
|
||||
+++ b/net/netfilter/nf_tables_api.c
|
||||
@@ -7703,7 +7703,7 @@ static int nft_register_flowtable_net_ho
|
||||
@@ -7708,7 +7708,7 @@ static int nft_register_flowtable_net_ho
|
||||
err = flowtable->data.type->setup(&flowtable->data,
|
||||
hook->ops.dev,
|
||||
FLOW_BLOCK_BIND);
|
||||
|
|
|
@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||
|
||||
--- a/net/netfilter/nf_tables_api.c
|
||||
+++ b/net/netfilter/nf_tables_api.c
|
||||
@@ -7878,7 +7878,7 @@ static int nft_register_flowtable_net_ho
|
||||
@@ -7883,7 +7883,7 @@ static int nft_register_flowtable_net_ho
|
||||
err = flowtable->data.type->setup(&flowtable->data,
|
||||
hook->ops.dev,
|
||||
FLOW_BLOCK_BIND);
|
||||
|
|
|
@ -31,7 +31,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
|
|||
help
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -607,6 +607,29 @@ static inline void setup_nr_cpu_ids(void
|
||||
@@ -611,6 +611,29 @@ static inline void setup_nr_cpu_ids(void
|
||||
static inline void smp_prepare_cpus(unsigned int maxcpus) { }
|
||||
#endif
|
||||
|
||||
|
@ -61,7 +61,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
|
|||
/*
|
||||
* We need to store the untouched command line for future reference.
|
||||
* We also need to store the touched command line since the parameter
|
||||
@@ -954,6 +977,7 @@ asmlinkage __visible void __init __no_sa
|
||||
@@ -958,6 +981,7 @@ asmlinkage __visible void __init __no_sa
|
||||
pr_notice("%s", linux_banner);
|
||||
early_security_init();
|
||||
setup_arch(&command_line);
|
||||
|
|
|
@ -20,8 +20,8 @@ asus,rt-ac42u)
|
|||
ucidef_set_led_netdev "wan" "WAN" "blue:wan" "wan"
|
||||
;;
|
||||
asus,rt-ac58u)
|
||||
ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1"
|
||||
ucidef_set_led_switch "lan" "LAN" "blue:lan" "switch0" "0x1e"
|
||||
ucidef_set_led_netdev "wan" "WAN" "blue:wan" "wan"
|
||||
ucidef_set_led_netdev "lan" "LAN" "blue:lan" "br-lan"
|
||||
;;
|
||||
avm,fritzbox-4040)
|
||||
ucidef_set_led_wlan "wlan" "WLAN" "green:wlan" "phy0tpt" "phy1tpt"
|
||||
|
|
|
@ -6,6 +6,9 @@ case "$board" in
|
|||
asus,map-ac2200)
|
||||
migrate_leds ':chan=-'
|
||||
;;
|
||||
asus,rt-ac58u)
|
||||
migrate_leds ":status=:power" ":wlan2G=:wlan-2" ":wlan5G=:wlan-5"
|
||||
;;
|
||||
engenius,emr3500)
|
||||
migrate_leds "emr3500:="
|
||||
;;
|
||||
|
|
|
@ -240,6 +240,7 @@ CONFIG_KMAP_LOCAL=y
|
|||
CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y
|
||||
# CONFIG_KPSS_XCC is not set
|
||||
# CONFIG_KRAITCC is not set
|
||||
CONFIG_LED_TRIGGER_PHY=y
|
||||
CONFIG_LEDS_LP5523=y
|
||||
CONFIG_LEDS_LP5562=y
|
||||
CONFIG_LEDS_LP55XX_COMMON=y
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/soc/qcom,tcsr.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
/ {
|
||||
model = "ASUS RT-AC58U";
|
||||
|
@ -101,37 +102,50 @@
|
|||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led_power: status {
|
||||
label = "blue:status";
|
||||
led_power: led-0 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_POWER;
|
||||
gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>;
|
||||
panic-indicator;
|
||||
};
|
||||
|
||||
wan {
|
||||
label = "blue:wan";
|
||||
led-1 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_WAN;
|
||||
gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>;
|
||||
/*
|
||||
* linux,default-trigger = "90000.mdio-1:04:link";
|
||||
* sadly still lacks rx+tx
|
||||
*/
|
||||
};
|
||||
|
||||
wlan2G {
|
||||
label = "blue:wlan2G";
|
||||
led-2 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_WLAN;
|
||||
function-enumerator = <2>;
|
||||
gpios = <&tlmm 58 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "phy0tpt";
|
||||
};
|
||||
|
||||
wlan5G {
|
||||
label = "blue:wlan5G";
|
||||
led-3 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_WLAN;
|
||||
function-enumerator = <5>;
|
||||
gpios = <&tlmm 5 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "phy1tpt";
|
||||
};
|
||||
|
||||
usb {
|
||||
label = "blue:usb";
|
||||
led-4 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_USB;
|
||||
gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>;
|
||||
trigger-sources = <&usb3_port1>, <&usb3_port2>;
|
||||
linux,default-trigger = "usbport";
|
||||
};
|
||||
|
||||
lan {
|
||||
label = "blue:lan";
|
||||
led-5 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
gpios = <&tlmm 2 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -27,7 +27,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
|||
|
||||
--- a/drivers/firmware/qcom_scm.c
|
||||
+++ b/drivers/firmware/qcom_scm.c
|
||||
@@ -400,6 +400,29 @@ int qcom_scm_set_remote_state(u32 state,
|
||||
@@ -407,6 +407,29 @@ int qcom_scm_set_remote_state(u32 state,
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_scm_set_remote_state);
|
||||
|
||||
|
@ -57,7 +57,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
|||
static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
|
||||
{
|
||||
struct qcom_scm_desc desc = {
|
||||
@@ -1404,6 +1427,13 @@ static int qcom_scm_probe(struct platfor
|
||||
@@ -1411,6 +1434,13 @@ static int qcom_scm_probe(struct platfor
|
||||
|
||||
__get_convention();
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
|||
}
|
||||
--- a/drivers/firmware/qcom_scm.c
|
||||
+++ b/drivers/firmware/qcom_scm.c
|
||||
@@ -305,6 +305,17 @@ static int qcom_scm_set_boot_addr(void *
|
||||
@@ -312,6 +312,17 @@ static int qcom_scm_set_boot_addr(void *
|
||||
desc.args[0] = flags;
|
||||
desc.args[1] = virt_to_phys(entry);
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
|||
|
||||
--- a/drivers/firmware/qcom_scm.c
|
||||
+++ b/drivers/firmware/qcom_scm.c
|
||||
@@ -1459,7 +1459,8 @@ static int qcom_scm_probe(struct platfor
|
||||
@@ -1466,7 +1466,8 @@ static int qcom_scm_probe(struct platfor
|
||||
static void qcom_scm_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
/* Clean shutdown, disable download mode to allow normal restart */
|
||||
|
|
|
@ -259,7 +259,7 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com>
|
|||
static int kernel_init(void *);
|
||||
|
||||
extern void init_IRQ(void);
|
||||
@@ -991,6 +995,18 @@ asmlinkage __visible void __init __no_sa
|
||||
@@ -995,6 +999,18 @@ asmlinkage __visible void __init __no_sa
|
||||
pr_notice("Kernel command line: %s\n", saved_command_line);
|
||||
/* parameters may set static keys */
|
||||
jump_label_init();
|
||||
|
|
|
@ -36,7 +36,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||
|
||||
__netif_tx_unlock_bh(netdev_get_tx_queue(priv->dev, queue));
|
||||
|
||||
@@ -5474,12 +5475,13 @@ static int stmmac_napi_poll_tx(struct na
|
||||
@@ -5475,12 +5476,13 @@ static int stmmac_napi_poll_tx(struct na
|
||||
struct stmmac_channel *ch =
|
||||
container_of(napi, struct stmmac_channel, tx_napi);
|
||||
struct stmmac_priv *priv = ch->priv_data;
|
||||
|
@ -51,7 +51,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||
work_done = min(work_done, budget);
|
||||
|
||||
if (work_done < budget && napi_complete_done(napi, work_done)) {
|
||||
@@ -5490,6 +5492,10 @@ static int stmmac_napi_poll_tx(struct na
|
||||
@@ -5491,6 +5493,10 @@ static int stmmac_napi_poll_tx(struct na
|
||||
spin_unlock_irqrestore(&ch->lock, flags);
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||
return work_done;
|
||||
}
|
||||
|
||||
@@ -5499,11 +5505,12 @@ static int stmmac_napi_poll_rxtx(struct
|
||||
@@ -5500,11 +5506,12 @@ static int stmmac_napi_poll_rxtx(struct
|
||||
container_of(napi, struct stmmac_channel, rxtx_napi);
|
||||
struct stmmac_priv *priv = ch->priv_data;
|
||||
int rx_done, tx_done, rxtx_done;
|
||||
|
@ -76,7 +76,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||
tx_done = min(tx_done, budget);
|
||||
|
||||
rx_done = stmmac_rx_zc(priv, budget, chan);
|
||||
@@ -5528,6 +5535,10 @@ static int stmmac_napi_poll_rxtx(struct
|
||||
@@ -5529,6 +5536,10 @@ static int stmmac_napi_poll_rxtx(struct
|
||||
spin_unlock_irqrestore(&ch->lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
From 4e242d6e08ad1d85b832e158cd0eafcb8f3f76a1 Mon Sep 17 00:00:00 2001
|
||||
From: Linus Walleij <linus.walleij@linaro.org>
|
||||
Date: Tue, 30 May 2023 22:40:31 +0200
|
||||
Subject: [PATCH v3] mtd: cfi_cmdset_0001: Byte swap OTP info
|
||||
|
||||
Currently the offset into the device when looking for OTP
|
||||
bits can go outside of the address of the MTD NOR devices,
|
||||
and if that memory isn't readable, bad things happen
|
||||
on the IXP4xx (added prints that illustrate the problem before
|
||||
the crash):
|
||||
|
||||
cfi_intelext_otp_walk walk OTP on chip 0 start at reg_prot_offset 0x00000100
|
||||
ixp4xx_copy_from copy from 0x00000100 to 0xc880dd78
|
||||
cfi_intelext_otp_walk walk OTP on chip 0 start at reg_prot_offset 0x12000000
|
||||
ixp4xx_copy_from copy from 0x12000000 to 0xc880dd78
|
||||
8<--- cut here ---
|
||||
Unable to handle kernel paging request at virtual address db000000
|
||||
[db000000] *pgd=00000000
|
||||
(...)
|
||||
|
||||
This happens in this case because the IXP4xx is big endian and
|
||||
the 32- and 16-bit fields in the struct cfi_intelext_otpinfo are not
|
||||
properly byteswapped. Compare to how the code in read_pri_intelext()
|
||||
byteswaps the fields in struct cfi_pri_intelext.
|
||||
|
||||
Adding a small byte swapping loop for the OTP in read_pri_intelext()
|
||||
and the crash goes away.
|
||||
|
||||
The problem went unnoticed for many years until I enabled
|
||||
CONFIG_MTD_OTP on the IXP4xx as well, triggering the bug.
|
||||
|
||||
Cc: Nicolas Pitre <npitre@baylibre.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
---
|
||||
ChangeLog v2->v3:
|
||||
- Move the byte swapping to a small loop in read_pri_intelext()
|
||||
so all bytes are swapped as we reach cfi_intelext_otp_walk().
|
||||
ChangeLog v1->v2:
|
||||
- Drill deeper and discover a big endian compatibility issue.
|
||||
---
|
||||
drivers/mtd/chips/cfi_cmdset_0001.c | 20 ++++++++++++++++++--
|
||||
1 file changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/chips/cfi_cmdset_0001.c
|
||||
+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
|
||||
@@ -421,9 +421,25 @@ read_pri_intelext(struct map_info *map,
|
||||
extra_size = 0;
|
||||
|
||||
/* Protection Register info */
|
||||
- if (extp->NumProtectionFields)
|
||||
+ if (extp->NumProtectionFields) {
|
||||
+ struct cfi_intelext_otpinfo *otp =
|
||||
+ (struct cfi_intelext_otpinfo *)&extp->extra[0];
|
||||
+
|
||||
extra_size += (extp->NumProtectionFields - 1) *
|
||||
- sizeof(struct cfi_intelext_otpinfo);
|
||||
+ sizeof(struct cfi_intelext_otpinfo);
|
||||
+
|
||||
+ if (extp_size >= sizeof(*extp) + extra_size) {
|
||||
+ int i;
|
||||
+
|
||||
+ /* Do some byteswapping if necessary */
|
||||
+ for (i = 0; i < extp->NumProtectionFields - 1; i++) {
|
||||
+ otp->ProtRegAddr = le32_to_cpu(otp->ProtRegAddr);
|
||||
+ otp->FactGroups = le16_to_cpu(otp->FactGroups);
|
||||
+ otp->UserGroups = le16_to_cpu(otp->UserGroups);
|
||||
+ otp++;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
if (extp->MinorVersion >= '1') {
|
|
@ -44,7 +44,7 @@ Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
|
|||
|
||||
/*
|
||||
* Some chips power-up with all sectors locked by default.
|
||||
@@ -1703,6 +1707,7 @@ static int cfi_intelext_write_words (str
|
||||
@@ -1719,6 +1723,7 @@ static int cfi_intelext_write_words (str
|
||||
}
|
||||
|
||||
|
||||
|
@ -52,7 +52,7 @@ Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
|
|||
static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
|
||||
unsigned long adr, const struct kvec **pvec,
|
||||
unsigned long *pvec_seek, int len)
|
||||
@@ -1931,6 +1936,7 @@ static int cfi_intelext_write_buffers (s
|
||||
@@ -1947,6 +1952,7 @@ static int cfi_intelext_write_buffers (s
|
||||
|
||||
return cfi_intelext_writev(mtd, &vec, 1, to, retlen);
|
||||
}
|
||||
|
|
296
target/linux/mediatek/dts/mt7981b-confiabits-mt7981.dts
Normal file
296
target/linux/mediatek/dts/mt7981b-confiabits-mt7981.dts
Normal file
|
@ -0,0 +1,296 @@
|
|||
/dts-v1/;
|
||||
|
||||
#include "mt7981.dtsi"
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
/ {
|
||||
model = "Confiabits MT7981";
|
||||
compatible = "confiabits,mt7981", "mediatek,mt7981";
|
||||
|
||||
aliases {
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
button-mesh {
|
||||
label = "mesh";
|
||||
linux,input-type = <EV_SW>;
|
||||
linux,code = <BTN_0>;
|
||||
gpios = <&pio 0 GPIO_ACTIVE_HIGH>;
|
||||
debounce-interval = <60>;
|
||||
};
|
||||
|
||||
button-reset {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&pio 1 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led-wlan5g {
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
function = LED_FUNCTION_WLAN;
|
||||
function-enumerator = <5>;
|
||||
gpios = <&pio 5 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "phy1tpt";
|
||||
};
|
||||
|
||||
led-wan-red {
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
function = LED_FUNCTION_WAN;
|
||||
gpios = <&pio 6 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led_power: led-power {
|
||||
label = "blue:power"; // can be removed once #13837 is merged
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_POWER;
|
||||
gpios = <&pio 7 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-lan1 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <1>;
|
||||
gpios = <&pio 9 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-lan2 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <2>;
|
||||
gpios = <&pio 10 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-lan3 {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_LAN;
|
||||
function-enumerator = <3>;
|
||||
gpios = <&pio 11 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-wan-blue {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_WAN;
|
||||
gpios = <&pio 12 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-wlan2g {
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
function = LED_FUNCTION_WLAN;
|
||||
function-enumerator = <2>;
|
||||
gpios = <&pio 34 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "phy0tpt";
|
||||
};
|
||||
|
||||
led-mesh {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = "mesh"; // no LED_FUNCTION_MESH yet
|
||||
gpios = <&pio 35 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&watchdog {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ð {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mdio_pins>;
|
||||
|
||||
status = "okay";
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
reg = <0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
nvmem-cell-names = "mac-address";
|
||||
nvmem-cells = <&macaddr_factory_4 0>;
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
&mdio_bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
switch: switch@1f {
|
||||
compatible = "mediatek,mt7531";
|
||||
reg = <31>;
|
||||
reset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
&switch {
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <4>;
|
||||
label = "wan";
|
||||
|
||||
nvmem-cell-names = "mac-address";
|
||||
nvmem-cells = <&macaddr_factory_4 1>;
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "2500base-x";
|
||||
|
||||
fixed-link {
|
||||
speed = <2500>;
|
||||
full-duplex;
|
||||
pause;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi0_flash_pins>;
|
||||
status = "okay";
|
||||
|
||||
spi_nand: flash@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <52000000>;
|
||||
|
||||
spi-cal-enable;
|
||||
spi-cal-mode = "read-data";
|
||||
spi-cal-datalen = <7>;
|
||||
spi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>;
|
||||
spi-cal-addrlen = <5>;
|
||||
spi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;
|
||||
|
||||
spi-tx-buswidth = <4>;
|
||||
spi-rx-buswidth = <4>;
|
||||
mediatek,nmbm;
|
||||
mediatek,bmt-max-ratio = <1>;
|
||||
mediatek,bmt-max-reserved-blocks = <64>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "BL2";
|
||||
reg = <0x00000 0x0100000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@100000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x0100000 0x0080000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
factory: partition@180000 {
|
||||
label = "Factory";
|
||||
reg = <0x180000 0x0200000>;
|
||||
read-only;
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
eeprom_factory_0: eeprom@0 {
|
||||
reg = <0x0 0x1000>;
|
||||
};
|
||||
|
||||
macaddr_factory_4: macaddr@4 {
|
||||
compatible = "mac-base";
|
||||
reg = <0x4 0x6>;
|
||||
#nvmem-cell-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
partition@380000 {
|
||||
label = "FIP";
|
||||
reg = <0x380000 0x0200000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@580000 {
|
||||
label = "ubi";
|
||||
reg = <0x580000 0x4000000>;
|
||||
compatible = "linux,ubi";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pio {
|
||||
spi0_flash_pins: spi0-pins {
|
||||
mux {
|
||||
function = "spi";
|
||||
groups = "spi0", "spi0_wp_hold";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&usb_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&xhci {
|
||||
status = "okay";
|
||||
mediatek,u3p-dis-msk = <0x1>;
|
||||
};
|
||||
|
||||
&wifi {
|
||||
status = "okay";
|
||||
nvmem-cells = <&eeprom_factory_0>;
|
||||
nvmem-cell-names = "eeprom";
|
||||
};
|
|
@ -6,6 +6,12 @@ board=$(board_name)
|
|||
board_config_update
|
||||
|
||||
case $board in
|
||||
confiabits,mt7981)
|
||||
ucidef_set_led_netdev "lan1" "lan1" "blue:lan-1" "lan1" "link tx rx"
|
||||
ucidef_set_led_netdev "lan2" "lan2" "blue:lan-2" "lan2" "link tx rx"
|
||||
ucidef_set_led_netdev "lan3" "lan3" "blue:lan-3" "lan3" "link tx rx"
|
||||
ucidef_set_led_netdev "wan" "wan" "blue:wan" "wan" "link tx rx"
|
||||
;;
|
||||
cudy,wr3000-v1)
|
||||
ucidef_set_led_netdev "wan" "wan" "blue:wan" "wan"
|
||||
;;
|
||||
|
|
|
@ -23,6 +23,7 @@ mediatek_setup_interfaces()
|
|||
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 sfp2" "eth1 wan"
|
||||
;;
|
||||
cetron,ct3003|\
|
||||
confiabits,mt7981|\
|
||||
cudy,wr3000-v1|\
|
||||
jcg,q30-pro|\
|
||||
qihoo,360t7)
|
||||
|
|
0
target/linux/mediatek/filogic/base-files/etc/init.d/bootcount
Normal file → Executable file
0
target/linux/mediatek/filogic/base-files/etc/init.d/bootcount
Normal file → Executable file
|
@ -255,6 +255,22 @@ define Device/cmcc_rax3000m
|
|||
endef
|
||||
TARGET_DEVICES += cmcc_rax3000m
|
||||
|
||||
define Device/confiabits_mt7981
|
||||
DEVICE_VENDOR := Confiabits
|
||||
DEVICE_MODEL := MT7981
|
||||
DEVICE_DTS := mt7981b-confiabits-mt7981
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
SUPPORTED_DEVICES += mediatek,mt7981-spim-snand-2500wan-gmac2-rfb
|
||||
UBINIZE_OPTS := -E 5
|
||||
BLOCKSIZE := 128k
|
||||
PAGESIZE := 2048
|
||||
IMAGE_SIZE := 65536k
|
||||
KERNEL_IN_UBI := 1
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
DEVICE_PACKAGES := kmod-usb3 kmod-mt7981-firmware
|
||||
endef
|
||||
TARGET_DEVICES += confiabits_mt7981
|
||||
|
||||
define Device/cudy_wr3000-v1
|
||||
DEVICE_VENDOR := Cudy
|
||||
DEVICE_MODEL := WR3000
|
||||
|
@ -750,7 +766,7 @@ define Device/zbtlink_zbt-z8102ax
|
|||
DEVICE_MODEL := ZBT-Z8102AX
|
||||
DEVICE_DTS := mt7981b-zbtlink-zbt-z8102ax
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
DEVICE_PACKAGES := kmod-mt7981-firmware mt7981-wo-firmware kmod-usb-net-qmi-wwan kmod-usb-serial-option
|
||||
DEVICE_PACKAGES := kmod-mt7981-firmware mt7981-wo-firmware kmod-usb3 kmod-usb-net-qmi-wwan kmod-usb-serial-option
|
||||
KERNEL_IN_UBI := 1
|
||||
UBINIZE_OPTS := -E 5
|
||||
BLOCKSIZE := 128k
|
||||
|
|
|
@ -237,7 +237,7 @@ Signed-off-by: Wolfram Sang <wsa@kernel.org>
|
|||
priv->adap.algo = &hix5hd2_i2c_algorithm;
|
||||
--- a/drivers/i2c/busses/i2c-i801.c
|
||||
+++ b/drivers/i2c/busses/i2c-i801.c
|
||||
@@ -1111,7 +1111,7 @@ static void dmi_check_onboard_device(u8
|
||||
@@ -1110,7 +1110,7 @@ static void dmi_check_onboard_device(u8
|
||||
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
info.addr = dmi_devices[i].i2c_addr;
|
||||
|
@ -246,7 +246,7 @@ Signed-off-by: Wolfram Sang <wsa@kernel.org>
|
|||
i2c_new_client_device(adap, &info);
|
||||
break;
|
||||
}
|
||||
@@ -1267,7 +1267,7 @@ static void register_dell_lis3lv02d_i2c_
|
||||
@@ -1266,7 +1266,7 @@ static void register_dell_lis3lv02d_i2c_
|
||||
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
info.addr = dell_lis3lv02d_devices[i].i2c_addr;
|
||||
|
@ -403,7 +403,7 @@ Signed-off-by: Wolfram Sang <wsa@kernel.org>
|
|||
/* Slow down if we can't sense SCL */
|
||||
--- a/drivers/i2c/busses/i2c-pxa.c
|
||||
+++ b/drivers/i2c/busses/i2c-pxa.c
|
||||
@@ -1403,7 +1403,7 @@ static int i2c_pxa_probe(struct platform
|
||||
@@ -1463,7 +1463,7 @@ static int i2c_pxa_probe(struct platform
|
||||
spin_lock_init(&i2c->lock);
|
||||
init_waitqueue_head(&i2c->wait);
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
* managed to set the command line, unless CONFIG_CMDLINE_FORCE
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -2057,6 +2057,14 @@ config CMDLINE_FORCE
|
||||
@@ -2059,6 +2059,14 @@ config CMDLINE_FORCE
|
||||
|
||||
endchoice
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/phy/Kconfig
|
||||
+++ b/drivers/net/phy/Kconfig
|
||||
@@ -389,6 +389,12 @@ config ROCKCHIP_PHY
|
||||
@@ -386,6 +386,12 @@ config ROCKCHIP_PHY
|
||||
help
|
||||
Currently supports the integrated Ethernet PHY.
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
|||
help
|
||||
--- a/drivers/net/phy/Makefile
|
||||
+++ b/drivers/net/phy/Makefile
|
||||
@@ -98,6 +98,7 @@ obj-$(CONFIG_QSEMI_PHY) += qsemi.o
|
||||
@@ -94,6 +94,7 @@ obj-$(CONFIG_QSEMI_PHY) += qsemi.o
|
||||
obj-$(CONFIG_REALTEK_PHY) += realtek.o
|
||||
obj-$(CONFIG_RENESAS_PHY) += uPD60620.o
|
||||
obj-$(CONFIG_ROCKCHIP_PHY) += rockchip.o
|
||||
|
|
|
@ -42,7 +42,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
L: linux-i2c@vger.kernel.org
|
||||
--- a/drivers/net/phy/Kconfig
|
||||
+++ b/drivers/net/phy/Kconfig
|
||||
@@ -314,6 +314,18 @@ config MEDIATEK_GE_PHY
|
||||
@@ -311,6 +311,18 @@ config MEDIATEK_GE_PHY
|
||||
help
|
||||
Supports the MediaTek Gigabit Ethernet PHYs.
|
||||
|
||||
|
@ -63,7 +63,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||
depends on PTP_1588_CLOCK_OPTIONAL
|
||||
--- a/drivers/net/phy/Makefile
|
||||
+++ b/drivers/net/phy/Makefile
|
||||
@@ -84,6 +84,7 @@ obj-$(CONFIG_MARVELL_PHY) += marvell.o
|
||||
@@ -80,6 +80,7 @@ obj-$(CONFIG_MARVELL_PHY) += marvell.o
|
||||
obj-$(CONFIG_MARVELL_88X2222_PHY) += marvell-88x2222.o
|
||||
obj-$(CONFIG_MAXLINEAR_GPHY) += mxl-gpy.o
|
||||
obj-$(CONFIG_MEDIATEK_GE_PHY) += mediatek-ge.o
|
||||
|
|
|
@ -13,7 +13,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||
|
||||
--- a/drivers/net/phy/Kconfig
|
||||
+++ b/drivers/net/phy/Kconfig
|
||||
@@ -326,6 +326,13 @@ config MEDIATEK_GE_SOC_PHY
|
||||
@@ -323,6 +323,13 @@ config MEDIATEK_GE_SOC_PHY
|
||||
present in the SoCs efuse and will dynamically calibrate VCM
|
||||
(common-mode voltage) during startup.
|
||||
|
||||
|
@ -29,7 +29,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||
depends on PTP_1588_CLOCK_OPTIONAL
|
||||
--- a/drivers/net/phy/Makefile
|
||||
+++ b/drivers/net/phy/Makefile
|
||||
@@ -83,6 +83,7 @@ obj-$(CONFIG_MARVELL_10G_PHY) += marvell
|
||||
@@ -79,6 +79,7 @@ obj-$(CONFIG_MARVELL_10G_PHY) += marvell
|
||||
obj-$(CONFIG_MARVELL_PHY) += marvell.o
|
||||
obj-$(CONFIG_MARVELL_88X2222_PHY) += marvell-88x2222.o
|
||||
obj-$(CONFIG_MAXLINEAR_GPHY) += mxl-gpy.o
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue