V4L/DVB: gspca_main: some input error handling fixes

2 small changes to input device error handling:
1) Make it fatal when we fail to create an input device (it is either this
   or add checks for gspca_dev->input_dev being NULL in a lot of places)
2) Since we allow gspca_input_create_urb() to fail everywhere we call it,
   and thus never check its return value, make it void.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Hans de Goede 2010-02-19 04:41:40 -03:00 committed by Mauro Carvalho Chehab
parent ac82f59f9c
commit 10ee240200

View file

@ -184,8 +184,7 @@ static int gspca_input_connect(struct gspca_dev *dev)
} else { } else {
dev->input_dev = input_dev; dev->input_dev = input_dev;
} }
} else }
err = -EINVAL;
return err; return err;
} }
@ -243,9 +242,8 @@ error:
return ret; return ret;
} }
static int gspca_input_create_urb(struct gspca_dev *gspca_dev) static void gspca_input_create_urb(struct gspca_dev *gspca_dev)
{ {
int ret = -EINVAL;
struct usb_interface *intf; struct usb_interface *intf;
struct usb_host_interface *intf_desc; struct usb_host_interface *intf_desc;
struct usb_endpoint_descriptor *ep; struct usb_endpoint_descriptor *ep;
@ -259,12 +257,11 @@ static int gspca_input_create_urb(struct gspca_dev *gspca_dev)
if (usb_endpoint_dir_in(ep) && if (usb_endpoint_dir_in(ep) &&
usb_endpoint_xfer_int(ep)) { usb_endpoint_xfer_int(ep)) {
ret = alloc_and_submit_int_urb(gspca_dev, ep); alloc_and_submit_int_urb(gspca_dev, ep);
break; break;
} }
} }
} }
return ret;
} }
static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev) static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev)
@ -2289,6 +2286,10 @@ int gspca_dev_probe(struct usb_interface *intf,
goto out; goto out;
gspca_set_default_mode(gspca_dev); gspca_set_default_mode(gspca_dev);
ret = gspca_input_connect(gspca_dev);
if (ret)
goto out;
mutex_init(&gspca_dev->usb_lock); mutex_init(&gspca_dev->usb_lock);
mutex_init(&gspca_dev->read_lock); mutex_init(&gspca_dev->read_lock);
mutex_init(&gspca_dev->queue_lock); mutex_init(&gspca_dev->queue_lock);
@ -2310,12 +2311,12 @@ int gspca_dev_probe(struct usb_interface *intf,
usb_set_intfdata(intf, gspca_dev); usb_set_intfdata(intf, gspca_dev);
PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev)); PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev));
ret = gspca_input_connect(gspca_dev); gspca_input_create_urb(gspca_dev);
if (ret == 0)
ret = gspca_input_create_urb(gspca_dev);
return 0; return 0;
out: out:
if (gspca_dev->input_dev)
input_unregister_device(gspca_dev->input_dev);
kfree(gspca_dev->usb_buf); kfree(gspca_dev->usb_buf);
kfree(gspca_dev); kfree(gspca_dev);
return ret; return ret;