]> err.no Git - linux-2.6/blobdiff - drivers/usb/serial/whiteheat.c
Merge branch 'for-linus' of git://neil.brown.name/md
[linux-2.6] / drivers / usb / serial / whiteheat.c
index 6926a81a0ccd92472bbfb49fefdb63ae281558db..665aa77a917b1c464c5f6da22860a54a6afd1fd6 100644 (file)
@@ -81,7 +81,8 @@
 #include <linux/serial_reg.h>
 #include <linux/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 */
 
 static int debug;
@@ -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)
 {
-       int response;
-       const struct whiteheat_hex_record *record;
-       
+       int response, ret = -ENOENT;
+       const struct firmware *loader_fw = NULL, *firmware_fw = NULL;
+       const struct ihex_binrec *record;
+
        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);
 
-       record = &whiteheat_loader[0];
-       while (record->address != 0xffff) {
-               response = ezusb_writememory (serial, record->address, 
-                               (unsigned char *)record->data, record->data_size, 0xa0);
+       record = (const struct ihex_binrec *)loader_fw->data;
+       while (record) {
+               response = ezusb_writememory (serial, be32_to_cpu(record->addr),
+                                             (unsigned char *)record->data,
+                                             be16_to_cpu(record->len), 0xa0);
                if (response < 0) {
                        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;
                }
-               ++record;
+               record = ihex_next_binrec(record);
        }
 
        response = ezusb_set_reset (serial, 0);
 
-       record = &whiteheat_firmware[0];
-       while (record->address < 0x1b40) {
-               ++record;
-       }
-       while (record->address != 0xffff) {
-               response = ezusb_writememory (serial, record->address, 
-                               (unsigned char *)record->data, record->data_size, 0xa3);
+       record = (const struct ihex_binrec *)firmware_fw->data;
+       while (record && be32_to_cpu(record->addr) < 0x1b40)
+               record = ihex_next_binrec(record);
+       while (record) {
+               response = ezusb_writememory (serial, be32_to_cpu(record->addr),
+                                             (unsigned char *)record->data,
+                                             be16_to_cpu(record->len), 0xa3);
                if (response < 0) {
                        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;
                }
                ++record;
@@ -317,21 +333,25 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct
        
        response = ezusb_set_reset (serial, 1);
 
-       record = &whiteheat_firmware[0];
-       while (record->address < 0x1b40) {
-               response = ezusb_writememory (serial, record->address, 
-                               (unsigned char *)record->data, record->data_size, 0xa0);
+       record = (const struct ihex_binrec *)firmware_fw->data;
+       while (record && be32_to_cpu(record->addr) < 0x1b40) {
+               response = ezusb_writememory (serial, be32_to_cpu(record->addr),
+                                             (unsigned char *)record->data,
+                                             be16_to_cpu(record->len), 0xa0);
                if (response < 0) {
                        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;
                }
                ++record;
        }
-
+       ret = 0;
        response = ezusb_set_reset (serial, 0);
-
-       return 0;
+ out:
+       release_firmware(loader_fw);
+       release_firmware(firmware_fw);
+       return ret;
 }
 
 
@@ -673,15 +693,13 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
        }
 */
 
-       if (port->tty->driver->flush_buffer)
-               port->tty->driver->flush_buffer(port->tty);
+       tty_driver_flush_buffer(port->tty);
        tty_ldisc_flush(port->tty);
 
        firm_report_tx_done(port);
 
        firm_close(port);
 
-printk(KERN_ERR"Before processing rx_urbs_submitted.\n");
        /* shutdown our bulk reads and writes */
        mutex_lock(&info->deathwarrant);
        spin_lock_irq(&info->lock);
@@ -965,7 +983,7 @@ static void command_port_write_callback(struct urb *urb)
 
 static void command_port_read_callback(struct urb *urb)
 {
-       struct usb_serial_port *command_port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *command_port = urb->context;
        struct whiteheat_command_private *command_info;
        int status = urb->status;
        unsigned char *data = urb->transfer_buffer;
@@ -1015,7 +1033,7 @@ static void command_port_read_callback(struct urb *urb)
 
 static void whiteheat_read_callback(struct urb *urb)
 {
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct whiteheat_urb_wrap *wrap;
        unsigned char *data = urb->transfer_buffer;
        struct whiteheat_private *info = usb_get_serial_port_data(port);
@@ -1059,7 +1077,7 @@ static void whiteheat_read_callback(struct urb *urb)
 
 static void whiteheat_write_callback(struct urb *urb)
 {
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct whiteheat_private *info = usb_get_serial_port_data(port);
        struct whiteheat_urb_wrap *wrap;
        int status = urb->status;
@@ -1505,6 +1523,9 @@ MODULE_AUTHOR( DRIVER_AUTHOR );
 MODULE_DESCRIPTION( DRIVER_DESC );
 MODULE_LICENSE("GPL");
 
+MODULE_FIRMWARE("whiteheat.fw");
+MODULE_FIRMWARE("whiteheat_loader.fw");
+
 module_param(urb_pool_size, int, 0);
 MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering");