Commit 1d982e93 authored by Jose Abreu's avatar Jose Abreu Committed by David S. Miller

net: stmmac: Add support for SA Insertion/Replacement in GMAC4+

Add the support for Source Address Insertion and Replacement in GMAC4
and GMAC5 cores. Two methods are supported: Descriptor based and
register based.
Signed-off-by: default avatarJose Abreu <joabreu@synopsys.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent afdf26ab
...@@ -160,6 +160,8 @@ enum power_event { ...@@ -160,6 +160,8 @@ enum power_event {
#define GMAC_DEBUG_RPESTS BIT(0) #define GMAC_DEBUG_RPESTS BIT(0)
/* MAC config */ /* MAC config */
#define GMAC_CONFIG_SARC GENMASK(30, 28)
#define GMAC_CONFIG_SARC_SHIFT 28
#define GMAC_CONFIG_IPC BIT(27) #define GMAC_CONFIG_IPC BIT(27)
#define GMAC_CONFIG_2K BIT(22) #define GMAC_CONFIG_2K BIT(22)
#define GMAC_CONFIG_ACS BIT(20) #define GMAC_CONFIG_ACS BIT(20)
...@@ -175,6 +177,7 @@ enum power_event { ...@@ -175,6 +177,7 @@ enum power_event {
#define GMAC_CONFIG_RE BIT(0) #define GMAC_CONFIG_RE BIT(0)
/* MAC HW features0 bitmap */ /* MAC HW features0 bitmap */
#define GMAC_HW_FEAT_SAVLANINS BIT(27)
#define GMAC_HW_FEAT_ADDMAC BIT(18) #define GMAC_HW_FEAT_ADDMAC BIT(18)
#define GMAC_HW_FEAT_RXCOESEL BIT(16) #define GMAC_HW_FEAT_RXCOESEL BIT(16)
#define GMAC_HW_FEAT_TXCOSEL BIT(14) #define GMAC_HW_FEAT_TXCOSEL BIT(14)
......
...@@ -759,6 +759,16 @@ static void dwmac4_update_vlan_hash(struct mac_device_info *hw, u32 hash, ...@@ -759,6 +759,16 @@ static void dwmac4_update_vlan_hash(struct mac_device_info *hw, u32 hash,
} }
} }
static void dwmac4_sarc_configure(void __iomem *ioaddr, int val)
{
u32 value = readl(ioaddr + GMAC_CONFIG);
value &= ~GMAC_CONFIG_SARC;
value |= val << GMAC_CONFIG_SARC_SHIFT;
writel(value, ioaddr + GMAC_CONFIG);
}
const struct stmmac_ops dwmac4_ops = { const struct stmmac_ops dwmac4_ops = {
.core_init = dwmac4_core_init, .core_init = dwmac4_core_init,
.set_mac = stmmac_set_mac, .set_mac = stmmac_set_mac,
...@@ -790,6 +800,7 @@ const struct stmmac_ops dwmac4_ops = { ...@@ -790,6 +800,7 @@ const struct stmmac_ops dwmac4_ops = {
.set_filter = dwmac4_set_filter, .set_filter = dwmac4_set_filter,
.set_mac_loopback = dwmac4_set_mac_loopback, .set_mac_loopback = dwmac4_set_mac_loopback,
.update_vlan_hash = dwmac4_update_vlan_hash, .update_vlan_hash = dwmac4_update_vlan_hash,
.sarc_configure = dwmac4_sarc_configure,
}; };
const struct stmmac_ops dwmac410_ops = { const struct stmmac_ops dwmac410_ops = {
...@@ -823,6 +834,7 @@ const struct stmmac_ops dwmac410_ops = { ...@@ -823,6 +834,7 @@ const struct stmmac_ops dwmac410_ops = {
.set_filter = dwmac4_set_filter, .set_filter = dwmac4_set_filter,
.set_mac_loopback = dwmac4_set_mac_loopback, .set_mac_loopback = dwmac4_set_mac_loopback,
.update_vlan_hash = dwmac4_update_vlan_hash, .update_vlan_hash = dwmac4_update_vlan_hash,
.sarc_configure = dwmac4_sarc_configure,
}; };
const struct stmmac_ops dwmac510_ops = { const struct stmmac_ops dwmac510_ops = {
...@@ -861,6 +873,7 @@ const struct stmmac_ops dwmac510_ops = { ...@@ -861,6 +873,7 @@ const struct stmmac_ops dwmac510_ops = {
.flex_pps_config = dwmac5_flex_pps_config, .flex_pps_config = dwmac5_flex_pps_config,
.set_mac_loopback = dwmac4_set_mac_loopback, .set_mac_loopback = dwmac4_set_mac_loopback,
.update_vlan_hash = dwmac4_update_vlan_hash, .update_vlan_hash = dwmac4_update_vlan_hash,
.sarc_configure = dwmac4_sarc_configure,
}; };
int dwmac4_setup(struct stmmac_priv *priv) int dwmac4_setup(struct stmmac_priv *priv)
......
...@@ -443,6 +443,13 @@ static void dwmac4_clear(struct dma_desc *p) ...@@ -443,6 +443,13 @@ static void dwmac4_clear(struct dma_desc *p)
p->des3 = 0; p->des3 = 0;
} }
static void dwmac4_set_sarc(struct dma_desc *p, u32 sarc_type)
{
sarc_type <<= TDES3_SA_INSERT_CTRL_SHIFT;
p->des3 |= cpu_to_le32(sarc_type & TDES3_SA_INSERT_CTRL_MASK);
}
static int set_16kib_bfsize(int mtu) static int set_16kib_bfsize(int mtu)
{ {
int ret = 0; int ret = 0;
...@@ -476,6 +483,7 @@ const struct stmmac_desc_ops dwmac4_desc_ops = { ...@@ -476,6 +483,7 @@ const struct stmmac_desc_ops dwmac4_desc_ops = {
.get_addr = dwmac4_get_addr, .get_addr = dwmac4_get_addr,
.set_addr = dwmac4_set_addr, .set_addr = dwmac4_set_addr,
.clear = dwmac4_clear, .clear = dwmac4_clear,
.set_sarc = dwmac4_set_sarc,
}; };
const struct stmmac_mode_ops dwmac4_ring_mode_ops = { const struct stmmac_mode_ops dwmac4_ring_mode_ops = {
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define TDES3_HDR_LEN_SHIFT 19 #define TDES3_HDR_LEN_SHIFT 19
#define TDES3_SLOT_NUMBER_MASK GENMASK(22, 19) #define TDES3_SLOT_NUMBER_MASK GENMASK(22, 19)
#define TDES3_SA_INSERT_CTRL_MASK GENMASK(25, 23) #define TDES3_SA_INSERT_CTRL_MASK GENMASK(25, 23)
#define TDES3_SA_INSERT_CTRL_SHIFT 23
#define TDES3_CRC_PAD_CTRL_MASK GENMASK(27, 26) #define TDES3_CRC_PAD_CTRL_MASK GENMASK(27, 26)
/* TDES3 (write back format) */ /* TDES3 (write back format) */
......
...@@ -348,6 +348,7 @@ static void dwmac4_get_hw_feature(void __iomem *ioaddr, ...@@ -348,6 +348,7 @@ static void dwmac4_get_hw_feature(void __iomem *ioaddr,
/* TX and RX csum */ /* TX and RX csum */
dma_cap->tx_coe = (hw_cap & GMAC_HW_FEAT_TXCOSEL) >> 14; dma_cap->tx_coe = (hw_cap & GMAC_HW_FEAT_TXCOSEL) >> 14;
dma_cap->rx_coe = (hw_cap & GMAC_HW_FEAT_RXCOESEL) >> 16; dma_cap->rx_coe = (hw_cap & GMAC_HW_FEAT_RXCOESEL) >> 16;
dma_cap->vlins = (hw_cap & GMAC_HW_FEAT_SAVLANINS) >> 27;
/* MAC HW feature1 */ /* MAC HW feature1 */
hw_cap = readl(ioaddr + GMAC_HW_FEATURE1); hw_cap = readl(ioaddr + GMAC_HW_FEATURE1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment