]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/libertas_tf/if_usb.c
Merge branch 'intel_idle+snb' into idle-release
[karo-tx-linux.git] / drivers / net / wireless / libertas_tf / if_usb.c
index c445500ffc61b95e1e5834aaab6c8a8f2a4e7df6..41a4f214ade1271e66b526cc4c936daf2059736a 100644 (file)
@@ -538,7 +538,8 @@ static void if_usb_receive_fwload(struct urb *urb)
                return;
        }
 
-       syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
+       syncfwheader = kmemdup(skb->data, sizeof(struct fwsyncheader),
+                              GFP_ATOMIC);
        if (!syncfwheader) {
                lbtf_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
                kfree_skb(skb);
@@ -546,8 +547,6 @@ static void if_usb_receive_fwload(struct urb *urb)
                return;
        }
 
-       memcpy(syncfwheader, skb->data, sizeof(struct fwsyncheader));
-
        if (!syncfwheader->cmd) {
                lbtf_deb_usb2(&cardp->udev->dev, "FW received Blk with correct CRC\n");
                lbtf_deb_usb2(&cardp->udev->dev, "FW received Blk seqnum = %d\n",
@@ -812,12 +811,15 @@ static int if_usb_prog_firmware(struct if_usb_card *cardp)
 
        lbtf_deb_enter(LBTF_DEB_USB);
 
+       kparam_block_sysfs_write(fw_name);
        ret = request_firmware(&cardp->fw, lbtf_fw_name, &cardp->udev->dev);
        if (ret < 0) {
                pr_err("request_firmware() failed with %#x\n", ret);
                pr_err("firmware %s not found\n", lbtf_fw_name);
+               kparam_unblock_sysfs_write(fw_name);
                goto done;
        }
+       kparam_unblock_sysfs_write(fw_name);
 
        if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
                goto release_fw;