-LINUX_VERSION-5.15 = .143
-LINUX_KERNEL_HASH-5.15.143 = 096bb16ec07232f27f6a07998c41b655883a8d0a6bb613d39bf524a9ffd99e02
+LINUX_VERSION-5.15 = .144
+LINUX_KERNEL_HASH-5.15.144 = f053afafafce771acbf478afdd16e9aa85b0a0e328205c4f53276062300a5b3b
* XXX skbs on the gro_list have all been parsed and pulled
--- a/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;
struct in6_addr prefix;
-};
+} __attribute__((packed, aligned(2)));
- #include <linux/ipv6.h>
- #include <linux/netdevice.h>
+ /* rfc4861 4.6.2: IPv6 PIO is 32 bytes in size */
+ static_assert(sizeof(struct prefix_info) == 32);
--- a/include/net/inet_ecn.h
+++ b/include/net/inet_ecn.h
@@ -138,9 +138,9 @@ static inline int IP6_ECN_set_ce(struct
--- a/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
* hardware-managed access flag on arm64.
*/
ret = stmmac_hw_setup(dev, true);
if (ret < 0) {
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;
}
stmmac_clear_rx_descriptors(priv, queue);
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;
}
stmmac_clear_tx_descriptors(priv, queue);
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);
/**
* stmmac_reset_queues_param - reset queue parameters
* @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 queue;
tx_q->cur_tx = entry;
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)
{
int dirty = stmmac_rx_dirty(priv, queue);
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();
stmmac_set_rx_owner(priv, p, use_rx_wd);
}
rx_q->dirty_rx = entry;
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 */
if (status & rx_not_ls)
}
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 */
if (status & rx_not_ls)
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,
struct xdp_frame *xdpf, bool dma_map)
{
unsigned int entry = tx_q->cur_tx;
struct dma_desc *tx_desc;
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);
tx_q->cur_tx = entry;
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)
{
unsigned int entry = rx_q->dirty_rx;
struct dma_desc *rx_desc = NULL;
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();
stmmac_set_rx_owner(priv, rx_desc, use_rx_wd);
}
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)
{
unsigned int count = 0, error = 0, len = 0;
int dirty = stmmac_rx_dirty(priv, queue);
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);
}
rx_q->dma_rx_phy, desc_size);
}
while (count < limit) {
-@@ -4989,7 +4989,7 @@ read_again:
+@@ -4986,7 +4986,7 @@ read_again:
/* Prefetch the next RX descriptor */
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
next_entry = rx_q->cur_rx;
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)
{
struct stmmac_channel *ch = &priv->channel[queue];
unsigned int count = 0, error = 0, len = 0;
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;
dma_dir = page_pool_get_dma_dir(rx_q->page_pool);
if (netif_msg_rx_status(priv)) {
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);
}
rx_q->dma_rx_phy, desc_size);
}
while (count < limit) {
-@@ -5181,7 +5181,7 @@ read_again:
+@@ -5178,7 +5178,7 @@ read_again:
break;
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
next_entry = rx_q->cur_rx;
if (priv->extend_desc)
-@@ -5315,7 +5315,7 @@ read_again:
+@@ -5312,7 +5312,7 @@ read_again:
buf1_len, dma_dir);
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
buf->page, buf->page_offset, buf1_len,
/* Data payload appended into SKB */
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);
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
buf->sec_page, 0, buf2_len,
/* Data payload appended into SKB */
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)
{
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)data;
if (unlikely(!data)) {
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)
{
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)data;
if (unlikely(!data)) {
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) {
for (i = 0; i < priv->plat->rx_queues_to_use; i++)
} else {
disable_irq(dev->irq);
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;
for (queue = 0; queue < rx_count; queue++) {
}
}
-@@ -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)
{
struct stmmac_channel *ch = &priv->channel[queue];
unsigned long flags;
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);
} else {
stmmac_set_dma_bfsize(priv, priv->ioaddr,
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)
{
struct stmmac_channel *ch = &priv->channel[queue];
unsigned long flags;
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);
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
/* Free the IRQ lines */
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 */
for (chan = 0; chan < rx_cnt; chan++) {
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
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);
} else {
stmmac_set_dma_bfsize(priv, priv->ioaddr,
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 */
for (chan = 0; chan < tx_cnt; chan++) {
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
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:
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
stmmac_hw_teardown(dev);
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)
return -EINVAL;
ch = &priv->channel[queue];
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))
stmmac_release(dev);
if (netif_running(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);
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
if (priv->eee_enabled) {
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)
{
rx_q->cur_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)
{
/* Disable the MAC Rx/Tx */
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);
stmmac_stop_rx_dma(priv, 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;
int ret;
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
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);
stmmac_stop_tx_dma(priv, 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;
int ret;
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
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);
/* Release and free the Rx/Tx resources */
/* Disable the MAC Rx/Tx */
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;
int ret;
if (ret < 0) {
netdev_err(dev, "%s: DMA descriptors initialization failed\n",
__func__);
-@@ -6646,7 +6762,7 @@ irq_error:
+@@ -6643,7 +6759,7 @@ irq_error:
stmmac_hw_teardown(dev);
init_error:
dma_desc_error:
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_free_tx_skbufs(priv);
--- a/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);
int txfifosz = priv->plat->tx_fifo_size;
if (stmmac_xdp_is_enabled(priv) && new_mtu > ETH_DATA_LEN) {
netdev_dbg(priv->dev, "Jumbo frames not supported for XDP\n");
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))
return -EINVAL;
+++ /dev/null
-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);
+++ /dev/null
-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;
+++ /dev/null
-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);
+++ /dev/null
-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)
+++ /dev/null
-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) },
- {}
- };
-
--- a/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, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */
{QMI_FIXED_INTF(0x19d2, 0x1432, 3)}, /* ZTE ME3620 */