Commit 836e2548 authored by Ricardo Ribalda's avatar Ricardo Ribalda Committed by Hans Verkuil

media: usb: siano: Fix allocation of urbs

USB urbs must be allocated with usb_alloc_urb. Quoting the manual

Only use this function (usb_init_urb) if you _really_ understand what you
are doing.

Fix the following smatch error:

drivers/media/usb/siano/smsusb.c:53:38: warning: array of flexible structures
Signed-off-by: default avatarRicardo Ribalda <ribalda@chromium.org>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent c3224f41
...@@ -40,7 +40,7 @@ struct smsusb_urb_t { ...@@ -40,7 +40,7 @@ struct smsusb_urb_t {
struct smscore_buffer_t *cb; struct smscore_buffer_t *cb;
struct smsusb_device_t *dev; struct smsusb_device_t *dev;
struct urb urb; struct urb *urb;
/* For the bottom half */ /* For the bottom half */
struct work_struct wq; struct work_struct wq;
...@@ -160,7 +160,7 @@ static int smsusb_submit_urb(struct smsusb_device_t *dev, ...@@ -160,7 +160,7 @@ static int smsusb_submit_urb(struct smsusb_device_t *dev,
} }
usb_fill_bulk_urb( usb_fill_bulk_urb(
&surb->urb, surb->urb,
dev->udev, dev->udev,
usb_rcvbulkpipe(dev->udev, dev->in_ep), usb_rcvbulkpipe(dev->udev, dev->in_ep),
surb->cb->p, surb->cb->p,
...@@ -168,9 +168,9 @@ static int smsusb_submit_urb(struct smsusb_device_t *dev, ...@@ -168,9 +168,9 @@ static int smsusb_submit_urb(struct smsusb_device_t *dev,
smsusb_onresponse, smsusb_onresponse,
surb surb
); );
surb->urb.transfer_flags |= URB_FREE_BUFFER; surb->urb->transfer_flags |= URB_FREE_BUFFER;
return usb_submit_urb(&surb->urb, GFP_ATOMIC); return usb_submit_urb(surb->urb, GFP_ATOMIC);
} }
static void smsusb_stop_streaming(struct smsusb_device_t *dev) static void smsusb_stop_streaming(struct smsusb_device_t *dev)
...@@ -178,7 +178,7 @@ static void smsusb_stop_streaming(struct smsusb_device_t *dev) ...@@ -178,7 +178,7 @@ static void smsusb_stop_streaming(struct smsusb_device_t *dev)
int i; int i;
for (i = 0; i < MAX_URBS; i++) { for (i = 0; i < MAX_URBS; i++) {
usb_kill_urb(&dev->surbs[i].urb); usb_kill_urb(dev->surbs[i].urb);
if (dev->surbs[i].wq.func) if (dev->surbs[i].wq.func)
cancel_work_sync(&dev->surbs[i].wq); cancel_work_sync(&dev->surbs[i].wq);
...@@ -338,6 +338,8 @@ static void smsusb_term_device(struct usb_interface *intf) ...@@ -338,6 +338,8 @@ static void smsusb_term_device(struct usb_interface *intf)
struct smsusb_device_t *dev = usb_get_intfdata(intf); struct smsusb_device_t *dev = usb_get_intfdata(intf);
if (dev) { if (dev) {
int i;
dev->state = SMSUSB_DISCONNECTED; dev->state = SMSUSB_DISCONNECTED;
smsusb_stop_streaming(dev); smsusb_stop_streaming(dev);
...@@ -346,6 +348,9 @@ static void smsusb_term_device(struct usb_interface *intf) ...@@ -346,6 +348,9 @@ static void smsusb_term_device(struct usb_interface *intf)
if (dev->coredev) if (dev->coredev)
smscore_unregister_device(dev->coredev); smscore_unregister_device(dev->coredev);
for (i = 0; i < MAX_URBS; i++)
usb_free_urb(dev->surbs[i].urb);
pr_debug("device 0x%p destroyed\n", dev); pr_debug("device 0x%p destroyed\n", dev);
kfree(dev); kfree(dev);
} }
...@@ -463,7 +468,9 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id) ...@@ -463,7 +468,9 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
/* initialize urbs */ /* initialize urbs */
for (i = 0; i < MAX_URBS; i++) { for (i = 0; i < MAX_URBS; i++) {
dev->surbs[i].dev = dev; dev->surbs[i].dev = dev;
usb_init_urb(&dev->surbs[i].urb); dev->surbs[i].urb = usb_alloc_urb(0, GFP_KERNEL);
if (!dev->surbs[i].urb)
goto err_unregister_device;
} }
pr_debug("smsusb_start_streaming(...).\n"); pr_debug("smsusb_start_streaming(...).\n");
...@@ -486,6 +493,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id) ...@@ -486,6 +493,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
return rc; return rc;
err_unregister_device: err_unregister_device:
/* smsusb_term_device() frees any allocated urb. */
smsusb_term_device(intf); smsusb_term_device(intf);
#ifdef CONFIG_MEDIA_CONTROLLER_DVB #ifdef CONFIG_MEDIA_CONTROLLER_DVB
media_device_unregister(mdev); media_device_unregister(mdev);
......
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