HiSax: fix error checking for hisax_register()]
This patch (as875) adds error-checking to the callers of hisax_register(). It also changes an error pathway in that routine, making it return an error code rather than 0. This fixes Bugzilla #7960. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Karsten Keil <kkeil@suse.de> Cc: Martin Bachem <info@colognechip.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9d9a2000e6
commit
ae2d990eed
|
@ -1551,7 +1551,7 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
|
|||
if (retval == 0) { // yuck
|
||||
cards[i].typ = 0;
|
||||
nrcards--;
|
||||
return retval;
|
||||
return -EINVAL;
|
||||
}
|
||||
cs = cards[i].cs;
|
||||
hisax_d_if->cs = cs;
|
||||
|
|
|
@ -485,7 +485,6 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
|
|||
{
|
||||
int k;
|
||||
|
||||
spin_lock_init(&urb->lock);
|
||||
urb->dev = dev;
|
||||
urb->pipe = pipe;
|
||||
urb->complete = complete;
|
||||
|
@ -578,16 +577,14 @@ stop_isoc_chain(usb_fifo * fifo)
|
|||
"HFC-S USB: Stopping iso chain for fifo %i.%i",
|
||||
fifo->fifonum, i);
|
||||
#endif
|
||||
usb_unlink_urb(fifo->iso[i].purb);
|
||||
usb_kill_urb(fifo->iso[i].purb);
|
||||
usb_free_urb(fifo->iso[i].purb);
|
||||
fifo->iso[i].purb = NULL;
|
||||
}
|
||||
}
|
||||
if (fifo->urb) {
|
||||
usb_unlink_urb(fifo->urb);
|
||||
usb_kill_urb(fifo->urb);
|
||||
usb_free_urb(fifo->urb);
|
||||
fifo->urb = NULL;
|
||||
}
|
||||
fifo->active = 0;
|
||||
}
|
||||
|
||||
|
@ -1305,7 +1302,11 @@ usb_init(hfcusb_data * hfc)
|
|||
}
|
||||
/* default Prot: EURO ISDN, should be a module_param */
|
||||
hfc->protocol = 2;
|
||||
hisax_register(&hfc->d_if, p_b_if, "hfc_usb", hfc->protocol);
|
||||
i = hisax_register(&hfc->d_if, p_b_if, "hfc_usb", hfc->protocol);
|
||||
if (i) {
|
||||
printk(KERN_INFO "HFC-S USB: hisax_register -> %d\n", i);
|
||||
return i;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HISAX_DEBUG
|
||||
hfc_debug = debug;
|
||||
|
@ -1626,11 +1627,9 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||
#endif
|
||||
/* init the chip and register the driver */
|
||||
if (usb_init(context)) {
|
||||
if (context->ctrl_urb) {
|
||||
usb_unlink_urb(context->ctrl_urb);
|
||||
usb_kill_urb(context->ctrl_urb);
|
||||
usb_free_urb(context->ctrl_urb);
|
||||
context->ctrl_urb = NULL;
|
||||
}
|
||||
kfree(context);
|
||||
return (-EIO);
|
||||
}
|
||||
|
@ -1682,21 +1681,15 @@ hfc_usb_disconnect(struct usb_interface
|
|||
i);
|
||||
#endif
|
||||
}
|
||||
if (context->fifos[i].urb) {
|
||||
usb_unlink_urb(context->fifos[i].urb);
|
||||
usb_kill_urb(context->fifos[i].urb);
|
||||
usb_free_urb(context->fifos[i].urb);
|
||||
context->fifos[i].urb = NULL;
|
||||
}
|
||||
}
|
||||
context->fifos[i].active = 0;
|
||||
}
|
||||
/* wait for all URBS to terminate */
|
||||
mdelay(10);
|
||||
if (context->ctrl_urb) {
|
||||
usb_unlink_urb(context->ctrl_urb);
|
||||
usb_kill_urb(context->ctrl_urb);
|
||||
usb_free_urb(context->ctrl_urb);
|
||||
context->ctrl_urb = NULL;
|
||||
}
|
||||
hisax_unregister(&context->d_if);
|
||||
kfree(context); /* free our structure again */
|
||||
} /* hfc_usb_disconnect */
|
||||
|
|
|
@ -859,7 +859,11 @@ new_adapter(void)
|
|||
for (i = 0; i < 2; i++)
|
||||
b_if[i] = &adapter->bcs[i].b_if;
|
||||
|
||||
hisax_register(&adapter->isac.hisax_d_if, b_if, "fcpcipnp", protocol);
|
||||
if (hisax_register(&adapter->isac.hisax_d_if, b_if, "fcpcipnp",
|
||||
protocol) != 0) {
|
||||
kfree(adapter);
|
||||
adapter = NULL;
|
||||
}
|
||||
|
||||
return adapter;
|
||||
}
|
||||
|
|
|
@ -107,12 +107,17 @@ static int probe_st5481(struct usb_interface *intf,
|
|||
for (i = 0; i < 2; i++)
|
||||
b_if[i] = &adapter->bcs[i].b_if;
|
||||
|
||||
hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb", protocol);
|
||||
if (hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb",
|
||||
protocol) != 0)
|
||||
goto err_b1;
|
||||
|
||||
st5481_start(adapter);
|
||||
|
||||
usb_set_intfdata(intf, adapter);
|
||||
return 0;
|
||||
|
||||
err_b1:
|
||||
st5481_release_b(&adapter->bcs[1]);
|
||||
err_b:
|
||||
st5481_release_b(&adapter->bcs[0]);
|
||||
err_d:
|
||||
|
|
|
@ -407,7 +407,6 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev,
|
|||
{
|
||||
int k;
|
||||
|
||||
spin_lock_init(&urb->lock);
|
||||
urb->dev=dev;
|
||||
urb->pipe=pipe;
|
||||
urb->interval = 1;
|
||||
|
|
Loading…
Reference in New Issue