mirror of
https://github.com/openwrt/openwrt.git
synced 2025-04-07 11:27:09 +00:00
kernel: bump 6.1 to 6.1.92
https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.1.92 Removed upstreamed: bcm27xx/patches-6.1/950-0270-net-bcmgenet-Reset-RBUF-on-first-open.patch generic/backport-6.1/600-v6.9-03-net-gro-add-flush-check-in-udp_gro_receive_segment.patch generic/pending-6.1/681-net-bridge-fix-multicast-to-unicast-with-fraglist-GS.patch generic/pending-6.1/682-net-core-reject-skb_copy-_expand-for-fraglist-GSO-sk.patch generic/pending-6.1/684-net-bridge-fix-corrupted-ethernet-header-on-multicas.patch generic/pending-6.1/778-net-l2tp-drop-flow-hash-on-forward.patch imx/patches-6.1/002-6.2-phy-freescale-imx8m-pcie-Refine-i.MX8MM-PCIe-PHY-dri.patch All other patches automatically rebased. Signed-off-by: Zxl hhyccc <zxlhhy@gmail.com>
This commit is contained in:
parent
1cb489c784
commit
2d6cedab27
@ -1,2 +1,2 @@
|
||||
LINUX_VERSION-6.1 = .89
|
||||
LINUX_KERNEL_HASH-6.1.89 = 12bab8e092618d1d4eeaf4201e6e70054c94896198956bd84ff0e908b0264719
|
||||
LINUX_VERSION-6.1 = .92
|
||||
LINUX_KERNEL_HASH-6.1.92 = 9019f427bfdc9ced5bc954d760d37ac08c0cdffb45ad28087fc45a73e64336c9
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- 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;
|
||||
|
@ -1185,7 +1185,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
}
|
||||
--- 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);
|
||||
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- 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);
|
||||
@ -27,7 +27,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
/* 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 */
|
||||
|
@ -20,7 +20,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
|
||||
--- 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;
|
||||
|
@ -37,7 +37,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
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);
|
||||
|
||||
@ -47,5 +47,5 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
+ }
|
||||
+
|
||||
/* 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);
|
||||
|
@ -32,7 +32,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- 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)
|
||||
{
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
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;
|
||||
|
@ -1,70 +0,0 @@
|
||||
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);
|
@ -26,7 +26,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
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);
|
||||
|
||||
|
@ -212,7 +212,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
},
|
||||
--- 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
|
||||
}
|
||||
}
|
||||
|
||||
@ -237,7 +237,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
/**
|
||||
* 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);
|
||||
|
||||
@ -246,7 +246,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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;
|
||||
@ -254,7 +254,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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;
|
||||
|
||||
@ -264,7 +264,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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");
|
||||
|
||||
@ -274,7 +274,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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;
|
||||
|
||||
@ -283,7 +283,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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);
|
||||
|
||||
@ -326,7 +326,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- 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)
|
||||
{
|
||||
@ -339,7 +339,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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;
|
||||
|
||||
@ -348,7 +348,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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;
|
||||
|
||||
@ -357,7 +357,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
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)
|
||||
{
|
||||
|
@ -19,7 +19,7 @@ Subject: [PATCH 210/210] b44: register adm switch
|
||||
|
||||
#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
|
||||
}
|
||||
}
|
||||
|
||||
@ -89,7 +89,7 @@ Subject: [PATCH 210/210] b44: register adm switch
|
||||
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))) {
|
||||
|
||||
@ -99,7 +99,7 @@ Subject: [PATCH 210/210] b44: register adm switch
|
||||
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);
|
||||
|
@ -43,7 +43,7 @@
|
||||
|
||||
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;
|
||||
|
||||
|
@ -1,48 +0,0 @@
|
||||
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) {
|
@ -115,7 +115,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
.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 $@
|
||||
|
@ -60,7 +60,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
*/
|
||||
--- 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;
|
||||
}
|
||||
|
||||
@ -71,7 +71,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
/**
|
||||
* 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_
|
||||
}
|
||||
|
||||
|
||||
|
@ -60,7 +60,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
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);
|
||||
|
||||
@ -79,7 +79,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
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);
|
||||
|
||||
|
@ -330,7 +330,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- 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)
|
||||
{
|
||||
|
@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- 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
|
||||
|
@ -1,23 +0,0 @@
|
||||
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;
|
@ -1,59 +0,0 @@
|
||||
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;
|
||||
|
@ -1,42 +0,0 @@
|
||||
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);
|
||||
|
@ -134,7 +134,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
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 },
|
||||
@ -142,7 +142,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
};
|
||||
|
||||
/* 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);
|
||||
|
@ -177,15 +177,15 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
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 */
|
||||
|
||||
@ -209,7 +209,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
#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
|
||||
|
@ -1,31 +0,0 @@
|
||||
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);
|
||||
|
@ -20,7 +20,7 @@ Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
|
||||
--- 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)
|
||||
@ -35,8 +35,8 @@ Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
|
||||
#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,
|
||||
|
@ -1,197 +0,0 @@
|
||||
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 = {
|
@ -57,7 +57,7 @@ Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -67,7 +67,7 @@ Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||
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,
|
||||
};
|
||||
|
||||
@ -82,7 +82,7 @@ Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||
{ },
|
||||
};
|
||||
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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user