4040#define GBE_MODULE_NAME "netcp-gbe"
4141#define GBE_SS_VERSION_14 0x4ed21104
4242
43+ #define GBE_SS_REG_INDEX 0
44+ #define GBE_SGMII34_REG_INDEX 1
45+ #define GBE_SM_REG_INDEX 2
46+ /* offset relative to base of GBE_SS_REG_INDEX */
4347#define GBE13_SGMII_MODULE_OFFSET 0x100
44- #define GBE13_SGMII34_MODULE_OFFSET 0x400
45- #define GBE13_SWITCH_MODULE_OFFSET 0x800
46- #define GBE13_HOST_PORT_OFFSET 0x834
47- #define GBE13_SLAVE_PORT_OFFSET 0x860
48- #define GBE13_EMAC_OFFSET 0x900
49- #define GBE13_SLAVE_PORT2_OFFSET 0xa00
50- #define GBE13_HW_STATS_OFFSET 0xb00
51- #define GBE13_ALE_OFFSET 0xe00
48+ /* offset relative to base of GBE_SM_REG_INDEX */
49+ #define GBE13_HOST_PORT_OFFSET 0x34
50+ #define GBE13_SLAVE_PORT_OFFSET 0x60
51+ #define GBE13_EMAC_OFFSET 0x100
52+ #define GBE13_SLAVE_PORT2_OFFSET 0x200
53+ #define GBE13_HW_STATS_OFFSET 0x300
54+ #define GBE13_ALE_OFFSET 0x600
5255#define GBE13_HOST_PORT_NUM 0
5356#define GBE13_NUM_SLAVES 4
5457#define GBE13_NUM_ALE_PORTS (GBE13_NUM_SLAVES + 1)
5861#define XGBE_MODULE_NAME "netcp-xgbe"
5962#define XGBE_SS_VERSION_10 0x4ee42100
6063
61- #define XGBE_SERDES_REG_INDEX 1
64+ #define XGBE_SS_REG_INDEX 0
65+ #define XGBE_SM_REG_INDEX 1
66+ #define XGBE_SERDES_REG_INDEX 2
67+
68+ /* offset relative to base of XGBE_SS_REG_INDEX */
6269#define XGBE10_SGMII_MODULE_OFFSET 0x100
63- #define XGBE10_SWITCH_MODULE_OFFSET 0x1000
64- #define XGBE10_HOST_PORT_OFFSET 0x1034
65- #define XGBE10_SLAVE_PORT_OFFSET 0x1064
66- #define XGBE10_EMAC_OFFSET 0x1400
67- #define XGBE10_ALE_OFFSET 0x1700
68- #define XGBE10_HW_STATS_OFFSET 0x1800
70+ /* offset relative to base of XGBE_SM_REG_INDEX */
71+ #define XGBE10_HOST_PORT_OFFSET 0x34
72+ #define XGBE10_SLAVE_PORT_OFFSET 0x64
73+ #define XGBE10_EMAC_OFFSET 0x400
74+ #define XGBE10_ALE_OFFSET 0x700
75+ #define XGBE10_HW_STATS_OFFSET 0x800
6976#define XGBE10_HOST_PORT_NUM 0
7077#define XGBE10_NUM_SLAVES 2
7178#define XGBE10_NUM_ALE_PORTS (XGBE10_NUM_SLAVES + 1)
@@ -1579,9 +1586,9 @@ static int init_slave(struct gbe_priv *gbe_dev, struct gbe_slave *slave,
15791586 else if (gbe_dev -> ss_version == XGBE_SS_VERSION_10 )
15801587 emac_reg_ofs = XGBE10_EMAC_OFFSET ;
15811588
1582- slave -> port_regs = gbe_dev -> ss_regs + port_reg_ofs +
1589+ slave -> port_regs = gbe_dev -> switch_regs + port_reg_ofs +
15831590 (0x30 * port_reg_num );
1584- slave -> emac_regs = gbe_dev -> ss_regs + emac_reg_ofs +
1591+ slave -> emac_regs = gbe_dev -> switch_regs + emac_reg_ofs +
15851592 (0x40 * slave -> slave_num );
15861593
15871594 if (gbe_dev -> ss_version == GBE_SS_VERSION_14 ) {
@@ -1732,22 +1739,39 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
17321739
17331740 ret = of_address_to_resource (node , 0 , & res );
17341741 if (ret ) {
1735- dev_err (gbe_dev -> dev , "Can't translate of node(%s) address for xgbe subsystem regs\n" ,
1736- node -> name );
1742+ dev_err (gbe_dev -> dev ,
1743+ "Can't xlate xgbe of node(%s) ss address at %d\n" ,
1744+ node -> name , XGBE_SS_REG_INDEX );
17371745 return ret ;
17381746 }
17391747
17401748 regs = devm_ioremap_resource (gbe_dev -> dev , & res );
17411749 if (IS_ERR (regs )) {
1742- dev_err (gbe_dev -> dev , "Failed to map xgbe register base\n" );
1750+ dev_err (gbe_dev -> dev , "Failed to map xgbe ss register base\n" );
17431751 return PTR_ERR (regs );
17441752 }
17451753 gbe_dev -> ss_regs = regs ;
17461754
1755+ ret = of_address_to_resource (node , XGBE_SM_REG_INDEX , & res );
1756+ if (ret ) {
1757+ dev_err (gbe_dev -> dev ,
1758+ "Can't xlate xgbe of node(%s) sm address at %d\n" ,
1759+ node -> name , XGBE_SM_REG_INDEX );
1760+ return ret ;
1761+ }
1762+
1763+ regs = devm_ioremap_resource (gbe_dev -> dev , & res );
1764+ if (IS_ERR (regs )) {
1765+ dev_err (gbe_dev -> dev , "Failed to map xgbe sm register base\n" );
1766+ return PTR_ERR (regs );
1767+ }
1768+ gbe_dev -> switch_regs = regs ;
1769+
17471770 ret = of_address_to_resource (node , XGBE_SERDES_REG_INDEX , & res );
17481771 if (ret ) {
1749- dev_err (gbe_dev -> dev , "Can't translate of node(%s) address for xgbe serdes regs\n" ,
1750- node -> name );
1772+ dev_err (gbe_dev -> dev ,
1773+ "Can't xlate xgbe serdes of node(%s) address at %d\n" ,
1774+ node -> name , XGBE_SERDES_REG_INDEX );
17511775 return ret ;
17521776 }
17531777
@@ -1770,11 +1794,10 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
17701794 gbe_dev -> ss_version = XGBE_SS_VERSION_10 ;
17711795 gbe_dev -> sgmii_port_regs = gbe_dev -> ss_regs +
17721796 XGBE10_SGMII_MODULE_OFFSET ;
1773- gbe_dev -> switch_regs = gbe_dev -> ss_regs + XGBE10_SWITCH_MODULE_OFFSET ;
17741797 gbe_dev -> host_port_regs = gbe_dev -> ss_regs + XGBE10_HOST_PORT_OFFSET ;
17751798
17761799 for (i = 0 ; i < XGBE10_NUM_HW_STATS_MOD ; i ++ )
1777- gbe_dev -> hw_stats_regs [i ] = gbe_dev -> ss_regs +
1800+ gbe_dev -> hw_stats_regs [i ] = gbe_dev -> switch_regs +
17781801 XGBE10_HW_STATS_OFFSET + (GBE_HW_STATS_REG_MAP_SZ * i );
17791802
17801803 gbe_dev -> ale_reg = gbe_dev -> ss_regs + XGBE10_ALE_OFFSET ;
@@ -1809,10 +1832,11 @@ static int get_gbe_resource_version(struct gbe_priv *gbe_dev,
18091832 void __iomem * regs ;
18101833 int ret ;
18111834
1812- ret = of_address_to_resource (node , 0 , & res );
1835+ ret = of_address_to_resource (node , GBE_SS_REG_INDEX , & res );
18131836 if (ret ) {
1814- dev_err (gbe_dev -> dev , "Can't translate of node(%s) address\n" ,
1815- node -> name );
1837+ dev_err (gbe_dev -> dev ,
1838+ "Can't translate of node(%s) of gbe ss address at %d\n" ,
1839+ node -> name , GBE_SS_REG_INDEX );
18161840 return ret ;
18171841 }
18181842
@@ -1829,8 +1853,41 @@ static int get_gbe_resource_version(struct gbe_priv *gbe_dev,
18291853static int set_gbe_ethss14_priv (struct gbe_priv * gbe_dev ,
18301854 struct device_node * node )
18311855{
1856+ struct resource res ;
18321857 void __iomem * regs ;
1833- int i ;
1858+ int i , ret ;
1859+
1860+ ret = of_address_to_resource (node , GBE_SGMII34_REG_INDEX , & res );
1861+ if (ret ) {
1862+ dev_err (gbe_dev -> dev ,
1863+ "Can't translate of gbe node(%s) address at index %d\n" ,
1864+ node -> name , GBE_SGMII34_REG_INDEX );
1865+ return ret ;
1866+ }
1867+
1868+ regs = devm_ioremap_resource (gbe_dev -> dev , & res );
1869+ if (IS_ERR (regs )) {
1870+ dev_err (gbe_dev -> dev ,
1871+ "Failed to map gbe sgmii port34 register base\n" );
1872+ return PTR_ERR (regs );
1873+ }
1874+ gbe_dev -> sgmii_port34_regs = regs ;
1875+
1876+ ret = of_address_to_resource (node , GBE_SM_REG_INDEX , & res );
1877+ if (ret ) {
1878+ dev_err (gbe_dev -> dev ,
1879+ "Can't translate of gbe node(%s) address at index %d\n" ,
1880+ node -> name , GBE_SM_REG_INDEX );
1881+ return ret ;
1882+ }
1883+
1884+ regs = devm_ioremap_resource (gbe_dev -> dev , & res );
1885+ if (IS_ERR (regs )) {
1886+ dev_err (gbe_dev -> dev ,
1887+ "Failed to map gbe switch module register base\n" );
1888+ return PTR_ERR (regs );
1889+ }
1890+ gbe_dev -> switch_regs = regs ;
18341891
18351892 gbe_dev -> hw_stats = devm_kzalloc (gbe_dev -> dev ,
18361893 GBE13_NUM_HW_STAT_ENTRIES *
@@ -1841,17 +1898,16 @@ static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
18411898 return - ENOMEM ;
18421899 }
18431900
1844- regs = gbe_dev -> ss_regs ;
1845- gbe_dev -> sgmii_port_regs = regs + GBE13_SGMII_MODULE_OFFSET ;
1846- gbe_dev -> sgmii_port34_regs = regs + GBE13_SGMII34_MODULE_OFFSET ;
1847- gbe_dev -> switch_regs = regs + GBE13_SWITCH_MODULE_OFFSET ;
1848- gbe_dev -> host_port_regs = regs + GBE13_HOST_PORT_OFFSET ;
1901+ gbe_dev -> sgmii_port_regs = gbe_dev -> ss_regs + GBE13_SGMII_MODULE_OFFSET ;
1902+ gbe_dev -> host_port_regs = gbe_dev -> switch_regs + GBE13_HOST_PORT_OFFSET ;
18491903
1850- for (i = 0 ; i < GBE13_NUM_HW_STATS_MOD ; i ++ )
1851- gbe_dev -> hw_stats_regs [i ] = regs + GBE13_HW_STATS_OFFSET +
1852- (GBE_HW_STATS_REG_MAP_SZ * i );
1904+ for (i = 0 ; i < GBE13_NUM_HW_STATS_MOD ; i ++ ) {
1905+ gbe_dev -> hw_stats_regs [i ] =
1906+ gbe_dev -> switch_regs + GBE13_HW_STATS_OFFSET +
1907+ (GBE_HW_STATS_REG_MAP_SZ * i );
1908+ }
18531909
1854- gbe_dev -> ale_reg = regs + GBE13_ALE_OFFSET ;
1910+ gbe_dev -> ale_reg = gbe_dev -> switch_regs + GBE13_ALE_OFFSET ;
18551911 gbe_dev -> ale_ports = GBE13_NUM_ALE_PORTS ;
18561912 gbe_dev -> host_port = GBE13_HOST_PORT_NUM ;
18571913 gbe_dev -> ale_entries = GBE13_NUM_ALE_ENTRIES ;
0 commit comments