diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/serial/io_ti.c | 1860 |
1 files changed, 852 insertions, 1008 deletions
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 61daea3f7b2..a58822a14a8 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c @@ -18,8 +18,8 @@ * * Version history: * - * July 11, 2002 Removed 4 port device structure since all TI UMP - * chips have only 2 ports + * July 11, 2002 Removed 4 port device structure since all TI UMP + * chips have only 2 ports * David Iacovelli (davidi@ionetworks.com) * */ @@ -38,7 +38,7 @@ #include <linux/serial.h> #include <linux/ioctl.h> #include <linux/firmware.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h> #include <linux/usb.h> #include <linux/usb/serial.h> @@ -57,18 +57,19 @@ struct edgeport_uart_buf_desc { - __u32 count; // Number of bytes currently in buffer + __u32 count; /* Number of bytes currently in buffer */ }; /* different hardware types */ #define HARDWARE_TYPE_930 0 #define HARDWARE_TYPE_TIUMP 1 -// IOCTL_PRIVATE_TI_GET_MODE Definitions -#define TI_MODE_CONFIGURING 0 // Device has not entered start device -#define TI_MODE_BOOT 1 // Staying in boot mode -#define TI_MODE_DOWNLOAD 2 // Made it to download mode -#define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode +/* IOCTL_PRIVATE_TI_GET_MODE Definitions */ +#define TI_MODE_CONFIGURING 0 /* Device has not entered start device */ +#define TI_MODE_BOOT 1 /* Staying in boot mode */ +#define TI_MODE_DOWNLOAD 2 /* Made it to download mode */ +#define TI_MODE_TRANSITIONING 3 /* Currently in boot mode but + transitioning to download mode */ /* read urb state */ #define EDGE_READ_URB_RUNNING 0 @@ -82,10 +83,9 @@ struct edgeport_uart_buf_desc { /* Product information read from the Edgeport */ -struct product_info -{ - int TiMode; // Current TI Mode - __u8 hardware_type; // Type of hardware +struct product_info { + int TiMode; /* Current TI Mode */ + __u8 hardware_type; /* Type of hardware */ } __attribute__((packed)); /* circular buffer */ @@ -116,7 +116,7 @@ struct edgeport_port { happen */ struct edgeport_serial *edge_serial; struct usb_serial_port *port; - __u8 bUartMode; /* Port type, 0: RS232, etc. */ + __u8 bUartMode; /* Port type, 0: RS232, etc. */ spinlock_t ep_lock; int ep_read_urb_state; int ep_write_urb_in_use; @@ -125,8 +125,9 @@ struct edgeport_port { struct edgeport_serial { struct product_info product_info; - u8 TI_I2C_Type; // Type of I2C in UMP - u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode + u8 TI_I2C_Type; /* Type of I2C in UMP */ + u8 TiReadI2C; /* Set to TRUE if we have read the + I2c in Boot Mode */ struct mutex es_lock; int num_ports_open; struct usb_serial *serial; @@ -214,7 +215,7 @@ static struct usb_device_id id_table_combined [] = { { } }; -MODULE_DEVICE_TABLE (usb, id_table_combined); +MODULE_DEVICE_TABLE(usb, id_table_combined); static struct usb_driver io_driver = { .name = "io_ti", @@ -231,19 +232,19 @@ static unsigned short OperationalBuildNumber; static int debug; -static int TIStayInBootMode = 0; static int low_latency = EDGE_LOW_LATENCY; static int closing_wait = EDGE_CLOSING_WAIT; -static int ignore_cpu_rev = 0; -static int default_uart_mode = 0; /* RS232 */ - +static int ignore_cpu_rev; +static int default_uart_mode; /* RS232 */ -static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length); +static void edge_tty_recv(struct device *dev, struct tty_struct *tty, + unsigned char *data, int length); static void stop_read(struct edgeport_port *edge_port); static int restart_read(struct edgeport_port *edge_port); -static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); +static void edge_set_termios(struct usb_serial_port *port, + struct ktermios *old_termios); static void edge_send(struct usb_serial_port *port); /* sysfs attributes */ @@ -262,87 +263,57 @@ static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, unsigned int count); -static int TIReadVendorRequestSync (struct usb_device *dev, - __u8 request, - __u16 value, - __u16 index, - u8 *data, - int size) +static int ti_vread_sync(struct usb_device *dev, __u8 request, + __u16 value, __u16 index, u8 *data, int size) { int status; - status = usb_control_msg (dev, - usb_rcvctrlpipe(dev, 0), - request, - (USB_TYPE_VENDOR | - USB_RECIP_DEVICE | - USB_DIR_IN), - value, - index, - data, - size, - 1000); + status = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request, + (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN), + value, index, data, size, 1000); if (status < 0) return status; if (status != size) { - dbg ("%s - wanted to write %d, but only wrote %d", - __func__, size, status); + dbg("%s - wanted to write %d, but only wrote %d", + __func__, size, status); return -ECOMM; } return 0; } -static int TISendVendorRequestSync (struct usb_device *dev, - __u8 request, - __u16 value, - __u16 index, - u8 *data, - int size) +static int ti_vsend_sync(struct usb_device *dev, __u8 request, + __u16 value, __u16 index, u8 *data, int size) { int status; - status = usb_control_msg (dev, - usb_sndctrlpipe(dev, 0), - request, - (USB_TYPE_VENDOR | - USB_RECIP_DEVICE | - USB_DIR_OUT), - value, - index, - data, - size, - 1000); + status = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request, + (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT), + value, index, data, size, 1000); if (status < 0) return status; if (status != size) { - dbg ("%s - wanted to write %d, but only wrote %d", + dbg("%s - wanted to write %d, but only wrote %d", __func__, size, status); return -ECOMM; } return 0; } -static int TIWriteCommandSync (struct usb_device *dev, __u8 command, +static int send_cmd(struct usb_device *dev, __u8 command, __u8 moduleid, __u16 value, u8 *data, int size) { - return TISendVendorRequestSync (dev, - command, // Request - value, // wValue - moduleid, // wIndex - data, // TransferBuffer - size); // TransferBufferLength - + return ti_vsend_sync(dev, command, value, moduleid, data, size); } /* clear tx/rx buffers and fifo in TI UMP */ -static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask) +static int purge_port(struct usb_serial_port *port, __u16 mask) { int port_number = port->number - port->serial->minor; - dbg ("%s - port %d, mask %x", __func__, port_number, mask); + dbg("%s - port %d, mask %x", __func__, port_number, mask); - return TIWriteCommandSync (port->serial->dev, + return send_cmd(port->serial->dev, UMPC_PURGE_PORT, (__u8)(UMPM_UART1_PORT + port_number), mask, @@ -351,92 +322,87 @@ static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask) } /** - * TIReadDownloadMemory - Read edgeport memory from TI chip + * read_download_mem - Read edgeport memory from TI chip * @dev: usb device pointer * @start_address: Device CPU address at which to read * @length: Length of above data * @address_type: Can read both XDATA and I2C * @buffer: pointer to input data buffer */ -static int TIReadDownloadMemory(struct usb_device *dev, int start_address, +static int read_download_mem(struct usb_device *dev, int start_address, int length, __u8 address_type, __u8 *buffer) { int status = 0; __u8 read_length; __be16 be_start_address; - - dbg ("%s - @ %x for %d", __func__, start_address, length); + + dbg("%s - @ %x for %d", __func__, start_address, length); /* Read in blocks of 64 bytes * (TI firmware can't handle more than 64 byte reads) */ while (length) { if (length > 64) - read_length= 64; + read_length = 64; else read_length = (__u8)length; if (read_length > 1) { - dbg ("%s - @ %x for %d", __func__, + dbg("%s - @ %x for %d", __func__, start_address, read_length); } - be_start_address = cpu_to_be16 (start_address); - status = TIReadVendorRequestSync (dev, - UMPC_MEMORY_READ, // Request - (__u16)address_type, // wValue (Address type) - (__force __u16)be_start_address, // wIndex (Address to read) - buffer, // TransferBuffer - read_length); // TransferBufferLength + be_start_address = cpu_to_be16(start_address); + status = ti_vread_sync(dev, UMPC_MEMORY_READ, + (__u16)address_type, + (__force __u16)be_start_address, + buffer, read_length); if (status) { - dbg ("%s - ERROR %x", __func__, status); + dbg("%s - ERROR %x", __func__, status); return status; } - if (read_length > 1) { + if (read_length > 1) usb_serial_debug_data(debug, &dev->dev, __func__, read_length, buffer); - } /* Update pointers/length */ start_address += read_length; buffer += read_length; length -= read_length; } - + return status; } -static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer) +static int read_ram(struct usb_device *dev, int start_address, + int length, __u8 *buffer) { - return TIReadDownloadMemory (dev, - start_address, - length, - DTK_ADDR_SPACE_XDATA, - buffer); + return read_download_mem(dev, start_address, length, + DTK_ADDR_SPACE_XDATA, buffer); } /* Read edgeport memory to a given block */ -static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer) +static int read_boot_mem(struct edgeport_serial *serial, + int start_address, int length, __u8 *buffer) { int status = 0; int i; - for (i=0; i< length; i++) { - status = TIReadVendorRequestSync (serial->serial->dev, - UMPC_MEMORY_READ, // Request - serial->TI_I2C_Type, // wValue (Address type) - (__u16)(start_address+i), // wIndex - &buffer[i], // TransferBuffer - 0x01); // TransferBufferLength + for (i = 0; i < length; i++) { + status = ti_vread_sync(serial->serial->dev, + UMPC_MEMORY_READ, serial->TI_I2C_Type, + (__u16)(start_address+i), &buffer[i], 0x01); if (status) { - dbg ("%s - ERROR %x", __func__, status); + dbg("%s - ERROR %x", __func__, status); return status; } } - dbg ("%s - start_address = %x, length = %d", __func__, start_address, length); - usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, length, buffer); + dbg("%s - start_address = %x, length = %d", + __func__, start_address, length); + usb_serial_debug_data(debug, &serial->serial->dev->dev, + __func__, length, buffer); serial->TiReadI2C = 1; @@ -444,7 +410,8 @@ static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, } /* Write given block to TI EPROM memory */ -static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) +static int write_boot_mem(struct edgeport_serial *serial, + int start_address, int length, __u8 *buffer) { int status = 0; int i; @@ -452,57 +419,58 @@ static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, /* Must do a read before write */ if (!serial->TiReadI2C) { - status = TIReadBootMemory(serial, 0, 1, &temp); + status = read_boot_mem(serial, 0, 1, &temp); if (status) return status; } - for (i=0; i < length; ++i) { - status = TISendVendorRequestSync (serial->serial->dev, - UMPC_MEMORY_WRITE, // Request - buffer[i], // wValue - (__u16)(i+start_address), // wIndex - NULL, // TransferBuffer - 0); // TransferBufferLength + for (i = 0; i < length; ++i) { + status = ti_vsend_sync(serial->serial->dev, + UMPC_MEMORY_WRITE, buffer[i], + (__u16)(i + start_address), NULL, 0); if (status) return status; } - dbg ("%s - start_sddr = %x, length = %d", __func__, start_address, length); - usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, length, buffer); + dbg("%s - start_sddr = %x, length = %d", + __func__, start_address, length); + usb_serial_debug_data(debug, &serial->serial->dev->dev, + __func__, length, buffer); return status; } /* Write edgeport I2C memory to TI chip */ -static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer) +static int write_i2c_mem(struct edgeport_serial *serial, + int start_address, int length, __u8 address_type, __u8 *buffer) { int status = 0; int write_length; __be16 be_start_address; /* We can only send a maximum of 1 aligned byte page at a time */ - + /* calulate the number of bytes left in the first page */ - write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1)); + write_length = EPROM_PAGE_SIZE - + (start_address & (EPROM_PAGE_SIZE - 1)); if (write_length > length) write_length = length; - dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __func__, start_address, write_length); - usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, write_length, buffer); + dbg("%s - BytesInFirstPage Addr = %x, length = %d", + __func__, start_address, write_length); + usb_serial_debug_data(debug, &serial->serial->dev->dev, + __func__, write_length, buffer); /* Write first page */ - be_start_address = cpu_to_be16 (start_address); - status = TISendVendorRequestSync (serial->serial->dev, - UMPC_MEMORY_WRITE, // Request - (__u16)address_type, // wValue - (__force __u16)be_start_address, // wIndex - buffer, // TransferBuffer - write_length); + be_start_address = cpu_to_be16(start_address); + status = ti_vsend_sync(serial->serial->dev, + UMPC_MEMORY_WRITE, (__u16)address_type, + (__force __u16)be_start_address, + buffer, write_length); if (status) { - dbg ("%s - ERROR %d", __func__, status); + dbg("%s - ERROR %d", __func__, status); return status; } @@ -510,29 +478,31 @@ static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address start_address += write_length; buffer += write_length; - /* We should be aligned now -- can write max page size bytes at a time */ + /* We should be aligned now -- can write + max page size bytes at a time */ while (length) { if (length > EPROM_PAGE_SIZE) write_length = EPROM_PAGE_SIZE; else write_length = length; - dbg ("%s - Page Write Addr = %x, length = %d", __func__, start_address, write_length); - usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, write_length, buffer); + dbg("%s - Page Write Addr = %x, length = %d", + __func__, start_address, write_length); + usb_serial_debug_data(debug, &serial->serial->dev->dev, + __func__, write_length, buffer); /* Write next page */ - be_start_address = cpu_to_be16 (start_address); - status = TISendVendorRequestSync (serial->serial->dev, - UMPC_MEMORY_WRITE, // Request - (__u16)address_type, // wValue - (__force __u16)be_start_address, // wIndex - buffer, // TransferBuffer - write_length); // TransferBufferLength + be_start_address = cpu_to_be16(start_address); + status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE, + (__u16)address_type, + (__force __u16)be_start_address, + buffer, write_length); if (status) { - dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __func__, status); + dev_err(&serial->serial->dev->dev, "%s - ERROR %d\n", + __func__, status); return status; } - + length -= write_length; start_address += write_length; buffer += write_length; @@ -541,25 +511,25 @@ static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address } /* Examine the UMP DMA registers and LSR - * + * * Check the MSBit of the X and Y DMA byte count registers. * A zero in this bit indicates that the TX DMA buffers are empty * then check the TX Empty bit in the UART. */ -static int TIIsTxActive (struct edgeport_port *port) +static int tx_active(struct edgeport_port *port) { int status; struct out_endpoint_desc_block *oedb; __u8 *lsr; int bytes_left = 0; - oedb = kmalloc (sizeof (* oedb), GFP_KERNEL); + oedb = kmalloc(sizeof(*oedb), GFP_KERNEL); if (!oedb) { - dev_err (&port->port->dev, "%s - out of memory\n", __func__); + dev_err(&port->port->dev, "%s - out of memory\n", __func__); return -ENOMEM; } - lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte, + lsr = kmalloc(1, GFP_KERNEL); /* Sigh, that's right, just one byte, as not all platforms can do DMA from stack */ if (!lsr) { @@ -567,43 +537,39 @@ static int TIIsTxActive (struct edgeport_port *port) return -ENOMEM; } /* Read the DMA Count Registers */ - status = TIReadRam (port->port->serial->dev, - port->dma_address, - sizeof( *oedb), - (void *)oedb); - + status = read_ram(port->port->serial->dev, port->dma_address, + sizeof(*oedb), (void *)oedb); if (status) goto exit_is_tx_active; - dbg ("%s - XByteCount 0x%X", __func__, oedb->XByteCount); + dbg("%s - XByteCount 0x%X", __func__, oedb->XByteCount); /* and the LSR */ - status = TIReadRam (port->port->serial->dev, - port->uart_base + UMPMEM_OFFS_UART_LSR, - 1, - lsr); + status = read_ram(port->port->serial->dev, + port->uart_base + UMPMEM_OFFS_UART_LSR, 1, lsr); if (status) goto exit_is_tx_active; - dbg ("%s - LSR = 0x%X", __func__, *lsr); - + dbg("%s - LSR = 0x%X", __func__, *lsr); + /* If either buffer has data or we are transmitting then return TRUE */ - if ((oedb->XByteCount & 0x80 ) != 0 ) + if ((oedb->XByteCount & 0x80) != 0) bytes_left += 64; - if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 ) + if ((*lsr & UMP_UART_LSR_TX_MASK) == 0) bytes_left += 1; /* We return Not Active if we get any kind of error */ exit_is_tx_active: - dbg ("%s - return %d", __func__, bytes_left ); + dbg("%s - return %d", __func__, bytes_left); kfree(lsr); kfree(oedb); return bytes_left; } -static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush) +static void chase_port(struct edgeport_port *port, unsigned long timeout, + int flush) { int baud_rate; struct tty_struct *tty = port->port->tty; @@ -611,7 +577,7 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f unsigned long flags; if (!timeout) - timeout = (HZ*EDGE_CLOSING_WAIT)/100; + timeout = (HZ * EDGE_CLOSING_WAIT)/100; /* wait for data to drain from the buffer */ spin_lock_irqsave(&port->ep_lock, flags); @@ -621,7 +587,8 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f set_current_state(TASK_INTERRUPTIBLE); if (edge_buf_data_avail(port->ep_out_buf) == 0 || timeout == 0 || signal_pending(current) - || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */ + || !usb_get_intfdata(port->port->serial->interface)) + /* disconnect */ break; spin_unlock_irqrestore(&port->ep_lock, flags); timeout = schedule_timeout(timeout); @@ -636,8 +603,9 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f /* wait for data to drain from the device */ timeout += jiffies; while ((long)(jiffies - timeout) < 0 && !signal_pending(current) - && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */ - if (!TIIsTxActive(port)) + && usb_get_intfdata(port->port->serial->interface)) { + /* not disconnected */ + if (!tx_active(port)) break; msleep(10); } @@ -647,72 +615,72 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f return; /* wait one more character time, based on baud rate */ - /* (TIIsTxActive doesn't seem to wait for the last byte) */ - if ((baud_rate=port->baud_rate) == 0) + /* (tx_active doesn't seem to wait for the last byte) */ + baud_rate = port->baud_rate; + if (baud_rate == 0) baud_rate = 50; msleep(max(1, DIV_ROUND_UP(10000, baud_rate))); } -static int TIChooseConfiguration (struct usb_device *dev) +static int choose_config(struct usb_device *dev) { - // There may be multiple configurations on this device, in which case - // we would need to read and parse all of them to find out which one - // we want. However, we just support one config at this point, - // configuration # 1, which is Config Descriptor 0. + /* + * There may be multiple configurations on this device, in which case + * we would need to read and parse all of them to find out which one + * we want. However, we just support one config at this point, + * configuration # 1, which is Config Descriptor 0. + */ - dbg ("%s - Number of Interfaces = %d", __func__, dev->config->desc.bNumInterfaces); - dbg ("%s - MAX Power = %d", __func__, dev->config->desc.bMaxPower*2); + dbg("%s - Number of Interfaces = %d", + __func__, dev->config->desc.bNumInterfaces); + dbg("%s - MAX Power = %d", + __func__, dev->config->desc.bMaxPower * 2); if (dev->config->desc.bNumInterfaces != 1) { - dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __func__); + dev_err(&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", + __func__); return -ENODEV; } return 0; } -static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) +static int read_rom(struct edgeport_serial *serial, + int start_address, int length, __u8 *buffer) { int status; if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { - status = TIReadDownloadMemory (serial->serial->dev, + status = read_download_mem(serial->serial->dev, start_address, length, serial->TI_I2C_Type, buffer); } else { - status = TIReadBootMemory (serial, - start_address, - length, - buffer); + status = read_boot_mem(serial, start_address, length, + buffer); } - return status; } -static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) +static int write_rom(struct edgeport_serial *serial, int start_address, + int length, __u8 *buffer) { if (serial->product_info.TiMode == TI_MODE_BOOT) - return TIWriteBootMemory (serial, - start_address, - length, - buffer); + return write_boot_mem(serial, start_address, length, + buffer); if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) - return TIWriteDownloadI2C (serial, - start_address, - length, - serial->TI_I2C_Type, - buffer); - + return write_i2c_mem(serial, start_address, length, + serial->TI_I2C_Type, buffer); return -EINVAL; } /* Read a descriptor header from I2C based on type */ -static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc) +static int get_descriptor_addr(struct edgeport_serial *serial, + int desc_type, struct ti_i2c_desc *rom_desc) { int start_address; int status; @@ -720,41 +688,42 @@ static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type /* Search for requested descriptor in I2C */ start_address = 2; do { - status = TIReadRom (serial, + status = read_rom(serial, start_address, sizeof(struct ti_i2c_desc), - (__u8 *)rom_desc ); + (__u8 *)rom_desc); if (status) return 0; if (rom_desc->Type == desc_type) return start_address; - start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; + start_address = start_address + sizeof(struct ti_i2c_desc) + + rom_desc->Size; } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); - + return 0; } /* Validate descriptor checksum */ -static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer) +static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer) { __u16 i; __u8 cs = 0; - for (i=0; i < rom_desc->Size; i++) { + for (i = 0; i < rom_desc->Size; i++) cs = (__u8)(cs + buffer[i]); - } + if (cs != rom_desc->CheckSum) { - dbg ("%s - Mismatch %x - %x", __func__, rom_desc->CheckSum, cs); + dbg("%s - Mismatch %x - %x", __func__, rom_desc->CheckSum, cs); return -EINVAL; } return 0; } /* Make sure that the I2C image is good */ -static int TiValidateI2cImage (struct edgeport_serial *serial) +static int check_i2c_image(struct edgeport_serial *serial) { struct device *dev = &serial->serial->dev->dev; int status = 0; @@ -763,120 +732,124 @@ static int TiValidateI2cImage (struct edgeport_serial *serial) __u8 *buffer; __u16 ttype; - rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); + rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL); if (!rom_desc) { - dev_err (dev, "%s - out of memory\n", __func__); + dev_err(dev, "%s - out of memory\n", __func__); return -ENOMEM; } - buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL); + buffer = kmalloc(TI_MAX_I2C_SIZE, GFP_KERNEL); if (!buffer) { - dev_err (dev, "%s - out of memory when allocating buffer\n", __func__); - kfree (rom_desc); + dev_err(dev, "%s - out of memory when allocating buffer\n", + __func__); + kfree(rom_desc); return -ENOMEM; } - // Read the first byte (Signature0) must be 0x52 or 0x10 - status = TIReadRom (serial, 0, 1, buffer); + /* Read the first byte (Signature0) must be 0x52 or 0x10 */ + status = read_rom(serial, 0, 1, buffer); if (status) - goto ExitTiValidateI2cImage; + goto out; if (*buffer != UMP5152 && *buffer != UMP3410) { - dev_err (dev, "%s - invalid buffer signature\n", __func__); + dev_err(dev, "%s - invalid buffer signature\n", __func__); status = -ENODEV; - goto ExitTiValidateI2cImage; + goto out; } do { - // Validate the I2C - status = TIReadRom (serial, + /* Validate the I2C */ + status = read_rom(serial, start_address, sizeof(struct ti_i2c_desc), (__u8 *)rom_desc); if (status) break; - if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) { + if ((start_address + sizeof(struct ti_i2c_desc) + + rom_desc->Size) > TI_MAX_I2C_SIZE) { status = -ENODEV; - dbg ("%s - structure too big, erroring out.", __func__); + dbg("%s - structure too big, erroring out.", __func__); break; } - dbg ("%s Type = 0x%x", __func__, rom_desc->Type); + dbg("%s Type = 0x%x", __func__, rom_desc->Type); - // Skip type 2 record + /* Skip type 2 record */ ttype = rom_desc->Type & 0x0f; - if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC - && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) { - // Read the descriptor data - status = TIReadRom(serial, - start_address+sizeof(struct ti_i2c_desc), - rom_desc->Size, - buffer); + if (ttype != I2C_DESC_TYPE_FIRMWARE_BASIC + && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO) { + /* Read the descriptor data */ + status = read_rom(serial, start_address + + sizeof(struct ti_i2c_desc), + rom_desc->Size, buffer); if (status) break; - status = ValidChecksum(rom_desc, buffer); + status = valid_csum(rom_desc, buffer); if (status) break; } - start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; + start_address = start_address + sizeof(struct ti_i2c_desc) + + rom_desc->Size; - } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE)); + } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && + (start_address < TI_MAX_I2C_SIZE)); - if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE)) + if ((rom_desc->Type != I2C_DESC_TYPE_ION) || + (start_address > TI_MAX_I2C_SIZE)) status = -ENODEV; -ExitTiValidateI2cImage: - kfree (buffer); - kfree (rom_desc); +out: + kfree(buffer); + kfree(rom_desc); return status; } -static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer) +static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer) { int status; int start_address; struct ti_i2c_desc *rom_desc; struct edge_ti_manuf_descriptor *desc; - rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); + rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL); if (!rom_desc) { - dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __func__); + dev_err(&serial->serial->dev->dev, "%s - out of memory\n", + __func__); return -ENOMEM; } - start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc); + start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_ION, + rom_desc); if (!start_address) { - dbg ("%s - Edge Descriptor not found in I2C", __func__); + dbg("%s - Edge Descriptor not found in I2C", __func__); status = -ENODEV; goto exit; } - // Read the descriptor data - status = TIReadRom (serial, - start_address+sizeof(struct ti_i2c_desc), - rom_desc->Size, - buffer); + /* Read the descriptor data */ + status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc), + rom_desc->Size, buffer); if (status) goto exit; - - status = ValidChecksum(rom_desc, buffer); - + + status = valid_csum(rom_desc, buffer); + desc = (struct edge_ti_manuf_descriptor *)buffer; - dbg ( "%s - IonConfig 0x%x", __func__, desc->IonConfig ); - dbg ( "%s - Version %d", __func__, desc->Version ); - dbg ( "%s - Cpu/Board 0x%x", __func__, desc->CpuRev_BoardRev ); - dbg ( "%s - NumPorts %d", __func__, desc->NumPorts ); - dbg ( "%s - NumVirtualPorts %d", __func__, desc->NumVirtualPorts ); - dbg ( "%s - TotalPorts %d", __func__, desc->TotalPorts ); + dbg("%s - IonConfig 0x%x", __func__, desc->IonConfig); + dbg("%s - Version %d", __func__, desc->Version); + dbg("%s - Cpu/Board 0x%x", __func__, desc->CpuRev_BoardRev); + dbg("%s - NumPorts %d", __func__, desc->NumPorts); + dbg("%s - NumVirtualPorts %d", __func__, desc->NumVirtualPorts); + dbg("%s - TotalPorts %d", __func__, desc->TotalPorts); exit: - kfree (rom_desc); + kfree(rom_desc); return status; } /* Build firmware header used for firmware update */ -static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) +static int build_i2c_fw_hdr(__u8 *header, struct device *dev) { __u8 *buffer; int buffer_size; @@ -889,24 +862,28 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) const struct firmware *fw; const char *fw_name = "edgeport/down3.bin"; - // In order to update the I2C firmware we must change the type 2 record to type 0xF2. - // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver - // will download the latest firmware (padded to 15.5k) into the UMP ram. - // And finally when the device comes back up in download mode the driver will cause - // the new firmware to be copied from the UMP Ram to I2C and the firmware will update - // the record type from 0xf2 to 0x02. - - // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record) - buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec)); - - buffer = kmalloc (buffer_size, GFP_KERNEL); + /* In order to update the I2C firmware we must change the type 2 record + * to type 0xF2. This will force the UMP to come up in Boot Mode. + * Then while in boot mode, the driver will download the latest + * firmware (padded to 15.5k) into the UMP ram. And finally when the + * device comes back up in download mode the driver will cause the new + * firmware to be copied from the UMP Ram to I2C and the firmware will + * update the record type from 0xf2 to 0x02. + */ + + /* Allocate a 15.5k buffer + 2 bytes for version number + * (Firmware Record) */ + buffer_size = (((1024 * 16) - 512 ) + + sizeof(struct ti_i2c_firmware_rec)); + + buffer = kmalloc(buffer_size, GFP_KERNEL); if (!buffer) { - dev_err (dev, "%s - out of memory\n", __func__); + dev_err(dev, "%s - out of memory\n", __func__); return -ENOMEM; } - + // Set entire image of 0xffs - memset (buffer, 0xff, buffer_size); + memset(buffer, 0xff, buffer_size); err = request_firmware(&fw, fw_name, dev); if (err) { @@ -921,16 +898,16 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) OperationalMinorVersion = fw->data[1]; OperationalBuildNumber = fw->data[2] | (fw->data[3] << 8); - // Copy version number into firmware record + /* Copy version number into firmware record */ firmware_rec = (struct ti_i2c_firmware_rec *)buffer; firmware_rec->Ver_Major = OperationalMajorVersion; firmware_rec->Ver_Minor = OperationalMinorVersion; - // Pointer to fw_down memory image + /* Pointer to fw_down memory image */ img_header = (struct ti_i2c_image_header *)&fw->data[4]; - memcpy (buffer + sizeof(struct ti_i2c_firmware_rec), + memcpy(buffer + sizeof(struct ti_i2c_firmware_rec), &fw->data[4 + sizeof(struct ti_i2c_image_header)], le16_to_cpu(img_header->Length)); @@ -940,12 +917,12 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) cs = (__u8)(cs + buffer[i]); } - kfree (buffer); + kfree(buffer); - // Build new header + /* Build new header */ i2c_header = (struct ti_i2c_desc *)header; firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data; - + i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK; i2c_header->Size = (__u16)buffer_size; i2c_header->CheckSum = cs; @@ -956,103 +933,100 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) } /* Try to figure out what type of I2c we have */ -static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial) +static int i2c_type_bootmode(struct edgeport_serial *serial) { int status; __u8 data; - - // Try to read type 2 - status = TIReadVendorRequestSync (serial->serial->dev, - UMPC_MEMORY_READ, // Request - DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type) - 0, // wIndex - &data, // TransferBuffer - 0x01); // TransferBufferLength + + /* Try to read type 2 */ + status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ, + DTK_ADDR_SPACE_I2C_TYPE_II, 0, &data, 0x01); if (status) - dbg ("%s - read 2 status error = %d", __func__, status); + dbg("%s - read 2 status error = %d", __func__, status); else - dbg ("%s - read 2 data = 0x%x", __func__, data); + dbg("%s - read 2 data = 0x%x", __func__, data); if ((!status) && (data == UMP5152 || data == UMP3410)) { - dbg ("%s - ROM_TYPE_II", __func__); + dbg("%s - ROM_TYPE_II", __func__); serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; return 0; } - // Try to read type 3 - status = TIReadVendorRequestSync (serial->serial->dev, - UMPC_MEMORY_READ, // Request - DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type) - 0, // wIndex - &data, // TransferBuffer - 0x01); // TransferBufferLength + /* Try to read type 3 */ + status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ, + DTK_ADDR_SPACE_I2C_TYPE_III, 0, &data, 0x01); if (status) - dbg ("%s - read 3 status error = %d", __func__, status); + dbg("%s - read 3 status error = %d", __func__, status); else - dbg ("%s - read 2 data = 0x%x", __func__, data); + dbg("%s - read 2 data = 0x%x", __func__, data); if ((!status) && (data == UMP5152 || data == UMP3410)) { - dbg ("%s - ROM_TYPE_III", __func__); + dbg("%s - ROM_TYPE_III", __func__); serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III; return 0; } - dbg ("%s - Unknown", __func__); + dbg("%s - Unknown", __func__); serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; return -ENODEV; } -static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent) +static int bulk_xfer(struct usb_serial *serial, void *buffer, + int length, int *num_sent) |