]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
RDMA/nes: Fix adapter reset after PXE boot
authorChien Tung <ctung@neteffect.com>
Wed, 23 Apr 2008 18:55:45 +0000 (11:55 -0700)
committerRoland Dreier <rolandd@cisco.com>
Wed, 23 Apr 2008 18:55:45 +0000 (11:55 -0700)
After PXE boot, the iw_nes driver does a full reset to ensure the card
is in a clean state.  However, it doesn't wait for firmware to
complete its work before issuing a port reset to enable the ports,
which leads to problems bringing up the ports.

The solution is to wait for firmware to complete its work before
proceeding with port reset.

This bug was flagged by Roland Dreier <rolandd@cisco.com>.

Cc: <stable@kernel.org>
Signed-off-by: Chien Tung <ctung@neteffect.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/nes/nes_cm.c
drivers/infiniband/hw/nes/nes_hw.c

index 38ea14cc70776bf2ee3fa8312a4d2064c6dbfb7c..d940fc27129afdc37e3457115eb58fb8a5ab25ef 100644 (file)
@@ -1849,8 +1849,10 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, struct nes_vnic *nesvni
        nfo.rem_addr = ntohl(iph->saddr);
        nfo.rem_port = ntohs(tcph->source);
 
-       nes_debug(NES_DBG_CM, "Received packet: dest=0x%08X:0x%04X src=0x%08X:0x%04X\n",
-                       iph->daddr, tcph->dest, iph->saddr, tcph->source);
+       nes_debug(NES_DBG_CM, "Received packet: dest=" NIPQUAD_FMT
+                 ":0x%04X src=" NIPQUAD_FMT ":0x%04X\n",
+                 NIPQUAD(iph->daddr), tcph->dest,
+                 NIPQUAD(iph->saddr), tcph->source);
 
        /* note: this call is going to increment cm_node ref count */
        cm_node = find_node(cm_core,
index aa53aab91bf8a3341dd3df72d155c4b2201db2c1..08964cc7e98aead2bc4813c8505d1abdbafc2bc2 100644 (file)
@@ -636,6 +636,15 @@ static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_
                        nes_debug(NES_DBG_INIT, "Did not see full soft reset done.\n");
                        return 0;
                }
+
+               i = 0;
+               while ((nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS) != 0x80) && i++ < 10000)
+                       mdelay(1);
+               if (i >= 10000) {
+                       printk(KERN_ERR PFX "Internal CPU not ready, status = %02X\n",
+                              nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS));
+                       return 0;
+               }
        }
 
        /* port reset */
@@ -684,17 +693,6 @@ static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_
                }
        }
 
-
-
-       i = 0;
-       while ((nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS) != 0x80) && i++ < 10000)
-               mdelay(1);
-       if (i >= 10000) {
-               printk(KERN_ERR PFX "Internal CPU not ready, status = %02X\n",
-                               nes_read_indexed(nesdev, NES_IDX_INT_CPU_STATUS));
-               return 0;
-       }
-
        return port_count;
 }