aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-01-14 23:49:00 -0500
committerDavid S. Miller <davem@davemloft.net>2009-01-14 23:49:00 -0500
commit27c915a4d843b90eb4065298969578d15e5e6ab0 (patch)
treedf1e34fb723aedfd851c24946437951528548938 /drivers/net/netxen
parentc7860a2aec571ea95d3ad19b8d9775b27828baac (diff)
netxen: firmware init fix
o Fix order or rom register writes. o Reduce udelays when writing rom registers. This cuts the firmware init time by 40%. o Do not reset core/memory clocks when reinitializing driver. Firmware willl handle this when initialized. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c6
-rw-r--r--drivers/net/netxen/netxen_nic_init.c35
-rw-r--r--drivers/net/netxen/netxen_nic_main.c47
3 files changed, 51 insertions, 37 deletions
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index 4276f7f82238..511db2ac57c9 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -939,7 +939,7 @@ int netxen_load_firmware(struct netxen_adapter *adapter)
939{ 939{
940 int i; 940 int i;
941 u32 data, size = 0; 941 u32 data, size = 0;
942 u32 flashaddr = NETXEN_BOOTLD_START, memaddr = NETXEN_BOOTLD_START; 942 u32 flashaddr = NETXEN_BOOTLD_START;
943 943
944 size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4; 944 size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4;
945 945
@@ -951,10 +951,8 @@ int netxen_load_firmware(struct netxen_adapter *adapter)
951 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) 951 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
952 return -EIO; 952 return -EIO;
953 953
954 adapter->pci_mem_write(adapter, memaddr, &data, 4); 954 adapter->pci_mem_write(adapter, flashaddr, &data, 4);
955 flashaddr += 4; 955 flashaddr += 4;
956 memaddr += 4;
957 cond_resched();
958 } 956 }
959 msleep(1); 957 msleep(1);
960 958
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index c0e06a653170..a3203644b482 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -439,6 +439,8 @@ static int netxen_wait_rom_done(struct netxen_adapter *adapter)
439 long timeout = 0; 439 long timeout = 0;
440 long done = 0; 440 long done = 0;
441 441
442 cond_resched();
443
442 while (done == 0) { 444 while (done == 0) {
443 done = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_GLB_STATUS); 445 done = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_GLB_STATUS);
444 done &= 2; 446 done &= 2;
@@ -533,12 +535,9 @@ static int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
533static int do_rom_fast_read(struct netxen_adapter *adapter, 535static int do_rom_fast_read(struct netxen_adapter *adapter,
534 int addr, int *valp) 536 int addr, int *valp)
535{ 537{
536 cond_resched();
537
538 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); 538 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
539 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
540 udelay(100); /* prevent bursting on CRB */
541 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 539 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
540 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
542 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); 541 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb);
543 if (netxen_wait_rom_done(adapter)) { 542 if (netxen_wait_rom_done(adapter)) {
544 printk("Error waiting for rom done\n"); 543 printk("Error waiting for rom done\n");
@@ -546,7 +545,7 @@ static int do_rom_fast_read(struct netxen_adapter *adapter,
546 } 545 }
547 /* reset abyte_cnt and dummy_byte_cnt */ 546 /* reset abyte_cnt and dummy_byte_cnt */
548 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); 547 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0);
549 udelay(100); /* prevent bursting on CRB */ 548 udelay(10);
550 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 549 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
551 550
552 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); 551 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
@@ -884,14 +883,16 @@ int netxen_flash_unlock(struct netxen_adapter *adapter)
884int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) 883int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
885{ 884{
886 int addr, val; 885 int addr, val;
887 int i, init_delay = 0; 886 int i, n, init_delay = 0;
888 struct crb_addr_pair *buf; 887 struct crb_addr_pair *buf;
889 unsigned offset, n; 888 unsigned offset;
890 u32 off; 889 u32 off;
891 890
892 /* resetall */ 891 /* resetall */
892 rom_lock(adapter);
893 netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 893 netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET,
894 0xffffffff); 894 0xffffffff);
895 netxen_rom_unlock(adapter);
895 896
896 if (verbose) { 897 if (verbose) {
897 if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0) 898 if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0)
@@ -910,7 +911,7 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
910 911
911 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { 912 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
912 if (netxen_rom_fast_read(adapter, 0, &n) != 0 || 913 if (netxen_rom_fast_read(adapter, 0, &n) != 0 ||
913 (n != 0xcafecafeUL) || 914 (n != 0xcafecafe) ||
914 netxen_rom_fast_read(adapter, 4, &n) != 0) { 915 netxen_rom_fast_read(adapter, 4, &n) != 0) {
915 printk(KERN_ERR "%s: ERROR Reading crb_init area: " 916 printk(KERN_ERR "%s: ERROR Reading crb_init area: "
916 "n: %08x\n", netxen_nic_driver_name, n); 917 "n: %08x\n", netxen_nic_driver_name, n);
@@ -975,6 +976,14 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
975 /* do not reset PCI */ 976 /* do not reset PCI */
976 if (off == (ROMUSB_GLB + 0xbc)) 977 if (off == (ROMUSB_GLB + 0xbc))
977 continue; 978 continue;
979 if (off == (ROMUSB_GLB + 0xa8))
980 continue;
981 if (off == (ROMUSB_GLB + 0xc8)) /* core clock */
982 continue;
983 if (off == (ROMUSB_GLB + 0x24)) /* MN clock */
984 continue;
985 if (off == (ROMUSB_GLB + 0x1c)) /* MS clock */
986 continue;
978 if (off == (NETXEN_CRB_PEG_NET_1 + 0x18)) 987 if (off == (NETXEN_CRB_PEG_NET_1 + 0x18))
979 buf[i].data = 0x1020; 988 buf[i].data = 0x1020;
980 /* skip the function enable register */ 989 /* skip the function enable register */
@@ -992,23 +1001,21 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
992 continue; 1001 continue;
993 } 1002 }
994 1003
1004 init_delay = 1;
995 /* After writing this register, HW needs time for CRB */ 1005 /* After writing this register, HW needs time for CRB */
996 /* to quiet down (else crb_window returns 0xffffffff) */ 1006 /* to quiet down (else crb_window returns 0xffffffff) */
997 if (off == NETXEN_ROMUSB_GLB_SW_RESET) { 1007 if (off == NETXEN_ROMUSB_GLB_SW_RESET) {
998 init_delay = 1; 1008 init_delay = 1000;
999 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { 1009 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1000 /* hold xdma in reset also */ 1010 /* hold xdma in reset also */
1001 buf[i].data = NETXEN_NIC_XDMA_RESET; 1011 buf[i].data = NETXEN_NIC_XDMA_RESET;
1012 buf[i].data = 0x8000ff;
1002 } 1013 }
1003 } 1014 }
1004 1015
1005 adapter->hw_write_wx(adapter, off, &buf[i].data, 4); 1016 adapter->hw_write_wx(adapter, off, &buf[i].data, 4);
1006 1017
1007 if (init_delay == 1) { 1018 msleep(init_delay);
1008 msleep(1000);
1009 init_delay = 0;
1010 }
1011 msleep(1);
1012 } 1019 }
1013 kfree(buf); 1020 kfree(buf);
1014 1021
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 2c6ce6ffde09..cbe2b3e814dd 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -280,10 +280,15 @@ static void netxen_check_options(struct netxen_adapter *adapter)
280static int 280static int
281netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) 281netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
282{ 282{
283 int ret = 0; 283 u32 val, timeout;
284 284
285 if (first_boot == 0x55555555) { 285 if (first_boot == 0x55555555) {
286 /* This is the first boot after power up */ 286 /* This is the first boot after power up */
287 adapter->pci_write_normalize(adapter,
288 NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
289
290 if (!NX_IS_REVISION_P2(adapter->ahw.revision_id))
291 return 0;
287 292
288 /* PCI bus master workaround */ 293 /* PCI bus master workaround */
289 adapter->hw_read_wx(adapter, 294 adapter->hw_read_wx(adapter,
@@ -303,18 +308,26 @@ netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
303 /* clear the register for future unloads/loads */ 308 /* clear the register for future unloads/loads */
304 adapter->pci_write_normalize(adapter, 309 adapter->pci_write_normalize(adapter,
305 NETXEN_CAM_RAM(0x1fc), 0); 310 NETXEN_CAM_RAM(0x1fc), 0);
306 ret = -1; 311 return -EIO;
307 } 312 }
308 313
309 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { 314 /* Start P2 boot loader */
310 /* Start P2 boot loader */ 315 val = adapter->pci_read_normalize(adapter,
311 adapter->pci_write_normalize(adapter, 316 NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
312 NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); 317 adapter->pci_write_normalize(adapter,
313 adapter->pci_write_normalize(adapter, 318 NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
314 NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1); 319 timeout = 0;
315 } 320 do {
321 msleep(1);
322 val = adapter->pci_read_normalize(adapter,
323 NETXEN_CAM_RAM(0x1fc));
324
325 if (++timeout > 5000)
326 return -EIO;
327
328 } while (val == NETXEN_BDINFO_MAGIC);
316 } 329 }
317 return ret; 330 return 0;
318} 331}
319 332
320static void netxen_set_port_mode(struct netxen_adapter *adapter) 333static void netxen_set_port_mode(struct netxen_adapter *adapter)
@@ -793,8 +806,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
793 CRB_CMDPEG_STATE, 0); 806 CRB_CMDPEG_STATE, 0);
794 netxen_pinit_from_rom(adapter, 0); 807 netxen_pinit_from_rom(adapter, 0);
795 msleep(1); 808 msleep(1);
796 netxen_load_firmware(adapter);
797 } 809 }
810 netxen_load_firmware(adapter);
798 811
799 if (NX_IS_REVISION_P3(revision_id)) 812 if (NX_IS_REVISION_P3(revision_id))
800 netxen_pcie_strap_init(adapter); 813 netxen_pcie_strap_init(adapter);
@@ -810,13 +823,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
810 823
811 } 824 }
812 825
813 if ((first_boot == 0x55555555) &&
814 (NX_IS_REVISION_P2(revision_id))) {
815 /* Unlock the HW, prompting the boot sequence */
816 adapter->pci_write_normalize(adapter,
817 NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
818 }
819
820 err = netxen_initialize_adapter_offload(adapter); 826 err = netxen_initialize_adapter_offload(adapter);
821 if (err) 827 if (err)
822 goto err_out_iounmap; 828 goto err_out_iounmap;
@@ -830,7 +836,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
830 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i); 836 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
831 837
832 /* Handshake with the card before we register the devices. */ 838 /* Handshake with the card before we register the devices. */
833 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); 839 err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
840 if (err)
841 goto err_out_free_offload;
834 842
835 } /* first_driver */ 843 } /* first_driver */
836 844
@@ -934,6 +942,7 @@ err_out_disable_msi:
934 if (adapter->flags & NETXEN_NIC_MSI_ENABLED) 942 if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
935 pci_disable_msi(pdev); 943 pci_disable_msi(pdev);
936 944
945err_out_free_offload:
937 if (first_driver) 946 if (first_driver)
938 netxen_free_adapter_offload(adapter); 947 netxen_free_adapter_offload(adapter);
939 948