Merge branch 'for-upstream' of git://openrisc.net/jonas/linux
[pandora-kernel.git] / drivers / net / bnx2.c
index 57d3293..4b2b570 100644 (file)
@@ -56,8 +56,8 @@
 #include "bnx2_fw.h"
 
 #define DRV_MODULE_NAME                "bnx2"
-#define DRV_MODULE_VERSION     "2.1.6"
-#define DRV_MODULE_RELDATE     "Mar 7, 2011"
+#define DRV_MODULE_VERSION     "2.1.11"
+#define DRV_MODULE_RELDATE     "July 20, 2011"
 #define FW_MIPS_FILE_06                "bnx2/bnx2-mips-06-6.2.1.fw"
 #define FW_RV2P_FILE_06                "bnx2/bnx2-rv2p-06-6.0.15.fw"
 #define FW_MIPS_FILE_09                "bnx2/bnx2-mips-09-6.2.1a.fw"
@@ -385,6 +385,9 @@ static int bnx2_register_cnic(struct net_device *dev, struct cnic_ops *ops,
        if (cp->drv_state & CNIC_DRV_STATE_REGD)
                return -EBUSY;
 
+       if (!bnx2_reg_rd_ind(bp, BNX2_FW_MAX_ISCSI_CONN))
+               return -ENODEV;
+
        bp->cnic_data = data;
        rcu_assign_pointer(bp->cnic_ops, ops);
 
@@ -416,6 +419,9 @@ struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev)
        struct bnx2 *bp = netdev_priv(dev);
        struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
 
+       if (!cp->max_iscsi_conn)
+               return NULL;
+
        cp->drv_owner = THIS_MODULE;
        cp->chip_id = bp->chip_id;
        cp->pdev = bp->pdev;
@@ -2440,6 +2446,48 @@ bnx2_set_phy_loopback(struct bnx2 *bp)
        return 0;
 }
 
+static void
+bnx2_dump_mcp_state(struct bnx2 *bp)
+{
+       struct net_device *dev = bp->dev;
+       u32 mcp_p0, mcp_p1;
+
+       netdev_err(dev, "<--- start MCP states dump --->\n");
+       if (CHIP_NUM(bp) == CHIP_NUM_5709) {
+               mcp_p0 = BNX2_MCP_STATE_P0;
+               mcp_p1 = BNX2_MCP_STATE_P1;
+       } else {
+               mcp_p0 = BNX2_MCP_STATE_P0_5708;
+               mcp_p1 = BNX2_MCP_STATE_P1_5708;
+       }
+       netdev_err(dev, "DEBUG: MCP_STATE_P0[%08x] MCP_STATE_P1[%08x]\n",
+                  bnx2_reg_rd_ind(bp, mcp_p0), bnx2_reg_rd_ind(bp, mcp_p1));
+       netdev_err(dev, "DEBUG: MCP mode[%08x] state[%08x] evt_mask[%08x]\n",
+                  bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_MODE),
+                  bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_STATE),
+                  bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_EVENT_MASK));
+       netdev_err(dev, "DEBUG: pc[%08x] pc[%08x] instr[%08x]\n",
+                  bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_PROGRAM_COUNTER),
+                  bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_PROGRAM_COUNTER),
+                  bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_INSTRUCTION));
+       netdev_err(dev, "DEBUG: shmem states:\n");
+       netdev_err(dev, "DEBUG: drv_mb[%08x] fw_mb[%08x] link_status[%08x]",
+                  bnx2_shmem_rd(bp, BNX2_DRV_MB),
+                  bnx2_shmem_rd(bp, BNX2_FW_MB),
+                  bnx2_shmem_rd(bp, BNX2_LINK_STATUS));
+       pr_cont(" drv_pulse_mb[%08x]\n", bnx2_shmem_rd(bp, BNX2_DRV_PULSE_MB));
+       netdev_err(dev, "DEBUG: dev_info_signature[%08x] reset_type[%08x]",
+                  bnx2_shmem_rd(bp, BNX2_DEV_INFO_SIGNATURE),
+                  bnx2_shmem_rd(bp, BNX2_BC_STATE_RESET_TYPE));
+       pr_cont(" condition[%08x]\n",
+               bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION));
+       DP_SHMEM_LINE(bp, 0x3cc);
+       DP_SHMEM_LINE(bp, 0x3dc);
+       DP_SHMEM_LINE(bp, 0x3ec);
+       netdev_err(dev, "DEBUG: 0x3fc[%08x]\n", bnx2_shmem_rd(bp, 0x3fc));
+       netdev_err(dev, "<--- end MCP states dump --->\n");
+}
+
 static int
 bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent)
 {
@@ -2468,13 +2516,14 @@ bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent)
 
        /* If we timed out, inform the firmware that this is the case. */
        if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
-               if (!silent)
-                       pr_err("fw sync timeout, reset code = %x\n", msg_data);
-
                msg_data &= ~BNX2_DRV_MSG_CODE;
                msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
 
                bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
+               if (!silent) {
+                       pr_err("fw sync timeout, reset code = %x\n", msg_data);
+                       bnx2_dump_mcp_state(bp);
+               }
 
                return -EBUSY;
        }
