Merge branch 'amd-xgbe-fixes'
Tom Lendacky says: ==================== amd-xgbe: AMD XGBE driver fixes 2017-02-28 This patch series addresses some issues in the AMD XGBE driver. The following fixes are included in this driver update series: - Stop the PHY before disabling and releasing device interrupts so that MDIO requests issued by the device can be properly handled - Set the MDIO communication mode on device startup, not just device probe - Do not overwrite SFP settings when mod_absent is detected This patch series is based on net. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1323,7 +1323,7 @@ static int xgbe_read_ext_mii_regs(struct xgbe_prv_data *pdata, int addr,
|
|||||||
static int xgbe_set_ext_mii_mode(struct xgbe_prv_data *pdata, unsigned int port,
|
static int xgbe_set_ext_mii_mode(struct xgbe_prv_data *pdata, unsigned int port,
|
||||||
enum xgbe_mdio_mode mode)
|
enum xgbe_mdio_mode mode)
|
||||||
{
|
{
|
||||||
unsigned int reg_val = 0;
|
unsigned int reg_val = XGMAC_IOREAD(pdata, MAC_MDIOCL22R);
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case XGBE_MDIO_MODE_CL22:
|
case XGBE_MDIO_MODE_CL22:
|
||||||
|
|||||||
@@ -1131,12 +1131,12 @@ static void xgbe_stop(struct xgbe_prv_data *pdata)
|
|||||||
hw_if->disable_tx(pdata);
|
hw_if->disable_tx(pdata);
|
||||||
hw_if->disable_rx(pdata);
|
hw_if->disable_rx(pdata);
|
||||||
|
|
||||||
|
phy_if->phy_stop(pdata);
|
||||||
|
|
||||||
xgbe_free_irqs(pdata);
|
xgbe_free_irqs(pdata);
|
||||||
|
|
||||||
xgbe_napi_disable(pdata, 1);
|
xgbe_napi_disable(pdata, 1);
|
||||||
|
|
||||||
phy_if->phy_stop(pdata);
|
|
||||||
|
|
||||||
hw_if->exit(pdata);
|
hw_if->exit(pdata);
|
||||||
|
|
||||||
channel = pdata->channel;
|
channel = pdata->channel;
|
||||||
|
|||||||
@@ -716,6 +716,8 @@ static void xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
|
|||||||
pdata->phy.duplex = DUPLEX_UNKNOWN;
|
pdata->phy.duplex = DUPLEX_UNKNOWN;
|
||||||
pdata->phy.autoneg = AUTONEG_ENABLE;
|
pdata->phy.autoneg = AUTONEG_ENABLE;
|
||||||
pdata->phy.advertising = pdata->phy.supported;
|
pdata->phy.advertising = pdata->phy.supported;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdata->phy.advertising &= ~ADVERTISED_Autoneg;
|
pdata->phy.advertising &= ~ADVERTISED_Autoneg;
|
||||||
@@ -875,6 +877,16 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
|
|||||||
!phy_data->sfp_phy_avail)
|
!phy_data->sfp_phy_avail)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* Set the proper MDIO mode for the PHY */
|
||||||
|
ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
|
||||||
|
phy_data->phydev_mode);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(pdata->netdev,
|
||||||
|
"mdio port/clause not compatible (%u/%u)\n",
|
||||||
|
phy_data->mdio_addr, phy_data->phydev_mode);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create and connect to the PHY device */
|
/* Create and connect to the PHY device */
|
||||||
phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
|
phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
|
||||||
(phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
|
(phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
|
||||||
@@ -2722,6 +2734,18 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* Set the proper MDIO mode for the re-driver */
|
||||||
|
if (phy_data->redrv && !phy_data->redrv_if) {
|
||||||
|
ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
|
||||||
|
XGBE_MDIO_MODE_CL22);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(pdata->netdev,
|
||||||
|
"redriver mdio port not compatible (%u)\n",
|
||||||
|
phy_data->redrv_addr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Start in highest supported mode */
|
/* Start in highest supported mode */
|
||||||
xgbe_phy_set_mode(pdata, phy_data->start_mode);
|
xgbe_phy_set_mode(pdata, phy_data->start_mode);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user