Annotation of /trunk/kernel26-alx/patches-2.6.23-r1/0104-2.6.23.5-all-fixes.patch
Parent Directory | Revision Log
Revision 658 -
(hide annotations)
(download)
Mon Jun 23 21:39:39 2008 UTC (16 years, 3 months ago) by niro
File size: 32519 byte(s)
Mon Jun 23 21:39:39 2008 UTC (16 years, 3 months ago) by niro
File size: 32519 byte(s)
2.6.23-alx-r1: new default as we fix the via epia clocksource=tsc quircks -linux-2.6.23.17 -fbcondecor-0.9.4 -squashfs-3.3 -unionfs-2.3.3 -ipw3945-1.2.2 -mptbase-vmware fix
1 | niro | 658 | diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c |
2 | index c82e245..329a252 100644 | ||
3 | --- a/drivers/net/ehea/ehea_qmr.c | ||
4 | +++ b/drivers/net/ehea/ehea_qmr.c | ||
5 | @@ -563,8 +563,7 @@ int ehea_destroy_qp(struct ehea_qp *qp) | ||
6 | int ehea_create_busmap( void ) | ||
7 | { | ||
8 | u64 vaddr = EHEA_BUSMAP_START; | ||
9 | - unsigned long abs_max_pfn = 0; | ||
10 | - unsigned long sec_max_pfn; | ||
11 | + unsigned long high_section_index = 0; | ||
12 | int i; | ||
13 | |||
14 | /* | ||
15 | @@ -574,14 +573,10 @@ int ehea_create_busmap( void ) | ||
16 | ehea_bmap.valid_sections = 0; | ||
17 | |||
18 | for (i = 0; i < NR_MEM_SECTIONS; i++) | ||
19 | - if (valid_section_nr(i)) { | ||
20 | - sec_max_pfn = section_nr_to_pfn(i); | ||
21 | - if (sec_max_pfn > abs_max_pfn) | ||
22 | - abs_max_pfn = sec_max_pfn; | ||
23 | - ehea_bmap.valid_sections++; | ||
24 | - } | ||
25 | + if (valid_section_nr(i)) | ||
26 | + high_section_index = i; | ||
27 | |||
28 | - ehea_bmap.entries = abs_max_pfn / EHEA_PAGES_PER_SECTION + 1; | ||
29 | + ehea_bmap.entries = high_section_index + 1; | ||
30 | ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr)); | ||
31 | |||
32 | if (!ehea_bmap.vaddr) | ||
33 | @@ -593,6 +588,7 @@ int ehea_create_busmap( void ) | ||
34 | if (pfn_valid(pfn)) { | ||
35 | ehea_bmap.vaddr[i] = vaddr; | ||
36 | vaddr += EHEA_SECTSIZE; | ||
37 | + ehea_bmap.valid_sections++; | ||
38 | } else | ||
39 | ehea_bmap.vaddr[i] = 0; | ||
40 | } | ||
41 | @@ -637,7 +633,7 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr) | ||
42 | |||
43 | mr_len = ehea_bmap.valid_sections * EHEA_SECTSIZE; | ||
44 | |||
45 | - pt = kzalloc(EHEA_MAX_RPAGE * sizeof(u64), GFP_KERNEL); | ||
46 | + pt = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
47 | if (!pt) { | ||
48 | ehea_error("no mem"); | ||
49 | ret = -ENOMEM; | ||
50 | @@ -660,8 +656,8 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr) | ||
51 | void *sectbase = __va(i << SECTION_SIZE_BITS); | ||
52 | unsigned long k = 0; | ||
53 | |||
54 | - for (j = 0; j < (PAGES_PER_SECTION / EHEA_MAX_RPAGE); | ||
55 | - j++) { | ||
56 | + for (j = 0; j < (EHEA_PAGES_PER_SECTION / | ||
57 | + EHEA_MAX_RPAGE); j++) { | ||
58 | |||
59 | for (m = 0; m < EHEA_MAX_RPAGE; m++) { | ||
60 | pg = sectbase + ((k++) * EHEA_PAGESIZE); | ||
61 | diff --git a/drivers/net/ehea/ehea_qmr.h b/drivers/net/ehea/ehea_qmr.h | ||
62 | index b71f845..352cb38 100644 | ||
63 | --- a/drivers/net/ehea/ehea_qmr.h | ||
64 | +++ b/drivers/net/ehea/ehea_qmr.h | ||
65 | @@ -39,7 +39,7 @@ | ||
66 | #define EHEA_PAGESHIFT 12 | ||
67 | #define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT) | ||
68 | #define EHEA_SECTSIZE (1UL << 24) | ||
69 | -#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> PAGE_SHIFT) | ||
70 | +#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT) | ||
71 | |||
72 | #if (1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE | ||
73 | #error eHEA module can't work if kernel sectionsize < ehea sectionsize | ||
74 | diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c | ||
75 | index 1938d6d..d68796e 100644 | ||
76 | --- a/drivers/net/forcedeth.c | ||
77 | +++ b/drivers/net/forcedeth.c | ||
78 | @@ -988,7 +988,7 @@ static void nv_enable_irq(struct net_device *dev) | ||
79 | if (np->msi_flags & NV_MSI_X_ENABLED) | ||
80 | enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | ||
81 | else | ||
82 | - enable_irq(dev->irq); | ||
83 | + enable_irq(np->pci_dev->irq); | ||
84 | } else { | ||
85 | enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); | ||
86 | enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); | ||
87 | @@ -1004,7 +1004,7 @@ static void nv_disable_irq(struct net_device *dev) | ||
88 | if (np->msi_flags & NV_MSI_X_ENABLED) | ||
89 | disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | ||
90 | else | ||
91 | - disable_irq(dev->irq); | ||
92 | + disable_irq(np->pci_dev->irq); | ||
93 | } else { | ||
94 | disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); | ||
95 | disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); | ||
96 | @@ -1601,7 +1601,7 @@ static void nv_do_rx_refill(unsigned long data) | ||
97 | if (np->msi_flags & NV_MSI_X_ENABLED) | ||
98 | disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | ||
99 | else | ||
100 | - disable_irq(dev->irq); | ||
101 | + disable_irq(np->pci_dev->irq); | ||
102 | } else { | ||
103 | disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); | ||
104 | } | ||
105 | @@ -1619,7 +1619,7 @@ static void nv_do_rx_refill(unsigned long data) | ||
106 | if (np->msi_flags & NV_MSI_X_ENABLED) | ||
107 | enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | ||
108 | else | ||
109 | - enable_irq(dev->irq); | ||
110 | + enable_irq(np->pci_dev->irq); | ||
111 | } else { | ||
112 | enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); | ||
113 | } | ||
114 | @@ -3557,10 +3557,12 @@ static int nv_request_irq(struct net_device *dev, int intr_test) | ||
115 | if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) { | ||
116 | if ((ret = pci_enable_msi(np->pci_dev)) == 0) { | ||
117 | np->msi_flags |= NV_MSI_ENABLED; | ||
118 | + dev->irq = np->pci_dev->irq; | ||
119 | if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) { | ||
120 | printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret); | ||
121 | pci_disable_msi(np->pci_dev); | ||
122 | np->msi_flags &= ~NV_MSI_ENABLED; | ||
123 | + dev->irq = np->pci_dev->irq; | ||
124 | goto out_err; | ||
125 | } | ||
126 | |||
127 | @@ -3623,7 +3625,7 @@ static void nv_do_nic_poll(unsigned long data) | ||
128 | if (np->msi_flags & NV_MSI_X_ENABLED) | ||
129 | disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | ||
130 | else | ||
131 | - disable_irq_lockdep(dev->irq); | ||
132 | + disable_irq_lockdep(np->pci_dev->irq); | ||
133 | mask = np->irqmask; | ||
134 | } else { | ||
135 | if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) { | ||
136 | @@ -3641,6 +3643,8 @@ static void nv_do_nic_poll(unsigned long data) | ||
137 | } | ||
138 | np->nic_poll_irq = 0; | ||
139 | |||
140 | + /* disable_irq() contains synchronize_irq, thus no irq handler can run now */ | ||
141 | + | ||
142 | if (np->recover_error) { | ||
143 | np->recover_error = 0; | ||
144 | printk(KERN_INFO "forcedeth: MAC in recoverable error state\n"); | ||
145 | @@ -3677,7 +3681,6 @@ static void nv_do_nic_poll(unsigned long data) | ||
146 | } | ||
147 | } | ||
148 | |||
149 | - /* FIXME: Do we need synchronize_irq(dev->irq) here? */ | ||
150 | |||
151 | writel(mask, base + NvRegIrqMask); | ||
152 | pci_push(base); | ||
153 | @@ -3690,7 +3693,7 @@ static void nv_do_nic_poll(unsigned long data) | ||
154 | if (np->msi_flags & NV_MSI_X_ENABLED) | ||
155 | enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | ||
156 | else | ||
157 | - enable_irq_lockdep(dev->irq); | ||
158 | + enable_irq_lockdep(np->pci_dev->irq); | ||
159 | } else { | ||
160 | if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) { | ||
161 | nv_nic_irq_rx(0, dev); | ||
162 | @@ -4943,7 +4946,7 @@ static int nv_close(struct net_device *dev) | ||
163 | np->in_shutdown = 1; | ||
164 | spin_unlock_irq(&np->lock); | ||
165 | netif_poll_disable(dev); | ||
166 | - synchronize_irq(dev->irq); | ||
167 | + synchronize_irq(np->pci_dev->irq); | ||
168 | |||
169 | del_timer_sync(&np->oom_kick); | ||
170 | del_timer_sync(&np->nic_poll); | ||
171 | @@ -5563,6 +5566,22 @@ static struct pci_device_id pci_tbl[] = { | ||
172 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_31), | ||
173 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR, | ||
174 | }, | ||
175 | + { /* MCP77 Ethernet Controller */ | ||
176 | + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32), | ||
177 | + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | ||
178 | + }, | ||
179 | + { /* MCP77 Ethernet Controller */ | ||
180 | + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33), | ||
181 | + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | ||
182 | + }, | ||
183 | + { /* MCP77 Ethernet Controller */ | ||
184 | + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34), | ||
185 | + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | ||
186 | + }, | ||
187 | + { /* MCP77 Ethernet Controller */ | ||
188 | + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35), | ||
189 | + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, | ||
190 | + }, | ||
191 | {0,}, | ||
192 | }; | ||
193 | |||
194 | diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c | ||
195 | index abe91cb..7da0d07 100644 | ||
196 | --- a/drivers/net/pppol2tp.c | ||
197 | +++ b/drivers/net/pppol2tp.c | ||
198 | @@ -487,7 +487,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) | ||
199 | { | ||
200 | struct pppol2tp_session *session = NULL; | ||
201 | struct pppol2tp_tunnel *tunnel; | ||
202 | - unsigned char *ptr; | ||
203 | + unsigned char *ptr, *optr; | ||
204 | u16 hdrflags; | ||
205 | u16 tunnel_id, session_id; | ||
206 | int length; | ||
207 | @@ -495,7 +495,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) | ||
208 | |||
209 | tunnel = pppol2tp_sock_to_tunnel(sock); | ||
210 | if (tunnel == NULL) | ||
211 | - goto error; | ||
212 | + goto no_tunnel; | ||
213 | |||
214 | /* UDP always verifies the packet length. */ | ||
215 | __skb_pull(skb, sizeof(struct udphdr)); | ||
216 | @@ -508,7 +508,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) | ||
217 | } | ||
218 | |||
219 | /* Point to L2TP header */ | ||
220 | - ptr = skb->data; | ||
221 | + optr = ptr = skb->data; | ||
222 | |||
223 | /* Get L2TP header flags */ | ||
224 | hdrflags = ntohs(*(__be16*)ptr); | ||
225 | @@ -636,12 +636,14 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) | ||
226 | /* If offset bit set, skip it. */ | ||
227 | if (hdrflags & L2TP_HDRFLAG_O) { | ||
228 | offset = ntohs(*(__be16 *)ptr); | ||
229 | - skb->transport_header += 2 + offset; | ||
230 | - if (!pskb_may_pull(skb, skb_transport_offset(skb) + 2)) | ||
231 | - goto discard; | ||
232 | + ptr += 2 + offset; | ||
233 | } | ||
234 | |||
235 | - __skb_pull(skb, skb_transport_offset(skb)); | ||
236 | + offset = ptr - optr; | ||
237 | + if (!pskb_may_pull(skb, offset)) | ||
238 | + goto discard; | ||
239 | + | ||
240 | + __skb_pull(skb, offset); | ||
241 | |||
242 | /* Skip PPP header, if present. In testing, Microsoft L2TP clients | ||
243 | * don't send the PPP header (PPP header compression enabled), but | ||
244 | @@ -651,6 +653,9 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) | ||
245 | * Note that skb->data[] isn't dereferenced from a u16 ptr here since | ||
246 | * the field may be unaligned. | ||
247 | */ | ||
248 | + if (!pskb_may_pull(skb, 2)) | ||
249 | + goto discard; | ||
250 | + | ||
251 | if ((skb->data[0] == 0xff) && (skb->data[1] == 0x03)) | ||
252 | skb_pull(skb, 2); | ||
253 | |||
254 | @@ -708,6 +713,10 @@ discard: | ||
255 | return 0; | ||
256 | |||
257 | error: | ||
258 | + /* Put UDP header back */ | ||
259 | + __skb_push(skb, sizeof(struct udphdr)); | ||
260 | + | ||
261 | +no_tunnel: | ||
262 | return 1; | ||
263 | } | ||
264 | |||
265 | @@ -1049,6 +1058,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | ||
266 | /* Get routing info from the tunnel socket */ | ||
267 | dst_release(skb->dst); | ||
268 | skb->dst = sk_dst_get(sk_tun); | ||
269 | + skb_orphan(skb); | ||
270 | + skb->sk = sk_tun; | ||
271 | |||
272 | /* Queue the packet to IP for output */ | ||
273 | len = skb->len; | ||
274 | diff --git a/drivers/net/skge.c b/drivers/net/skge.c | ||
275 | index e3d8520..b3d4728 100644 | ||
276 | --- a/drivers/net/skge.c | ||
277 | +++ b/drivers/net/skge.c | ||
278 | @@ -57,7 +57,7 @@ | ||
279 | #define TX_WATCHDOG (5 * HZ) | ||
280 | #define NAPI_WEIGHT 64 | ||
281 | #define BLINK_MS 250 | ||
282 | -#define LINK_HZ (HZ/2) | ||
283 | +#define LINK_HZ HZ | ||
284 | |||
285 | MODULE_DESCRIPTION("SysKonnect Gigabit Ethernet driver"); | ||
286 | MODULE_AUTHOR("Stephen Hemminger <shemminger@linux-foundation.org>"); | ||
287 | @@ -992,19 +992,15 @@ static void xm_link_down(struct skge_hw *hw, int port) | ||
288 | { | ||
289 | struct net_device *dev = hw->dev[port]; | ||
290 | struct skge_port *skge = netdev_priv(dev); | ||
291 | - u16 cmd, msk; | ||
292 | + u16 cmd = xm_read16(hw, port, XM_MMU_CMD); | ||
293 | |||
294 | - if (hw->phy_type == SK_PHY_XMAC) { | ||
295 | - msk = xm_read16(hw, port, XM_IMSK); | ||
296 | - msk |= XM_IS_INP_ASS | XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND; | ||
297 | - xm_write16(hw, port, XM_IMSK, msk); | ||
298 | - } | ||
299 | + xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE); | ||
300 | |||
301 | - cmd = xm_read16(hw, port, XM_MMU_CMD); | ||
302 | cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX); | ||
303 | xm_write16(hw, port, XM_MMU_CMD, cmd); | ||
304 | + | ||
305 | /* dummy read to ensure writing */ | ||
306 | - (void) xm_read16(hw, port, XM_MMU_CMD); | ||
307 | + xm_read16(hw, port, XM_MMU_CMD); | ||
308 | |||
309 | if (netif_carrier_ok(dev)) | ||
310 | skge_link_down(skge); | ||
311 | @@ -1100,7 +1096,7 @@ static void genesis_reset(struct skge_hw *hw, int port) | ||
312 | |||
313 | /* reset the statistics module */ | ||
314 | xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT); | ||
315 | - xm_write16(hw, port, XM_IMSK, 0xffff); /* disable XMAC IRQs */ | ||
316 | + xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE); | ||
317 | xm_write32(hw, port, XM_MODE, 0); /* clear Mode Reg */ | ||
318 | xm_write16(hw, port, XM_TX_CMD, 0); /* reset TX CMD Reg */ | ||
319 | xm_write16(hw, port, XM_RX_CMD, 0); /* reset RX CMD Reg */ | ||
320 | @@ -1138,7 +1134,7 @@ static void bcom_check_link(struct skge_hw *hw, int port) | ||
321 | u16 status; | ||
322 | |||
323 | /* read twice because of latch */ | ||
324 | - (void) xm_phy_read(hw, port, PHY_BCOM_STAT); | ||
325 | + xm_phy_read(hw, port, PHY_BCOM_STAT); | ||
326 | status = xm_phy_read(hw, port, PHY_BCOM_STAT); | ||
327 | |||
328 | if ((status & PHY_ST_LSYNC) == 0) { | ||
329 | @@ -1339,7 +1335,7 @@ static void xm_phy_init(struct skge_port *skge) | ||
330 | mod_timer(&skge->link_timer, jiffies + LINK_HZ); | ||
331 | } | ||
332 | |||
333 | -static void xm_check_link(struct net_device *dev) | ||
334 | +static int xm_check_link(struct net_device *dev) | ||
335 | { | ||
336 | struct skge_port *skge = netdev_priv(dev); | ||
337 | struct skge_hw *hw = skge->hw; | ||
338 | @@ -1347,25 +1343,25 @@ static void xm_check_link(struct net_device *dev) | ||
339 | u16 status; | ||
340 | |||
341 | /* read twice because of latch */ | ||
342 | - (void) xm_phy_read(hw, port, PHY_XMAC_STAT); | ||
343 | + xm_phy_read(hw, port, PHY_XMAC_STAT); | ||
344 | status = xm_phy_read(hw, port, PHY_XMAC_STAT); | ||
345 | |||
346 | if ((status & PHY_ST_LSYNC) == 0) { | ||
347 | xm_link_down(hw, port); | ||
348 | - return; | ||
349 | + return 0; | ||
350 | } | ||
351 | |||
352 | if (skge->autoneg == AUTONEG_ENABLE) { | ||
353 | u16 lpa, res; | ||
354 | |||
355 | if (!(status & PHY_ST_AN_OVER)) | ||
356 | - return; | ||
357 | + return 0; | ||
358 | |||
359 | lpa = xm_phy_read(hw, port, PHY_XMAC_AUNE_LP); | ||
360 | if (lpa & PHY_B_AN_RF) { | ||
361 | printk(KERN_NOTICE PFX "%s: remote fault\n", | ||
362 | dev->name); | ||
363 | - return; | ||
364 | + return 0; | ||
365 | } | ||
366 | |||
367 | res = xm_phy_read(hw, port, PHY_XMAC_RES_ABI); | ||
368 | @@ -1381,7 +1377,7 @@ static void xm_check_link(struct net_device *dev) | ||
369 | default: | ||
370 | printk(KERN_NOTICE PFX "%s: duplex mismatch\n", | ||
371 | dev->name); | ||
372 | - return; | ||
373 | + return 0; | ||
374 | } | ||
375 | |||
376 | /* We are using IEEE 802.3z/D5.0 Table 37-4 */ | ||
377 | @@ -1405,11 +1401,14 @@ static void xm_check_link(struct net_device *dev) | ||
378 | |||
379 | if (!netif_carrier_ok(dev)) | ||
380 | genesis_link_up(skge); | ||
381 | + return 1; | ||
382 | } | ||
383 | |||
384 | /* Poll to check for link coming up. | ||
385 | + * | ||
386 | * Since internal PHY is wired to a level triggered pin, can't | ||
387 | - * get an interrupt when carrier is detected. | ||
388 | + * get an interrupt when carrier is detected, need to poll for | ||
389 | + * link coming up. | ||
390 | */ | ||
391 | static void xm_link_timer(unsigned long arg) | ||
392 | { | ||
393 | @@ -1417,29 +1416,35 @@ static void xm_link_timer(unsigned long arg) | ||
394 | struct net_device *dev = skge->netdev; | ||
395 | struct skge_hw *hw = skge->hw; | ||
396 | int port = skge->port; | ||
397 | + int i; | ||
398 | + unsigned long flags; | ||
399 | |||
400 | if (!netif_running(dev)) | ||
401 | return; | ||
402 | |||
403 | - if (netif_carrier_ok(dev)) { | ||
404 | + spin_lock_irqsave(&hw->phy_lock, flags); | ||
405 | + | ||
406 | + /* | ||
407 | + * Verify that the link by checking GPIO register three times. | ||
408 | + * This pin has the signal from the link_sync pin connected to it. | ||
409 | + */ | ||
410 | + for (i = 0; i < 3; i++) { | ||
411 | + if (xm_read16(hw, port, XM_GP_PORT) & XM_GP_INP_ASS) | ||
412 | + goto link_down; | ||
413 | + } | ||
414 | + | ||
415 | + /* Re-enable interrupt to detect link down */ | ||
416 | + if (xm_check_link(dev)) { | ||
417 | + u16 msk = xm_read16(hw, port, XM_IMSK); | ||
418 | + msk &= ~XM_IS_INP_ASS; | ||
419 | + xm_write16(hw, port, XM_IMSK, msk); | ||
420 | xm_read16(hw, port, XM_ISRC); | ||
421 | - if (!(xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS)) | ||
422 | - goto nochange; | ||
423 | } else { | ||
424 | - if (xm_read32(hw, port, XM_GP_PORT) & XM_GP_INP_ASS) | ||
425 | - goto nochange; | ||
426 | - xm_read16(hw, port, XM_ISRC); | ||
427 | - if (xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS) | ||
428 | - goto nochange; | ||
429 | +link_down: | ||
430 | + mod_timer(&skge->link_timer, | ||
431 | + round_jiffies(jiffies + LINK_HZ)); | ||
432 | } | ||
433 | - | ||
434 | - spin_lock(&hw->phy_lock); | ||
435 | - xm_check_link(dev); | ||
436 | - spin_unlock(&hw->phy_lock); | ||
437 | - | ||
438 | -nochange: | ||
439 | - if (netif_running(dev)) | ||
440 | - mod_timer(&skge->link_timer, jiffies + LINK_HZ); | ||
441 | + spin_unlock_irqrestore(&hw->phy_lock, flags); | ||
442 | } | ||
443 | |||
444 | static void genesis_mac_init(struct skge_hw *hw, int port) | ||
445 | @@ -1683,14 +1688,16 @@ static void genesis_mac_intr(struct skge_hw *hw, int port) | ||
446 | printk(KERN_DEBUG PFX "%s: mac interrupt status 0x%x\n", | ||
447 | skge->netdev->name, status); | ||
448 | |||
449 | - if (hw->phy_type == SK_PHY_XMAC && | ||
450 | - (status & (XM_IS_INP_ASS | XM_IS_LIPA_RC))) | ||
451 | - xm_link_down(hw, port); | ||
452 | + if (hw->phy_type == SK_PHY_XMAC && (status & XM_IS_INP_ASS)) { | ||
453 | + xm_link_down(hw, port); | ||
454 | + mod_timer(&skge->link_timer, jiffies + 1); | ||
455 | + } | ||
456 | |||
457 | if (status & XM_IS_TXF_UR) { | ||
458 | xm_write32(hw, port, XM_MODE, XM_MD_FTF); | ||
459 | ++skge->net_stats.tx_fifo_errors; | ||
460 | } | ||
461 | + | ||
462 | if (status & XM_IS_RXF_OV) { | ||
463 | xm_write32(hw, port, XM_MODE, XM_MD_FRF); | ||
464 | ++skge->net_stats.rx_fifo_errors; | ||
465 | @@ -1750,11 +1757,12 @@ static void genesis_link_up(struct skge_port *skge) | ||
466 | } | ||
467 | |||
468 | xm_write32(hw, port, XM_MODE, mode); | ||
469 | - msk = XM_DEF_MSK; | ||
470 | - if (hw->phy_type != SK_PHY_XMAC) | ||
471 | - msk |= XM_IS_INP_ASS; /* disable GP0 interrupt bit */ | ||
472 | |||
473 | + /* Turn on detection of Tx underrun, Rx overrun */ | ||
474 | + msk = xm_read16(hw, port, XM_IMSK); | ||
475 | + msk &= ~(XM_IS_RXF_OV | XM_IS_TXF_UR); | ||
476 | xm_write16(hw, port, XM_IMSK, msk); | ||
477 | + | ||
478 | xm_read16(hw, port, XM_ISRC); | ||
479 | |||
480 | /* get MMU Command Reg. */ | ||
481 | @@ -2185,7 +2193,7 @@ static void yukon_mac_intr(struct skge_hw *hw, int port) | ||
482 | u8 status = skge_read8(hw, SK_REG(port, GMAC_IRQ_SRC)); | ||
483 | |||
484 | if (netif_msg_intr(skge)) | ||
485 | - printk(KERN_DEBUG PFX "%s: mac interrupt status 0x%x\n", | ||
486 | + printk(KERN_DEBUG PFX "%s: yukon mac interrupt status 0x%x\n", | ||
487 | dev->name, status); | ||
488 | |||
489 | if (status & GM_IS_RX_FF_OR) { | ||
490 | diff --git a/drivers/net/skge.h b/drivers/net/skge.h | ||
491 | index edd7146..323d6c6 100644 | ||
492 | --- a/drivers/net/skge.h | ||
493 | +++ b/drivers/net/skge.h | ||
494 | @@ -2193,11 +2193,9 @@ enum { | ||
495 | XM_IS_TXF_UR = 1<<2, /* Bit 2: Transmit FIFO Underrun */ | ||
496 | XM_IS_TX_COMP = 1<<1, /* Bit 1: Frame Tx Complete */ | ||
497 | XM_IS_RX_COMP = 1<<0, /* Bit 0: Frame Rx Complete */ | ||
498 | -}; | ||
499 | - | ||
500 | -#define XM_DEF_MSK (~(XM_IS_INP_ASS | XM_IS_LIPA_RC | \ | ||
501 | - XM_IS_RXF_OV | XM_IS_TXF_UR)) | ||
502 | |||
503 | + XM_IMSK_DISABLE = 0xffff, | ||
504 | +}; | ||
505 | |||
506 | /* XM_HW_CFG 16 bit r/w Hardware Config Register */ | ||
507 | enum { | ||
508 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c | ||
509 | index ea117fc..2575077 100644 | ||
510 | --- a/drivers/net/sky2.c | ||
511 | +++ b/drivers/net/sky2.c | ||
512 | @@ -603,21 +603,22 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) | ||
513 | static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff) | ||
514 | { | ||
515 | u32 reg1; | ||
516 | - static const u32 phy_power[] | ||
517 | - = { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD }; | ||
518 | - | ||
519 | - /* looks like this XL is back asswards .. */ | ||
520 | - if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) | ||
521 | - onoff = !onoff; | ||
522 | + static const u32 phy_power[] = { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD }; | ||
523 | + static const u32 coma_mode[] = { PCI_Y2_PHY1_COMA, PCI_Y2_PHY2_COMA }; | ||
524 | |||
525 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); | ||
526 | reg1 = sky2_pci_read32(hw, PCI_DEV_REG1); | ||
527 | + | ||
528 | if (onoff) | ||
529 | /* Turn off phy power saving */ | ||
530 | reg1 &= ~phy_power[port]; | ||
531 | else | ||
532 | reg1 |= phy_power[port]; | ||
533 | |||
534 | + if (onoff && hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) | ||
535 | + reg1 |= coma_mode[port]; | ||
536 | + | ||
537 | + | ||
538 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); | ||
539 | sky2_pci_read32(hw, PCI_DEV_REG1); | ||
540 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | ||
541 | @@ -2246,20 +2247,26 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | ||
542 | while (hw->st_idx != hwidx) { | ||
543 | struct sky2_port *sky2; | ||
544 | struct sky2_status_le *le = hw->st_le + hw->st_idx; | ||
545 | - unsigned port = le->css & CSS_LINK_BIT; | ||
546 | + unsigned port; | ||
547 | struct net_device *dev; | ||
548 | struct sk_buff *skb; | ||
549 | u32 status; | ||
550 | u16 length; | ||
551 | + u8 opcode = le->opcode; | ||
552 | + | ||
553 | + if (!(opcode & HW_OWNER)) | ||
554 | + break; | ||
555 | |||
556 | hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE); | ||
557 | |||
558 | + port = le->css & CSS_LINK_BIT; | ||
559 | dev = hw->dev[port]; | ||
560 | sky2 = netdev_priv(dev); | ||
561 | length = le16_to_cpu(le->length); | ||
562 | status = le32_to_cpu(le->status); | ||
563 | |||
564 | - switch (le->opcode & ~HW_OWNER) { | ||
565 | + le->opcode = 0; | ||
566 | + switch (opcode & ~HW_OWNER) { | ||
567 | case OP_RXSTAT: | ||
568 | ++rx[port]; | ||
569 | skb = sky2_receive(dev, length, status); | ||
570 | @@ -2352,7 +2359,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | ||
571 | default: | ||
572 | if (net_ratelimit()) | ||
573 | printk(KERN_WARNING PFX | ||
574 | - "unknown status opcode 0x%x\n", le->opcode); | ||
575 | + "unknown status opcode 0x%x\n", opcode); | ||
576 | } | ||
577 | } | ||
578 | |||
579 | @@ -3564,20 +3571,64 @@ static void sky2_get_regs(struct net_device *dev, struct ethtool_regs *regs, | ||
580 | { | ||
581 | const struct sky2_port *sky2 = netdev_priv(dev); | ||
582 | const void __iomem *io = sky2->hw->regs; | ||
583 | + unsigned int b; | ||
584 | |||
585 | regs->version = 1; | ||
586 | - memset(p, 0, regs->len); | ||
587 | |||
588 | - memcpy_fromio(p, io, B3_RAM_ADDR); | ||
589 | - | ||
590 | - /* skip diagnostic ram region */ | ||
591 | - memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1, 0x2000 - B3_RI_WTO_R1); | ||
592 | + for (b = 0; b < 128; b++) { | ||
593 | + /* This complicated switch statement is to make sure and | ||
594 | + * only access regions that are unreserved. | ||
595 | + * Some blocks are only valid on dual port cards. | ||
596 | + * and block 3 has some special diagnostic registers that | ||
597 | + * are poison. | ||
598 | + */ | ||
599 | + switch (b) { | ||
600 | + case 3: | ||
601 | + /* skip diagnostic ram region */ | ||
602 | + memcpy_fromio(p + 0x10, io + 0x10, 128 - 0x10); | ||
603 | + break; | ||
604 | |||
605 | - /* copy GMAC registers */ | ||
606 | - memcpy_fromio(p + BASE_GMAC_1, io + BASE_GMAC_1, 0x1000); | ||
607 | - if (sky2->hw->ports > 1) | ||
608 | - memcpy_fromio(p + BASE_GMAC_2, io + BASE_GMAC_2, 0x1000); | ||
609 | + /* dual port cards only */ | ||
610 | + case 5: /* Tx Arbiter 2 */ | ||
611 | + case 9: /* RX2 */ | ||
612 | + case 14 ... 15: /* TX2 */ | ||
613 | + case 17: case 19: /* Ram Buffer 2 */ | ||
614 | + case 22 ... 23: /* Tx Ram Buffer 2 */ | ||
615 | + case 25: /* Rx MAC Fifo 1 */ | ||
616 | + case 27: /* Tx MAC Fifo 2 */ | ||
617 | + case 31: /* GPHY 2 */ | ||
618 | + case 40 ... 47: /* Pattern Ram 2 */ | ||
619 | + case 52: case 54: /* TCP Segmentation 2 */ | ||
620 | + case 112 ... 116: /* GMAC 2 */ | ||
621 | + if (sky2->hw->ports == 1) | ||
622 | + goto reserved; | ||
623 | + /* fall through */ | ||
624 | + case 0: /* Control */ | ||
625 | + case 2: /* Mac address */ | ||
626 | + case 4: /* Tx Arbiter 1 */ | ||
627 | + case 7: /* PCI express reg */ | ||
628 | + case 8: /* RX1 */ | ||
629 | + case 12 ... 13: /* TX1 */ | ||
630 | + case 16: case 18:/* Rx Ram Buffer 1 */ | ||
631 | + case 20 ... 21: /* Tx Ram Buffer 1 */ | ||
632 | + case 24: /* Rx MAC Fifo 1 */ | ||
633 | + case 26: /* Tx MAC Fifo 1 */ | ||
634 | + case 28 ... 29: /* Descriptor and status unit */ | ||
635 | + case 30: /* GPHY 1*/ | ||
636 | + case 32 ... 39: /* Pattern Ram 1 */ | ||
637 | + case 48: case 50: /* TCP Segmentation 1 */ | ||
638 | + case 56 ... 60: /* PCI space */ | ||
639 | + case 80 ... 84: /* GMAC 1 */ | ||
640 | + memcpy_fromio(p, io, 128); | ||
641 | + break; | ||
642 | + default: | ||
643 | +reserved: | ||
644 | + memset(p, 0, 128); | ||
645 | + } | ||
646 | |||
647 | + p += 128; | ||
648 | + io += 128; | ||
649 | + } | ||
650 | } | ||
651 | |||
652 | /* In order to do Jumbo packets on these chips, need to turn off the | ||
653 | diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c | ||
654 | index 9034a05..f80721e 100644 | ||
655 | --- a/drivers/net/tg3.c | ||
656 | +++ b/drivers/net/tg3.c | ||
657 | @@ -64,8 +64,8 @@ | ||
658 | |||
659 | #define DRV_MODULE_NAME "tg3" | ||
660 | #define PFX DRV_MODULE_NAME ": " | ||
661 | -#define DRV_MODULE_VERSION "3.81" | ||
662 | -#define DRV_MODULE_RELDATE "September 5, 2007" | ||
663 | +#define DRV_MODULE_VERSION "3.81.1" | ||
664 | +#define DRV_MODULE_RELDATE "October 18, 2007" | ||
665 | |||
666 | #define TG3_DEF_MAC_MODE 0 | ||
667 | #define TG3_DEF_RX_MODE 0 | ||
668 | @@ -4874,6 +4874,12 @@ static void tg3_restore_pci_state(struct tg3 *tp) | ||
669 | |||
670 | pci_write_config_dword(tp->pdev, TG3PCI_COMMAND, tp->pci_cmd); | ||
671 | |||
672 | + if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) { | ||
673 | + pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, | ||
674 | + tp->pci_cacheline_sz); | ||
675 | + pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, | ||
676 | + tp->pci_lat_timer); | ||
677 | + } | ||
678 | /* Make sure PCI-X relaxed ordering bit is clear. */ | ||
679 | pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val); | ||
680 | val &= ~PCIX_CAPS_RELAXED_ORDERING; | ||
681 | diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c | ||
682 | index 8990585..e690609 100644 | ||
683 | --- a/drivers/net/wireless/ipw2100.c | ||
684 | +++ b/drivers/net/wireless/ipw2100.c | ||
685 | @@ -2102,12 +2102,46 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status) | ||
686 | queue_delayed_work(priv->workqueue, &priv->rf_kill, round_jiffies(HZ)); | ||
687 | } | ||
688 | |||
689 | +static void send_scan_event(void *data) | ||
690 | +{ | ||
691 | + struct ipw2100_priv *priv = data; | ||
692 | + union iwreq_data wrqu; | ||
693 | + | ||
694 | + wrqu.data.length = 0; | ||
695 | + wrqu.data.flags = 0; | ||
696 | + wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); | ||
697 | +} | ||
698 | + | ||
699 | +static void ipw2100_scan_event_later(struct work_struct *work) | ||
700 | +{ | ||
701 | + send_scan_event(container_of(work, struct ipw2100_priv, | ||
702 | + scan_event_later.work)); | ||
703 | +} | ||
704 | + | ||
705 | +static void ipw2100_scan_event_now(struct work_struct *work) | ||
706 | +{ | ||
707 | + send_scan_event(container_of(work, struct ipw2100_priv, | ||
708 | + scan_event_now)); | ||
709 | +} | ||
710 | + | ||
711 | static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) | ||
712 | { | ||
713 | IPW_DEBUG_SCAN("scan complete\n"); | ||
714 | /* Age the scan results... */ | ||
715 | priv->ieee->scans++; | ||
716 | priv->status &= ~STATUS_SCANNING; | ||
717 | + | ||
718 | + /* Only userspace-requested scan completion events go out immediately */ | ||
719 | + if (!priv->user_requested_scan) { | ||
720 | + if (!delayed_work_pending(&priv->scan_event_later)) | ||
721 | + queue_delayed_work(priv->workqueue, | ||
722 | + &priv->scan_event_later, | ||
723 | + round_jiffies(msecs_to_jiffies(4000))); | ||
724 | + } else { | ||
725 | + priv->user_requested_scan = 0; | ||
726 | + cancel_delayed_work(&priv->scan_event_later); | ||
727 | + queue_work(priv->workqueue, &priv->scan_event_now); | ||
728 | + } | ||
729 | } | ||
730 | |||
731 | #ifdef CONFIG_IPW2100_DEBUG | ||
732 | @@ -4376,6 +4410,7 @@ static void ipw2100_kill_workqueue(struct ipw2100_priv *priv) | ||
733 | cancel_delayed_work(&priv->wx_event_work); | ||
734 | cancel_delayed_work(&priv->hang_check); | ||
735 | cancel_delayed_work(&priv->rf_kill); | ||
736 | + cancel_delayed_work(&priv->scan_event_later); | ||
737 | destroy_workqueue(priv->workqueue); | ||
738 | priv->workqueue = NULL; | ||
739 | } | ||
740 | @@ -6118,6 +6153,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, | ||
741 | INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); | ||
742 | INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); | ||
743 | INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); | ||
744 | + INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now); | ||
745 | + INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later); | ||
746 | |||
747 | tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) | ||
748 | ipw2100_irq_tasklet, (unsigned long)priv); | ||
749 | @@ -7427,6 +7464,8 @@ static int ipw2100_wx_set_scan(struct net_device *dev, | ||
750 | } | ||
751 | |||
752 | IPW_DEBUG_WX("Initiating scan...\n"); | ||
753 | + | ||
754 | + priv->user_requested_scan = 1; | ||
755 | if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) { | ||
756 | IPW_DEBUG_WX("Start scan failed.\n"); | ||
757 | |||
758 | diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h | ||
759 | index de7d384..1ee3348 100644 | ||
760 | --- a/drivers/net/wireless/ipw2100.h | ||
761 | +++ b/drivers/net/wireless/ipw2100.h | ||
762 | @@ -588,6 +588,10 @@ struct ipw2100_priv { | ||
763 | struct delayed_work wx_event_work; | ||
764 | struct delayed_work hang_check; | ||
765 | struct delayed_work rf_kill; | ||
766 | + struct work_struct scan_event_now; | ||
767 | + struct delayed_work scan_event_later; | ||
768 | + | ||
769 | + int user_requested_scan; | ||
770 | |||
771 | u32 interrupts; | ||
772 | int tx_interrupts; | ||
773 | diff --git a/drivers/net/wireless/libertas/11d.c b/drivers/net/wireless/libertas/11d.c | ||
774 | index 4cf0ff7..0560270 100644 | ||
775 | --- a/drivers/net/wireless/libertas/11d.c | ||
776 | +++ b/drivers/net/wireless/libertas/11d.c | ||
777 | @@ -562,7 +562,7 @@ int libertas_cmd_802_11d_domain_info(wlan_private * priv, | ||
778 | nr_subband * sizeof(struct ieeetypes_subbandset)); | ||
779 | |||
780 | cmd->size = cpu_to_le16(sizeof(pdomaininfo->action) + | ||
781 | - domain->header.len + | ||
782 | + le16_to_cpu(domain->header.len) + | ||
783 | sizeof(struct mrvlietypesheader) + | ||
784 | S_DS_GEN); | ||
785 | } else { | ||
786 | diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c | ||
787 | index 4a8f5dc..86fff8d 100644 | ||
788 | --- a/drivers/net/wireless/libertas/cmd.c | ||
789 | +++ b/drivers/net/wireless/libertas/cmd.c | ||
790 | @@ -185,14 +185,12 @@ static int wlan_cmd_802_11_set_wep(wlan_private * priv, | ||
791 | |||
792 | switch (pkey->len) { | ||
793 | case KEY_LEN_WEP_40: | ||
794 | - wep->keytype[i] = | ||
795 | - cpu_to_le16(cmd_type_wep_40_bit); | ||
796 | + wep->keytype[i] = cmd_type_wep_40_bit; | ||
797 | memmove(&wep->keymaterial[i], pkey->key, | ||
798 | pkey->len); | ||
799 | break; | ||
800 | case KEY_LEN_WEP_104: | ||
801 | - wep->keytype[i] = | ||
802 | - cpu_to_le16(cmd_type_wep_104_bit); | ||
803 | + wep->keytype[i] = cmd_type_wep_104_bit; | ||
804 | memmove(&wep->keymaterial[i], pkey->key, | ||
805 | pkey->len); | ||
806 | break; | ||
807 | diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c | ||
808 | index 2fcc3bf..873c405 100644 | ||
809 | --- a/drivers/net/wireless/libertas/wext.c | ||
810 | +++ b/drivers/net/wireless/libertas/wext.c | ||
811 | @@ -973,7 +973,7 @@ static struct iw_statistics *wlan_get_wireless_stats(struct net_device *dev) | ||
812 | /* Quality by TX errors */ | ||
813 | priv->wstats.discard.retries = priv->stats.tx_errors; | ||
814 | |||
815 | - tx_retries = le16_to_cpu(adapter->logmsg.retry); | ||
816 | + tx_retries = le32_to_cpu(adapter->logmsg.retry); | ||
817 | |||
818 | if (tx_retries > 75) | ||
819 | tx_qual = (90 - tx_retries) * POOR / 15; | ||
820 | @@ -989,10 +989,10 @@ static struct iw_statistics *wlan_get_wireless_stats(struct net_device *dev) | ||
821 | (PERFECT - VERY_GOOD) / 50 + VERY_GOOD; | ||
822 | quality = min(quality, tx_qual); | ||
823 | |||
824 | - priv->wstats.discard.code = le16_to_cpu(adapter->logmsg.wepundecryptable); | ||
825 | - priv->wstats.discard.fragment = le16_to_cpu(adapter->logmsg.rxfrag); | ||
826 | + priv->wstats.discard.code = le32_to_cpu(adapter->logmsg.wepundecryptable); | ||
827 | + priv->wstats.discard.fragment = le32_to_cpu(adapter->logmsg.rxfrag); | ||
828 | priv->wstats.discard.retries = tx_retries; | ||
829 | - priv->wstats.discard.misc = le16_to_cpu(adapter->logmsg.ackfailure); | ||
830 | + priv->wstats.discard.misc = le32_to_cpu(adapter->logmsg.ackfailure); | ||
831 | |||
832 | /* Calculate quality */ | ||
833 | priv->wstats.qual.qual = max(quality, (u32)100); | ||
834 | diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c | ||
835 | index e61c6d5..66704b8 100644 | ||
836 | --- a/drivers/net/wireless/rtl8187_dev.c | ||
837 | +++ b/drivers/net/wireless/rtl8187_dev.c | ||
838 | @@ -78,7 +78,8 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | ||
839 | struct rtl8187_tx_hdr *hdr; | ||
840 | struct rtl8187_tx_info *info; | ||
841 | struct urb *urb; | ||
842 | - u32 tmp; | ||
843 | + __le16 rts_dur = 0; | ||
844 | + u32 flags; | ||
845 | |||
846 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
847 | if (!urb) { | ||
848 | @@ -86,24 +87,24 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | ||
849 | return 0; | ||
850 | } | ||
851 | |||
852 | - hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); | ||
853 | - tmp = skb->len - sizeof(*hdr); | ||
854 | - tmp |= RTL8187_TX_FLAG_NO_ENCRYPT; | ||
855 | - tmp |= control->rts_cts_rate << 19; | ||
856 | - tmp |= control->tx_rate << 24; | ||
857 | - if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb)) | ||
858 | - tmp |= RTL8187_TX_FLAG_MORE_FRAG; | ||
859 | + flags = skb->len; | ||
860 | + flags |= RTL8187_TX_FLAG_NO_ENCRYPT; | ||
861 | + flags |= control->rts_cts_rate << 19; | ||
862 | + flags |= control->tx_rate << 24; | ||
863 | + if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data)) | ||
864 | + flags |= RTL8187_TX_FLAG_MORE_FRAG; | ||
865 | if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { | ||
866 | - tmp |= RTL8187_TX_FLAG_RTS; | ||
867 | - hdr->rts_duration = | ||
868 | - ieee80211_rts_duration(dev, skb->len, control); | ||
869 | + flags |= RTL8187_TX_FLAG_RTS; | ||
870 | + rts_dur = ieee80211_rts_duration(dev, skb->len, control); | ||
871 | } | ||
872 | if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) | ||
873 | - tmp |= RTL8187_TX_FLAG_CTS; | ||
874 | - hdr->flags = cpu_to_le32(tmp); | ||
875 | + flags |= RTL8187_TX_FLAG_CTS; | ||
876 | + | ||
877 | + hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); | ||
878 | + hdr->flags = cpu_to_le32(flags); | ||
879 | hdr->len = 0; | ||
880 | - tmp = control->retry_limit << 8; | ||
881 | - hdr->retry = cpu_to_le32(tmp); | ||
882 | + hdr->rts_duration = rts_dur; | ||
883 | + hdr->retry = cpu_to_le32(control->retry_limit << 8); | ||
884 | |||
885 | info = (struct rtl8187_tx_info *)skb->cb; | ||
886 | info->control = kmemdup(control, sizeof(*control), GFP_ATOMIC); | ||
887 | diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c | ||
888 | index 935b144..d5c0c66 100644 | ||
889 | --- a/drivers/net/wireless/zd1201.c | ||
890 | +++ b/drivers/net/wireless/zd1201.c | ||
891 | @@ -327,8 +327,8 @@ static void zd1201_usbrx(struct urb *urb) | ||
892 | memcpy(skb_put(skb, 6), &data[datalen-8], 6); | ||
893 | memcpy(skb_put(skb, 2), &data[datalen-24], 2); | ||
894 | memcpy(skb_put(skb, len), data, len); | ||
895 | - skb->dev->last_rx = jiffies; | ||
896 | skb->protocol = eth_type_trans(skb, zd->dev); | ||
897 | + skb->dev->last_rx = jiffies; | ||
898 | zd->stats.rx_packets++; | ||
899 | zd->stats.rx_bytes += skb->len; | ||
900 | netif_rx(skb); | ||
901 | @@ -384,8 +384,8 @@ static void zd1201_usbrx(struct urb *urb) | ||
902 | memcpy(skb_put(skb, 2), &data[6], 2); | ||
903 | memcpy(skb_put(skb, len), data+8, len); | ||
904 | } | ||
905 | - skb->dev->last_rx = jiffies; | ||
906 | skb->protocol = eth_type_trans(skb, zd->dev); | ||
907 | + skb->dev->last_rx = jiffies; | ||
908 | zd->stats.rx_packets++; | ||
909 | zd->stats.rx_bytes += skb->len; | ||
910 | netif_rx(skb); | ||
911 | diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c | ||
912 | index a9c339e..5326301 100644 | ||
913 | --- a/drivers/net/wireless/zd1211rw/zd_usb.c | ||
914 | +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | ||
915 | @@ -1041,14 +1041,17 @@ error: | ||
916 | static void disconnect(struct usb_interface *intf) | ||
917 | { | ||
918 | struct net_device *netdev = zd_intf_to_netdev(intf); | ||
919 | - struct zd_mac *mac = zd_netdev_mac(netdev); | ||
920 | - struct zd_usb *usb = &mac->chip.usb; | ||
921 | + struct zd_mac *mac; | ||
922 | + struct zd_usb *usb; | ||
923 | |||
924 | /* Either something really bad happened, or we're just dealing with | ||
925 | * a DEVICE_INSTALLER. */ | ||
926 | if (netdev == NULL) | ||
927 | return; | ||
928 | |||
929 | + mac = zd_netdev_mac(netdev); | ||
930 | + usb = &mac->chip.usb; | ||
931 | + | ||
932 | dev_dbg_f(zd_usb_dev(usb), "\n"); | ||
933 | |||
934 | zd_netdev_disconnect(netdev); | ||
935 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h | ||
936 | index 55f307f..85d434b 100644 | ||
937 | --- a/include/linux/pci_ids.h | ||
938 | +++ b/include/linux/pci_ids.h | ||
939 | @@ -1233,6 +1233,10 @@ | ||
940 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 | ||
941 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C | ||
942 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 | ||
943 | +#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760 | ||
944 | +#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761 | ||
945 | +#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762 | ||
946 | +#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763 | ||
947 | |||
948 | #define PCI_VENDOR_ID_IMS 0x10e0 | ||
949 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 |