Skip to content

Commit 8c6fc09

Browse files
joabreudavem330
authored andcommitted
net: stmmac: gmac4+: Add Split Header support
GMAC4+ cores also support the Split Header feature. Add the support for Split Header feature in the RX path following the same implementation logic that XGMAC followed. Signed-off-by: Jose Abreu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a24cae7 commit 8c6fc09

File tree

5 files changed

+46
-3
lines changed

5 files changed

+46
-3
lines changed

drivers/net/ethernet/stmicro/stmmac/dwmac4.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
/* MAC registers */
1616
#define GMAC_CONFIG 0x00000000
17+
#define GMAC_EXT_CONFIG 0x00000004
1718
#define GMAC_PACKET_FILTER 0x00000008
1819
#define GMAC_HASH_TAB(x) (0x10 + (x) * 4)
1920
#define GMAC_VLAN_TAG 0x00000050
@@ -188,6 +189,11 @@ enum power_event {
188189
#define GMAC_CONFIG_TE BIT(1)
189190
#define GMAC_CONFIG_RE BIT(0)
190191

192+
/* MAC extended config */
193+
#define GMAC_CONFIG_HDSMS GENMASK(22, 20)
194+
#define GMAC_CONFIG_HDSMS_SHIFT 20
195+
#define GMAC_CONFIG_HDSMS_256 (0x2 << GMAC_CONFIG_HDSMS_SHIFT)
196+
191197
/* MAC HW features0 bitmap */
192198
#define GMAC_HW_FEAT_SAVLANINS BIT(27)
193199
#define GMAC_HW_FEAT_ADDMAC BIT(18)
@@ -211,6 +217,7 @@ enum power_event {
211217
#define GMAC_HW_HASH_TB_SZ GENMASK(25, 24)
212218
#define GMAC_HW_FEAT_AVSEL BIT(20)
213219
#define GMAC_HW_TSOEN BIT(18)
220+
#define GMAC_HW_FEAT_SPHEN BIT(17)
214221
#define GMAC_HW_ADDR64 GENMASK(15, 14)
215222
#define GMAC_HW_TXFIFOSIZE GENMASK(10, 6)
216223
#define GMAC_HW_RXFIFOSIZE GENMASK(4, 0)

drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ static int dwmac4_wrback_get_rx_status(void *data, struct stmmac_extra_stats *x,
8383
if (unlikely(rdes3 & RDES3_OWN))
8484
return dma_own;
8585

86-
/* Verify rx error by looking at the last segment. */
87-
if (likely(!(rdes3 & RDES3_LAST_DESCRIPTOR)))
86+
if (unlikely(rdes3 & RDES3_CONTEXT_DESCRIPTOR))
8887
return discard_frame;
88+
if (likely(!(rdes3 & RDES3_LAST_DESCRIPTOR)))
89+
return rx_not_ls;
8990

9091
if (unlikely(rdes3 & RDES3_ERROR_SUMMARY)) {
9192
if (unlikely(rdes3 & RDES3_GIANT_PACKET))
@@ -188,7 +189,7 @@ static void dwmac4_set_tx_owner(struct dma_desc *p)
188189

189190
static void dwmac4_set_rx_owner(struct dma_desc *p, int disable_rx_ic)
190191
{
191-
p->des3 = cpu_to_le32(RDES3_OWN | RDES3_BUFFER1_VALID_ADDR);
192+
p->des3 |= cpu_to_le32(RDES3_OWN | RDES3_BUFFER1_VALID_ADDR);
192193

193194
if (!disable_rx_ic)
194195
p->des3 |= cpu_to_le32(RDES3_INT_ON_COMPLETION_EN);
@@ -492,6 +493,18 @@ static void dwmac4_set_vlan(struct dma_desc *p, u32 type)
492493
p->des2 |= cpu_to_le32(type & TDES2_VLAN_TAG_MASK);
493494
}
494495

496+
static int dwmac4_get_rx_header_len(struct dma_desc *p, unsigned int *len)
497+
{
498+
*len = le32_to_cpu(p->des2) & RDES2_HL;
499+
return 0;
500+
}
501+
502+
static void dwmac4_set_sec_addr(struct dma_desc *p, dma_addr_t addr)
503+
{
504+
p->des2 = cpu_to_le32(lower_32_bits(addr));
505+
p->des3 = cpu_to_le32(upper_32_bits(addr) | RDES3_BUFFER2_VALID_ADDR);
506+
}
507+
495508
const struct stmmac_desc_ops dwmac4_desc_ops = {
496509
.tx_status = dwmac4_wrback_get_tx_status,
497510
.rx_status = dwmac4_wrback_get_rx_status,
@@ -519,6 +532,8 @@ const struct stmmac_desc_ops dwmac4_desc_ops = {
519532
.set_sarc = dwmac4_set_sarc,
520533
.set_vlan_tag = dwmac4_set_vlan_tag,
521534
.set_vlan = dwmac4_set_vlan,
535+
.get_rx_header_len = dwmac4_get_rx_header_len,
536+
.set_sec_addr = dwmac4_set_sec_addr,
522537
};
523538

524539
const struct stmmac_mode_ops dwmac4_ring_mode_ops = {

drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
#define RDES2_L4_FILTER_MATCH BIT(28)
110110
#define RDES2_L3_L4_FILT_NB_MATCH_MASK GENMASK(27, 26)
111111
#define RDES2_L3_L4_FILT_NB_MATCH_SHIFT 26
112+
#define RDES2_HL GENMASK(9, 0)
112113

113114
/* RDES3 (write back format) */
114115
#define RDES3_PACKET_SIZE_MASK GENMASK(14, 0)

drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ static void dwmac4_get_hw_feature(void __iomem *ioaddr,
368368
dma_cap->hash_tb_sz = (hw_cap & GMAC_HW_HASH_TB_SZ) >> 24;
369369
dma_cap->av = (hw_cap & GMAC_HW_FEAT_AVSEL) >> 20;
370370
dma_cap->tsoen = (hw_cap & GMAC_HW_TSOEN) >> 18;
371+
dma_cap->sphen = (hw_cap & GMAC_HW_FEAT_SPHEN) >> 17;
371372

372373
dma_cap->addr64 = (hw_cap & GMAC_HW_ADDR64) >> 14;
373374
switch (dma_cap->addr64) {
@@ -460,6 +461,22 @@ static void dwmac4_set_bfsize(void __iomem *ioaddr, int bfsize, u32 chan)
460461
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan));
461462
}
462463

464+
static void dwmac4_enable_sph(void __iomem *ioaddr, bool en, u32 chan)
465+
{
466+
u32 value = readl(ioaddr + GMAC_EXT_CONFIG);
467+
468+
value &= ~GMAC_CONFIG_HDSMS;
469+
value |= GMAC_CONFIG_HDSMS_256; /* Segment max 256 bytes */
470+
writel(value, ioaddr + GMAC_EXT_CONFIG);
471+
472+
value = readl(ioaddr + DMA_CHAN_CONTROL(chan));
473+
if (en)
474+
value |= DMA_CONTROL_SPH;
475+
else
476+
value &= ~DMA_CONTROL_SPH;
477+
writel(value, ioaddr + DMA_CHAN_CONTROL(chan));
478+
}
479+
463480
const struct stmmac_dma_ops dwmac4_dma_ops = {
464481
.reset = dwmac4_dma_reset,
465482
.init = dwmac4_dma_init,
@@ -486,6 +503,7 @@ const struct stmmac_dma_ops dwmac4_dma_ops = {
486503
.enable_tso = dwmac4_enable_tso,
487504
.qmode = dwmac4_qmode,
488505
.set_bfsize = dwmac4_set_bfsize,
506+
.enable_sph = dwmac4_enable_sph,
489507
};
490508

491509
const struct stmmac_dma_ops dwmac410_dma_ops = {
@@ -514,4 +532,5 @@ const struct stmmac_dma_ops dwmac410_dma_ops = {
514532
.enable_tso = dwmac4_enable_tso,
515533
.qmode = dwmac4_qmode,
516534
.set_bfsize = dwmac4_set_bfsize,
535+
.enable_sph = dwmac4_enable_sph,
517536
};

drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
#define DMA_CHAN_STATUS(x) (DMA_CHANX_BASE_ADDR(x) + 0x60)
111111

112112
/* DMA Control X */
113+
#define DMA_CONTROL_SPH BIT(24)
113114
#define DMA_CONTROL_MSS_MASK GENMASK(13, 0)
114115

115116
/* DMA Tx Channel X Control register defines */

0 commit comments

Comments
 (0)