Re: [PATCH v2 net-next] net: stmmac: Implement logic to automatically select HW Interface

2018-04-23 Thread David Miller
From: Jose Abreu 
Date: Mon, 23 Apr 2018 09:05:15 +0100

> Move all the core version detection to a common place ("hwif.c") and
> implement a table which can be used to lookup the correct callbacks for
> each IP version.
> 
> This simplifies the initialization flow of each IP version and eases
> future implementation of new IP versions.
> 
> Signed-off-by: Jose Abreu 

Applied, thanks Jose.


[PATCH v2 net-next] net: stmmac: Implement logic to automatically select HW Interface

2018-04-23 Thread Jose Abreu
Move all the core version detection to a common place ("hwif.c") and
implement a table which can be used to lookup the correct callbacks for
each IP version.

This simplifies the initialization flow of each IP version and eases
future implementation of new IP versions.

Signed-off-by: Jose Abreu 
Cc: David S. Miller 
Cc: Joao Pinto 
Cc: Vitor Soares 
Cc: Giuseppe Cavallaro 
Cc: Alexandre Torgue 
---
Changes from v1:
- Remove C++ style comments from header (David)
- Add a dev_err when HW Interface is not found
---
 drivers/net/ethernet/stmicro/stmmac/Makefile   |3 +-
 drivers/net/ethernet/stmicro/stmmac/common.h   |   30 +---
 drivers/net/ethernet/stmicro/stmmac/dwmac1000.h|1 -
 .../net/ethernet/stmicro/stmmac/dwmac1000_core.c   |   29 +--
 .../net/ethernet/stmicro/stmmac/dwmac100_core.c|   23 +--
 drivers/net/ethernet/stmicro/stmmac/dwmac4.h   |1 -
 drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c  |   41 +---
 drivers/net/ethernet/stmicro/stmmac/hwif.c |  220 
 drivers/net/ethernet/stmicro/stmmac/hwif.h |   17 ++
 drivers/net/ethernet/stmicro/stmmac/stmmac.h   |1 +
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c  |   77 +---
 11 files changed, 279 insertions(+), 164 deletions(-)
 create mode 100644 drivers/net/ethernet/stmicro/stmmac/hwif.c

diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile 
b/drivers/net/ethernet/stmicro/stmmac/Makefile
index 972e4ef..e3b578b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -4,7 +4,8 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o 
ring_mode.o  \
  chain_mode.o dwmac_lib.o dwmac1000_core.o dwmac1000_dma.o \
  dwmac100_core.o dwmac100_dma.o enh_desc.o norm_desc.o \
  mmc_core.o stmmac_hwtstamp.o stmmac_ptp.o dwmac4_descs.o  \
- dwmac4_dma.o dwmac4_lib.o dwmac4_core.o dwmac5.o $(stmmac-y)
+ dwmac4_dma.o dwmac4_lib.o dwmac4_core.o dwmac5.o hwif.o \
+ $(stmmac-y)
 
 # Ordering matters. Generic driver must be last.
 obj-$(CONFIG_STMMAC_PLATFORM)  += stmmac-platform.o
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h 
b/drivers/net/ethernet/stmicro/stmmac/common.h
index 59673c6..627e905 100644
--- a/drivers/net/ethernet/stmicro/stmmac/common.h
+++ b/drivers/net/ethernet/stmicro/stmmac/common.h
@@ -39,6 +39,7 @@
 #defineDWMAC_CORE_3_40 0x34
 #defineDWMAC_CORE_3_50 0x35
 #defineDWMAC_CORE_4_00 0x40
+#define DWMAC_CORE_4_100x41
 #define DWMAC_CORE_5_00 0x50
 #define DWMAC_CORE_5_10 0x51
 #define STMMAC_CHAN0   0   /* Always supported and default for all chips */
@@ -428,12 +429,9 @@ struct stmmac_rx_routing {
u32 reg_shift;
 };
 
-struct mac_device_info *dwmac1000_setup(void __iomem *ioaddr, int mcbins,
-   int perfect_uc_entries,
-   int *synopsys_id);
-struct mac_device_info *dwmac100_setup(void __iomem *ioaddr, int *synopsys_id);
-struct mac_device_info *dwmac4_setup(void __iomem *ioaddr, int mcbins,
-int perfect_uc_entries, int *synopsys_id);
+int dwmac100_setup(struct stmmac_priv *priv);
+int dwmac1000_setup(struct stmmac_priv *priv);
+int dwmac4_setup(struct stmmac_priv *priv);
 
 void stmmac_set_mac_addr(void __iomem *ioaddr, u8 addr[6],
 unsigned int high, unsigned int low);
@@ -453,24 +451,4 @@ void stmmac_dwmac4_get_mac_addr(void __iomem *ioaddr, 
unsigned char *addr,
 extern const struct stmmac_mode_ops chain_mode_ops;
 extern const struct stmmac_desc_ops dwmac4_desc_ops;
 
-/**
- * stmmac_get_synopsys_id - return the SYINID.
- * @priv: driver private structure
- * Description: this simple function is to decode and return the SYINID
- * starting from the HW core register.
- */
-static inline u32 stmmac_get_synopsys_id(u32 hwid)
-{
-   /* Check Synopsys Id (not available on old chips) */
-   if (likely(hwid)) {
-   u32 uid = ((hwid & 0xff00) >> 8);
-   u32 synid = (hwid & 0x00ff);
-
-   pr_info("stmmac - user ID: 0x%x, Synopsys ID: 0x%x\n",
-   uid, synid);
-
-   return synid;
-   }
-   return 0;
-}
 #endif /* __COMMON_H__ */
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h 
b/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
index c02d366..184ca13 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
@@ -29,7 +29,6 @@
 #define GMAC_MII_DATA  0x0014  /* MII Data */
 #define GMAC_FLOW_CTRL 0x0018  /* Flow Control */
 #define GMAC_VLAN_TAG  0x001c  /* VLAN Tag */
-#define GMAC_VERSION