aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/io_ti.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/io_ti.c')
-rw-r--r--drivers/usb/serial/io_ti.c56
1 files changed, 30 insertions, 26 deletions
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
index b371a0a961be..f80523bea84a 100644
--- a/drivers/usb/serial/io_ti.c
+++ b/drivers/usb/serial/io_ti.c
@@ -991,18 +991,30 @@ static int check_fw_sanity(struct edgeport_serial *serial,
991 * This routine downloads the main operating code into the TI5052, using the 991 * This routine downloads the main operating code into the TI5052, using the
992 * boot code already burned into E2PROM or ROM. 992 * boot code already burned into E2PROM or ROM.
993 */ 993 */
994static int download_fw(struct edgeport_serial *serial, 994static int download_fw(struct edgeport_serial *serial)
995 const struct firmware *fw)
996{ 995{
997 struct device *dev = &serial->serial->interface->dev; 996 struct device *dev = &serial->serial->interface->dev;
998 int status = 0; 997 int status = 0;
999 struct usb_interface_descriptor *interface; 998 struct usb_interface_descriptor *interface;
1000 struct edgeport_fw_hdr *fw_hdr = (struct edgeport_fw_hdr *)fw->data; 999 const struct firmware *fw;
1000 const char *fw_name = "edgeport/down3.bin";
1001 struct edgeport_fw_hdr *fw_hdr;
1001 1002
1002 if (check_fw_sanity(serial, fw)) 1003 status = request_firmware(&fw, fw_name, dev);
1003 return -EINVAL; 1004 if (status) {
1005 dev_err(dev, "Failed to load image \"%s\" err %d\n",
1006 fw_name, status);
1007 return status;
1008 }
1009
1010 if (check_fw_sanity(serial, fw)) {
1011 status = -EINVAL;
1012 goto out;
1013 }
1004 1014
1005 /* If on-board version is newer, "fw_version" will be updated below. */ 1015 fw_hdr = (struct edgeport_fw_hdr *)fw->data;
1016
1017 /* If on-board version is newer, "fw_version" will be updated later. */
1006 serial->fw_version = (fw_hdr->major_version << 8) + 1018 serial->fw_version = (fw_hdr->major_version << 8) +
1007 fw_hdr->minor_version; 1019 fw_hdr->minor_version;
1008 1020
@@ -1017,12 +1029,13 @@ static int download_fw(struct edgeport_serial *serial,
1017 1029
1018 status = choose_config(serial->serial->dev); 1030 status = choose_config(serial->serial->dev);
1019 if (status) 1031 if (status)
1020 return status; 1032 goto out;
1021 1033
1022 interface = &serial->serial->interface->cur_altsetting->desc; 1034 interface = &serial->serial->interface->cur_altsetting->desc;
1023 if (!interface) { 1035 if (!interface) {
1024 dev_err(dev, "%s - no interface set, error!\n", __func__); 1036 dev_err(dev, "%s - no interface set, error!\n", __func__);
1025 return -ENODEV; 1037 status = -ENODEV;
1038 goto out;
1026 } 1039 }
1027 1040
1028 /* 1041 /*
@@ -1032,13 +1045,16 @@ static int download_fw(struct edgeport_serial *serial,
1032 */ 1045 */
1033 if (interface->bNumEndpoints > 1) { 1046 if (interface->bNumEndpoints > 1) {
1034 serial->product_info.TiMode = TI_MODE_DOWNLOAD; 1047 serial->product_info.TiMode = TI_MODE_DOWNLOAD;
1035 return do_download_mode(serial, fw); 1048 status = do_download_mode(serial, fw);
1049 } else {
1050 /* Otherwise we will remain in configuring mode */
1051 serial->product_info.TiMode = TI_MODE_CONFIGURING;
1052 status = do_boot_mode(serial, fw);
1036 } 1053 }
1037 1054
1038 /* Otherwise we will remain in configuring mode */ 1055out:
1039 serial->product_info.TiMode = TI_MODE_CONFIGURING; 1056 release_firmware(fw);
1040 return do_boot_mode(serial, fw); 1057 return status;
1041
1042} 1058}
1043 1059
1044static int do_download_mode(struct edgeport_serial *serial, 1060static int do_download_mode(struct edgeport_serial *serial,
@@ -2494,9 +2510,6 @@ static int edge_startup(struct usb_serial *serial)
2494{ 2510{
2495 struct edgeport_serial *edge_serial; 2511 struct edgeport_serial *edge_serial;
2496 int status; 2512 int status;
2497 const struct firmware *fw;
2498 const char *fw_name = "edgeport/down3.bin";
2499 struct device *dev = &serial->interface->dev;
2500 u16 product_id; 2513 u16 product_id;
2501 2514
2502 /* create our private serial structure */ 2515 /* create our private serial structure */
@@ -2508,16 +2521,7 @@ static int edge_startup(struct usb_serial *serial)
2508 edge_serial->serial = serial; 2521 edge_serial->serial = serial;
2509 usb_set_serial_data(serial, edge_serial); 2522 usb_set_serial_data(serial, edge_serial);
2510 2523
2511 status = request_firmware(&fw, fw_name, dev); 2524 status = download_fw(edge_serial);
2512 if (status) {
2513 dev_err(dev, "Failed to load image \"%s\" err %d\n",
2514 fw_name, status);
2515 kfree(edge_serial);
2516 return status;
2517 }
2518
2519 status = download_fw(edge_serial, fw);
2520 release_firmware(fw);
2521 if (status) { 2525 if (status) {
2522 kfree(edge_serial); 2526 kfree(edge_serial);
2523 return status; 2527 return status;