net: stmmac: Improvements for -next
Subsystems (4)
PATCH v3 6/12 net: stmmac: dwxgmac: Add Flexible PPS support
In reply to Jose AbreuAdd the support for Flexible PPS in XGMAC cores.
---
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 | 19 ++++++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 56 ++++++++++++++++++++++ 2 files changed, 75 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +19 -0
@@ -149,6 +149,25 @@#define XGMAC_TXTIMESTAMP_NSEC 0x00000d30#define XGMAC_TXTSSTSLO GENMASK(30, 0)#define XGMAC_TXTIMESTAMP_SEC 0x00000d34 +#define XGMAC_PPS_CONTROL 0x00000d70 +#define XGMAC_PPS_MAXIDX (x) ((((x) + 1) * 8) - 1) +#define XGMAC_PPS_MINIDX (x) ((x) * 8) +#define XGMAC_PPSx_MASK (x) \ + GENMASK(XGMAC_PPS_MAXIDX(x), XGMAC_PPS_MINIDX(x)) +#define XGMAC_TRGTMODSELx (x, val) \ + GENMASK(XGMAC_PPS_MAXIDX(x) - 1, XGMAC_PPS_MAXIDX(x) - 2) & \ + ((val) << (XGMAC_PPS_MAXIDX(x) - 2)) +#define XGMAC_PPSCMDx (x, val) \ + GENMASK(XGMAC_PPS_MINIDX(x) + 3, XGMAC_PPS_MINIDX(x)) & \ + ((val) << XGMAC_PPS_MINIDX(x)) +#define XGMAC_PPSCMD_START 0x2 +#define XGMAC_PPSCMD_STOP 0x5 +#define XGMAC_PPSEN0 BIT(4) +#define XGMAC_PPSx_TARGET_TIME_SEC (x) (0x00000d80 + (x) * 0x10) +#define XGMAC_PPSx_TARGET_TIME_NSEC (x) (0x00000d84 + (x) * 0x10) +#define XGMAC_TRGTBUSY0 BIT(31) +#define XGMAC_PPSx_INTERVAL (x) (0x00000d88 + (x) * 0x10) +#define XGMAC_PPSx_WIDTH (x) (0x00000d8c + (x) * 0x10)/* MTL Registers */ #define XGMAC_MTL_OPMODE 0x00001000
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +56 -0
74 lines not on this page · raw message
Signature · 1 line
2.7.4
v3 cover net: stmmac: Improvements for -next
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 (12):
net: stmmac: Get correct timestamp values from XGMAC
net: stmmac: Prepare to add Split Header support
net: stmmac: xgmac: Correctly return that RX descriptor is not last
one
net: stmmac: Add Split Header support and enable it in XGMAC cores
net: stmmac: Add a counter for Split Header packets
net: stmmac: dwxgmac: Add Flexible PPS support
net: stmmac: Add ethtool register dump for XGMAC cores
net: stmmac: Add support for SA Insertion/Replacement in XGMAC cores
net: stmmac: selftests: Add tests for SA Insertion/Replacement
net: stmmac: xgmac: Add EEE support
net: stmmac: Add support for VLAN Insertion Offload
net: stmmac: selftests: Add selftest for VLAN TX Offload
drivers/net/ethernet/stmicro/stmmac/common.h | 10 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 56 ++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 182 ++++++++++++- .../net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 85 +++++- drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 31 ++- drivers/net/ethernet/stmicro/stmmac/hwif.h | 30 +++ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 10 + .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 24 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 286 ++++++++++++++++----- .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 194 +++++++++++++- 10 files changed, 817 insertions(+), 91 deletions(-)
Signature · 1 line
2.7.4
PATCH v3 3/12 net: stmmac: xgmac: Correctly return that RX descriptor is not last one
Return the correct value when RX descriptor is not the last one.
---
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_descs.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +3 -4
@@ -26,16 +26,15 @@ static int dwxgmac2_get_rx_status(void *data, struct stmmac_extra_stats *x, struct dma_desc *p) {unsigned int rdes3 =le32_to_cpu (p->des3); -int ret = good_frame;if (unlikely (rdes3 &XGMAC_RDES3_OWN ))return dma_own;if (likely (!(rdes3 &XGMAC_RDES3_LD ))) +return rx_not_ls; +if (unlikely ((rdes3 &XGMAC_RDES3_ES ) && (rdes3 &XGMAC_RDES3_LD )))return discard_frame; -if (unlikely (rdes3 &XGMAC_RDES3_ES )) - ret = discard_frame; -return ret; +return good_frame; }static int dwxgmac2_get_tx_len (struct dma_desc *p)
Signature · 1 line
2.7.4
PATCH v3 5/12 net: stmmac: Add a counter for Split Header packets
In reply to Jose AbreuAdd a counter that increments each time a packet with split header is received.
---
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/stmmac_ethtool.c | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 1 + 3 files changed, 3 insertions(+)
drivers/net/ethernet/stmicro/stmmac/common.h +1 -0
@@ -75,6 +75,7 @@ struct stmmac_extra_stats {unsigned long rx_missed_cntr;unsigned long rx_overflow_cntr;unsigned long rx_vlan; +unsigned long rx_split_hdr_pkt_n;/* Tx/Rx IRQ error info */ unsigned long tx_undeflow_irq;unsigned long tx_process_stopped_irq;
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +1 -0
@@ -65,6 +65,7 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = {STMMAC_STAT (rx_missed_cntr),STMMAC_STAT (rx_overflow_cntr),STMMAC_STAT (rx_vlan), +STMMAC_STAT (rx_split_hdr_pkt_n),/* Tx/Rx IRQ error info */ STMMAC_STAT (tx_undeflow_irq), STMMAC_STAT(tx_process_stopped_irq),
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -0
@@ -3503,6 +3503,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) len = hlen;prefetch (page_address (buf->sec_page)); + priv->xstats.rx_split_hdr_pkt_n++; } skb =napi_alloc_skb (&ch->rx_napi, len);
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 11/12 net: stmmac: Add support for VLAN Insertion Offload
In reply to Jose AbreuAdds the logic to insert a given VLAN ID in a packet. This is offloaded to HW and its descriptor based. For now, only XGMAC implements the necessary callbacks.
---
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 | 8 ++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 15 +++++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 14 ++++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 35 +++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 2 + drivers/net/ethernet/stmicro/stmmac/hwif.h | 10 +++++ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 52 +++++++++++++++++++++- 7 files changed, 135 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/common.h +8 -0
@@ -358,6 +358,8 @@ struct dma_features {unsigned int rssen;unsigned int vlhash;unsigned int sphen; +unsigned int vlins; +unsigned int dvlan; };/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
@@ -389,6 +391,12 @@ struct dma_features {#define STMMAC_RSS_HASH_KEY_SIZE 40#define STMMAC_RSS_MAX_TABLE_SIZE 256 +/* VLAN */ +#define STMMAC_VLAN_NONE 0x0 +#define STMMAC_VLAN_REMOVE 0x1 +#define STMMAC_VLAN_INSERT 0x2 +#define STMMAC_VLAN_REPLACE 0x3 +extern const struct stmmac_desc_ops enh_desc_ops;extern const struct stmmac_desc_ops ndesc_ops;
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +15 -0
@@ -63,6 +63,11 @@#define XGMAC_VLAN_ETV BIT(16)#define XGMAC_VLAN_VID GENMASK(15, 0)#define XGMAC_VLAN_HASH_TABLE 0x00000058 +#define XGMAC_VLAN_INCL 0x00000060 +#define XGMAC_VLAN_VLTI BIT(20) +#define XGMAC_VLAN_CSVL BIT(19) +#define XGMAC_VLAN_VLC GENMASK(17, 16) +#define XGMAC_VLAN_VLC_SHIFT 16#define XGMAC_RXQ_CTRL0 0x000000a0#define XGMAC_RXQEN (x) GENMASK((x) * 2 + 1, (x) * 2)#define XGMAC_RXQEN_SHIFT (x) ((x) * 2)
@@ -128,6 +133,7 @@#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0)#define XGMAC_HW_FEATURE3 0x00000128#define XGMAC_HWFEAT_ASP GENMASK(15, 14) +#define XGMAC_HWFEAT_DVLAN BIT(13)#define XGMAC_HWFEAT_FRPES GENMASK(12, 11)#define XGMAC_HWFEAT_FRPPB GENMASK(10, 9)#define XGMAC_HWFEAT_FRPSEL BIT(3)
@@ -337,10 +343,14 @@#define XGMAC_REGSIZE ((0x0000317c + (0x80 * 15)) / 4)/* Descriptors */ +#define XGMAC_TDES2_IVT GENMASK(31, 16) +#define XGMAC_TDES2_IVT_SHIFT 16#define XGMAC_TDES2_IOC BIT(31)#define XGMAC_TDES2_TTSE BIT(30)#define XGMAC_TDES2_B2L GENMASK(29, 16)#define XGMAC_TDES2_B2L_SHIFT 16 +#define XGMAC_TDES2_VTIR GENMASK(15, 14) +#define XGMAC_TDES2_VTIR_SHIFT 14#define XGMAC_TDES2_B1L GENMASK(13, 0)#define XGMAC_TDES3_OWN BIT(31)#define XGMAC_TDES3_CTXT BIT(30)
@@ -353,10 +363,15 @@#define XGMAC_TDES3_SAIC_SHIFT 23#define XGMAC_TDES3_THL GENMASK(22, 19)#define XGMAC_TDES3_THL_SHIFT 19 +#define XGMAC_TDES3_IVTIR GENMASK(19, 18) +#define XGMAC_TDES3_IVTIR_SHIFT 18#define XGMAC_TDES3_TSE BIT(18) +#define XGMAC_TDES3_IVLTV BIT(17)#define XGMAC_TDES3_CIC GENMASK(17, 16)#define XGMAC_TDES3_CIC_SHIFT 16#define XGMAC_TDES3_TPL GENMASK(17, 0) +#define XGMAC_TDES3_VLTV BIT(16) +#define XGMAC_TDES3_VT GENMASK(15, 0)#define XGMAC_TDES3_FL GENMASK(14, 0)#define XGMAC_RDES2_HL GENMASK(9, 0)#define XGMAC_RDES3_OWN BIT(31)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +14 -0
@@ -1150,6 +1150,19 @@ static void dwxgmac2_sarc_configure(void __iomem *ioaddr, int val)writel (value, ioaddr +XGMAC_TX_CONFIG ); } +static void dwxgmac2_enable_vlan (struct mac_device_info *hw,u32 type) +{ +void __iomem *ioaddr = hw->pcsr; +u32 value; + + value =readl (ioaddr +XGMAC_VLAN_INCL ); + value |=XGMAC_VLAN_VLTI ; + value |=XGMAC_VLAN_CSVL ;/* Only use SVLAN */ + value &= ~XGMAC_VLAN_VLC ; + value |= (type <<XGMAC_VLAN_VLC_SHIFT ) &XGMAC_VLAN_VLC ; +writel (value, ioaddr +XGMAC_VLAN_INCL ); +} +const struct stmmac_ops dwxgmac210_ops = { .core_init = dwxgmac2_core_init, .set_mac = dwxgmac2_set_mac,
@@ -1189,6 +1202,7 @@ const struct stmmac_ops dwxgmac210_ops = { .get_mac_tx_timestamp = dwxgmac2_get_mac_tx_timestamp, .flex_pps_config = dwxgmac2_flex_pps_config, .sarc_configure = dwxgmac2_sarc_configure, + .enable_vlan = dwxgmac2_enable_vlan, };int dwxgmac2_setup (struct stmmac_priv *priv)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +35 -0
@@ -305,6 +305,39 @@ static void dwxgmac2_set_sarc(struct dma_desc *p, u32 sarc_type) p->des3 |=cpu_to_le32 (sarc_type &XGMAC_TDES3_SAIC ); } +static void dwxgmac2_set_vlan_tag (struct dma_desc *p,u16 tag,u16 inner_tag, +u32 inner_type) +{ + p->des0 =0 ; + p->des1 =0 ; + p->des2 =0 ; + p->des3 =0 ; + +/* Inner VLAN */ +if (inner_type) { +u32 des = inner_tag <<XGMAC_TDES2_IVT_SHIFT ; + + des &=XGMAC_TDES2_IVT ; + p->des2 =cpu_to_le32 (des); + + des = inner_type <<XGMAC_TDES3_IVTIR_SHIFT ; + des &=XGMAC_TDES3_IVTIR ; + p->des3 =cpu_to_le32 (des |XGMAC_TDES3_IVLTV ); + } + +/* Outer VLAN */ + p->des3 |=cpu_to_le32 (tag &XGMAC_TDES3_VT ); + p->des3 |=cpu_to_le32 (XGMAC_TDES3_VLTV ); + + p->des3 |=cpu_to_le32 (XGMAC_TDES3_CTXT ); +} + +static void dwxgmac2_set_vlan (struct dma_desc *p,u32 type) +{ + type <<=XGMAC_TDES2_VTIR_SHIFT ; + p->des2 |=cpu_to_le32 (type &XGMAC_TDES2_VTIR ); +} +const struct stmmac_desc_ops dwxgmac210_desc_ops = { .tx_status = dwxgmac2_get_tx_status, .rx_status = dwxgmac2_get_rx_status,
@@ -332,4 +365,6 @@ const struct stmmac_desc_ops dwxgmac210_desc_ops = { .get_rx_header_len = dwxgmac2_get_rx_header_len, .set_sec_addr = dwxgmac2_set_sec_addr, .set_sarc = dwxgmac2_set_sarc, + .set_vlan_tag = dwxgmac2_set_vlan_tag, + .set_vlan = dwxgmac2_set_vlan, };
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +2 -0
@@ -359,6 +359,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr,/* MAC HW feature 0 */ hw_cap =readl (ioaddr +XGMAC_HW_FEATURE0 ); + dma_cap->vlins = (hw_cap &XGMAC_HWFEAT_SAVLANINS ) >>27 ; dma_cap->rx_coe = (hw_cap &XGMAC_HWFEAT_RXCOESEL ) >>16 ; dma_cap->tx_coe = (hw_cap &XGMAC_HWFEAT_TXCOESEL ) >>14 ; dma_cap->eee = (hw_cap &XGMAC_HWFEAT_EEESEL ) >>13 ;
@@ -413,6 +414,7 @@ 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->dvlan = (hw_cap &XGMAC_HWFEAT_DVLAN ) >>13 ; 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 ;
drivers/net/ethernet/stmicro/stmmac/hwif.h +10 -0
@@ -92,6 +92,9 @@ struct stmmac_desc_ops {int (*get_rx_header_len)(struct dma_desc *p,unsigned int *len);void (*set_sec_addr)(struct dma_desc *p,dma_addr_t addr);void (*set_sarc)(struct dma_desc *p,u32 sarc_type); +void (*set_vlan_tag)(struct dma_desc *p,u16 tag,u16 inner_tag, +u32 inner_type); +void (*set_vlan)(struct dma_desc *p,u32 type); }; #define stmmac_init_rx_desc(__priv, __args...) \
@@ -150,6 +153,10 @@ struct stmmac_desc_ops { stmmac_do_void_callback(__priv, desc, set_sec_addr, __args) #define stmmac_set_desc_sarc(__priv, __args...) \ stmmac_do_void_callback(__priv, desc, set_sarc, __args) +#define stmmac_set_desc_vlan_tag(__priv, __args...) \ + stmmac_do_void_callback(__priv, desc, set_vlan_tag, __args) +#define stmmac_set_desc_vlan(__priv, __args...) \ + stmmac_do_void_callback(__priv, desc, set_vlan, __args)struct stmmac_dma_cfg ;struct dma_features ;
@@ -351,6 +358,7 @@ struct stmmac_ops {/* VLAN */ void (*update_vlan_hash)(struct mac_device_info *hw,u32 hash,bool is_double); +void (*enable_vlan)(struct mac_device_info *hw,u32 type);/* TX Timestamp */ int (*get_mac_tx_timestamp)(struct mac_device_info *hw,u64 *ts);/* Source Address Insertion / Replacement */
@@ -429,6 +437,8 @@ struct stmmac_ops { 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) +#define stmmac_enable_vlan(__priv, __args...) \ + stmmac_do_void_callback(__priv, mac, enable_vlan, __args) #define stmmac_get_mac_tx_timestamp(__priv, __args...) \ stmmac_do_callback(__priv, mac, get_mac_tx_timestamp, __args) #define stmmac_sarc_configure(__priv, __args...) \
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +51 -1
111 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 4/12 net: stmmac: Add Split Header support and enable it in XGMAC cores
In reply to Jose AbreuAdd the support for Split Header feature in the RX path and enable it in XGMAC cores.
This does not impact neither beneficts bandwidth but it does reduces CPU usage because without the feature all the entire packet is memcpy'ed, while that with the feature only the header is.
With Split Header disabled 'perf stat -d' gives:
86870.624945 task-clock (msec) # 0.429 CPUs utilized
1073352 context-switches # 0.012 M/sec
1 cpu-migrations # 0.000 K/sec
213 page-faults # 0.002 K/sec
327113872376 cycles # 3.766 GHz (62.53%)
56618161216 instructions # 0.17 insn per cycle (75.06%)
10742205071 branches # 123.658 M/sec (75.36%)
584309242 branch-misses # 5.44% of all branches (75.19%)
17594787965 L1-dcache-loads # 202.540 M/sec (74.88%)
4003773131 L1-dcache-load-misses # 22.76% of all L1-dcache hits (74.89%)
1313301468 LLC-loads # 15.118 M/sec (49.75%)
355906510 LLC-load-misses # 27.10% of all LL-cache hits (49.92%)With Split Header enabled 'perf stat -d' gives:
49324.456539 task-clock (msec) # 0.245 CPUs utilized
2542387 context-switches # 0.052 M/sec
1 cpu-migrations # 0.000 K/sec
213 page-faults # 0.004 K/sec
177092791469 cycles # 3.590 GHz (62.30%)
68555756017 instructions # 0.39 insn per cycle (75.16%)
12697019382 branches # 257.418 M/sec (74.81%)
442081897 branch-misses # 3.48% of all branches (74.79%)
20337958358 L1-dcache-loads # 412.330 M/sec (75.46%)
3820210140 L1-dcache-load-misses # 18.78% of all L1-dcache hits (75.35%)
1257719198 LLC-loads # 25.499 M/sec (49.73%)
685543923 LLC-load-misses # 54.51% of all LL-cache hits (49.86%)Changes from v2:
- Reword commit message (Jakub)
Changes from v1:
- Add performance info (David)
- Add misssing dma_sync_single_for_device()
---
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 | 6 ++ .../net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 18 +++++- drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 18 ++++++ drivers/net/ethernet/stmicro/stmmac/hwif.h | 9 +++ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 3 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 75 +++++++++++++++++++++- 7 files changed, 128 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/common.h +1 -0
@@ -356,6 +356,7 @@ struct dma_features {unsigned int addr64;unsigned int rssen;unsigned int vlhash; +unsigned int sphen; };/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +6 -0
@@ -32,6 +32,9 @@#define XGMAC_CONFIG_ARPEN BIT(31)#define XGMAC_CONFIG_GPSL GENMASK(29, 16)#define XGMAC_CONFIG_GPSL_SHIFT 16 +#define XGMAC_CONFIG_HDSMS GENMASK(14, 12) +#define XGMAC_CONFIG_HDSMS_SHIFT 12 +#define XGMAC_CONFIG_HDSMS_256 (0x2 << XGMAC_CONFIG_HDSMS_SHIFT)#define XGMAC_CONFIG_S2KP BIT(11)#define XGMAC_CONFIG_LM BIT(10)#define XGMAC_CONFIG_IPC BIT(9)
@@ -101,6 +104,7 @@#define XGMAC_HW_FEATURE1 0x00000120#define XGMAC_HWFEAT_RSSEN BIT(20)#define XGMAC_HWFEAT_TSOEN BIT(18) +#define XGMAC_HWFEAT_SPHEN BIT(17)#define XGMAC_HWFEAT_ADDR64 GENMASK(15, 14)#define XGMAC_HWFEAT_TXFIFOSIZE GENMASK(10, 6)#define XGMAC_HWFEAT_RXFIFOSIZE GENMASK(4, 0)
@@ -258,6 +262,7 @@#define XGMAC_TCEIE BIT(0)#define XGMAC_DMA_ECC_INT_STATUS 0x0000306c#define XGMAC_DMA_CH_CONTROL (x) (0x00003100 + (0x80 * (x))) +#define XGMAC_SPH BIT(24)#define XGMAC_PBLx8 BIT(16)#define XGMAC_DMA_CH_TX_CONTROL (x) (0x00003104 + (0x80 * (x)))#define XGMAC_TxPBL GENMASK(21, 16)
@@ -318,6 +323,7 @@#define XGMAC_TDES3_CIC_SHIFT 16#define XGMAC_TDES3_TPL GENMASK(17, 0)#define XGMAC_TDES3_FL GENMASK(14, 0) +#define XGMAC_RDES2_HL GENMASK(9, 0)#define XGMAC_RDES3_OWN BIT(31)#define XGMAC_RDES3_CTXT BIT(30)#define XGMAC_RDES3_IOC BIT(30)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +17 -1
@@ -29,6 +29,8 @@ static int dwxgmac2_get_rx_status(void *data, struct stmmac_extra_stats *x,if (unlikely (rdes3 &XGMAC_RDES3_OWN ))return dma_own; +if (unlikely (rdes3 &XGMAC_RDES3_CTXT )) +return discard_frame;if (likely (!(rdes3 &XGMAC_RDES3_LD )))return rx_not_ls;if (unlikely ((rdes3 &XGMAC_RDES3_ES ) && (rdes3 &XGMAC_RDES3_LD )))
@@ -54,7 +56,7 @@ static void dwxgmac2_set_tx_owner(struct dma_desc *p)static void dwxgmac2_set_rx_owner (struct dma_desc *p,int disable_rx_ic) { - p->des3 =cpu_to_le32 (XGMAC_RDES3_OWN ); + p->des3 |=cpu_to_le32 (XGMAC_RDES3_OWN );if (!disable_rx_ic) p->des3 |=cpu_to_le32 (XGMAC_RDES3_IOC );
@@ -284,6 +286,18 @@ static int dwxgmac2_get_rx_hash(struct dma_desc *p, u32 *hash,return -EINVAL ; } +static int dwxgmac2_get_rx_header_len (struct dma_desc *p,unsigned int *len) +{ + *len =le32_to_cpu (p->des2) &XGMAC_RDES2_HL ; +return 0 ; +} + +static void dwxgmac2_set_sec_addr (struct dma_desc *p,dma_addr_t addr) +{ + p->des2 =cpu_to_le32 (lower_32_bits (addr)); + p->des3 =cpu_to_le32 (upper_32_bits (addr)); +} +const struct stmmac_desc_ops dwxgmac210_desc_ops = { .tx_status = dwxgmac2_get_tx_status, .rx_status = dwxgmac2_get_rx_status,
@@ -308,4 +322,6 @@ const struct stmmac_desc_ops dwxgmac210_desc_ops = { .set_addr = dwxgmac2_set_addr, .clear = dwxgmac2_clear, .get_rx_hash = dwxgmac2_get_rx_hash, + .get_rx_header_len = dwxgmac2_get_rx_header_len, + .set_sec_addr = dwxgmac2_set_sec_addr, };
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +18 -0
@@ -366,6 +366,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr, 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->sphen = (hw_cap &XGMAC_HWFEAT_SPHEN ) >>17 ; dma_cap->addr64 = (hw_cap &XGMAC_HWFEAT_ADDR64 ) >>14 ;switch (dma_cap->addr64) {
@@ -472,6 +473,22 @@ static void dwxgmac2_set_bfsize(void __iomem *ioaddr, int bfsize, u32 chan)writel (value, ioaddr +XGMAC_DMA_CH_RX_CONTROL (chan)); } +static void dwxgmac2_enable_sph (void __iomem *ioaddr,bool en,u32 chan) +{ +u32 value =readl (ioaddr +XGMAC_RX_CONFIG ); + + value &= ~XGMAC_CONFIG_HDSMS ; + value |=XGMAC_CONFIG_HDSMS_256 ;/* Segment max 256 bytes */ +writel (value, ioaddr +XGMAC_RX_CONFIG ); + + value =readl (ioaddr +XGMAC_DMA_CH_CONTROL (chan)); +if (en) + value |=XGMAC_SPH ; +else + value &= ~XGMAC_SPH ; +writel (value, ioaddr +XGMAC_DMA_CH_CONTROL (chan)); +} +const struct stmmac_dma_ops dwxgmac210_dma_ops = { .reset = dwxgmac2_dma_reset, .init = dwxgmac2_dma_init,
@@ -498,4 +515,5 @@ const struct stmmac_dma_ops dwxgmac210_dma_ops = { .enable_tso = dwxgmac2_enable_tso, .qmode = dwxgmac2_qmode, .set_bfsize = dwxgmac2_set_bfsize, + .enable_sph = dwxgmac2_enable_sph, };
drivers/net/ethernet/stmicro/stmmac/hwif.h +9 -0
@@ -89,6 +89,8 @@ struct stmmac_desc_ops {/* RSS */ int (*get_rx_hash)(struct dma_desc *p,u32 *hash,enum pkt_hash_types *type); +int (*get_rx_header_len)(struct dma_desc *p,unsigned int *len); +void (*set_sec_addr)(struct dma_desc *p,dma_addr_t addr); }; #define stmmac_init_rx_desc(__priv, __args...) \
@@ -141,6 +143,10 @@ struct stmmac_desc_ops { stmmac_do_void_callback(__priv, desc, clear, __args) #define stmmac_get_rx_hash(__priv, __args...) \ stmmac_do_callback(__priv, desc, get_rx_hash, __args) +#define stmmac_get_rx_header_len(__priv, __args...) \ + stmmac_do_callback(__priv, desc, get_rx_header_len, __args) +#define stmmac_set_desc_sec_addr(__priv, __args...) \ + stmmac_do_void_callback(__priv, desc, set_sec_addr, __args)struct stmmac_dma_cfg ;struct dma_features ;
@@ -191,6 +197,7 @@ struct stmmac_dma_ops {void (*enable_tso)(void __iomem *ioaddr,bool en,u32 chan);void (*qmode)(void __iomem *ioaddr,u32 channel,u8 qmode);void (*set_bfsize)(void __iomem *ioaddr,int bfsize,u32 chan); +void (*enable_sph)(void __iomem *ioaddr,bool en,u32 chan); }; #define stmmac_reset(__priv, __args...) \
@@ -247,6 +254,8 @@ struct stmmac_dma_ops { stmmac_do_void_callback(__priv, dma, qmode, __args) #define stmmac_set_dma_bfsize(__priv, __args...) \ stmmac_do_void_callback(__priv, dma, set_bfsize, __args) +#define stmmac_enable_sph(__priv, __args...) \ + stmmac_do_void_callback(__priv, dma, enable_sph, __args)struct mac_device_info ;struct net_device ;
drivers/net/ethernet/stmicro/stmmac/stmmac.h +3 -0
@@ -58,7 +58,9 @@ struct stmmac_tx_queue {struct stmmac_rx_buffer {struct page *page; +struct page *sec_page;dma_addr_t addr; +dma_addr_t sec_addr; };struct stmmac_rx_queue {
@@ -136,6 +138,7 @@ struct stmmac_priv {int hwts_tx_en;bool tx_path_in_lpi_mode;bool tso; +int sph;unsigned int dma_buf_sz;unsigned int rx_copybreak;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +74 -1
156 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 7/12 net: stmmac: Add ethtool register dump for XGMAC cores
In reply to Jose AbreuAdd the ethtool interface to dump the register map in XGMAC cores.
Changes from v2:
- Remove uneeded memset (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]
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 ++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 11 ++++++++++- drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 10 +++++++++- .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 23 +++++++++++++++------- 4 files changed, 37 insertions(+), 9 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +2 -0
@@ -244,6 +244,7 @@#define XGMAC_RXOVFIS BIT(16)#define XGMAC_ABPSIS BIT(1)#define XGMAC_TXUNFIS BIT(0) +#define XGMAC_MAC_REGSIZE (XGMAC_MTL_QINT_STATUS(15) / 4)/* DMA Registers */ #define XGMAC_DMA_MODE 0x00003000
@@ -321,6 +322,7 @@#define XGMAC_TBU BIT(2)#define XGMAC_TPS BIT(1)#define XGMAC_TI BIT(0) +#define XGMAC_REGSIZE ((0x0000317c + (0x80 * 15)) / 4)/* Descriptors */ #define XGMAC_TDES2_IOC BIT(31)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +10 -1
@@ -239,6 +239,15 @@ static void dwxgmac2_config_cbs(struct mac_device_info *hw,writel (value, ioaddr +XGMAC_MTL_TCx_ETS_CONTROL (queue)); } +static void dwxgmac2_dump_regs (struct mac_device_info *hw,u32 *reg_space) +{ +void __iomem *ioaddr = hw->pcsr; +int i; + +for (i =0 ; i <XGMAC_MAC_REGSIZE ; i++) + reg_space[i] =readl (ioaddr + i *4 ); +} +static int dwxgmac2_host_irq_status (struct mac_device_info *hw,struct stmmac_extra_stats *x) {
@@ -1079,7 +1088,7 @@ const struct stmmac_ops dwxgmac210_ops = { .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, + .dump_regs = dwxgmac2_dump_regs, .host_irq_status = dwxgmac2_host_irq_status, .host_mtl_irq_status = dwxgmac2_host_mtl_irq_status, .flow_ctrl = dwxgmac2_flow_ctrl,
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +9 -1
@@ -128,6 +128,14 @@ static void dwxgmac2_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)writel (XGMAC_RDPS , ioaddr +XGMAC_RX_EDMA_CTRL ); } +static void dwxgmac2_dma_dump_regs (void __iomem *ioaddr,u32 *reg_space) +{ +int i; + +for (i = (XGMAC_DMA_MODE /4 ); i <XGMAC_REGSIZE ; i++) + reg_space[i] =readl (ioaddr + i *4 ); +} +static void dwxgmac2_dma_rx_mode (void __iomem *ioaddr,int mode,u32 channel,int fifosz,u8 qmode) {
@@ -496,7 +504,7 @@ const struct stmmac_dma_ops dwxgmac210_dma_ops = { .init_rx_chan = dwxgmac2_dma_init_rx_chan, .init_tx_chan = dwxgmac2_dma_init_tx_chan, .axi = dwxgmac2_dma_axi, - .dump_regs = NULL, + .dump_regs = dwxgmac2_dma_dump_regs, .dma_rx_mode = dwxgmac2_dma_rx_mode, .dma_tx_mode = dwxgmac2_dma_tx_mode, .enable_dma_irq = dwxgmac2_enable_dma_irq,
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +16 -7
@@ -18,10 +18,12 @@#include "stmmac.h" #include "dwmac_dma.h" +#include "dwxgmac2.h" #define REG_SPACE_SIZE 0x1060#define MAC100_ETHTOOL_NAME "st_mac100"#define GMAC_ETHTOOL_NAME "st_gmac" +#define XGMAC_ETHTOOL_NAME "st_xgmac"#define ETHTOOL_DMA_OFFSET 55
@@ -260,6 +262,8 @@ static void stmmac_ethtool_getdrvinfo(struct net_device *dev,if (priv->plat->has_gmac || priv->plat->has_gmac4)strlcpy (info->driver,GMAC_ETHTOOL_NAME ,sizeof (info->driver)); +else if (priv->plat->has_xgmac) +strlcpy (info->driver,XGMAC_ETHTOOL_NAME ,sizeof (info->driver));else strlcpy (info->driver,MAC100_ETHTOOL_NAME ,sizeof (info->driver));
@@ -405,23 +409,28 @@ static int stmmac_check_if_running(struct net_device *dev)static int stmmac_ethtool_get_regs_len (struct net_device *dev) { +struct stmmac_priv *priv =netdev_priv (dev); + +if (priv->plat->has_xgmac) +return XGMAC_REGSIZE *4 ;return REG_SPACE_SIZE ; }static void stmmac_ethtool_gregs (struct net_device *dev,struct ethtool_regs *regs,void *space) { -u32 *reg_space = (u32 *) space; -struct stmmac_priv *priv =netdev_priv (dev); - -memset (reg_space,0x0 ,REG_SPACE_SIZE ); +u32 *reg_space = (u32 *) space;stmmac_dump_mac_regs (priv, priv->hw, reg_space);stmmac_dump_dma_regs (priv, priv->ioaddr, reg_space); -/* Copy DMA registers to where ethtool expects them */ -memcpy (®_space[ETHTOOL_DMA_OFFSET ], ®_space[DMA_BUS_MODE /4 ], -NUM_DWMAC1000_DMA_REGS *4 ); + +if (!priv->plat->has_xgmac) { +/* Copy DMA registers to where ethtool expects them */ +memcpy (®_space[ETHTOOL_DMA_OFFSET ], + ®_space[DMA_BUS_MODE /4 ], +NUM_DWMAC1000_DMA_REGS *4 ); + } }static int stmmac_nway_reset (struct net_device *dev)
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/12 net: stmmac: Add support for SA Insertion/Replacement in XGMAC cores
In reply to Jose AbreuAdd the support for Source Address Insertion and Replacement in XGMAC cores. Two methods are supported: Descriptor based and register based.
---
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 | 2 ++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 11 +++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 10 +++++++++- drivers/net/ethernet/stmicro/stmmac/hwif.h | 7 +++++++ drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 6 ++++++ 6 files changed, 36 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +2 -0
@@ -337,6 +337,8 @@#define XGMAC_TDES3_CPC GENMASK(27, 26)#define XGMAC_TDES3_CPC_SHIFT 26#define XGMAC_TDES3_TCMSSV BIT(26) +#define XGMAC_TDES3_SAIC GENMASK(25, 23) +#define XGMAC_TDES3_SAIC_SHIFT 23#define XGMAC_TDES3_THL GENMASK(22, 19)#define XGMAC_TDES3_THL_SHIFT 19#define XGMAC_TDES3_TSE BIT(18)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +11 -0
@@ -1075,6 +1075,16 @@ static int dwxgmac2_flex_pps_config(void __iomem *ioaddr, int index,return 0 ; } +static void dwxgmac2_sarc_configure (void __iomem *ioaddr,int val) +{ +u32 value =readl (ioaddr +XGMAC_TX_CONFIG ); + + value &= ~XGMAC_CONFIG_SARC ; + value |= val <<XGMAC_CONFIG_SARC_SHIFT ; + +writel (value, ioaddr +XGMAC_TX_CONFIG ); +} +const struct stmmac_ops dwxgmac210_ops = { .core_init = dwxgmac2_core_init, .set_mac = dwxgmac2_set_mac,
@@ -1113,6 +1123,7 @@ const struct stmmac_ops dwxgmac210_ops = { .rxp_config = dwxgmac3_rxp_config, .get_mac_tx_timestamp = dwxgmac2_get_mac_tx_timestamp, .flex_pps_config = dwxgmac2_flex_pps_config, + .sarc_configure = dwxgmac2_sarc_configure, };int dwxgmac2_setup (struct stmmac_priv *priv)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +9 -1
@@ -148,7 +148,7 @@ static void dwxgmac2_prepare_tx_desc(struct dma_desc *p, int is_fs, int len, p->des2 |=cpu_to_le32 (len &XGMAC_TDES2_B1L ); - tdes3 = tot_pkt_len &XGMAC_TDES3_FL ; + tdes3 |= tot_pkt_len &XGMAC_TDES3_FL ;if (is_fs) tdes3 |=XGMAC_TDES3_FD ;else
@@ -298,6 +298,13 @@ static void dwxgmac2_set_sec_addr(struct dma_desc *p, dma_addr_t addr) p->des3 =cpu_to_le32 (upper_32_bits (addr)); } +static void dwxgmac2_set_sarc (struct dma_desc *p,u32 sarc_type) +{ + sarc_type <<=XGMAC_TDES3_SAIC_SHIFT ; + + p->des3 |=cpu_to_le32 (sarc_type &XGMAC_TDES3_SAIC ); +} +const struct stmmac_desc_ops dwxgmac210_desc_ops = { .tx_status = dwxgmac2_get_tx_status, .rx_status = dwxgmac2_get_rx_status,
@@ -324,4 +331,5 @@ const struct stmmac_desc_ops dwxgmac210_desc_ops = { .get_rx_hash = dwxgmac2_get_rx_hash, .get_rx_header_len = dwxgmac2_get_rx_header_len, .set_sec_addr = dwxgmac2_set_sec_addr, + .set_sarc = dwxgmac2_set_sarc, };
drivers/net/ethernet/stmicro/stmmac/hwif.h +7 -0
@@ -91,6 +91,7 @@ struct stmmac_desc_ops { enum pkt_hash_types *type);int (*get_rx_header_len)(struct dma_desc *p,unsigned int *len);void (*set_sec_addr)(struct dma_desc *p,dma_addr_t addr); +void (*set_sarc)(struct dma_desc *p,u32 sarc_type); }; #define stmmac_init_rx_desc(__priv, __args...) \
@@ -147,6 +148,8 @@ struct stmmac_desc_ops { stmmac_do_callback(__priv, desc, get_rx_header_len, __args) #define stmmac_set_desc_sec_addr(__priv, __args...) \ stmmac_do_void_callback(__priv, desc, set_sec_addr, __args) +#define stmmac_set_desc_sarc(__priv, __args...) \ + stmmac_do_void_callback(__priv, desc, set_sarc, __args)struct stmmac_dma_cfg ;struct dma_features ;
@@ -350,6 +353,8 @@ struct stmmac_ops { bool is_double);/* TX Timestamp */ int (*get_mac_tx_timestamp)(struct mac_device_info *hw,u64 *ts); +/* Source Address Insertion / Replacement */ +void (*sarc_configure)(void __iomem *ioaddr,int val); }; #define stmmac_core_init(__priv, __args...) \
@@ -426,6 +431,8 @@ struct stmmac_ops { stmmac_do_void_callback(__priv, mac, update_vlan_hash, __args) #define stmmac_get_mac_tx_timestamp(__priv, __args...) \ stmmac_do_callback(__priv, mac, get_mac_tx_timestamp, __args) +#define stmmac_sarc_configure(__priv, __args...) \ + stmmac_do_void_callback(__priv, mac, sarc_configure, __args)/* PTP and HW Timer helpers */ struct stmmac_hwtimestamp {
drivers/net/ethernet/stmicro/stmmac/stmmac.h +1 -0
@@ -139,6 +139,7 @@ struct stmmac_priv {bool tx_path_in_lpi_mode;bool tso;int sph; +u32 sarc_type;unsigned int dma_buf_sz;unsigned int rx_copybreak;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +6 -0
@@ -3004,6 +3004,9 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) priv->xstats.tx_set_ic_bit++; } +if (priv->sarc_type) +stmmac_set_desc_sarc (priv, first, priv->sarc_type); +skb_tx_timestamp (skb); if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
@@ -3217,6 +3220,9 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) priv->xstats.tx_set_ic_bit++; } +if (priv->sarc_type) +stmmac_set_desc_sarc (priv, first, priv->sarc_type); +skb_tx_timestamp (skb);/* Ready to fill the first descriptor and set the OWN bit w/o any
Signature · 1 line
2.7.4
PATCH v3 2/12 net: stmmac: Prepare to add Split Header support
In reply to Jose AbreuIn order to add Split Header support, stmmac_rx() needs to take into account that packet may be split accross multiple descriptors.
Refactor the logic of this function in order to support this scenario.
Changes from v2:
- Fixup if condition detection (Jakub)
- Don't stop NAPI with unfinished packet (Jakub)
- Use napi_alloc_skb() (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]
--- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 6 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 149 +++++++++++++--------- 2 files changed, 95 insertions(+), 60 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac.h +6 -0
@@ -74,6 +74,12 @@ struct stmmac_rx_queue {u32 rx_zeroc_thresh;dma_addr_t dma_rx_phy;u32 rx_tail_addr; +unsigned int state_saved; +struct { +struct sk_buff *skb; +unsigned int len; +unsigned int error; + } state; };struct stmmac_channel {
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +89 -60
193 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 10/12 net: stmmac: xgmac: Add EEE support
In reply to Jose AbreuAdd support for EEE in XGMAC cores by implementing the necessary callbacks.
---
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 | 12 ++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 75 ++++++++++++++++++++-- drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 1 + 3 files changed, 83 insertions(+), 5 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +12 -0
@@ -71,6 +71,7 @@#define XGMAC_PSRQ (x) GENMASK((x) * 8 + 7, (x) * 8)#define XGMAC_PSRQ_SHIFT (x) ((x) * 8)#define XGMAC_INT_STATUS 0x000000b0 +#define XGMAC_LPIIS BIT(5)#define XGMAC_PMTIS BIT(4)#define XGMAC_INT_EN 0x000000b4#define XGMAC_TSIE BIT(12)
@@ -88,10 +89,21 @@#define XGMAC_RWKPKTEN BIT(2)#define XGMAC_MGKPKTEN BIT(1)#define XGMAC_PWRDWN BIT(0) +#define XGMAC_LPI_CTRL 0x000000d0 +#define XGMAC_TXCGE BIT(21) +#define XGMAC_LPITXA BIT(19) +#define XGMAC_PLS BIT(17) +#define XGMAC_LPITXEN BIT(16) +#define XGMAC_RLPIEX BIT(3) +#define XGMAC_RLPIEN BIT(2) +#define XGMAC_TLPIEX BIT(1) +#define XGMAC_TLPIEN BIT(0) +#define XGMAC_LPI_TIMER_CTRL 0x000000d4#define XGMAC_HW_FEATURE0 0x0000011c#define XGMAC_HWFEAT_SAVLANINS BIT(27)#define XGMAC_HWFEAT_RXCOESEL BIT(16)#define XGMAC_HWFEAT_TXCOESEL BIT(14) +#define XGMAC_HWFEAT_EEESEL BIT(13)#define XGMAC_HWFEAT_TSSEL BIT(12)#define XGMAC_HWFEAT_AVSEL BIT(11)#define XGMAC_HWFEAT_RAVSEL BIT(10)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +70 -5
99 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +1 -0
@@ -361,6 +361,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr, hw_cap =readl (ioaddr +XGMAC_HW_FEATURE0 ); dma_cap->rx_coe = (hw_cap &XGMAC_HWFEAT_RXCOESEL ) >>16 ; dma_cap->tx_coe = (hw_cap &XGMAC_HWFEAT_TXCOESEL ) >>14 ; + dma_cap->eee = (hw_cap &XGMAC_HWFEAT_EEESEL ) >>13 ; 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 ;
Signature · 1 line
2.7.4
PATCH v3 12/12 net: stmmac: selftests: Add selftest for VLAN TX Offload
In reply to Jose AbreuAdd 2 new selftests for VLAN Insertion offloading. Tests are for inner and outer VLAN offloading.
---
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 | 96 +++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +94 -2
@@ -296,7 +296,9 @@ static int __stmmac_test_loopback(struct stmmac_priv *priv, tpriv->pt.dev = priv->dev; tpriv->pt.af_packet_priv = tpriv; tpriv->packet = attr; -dev_add_pack (&tpriv->pt); + +if (!attr->dont_wait) +dev_add_pack (&tpriv->pt); skb =stmmac_test_get_udp_skb (priv, attr);if (!skb) {
@@ -319,7 +321,8 @@ static int __stmmac_test_loopback(struct stmmac_priv *priv, ret = !tpriv->ok; cleanup: -dev_remove_pack (&tpriv->pt); +if (!attr->dont_wait) +dev_remove_pack (&tpriv->pt);kfree (tpriv);return ret; }
@@ -731,6 +734,9 @@ static int stmmac_test_vlan_validate(struct sk_buff *skb,struct ethhdr *ehdr;struct udphdr *uhdr;struct iphdr *ihdr; +u16 proto; + + proto = tpriv->double_vlan ?ETH_P_8021AD :ETH_P_8021Q ; skb =skb_unshare (skb,GFP_ATOMIC );if (!skb)
@@ -740,6 +746,12 @@ static int stmmac_test_vlan_validate(struct sk_buff *skb, goto out;if (skb_headlen (skb) < (STMMAC_TEST_PKT_SIZE -ETH_HLEN )) goto out; +if (tpriv->vlan_id) { +if (skb->vlan_proto !=htons (proto)) + goto out; +if (skb->vlan_tci != tpriv->vlan_id) + goto out; + } ehdr = (struct ethhdr *)skb_mac_header (skb);if (!ether_addr_equal (ehdr->h_dest, tpriv->packet->dst))
@@ -1084,6 +1096,78 @@ static int stmmac_test_reg_sar(struct stmmac_priv *priv)return ret; } +static int stmmac_test_vlanoff_common (struct stmmac_priv *priv,bool svlan) +{ +struct stmmac_packet_attrs attr = { }; +struct stmmac_test_priv *tpriv; +struct sk_buff *skb =NULL ; +int ret =0 ; +u16 proto; + +if (!priv->dma_cap.vlins) +return -EOPNOTSUPP ; + + tpriv =kzalloc (sizeof (*tpriv),GFP_KERNEL ); +if (!tpriv) +return -ENOMEM ; + + proto = svlan ?ETH_P_8021AD :ETH_P_8021Q ; + + tpriv->ok = false; + tpriv->double_vlan = svlan; +init_completion (&tpriv->comp); + + tpriv->pt.type = svlan ?htons (ETH_P_8021Q ) :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; + tpriv->vlan_id =0x123 ; +dev_add_pack (&tpriv->pt); + + ret =vlan_vid_add (priv->dev,htons (proto), tpriv->vlan_id); +if (ret) + goto cleanup; + + attr.dst = priv->dev->dev_addr; + + skb =stmmac_test_get_udp_skb (priv, &attr); +if (!skb) { + ret = -ENOMEM ; + goto vlan_del; + } + +__vlan_hwaccel_put_tag (skb,htons (proto), tpriv->vlan_id); + skb->protocol =htons (proto); + +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 ?0 : -ETIMEDOUT ; + +vlan_del: +vlan_vid_del (priv->dev,htons (proto), tpriv->vlan_id); +cleanup: +dev_remove_pack (&tpriv->pt); +kfree (tpriv); +return ret; +} + +static int stmmac_test_vlanoff (struct stmmac_priv *priv) +{ +return stmmac_test_vlanoff_common (priv, false); +} + +static int stmmac_test_svlanoff (struct stmmac_priv *priv) +{ +if (!priv->dma_cap.dvlan) +return -EOPNOTSUPP ; +return stmmac_test_vlanoff_common (priv, true); +} +#define STMMAC_LOOPBACK_NONE 0#define STMMAC_LOOPBACK_MAC 1#define STMMAC_LOOPBACK_PHY 2
@@ -1161,6 +1245,14 @@ static const struct stmmac_test { .name = "SA Replacement (reg)", .lb = STMMAC_LOOPBACK_PHY, .fn = stmmac_test_reg_sar, + }, { + .name = "VLAN TX Insertion ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_vlanoff, + }, { + .name = "SVLAN TX Insertion ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_svlanoff, }, };
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 1/12 net: stmmac: Get correct timestamp values from XGMAC
In reply to Jose AbreuTX Timestamp in XGMAC comes from MAC instead of descriptors. Implement this in a new callback.
Also, RX Timestamp in XGMAC must be cheked against corruption and we need a barrier to make sure that descriptor fields are read correctly.
Changes from v2:
- Rework return code check (Jakub)
Changes from v1:
- Rework the get timestamp function (David)
---
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_core.c | 15 +++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c | 15 +++++++++------ drivers/net/ethernet/stmicro/stmmac/hwif.h | 4 ++++ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 9 ++++++--- 4 files changed, 34 insertions(+), 9 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +15 -0
@@ -997,6 +997,20 @@ static int dwxgmac3_rxp_config(void __iomem *ioaddr,return ret; } +static int dwxgmac2_get_mac_tx_timestamp (struct mac_device_info *hw,u64 *ts) +{ +void __iomem *ioaddr = hw->pcsr; +u32 value; + +if (readl_poll_timeout_atomic (ioaddr +XGMAC_TIMESTAMP_STATUS , + value, value &XGMAC_TXTSC ,100 ,10000 )) +return -EBUSY ; + + *ts =readl (ioaddr +XGMAC_TXTIMESTAMP_NSEC ) &XGMAC_TXTSSTSLO ; + *ts +=readl (ioaddr +XGMAC_TXTIMESTAMP_SEC ) *1000000000ULL ; +return 0 ; +} +const struct stmmac_ops dwxgmac210_ops = { .core_init = dwxgmac2_core_init, .set_mac = dwxgmac2_set_mac,
@@ -1033,6 +1047,7 @@ const struct stmmac_ops dwxgmac210_ops = { .rss_configure = dwxgmac2_rss_configure, .update_vlan_hash = dwxgmac2_update_vlan_hash, .rxp_config = dwxgmac3_rxp_config, + .get_mac_tx_timestamp = dwxgmac2_get_mac_tx_timestamp, };int dwxgmac2_setup (struct stmmac_priv *priv)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +9 -6
@@ -98,11 +98,17 @@ static int dwxgmac2_rx_check_timestamp(void *desc)unsigned int rdes3 =le32_to_cpu (p->des3);bool desc_valid, ts_valid; +dma_rmb (); + desc_valid = !(rdes3 &XGMAC_RDES3_OWN ) && (rdes3 &XGMAC_RDES3_CTXT ); ts_valid = !(rdes3 &XGMAC_RDES3_TSD ) && (rdes3 &XGMAC_RDES3_TSA ); -if (likely (desc_valid && ts_valid)) +if (likely (desc_valid && ts_valid)) { +if ((p->des0 ==0xffffffff ) && (p->des1 ==0xffffffff )) +return -EINVAL ;return 0 ; + } +return -EINVAL ; }
@@ -113,13 +119,10 @@ static int dwxgmac2_get_rx_timestamp_status(void *desc, void *next_desc,unsigned int rdes3 =le32_to_cpu (p->des3);int ret = -EBUSY ; -if (likely (rdes3 &XGMAC_RDES3_CDA )) { +if (likely (rdes3 &XGMAC_RDES3_CDA )) ret =dwxgmac2_rx_check_timestamp (next_desc); -if (ret) -return ret; - } -return ret; +return !ret; } static void dwxgmac2_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
drivers/net/ethernet/stmicro/stmmac/hwif.h +4 -0
@@ -339,6 +339,8 @@ struct stmmac_ops {/* VLAN */ void (*update_vlan_hash)(struct mac_device_info *hw,u32 hash,bool is_double); +/* TX Timestamp */ +int (*get_mac_tx_timestamp)(struct mac_device_info *hw,u64 *ts); }; #define stmmac_core_init(__priv, __args...) \
@@ -413,6 +415,8 @@ struct stmmac_ops { 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) +#define stmmac_get_mac_tx_timestamp(__priv, __args...) \ + stmmac_do_callback(__priv, mac, get_mac_tx_timestamp, __args)/* PTP and HW Timer helpers */ struct stmmac_hwtimestamp {
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +6 -3
@@ -432,6 +432,7 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p, struct sk_buff *skb) { struct skb_shared_hwtstamps shhwtstamp; +bool found = false;u64 ns =0 ;if (!priv->hwts_tx_en)
@@ -443,9 +444,13 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,/* check tx tstamp status */ if (stmmac_get_tx_timestamp_status (priv, p)) { -/* get the valid tstamp */ stmmac_get_timestamp (priv, p, priv->adv_ts, &ns); + found = true; + }else if (!stmmac_get_mac_tx_timestamp (priv, priv->hw, &ns)) { + found = true; + } +if (found) {memset (&shhwtstamp,0 ,sizeof (struct skb_shared_hwtstamps )); shhwtstamp.hwtstamp =ns_to_ktime (ns);
@@ -453,8 +458,6 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,/* pass tstamp to stack */ skb_tstamp_tx (skb, &shhwtstamp); } - -return ; }/* stmmac_get_rx_hwtstamp - get HW RX timestamps
Signature · 1 line
2.7.4
PATCH v3 9/12 net: stmmac: selftests: Add tests for SA Insertion/Replacement
In reply to Jose AbreuAdd 4 new tests:
- SA Insertion (register based)
- SA Insertion (descriptor based)
- SA Replacament (register based)
- SA Replacement (descriptor based)
---
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
@@ -45,6 +45,7 @@ struct stmmac_packet_attrs {int size;int remove_sa;u8 id; +int sarc; };static u8 stmmac_test_next_id;
@@ -230,7 +231,10 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb,if (!ether_addr_equal (ehdr->h_dest, tpriv->packet->dst)) goto out; } -if (tpriv->packet->src) { +if (tpriv->packet->sarc) { +if (!ether_addr_equal (ehdr->h_source, ehdr->h_dest)) + goto out; + }else if (tpriv->packet->src) {if (!ether_addr_equal (ehdr->h_source, tpriv->packet->src)) goto out; }
@@ -1004,6 +1008,82 @@ static int stmmac_test_rxp(struct stmmac_priv *priv) }#endif +static int stmmac_test_desc_sai (struct stmmac_priv *priv) +{ +unsigned char src[ETH_ALEN ] = {0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 }; +struct stmmac_packet_attrs attr = { }; +int ret; + + attr.remove_sa = true; + attr.sarc = true; + attr.src = src; + attr.dst = priv->dev->dev_addr; + + priv->sarc_type =0x1 ; + + ret =__stmmac_test_loopback (priv, &attr); + + priv->sarc_type =0x0 ; +return ret; +} + +static int stmmac_test_desc_sar (struct stmmac_priv *priv) +{ +unsigned char src[ETH_ALEN ] = {0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 }; +struct stmmac_packet_attrs attr = { }; +int ret; + + attr.sarc = true; + attr.src = src; + attr.dst = priv->dev->dev_addr; + + priv->sarc_type =0x2 ; + + ret =__stmmac_test_loopback (priv, &attr); + + priv->sarc_type =0x0 ; +return ret; +} + +static int stmmac_test_reg_sai (struct stmmac_priv *priv) +{ +unsigned char src[ETH_ALEN ] = {0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 }; +struct stmmac_packet_attrs attr = { }; +int ret; + + attr.remove_sa = true; + attr.sarc = true; + attr.src = src; + attr.dst = priv->dev->dev_addr; + +if (stmmac_sarc_configure (priv, priv->ioaddr,0x2 )) +return -EOPNOTSUPP ; + + ret =__stmmac_test_loopback (priv, &attr); + +stmmac_sarc_configure (priv, priv->ioaddr,0x0 ); +return ret; +} + +static int stmmac_test_reg_sar (struct stmmac_priv *priv) +{ +unsigned char src[ETH_ALEN ] = {0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 }; +struct stmmac_packet_attrs attr = { }; +int ret; + + attr.sarc = true; + attr.src = src; + attr.dst = priv->dev->dev_addr; + +if (stmmac_sarc_configure (priv, priv->ioaddr,0x3 )) +return -EOPNOTSUPP ; + + ret =__stmmac_test_loopback (priv, &attr); + +stmmac_sarc_configure (priv, priv->ioaddr,0x0 ); +return ret; +} +#define STMMAC_LOOPBACK_NONE 0#define STMMAC_LOOPBACK_MAC 1#define STMMAC_LOOPBACK_PHY 2
@@ -1065,6 +1145,22 @@ static const struct stmmac_test { .name = "Flexible RX Parser ", .lb = STMMAC_LOOPBACK_PHY, .fn = stmmac_test_rxp, + }, { + .name = "SA Insertion (desc) ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_desc_sai, + }, { + .name = "SA Replacement (desc)", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_desc_sar, + }, { + .name = "SA Insertion (reg) ", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_reg_sai, + }, { + .name = "SA Replacement (reg)", + .lb = STMMAC_LOOPBACK_PHY, + .fn = stmmac_test_reg_sar, }, };
Signature · 1 line
2.7.4
David Miller
maintainerFrom: Jose Abreu <[email protected]>
Date: Sat, 17 Aug 2019 20:54:39 +0200
Quoted 1 line
Couple of improvements for -next tree. More info in commit logs.
Series applied.