lantiq: 5.15: refresh patches

0001-MIPS-lantiq-add-pcie-driver.patch needs to drop
MODULE_SUPPORTED_DEVICE because that macro is gone on newer kernels.

Add checks for copy_{to,from}_user in
0008-MIPS-lantiq-backport-old-timer-code.patch which is now mandatory.

0705-v5.13-net-dsa-lantiq-allow-to-use-all-GPHYs-on-xRX300-and-.patch
get dropped because it's a backport from Linux 5.13.

All other patches are refreshed.

Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
This commit is contained in:
Martin Blumenstingl 2022-03-21 18:39:03 +01:00 committed by Hauke Mehrtens
parent c783073894
commit d374e0346e
17 changed files with 66 additions and 337 deletions

View file

@ -242,7 +242,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
--- /dev/null --- /dev/null
+++ b/arch/mips/pci/ifxmips_pcie.c +++ b/arch/mips/pci/ifxmips_pcie.c
@@ -0,0 +1,1092 @@ @@ -0,0 +1,1091 @@
+/* +/*
+ * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published + * under the terms of the GNU General Public License version 2 as published
@ -1332,7 +1332,6 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Chuanhua.Lei@infineon.com"); +MODULE_AUTHOR("Chuanhua.Lei@infineon.com");
+MODULE_SUPPORTED_DEVICE("Infineon builtin PCIe RC module");
+MODULE_DESCRIPTION("Infineon builtin PCIe RC driver"); +MODULE_DESCRIPTION("Infineon builtin PCIe RC driver");
+ +
--- /dev/null --- /dev/null
@ -1764,7 +1763,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+#endif /* IFXMIPS_PCIE_AR10_H */ +#endif /* IFXMIPS_PCIE_AR10_H */
--- /dev/null --- /dev/null
+++ b/arch/mips/pci/ifxmips_pcie_msi.c +++ b/arch/mips/pci/ifxmips_pcie_msi.c
@@ -0,0 +1,392 @@ @@ -0,0 +1,391 @@
+/****************************************************************************** +/******************************************************************************
+** +**
+** FILE NAME : ifxmips_pcie_msi.c +** FILE NAME : ifxmips_pcie_msi.c
@ -2154,7 +2153,6 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
+MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Chuanhua.Lei@infineon.com"); +MODULE_AUTHOR("Chuanhua.Lei@infineon.com");
+MODULE_SUPPORTED_DEVICE("Infineon PCIe IP builtin MSI PIC module");
+MODULE_DESCRIPTION("Infineon PCIe IP builtin MSI PIC driver"); +MODULE_DESCRIPTION("Infineon PCIe IP builtin MSI PIC driver");
+ +
--- /dev/null --- /dev/null
@ -4134,7 +4132,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
--- a/arch/mips/pci/pci-legacy.c --- a/arch/mips/pci/pci-legacy.c
+++ b/arch/mips/pci/pci-legacy.c +++ b/arch/mips/pci/pci-legacy.c
@@ -313,3 +313,30 @@ char *__init pcibios_setup(char *str) @@ -305,3 +305,30 @@ char *__init pcibios_setup(char *str)
return pcibios_plat_setup(str); return pcibios_plat_setup(str);
return str; return str;
} }
@ -5481,7 +5479,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
(transaction layer end-to-end CRC checking). (transaction layer end-to-end CRC checking).
--- a/include/linux/pci.h --- a/include/linux/pci.h
+++ b/include/linux/pci.h +++ b/include/linux/pci.h
@@ -1420,6 +1420,8 @@ void pci_walk_bus(struct pci_bus *top, i @@ -1480,6 +1480,8 @@ void pci_walk_bus(struct pci_bus *top, i
void *userdata); void *userdata);
int pci_cfg_space_size(struct pci_dev *dev); int pci_cfg_space_size(struct pci_dev *dev);
unsigned char pci_bus_max_busnr(struct pci_bus *bus); unsigned char pci_bus_max_busnr(struct pci_bus *bus);
@ -5492,7 +5490,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
unsigned long type); unsigned long type);
--- a/include/linux/pci_ids.h --- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h
@@ -1079,6 +1079,12 @@ @@ -1085,6 +1085,12 @@
#define PCI_DEVICE_ID_SGI_IOC3 0x0003 #define PCI_DEVICE_ID_SGI_IOC3 0x0003
#define PCI_DEVICE_ID_SGI_LITHIUM 0x1002 #define PCI_DEVICE_ID_SGI_LITHIUM 0x1002

View file

@ -423,7 +423,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
--- a/arch/mips/lantiq/irq.c --- a/arch/mips/lantiq/irq.c
+++ b/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c
@@ -12,6 +12,7 @@ @@ -13,6 +13,7 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
@ -431,7 +431,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/irq_cpu.h> #include <asm/irq_cpu.h>
@@ -91,6 +92,7 @@ void ltq_disable_irq(struct irq_data *d) @@ -92,6 +93,7 @@ void ltq_disable_irq(struct irq_data *d)
} }
raw_spin_unlock_irqrestore(&ltq_icu_lock, flags); raw_spin_unlock_irqrestore(&ltq_icu_lock, flags);
} }
@ -441,7 +441,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
{ {
--- a/arch/mips/mm/cache.c --- a/arch/mips/mm/cache.c
+++ b/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c
@@ -61,6 +61,10 @@ void (*_dma_cache_wback_inv)(unsigned lo @@ -63,6 +63,10 @@ void (*_dma_cache_wback_inv)(unsigned lo
void (*_dma_cache_wback)(unsigned long start, unsigned long size); void (*_dma_cache_wback)(unsigned long start, unsigned long size);
void (*_dma_cache_inv)(unsigned long start, unsigned long size); void (*_dma_cache_inv)(unsigned long start, unsigned long size);

View file

@ -186,7 +186,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
obj-y += vmmc.o obj-y += vmmc.o
--- /dev/null --- /dev/null
+++ b/arch/mips/lantiq/xway/timer.c +++ b/arch/mips/lantiq/xway/timer.c
@@ -0,0 +1,846 @@ @@ -0,0 +1,852 @@
+#ifndef CONFIG_SOC_AMAZON_SE +#ifndef CONFIG_SOC_AMAZON_SE
+ +
+#include <linux/kernel.h> +#include <linux/kernel.h>
@ -883,7 +883,8 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
+ if (!access_ok((void __user *)arg, sizeof(struct gptu_ioctl_param))) + if (!access_ok((void __user *)arg, sizeof(struct gptu_ioctl_param)))
+ return -EFAULT; + return -EFAULT;
+ copy_from_user(&param, (void __user *)arg, sizeof(param)); + if (copy_from_user(&param, (void __user *)arg, sizeof(param)))
+ return -EFAULT;
+ +
+ if ((((cmd == GPTU_REQUEST_TIMER || cmd == GPTU_SET_TIMER + if ((((cmd == GPTU_REQUEST_TIMER || cmd == GPTU_SET_TIMER
+ || GPTU_SET_COUNTER) && param.timer < 2) + || GPTU_SET_COUNTER) && param.timer < 2)
@ -898,8 +899,10 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ (unsigned long) param.pid, + (unsigned long) param.pid,
+ (unsigned long) param.sig); + (unsigned long) param.sig);
+ if (ret > 0) { + if (ret > 0) {
+ copy_to_user(&((struct gptu_ioctl_param *) arg)-> + if (copy_to_user(&((struct gptu_ioctl_param *) arg)->
+ timer, &ret, sizeof(&ret)); + timer, &ret, sizeof(&ret)))
+ ret = -EFAULT;
+ else
+ ret = 0; + ret = 0;
+ } + }
+ break; + break;
@ -914,21 +917,20 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ break; + break;
+ case GPTU_GET_COUNT_VALUE: + case GPTU_GET_COUNT_VALUE:
+ ret = lq_get_count_value(param.timer, &param.value); + ret = lq_get_count_value(param.timer, &param.value);
+ if (!ret) + if (!ret && copy_to_user(&((struct gptu_ioctl_param *) arg)->
+ copy_to_user(&((struct gptu_ioctl_param *) arg)-> + value, &param.value,sizeof(param.value)))
+ value, &param.value, + ret = -EFAULT;
+ sizeof(param.value));
+ break; + break;
+ case GPTU_CALCULATE_DIVIDER: + case GPTU_CALCULATE_DIVIDER:
+ param.value = lq_cal_divider(param.value); + param.value = lq_cal_divider(param.value);
+ if (param.value == 0) + if (param.value == 0)
+ ret = -EINVAL; + ret = -EINVAL;
+ else { + else if (copy_to_user(&((struct gptu_ioctl_param *) arg)->
+ copy_to_user(&((struct gptu_ioctl_param *) arg)->
+ value, &param.value, + value, &param.value,
+ sizeof(param.value)); + sizeof(param.value)))
+ ret = -EFAULT;
+ else
+ ret = 0; + ret = 0;
+ }
+ break; + break;
+ case GPTU_SET_TIMER: + case GPTU_SET_TIMER:
+ ret = lq_set_timer(param.timer, param.value, + ret = lq_set_timer(param.timer, param.value,
@ -942,16 +944,20 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ (unsigned long) param.pid, + (unsigned long) param.pid,
+ (unsigned long) param.sig); + (unsigned long) param.sig);
+ if (ret > 0) { + if (ret > 0) {
+ copy_to_user(&((struct gptu_ioctl_param *) arg)-> + if (copy_to_user(&((struct gptu_ioctl_param *) arg)->
+ timer, &ret, sizeof(&ret)); + timer, &ret, sizeof(&ret)))
+ ret = -EFAULT;
+ else
+ ret = 0; + ret = 0;
+ } + }
+ break; + break;
+ case GPTU_SET_COUNTER: + case GPTU_SET_COUNTER:
+ lq_set_counter(param.timer, param.flag, param.value, 0, 0); + lq_set_counter(param.timer, param.flag, param.value, 0, 0);
+ if (ret > 0) { + if (ret > 0) {
+ copy_to_user(&((struct gptu_ioctl_param *) arg)-> + if (copy_to_user(&((struct gptu_ioctl_param *) arg)->
+ timer, &ret, sizeof(&ret)); + timer, &ret, sizeof(&ret)))
+ ret = -EFAULT;
+ else
+ ret = 0; + ret = 0;
+ } + }
+ break; + break;

View file

@ -13,9 +13,9 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
--- a/drivers/net/phy/intel-xway.c --- a/drivers/net/phy/intel-xway.c
+++ b/drivers/net/phy/intel-xway.c +++ b/drivers/net/phy/intel-xway.c
@@ -157,6 +157,51 @@ @@ -229,6 +229,51 @@ static int xway_gphy_rgmii_init(struct p
#define PHY_ID_PHY11G_VR9_1_2 0xD565A409 XWAY_MDIO_MIICTRL_TXSKEW_MASK, val);
#define PHY_ID_PHY22F_VR9_1_2 0xD565A419 }
+#if IS_ENABLED(CONFIG_OF_MDIO) +#if IS_ENABLED(CONFIG_OF_MDIO)
+static int vr9_gphy_of_reg_init(struct phy_device *phydev) +static int vr9_gphy_of_reg_init(struct phy_device *phydev)
@ -65,9 +65,9 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
static int xway_gphy_config_init(struct phy_device *phydev) static int xway_gphy_config_init(struct phy_device *phydev)
{ {
int err; int err;
@@ -204,6 +249,7 @@ static int xway_gphy_config_init(struct @@ -280,6 +325,7 @@ static int xway_gphy_config_init(struct
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2H, ledxh); if (err)
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2L, ledxl); return err;
+ vr9_gphy_of_reg_init(phydev); + vr9_gphy_of_reg_init(phydev);
return 0; return 0;

View file

@ -18,7 +18,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
--- a/drivers/i2c/busses/Kconfig --- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig
@@ -753,6 +753,16 @@ config I2C_MESON @@ -757,6 +757,16 @@ config I2C_MESON
If you say yes to this option, support will be included for the If you say yes to this option, support will be included for the
I2C interface on the Amlogic Meson family of SoCs. I2C interface on the Amlogic Meson family of SoCs.

View file

@ -23,7 +23,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
--- a/drivers/usb/dwc2/params.c --- a/drivers/usb/dwc2/params.c
+++ b/drivers/usb/dwc2/params.c +++ b/drivers/usb/dwc2/params.c
@@ -92,7 +92,14 @@ static void dwc2_set_rk_params(struct dw @@ -93,7 +93,14 @@ static void dwc2_set_rk_params(struct dw
p->power_down = DWC2_POWER_DOWN_PARAM_NONE; p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
} }
@ -39,7 +39,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
{ {
struct dwc2_core_params *p = &hsotg->params; struct dwc2_core_params *p = &hsotg->params;
@@ -100,12 +107,20 @@ static void dwc2_set_ltq_params(struct d @@ -101,12 +108,20 @@ static void dwc2_set_ltq_params(struct d
p->host_rx_fifo_size = 288; p->host_rx_fifo_size = 288;
p->host_nperio_tx_fifo_size = 128; p->host_nperio_tx_fifo_size = 128;
p->host_perio_tx_fifo_size = 96; p->host_perio_tx_fifo_size = 96;
@ -62,7 +62,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
static void dwc2_set_amlogic_params(struct dwc2_hsotg *hsotg) static void dwc2_set_amlogic_params(struct dwc2_hsotg *hsotg)
{ {
struct dwc2_core_params *p = &hsotg->params; struct dwc2_core_params *p = &hsotg->params;
@@ -196,8 +211,11 @@ const struct of_device_id dwc2_of_match_ @@ -205,8 +220,11 @@ const struct of_device_id dwc2_of_match_
{ .compatible = "brcm,bcm2835-usb", .data = dwc2_set_bcm_params }, { .compatible = "brcm,bcm2835-usb", .data = dwc2_set_bcm_params },
{ .compatible = "hisilicon,hi6220-usb", .data = dwc2_set_his_params }, { .compatible = "hisilicon,hi6220-usb", .data = dwc2_set_his_params },
{ .compatible = "rockchip,rk3066-usb", .data = dwc2_set_rk_params }, { .compatible = "rockchip,rk3066-usb", .data = dwc2_set_rk_params },

View file

@ -1,6 +1,6 @@
--- a/arch/mips/Kconfig --- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig +++ b/arch/mips/Kconfig
@@ -2434,6 +2434,12 @@ config MIPS_VPE_LOADER @@ -2429,6 +2429,12 @@ config MIPS_VPE_LOADER
Includes a loader for loading an elf relocatable object Includes a loader for loading an elf relocatable object
onto another VPE and running it. onto another VPE and running it.
@ -15,7 +15,7 @@
default "y" default "y"
--- a/arch/mips/include/asm/vpe.h --- a/arch/mips/include/asm/vpe.h
+++ b/arch/mips/include/asm/vpe.h +++ b/arch/mips/include/asm/vpe.h
@@ -127,4 +127,13 @@ void cleanup_tc(struct tc *tc); @@ -124,4 +124,13 @@ void cleanup_tc(struct tc *tc);
int __init vpe_module_init(void); int __init vpe_module_init(void);
void __exit vpe_module_exit(void); void __exit vpe_module_exit(void);

View file

@ -26,7 +26,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
#endif #endif
--- a/arch/mips/lantiq/xway/dma.c --- a/arch/mips/lantiq/xway/dma.c
+++ b/arch/mips/lantiq/xway/dma.c +++ b/arch/mips/lantiq/xway/dma.c
@@ -181,7 +181,7 @@ ltq_dma_free(struct ltq_dma_channel *ch) @@ -182,7 +182,7 @@ ltq_dma_free(struct ltq_dma_channel *ch)
EXPORT_SYMBOL_GPL(ltq_dma_free); EXPORT_SYMBOL_GPL(ltq_dma_free);
void void
@ -35,7 +35,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
{ {
ltq_dma_w32(p, LTQ_DMA_PS); ltq_dma_w32(p, LTQ_DMA_PS);
switch (p) { switch (p) {
@@ -190,16 +190,44 @@ ltq_dma_init_port(int p) @@ -191,16 +191,44 @@ ltq_dma_init_port(int p)
* Tell the DMA engine to swap the endianness of data frames and * Tell the DMA engine to swap the endianness of data frames and
* drop packets if the channel arbitration fails. * drop packets if the channel arbitration fails.
*/ */

