RE: [v4, PATCH] net: stmmac: add support for hash table size 128/256 in dwmac4

2019-05-29 Thread Jose Abreu
From: Biao Huang 
Date: Wed, May 29, 2019 at 02:38:44

>   } else if (!netdev_mc_empty(dev)) {
> - u32 mc_filter[2];
> + u32 mc_filter[8];
>   struct netdev_hw_addr *ha;

The reverse christmas tree also applies here.

I also see some coding-style errors, like missing line breaks, etc... 
that checkpatch should complain about.

Also, please run this patch against stmmac selftests and add the output 
to the commit log.

Thanks,
Jose Miguel Abreu


[v4, PATCH] net: stmmac: add support for hash table size 128/256 in dwmac4

2019-05-28 Thread Biao Huang
1. get hash table size in hw feature reigster, and add support
for taller hash table(128/256) in dwmac4.
2. only clear GMAC_PACKET_FILTER bits used in this function,
to avoid side effect to functions of other bits.

Signed-off-by: Biao Huang 
---
 drivers/net/ethernet/stmicro/stmmac/common.h  |7 +--
 drivers/net/ethernet/stmicro/stmmac/dwmac4.h  |4 +-
 drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c |   49 -
 drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c  |1 +
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |4 ++
 5 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h 
b/drivers/net/ethernet/stmicro/stmmac/common.h
index 1961fe9..26bbcd8 100644
--- a/drivers/net/ethernet/stmicro/stmmac/common.h
+++ b/drivers/net/ethernet/stmicro/stmmac/common.h
@@ -335,6 +335,7 @@ struct dma_features {
/* 802.3az - Energy-Efficient Ethernet (EEE) */
unsigned int eee;
unsigned int av;
+   unsigned int hash_tb_sz;
unsigned int tsoen;
/* TX and RX csum */
unsigned int tx_coe;
@@ -428,9 +429,9 @@ struct mac_device_info {
struct mii_regs mii;/* MII register Addresses */
struct mac_link link;
void __iomem *pcsr; /* vpointer to device CSRs */
-   int multicast_filter_bins;
-   int unicast_filter_entries;
-   int mcast_bits_log2;
+   unsigned int multicast_filter_bins;
+   unsigned int unicast_filter_entries;
+   unsigned int mcast_bits_log2;
unsigned int rx_csum;
unsigned int pcs;
unsigned int pmt;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4.h 
b/drivers/net/ethernet/stmicro/stmmac/dwmac4.h
index 01c1089..a37e09b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4.h
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4.h
@@ -18,8 +18,7 @@
 /*  MAC registers */
 #define GMAC_CONFIG0x
 #define GMAC_PACKET_FILTER 0x0008
-#define GMAC_HASH_TAB_0_31 0x0010
-#define GMAC_HASH_TAB_32_630x0014
+#define GMAC_HASH_TAB(x)   (0x10 + x * 4)
 #define GMAC_RX_FLOW_CTRL  0x0090
 #define GMAC_QX_TX_FLOW_CTRL(x)(0x70 + x * 4)
 #define GMAC_TXQ_PRTY_MAP0 0x98
@@ -184,6 +183,7 @@ enum power_event {
 #define GMAC_HW_FEAT_MIISELBIT(0)
 
 /* MAC HW features1 bitmap */
+#define GMAC_HW_HASH_TB_SZ GENMASK(25, 24)
 #define GMAC_HW_FEAT_AVSEL BIT(20)
 #define GMAC_HW_TSOEN  BIT(18)
 #define GMAC_HW_TXFIFOSIZE GENMASK(10, 6)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
index 5e98da4..2544cff 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
@@ -403,41 +403,50 @@ static void dwmac4_set_filter(struct mac_device_info *hw,
  struct net_device *dev)
 {
void __iomem *ioaddr = (void __iomem *)dev->base_addr;
-   unsigned int value = 0;
+   int numhashregs = (hw->multicast_filter_bins >> 5);
+   int mcbitslog2 = hw->mcast_bits_log2;
+   unsigned int value;
+   int i;
 
+   value = readl(ioaddr + GMAC_PACKET_FILTER);
+   value &= ~GMAC_PACKET_FILTER_HMC;
+   value &= ~GMAC_PACKET_FILTER_HPF;
+   value &= ~GMAC_PACKET_FILTER_PCF;
+   value &= ~GMAC_PACKET_FILTER_PM;
+   value &= ~GMAC_PACKET_FILTER_PR;
if (dev->flags & IFF_PROMISC) {
value = GMAC_PACKET_FILTER_PR | GMAC_PACKET_FILTER_PCF;
} else if ((dev->flags & IFF_ALLMULTI) ||
-   (netdev_mc_count(dev) > HASH_TABLE_SIZE)) {
+  (netdev_mc_count(dev) > hw->multicast_filter_bins)) {
/* Pass all multi */
-   value = GMAC_PACKET_FILTER_PM;
-   /* Set the 64 bits of the HASH tab. To be updated if taller
-* hash table is used
-*/
-   writel(0x, ioaddr + GMAC_HASH_TAB_0_31);
-   writel(0x, ioaddr + GMAC_HASH_TAB_32_63);
+   value |= GMAC_PACKET_FILTER_PM;
+   /* Set all the bits of the HASH tab */
+   for (i = 0; i < numhashregs; i++)
+   writel(0x, ioaddr + GMAC_HASH_TAB(i));
} else if (!netdev_mc_empty(dev)) {
-   u32 mc_filter[2];
+   u32 mc_filter[8];
struct netdev_hw_addr *ha;
 
/* Hash filter for multicast */
-   value = GMAC_PACKET_FILTER_HMC;
+   value |= GMAC_PACKET_FILTER_HMC;
 
memset(mc_filter, 0, sizeof(mc_filter));
netdev_for_each_mc_addr(ha, dev) {
-   /* The upper 6 bits of the calculated CRC are used to
-* index the content of the Hash Table Reg 0 and