]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.31/patches.drivers/netxen-firmware-init-fix.patch
Disable build of xen kernel.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / netxen-firmware-init-fix.patch
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