Skip to content

Commit

Permalink
bnx2: Try to recover from PCI block reset
Browse files Browse the repository at this point in the history
If the PCI block has reset, the memory enable bit will be reset and
the device will not respond to MMIO access.  bnx2_reset_task() currently
will not recover when this happens.  Add code to detect this condition
and restore the PCI state.  This scenario has been reported by some
users.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Michael Chan authored and David S. Miller committed Jul 17, 2012
1 parent aed93e0 commit efdfad3
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions drivers/net/ethernet/broadcom/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -6388,6 +6388,7 @@ bnx2_reset_task(struct work_struct *work)
{
struct bnx2 *bp = container_of(work, struct bnx2, reset_task);
int rc;
u16 pcicmd;

rtnl_lock();
if (!netif_running(bp->dev)) {
Expand All @@ -6397,6 +6398,12 @@ bnx2_reset_task(struct work_struct *work)

bnx2_netif_stop(bp, true);

pci_read_config_word(bp->pdev, PCI_COMMAND, &pcicmd);
if (!(pcicmd & PCI_COMMAND_MEMORY)) {
/* in case PCI block has reset */
pci_restore_state(bp->pdev);
pci_save_state(bp->pdev);
}
rc = bnx2_init_nic(bp, 1);
if (rc) {
netdev_err(bp->dev, "failed to reset NIC, closing\n");
Expand Down

0 comments on commit efdfad3

Please sign in to comment.