staging: ft1000-usb: Add correct procedure for fw image downloading.
[deliverable/linux.git] / drivers / staging / ft1000 / ft1000-usb / ft1000_usb.c
index 4aef1c43e61f6668c28dbf74bbc597fa95fba02d..3c9bb6d226fb504632cd447e376c7e06fa0d048f 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/usb.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <linux/firmware.h>
 #include "ft1000_usb.h"
 
 //#include <linux/sched.h>
@@ -88,10 +89,12 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device
     struct usb_endpoint_descriptor *endpoint;
     struct usb_device *dev;
     unsigned numaltsetting;
-    int i;
+       int i, ret = 0, size;
 
     struct ft1000_device *ft1000dev;
     FT1000_INFO *pft1000info;
+       const struct firmware *dsp_fw;
+
 
     if(!(ft1000dev = kmalloc(sizeof(struct ft1000_device), GFP_KERNEL)))
     {
@@ -149,14 +152,24 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device
 
     DEBUG("bulk_in=%d, bulk_out=%d\n", ft1000dev->bulk_in_endpointAddr, ft1000dev->bulk_out_endpointAddr);
 
-    //read DSP image
-    pFileStart = (void*)getfw("/etc/flarion/ft3000.img", &FileLength);
+       ret = request_firmware(&dsp_fw, "ft3000.img", &dev->dev);
+       if (ret < 0) {
+               printk(KERN_ERR "Error request_firmware().\n");
+               goto err_fw;
+       }
 
-    if (pFileStart == NULL )
-    {
-        DEBUG ("ft1000_probe: Read DSP image failed\n");
-        return 0;
-    }
+       size = max_t(uint, dsp_fw->size, 4096);
+       pFileStart = kmalloc(size, GFP_KERNEL);
+
+       if (!pFileStart) {
+               release_firmware(dsp_fw);
+               ret = -ENOMEM;
+               goto err_fw;
+       }
+
+       memcpy(pFileStart, dsp_fw->data, dsp_fw->size);
+       FileLength = dsp_fw->size;
+       release_firmware(dsp_fw);
 
     //for ( i=0; i< MAX_NUM_CARDS+2; i++)
     //    pdevobj[i] = NULL;
@@ -206,6 +219,10 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device
                ft1000InitProc(ft1000dev->net);// +mbelian
 
        return 0;
+
+err_fw:
+       kfree(ft1000dev);
+       return ret;
 }
 
 //---------------------------------------------------------------------------
@@ -262,7 +279,7 @@ static void ft1000_disconnect(struct usb_interface *interface)
 
                kfree(pft1000info->pFt1000Dev); //+mbelian
     }
-
+       kfree(pFileStart);
     //terminate other kernel threads
     //in multiple instances case, first find the device
     //in the link list
This page took 0.028085 seconds and 5 git commands to generate.