Hi,
I just upgraded to kernel 2.6.14 and noticed that orinoco-usb spewed few
error messages about not being able to download firmware etc.
Orinoco-usb was not working at all. Then I rememberd few "badness in
usb_unlink_urb()" error messages from 2.6.13 and decided to change
usb_unlink_urb() to usb_kill_urb(). With attached patch orinoco-usb
works with 2.6.14 (at least it seems so after 10 minutes of quick
testing). My card is Compaq Wireless LAN W200 in Compaq Evo N620c laptop.
In case mail servers remove attachments patch is available at
http://aketzu.net/~akolehma/orinoco-usb-2.6.14.patch
Anssi Kolehmainen
Index: orinoco_usb.c
===================================================================
RCS file: /cvsroot/orinoco/orinoco/orinoco_usb.c,v
retrieving revision 1.104
diff -u -r1.104 orinoco_usb.c
--- orinoco_usb.c 14 Oct 2005 03:45:01 -0000 1.104
+++ orinoco_usb.c 29 Oct 2005 17:21:35 -0000
@@ -79,10 +79,6 @@
# define fw_dev_param (&interface->dev)
#endif
-#ifndef URB_ASYNC_UNLINK
-#define URB_ASYNC_UNLINK 0
-#endif
-
struct ez_usb_fw {
u16 size;
u8 *code;
@@ -365,7 +361,6 @@
{
struct request_context *ctx = (void *) _ctx;
- ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK;
if (usb_unlink_urb(ctx->outurb) == -EINPROGRESS) {
ctx->state = EZUSB_CTX_REQ_TIMEOUT;
} else {
@@ -721,8 +716,7 @@
state);
/* Throw this CTX away and try submitting another */
del_timer(&ctx->timer);
- ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK;
- usb_unlink_urb(ctx->outurb);
+ usb_kill_urb(ctx->outurb);
ezusb_req_queue_run(dev);
break;
} /* switch */
@@ -833,7 +827,7 @@
retval = -ENOENT;
goto exit;
}
- retval = usb_unlink_urb(dev->read_urb);
+ usb_kill_urb(dev->read_urb);
exit:
return retval;
}
@@ -1413,13 +1407,9 @@
ctx = list_entry(item, struct request_context, list);
atomic_inc(&ctx->refcount);
- ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK;
- if (usb_unlink_urb(ctx->outurb) == -EINPROGRESS) {
- spin_unlock_irqrestore(&dev->req_lock, flags);
- wait_for_completion(&ctx->done);
- } else {
- spin_unlock_irqrestore(&dev->req_lock, flags);
- }
+ usb_kill_urb(ctx->outurb);
+ spin_unlock_irqrestore(&dev->req_lock, flags);
+ wait_for_completion(&ctx->done);
del_timer_sync(&ctx->timer);
/* FIXME: there is an slight chance for the irq handler to
* be running */
|