Replace firmware upgrade API in em_download_image(). Signed-off-by: Macpaul Lin <macpaul@xxxxxxxxx> Cc: Paul Stewart <pstew@xxxxxxxxxxxx> Cc: Ben Chan <benchan@xxxxxxxxxxxx> Cc: Sage Ahn <syahn@xxxxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Cc: Dan Carpenter <dan.carpenter@xxxxxxxxxx> --- Changes for v2: - Correction the procedure in em_download_image() and usb_emergency() - keep "goto out" in em_download_image because release_firmware is required in many case during download fail. drivers/staging/gdm72xx/usb_boot.c | 77 ++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/drivers/staging/gdm72xx/usb_boot.c b/drivers/staging/gdm72xx/usb_boot.c index 80870a0..20dcea1 100644 --- a/drivers/staging/gdm72xx/usb_boot.c +++ b/drivers/staging/gdm72xx/usb_boot.c @@ -32,8 +32,8 @@ #define MAX_IMG_CNT 16 #define FW_DIR "gdm72xx/" #define FW_UIMG "gdmuimg.bin" -#define KERN_PATH "/lib/firmware/gdm72xx/zImage" -#define FS_PATH "/lib/firmware/gdm72xx/ramdisk.jffs2" +#define FW_KERN "zImage" +#define FW_FS "ramdisk.jffs2" struct dn_header { u32 magic_num; @@ -276,38 +276,27 @@ out: return ret; } -static int em_download_image(struct usb_device *usbdev, char *path, +static int em_download_image(struct usb_device *usbdev, char *img_name, char *type_string) { - struct file *filp; - struct inode *inode; - static mm_segment_t fs; char *buf = NULL; loff_t pos = 0; int ret = 0; - int len, readn = 0; + int len; + int img_len; + const struct firmware *firm; #if defined(GDM7205_PADDING) const int pad_size = GDM7205_PADDING; #else const int pad_size = 0; #endif - fs = get_fs(); - set_fs(get_ds()); - - filp = filp_open(path, O_RDONLY | O_LARGEFILE, 0); - if (IS_ERR(filp)) { - printk(KERN_ERR "Can't find %s.\n", path); - set_fs(fs); - ret = -ENOENT; - goto restore_fs; - } - - inode = filp->f_dentry->d_inode; - if (!S_ISREG(inode->i_mode)) { - printk(KERN_ERR "Invalid file type: %s\n", path); - ret = -EINVAL; - goto out; + ret = request_firmware(&firm, img_name, &usbdev->dev); + if (ret < 0) { + printk(KERN_ERR + "requesting firmware %s failed with error %d\n", + img_name, ret); + return ret; } buf = kmalloc(DOWNLOAD_CHUCK + pad_size, GFP_KERNEL); @@ -321,18 +310,28 @@ static int em_download_image(struct usb_device *usbdev, char *path, if (ret < 0) goto out; - while ((len = filp->f_op->read(filp, buf+pad_size, DOWNLOAD_CHUCK, - &pos))) { - if (len < 0) { - ret = -1; - goto out; - } - readn += len; + img_len = firm->size; + if (img_len <= 0) { + ret = -1; + goto out; + } + + while (img_len > 0) { + if (img_len > DOWNLOAD_CHUCK) + len = DOWNLOAD_CHUCK; + else + len = img_len; /* the last chunk of data */ + + memcpy(buf+pad_size, firm->data + pos, len); ret = gdm_wibro_send(usbdev, buf, len+pad_size); + if (ret < 0) goto out; + img_len -= DOWNLOAD_CHUCK; + pos += DOWNLOAD_CHUCK; + ret = em_wait_ack(usbdev, ((len+pad_size) % 512 == 0)); if (ret < 0) goto out; @@ -343,11 +342,7 @@ static int em_download_image(struct usb_device *usbdev, char *path, goto out; out: - filp_close(filp, NULL); - -restore_fs: - set_fs(fs); - + release_firmware(firm); kfree(buf); return ret; @@ -365,18 +360,20 @@ static int em_fw_reset(struct usb_device *usbdev) int usb_emergency(struct usb_device *usbdev) { int ret; + char *kern_name = FW_DIR FW_KERN; + char *fs_name = FW_DIR FW_FS; - ret = em_download_image(usbdev, KERN_PATH, KERNEL_TYPE_STRING); + ret = em_download_image(usbdev, kern_name, KERNEL_TYPE_STRING); if (ret < 0) - goto out; + return ret; printk(KERN_INFO "GCT Emergency: Kernel download success.\n"); - ret = em_download_image(usbdev, FS_PATH, FS_TYPE_STRING); + ret = em_download_image(usbdev, fs_name, FS_TYPE_STRING); if (ret < 0) - goto out; + return ret; printk(KERN_INFO "GCT Emergency: Filesystem download success.\n"); ret = em_fw_reset(usbdev); -out: + return ret; } -- 1.7.11.2.138.g2b53359 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel