提交 9f52b564 编写于 作者: M Michael Chan 提交者: David S. Miller

bnx2: Check netif_running() in all ethtool operations.

We need to check netif_running() state in most ethtool operations
and properly handle the !netif_running() state where the chip is
in an uninitailzed state or low power state that may not accept
any MMIO.
Signed-off-by: NMichael Chan <mchan@broadcom.com>
Signed-off-by: NBenjamin Li <benli@broadcom.com>
Signed-off-by: NMatt Carlson <mcarlson@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 74bf4ba3
...@@ -3248,6 +3248,9 @@ bnx2_set_rx_mode(struct net_device *dev) ...@@ -3248,6 +3248,9 @@ bnx2_set_rx_mode(struct net_device *dev)
struct dev_addr_list *uc_ptr; struct dev_addr_list *uc_ptr;
int i; int i;
if (!netif_running(dev))
return;
spin_lock_bh(&bp->phy_lock); spin_lock_bh(&bp->phy_lock);
rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS | rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
...@@ -5521,6 +5524,9 @@ bnx2_test_link(struct bnx2 *bp) ...@@ -5521,6 +5524,9 @@ bnx2_test_link(struct bnx2 *bp)
{ {
u32 bmsr; u32 bmsr;
if (!netif_running(bp->dev))
return -ENODEV;
if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) { if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
if (bp->link_up) if (bp->link_up)
return 0; return 0;
...@@ -6485,6 +6491,9 @@ bnx2_nway_reset(struct net_device *dev) ...@@ -6485,6 +6491,9 @@ bnx2_nway_reset(struct net_device *dev)
struct bnx2 *bp = netdev_priv(dev); struct bnx2 *bp = netdev_priv(dev);
u32 bmcr; u32 bmcr;
if (!netif_running(dev))
return -EAGAIN;
if (!(bp->autoneg & AUTONEG_SPEED)) { if (!(bp->autoneg & AUTONEG_SPEED)) {
return -EINVAL; return -EINVAL;
} }
...@@ -6540,6 +6549,9 @@ bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -6540,6 +6549,9 @@ bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
struct bnx2 *bp = netdev_priv(dev); struct bnx2 *bp = netdev_priv(dev);
int rc; int rc;
if (!netif_running(dev))
return -EAGAIN;
/* parameters already validated in ethtool_get_eeprom */ /* parameters already validated in ethtool_get_eeprom */
rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len); rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
...@@ -6554,6 +6566,9 @@ bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -6554,6 +6566,9 @@ bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
struct bnx2 *bp = netdev_priv(dev); struct bnx2 *bp = netdev_priv(dev);
int rc; int rc;
if (!netif_running(dev))
return -EAGAIN;
/* parameters already validated in ethtool_set_eeprom */ /* parameters already validated in ethtool_set_eeprom */
rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len); rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
...@@ -6718,11 +6733,11 @@ bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) ...@@ -6718,11 +6733,11 @@ bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
bp->autoneg &= ~AUTONEG_FLOW_CTRL; bp->autoneg &= ~AUTONEG_FLOW_CTRL;
} }
spin_lock_bh(&bp->phy_lock); if (netif_running(dev)) {
spin_lock_bh(&bp->phy_lock);
bnx2_setup_phy(bp, bp->phy_port); bnx2_setup_phy(bp, bp->phy_port);
spin_unlock_bh(&bp->phy_lock);
spin_unlock_bh(&bp->phy_lock); }
return 0; return 0;
} }
...@@ -6913,6 +6928,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) ...@@ -6913,6 +6928,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
{ {
struct bnx2 *bp = netdev_priv(dev); struct bnx2 *bp = netdev_priv(dev);
bnx2_set_power_state(bp, PCI_D0);
memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS); memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
if (etest->flags & ETH_TEST_FL_OFFLINE) { if (etest->flags & ETH_TEST_FL_OFFLINE) {
int i; int i;
...@@ -6932,9 +6949,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) ...@@ -6932,9 +6949,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
if ((buf[2] = bnx2_test_loopback(bp)) != 0) if ((buf[2] = bnx2_test_loopback(bp)) != 0)
etest->flags |= ETH_TEST_FL_FAILED; etest->flags |= ETH_TEST_FL_FAILED;
if (!netif_running(bp->dev)) { if (!netif_running(bp->dev))
bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); bnx2_shutdown_chip(bp);
}
else { else {
bnx2_init_nic(bp, 1); bnx2_init_nic(bp, 1);
bnx2_netif_start(bp); bnx2_netif_start(bp);
...@@ -6962,6 +6978,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) ...@@ -6962,6 +6978,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
etest->flags |= ETH_TEST_FL_FAILED; etest->flags |= ETH_TEST_FL_FAILED;
} }
if (!netif_running(bp->dev))
bnx2_set_power_state(bp, PCI_D3hot);
} }
static void static void
...@@ -7027,6 +7045,8 @@ bnx2_phys_id(struct net_device *dev, u32 data) ...@@ -7027,6 +7045,8 @@ bnx2_phys_id(struct net_device *dev, u32 data)
int i; int i;
u32 save; u32 save;
bnx2_set_power_state(bp, PCI_D0);
if (data == 0) if (data == 0)
data = 2; data = 2;
...@@ -7051,6 +7071,10 @@ bnx2_phys_id(struct net_device *dev, u32 data) ...@@ -7051,6 +7071,10 @@ bnx2_phys_id(struct net_device *dev, u32 data)
} }
REG_WR(bp, BNX2_EMAC_LED, 0); REG_WR(bp, BNX2_EMAC_LED, 0);
REG_WR(bp, BNX2_MISC_CFG, save); REG_WR(bp, BNX2_MISC_CFG, save);
if (!netif_running(dev))
bnx2_set_power_state(bp, PCI_D3hot);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册