Loading drivers/usb/serial/whiteheat.c +50 −27 Original line number Original line Diff line number Diff line Loading @@ -81,7 +81,8 @@ #include <linux/serial_reg.h> #include <linux/serial_reg.h> #include <linux/serial.h> #include <linux/serial.h> #include <linux/usb/serial.h> #include <linux/usb/serial.h> #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ #include <linux/firmware.h> #include <linux/ihex.h> #include "whiteheat.h" /* WhiteHEAT specific commands */ #include "whiteheat.h" /* WhiteHEAT specific commands */ static int debug; static int debug; Loading Loading @@ -279,37 +280,52 @@ static int firm_report_tx_done(struct usb_serial_port *port); */ */ static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id) static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id) { { int response; int response, ret = -ENOENT; const struct whiteheat_hex_record *record; const struct firmware *loader_fw = NULL, *firmware_fw = NULL; const struct ihex_binrec *record; dbg("%s", __func__); dbg("%s", __func__); if (request_ihex_firmware(&firmware_fw, "whiteheat.fw", &serial->dev->dev)) { err("%s - request \"whiteheat.fw\" failed", __func__); goto out; } if (request_ihex_firmware(&loader_fw, "whiteheat_loader.fw", &serial->dev->dev)) { err("%s - request \"whiteheat_loader.fw\" failed", __func__); goto out; } ret = 0; response = ezusb_set_reset (serial, 1); response = ezusb_set_reset (serial, 1); record = &whiteheat_loader[0]; record = (const struct ihex_binrec *)loader_fw->data; while (record->address != 0xffff) { while (record) { response = ezusb_writememory (serial, record->address, response = ezusb_writememory (serial, be32_to_cpu(record->addr), (unsigned char *)record->data, record->data_size, 0xa0); (unsigned char *)record->data, be16_to_cpu(record->len), 0xa0); if (response < 0) { if (response < 0) { err("%s - ezusb_writememory failed for loader (%d %04X %p %d)", err("%s - ezusb_writememory failed for loader (%d %04X %p %d)", __func__, response, record->address, record->data, record->data_size); __func__, response, be32_to_cpu(record->addr), record->data, be16_to_cpu(record->len)); break; break; } } ++record; record = ihex_next_binrec(record); } } response = ezusb_set_reset (serial, 0); response = ezusb_set_reset (serial, 0); record = &whiteheat_firmware[0]; record = (const struct ihex_binrec *)firmware_fw->data; while (record->address < 0x1b40) { while (record && be32_to_cpu(record->addr) < 0x1b40) ++record; record = ihex_next_binrec(record); } while (record) { while (record->address != 0xffff) { response = ezusb_writememory (serial, be32_to_cpu(record->addr), response = ezusb_writememory (serial, record->address, (unsigned char *)record->data, (unsigned char *)record->data, record->data_size, 0xa3); be16_to_cpu(record->len), 0xa3); if (response < 0) { if (response < 0) { err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)", err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)", __func__, response, record->address, record->data, record->data_size); __func__, response, be32_to_cpu(record->addr), record->data, be16_to_cpu(record->len)); break; break; } } ++record; ++record; Loading @@ -317,21 +333,25 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct response = ezusb_set_reset (serial, 1); response = ezusb_set_reset (serial, 1); record = &whiteheat_firmware[0]; record = (const struct ihex_binrec *)firmware_fw->data; while (record->address < 0x1b40) { while (record && be32_to_cpu(record->addr) < 0x1b40) { response = ezusb_writememory (serial, record->address, response = ezusb_writememory (serial, be32_to_cpu(record->addr), (unsigned char *)record->data, record->data_size, 0xa0); (unsigned char *)record->data, be16_to_cpu(record->len), 0xa0); if (response < 0) { if (response < 0) { err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)", err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)", __func__, response, record->address, record->data, record->data_size); __func__, response, be32_to_cpu(record->addr), record->data, be16_to_cpu(record->len)); break; break; } } ++record; ++record; } } ret = 0; response = ezusb_set_reset (serial, 0); response = ezusb_set_reset (serial, 0); out: return 0; release_firmware(loader_fw); release_firmware(firmware_fw); return ret; } } Loading Loading @@ -1503,6 +1523,9 @@ MODULE_AUTHOR( DRIVER_AUTHOR ); MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL"); MODULE_FIRMWARE("whiteheat.fw"); MODULE_FIRMWARE("whiteheat_loader.fw"); module_param(urb_pool_size, int, 0); module_param(urb_pool_size, int, 0); MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering"); MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering"); Loading Loading
drivers/usb/serial/whiteheat.c +50 −27 Original line number Original line Diff line number Diff line Loading @@ -81,7 +81,8 @@ #include <linux/serial_reg.h> #include <linux/serial_reg.h> #include <linux/serial.h> #include <linux/serial.h> #include <linux/usb/serial.h> #include <linux/usb/serial.h> #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ #include <linux/firmware.h> #include <linux/ihex.h> #include "whiteheat.h" /* WhiteHEAT specific commands */ #include "whiteheat.h" /* WhiteHEAT specific commands */ static int debug; static int debug; Loading Loading @@ -279,37 +280,52 @@ static int firm_report_tx_done(struct usb_serial_port *port); */ */ static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id) static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id) { { int response; int response, ret = -ENOENT; const struct whiteheat_hex_record *record; const struct firmware *loader_fw = NULL, *firmware_fw = NULL; const struct ihex_binrec *record; dbg("%s", __func__); dbg("%s", __func__); if (request_ihex_firmware(&firmware_fw, "whiteheat.fw", &serial->dev->dev)) { err("%s - request \"whiteheat.fw\" failed", __func__); goto out; } if (request_ihex_firmware(&loader_fw, "whiteheat_loader.fw", &serial->dev->dev)) { err("%s - request \"whiteheat_loader.fw\" failed", __func__); goto out; } ret = 0; response = ezusb_set_reset (serial, 1); response = ezusb_set_reset (serial, 1); record = &whiteheat_loader[0]; record = (const struct ihex_binrec *)loader_fw->data; while (record->address != 0xffff) { while (record) { response = ezusb_writememory (serial, record->address, response = ezusb_writememory (serial, be32_to_cpu(record->addr), (unsigned char *)record->data, record->data_size, 0xa0); (unsigned char *)record->data, be16_to_cpu(record->len), 0xa0); if (response < 0) { if (response < 0) { err("%s - ezusb_writememory failed for loader (%d %04X %p %d)", err("%s - ezusb_writememory failed for loader (%d %04X %p %d)", __func__, response, record->address, record->data, record->data_size); __func__, response, be32_to_cpu(record->addr), record->data, be16_to_cpu(record->len)); break; break; } } ++record; record = ihex_next_binrec(record); } } response = ezusb_set_reset (serial, 0); response = ezusb_set_reset (serial, 0); record = &whiteheat_firmware[0]; record = (const struct ihex_binrec *)firmware_fw->data; while (record->address < 0x1b40) { while (record && be32_to_cpu(record->addr) < 0x1b40) ++record; record = ihex_next_binrec(record); } while (record) { while (record->address != 0xffff) { response = ezusb_writememory (serial, be32_to_cpu(record->addr), response = ezusb_writememory (serial, record->address, (unsigned char *)record->data, (unsigned char *)record->data, record->data_size, 0xa3); be16_to_cpu(record->len), 0xa3); if (response < 0) { if (response < 0) { err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)", err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)", __func__, response, record->address, record->data, record->data_size); __func__, response, be32_to_cpu(record->addr), record->data, be16_to_cpu(record->len)); break; break; } } ++record; ++record; Loading @@ -317,21 +333,25 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct response = ezusb_set_reset (serial, 1); response = ezusb_set_reset (serial, 1); record = &whiteheat_firmware[0]; record = (const struct ihex_binrec *)firmware_fw->data; while (record->address < 0x1b40) { while (record && be32_to_cpu(record->addr) < 0x1b40) { response = ezusb_writememory (serial, record->address, response = ezusb_writememory (serial, be32_to_cpu(record->addr), (unsigned char *)record->data, record->data_size, 0xa0); (unsigned char *)record->data, be16_to_cpu(record->len), 0xa0); if (response < 0) { if (response < 0) { err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)", err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)", __func__, response, record->address, record->data, record->data_size); __func__, response, be32_to_cpu(record->addr), record->data, be16_to_cpu(record->len)); break; break; } } ++record; ++record; } } ret = 0; response = ezusb_set_reset (serial, 0); response = ezusb_set_reset (serial, 0); out: return 0; release_firmware(loader_fw); release_firmware(firmware_fw); return ret; } } Loading Loading @@ -1503,6 +1523,9 @@ MODULE_AUTHOR( DRIVER_AUTHOR ); MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL"); MODULE_FIRMWARE("whiteheat.fw"); MODULE_FIRMWARE("whiteheat_loader.fw"); module_param(urb_pool_size, int, 0); module_param(urb_pool_size, int, 0); MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering"); MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering"); Loading