Commit 27c915a4 authored by Dhananjay Phadke's avatar Dhananjay Phadke Committed by David S. Miller

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: default avatarDhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c7860a2a
...@@ -939,7 +939,7 @@ int netxen_load_firmware(struct netxen_adapter *adapter) ...@@ -939,7 +939,7 @@ int netxen_load_firmware(struct netxen_adapter *adapter)
{ {
int i; int i;
u32 data, size = 0; u32 data, size = 0;
u32 flashaddr = NETXEN_BOOTLD_START, memaddr = NETXEN_BOOTLD_START; u32 flashaddr = NETXEN_BOOTLD_START;
size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4; size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4;
...@@ -951,10 +951,8 @@ int netxen_load_firmware(struct netxen_adapter *adapter) ...@@ -951,10 +951,8 @@ int netxen_load_firmware(struct netxen_adapter *adapter)
if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
return -EIO; return -EIO;
adapter->pci_mem_write(adapter, memaddr, &data, 4); adapter->pci_mem_write(adapter, flashaddr, &data, 4);
flashaddr += 4; flashaddr += 4;
memaddr += 4;
cond_resched();
} }
msleep(1); msleep(1);
......
...@@ -439,6 +439,8 @@ static int netxen_wait_rom_done(struct netxen_adapter *adapter) ...@@ -439,6 +439,8 @@ static int netxen_wait_rom_done(struct netxen_adapter *adapter)
long timeout = 0; long timeout = 0;
long done = 0; long done = 0;
cond_resched();
while (done == 0) { while (done == 0) {
done = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_GLB_STATUS); done = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_GLB_STATUS);
done &= 2; done &= 2;
...@@ -533,12 +535,9 @@ static int do_rom_fast_write(struct netxen_adapter *adapter, int addr, ...@@ -533,12 +535,9 @@ static int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
static int do_rom_fast_read(struct netxen_adapter *adapter, static int do_rom_fast_read(struct netxen_adapter *adapter,
int addr, int *valp) int addr, int *valp)
{ {
cond_resched();
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
udelay(100); /* prevent bursting on CRB */
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb);
if (netxen_wait_rom_done(adapter)) { if (netxen_wait_rom_done(adapter)) {
printk("Error waiting for rom done\n"); printk("Error waiting for rom done\n");
...@@ -546,7 +545,7 @@ static int do_rom_fast_read(struct netxen_adapter *adapter, ...@@ -546,7 +545,7 @@ static int do_rom_fast_read(struct netxen_adapter *adapter,
} }
/* reset abyte_cnt and dummy_byte_cnt */ /* reset abyte_cnt and dummy_byte_cnt */
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0);
udelay(100); /* prevent bursting on CRB */ udelay(10);
netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
*valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
...@@ -884,14 +883,16 @@ int netxen_flash_unlock(struct netxen_adapter *adapter) ...@@ -884,14 +883,16 @@ int netxen_flash_unlock(struct netxen_adapter *adapter)
int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
{ {
int addr, val; int addr, val;
int i, init_delay = 0; int i, n, init_delay = 0;
struct crb_addr_pair *buf; struct crb_addr_pair *buf;
unsigned offset, n; unsigned offset;
u32 off; u32 off;
/* resetall */ /* resetall */
rom_lock(adapter);
netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET,
0xffffffff); 0xffffffff);
netxen_rom_unlock(adapter);
if (verbose) { if (verbose) {
if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0) 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,7 +911,7 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
if (netxen_rom_fast_read(adapter, 0, &n) != 0 || if (netxen_rom_fast_read(adapter, 0, &n) != 0 ||
(n != 0xcafecafeUL) || (n != 0xcafecafe) ||
netxen_rom_fast_read(adapter, 4, &n) != 0) { netxen_rom_fast_read(adapter, 4, &n) != 0) {
printk(KERN_ERR "%s: ERROR Reading crb_init area: " printk(KERN_ERR "%s: ERROR Reading crb_init area: "
"n: %08x\n", netxen_nic_driver_name, n); "n: %08x\n", netxen_nic_driver_name, n);
...@@ -975,6 +976,14 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) ...@@ -975,6 +976,14 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
/* do not reset PCI */ /* do not reset PCI */
if (off == (ROMUSB_GLB + 0xbc)) if (off == (ROMUSB_GLB + 0xbc))
continue; continue;
if (off == (ROMUSB_GLB + 0xa8))
continue;
if (off == (ROMUSB_GLB + 0xc8)) /* core clock */
continue;
if (off == (ROMUSB_GLB + 0x24)) /* MN clock */
continue;
if (off == (ROMUSB_GLB + 0x1c)) /* MS clock */
continue;
if (off == (NETXEN_CRB_PEG_NET_1 + 0x18)) if (off == (NETXEN_CRB_PEG_NET_1 + 0x18))
buf[i].data = 0x1020; buf[i].data = 0x1020;
/* skip the function enable register */ /* skip the function enable register */
...@@ -992,23 +1001,21 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) ...@@ -992,23 +1001,21 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
continue; continue;
} }
init_delay = 1;
/* After writing this register, HW needs time for CRB */ /* After writing this register, HW needs time for CRB */
/* to quiet down (else crb_window returns 0xffffffff) */ /* to quiet down (else crb_window returns 0xffffffff) */
if (off == NETXEN_ROMUSB_GLB_SW_RESET) { if (off == NETXEN_ROMUSB_GLB_SW_RESET) {
init_delay = 1; init_delay = 1000;
if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
/* hold xdma in reset also */ /* hold xdma in reset also */
buf[i].data = NETXEN_NIC_XDMA_RESET; buf[i].data = NETXEN_NIC_XDMA_RESET;
buf[i].data = 0x8000ff;
} }
} }
adapter->hw_write_wx(adapter, off, &buf[i].data, 4); adapter->hw_write_wx(adapter, off, &buf[i].data, 4);
if (init_delay == 1) { msleep(init_delay);
msleep(1000);
init_delay = 0;
}
msleep(1);
} }
kfree(buf); kfree(buf);
......
...@@ -280,10 +280,15 @@ static void netxen_check_options(struct netxen_adapter *adapter) ...@@ -280,10 +280,15 @@ static void netxen_check_options(struct netxen_adapter *adapter)
static int static int
netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
{ {
int ret = 0; u32 val, timeout;
if (first_boot == 0x55555555) { if (first_boot == 0x55555555) {
/* This is the first boot after power up */ /* This is the first boot after power up */
adapter->pci_write_normalize(adapter,
NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
if (!NX_IS_REVISION_P2(adapter->ahw.revision_id))
return 0;
/* PCI bus master workaround */ /* PCI bus master workaround */
adapter->hw_read_wx(adapter, adapter->hw_read_wx(adapter,
...@@ -303,18 +308,26 @@ netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) ...@@ -303,18 +308,26 @@ netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
/* clear the register for future unloads/loads */ /* clear the register for future unloads/loads */
adapter->pci_write_normalize(adapter, adapter->pci_write_normalize(adapter,
NETXEN_CAM_RAM(0x1fc), 0); NETXEN_CAM_RAM(0x1fc), 0);
ret = -1; return -EIO;
} }
if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { /* Start P2 boot loader */
/* Start P2 boot loader */ val = adapter->pci_read_normalize(adapter,
adapter->pci_write_normalize(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); adapter->pci_write_normalize(adapter,
adapter->pci_write_normalize(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1); timeout = 0;
} do {
msleep(1);
val = adapter->pci_read_normalize(adapter,
NETXEN_CAM_RAM(0x1fc));
if (++timeout > 5000)
return -EIO;
} while (val == NETXEN_BDINFO_MAGIC);
} }
return ret; return 0;
} }
static void netxen_set_port_mode(struct netxen_adapter *adapter) static 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,8 +806,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
CRB_CMDPEG_STATE, 0); CRB_CMDPEG_STATE, 0);
netxen_pinit_from_rom(adapter, 0); netxen_pinit_from_rom(adapter, 0);
msleep(1); msleep(1);
netxen_load_firmware(adapter);
} }
netxen_load_firmware(adapter);
if (NX_IS_REVISION_P3(revision_id)) if (NX_IS_REVISION_P3(revision_id))
netxen_pcie_strap_init(adapter); netxen_pcie_strap_init(adapter);
...@@ -810,13 +823,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -810,13 +823,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
if ((first_boot == 0x55555555) &&
(NX_IS_REVISION_P2(revision_id))) {
/* Unlock the HW, prompting the boot sequence */
adapter->pci_write_normalize(adapter,
NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
}
err = netxen_initialize_adapter_offload(adapter); err = netxen_initialize_adapter_offload(adapter);
if (err) if (err)
goto err_out_iounmap; goto err_out_iounmap;
...@@ -830,7 +836,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -830,7 +836,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i); adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
/* Handshake with the card before we register the devices. */ /* Handshake with the card before we register the devices. */
netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
if (err)
goto err_out_free_offload;
} /* first_driver */ } /* first_driver */
...@@ -934,6 +942,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -934,6 +942,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (adapter->flags & NETXEN_NIC_MSI_ENABLED) if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
pci_disable_msi(pdev); pci_disable_msi(pdev);
err_out_free_offload:
if (first_driver) if (first_driver)
netxen_free_adapter_offload(adapter); netxen_free_adapter_offload(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment