]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.31/patches.drivers/netxen-firmware-init-fix.patch
Move xen patchset to new version's subdir.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / netxen-firmware-init-fix.patch
CommitLineData
00e5a55c
BS
1From 27c915a4d843b90eb4065298969578d15e5e6ab0 Mon Sep 17 00:00:00 2001
2From: Dhananjay Phadke <dhananjay@netxen.com>
3Date: Wed, 14 Jan 2009 20:49:00 -0800
4Subject: netxen: firmware init fix
5Acked-by: Karsten Keil <kkeil@novell.com>
6Reference: bnc#472416
7
8o Fix order or rom register writes.
9o Reduce udelays when writing rom registers.
10
11This cuts the firmware init time by 40%.
12
13o Do not reset core/memory clocks when reinitializing driver.
14 Firmware willl handle this when initialized.
15
16Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
17Signed-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
24Index: 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
49Index: 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
156Index: 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