[PATCH] Fix ST 5481 USB driver

The old driver was not fully adapted to new USB ABI and does not
work.

Signed-off-by: Karsten Keil <kkeil@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Karsten Keil and committed by Linus Torvalds 61ffcafa 27b2f679

+76 -50
+2 -2
drivers/isdn/hisax/st5481.h
··· 466 466 #define __debug_variable st5481_debug 467 467 #include "hisax_debug.h" 468 468 469 - #ifdef CONFIG_HISAX_DEBUG 470 - 471 469 extern int st5481_debug; 470 + 471 + #ifdef CONFIG_HISAX_DEBUG 472 472 473 473 #define DBG_ISO_PACKET(level,urb) \ 474 474 if (level & __debug_variable) dump_iso_packet(__FUNCTION__,urb)
+14 -8
drivers/isdn/hisax/st5481_b.c
··· 172 172 test_and_clear_bit(buf_nr, &b_out->busy); 173 173 174 174 if (unlikely(urb->status < 0)) { 175 - if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) { 176 - WARN("urb status %d",urb->status); 177 - if (b_out->busy == 0) { 178 - st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL); 179 - } 180 - } else { 181 - DBG(1,"urb killed"); 182 - return; // Give up 175 + switch (urb->status) { 176 + case -ENOENT: 177 + case -ESHUTDOWN: 178 + case -ECONNRESET: 179 + DBG(4,"urb killed status %d", urb->status); 180 + return; // Give up 181 + default: 182 + WARN("urb status %d",urb->status); 183 + if (b_out->busy == 0) { 184 + st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL); 185 + } 186 + break; 183 187 } 184 188 } 185 189 ··· 209 205 bcs->mode = mode; 210 206 211 207 // Cancel all USB transfers on this B channel 208 + b_out->urb[0]->transfer_flags |= URB_ASYNC_UNLINK; 212 209 usb_unlink_urb(b_out->urb[0]); 210 + b_out->urb[1]->transfer_flags |= URB_ASYNC_UNLINK; 213 211 usb_unlink_urb(b_out->urb[1]); 214 212 b_out->busy = 0; 215 213
+15 -11
drivers/isdn/hisax/st5481_d.c
··· 382 382 test_and_clear_bit(buf_nr, &d_out->busy); 383 383 384 384 if (unlikely(urb->status < 0)) { 385 - if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) { 386 - WARN("urb status %d",urb->status); 387 - if (d_out->busy == 0) { 388 - st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter); 389 - } 390 - return; 391 - } else { 392 - DBG(1,"urb killed"); 393 - return; // Give up 385 + switch (urb->status) { 386 + case -ENOENT: 387 + case -ESHUTDOWN: 388 + case -ECONNRESET: 389 + DBG(1,"urb killed status %d", urb->status); 390 + break; 391 + default: 392 + WARN("urb status %d",urb->status); 393 + if (d_out->busy == 0) { 394 + st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter); 395 + } 396 + break; 394 397 } 398 + return; // Give up 395 399 } 396 400 397 401 FsmEvent(&adapter->d_out.fsm, EV_DOUT_COMPLETE, (void *) buf_nr); ··· 713 709 714 710 adapter->l1m.fsm = &l1fsm; 715 711 adapter->l1m.state = ST_L1_F3; 716 - adapter->l1m.debug = 1; 712 + adapter->l1m.debug = st5481_debug & 0x100; 717 713 adapter->l1m.userdata = adapter; 718 714 adapter->l1m.printdebug = l1m_debug; 719 715 FsmInitTimer(&adapter->l1m, &adapter->timer); 720 716 721 717 adapter->d_out.fsm.fsm = &dout_fsm; 722 718 adapter->d_out.fsm.state = ST_DOUT_NONE; 723 - adapter->d_out.fsm.debug = 1; 719 + adapter->d_out.fsm.debug = st5481_debug & 0x100; 724 720 adapter->d_out.fsm.userdata = adapter; 725 721 adapter->d_out.fsm.printdebug = dout_debug; 726 722
+2 -2
drivers/isdn/hisax/st5481_init.c
··· 43 43 module_param(number_of_leds, int, 0); 44 44 45 45 #ifdef CONFIG_HISAX_DEBUG 46 - static int debug = 0x1; 46 + static int debug = 0; 47 47 module_param(debug, int, 0); 48 - int st5481_debug; 49 48 #endif 49 + int st5481_debug; 50 50 51 51 static LIST_HEAD(adapter_list); 52 52
+43 -27
drivers/isdn/hisax/st5481_usb.c
··· 132 132 struct ctrl_msg *ctrl_msg; 133 133 134 134 if (unlikely(urb->status < 0)) { 135 - if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) { 136 - WARN("urb status %d",urb->status); 137 - } else { 138 - DBG(1,"urb killed"); 139 - return; // Give up 135 + switch (urb->status) { 136 + case -ENOENT: 137 + case -ESHUTDOWN: 138 + case -ECONNRESET: 139 + DBG(1,"urb killed status %d", urb->status); 140 + return; // Give up 141 + default: 142 + WARN("urb status %d",urb->status); 143 + break; 140 144 } 141 145 } 142 146 ··· 188 184 int status; 189 185 190 186 switch (urb->status) { 191 - case 0: 192 - /* success */ 193 - break; 194 - case -ECONNRESET: 195 - case -ENOENT: 196 - case -ESHUTDOWN: 197 - /* this urb is terminated, clean up */ 198 - DBG(1, "urb shutting down with status: %d", urb->status); 199 - return; 200 - default: 201 - WARN("nonzero urb status received: %d", urb->status); 202 - goto exit; 187 + case 0: 188 + /* success */ 189 + break; 190 + case -ECONNRESET: 191 + case -ENOENT: 192 + case -ESHUTDOWN: 193 + /* this urb is terminated, clean up */ 194 + DBG(2, "urb shutting down with status: %d", urb->status); 195 + return; 196 + default: 197 + WARN("nonzero urb status received: %d", urb->status); 198 + goto exit; 203 199 } 204 200 205 201 206 - DBG_PACKET(1, data, INT_PKT_SIZE); 202 + DBG_PACKET(2, data, INT_PKT_SIZE); 207 203 208 204 if (urb->actual_length == 0) { 209 205 goto exit; ··· 254 250 struct urb *urb; 255 251 u8 *buf; 256 252 257 - DBG(1,""); 253 + DBG(2,""); 258 254 259 255 if ((status = usb_reset_configuration (dev)) < 0) { 260 256 WARN("reset_configuration failed,status=%d",status); ··· 334 330 DBG(1,""); 335 331 336 332 // Stop and free Control and Interrupt URBs 337 - usb_unlink_urb(ctrl->urb); 333 + usb_kill_urb(ctrl->urb); 338 334 if (ctrl->urb->transfer_buffer) 339 335 kfree(ctrl->urb->transfer_buffer); 340 336 usb_free_urb(ctrl->urb); 337 + ctrl->urb = NULL; 341 338 342 - usb_unlink_urb(intr->urb); 339 + usb_kill_urb(intr->urb); 343 340 if (intr->urb->transfer_buffer) 344 341 kfree(intr->urb->transfer_buffer); 345 342 usb_free_urb(intr->urb); 343 + ctrl->urb = NULL; 346 344 } 347 345 348 346 /* ··· 412 406 spin_lock_init(&urb->lock); 413 407 urb->dev=dev; 414 408 urb->pipe=pipe; 409 + urb->interval = 1; 415 410 urb->transfer_buffer=buf; 416 411 urb->number_of_packets = num_packets; 417 412 urb->transfer_buffer_length=num_packets*packet_size; ··· 459 452 if (urb[j]) { 460 453 if (urb[j]->transfer_buffer) 461 454 kfree(urb[j]->transfer_buffer); 455 + urb[j]->transfer_buffer = NULL; 462 456 usb_free_urb(urb[j]); 457 + urb[j] = NULL; 463 458 } 464 459 } 465 460 return retval; ··· 472 463 int j; 473 464 474 465 for (j = 0; j < 2; j++) { 475 - usb_unlink_urb(urb[j]); 466 + usb_kill_urb(urb[j]); 476 467 if (urb[j]->transfer_buffer) 477 468 kfree(urb[j]->transfer_buffer); 478 469 usb_free_urb(urb[j]); 470 + urb[j] = NULL; 479 471 } 480 472 } 481 473 ··· 495 485 int len, count, status; 496 486 497 487 if (unlikely(urb->status < 0)) { 498 - if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) { 499 - WARN("urb status %d",urb->status); 500 - } else { 501 - DBG(1,"urb killed"); 502 - return; // Give up 488 + switch (urb->status) { 489 + case -ENOENT: 490 + case -ESHUTDOWN: 491 + case -ECONNRESET: 492 + DBG(1,"urb killed status %d", urb->status); 493 + return; // Give up 494 + default: 495 + WARN("urb status %d",urb->status); 496 + break; 503 497 } 504 498 } 505 499 ··· 645 631 646 632 in->mode = mode; 647 633 634 + in->urb[0]->transfer_flags |= URB_ASYNC_UNLINK; 648 635 usb_unlink_urb(in->urb[0]); 636 + in->urb[1]->transfer_flags |= URB_ASYNC_UNLINK; 649 637 usb_unlink_urb(in->urb[1]); 650 638 651 639 if (in->mode != L1_MODE_NULL) {