[PATCH 2/3] Staging: most: fix doing DMA on stack
Greg KH
gregkh at linuxfoundation.org
Thu Jul 30 14:23:00 UTC 2015
On Thu, Jul 30, 2015 at 03:31:38PM +0200, Christian Gromm wrote:
> This patch fixes error "doing DMA on the stack" by using kzalloc
> for buffer allocation.
>
> Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
> Signed-off-by: Christian Gromm <christian.gromm at microchip.com>
> ---
> drivers/staging/most/hdm-usb/hdm_usb.c | 39 +++++++++++++++++++++-----------
> 1 file changed, 26 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/staging/most/hdm-usb/hdm_usb.c b/drivers/staging/most/hdm-usb/hdm_usb.c
> index a4a3e26..9db31a2 100644
> --- a/drivers/staging/most/hdm-usb/hdm_usb.c
> +++ b/drivers/staging/most/hdm-usb/hdm_usb.c
> @@ -45,6 +45,7 @@
> #define USB_VENDOR_ID_SMSC 0x0424 /* VID: SMSC */
> #define USB_DEV_ID_BRDG 0xC001 /* PID: USB Bridge */
> #define USB_DEV_ID_INIC 0xCF18 /* PID: USB INIC */
> +#define HW_RESYNC 0x0000
> /* DRCI Addresses */
> #define DRCI_REG_NI_STATE 0x0100
> #define DRCI_REG_PACKET_BW 0x0101
> @@ -139,21 +140,33 @@ static void wq_netinfo(struct work_struct *wq_obj);
> * trigger_resync_vr - Vendor request to trigger HW re-sync mechanism
> * @dev: usb device
> *
> + * Since some architectures don't allow DMA to the stack, we use
> + * kzalloc for buffer allocation.
No need to say this, it's a requirement for all USB drivers in Linux.
> + *
> */
> -static inline void trigger_resync_vr(struct usb_device *dev)
> +static void trigger_resync_vr(struct usb_device *dev)
> {
> - int data = 0;
> -
> - if (0 > usb_control_msg(dev,
> - usb_sndctrlpipe(dev, 0),
> - 0,
> - USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT,
> - 0,
> - 0,
> - &data,
> - 0,
> - 5 * HZ))
> - pr_info("Vendor request \"stall\" failed\n");
> + int retval;
> + u8 request_type = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT;
> + int *data = kzalloc(sizeof(*data), GFP_KERNEL);
> +
> + if (!data)
> + goto error;
> + *data = HW_RESYNC;
> + retval = usb_control_msg(dev,
> + usb_sndctrlpipe(dev, 0),
> + 0,
> + request_type,
> + 0,
> + 0,
> + data,
> + 0,
> + 5 * HZ);
> + kfree(data);
> + if (retval >= 0)
> + return;
> +error:
> + pr_info("Vendor request \"stall\" failed\n");
You have a device, so use 'dev_*' instead of pr_*. And as this is an
error, use the *_err() version, so this should be a dev_err() call, not
pr_info().
thanks,
greg k-h
More information about the devel
mailing list