diff options
Diffstat (limited to 'drivers/usb/serial/io_ti.c')
-rw-r--r-- | drivers/usb/serial/io_ti.c | 56 |
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 | */ |
994 | static int download_fw(struct edgeport_serial *serial, | 994 | static 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 */ | 1055 | out: |
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 | ||
1044 | static int do_download_mode(struct edgeport_serial *serial, | 1060 | static 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; |