]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
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> | |
6 | Reference: bnc#472416 | |
7 | ||
8 | o Fix order or rom register writes. | |
9 | o Reduce udelays when writing rom registers. | |
10 | ||
11 | This cuts the firmware init time by 40%. | |
12 | ||
13 | o Do not reset core/memory clocks when reinitializing driver. | |
14 | Firmware willl handle this when initialized. | |
15 | ||
16 | Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> | |
17 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
18 | --- | |
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(-) | |
23 | ||
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 | |
29 | { | |
30 | int i; | |
31 | u32 data, size = 0; | |
32 | - u32 flashaddr = NETXEN_BOOTLD_START, memaddr = NETXEN_BOOTLD_START; | |
33 | + u32 flashaddr = NETXEN_BOOTLD_START; | |
34 | ||
35 | size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4; | |
36 | ||
37 | @@ -951,10 +951,8 @@ int netxen_load_firmware(struct netxen_a | |
38 | if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) | |
39 | return -EIO; | |
40 | ||
41 | - adapter->pci_mem_write(adapter, memaddr, &data, 4); | |
42 | + adapter->pci_mem_write(adapter, flashaddr, &data, 4); | |
43 | flashaddr += 4; | |
44 | - memaddr += 4; | |
45 | - cond_resched(); | |
46 | } | |
47 | msleep(1); | |
48 | ||
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 | |
54 | long timeout = 0; | |
55 | long done = 0; | |
56 | ||
57 | + cond_resched(); | |
58 | + | |
59 | while (done == 0) { | |
60 | done = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_GLB_STATUS); | |
61 | done &= 2; | |
62 | @@ -533,12 +535,9 @@ static int do_rom_fast_write(struct netx | |
63 | static int do_rom_fast_read(struct netxen_adapter *adapter, | |
64 | int addr, int *valp) | |
65 | { | |
66 | - cond_resched(); | |
67 | - | |
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 | |
77 | } | |
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 */ | |
81 | + udelay(10); | |
82 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | |
83 | ||
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) | |
87 | { | |
88 | int addr, val; | |
89 | - int i, init_delay = 0; | |
90 | + int i, n, init_delay = 0; | |
91 | struct crb_addr_pair *buf; | |
92 | - unsigned offset, n; | |
93 | + unsigned offset; | |
94 | u32 off; | |
95 | ||
96 | /* resetall */ | |
97 | + rom_lock(adapter); | |
98 | netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, | |
99 | 0xffffffff); | |
100 | + netxen_rom_unlock(adapter); | |
101 | ||
102 | if (verbose) { | |
103 | if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0) | |
104 | @@ -910,7 +911,7 @@ int netxen_pinit_from_rom(struct netxen_ | |
105 | ||
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)) | |
116 | continue; | |
117 | + if (off == (ROMUSB_GLB + 0xa8)) | |
118 | + continue; | |
119 | + if (off == (ROMUSB_GLB + 0xc8)) /* core clock */ | |
120 | + continue; | |
121 | + if (off == (ROMUSB_GLB + 0x24)) /* MN clock */ | |
122 | + continue; | |
123 | + if (off == (ROMUSB_GLB + 0x1c)) /* MS clock */ | |
124 | + continue; | |
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_ | |
129 | continue; | |
130 | } | |
131 | ||
132 | + init_delay = 1; | |
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) { | |
136 | - init_delay = 1; | |
137 | + init_delay = 1000; | |
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; | |
142 | } | |
143 | } | |
144 | ||
145 | adapter->hw_write_wx(adapter, off, &buf[i].data, 4); | |
146 | ||
147 | - if (init_delay == 1) { | |
148 | - msleep(1000); | |
149 | - init_delay = 0; | |
150 | - } | |
151 | - msleep(1); | |
152 | + msleep(init_delay); | |
153 | } | |
154 | kfree(buf); | |
155 | ||
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 | |
161 | static int | |
162 | netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) | |
163 | { | |
164 | - int ret = 0; | |
165 | + u32 val, timeout; | |
166 | ||
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); | |
171 | + | |
172 | + if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) | |
173 | + return 0; | |
174 | ||
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); | |
181 | - ret = -1; | |
182 | + return -EIO; | |
183 | } | |
184 | ||
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); | |
191 | - } | |
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); | |
197 | + timeout = 0; | |
198 | + do { | |
199 | + msleep(1); | |
200 | + val = adapter->pci_read_normalize(adapter, | |
201 | + NETXEN_CAM_RAM(0x1fc)); | |
202 | + | |
203 | + if (++timeout > 5000) | |
204 | + return -EIO; | |
205 | + | |
206 | + } while (val == NETXEN_BDINFO_MAGIC); | |
207 | } | |
208 | - return ret; | |
209 | + return 0; | |
210 | } | |
211 | ||
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); | |
216 | msleep(1); | |
217 | - netxen_load_firmware(adapter); | |
218 | } | |
219 | + netxen_load_firmware(adapter); | |
220 | ||
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 | |
224 | ||
225 | } | |
226 | ||
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); | |
232 | - } | |
233 | - | |
234 | err = netxen_initialize_adapter_offload(adapter); | |
235 | if (err) | |
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); | |
239 | ||
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); | |
243 | + if (err) | |
244 | + goto err_out_free_offload; | |
245 | ||
246 | } /* first_driver */ | |
247 | ||
248 | @@ -923,6 +931,7 @@ err_out_disable_msi: | |
249 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) | |
250 | pci_disable_msi(pdev); | |
251 | ||
252 | +err_out_free_offload: | |
253 | if (first_driver) | |
254 | netxen_free_adapter_offload(adapter); | |
255 |