aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_hw.c')
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index c012764d1145..aac15421bd1e 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -377,7 +377,7 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
377 recv_crb_registers[ctx]. 377 recv_crb_registers[ctx].
378 crb_rcvpeg_state)); 378 crb_rcvpeg_state));
379 while (state != PHAN_PEG_RCV_INITIALIZED && loops < 20) { 379 while (state != PHAN_PEG_RCV_INITIALIZED && loops < 20) {
380 udelay(100); 380 msleep(1);
381 /* Window 1 call */ 381 /* Window 1 call */
382 state = readl(NETXEN_CRB_NORMALIZE(adapter, 382 state = readl(NETXEN_CRB_NORMALIZE(adapter,
383 recv_crb_registers 383 recv_crb_registers
@@ -392,7 +392,11 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
392 return err; 392 return err;
393 } 393 }
394 } 394 }
395 DPRINTK(INFO, "Recieve Peg ready too. starting stuff\n"); 395 adapter->intr_scheme = readl(
396 NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW));
397 printk(KERN_NOTICE "%s: FW capabilities:0x%x\n", netxen_nic_driver_name,
398 adapter->intr_scheme);
399 DPRINTK(INFO, "Receive Peg ready too. starting stuff\n");
396 400
397 addr = netxen_alloc(adapter->ahw.pdev, 401 addr = netxen_alloc(adapter->ahw.pdev,
398 sizeof(struct netxen_ring_ctx) + 402 sizeof(struct netxen_ring_ctx) +
@@ -697,7 +701,7 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw)
697 adapter->curr_window = 0; 701 adapter->curr_window = 0;
698} 702}
699 703
700void netxen_load_firmware(struct netxen_adapter *adapter) 704int netxen_load_firmware(struct netxen_adapter *adapter)
701{ 705{
702 int i; 706 int i;
703 u32 data, size = 0; 707 u32 data, size = 0;
@@ -709,15 +713,24 @@ void netxen_load_firmware(struct netxen_adapter *adapter)
709 writel(1, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST)); 713 writel(1, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST));
710 714
711 for (i = 0; i < size; i++) { 715 for (i = 0; i < size; i++) {
712 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) { 716 int retries = 10;
713 DPRINTK(ERR, 717 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
714 "Error in netxen_rom_fast_read(). Will skip" 718 return -EIO;
715 "loading flash image\n"); 719
716 return;
717 }
718 off = netxen_nic_pci_set_window(adapter, memaddr); 720 off = netxen_nic_pci_set_window(adapter, memaddr);
719 addr = pci_base_offset(adapter, off); 721 addr = pci_base_offset(adapter, off);
720 writel(data, addr); 722 writel(data, addr);
723 do {
724 if (readl(addr) == data)
725 break;
726 msleep(100);
727 writel(data, addr);
728 } while (--retries);
729 if (!retries) {
730 printk(KERN_ERR "%s: firmware load aborted, write failed at 0x%x\n",
731 netxen_nic_driver_name, memaddr);
732 return -EIO;
733 }
721 flashaddr += 4; 734 flashaddr += 4;
722 memaddr += 4; 735 memaddr += 4;
723 } 736 }
@@ -727,7 +740,7 @@ void netxen_load_firmware(struct netxen_adapter *adapter)
727 NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CHIP_CLK_CTRL)); 740 NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CHIP_CLK_CTRL));
728 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST)); 741 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST));
729 742
730 udelay(100); 743 return 0;
731} 744}
732 745
733int 746int