net: stmmac: Improvements for -next
Subsystems (4)
v3 cover net: stmmac: Improvements for -next
[ This is just a rebase of v2 into latest -next in order to avoid a merge conflict ]
Couple of improvements for -next tree. More info in commit logs.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
Jose Abreu (10):
net: stmmac: xgmac: Implement MMC counters
net: stmmac: xgmac: Implement set_mtl_tx_queue_weight()
net: stmmac: xgmac: Implement tx_queue_prio()
net: stmmac: Implement RSS and enable it in XGMAC core
net: stmmac: selftests: Add RSS test
net: stmmac: Implement VLAN Hash Filtering in XGMAC
net: stmmac: selftests: Add test for VLAN and Double VLAN Filtering
net: stmmac: Implement Safety Features in XGMAC core
net: stmmac: Add Flexible RX Parser support in XGMAC
net: stmmac: selftests: Add a selftest for Flexible RX Parser
drivers/net/ethernet/stmicro/stmmac/common.h | 6 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 76 ++- .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 605 ++++++++++++++++++++- .../net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 29 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 10 + drivers/net/ethernet/stmicro/stmmac/hwif.c | 4 +- drivers/net/ethernet/stmicro/stmmac/hwif.h | 17 + drivers/net/ethernet/stmicro/stmmac/mmc.h | 9 + drivers/net/ethernet/stmicro/stmmac/mmc_core.c | 192 +++++++ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 11 + .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 81 +++ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 120 +++- .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 322 ++++++++++- include/linux/stmmac.h | 1 + 14 files changed, 1474 insertions(+), 9 deletions(-)
Signature · 1 line
2.7.4
PATCH v3 1/10 net: stmmac: xgmac: Implement MMC counters
Implement the MMC counters feature in XGMAC core.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 1 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 1 + drivers/net/ethernet/stmicro/stmmac/hwif.c | 4 +- drivers/net/ethernet/stmicro/stmmac/hwif.h | 1 + drivers/net/ethernet/stmicro/stmmac/mmc.h | 9 + drivers/net/ethernet/stmicro/stmmac/mmc_core.c | 192 +++++++++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 6 + 7 files changed, 212 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +1 -0
@@ -84,6 +84,7 @@#define XGMAC_HWFEAT_AVSEL BIT(11)#define XGMAC_HWFEAT_RAVSEL BIT(10)#define XGMAC_HWFEAT_ARPOFFSEL BIT(9) +#define XGMAC_HWFEAT_MMCSEL BIT(8)#define XGMAC_HWFEAT_MGKSEL BIT(7)#define XGMAC_HWFEAT_RWKSEL BIT(6)#define XGMAC_HWFEAT_GMIISEL BIT(1)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +1 -0
@@ -356,6 +356,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr, dma_cap->atime_stamp = (hw_cap &XGMAC_HWFEAT_TSSEL ) >>12 ; dma_cap->av = (hw_cap &XGMAC_HWFEAT_AVSEL ) >>11 ; dma_cap->av &= (hw_cap &XGMAC_HWFEAT_RAVSEL ) >>10 ; + dma_cap->rmon = (hw_cap &XGMAC_HWFEAT_MMCSEL ) >>8 ; dma_cap->pmt_magic_frame = (hw_cap &XGMAC_HWFEAT_MGKSEL ) >>7 ; dma_cap->pmt_remote_wake_up = (hw_cap &XGMAC_HWFEAT_RWKSEL ) >>6 ; dma_cap->mbps_1000 = (hw_cap &XGMAC_HWFEAT_GMIISEL ) >>1 ;
drivers/net/ethernet/stmicro/stmmac/hwif.c +2 -2
@@ -201,7 +201,7 @@ static const struct stmmac_hwif_entry { .min_id = DWXGMAC_CORE_2_10, .regs = { .ptp_off = PTP_XGMAC_OFFSET, - .mmc_off = 0, + .mmc_off = MMC_XGMAC_OFFSET, }, .desc = &dwxgmac210_desc_ops, .dma = &dwxgmac210_dma_ops,
@@ -209,7 +209,7 @@ static const struct stmmac_hwif_entry { .hwtimestamp = &stmmac_ptp, .mode = NULL, .tc = &dwmac510_tc_ops, - .mmc = NULL, + .mmc = &dwxgmac_mmc_ops, .setup = dwxgmac2_setup, .quirks = NULL, },
drivers/net/ethernet/stmicro/stmmac/hwif.h +1 -0
@@ -503,6 +503,7 @@ extern const struct stmmac_ops dwxgmac210_ops;extern const struct stmmac_dma_ops dwxgmac210_dma_ops;extern const struct stmmac_desc_ops dwxgmac210_desc_ops;extern const struct stmmac_mmc_ops dwmac_mmc_ops; +extern const struct stmmac_mmc_ops dwxgmac_mmc_ops;#define GMAC_VERSION 0x00000020/* GMAC CORE Version */ #define GMAC4_VERSION 0x00000110/* GMAC4+ CORE Version */
drivers/net/ethernet/stmicro/stmmac/mmc.h +9 -0
@@ -24,6 +24,7 @@#define MMC_GMAC4_OFFSET 0x700#define MMC_GMAC3_X_OFFSET 0x100 +#define MMC_XGMAC_OFFSET 0x800struct stmmac_counters {unsigned int mmc_tx_octetcount_gb;
@@ -116,6 +117,14 @@ struct stmmac_counters {unsigned int mmc_rx_tcp_err_octets;unsigned int mmc_rx_icmp_gd_octets;unsigned int mmc_rx_icmp_err_octets; + +/* FPE */ +unsigned int mmc_tx_fpe_fragment_cntr; +unsigned int mmc_tx_hold_req_cntr; +unsigned int mmc_rx_packet_assembly_err_cntr; +unsigned int mmc_rx_packet_smd_err_cntr; +unsigned int mmc_rx_packet_assembly_ok_cntr; + unsigned int mmc_rx_fpe_fragment_cntr; };#endif /* __MMC_H__ */
drivers/net/ethernet/stmicro/stmmac/mmc_core.c +192 -0
201 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +6 -0
@@ -243,6 +243,12 @@ static const struct stmmac_stats stmmac_mmc[] = {STMMAC_MMC_STAT (mmc_rx_tcp_err_octets),STMMAC_MMC_STAT (mmc_rx_icmp_gd_octets),STMMAC_MMC_STAT (mmc_rx_icmp_err_octets), +STMMAC_MMC_STAT (mmc_tx_fpe_fragment_cntr), +STMMAC_MMC_STAT (mmc_tx_hold_req_cntr), +STMMAC_MMC_STAT (mmc_rx_packet_assembly_err_cntr), +STMMAC_MMC_STAT (mmc_rx_packet_smd_err_cntr), +STMMAC_MMC_STAT (mmc_rx_packet_assembly_ok_cntr), + STMMAC_MMC_STAT(mmc_rx_fpe_fragment_cntr), };#define STMMAC_MMC_STATS_LEN ARRAY_SIZE(stmmac_mmc)
Signature · 1 line
2.7.4
PATCH v3 2/10 net: stmmac: xgmac: Implement set_mtl_tx_queue_weight()
In reply to Jose AbreuImplement the TX Queue Weight callback. In order for this to be active we also need to set ETS algorithm when configuring Queue.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +21 -1
@@ -144,7 +144,9 @@ static void dwxgmac2_prog_mtl_tx_algorithms(struct mac_device_info *hw, u32 tx_alg) {void __iomem *ioaddr = hw->pcsr; +bool ets = true;u32 value; +int i; value =readl (ioaddr +XGMAC_MTL_OPMODE ); value &= ~XGMAC_ETSALG ;
@@ -160,10 +162,28 @@ static void dwxgmac2_prog_mtl_tx_algorithms(struct mac_device_info *hw, value |=XGMAC_DWRR ;break ;default : + ets = false;break ; }writel (value, ioaddr +XGMAC_MTL_OPMODE ); + +/* Set ETS if desired */ +for (i =0 ; i <MTL_MAX_TX_QUEUES ; i++) { + value =readl (ioaddr +XGMAC_MTL_TCx_ETS_CONTROL (i)); + value &= ~XGMAC_TSA ; +if (ets) + value |=XGMAC_ETS ; +writel (value, ioaddr +XGMAC_MTL_TCx_ETS_CONTROL (i)); + } +} + +static void dwxgmac2_set_mtl_tx_queue_weight (struct mac_device_info *hw, +u32 weight,u32 queue) +{ +void __iomem *ioaddr = hw->pcsr; + +writel (weight, ioaddr +XGMAC_MTL_TCx_QUANTUM_WEIGHT (queue)); } static void dwxgmac2_map_mtl_to_dma(struct mac_device_info *hw, u32 queue,
@@ -412,7 +432,7 @@ const struct stmmac_ops dwxgmac210_ops = { .rx_queue_routing = NULL, .prog_mtl_rx_algorithms = dwxgmac2_prog_mtl_rx_algorithms, .prog_mtl_tx_algorithms = dwxgmac2_prog_mtl_tx_algorithms, - .set_mtl_tx_queue_weight = NULL, + .set_mtl_tx_queue_weight = dwxgmac2_set_mtl_tx_queue_weight, .map_mtl_to_dma = dwxgmac2_map_mtl_to_dma, .config_cbs = dwxgmac2_config_cbs, .dump_regs = NULL,
Signature · 1 line
2.7.4
PATCH v3 3/10 net: stmmac: xgmac: Implement tx_queue_prio()
In reply to Jose AbreuImplement the TX Queue Priority callback in XGMAC core.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 4 ++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +4 -0
@@ -127,6 +127,10 @@#define XGMAC_MTL_RXQ_DMA_MAP1 0x00001034#define XGMAC_QxMDMACH (x) GENMASK((x) * 8 + 3, (x) * 8)#define XGMAC_QxMDMACH_SHIFT (x) ((x) * 8) +#define XGMAC_TC_PRTY_MAP0 0x00001040 +#define XGMAC_TC_PRTY_MAP1 0x00001044 +#define XGMAC_PSTC (x) GENMASK((x) * 8 + 7, (x) * 8) +#define XGMAC_PSTC_SHIFT (x) ((x) * 8)#define XGMAC_MTL_TXQ_OPMODE (x) (0x00001100 + (0x80 * (x)))#define XGMAC_TQS GENMASK(25, 16)#define XGMAC_TQS_SHIFT 16
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +18 -1
@@ -118,6 +118,23 @@ static void dwxgmac2_rx_queue_prio(struct mac_device_info *hw, u32 prio,writel (value, ioaddr + reg); } +static void dwxgmac2_tx_queue_prio (struct mac_device_info *hw,u32 prio, +u32 queue) +{ +void __iomem *ioaddr = hw->pcsr; +u32 value, reg; + + reg = (queue <4 ) ?XGMAC_TC_PRTY_MAP0 :XGMAC_TC_PRTY_MAP1 ; +if (queue >=4 ) + queue -=4 ; + + value =readl (ioaddr + reg); + value &= ~XGMAC_PSTC (queue); + value |= (prio <<XGMAC_PSTC_SHIFT (queue)) &XGMAC_PSTC (queue); + +writel (value, ioaddr + reg); +} +static void dwxgmac2_prog_mtl_rx_algorithms (struct mac_device_info *hw,u32 rx_alg) {
@@ -428,7 +445,7 @@ const struct stmmac_ops dwxgmac210_ops = { .rx_ipc = dwxgmac2_rx_ipc, .rx_queue_enable = dwxgmac2_rx_queue_enable, .rx_queue_prio = dwxgmac2_rx_queue_prio, - .tx_queue_prio = NULL, + .tx_queue_prio = dwxgmac2_tx_queue_prio, .rx_queue_routing = NULL, .prog_mtl_rx_algorithms = dwxgmac2_prog_mtl_rx_algorithms, .prog_mtl_tx_algorithms = dwxgmac2_prog_mtl_tx_algorithms,
Signature · 1 line
2.7.4
PATCH v3 4/10 net: stmmac: Implement RSS and enable it in XGMAC core
In reply to Jose AbreuImplement the RSS functionality and add the corresponding callbacks in XGMAC core.
Changes from v1:
- Do not use magic constants (Jakub)
- Use ethtool_rxfh_indir_default() (Jakub)
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: Jakub Kicinski <[email protected]>
--- drivers/net/ethernet/stmicro/stmmac/common.h | 5 ++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 22 ++++++- .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 52 +++++++++++++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 29 +++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 1 + drivers/net/ethernet/stmicro/stmmac/hwif.h | 11 ++++ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 9 +++ .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 75 ++++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 41 +++++++++++- include/linux/stmmac.h | 1 + 10 files changed, 242 insertions(+), 4 deletions(-)
drivers/net/ethernet/stmicro/stmmac/common.h +5 -0
@@ -354,6 +354,7 @@ struct dma_features {unsigned int frpbs;unsigned int frpes;unsigned int addr64; +unsigned int rssen; };/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
@@ -381,6 +382,10 @@ struct dma_features {#define JUMBO_LEN 9000 +/* Receive Side Scaling */ +#define STMMAC_RSS_HASH_KEY_SIZE 40 +#define STMMAC_RSS_MAX_TABLE_SIZE 256 +extern const struct stmmac_desc_ops enh_desc_ops;extern const struct stmmac_desc_ops ndesc_ops;
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +21 -1
@@ -89,6 +89,7 @@#define XGMAC_HWFEAT_RWKSEL BIT(6)#define XGMAC_HWFEAT_GMIISEL BIT(1)#define XGMAC_HW_FEATURE1 0x00000120 +#define XGMAC_HWFEAT_RSSEN BIT(20)#define XGMAC_HWFEAT_TSOEN BIT(18)#define XGMAC_HWFEAT_ADDR64 GENMASK(15, 14)#define XGMAC_HWFEAT_TXFIFOSIZE GENMASK(10, 6)
@@ -109,6 +110,17 @@#define XGMAC_DCS_SHIFT 16#define XGMAC_ADDRx_LOW (x) (0x00000304 + (x) * 0x8)#define XGMAC_ARP_ADDR 0x00000c10 +#define XGMAC_RSS_CTRL 0x00000c80 +#define XGMAC_UDP4TE BIT(3) +#define XGMAC_TCP4TE BIT(2) +#define XGMAC_IP2TE BIT(1) +#define XGMAC_RSSE BIT(0) +#define XGMAC_RSS_ADDR 0x00000c88 +#define XGMAC_RSSIA_SHIFT 8 +#define XGMAC_ADDRT BIT(2) +#define XGMAC_CT BIT(1) +#define XGMAC_OB BIT(0) +#define XGMAC_RSS_DATA 0x00000c8c#define XGMAC_TIMESTAMP_STATUS 0x00000d20#define XGMAC_TXTSC BIT(15)#define XGMAC_TXTIMESTAMP_NSEC 0x00000d30
@@ -125,8 +137,9 @@#define XGMAC_MTL_INT_STATUS 0x00001020#define XGMAC_MTL_RXQ_DMA_MAP0 0x00001030#define XGMAC_MTL_RXQ_DMA_MAP1 0x00001034 -#define XGMAC_QxMDMACH (x) GENMASK((x) * 8 + 3, (x) * 8) +#define XGMAC_QxMDMACH (x) GENMASK((x) * 8 + 7, (x) * 8)#define XGMAC_QxMDMACH_SHIFT (x) ((x) * 8) +#define XGMAC_QDDMACH BIT(7)#define XGMAC_TC_PRTY_MAP0 0x00001040#define XGMAC_TC_PRTY_MAP1 0x00001044#define XGMAC_PSTC (x) GENMASK((x) * 8 + 7, (x) * 8)
@@ -261,6 +274,13 @@#define XGMAC_RDES3_IOC BIT(30)#define XGMAC_RDES3_LD BIT(28)#define XGMAC_RDES3_CDA BIT(27) +#define XGMAC_RDES3_RSV BIT(26) +#define XGMAC_RDES3_L34T GENMASK(23, 20) +#define XGMAC_RDES3_L34T_SHIFT 20 +#define XGMAC_L34T_IP4TCP 0x1 +#define XGMAC_L34T_IP4UDP 0x2 +#define XGMAC_L34T_IP6TCP 0x9 +#define XGMAC_L34T_IP6UDP 0xA#define XGMAC_RDES3_ES BIT(15)#define XGMAC_RDES3_PL GENMASK(13, 0)#define XGMAC_RDES3_TSD BIT(6)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +52 -0
70 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +29 -0
@@ -254,6 +254,34 @@ static void dwxgmac2_clear(struct dma_desc *p) p->des3 =0 ; } +static int dwxgmac2_get_rx_hash (struct dma_desc *p,u32 *hash, +enum pkt_hash_types *type) +{ +unsigned int rdes3 =le32_to_cpu (p->des3); +u32 ptype; + +if (rdes3 &XGMAC_RDES3_RSV ) { + ptype = (rdes3 &XGMAC_RDES3_L34T ) >>XGMAC_RDES3_L34T_SHIFT ; + +switch (ptype) { +case XGMAC_L34T_IP4TCP : +case XGMAC_L34T_IP4UDP : +case XGMAC_L34T_IP6TCP : +case XGMAC_L34T_IP6UDP : + *type =PKT_HASH_TYPE_L4 ; +break ; +default : + *type =PKT_HASH_TYPE_L3 ; +break ; + } + + *hash =le32_to_cpu (p->des1); +return 0 ; + } + +return -EINVAL ; +} +const struct stmmac_desc_ops dwxgmac210_desc_ops = { .tx_status = dwxgmac2_get_tx_status, .rx_status = dwxgmac2_get_rx_status,
@@ -277,4 +305,5 @@ const struct stmmac_desc_ops dwxgmac210_desc_ops = { .get_addr = dwxgmac2_get_addr, .set_addr = dwxgmac2_set_addr, .clear = dwxgmac2_clear, + .get_rx_hash = dwxgmac2_get_rx_hash, };
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +1 -0
@@ -363,6 +363,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr,/* MAC HW feature 1 */ hw_cap =readl (ioaddr +XGMAC_HW_FEATURE1 ); + dma_cap->rssen = (hw_cap &XGMAC_HWFEAT_RSSEN ) >>20 ; dma_cap->tsoen = (hw_cap &XGMAC_HWFEAT_TSOEN ) >>18 ; dma_cap->addr64 = (hw_cap &XGMAC_HWFEAT_ADDR64 ) >>14 ;
drivers/net/ethernet/stmicro/stmmac/hwif.h +11 -0
@@ -86,6 +86,9 @@ struct stmmac_desc_ops {void (*set_addr)(struct dma_desc *p,dma_addr_t addr);/* clear descriptor */ void (*clear)(struct dma_desc *p); +/* RSS */ +int (*get_rx_hash)(struct dma_desc *p,u32 *hash, +enum pkt_hash_types *type); }; #define stmmac_init_rx_desc(__priv, __args...) \
@@ -136,6 +139,8 @@ struct stmmac_desc_ops { stmmac_do_void_callback(__priv, desc, set_addr, __args) #define stmmac_clear_desc(__priv, __args...) \ stmmac_do_void_callback(__priv, desc, clear, __args) +#define stmmac_get_rx_hash(__priv, __args...) \ + stmmac_do_callback(__priv, desc, get_rx_hash, __args)struct stmmac_dma_cfg ;struct dma_features ;
@@ -249,6 +254,7 @@ struct rgmii_adv;struct stmmac_safety_stats ;struct stmmac_tc_entry ;struct stmmac_pps_cfg ; +struct stmmac_rss ;/* Helpers to program the MAC core */ struct stmmac_ops {
@@ -327,6 +333,9 @@ struct stmmac_ops { u32 sub_second_inc, u32 systime_flags);/* Loopback for selftests */ void (*set_mac_loopback)(void __iomem *ioaddr,bool enable); +/* RSS */ +int (*rss_configure)(struct mac_device_info *hw, +struct stmmac_rss *cfg,u32 num_rxq); }; #define stmmac_core_init(__priv, __args...) \
@@ -397,6 +406,8 @@ struct stmmac_ops { stmmac_do_callback(__priv, mac, flex_pps_config, __args) #define stmmac_set_mac_loopback(__priv, __args...) \ stmmac_do_void_callback(__priv, mac, set_mac_loopback, __args) +#define stmmac_rss_configure(__priv, __args...) \ + stmmac_do_callback(__priv, mac, rss_configure, __args)/* PTP and HW Timer helpers */ struct stmmac_hwtimestamp {
drivers/net/ethernet/stmicro/stmmac/stmmac.h +9 -0
@@ -113,6 +113,12 @@ struct stmmac_pps_cfg {struct timespec64 period; }; +struct stmmac_rss { +int enable; +u8 key[STMMAC_RSS_HASH_KEY_SIZE ]; +u32 table[STMMAC_RSS_MAX_TABLE_SIZE ]; +}; +struct stmmac_priv {/* Frequently used values are kept adjacent for cache effect */ u32 tx_coal_frames;
@@ -203,6 +209,9 @@ struct stmmac_priv {/* Pulse Per Second output */ struct stmmac_pps_cfg pps[STMMAC_PPS_MAX ]; + +/* Receive Side Scaling */ +struct stmmac_rss rss; };enum stmmac_state {
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +75 -0
87 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +38 -3
79 lines not on this page · raw message
include/linux/stmmac.h +1 -0
@@ -173,6 +173,7 @@ struct plat_stmmacenet_data {int has_gmac4;bool has_sun8i;bool tso_en; +int rss_en;int mac_port_sel_speed;bool en_tx_lpi_clockgating;int has_xgmac;
Signature · 1 line
2.7.4
PATCH v3 5/10 net: stmmac: selftests: Add RSS test
In reply to Jose AbreuAdd a test for RSS in the stmmac selftests.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +19 -0
@@ -700,6 +700,21 @@ static int stmmac_test_flowctrl(struct stmmac_priv *priv)return ret; } +static int stmmac_test_rss (struct stmmac_priv *priv) +{ +struct stmmac_packet_attrs attr = { }; + +if (!priv->dma_cap.rssen || !priv->rss.enable) +return -EOPNOTSUPP ; + + attr.dst = priv->dev->dev_addr; + attr.exp_hash = true; + attr.sport =0x321 ; + attr.dport =0x123 ; + +return __stmmac_test_loopback (priv, &attr); +} +#define STMMAC_LOOPBACK_NONE 0#define STMMAC_LOOPBACK_MAC 1#define STMMAC_LOOPBACK_PHY 2
@@ -745,6 +760,10 @@ static const struct stmmac_test { .name = "Flow Control ", .lb = STMMAC_LOOPBACK_PHY, .fn = stmmac_test_flowctrl, + }, { + .name = "RSS ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_rss, }, };
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 6/10 net: stmmac: Implement VLAN Hash Filtering in XGMAC
In reply to Jose AbreuImplement the VLAN Hash Filtering feature in XGMAC core.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/common.h | 1 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 10 +++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 41 +++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 1 + drivers/net/ethernet/stmicro/stmmac/hwif.h | 5 ++ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 79 ++++++++++++++++++++++ 7 files changed, 139 insertions(+)
drivers/net/ethernet/stmicro/stmmac/common.h +1 -0
@@ -355,6 +355,7 @@ struct dma_features {unsigned int frpes;unsigned int addr64;unsigned int rssen; +unsigned int vlhash; };/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +10 -0
@@ -44,6 +44,7 @@#define XGMAC_CORE_INIT_RX 0#define XGMAC_PACKET_FILTER 0x00000008#define XGMAC_FILTER_RA BIT(31) +#define XGMAC_FILTER_VTFE BIT(16)#define XGMAC_FILTER_HPF BIT(10)#define XGMAC_FILTER_PCF BIT(7)#define XGMAC_FILTER_PM BIT(4)
@@ -51,6 +52,14 @@#define XGMAC_FILTER_PR BIT(0)#define XGMAC_HASH_TABLE (x) (0x00000010 + (x) * 4)#define XGMAC_MAX_HASH_TABLE 8 +#define XGMAC_VLAN_TAG 0x00000050 +#define XGMAC_VLAN_EDVLP BIT(26) +#define XGMAC_VLAN_VTHM BIT(25) +#define XGMAC_VLAN_DOVLTC BIT(20) +#define XGMAC_VLAN_ESVL BIT(18) +#define XGMAC_VLAN_ETV BIT(16) +#define XGMAC_VLAN_VID GENMASK(15, 0) +#define XGMAC_VLAN_HASH_TABLE 0x00000058#define XGMAC_RXQ_CTRL0 0x000000a0#define XGMAC_RXQEN (x) GENMASK((x) * 2 + 1, (x) * 2)#define XGMAC_RXQEN_SHIFT (x) ((x) * 2)
@@ -87,6 +96,7 @@#define XGMAC_HWFEAT_MMCSEL BIT(8)#define XGMAC_HWFEAT_MGKSEL BIT(7)#define XGMAC_HWFEAT_RWKSEL BIT(6) +#define XGMAC_HWFEAT_VLHASH BIT(4)#define XGMAC_HWFEAT_GMIISEL BIT(1)#define XGMAC_HW_FEATURE1 0x00000120#define XGMAC_HWFEAT_RSSEN BIT(20)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +41 -0
53 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +1 -0
@@ -359,6 +359,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr, dma_cap->rmon = (hw_cap &XGMAC_HWFEAT_MMCSEL ) >>8 ; dma_cap->pmt_magic_frame = (hw_cap &XGMAC_HWFEAT_MGKSEL ) >>7 ; dma_cap->pmt_remote_wake_up = (hw_cap &XGMAC_HWFEAT_RWKSEL ) >>6 ; + dma_cap->vlhash = (hw_cap &XGMAC_HWFEAT_VLHASH ) >>4 ; dma_cap->mbps_1000 = (hw_cap &XGMAC_HWFEAT_GMIISEL ) >>1 ;/* MAC HW feature 1 */
drivers/net/ethernet/stmicro/stmmac/hwif.h +5 -0
@@ -336,6 +336,9 @@ struct stmmac_ops {/* RSS */ int (*rss_configure)(struct mac_device_info *hw,struct stmmac_rss *cfg,u32 num_rxq); +/* VLAN */ +void (*update_vlan_hash)(struct mac_device_info *hw,u32 hash, +bool is_double); }; #define stmmac_core_init(__priv, __args...) \
@@ -408,6 +411,8 @@ struct stmmac_ops { stmmac_do_void_callback(__priv, mac, set_mac_loopback, __args) #define stmmac_rss_configure(__priv, __args...) \ stmmac_do_callback(__priv, mac, rss_configure, __args) +#define stmmac_update_vlan_hash(__priv, __args...) \ + stmmac_do_void_callback(__priv, mac, update_vlan_hash, __args)/* PTP and HW Timer helpers */ struct stmmac_hwtimestamp {
drivers/net/ethernet/stmicro/stmmac/stmmac.h +2 -0
@@ -13,6 +13,7 @@#define DRV_MODULE_VERSION "Jan_2016"#include <linux/clk.h> +#include <linux/if_vlan.h> #include <linux/stmmac.h> #include <linux/phylink.h> #include <linux/pci.h>
@@ -191,6 +192,7 @@ struct stmmac_priv {spinlock_t ptp_lock;void __iomem *mmcaddr;void __iomem *ptpaddr; +unsigned long active_vlans[BITS_TO_LONGS (VLAN_N_VID )];#ifdef CONFIG_DEBUG_FS struct dentry *dbgfs_dir;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +79 -0
97 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 7/10 net: stmmac: selftests: Add test for VLAN and Double VLAN Filtering
In reply to Jose AbreuAdd a selftest for VLAN and Double VLAN Filtering in stmmac.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 205 +++++++++++++++++++++ 1 file changed, 205 insertions(+)
drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +205 -0
@@ -715,6 +715,203 @@ static int stmmac_test_rss(struct stmmac_priv *priv)return __stmmac_test_loopback (priv, &attr); } +static int stmmac_test_vlan_validate (struct sk_buff *skb, +struct net_device *ndev, +struct packet_type *pt, +struct net_device *orig_ndev) +{ +struct stmmac_test_priv *tpriv = pt->af_packet_priv; +struct stmmachdr *shdr; +struct ethhdr *ehdr; +struct udphdr *uhdr; +struct iphdr *ihdr; + + skb =skb_unshare (skb,GFP_ATOMIC ); +if (!skb) + goto out; + +if (skb_linearize (skb)) + goto out; +if (skb_headlen (skb) < (STMMAC_TEST_PKT_SIZE -ETH_HLEN )) + goto out; + + ehdr = (struct ethhdr *)skb_mac_header (skb); +if (!ether_addr_equal (ehdr->h_dest, tpriv->packet->dst)) + goto out; + + ihdr =ip_hdr (skb); +if (tpriv->double_vlan) + ihdr = (struct iphdr *)(skb_network_header (skb) +4 ); +if (ihdr->protocol !=IPPROTO_UDP ) + goto out; + + uhdr = (struct udphdr *)((u8 *)ihdr +4 * ihdr->ihl); +if (uhdr->dest !=htons (tpriv->packet->dport)) + goto out; + + shdr = (struct stmmachdr *)((u8 *)uhdr +sizeof (*uhdr)); +if (shdr->magic !=cpu_to_be64 (STMMAC_TEST_PKT_MAGIC )) + goto out; + + tpriv->ok = true; +complete (&tpriv->comp); + +out: +kfree_skb (skb); +return 0 ; +} + +static int stmmac_test_vlanfilt (struct stmmac_priv *priv) +{ +struct stmmac_packet_attrs attr = { }; +struct stmmac_test_priv *tpriv; +struct sk_buff *skb =NULL ; +int ret =0 , i; + +if (!priv->dma_cap.vlhash) +return -EOPNOTSUPP ; + + tpriv =kzalloc (sizeof (*tpriv),GFP_KERNEL ); +if (!tpriv) +return -ENOMEM ; + + tpriv->ok = false; +init_completion (&tpriv->comp); + + tpriv->pt.type =htons (ETH_P_IP ); + tpriv->pt.func = stmmac_test_vlan_validate; + tpriv->pt.dev = priv->dev; + tpriv->pt.af_packet_priv = tpriv; + tpriv->packet = &attr; + +/* +* As we use HASH filtering, false positives may appear. This is a +* specially chosen ID so that adjacent IDs (+4) have different +* HASH values. +*/ + tpriv->vlan_id =0x123 ; +dev_add_pack (&tpriv->pt); + + ret =vlan_vid_add (priv->dev,htons (ETH_P_8021Q ), tpriv->vlan_id); +if (ret) + goto cleanup; + +for (i =0 ; i <4 ; i++) { + attr.vlan =1 ; + attr.vlan_id_out = tpriv->vlan_id + i; + attr.dst = priv->dev->dev_addr; + attr.sport =9 ; + attr.dport =9 ; + + skb =stmmac_test_get_udp_skb (priv, &attr); +if (!skb) { + ret = -ENOMEM ; + goto vlan_del; + } + +skb_set_queue_mapping (skb,0 ); + ret =dev_queue_xmit (skb); +if (ret) + goto vlan_del; + +wait_for_completion_timeout (&tpriv->comp,STMMAC_LB_TIMEOUT ); + ret = !tpriv->ok; +if (ret && !i) { + goto vlan_del; + }else if (!ret && i) { + ret =-1 ; + goto vlan_del; + }else { + ret =0 ; + } + + tpriv->ok = false; + } + +vlan_del: +vlan_vid_del (priv->dev,htons (ETH_P_8021Q ), tpriv->vlan_id); +cleanup: +dev_remove_pack (&tpriv->pt); +kfree (tpriv); +return ret; +} + +static int stmmac_test_dvlanfilt (struct stmmac_priv *priv) +{ +struct stmmac_packet_attrs attr = { }; +struct stmmac_test_priv *tpriv; +struct sk_buff *skb =NULL ; +int ret =0 , i; + +if (!priv->dma_cap.vlhash) +return -EOPNOTSUPP ; + + tpriv =kzalloc (sizeof (*tpriv),GFP_KERNEL ); +if (!tpriv) +return -ENOMEM ; + + tpriv->ok = false; + tpriv->double_vlan = true; +init_completion (&tpriv->comp); + + tpriv->pt.type =htons (ETH_P_8021Q ); + tpriv->pt.func = stmmac_test_vlan_validate; + tpriv->pt.dev = priv->dev; + tpriv->pt.af_packet_priv = tpriv; + tpriv->packet = &attr; + +/* +* As we use HASH filtering, false positives may appear. This is a +* specially chosen ID so that adjacent IDs (+4) have different +* HASH values. +*/ + tpriv->vlan_id =0x123 ; +dev_add_pack (&tpriv->pt); + + ret =vlan_vid_add (priv->dev,htons (ETH_P_8021AD ), tpriv->vlan_id); +if (ret) + goto cleanup; + +for (i =0 ; i <4 ; i++) { + attr.vlan =2 ; + attr.vlan_id_out = tpriv->vlan_id + i; + attr.dst = priv->dev->dev_addr; + attr.sport =9 ; + attr.dport =9 ; + + skb =stmmac_test_get_udp_skb (priv, &attr); +if (!skb) { + ret = -ENOMEM ; + goto vlan_del; + } + +skb_set_queue_mapping (skb,0 ); + ret =dev_queue_xmit (skb); +if (ret) + goto vlan_del; + +wait_for_completion_timeout (&tpriv->comp,STMMAC_LB_TIMEOUT ); + ret = !tpriv->ok; +if (ret && !i) { + goto vlan_del; + }else if (!ret && i) { + ret =-1 ; + goto vlan_del; + }else { + ret =0 ; + } + + tpriv->ok = false; + } + +vlan_del: +vlan_vid_del (priv->dev,htons (ETH_P_8021AD ), tpriv->vlan_id); +cleanup: +dev_remove_pack (&tpriv->pt); +kfree (tpriv); +return ret; +} +#define STMMAC_LOOPBACK_NONE 0#define STMMAC_LOOPBACK_MAC 1#define STMMAC_LOOPBACK_PHY 2
@@ -764,6 +961,14 @@ static const struct stmmac_test { .name = "RSS ", .lb = STMMAC_LOOPBACK_PHY, .fn = stmmac_test_rss, + }, { + .name = "VLAN Filtering ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_vlanfilt, + }, { + .name = "Double VLAN Filtering", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_dvlanfilt, }, };
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 8/10 net: stmmac: Implement Safety Features in XGMAC core
In reply to Jose AbreuXGMAC also supports Safety Features. This patch implements the configuration and handling of this feature in XGMAC core.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 26 ++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 281 +++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 4 + 3 files changed, 311 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +26 -0
@@ -110,6 +110,12 @@#define XGMAC_HWFEAT_RXCHCNT GENMASK(15, 12)#define XGMAC_HWFEAT_TXQCNT GENMASK(9, 6)#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0) +#define XGMAC_HW_FEATURE3 0x00000128 +#define XGMAC_HWFEAT_ASP GENMASK(15, 14) +#define XGMAC_MAC_DPP_FSM_INT_STATUS 0x00000150 +#define XGMAC_MAC_FSM_CONTROL 0x00000158 +#define XGMAC_PRTYEN BIT(1) +#define XGMAC_TMOUTEN BIT(0)#define XGMAC_MDIO_ADDR 0x00000200#define XGMAC_MDIO_DATA 0x00000204#define XGMAC_MDIO_C22P 0x00000220
@@ -154,6 +160,16 @@#define XGMAC_TC_PRTY_MAP1 0x00001044#define XGMAC_PSTC (x) GENMASK((x) * 8 + 7, (x) * 8)#define XGMAC_PSTC_SHIFT (x) ((x) * 8) +#define XGMAC_MTL_ECC_CONTROL 0x000010c0 +#define XGMAC_MTL_SAFETY_INT_STATUS 0x000010c4 +#define XGMAC_MEUIS BIT(1) +#define XGMAC_MECIS BIT(0) +#define XGMAC_MTL_ECC_INT_ENABLE 0x000010c8 +#define XGMAC_RPCEIE BIT(12) +#define XGMAC_ECEIE BIT(8) +#define XGMAC_RXCEIE BIT(4) +#define XGMAC_TXCEIE BIT(0) +#define XGMAC_MTL_ECC_INT_STATUS 0x000010cc#define XGMAC_MTL_TXQ_OPMODE (x) (0x00001100 + (0x80 * (x)))#define XGMAC_TQS GENMASK(25, 16)#define XGMAC_TQS_SHIFT 16
@@ -218,6 +234,16 @@#define XGMAC_TDPS GENMASK(29, 0)#define XGMAC_RX_EDMA_CTRL 0x00003044#define XGMAC_RDPS GENMASK(29, 0) +#define XGMAC_DMA_SAFETY_INT_STATUS 0x00003064 +#define XGMAC_MCSIS BIT(31) +#define XGMAC_MSUIS BIT(29) +#define XGMAC_MSCIS BIT(28) +#define XGMAC_DEUIS BIT(1) +#define XGMAC_DECIS BIT(0) +#define XGMAC_DMA_ECC_INT_ENABLE 0x00003068 +#define XGMAC_DCEIE BIT(1) +#define XGMAC_TCEIE BIT(0) +#define XGMAC_DMA_ECC_INT_STATUS 0x0000306c#define XGMAC_DMA_CH_CONTROL (x) (0x00003100 + (0x80 * (x)))#define XGMAC_PBLx8 BIT(16)#define XGMAC_DMA_CH_TX_CONTROL (x) (0x00003104 + (0x80 * (x)))
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +281 -0
293 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +4 -0
@@ -399,6 +399,10 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr, ((hw_cap &XGMAC_HWFEAT_TXQCNT ) >>6 ) +1 ; dma_cap->number_rx_queues = ((hw_cap &XGMAC_HWFEAT_RXQCNT ) >>0 ) +1 ; + +/* MAC HW feature 3 */ + hw_cap =readl (ioaddr +XGMAC_HW_FEATURE3 ); + dma_cap->asp = (hw_cap &XGMAC_HWFEAT_ASP ) >>14 ; }static void dwxgmac2_rx_watchdog (void __iomem *ioaddr,u32 riwt,u32 nchan)
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 9/10 net: stmmac: Add Flexible RX Parser support in XGMAC
In reply to Jose AbreuXGMAC cores also support the Flexible RX Parser feature. Add the support for it in the XGMAC core.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 13 ++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 190 +++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 3 + 3 files changed, 206 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +13 -0
@@ -112,6 +112,9 @@#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0)#define XGMAC_HW_FEATURE3 0x00000128#define XGMAC_HWFEAT_ASP GENMASK(15, 14) +#define XGMAC_HWFEAT_FRPES GENMASK(12, 11) +#define XGMAC_HWFEAT_FRPPB GENMASK(10, 9) +#define XGMAC_HWFEAT_FRPSEL BIT(3)#define XGMAC_MAC_DPP_FSM_INT_STATUS 0x00000150#define XGMAC_MAC_FSM_CONTROL 0x00000158#define XGMAC_PRTYEN BIT(1)
@@ -145,6 +148,7 @@/* MTL Registers */ #define XGMAC_MTL_OPMODE 0x00001000 +#define XGMAC_FRPE BIT(15)#define XGMAC_ETSALG GENMASK(6, 5)#define XGMAC_WRR (0x0 << 5)#define XGMAC_WFQ (0x1 << 5)
@@ -160,6 +164,15 @@#define XGMAC_TC_PRTY_MAP1 0x00001044#define XGMAC_PSTC (x) GENMASK((x) * 8 + 7, (x) * 8)#define XGMAC_PSTC_SHIFT (x) ((x) * 8) +#define XGMAC_MTL_RXP_CONTROL_STATUS 0x000010a0 +#define XGMAC_RXPI BIT(31) +#define XGMAC_NPE GENMASK(23, 16) +#define XGMAC_NVE GENMASK(7, 0) +#define XGMAC_MTL_RXP_IACC_CTRL_ST 0x000010b0 +#define XGMAC_STARTBUSY BIT(31) +#define XGMAC_WRRDN BIT(16) +#define XGMAC_ADDR GENMASK(9, 0) +#define XGMAC_MTL_RXP_IACC_DATA 0x000010b4#define XGMAC_MTL_ECC_CONTROL 0x000010c0#define XGMAC_MTL_SAFETY_INT_STATUS 0x000010c4#define XGMAC_MEUIS BIT(1)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +190 -0
202 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +3 -0
@@ -403,6 +403,9 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr,/* MAC HW feature 3 */ hw_cap =readl (ioaddr +XGMAC_HW_FEATURE3 ); dma_cap->asp = (hw_cap &XGMAC_HWFEAT_ASP ) >>14 ; + dma_cap->frpes = (hw_cap &XGMAC_HWFEAT_FRPES ) >>11 ; + dma_cap->frpbs = (hw_cap &XGMAC_HWFEAT_FRPPB ) >>9 ; + dma_cap->frpsel = (hw_cap &XGMAC_HWFEAT_FRPSEL ) >>3 ; }static void dwxgmac2_rx_watchdog (void __iomem *ioaddr,u32 riwt,u32 nchan)
Signature · 1 line
2.7.4
PATCH v3 10/10 net: stmmac: selftests: Add a selftest for Flexible RX Parser
In reply to Jose AbreuAdd a selftest for the Flexible RX Parser feature.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 98 +++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +97 -1
@@ -11,8 +11,10 @@#include <linux/ip.h> #include <linux/phy.h> #include <linux/udp.h> +#include <net/pkt_cls.h> #include <net/tcp.h> #include <net/udp.h> +#include <net/tc_act/tc_gact.h> #include "stmmac.h" struct stmmachdr {
@@ -229,7 +231,7 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb, goto out; }if (tpriv->packet->src) { -if (!ether_addr_equal (ehdr->h_source, orig_ndev->dev_addr)) +if (!ether_addr_equal (ehdr->h_source, tpriv->packet->src)) goto out; }
@@ -912,6 +914,96 @@ static int stmmac_test_dvlanfilt(struct stmmac_priv *priv)return ret; } +#ifdef CONFIG_NET_CLS_ACT +static int stmmac_test_rxp (struct stmmac_priv *priv) +{ +unsigned char addr[ETH_ALEN ] = {0xde ,0xad ,0xbe ,0xef ,0x00 ,0x00 }; +struct tc_cls_u32_offload cls_u32 = { }; +struct stmmac_packet_attrs attr = { }; +struct tc_action **actions, *act; +struct tc_u32_sel *sel; +struct tcf_exts *exts; +int ret, i, nk =1 ; + +if (!tc_can_offload (priv->dev)) +return -EOPNOTSUPP ; +if (!priv->dma_cap.frpsel) +return -EOPNOTSUPP ; + + sel =kzalloc (sizeof (*sel) + nk *sizeof (struct tc_u32_key ),GFP_KERNEL ); +if (!sel) +return -ENOMEM ; + + exts =kzalloc (sizeof (*exts),GFP_KERNEL ); +if (!exts) { + ret = -ENOMEM ; + goto cleanup_sel; + } + + actions =kzalloc (nk *sizeof (*actions),GFP_KERNEL ); +if (!actions) { + ret = -ENOMEM ; + goto cleanup_exts; + } + + act =kzalloc (nk *sizeof (*act),GFP_KERNEL ); +if (!act) { + ret = -ENOMEM ; + goto cleanup_actions; + } + + cls_u32.command =TC_CLSU32_NEW_KNODE ; + cls_u32.common.chain_index =0 ; + cls_u32.common.protocol =htons (ETH_P_ALL ); + cls_u32.knode.exts = exts; + cls_u32.knode.sel = sel; + cls_u32.knode.handle =0x123 ; + + exts->nr_actions = nk; + exts->actions = actions; +for (i =0 ; i < nk; i++) { +struct tcf_gact *gact =to_gact (&act[i]); + + actions[i] = &act[i]; + gact->tcf_action =TC_ACT_SHOT ; + } + + sel->nkeys = nk; + sel->offshift =0 ; + sel->keys[0 ].off =6 ; + sel->keys[0 ].val =htonl (0xdeadbeef ); + sel->keys[0 ].mask = ~0x0 ; + + ret =stmmac_tc_setup_cls_u32 (priv, priv, &cls_u32); +if (ret) + goto cleanup_act; + + attr.dst = priv->dev->dev_addr; + attr.src = addr; + + ret =__stmmac_test_loopback (priv, &attr); + ret = !ret;/* Shall NOT receive packet */ + + cls_u32.command =TC_CLSU32_DELETE_KNODE ; +stmmac_tc_setup_cls_u32 (priv, priv, &cls_u32); + +cleanup_act: +kfree (act); +cleanup_actions: +kfree (actions); +cleanup_exts: +kfree (exts); +cleanup_sel: +kfree (sel); +return ret; +} +#else +static int stmmac_test_rxp (struct stmmac_priv *priv) +{ +return -EOPNOTSUPP ; +} +#endif +#define STMMAC_LOOPBACK_NONE 0#define STMMAC_LOOPBACK_MAC 1#define STMMAC_LOOPBACK_PHY 2
@@ -969,6 +1061,10 @@ static const struct stmmac_test { .name = "Double VLAN Filtering", .lb = STMMAC_LOOPBACK_PHY, .fn = stmmac_test_dvlanfilt, + }, { + .name = "Flexible RX Parser ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_rxp, }, };
Signature · 1 line
2.7.4
David Miller
maintainerFrom: Jose Abreu <[email protected]>
Date: Wed, 7 Aug 2019 10:03:08 +0200
Quoted 4 lines
[ This is just a rebase of v2 into latest -next in order to avoid a merge conflict ]
Couple of improvements for -next tree. More info in commit logs.
Series applied, thank you.