Commit ada541f0 authored by Marek Belisko's avatar Marek Belisko Committed by Greg Kroah-Hartman

staging: ft1000-usb: Add correct procedure for fw image downloading.

call request_firmware instead of trying to open the file directly from
the kernel driver.
Signed-off-by: default avatarMarek Belisko <marek.belisko@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 95624b2d
...@@ -132,69 +132,6 @@ typedef struct _DSP_IMAGE_INFO_V6 { ...@@ -132,69 +132,6 @@ typedef struct _DSP_IMAGE_INFO_V6 {
unsigned short pad1; unsigned short pad1;
} DSP_IMAGE_INFO_V6, *PDSP_IMAGE_INFO_V6; } DSP_IMAGE_INFO_V6, *PDSP_IMAGE_INFO_V6;
//---------------------------------------------------------------------------
// Function: getfw
//
// Parameters: char *fn - input DSP image file name
// int *pimgsz - output DSP image file size
// Returns: DSP image buffer
//
// Description: Read the DSP image file into a char buffer
//
// Notes:
//
//---------------------------------------------------------------------------
char *getfw (char *fn, size_t *pimgsz)
{
struct file *fd;
mm_segment_t fs = get_fs();
loff_t pos;
char *pfwimg;
int fwimgsz;
set_fs(get_ds());
fd = filp_open(fn, 0, 0);
if ( IS_ERR(fd) )
{
DEBUG("FT1000:%s:can not open dsp image\n", __FUNCTION__);
set_fs(fs);
return NULL;
}
fwimgsz = i_size_read(fd->f_dentry->d_inode);
*pimgsz = fwimgsz;
if (fwimgsz <= 0)
{
DEBUG("FT1000:%s:invalid file size\n", __FUNCTION__);
filp_close(fd, current->files);
set_fs(fs);
return NULL;
}
pfwimg = (char*)vmalloc ( fwimgsz );
if (pfwimg == NULL) {
DEBUG("FT1000:%s:can not allocate memory for dsp image\n", __FUNCTION__);
filp_close(fd, current->files);
set_fs(fs);
return NULL;
}
pos = 0;
if (vfs_read(fd, (void __user __force*)pfwimg, fwimgsz, &pos) != fwimgsz) {
vfree(pfwimg);
DEBUG("FT1000:%s:failed to read firmware image\n",__FUNCTION__);
filp_close(fd, current->files);
set_fs(fs);
return NULL;
}
filp_close(fd, current->files);
set_fs(fs);
return pfwimg;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Function: check_usb_db // Function: check_usb_db
// //
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/firmware.h>
#include "ft1000_usb.h" #include "ft1000_usb.h"
//#include <linux/sched.h> //#include <linux/sched.h>
...@@ -88,10 +89,12 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device ...@@ -88,10 +89,12 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device
struct usb_endpoint_descriptor *endpoint; struct usb_endpoint_descriptor *endpoint;
struct usb_device *dev; struct usb_device *dev;
unsigned numaltsetting; unsigned numaltsetting;
int i; int i, ret = 0, size;
struct ft1000_device *ft1000dev; struct ft1000_device *ft1000dev;
FT1000_INFO *pft1000info; FT1000_INFO *pft1000info;
const struct firmware *dsp_fw;
if(!(ft1000dev = kmalloc(sizeof(struct ft1000_device), GFP_KERNEL))) if(!(ft1000dev = kmalloc(sizeof(struct ft1000_device), GFP_KERNEL)))
{ {
...@@ -149,15 +152,25 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device ...@@ -149,15 +152,25 @@ 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); DEBUG("bulk_in=%d, bulk_out=%d\n", ft1000dev->bulk_in_endpointAddr, ft1000dev->bulk_out_endpointAddr);
//read DSP image ret = request_firmware(&dsp_fw, "ft3000.img", &dev->dev);
pFileStart = (void*)getfw("/etc/flarion/ft3000.img", &FileLength); if (ret < 0) {
printk(KERN_ERR "Error request_firmware().\n");
goto err_fw;
}
if (pFileStart == NULL ) size = max_t(uint, dsp_fw->size, 4096);
{ pFileStart = kmalloc(size, GFP_KERNEL);
DEBUG ("ft1000_probe: Read DSP image failed\n");
return 0; 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++) //for ( i=0; i< MAX_NUM_CARDS+2; i++)
// pdevobj[i] = NULL; // pdevobj[i] = NULL;
...@@ -206,6 +219,10 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device ...@@ -206,6 +219,10 @@ static int ft1000_probe(struct usb_interface *interface, const struct usb_device
ft1000InitProc(ft1000dev->net);// +mbelian ft1000InitProc(ft1000dev->net);// +mbelian
return 0; return 0;
err_fw:
kfree(ft1000dev);
return ret;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
...@@ -262,7 +279,7 @@ static void ft1000_disconnect(struct usb_interface *interface) ...@@ -262,7 +279,7 @@ static void ft1000_disconnect(struct usb_interface *interface)
kfree(pft1000info->pFt1000Dev); //+mbelian kfree(pft1000info->pFt1000Dev); //+mbelian
} }
kfree(pFileStart);
//terminate other kernel threads //terminate other kernel threads
//in multiple instances case, first find the device //in multiple instances case, first find the device
//in the link list //in the link list
......
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