Commit c652cbd8 authored by Tilman Schmidt's avatar Tilman Schmidt Committed by Linus Torvalds

gigaset: code cleanups

Some cleanups to the bas-gigaset and usb-gigaset USB ISDN drivers:
- simplified error handling
- improved debug messages
- readability improvements
- removal of obsolete defines and comments
Signed-off-by: default avatarTilman Schmidt <tilman@imap.cc>
Cc: Greg KH <gregkh@suse.de>
Cc: Hansjoerg Lipp <hjlipp@web.de>
Cc: Karsten Keil <kkeil@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dbd98231
...@@ -938,15 +938,15 @@ static int starturbs(struct bc_state *bcs) ...@@ -938,15 +938,15 @@ static int starturbs(struct bc_state *bcs)
ubc->isoouturbs[k].limit = -1; ubc->isoouturbs[k].limit = -1;
} }
/* submit two URBs, keep third one */ /* keep one URB free, submit the others */
for (k = 0; k < 2; ++k) { for (k = 0; k < BAS_OUTURBS-1; ++k) {
dump_urb(DEBUG_ISO, "Initial isoc write", urb); dump_urb(DEBUG_ISO, "Initial isoc write", urb);
rc = usb_submit_urb(ubc->isoouturbs[k].urb, GFP_ATOMIC); rc = usb_submit_urb(ubc->isoouturbs[k].urb, GFP_ATOMIC);
if (rc != 0) if (rc != 0)
goto error; goto error;
} }
dump_urb(DEBUG_ISO, "Initial isoc write (free)", urb); dump_urb(DEBUG_ISO, "Initial isoc write (free)", urb);
ubc->isooutfree = &ubc->isoouturbs[2]; ubc->isooutfree = &ubc->isoouturbs[BAS_OUTURBS-1];
ubc->isooutdone = ubc->isooutovfl = NULL; ubc->isooutdone = ubc->isooutovfl = NULL;
return 0; return 0;
error: error:
...@@ -1559,37 +1559,38 @@ static int req_submit(struct bc_state *bcs, int req, int val, int timeout) ...@@ -1559,37 +1559,38 @@ static int req_submit(struct bc_state *bcs, int req, int val, int timeout)
*/ */
static int gigaset_init_bchannel(struct bc_state *bcs) static int gigaset_init_bchannel(struct bc_state *bcs)
{ {
struct cardstate *cs = bcs->cs;
int req, ret; int req, ret;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&bcs->cs->lock, flags); spin_lock_irqsave(&cs->lock, flags);
if (unlikely(!bcs->cs->connected)) { if (unlikely(!cs->connected)) {
gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__); gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__);
spin_unlock_irqrestore(&bcs->cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
return -ENODEV; return -ENODEV;
} }
if ((ret = starturbs(bcs)) < 0) { if ((ret = starturbs(bcs)) < 0) {
dev_err(bcs->cs->dev, dev_err(cs->dev,
"could not start isochronous I/O for channel B%d: %s\n", "could not start isochronous I/O for channel B%d: %s\n",
bcs->channel + 1, bcs->channel + 1,
ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret)); ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret));
if (ret != -ENODEV) if (ret != -ENODEV)
error_hangup(bcs); error_hangup(bcs);
spin_unlock_irqrestore(&bcs->cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
return ret; return ret;
} }
req = bcs->channel ? HD_OPEN_B2CHANNEL : HD_OPEN_B1CHANNEL; req = bcs->channel ? HD_OPEN_B2CHANNEL : HD_OPEN_B1CHANNEL;
if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) { if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) {
dev_err(bcs->cs->dev, "could not open channel B%d\n", dev_err(cs->dev, "could not open channel B%d\n",
bcs->channel + 1); bcs->channel + 1);
stopurbs(bcs->hw.bas); stopurbs(bcs->hw.bas);
if (ret != -ENODEV) if (ret != -ENODEV)
error_hangup(bcs); error_hangup(bcs);
} }
spin_unlock_irqrestore(&bcs->cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
return ret; return ret;
} }
...@@ -1605,20 +1606,21 @@ static int gigaset_init_bchannel(struct bc_state *bcs) ...@@ -1605,20 +1606,21 @@ static int gigaset_init_bchannel(struct bc_state *bcs)
*/ */
static int gigaset_close_bchannel(struct bc_state *bcs) static int gigaset_close_bchannel(struct bc_state *bcs)
{ {
struct cardstate *cs = bcs->cs;
int req, ret; int req, ret;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&bcs->cs->lock, flags); spin_lock_irqsave(&cs->lock, flags);
if (unlikely(!bcs->cs->connected)) { if (unlikely(!cs->connected)) {
spin_unlock_irqrestore(&bcs->cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__); gig_dbg(DEBUG_USBREQ, "%s: not connected", __func__);
return -ENODEV; return -ENODEV;
} }
if (!(atomic_read(&bcs->cs->hw.bas->basstate) & if (!(atomic_read(&cs->hw.bas->basstate) &
(bcs->channel ? BS_B2OPEN : BS_B1OPEN))) { (bcs->channel ? BS_B2OPEN : BS_B1OPEN))) {
/* channel not running: just signal common.c */ /* channel not running: just signal common.c */
spin_unlock_irqrestore(&bcs->cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
gigaset_bchannel_down(bcs); gigaset_bchannel_down(bcs);
return 0; return 0;
} }
...@@ -1626,10 +1628,10 @@ static int gigaset_close_bchannel(struct bc_state *bcs) ...@@ -1626,10 +1628,10 @@ static int gigaset_close_bchannel(struct bc_state *bcs)
/* channel running: tell device to close it */ /* channel running: tell device to close it */
req = bcs->channel ? HD_CLOSE_B2CHANNEL : HD_CLOSE_B1CHANNEL; req = bcs->channel ? HD_CLOSE_B2CHANNEL : HD_CLOSE_B1CHANNEL;
if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0) if ((ret = req_submit(bcs, req, 0, BAS_TIMEOUT)) < 0)
dev_err(bcs->cs->dev, "closing channel B%d failed\n", dev_err(cs->dev, "closing channel B%d failed\n",
bcs->channel + 1); bcs->channel + 1);
spin_unlock_irqrestore(&bcs->cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
return ret; return ret;
} }
...@@ -2114,7 +2116,7 @@ static void freeurbs(struct cardstate *cs) ...@@ -2114,7 +2116,7 @@ static void freeurbs(struct cardstate *cs)
int i, j; int i, j;
gig_dbg(DEBUG_INIT, "%s: killing URBs", __func__); gig_dbg(DEBUG_INIT, "%s: killing URBs", __func__);
for (j = 0; j < 2; ++j) { for (j = 0; j < BAS_CHANNELS; ++j) {
ubc = cs->bcs[j].hw.bas; ubc = cs->bcs[j].hw.bas;
for (i = 0; i < BAS_OUTURBS; ++i) { for (i = 0; i < BAS_OUTURBS; ++i) {
usb_kill_urb(ubc->isoouturbs[i].urb); usb_kill_urb(ubc->isoouturbs[i].urb);
...@@ -2215,7 +2217,7 @@ static int gigaset_probe(struct usb_interface *interface, ...@@ -2215,7 +2217,7 @@ static int gigaset_probe(struct usb_interface *interface,
!(ucs->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL))) !(ucs->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL)))
goto allocerr; goto allocerr;
for (j = 0; j < 2; ++j) { for (j = 0; j < BAS_CHANNELS; ++j) {
ubc = cs->bcs[j].hw.bas; ubc = cs->bcs[j].hw.bas;
for (i = 0; i < BAS_OUTURBS; ++i) for (i = 0; i < BAS_OUTURBS; ++i)
if (!(ubc->isoouturbs[i].urb = if (!(ubc->isoouturbs[i].urb =
...@@ -2287,8 +2289,7 @@ static void gigaset_disconnect(struct usb_interface *interface) ...@@ -2287,8 +2289,7 @@ static void gigaset_disconnect(struct usb_interface *interface)
atomic_set(&ucs->basstate, 0); atomic_set(&ucs->basstate, 0);
/* tell LL all channels are down */ /* tell LL all channels are down */
//FIXME shouldn't gigaset_stop() do this? for (j = 0; j < BAS_CHANNELS; ++j)
for (j = 0; j < 2; ++j)
gigaset_bchannel_down(cs->bcs + j); gigaset_bchannel_down(cs->bcs + j);
/* stop driver (common part) */ /* stop driver (common part) */
...@@ -2343,7 +2344,7 @@ static int __init bas_gigaset_init(void) ...@@ -2343,7 +2344,7 @@ static int __init bas_gigaset_init(void)
goto error; goto error;
/* allocate memory for our device state and intialize it */ /* allocate memory for our device state and intialize it */
cardstate = gigaset_initcs(driver, 2, 0, 0, cidmode, cardstate = gigaset_initcs(driver, BAS_CHANNELS, 0, 0, cidmode,
GIGASET_MODULENAME); GIGASET_MODULENAME);
if (!cardstate) if (!cardstate)
goto error; goto error;
......
...@@ -70,22 +70,13 @@ ...@@ -70,22 +70,13 @@
extern int gigaset_debuglevel; /* "needs" cast to (enum debuglevel) */ extern int gigaset_debuglevel; /* "needs" cast to (enum debuglevel) */
/* any combination of these can be given with the 'debug=' parameter to insmod, /* debug flags, combine by adding/bitwise OR */
* e.g. 'insmod usb_gigaset.o debug=0x2c' will set DEBUG_OPEN, DEBUG_CMD and
* DEBUG_INTR.
*/
enum debuglevel { enum debuglevel {
DEBUG_REG = 0x0002, /* serial port I/O register operations */ DEBUG_INTR = 0x00008, /* interrupt processing */
DEBUG_OPEN = 0x0004, /* open/close serial port */
DEBUG_INTR = 0x0008, /* interrupt processing */
DEBUG_INTR_DUMP = 0x0010, /* Activating hexdump debug output on
interrupt requests, not available as
run-time option */
DEBUG_CMD = 0x00020, /* sent/received LL commands */ DEBUG_CMD = 0x00020, /* sent/received LL commands */
DEBUG_STREAM = 0x00040, /* application data stream I/O events */ DEBUG_STREAM = 0x00040, /* application data stream I/O events */
DEBUG_STREAM_DUMP = 0x00080, /* application data stream content */ DEBUG_STREAM_DUMP = 0x00080, /* application data stream content */
DEBUG_LLDATA = 0x00100, /* sent/received LL data */ DEBUG_LLDATA = 0x00100, /* sent/received LL data */
DEBUG_INTR_0 = 0x00200, /* serial port interrupt processing */
DEBUG_DRIVER = 0x00400, /* driver structure */ DEBUG_DRIVER = 0x00400, /* driver structure */
DEBUG_HDLC = 0x00800, /* M10x HDLC processing */ DEBUG_HDLC = 0x00800, /* M10x HDLC processing */
DEBUG_WRITE = 0x01000, /* M105 data write */ DEBUG_WRITE = 0x01000, /* M105 data write */
...@@ -93,7 +84,7 @@ enum debuglevel { ...@@ -93,7 +84,7 @@ enum debuglevel {
DEBUG_MCMD = 0x04000, /* COMMANDS THAT ARE SENT VERY OFTEN */ DEBUG_MCMD = 0x04000, /* COMMANDS THAT ARE SENT VERY OFTEN */
DEBUG_INIT = 0x08000, /* (de)allocation+initialization of data DEBUG_INIT = 0x08000, /* (de)allocation+initialization of data
structures */ structures */
DEBUG_LOCK = 0x10000, /* semaphore operations */ DEBUG_SUSPEND = 0x10000, /* suspend/resume processing */
DEBUG_OUTPUT = 0x20000, /* output to device */ DEBUG_OUTPUT = 0x20000, /* output to device */
DEBUG_ISO = 0x40000, /* isochronous transfers */ DEBUG_ISO = 0x40000, /* isochronous transfers */
DEBUG_IF = 0x80000, /* character device operations */ DEBUG_IF = 0x80000, /* character device operations */
...@@ -191,6 +182,9 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, ...@@ -191,6 +182,9 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
#define HD_OPEN_ATCHANNEL (0x28) // 3070 #define HD_OPEN_ATCHANNEL (0x28) // 3070
#define HD_CLOSE_ATCHANNEL (0x29) // 3070 #define HD_CLOSE_ATCHANNEL (0x29) // 3070
/* number of B channels supported by base driver */
#define BAS_CHANNELS 2
/* USB frames for isochronous transfer */ /* USB frames for isochronous transfer */
#define BAS_FRAMETIME 1 /* number of milliseconds between frames */ #define BAS_FRAMETIME 1 /* number of milliseconds between frames */
#define BAS_NUMFRAMES 8 /* number of frames per URB */ #define BAS_NUMFRAMES 8 /* number of frames per URB */
......
...@@ -104,6 +104,7 @@ MODULE_DEVICE_TABLE(usb, gigaset_table); ...@@ -104,6 +104,7 @@ MODULE_DEVICE_TABLE(usb, gigaset_table);
* flags per packet. * flags per packet.
*/ */
/* functions called if a device of this driver is connected/disconnected */
static int gigaset_probe(struct usb_interface *interface, static int gigaset_probe(struct usb_interface *interface,
const struct usb_device_id *id); const struct usb_device_id *id);
static void gigaset_disconnect(struct usb_interface *interface); static void gigaset_disconnect(struct usb_interface *interface);
...@@ -362,18 +363,12 @@ static void gigaset_read_int_callback(struct urb *urb) ...@@ -362,18 +363,12 @@ static void gigaset_read_int_callback(struct urb *urb)
struct inbuf_t *inbuf = urb->context; struct inbuf_t *inbuf = urb->context;
struct cardstate *cs = inbuf->cs; struct cardstate *cs = inbuf->cs;
int status = urb->status; int status = urb->status;
int resubmit = 0;
int r; int r;
unsigned numbytes; unsigned numbytes;
unsigned char *src; unsigned char *src;
unsigned long flags; unsigned long flags;
if (!status) { if (!status) {
if (!cs->connected) {
err("%s: disconnected", __func__); /* should never happen */
return;
}
numbytes = urb->actual_length; numbytes = urb->actual_length;
if (numbytes) { if (numbytes) {
...@@ -390,28 +385,26 @@ static void gigaset_read_int_callback(struct urb *urb) ...@@ -390,28 +385,26 @@ static void gigaset_read_int_callback(struct urb *urb)
} }
} else } else
gig_dbg(DEBUG_INTR, "Received zero block length"); gig_dbg(DEBUG_INTR, "Received zero block length");
resubmit = 1;
} else { } else {
/* The urb might have been killed. */ /* The urb might have been killed. */
gig_dbg(DEBUG_ANY, "%s - nonzero read bulk status received: %d", gig_dbg(DEBUG_ANY, "%s - nonzero status received: %d",
__func__, status); __func__, status);
if (status != -ENOENT) { /* not killed */ if (status == -ENOENT || status == -ESHUTDOWN)
if (!cs->connected) { /* killed or endpoint shutdown: don't resubmit */
err("%s: disconnected", __func__); /* should never happen */ return;
return;
}
resubmit = 1;
}
} }
if (resubmit) { /* resubmit URB */
spin_lock_irqsave(&cs->lock, flags); spin_lock_irqsave(&cs->lock, flags);
r = cs->connected ? usb_submit_urb(urb, GFP_ATOMIC) : -ENODEV; if (!cs->connected) {
spin_unlock_irqrestore(&cs->lock, flags); spin_unlock_irqrestore(&cs->lock, flags);
if (r) err("%s: disconnected", __func__);
dev_err(cs->dev, "error %d when resubmitting urb.\n", return;
-r);
} }
r = usb_submit_urb(urb, GFP_ATOMIC);
spin_unlock_irqrestore(&cs->lock, flags);
if (r)
dev_err(cs->dev, "error %d resubmitting URB\n", -r);
} }
...@@ -422,11 +415,19 @@ static void gigaset_write_bulk_callback(struct urb *urb) ...@@ -422,11 +415,19 @@ static void gigaset_write_bulk_callback(struct urb *urb)
int status = urb->status; int status = urb->status;
unsigned long flags; unsigned long flags;
if (status) switch (status) {
case 0: /* normal completion */
break;
case -ENOENT: /* killed */
gig_dbg(DEBUG_ANY, "%s: killed", __func__);
atomic_set(&cs->hw.usb->busy, 0);
return;
default:
dev_err(cs->dev, "bulk transfer failed (status %d)\n", dev_err(cs->dev, "bulk transfer failed (status %d)\n",
-status); -status);
/* That's all we can do. Communication problems /* That's all we can do. Communication problems
are handled by timeouts or network protocols. */ are handled by timeouts or network protocols. */
}
spin_lock_irqsave(&cs->lock, flags); spin_lock_irqsave(&cs->lock, flags);
if (!cs->connected) { if (!cs->connected) {
...@@ -682,43 +683,35 @@ static int gigaset_probe(struct usb_interface *interface, ...@@ -682,43 +683,35 @@ static int gigaset_probe(struct usb_interface *interface,
{ {
int retval; int retval;
struct usb_device *udev = interface_to_usbdev(interface); struct usb_device *udev = interface_to_usbdev(interface);
unsigned int ifnum; struct usb_host_interface *hostif = interface->cur_altsetting;
struct usb_host_interface *hostif;
struct cardstate *cs = NULL; struct cardstate *cs = NULL;
struct usb_cardstate *ucs = NULL; struct usb_cardstate *ucs = NULL;
struct usb_endpoint_descriptor *endpoint; struct usb_endpoint_descriptor *endpoint;
int buffer_size; int buffer_size;
int alt;
gig_dbg(DEBUG_ANY,
"%s: Check if device matches .. (Vendor: 0x%x, Product: 0x%x)",
__func__, le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct));
retval = -ENODEV; //FIXME gig_dbg(DEBUG_ANY, "%s: Check if device matches ...", __func__);
/* See if the device offered us matches what we can accept */ /* See if the device offered us matches what we can accept */
if ((le16_to_cpu(udev->descriptor.idVendor) != USB_M105_VENDOR_ID) || if ((le16_to_cpu(udev->descriptor.idVendor) != USB_M105_VENDOR_ID) ||
(le16_to_cpu(udev->descriptor.idProduct) != USB_M105_PRODUCT_ID)) (le16_to_cpu(udev->descriptor.idProduct) != USB_M105_PRODUCT_ID)) {
gig_dbg(DEBUG_ANY, "device ID (0x%x, 0x%x) not for me - skip",
le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct));
return -ENODEV; return -ENODEV;
}
/* this starts to become ascii art... */ if (hostif->desc.bInterfaceNumber != 0) {
hostif = interface->cur_altsetting; gig_dbg(DEBUG_ANY, "interface %d not for me - skip",
alt = hostif->desc.bAlternateSetting; hostif->desc.bInterfaceNumber);
ifnum = hostif->desc.bInterfaceNumber; // FIXME ? return -ENODEV;
}
if (alt != 0 || ifnum != 0) { if (hostif->desc.bAlternateSetting != 0) {
dev_warn(&udev->dev, "ifnum %d, alt %d\n", ifnum, alt); dev_notice(&udev->dev, "unsupported altsetting %d - skip",
hostif->desc.bAlternateSetting);
return -ENODEV; return -ENODEV;
} }
/* Reject application specific intefaces
*
*/
if (hostif->desc.bInterfaceClass != 255) { if (hostif->desc.bInterfaceClass != 255) {
dev_info(&udev->dev, dev_notice(&udev->dev, "unsupported interface class %d - skip",
"%s: Device matched but iface_desc[%d]->bInterfaceClass==%d!\n", hostif->desc.bInterfaceClass);
__func__, ifnum, hostif->desc.bInterfaceClass);
return -ENODEV; return -ENODEV;
} }
...@@ -826,6 +819,9 @@ static void gigaset_disconnect(struct usb_interface *interface) ...@@ -826,6 +819,9 @@ static void gigaset_disconnect(struct usb_interface *interface)
cs = usb_get_intfdata(interface); cs = usb_get_intfdata(interface);
ucs = cs->hw.usb; ucs = cs->hw.usb;
dev_info(cs->dev, "disconnecting Gigaset USB adapter\n");
usb_kill_urb(ucs->read_urb); usb_kill_urb(ucs->read_urb);
gigaset_stop(cs); gigaset_stop(cs);
...@@ -833,7 +829,7 @@ static void gigaset_disconnect(struct usb_interface *interface) ...@@ -833,7 +829,7 @@ static void gigaset_disconnect(struct usb_interface *interface)
usb_set_intfdata(interface, NULL); usb_set_intfdata(interface, NULL);
tasklet_kill(&cs->write_tasklet); tasklet_kill(&cs->write_tasklet);
usb_kill_urb(ucs->bulk_out_urb); /* FIXME: only if active? */ usb_kill_urb(ucs->bulk_out_urb);
kfree(ucs->bulk_out_buffer); kfree(ucs->bulk_out_buffer);
usb_free_urb(ucs->bulk_out_urb); usb_free_urb(ucs->bulk_out_urb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment