Commit c9b10043 authored by Jose Abreu's avatar Jose Abreu Committed by David S. Miller
Browse files

net: stmmac: ARP Offload for GMAC4+ Cores



Implement the ARP Offload feature in GMAC4 and GMAC5 cores.

Signed-off-by: default avatarJose Abreu <joabreu@synopsys.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e94e3f3b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@
#define GMAC_HW_FEATURE3		0x00000128
#define GMAC_MDIO_ADDR			0x00000200
#define GMAC_MDIO_DATA			0x00000204
#define GMAC_ARP_ADDR			0x00000210
#define GMAC_ADDR_HIGH(reg)		(0x300 + reg * 8)
#define GMAC_ADDR_LOW(reg)		(0x304 + reg * 8)

@@ -165,6 +166,7 @@ enum power_event {
#define GMAC_DEBUG_RPESTS		BIT(0)

/* MAC config */
#define GMAC_CONFIG_ARPEN		BIT(31)
#define GMAC_CONFIG_SARC		GENMASK(30, 28)
#define GMAC_CONFIG_SARC_SHIFT		28
#define GMAC_CONFIG_IPC			BIT(27)
@@ -188,6 +190,7 @@ enum power_event {
#define GMAC_HW_FEAT_TXCOSEL		BIT(14)
#define GMAC_HW_FEAT_EEESEL		BIT(13)
#define GMAC_HW_FEAT_TSSEL		BIT(12)
#define GMAC_HW_FEAT_ARPOFFSEL		BIT(9)
#define GMAC_HW_FEAT_MMCSEL		BIT(8)
#define GMAC_HW_FEAT_MGKSEL		BIT(7)
#define GMAC_HW_FEAT_RWKSEL		BIT(6)
+19 −0
Original line number Diff line number Diff line
@@ -782,6 +782,22 @@ static void dwmac4_enable_vlan(struct mac_device_info *hw, u32 type)
	writel(value, ioaddr + GMAC_VLAN_INCL);
}

static void dwmac4_set_arp_offload(struct mac_device_info *hw, bool en,
				   u32 addr)
{
	void __iomem *ioaddr = hw->pcsr;
	u32 value;

	writel(addr, ioaddr + GMAC_ARP_ADDR);

	value = readl(ioaddr + GMAC_CONFIG);
	if (en)
		value |= GMAC_CONFIG_ARPEN;
	else
		value &= ~GMAC_CONFIG_ARPEN;
	writel(value, ioaddr + GMAC_CONFIG);
}

const struct stmmac_ops dwmac4_ops = {
	.core_init = dwmac4_core_init,
	.set_mac = stmmac_set_mac,
@@ -815,6 +831,7 @@ const struct stmmac_ops dwmac4_ops = {
	.update_vlan_hash = dwmac4_update_vlan_hash,
	.sarc_configure = dwmac4_sarc_configure,
	.enable_vlan = dwmac4_enable_vlan,
	.set_arp_offload = dwmac4_set_arp_offload,
};

const struct stmmac_ops dwmac410_ops = {
@@ -850,6 +867,7 @@ const struct stmmac_ops dwmac410_ops = {
	.update_vlan_hash = dwmac4_update_vlan_hash,
	.sarc_configure = dwmac4_sarc_configure,
	.enable_vlan = dwmac4_enable_vlan,
	.set_arp_offload = dwmac4_set_arp_offload,
};

const struct stmmac_ops dwmac510_ops = {
@@ -890,6 +908,7 @@ const struct stmmac_ops dwmac510_ops = {
	.update_vlan_hash = dwmac4_update_vlan_hash,
	.sarc_configure = dwmac4_sarc_configure,
	.enable_vlan = dwmac4_enable_vlan,
	.set_arp_offload = dwmac4_set_arp_offload,
};

int dwmac4_setup(struct stmmac_priv *priv)
+1 −0
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ static void dwmac4_get_hw_feature(void __iomem *ioaddr,
	dma_cap->tx_coe = (hw_cap & GMAC_HW_FEAT_TXCOSEL) >> 14;
	dma_cap->rx_coe =  (hw_cap & GMAC_HW_FEAT_RXCOESEL) >> 16;
	dma_cap->vlins = (hw_cap & GMAC_HW_FEAT_SAVLANINS) >> 27;
	dma_cap->arpoffsel = (hw_cap & GMAC_HW_FEAT_ARPOFFSEL) >> 9;

	/* MAC HW feature1 */
	hw_cap = readl(ioaddr + GMAC_HW_FEATURE1);