@@ -6293,6 +6342,7 @@ static void
 bnx2_reset_task(struct work_struct *work)
 {
        struct bnx2 *bp = container_of(work, struct bnx2, reset_task);
+       int rc;
 
        rtnl_lock();
        if (!netif_running(bp->dev)) {
@@ -6302,7 +6352,14 @@ bnx2_reset_task(struct work_struct *work)
 
        bnx2_netif_stop(bp, true);
 
-       bnx2_init_nic(bp, 1);
+       rc = bnx2_init_nic(bp, 1);
+       if (rc) {
+               netdev_err(bp->dev, "failed to reset NIC, closing\n");
+               bnx2_napi_enable(bp);
+               dev_close(bp->dev);
+               rtnl_unlock();
+               return;
+       }
 
        atomic_set(&bp->intr_sem, 1);
        bnx2_netif_start(bp, true);
@@ -6313,7 +6370,7 @@ static void
 bnx2_dump_state(struct bnx2 *bp)
 {
        struct net_device *dev = bp->dev;
-       u32 mcp_p0, mcp_p1, val1, val2;
+       u32 val1, val2;
 
        pci_read_config_dword(bp->pdev, PCI_COMMAND, &val1);
        netdev_err(dev, "DEBUG: intr_sem[%x] PCI_CMD[%08x]\n",
@@ -6326,15 +6383,6 @@ bnx2_dump_state(struct bnx2 *bp)
                   REG_RD(bp, BNX2_EMAC_RX_STATUS));
        netdev_err(dev, "DEBUG: RPM_MGMT_PKT_CTRL[%08x]\n",
                   REG_RD(bp, BNX2_RPM_MGMT_PKT_CTRL));
-       if (CHIP_NUM(bp) == CHIP_NUM_5709) {
-               mcp_p0 = BNX2_MCP_STATE_P0;
-               mcp_p1 = BNX2_MCP_STATE_P1;
-       } else {
-               mcp_p0 = BNX2_MCP_STATE_P0_5708;
-               mcp_p1 = BNX2_MCP_STATE_P1_5708;
-       }
-       netdev_err(dev, "DEBUG: MCP_STATE_P0[%08x] MCP_STATE_P1[%08x]\n",
-                  bnx2_reg_rd_ind(bp, mcp_p0), bnx2_reg_rd_ind(bp, mcp_p1));
        netdev_err(dev, "DEBUG: HC_STATS_INTERRUPT_STATUS[%08x]\n",
                   REG_RD(bp, BNX2_HC_STATS_INTERRUPT_STATUS));
        if (bp->flags & BNX2_FLAG_USING_MSIX)
@@ -6348,6 +6396,7 @@ bnx2_tx_timeout(struct net_device *dev)
        struct bnx2 *bp = netdev_priv(dev);
 
        bnx2_dump_state(bp);
+       bnx2_dump_mcp_state(bp);
 
        /* This allows the netif to be shutdown gracefully before resetting */
        schedule_work(&bp->reset_task);
@@ -6532,8 +6581,6 @@ bnx2_close(struct net_device *dev)
 {
        struct bnx2 *bp = netdev_priv(dev);
 
-       cancel_work_sync(&bp->reset_task);
-
        bnx2_disable_int_sync(bp);
        bnx2_napi_disable(bp);
        del_timer_sync(&bp->timer);
@@ -7908,9 +7955,8 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
        bp->chip_id = REG_RD(bp, BNX2_MISC_ID);
 
        if (CHIP_NUM(bp) == CHIP_NUM_5709) {
-               if (pci_find_capability(pdev, PCI_CAP_ID_EXP) == 0) {
-                       dev_err(&pdev->dev,
-                               "Cannot find PCIE capability, aborting\n");
+               if (!pci_is_pcie(pdev)) {
+                       dev_err(&pdev->dev, "Not PCIE, aborting\n");
                        rc = -EIO;
                        goto err_out_unmap;
                }
@@ -8051,7 +8097,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
                        bp->fw_version[j++] = ' ';
                for (i = 0; i < 3 && j < 28; i++) {
                        reg = bnx2_reg_rd_ind(bp, addr + i * 4);
-                       reg = swab32(reg);
+                       reg = be32_to_cpu(reg);
                        memcpy(&bp->fw_version[j], &reg, 4);
                        j += 4;
                }
@@ -8177,6 +8223,12 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
        bp->timer.data = (unsigned long) bp;
        bp->timer.function = bnx2_timer;
 
+#ifdef BCM_CNIC
+       if (bnx2_shmem_rd(bp, BNX2_ISCSI_INITIATOR) & BNX2_ISCSI_INITIATOR_EN)
+               bp->cnic_eth_dev.max_iscsi_conn =
+                       (bnx2_shmem_rd(bp, BNX2_ISCSI_MAX_CONN) &
+                        BNX2_ISCSI_MAX_CONN_MASK) >> BNX2_ISCSI_MAX_CONN_SHIFT;
+#endif
        pci_save_state(pdev);
 
        return 0;
@@ -8358,6 +8410,7 @@ bnx2_remove_one(struct pci_dev *pdev)
        unregister_netdev(dev);
 
        del_timer_sync(&bp->timer);
+       cancel_work_sync(&bp->reset_task);
 
        if (bp->mips_firmware)
                release_firmware(bp->mips_firmware);