Skip to content

Commit

Permalink
[PATCH] Fix ST 5481 USB driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Karsten Keil authored and Linus Torvalds committed Sep 17, 2005
1 parent 27b2f67 commit 61ffcaf
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 50 deletions.
4 changes: 2 additions & 2 deletions drivers/isdn/hisax/st5481.h
Original file line number Diff line number Diff line change
Expand Up @@ -466,10 +466,10 @@ void st5481_stop(struct st5481_adapter *adapter);
#define __debug_variable st5481_debug
#include "hisax_debug.h"

#ifdef CONFIG_HISAX_DEBUG

extern int st5481_debug;

#ifdef CONFIG_HISAX_DEBUG

#define DBG_ISO_PACKET(level,urb) \
if (level & __debug_variable) dump_iso_packet(__FUNCTION__,urb)

Expand Down
22 changes: 14 additions & 8 deletions drivers/isdn/hisax/st5481_b.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,14 +172,18 @@ static void usb_b_out_complete(struct urb *urb, struct pt_regs *regs)
test_and_clear_bit(buf_nr, &b_out->busy);

if (unlikely(urb->status < 0)) {
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
WARN("urb status %d",urb->status);
if (b_out->busy == 0) {
st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL);
}
} else {
DBG(1,"urb killed");
return; // Give up
switch (urb->status) {
case -ENOENT:
case -ESHUTDOWN:
case -ECONNRESET:
DBG(4,"urb killed status %d", urb->status);
return; // Give up
default:
WARN("urb status %d",urb->status);
if (b_out->busy == 0) {
st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL);
}
break;
}
}

Expand All @@ -205,7 +209,9 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
bcs->mode = mode;

// Cancel all USB transfers on this B channel
b_out->urb[0]->transfer_flags |= URB_ASYNC_UNLINK;
usb_unlink_urb(b_out->urb[0]);
b_out->urb[1]->transfer_flags |= URB_ASYNC_UNLINK;
usb_unlink_urb(b_out->urb[1]);
b_out->busy = 0;

Expand Down
26 changes: 15 additions & 11 deletions drivers/isdn/hisax/st5481_d.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,16 +382,20 @@ static void usb_d_out_complete(struct urb *urb, struct pt_regs *regs)
test_and_clear_bit(buf_nr, &d_out->busy);

if (unlikely(urb->status < 0)) {
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
WARN("urb status %d",urb->status);
if (d_out->busy == 0) {
st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
}
return;
} else {
DBG(1,"urb killed");
return; // Give up
switch (urb->status) {
case -ENOENT:
case -ESHUTDOWN:
case -ECONNRESET:
DBG(1,"urb killed status %d", urb->status);
break;
default:
WARN("urb status %d",urb->status);
if (d_out->busy == 0) {
st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
}
break;
}
return; // Give up
}

FsmEvent(&adapter->d_out.fsm, EV_DOUT_COMPLETE, (void *) buf_nr);
Expand Down Expand Up @@ -709,14 +713,14 @@ int st5481_setup_d(struct st5481_adapter *adapter)

adapter->l1m.fsm = &l1fsm;
adapter->l1m.state = ST_L1_F3;
adapter->l1m.debug = 1;
adapter->l1m.debug = st5481_debug & 0x100;
adapter->l1m.userdata = adapter;
adapter->l1m.printdebug = l1m_debug;
FsmInitTimer(&adapter->l1m, &adapter->timer);

adapter->d_out.fsm.fsm = &dout_fsm;
adapter->d_out.fsm.state = ST_DOUT_NONE;
adapter->d_out.fsm.debug = 1;
adapter->d_out.fsm.debug = st5481_debug & 0x100;
adapter->d_out.fsm.userdata = adapter;
adapter->d_out.fsm.printdebug = dout_debug;

Expand Down
4 changes: 2 additions & 2 deletions drivers/isdn/hisax/st5481_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@ static int number_of_leds = 2; /* 2 LEDs on the adpater default */
module_param(number_of_leds, int, 0);

#ifdef CONFIG_HISAX_DEBUG
static int debug = 0x1;
static int debug = 0;
module_param(debug, int, 0);
int st5481_debug;
#endif
int st5481_debug;

static LIST_HEAD(adapter_list);

Expand Down
70 changes: 43 additions & 27 deletions drivers/isdn/hisax/st5481_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,15 @@ static void usb_ctrl_complete(struct urb *urb, struct pt_regs *regs)
struct ctrl_msg *ctrl_msg;

