瀏覽代碼

RDMA/nes: Fix adapter reset after PXE boot

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>
Chien Tung 17 年之前
父節點
當前提交
bc5698f3ec
共有 2 個文件被更改,包括 13 次插入13 次删除
  1. 4 2
      drivers/infiniband/hw/nes/nes_cm.c
  2. 9 11
      drivers/infiniband/hw/nes/nes_hw.c

+ 4 - 2
drivers/infiniband/hw/nes/nes_cm.c

@@ -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_addr = ntohl(iph->saddr);
 	nfo.rem_port = ntohs(tcph->source);
 	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 */
 	/* note: this call is going to increment cm_node ref count */
 	cm_node = find_node(cm_core,
 	cm_node = find_node(cm_core,

+ 9 - 11
drivers/infiniband/hw/nes/nes_hw.c

@@ -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");
 			nes_debug(NES_DBG_INIT, "Did not see full soft reset done.\n");
 			return 0;
 			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 */
 	/* 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;
 	return port_count;
 }
 }