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