diff options
| author | Sathya Perla <sathya.perla@emulex.com> | 2013-03-05 17:23:20 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-03-06 14:57:17 -0500 |
| commit | c5b3ad4c67989c778e4753be4f91dc7193a04d21 (patch) | |
| tree | b2dff2d67ba34df3ec8975cbec4ddc2edffa5f2d | |
| parent | f422d2a04fe2e661fd439c19197a162cc9a36416 (diff) | |
be2net: use CSR-BAR SEMAPHORE reg for BE2/BE3
The SLIPORT_SEMAPHORE register shadowed in the
config-space may not reflect the correct POST stage after
an EEH reset in BE2/3; it may return FW_READY state even though
FW is not ready. This causes the driver to prematurely
poll the FW mailbox and fail.
For BE2/3 use the CSR-BAR/0xac instead.
Reported-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 15 | ||||
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_hw.h | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 10 |
4 files changed, 22 insertions, 8 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 28ceb8414185..29aff55f2eea 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
| @@ -349,6 +349,7 @@ struct be_adapter { | |||
| 349 | struct pci_dev *pdev; | 349 | struct pci_dev *pdev; |
| 350 | struct net_device *netdev; | 350 | struct net_device *netdev; |
| 351 | 351 | ||
| 352 | u8 __iomem *csr; /* CSR BAR used only for BE2/3 */ | ||
| 352 | u8 __iomem *db; /* Door Bell */ | 353 | u8 __iomem *db; /* Door Bell */ |
| 353 | 354 | ||
| 354 | struct mutex mbox_lock; /* For serializing mbox cmds to BE card */ | 355 | struct mutex mbox_lock; /* For serializing mbox cmds to BE card */ |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 813407f66c7c..3c9b4f12e3e5 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
| @@ -473,14 +473,17 @@ static int be_mbox_notify_wait(struct be_adapter *adapter) | |||
| 473 | return 0; | 473 | return 0; |
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | static void be_POST_stage_get(struct be_adapter *adapter, u16 *stage) | 476 | static u16 be_POST_stage_get(struct be_adapter *adapter) |
| 477 | { | 477 | { |
| 478 | u32 sem; | 478 | u32 sem; |
| 479 | u32 reg = skyhawk_chip(adapter) ? SLIPORT_SEMAPHORE_OFFSET_SH : | ||
| 480 | SLIPORT_SEMAPHORE_OFFSET_BE; | ||
| 481 | 479 | ||
| 482 | pci_read_config_dword(adapter->pdev, reg, &sem); | 480 | if (BEx_chip(adapter)) |
| 483 | *stage = sem & POST_STAGE_MASK; | 481 | sem = ioread32(adapter->csr + SLIPORT_SEMAPHORE_OFFSET_BEx); |
| 482 | else | ||
| 483 | pci_read_config_dword(adapter->pdev, | ||
| 484 | SLIPORT_SEMAPHORE_OFFSET_SH, &sem); | ||
| 485 | |||
| 486 | return sem & POST_STAGE_MASK; | ||
| 484 | } | 487 | } |
| 485 | 488 | ||
| 486 | int lancer_wait_ready(struct be_adapter *adapter) | 489 | int lancer_wait_ready(struct be_adapter *adapter) |
| @@ -574,7 +577,7 @@ int be_fw_wait_ready(struct be_adapter *adapter) | |||
| 574 | } | 577 | } |
| 575 | 578 | ||
| 576 | do { | 579 | do { |
| 577 | be_POST_stage_get(adapter, &stage); | 580 | stage = be_POST_stage_get(adapter); |
| 578 | if (stage == POST_STAGE_ARMFW_RDY) | 581 | if (stage == POST_STAGE_ARMFW_RDY) |
| 579 | return 0; | 582 | return 0; |
| 580 | 583 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h index 541d4530d5bf..62dc220695f7 100644 --- a/drivers/net/ethernet/emulex/benet/be_hw.h +++ b/drivers/net/ethernet/emulex/benet/be_hw.h | |||
| @@ -32,8 +32,8 @@ | |||
| 32 | #define MPU_EP_CONTROL 0 | 32 | #define MPU_EP_CONTROL 0 |
| 33 | 33 | ||
| 34 | /********** MPU semphore: used for SH & BE *************/ | 34 | /********** MPU semphore: used for SH & BE *************/ |
| 35 | #define SLIPORT_SEMAPHORE_OFFSET_BE 0x7c | 35 | #define SLIPORT_SEMAPHORE_OFFSET_BEx 0xac /* CSR BAR offset */ |
| 36 | #define SLIPORT_SEMAPHORE_OFFSET_SH 0x94 | 36 | #define SLIPORT_SEMAPHORE_OFFSET_SH 0x94 /* PCI-CFG offset */ |
| 37 | #define POST_STAGE_MASK 0x0000FFFF | 37 | #define POST_STAGE_MASK 0x0000FFFF |
| 38 | #define POST_ERR_MASK 0x1 | 38 | #define POST_ERR_MASK 0x1 |
| 39 | #define POST_ERR_SHIFT 31 | 39 | #define POST_ERR_SHIFT 31 |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 3860888ac711..08e54f3d288b 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -3688,6 +3688,8 @@ static void be_netdev_init(struct net_device *netdev) | |||
| 3688 | 3688 | ||
| 3689 | static void be_unmap_pci_bars(struct be_adapter *adapter) | 3689 | static void be_unmap_pci_bars(struct be_adapter *adapter) |
| 3690 | { | 3690 | { |
| 3691 | if (adapter->csr) | ||
| 3692 | pci_iounmap(adapter->pdev, adapter->csr); | ||
| 3691 | if (adapter->db) | 3693 | if (adapter->db) |
| 3692 | pci_iounmap(adapter->pdev, adapter->db); | 3694 | pci_iounmap(adapter->pdev, adapter->db); |
| 3693 | } | 3695 | } |
| @@ -3721,6 +3723,12 @@ static int be_map_pci_bars(struct be_adapter *adapter) | |||
| 3721 | adapter->if_type = (sli_intf & SLI_INTF_IF_TYPE_MASK) >> | 3723 | adapter->if_type = (sli_intf & SLI_INTF_IF_TYPE_MASK) >> |
| 3722 | SLI_INTF_IF_TYPE_SHIFT; | 3724 | SLI_INTF_IF_TYPE_SHIFT; |
| 3723 | 3725 | ||
| 3726 | if (BEx_chip(adapter) && be_physfn(adapter)) { | ||
| 3727 | adapter->csr = pci_iomap(adapter->pdev, 2, 0); | ||
| 3728 | if (adapter->csr == NULL) | ||
| 3729 | return -ENOMEM; | ||
| 3730 | } | ||
| 3731 | |||
| 3724 | addr = pci_iomap(adapter->pdev, db_bar(adapter), 0); | 3732 | addr = pci_iomap(adapter->pdev, db_bar(adapter), 0); |
| 3725 | if (addr == NULL) | 3733 | if (addr == NULL) |
| 3726 | goto pci_map_err; | 3734 | goto pci_map_err; |
| @@ -4329,6 +4337,8 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev) | |||
| 4329 | pci_restore_state(pdev); | 4337 | pci_restore_state(pdev); |
| 4330 | 4338 | ||
| 4331 | /* Check if card is ok and fw is ready */ | 4339 | /* Check if card is ok and fw is ready */ |
| 4340 | dev_info(&adapter->pdev->dev, | ||
| 4341 | "Waiting for FW to be ready after EEH reset\n"); | ||
| 4332 | status = be_fw_wait_ready(adapter); | 4342 | status = be_fw_wait_ready(adapter); |
| 4333 | if (status) | 4343 | if (status) |
| 4334 | return PCI_ERS_RESULT_DISCONNECT; | 4344 | return PCI_ERS_RESULT_DISCONNECT; |
