Skip to content

Commit 85f9feb

Browse files
tlendackydavem330
authored andcommitted
amd-xgbe: Convert to using the new link mode settings
Convert from using the old u32 supported, advertising, etc. link settings to the new link mode settings that support bit positions / settings greater than 32 bits. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 606c07f commit 85f9feb

File tree

5 files changed

+345
-242
lines changed

5 files changed

+345
-242
lines changed

drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ static int xgbe_set_pauseparam(struct net_device *netdev,
267267
struct ethtool_pauseparam *pause)
268268
{
269269
struct xgbe_prv_data *pdata = netdev_priv(netdev);
270+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
270271
int ret = 0;
271272

272273
if (pause->autoneg && (pdata->phy.autoneg != AUTONEG_ENABLE)) {
@@ -279,16 +280,21 @@ static int xgbe_set_pauseparam(struct net_device *netdev,
279280
pdata->phy.tx_pause = pause->tx_pause;
280281
pdata->phy.rx_pause = pause->rx_pause;
281282

282-
pdata->phy.advertising &= ~ADVERTISED_Pause;
283-
pdata->phy.advertising &= ~ADVERTISED_Asym_Pause;
283+
XGBE_CLR_ADV(lks, Pause);
284+
XGBE_CLR_ADV(lks, Asym_Pause);
284285

285286
if (pause->rx_pause) {
286-
pdata->phy.advertising |= ADVERTISED_Pause;
287-
pdata->phy.advertising |= ADVERTISED_Asym_Pause;
287+
XGBE_SET_ADV(lks, Pause);
288+
XGBE_SET_ADV(lks, Asym_Pause);
288289
}
289290

290-
if (pause->tx_pause)
291-
pdata->phy.advertising ^= ADVERTISED_Asym_Pause;
291+
if (pause->tx_pause) {
292+
/* Equivalent to XOR of Asym_Pause */
293+
if (XGBE_ADV(lks, Asym_Pause))
294+
XGBE_CLR_ADV(lks, Asym_Pause);
295+
else
296+
XGBE_SET_ADV(lks, Asym_Pause);
297+
}
292298

293299
if (netif_running(netdev))
294300
ret = pdata->phy_if.phy_config_aneg(pdata);
@@ -300,30 +306,29 @@ static int xgbe_get_link_ksettings(struct net_device *netdev,
300306
struct ethtool_link_ksettings *cmd)
301307
{
302308
struct xgbe_prv_data *pdata = netdev_priv(netdev);
309+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
303310

304311
cmd->base.phy_address = pdata->phy.address;
305312

306-
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
307-
pdata->phy.supported);
308-
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
309-
pdata->phy.advertising);
310-
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising,
311-
pdata->phy.lp_advertising);
312-
313313
cmd->base.autoneg = pdata->phy.autoneg;
314314
cmd->base.speed = pdata->phy.speed;
315315
cmd->base.duplex = pdata->phy.duplex;
316316

317317
cmd->base.port = PORT_NONE;
318318

319+
XGBE_LM_COPY(cmd, supported, lks, supported);
320+
XGBE_LM_COPY(cmd, advertising, lks, advertising);
321+
XGBE_LM_COPY(cmd, lp_advertising, lks, lp_advertising);
322+
319323
return 0;
320324
}
321325

322326
static int xgbe_set_link_ksettings(struct net_device *netdev,
323327
const struct ethtool_link_ksettings *cmd)
324328
{
325329
struct xgbe_prv_data *pdata = netdev_priv(netdev);
326-
u32 advertising;
330+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
331+
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
327332
u32 speed;
328333
int ret;
329334

@@ -355,15 +360,17 @@ static int xgbe_set_link_ksettings(struct net_device *netdev,
355360
}
356361
}
357362

