Bluetooth: bfusb: Fix error path on firmware load
authorDavid Herrmann <dh.herrmann@googlemail.com>
Wed, 26 Oct 2011 09:22:46 +0000 (11:22 +0200)
committerGustavo F. Padovan <padovan@profusion.mobi>
Mon, 7 Nov 2011 19:24:54 +0000 (17:24 -0200)
When loading the usb-configuration we do not signal the end of configuration on
memory allocation error. This patch moves the memory allocation to the top so
every error path uses "goto error" now to correctly send the usb-ctrl message
when detecting some error.

This also replaces GFP_ATOMIC with GFP_KERNEL as we are allowed to sleep here.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
drivers/bluetooth/bfusb.c

index 6580d5057d265c51254c9fb47e56d030472f0228..a936763b8c3d97885baa577daa547b822c30ee79 100644 (file)
@@ -568,22 +568,23 @@ static int bfusb_load_firmware(struct bfusb_data *data,
 
        BT_INFO("BlueFRITZ! USB loading firmware");
 
+       buf = kmalloc(BFUSB_MAX_BLOCK_SIZE + 3, GFP_KERNEL);
+       if (!buf) {
+               BT_ERR("Can't allocate memory chunk for firmware");
+               return -ENOMEM;
+       }
+
        pipe = usb_sndctrlpipe(data->udev, 0);
 
        if (usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
                                0, 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT) < 0) {
                BT_ERR("Can't change to loading configuration");
+               kfree(buf);
                return -EBUSY;
        }
 
        data->udev->toggle[0] = data->udev->toggle[1] = 0;
 
-       buf = kmalloc(BFUSB_MAX_BLOCK_SIZE + 3, GFP_ATOMIC);
-       if (!buf) {
-               BT_ERR("Can't allocate memory chunk for firmware");
-               return -ENOMEM;
-       }
-
        pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep);
 
        while (count) {