diff options
author | WingMan Kwok <w-kwok2@ti.com> | 2015-09-23 13:37:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-09-23 17:37:36 -0400 |
commit | 8c85151ddec66f78fbf997e35be005a322fbb9c9 (patch) | |
tree | c605453e7bdf96f5fc1a391b04a884227ece990c /drivers/net/ethernet/ti/netcp_ethss.c | |
parent | d3869efe7a8a2298516d9af4f91487cf486ca945 (diff) |
net: netcp: ethss: fix error in calling sgmii api with incorrect offset
On K2HK, sgmii module registers of slave 0 and 1 are mem
mapped to one contiguous block, while those of slave 2
and 3 are mapped to another contiguous block. However,
on K2E and K2L, sgmii module registers of all slaves are
mem mapped to one contiguous block. SGMII APIs expect
slave 0 sgmii base when API is invoked for slave 0 and 1,
and slave 2 sgmii base when invoked for other slaves.
Before this patch, slave 0 sgmii base is always passed to
sgmii API for K2E regardless which slave is the API invoked
for. This patch fixes the problem.
Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ti/netcp_ethss.c')
-rw-r--r-- | drivers/net/ethernet/ti/netcp_ethss.c | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c index 6f16d6aaf7b7..6bff8d82ceab 100644 --- a/drivers/net/ethernet/ti/netcp_ethss.c +++ b/drivers/net/ethernet/ti/netcp_ethss.c | |||
@@ -77,6 +77,7 @@ | |||
77 | #define GBENU_ALE_OFFSET 0x1e000 | 77 | #define GBENU_ALE_OFFSET 0x1e000 |
78 | #define GBENU_HOST_PORT_NUM 0 | 78 | #define GBENU_HOST_PORT_NUM 0 |
79 | #define GBENU_NUM_ALE_ENTRIES 1024 | 79 | #define GBENU_NUM_ALE_ENTRIES 1024 |
80 | #define GBENU_SGMII_MODULE_SIZE 0x100 | ||
80 | 81 | ||
81 | /* 10G Ethernet SS defines */ | 82 | /* 10G Ethernet SS defines */ |
82 | #define XGBE_MODULE_NAME "netcp-xgbe" | 83 | #define XGBE_MODULE_NAME "netcp-xgbe" |
@@ -149,8 +150,8 @@ | |||
149 | #define XGBE_STATS2_MODULE 2 | 150 | #define XGBE_STATS2_MODULE 2 |
150 | 151 | ||
151 | /* s: 0-based slave_port */ | 152 | /* s: 0-based slave_port */ |
152 | #define SGMII_BASE(s) \ | 153 | #define SGMII_BASE(d, s) \ |
153 | (((s) < 2) ? gbe_dev->sgmii_port_regs : gbe_dev->sgmii_port34_regs) | 154 | (((s) < 2) ? (d)->sgmii_port_regs : (d)->sgmii_port34_regs) |
154 | 155 | ||
155 | #define GBE_TX_QUEUE 648 | 156 | #define GBE_TX_QUEUE 648 |
156 | #define GBE_TXHOOK_ORDER 0 | 157 | #define GBE_TXHOOK_ORDER 0 |
@@ -1997,13 +1998,8 @@ static void netcp_ethss_update_link_state(struct gbe_priv *gbe_dev, | |||
1997 | return; | 1998 | return; |
1998 | 1999 | ||
1999 | if (!SLAVE_LINK_IS_XGMII(slave)) { | 2000 | if (!SLAVE_LINK_IS_XGMII(slave)) { |
2000 | if (gbe_dev->ss_version == GBE_SS_VERSION_14) | 2001 | sgmii_link_state = |
2001 | sgmii_link_state = | 2002 | netcp_sgmii_get_port_link(SGMII_BASE(gbe_dev, sp), sp); |
2002 | netcp_sgmii_get_port_link(SGMII_BASE(sp), sp); | ||
2003 | else | ||
2004 | sgmii_link_state = | ||
2005 | netcp_sgmii_get_port_link( | ||
2006 | gbe_dev->sgmii_port_regs, sp); | ||
2007 | } | 2003 | } |
2008 | 2004 | ||
2009 | phy_link_state = gbe_phy_link_status(slave); | 2005 | phy_link_state = gbe_phy_link_status(slave); |
@@ -2100,17 +2096,11 @@ static void gbe_port_config(struct gbe_priv *gbe_dev, struct gbe_slave *slave, | |||
2100 | static void gbe_sgmii_rtreset(struct gbe_priv *priv, | 2096 | static void gbe_sgmii_rtreset(struct gbe_priv *priv, |
2101 | struct gbe_slave *slave, bool set) | 2097 | struct gbe_slave *slave, bool set) |
2102 | { | 2098 | { |
2103 | void __iomem *sgmii_port_regs; | ||
2104 | |||
2105 | if (SLAVE_LINK_IS_XGMII(slave)) | 2099 | if (SLAVE_LINK_IS_XGMII(slave)) |
2106 | return; | 2100 | return; |
2107 | 2101 | ||
2108 | if ((priv->ss_version == GBE_SS_VERSION_14) && (slave->slave_num >= 2)) | 2102 | netcp_sgmii_rtreset(SGMII_BASE(priv, slave->slave_num), |
2109 | sgmii_port_regs = priv->sgmii_port34_regs; | 2103 | slave->slave_num, set); |
2110 | else | ||
2111 | sgmii_port_regs = priv->sgmii_port_regs; | ||
2112 | |||
2113 | netcp_sgmii_rtreset(sgmii_port_regs, slave->slave_num, set); | ||
2114 | } | 2104 | } |
2115 | 2105 | ||
2116 | static void gbe_slave_stop(struct gbe_intf *intf) | 2106 | static void gbe_slave_stop(struct gbe_intf *intf) |
@@ -2136,17 +2126,12 @@ static void gbe_slave_stop(struct gbe_intf *intf) | |||
2136 | 2126 | ||
2137 | static void gbe_sgmii_config(struct gbe_priv *priv, struct gbe_slave *slave) | 2127 | static void gbe_sgmii_config(struct gbe_priv *priv, struct gbe_slave *slave) |
2138 | { | 2128 | { |
2139 | void __iomem *sgmii_port_regs; | 2129 | if (SLAVE_LINK_IS_XGMII(slave)) |
2140 | 2130 | return; | |
2141 | sgmii_port_regs = priv->sgmii_port_regs; | ||
2142 | if ((priv->ss_version == GBE_SS_VERSION_14) && (slave->slave_num >= 2)) | ||
2143 | sgmii_port_regs = priv->sgmii_port34_regs; | ||
2144 | 2131 | ||
2145 | if (!SLAVE_LINK_IS_XGMII(slave)) { | 2132 | netcp_sgmii_reset(SGMII_BASE(priv, slave->slave_num), slave->slave_num); |
2146 | netcp_sgmii_reset(sgmii_port_regs, slave->slave_num); | 2133 | netcp_sgmii_config(SGMII_BASE(priv, slave->slave_num), slave->slave_num, |
2147 | netcp_sgmii_config(sgmii_port_regs, slave->slave_num, | 2134 | slave->link_interface); |
2148 | slave->link_interface); | ||
2149 | } | ||
2150 | } | 2135 | } |
2151 | 2136 | ||
2152 | static int gbe_slave_open(struct gbe_intf *gbe_intf) | 2137 | static int gbe_slave_open(struct gbe_intf *gbe_intf) |
@@ -2997,6 +2982,14 @@ static int set_gbenu_ethss_priv(struct gbe_priv *gbe_dev, | |||
2997 | gbe_dev->switch_regs = regs; | 2982 | gbe_dev->switch_regs = regs; |
2998 | 2983 | ||
2999 | gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + GBENU_SGMII_MODULE_OFFSET; | 2984 | gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + GBENU_SGMII_MODULE_OFFSET; |
2985 | |||
2986 | /* Although sgmii modules are mem mapped to one contiguous | ||
2987 | * region on GBENU devices, setting sgmii_port34_regs allows | ||
2988 | * consistent code when accessing sgmii api | ||
2989 | */ | ||
2990 | gbe_dev->sgmii_port34_regs = gbe_dev->sgmii_port_regs + | ||
2991 | (2 * GBENU_SGMII_MODULE_SIZE); | ||
2992 | |||
3000 | gbe_dev->host_port_regs = gbe_dev->switch_regs + GBENU_HOST_PORT_OFFSET; | 2993 | gbe_dev->host_port_regs = gbe_dev->switch_regs + GBENU_HOST_PORT_OFFSET; |
3001 | 2994 | ||
3002 | for (i = 0; i < (gbe_dev->max_num_ports); i++) | 2995 | for (i = 0; i < (gbe_dev->max_num_ports); i++) |