View file

@ -53,7 +53,7 @@ Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
const char *get_system_type(void) const char *get_system_type(void)
{ {
return soc_info.sys_type; return soc_info.sys_type;
@@ -100,6 +108,17 @@ void __init device_tree_init(void) @@ -93,6 +101,17 @@ void __init device_tree_init(void)
unflatten_and_copy_device_tree(); unflatten_and_copy_device_tree();
} }
@ -71,7 +71,7 @@ Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
void __init prom_init(void) void __init prom_init(void)
{ {
/* call the soc specific detetcion code and get it to fill soc_info */ /* call the soc specific detetcion code and get it to fill soc_info */
@@ -111,7 +130,10 @@ void __init prom_init(void) @@ -104,7 +123,10 @@ void __init prom_init(void)
prom_init_cmdline(); prom_init_cmdline();
#if defined(CONFIG_MIPS_MT_SMP) #if defined(CONFIG_MIPS_MT_SMP)

View file

@ -134,7 +134,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
@@ -454,7 +504,7 @@ static int xrx200_probe(struct platform_ @@ -453,7 +503,7 @@ static int xrx200_probe(struct platform_
net_dev->netdev_ops = &xrx200_netdev_ops; net_dev->netdev_ops = &xrx200_netdev_ops;
SET_NETDEV_DEV(net_dev, dev); SET_NETDEV_DEV(net_dev, dev);
net_dev->min_mtu = ETH_ZLEN; net_dev->min_mtu = ETH_ZLEN;
@ -142,4 +142,4 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
+ net_dev->max_mtu = XRX200_DMA_DATA_LEN - VLAN_ETH_HLEN - ETH_FCS_LEN; + net_dev->max_mtu = XRX200_DMA_DATA_LEN - VLAN_ETH_HLEN - ETH_FCS_LEN;
/* load the memory ranges */ /* load the memory ranges */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->pmac_reg = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);

View file

@ -110,7 +110,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
break; break;
} }
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
@@ -504,7 +517,8 @@ static int xrx200_probe(struct platform_ @@ -503,7 +516,8 @@ static int xrx200_probe(struct platform_
net_dev->netdev_ops = &xrx200_netdev_ops; net_dev->netdev_ops = &xrx200_netdev_ops;
SET_NETDEV_DEV(net_dev, dev); SET_NETDEV_DEV(net_dev, dev);
net_dev->min_mtu = ETH_ZLEN; net_dev->min_mtu = ETH_ZLEN;
@ -119,4 +119,4 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+ priv->rx_buf_size = xrx200_buffer_size(ETH_DATA_LEN); + priv->rx_buf_size = xrx200_buffer_size(ETH_DATA_LEN);
/* load the memory ranges */ /* load the memory ranges */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->pmac_reg = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);

View file

@ -1,275 +0,0 @@
From a09d042b086202735c4ed64573cdd79933020001 Mon Sep 17 00:00:00 2001
From: Aleksander Jan Bajkowski <olek2@wp.pl>
Date: Mon, 22 Mar 2021 21:37:15 +0100
Subject: [PATCH] net: dsa: lantiq: allow to use all GPHYs on xRX300 and xRX330
This patch allows to use all PHYs on GRX300 and GRX330. The ARX300
has 3 and the GRX330 has 4 integrated PHYs connected to different
ports compared to VRX200. Each integrated PHY can work as single
Gigabit Ethernet PHY (GMII) or as double Fast Ethernet PHY (MII).
Allowed port configurations:
xRX200:
GMAC0: RGMII, MII, REVMII or RMII port
GMAC1: RGMII, MII, REVMII or RMII port
GMAC2: GPHY0 (GMII)
GMAC3: GPHY0 (MII)
GMAC4: GPHY1 (GMII)
GMAC5: GPHY1 (MII) or RGMII port
xRX300:
GMAC0: RGMII port
GMAC1: GPHY2 (GMII)
GMAC2: GPHY0 (GMII)
GMAC3: GPHY0 (MII)
GMAC4: GPHY1 (GMII)
GMAC5: GPHY1 (MII) or RGMII port
xRX330:
GMAC0: RGMII, GMII or RMII port
GMAC1: GPHY2 (GMII)
GMAC2: GPHY0 (GMII)
GMAC3: GPHY0 (MII) or GPHY3 (GMII)
GMAC4: GPHY1 (GMII)
GMAC5: GPHY1 (MII), RGMII or RMII port
Tested on D-Link DWR966 (xRX330) with OpenWRT.
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
drivers/net/dsa/lantiq_gswip.c | 142 ++++++++++++++++++++++++++-------
1 file changed, 113 insertions(+), 29 deletions(-)
--- a/drivers/net/dsa/lantiq_gswip.c
+++ b/drivers/net/dsa/lantiq_gswip.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
/*
- * Lantiq / Intel GSWIP switch driver for VRX200 SoCs
+ * Lantiq / Intel GSWIP switch driver for VRX200, xRX300 and xRX330 SoCs
*
* Copyright (C) 2010 Lantiq Deutschland
* Copyright (C) 2012 John Crispin <john@phrozen.org>
@@ -104,6 +104,7 @@
#define GSWIP_MII_CFG_MODE_RMIIP 0x2
#define GSWIP_MII_CFG_MODE_RMIIM 0x3
#define GSWIP_MII_CFG_MODE_RGMII 0x4
+#define GSWIP_MII_CFG_MODE_GMII 0x9
#define GSWIP_MII_CFG_MODE_MASK 0xf
#define GSWIP_MII_CFG_RATE_M2P5 0x00
#define GSWIP_MII_CFG_RATE_M25 0x10
@@ -241,6 +242,7 @@
struct gswip_hw_info {
int max_ports;
int cpu_port;
+ const struct dsa_switch_ops *ops;
};
struct xway_gphy_match_data {
@@ -1438,12 +1440,42 @@ static int gswip_port_fdb_dump(struct ds
return 0;
}
-static void gswip_phylink_validate(struct dsa_switch *ds, int port,
- unsigned long *supported,
- struct phylink_link_state *state)
+static void gswip_phylink_set_capab(unsigned long *supported,
+ struct phylink_link_state *state)
{
__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
+ /* Allow all the expected bits */
+ phylink_set(mask, Autoneg);
+ phylink_set_port_modes(mask);
+ phylink_set(mask, Pause);
+ phylink_set(mask, Asym_Pause);
+
+ /* With the exclusion of MII, Reverse MII and Reduced MII, we
+ * support Gigabit, including Half duplex
+ */
+ if (state->interface != PHY_INTERFACE_MODE_MII &&
+ state->interface != PHY_INTERFACE_MODE_REVMII &&
+ state->interface != PHY_INTERFACE_MODE_RMII) {
+ phylink_set(mask, 1000baseT_Full);
+ phylink_set(mask, 1000baseT_Half);
+ }
+
+ phylink_set(mask, 10baseT_Half);
+ phylink_set(mask, 10baseT_Full);
+ phylink_set(mask, 100baseT_Half);
+ phylink_set(mask, 100baseT_Full);
+
+ bitmap_and(supported, supported, mask,
+ __ETHTOOL_LINK_MODE_MASK_NBITS);
+ bitmap_and(state->advertising, state->advertising, mask,
+ __ETHTOOL_LINK_MODE_MASK_NBITS);
+}
+
+static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port,
+ unsigned long *supported,
+ struct phylink_link_state *state)
+{
switch (port) {
case 0:
case 1:
@@ -1470,38 +1502,54 @@ static void gswip_phylink_validate(struc
return;
}
- /* Allow all the expected bits */
- phylink_set(mask, Autoneg);
- phylink_set_port_modes(mask);
- phylink_set(mask, Pause);
- phylink_set(mask, Asym_Pause);
+ gswip_phylink_set_capab(supported, state);
- /* With the exclusion of MII, Reverse MII and Reduced MII, we
- * support Gigabit, including Half duplex
- */
- if (state->interface != PHY_INTERFACE_MODE_MII &&
- state->interface != PHY_INTERFACE_MODE_REVMII &&
- state->interface != PHY_INTERFACE_MODE_RMII) {
- phylink_set(mask, 1000baseT_Full);
- phylink_set(mask, 1000baseT_Half);
+ return;
+
+unsupported:
+ bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
+ dev_err(ds->dev, "Unsupported interface '%s' for port %d\n",
+ phy_modes(state->interface), port);
+}
+
+static void gswip_xrx300_phylink_validate(struct dsa_switch *ds, int port,
+ unsigned long *supported,
+ struct phylink_link_state *state)
+{
+ switch (port) {
+ case 0:
+ if (!phy_interface_mode_is_rgmii(state->interface) &&
+ state->interface != PHY_INTERFACE_MODE_GMII &&
+ state->interface != PHY_INTERFACE_MODE_RMII)
+ goto unsupported;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ if (state->interface != PHY_INTERFACE_MODE_INTERNAL)
+ goto unsupported;
+ break;
+ case 5:
+ if (!phy_interface_mode_is_rgmii(state->interface) &&
+ state->interface != PHY_INTERFACE_MODE_INTERNAL &&
+ state->interface != PHY_INTERFACE_MODE_RMII)
+ goto unsupported;
+ break;
+ default:
+ bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
+ dev_err(ds->dev, "Unsupported port: %i\n", port);
+ return;
}
- phylink_set(mask, 10baseT_Half);
- phylink_set(mask, 10baseT_Full);
- phylink_set(mask, 100baseT_Half);
- phylink_set(mask, 100baseT_Full);
+ gswip_phylink_set_capab(supported, state);
- bitmap_and(supported, supported, mask,
- __ETHTOOL_LINK_MODE_MASK_NBITS);
- bitmap_and(state->advertising, state->advertising, mask,
- __ETHTOOL_LINK_MODE_MASK_NBITS);
return;
unsupported:
bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
dev_err(ds->dev, "Unsupported interface '%s' for port %d\n",
phy_modes(state->interface), port);
- return;
}
static void gswip_port_set_link(struct gswip_priv *priv, int port, bool link)
@@ -1636,6 +1684,9 @@ static void gswip_phylink_mac_config(str
case PHY_INTERFACE_MODE_RGMII_TXID:
miicfg |= GSWIP_MII_CFG_MODE_RGMII;
break;
+ case PHY_INTERFACE_MODE_GMII:
+ miicfg |= GSWIP_MII_CFG_MODE_GMII;
+ break;
default:
dev_err(ds->dev,
"Unsupported interface: %d\n", state->interface);
@@ -1762,7 +1813,7 @@ static int gswip_get_sset_count(struct d
return ARRAY_SIZE(gswip_rmon_cnt);
}
-static const struct dsa_switch_ops gswip_switch_ops = {
+static const struct dsa_switch_ops gswip_xrx200_switch_ops = {
.get_tag_protocol = gswip_get_tag_protocol,
.setup = gswip_setup,
.port_enable = gswip_port_enable,
@@ -1778,7 +1829,31 @@ static const struct dsa_switch_ops gswip
.port_fdb_add = gswip_port_fdb_add,
.port_fdb_del = gswip_port_fdb_del,
.port_fdb_dump = gswip_port_fdb_dump,
- .phylink_validate = gswip_phylink_validate,
+ .phylink_validate = gswip_xrx200_phylink_validate,
+ .phylink_mac_config = gswip_phylink_mac_config,
+ .phylink_mac_link_down = gswip_phylink_mac_link_down,
+ .phylink_mac_link_up = gswip_phylink_mac_link_up,
+ .get_strings = gswip_get_strings,
+ .get_ethtool_stats = gswip_get_ethtool_stats,
+ .get_sset_count = gswip_get_sset_count,
+};
+
+static const struct dsa_switch_ops gswip_xrx300_switch_ops = {
+ .get_tag_protocol = gswip_get_tag_protocol,
+ .setup = gswip_setup,
+ .port_enable = gswip_port_enable,
+ .port_disable = gswip_port_disable,
+ .port_bridge_join = gswip_port_bridge_join,
+ .port_bridge_leave = gswip_port_bridge_leave,
+ .port_fast_age = gswip_port_fast_age,
+ .port_vlan_filtering = gswip_port_vlan_filtering,
+ .port_vlan_add = gswip_port_vlan_add,
+ .port_vlan_del = gswip_port_vlan_del,
+ .port_stp_state_set = gswip_port_stp_state_set,
+ .port_fdb_add = gswip_port_fdb_add,
+ .port_fdb_del = gswip_port_fdb_del,
+ .port_fdb_dump = gswip_port_fdb_dump,
+ .phylink_validate = gswip_xrx300_phylink_validate,
.phylink_mac_config = gswip_phylink_mac_config,
.phylink_mac_link_down = gswip_phylink_mac_link_down,
.phylink_mac_link_up = gswip_phylink_mac_link_up,
@@ -2042,7 +2117,7 @@ static int gswip_probe(struct platform_d
priv->ds->dev = dev;
priv->ds->num_ports = priv->hw_info->max_ports;
priv->ds->priv = priv;
- priv->ds->ops = &gswip_switch_ops;
+ priv->ds->ops = priv->hw_info->ops;
priv->dev = dev;
version = gswip_switch_r(priv, GSWIP_VERSION);
@@ -2126,10 +2201,19 @@ static int gswip_remove(struct platform_
static const struct gswip_hw_info gswip_xrx200 = {
.max_ports = 7,
.cpu_port = 6,
+ .ops = &gswip_xrx200_switch_ops,
+};
+
+static const struct gswip_hw_info gswip_xrx300 = {
+ .max_ports = 7,
+ .cpu_port = 6,
+ .ops = &gswip_xrx300_switch_ops,
};
static const struct of_device_id gswip_of_match[] = {
{ .compatible = "lantiq,xrx200-gswip", .data = &gswip_xrx200 },
+ { .compatible = "lantiq,xrx300-gswip", .data = &gswip_xrx300 },
+ { .compatible = "lantiq,xrx330-gswip", .data = &gswip_xrx300 },
{},
};
MODULE_DEVICE_TABLE(of, gswip_of_match);

View file

@ -47,7 +47,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct gswip_hw_info { struct gswip_hw_info {
int max_ports; int max_ports;
int cpu_port; int cpu_port;
@@ -858,10 +868,6 @@ static int gswip_setup(struct dsa_switch @@ -846,10 +856,6 @@ static int gswip_setup(struct dsa_switch
gswip_switch_mask(priv, 0, GSWIP_PCE_PCTRL_0_INGRESS, gswip_switch_mask(priv, 0, GSWIP_PCE_PCTRL_0_INGRESS,
GSWIP_PCE_PCTRL_0p(cpu_port)); GSWIP_PCE_PCTRL_0p(cpu_port));
@ -58,17 +58,17 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
gswip_switch_mask(priv, 0, GSWIP_BM_QUEUE_GCTRL_GL_MOD, gswip_switch_mask(priv, 0, GSWIP_BM_QUEUE_GCTRL_GL_MOD,
GSWIP_BM_QUEUE_GCTRL); GSWIP_BM_QUEUE_GCTRL);
@@ -878,6 +884,8 @@ static int gswip_setup(struct dsa_switch @@ -866,6 +872,8 @@ static int gswip_setup(struct dsa_switch
return err; return err;
} }
+ ds->mtu_enforcement_ingress = true; + ds->mtu_enforcement_ingress = true;
+ +
gswip_port_enable(ds, cpu_port, NULL); gswip_port_enable(ds, cpu_port, NULL);
return 0;
} ds->configure_vlan_while_not_filtering = false;
@@ -1472,6 +1480,39 @@ static void gswip_phylink_set_capab(unsi @@ -1456,6 +1464,39 @@ static void gswip_phylink_set_capab(unsi
__ETHTOOL_LINK_MODE_MASK_NBITS); linkmode_and(state->advertising, state->advertising, mask);
} }
+static int gswip_port_max_mtu(struct dsa_switch *ds, int port) +static int gswip_port_max_mtu(struct dsa_switch *ds, int port)
@ -107,7 +107,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port, static void gswip_xrx200_phylink_validate(struct dsa_switch *ds, int port,
unsigned long *supported, unsigned long *supported,
struct phylink_link_state *state) struct phylink_link_state *state)
@@ -1829,6 +1870,8 @@ static const struct dsa_switch_ops gswip @@ -1812,6 +1853,8 @@ static const struct dsa_switch_ops gswip
.port_fdb_add = gswip_port_fdb_add, .port_fdb_add = gswip_port_fdb_add,
.port_fdb_del = gswip_port_fdb_del, .port_fdb_del = gswip_port_fdb_del,
.port_fdb_dump = gswip_port_fdb_dump, .port_fdb_dump = gswip_port_fdb_dump,
@ -116,7 +116,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
.phylink_validate = gswip_xrx200_phylink_validate, .phylink_validate = gswip_xrx200_phylink_validate,
.phylink_mac_config = gswip_phylink_mac_config, .phylink_mac_config = gswip_phylink_mac_config,
.phylink_mac_link_down = gswip_phylink_mac_link_down, .phylink_mac_link_down = gswip_phylink_mac_link_down,
@@ -1853,6 +1896,8 @@ static const struct dsa_switch_ops gswip @@ -1836,6 +1879,8 @@ static const struct dsa_switch_ops gswip
.port_fdb_add = gswip_port_fdb_add, .port_fdb_add = gswip_port_fdb_add,
.port_fdb_del = gswip_port_fdb_del, .port_fdb_del = gswip_port_fdb_del,
.port_fdb_dump = gswip_port_fdb_dump, .port_fdb_dump = gswip_port_fdb_dump,

View file

@ -105,7 +105,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
ch_rx->dma.nr = XRX200_DMA_RX; ch_rx->dma.nr = XRX200_DMA_RX;
ch_rx->dma.dev = priv->dev; ch_rx->dma.dev = priv->dev;
@@ -584,6 +587,18 @@ static int xrx200_probe(struct platform_ @@ -575,6 +578,18 @@ static int xrx200_probe(struct platform_
if (err) if (err)
eth_hw_addr_random(net_dev); eth_hw_addr_random(net_dev);

View file

@ -52,7 +52,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
ch_rx->dma.nr = XRX200_DMA_RX; ch_rx->dma.nr = XRX200_DMA_RX;
ch_rx->dma.dev = priv->dev; ch_rx->dma.dev = priv->dev;
@@ -587,18 +586,6 @@ static int xrx200_probe(struct platform_ @@ -578,18 +577,6 @@ static int xrx200_probe(struct platform_
if (err) if (err)
eth_hw_addr_random(net_dev); eth_hw_addr_random(net_dev);

View file

@ -17,7 +17,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/lantiq_xrx200.c --- a/drivers/net/ethernet/lantiq_xrx200.c
+++ b/drivers/net/ethernet/lantiq_xrx200.c +++ b/drivers/net/ethernet/lantiq_xrx200.c
@@ -606,8 +606,10 @@ static int xrx200_probe(struct platform_ @@ -597,8 +597,10 @@ static int xrx200_probe(struct platform_
PMAC_HD_CTL); PMAC_HD_CTL);
/* setup NAPI */ /* setup NAPI */

View file

@ -196,11 +196,11 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
} }
static int xrx200_probe(struct platform_device *pdev) static int xrx200_probe(struct platform_device *pdev)
@@ -554,6 +569,7 @@ static int xrx200_probe(struct platform_ @@ -553,6 +568,7 @@ static int xrx200_probe(struct platform_
net_dev->min_mtu = ETH_ZLEN; net_dev->min_mtu = ETH_ZLEN;
net_dev->max_mtu = XRX200_DMA_DATA_LEN - xrx200_max_frame_len(0); net_dev->max_mtu = XRX200_DMA_DATA_LEN - xrx200_max_frame_len(0);
priv->rx_buf_size = xrx200_buffer_size(ETH_DATA_LEN); priv->rx_buf_size = xrx200_buffer_size(ETH_DATA_LEN);
+ priv->rx_skb_size = xrx200_skb_size(priv->rx_buf_size); + priv->rx_skb_size = xrx200_skb_size(priv->rx_buf_size);
/* load the memory ranges */ /* load the memory ranges */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->pmac_reg = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);