+++ /dev/null
-From 8e38e08f2c560328a873c35aff1a0dbea6a7d084 Mon Sep 17 00:00:00 2001
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-Date: Tue, 1 Oct 2024 12:10:25 +0200
-Subject: [PATCH 2/2] net: airoha: fix PSE memory configuration in
- airoha_fe_pse_ports_init()
-
-Align PSE memory configuration to vendor SDK. In particular, increase
-initial value of PSE reserved memory in airoha_fe_pse_ports_init()
-routine by the value used for the second Packet Processor Engine (PPE2)
-and do not overwrite the default value.
-
-Introduced by commit 23020f049327 ("net: airoha: Introduce ethernet support
-for EN7581 SoC")
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Reviewed-by: Simon Horman <horms@kernel.org>
-Link: https://patch.msgid.link/20241001-airoha-eth-pse-fix-v2-2-9a56cdffd074@kernel.org
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- drivers/net/ethernet/mediatek/airoha_eth.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/airoha_eth.c
-+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
-@@ -1166,11 +1166,13 @@ static void airoha_fe_pse_ports_init(str
- [FE_PSE_PORT_GDM4] = 2,
- [FE_PSE_PORT_CDM5] = 2,
- };
-+ u32 all_rsv;
- int q;
-
-+ all_rsv = airoha_fe_get_pse_all_rsv(eth);
- /* hw misses PPE2 oq rsv */
-- airoha_fe_set(eth, REG_FE_PSE_BUF_SET,
-- PSE_RSV_PAGES * pse_port_num_queues[FE_PSE_PORT_PPE2]);
-+ all_rsv += PSE_RSV_PAGES * pse_port_num_queues[FE_PSE_PORT_PPE2];
-+ airoha_fe_set(eth, REG_FE_PSE_BUF_SET, all_rsv);
-
- /* CMD1 */
- for (q = 0; q < pse_port_num_queues[FE_PSE_PORT_CDM1]; q++)
+++ /dev/null
-From 1f3e7ff4f296af1f4350f457d5bd82bc825e645a Mon Sep 17 00:00:00 2001
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-Date: Tue, 1 Oct 2024 12:10:24 +0200
-Subject: [PATCH 1/2] net: airoha: read default PSE reserved pages value before
- updating
-
-Store the default value for the number of PSE reserved pages in orig_val
-at the beginning of airoha_fe_set_pse_oq_rsv routine, before updating it
-with airoha_fe_set_pse_queue_rsv_pages().
-Introduce airoha_fe_get_pse_all_rsv utility routine.
-
-Introduced by commit 23020f049327 ("net: airoha: Introduce ethernet support
-for EN7581 SoC")
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Reviewed-by: Simon Horman <horms@kernel.org>
-Link: https://patch.msgid.link/20241001-airoha-eth-pse-fix-v2-1-9a56cdffd074@kernel.org
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- drivers/net/ethernet/mediatek/airoha_eth.c | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/airoha_eth.c
-+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
-@@ -1116,17 +1116,23 @@ static void airoha_fe_set_pse_queue_rsv_
- PSE_CFG_WR_EN_MASK | PSE_CFG_OQRSV_SEL_MASK);
- }
-
-+static u32 airoha_fe_get_pse_all_rsv(struct airoha_eth *eth)
-+{
-+ u32 val = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
-+
-+ return FIELD_GET(PSE_ALLRSV_MASK, val);
-+}
-+
- static int airoha_fe_set_pse_oq_rsv(struct airoha_eth *eth,
- u32 port, u32 queue, u32 val)
- {
-- u32 orig_val, tmp, all_rsv, fq_limit;
-+ u32 orig_val = airoha_fe_get_pse_queue_rsv_pages(eth, port, queue);
-+ u32 tmp, all_rsv, fq_limit;
-
- airoha_fe_set_pse_queue_rsv_pages(eth, port, queue, val);
-
- /* modify all rsv */
-- orig_val = airoha_fe_get_pse_queue_rsv_pages(eth, port, queue);
-- tmp = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
-- all_rsv = FIELD_GET(PSE_ALLRSV_MASK, tmp);
-+ all_rsv = airoha_fe_get_pse_all_rsv(eth);
- all_rsv += (val - orig_val);
- airoha_fe_rmw(eth, REG_FE_PSE_BUF_SET, PSE_ALLRSV_MASK,
- FIELD_PREP(PSE_ALLRSV_MASK, all_rsv));
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
-@@ -1709,9 +1709,11 @@ static int airoha_qdma_tx_napi_poll(stru
+@@ -1713,9 +1713,11 @@ static int airoha_qdma_tx_napi_poll(stru
WRITE_ONCE(desc->msg1, 0);
if (skb) {
if (netif_tx_queue_stopped(txq) &&
q->ndesc - q->queued >= q->free_thr)
netif_tx_wake_queue(txq);
-@@ -2499,7 +2501,9 @@ static netdev_tx_t airoha_dev_xmit(struc
+@@ -2494,7 +2496,9 @@ static netdev_tx_t airoha_dev_xmit(struc
q->queued += i;
skb_tx_timestamp(skb);
+++ /dev/null
-From 3affa310de523d63e52ea8e2efb3c476df29e414 Mon Sep 17 00:00:00 2001
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-Date: Tue, 29 Oct 2024 13:17:09 +0100
-Subject: [PATCH 1/2] net: airoha: Read completion queue data in
- airoha_qdma_tx_napi_poll()
-
-In order to avoid any possible race, read completion queue head and
-pending entry in airoha_qdma_tx_napi_poll routine instead of doing it in
-airoha_irq_handler. Remove unused airoha_tx_irq_queue unused fields.
-This is a preliminary patch to add Qdisc offload for airoha_eth driver.
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Link: https://patch.msgid.link/20241029-airoha-en7581-tx-napi-work-v1-1-96ad1686b946@kernel.org
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- drivers/net/ethernet/mediatek/airoha_eth.c | 31 +++++++++-------------
- 1 file changed, 13 insertions(+), 18 deletions(-)
-
---- a/drivers/net/ethernet/mediatek/airoha_eth.c
-+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
-@@ -752,11 +752,9 @@ struct airoha_tx_irq_queue {
- struct airoha_qdma *qdma;
-
- struct napi_struct napi;
-- u32 *q;
-
- int size;
-- int queued;
-- u16 head;
-+ u32 *q;
- };
-
- struct airoha_hw_stats {
-@@ -1655,25 +1653,31 @@ static int airoha_qdma_init_rx(struct ai
- static int airoha_qdma_tx_napi_poll(struct napi_struct *napi, int budget)
- {
- struct airoha_tx_irq_queue *irq_q;
-+ int id, done = 0, irq_queued;
- struct airoha_qdma *qdma;
- struct airoha_eth *eth;
-- int id, done = 0;
-+ u32 status, head;
-
- irq_q = container_of(napi, struct airoha_tx_irq_queue, napi);
- qdma = irq_q->qdma;
- id = irq_q - &qdma->q_tx_irq[0];
- eth = qdma->eth;
-
-- while (irq_q->queued > 0 && done < budget) {
-- u32 qid, last, val = irq_q->q[irq_q->head];
-+ status = airoha_qdma_rr(qdma, REG_IRQ_STATUS(id));
-+ head = FIELD_GET(IRQ_HEAD_IDX_MASK, status);
-+ head = head % irq_q->size;
-+ irq_queued = FIELD_GET(IRQ_ENTRY_LEN_MASK, status);
-+
-+ while (irq_queued > 0 && done < budget) {
-+ u32 qid, last, val = irq_q->q[head];
- struct airoha_queue *q;
-
- if (val == 0xff)
- break;
-
-- irq_q->q[irq_q->head] = 0xff; /* mark as done */
-- irq_q->head = (irq_q->head + 1) % irq_q->size;
-- irq_q->queued--;
-+ irq_q->q[head] = 0xff; /* mark as done */
-+ head = (head + 1) % irq_q->size;
-+ irq_queued--;
- done++;
-
- last = FIELD_GET(IRQ_DESC_IDX_MASK, val);
-@@ -2025,20 +2029,11 @@ static irqreturn_t airoha_irq_handler(in
-
- if (intr[0] & INT_TX_MASK) {
- for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++) {
-- struct airoha_tx_irq_queue *irq_q = &qdma->q_tx_irq[i];
-- u32 status, head;
--
- if (!(intr[0] & TX_DONE_INT_MASK(i)))
- continue;
-
- airoha_qdma_irq_disable(qdma, QDMA_INT_REG_IDX0,
- TX_DONE_INT_MASK(i));
--
-- status = airoha_qdma_rr(qdma, REG_IRQ_STATUS(i));
-- head = FIELD_GET(IRQ_HEAD_IDX_MASK, status);
-- irq_q->head = head % irq_q->size;
-- irq_q->queued = FIELD_GET(IRQ_ENTRY_LEN_MASK, status);
--
- napi_schedule(&qdma->q_tx_irq[i].napi);
- }
- }
-obj-$(CONFIG_NET_AIROHA) += airoha_eth.o
--- /dev/null
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -0,0 +1,3358 @@
+@@ -0,0 +1,3357 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2024 AIROHA Inc
+ if (!port)
+ continue;
+
-+ airoha_dev_stop(port->dev);
+ unregister_netdev(port->dev);
+ }
+ free_netdev(eth->napi_dev);
+MODULE_DESCRIPTION("Ethernet driver for Airoha SoC");
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ /dev/null
-@@ -1,3358 +0,0 @@
+@@ -1,3357 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2024 AIROHA Inc
- if (!port)
- continue;
-
-- airoha_dev_stop(port->dev);
- unregister_netdev(port->dev);
- }
- free_netdev(eth->napi_dev);
}
free_netdev(eth->napi_dev);
platform_set_drvdata(pdev, NULL);
-@@ -2414,6 +2526,7 @@ static void airoha_remove(struct platfor
+@@ -2413,6 +2525,7 @@ static void airoha_remove(struct platfor
+ continue;
- airoha_dev_stop(port->dev);
unregister_netdev(port->dev);
+ airoha_metadata_dst_free(port);
}
default:
return -EOPNOTSUPP;
}
-@@ -2504,6 +2561,7 @@ static void airoha_remove(struct platfor
+@@ -2503,6 +2560,7 @@ static void airoha_remove(struct platfor
}
free_netdev(eth->napi_dev);
eth->xsi_rsts);
if (err) {
dev_err(eth->dev, "failed to get bulk xsi reset lines\n");
-@@ -3052,8 +3061,23 @@ static void airoha_remove(struct platfor
+@@ -3051,8 +3060,23 @@ static void airoha_remove(struct platfor
platform_set_drvdata(pdev, NULL);
}
fallthrough;
case 2:
if (airoha_ppe_is_enabled(eth, 1)) {
-@@ -3073,11 +3078,38 @@ static const char * const en7581_xsi_rst
+@@ -3072,11 +3077,38 @@ static const char * const en7581_xsi_rst
"xfp-mac",
};
msg1 = FIELD_PREP(QDMA_ETH_TXMSG_FPORT_MASK, fport) |
FIELD_PREP(QDMA_ETH_TXMSG_METER_MASK, 0x7f);
-@@ -3102,6 +3120,35 @@ static int airoha_en7581_get_src_port_id
+@@ -3101,6 +3119,35 @@ static int airoha_en7581_get_src_port_id
return -EINVAL;
}
static const struct airoha_eth_soc_data en7581_soc_data = {
.version = 0x7581,
.xsi_rsts_names = en7581_xsi_rsts_names,
-@@ -3112,8 +3159,19 @@ static const struct airoha_eth_soc_data
+@@ -3111,8 +3158,19 @@ static const struct airoha_eth_soc_data
},
};
if (airoha_ppe_is_enabled(eth, 1)) {
/* For PPE2 always use secondary cpu port. */
fe_cpu_port = FE_PSE_PORT_CDM2;
-@@ -3101,14 +3103,14 @@ static const char * const en7581_xsi_rst
+@@ -3100,14 +3102,14 @@ static const char * const en7581_xsi_rst
static int airoha_en7581_get_src_port_id(struct airoha_gdm_port *port, int nbq)
{
switch (port->id) {
/* 7581 SoC supports eth and usb serdes on GDM4 port */
if (!nbq)
return HSGMII_LAN_7581_ETH_SRCPORT;
-@@ -3132,12 +3134,12 @@ static const char * const an7583_xsi_rst
+@@ -3131,12 +3133,12 @@ static const char * const an7583_xsi_rst
static int airoha_an7583_get_src_port_id(struct airoha_gdm_port *port, int nbq)
{
switch (port->id) {
+++ /dev/null
-From d4a533ad249e9fbdc2d0633f2ddd60a5b3a9a4ca Mon Sep 17 00:00:00 2001
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-Date: Fri, 13 Mar 2026 12:27:00 +0100
-Subject: [PATCH] net: airoha: Remove airoha_dev_stop() in airoha_remove()
-
-Do not run airoha_dev_stop routine explicitly in airoha_remove()
-since ndo_stop() callback is already executed by unregister_netdev() in
-__dev_close_many routine if necessary and, doing so, we will end up causing
-an underflow in the qdma users atomic counters. Rely on networking subsystem
-to stop the device removing the airoha_eth module.
-
-Fixes: 23020f0493270 ("net: airoha: Introduce ethernet support for EN7581 SoC")
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Reviewed-by: Simon Horman <horms@kernel.org>
-Link: https://patch.msgid.link/20260313-airoha-remove-ndo_stop-remove-net-v2-1-67542c3ceeca@kernel.org
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- drivers/net/ethernet/airoha/airoha_eth.c | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/drivers/net/ethernet/airoha/airoha_eth.c
-+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -3095,7 +3095,6 @@ static void airoha_remove(struct platfor
- if (!port)
- continue;
-
-- airoha_dev_stop(port->dev);
- unregister_netdev(port->dev);
- airoha_metadata_dst_free(port);
- }
};
/* Uart divisor latch read */
-@@ -2835,6 +2843,12 @@ serial8250_do_set_termios(struct uart_po
+@@ -2841,6 +2849,12 @@ serial8250_do_set_termios(struct uart_po
serial8250_set_divisor(port, baud, quot, frac);
--- a/drivers/mtd/spi-nor/core.c
+++ b/drivers/mtd/spi-nor/core.c
-@@ -3385,12 +3385,19 @@ static int spi_nor_set_mtd_info(struct s
+@@ -3526,12 +3526,19 @@ static int spi_nor_set_mtd_info(struct s
{
struct mtd_info *mtd = &nor->mtd;
struct device *dev = nor->dev;
#include <linux/uaccess.h>
#include <linux/ipv6.h>
#include <linux/icmpv6.h>
-@@ -914,10 +915,10 @@ static void tcp_v6_send_response(const s
+@@ -915,10 +916,10 @@ static void tcp_v6_send_response(const s
topt = (__be32 *)(t1 + 1);
if (tsecr) {
*sum = csum_fold(csum_partial(diff, sizeof(diff),
--- a/include/linux/etherdevice.h
+++ b/include/linux/etherdevice.h
-@@ -559,7 +559,7 @@ static inline bool is_etherdev_addr(cons
+@@ -560,7 +560,7 @@ static inline bool is_etherdev_addr(cons
* @b: Pointer to Ethernet header
*
* Compare two Ethernet headers, returns 0 if equal.
* aligned OR the platform can handle unaligned access. This is the
* case for all packets coming into netif_receive_skb or similar
* entry points.
-@@ -582,11 +582,12 @@ static inline unsigned long compare_ethe
+@@ -583,11 +583,12 @@ static inline unsigned long compare_ethe
fold |= *(unsigned long *)(a + 6) ^ *(unsigned long *)(b + 6);
return fold;
#else
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
-@@ -304,9 +304,7 @@ int bcmgenet_mii_probe(struct net_device
+@@ -301,9 +301,7 @@ int bcmgenet_mii_probe(struct net_device
struct device_node *dn = kdev->of_node;
phy_interface_t phy_iface = priv->phy_interface;
struct phy_device *phydev;
USB_PORT_FEAT_C_OVER_CURRENT);
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
-@@ -2180,6 +2180,85 @@ free_interfaces:
+@@ -2238,6 +2238,85 @@ free_interfaces:
if (cp->string == NULL &&
!(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
cp->string = usb_cache_string(dev, cp->desc.iConfiguration);
u32 xfer_resolution;
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
-@@ -1437,7 +1437,15 @@ int snd_soc_runtime_set_dai_fmt(struct s
+@@ -1436,7 +1436,15 @@ int snd_soc_runtime_set_dai_fmt(struct s
return 0;
for_each_rtd_codec_dais(rtd, i, codec_dai) {
* For devices with more than one control interface, we assume the
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
-@@ -2395,6 +2395,8 @@ static const struct usb_audio_quirk_flag
+@@ -2397,6 +2397,8 @@ static const struct usb_audio_quirk_flag
QUIRK_FLAG_ALIGN_TRANSFER),
DEVICE_FLG(0x534d, 0x2109, /* MacroSilicon MS2109 */
QUIRK_FLAG_ALIGN_TRANSFER),
static int lan78xx_read_reg(struct lan78xx_net *dev, u32 index, u32 *data)
{
u32 *buf;
-@@ -3462,8 +3471,14 @@ static int lan78xx_bind(struct lan78xx_n
+@@ -3466,8 +3475,14 @@ static int lan78xx_bind(struct lan78xx_n
if (DEFAULT_RX_CSUM_ENABLE)
dev->net->features |= NETIF_F_RXCSUM;
static int lan78xx_read_reg(struct lan78xx_net *dev, u32 index, u32 *data)
{
u32 *buf;
-@@ -4446,7 +4451,13 @@ static int lan78xx_probe(struct usb_inte
+@@ -4452,7 +4457,13 @@ static int lan78xx_probe(struct usb_inte
if (ret < 0)
goto out4;
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
-@@ -2913,6 +2913,11 @@ static int lan78xx_reset(struct lan78xx_
+@@ -2917,6 +2917,11 @@ static int lan78xx_reset(struct lan78xx_
int ret;
u32 buf;
u8 sig;
ret = lan78xx_read_reg(dev, HW_CFG, &buf);
if (ret < 0)
-@@ -2981,6 +2986,10 @@ static int lan78xx_reset(struct lan78xx_
+@@ -2985,6 +2990,10 @@ static int lan78xx_reset(struct lan78xx_
buf |= HW_CFG_CLK125_EN_;
buf |= HW_CFG_REFCLK25_EN_;
ret = lan78xx_write_reg(dev, HW_CFG, buf);
if (ret < 0)
return ret;
-@@ -3083,6 +3092,9 @@ static int lan78xx_reset(struct lan78xx_
+@@ -3087,6 +3096,9 @@ static int lan78xx_reset(struct lan78xx_
buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_;
}
}
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-@@ -2664,7 +2664,7 @@ static void bcmgenet_init_tx_ring(struct
+@@ -2657,7 +2657,7 @@ static void bcmgenet_init_tx_ring(struct
bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_PROD_INDEX);
bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_CONS_INDEX);
/* Disable rate control for now */
bcmgenet_tdma_ring_writel(priv, index, flow_period_val,
TDMA_FLOW_PERIOD);
-@@ -4139,9 +4139,12 @@ static int bcmgenet_probe(struct platfor
+@@ -4132,9 +4132,12 @@ static int bcmgenet_probe(struct platfor
netif_set_real_num_rx_queues(priv->dev, priv->hw_params->rx_queues + 1);
/* Set default coalescing parameters */
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
-@@ -310,6 +310,8 @@ int bcmgenet_mii_probe(struct net_device
+@@ -307,6 +307,8 @@ int bcmgenet_mii_probe(struct net_device
/* Communicate the integrated PHY revision */
if (priv->internal_phy)
phy_flags = priv->gphy_rev;
* have been called previously. Use for set_configuration, set_interface,
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
-@@ -1267,6 +1267,21 @@ static void remove_intf_ep_devs(struct u
+@@ -1325,6 +1325,21 @@ static void remove_intf_ep_devs(struct u
intf->ep_devs_created = 0;
}
* @dev: the device whose endpoint is being disabled
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
-@@ -1875,6 +1875,8 @@ extern int usb_clear_halt(struct usb_dev
+@@ -1879,6 +1879,8 @@ extern int usb_clear_halt(struct usb_dev
extern int usb_reset_configuration(struct usb_device *dev);
extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
extern void usb_reset_endpoint(struct usb_device *dev, unsigned int epaddr);
static inline void bcmgenet_writel(u32 value, void __iomem *offset)
{
-@@ -2493,6 +2496,11 @@ static void reset_umac(struct bcmgenet_p
+@@ -2486,6 +2489,11 @@ static void reset_umac(struct bcmgenet_p
bcmgenet_rbuf_ctrl_set(priv, 0);
udelay(10);
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
-@@ -3907,6 +3907,7 @@ static int spi_set_cs_timing(struct spi_
+@@ -3906,6 +3906,7 @@ static int spi_set_cs_timing(struct spi_
*/
int spi_setup(struct spi_device *spi)
{
unsigned bad_bits, ugly_bits;
int status;
-@@ -3933,6 +3934,14 @@ int spi_setup(struct spi_device *spi)
+@@ -3932,6 +3933,14 @@ int spi_setup(struct spi_device *spi)
"setup: MOSI configured to idle low and high at the same time.\n");
return -EINVAL;
}
static inline void bcmgenet_writel(u32 value, void __iomem *offset)
{
-@@ -3430,6 +3433,17 @@ static int bcmgenet_open(struct net_devi
+@@ -3423,6 +3426,17 @@ static int bcmgenet_open(struct net_devi
bcmgenet_phy_pause_set(dev, priv->rx_pause, priv->tx_pause);
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -3666,6 +3666,48 @@ static int xhci_align_td(struct xhci_hcd
+@@ -3667,6 +3667,48 @@ static int xhci_align_td(struct xhci_hcd
return 1;
}
/* This is very similar to what ehci-q.c qtd_fill() does */
int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
struct urb *urb, int slot_id, unsigned int ep_index)
-@@ -3820,6 +3862,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3821,6 +3863,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
}
check_trb_math(urb, enqd_len);
giveback_first_trb(xhci, slot_id, ep_index, urb->stream_id,
start_cycle, start_trb);
return 0;
-@@ -3968,6 +4012,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
+@@ -3969,6 +4013,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
/* Event on completion */
field | TRB_IOC | TRB_TYPE(TRB_STATUS) | ep_ring->cycle_state);
};
/*****************************************************************************\
-@@ -4565,6 +4575,15 @@ int sdhci_setup_host(struct sdhci_host *
+@@ -4572,6 +4582,15 @@ int sdhci_setup_host(struct sdhci_host *
!(host->quirks2 & SDHCI_QUIRK2_BROKEN_DDR50))
mmc->caps |= MMC_CAP_UHS_DDR50;
unsigned int max_tx_length;
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
-@@ -41,6 +41,9 @@
+@@ -42,6 +42,9 @@
#include <linux/inetdevice.h>
#include "macb.h"
/* This structure is only used for MACB on SiFive FU540 devices */
struct sifive_fu540_macb_mgmt {
void __iomem *reg;
-@@ -334,7 +337,7 @@ static int macb_mdio_wait_for_idle(struc
+@@ -335,7 +338,7 @@ static int macb_mdio_wait_for_idle(struc
u32 val;
return readx_poll_timeout(MACB_READ_NSR, bp, val, val & MACB_BIT(IDLE),
}
static int macb_mdio_read_c22(struct mii_bus *bus, int mii_id, int regnum)
-@@ -493,6 +496,19 @@ mdio_pm_exit:
+@@ -494,6 +497,19 @@ mdio_pm_exit:
return status;
}
static void macb_init_buffers(struct macb *bp)
{
struct macb_queue *queue;
-@@ -974,6 +990,7 @@ static int macb_mii_init(struct macb *bp
+@@ -1066,6 +1082,7 @@ static int macb_mii_init(struct macb *bp
bp->mii_bus->write = &macb_mdio_write_c22;
bp->mii_bus->read_c45 = &macb_mdio_read_c45;
bp->mii_bus->write_c45 = &macb_mdio_write_c45;
snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
bp->pdev->name, bp->pdev->id);
bp->mii_bus->priv = bp;
-@@ -1639,6 +1656,11 @@ static int macb_rx(struct macb_queue *qu
+@@ -1731,6 +1748,11 @@ static int macb_rx(struct macb_queue *qu
macb_init_rx_ring(queue);
queue_writel(queue, RBQP, queue->rx_ring_dma);
macb_writel(bp, NCR, ctrl | MACB_BIT(RE));
-@@ -1941,8 +1963,9 @@ static irqreturn_t macb_interrupt(int ir
+@@ -2033,8 +2055,9 @@ static irqreturn_t macb_interrupt(int ir
queue_writel(queue, ISR, MACB_BIT(TCOMP) |
MACB_BIT(TXUBR));
wmb(); // ensure softirq can see update
}
-@@ -2398,6 +2421,11 @@ static netdev_tx_t macb_start_xmit(struc
+@@ -2490,6 +2513,11 @@ static netdev_tx_t macb_start_xmit(struc
skb_tx_timestamp(skb);
spin_lock(&bp->lock);
macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
spin_unlock(&bp->lock);
-@@ -2804,6 +2832,37 @@ static void macb_configure_dma(struct ma
+@@ -2901,6 +2929,37 @@ static void macb_configure_dma(struct ma
}
}
static void macb_init_hw(struct macb *bp)
{
u32 config;
-@@ -2832,6 +2891,11 @@ static void macb_init_hw(struct macb *bp
+@@ -2929,6 +2988,11 @@ static void macb_init_hw(struct macb *bp
if (bp->caps & MACB_CAPS_JUMBO)
bp->rx_frm_len_mask = MACB_RX_JFRMLEN_MASK;
macb_configure_dma(bp);
/* Enable RX partial store and forward and set watermark */
-@@ -3199,6 +3263,52 @@ static void gem_get_ethtool_strings(stru
+@@ -3296,6 +3360,52 @@ static void gem_get_ethtool_strings(stru
}
}
static struct net_device_stats *macb_get_stats(struct net_device *dev)
{
struct macb *bp = netdev_priv(dev);
-@@ -3783,6 +3893,8 @@ static const struct ethtool_ops macb_eth
+@@ -3883,6 +3993,8 @@ static const struct ethtool_ops macb_eth
};
static const struct ethtool_ops gem_ethtool_ops = {
.get_regs_len = macb_get_regs_len,
.get_regs = macb_get_regs,
.get_wol = macb_get_wol,
-@@ -3792,6 +3904,8 @@ static const struct ethtool_ops gem_etht
+@@ -3892,6 +4004,8 @@ static const struct ethtool_ops gem_etht
.get_ethtool_stats = gem_get_ethtool_stats,
.get_strings = gem_get_ethtool_strings,
.get_sset_count = gem_get_sset_count,
.get_link_ksettings = macb_get_link_ksettings,
.set_link_ksettings = macb_set_link_ksettings,
.get_ringparam = macb_get_ringparam,
-@@ -5113,6 +5227,11 @@ static int macb_probe(struct platform_de
+@@ -5213,6 +5327,11 @@ static int macb_probe(struct platform_de
}
}
}
spin_lock_init(&bp->lock);
spin_lock_init(&bp->stats_lock);
-@@ -5173,6 +5292,21 @@ static int macb_probe(struct platform_de
+@@ -5273,6 +5392,21 @@ static int macb_probe(struct platform_de
else
bp->phy_interface = interface;
/* IP specific init */
err = init(pdev);
if (err)
-@@ -5244,6 +5378,19 @@ static void macb_remove(struct platform_
+@@ -5344,6 +5478,19 @@ static void macb_remove(struct platform_
}
}
static int __maybe_unused macb_suspend(struct device *dev)
{
struct net_device *netdev = dev_get_drvdata(dev);
-@@ -5497,6 +5644,7 @@ static const struct dev_pm_ops macb_pm_o
+@@ -5607,6 +5754,7 @@ static const struct dev_pm_ops macb_pm_o
static struct platform_driver macb_driver = {
.probe = macb_probe,
.remove_new = macb_remove,
--- a/drivers/pmdomain/bcm/bcm2835-power.c
+++ b/drivers/pmdomain/bcm/bcm2835-power.c
-@@ -79,6 +79,7 @@
+@@ -80,6 +80,7 @@
#define PM_IMAGE 0x108
#define PM_GRAFX 0x10c
#define PM_PROC 0x110
#define PM_ENAB BIT(12)
#define PM_ISPRSTN BIT(8)
#define PM_H264RSTN BIT(7)
-@@ -381,6 +382,9 @@ static int bcm2835_power_pd_power_on(str
+@@ -377,6 +378,9 @@ static int bcm2835_power_pd_power_on(str
return bcm2835_power_power_on(pd, PM_GRAFX);
case BCM2835_POWER_DOMAIN_GRAFX_V3D:
return bcm2835_asb_power_on(pd, PM_GRAFX,
ASB_V3D_M_CTRL, ASB_V3D_S_CTRL,
PM_V3DRSTN);
-@@ -447,6 +451,9 @@ static int bcm2835_power_pd_power_off(st
+@@ -443,6 +447,9 @@ static int bcm2835_power_pd_power_off(st
return bcm2835_power_power_off(pd, PM_GRAFX);
case BCM2835_POWER_DOMAIN_GRAFX_V3D:
return bcm2835_asb_power_off(pd, PM_GRAFX,
ASB_V3D_M_CTRL, ASB_V3D_S_CTRL,
PM_V3DRSTN);
-@@ -642,19 +649,21 @@ static int bcm2835_power_probe(struct pl
+@@ -638,19 +645,21 @@ static int bcm2835_power_probe(struct pl
power->asb = pm->asb;
power->rpivid_asb = pm->rpivid_asb;
BUG_ON(data->blksz > host->mmc->max_blk_size);
BUG_ON(data->blocks > 65535);
-@@ -4709,11 +4709,16 @@ int sdhci_setup_host(struct sdhci_host *
+@@ -4716,11 +4716,16 @@ int sdhci_setup_host(struct sdhci_host *
spin_lock_init(&host->lock);
/*
retry_disable:
--- a/drivers/gpu/drm/drm_mode_config.c
+++ b/drivers/gpu/drm/drm_mode_config.c
-@@ -643,7 +643,7 @@ void drm_mode_config_validate(struct drm
+@@ -646,7 +646,7 @@ void drm_mode_config_validate(struct drm
struct drm_encoder *encoder;
struct drm_crtc *crtc;
struct drm_plane *plane;
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
-@@ -5076,6 +5076,17 @@ static const struct macb_config versal_c
+@@ -5176,6 +5176,17 @@ static const struct macb_config versal_c
.usrio = &macb_default_usrio,
};
static const struct of_device_id macb_dt_ids[] = {
{ .compatible = "cdns,at91sam9260-macb", .data = &at91sam9260_config },
{ .compatible = "cdns,macb" },
-@@ -5096,6 +5107,7 @@ static const struct of_device_id macb_dt
+@@ -5196,6 +5207,7 @@ static const struct of_device_id macb_dt
{ .compatible = "microchip,mpfs-macb", .data = &mpfs_config },
{ .compatible = "microchip,sama7g5-gem", .data = &sama7g5_gem_config },
{ .compatible = "microchip,sama7g5-emac", .data = &sama7g5_emac_config },
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
-@@ -2109,6 +2109,7 @@ static void nvme_free_host_mem(struct nv
+@@ -2111,6 +2111,7 @@ static void nvme_free_host_mem(struct nv
dev->nr_host_mem_descs = 0;
}
static int __nvme_alloc_host_mem(struct nvme_dev *dev, u64 preferred,
u32 chunk_size)
{
-@@ -2177,9 +2178,11 @@ out:
+@@ -2179,9 +2180,11 @@ out:
dev->host_mem_descs = NULL;
return -ENOMEM;
}
u64 min_chunk = min_t(u64, preferred, PAGE_SIZE * MAX_ORDER_NR_PAGES);
u64 hmminds = max_t(u32, dev->ctrl.hmminds * 4096, PAGE_SIZE * 2);
u64 chunk_size;
-@@ -2192,6 +2195,7 @@ static int nvme_alloc_host_mem(struct nv
+@@ -2194,6 +2197,7 @@ static int nvme_alloc_host_mem(struct nv
nvme_free_host_mem(dev);
}
}
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
-@@ -6932,6 +6932,39 @@ static int __init cgroup_disable(char *s
+@@ -6933,6 +6933,39 @@ static int __init cgroup_disable(char *s
}
__setup("cgroup_disable=", cgroup_disable);
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
-@@ -1539,10 +1539,14 @@ static int bcm_sf2_sw_probe(struct platf
+@@ -1543,10 +1543,14 @@ static int bcm_sf2_sw_probe(struct platf
rev = reg_readl(priv, REG_PHY_REVISION);
priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK;
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
-@@ -1553,6 +1553,12 @@ static int bcm_sf2_sw_probe(struct platf
+@@ -1557,6 +1557,12 @@ static int bcm_sf2_sw_probe(struct platf
priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff,
priv->irq0, priv->irq1);
};
/* Uart divisor latch read */
-@@ -2835,6 +2843,12 @@ serial8250_do_set_termios(struct uart_po
+@@ -2841,6 +2849,12 @@ serial8250_do_set_termios(struct uart_po
serial8250_set_divisor(port, baud, quot, frac);
brcmnand_set_ecc_enabled(host, 1);
return ret;
}
-@@ -2363,13 +2355,10 @@ static int brcmnand_write_page(struct na
+@@ -2361,13 +2353,10 @@ static int brcmnand_write_page(struct na
int oob_required, int page)
{
struct mtd_info *mtd = nand_to_mtd(chip);
}
static int brcmnand_write_page_raw(struct nand_chip *chip, const uint8_t *buf,
-@@ -2381,9 +2370,8 @@ static int brcmnand_write_page_raw(struc
+@@ -2379,9 +2368,8 @@ static int brcmnand_write_page_raw(struc
u64 addr = (u64)page << chip->page_shift;
int ret = 0;
/* EDU info, per-transaction */
const u16 *edu_offsets;
void __iomem *edu_base;
-@@ -2478,18 +2509,190 @@ static int brcmnand_op_is_reset(const st
+@@ -2476,18 +2507,190 @@ static int brcmnand_op_is_reset(const st
return 0;
}
if (brcmnand_op_is_status(op)) {
status = op->instrs[1].ctx.data.buf.in;
-@@ -2513,11 +2716,7 @@ static int brcmnand_exec_op(struct nand_
+@@ -2511,11 +2714,7 @@ static int brcmnand_exec_op(struct nand_
if (op->deassert_wp)
brcmnand_wp(mtd, 0);
if (op->deassert_wp)
brcmnand_wp(mtd, 1);
-@@ -3130,6 +3329,15 @@ int brcmnand_probe(struct platform_devic
+@@ -3128,6 +3327,15 @@ int brcmnand_probe(struct platform_devic
if (ret)
goto err;
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
-@@ -7070,6 +7070,9 @@ static int igc_probe(struct pci_dev *pde
+@@ -7074,6 +7074,9 @@ static int igc_probe(struct pci_dev *pde
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
NETDEV_XDP_ACT_XSK_ZEROCOPY;
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
-@@ -3387,11 +3387,17 @@ static int of_phy_led(struct phy_device
+@@ -3382,11 +3382,17 @@ static int of_phy_led(struct phy_device
if (index > U8_MAX)
return -EINVAL;
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -2063,7 +2063,7 @@ config PADATA
+@@ -2066,7 +2066,7 @@ config PADATA
bool
config ASN1
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -1687,6 +1687,7 @@ enum netdev_priv_flags {
+@@ -1689,6 +1689,7 @@ enum netdev_priv_flags {
IFF_L3MDEV_RX_HANDLER = 1<<29,
IFF_NO_ADDRCONF = BIT_ULL(30),
IFF_TX_SKB_NO_LINEAR = BIT_ULL(31),
};
/* Specifies the type of the struct net_device::ml_priv pointer */
-@@ -2168,6 +2169,11 @@ struct net_device {
+@@ -2170,6 +2171,11 @@ struct net_device {
const struct tlsdev_ops *tlsdev_ops;
#endif
unsigned int operstate;
unsigned char link_mode;
-@@ -2237,6 +2243,10 @@ struct net_device {
+@@ -2239,6 +2245,10 @@ struct net_device {
struct mctp_dev __rcu *mctp_ptr;
#endif
-LINUX_VERSION-6.12 = .77
-LINUX_KERNEL_HASH-6.12.77 = 358836ebe5caef41e7ae9492e7fbcdf5be6e53ee43c99752aebda81e1b2cff67
+LINUX_VERSION-6.12 = .78
+LINUX_KERNEL_HASH-6.12.78 = 719781b4b4faececa0f568bbcbd4fea8f4aef40155e85ad66f61624bf2f4af3d
--- a/Makefile
+++ b/Makefile
-@@ -589,7 +589,7 @@ export RUSTC_BOOTSTRAP := 1
+@@ -590,7 +590,7 @@ export RUSTC_BOOTSTRAP := 1
# Allows finding `.clippy.toml` in out-of-srctree builds.
export CLIPPY_CONF_DIR := $(srctree)
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -1534,6 +1534,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
+@@ -1537,6 +1537,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
the unaligned access emulation.
see arch/parisc/kernel/unaligned.c for reference
return !!nor->params->erase_map.uniform_region.erase_mask;
}
-@@ -2516,6 +2518,7 @@ static int spi_nor_select_erase(struct s
+@@ -2657,6 +2659,7 @@ static int spi_nor_select_erase(struct s
{
struct spi_nor_erase_map *map = &nor->params->erase_map;
const struct spi_nor_erase_type *erase = NULL;
struct mtd_info *mtd = &nor->mtd;
int i;
-@@ -2542,8 +2545,9 @@ static int spi_nor_select_erase(struct s
+@@ -2683,8 +2686,9 @@ static int spi_nor_select_erase(struct s
*/
for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) {
if (map->erase_type[i].size) {
}
}
-@@ -2551,6 +2555,9 @@ static int spi_nor_select_erase(struct s
+@@ -2692,6 +2696,9 @@ static int spi_nor_select_erase(struct s
return -EINVAL;
mtd->erasesize = erase->size;
+++ /dev/null
-From patchwork Fri Mar 6 12:29:55 2026
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 8bit
-X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?=
- <noltari@gmail.com>
-X-Patchwork-Id: 14457090
-X-Patchwork-Delegate: kuba@kernel.org
-Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com
- [209.85.221.48])
- (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
- (No client certificate requested)
- by smtp.subspace.kernel.org (Postfix) with ESMTPS id AF3F4386459
- for <netdev@vger.kernel.org>; Fri, 6 Mar 2026 12:52:18 +0000 (UTC)
-Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=209.85.221.48
-ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
- t=1772801540; cv=none;
- b=LVeywxv8ajenPZ8Kr1arieKosbrf60O9l+ouIPKPFNt5btxWDZ59pIU9BfZjv5n9ifEOyUA/UD0phxnG77+oB/k6UCd7DdGQQASZB3NHq5cvmErbgXm0XG3C8BBxVXU5pF7atPS23kBqM9ptxsv3IaeH/fDFcj6k6SH61rGEpuQ=
-ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
- s=arc-20240116; t=1772801540; c=relaxed/simple;
- bh=HAy43ssDo0xlUcBDIU7vQZtNnpxG03JPCL6Ldi51ASI=;
- h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type;
- b=OBk8kI0I91psFRaIxb6nCnAzQlsc7jrXkOPW8lL7cYCosY08yfQDwAlWBFfdFs/VDuVJjD5VEdeQeMt2K4kWGgjLNXhTrRqgs6JNe7PxALDJKvt+kcJ833TRz3hKl2eb2Ft6WnKPf/6hp5Q3qm8+/Q703ixD4sF/0aDNw1BrDY4=
-ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
- dmarc=pass (p=none dis=none) header.from=gmail.com;
- spf=pass smtp.mailfrom=gmail.com;
- dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com
- header.b=RCEse1HL; arc=none smtp.client-ip=209.85.221.48
-Authentication-Results: smtp.subspace.kernel.org;
- dmarc=pass (p=none dis=none) header.from=gmail.com
-Authentication-Results: smtp.subspace.kernel.org;
- spf=pass smtp.mailfrom=gmail.com
-Authentication-Results: smtp.subspace.kernel.org;
- dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com
- header.b="RCEse1HL"
-Received: by mail-wr1-f48.google.com with SMTP id
- ffacd0b85a97d-439b7c2788dso4008389f8f.1
- for <netdev@vger.kernel.org>; Fri, 06 Mar 2026 04:52:18 -0800 (PST)
-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
- d=gmail.com; s=20230601; t=1772801537; x=1773406337;
- darn=vger.kernel.org;
- h=content-transfer-encoding:mime-version:message-id:date:subject:cc
- :to:from:from:to:cc:subject:date:message-id:reply-to;
- bh=y8B8kg8ACcCsMXy3SgsyRYngVEpIsqkcoCsLOS/nNqQ=;
- b=RCEse1HLoUtQApOdbPXFvYItGrEKWhMZ5FH1L4npAxteGeWOhAEAekijg3Ur83ovNu
- D7j0Aio5nwazNQz3y4rO88a+svlEbLx5fyxypjkMFUV4PDnOpv7HYjT9Aw1NVdIwO6l+
- sTgZ1jssfWdVnLQwQe6naotyBRoBV2AugdTmASE0Okxrsi3juIOafyTCxnp4K0weRpaH
- XodiSWNrkHzZSWM6/wl3D42yExGGPiuDybF+9otR/5TaBWNzrcLkSb73hvP6va35kQWK
- mnp6OV+L7iHTbxYpTfTm4axD+IZ/Q/dtFxxA6XolA28oMQbRPK0SIHepheSZx4bgl64w
- FM4w==
-X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
- d=1e100.net; s=20230601; t=1772801537; x=1773406337;
- h=content-transfer-encoding:mime-version:message-id:date:subject:cc
- :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
- :message-id:reply-to;
- bh=y8B8kg8ACcCsMXy3SgsyRYngVEpIsqkcoCsLOS/nNqQ=;
- b=KomubXrbvHQI4WbFxBztyfrvNNRRWm7V46yQSwx0bP8PXKIJP38kAYzK+ZKWhmcd7e
- LpS7422VcYyLywLRxlevD2YaXsF0CK6e00YpTtixakHxYs/4KxGaU21vfwYV8mRhfu7g
- HVmxKvNQ6DTdC7wAIGT6TrcZCK4VCvgCx3z9yC62hQc8C6w+9mDnnGPvXNR74ofvvXdC
- eVZjm56layRoEr4PTpR2F33OVSt8+HRikH7eBzIKtQ5n/lEKtmJKDHRaodAaCyFGWMWa
- qDVoOR8VI4NIJABfsOT6OqisXLPLf+jkKpGkCY2ioRPRKK9GzW4PgIuNcKvPQilQQkgD
- Xlnw==
-X-Forwarded-Encrypted: i=1;
- AJvYcCVcziiSg1n0cDakmiQXH3869FECP24dcIqrZzs8zKakP+vHT958hnq9Bp0alDnLeVtXgo0B8T4=@vger.kernel.org
-X-Gm-Message-State: AOJu0Yx2OF1e3PiuR4Zqpe9qXA6kz6T2CCtro6kv8eL2j4Zh2HCjWywo
- /rZTavazOZRoq7zTvc4fGZ/yupjkTT9xRPZCKRkM9pc0UuK/KDSP4pan
-X-Gm-Gg: ATEYQzx75s3OlYg8XKMgu042++2+ZPa/CZDw09DYtnwEHHBsuylQF0+eXzcFM166JtP
- EMuM6Nq/sGQx2WNTPNEyu1BRGci/SV005CzkExhd1KK52D/nC1c76MBxvAtioaI/+5tgNoyCg8v
- ZFRyiqDReKfJ6JHa3YRI213dTzMluN1sZTYNSqlWI1MwW66gaDCf0myU81ehAfiAff34wmxnm8C
- PUF0YrLYtgZl1I/ZcYM1npoL3PBOnrhaulSqhbn7S5NaZMkHLrNQm6ns1lof+7Ciju05dQpEcBe
- pumVg15Dy+PcSXQSSQt4CULH7bbuJvZ0PHJ7dS+74i/OqFSgxD4E7LCqM5ufHYdbESx0/ERaR/z
- CAyT3oTz6S1oMQCUTPevHjHjTbDOWhu74SqyTZETzwGnjZnfrPMa56ebQVRfYgOYW0bbx6j3O2M
- v3CSEBiXpdFTdaLuRcqIb56JeDryaHx87SOThqnYP6gMiu7EljKYIhr572Rpgz+UIRkrYyNjL9c
- BLmrcmhsXX4hU4X5KocoApkO04w
-X-Received: by 2002:a05:600c:8b8b:b0:483:103c:b1ee with SMTP id
- 5b1f17b1804b1-48526922599mr34173745e9.8.1772801536778;
- Fri, 06 Mar 2026 04:52:16 -0800 (PST)
-Received: from skynet.lan
- (2a02-9142-4581-3c00-0000-0000-0000-0008.red-2a02-914.customerbaf.ipv6.rima-tde.net.
- [2a02:9142:4581:3c00::8])
- by smtp.gmail.com with ESMTPSA id
- 5b1f17b1804b1-48527681a3esm76085715e9.4.2026.03.06.04.52.14
- (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
- Fri, 06 Mar 2026 04:52:15 -0800 (PST)
-From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= <noltari@gmail.com>
-To: linux@armlinux.org.uk,
- andrew@lunn.ch,
- hkallweit1@gmail.com,
- davem@davemloft.net,
- edumazet@google.com,
- kuba@kernel.org,
- pabeni@redhat.com,
- mnhagan88@gmail.com,
- netdev@vger.kernel.org,
- linux-kernel@vger.kernel.org
-Cc: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= <noltari@gmail.com>
-Subject: [PATCH net v3] net: sfp: improve Huawei MA5671a fixup
-Date: Fri, 6 Mar 2026 13:29:55 +0100
-Message-ID: <20260306125139.213637-1-noltari@gmail.com>
-X-Mailer: git-send-email 2.47.3
-Precedence: bulk
-X-Mailing-List: netdev@vger.kernel.org
-List-Id: <netdev.vger.kernel.org>
-List-Subscribe: <mailto:netdev+subscribe@vger.kernel.org>
-List-Unsubscribe: <mailto:netdev+unsubscribe@vger.kernel.org>
-MIME-Version: 1.0
-X-Patchwork-Delegate: kuba@kernel.org
-
-With the current sfp_fixup_ignore_tx_fault() fixup we ignore the TX_FAULT
-signal, but we also need to apply sfp_fixup_ignore_los() in order to be
-able to communicate with the module even if the fiber isn't connected for
-configuration purposes.
-This is needed for all the MA5671a firmwares, excluding the FS modded
-firmware.
-
-Fixes: 2069624dac19 ("net: sfp: Add tx-fault workaround for Huawei MA5671A SFP ONT")
-Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
----
- v3: avoid using a vendor name in the function
- v2: rebase on top of net/main instead of linux/master
-
- drivers/net/phy/sfp.c | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -360,6 +360,12 @@ static void sfp_fixup_ignore_tx_fault(st
- sfp->state_ignore_mask |= SFP_F_TX_FAULT;
- }
-
-+static void sfp_fixup_ignore_tx_fault_and_los(struct sfp *sfp)
-+{
-+ sfp_fixup_ignore_tx_fault(sfp);
-+ sfp_fixup_ignore_los(sfp);
-+}
-+
- static void sfp_fixup_ignore_hw(struct sfp *sfp, unsigned int mask)
- {
- sfp->state_hw_mask &= ~mask;
-@@ -523,7 +529,7 @@ static const struct sfp_quirk sfp_quirks
- // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd NRZ in
- // their EEPROM
- SFP_QUIRK("HUAWEI", "MA5671A", sfp_quirk_2500basex,
-- sfp_fixup_ignore_tx_fault),
-+ sfp_fixup_ignore_tx_fault_and_los),
-
- // Lantech 8330-262D-E and 8330-265D can operate at 2500base-X, but
- // incorrectly report 2500MBd NRZ in their EEPROM.
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
-@@ -8724,7 +8724,7 @@ static int nft_register_flowtable_net_ho
+@@ -8722,7 +8722,7 @@ static int nft_register_flowtable_net_ho
err = flowtable->data.type->setup(&flowtable->data,
hook->ops.dev,
FLOW_BLOCK_BIND);
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
-@@ -2037,6 +2037,9 @@ void phy_detach(struct phy_device *phyde
+@@ -2035,6 +2035,9 @@ void phy_detach(struct phy_device *phyde
phydev->devlink = NULL;
}
+++ /dev/null
-From 5225349f1e750dfd107a4c5dc97d91fa212dc1ed Mon Sep 17 00:00:00 2001
-From: Andrew Lunn <andrew@lunn.ch>
-Date: Sat, 21 Feb 2026 14:51:54 -0600
-Subject: [PATCH] net: phy: register phy led_triggers during probe to avoid
- AB-BA deadlock
-
-There is an AB-BA deadlock when both LEDS_TRIGGER_NETDEV and
-LED_TRIGGER_PHY are enabled:
-
-[ 1362.049207] [<8054e4b8>] led_trigger_register+0x5c/0x1fc <-- Trying to get lock "triggers_list_lock" via down_write(&triggers_list_lock);
-[ 1362.054536] [<80662830>] phy_led_triggers_register+0xd0/0x234
-[ 1362.060329] [<8065e200>] phy_attach_direct+0x33c/0x40c
-[ 1362.065489] [<80651fc4>] phylink_fwnode_phy_connect+0x15c/0x23c
-[ 1362.071480] [<8066ee18>] mtk_open+0x7c/0xba0
-[ 1362.075849] [<806d714c>] __dev_open+0x280/0x2b0
-[ 1362.080384] [<806d7668>] __dev_change_flags+0x244/0x24c
-[ 1362.085598] [<806d7698>] dev_change_flags+0x28/0x78
-[ 1362.090528] [<807150e4>] dev_ioctl+0x4c0/0x654 <-- Hold lock "rtnl_mutex" by calling rtnl_lock();
-[ 1362.094985] [<80694360>] sock_ioctl+0x2f4/0x4e0
-[ 1362.099567] [<802e9c4c>] sys_ioctl+0x32c/0xd8c
-[ 1362.104022] [<80014504>] syscall_common+0x34/0x58
-
-Here LED_TRIGGER_PHY is registering LED triggers during phy_attach
-while holding RTNL and then taking triggers_list_lock.
-
-[ 1362.191101] [<806c2640>] register_netdevice_notifier+0x60/0x168 <-- Trying to get lock "rtnl_mutex" via rtnl_lock();
-[ 1362.197073] [<805504ac>] netdev_trig_activate+0x194/0x1e4
-[ 1362.202490] [<8054e28c>] led_trigger_set+0x1d4/0x360 <-- Hold lock "triggers_list_lock" by down_read(&triggers_list_lock);
-[ 1362.207511] [<8054eb38>] led_trigger_write+0xd8/0x14c
-[ 1362.212566] [<80381d98>] sysfs_kf_bin_write+0x80/0xbc
-[ 1362.217688] [<8037fcd8>] kernfs_fop_write_iter+0x17c/0x28c
-[ 1362.223174] [<802cbd70>] vfs_write+0x21c/0x3c4
-[ 1362.227712] [<802cc0c4>] ksys_write+0x78/0x12c
-[ 1362.232164] [<80014504>] syscall_common+0x34/0x58
-
-Here LEDS_TRIGGER_NETDEV is being enabled on an LED. It first takes
-triggers_list_lock and then RTNL. A classical AB-BA deadlock.
-
-phy_led_triggers_registers() does not require the RTNL, it does not
-make any calls into the network stack which require protection. There
-is also no requirement the PHY has been attached to a MAC, the
-triggers only make use of phydev state. This allows the call to
-phy_led_triggers_registers() to be placed elsewhere. PHY probe() and
-release() don't hold RTNL, so solving the AB-BA deadlock.
-
-Reported-by: Shiji Yang <yangshiji66@outlook.com>
-Closes: https://lore.kernel.org/all/OS7PR01MB13602B128BA1AD3FA38B6D1FFBC69A@OS7PR01MB13602.jpnprd01.prod.outlook.com/
-Fixes: 06f502f57d0d ("leds: trigger: Introduce a NETDEV trigger")
-Signed-off-by: Andrew Lunn <andrew@lunn.ch>
----
- drivers/net/phy/phy_device.c | 25 +++++++++++++++++--------
- 1 file changed, 17 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1684,8 +1684,6 @@ int phy_attach_direct(struct net_device
- goto error;
-
- phy_resume(phydev);
-- if (!phydev->is_on_sfp_module)
-- phy_led_triggers_register(phydev);
-
- /**
- * If the external phy used by current mac interface is managed by
-@@ -2058,9 +2056,6 @@ void phy_detach(struct phy_device *phyde
- }
- phydev->phylink = NULL;
-
-- if (!phydev->is_on_sfp_module)
-- phy_led_triggers_unregister(phydev);
--
- if (phydev->mdio.dev.driver)
- module_put(phydev->mdio.dev.driver->owner);
-
-@@ -3691,17 +3686,28 @@ static int phy_probe(struct device *dev)
- /* Set the state to READY by default */
- phydev->state = PHY_READY;
-
-+ /* Register the PHY LED triggers */
-+ if (!phydev->is_on_sfp_module)
-+ phy_led_triggers_register(phydev);
-+
- /* Get the LEDs from the device tree, and instantiate standard
- * LEDs for them.
- */
- if (IS_ENABLED(CONFIG_PHYLIB_LEDS) && !phy_driver_is_genphy(phydev) &&
-- !phy_driver_is_genphy_10g(phydev))
-+ !phy_driver_is_genphy_10g(phydev)) {
- err = of_phy_leds(phydev);
-+ if (err)
-+ goto out;
-+ }
-+
-+ return 0;
-
- out:
-+ if (!phydev->is_on_sfp_module)
-+ phy_led_triggers_unregister(phydev);
-+
- /* Re-assert the reset signal on error */
-- if (err)
-- phy_device_reset(phydev, 1);
-+ phy_device_reset(phydev, 1);
-
- return err;
- }
-@@ -3716,6 +3722,9 @@ static int phy_remove(struct device *dev
- !phy_driver_is_genphy_10g(phydev))
- phy_leds_unregister(phydev);
-
-+ if (!phydev->is_on_sfp_module)
-+ phy_led_triggers_unregister(phydev);
-+
- phydev->state = PHY_DOWN;
-
- sfp_bus_del_upstream(phydev->sfp_bus);
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -2224,7 +2224,7 @@ struct net_device {
+@@ -2226,7 +2226,7 @@ struct net_device {
#if IS_ENABLED(CONFIG_AX25)
struct ax25_dev __rcu *ax25_ptr;
#endif
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
-@@ -832,6 +832,19 @@ dsa_tree_offloads_bridge_dev(struct dsa_
+@@ -833,6 +833,19 @@ dsa_tree_offloads_bridge_dev(struct dsa_
return false;
}
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
-@@ -832,15 +832,18 @@ dsa_tree_offloads_bridge_dev(struct dsa_
+@@ -833,15 +833,18 @@ dsa_tree_offloads_bridge_dev(struct dsa_
return false;
}
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
-@@ -1185,6 +1185,9 @@ struct dsa_switch_ops {
+@@ -1186,6 +1186,9 @@ struct dsa_switch_ops {
int (*devlink_info_get)(struct dsa_switch *ds,
struct devlink_info_req *req,
struct netlink_ext_ack *extack);
/**
* ata_build_rw_tf - Build ATA taskfile for given read/write request
* @qc: Metadata associated with the taskfile to build
-@@ -4807,6 +4818,9 @@ void __ata_qc_complete(struct ata_queued
+@@ -4812,6 +4823,9 @@ void __ata_qc_complete(struct ata_queued
link->active_tag = ATA_TAG_POISON;
ap->nr_active_links--;
}
/* clear exclusive status */
if (unlikely(qc->flags & ATA_QCFLAG_CLEAR_EXCL &&
-@@ -5536,6 +5550,9 @@ struct ata_port *ata_port_alloc(struct a
+@@ -5541,6 +5555,9 @@ struct ata_port *ata_port_alloc(struct a
ap->stats.unhandled_irq = 1;
ap->stats.idle_irq = 1;
#endif
ata_sff_port_init(ap);
ata_force_pflags(ap);
-@@ -5552,6 +5569,12 @@ void ata_port_free(struct ata_port *ap)
+@@ -5557,6 +5574,12 @@ void ata_port_free(struct ata_port *ap)
kfree(ap->pmp_link);
kfree(ap->slave_link);
ida_free(&ata_ida, ap->print_id);
kfree(ap);
}
EXPORT_SYMBOL_GPL(ata_port_free);
-@@ -5956,7 +5979,23 @@ int ata_host_register(struct ata_host *h
+@@ -5961,7 +5984,23 @@ int ata_host_register(struct ata_host *h
WARN_ON(1);
return -EINVAL;
}
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -1888,6 +1888,15 @@ config ARCH_HAS_MEMBARRIER_CALLBACKS
+@@ -1891,6 +1891,15 @@ config ARCH_HAS_MEMBARRIER_CALLBACKS
config ARCH_HAS_MEMBARRIER_SYNC_CORE
bool
},
[PORT_NPCM] = {
.name = "Nuvoton 16550",
-@@ -2729,6 +2729,11 @@ serial8250_do_set_termios(struct uart_po
+@@ -2735,6 +2735,11 @@ serial8250_do_set_termios(struct uart_po
unsigned long flags;
unsigned int baud, quot, frac = 0;
--- a/drivers/mtd/spi-nor/core.c
+++ b/drivers/mtd/spi-nor/core.c
-@@ -3300,6 +3300,18 @@ static const struct flash_info *spi_nor_
+@@ -3441,6 +3441,18 @@ static const struct flash_info *spi_nor_
return NULL;
}
static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor,
const char *name)
{
-@@ -3474,6 +3486,9 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -3615,6 +3627,9 @@ int spi_nor_scan(struct spi_nor *nor, co
if (ret)
return ret;
* CONFIG_CMDLINE is meant to be a default in case nothing else
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
-@@ -2382,6 +2382,14 @@ config CMDLINE_FORCE
+@@ -2383,6 +2383,14 @@ config CMDLINE_FORCE
endchoice
--- a/drivers/i2c/busses/i2c-pxa.c
+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -1330,6 +1330,12 @@ static void i2c_pxa_unprepare_recovery(s
+@@ -1336,6 +1336,12 @@ static void i2c_pxa_unprepare_recovery(s
i2c_pxa_enable(i2c);
}
static int i2c_pxa_init_recovery(struct pxa_i2c *i2c)
{
struct i2c_bus_recovery_info *bri = &i2c->recovery;
-@@ -1398,6 +1404,7 @@ static int i2c_pxa_init_recovery(struct
+@@ -1404,6 +1410,7 @@ static int i2c_pxa_init_recovery(struct
return 0;
}
struct i2c_bus_recovery_info recovery;
struct pinctrl *pinctrl;
-@@ -429,7 +431,7 @@ static int i2c_pxa_wait_bus_not_busy(str
+@@ -430,7 +432,7 @@ static int i2c_pxa_wait_bus_not_busy(str
while (1) {
isr = readl(_ISR(i2c));
return 0;
if (isr & ISR_SAD)
-@@ -466,7 +468,7 @@ static int i2c_pxa_wait_master(struct px
+@@ -467,7 +469,7 @@ static int i2c_pxa_wait_master(struct px
* quick check of the i2c lines themselves to ensure they've
* gone high...
*/
readl(_IBMR(i2c)) == (IBMR_SCLS | IBMR_SDAS)) {
if (i2c_debug > 0)
dev_dbg(&i2c->adap.dev, "%s: done\n", __func__);
-@@ -487,7 +489,7 @@ static int i2c_pxa_set_master(struct pxa
+@@ -488,7 +490,7 @@ static int i2c_pxa_set_master(struct pxa
if (i2c_debug)
dev_dbg(&i2c->adap.dev, "setting to bus master\n");
dev_dbg(&i2c->adap.dev, "%s: unit is busy\n", __func__);
if (!i2c_pxa_wait_master(i2c)) {
dev_dbg(&i2c->adap.dev, "%s: error: unit busy\n", __func__);
-@@ -513,7 +515,7 @@ static int i2c_pxa_wait_slave(struct pxa
+@@ -514,7 +516,7 @@ static int i2c_pxa_wait_slave(struct pxa
dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n",
__func__, (long)jiffies, readl(_ISR(i2c)), readl(_ICR(i2c)), readl(_IBMR(i2c)));
(readl(_ISR(i2c)) & ISR_SAD) != 0 ||
(readl(_ICR(i2c)) & ICR_SCLE) == 0) {
if (i2c_debug > 1)
-@@ -1171,7 +1173,7 @@ static int i2c_pxa_pio_set_master(struct
+@@ -1177,7 +1179,7 @@ static int i2c_pxa_pio_set_master(struct
/*
* Wait for the bus to become free.
*/
udelay(1000);
if (timeout < 0) {
-@@ -1316,7 +1318,7 @@ static void i2c_pxa_unprepare_recovery(s
+@@ -1322,7 +1324,7 @@ static void i2c_pxa_unprepare_recovery(s
* handing control of the bus back to avoid the bus changing state.
*/
isr = readl(_ISR(i2c));
dev_dbg(&i2c->adap.dev,
"recovery: resetting controller, ISR=0x%08x\n", isr);
i2c_pxa_do_reset(i2c);
-@@ -1480,6 +1482,10 @@ static int i2c_pxa_probe(struct platform
+@@ -1486,6 +1488,10 @@ static int i2c_pxa_probe(struct platform
i2c->fm_mask = pxa_reg_layout[i2c_type].fm;
i2c->hs_mask = pxa_reg_layout[i2c_type].hs;
/**
* struct mii_bus - Represents an MDIO bus
-@@ -2277,6 +2278,11 @@ static inline bool phy_package_probe_onc
+@@ -2290,6 +2291,11 @@ static inline bool phy_package_probe_onc
return __phy_package_set_once(phydev, PHY_SHARED_F_PROBE_DONE);
}
struct dsa_chip_data {
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
-@@ -480,7 +480,7 @@ struct dsa_switch {
+@@ -481,7 +481,7 @@ struct dsa_switch {
/*
* User mii_bus and devices for the individual ports.
*/
struct mii_bus *user_mii_bus;
/* Ageing Time limits in msecs */
-@@ -616,24 +616,24 @@ static inline bool dsa_is_user_port(stru
+@@ -617,24 +617,24 @@ static inline bool dsa_is_user_port(stru
dsa_switch_for_each_port_continue_reverse((_dp), (_ds)) \
if (dsa_port_is_cpu((_dp)))
if (!page)
return false;
-@@ -3401,7 +3484,6 @@ static struct its_device *its_create_dev
+@@ -3402,7 +3485,6 @@ static struct its_device *its_create_dev
if (WARN_ON(!is_power_of_2(nvecs)))
nvecs = roundup_pow_of_two(nvecs);
/*
* Even if the device wants a single LPI, the ITT must be
* sized as a power of two (and you need at least one bit...).
-@@ -3409,7 +3491,11 @@ static struct its_device *its_create_dev
+@@ -3413,7 +3495,11 @@ static struct its_device *its_create_dev
nr_ites = max(2, nvecs);
sz = nr_ites * (FIELD_GET(GITS_TYPER_ITT_ENTRY_SIZE, its->typer) + 1);
sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1;
if (alloc_lpis) {
lpi_map = its_lpi_alloc(nvecs, &lpi_base, &nr_lpis);
if (lpi_map)
-@@ -3421,9 +3507,9 @@ static struct its_device *its_create_dev
+@@ -3425,9 +3511,9 @@ static struct its_device *its_create_dev
lpi_base = 0;
}
bitmap_free(lpi_map);
kfree(col_map);
return NULL;
-@@ -3433,6 +3519,7 @@ static struct its_device *its_create_dev
+@@ -3437,6 +3523,7 @@ static struct its_device *its_create_dev
dev->its = its;
dev->itt = itt;
dev->nr_ites = nr_ites;
dev->event_map.lpi_map = lpi_map;
dev->event_map.col_map = col_map;
-@@ -3460,7 +3547,7 @@ static void its_free_device(struct its_d
+@@ -3464,7 +3551,7 @@ static void its_free_device(struct its_d
list_del(&its_dev->entry);
raw_spin_unlock_irqrestore(&its_dev->its->lock, flags);
kfree(its_dev->event_map.col_map);
kfree(its_dev);
}
-@@ -5160,8 +5247,9 @@ static int __init its_probe_one(struct i
+@@ -5164,8 +5251,9 @@ static int __init its_probe_one(struct i
}
}
if (!page) {
err = -ENOMEM;
goto out_unmap_sgir;
-@@ -5225,7 +5313,7 @@ static int __init its_probe_one(struct i
+@@ -5229,7 +5317,7 @@ static int __init its_probe_one(struct i
out_free_tables:
its_free_tables(its);
out_free_cmd:
out_unmap_sgir:
if (its->sgir_base)
iounmap(its->sgir_base);
-@@ -5711,6 +5799,10 @@ int __init its_init(struct fwnode_handle
+@@ -5715,6 +5803,10 @@ int __init its_init(struct fwnode_handle
bool has_v4_1 = false;
int err;
+----------------+-----------------+-----------------+-----------------------------+
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
-@@ -1297,6 +1297,15 @@ config NVIDIA_CARMEL_CNP_ERRATUM
+@@ -1298,6 +1298,15 @@ config NVIDIA_CARMEL_CNP_ERRATUM
If unsure, say Y.
if (!page)
return NULL;
-@@ -4888,6 +4890,17 @@ static bool __maybe_unused its_enable_qu
+@@ -4892,6 +4894,17 @@ static bool __maybe_unused its_enable_qu
return true;
}
static const struct gic_quirk its_quirks[] = {
#ifdef CONFIG_CAVIUM_ERRATUM_22375
{
-@@ -4955,6 +4968,14 @@ static const struct gic_quirk its_quirks
+@@ -4959,6 +4972,14 @@ static const struct gic_quirk its_quirks
.property = "dma-noncoherent",
.init = its_set_non_coherent,
},
}
/*
-@@ -2768,7 +2781,6 @@ serial8250_do_set_termios(struct uart_po
+@@ -2774,7 +2787,6 @@ serial8250_do_set_termios(struct uart_po
if (termios->c_cflag & CRTSCTS)
up->mcr |= UART_MCR_AFE;
}
if (priv->dma_cap.host_dma_width <= 32)
gfp |= GFP_DMA32;
-@@ -4791,7 +4791,7 @@ static inline void stmmac_rx_refill(stru
+@@ -4756,7 +4756,7 @@ static inline void stmmac_rx_refill(stru
struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue];
int dirty = stmmac_rx_dirty(priv, queue);
unsigned int entry = rx_q->dirty_rx;