Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
f9fab7c662
@ -1,2 +1,2 @@
|
|||||||
LINUX_VERSION-5.15 = .143
|
LINUX_VERSION-5.15 = .145
|
||||||
LINUX_KERNEL_HASH-5.15.143 = 096bb16ec07232f27f6a07998c41b655883a8d0a6bb613d39bf524a9ffd99e02
|
LINUX_KERNEL_HASH-5.15.145 = b2a49d87605f3a9491581150315e22337c1afb599efc1e2737481be3a2d6d620
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
LINUX_VERSION-6.1 = .68
|
LINUX_VERSION-6.1 = .69
|
||||||
LINUX_KERNEL_HASH-6.1.68 = 365ff26a30e206de9b18489f45d38582a0a61b7c5919f8ab89295a47316784e1
|
LINUX_KERNEL_HASH-6.1.69 = 7e3d2694d18ce502068cc88a430da809abbd17d0773268524ebece442612b541
|
||||||
|
@ -0,0 +1,64 @@
|
|||||||
|
From ee0db868ee4d88493dfdc82f59e3b4e449ddddd5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Oldřich Jedlička <oldium.pro@gmail.com>
|
||||||
|
Date: Sat, 4 Nov 2023 15:13:33 +0100
|
||||||
|
Subject: wifi: mac80211: do not pass AP_VLAN vif pointer to drivers during
|
||||||
|
flush
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
[ Upstream commit 3e3a2b645c043f7e3e488d5011478cefb69bbe8b ]
|
||||||
|
|
||||||
|
This fixes WARN_ONs when using AP_VLANs after station removal. The flush
|
||||||
|
call passed AP_VLAN vif to driver, but because these vifs are virtual and
|
||||||
|
not registered with drivers, we need to translate to the correct AP vif
|
||||||
|
first.
|
||||||
|
|
||||||
|
Closes: https://github.com/openwrt/openwrt/issues/12420
|
||||||
|
Fixes: 0b75a1b1e42e ("wifi: mac80211: flush queues on STA removal")
|
||||||
|
Fixes: d00800a289c9 ("wifi: mac80211: add flush_sta method")
|
||||||
|
Tested-by: Konstantin Demin <rockdrilla@gmail.com>
|
||||||
|
Tested-by: Koen Vandeputte <koen.vandeputte@citymesh.com>
|
||||||
|
Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20231104141333.3710-1-oldium.pro@gmail.com
|
||||||
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||||
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||||
|
---
|
||||||
|
net/mac80211/driver-ops.h | 9 +++++++--
|
||||||
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/net/mac80211/driver-ops.h
|
||||||
|
+++ b/net/mac80211/driver-ops.h
|
||||||
|
@@ -23,7 +23,7 @@
|
||||||
|
static inline struct ieee80211_sub_if_data *
|
||||||
|
get_bss_sdata(struct ieee80211_sub_if_data *sdata)
|
||||||
|
{
|
||||||
|
- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||||
|
+ if (sdata && sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||||
|
sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
|
||||||
|
u.ap);
|
||||||
|
|
||||||
|
@@ -638,10 +638,13 @@ static inline void drv_flush(struct ieee
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
u32 queues, bool drop)
|
||||||
|
{
|
||||||
|
- struct ieee80211_vif *vif = sdata ? &sdata->vif : NULL;
|
||||||
|
+ struct ieee80211_vif *vif;
|
||||||
|
|
||||||
|
might_sleep();
|
||||||
|
|
||||||
|
+ sdata = get_bss_sdata(sdata);
|
||||||
|
+ vif = sdata ? &sdata->vif : NULL;
|
||||||
|
+
|
||||||
|
if (sdata && !check_sdata_in_driver(sdata))
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -657,6 +660,8 @@ static inline void drv_flush_sta(struct
|
||||||
|
{
|
||||||
|
might_sleep();
|
||||||
|
|
||||||
|
+ sdata = get_bss_sdata(sdata);
|
||||||
|
+
|
||||||
|
if (sdata && !check_sdata_in_driver(sdata))
|
||||||
|
return;
|
||||||
|
|
@ -181,7 +181,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|||||||
dpaa2_switch_port_disconnect_mac(port_priv);
|
dpaa2_switch_port_disconnect_mac(port_priv);
|
||||||
else
|
else
|
||||||
dpaa2_switch_port_connect_mac(port_priv);
|
dpaa2_switch_port_connect_mac(port_priv);
|
||||||
@@ -3256,6 +3279,8 @@ static int dpaa2_switch_probe_port(struc
|
@@ -3249,6 +3272,8 @@ static int dpaa2_switch_probe_port(struc
|
||||||
port_priv->netdev = port_netdev;
|
port_priv->netdev = port_netdev;
|
||||||
port_priv->ethsw_data = ethsw;
|
port_priv->ethsw_data = ethsw;
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@@ -2958,9 +2956,7 @@ static void dpaa2_switch_remove_port(str
|
@@ -2951,9 +2949,7 @@ static void dpaa2_switch_remove_port(str
|
||||||
{
|
{
|
||||||
struct ethsw_port_priv *port_priv = ethsw->ports[port_idx];
|
struct ethsw_port_priv *port_priv = ethsw->ports[port_idx];
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@ CONFIG_LEDS_RESET=y
|
|||||||
CONFIG_MARVELL_PHY=y
|
CONFIG_MARVELL_PHY=y
|
||||||
CONFIG_MICREL_PHY=y
|
CONFIG_MICREL_PHY=y
|
||||||
CONFIG_MTD_REDBOOT_PARTS=y
|
CONFIG_MTD_REDBOOT_PARTS=y
|
||||||
|
CONFIG_MTD_SPI_NOR_SWP_DISABLE=y
|
||||||
|
# CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE is not set
|
||||||
CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
|
CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
|
||||||
CONFIG_MTD_SPLIT_EVA_FW=y
|
CONFIG_MTD_SPLIT_EVA_FW=y
|
||||||
CONFIG_NVMEM_SYSFS=y
|
CONFIG_NVMEM_SYSFS=y
|
||||||
|
@ -589,15 +589,15 @@ SVN-Revision: 35130
|
|||||||
* XXX skbs on the gro_list have all been parsed and pulled
|
* XXX skbs on the gro_list have all been parsed and pulled
|
||||||
--- a/include/net/addrconf.h
|
--- a/include/net/addrconf.h
|
||||||
+++ b/include/net/addrconf.h
|
+++ b/include/net/addrconf.h
|
||||||
@@ -47,7 +47,7 @@ struct prefix_info {
|
@@ -52,7 +52,7 @@ struct prefix_info {
|
||||||
__be32 reserved2;
|
__be32 reserved2;
|
||||||
|
|
||||||
struct in6_addr prefix;
|
struct in6_addr prefix;
|
||||||
-};
|
-};
|
||||||
+} __attribute__((packed, aligned(2)));
|
+} __attribute__((packed, aligned(2)));
|
||||||
|
|
||||||
#include <linux/ipv6.h>
|
/* rfc4861 4.6.2: IPv6 PIO is 32 bytes in size */
|
||||||
#include <linux/netdevice.h>
|
static_assert(sizeof(struct prefix_info) == 32);
|
||||||
--- a/include/net/inet_ecn.h
|
--- a/include/net/inet_ecn.h
|
||||||
+++ b/include/net/inet_ecn.h
|
+++ b/include/net/inet_ecn.h
|
||||||
@@ -138,9 +138,9 @@ static inline int IP6_ECN_set_ce(struct
|
@@ -138,9 +138,9 @@ static inline int IP6_ECN_set_ce(struct
|
||||||
|
@ -589,15 +589,15 @@ SVN-Revision: 35130
|
|||||||
* XXX skbs on the gro_list have all been parsed and pulled
|
* XXX skbs on the gro_list have all been parsed and pulled
|
||||||
--- a/include/net/addrconf.h
|
--- a/include/net/addrconf.h
|
||||||
+++ b/include/net/addrconf.h
|
+++ b/include/net/addrconf.h
|
||||||
@@ -47,7 +47,7 @@ struct prefix_info {
|
@@ -52,7 +52,7 @@ struct prefix_info {
|
||||||
__be32 reserved2;
|
__be32 reserved2;
|
||||||
|
|
||||||
struct in6_addr prefix;
|
struct in6_addr prefix;
|
||||||
-};
|
-};
|
||||||
+} __attribute__((packed, aligned(2)));
|
+} __attribute__((packed, aligned(2)));
|
||||||
|
|
||||||
#include <linux/ipv6.h>
|
/* rfc4861 4.6.2: IPv6 PIO is 32 bytes in size */
|
||||||
#include <linux/netdevice.h>
|
static_assert(sizeof(struct prefix_info) == 32);
|
||||||
--- a/include/net/inet_ecn.h
|
--- a/include/net/inet_ecn.h
|
||||||
+++ b/include/net/inet_ecn.h
|
+++ b/include/net/inet_ecn.h
|
||||||
@@ -138,9 +138,9 @@ static inline int IP6_ECN_set_ce(struct
|
@@ -138,9 +138,9 @@ static inline int IP6_ECN_set_ce(struct
|
||||||
|
@ -33,7 +33,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
|||||||
#define USB_VENDOR_ID_BELKIN 0x050d
|
#define USB_VENDOR_ID_BELKIN 0x050d
|
||||||
#define USB_DEVICE_ID_FLIP_KVM 0x3201
|
#define USB_DEVICE_ID_FLIP_KVM 0x3201
|
||||||
|
|
||||||
@@ -1369,6 +1372,9 @@
|
@@ -1372,6 +1375,9 @@
|
||||||
#define USB_VENDOR_ID_XIAOMI 0x2717
|
#define USB_VENDOR_ID_XIAOMI 0x2717
|
||||||
#define USB_DEVICE_ID_MI_SILENT_MOUSE 0x5014
|
#define USB_DEVICE_ID_MI_SILENT_MOUSE 0x5014
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
|||||||
#define USB_DEVICE_ID_THT_2P_ARCADE 0x75e1
|
#define USB_DEVICE_ID_THT_2P_ARCADE 0x75e1
|
||||||
--- a/drivers/hid/hid-quirks.c
|
--- a/drivers/hid/hid-quirks.c
|
||||||
+++ b/drivers/hid/hid-quirks.c
|
+++ b/drivers/hid/hid-quirks.c
|
||||||
@@ -41,6 +41,7 @@ static const struct hid_device_id hid_qu
|
@@ -42,6 +42,7 @@ static const struct hid_device_id hid_qu
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682), HID_QUIRK_NOGET },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS692), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS692), HID_QUIRK_NOGET },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM), HID_QUIRK_NOGET },
|
||||||
@ -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_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_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2), HID_QUIRK_ALWAYS_POLL },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2), HID_QUIRK_ALWAYS_POLL },
|
||||||
@@ -199,6 +200,7 @@ static const struct hid_device_id hid_qu
|
@@ -200,6 +201,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_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_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 },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_GROUP_AUDIO), HID_QUIRK_NOGET },
|
||||||
|
@ -329,7 +329,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||||||
|
|
||||||
--- a/arch/arm64/include/asm/pgtable.h
|
--- a/arch/arm64/include/asm/pgtable.h
|
||||||
+++ b/arch/arm64/include/asm/pgtable.h
|
+++ b/arch/arm64/include/asm/pgtable.h
|
||||||
@@ -999,23 +999,13 @@ static inline void update_mmu_cache(stru
|
@@ -1005,23 +1005,13 @@ static inline void update_mmu_cache(stru
|
||||||
* page after fork() + CoW for pfn mappings. We don't always have a
|
* page after fork() + CoW for pfn mappings. We don't always have a
|
||||||
* hardware-managed access flag on arm64.
|
* hardware-managed access flag on arm64.
|
||||||
*/
|
*/
|
||||||
|
@ -71,7 +71,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
ret = stmmac_hw_setup(dev, true);
|
ret = stmmac_hw_setup(dev, true);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
netdev_err(priv->dev, "%s: Hw setup failed\n", __func__);
|
netdev_err(priv->dev, "%s: Hw setup failed\n", __func__);
|
||||||
@@ -6432,6 +6425,7 @@ void stmmac_enable_rx_queue(struct stmma
|
@@ -6429,6 +6422,7 @@ void stmmac_enable_rx_queue(struct stmma
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
stmmac_clear_rx_descriptors(priv, queue);
|
stmmac_clear_rx_descriptors(priv, queue);
|
||||||
|
|
||||||
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||||
@@ -6493,6 +6487,7 @@ void stmmac_enable_tx_queue(struct stmma
|
@@ -6490,6 +6484,7 @@ void stmmac_enable_tx_queue(struct stmma
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
stmmac_clear_tx_descriptors(priv, queue);
|
stmmac_clear_tx_descriptors(priv, queue);
|
||||||
|
|
||||||
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||||
@@ -7417,6 +7412,25 @@ int stmmac_suspend(struct device *dev)
|
@@ -7414,6 +7409,25 @@ int stmmac_suspend(struct device *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(stmmac_suspend);
|
EXPORT_SYMBOL_GPL(stmmac_suspend);
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
/**
|
/**
|
||||||
* stmmac_reset_queues_param - reset queue parameters
|
* stmmac_reset_queues_param - reset queue parameters
|
||||||
* @priv: device pointer
|
* @priv: device pointer
|
||||||
@@ -7427,22 +7441,11 @@ static void stmmac_reset_queues_param(st
|
@@ -7424,22 +7438,11 @@ static void stmmac_reset_queues_param(st
|
||||||
u32 tx_cnt = priv->plat->tx_queues_to_use;
|
u32 tx_cnt = priv->plat->tx_queues_to_use;
|
||||||
u32 queue;
|
u32 queue;
|
||||||
|
|
||||||
|
@ -874,7 +874,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
tx_q->cur_tx = entry;
|
tx_q->cur_tx = entry;
|
||||||
|
|
||||||
if (netif_msg_pktdata(priv)) {
|
if (netif_msg_pktdata(priv)) {
|
||||||
@@ -4515,7 +4515,7 @@ static void stmmac_rx_vlan(struct net_de
|
@@ -4512,7 +4512,7 @@ static void stmmac_rx_vlan(struct net_de
|
||||||
*/
|
*/
|
||||||
static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
|
static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
|
||||||
{
|
{
|
||||||
@ -883,7 +883,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
int dirty = stmmac_rx_dirty(priv, queue);
|
int dirty = stmmac_rx_dirty(priv, queue);
|
||||||
unsigned int entry = rx_q->dirty_rx;
|
unsigned int entry = rx_q->dirty_rx;
|
||||||
|
|
||||||
@@ -4565,7 +4565,7 @@ static inline void stmmac_rx_refill(stru
|
@@ -4562,7 +4562,7 @@ static inline void stmmac_rx_refill(stru
|
||||||
dma_wmb();
|
dma_wmb();
|
||||||
stmmac_set_rx_owner(priv, p, use_rx_wd);
|
stmmac_set_rx_owner(priv, p, use_rx_wd);
|
||||||
|
|
||||||
@ -892,7 +892,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
}
|
}
|
||||||
rx_q->dirty_rx = entry;
|
rx_q->dirty_rx = entry;
|
||||||
rx_q->rx_tail_addr = rx_q->dma_rx_phy +
|
rx_q->rx_tail_addr = rx_q->dma_rx_phy +
|
||||||
@@ -4593,12 +4593,12 @@ static unsigned int stmmac_rx_buf1_len(s
|
@@ -4590,12 +4590,12 @@ static unsigned int stmmac_rx_buf1_len(s
|
||||||
|
|
||||||
/* First descriptor, not last descriptor and not split header */
|
/* First descriptor, not last descriptor and not split header */
|
||||||
if (status & rx_not_ls)
|
if (status & rx_not_ls)
|
||||||
@ -907,7 +907,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int stmmac_rx_buf2_len(struct stmmac_priv *priv,
|
static unsigned int stmmac_rx_buf2_len(struct stmmac_priv *priv,
|
||||||
@@ -4614,7 +4614,7 @@ static unsigned int stmmac_rx_buf2_len(s
|
@@ -4611,7 +4611,7 @@ static unsigned int stmmac_rx_buf2_len(s
|
||||||
|
|
||||||
/* Not last descriptor */
|
/* Not last descriptor */
|
||||||
if (status & rx_not_ls)
|
if (status & rx_not_ls)
|
||||||
@ -916,7 +916,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
plen = stmmac_get_rx_frame_len(priv, p, coe);
|
plen = stmmac_get_rx_frame_len(priv, p, coe);
|
||||||
|
|
||||||
@@ -4625,7 +4625,7 @@ static unsigned int stmmac_rx_buf2_len(s
|
@@ -4622,7 +4622,7 @@ static unsigned int stmmac_rx_buf2_len(s
|
||||||
static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue,
|
static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue,
|
||||||
struct xdp_frame *xdpf, bool dma_map)
|
struct xdp_frame *xdpf, bool dma_map)
|
||||||
{
|
{
|
||||||
@ -925,7 +925,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
unsigned int entry = tx_q->cur_tx;
|
unsigned int entry = tx_q->cur_tx;
|
||||||
struct dma_desc *tx_desc;
|
struct dma_desc *tx_desc;
|
||||||
dma_addr_t dma_addr;
|
dma_addr_t dma_addr;
|
||||||
@@ -4688,7 +4688,7 @@ static int stmmac_xdp_xmit_xdpf(struct s
|
@@ -4685,7 +4685,7 @@ static int stmmac_xdp_xmit_xdpf(struct s
|
||||||
|
|
||||||
stmmac_enable_dma_transmission(priv, priv->ioaddr);
|
stmmac_enable_dma_transmission(priv, priv->ioaddr);
|
||||||
|
|
||||||
@ -934,7 +934,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
tx_q->cur_tx = entry;
|
tx_q->cur_tx = entry;
|
||||||
|
|
||||||
return STMMAC_XDP_TX;
|
return STMMAC_XDP_TX;
|
||||||
@@ -4862,7 +4862,7 @@ static void stmmac_dispatch_skb_zc(struc
|
@@ -4859,7 +4859,7 @@ static void stmmac_dispatch_skb_zc(struc
|
||||||
|
|
||||||
static bool stmmac_rx_refill_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
|
static bool stmmac_rx_refill_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
|
||||||
{
|
{
|
||||||
@ -943,7 +943,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
unsigned int entry = rx_q->dirty_rx;
|
unsigned int entry = rx_q->dirty_rx;
|
||||||
struct dma_desc *rx_desc = NULL;
|
struct dma_desc *rx_desc = NULL;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
@@ -4905,7 +4905,7 @@ static bool stmmac_rx_refill_zc(struct s
|
@@ -4902,7 +4902,7 @@ static bool stmmac_rx_refill_zc(struct s
|
||||||
dma_wmb();
|
dma_wmb();
|
||||||
stmmac_set_rx_owner(priv, rx_desc, use_rx_wd);
|
stmmac_set_rx_owner(priv, rx_desc, use_rx_wd);
|
||||||
|
|
||||||
@ -952,7 +952,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rx_desc) {
|
if (rx_desc) {
|
||||||
@@ -4920,7 +4920,7 @@ static bool stmmac_rx_refill_zc(struct s
|
@@ -4917,7 +4917,7 @@ static bool stmmac_rx_refill_zc(struct s
|
||||||
|
|
||||||
static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)
|
static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)
|
||||||
{
|
{
|
||||||
@ -961,7 +961,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
unsigned int count = 0, error = 0, len = 0;
|
unsigned int count = 0, error = 0, len = 0;
|
||||||
int dirty = stmmac_rx_dirty(priv, queue);
|
int dirty = stmmac_rx_dirty(priv, queue);
|
||||||
unsigned int next_entry = rx_q->cur_rx;
|
unsigned int next_entry = rx_q->cur_rx;
|
||||||
@@ -4942,7 +4942,7 @@ static int stmmac_rx_zc(struct stmmac_pr
|
@@ -4939,7 +4939,7 @@ static int stmmac_rx_zc(struct stmmac_pr
|
||||||
desc_size = sizeof(struct dma_desc);
|
desc_size = sizeof(struct dma_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,7 +970,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
rx_q->dma_rx_phy, desc_size);
|
rx_q->dma_rx_phy, desc_size);
|
||||||
}
|
}
|
||||||
while (count < limit) {
|
while (count < limit) {
|
||||||
@@ -4989,7 +4989,7 @@ read_again:
|
@@ -4986,7 +4986,7 @@ read_again:
|
||||||
|
|
||||||
/* Prefetch the next RX descriptor */
|
/* Prefetch the next RX descriptor */
|
||||||
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
|
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
|
||||||
@ -979,7 +979,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
next_entry = rx_q->cur_rx;
|
next_entry = rx_q->cur_rx;
|
||||||
|
|
||||||
if (priv->extend_desc)
|
if (priv->extend_desc)
|
||||||
@@ -5110,7 +5110,7 @@ read_again:
|
@@ -5107,7 +5107,7 @@ read_again:
|
||||||
*/
|
*/
|
||||||
static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
|
static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
|
||||||
{
|
{
|
||||||
@ -988,7 +988,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
struct stmmac_channel *ch = &priv->channel[queue];
|
struct stmmac_channel *ch = &priv->channel[queue];
|
||||||
unsigned int count = 0, error = 0, len = 0;
|
unsigned int count = 0, error = 0, len = 0;
|
||||||
int status = 0, coe = priv->hw->rx_csum;
|
int status = 0, coe = priv->hw->rx_csum;
|
||||||
@@ -5123,7 +5123,7 @@ static int stmmac_rx(struct stmmac_priv
|
@@ -5120,7 +5120,7 @@ static int stmmac_rx(struct stmmac_priv
|
||||||
int buf_sz;
|
int buf_sz;
|
||||||
|
|
||||||
dma_dir = page_pool_get_dma_dir(rx_q->page_pool);
|
dma_dir = page_pool_get_dma_dir(rx_q->page_pool);
|
||||||
@ -997,7 +997,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
if (netif_msg_rx_status(priv)) {
|
if (netif_msg_rx_status(priv)) {
|
||||||
void *rx_head;
|
void *rx_head;
|
||||||
@@ -5137,7 +5137,7 @@ static int stmmac_rx(struct stmmac_priv
|
@@ -5134,7 +5134,7 @@ static int stmmac_rx(struct stmmac_priv
|
||||||
desc_size = sizeof(struct dma_desc);
|
desc_size = sizeof(struct dma_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1006,7 +1006,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
rx_q->dma_rx_phy, desc_size);
|
rx_q->dma_rx_phy, desc_size);
|
||||||
}
|
}
|
||||||
while (count < limit) {
|
while (count < limit) {
|
||||||
@@ -5181,7 +5181,7 @@ read_again:
|
@@ -5178,7 +5178,7 @@ read_again:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
|
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
|
||||||
@ -1015,7 +1015,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
next_entry = rx_q->cur_rx;
|
next_entry = rx_q->cur_rx;
|
||||||
|
|
||||||
if (priv->extend_desc)
|
if (priv->extend_desc)
|
||||||
@@ -5315,7 +5315,7 @@ read_again:
|
@@ -5312,7 +5312,7 @@ read_again:
|
||||||
buf1_len, dma_dir);
|
buf1_len, dma_dir);
|
||||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||||
buf->page, buf->page_offset, buf1_len,
|
buf->page, buf->page_offset, buf1_len,
|
||||||
@ -1024,7 +1024,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
/* Data payload appended into SKB */
|
/* Data payload appended into SKB */
|
||||||
page_pool_release_page(rx_q->page_pool, buf->page);
|
page_pool_release_page(rx_q->page_pool, buf->page);
|
||||||
@@ -5327,7 +5327,7 @@ read_again:
|
@@ -5324,7 +5324,7 @@ read_again:
|
||||||
buf2_len, dma_dir);
|
buf2_len, dma_dir);
|
||||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||||
buf->sec_page, 0, buf2_len,
|
buf->sec_page, 0, buf2_len,
|
||||||
@ -1033,7 +1033,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
/* Data payload appended into SKB */
|
/* Data payload appended into SKB */
|
||||||
page_pool_release_page(rx_q->page_pool, buf->sec_page);
|
page_pool_release_page(rx_q->page_pool, buf->sec_page);
|
||||||
@@ -5770,11 +5770,13 @@ static irqreturn_t stmmac_safety_interru
|
@@ -5767,11 +5767,13 @@ static irqreturn_t stmmac_safety_interru
|
||||||
static irqreturn_t stmmac_msi_intr_tx(int irq, void *data)
|
static irqreturn_t stmmac_msi_intr_tx(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)data;
|
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)data;
|
||||||
@ -1048,7 +1048,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
if (unlikely(!data)) {
|
if (unlikely(!data)) {
|
||||||
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
||||||
@@ -5814,10 +5816,12 @@ static irqreturn_t stmmac_msi_intr_tx(in
|
@@ -5811,10 +5813,12 @@ static irqreturn_t stmmac_msi_intr_tx(in
|
||||||
static irqreturn_t stmmac_msi_intr_rx(int irq, void *data)
|
static irqreturn_t stmmac_msi_intr_rx(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)data;
|
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)data;
|
||||||
@ -1062,7 +1062,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
if (unlikely(!data)) {
|
if (unlikely(!data)) {
|
||||||
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
||||||
@@ -5848,10 +5852,10 @@ static void stmmac_poll_controller(struc
|
@@ -5845,10 +5849,10 @@ static void stmmac_poll_controller(struc
|
||||||
|
|
||||||
if (priv->plat->multi_msi_en) {
|
if (priv->plat->multi_msi_en) {
|
||||||
for (i = 0; i < priv->plat->rx_queues_to_use; i++)
|
for (i = 0; i < priv->plat->rx_queues_to_use; i++)
|
||||||
@ -1075,7 +1075,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
} else {
|
} else {
|
||||||
disable_irq(dev->irq);
|
disable_irq(dev->irq);
|
||||||
stmmac_interrupt(dev->irq, dev);
|
stmmac_interrupt(dev->irq, dev);
|
||||||
@@ -6032,34 +6036,34 @@ static int stmmac_rings_status_show(stru
|
@@ -6029,34 +6033,34 @@ static int stmmac_rings_status_show(stru
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (queue = 0; queue < rx_count; queue++) {
|
for (queue = 0; queue < rx_count; queue++) {
|
||||||
@ -1116,7 +1116,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6406,7 +6410,7 @@ void stmmac_disable_rx_queue(struct stmm
|
@@ -6403,7 +6407,7 @@ void stmmac_disable_rx_queue(struct stmm
|
||||||
|
|
||||||
void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
|
void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
|
||||||
{
|
{
|
||||||
@ -1125,7 +1125,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
struct stmmac_channel *ch = &priv->channel[queue];
|
struct stmmac_channel *ch = &priv->channel[queue];
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 buf_size;
|
u32 buf_size;
|
||||||
@@ -6443,7 +6447,7 @@ void stmmac_enable_rx_queue(struct stmma
|
@@ -6440,7 +6444,7 @@ void stmmac_enable_rx_queue(struct stmma
|
||||||
rx_q->queue_index);
|
rx_q->queue_index);
|
||||||
} else {
|
} else {
|
||||||
stmmac_set_dma_bfsize(priv, priv->ioaddr,
|
stmmac_set_dma_bfsize(priv, priv->ioaddr,
|
||||||
@ -1134,7 +1134,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
rx_q->queue_index);
|
rx_q->queue_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6469,7 +6473,7 @@ void stmmac_disable_tx_queue(struct stmm
|
@@ -6466,7 +6470,7 @@ void stmmac_disable_tx_queue(struct stmm
|
||||||
|
|
||||||
void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
|
void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
|
||||||
{
|
{
|
||||||
@ -1143,7 +1143,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
struct stmmac_channel *ch = &priv->channel[queue];
|
struct stmmac_channel *ch = &priv->channel[queue];
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -6519,7 +6523,7 @@ void stmmac_xdp_release(struct net_devic
|
@@ -6516,7 +6520,7 @@ void stmmac_xdp_release(struct net_devic
|
||||||
stmmac_disable_all_queues(priv);
|
stmmac_disable_all_queues(priv);
|
||||||
|
|
||||||
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
|
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
|
||||||
@ -1152,7 +1152,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
/* Free the IRQ lines */
|
/* Free the IRQ lines */
|
||||||
stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0);
|
stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0);
|
||||||
@@ -6578,7 +6582,7 @@ int stmmac_xdp_open(struct net_device *d
|
@@ -6575,7 +6579,7 @@ int stmmac_xdp_open(struct net_device *d
|
||||||
|
|
||||||
/* DMA RX Channel Configuration */
|
/* DMA RX Channel Configuration */
|
||||||
for (chan = 0; chan < rx_cnt; chan++) {
|
for (chan = 0; chan < rx_cnt; chan++) {
|
||||||
@ -1161,7 +1161,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||||
rx_q->dma_rx_phy, chan);
|
rx_q->dma_rx_phy, chan);
|
||||||
@@ -6596,7 +6600,7 @@ int stmmac_xdp_open(struct net_device *d
|
@@ -6593,7 +6597,7 @@ int stmmac_xdp_open(struct net_device *d
|
||||||
rx_q->queue_index);
|
rx_q->queue_index);
|
||||||
} else {
|
} else {
|
||||||
stmmac_set_dma_bfsize(priv, priv->ioaddr,
|
stmmac_set_dma_bfsize(priv, priv->ioaddr,
|
||||||
@ -1170,7 +1170,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
rx_q->queue_index);
|
rx_q->queue_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6605,7 +6609,7 @@ int stmmac_xdp_open(struct net_device *d
|
@@ -6602,7 +6606,7 @@ int stmmac_xdp_open(struct net_device *d
|
||||||
|
|
||||||
/* DMA TX Channel Configuration */
|
/* DMA TX Channel Configuration */
|
||||||
for (chan = 0; chan < tx_cnt; chan++) {
|
for (chan = 0; chan < tx_cnt; chan++) {
|
||||||
@ -1179,7 +1179,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||||
tx_q->dma_tx_phy, chan);
|
tx_q->dma_tx_phy, chan);
|
||||||
@@ -6638,7 +6642,7 @@ int stmmac_xdp_open(struct net_device *d
|
@@ -6635,7 +6639,7 @@ int stmmac_xdp_open(struct net_device *d
|
||||||
|
|
||||||
irq_error:
|
irq_error:
|
||||||
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
|
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
|
||||||
@ -1188,7 +1188,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
stmmac_hw_teardown(dev);
|
stmmac_hw_teardown(dev);
|
||||||
init_error:
|
init_error:
|
||||||
@@ -6665,8 +6669,8 @@ int stmmac_xsk_wakeup(struct net_device
|
@@ -6662,8 +6666,8 @@ int stmmac_xsk_wakeup(struct net_device
|
||||||
queue >= priv->plat->tx_queues_to_use)
|
queue >= priv->plat->tx_queues_to_use)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -1199,7 +1199,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
ch = &priv->channel[queue];
|
ch = &priv->channel[queue];
|
||||||
|
|
||||||
if (!rx_q->xsk_pool && !tx_q->xsk_pool)
|
if (!rx_q->xsk_pool && !tx_q->xsk_pool)
|
||||||
@@ -6926,8 +6930,8 @@ int stmmac_reinit_ringparam(struct net_d
|
@@ -6923,8 +6927,8 @@ int stmmac_reinit_ringparam(struct net_d
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
stmmac_release(dev);
|
stmmac_release(dev);
|
||||||
|
|
||||||
@ -1210,7 +1210,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
ret = stmmac_open(dev);
|
ret = stmmac_open(dev);
|
||||||
@@ -7362,7 +7366,7 @@ int stmmac_suspend(struct device *dev)
|
@@ -7359,7 +7363,7 @@ int stmmac_suspend(struct device *dev)
|
||||||
stmmac_disable_all_queues(priv);
|
stmmac_disable_all_queues(priv);
|
||||||
|
|
||||||
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
|
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
|
||||||
@ -1219,7 +1219,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
if (priv->eee_enabled) {
|
if (priv->eee_enabled) {
|
||||||
priv->tx_path_in_lpi_mode = false;
|
priv->tx_path_in_lpi_mode = false;
|
||||||
@@ -7414,7 +7418,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend);
|
@@ -7411,7 +7415,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend);
|
||||||
|
|
||||||
static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue)
|
static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue)
|
||||||
{
|
{
|
||||||
@ -1228,7 +1228,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
rx_q->cur_rx = 0;
|
rx_q->cur_rx = 0;
|
||||||
rx_q->dirty_rx = 0;
|
rx_q->dirty_rx = 0;
|
||||||
@@ -7422,7 +7426,7 @@ static void stmmac_reset_rx_queue(struct
|
@@ -7419,7 +7423,7 @@ static void stmmac_reset_rx_queue(struct
|
||||||
|
|
||||||
static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue)
|
static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue)
|
||||||
{
|
{
|
||||||
|
@ -1045,7 +1045,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
/* Disable the MAC Rx/Tx */
|
/* Disable the MAC Rx/Tx */
|
||||||
stmmac_mac_set(priv, priv->ioaddr, false);
|
stmmac_mac_set(priv, priv->ioaddr, false);
|
||||||
@@ -6405,7 +6521,7 @@ void stmmac_disable_rx_queue(struct stmm
|
@@ -6402,7 +6518,7 @@ void stmmac_disable_rx_queue(struct stmm
|
||||||
spin_unlock_irqrestore(&ch->lock, flags);
|
spin_unlock_irqrestore(&ch->lock, flags);
|
||||||
|
|
||||||
stmmac_stop_rx_dma(priv, queue);
|
stmmac_stop_rx_dma(priv, queue);
|
||||||
@ -1054,7 +1054,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
|
void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
|
||||||
@@ -6416,21 +6532,21 @@ void stmmac_enable_rx_queue(struct stmma
|
@@ -6413,21 +6529,21 @@ void stmmac_enable_rx_queue(struct stmma
|
||||||
u32 buf_size;
|
u32 buf_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -1080,7 +1080,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||||
rx_q->dma_rx_phy, rx_q->queue_index);
|
rx_q->dma_rx_phy, rx_q->queue_index);
|
||||||
@@ -6468,7 +6584,7 @@ void stmmac_disable_tx_queue(struct stmm
|
@@ -6465,7 +6581,7 @@ void stmmac_disable_tx_queue(struct stmm
|
||||||
spin_unlock_irqrestore(&ch->lock, flags);
|
spin_unlock_irqrestore(&ch->lock, flags);
|
||||||
|
|
||||||
stmmac_stop_tx_dma(priv, queue);
|
stmmac_stop_tx_dma(priv, queue);
|
||||||
@ -1089,7 +1089,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
|
void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
|
||||||
@@ -6478,21 +6594,21 @@ void stmmac_enable_tx_queue(struct stmma
|
@@ -6475,21 +6591,21 @@ void stmmac_enable_tx_queue(struct stmma
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -1115,7 +1115,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
|
||||||
tx_q->dma_tx_phy, tx_q->queue_index);
|
tx_q->dma_tx_phy, tx_q->queue_index);
|
||||||
@@ -6532,7 +6648,7 @@ void stmmac_xdp_release(struct net_devic
|
@@ -6529,7 +6645,7 @@ void stmmac_xdp_release(struct net_devic
|
||||||
stmmac_stop_all_dma(priv);
|
stmmac_stop_all_dma(priv);
|
||||||
|
|
||||||
/* Release and free the Rx/Tx resources */
|
/* Release and free the Rx/Tx resources */
|
||||||
@ -1124,7 +1124,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
/* Disable the MAC Rx/Tx */
|
/* Disable the MAC Rx/Tx */
|
||||||
stmmac_mac_set(priv, priv->ioaddr, false);
|
stmmac_mac_set(priv, priv->ioaddr, false);
|
||||||
@@ -6557,14 +6673,14 @@ int stmmac_xdp_open(struct net_device *d
|
@@ -6554,14 +6670,14 @@ int stmmac_xdp_open(struct net_device *d
|
||||||
u32 chan;
|
u32 chan;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -1141,7 +1141,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
netdev_err(dev, "%s: DMA descriptors initialization failed\n",
|
netdev_err(dev, "%s: DMA descriptors initialization failed\n",
|
||||||
__func__);
|
__func__);
|
||||||
@@ -6646,7 +6762,7 @@ irq_error:
|
@@ -6643,7 +6759,7 @@ irq_error:
|
||||||
|
|
||||||
stmmac_hw_teardown(dev);
|
stmmac_hw_teardown(dev);
|
||||||
init_error:
|
init_error:
|
||||||
@ -1150,7 +1150,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
dma_desc_error:
|
dma_desc_error:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -7509,7 +7625,7 @@ int stmmac_resume(struct device *dev)
|
@@ -7506,7 +7622,7 @@ int stmmac_resume(struct device *dev)
|
||||||
stmmac_reset_queues_param(priv);
|
stmmac_reset_queues_param(priv);
|
||||||
|
|
||||||
stmmac_free_tx_skbufs(priv);
|
stmmac_free_tx_skbufs(priv);
|
||||||
|
@ -19,7 +19,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
||||||
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
||||||
@@ -5627,18 +5627,15 @@ static int stmmac_change_mtu(struct net_
|
@@ -5624,18 +5624,15 @@ static int stmmac_change_mtu(struct net_
|
||||||
{
|
{
|
||||||
struct stmmac_priv *priv = netdev_priv(dev);
|
struct stmmac_priv *priv = netdev_priv(dev);
|
||||||
int txfifosz = priv->plat->tx_fifo_size;
|
int txfifosz = priv->plat->tx_fifo_size;
|
||||||
@ -40,7 +40,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
if (stmmac_xdp_is_enabled(priv) && new_mtu > ETH_DATA_LEN) {
|
if (stmmac_xdp_is_enabled(priv) && new_mtu > ETH_DATA_LEN) {
|
||||||
netdev_dbg(priv->dev, "Jumbo frames not supported for XDP\n");
|
netdev_dbg(priv->dev, "Jumbo frames not supported for XDP\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -5650,8 +5647,29 @@ static int stmmac_change_mtu(struct net_
|
@@ -5647,8 +5644,29 @@ static int stmmac_change_mtu(struct net_
|
||||||
if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB))
|
if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -1,229 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9639,6 +9639,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;
|
|
||||||
|
|
||||||
@@ -9848,43 +9851,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) },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -9904,7 +9899,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);
|
|
@ -1,64 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9545,9 +9545,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;
|
|
||||||
@@ -9617,10 +9616,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;
|
|
||||||
@@ -9904,6 +9912,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;
|
|
@ -1,71 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -8281,43 +8281,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);
|
|
||||||
@@ -9650,7 +9613,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);
|
|
@ -1,24 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9912,6 +9912,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)
|
|
@ -1,39 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9834,6 +9834,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) },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
@ -49,7 +49,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
|||||||
|
|
||||||
--- a/drivers/net/usb/qmi_wwan.c
|
--- a/drivers/net/usb/qmi_wwan.c
|
||||||
+++ b/drivers/net/usb/qmi_wwan.c
|
+++ b/drivers/net/usb/qmi_wwan.c
|
||||||
@@ -1316,6 +1316,7 @@ static const struct usb_device_id produc
|
@@ -1317,6 +1317,7 @@ static const struct usb_device_id produc
|
||||||
{QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */
|
{QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */
|
||||||
{QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */
|
{QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */
|
||||||
{QMI_FIXED_INTF(0x19d2, 0x1432, 3)}, /* ZTE ME3620 */
|
{QMI_FIXED_INTF(0x19d2, 0x1432, 3)}, /* ZTE ME3620 */
|
||||||
|
@ -121,7 +121,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||||||
static inline int lru_gen_from_seq(unsigned long seq)
|
static inline int lru_gen_from_seq(unsigned long seq)
|
||||||
{
|
{
|
||||||
return seq % MAX_NR_GENS;
|
return seq % MAX_NR_GENS;
|
||||||
@@ -297,6 +309,11 @@ static inline bool lru_gen_in_fault(void
|
@@ -302,6 +314,11 @@ static inline bool lru_gen_in_fault(void
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||||||
|
|
||||||
--- a/include/linux/mm_inline.h
|
--- a/include/linux/mm_inline.h
|
||||||
+++ b/include/linux/mm_inline.h
|
+++ b/include/linux/mm_inline.h
|
||||||
@@ -595,4 +595,12 @@ pte_install_uffd_wp_if_needed(struct vm_
|
@@ -600,4 +600,12 @@ pte_install_uffd_wp_if_needed(struct vm_
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||||||
|
|
||||||
--- a/include/linux/mm_inline.h
|
--- a/include/linux/mm_inline.h
|
||||||
+++ b/include/linux/mm_inline.h
|
+++ b/include/linux/mm_inline.h
|
||||||
@@ -600,6 +600,9 @@ static inline bool vma_has_recency(struc
|
@@ -605,6 +605,9 @@ static inline bool vma_has_recency(struc
|
||||||
if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))
|
if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ Signed-off-by: T.J. Mercier <tjmercier@google.com>
|
|||||||
static inline int lru_gen_from_seq(unsigned long seq)
|
static inline int lru_gen_from_seq(unsigned long seq)
|
||||||
{
|
{
|
||||||
return seq % MAX_NR_GENS;
|
return seq % MAX_NR_GENS;
|
||||||
@@ -309,11 +297,6 @@ static inline bool lru_gen_in_fault(void
|
@@ -314,11 +302,6 @@ static inline bool lru_gen_in_fault(void
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,229 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9675,6 +9675,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;
|
|
||||||
|
|
||||||
@@ -9875,43 +9878,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) },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -9931,7 +9926,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);
|
|
@ -1,64 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9556,9 +9556,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;
|
|
||||||
@@ -9628,10 +9627,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;
|
|
||||||
@@ -9931,6 +9939,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;
|
|
@ -1,71 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -8288,43 +8288,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);
|
|
||||||
@@ -9686,7 +9649,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);
|
|
@ -1,24 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9939,6 +9939,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)
|
|
@ -1,39 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -9860,6 +9860,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) },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
@ -36,7 +36,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
__netif_tx_unlock_bh(netdev_get_tx_queue(priv->dev, queue));
|
__netif_tx_unlock_bh(netdev_get_tx_queue(priv->dev, queue));
|
||||||
|
|
||||||
@@ -5476,12 +5477,13 @@ static int stmmac_napi_poll_tx(struct na
|
@@ -5473,12 +5474,13 @@ static int stmmac_napi_poll_tx(struct na
|
||||||
struct stmmac_channel *ch =
|
struct stmmac_channel *ch =
|
||||||
container_of(napi, struct stmmac_channel, tx_napi);
|
container_of(napi, struct stmmac_channel, tx_napi);
|
||||||
struct stmmac_priv *priv = ch->priv_data;
|
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);
|
work_done = min(work_done, budget);
|
||||||
|
|
||||||
if (work_done < budget && napi_complete_done(napi, work_done)) {
|
if (work_done < budget && napi_complete_done(napi, work_done)) {
|
||||||
@@ -5492,6 +5494,10 @@ static int stmmac_napi_poll_tx(struct na
|
@@ -5489,6 +5491,10 @@ static int stmmac_napi_poll_tx(struct na
|
||||||
spin_unlock_irqrestore(&ch->lock, flags);
|
spin_unlock_irqrestore(&ch->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
return work_done;
|
return work_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5501,11 +5507,12 @@ static int stmmac_napi_poll_rxtx(struct
|
@@ -5498,11 +5504,12 @@ static int stmmac_napi_poll_rxtx(struct
|
||||||
container_of(napi, struct stmmac_channel, rxtx_napi);
|
container_of(napi, struct stmmac_channel, rxtx_napi);
|
||||||
struct stmmac_priv *priv = ch->priv_data;
|
struct stmmac_priv *priv = ch->priv_data;
|
||||||
int rx_done, tx_done, rxtx_done;
|
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);
|
tx_done = min(tx_done, budget);
|
||||||
|
|
||||||
rx_done = stmmac_rx_zc(priv, budget, chan);
|
rx_done = stmmac_rx_zc(priv, budget, chan);
|
||||||
@@ -5530,6 +5537,10 @@ static int stmmac_napi_poll_rxtx(struct
|
@@ -5527,6 +5534,10 @@ static int stmmac_napi_poll_rxtx(struct
|
||||||
spin_unlock_irqrestore(&ch->lock, flags);
|
spin_unlock_irqrestore(&ch->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,6 @@
|
|||||||
regulator-min-microvolt = <5000000>;
|
regulator-min-microvolt = <5000000>;
|
||||||
regulator-max-microvolt = <5000000>;
|
regulator-max-microvolt = <5000000>;
|
||||||
gpios = <&pio 20 GPIO_ACTIVE_LOW>;
|
gpios = <&pio 20 GPIO_ACTIVE_LOW>;
|
||||||
enable-active-high;
|
|
||||||
regulator-boot-on;
|
regulator-boot-on;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -854,8 +854,11 @@ static void rtl93xx_phylink_mac_config(struct dsa_switch *ds, int port,
|
|||||||
case SPEED_1000:
|
case SPEED_1000:
|
||||||
reg |= 2 << 3;
|
reg |= 2 << 3;
|
||||||
break;
|
break;
|
||||||
|
case SPEED_100:
|
||||||
|
reg |= 1 << 3;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
reg |= 2 << 3;
|
/* Also covers 10M */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,9 +31,6 @@ cisco-mx100-hw)
|
|||||||
ucidef_set_network_device_path "eth11" "pci0000:00/0000:00:01.1/0000:02:00.2"
|
ucidef_set_network_device_path "eth11" "pci0000:00/0000:00:01.1/0000:02:00.2"
|
||||||
ucidef_set_interfaces_lan_wan "mgmt eth2 eth3 eth4 eth5 eth6 eth7 eth8 eth9 eth10 eth11" "wan"
|
ucidef_set_interfaces_lan_wan "mgmt eth2 eth3 eth4 eth5 eth6 eth7 eth8 eth9 eth10 eth11" "wan"
|
||||||
;;
|
;;
|
||||||
mellanox-technologies-ltd-msn2100)
|
|
||||||
ucidef_set_interface_lan "eth1 eth2 eth3 eth4 eth5 eth6 eth7 eth8 eth9 eth10 eth11 eth12 eth13 eth14 eth15 eth16"
|
|
||||||
;;
|
|
||||||
pc-engines-apu1|pc-engines-apu2|pc-engines-apu3)
|
pc-engines-apu1|pc-engines-apu2|pc-engines-apu3)
|
||||||
ucidef_set_interfaces_lan_wan "eth1 eth2" "eth0"
|
ucidef_set_interfaces_lan_wan "eth1 eth2" "eth0"
|
||||||
;;
|
;;
|
||||||
|
@ -3,12 +3,7 @@ define Device/generic
|
|||||||
DEVICE_MODEL := x86/64
|
DEVICE_MODEL := x86/64
|
||||||
DEVICE_PACKAGES += \
|
DEVICE_PACKAGES += \
|
||||||
kmod-amazon-ena kmod-amd-xgbe kmod-bnx2 kmod-e1000 \
|
kmod-amazon-ena kmod-amd-xgbe kmod-bnx2 kmod-e1000 \
|
||||||
kmod-dwmac-intel kmod-forcedeth kmod-fs-vfat kmod-tg3 \
|
kmod-dwmac-intel kmod-forcedeth kmod-fs-vfat kmod-tg3
|
||||||
kmod-mlxsw-core kmod-mlxsw-pci kmod-mlxsw-i2c \
|
|
||||||
kmod-mlxsw-spectrum kmod-mlxsw-minimal kmod-mlxfw \
|
|
||||||
kmod-leds-mlxcpld kmod-lib-objagg kmod-lib-parman \
|
|
||||||
kmod-hwmon-coretemp kmod-hwmon-drivetemp kmod-hwmon-jc42 \
|
|
||||||
kmod-i2c-i801 mlxsw_spectrum-firmware
|
|
||||||
GRUB2_VARIANT := generic
|
GRUB2_VARIANT := generic
|
||||||
endef
|
endef
|
||||||
TARGET_DEVICES += generic
|
TARGET_DEVICES += generic
|
||||||
|
Loading…
x
Reference in New Issue
Block a user