if (unlikely(urb->status < 0)) {
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
WARN("urb status %d",urb->status);
} else {
DBG(1,"urb killed");
return; // Give up
switch (urb->status) {
case -ENOENT:
case -ESHUTDOWN:
case -ECONNRESET:
DBG(1,"urb killed status %d", urb->status);
return; // Give up
default:
WARN("urb status %d",urb->status);
break;
}
}

Expand Down Expand Up @@ -184,22 +188,22 @@ static void usb_int_complete(struct urb *urb, struct pt_regs *regs)
int status;

switch (urb->status) {
case 0:
/* success */
break;
case -ECONNRESET:
case -ENOENT:
case -ESHUTDOWN:
/* this urb is terminated, clean up */
DBG(1, "urb shutting down with status: %d", urb->status);
return;
default:
WARN("nonzero urb status received: %d", urb->status);
goto exit;
case 0:
/* success */
break;
case -ECONNRESET:
case -ENOENT:
case -ESHUTDOWN:
/* this urb is terminated, clean up */
DBG(2, "urb shutting down with status: %d", urb->status);
return;
default:
WARN("nonzero urb status received: %d", urb->status);
goto exit;
}


DBG_PACKET(1, data, INT_PKT_SIZE);
DBG_PACKET(2, data, INT_PKT_SIZE);

if (urb->actual_length == 0) {
goto exit;
Expand Down Expand Up @@ -250,7 +254,7 @@ int st5481_setup_usb(struct st5481_adapter *adapter)
struct urb *urb;
u8 *buf;

DBG(1,"");
DBG(2,"");

if ((status = usb_reset_configuration (dev)) < 0) {
WARN("reset_configuration failed,status=%d",status);
Expand Down Expand Up @@ -330,15 +334,17 @@ void st5481_release_usb(struct st5481_adapter *adapter)
DBG(1,"");

// Stop and free Control and Interrupt URBs
usb_unlink_urb(ctrl->urb);
usb_kill_urb(ctrl->urb);
if (ctrl->urb->transfer_buffer)
kfree(ctrl->urb->transfer_buffer);
usb_free_urb(ctrl->urb);
ctrl->urb = NULL;

usb_unlink_urb(intr->urb);
usb_kill_urb(intr->urb);
if (intr->urb->transfer_buffer)
kfree(intr->urb->transfer_buffer);
usb_free_urb(intr->urb);
ctrl->urb = NULL;
}

/*
Expand Down Expand Up @@ -406,6 +412,7 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev,
spin_lock_init(&urb->lock);
urb->dev=dev;
urb->pipe=pipe;
urb->interval = 1;
urb->transfer_buffer=buf;
urb->number_of_packets = num_packets;
urb->transfer_buffer_length=num_packets*packet_size;
Expand Down Expand Up @@ -452,7 +459,9 @@ st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev,
if (urb[j]) {
if (urb[j]->transfer_buffer)
kfree(urb[j]->transfer_buffer);
urb[j]->transfer_buffer = NULL;
usb_free_urb(urb[j]);
urb[j] = NULL;
}
}
return retval;
Expand All @@ -463,10 +472,11 @@ void st5481_release_isocpipes(struct urb* urb[2])
int j;

for (j = 0; j < 2; j++) {
usb_unlink_urb(urb[j]);
usb_kill_urb(urb[j]);
if (urb[j]->transfer_buffer)
kfree(urb[j]->transfer_buffer);
usb_free_urb(urb[j]);
urb[j] = NULL;
}
}

Expand All @@ -485,11 +495,15 @@ static void usb_in_complete(struct urb *urb, struct pt_regs *regs)
int len, count, status;

if (unlikely(urb->status < 0)) {
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
WARN("urb status %d",urb->status);
} else {
DBG(1,"urb killed");
return; // Give up
switch (urb->status) {
case -ENOENT:
case -ESHUTDOWN:
case -ECONNRESET:
DBG(1,"urb killed status %d", urb->status);
return; // Give up
default:
WARN("urb status %d",urb->status);
break;
}
}

Expand Down Expand Up @@ -631,7 +645,9 @@ void st5481_in_mode(struct st5481_in *in, int mode)

in->mode = mode;

in->urb[0]->transfer_flags |= URB_ASYNC_UNLINK;
usb_unlink_urb(in->urb[0]);
in->urb[1]->transfer_flags |= URB_ASYNC_UNLINK;
usb_unlink_urb(in->urb[1]);

if (in->mode != L1_MODE_NULL) {
Expand Down

0 comments on commit 61ffcaf

Please sign in to comment.