Contents of /trunk/kernel26-alx/patches-2.6.23-r1/0104-2.6.23.5-all-fixes.patch
Parent Directory | Revision Log
Revision 658 -
(show 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 | 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 |