358-
ethtool_convert_link_mode_to_legacy_u32(&advertising,
359-
cmd->link_modes.advertising);
360-
361363
netif_dbg(pdata, link, netdev,
362-
"requested advertisement %#x, phy supported %#x\n",
363-
advertising, pdata->phy.supported);
364+
"requested advertisement 0x%*pb, phy supported 0x%*pb\n",
365+
__ETHTOOL_LINK_MODE_MASK_NBITS, cmd->link_modes.advertising,
366+
__ETHTOOL_LINK_MODE_MASK_NBITS, lks->link_modes.supported);
367+
368+
bitmap_and(advertising,
369+
cmd->link_modes.advertising, lks->link_modes.supported,
370+
__ETHTOOL_LINK_MODE_MASK_NBITS);
364371

365-
advertising &= pdata->phy.supported;
366-
if ((cmd->base.autoneg == AUTONEG_ENABLE) && !advertising) {
372+
if ((cmd->base.autoneg == AUTONEG_ENABLE) &&
373+
bitmap_empty(advertising, __ETHTOOL_LINK_MODE_MASK_NBITS)) {
367374
netdev_err(netdev,
368375
"unsupported requested advertisement\n");
369376
return -EINVAL;
@@ -373,12 +380,13 @@ static int xgbe_set_link_ksettings(struct net_device *netdev,
373380
pdata->phy.autoneg = cmd->base.autoneg;
374381
pdata->phy.speed = speed;
375382
pdata->phy.duplex = cmd->base.duplex;
376-
pdata->phy.advertising = advertising;
383+
bitmap_copy(lks->link_modes.advertising, advertising,
384+
__ETHTOOL_LINK_MODE_MASK_NBITS);
377385

378386
if (cmd->base.autoneg == AUTONEG_ENABLE)
379-
pdata->phy.advertising |= ADVERTISED_Autoneg;
387+
XGBE_SET_ADV(lks, Autoneg);
380388
else
381-
pdata->phy.advertising &= ~ADVERTISED_Autoneg;
389+
XGBE_CLR_ADV(lks, Autoneg);
382390

383391
if (netif_running(netdev))
384392
ret = pdata->phy_if.phy_config_aneg(pdata);

drivers/net/ethernet/amd/xgbe/xgbe-mdio.c

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -615,20 +615,22 @@ static enum xgbe_an xgbe_an73_page_received(struct xgbe_prv_data *pdata)
615615

616616
static enum xgbe_an xgbe_an73_incompat_link(struct xgbe_prv_data *pdata)
617617
{
618+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
619+
618620
/* Be sure we aren't looping trying to negotiate */
619621
if (xgbe_in_kr_mode(pdata)) {
620622
pdata->kr_state = XGBE_RX_ERROR;
621623

622-
if (!(pdata->phy.advertising & ADVERTISED_1000baseKX_Full) &&
623-
!(pdata->phy.advertising & ADVERTISED_2500baseX_Full))
624+
if (!XGBE_ADV(lks, 1000baseKX_Full) &&
625+
!XGBE_ADV(lks, 2500baseX_Full))
624626
return XGBE_AN_NO_LINK;
625627

626628
if (pdata->kx_state != XGBE_RX_BPA)
627629
return XGBE_AN_NO_LINK;
628630
} else {
629631
pdata->kx_state = XGBE_RX_ERROR;
630632

631-
if (!(pdata->phy.advertising & ADVERTISED_10000baseKR_Full))
633+
if (!XGBE_ADV(lks, 10000baseKR_Full))
632634
return XGBE_AN_NO_LINK;
633635

634636
if (pdata->kr_state != XGBE_RX_BPA)
@@ -944,18 +946,19 @@ static void xgbe_an_state_machine(struct work_struct *work)
944946

945947
static void xgbe_an37_init(struct xgbe_prv_data *pdata)
946948
{
947-
unsigned int advertising, reg;
949+
struct ethtool_link_ksettings lks;
950+
unsigned int reg;
948951

949-
advertising = pdata->phy_if.phy_impl.an_advertising(pdata);
952+
pdata->phy_if.phy_impl.an_advertising(pdata, &lks);
950953

951954
/* Set up Advertisement register */
952955
reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
953-
if (advertising & ADVERTISED_Pause)
956+
if (XGBE_ADV(&lks, Pause))
954957
reg |= 0x100;
955958
else
956959
reg &= ~0x100;
957960

958-
if (advertising & ADVERTISED_Asym_Pause)
961+
if (XGBE_ADV(&lks, Asym_Pause))
959962
reg |= 0x80;
960963
else
961964
reg &= ~0x80;
@@ -992,13 +995,14 @@ static void xgbe_an37_init(struct xgbe_prv_data *pdata)
992995

993996
static void xgbe_an73_init(struct xgbe_prv_data *pdata)
994997
{
995-
unsigned int advertising, reg;
998+
struct ethtool_link_ksettings lks;
999+
unsigned int reg;
9961000

997-
advertising = pdata->phy_if.phy_impl.an_advertising(pdata);
1001+
pdata->phy_if.phy_impl.an_advertising(pdata, &lks);
9981002

9991003
/* Set up Advertisement register 3 first */
10001004
reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1001-
if (advertising & ADVERTISED_10000baseR_FEC)
1005+
if (XGBE_ADV(&lks, 10000baseR_FEC))
10021006
reg |= 0xc000;
10031007
else
10041008
reg &= ~0xc000;
@@ -1007,13 +1011,13 @@ static void xgbe_an73_init(struct xgbe_prv_data *pdata)
10071011

10081012
/* Set up Advertisement register 2 next */
10091013
reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1010-
if (advertising & ADVERTISED_10000baseKR_Full)
1014+
if (XGBE_ADV(&lks, 10000baseKR_Full))
10111015
reg |= 0x80;
10121016
else
10131017
reg &= ~0x80;
10141018

1015-
if ((advertising & ADVERTISED_1000baseKX_Full) ||
1016-
(advertising & ADVERTISED_2500baseX_Full))
1019+
if (XGBE_ADV(&lks, 1000baseKX_Full) ||
1020+
XGBE_ADV(&lks, 2500baseX_Full))
10171021
reg |= 0x20;
10181022
else
10191023
reg &= ~0x20;
@@ -1022,12 +1026,12 @@ static void xgbe_an73_init(struct xgbe_prv_data *pdata)
10221026

10231027
/* Set up Advertisement register 1 last */
10241028
reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1025-
if (advertising & ADVERTISED_Pause)
1029+
if (XGBE_ADV(&lks, Pause))
10261030
reg |= 0x400;
10271031
else
10281032
reg &= ~0x400;
10291033

1030-
if (advertising & ADVERTISED_Asym_Pause)
1034+
if (XGBE_ADV(&lks, Asym_Pause))
10311035
reg |= 0x800;
10321036
else
10331037
reg &= ~0x800;
@@ -1283,9 +1287,10 @@ static enum xgbe_mode xgbe_phy_status_aneg(struct xgbe_prv_data *pdata)
12831287

12841288
static void xgbe_phy_status_result(struct xgbe_prv_data *pdata)
12851289
{
1290+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
12861291
enum xgbe_mode mode;
12871292

1288-
pdata->phy.lp_advertising = 0;
1293+
XGBE_ZERO_LP_ADV(lks);
12891294

12901295
if ((pdata->phy.autoneg != AUTONEG_ENABLE) || pdata->parallel_detect)
12911296
mode = xgbe_cur_mode(pdata);
@@ -1515,17 +1520,21 @@ static void xgbe_dump_phy_registers(struct xgbe_prv_data *pdata)
15151520

15161521
static int xgbe_phy_best_advertised_speed(struct xgbe_prv_data *pdata)
15171522
{
1518-
if (pdata->phy.advertising & ADVERTISED_10000baseKR_Full)
1523+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1524+
1525+
if (XGBE_ADV(lks, 10000baseKR_Full))
15191526
return SPEED_10000;
1520-
else if (pdata->phy.advertising & ADVERTISED_10000baseT_Full)
1527+
else if (XGBE_ADV(lks, 10000baseT_Full))
15211528
return SPEED_10000;
1522-
else if (pdata->phy.advertising & ADVERTISED_2500baseX_Full)
1529+
else if (XGBE_ADV(lks, 2500baseX_Full))
15231530
return SPEED_2500;
1524-
else if (pdata->phy.advertising & ADVERTISED_1000baseKX_Full)
1531+
else if (XGBE_ADV(lks, 2500baseT_Full))
1532+
return SPEED_2500;
1533+
else if (XGBE_ADV(lks, 1000baseKX_Full))
15251534
return SPEED_1000;
1526-
else if (pdata->phy.advertising & ADVERTISED_1000baseT_Full)
1535+
else if (XGBE_ADV(lks, 1000baseT_Full))
15271536
return SPEED_1000;
1528-
else if (pdata->phy.advertising & ADVERTISED_100baseT_Full)
1537+
else if (XGBE_ADV(lks, 100baseT_Full))
15291538
return SPEED_100;
15301539

15311540
return SPEED_UNKNOWN;
@@ -1538,6 +1547,7 @@ static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
15381547

15391548
static int xgbe_phy_init(struct xgbe_prv_data *pdata)
15401549
{
1550+
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
15411551
int ret;
15421552

15431553
mutex_init(&pdata->an_mutex);
@@ -1555,11 +1565,13 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata)
15551565
ret = pdata->phy_if.phy_impl.init(pdata);
15561566
if (ret)
15571567
return ret;
1558-
pdata->phy.advertising = pdata->phy.supported;
1568+
1569+
/* Copy supported link modes to advertising link modes */
1570+
XGBE_LM_COPY(lks, advertising, lks, supported);
15591571

15601572
pdata->phy.address = 0;
15611573

1562-
if (pdata->phy.advertising & ADVERTISED_Autoneg) {
1574+
if (XGBE_ADV(lks, Autoneg)) {
15631575
pdata->phy.autoneg = AUTONEG_ENABLE;
15641576
pdata->phy.speed = SPEED_UNKNOWN;
15651577
pdata->phy.duplex = DUPLEX_UNKNOWN;
@@ -1576,16 +1588,21 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata)
15761588
pdata->phy.rx_pause = pdata->rx_pause;
15771589

15781590
/* Fix up Flow Control advertising */
1579-
pdata->phy.advertising &= ~ADVERTISED_Pause;
1580-
pdata->phy.advertising &= ~ADVERTISED_Asym_Pause;
1591+
XGBE_CLR_ADV(lks, Pause);
1592+
XGBE_CLR_ADV(lks, Asym_Pause);
15811593

15821594
if (pdata->rx_pause) {
1583-
pdata->phy.advertising |= ADVERTISED_Pause;
1584-
pdata->phy.advertising |= ADVERTISED_Asym_Pause;
1595+
XGBE_SET_ADV(lks, Pause);
1596+
XGBE_SET_ADV(lks, Asym_Pause);
15851597
}
15861598

1587-
if (pdata->tx_pause)
1588-
pdata->phy.advertising ^= ADVERTISED_Asym_Pause;
1599+
if (pdata->tx_pause) {
1600+
/* Equivalent to XOR of Asym_Pause */
1601+
if (XGBE_ADV(lks, Asym_Pause))
1602+
XGBE_CLR_ADV(lks, Asym_Pause);
1603+
else
1604+
XGBE_SET_ADV(lks, Asym_Pause);
1605+
}
15891606

15901607
if (netif_msg_drv(pdata))
15911608
xgbe_dump_phy_registers(pdata);

0 commit comments

Comments
 (0)