|
@@ -4640,13 +4640,28 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
|
|
|
|
|
|
/* Wait for the current PCI transaction to complete before
|
|
|
* issuing a reset. */
|
|
|
- REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
|
|
|
- BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
|
|
|
- BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
|
|
|
- BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
|
|
|
- BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
|
|
|
- val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
|
|
|
- udelay(5);
|
|
|
+ if ((CHIP_NUM(bp) == CHIP_NUM_5706) ||
|
|
|
+ (CHIP_NUM(bp) == CHIP_NUM_5708)) {
|
|
|
+ REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
|
|
|
+ BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
|
|
|
+ BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
|
|
|
+ BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
|
|
|
+ BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
|
|
|
+ val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
|
|
|
+ udelay(5);
|
|
|
+ } else { /* 5709 */
|
|
|
+ val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL);
|
|
|
+ val &= ~BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE;
|
|
|
+ REG_WR(bp, BNX2_MISC_NEW_CORE_CTL, val);
|
|
|
+ val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL);
|
|
|
+
|
|
|
+ for (i = 0; i < 100; i++) {
|
|
|
+ msleep(1);
|
|
|
+ val = REG_RD(bp, BNX2_PCICFG_DEVICE_CONTROL);
|
|
|
+ if (!(val & BNX2_PCICFG_DEVICE_STATUS_NO_PEND))
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/* Wait for the firmware to tell us it is ok to issue a reset. */
|
|
|
bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1);
|