Skip to content

Commit 370edb9

Browse files
wingmankwoknsekhar
authored andcommitted
net: netcp: ethss: fix error in calling sgmii api with incorrect offset
commit 8c85151 upstream. 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> Signed-off-by: Sekhar Nori <nsekhar@ti.com>
1 parent 48a870a commit 370edb9

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

drivers/net/ethernet/ti/netcp_ethss.c

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#define GBENU_ALE_OFFSET 0x1e000
7878
#define GBENU_HOST_PORT_NUM 0
7979
#define GBENU_NUM_ALE_ENTRIES 1024
80+
#define GBENU_SGMII_MODULE_SIZE 0x100
8081

8182
/* 10G Ethernet SS defines */
8283
#define XGBE_MODULE_NAME "netcp-xgbe"
@@ -149,8 +150,8 @@
149150
#define XGBE_STATS2_MODULE 2
150151

151152
/* s: 0-based slave_port */
152-
#define SGMII_BASE(s) \
153-
(((s) < 2) ? gbe_dev->sgmii_port_regs : gbe_dev->sgmii_port34_regs)
153+
#define SGMII_BASE(d, s) \
154+
(((s) < 2) ? (d)->sgmii_port_regs : (d)->sgmii_port34_regs)
154155

155156
#define GBE_TX_QUEUE 648
156157
#define GBE_TXHOOK_ORDER 0
@@ -1997,13 +1998,8 @@ static void netcp_ethss_update_link_state(struct gbe_priv *gbe_dev,
19971998
return;
19981999

19992000
if (!SLAVE_LINK_IS_XGMII(slave)) {
2000-
if (gbe_dev->ss_version == GBE_SS_VERSION_14)
2001-
sgmii_link_state =
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);
2001+
sgmii_link_state =
2002+
netcp_sgmii_get_port_link(SGMII_BASE(gbe_dev, sp), sp);
20072003
}
20082004

20092005
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,
21002096
static void gbe_sgmii_rtreset(struct gbe_priv *priv,
21012097
struct gbe_slave *slave, bool set)
21022098
{
2103-
void __iomem *sgmii_port_regs;
2104-
21052099
if (SLAVE_LINK_IS_XGMII(slave))
21062100
return;
21072101

2108-
if ((priv->ss_version == GBE_SS_VERSION_14) && (slave->slave_num >= 2))
2109-
sgmii_port_regs = priv->sgmii_port34_regs;
2110-
else
2111-
sgmii_port_regs = priv->sgmii_port_regs;
2112-
2113-
netcp_sgmii_rtreset(sgmii_port_regs, slave->slave_num, set);
2102+
netcp_sgmii_rtreset(SGMII_BASE(priv, slave->slave_num),
2103+
slave->slave_num, set);
21142104
}
21152105

21162106
static void gbe_slave_stop(struct gbe_intf *intf)
@@ -2136,17 +2126,12 @@ static void gbe_slave_stop(struct gbe_intf *intf)
21362126

21372127
static void gbe_sgmii_config(struct gbe_priv *priv, struct gbe_slave *slave)
21382128
{
2139-
void __iomem *sgmii_port_regs;
2140-
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;
2129+
if (SLAVE_LINK_IS_XGMII(slave))
2130+
return;
21442131

2145-
if (!SLAVE_LINK_IS_XGMII(slave)) {
2146-
netcp_sgmii_reset(sgmii_port_regs, slave->slave_num);
2147-
netcp_sgmii_config(sgmii_port_regs, slave->slave_num,
2148-
slave->link_interface);
2149-
}
2132+
netcp_sgmii_reset(SGMII_BASE(priv, slave->slave_num), slave->slave_num);
2133+
netcp_sgmii_config(SGMII_BASE(priv, slave->slave_num), slave->slave_num,
2134+
slave->link_interface);
21502135
}
21512136

21522137
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,
29972982
gbe_dev->switch_regs = regs;
29982983

29992984
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+
30002993
gbe_dev->host_port_regs = gbe_dev->switch_regs + GBENU_HOST_PORT_OFFSET;
30012994

30022995
for (i = 0; i < (gbe_dev->max_num_ports); i++)

0 commit comments

Comments
 (0)