[mac80211] fix module loading with kernel 2.6.27
[openwrt/svn-archive/archive.git] / package / mac80211 / patches / 011-move_ar9170_usb_compat_code.patch
1 --- a/drivers/net/wireless/ath/ar9170/usb.c
2 +++ b/drivers/net/wireless/ath/ar9170/usb.c
3 @@ -96,6 +96,225 @@ static struct usb_device_id ar9170_usb_i
4 };
5 MODULE_DEVICE_TABLE(usb, ar9170_usb_ids);
6
7 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
8 +
9 +/**
10 + * usb_unpoison_anchored_urbs - let an anchor be used successfully again
11 + * @anchor: anchor the requests are bound to
12 + *
13 + * Reverses the effect of usb_poison_anchored_urbs
14 + * the anchor can be used normally after it returns
15 + */
16 +void usb_unpoison_anchored_urbs(struct usb_anchor *anchor)
17 +{
18 + unsigned long flags;
19 + struct urb *lazarus;
20 +
21 + spin_lock_irqsave(&anchor->lock, flags);
22 + list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) {
23 + usb_unpoison_urb(lazarus);
24 + }
25 + //anchor->poisoned = 0; /* XXX: cannot backport */
26 + spin_unlock_irqrestore(&anchor->lock, flags);
27 +}
28 +EXPORT_SYMBOL_GPL(usb_unpoison_anchored_urbs);
29 +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */
30 +
31 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28))
32 +
33 +/*
34 + * Compat-wireless notes for USB backport stuff:
35 + *
36 + * urb->reject exists on 2.6.27, the poison/unpoison helpers
37 + * did not though. The anchor poison does not exist so we cannot use them.
38 + *
39 + * USB anchor poising seems to exist to prevent future driver sumbissions
40 + * of usb_anchor_urb() to an anchor marked as poisoned. For older kernels
41 + * we cannot use that, so new usb_anchor_urb()s will be anchored. The down
42 + * side to this should be submission of URBs will continue being anchored
43 + * on an anchor instead of having them being rejected immediately when the
44 + * driver realized we needed to stop. For ar9170 we poison URBs upon the
45 + * ar9170 mac80211 stop callback(), don't think this should be so bad.
46 + * It mean there is period of time in older kernels for which we continue
47 + * to anchor new URBs to a known stopped anchor. We have two anchors
48 + * (TX, and RX)
49 + */
50 +
51 +#if 0
52 +/**
53 + * usb_poison_urb - reliably kill a transfer and prevent further use of an URB
54 + * @urb: pointer to URB describing a previously submitted request,
55 + * may be NULL
56 + *
57 + * This routine cancels an in-progress request. It is guaranteed that
58 + * upon return all completion handlers will have finished and the URB
59 + * will be totally idle and cannot be reused. These features make
60 + * this an ideal way to stop I/O in a disconnect() callback.
61 + * If the request has not already finished or been unlinked
62 + * the completion handler will see urb->status == -ENOENT.
63 + *
64 + * After and while the routine runs, attempts to resubmit the URB will fail
65 + * with error -EPERM. Thus even if the URB's completion handler always
66 + * tries to resubmit, it will not succeed and the URB will become idle.
67 + *
68 + * This routine may not be used in an interrupt context (such as a bottom
69 + * half or a completion handler), or when holding a spinlock, or in other
70 + * situations where the caller can't schedule().
71 + *
72 + * This routine should not be called by a driver after its disconnect
73 + * method has returned.
74 + */
75 +void usb_poison_urb(struct urb *urb)
76 +{
77 + might_sleep();
78 + if (!(urb && urb->dev && urb->ep))
79 + return;
80 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
81 + spin_lock_irq(&usb_reject_lock);
82 +#endif
83 + ++urb->reject;
84 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
85 + spin_unlock_irq(&usb_reject_lock);
86 +#endif
87 + /*
88 + * XXX: usb_hcd_unlink_urb() needs backporting... this is defined
89 + * on usb hcd.c but urb.c gets access to it. That is, older kernels
90 + * have usb_hcd_unlink_urb() but its not exported, nor can we
91 + * re-implement it exactly. This essentially dequeues the urb from
92 + * hw, we need to figure out a way to backport this.
93 + */
94 + //usb_hcd_unlink_urb(urb, -ENOENT);
95 +
96 + wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
97 +}
98 +EXPORT_SYMBOL_GPL(usb_poison_urb);
99 +#endif
100 +
101 +void usb_unpoison_urb(struct urb *urb)
102 +{
103 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
104 + unsigned long flags;
105 +#endif
106 +
107 + if (!urb)
108 + return;
109 +
110 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
111 + spin_lock_irqsave(&usb_reject_lock, flags);
112 +#endif
113 + --urb->reject;
114 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
115 + spin_unlock_irqrestore(&usb_reject_lock, flags);
116 +#endif
117 +}
118 +EXPORT_SYMBOL_GPL(usb_unpoison_urb);
119 +
120 +
121 +#if 0
122 +/**
123 + * usb_poison_anchored_urbs - cease all traffic from an anchor
124 + * @anchor: anchor the requests are bound to
125 + *
126 + * this allows all outstanding URBs to be poisoned starting
127 + * from the back of the queue. Newly added URBs will also be
128 + * poisoned
129 + *
130 + * This routine should not be called by a driver after its disconnect
131 + * method has returned.
132 + */
133 +void usb_poison_anchored_urbs(struct usb_anchor *anchor)
134 +{
135 + struct urb *victim;
136 +
137 + spin_lock_irq(&anchor->lock);
138 + // anchor->poisoned = 1; /* XXX: Cannot backport */
139 + while (!list_empty(&anchor->urb_list)) {
140 + victim = list_entry(anchor->urb_list.prev, struct urb,
141 + anchor_list);
142 + /* we must make sure the URB isn't freed before we kill it*/
143 + usb_get_urb(victim);
144 + spin_unlock_irq(&anchor->lock);
145 + /* this will unanchor the URB */
146 + usb_poison_urb(victim);
147 + usb_put_urb(victim);
148 + spin_lock_irq(&anchor->lock);
149 + }
150 + spin_unlock_irq(&anchor->lock);
151 +}
152 +EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs);
153 +#endif
154 +
155 +/**
156 + * usb_get_from_anchor - get an anchor's oldest urb
157 + * @anchor: the anchor whose urb you want
158 + *
159 + * this will take the oldest urb from an anchor,
160 + * unanchor and return it
161 + */
162 +struct urb *usb_get_from_anchor(struct usb_anchor *anchor)
163 +{
164 + struct urb *victim;
165 + unsigned long flags;
166 +
167 + spin_lock_irqsave(&anchor->lock, flags);
168 + if (!list_empty(&anchor->urb_list)) {
169 + victim = list_entry(anchor->urb_list.next, struct urb,
170 + anchor_list);
171 + usb_get_urb(victim);
172 + spin_unlock_irqrestore(&anchor->lock, flags);
173 + usb_unanchor_urb(victim);
174 + } else {
175 + spin_unlock_irqrestore(&anchor->lock, flags);
176 + victim = NULL;
177 + }
178 +
179 + return victim;
180 +}
181 +
182 +EXPORT_SYMBOL_GPL(usb_get_from_anchor);
183 +
184 +/**
185 + * usb_scuttle_anchored_urbs - unanchor all an anchor's urbs
186 + * @anchor: the anchor whose urbs you want to unanchor
187 + *
188 + * use this to get rid of all an anchor's urbs
189 + */
190 +void usb_scuttle_anchored_urbs(struct usb_anchor *anchor)
191 +{
192 + struct urb *victim;
193 + unsigned long flags;
194 +
195 + spin_lock_irqsave(&anchor->lock, flags);
196 + while (!list_empty(&anchor->urb_list)) {
197 + victim = list_entry(anchor->urb_list.prev, struct urb,
198 + anchor_list);
199 + usb_get_urb(victim);
200 + spin_unlock_irqrestore(&anchor->lock, flags);
201 + /* this may free the URB */
202 + usb_unanchor_urb(victim);
203 + usb_put_urb(victim);
204 + spin_lock_irqsave(&anchor->lock, flags);
205 + }
206 + spin_unlock_irqrestore(&anchor->lock, flags);
207 +}
208 +
209 +EXPORT_SYMBOL_GPL(usb_scuttle_anchored_urbs);
210 +
211 +/**
212 + * usb_anchor_empty - is an anchor empty
213 + * @anchor: the anchor you want to query
214 + *
215 + * returns 1 if the anchor has no urbs associated with it
216 + */
217 +int usb_anchor_empty(struct usb_anchor *anchor)
218 +{
219 + return list_empty(&anchor->urb_list);
220 +}
221 +
222 +EXPORT_SYMBOL_GPL(usb_anchor_empty);
223 +
224 +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) */
225 +
226 static void ar9170_usb_submit_urb(struct ar9170_usb *aru)
227 {
228 struct urb *urb;
229 --- a/net/wireless/compat-2.6.28.c
230 +++ b/net/wireless/compat-2.6.28.c
231 @@ -12,202 +12,8 @@
232
233 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28))
234
235 -#include <linux/usb.h>
236 -
237 /* 2.6.28 compat code goes here */
238
239 -/*
240 - * Compat-wireless notes for USB backport stuff:
241 - *
242 - * urb->reject exists on 2.6.27, the poison/unpoison helpers
243 - * did not though. The anchor poison does not exist so we cannot use them.
244 - *
245 - * USB anchor poising seems to exist to prevent future driver sumbissions
246 - * of usb_anchor_urb() to an anchor marked as poisoned. For older kernels
247 - * we cannot use that, so new usb_anchor_urb()s will be anchored. The down
248 - * side to this should be submission of URBs will continue being anchored
249 - * on an anchor instead of having them being rejected immediately when the
250 - * driver realized we needed to stop. For ar9170 we poison URBs upon the
251 - * ar9170 mac80211 stop callback(), don't think this should be so bad.
252 - * It mean there is period of time in older kernels for which we continue
253 - * to anchor new URBs to a known stopped anchor. We have two anchors
254 - * (TX, and RX)
255 - */
256 -
257 -#if 0
258 -/**
259 - * usb_poison_urb - reliably kill a transfer and prevent further use of an URB
260 - * @urb: pointer to URB describing a previously submitted request,
261 - * may be NULL
262 - *
263 - * This routine cancels an in-progress request. It is guaranteed that
264 - * upon return all completion handlers will have finished and the URB
265 - * will be totally idle and cannot be reused. These features make
266 - * this an ideal way to stop I/O in a disconnect() callback.
267 - * If the request has not already finished or been unlinked
268 - * the completion handler will see urb->status == -ENOENT.
269 - *
270 - * After and while the routine runs, attempts to resubmit the URB will fail
271 - * with error -EPERM. Thus even if the URB's completion handler always
272 - * tries to resubmit, it will not succeed and the URB will become idle.
273 - *
274 - * This routine may not be used in an interrupt context (such as a bottom
275 - * half or a completion handler), or when holding a spinlock, or in other
276 - * situations where the caller can't schedule().
277 - *
278 - * This routine should not be called by a driver after its disconnect
279 - * method has returned.
280 - */
281 -void usb_poison_urb(struct urb *urb)
282 -{
283 - might_sleep();
284 - if (!(urb && urb->dev && urb->ep))
285 - return;
286 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
287 - spin_lock_irq(&usb_reject_lock);
288 -#endif
289 - ++urb->reject;
290 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
291 - spin_unlock_irq(&usb_reject_lock);
292 -#endif
293 - /*
294 - * XXX: usb_hcd_unlink_urb() needs backporting... this is defined
295 - * on usb hcd.c but urb.c gets access to it. That is, older kernels
296 - * have usb_hcd_unlink_urb() but its not exported, nor can we
297 - * re-implement it exactly. This essentially dequeues the urb from
298 - * hw, we need to figure out a way to backport this.
299 - */
300 - //usb_hcd_unlink_urb(urb, -ENOENT);
301 -
302 - wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
303 -}
304 -EXPORT_SYMBOL_GPL(usb_poison_urb);
305 -#endif
306 -
307 -void usb_unpoison_urb(struct urb *urb)
308 -{
309 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
310 - unsigned long flags;
311 -#endif
312 -
313 - if (!urb)
314 - return;
315 -
316 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
317 - spin_lock_irqsave(&usb_reject_lock, flags);
318 -#endif
319 - --urb->reject;
320 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
321 - spin_unlock_irqrestore(&usb_reject_lock, flags);
322 -#endif
323 -}
324 -EXPORT_SYMBOL_GPL(usb_unpoison_urb);
325 -
326 -
327 -#if 0
328 -/**
329 - * usb_poison_anchored_urbs - cease all traffic from an anchor
330 - * @anchor: anchor the requests are bound to
331 - *
332 - * this allows all outstanding URBs to be poisoned starting
333 - * from the back of the queue. Newly added URBs will also be
334 - * poisoned
335 - *
336 - * This routine should not be called by a driver after its disconnect
337 - * method has returned.
338 - */
339 -void usb_poison_anchored_urbs(struct usb_anchor *anchor)
340 -{
341 - struct urb *victim;
342 -
343 - spin_lock_irq(&anchor->lock);
344 - // anchor->poisoned = 1; /* XXX: Cannot backport */
345 - while (!list_empty(&anchor->urb_list)) {
346 - victim = list_entry(anchor->urb_list.prev, struct urb,
347 - anchor_list);
348 - /* we must make sure the URB isn't freed before we kill it*/
349 - usb_get_urb(victim);
350 - spin_unlock_irq(&anchor->lock);
351 - /* this will unanchor the URB */
352 - usb_poison_urb(victim);
353 - usb_put_urb(victim);
354 - spin_lock_irq(&anchor->lock);
355 - }
356 - spin_unlock_irq(&anchor->lock);
357 -}
358 -EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs);
359 -#endif
360 -
361 -/**
362 - * usb_get_from_anchor - get an anchor's oldest urb
363 - * @anchor: the anchor whose urb you want
364 - *
365 - * this will take the oldest urb from an anchor,
366 - * unanchor and return it
367 - */
368 -struct urb *usb_get_from_anchor(struct usb_anchor *anchor)
369 -{
370 - struct urb *victim;
371 - unsigned long flags;
372 -
373 - spin_lock_irqsave(&anchor->lock, flags);
374 - if (!list_empty(&anchor->urb_list)) {
375 - victim = list_entry(anchor->urb_list.next, struct urb,
376 - anchor_list);
377 - usb_get_urb(victim);
378 - spin_unlock_irqrestore(&anchor->lock, flags);
379 - usb_unanchor_urb(victim);
380 - } else {
381 - spin_unlock_irqrestore(&anchor->lock, flags);
382 - victim = NULL;
383 - }
384 -
385 - return victim;
386 -}
387 -
388 -EXPORT_SYMBOL_GPL(usb_get_from_anchor);
389 -
390 -/**
391 - * usb_scuttle_anchored_urbs - unanchor all an anchor's urbs
392 - * @anchor: the anchor whose urbs you want to unanchor
393 - *
394 - * use this to get rid of all an anchor's urbs
395 - */
396 -void usb_scuttle_anchored_urbs(struct usb_anchor *anchor)
397 -{
398 - struct urb *victim;
399 - unsigned long flags;
400 -
401 - spin_lock_irqsave(&anchor->lock, flags);
402 - while (!list_empty(&anchor->urb_list)) {
403 - victim = list_entry(anchor->urb_list.prev, struct urb,
404 - anchor_list);
405 - usb_get_urb(victim);
406 - spin_unlock_irqrestore(&anchor->lock, flags);
407 - /* this may free the URB */
408 - usb_unanchor_urb(victim);
409 - usb_put_urb(victim);
410 - spin_lock_irqsave(&anchor->lock, flags);
411 - }
412 - spin_unlock_irqrestore(&anchor->lock, flags);
413 -}
414 -
415 -EXPORT_SYMBOL_GPL(usb_scuttle_anchored_urbs);
416 -
417 -/**
418 - * usb_anchor_empty - is an anchor empty
419 - * @anchor: the anchor you want to query
420 - *
421 - * returns 1 if the anchor has no urbs associated with it
422 - */
423 -int usb_anchor_empty(struct usb_anchor *anchor)
424 -{
425 - return list_empty(&anchor->urb_list);
426 -}
427 -
428 -EXPORT_SYMBOL_GPL(usb_anchor_empty);
429 -
430 -
431 void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar)
432 {
433 /*
434 --- a/net/wireless/compat-2.6.29.c
435 +++ b/net/wireless/compat-2.6.29.c
436 @@ -12,29 +12,7 @@
437
438 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
439
440 -#include <linux/usb.h>
441 -
442 -/**
443 - * usb_unpoison_anchored_urbs - let an anchor be used successfully again
444 - * @anchor: anchor the requests are bound to
445 - *
446 - * Reverses the effect of usb_poison_anchored_urbs
447 - * the anchor can be used normally after it returns
448 - */
449 -void usb_unpoison_anchored_urbs(struct usb_anchor *anchor)
450 -{
451 - unsigned long flags;
452 - struct urb *lazarus;
453 -
454 - spin_lock_irqsave(&anchor->lock, flags);
455 - list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) {
456 - usb_unpoison_urb(lazarus);
457 - }
458 - //anchor->poisoned = 0; /* XXX: cannot backport */
459 - spin_unlock_irqrestore(&anchor->lock, flags);
460 -}
461 -EXPORT_SYMBOL_GPL(usb_unpoison_anchored_urbs);
462 -
463 +/* 2.6.29 compat code goes here */
464
465 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */
466
467 --- a/include/net/compat-2.6.28.h
468 +++ b/include/net/compat-2.6.28.h
469 @@ -9,7 +9,6 @@
470
471 #include <linux/skbuff.h>
472 #include <linux/if_ether.h>
473 -#include <linux/usb.h>
474
475 #ifndef ETH_P_PAE
476 #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
477 @@ -37,19 +36,6 @@
478 #define pcmcia_parse_tuple(tuple, parse) pccard_parse_tuple(tuple, parse)
479 #endif
480
481 -#if 0
482 -extern void usb_poison_urb(struct urb *urb);
483 -#endif
484 -extern void usb_unpoison_urb(struct urb *urb);
485 -
486 -#if 0
487 -extern void usb_poison_anchored_urbs(struct usb_anchor *anchor);
488 -#endif
489 -
490 -extern struct urb *usb_get_from_anchor(struct usb_anchor *anchor);
491 -extern void usb_scuttle_anchored_urbs(struct usb_anchor *anchor);
492 -extern int usb_anchor_empty(struct usb_anchor *anchor);
493 -
494
495 void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);
496
497 --- a/include/net/compat-2.6.29.h
498 +++ b/include/net/compat-2.6.29.h
499 @@ -8,7 +8,6 @@
500 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
501
502 #include <linux/skbuff.h>
503 -#include <linux/usb.h>
504
505 /**
506 * skb_queue_is_first - check if skb is the first entry in the queue
507 @@ -41,8 +40,6 @@ static inline struct sk_buff *skb_queue_
508 return skb->prev;
509 }
510
511 -extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor);
512 -
513 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)) */
514
515 #endif /* LINUX_26_29_COMPAT_H */