-LINUX_VERSION-6.1 = .89
-LINUX_KERNEL_HASH-6.1.89 = 12bab8e092618d1d4eeaf4201e6e70054c94896198956bd84ff0e908b0264719
+LINUX_VERSION-6.1 = .92
+LINUX_KERNEL_HASH-6.1.92 = 9019f427bfdc9ced5bc954d760d37ac08c0cdffb45ad28087fc45a73e64336c9
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
-@@ -290,9 +290,7 @@ int bcmgenet_mii_probe(struct net_device
+@@ -303,9 +303,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;
}
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
-@@ -5697,7 +5697,7 @@ static void port_event(struct usb_hub *h
+@@ -5698,7 +5698,7 @@ static void port_event(struct usb_hub *h
port_dev->over_current_count++;
port_over_current_notify(port_dev);
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-@@ -2659,7 +2659,7 @@ static void bcmgenet_init_tx_ring(struct
+@@ -2665,7 +2665,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);
-@@ -4140,9 +4140,12 @@ static int bcmgenet_probe(struct platfor
+@@ -4160,9 +4160,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
-@@ -296,6 +296,8 @@ int bcmgenet_mii_probe(struct net_device
+@@ -309,6 +309,8 @@ int bcmgenet_mii_probe(struct net_device
/* Communicate the integrated PHY revision */
if (priv->internal_phy)
phy_flags = priv->gphy_rev;
static inline void bcmgenet_writel(u32 value, void __iomem *offset)
{
-@@ -2490,6 +2493,11 @@ static void reset_umac(struct bcmgenet_p
+@@ -2494,6 +2497,11 @@ static void reset_umac(struct bcmgenet_p
bcmgenet_rbuf_ctrl_set(priv, 0);
udelay(10);
+ }
+
/* issue soft reset and disable MAC while updating its registers */
+ spin_lock_bh(&priv->reg_lock);
bcmgenet_umac_writel(priv, CMD_SW_RESET, UMAC_CMD);
- udelay(2);
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
-@@ -3679,6 +3679,7 @@ static int spi_set_cs_timing(struct spi_
+@@ -3690,6 +3690,7 @@ static int spi_set_cs_timing(struct spi_
*/
int spi_setup(struct spi_device *spi)
{
unsigned bad_bits, ugly_bits;
int status = 0;
-@@ -3699,6 +3700,14 @@ int spi_setup(struct spi_device *spi)
+@@ -3710,6 +3711,14 @@ int spi_setup(struct spi_device *spi)
(SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL)))
return -EINVAL;
+++ /dev/null
-From e857a27d5bca6269cea7a0ca0058aa8fffe90a83 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.com>
-Date: Fri, 25 Sep 2020 15:07:23 +0100
-Subject: [PATCH] net: bcmgenet: Reset RBUF on first open
-
-If the RBUF logic is not reset when the kernel starts then there
-may be some data left over from any network boot loader. If the
-64-byte packet headers are enabled then this can be fatal.
-
-Extend bcmgenet_dma_disable to do perform the reset, but not when
-called from bcmgenet_resume in order to preserve a wake packet.
-
-N.B. This different handling of resume is just based on a hunch -
-why else wouldn't one reset the RBUF as well as the TBUF? If this
-isn't the case then it's easy to change the patch to make the RBUF
-reset unconditional.
-
-See: https://github.com/raspberrypi/linux/issues/3850
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.com>
----
- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 16 ++++++++++++----
- 1 file changed, 12 insertions(+), 4 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-@@ -3306,7 +3306,7 @@ static void bcmgenet_get_hw_addr(struct
- }
-
- /* Returns a reusable dma control register value */
--static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv)
-+static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx)
- {
- unsigned int i;
- u32 reg;
-@@ -3331,6 +3331,14 @@ static u32 bcmgenet_dma_disable(struct b
- udelay(10);
- bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH);
-
-+ if (flush_rx) {
-+ reg = bcmgenet_rbuf_ctrl_get(priv);
-+ bcmgenet_rbuf_ctrl_set(priv, reg | BIT(0));
-+ udelay(10);
-+ bcmgenet_rbuf_ctrl_set(priv, reg);
-+ udelay(10);
-+ }
-+
- return dma_ctrl;
- }
-
-@@ -3394,8 +3402,8 @@ static int bcmgenet_open(struct net_devi
-
- bcmgenet_set_hw_addr(priv, dev->dev_addr);
-
-- /* Disable RX/TX DMA and flush TX queues */
-- dma_ctrl = bcmgenet_dma_disable(priv);
-+ /* Disable RX/TX DMA and flush TX and RX queues */
-+ dma_ctrl = bcmgenet_dma_disable(priv, true);
-
- /* Reinitialize TDMA and RDMA and SW housekeeping */
- ret = bcmgenet_init_dma(priv);
-@@ -4269,7 +4277,7 @@ static int bcmgenet_resume(struct device
- bcmgenet_hfb_create_rxnfc_filter(priv, rule);
-
- /* Disable RX/TX DMA and flush TX queues */
-- dma_ctrl = bcmgenet_dma_disable(priv);
-+ dma_ctrl = bcmgenet_dma_disable(priv, false);
-
- /* Reinitialize TDMA and RDMA and SW housekeeping */
- ret = bcmgenet_init_dma(priv);
static inline void bcmgenet_writel(u32 value, void __iomem *offset)
{
-@@ -3440,6 +3443,17 @@ static int bcmgenet_open(struct net_devi
+@@ -3448,6 +3451,17 @@ static int bcmgenet_open(struct net_devi
bcmgenet_phy_pause_set(dev, priv->rx_pause, priv->tx_pause);
},
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
-@@ -1179,6 +1179,24 @@ static void dwc3_config_threshold(struct
+@@ -1180,6 +1180,24 @@ static void dwc3_config_threshold(struct
}
}
/**
* dwc3_core_init - Low-level initialization of DWC3 Core
* @dwc: Pointer to our controller context structure
-@@ -1271,6 +1289,8 @@ static int dwc3_core_init(struct dwc3 *d
+@@ -1257,6 +1275,8 @@ static int dwc3_core_init(struct dwc3 *d
dwc3_set_incr_burst_type(dwc);
usb_phy_set_suspend(dwc->usb2_phy, 0);
usb_phy_set_suspend(dwc->usb3_phy, 0);
ret = phy_power_on(dwc->usb2_generic_phy);
-@@ -1504,6 +1524,7 @@ static void dwc3_get_properties(struct d
+@@ -1490,6 +1510,7 @@ static void dwc3_get_properties(struct d
u8 tx_thr_num_pkt_prd = 0;
u8 tx_max_burst_prd = 0;
u8 tx_fifo_resize_max_num;
const char *usb_psy_name;
int ret;
-@@ -1526,6 +1547,9 @@ static void dwc3_get_properties(struct d
+@@ -1512,6 +1533,9 @@ static void dwc3_get_properties(struct d
*/
tx_fifo_resize_max_num = 6;
dwc->maximum_speed = usb_get_maximum_speed(dev);
dwc->max_ssp_rate = usb_get_maximum_ssp_rate(dev);
dwc->dr_mode = usb_get_dr_mode(dev);
-@@ -1641,6 +1665,9 @@ static void dwc3_get_properties(struct d
+@@ -1627,6 +1651,9 @@ static void dwc3_get_properties(struct d
dwc->dis_split_quirk = device_property_read_bool(dev,
"snps,dis-split-quirk");
dwc->lpm_nyet_threshold = lpm_nyet_threshold;
dwc->tx_de_emphasis = tx_de_emphasis;
-@@ -1658,6 +1685,8 @@ static void dwc3_get_properties(struct d
+@@ -1644,6 +1671,8 @@ static void dwc3_get_properties(struct d
dwc->tx_thr_num_pkt_prd = tx_thr_num_pkt_prd;
dwc->tx_max_burst_prd = tx_max_burst_prd;
dwc->imod_interval = 0;
dwc->tx_fifo_resize_max_num = tx_fifo_resize_max_num;
-@@ -1866,6 +1895,12 @@ static int dwc3_probe(struct platform_de
+@@ -1852,6 +1881,12 @@ static int dwc3_probe(struct platform_de
dwc3_get_properties(dwc);
--- a/drivers/usb/dwc3/host.c
+++ b/drivers/usb/dwc3/host.c
-@@ -30,10 +30,10 @@ static void dwc3_host_fill_xhci_irq_res(
+@@ -51,10 +51,10 @@ static void dwc3_host_fill_xhci_irq_res(
static int dwc3_host_get_irq(struct dwc3 *dwc)
{
if (irq > 0) {
dwc3_host_fill_xhci_irq_res(dwc, irq, "host");
goto out;
-@@ -42,7 +42,7 @@ static int dwc3_host_get_irq(struct dwc3
+@@ -63,7 +63,7 @@ static int dwc3_host_get_irq(struct dwc3
if (irq == -EPROBE_DEFER)
goto out;
if (irq > 0) {
dwc3_host_fill_xhci_irq_res(dwc, irq, "dwc_usb3");
goto out;
-@@ -51,7 +51,7 @@ static int dwc3_host_get_irq(struct dwc3
+@@ -72,7 +72,7 @@ static int dwc3_host_get_irq(struct dwc3
if (irq == -EPROBE_DEFER)
goto out;
if (irq > 0) {
dwc3_host_fill_xhci_irq_res(dwc, irq, NULL);
goto out;
-@@ -66,16 +66,23 @@ out:
+@@ -87,16 +87,23 @@ out:
int dwc3_host_init(struct dwc3 *dwc)
{
#include <linux/uaccess.h>
#include <asm/io.h>
-@@ -2249,6 +2251,69 @@ static void b44_adjust_link(struct net_d
+@@ -2251,6 +2253,69 @@ static void b44_adjust_link(struct net_d
}
}
static int b44_register_phy_one(struct b44 *bp)
{
__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
-@@ -2285,6 +2350,9 @@ static int b44_register_phy_one(struct b
+@@ -2287,6 +2352,9 @@ static int b44_register_phy_one(struct b
if (!mdiobus_is_registered_device(bp->mii_bus, bp->phy_addr) &&
(sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
dev_info(sdev->dev,
"could not find PHY at %i, use fixed one\n",
bp->phy_addr);
-@@ -2479,6 +2547,7 @@ static void b44_remove_one(struct ssb_de
+@@ -2481,6 +2549,7 @@ static void b44_remove_one(struct ssb_de
unregister_netdev(dev);
if (bp->flags & B44_FLAG_EXTERNAL_PHY)
b44_unregister_phy_one(bp);
if (bp->flags & B44_FLAG_EXTERNAL_PHY)
return 0;
-@@ -2179,6 +2204,8 @@ static int b44_get_invariants(struct b44
+@@ -2181,6 +2206,8 @@ static int b44_get_invariants(struct b44
* valid PHY address. */
bp->phy_addr &= 0x1F;
+++ /dev/null
-From: Richard Gobert <richardbgobert@gmail.com>
-Date: Tue, 30 Apr 2024 16:35:55 +0200
-Subject: [PATCH] net: gro: add flush check in udp_gro_receive_segment
-
-GRO-GSO path is supposed to be transparent and as such L3 flush checks are
-relevant to all UDP flows merging in GRO. This patch uses the same logic
-and code from tcp_gro_receive, terminating merge if flush is non zero.
-
-Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.")
-Signed-off-by: Richard Gobert <richardbgobert@gmail.com>
-Reviewed-by: Willem de Bruijn <willemb@google.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
----
-
---- a/net/ipv4/udp_offload.c
-+++ b/net/ipv4/udp_offload.c
-@@ -463,6 +463,7 @@ static struct sk_buff *udp_gro_receive_s
- struct sk_buff *p;
- unsigned int ulen;
- int ret = 0;
-+ int flush;
-
- /* requires non zero csum, for symmetry with GSO */
- if (!uh->check) {
-@@ -496,13 +497,22 @@ static struct sk_buff *udp_gro_receive_s
- return p;
- }
-
-+ flush = NAPI_GRO_CB(p)->flush;
-+
-+ if (NAPI_GRO_CB(p)->flush_id != 1 ||
-+ NAPI_GRO_CB(p)->count != 1 ||
-+ !NAPI_GRO_CB(p)->is_atomic)
-+ flush |= NAPI_GRO_CB(p)->flush_id;
-+ else
-+ NAPI_GRO_CB(p)->is_atomic = false;
-+
- /* Terminate the flow on len mismatch or if it grow "too much".
- * Under small packet flood GRO count could elsewhere grow a lot
- * leading to excessive truesize values.
- * On len mismatch merge the first packet shorter than gso_size,
- * otherwise complete the GRO packet.
- */
-- if (ulen > ntohs(uh2->len)) {
-+ if (ulen > ntohs(uh2->len) || flush) {
- pp = p;
- } else {
- if (NAPI_GRO_CB(skb)->is_flist) {
.previous
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
-@@ -388,7 +388,7 @@ targets += $(real-dtb-y) $(lib-y) $(alwa
+@@ -391,7 +391,7 @@ targets += $(real-dtb-y) $(lib-y) $(alwa
# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS $@
*/
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
-@@ -3045,6 +3045,10 @@ static inline int pskb_trim(struct sk_bu
+@@ -3060,6 +3060,10 @@ static inline int pskb_trim(struct sk_bu
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
}
/**
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
* @skb: buffer to alter
-@@ -3194,16 +3198,6 @@ static inline struct sk_buff *dev_alloc_
+@@ -3209,16 +3213,6 @@ static inline struct sk_buff *dev_alloc_
}
static void sock_def_write_space_wfree(struct sock *sk);
static void sock_def_write_space(struct sock *sk);
-@@ -585,6 +587,18 @@ discard_and_relse:
+@@ -586,6 +588,18 @@ discard_and_relse:
}
EXPORT_SYMBOL(__sk_receive_skb);
INDIRECT_CALLABLE_DECLARE(struct dst_entry *ip6_dst_check(struct dst_entry *,
u32));
INDIRECT_CALLABLE_DECLARE(struct dst_entry *ipv4_dst_check(struct dst_entry *,
-@@ -2188,9 +2202,11 @@ static void __sk_free(struct sock *sk)
+@@ -2189,9 +2203,11 @@ static void __sk_free(struct sock *sk)
if (likely(sk->sk_net_refcnt))
sock_inuse_add(sock_net(sk), -1);
--- a/net/core/sock.c
+++ b/net/core/sock.c
-@@ -4114,6 +4114,8 @@ static __net_initdata struct pernet_oper
+@@ -4115,6 +4115,8 @@ static __net_initdata struct pernet_oper
static int __init proto_init(void)
{
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
-@@ -3012,7 +3012,7 @@ static inline int pskb_network_may_pull(
+@@ -3027,7 +3027,7 @@ static inline int pskb_network_may_pull(
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
*/
#ifndef NET_SKB_PAD
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 27 Apr 2024 18:54:25 +0200
-Subject: [PATCH] net: bridge: fix multicast-to-unicast with fraglist GSO
-
-Calling skb_copy on a SKB_GSO_FRAGLIST skb is not valid, since it returns
-an invalid linearized skb. This code only needs to change the ethernet
-header, so pskb_copy is the right function to call here.
-
-Fixes: 6db6f0eae605 ("bridge: multicast to unicast")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/bridge/br_forward.c
-+++ b/net/bridge/br_forward.c
-@@ -261,7 +261,7 @@ static void maybe_deliver_addr(struct ne
- if (skb->dev == p->dev && ether_addr_equal(src, addr))
- return;
-
-- skb = skb_copy(skb, GFP_ATOMIC);
-+ skb = pskb_copy(skb, GFP_ATOMIC);
- if (!skb) {
- DEV_STATS_INC(dev, tx_dropped);
- return;
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 27 Apr 2024 19:29:45 +0200
-Subject: [PATCH] net: core: reject skb_copy(_expand) for fraglist GSO skbs
-
-SKB_GSO_FRAGLIST skbs must not be linearized, otherwise they become
-invalid. Return NULL if such an skb is passed to skb_copy or
-skb_copy_expand, in order to prevent a crash on a potential later
-call to skb_gso_segment.
-
-Fixes: 3a1296a38d0c ("net: Support GRO/GSO fraglist chaining.")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -1720,11 +1720,17 @@ static inline int skb_alloc_rx_flag(cons
-
- struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
- {
-- int headerlen = skb_headroom(skb);
-- unsigned int size = skb_end_offset(skb) + skb->data_len;
-- struct sk_buff *n = __alloc_skb(size, gfp_mask,
-- skb_alloc_rx_flag(skb), NUMA_NO_NODE);
-+ struct sk_buff *n;
-+ unsigned int size;
-+ int headerlen;
-
-+ if (WARN_ON_ONCE(skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST))
-+ return NULL;
-+
-+ headerlen = skb_headroom(skb);
-+ size = skb_end_offset(skb) + skb->data_len;
-+ n = __alloc_skb(size, gfp_mask,
-+ skb_alloc_rx_flag(skb), NUMA_NO_NODE);
- if (!n)
- return NULL;
-
-@@ -2037,12 +2043,17 @@ struct sk_buff *skb_copy_expand(const st
- /*
- * Allocate the copy buffer
- */
-- struct sk_buff *n = __alloc_skb(newheadroom + skb->len + newtailroom,
-- gfp_mask, skb_alloc_rx_flag(skb),
-- NUMA_NO_NODE);
-- int oldheadroom = skb_headroom(skb);
- int head_copy_len, head_copy_off;
-+ struct sk_buff *n;
-+ int oldheadroom;
-+
-+ if (WARN_ON_ONCE(skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST))
-+ return NULL;
-
-+ oldheadroom = skb_headroom(skb);
-+ n = __alloc_skb(newheadroom + skb->len + newtailroom,
-+ gfp_mask, skb_alloc_rx_flag(skb),
-+ NUMA_NO_NODE);
- if (!n)
- return NULL;
-
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 5 May 2024 20:36:56 +0200
-Subject: [PATCH] net: bridge: fix corrupted ethernet header on
- multicast-to-unicast
-
-The change from skb_copy to pskb_copy unfortunately changed the data
-copying to omit the ethernet header, since it was pulled before reaching
-this point. Fix this by calling __skb_push/pull around pskb_copy.
-
-Fixes: 59c878cbcdd8 ("net: bridge: fix multicast-to-unicast with fraglist GSO")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/bridge/br_forward.c
-+++ b/net/bridge/br_forward.c
-@@ -253,6 +253,7 @@ static void maybe_deliver_addr(struct ne
- {
- struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev;
- const unsigned char *src = eth_hdr(skb)->h_source;
-+ struct sk_buff *nskb;
-
- if (!should_deliver(p, skb))
- return;
-@@ -261,12 +262,16 @@ static void maybe_deliver_addr(struct ne
- if (skb->dev == p->dev && ether_addr_equal(src, addr))
- return;
-
-- skb = pskb_copy(skb, GFP_ATOMIC);
-- if (!skb) {
-+ __skb_push(skb, ETH_HLEN);
-+ nskb = pskb_copy(skb, GFP_ATOMIC);
-+ __skb_pull(skb, ETH_HLEN);
-+ if (!nskb) {
- DEV_STATS_INC(dev, tx_dropped);
- return;
- }
-
-+ skb = nskb;
-+ __skb_pull(skb, ETH_HLEN);
- if (!is_broadcast_ether_addr(addr))
- memcpy(eth_hdr(skb)->h_dest, addr, ETH_ALEN);
-
return -EMSGSIZE;
timerval = br_timer_value(&p->message_age_timer);
-@@ -878,6 +880,7 @@ static const struct nla_policy br_port_p
+@@ -879,6 +881,7 @@ static const struct nla_policy br_port_p
[IFLA_BRPORT_LOCKED] = { .type = NLA_U8 },
[IFLA_BRPORT_BACKUP_PORT] = { .type = NLA_U32 },
[IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT] = { .type = NLA_U32 },
};
/* Change the state of the port and notify spanning tree */
-@@ -943,6 +946,7 @@ static int br_setport(struct net_bridge_
+@@ -944,6 +947,7 @@ static int br_setport(struct net_bridge_
br_set_port_flag(p, tb, IFLA_BRPORT_NEIGH_SUPPRESS, BR_NEIGH_SUPPRESS);
br_set_port_flag(p, tb, IFLA_BRPORT_ISOLATED, BR_ISOLATED);
br_set_port_flag(p, tb, IFLA_BRPORT_LOCKED, BR_PORT_LOCKED);
sd->backlog.weight = weight_p;
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
-@@ -29,6 +29,7 @@ static int int_3600 = 3600;
- static int min_sndbuf = SOCK_MIN_SNDBUF;
+@@ -30,6 +30,7 @@ static int min_sndbuf = SOCK_MIN_SNDBUF;
static int min_rcvbuf = SOCK_MIN_RCVBUF;
static int max_skb_frags = MAX_SKB_FRAGS;
+ static int min_mem_pcpu_rsv = SK_MEMORY_PCPU_RESERVE;
+static int backlog_threaded;
static int net_msg_warn; /* Unused, but still a sysctl */
-@@ -112,6 +113,23 @@ static int rps_sock_flow_sysctl(struct c
+@@ -113,6 +114,23 @@ static int rps_sock_flow_sysctl(struct c
}
#endif /* CONFIG_RPS */
#ifdef CONFIG_NET_FLOW_LIMIT
static DEFINE_MUTEX(flow_limit_update_mutex);
-@@ -473,6 +491,15 @@ static struct ctl_table net_core_table[]
+@@ -482,6 +500,15 @@ static struct ctl_table net_core_table[]
.proc_handler = rps_sock_flow_sysctl
},
#endif
+++ /dev/null
-From 4a44a52f16ccd3d03e0cb5fb437a5eb31a5f9f05 Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Mon, 26 Feb 2024 21:39:34 +0100
-Subject: [PATCH] net l2tp: drop flow hash on forward
-
-Drop the flow-hash of the skb when forwarding to the L2TP netdev.
-
-This avoids the L2TP qdisc from using the flow-hash from the outer
-packet, which is identical for every flow within the tunnel.
-
-This does not affect every platform but is specific for the ethernet
-driver. It depends on the platform including L4 information in the
-flow-hash.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- net/l2tp/l2tp_eth.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/net/l2tp/l2tp_eth.c
-+++ b/net/l2tp/l2tp_eth.c
-@@ -136,6 +136,9 @@ static void l2tp_eth_dev_recv(struct l2t
- /* checksums verified by L2TP */
- skb->ip_summed = CHECKSUM_NONE;
-
-+ /* drop outer flow-hash */
-+ skb_clear_hash(skb);
-+
- skb_dst_drop(skb);
- nf_reset_ct(skb);
-
--- a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c
+++ b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c
-@@ -31,12 +31,10 @@
+@@ -32,12 +32,10 @@
#define IMX8MM_PCIE_PHY_CMN_REG065 0x194
#define ANA_AUX_RX_TERM (BIT(7) | BIT(4))
#define ANA_AUX_TX_LVL GENMASK(3, 0)
#define IMX8MM_GPR_PCIE_REF_CLK_SEL GENMASK(25, 24)
#define IMX8MM_GPR_PCIE_REF_CLK_PLL FIELD_PREP(IMX8MM_GPR_PCIE_REF_CLK_SEL, 0x3)
-@@ -131,9 +129,8 @@ static int imx8_pcie_phy_power_on(struct
- reset_control_deassert(imx8_phy->reset);
+@@ -152,9 +150,8 @@ static int imx8_pcie_phy_power_on(struct
+ }
/* Polling to check the phy is ready or not. */
- ret = readl_poll_timeout(imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG75,
+++ /dev/null
-From fb681544808b85c0cdf41a627401e5d470633914 Mon Sep 17 00:00:00 2001
-From: Richard Zhu <hongxing.zhu@nxp.com>
-Date: Thu, 13 Oct 2022 09:47:01 +0800
-Subject: [PATCH 2/3] phy: freescale: imx8m-pcie: Refine i.MX8MM PCIe PHY
- driver
-
-To make it more flexible and easy to expand. Refine i.MX8MM PCIe PHY
-driver.
-- Use gpr compatible string to avoid the codes duplications when add
- another platform PCIe PHY support.
-- Re-arrange the codes to let it more flexible and easy to expand.
-No functional change. Re-arrange the TX tuning, since internal registers
-can be wrote through APB interface before assertion of CMN_RST.
-
-Signed-off-by: Richard Zhu <hongxing.zhu@nxp.com>
-Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-Tested-by: Marek Vasut <marex@denx.de>
-Tested-by: Richard Leitner <richard.leitner@skidata.com>
-Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
-Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
-Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
----
- drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 106 +++++++++++++--------
- 1 file changed, 66 insertions(+), 40 deletions(-)
-
---- a/drivers/phy/freescale/phy-fsl-imx8m-pcie.c
-+++ b/drivers/phy/freescale/phy-fsl-imx8m-pcie.c
-@@ -11,6 +11,7 @@
- #include <linux/mfd/syscon.h>
- #include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
- #include <linux/module.h>
-+#include <linux/of_device.h>
- #include <linux/phy/phy.h>
- #include <linux/platform_device.h>
- #include <linux/regmap.h>
-@@ -45,6 +46,15 @@
- #define IMX8MM_GPR_PCIE_SSC_EN BIT(16)
- #define IMX8MM_GPR_PCIE_AUX_EN_OVERRIDE BIT(9)
-
-+enum imx8_pcie_phy_type {
-+ IMX8MM,
-+};
-+
-+struct imx8_pcie_phy_drvdata {
-+ const char *gpr;
-+ enum imx8_pcie_phy_type variant;
-+};
-+
- struct imx8_pcie_phy {
- void __iomem *base;
- struct clk *clk;
-@@ -55,6 +65,7 @@ struct imx8_pcie_phy {
- u32 tx_deemph_gen1;
- u32 tx_deemph_gen2;
- bool clkreq_unused;
-+ const struct imx8_pcie_phy_drvdata *drvdata;
- };
-
- static int imx8_pcie_phy_power_on(struct phy *phy)
-@@ -66,31 +77,17 @@ static int imx8_pcie_phy_power_on(struct
- reset_control_assert(imx8_phy->reset);
-
- pad_mode = imx8_phy->refclk_pad_mode;
-- /* Set AUX_EN_OVERRIDE 1'b0, when the CLKREQ# isn't hooked */
-- regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-- IMX8MM_GPR_PCIE_AUX_EN_OVERRIDE,
-- imx8_phy->clkreq_unused ?
-- 0 : IMX8MM_GPR_PCIE_AUX_EN_OVERRIDE);
-- regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-- IMX8MM_GPR_PCIE_AUX_EN,
-- IMX8MM_GPR_PCIE_AUX_EN);
-- regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-- IMX8MM_GPR_PCIE_POWER_OFF, 0);
-- regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-- IMX8MM_GPR_PCIE_SSC_EN, 0);
--
-- regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-- IMX8MM_GPR_PCIE_REF_CLK_SEL,
-- pad_mode == IMX8_PCIE_REFCLK_PAD_INPUT ?
-- IMX8MM_GPR_PCIE_REF_CLK_EXT :
-- IMX8MM_GPR_PCIE_REF_CLK_PLL);
-- usleep_range(100, 200);
--
-- /* Do the PHY common block reset */
-- regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-- IMX8MM_GPR_PCIE_CMN_RST,
-- IMX8MM_GPR_PCIE_CMN_RST);
-- usleep_range(200, 500);
-+ switch (imx8_phy->drvdata->variant) {
-+ case IMX8MM:
-+ /* Tune PHY de-emphasis setting to pass PCIe compliance. */
-+ if (imx8_phy->tx_deemph_gen1)
-+ writel(imx8_phy->tx_deemph_gen1,
-+ imx8_phy->base + PCIE_PHY_TRSV_REG5);
-+ if (imx8_phy->tx_deemph_gen2)
-+ writel(imx8_phy->tx_deemph_gen2,
-+ imx8_phy->base + PCIE_PHY_TRSV_REG6);
-+ break;
-+ }
-
- if (pad_mode == IMX8_PCIE_REFCLK_PAD_INPUT ||
- pad_mode == IMX8_PCIE_REFCLK_PAD_UNUSED) {
-@@ -118,15 +115,37 @@ static int imx8_pcie_phy_power_on(struct
- imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG065);
- }
-
-- /* Tune PHY de-emphasis setting to pass PCIe compliance. */
-- if (imx8_phy->tx_deemph_gen1)
-- writel(imx8_phy->tx_deemph_gen1,
-- imx8_phy->base + PCIE_PHY_TRSV_REG5);
-- if (imx8_phy->tx_deemph_gen2)
-- writel(imx8_phy->tx_deemph_gen2,
-- imx8_phy->base + PCIE_PHY_TRSV_REG6);
-+ /* Set AUX_EN_OVERRIDE 1'b0, when the CLKREQ# isn't hooked */
-+ regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-+ IMX8MM_GPR_PCIE_AUX_EN_OVERRIDE,
-+ imx8_phy->clkreq_unused ?
-+ 0 : IMX8MM_GPR_PCIE_AUX_EN_OVERRIDE);
-+ regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-+ IMX8MM_GPR_PCIE_AUX_EN,
-+ IMX8MM_GPR_PCIE_AUX_EN);
-+ regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-+ IMX8MM_GPR_PCIE_POWER_OFF, 0);
-+ regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-+ IMX8MM_GPR_PCIE_SSC_EN, 0);
-
-- reset_control_deassert(imx8_phy->reset);
-+ regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-+ IMX8MM_GPR_PCIE_REF_CLK_SEL,
-+ pad_mode == IMX8_PCIE_REFCLK_PAD_INPUT ?
-+ IMX8MM_GPR_PCIE_REF_CLK_EXT :
-+ IMX8MM_GPR_PCIE_REF_CLK_PLL);
-+ usleep_range(100, 200);
-+
-+ /* Do the PHY common block reset */
-+ regmap_update_bits(imx8_phy->iomuxc_gpr, IOMUXC_GPR14,
-+ IMX8MM_GPR_PCIE_CMN_RST,
-+ IMX8MM_GPR_PCIE_CMN_RST);
-+
-+ switch (imx8_phy->drvdata->variant) {
-+ case IMX8MM:
-+ reset_control_deassert(imx8_phy->reset);
-+ usleep_range(200, 500);
-+ break;
-+ }
-
- /* Polling to check the phy is ready or not. */
- ret = readl_poll_timeout(imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG075,
-@@ -157,6 +176,17 @@ static const struct phy_ops imx8_pcie_ph
- .owner = THIS_MODULE,
- };
-
-+static const struct imx8_pcie_phy_drvdata imx8mm_drvdata = {
-+ .gpr = "fsl,imx8mm-iomuxc-gpr",
-+ .variant = IMX8MM,
-+};
-+
-+static const struct of_device_id imx8_pcie_phy_of_match[] = {
-+ {.compatible = "fsl,imx8mm-pcie-phy", .data = &imx8mm_drvdata, },
-+ { },
-+};
-+MODULE_DEVICE_TABLE(of, imx8_pcie_phy_of_match);
-+
- static int imx8_pcie_phy_probe(struct platform_device *pdev)
- {
- struct phy_provider *phy_provider;
-@@ -169,6 +199,8 @@ static int imx8_pcie_phy_probe(struct pl
- if (!imx8_phy)
- return -ENOMEM;
-
-+ imx8_phy->drvdata = of_device_get_match_data(dev);
-+
- /* get PHY refclk pad mode */
- of_property_read_u32(np, "fsl,refclk-pad-mode",
- &imx8_phy->refclk_pad_mode);
-@@ -194,7 +226,7 @@ static int imx8_pcie_phy_probe(struct pl
-
- /* Grab GPR config register range */
- imx8_phy->iomuxc_gpr =
-- syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
-+ syscon_regmap_lookup_by_compatible(imx8_phy->drvdata->gpr);
- if (IS_ERR(imx8_phy->iomuxc_gpr)) {
- dev_err(dev, "unable to find iomuxc registers\n");
- return PTR_ERR(imx8_phy->iomuxc_gpr);
-@@ -222,12 +254,6 @@ static int imx8_pcie_phy_probe(struct pl
- return PTR_ERR_OR_ZERO(phy_provider);
- }
-
--static const struct of_device_id imx8_pcie_phy_of_match[] = {
-- {.compatible = "fsl,imx8mm-pcie-phy",},
-- { },
--};
--MODULE_DEVICE_TABLE(of, imx8_pcie_phy_of_match);
--
- static struct platform_driver imx8_pcie_phy_driver = {
- .probe = imx8_pcie_phy_probe,
- .driver = {
}
if (pad_mode == IMX8_PCIE_REFCLK_PAD_INPUT ||
-@@ -141,6 +145,9 @@ static int imx8_pcie_phy_power_on(struct
+@@ -143,6 +147,9 @@ static int imx8_pcie_phy_power_on(struct
IMX8MM_GPR_PCIE_CMN_RST);
switch (imx8_phy->drvdata->variant) {
case IMX8MM:
reset_control_deassert(imx8_phy->reset);
usleep_range(200, 500);
-@@ -181,8 +188,14 @@ static const struct imx8_pcie_phy_drvdat
+@@ -183,8 +190,14 @@ static const struct imx8_pcie_phy_drvdat
.variant = IMX8MM,
};
{ },
};
MODULE_DEVICE_TABLE(of, imx8_pcie_phy_of_match);
-@@ -238,6 +251,14 @@ static int imx8_pcie_phy_probe(struct pl
+@@ -240,6 +253,14 @@ static int imx8_pcie_phy_probe(struct pl
return PTR_ERR(imx8_phy->reset);
}