1 From 27c915a4d843b90eb4065298969578d15e5e6ab0 Mon Sep 17 00:00:00 2001
2 From: Dhananjay Phadke <dhananjay@netxen.com>
3 Date: Wed, 14 Jan 2009 20:49:00 -0800
4 Subject: netxen: firmware init fix
5 Acked-by: Karsten Keil <kkeil@novell.com>
8 o Fix order or rom register writes.
9 o Reduce udelays when writing rom registers.
11 This cuts the firmware init time by 40%.
13 o Do not reset core/memory clocks when reinitializing driver.
14 Firmware willl handle this when initialized.
16 Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
17 Signed-off-by: David S. Miller <davem@davemloft.net>
19 drivers/net/netxen/netxen_nic_hw.c | 6 +---
20 drivers/net/netxen/netxen_nic_init.c | 35 +++++++++++++++----------
21 drivers/net/netxen/netxen_nic_main.c | 47 ++++++++++++++++++++-------------
22 3 files changed, 51 insertions(+), 37 deletions(-)
24 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_hw.c
25 ===================================================================
26 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_hw.c
27 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_hw.c
28 @@ -939,7 +939,7 @@ int netxen_load_firmware(struct netxen_a
32 - u32 flashaddr = NETXEN_BOOTLD_START, memaddr = NETXEN_BOOTLD_START;
33 + u32 flashaddr = NETXEN_BOOTLD_START;
35 size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4;
37 @@ -951,10 +951,8 @@ int netxen_load_firmware(struct netxen_a
38 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
41 - adapter->pci_mem_write(adapter, memaddr, &data, 4);
42 + adapter->pci_mem_write(adapter, flashaddr, &data, 4);
49 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_init.c
50 ===================================================================
51 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_init.c
52 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_init.c
53 @@ -439,6 +439,8 @@ static int netxen_wait_rom_done(struct n
60 done = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_GLB_STATUS);
62 @@ -533,12 +535,9 @@ static int do_rom_fast_write(struct netx
63 static int do_rom_fast_read(struct netxen_adapter *adapter,
68 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
69 - netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
70 - udelay(100); /* prevent bursting on CRB */
71 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
72 + netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
73 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb);
74 if (netxen_wait_rom_done(adapter)) {
75 printk("Error waiting for rom done\n");
76 @@ -546,7 +545,7 @@ static int do_rom_fast_read(struct netxe
78 /* reset abyte_cnt and dummy_byte_cnt */
79 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0);
80 - udelay(100); /* prevent bursting on CRB */
82 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
84 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
85 @@ -884,14 +883,16 @@ int netxen_flash_unlock(struct netxen_ad
86 int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
89 - int i, init_delay = 0;
90 + int i, n, init_delay = 0;
91 struct crb_addr_pair *buf;
98 netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET,
100 + netxen_rom_unlock(adapter);
103 if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0)
104 @@ -910,7 +911,7 @@ int netxen_pinit_from_rom(struct netxen_
106 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
107 if (netxen_rom_fast_read(adapter, 0, &n) != 0 ||
108 - (n != 0xcafecafeUL) ||
109 + (n != 0xcafecafe) ||
110 netxen_rom_fast_read(adapter, 4, &n) != 0) {
111 printk(KERN_ERR "%s: ERROR Reading crb_init area: "
112 "n: %08x\n", netxen_nic_driver_name, n);
113 @@ -975,6 +976,14 @@ int netxen_pinit_from_rom(struct netxen_
114 /* do not reset PCI */
115 if (off == (ROMUSB_GLB + 0xbc))
117 + if (off == (ROMUSB_GLB + 0xa8))
119 + if (off == (ROMUSB_GLB + 0xc8)) /* core clock */
121 + if (off == (ROMUSB_GLB + 0x24)) /* MN clock */
123 + if (off == (ROMUSB_GLB + 0x1c)) /* MS clock */
125 if (off == (NETXEN_CRB_PEG_NET_1 + 0x18))
126 buf[i].data = 0x1020;
127 /* skip the function enable register */
128 @@ -992,23 +1001,21 @@ int netxen_pinit_from_rom(struct netxen_
133 /* After writing this register, HW needs time for CRB */
134 /* to quiet down (else crb_window returns 0xffffffff) */
135 if (off == NETXEN_ROMUSB_GLB_SW_RESET) {
138 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
139 /* hold xdma in reset also */
140 buf[i].data = NETXEN_NIC_XDMA_RESET;
141 + buf[i].data = 0x8000ff;
145 adapter->hw_write_wx(adapter, off, &buf[i].data, 4);
147 - if (init_delay == 1) {
152 + msleep(init_delay);
156 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_main.c
157 ===================================================================
158 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_main.c
159 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_main.c
160 @@ -280,10 +280,15 @@ static void netxen_check_options(struct
162 netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
167 if (first_boot == 0x55555555) {
168 /* This is the first boot after power up */
169 + adapter->pci_write_normalize(adapter,
170 + NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
172 + if (!NX_IS_REVISION_P2(adapter->ahw.revision_id))
175 /* PCI bus master workaround */
176 adapter->hw_read_wx(adapter,
177 @@ -303,18 +308,26 @@ netxen_check_hw_init(struct netxen_adapt
178 /* clear the register for future unloads/loads */
179 adapter->pci_write_normalize(adapter,
180 NETXEN_CAM_RAM(0x1fc), 0);
185 - if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
186 - /* Start P2 boot loader */
187 - adapter->pci_write_normalize(adapter,
188 - NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
189 - adapter->pci_write_normalize(adapter,
190 - NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
192 + /* Start P2 boot loader */
193 + val = adapter->pci_read_normalize(adapter,
194 + NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
195 + adapter->pci_write_normalize(adapter,
196 + NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
200 + val = adapter->pci_read_normalize(adapter,
201 + NETXEN_CAM_RAM(0x1fc));
203 + if (++timeout > 5000)
206 + } while (val == NETXEN_BDINFO_MAGIC);
212 static void netxen_set_port_mode(struct netxen_adapter *adapter)
213 @@ -782,8 +795,8 @@ netxen_nic_probe(struct pci_dev *pdev, c
214 CRB_CMDPEG_STATE, 0);
215 netxen_pinit_from_rom(adapter, 0);
217 - netxen_load_firmware(adapter);
219 + netxen_load_firmware(adapter);
221 if (NX_IS_REVISION_P3(revision_id))
222 netxen_pcie_strap_init(adapter);
223 @@ -799,13 +812,6 @@ netxen_nic_probe(struct pci_dev *pdev, c
227 - if ((first_boot == 0x55555555) &&
228 - (NX_IS_REVISION_P2(revision_id))) {
229 - /* Unlock the HW, prompting the boot sequence */
230 - adapter->pci_write_normalize(adapter,
231 - NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
234 err = netxen_initialize_adapter_offload(adapter);
236 goto err_out_iounmap;
237 @@ -819,7 +825,9 @@ netxen_nic_probe(struct pci_dev *pdev, c
238 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
240 /* Handshake with the card before we register the devices. */
241 - netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
242 + err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
244 + goto err_out_free_offload;
248 @@ -923,6 +931,7 @@ err_out_disable_msi:
249 if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
250 pci_disable_msi(pdev);
252 +err_out_free_offload:
254 netxen_free_adapter_offload(adapter);