io_ti.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:71k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Edgeport USB Serial Converter driver
  3.  *
  4.  * Copyright(c) 2000-2002 Inside Out Networks, All rights reserved.
  5.  * Copyright(c) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * Supports the following devices:
  13.  * EP/1 EP/2 EP/4
  14.  *
  15.  * Version history:
  16.  *
  17.  * July 11, 2002  Removed 4 port device structure since all TI UMP 
  18.  * chips have only 2 ports 
  19.  * David Iacovelli (davidi@ionetworks.com)
  20.  *
  21.  */
  22. #include <linux/config.h>
  23. #include <linux/kernel.h>
  24. #include <linux/errno.h>
  25. #include <linux/init.h>
  26. #include <linux/slab.h>
  27. #include <linux/tty.h>
  28. #include <linux/tty_driver.h>
  29. #include <linux/tty_flip.h>
  30. #include <linux/module.h>
  31. #include <linux/spinlock.h>
  32. #include <linux/serial.h>
  33. #include <linux/ioctl.h>
  34. #include <asm/uaccess.h>
  35. #include <linux/usb.h>
  36. #ifdef CONFIG_USB_SERIAL_DEBUG
  37. static int debug = 1;
  38. #else
  39. static int debug;
  40. #endif
  41. #include "usb-serial.h"
  42. #include "io_16654.h"
  43. #include "io_usbvend.h"
  44. #include "io_ti.h"
  45. /*
  46.  * Version Information
  47.  */
  48. #define DRIVER_VERSION "v0.2"
  49. #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
  50. #define DRIVER_DESC "Edgeport USB Serial Driver"
  51. /* firmware image code */
  52. #define IMAGE_VERSION_NAME PagableOperationalCodeImageVersion
  53. #define IMAGE_ARRAY_NAME PagableOperationalCodeImage
  54. #define IMAGE_SIZE PagableOperationalCodeSize
  55. #include "io_fw_down3.h" /* Define array OperationalCodeImage[] */
  56. #define EPROM_PAGE_SIZE 64
  57. struct edgeport_uart_buf_desc {
  58. __u32 count; // Number of bytes currently in buffer
  59. };
  60. /* different hardware types */
  61. #define HARDWARE_TYPE_930 0
  62. #define HARDWARE_TYPE_TIUMP 1
  63. // IOCTL_PRIVATE_TI_GET_MODE Definitions
  64. #define TI_MODE_CONFIGURING 0   // Device has not entered start device 
  65. #define TI_MODE_BOOT 1   // Staying in boot mode
  66. #define TI_MODE_DOWNLOAD 2   // Made it to download mode
  67. #define TI_MODE_TRANSITIONING 3   // Currently in boot mode but transitioning to download mode
  68. /* Product information read from the Edgeport */
  69. struct product_info
  70. {
  71. int TiMode; // Current TI Mode
  72. __u8 hardware_type; // Type of hardware
  73. } __attribute__((packed));
  74. struct edgeport_port {
  75. __u16 uart_base;
  76. __u16 dma_address;
  77. __u8 shadow_msr;
  78. __u8 shadow_mcr;
  79. __u8 shadow_lsr;
  80. __u8 lsr_mask;
  81. __u32 ump_read_timeout; /* Number of miliseconds the UMP will
  82.    wait without data before completing
  83.    a read short */
  84. int baud_rate;
  85. int close_pending;
  86. int lsr_event;
  87. struct edgeport_uart_buf_desc tx;
  88. struct async_icount icount;
  89. wait_queue_head_t delta_msr_wait; /* for handling sleeping while
  90.    waiting for msr change to
  91.    happen */
  92. struct edgeport_serial *edge_serial;
  93. struct usb_serial_port *port;
  94. };
  95. struct edgeport_serial {
  96. struct product_info product_info;
  97. u8 TI_I2C_Type; // Type of I2C in UMP
  98. u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode
  99. int num_ports_open;
  100. struct usb_serial *serial;
  101. };
  102. /* Devices that this driver supports */
  103. static struct usb_device_id edgeport_1port_id_table [] = {
  104. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
  105. { }
  106. };
  107. static struct usb_device_id edgeport_2port_id_table [] = {
  108. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
  109. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
  110. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
  111. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421_BOOT) },
  112. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421_DOWN) },
  113. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
  114. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21_BOOT) },
  115. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21_DOWN) },
  116. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
  117. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
  118. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
  119. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22) },
  120. { }
  121. };
  122. /* Devices that this driver supports */
  123. static __devinitdata struct usb_device_id id_table_combined [] = {
  124. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
  125. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
  126. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
  127. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
  128. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421_BOOT) },
  129. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421_DOWN) },
  130. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
  131. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21_BOOT) },
  132. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21_DOWN) },
  133. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
  134. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
  135. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
  136. { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22) },
  137. { }
  138. };
  139. MODULE_DEVICE_TABLE (usb, id_table_combined);
  140. static struct EDGE_FIRMWARE_VERSION_INFO OperationalCodeImageVersion;
  141. static int TIStayInBootMode = 0;
  142. static int ignore_cpu_rev = 0;
  143. static void edge_set_termios (struct usb_serial_port *port, struct termios *old_termios);
  144. static int TIReadVendorRequestSync (struct usb_device *dev,
  145. __u8 request,
  146. __u16 value,
  147. __u16 index,
  148. u8  *data,
  149. int size)
  150. {
  151. int status;
  152. status = usb_control_msg (dev,
  153. usb_rcvctrlpipe(dev, 0),
  154. request,
  155. (USB_TYPE_VENDOR | 
  156.  USB_RECIP_DEVICE | 
  157.  USB_DIR_IN),
  158. value,
  159. index,
  160. data,
  161. size,
  162. HZ);
  163. if (status < 0)
  164. return status;
  165. if (status != size) {
  166. dbg ("%s - wanted to write %d, but only wrote %d",
  167.      __FUNCTION__, size, status);
  168. return -ECOMM;
  169. }
  170. return 0;
  171. }
  172. static int TISendVendorRequestSync (struct usb_device *dev,
  173. __u8 request,
  174. __u16 value,
  175. __u16 index,
  176. u8  *data,
  177. int size)
  178. {
  179. int status;
  180. status = usb_control_msg (dev,
  181. usb_sndctrlpipe(dev, 0),
  182. request,
  183. (USB_TYPE_VENDOR | 
  184.  USB_RECIP_DEVICE | 
  185.  USB_DIR_OUT),
  186. value,
  187. index,
  188. data,
  189. size,
  190. HZ);
  191. if (status < 0)
  192. return status;
  193. if (status != size) {
  194. dbg ("%s - wanted to write %d, but only wrote %d",
  195.      __FUNCTION__, size, status);
  196. return -ECOMM;
  197. }
  198. return 0;
  199. }
  200. static int TIWriteCommandSync (struct usb_device *dev, __u8 command,
  201. __u8 moduleid, __u16 value, u8 *data,
  202. int size)
  203. {
  204. return TISendVendorRequestSync (dev,
  205.   command,    // Request
  206.   value, // wValue 
  207.   moduleid, // wIndex
  208.   data, // TransferBuffer
  209.   size); // TransferBufferLength
  210. }
  211. /* clear tx/rx buffers and fifo in TI UMP */
  212. static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask)
  213. {
  214. int port_number = port->number - port->serial->minor;
  215. dbg ("%s - port %d, mask %x", __FUNCTION__, port_number, mask);
  216. return TIWriteCommandSync (port->serial->dev,
  217. UMPC_PURGE_PORT,
  218. (__u8)(UMPM_UART1_PORT + port_number),
  219. mask,
  220. NULL,
  221. 0);
  222. }
  223. /**
  224.  * TIReadDownloadMemory - Read edgeport memory from TI chip
  225.  * @dev: usb device pointer
  226.  * @address: Device CPU address at which to read
  227.  * @length: Length of above data
  228.  * @address_type: Can read both XDATA and I2C
  229.  * @buffer: pointer to input data buffer
  230.  */
  231. int TIReadDownloadMemory (struct usb_device *dev, int start_address, int length,
  232.   __u8 address_type, __u8 *buffer)
  233. {
  234. int status = 0;
  235. __u8 read_length;
  236. __u16 be_start_address;
  237. dbg ("%s - @ %x for %d", __FUNCTION__, start_address, length);
  238. /* Read in blocks of 64 bytes
  239.  * (TI firmware can't handle more than 64 byte reads)
  240.  */
  241. while (length) {
  242. if (length > 64)
  243. read_length= 64;
  244. else
  245. read_length = (__u8)length;
  246. if (read_length > 1) {
  247. dbg ("%s - @ %x for %d", __FUNCTION__, 
  248.      start_address, read_length);
  249. }
  250. be_start_address = cpu_to_be16 (start_address);
  251. status = TIReadVendorRequestSync (dev,
  252.   UMPC_MEMORY_READ, // Request
  253.   (__u16)address_type, // wValue (Address type)
  254.   be_start_address, // wIndex (Address to read)
  255.   buffer, // TransferBuffer
  256.   read_length); // TransferBufferLength
  257. if (status) {
  258. dbg ("%s - ERROR %x", __FUNCTION__, status);
  259. return status;
  260. }
  261. if (read_length > 1) {
  262. usb_serial_debug_data (__FILE__, __FUNCTION__,
  263.        read_length, buffer);
  264. }
  265. /* Update pointers/length */
  266. start_address += read_length;
  267. buffer += read_length;
  268. length -= read_length;
  269. }
  270. return status;
  271. }
  272. int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer)
  273. {
  274. return TIReadDownloadMemory (dev,
  275.      start_address,
  276.      length,
  277.      DTK_ADDR_SPACE_XDATA,
  278.      buffer);
  279. }
  280. /* Read edgeport memory to a given block */
  281. static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer)
  282. {
  283. int status = 0;
  284. int i;
  285. for (i=0; i< length; i++) {
  286. status = TIReadVendorRequestSync (serial->serial->dev,
  287. UMPC_MEMORY_READ, // Request
  288. serial->TI_I2C_Type, // wValue (Address type)
  289. (__u16)(start_address+i), // wIndex
  290. &buffer[i], // TransferBuffer
  291. 0x01); // TransferBufferLength
  292. if (status) {
  293. dbg ("%s - ERROR %x", __FUNCTION__, status);
  294. return status;
  295. }
  296. }
  297. dbg ("%s - start_address = %x, length = %d", __FUNCTION__, start_address, length);
  298. usb_serial_debug_data (__FILE__, __FUNCTION__, length, buffer);
  299. serial->TiReadI2C = 1;
  300. return status;
  301. }
  302. /* Write given block to TI EPROM memory */
  303. static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
  304. {
  305. int status = 0;
  306. int i;
  307. __u8 temp;
  308. /* Must do a read before write */
  309. if (!serial->TiReadI2C) {
  310. status = TIReadBootMemory(serial, 0, 1, &temp);
  311. if (status)
  312. return status;
  313. }
  314. for (i=0; i < length; ++i) {
  315. status = TISendVendorRequestSync (serial->serial->dev,
  316. UMPC_MEMORY_WRITE, // Request
  317. buffer[i], // wValue
  318. (__u16)(i+start_address), // wIndex
  319. NULL, // TransferBuffer
  320. 0); // TransferBufferLength
  321. if (status)
  322. return status;
  323. }
  324.    dbg ("%s - start_sddr = %x, length = %d", __FUNCTION__, start_address, length);
  325. usb_serial_debug_data (__FILE__, __FUNCTION__, length, buffer);
  326. return status;
  327. }
  328. /* Write edgeport I2C memory to TI chip */
  329. static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer)
  330. {
  331. int status = 0;
  332. int write_length;
  333. __u16 be_start_address;
  334. /* We can only send a maximum of 1 aligned byte page at a time */
  335. /* calulate the number of bytes left in the first page */
  336. write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1));
  337. if (write_length > length)
  338. write_length = length;
  339. dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __FUNCTION__, start_address, write_length);
  340. usb_serial_debug_data (__FILE__, __FUNCTION__, write_length, buffer);
  341. /* Write first page */
  342. be_start_address = cpu_to_be16 (start_address);
  343. status = TISendVendorRequestSync (serial->serial->dev,
  344. UMPC_MEMORY_WRITE, // Request
  345. (__u16)address_type, // wValue
  346. be_start_address, // wIndex
  347. buffer, // TransferBuffer
  348. write_length);
  349. if (status) {
  350. dbg ("%s - ERROR %d", __FUNCTION__, status);
  351. return status;
  352. }
  353. length -= write_length;
  354. start_address += write_length;
  355. buffer += write_length;
  356. /* We should be aligned now -- can write max page size bytes at a time */
  357. while (length) {
  358. if (length > EPROM_PAGE_SIZE)
  359. write_length = EPROM_PAGE_SIZE;
  360. else
  361. write_length = length;
  362. dbg ("%s - Page Write Addr = %x, length = %d", __FUNCTION__, start_address, write_length);
  363. usb_serial_debug_data (__FILE__, __FUNCTION__, write_length, buffer);
  364. /* Write next page */
  365. be_start_address = cpu_to_be16 (start_address);
  366. status = TISendVendorRequestSync (serial->serial->dev,
  367. UMPC_MEMORY_WRITE, // Request
  368. (__u16)address_type, // wValue
  369. be_start_address, // wIndex
  370. buffer,    // TransferBuffer
  371. write_length); // TransferBufferLength
  372. if (status) {
  373. dbg ("%s - ERROR %d", __FUNCTION__, status);
  374. return status;
  375. }
  376. length -= write_length;
  377. start_address += write_length;
  378. buffer += write_length;
  379. }
  380. return status;
  381. }
  382. /* Examine the UMP DMA registers and LSR
  383.  * 
  384.  * Check the MSBit of the X and Y DMA byte count registers.
  385.  * A zero in this bit indicates that the TX DMA buffers are empty
  386.  * then check the TX Empty bit in the UART.
  387.  */
  388. static int TIIsTxActive (struct edgeport_port *port)
  389. {
  390. int status;
  391. struct out_endpoint_desc_block *oedb;
  392. __u8 lsr;
  393. int bytes_left = 0;
  394. oedb = kmalloc (sizeof (* oedb), GFP_KERNEL);
  395. if (!oedb) {
  396. err ("%s - out of memory", __FUNCTION__);
  397. return -ENOMEM;
  398. }
  399. /* Read the DMA Count Registers */
  400. status = TIReadRam (port->port->serial->dev,
  401.     port->dma_address,
  402.     sizeof( *oedb),
  403.     (void *)oedb);
  404. if (status)
  405. goto exit_is_tx_active;
  406. dbg ("%s - XByteCount    0x%X", __FUNCTION__, oedb->XByteCount);
  407. /* and the LSR */
  408. status = TIReadRam (port->port->serial->dev, 
  409.     port->uart_base + UMPMEM_OFFS_UART_LSR,
  410.     1,
  411.     &lsr);
  412. if (status)
  413. goto exit_is_tx_active;
  414. dbg ("%s - LSR = 0x%X", __FUNCTION__, lsr);
  415. /* If either buffer has data or we are transmitting then return TRUE */
  416. if ((oedb->XByteCount & 0x80 ) != 0 )
  417. bytes_left += 64;
  418. if ((lsr & UMP_UART_LSR_TX_MASK ) == 0 )
  419. bytes_left += 1;
  420. /* We return Not Active if we get any kind of error */
  421. exit_is_tx_active:
  422. dbg ("%s - return %d", __FUNCTION__, bytes_left );
  423. return bytes_left;
  424. }
  425. static void TIChasePort(struct edgeport_port *port)
  426. {
  427. int loops;
  428. int last_count;
  429. int write_size;
  430. restart_tx_loop:
  431. // Base the LoopTime on the baud rate
  432. if (port->baud_rate == 0)
  433. port->baud_rate = 1200;
  434. write_size = port->tx.count;
  435. loops = max(100, (100*write_size)/(port->baud_rate/10));
  436. dbg ("%s - write_size %d, baud %d loop = %d", __FUNCTION__,
  437.      write_size, port->baud_rate, loops);
  438. while (1) {
  439. // Save Last count
  440. last_count = port->tx.count;
  441. dbg ("%s - Tx Buffer Size = %d loops = %d", __FUNCTION__,
  442.      last_count, loops);
  443. /* Is the Edgeport Buffer empty? */
  444. if (port->tx.count == 0)
  445. break;
  446. /* Block the thread for 10ms */
  447. wait_ms (10);
  448. if (last_count == port->tx.count) {
  449. /* No activity.. count down. */
  450. --loops;
  451. if (loops == 0) {
  452. dbg ("%s - Wait for TxEmpty - TIMEOUT",
  453.      __FUNCTION__);
  454. return;
  455. }
  456. } else {
  457. /* Reset timeout value back to a minimum of 1 second */
  458. dbg ("%s - Wait for TxEmpty  Reset Count", __FUNCTION__);
  459. goto restart_tx_loop;
  460. }
  461. }
  462. dbg ("%s - Local Tx Buffer Empty -- Waiting for TI UMP to EMPTY X/Y and FIFO",
  463.      __FUNCTION__);
  464. write_size = TIIsTxActive (port);
  465. loops = max(50, (100*write_size)/(port->baud_rate/10));
  466. dbg ("%s - write_size %d, baud %d loop = %d", __FUNCTION__, 
  467.      write_size, port->baud_rate, loops);
  468. while (1) {
  469. /* This function takes 4 ms; */
  470. if (!TIIsTxActive (port)) {
  471. /* Delay a few char times */
  472. wait_ms (50);
  473. dbg ("%s - Empty", __FUNCTION__);
  474. return;
  475. }
  476. --loops;
  477. if (loops == 0) {
  478. dbg ("%s - TIMEOUT", __FUNCTION__);
  479. return;
  480. }
  481. }
  482. }
  483. static int TIChooseConfiguration (struct usb_device *dev)
  484. {
  485. // There may be multiple configurations on this device, in which case
  486. // we would need to read and parse all of them to find out which one
  487. // we want. However, we just support one config at this point,
  488. // configuration # 1, which is Config Descriptor 0.
  489. dbg ("%s - Number of Interfaces = %d", __FUNCTION__, dev->config->bNumInterfaces);
  490. dbg ("%s - MAX Power            = %d", __FUNCTION__, dev->config->MaxPower*2);
  491. if (dev->config->bNumInterfaces != 1) {
  492. err ("%s - bNumInterfaces is not 1, ERROR!", __FUNCTION__);
  493. return -ENODEV;
  494. }
  495. return 0;
  496. }
  497. int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
  498. {
  499. int status;
  500. if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
  501. status = TIReadDownloadMemory (serial->serial->dev,
  502.        start_address,
  503.        length,
  504.        serial->TI_I2C_Type,
  505.        buffer);
  506. } else {
  507. status = TIReadBootMemory (serial,
  508.    start_address,
  509.    length,
  510.    buffer);
  511. }
  512. return status;
  513. }
  514. int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
  515. {
  516. if (serial->product_info.TiMode == TI_MODE_BOOT)
  517. return TIWriteBootMemory (serial,
  518.   start_address,
  519.   length,
  520.   buffer);
  521. if (serial->product_info.TiMode == TI_MODE_DOWNLOAD)
  522. return TIWriteDownloadI2C (serial,
  523.    start_address,
  524.    length,
  525.    serial->TI_I2C_Type,
  526.    buffer);
  527. return -EINVAL;
  528. }
  529. /* Read a descriptor header from I2C based on type */
  530. static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc)
  531. {
  532. int start_address;
  533. int status;
  534. /* Search for requested descriptor in I2C */
  535. start_address = 2;
  536. do {
  537. status = TIReadRom (serial,
  538.    start_address,
  539.    sizeof(struct ti_i2c_desc),
  540.    (__u8 *)rom_desc );
  541. if (status)
  542. return 0;
  543. if (rom_desc->Type == desc_type)
  544. return start_address;
  545. start_address = start_address + sizeof(struct ti_i2c_desc) +  rom_desc->Size;
  546. } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type);
  547. return 0;
  548. }
  549. /* Validate descriptor checksum */
  550. static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer)
  551. {
  552. __u16 i;
  553. __u8 cs = 0;
  554. for (i=0; i < rom_desc->Size; i++) {
  555. cs = (__u8)(cs + buffer[i]);
  556. }
  557. if (cs != rom_desc->CheckSum) {
  558. dbg ("%s - Mismatch %x - %x", __FUNCTION__, rom_desc->CheckSum, cs);
  559. return -EINVAL;
  560. }
  561. return 0;
  562. }
  563. /* Make sure that the I2C image is good */
  564. static int TiValidateI2cImage (struct edgeport_serial *serial)
  565. {
  566. int status = 0;
  567. struct ti_i2c_desc *rom_desc;
  568. int start_address = 2;
  569. __u8 *buffer;
  570. rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
  571. if (!rom_desc) {
  572. err ("%s - out of memory", __FUNCTION__);
  573. return -ENOMEM;
  574. }
  575. buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL);
  576. if (!buffer) {
  577. err ("%s - out of memory when allocating buffer", __FUNCTION__);
  578. kfree (rom_desc);
  579. return -ENOMEM;
  580. }
  581. // Read the first byte (Signature0) must be 0x52
  582. status = TIReadRom (serial, 0, 1, buffer);
  583. if (status)
  584. goto ExitTiValidateI2cImage; 
  585. if (*buffer != 0x52) {
  586. err ("%s - invalid buffer signature", __FUNCTION__);
  587. status = -ENODEV;
  588. goto ExitTiValidateI2cImage;
  589. }
  590. do {
  591. // Validate the I2C
  592. status = TIReadRom (serial,
  593. start_address,
  594. sizeof(struct ti_i2c_desc),
  595. (__u8 *)rom_desc);
  596. if (status)
  597. break;
  598. if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) {
  599. status = -ENODEV;
  600. dbg ("%s - structure too big, erroring out.", __FUNCTION__);
  601. break;
  602. }
  603. dbg ("%s Type = 0x%x", __FUNCTION__, rom_desc->Type);
  604. // Skip type 2 record
  605. if ((rom_desc->Type & 0x0f) != I2C_DESC_TYPE_FIRMWARE_BASIC) {
  606. // Read the descriptor data
  607. status = TIReadRom(serial,
  608. start_address+sizeof(struct ti_i2c_desc),
  609. rom_desc->Size,
  610. buffer);
  611. if (status)
  612. break;
  613. status = ValidChecksum(rom_desc, buffer);
  614. if (status)
  615. break;
  616. }
  617. start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size;
  618. } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE));
  619. if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE))
  620. status = -ENODEV;
  621. ExitTiValidateI2cImage:
  622. kfree (buffer);
  623. kfree (rom_desc);
  624. return status;
  625. }
  626. static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer)
  627. {
  628. int status;
  629. int start_address;
  630. struct ti_i2c_desc *rom_desc;
  631. struct edge_ti_manuf_descriptor *desc;
  632. rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
  633. if (!rom_desc) {
  634. err ("%s - out of memory", __FUNCTION__);
  635. return -ENOMEM;
  636. }
  637. start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc);
  638. if (!start_address) {
  639. dbg ("%s - Edge Descriptor not found in I2C", __FUNCTION__);
  640. status = -ENODEV;
  641. goto exit;
  642. }
  643. // Read the descriptor data
  644. status = TIReadRom (serial,
  645. start_address+sizeof(struct ti_i2c_desc),
  646. rom_desc->Size,
  647. buffer);
  648. if (status)
  649. goto exit;
  650. status = ValidChecksum(rom_desc, buffer);
  651. desc = (struct edge_ti_manuf_descriptor *)buffer;
  652. dbg ( "%s - IonConfig      0x%x", __FUNCTION__, desc->IonConfig  );
  653. dbg ( "%s - Version          %d", __FUNCTION__, desc->Version    );
  654. dbg ( "%s - Cpu/Board      0x%x", __FUNCTION__, desc->CpuRev_BoardRev );
  655. dbg ( "%s - NumPorts         %d", __FUNCTION__, desc->NumPorts   );
  656. dbg ( "%s - NumVirtualPorts  %d", __FUNCTION__, desc->NumVirtualPorts );
  657. dbg ( "%s - TotalPorts       %d", __FUNCTION__, desc->TotalPorts   );
  658. exit:
  659. kfree (rom_desc);
  660. return status;
  661. }
  662. /* Build firmware header used for firmware update */
  663. static int BuildI2CFirmwareHeader (__u8 *header)
  664. {
  665. __u8 *buffer;
  666. int buffer_size;
  667. int i;
  668. __u8 cs = 0;
  669. struct ti_i2c_desc *i2c_header;
  670. struct ti_i2c_image_header *img_header;
  671. struct ti_i2c_firmware_rec *firmware_rec;
  672. // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
  673. // This will force the UMP to come up in Boot Mode.  Then while in boot mode, the driver 
  674. // will download the latest firmware (padded to 15.5k) into the UMP ram. 
  675. // And finally when the device comes back up in download mode the driver will cause 
  676. // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
  677. // the record type from 0xf2 to 0x02.
  678. // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record)
  679. buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec));
  680. buffer = kmalloc (buffer_size, GFP_KERNEL);
  681. if (!buffer) {
  682. err ("%s - out of memory", __FUNCTION__);
  683. return -ENOMEM;
  684. }
  685. // Set entire image of 0xffs
  686. memset (buffer, 0xff, buffer_size);
  687. // Copy version number into firmware record
  688. firmware_rec = (struct ti_i2c_firmware_rec *)buffer;
  689. firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion;
  690. firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion;
  691. // Pointer to fw_down memory image
  692. img_header = (struct ti_i2c_image_header *)&PagableOperationalCodeImage[0];
  693. memcpy (buffer + sizeof(struct ti_i2c_firmware_rec),
  694. &PagableOperationalCodeImage[sizeof(struct ti_i2c_image_header)],
  695. img_header->Length);
  696. for (i=0; i < buffer_size; i++) {
  697. cs = (__u8)(cs + buffer[i]);
  698. }
  699. kfree (buffer);
  700. // Build new header
  701. i2c_header =  (struct ti_i2c_desc *)header;
  702. firmware_rec =  (struct ti_i2c_firmware_rec*)i2c_header->Data;
  703. i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK;
  704. i2c_header->Size = (__u16)buffer_size;
  705. i2c_header->CheckSum = cs;
  706. firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion;
  707. firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion;
  708. return 0;
  709. }
  710. /* Try to figure out what type of I2c we have */
  711. static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial)
  712. {
  713. int status;
  714. __u8 data;
  715. // Try to read type 2
  716. status = TIReadVendorRequestSync (serial->serial->dev,
  717. UMPC_MEMORY_READ, // Request
  718. DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type)
  719. 0,   // wIndex
  720. &data, // TransferBuffer
  721. 0x01); // TransferBufferLength
  722. if (status)
  723. dbg ("%s - read 2 status error = %d", __FUNCTION__, status);
  724. else
  725. dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data);
  726. if ((!status) && data == 0x52) {
  727. dbg ("%s - ROM_TYPE_II", __FUNCTION__);
  728. serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
  729. return 0;
  730. }
  731. // Try to read type 3
  732. status = TIReadVendorRequestSync (serial->serial->dev,
  733. UMPC_MEMORY_READ, // Request
  734. DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type)
  735. 0, // wIndex
  736. &data, // TransferBuffer
  737. 0x01); // TransferBufferLength
  738. if (status)
  739. dbg ("%s - read 3 status error = %d", __FUNCTION__, status);
  740. else
  741. dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data);
  742. if ((!status) && data == 0x52) {
  743. dbg ("%s - ROM_TYPE_III", __FUNCTION__);
  744. serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III;
  745. return 0;
  746. }
  747. dbg ("%s - Unknown", __FUNCTION__);
  748. serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
  749. return -ENODEV;
  750. }
  751. static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent)
  752. {
  753. int status;
  754. status = usb_bulk_msg (serial->dev,
  755. usb_sndbulkpipe(serial->dev,
  756. serial->port[0].bulk_out_endpointAddress),
  757. buffer,
  758. length,
  759. num_sent,
  760. HZ);
  761. return status;
  762. }
  763. /* Download given firmware image to the device (IN BOOT MODE) */
  764. static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length)
  765. {
  766. int status = 0;
  767. int pos;
  768. int transfer;
  769. int done;
  770. // Transfer firmware image
  771. for (pos = 0; pos < image_length; ) {
  772. // Read the next buffer from file
  773. transfer = image_length - pos;
  774. if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE)
  775. transfer = EDGE_FW_BULK_MAX_PACKET_SIZE;
  776. // Transfer data
  777. status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done);
  778. if (status)
  779. break;
  780. // Advance buffer pointer
  781. pos += done;
  782. }
  783. return status;
  784. }
  785. // FIXME!!!
  786. static int TIConfigureBootDevice (struct usb_device *dev)
  787. {
  788. return 0;
  789. }
  790. /**
  791.  * DownloadTIFirmware - Download run-time operating firmware to the TI5052
  792.  * 
  793.  * This routine downloads the main operating code into the TI5052, using the
  794.  * boot code already burned into E2PROM or ROM.
  795.  */
  796. static int TIDownloadFirmware (struct edgeport_serial *serial)
  797. {
  798. int status = 0;
  799. int start_address;
  800. struct edge_ti_manuf_descriptor *ti_manuf_desc;
  801. struct usb_interface_descriptor *interface;
  802. int download_cur_ver;
  803. int download_new_ver;
  804. /* This routine is entered by both the BOOT mode and the Download mode
  805.  * We can determine which code is running by the reading the config
  806.  * descriptor and if we have only one bulk pipe it is in boot mode
  807.  */
  808. serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP;
  809. /* Default to type 2 i2c */
  810. serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
  811. status = TIChooseConfiguration (serial->serial->dev);
  812. if (status)
  813. return status;
  814. interface = serial->serial->dev->config->interface->altsetting;
  815. if (!interface) {
  816. err ("%s - no interface set, error!", __FUNCTION__);
  817. return -ENODEV;
  818. }
  819. // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING
  820. // if we have more than one endpoint we are definitely in download mode
  821. if (interface->bNumEndpoints > 1)
  822. serial->product_info.TiMode = TI_MODE_DOWNLOAD;
  823. else
  824. // Otherwise we will remain in configuring mode
  825. serial->product_info.TiMode = TI_MODE_CONFIGURING;
  826. // Save Download Version Number
  827. OperationalCodeImageVersion.MajorVersion = PagableOperationalCodeImageVersion.MajorVersion;
  828. OperationalCodeImageVersion.MinorVersion = PagableOperationalCodeImageVersion.MinorVersion;
  829. OperationalCodeImageVersion.BuildNumber  = PagableOperationalCodeImageVersion.BuildNumber;
  830. /********************************************************************/
  831. /* Download Mode */
  832. /********************************************************************/
  833. if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
  834. struct ti_i2c_desc *rom_desc;
  835. dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN DOWNLOAD MODE>>>>>>>>>>", __FUNCTION__);
  836. status = TiValidateI2cImage (serial);
  837. if (status) {
  838. dbg ("%s - <<<<<<<<<<<<<<<DOWNLOAD MODE -- BAD I2C >>>>>>>>>>",
  839.      __FUNCTION__);
  840. return status;
  841. }
  842. /* Validate Hardware version number
  843.  * Read Manufacturing Descriptor from TI Based Edgeport
  844.  */
  845. ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL);
  846. if (!ti_manuf_desc) {
  847. err ("%s - out of memory.", __FUNCTION__);
  848. return -ENOMEM;
  849. }
  850. status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc);
  851. if (status) {
  852. kfree (ti_manuf_desc);
  853. return status;
  854. }
  855. // Check version number of ION descriptor
  856. if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) {
  857. dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, 
  858.      TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev));
  859. kfree (ti_manuf_desc);
  860.     return -EINVAL;
  861. }
  862. rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
  863. if (!rom_desc) {
  864. err ("%s - out of memory.", __FUNCTION__);
  865. kfree (ti_manuf_desc);
  866. return -ENOMEM;
  867. }
  868. // Search for type 2 record (firmware record)
  869. if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) {
  870. struct ti_i2c_firmware_rec *firmware_version;
  871. __u8 record;
  872. dbg ("%s - Found Type FIRMWARE (Type 2) record", __FUNCTION__);
  873. firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL);
  874. if (!firmware_version) {
  875. err ("%s - out of memory.", __FUNCTION__);
  876. kfree (rom_desc);
  877. kfree (ti_manuf_desc);
  878. return -ENOMEM;
  879. }
  880. // Validate version number
  881. // Read the descriptor data
  882. status = TIReadRom (serial,
  883. start_address+sizeof(struct ti_i2c_desc),
  884. sizeof(struct ti_i2c_firmware_rec),
  885. (__u8 *)firmware_version);
  886. if (status) {
  887. kfree (firmware_version);
  888. kfree (rom_desc);
  889. kfree (ti_manuf_desc);
  890. return status;
  891. }
  892. // Check version number of download with current version in I2c
  893. download_cur_ver = (firmware_version->Ver_Major << 8) + 
  894.    (firmware_version->Ver_Minor);
  895. download_new_ver = (OperationalCodeImageVersion.MajorVersion << 8) +
  896.    (OperationalCodeImageVersion.MinorVersion);
  897. dbg ("%s - >>>Firmware Versions Device %d.%d  Driver %d.%d",
  898.      __FUNCTION__,
  899.      firmware_version->Ver_Major,
  900.      firmware_version->Ver_Minor,
  901.      OperationalCodeImageVersion.MajorVersion,
  902.      OperationalCodeImageVersion.MinorVersion);
  903. // Check if we have an old version in the I2C and update if necessary
  904. if (download_cur_ver != download_new_ver) {
  905. dbg ("%s - Update I2C Download from %d.%d to %d.%d",
  906.      __FUNCTION__,
  907.      firmware_version->Ver_Major,
  908.      firmware_version->Ver_Minor,
  909.      OperationalCodeImageVersion.MajorVersion,
  910.      OperationalCodeImageVersion.MinorVersion);
  911. // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
  912. // This will force the UMP to come up in Boot Mode.  Then while in boot mode, the driver 
  913. // will download the latest firmware (padded to 15.5k) into the UMP ram. 
  914. // And finally when the device comes back up in download mode the driver will cause 
  915. // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
  916. // the record type from 0xf2 to 0x02.
  917. record = I2C_DESC_TYPE_FIRMWARE_BLANK;
  918. // Change the I2C Firmware record type to 0xf2 to trigger an update
  919. status = TIWriteRom (serial,
  920. start_address,
  921. sizeof(record),
  922. &record);
  923. if (status) {
  924. kfree (firmware_version);
  925. kfree (rom_desc);
  926. kfree (ti_manuf_desc);
  927. return status;
  928. }
  929. // verify the write -- must do this in order for write to 
  930. // complete before we do the hardware reset
  931. status = TIReadRom (serial,
  932. start_address,
  933. sizeof(record),
  934. &record);
  935. if (status) {
  936. kfree (firmware_version);
  937. kfree (rom_desc);
  938. kfree (ti_manuf_desc);
  939. return status;
  940. }
  941. if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
  942. err ("%s - error resetting device", __FUNCTION__);
  943. kfree (firmware_version);
  944. kfree (rom_desc);
  945. kfree (ti_manuf_desc);
  946. return -ENODEV;
  947. }
  948. dbg ("%s - HARDWARE RESET", __FUNCTION__);
  949. // Reset UMP -- Back to BOOT MODE
  950. status = TISendVendorRequestSync (serial->serial->dev,
  951. UMPC_HARDWARE_RESET, // Request
  952. 0, // wValue
  953. 0, // wIndex
  954. NULL, // TransferBuffer
  955. 0); // TransferBufferLength
  956. dbg ( "%s - HARDWARE RESET return %d", __FUNCTION__, status);
  957. /* return an error on purpose. */
  958. return -ENODEV;
  959. }
  960. }
  961. // Search for type 0xF2 record (firmware blank record)
  962. else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) {
  963. #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec))
  964. __u8 *header;
  965. __u8 *vheader;
  966. header  = kmalloc (HEADER_SIZE, GFP_KERNEL);
  967. if (!header) {
  968. err ("%s - out of memory.", __FUNCTION__);
  969. kfree (rom_desc);
  970. kfree (ti_manuf_desc);
  971. return -ENOMEM;
  972. }
  973. vheader = kmalloc (HEADER_SIZE, GFP_KERNEL);
  974. if (!vheader) {
  975. err ("%s - out of memory.", __FUNCTION__);
  976. kfree (header);
  977. kfree (rom_desc);
  978. kfree (ti_manuf_desc);
  979. return -ENOMEM;
  980. }
  981. dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __FUNCTION__);
  982. // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
  983. // This will force the UMP to come up in Boot Mode.  Then while in boot mode, the driver 
  984. // will download the latest firmware (padded to 15.5k) into the UMP ram. 
  985. // And finally when the device comes back up in download mode the driver will cause 
  986. // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
  987. // the record type from 0xf2 to 0x02.
  988. status = BuildI2CFirmwareHeader(header);
  989. if (status) {
  990. kfree (vheader);
  991. kfree (header);
  992. kfree (rom_desc);
  993. kfree (ti_manuf_desc);
  994. return status;
  995. }
  996. // Update I2C with type 0xf2 record with correct size and checksum
  997. status = TIWriteRom (serial,
  998. start_address,
  999. HEADER_SIZE,
  1000. header);
  1001. if (status) {
  1002. kfree (vheader);
  1003. kfree (header);
  1004. kfree (rom_desc);
  1005. kfree (ti_manuf_desc);
  1006. return status;
  1007. }
  1008. // verify the write -- must do this in order for write to 
  1009. // complete before we do the hardware reset
  1010. status = TIReadRom (serial,
  1011. start_address,
  1012. HEADER_SIZE,
  1013. vheader);
  1014. if (status) {
  1015. dbg ("%s - can't read header back", __FUNCTION__);
  1016. kfree (vheader);
  1017. kfree (header);
  1018. kfree (rom_desc);
  1019. kfree (ti_manuf_desc);
  1020. return status;
  1021. }
  1022. if (memcmp(vheader, header, HEADER_SIZE)) {
  1023. dbg ("%s - write download record failed", __FUNCTION__);
  1024. kfree (vheader);
  1025. kfree (header);
  1026. kfree (rom_desc);
  1027. kfree (ti_manuf_desc);
  1028. return status;
  1029. }
  1030. kfree (vheader);
  1031. kfree (header);
  1032. dbg ("%s - Start firmware update", __FUNCTION__);
  1033. // Tell firmware to copy download image into I2C 
  1034. status = TISendVendorRequestSync (serial->serial->dev,
  1035. UMPC_COPY_DNLD_TO_I2C, // Request
  1036. 0, // wValue 
  1037. 0, // wIndex
  1038. NULL, // TransferBuffer
  1039. 0); // TransferBufferLength
  1040.    dbg ("%s - Update complete 0x%x", __FUNCTION__, status);
  1041. if (status) {
  1042. dbg ("%s - UMPC_COPY_DNLD_TO_I2C failed", __FUNCTION__);
  1043. kfree (rom_desc);
  1044. kfree (ti_manuf_desc);
  1045. return status;
  1046. }
  1047. }
  1048. // The device is running the download code
  1049. kfree (rom_desc);
  1050. kfree (ti_manuf_desc);
  1051. return 0;
  1052. }
  1053. /********************************************************************/
  1054. /* Boot Mode */
  1055. /********************************************************************/
  1056. dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN BOOT MODE>>>>>>>>>>>>>>>",
  1057.      __FUNCTION__);
  1058. // Configure the TI device so we can use the BULK pipes for download
  1059. status = TIConfigureBootDevice (serial->serial->dev);
  1060. if (status)
  1061. return status;
  1062. if (serial->serial->dev->descriptor.idVendor != USB_VENDOR_ID_ION) {
  1063. dbg ("%s - VID = 0x%x", __FUNCTION__,
  1064.      serial->serial->dev->descriptor.idVendor);
  1065. serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
  1066. goto StayInBootMode;
  1067. }
  1068. // We have an ION device (I2c Must be programmed)
  1069. // Determine I2C image type
  1070. if (TIGetI2cTypeInBootMode(serial)) {
  1071. goto StayInBootMode;
  1072. }
  1073. // Registry variable set?
  1074. if (TIStayInBootMode) {
  1075. dbg ("%s - TIStayInBootMode", __FUNCTION__);
  1076. goto StayInBootMode;
  1077. }
  1078. // Check for ION Vendor ID and that the I2C is valid
  1079. if (!TiValidateI2cImage(serial)) {
  1080. struct ti_i2c_image_header *header;
  1081. int i;
  1082. __u8 cs = 0;
  1083. __u8 *buffer;
  1084. int buffer_size;
  1085. /* Validate Hardware version number
  1086.  * Read Manufacturing Descriptor from TI Based Edgeport
  1087.  */
  1088. ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL);
  1089. if (!ti_manuf_desc) {
  1090. err ("%s - out of memory.", __FUNCTION__);
  1091. return -ENOMEM;
  1092. }
  1093. status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc);
  1094. if (status) {
  1095. kfree (ti_manuf_desc);
  1096. goto StayInBootMode;
  1097. }
  1098. // Check for version 2
  1099. if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) {
  1100. dbg ("%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__,
  1101.      TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev));
  1102. kfree (ti_manuf_desc);
  1103. goto StayInBootMode;
  1104. }
  1105. kfree (ti_manuf_desc);
  1106. // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
  1107. // This will force the UMP to come up in Boot Mode.  Then while in boot mode, the driver 
  1108. // will download the latest firmware (padded to 15.5k) into the UMP ram. 
  1109. // And finally when the device comes back up in download mode the driver will cause 
  1110. // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
  1111. // the record type from 0xf2 to 0x02.
  1112. /*
  1113.  * Do we really have to copy the whole firmware image,
  1114.  * or could we do this in place!
  1115.  */
  1116. // Allocate a 15.5k buffer + 3 byte header
  1117. buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header));
  1118. buffer = kmalloc (buffer_size, GFP_KERNEL);
  1119. if (!buffer) {
  1120. err ("%s - out of memory", __FUNCTION__);
  1121. return -ENOMEM;
  1122. }
  1123. // Initialize the buffer to 0xff (pad the buffer)
  1124. memset (buffer, 0xff, buffer_size);
  1125. memcpy (buffer, &PagableOperationalCodeImage[0], PagableOperationalCodeSize);
  1126. for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) {
  1127. cs = (__u8)(cs + buffer[i]);
  1128. }
  1129. header = (struct ti_i2c_image_header *)buffer;
  1130. // update length and checksum after padding
  1131. header->Length   = (__u16)(buffer_size - sizeof(struct ti_i2c_image_header));
  1132. header->CheckSum = cs;
  1133. // Download the operational code 
  1134. dbg ("%s - Downloading operational code image (TI UMP)", __FUNCTION__);
  1135. status = TIDownloadCodeImage (serial, buffer, buffer_size);
  1136. kfree (buffer);
  1137. if (status) {
  1138.    dbg ("%s - Error downloading operational code image", __FUNCTION__);
  1139. return status;
  1140. }
  1141. // Device will reboot
  1142. serial->product_info.TiMode = TI_MODE_TRANSITIONING;
  1143.    dbg ("%s - Download successful -- Device rebooting...", __FUNCTION__);
  1144. /* return an error on purpose */
  1145. return -ENODEV;
  1146. }
  1147. StayInBootMode:
  1148. // Eprom is invalid or blank stay in boot mode
  1149. dbg ("%s - <<<<<<<<<<<<<<<STAYING IN BOOT MODE>>>>>>>>>>>>", __FUNCTION__);
  1150. serial->product_info.TiMode = TI_MODE_BOOT;
  1151. return 0;
  1152. }
  1153. static int TISetDtr (struct edgeport_port *port)
  1154. {
  1155. int port_number = port->port->number - port->port->serial->minor;
  1156. dbg ("%s", __FUNCTION__);
  1157. port->shadow_mcr |= MCR_DTR;
  1158. return TIWriteCommandSync (port->port->serial->dev,
  1159. UMPC_SET_CLR_DTR,
  1160. (__u8)(UMPM_UART1_PORT + port_number),
  1161. 1, /* set */
  1162. NULL,
  1163. 0);
  1164. }
  1165. static int TIClearDtr (struct edgeport_port *port)
  1166. {
  1167. int port_number = port->port->number - port->port->serial->minor;
  1168. dbg ("%s", __FUNCTION__);
  1169. port->shadow_mcr &= ~MCR_DTR;
  1170. return TIWriteCommandSync (port->port->serial->dev,
  1171. UMPC_SET_CLR_DTR,
  1172. (__u8)(UMPM_UART1_PORT + port_number),
  1173. 0, /* clear */
  1174. NULL,
  1175. 0);
  1176. }
  1177. static int TISetRts (struct edgeport_port *port)
  1178. {
  1179. int port_number = port->port->number - port->port->serial->minor;
  1180. dbg ("%s", __FUNCTION__);
  1181. port->shadow_mcr |= MCR_RTS;
  1182. return TIWriteCommandSync (port->port->serial->dev,
  1183. UMPC_SET_CLR_RTS,
  1184. (__u8)(UMPM_UART1_PORT + port_number),
  1185. 1, /* set */
  1186. NULL,
  1187. 0);
  1188. }
  1189. static int TIClearRts (struct edgeport_port *port)
  1190. {
  1191. int port_number = port->port->number - port->port->serial->minor;
  1192. dbg ("%s", __FUNCTION__);
  1193. port->shadow_mcr &= ~MCR_RTS;
  1194. return TIWriteCommandSync (port->port->serial->dev,
  1195. UMPC_SET_CLR_RTS,
  1196. (__u8)(UMPM_UART1_PORT + port_number),
  1197. 0, /* clear */
  1198. NULL,
  1199. 0);
  1200. }
  1201. static int TISetLoopBack (struct edgeport_port *port)
  1202. {
  1203. int port_number = port->port->number - port->port->serial->minor;
  1204. dbg ("%s", __FUNCTION__);
  1205. return TIWriteCommandSync (port->port->serial->dev,
  1206. UMPC_SET_CLR_LOOPBACK,
  1207. (__u8)(UMPM_UART1_PORT + port_number),
  1208. 1, /* set */
  1209. NULL,
  1210. 0);
  1211. }
  1212. static int TIClearLoopBack (struct edgeport_port *port)
  1213. {
  1214. int port_number = port->port->number - port->port->serial->minor;
  1215. dbg ("%s", __FUNCTION__);
  1216. return TIWriteCommandSync (port->port->serial->dev,
  1217. UMPC_SET_CLR_LOOPBACK,
  1218. (__u8)(UMPM_UART1_PORT + port_number),
  1219. 0, /* clear */
  1220. NULL,
  1221. 0);
  1222. }
  1223. static int TISetBreak (struct edgeport_port *port)
  1224. {
  1225. int port_number = port->port->number - port->port->serial->minor;
  1226. dbg ("%s", __FUNCTION__);
  1227. return TIWriteCommandSync (port->port->serial->dev,
  1228. UMPC_SET_CLR_BREAK,
  1229. (__u8)(UMPM_UART1_PORT + port_number),
  1230. 1, /* set */
  1231. NULL,
  1232. 0);
  1233. }
  1234. static int TIClearBreak (struct edgeport_port *port)
  1235. {
  1236. int port_number = port->port->number - port->port->serial->minor;
  1237. dbg ("%s", __FUNCTION__);
  1238. return TIWriteCommandSync (port->port->serial->dev,
  1239. UMPC_SET_CLR_BREAK,
  1240. (__u8)(UMPM_UART1_PORT + port_number),
  1241. 0, /* clear */
  1242. NULL,
  1243. 0);
  1244. }
  1245. static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr)
  1246. {
  1247. int status = 0;
  1248. dbg ("%s - %x", __FUNCTION__, mcr);
  1249. if (mcr & MCR_DTR)
  1250. status = TISetDtr (port);
  1251. else
  1252. status = TIClearDtr (port);
  1253. if (status)
  1254. return status;
  1255. if (mcr & MCR_RTS)
  1256. status = TISetRts (port);
  1257. else
  1258. status = TIClearRts (port);
  1259. if (status)
  1260. return status;
  1261. if (mcr & MCR_LOOPBACK)
  1262. status = TISetLoopBack (port);
  1263. else
  1264. status = TIClearLoopBack (port);
  1265. return status;
  1266. }
  1267. /* Convert TI LSR to standard UART flags */
  1268. static __u8 MapLineStatus (__u8 ti_lsr)
  1269. {
  1270. __u8 lsr = 0;
  1271. #define MAP_FLAG(flagUmp, flagUart)    
  1272. if (ti_lsr & flagUmp) lsr |= flagUart;
  1273. MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */
  1274. MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */
  1275. MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */
  1276. MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */
  1277. MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */
  1278. MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */
  1279. #undef MAP_FLAG
  1280. return lsr;
  1281. }
  1282. static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr)
  1283. {
  1284. struct async_icount *icount;
  1285. dbg ("%s - %02x", __FUNCTION__, msr);
  1286. if (msr & (MSR_DELTA_CTS | MSR_DELTA_DSR | MSR_DELTA_RI | MSR_DELTA_CD)) {
  1287. icount = &edge_port->icount;
  1288. /* update input line counters */
  1289. if (msr & MSR_DELTA_CTS)
  1290. icount->cts++;
  1291. if (msr & MSR_DELTA_DSR)
  1292. icount->dsr++;
  1293. if (msr & MSR_DELTA_CD)
  1294. icount->dcd++;
  1295. if (msr & MSR_DELTA_RI)
  1296. icount->rng++;
  1297. wake_up_interruptible (&edge_port->delta_msr_wait);
  1298. }
  1299. /* Save the new modem status */
  1300. edge_port->shadow_msr = msr & 0xf0;
  1301. return;
  1302. }
  1303. static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data)
  1304. {
  1305. struct async_icount *icount;
  1306. __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK));
  1307. dbg ("%s - %02x", __FUNCTION__, new_lsr);
  1308. edge_port->shadow_lsr = lsr;
  1309. if (new_lsr & LSR_BREAK) {
  1310. /*
  1311.  * Parity and Framing errors only count if they
  1312.  * occur exclusive of a break being received.
  1313.  */
  1314. new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
  1315. }
  1316. /* Place LSR data byte into Rx buffer */
  1317. if (lsr_data && edge_port->port->tty) {
  1318. tty_insert_flip_char(edge_port->port->tty, data, 0);
  1319. tty_flip_buffer_push(edge_port->port->tty);
  1320. }
  1321. /* update input line counters */
  1322. icount = &edge_port->icount;
  1323. if (new_lsr & LSR_BREAK)
  1324. icount->brk++;
  1325. if (new_lsr & LSR_OVER_ERR)
  1326. icount->overrun++;
  1327. if (new_lsr & LSR_PAR_ERR)
  1328. icount->parity++;
  1329. if (new_lsr & LSR_FRM_ERR)
  1330. icount->frame++;
  1331. }
  1332. static void edge_interrupt_callback (struct urb *urb)
  1333. {
  1334. struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context;
  1335. struct usb_serial_port *port;
  1336. struct edgeport_port *edge_port;
  1337. unsigned char *data = urb->transfer_buffer;
  1338. int length = urb->actual_length;
  1339. int port_number;
  1340. int function;
  1341. __u8 lsr;
  1342. __u8 msr;
  1343. dbg("%s", __FUNCTION__);
  1344. if (serial_paranoia_check (edge_serial->serial, __FUNCTION__)) {
  1345. return;
  1346. }
  1347. if (urb->status) {
  1348. dbg("%s - nonzero control read status received: %d", __FUNCTION__, urb->status);
  1349. return;
  1350. }
  1351. if (!length) {
  1352. dbg ("%s - no data in urb", __FUNCTION__);
  1353. return;
  1354. }
  1355. usb_serial_debug_data (__FILE__, __FUNCTION__, length, data);
  1356. if (length != 2) {
  1357. dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length);
  1358. return;
  1359. }
  1360. port_number = TIUMP_GET_PORT_FROM_CODE (data[0]);
  1361. function    = TIUMP_GET_FUNC_FROM_CODE (data[0]);
  1362. dbg ("%s - port_number %d, function %d, info 0x%x",
  1363.      __FUNCTION__, port_number, function, data[1]);
  1364. port = &edge_serial->serial->port[port_number];
  1365. if (port_paranoia_check (port, __FUNCTION__)) {
  1366. dbg ("%s - change found for port that is not present",
  1367.      __FUNCTION__);
  1368. return;
  1369. }
  1370. edge_port = port->private;
  1371. if (!edge_port) {
  1372. dbg ("%s - edge_port not found", __FUNCTION__);
  1373. return;
  1374. }
  1375. switch (function) {
  1376. case TIUMP_INTERRUPT_CODE_LSR:
  1377. lsr = MapLineStatus(data[1]);
  1378. if (lsr & UMP_UART_LSR_DATA_MASK) {
  1379. /* Save the LSR event for bulk read completion routine */
  1380. dbg ("%s - LSR Event Port %u LSR Status = %02x",
  1381.      __FUNCTION__, port_number, lsr);
  1382. edge_port->lsr_event = 1;
  1383. edge_port->lsr_mask = lsr;
  1384. } else {
  1385. dbg ("%s - ===== Port %d LSR Status = %02x ======",
  1386.      __FUNCTION__, port_number, lsr);
  1387. handle_new_lsr (edge_port, 0, lsr, 0);
  1388. }
  1389. break;
  1390. case TIUMP_INTERRUPT_CODE_MSR: // MSR
  1391. /* Copy MSR from UMP */
  1392. msr = data[1];
  1393. dbg ("%s - ===== Port %u MSR Status = %02x ======n",
  1394.      __FUNCTION__, port_number, msr);
  1395. handle_new_msr (edge_port, msr);
  1396. break;
  1397. default:
  1398. err ("%s - Unknown Interrupt code from UMP %xn",
  1399.      __FUNCTION__, data[1]);
  1400. break;
  1401. }
  1402. }
  1403. static void edge_bulk_in_callback (struct urb *urb)
  1404. {
  1405. struct edgeport_port *edge_port = (struct edgeport_port *)urb->context;
  1406. unsigned char *data = urb->transfer_buffer;
  1407. struct tty_struct *tty;
  1408. int status;
  1409. int i;
  1410. int port_number;
  1411. dbg("%s", __FUNCTION__);
  1412. if (port_paranoia_check (edge_port->port, __FUNCTION__))
  1413. return;
  1414. if (urb->status) {
  1415. dbg ("%s - nonzero read bulk status received: %d",
  1416.      __FUNCTION__, urb->status);
  1417. if (urb->status == -EPIPE) {
  1418. /* clear any problem that might have happened on this pipe */
  1419. usb_clear_halt (edge_port->port->serial->dev, urb->pipe);
  1420. goto exit;
  1421. }
  1422. return;
  1423. }
  1424. port_number = edge_port->port->number - edge_port->port->serial->minor;
  1425. if (edge_port->lsr_event) {
  1426. edge_port->lsr_event = 0;
  1427. dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======",
  1428.      __FUNCTION__, port_number, edge_port->lsr_mask, *data);
  1429. handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data);
  1430. /* Adjust buffer length/pointer */
  1431. --urb->actual_length;
  1432. ++data;
  1433. }
  1434. tty = edge_port->port->tty;
  1435. if (tty && urb->actual_length) {
  1436. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
  1437. if (edge_port->close_pending) {
  1438. dbg ("%s - close is pending, dropping data on the floor.", __FUNCTION__);
  1439. } else {
  1440. for (i = 0; i < urb->actual_length ; ++i) {
  1441. /* if we insert more than TTY_FLIPBUF_SIZE characters,
  1442.  * we drop them. */
  1443. if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
  1444. tty_flip_buffer_push(tty);
  1445. }
  1446. /* this doesn't actually push the data through unless
  1447.  * tty->low_latency is set */
  1448. tty_insert_flip_char(tty, data[i], 0);
  1449. }
  1450. tty_flip_buffer_push(tty);
  1451. }
  1452. edge_port->icount.rx += urb->actual_length;
  1453. }
  1454. exit:
  1455. /* continue always trying to read */
  1456. urb->dev = edge_port->port->serial->dev;
  1457. status = usb_submit_urb (urb);
  1458. if (status)
  1459. err ("%s - usb_submit_urb failed with result %d",
  1460.      __FUNCTION__, status);
  1461. }
  1462. static void edge_bulk_out_callback (struct urb *urb)
  1463. {
  1464. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  1465. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  1466. struct tty_struct *tty;
  1467. dbg ("%s - port %d", __FUNCTION__, port->number);
  1468. if (!serial) {
  1469. dbg ("%s - bad serial pointer, exiting", __FUNCTION__);
  1470. return;
  1471. }
  1472. if (urb->status) {
  1473. dbg ("%s - nonzero write bulk status received: %d",
  1474.      __FUNCTION__, urb->status);
  1475. if (urb->status == -EPIPE) {
  1476. /* clear any problem that might have happened on this pipe */
  1477. usb_clear_halt (serial->dev, urb->pipe);
  1478. }
  1479. return;
  1480. }
  1481. tty = port->tty;
  1482. if (tty) {
  1483. /* let the tty driver wakeup if it has a special write_wakeup function */
  1484. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) {
  1485. (tty->ldisc.write_wakeup)(tty);
  1486. }
  1487. /* tell the tty driver that something has changed */
  1488. wake_up_interruptible(&tty->write_wait);
  1489. }
  1490. }
  1491. static int edge_open (struct usb_serial_port *port, struct file * filp)
  1492. {
  1493. struct edgeport_port *edge_port = (struct edgeport_port *)port->private;
  1494. struct edgeport_serial *edge_serial;
  1495. struct usb_device *dev;
  1496. struct urb *urb;
  1497. int port_number;
  1498. int status;
  1499. u16 open_settings;
  1500. u8 transaction_timeout;
  1501. if (port_paranoia_check (port, __FUNCTION__))
  1502. return -ENODEV;
  1503. dbg("%s - port %d", __FUNCTION__, port->number);
  1504. if (edge_port == NULL)
  1505. return -ENODEV;
  1506. /* force low_latency on so that our tty_push actually forces the data through, 
  1507.    otherwise it is scheduled, and with high data rates (like with OHCI) data
  1508.    can get lost. */
  1509. if (port->tty)
  1510. port->tty->low_latency = 1;
  1511. port_number = port->number - port->serial->minor;
  1512. switch (port_number) {
  1513. case 0:
  1514. edge_port->uart_base = UMPMEM_BASE_UART1;
  1515. edge_port->dma_address = UMPD_OEDB1_ADDRESS;
  1516. break;
  1517. case 1:
  1518. edge_port->uart_base = UMPMEM_BASE_UART2;
  1519. edge_port->dma_address = UMPD_OEDB2_ADDRESS;
  1520. break;
  1521. default:
  1522. err ("Unknown port number!!!");
  1523. return -ENODEV;
  1524. }
  1525. dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x",
  1526.      __FUNCTION__, port_number, edge_port->uart_base, edge_port->dma_address);
  1527. dev = port->serial->dev;
  1528. memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount));
  1529. init_waitqueue_head (&edge_port->delta_msr_wait);
  1530. /* turn off loopback */
  1531. status = TIClearLoopBack (edge_port);
  1532. if (status)
  1533. return status;
  1534. /* set up the port settings */
  1535. edge_set_termios (port, NULL);
  1536. /* open up the port */
  1537. /* milliseconds to timeout for DMA transfer */
  1538. transaction_timeout = 2;
  1539. edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) );
  1540. // milliseconds to timeout for DMA transfer
  1541. open_settings = (u8)(UMP_DMA_MODE_CONTINOUS | 
  1542.      UMP_PIPE_TRANS_TIMEOUT_ENA | 
  1543.      (transaction_timeout << 2));
  1544. dbg ("%s - Sending UMPC_OPEN_PORT", __FUNCTION__);
  1545. /* Tell TI to open and start the port */
  1546. status = TIWriteCommandSync (dev,
  1547. UMPC_OPEN_PORT,
  1548. (u8)(UMPM_UART1_PORT + port_number),
  1549. open_settings,
  1550. NULL,
  1551. 0);
  1552. if (status)
  1553. return status;
  1554. /* Start the DMA? */
  1555. status = TIWriteCommandSync (dev,
  1556. UMPC_START_PORT,
  1557. (u8)(UMPM_UART1_PORT + port_number),
  1558. 0,
  1559. NULL,
  1560. 0);
  1561. if (status)
  1562. return status;
  1563. /* Clear TX and RX buffers in UMP */
  1564. status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN);
  1565. if (status)
  1566. return status;
  1567. /* Read Initial MSR */
  1568. status = TIReadVendorRequestSync (dev,
  1569. UMPC_READ_MSR, // Request
  1570. 0, // wValue
  1571. (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address)
  1572. &edge_port->shadow_msr, // TransferBuffer
  1573. 1); // TransferBufferLength
  1574. if (status)
  1575. return status;
  1576. dbg ("ShadowMSR 0x%X", edge_port->shadow_msr);
  1577.  
  1578. edge_serial = edge_port->edge_serial;
  1579. if (edge_serial->num_ports_open == 0) {
  1580. dbg ("%s - setting up bulk in urb", __FUNCTION__);
  1581. /* we are the first port to be opened, let's post the interrupt urb */
  1582. urb = edge_serial->serial->port[0].interrupt_in_urb;
  1583. if (!urb) {
  1584. err ("%s - no interrupt urb present, exiting", __FUNCTION__);
  1585. return -EINVAL;
  1586. }
  1587. urb->complete = edge_interrupt_callback;
  1588. urb->context = edge_serial;
  1589. urb->dev = dev;
  1590. status = usb_submit_urb (urb);
  1591. if (status) {
  1592. err ("%s - usb_submit_urb failed with value %d", __FUNCTION__, status);
  1593. return status;
  1594. }
  1595. }
  1596. /*
  1597.  * reset the data toggle on the bulk endpoints to work around bug in
  1598.  * host controllers where things get out of sync some times
  1599.  */
  1600. usb_clear_halt (dev, port->write_urb->pipe);
  1601. usb_clear_halt (dev, port->read_urb->pipe);
  1602. /* start up our bulk read urb */
  1603. urb = port->read_urb;
  1604. if (!urb) {
  1605. err ("%s - no read urb present, exiting", __FUNCTION__);
  1606. return -EINVAL;
  1607. }
  1608. urb->complete = edge_bulk_in_callback;
  1609. urb->context = edge_port;
  1610. urb->dev = dev;
  1611. status = usb_submit_urb (urb);
  1612. if (status) {
  1613. err ("%s - read bulk usb_submit_urb failed with value %d", __FUNCTION__, status);
  1614. return status;
  1615. }
  1616. ++edge_serial->num_ports_open;
  1617. dbg("%s - exited", __FUNCTION__);
  1618. return 0;
  1619. }
  1620. static void edge_close (struct usb_serial_port *port, struct file * filp)
  1621. {
  1622. struct usb_serial *serial;
  1623. struct edgeport_serial *edge_serial;
  1624. struct edgeport_port *edge_port;
  1625. int port_number;
  1626. int status;
  1627. if (port_paranoia_check (port, __FUNCTION__))
  1628. return;
  1629. dbg("%s - port %d", __FUNCTION__, port->number);
  1630.  
  1631. serial = get_usb_serial (port, __FUNCTION__);
  1632. if (!serial)
  1633. return;
  1634. edge_serial = (struct edgeport_serial *)serial->private;
  1635. edge_port = (struct edgeport_port *)port->private;
  1636. if ((edge_serial == NULL) || (edge_port == NULL))
  1637. return;
  1638. if (serial->dev) {
  1639. /* The bulkreadcompletion routine will check 
  1640.  * this flag and dump add read data */
  1641. edge_port->close_pending = 1;
  1642. /* chase the port close */
  1643. TIChasePort (edge_port);
  1644. usb_unlink_urb (port->read_urb);
  1645. /* assuming we can still talk to the device,
  1646.  * send a close port command to it */
  1647. dbg("%s - send umpc_close_port", __FUNCTION__);
  1648. port_number = port->number - port->serial->minor;
  1649. status = TIWriteCommandSync (port->serial->dev,
  1650.      UMPC_CLOSE_PORT,
  1651.      (__u8)(UMPM_UART1_PORT + port_number),
  1652.      0,
  1653.      NULL,
  1654.      0);
  1655. --edge_port->edge_serial->num_ports_open;
  1656. if (edge_port->edge_serial->num_ports_open <= 0) {
  1657. /* last port is now closed, let's shut down our interrupt urb */
  1658. usb_unlink_urb (serial->port[0].interrupt_in_urb);
  1659. edge_port->edge_serial->num_ports_open = 0;
  1660. }
  1661. edge_port->close_pending = 0;
  1662. }
  1663. dbg("%s - exited", __FUNCTION__);
  1664. }
  1665. static int edge_write (struct usb_serial_port *port, int from_user, const unsigned char *data, int count)
  1666. {
  1667. struct usb_serial *serial = port->serial;
  1668. struct edgeport_port *edge_port = port->private;
  1669. int result;
  1670. dbg("%s - port %d", __FUNCTION__, port->number);
  1671. if (count == 0) {
  1672. dbg("%s - write request of 0 bytes", __FUNCTION__);
  1673. return 0;
  1674. }
  1675. if (edge_port == NULL)
  1676. return -ENODEV;
  1677. if (edge_port->close_pending == 1)
  1678. return -ENODEV;
  1679. if (port->write_urb->status == -EINPROGRESS) {
  1680. dbg ("%s - already writing", __FUNCTION__);
  1681. return 0;
  1682. }
  1683. count = min (count, port->bulk_out_size);
  1684. if (from_user) {
  1685. if (copy_from_user(port->write_urb->transfer_buffer, data, count))
  1686. return -EFAULT;
  1687. } else {
  1688. memcpy (port->write_urb->transfer_buffer, data, count);
  1689. }
  1690. usb_serial_debug_data (__FILE__, __FUNCTION__, count, port->write_urb->transfer_buffer);
  1691. /* set up our urb */
  1692. usb_fill_bulk_urb (port->write_urb, serial->dev,
  1693.    usb_sndbulkpipe (serial->dev,
  1694.     port->bulk_out_endpointAddress),
  1695.    port->write_urb->transfer_buffer, count,
  1696.    edge_bulk_out_callback,
  1697.    port);
  1698. /* send the data out the bulk port */
  1699. result = usb_submit_urb(port->write_urb);
  1700. if (result)
  1701. err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
  1702. else
  1703. result = count;
  1704. if (result > 0)
  1705. edge_port->icount.tx += count;
  1706. return result;
  1707. }
  1708. static int edge_write_room (struct usb_serial_port *port)
  1709. {
  1710. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  1711. int room = 0;
  1712. dbg("%s", __FUNCTION__);
  1713. if (edge_port == NULL)
  1714. return -ENODEV;
  1715. if (edge_port->close_pending == 1)
  1716. return -ENODEV;
  1717. dbg("%s - port %d", __FUNCTION__, port->number);
  1718. if (port->write_urb->status != -EINPROGRESS)
  1719. room = port->bulk_out_size;
  1720. dbg("%s - returns %d", __FUNCTION__, room);
  1721. return room;
  1722. }
  1723. static int edge_chars_in_buffer (struct usb_serial_port *port)
  1724. {
  1725. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  1726. int chars = 0;
  1727. dbg("%s", __FUNCTION__);
  1728. if (edge_port == NULL)
  1729. return -ENODEV;
  1730. if (edge_port->close_pending == 1)
  1731. return -ENODEV;
  1732. dbg("%s - port %d", __FUNCTION__, port->number);
  1733. if (port->write_urb->status == -EINPROGRESS)
  1734. chars = port->write_urb->transfer_buffer_length;
  1735. dbg ("%s - returns %d", __FUNCTION__, chars);
  1736. return chars;
  1737. }
  1738. static void edge_throttle (struct usb_serial_port *port)
  1739. {
  1740. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  1741. struct tty_struct *tty;
  1742. int status;
  1743. dbg("%s - port %d", __FUNCTION__, port->number);
  1744. if (edge_port == NULL)
  1745. return;
  1746. tty = port->tty;
  1747. if (!tty) {
  1748. dbg ("%s - no tty available", __FUNCTION__);
  1749. return;
  1750. }
  1751. /* if we are implementing XON/XOFF, send the stop character */
  1752. if (I_IXOFF(tty)) {
  1753. unsigned char stop_char = STOP_CHAR(tty);
  1754. status = edge_write (port, 0, &stop_char, 1);
  1755. if (status <= 0) {
  1756. return;
  1757. }
  1758. }
  1759. /* if we are implementing RTS/CTS, toggle that line */
  1760. if (tty->termios->c_cflag & CRTSCTS) {
  1761. status = TIClearRts (edge_port);
  1762. }
  1763. usb_unlink_urb (port->read_urb);
  1764. }
  1765. static void edge_unthrottle (struct usb_serial_port *port)
  1766. {
  1767. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  1768. struct tty_struct *tty;
  1769. int status;
  1770. dbg("%s - port %d", __FUNCTION__, port->number);
  1771. if (edge_port == NULL)
  1772. return;
  1773. tty = port->tty;
  1774. if (!tty) {
  1775. dbg ("%s - no tty available", __FUNCTION__);
  1776. return;
  1777. }
  1778. /* if we are implementing XON/XOFF, send the start character */
  1779. if (I_IXOFF(tty)) {
  1780. unsigned char start_char = START_CHAR(tty);
  1781. status = edge_write (port, 0, &start_char, 1);
  1782. if (status <= 0) {
  1783. return;
  1784. }
  1785. }
  1786. /* if we are implementing RTS/CTS, toggle that line */
  1787. if (tty->termios->c_cflag & CRTSCTS) {
  1788. status = TISetRts (edge_port);
  1789. }
  1790. port->read_urb->dev = port->serial->dev;
  1791. status = usb_submit_urb (port->read_urb);
  1792. if (status) {
  1793. err ("%s - usb_submit_urb failed with value %d", __FUNCTION__, status);
  1794. }
  1795. }
  1796. static void change_port_settings (struct edgeport_port *edge_port, struct termios *old_termios)
  1797. {
  1798. struct ump_uart_config *config;
  1799. struct tty_struct *tty;
  1800. int baud;
  1801. int round;
  1802. unsigned cflag;
  1803. int status;
  1804. int port_number = edge_port->port->number - edge_port->port->serial->minor;
  1805. dbg("%s - port %d", __FUNCTION__, edge_port->port->number);
  1806. tty = edge_port->port->tty;
  1807. if ((!tty) ||
  1808.     (!tty->termios)) {
  1809. dbg("%s - no tty structures", __FUNCTION__);
  1810. return;
  1811. }
  1812. config = kmalloc (sizeof (*config), GFP_KERNEL);
  1813. if (!config) {
  1814. err ("%s - out of memory", __FUNCTION__);
  1815. return;
  1816. }
  1817. cflag = tty->termios->c_cflag;
  1818. config->wFlags = 0;
  1819. /* These flags must be set */
  1820. config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT;
  1821. config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR;
  1822. config->bUartMode = 0;
  1823. switch (cflag & CSIZE) {
  1824. case CS5:
  1825.     config->bDataBits = UMP_UART_CHAR5BITS;
  1826.     dbg ("%s - data bits = 5", __FUNCTION__);
  1827.     break;
  1828. case CS6:
  1829.     config->bDataBits = UMP_UART_CHAR6BITS;
  1830.     dbg ("%s - data bits = 6", __FUNCTION__);
  1831.     break;
  1832. case CS7:
  1833.     config->bDataBits = UMP_UART_CHAR7BITS;
  1834.     dbg ("%s - data bits = 7", __FUNCTION__);
  1835.     break;
  1836. default:
  1837. case CS8:
  1838.     config->bDataBits = UMP_UART_CHAR8BITS;
  1839.     dbg ("%s - data bits = 8", __FUNCTION__);
  1840.     break;
  1841. }
  1842. if (cflag & PARENB) {
  1843. if (cflag & PARODD) {
  1844. config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
  1845. config->bParity = UMP_UART_ODDPARITY;
  1846. dbg("%s - parity = odd", __FUNCTION__);
  1847. } else {
  1848. config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
  1849. config->bParity = UMP_UART_EVENPARITY;
  1850. dbg("%s - parity = even", __FUNCTION__);
  1851. }
  1852. } else {
  1853. config->bParity = UMP_UART_NOPARITY; 
  1854. dbg("%s - parity = none", __FUNCTION__);
  1855. }
  1856. if (cflag & CSTOPB) {
  1857. config->bStopBits = UMP_UART_STOPBIT2;
  1858. dbg("%s - stop bits = 2", __FUNCTION__);
  1859. } else {
  1860. config->bStopBits = UMP_UART_STOPBIT1;
  1861. dbg("%s - stop bits = 1", __FUNCTION__);
  1862. }
  1863. /* figure out the flow control settings */
  1864. if (cflag & CRTSCTS) {
  1865. config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW;
  1866. config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW;
  1867. dbg("%s - RTS/CTS is enabled", __FUNCTION__);
  1868. } else {
  1869. dbg("%s - RTS/CTS is disabled", __FUNCTION__);
  1870. }
  1871. /* if we are implementing XON/XOFF, set the start and stop character in the device */
  1872. if (I_IXOFF(tty) || I_IXON(tty)) {
  1873. config->cXon  = START_CHAR(tty);
  1874. config->cXoff = STOP_CHAR(tty);
  1875. /* if we are implementing INBOUND XON/XOFF */
  1876. if (I_IXOFF(tty)) {
  1877. config->wFlags |= UMP_MASK_UART_FLAGS_IN_X;
  1878. dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
  1879.      __FUNCTION__, config->cXon, config->cXoff);
  1880. } else {
  1881. dbg ("%s - INBOUND XON/XOFF is disabled", __FUNCTION__);
  1882. }
  1883. /* if we are implementing OUTBOUND XON/XOFF */
  1884. if (I_IXON(tty)) {
  1885. config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X;
  1886. dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
  1887.      __FUNCTION__, config->cXon, config->cXoff);
  1888. } else {
  1889. dbg ("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__);
  1890. }
  1891. }
  1892. /* Round the baud rate */
  1893. baud = tty_get_baud_rate(tty);
  1894. if (!baud) {
  1895. /* pick a default, any default... */
  1896. baud = 9600;
  1897. }
  1898. config->wBaudRate = (__u16)(461550L / baud);
  1899. round = 4615500L / baud;
  1900. if ((round - (config->wBaudRate * 10)) >= 5)
  1901. config->wBaudRate++;
  1902. dbg ("%s - baud rate = %d, wBaudRate = %d", __FUNCTION__, baud, config->wBaudRate);
  1903. dbg ("wBaudRate:   %d", (int)(461550L / config->wBaudRate));
  1904. dbg ("wFlags:    0x%x", config->wFlags);
  1905. dbg ("bDataBits:   %d", config->bDataBits);
  1906. dbg ("bParity:     %d", config->bParity);
  1907. dbg ("bStopBits:   %d", config->bStopBits);
  1908. dbg ("cXon:        %d", config->cXon);
  1909. dbg ("cXoff:       %d", config->cXoff);
  1910. dbg ("bUartMode:   %d", config->bUartMode);
  1911. /* move the word values into big endian mode */
  1912. cpu_to_be16s (&config->wFlags);
  1913. cpu_to_be16s (&config->wBaudRate);
  1914. status = TIWriteCommandSync (edge_port->port->serial->dev,
  1915. UMPC_SET_CONFIG,
  1916. (__u8)(UMPM_UART1_PORT + port_number),
  1917. 0,
  1918. (__u8 *)config,
  1919. sizeof(*config));
  1920. if (status) {
  1921. dbg ("%s - error %d when trying to write config to device",
  1922.      __FUNCTION__, status);
  1923. }
  1924. kfree (config);
  1925. return;
  1926. }
  1927. static void edge_set_termios (struct usb_serial_port *port, struct termios *old_termios)
  1928. {
  1929. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  1930. struct tty_struct *tty = port->tty;
  1931. unsigned int cflag;
  1932. if (!port->tty || !port->tty->termios) {
  1933. dbg ("%s - no tty or termios", __FUNCTION__);
  1934. return;
  1935. }
  1936. cflag = tty->termios->c_cflag;
  1937. /* check that they really want us to change something */
  1938. if (old_termios) {
  1939. if ((cflag == old_termios->c_cflag) &&
  1940.     (RELEVANT_IFLAG(tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
  1941. dbg ("%s - nothing to change", __FUNCTION__);
  1942. return;
  1943. }
  1944. }
  1945. dbg("%s - clfag %08x iflag %08x", __FUNCTION__, 
  1946.     tty->termios->c_cflag,
  1947.     RELEVANT_IFLAG(tty->termios->c_iflag));
  1948. if (old_termios) {
  1949. dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__,
  1950.     old_termios->c_cflag,
  1951.     RELEVANT_IFLAG(old_termios->c_iflag));
  1952. }
  1953. dbg("%s - port %d", __FUNCTION__, port->number);
  1954. if (edge_port == NULL)
  1955. return;
  1956. /* change the port settings to the new ones specified */
  1957. change_port_settings (edge_port, old_termios);
  1958. return;
  1959. }
  1960. static int set_modem_info (struct edgeport_port *edge_port, unsigned int cmd, unsigned int *value)
  1961. {
  1962. unsigned int mcr = edge_port->shadow_mcr;
  1963. unsigned int arg;
  1964. if (copy_from_user(&arg, value, sizeof(int)))
  1965. return -EFAULT;
  1966. switch (cmd) {
  1967. case TIOCMBIS:
  1968. if (arg & TIOCM_RTS)
  1969. mcr |= MCR_RTS;
  1970. if (arg & TIOCM_DTR)
  1971. mcr |= MCR_RTS;
  1972. if (arg & TIOCM_LOOP)
  1973. mcr |= MCR_LOOPBACK;
  1974. break;
  1975. case TIOCMBIC:
  1976. if (arg & TIOCM_RTS)
  1977. mcr &= ~MCR_RTS;
  1978. if (arg & TIOCM_DTR)
  1979. mcr &= ~MCR_RTS;
  1980. if (arg & TIOCM_LOOP)
  1981. mcr &= ~MCR_LOOPBACK;
  1982. break;
  1983. case TIOCMSET:
  1984. /* turn off the RTS and DTR and LOOPBACK 
  1985.  * and then only turn on what was asked to */
  1986. mcr &=  ~(MCR_RTS | MCR_DTR | MCR_LOOPBACK);
  1987. mcr |= ((arg & TIOCM_RTS) ? MCR_RTS : 0);
  1988. mcr |= ((arg & TIOCM_DTR) ? MCR_DTR : 0);
  1989. mcr |= ((arg & TIOCM_LOOP) ? MCR_LOOPBACK : 0);
  1990. break;
  1991. }
  1992. edge_port->shadow_mcr = mcr;
  1993. TIRestoreMCR (edge_port, mcr);
  1994. return 0;
  1995. }
  1996. static int get_modem_info (struct edgeport_port *edge_port, unsigned int *value)
  1997. {
  1998. unsigned int result = 0;
  1999. unsigned int msr = edge_port->shadow_msr;
  2000. unsigned int mcr = edge_port->shadow_mcr;
  2001. result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0)   /* 0x002 */
  2002.   | ((mcr & MCR_RTS) ? TIOCM_RTS: 0)   /* 0x004 */
  2003.   | ((msr & MSR_CTS) ? TIOCM_CTS: 0)   /* 0x020 */
  2004.   | ((msr & MSR_CD) ? TIOCM_CAR: 0)   /* 0x040 */
  2005.   | ((msr & MSR_RI) ? TIOCM_RI:  0)   /* 0x080 */
  2006.   | ((msr & MSR_DSR) ? TIOCM_DSR: 0);  /* 0x100 */
  2007. dbg("%s -- %x", __FUNCTION__, result);
  2008. if (copy_to_user(value, &result, sizeof(int)))
  2009. return -EFAULT;
  2010. return 0;
  2011. }
  2012. static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct * retinfo)
  2013. {
  2014. struct serial_struct tmp;
  2015. if (!retinfo)
  2016. return -EFAULT;
  2017. memset(&tmp, 0, sizeof(tmp));
  2018. tmp.type = PORT_16550A;
  2019. tmp.line = edge_port->port->serial->minor;
  2020. tmp.port = edge_port->port->number;
  2021. tmp.irq = 0;
  2022. tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
  2023. tmp.xmit_fifo_size = edge_port->port->bulk_out_size;
  2024. tmp.baud_base = 9600;
  2025. tmp.close_delay = 5*HZ;
  2026. tmp.closing_wait = 30*HZ;
  2027. // tmp.custom_divisor = state->custom_divisor;
  2028. // tmp.hub6 = state->hub6;
  2029. // tmp.io_type = state->io_type;
  2030. if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
  2031. return -EFAULT;
  2032. return 0;
  2033. }
  2034. static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
  2035. {
  2036. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  2037. struct async_icount cnow;
  2038. struct async_icount cprev;
  2039. dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd);
  2040. switch (cmd) {
  2041. case TIOCINQ:
  2042. dbg("%s - (%d) TIOCINQ", __FUNCTION__, port->number);
  2043. // return get_number_bytes_avail(edge_port, (unsigned int *) arg);
  2044. break;
  2045. case TIOCSERGETLSR:
  2046. dbg("%s - (%d) TIOCSERGETLSR", __FUNCTION__, port->number);
  2047. // return get_lsr_info(edge_port, (unsigned int *) arg);
  2048. break;
  2049. case TIOCMBIS:
  2050. case TIOCMBIC:
  2051. case TIOCMSET:
  2052. dbg("%s - (%d) TIOCMSET/TIOCMBIC/TIOCMSET", __FUNCTION__, port->number);
  2053. return set_modem_info(edge_port, cmd, (unsigned int *) arg);
  2054. break;
  2055. case TIOCMGET:  
  2056. dbg("%s - (%d) TIOCMGET", __FUNCTION__, port->number);
  2057. return get_modem_info(edge_port, (unsigned int *) arg);
  2058. break;
  2059. case TIOCGSERIAL:
  2060. dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number);
  2061. return get_serial_info(edge_port, (struct serial_struct *) arg);
  2062. break;
  2063. case TIOCSSERIAL:
  2064. dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number);
  2065. break;
  2066. case TIOCMIWAIT:
  2067. dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number);
  2068. cprev = edge_port->icount;
  2069. while (1) {
  2070. interruptible_sleep_on(&edge_port->delta_msr_wait);
  2071. /* see if a signal did it */
  2072. if (signal_pending(current))
  2073. return -ERESTARTSYS;
  2074. cnow = edge_port->icount;
  2075. if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
  2076.     cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
  2077. return -EIO; /* no change => error */
  2078. if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
  2079.     ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
  2080.     ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
  2081.     ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
  2082. return 0;
  2083. }
  2084. cprev = cnow;
  2085. }
  2086. /* not reached */
  2087. break;
  2088. case TIOCGICOUNT:
  2089. dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__,
  2090.      port->number, edge_port->icount.rx, edge_port->icount.tx);
  2091. if (copy_to_user((void *)arg, &edge_port->icount, sizeof(edge_port->icount)))
  2092. return -EFAULT;
  2093. return 0;
  2094. }
  2095. return -ENOIOCTLCMD;
  2096. }
  2097. static void edge_break (struct usb_serial_port *port, int break_state)
  2098. {
  2099. struct edgeport_port *edge_port = (struct edgeport_port *)(port->private);
  2100. int status;
  2101. dbg ("%s - state = %d", __FUNCTION__, break_state);
  2102. /* chase the port close */
  2103. TIChasePort (edge_port);
  2104. if (break_state == -1) {
  2105. status = TISetBreak (edge_port);
  2106. } else {
  2107. status = TIClearBreak (edge_port);
  2108. }
  2109. if (status) {
  2110. dbg ("%s - error %d sending break set/clear command.",
  2111.      __FUNCTION__, status);
  2112. }
  2113. }
  2114. static int edge_startup (struct usb_serial *serial)
  2115. {
  2116. struct edgeport_serial *edge_serial;
  2117. struct edgeport_port *edge_port;
  2118. struct usb_device *dev;
  2119. int status;
  2120. int i;
  2121. dev = serial->dev;
  2122. /* create our private serial structure */
  2123. edge_serial = kmalloc (sizeof(struct edgeport_serial), GFP_KERNEL);
  2124. if (edge_serial == NULL) {
  2125. err("%s - Out of memory", __FUNCTION__);
  2126. return -ENOMEM;
  2127. }
  2128. memset (edge_serial, 0, sizeof(struct edgeport_serial));
  2129. edge_serial->serial = serial;
  2130. serial->private = edge_serial;
  2131. status = TIDownloadFirmware (edge_serial);
  2132. if (status) {
  2133. kfree (edge_serial);
  2134. return status;
  2135. }
  2136. /* set up our port private structures */
  2137. for (i = 0; i < serial->num_ports; ++i) {
  2138. edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL);
  2139. if (edge_port == NULL) {
  2140. err("%s - Out of memory", __FUNCTION__);
  2141. return -ENOMEM;
  2142. }
  2143. memset (edge_port, 0, sizeof(struct edgeport_port));
  2144. edge_port->port = &serial->port[i];
  2145. edge_port->edge_serial = edge_serial;
  2146. serial->port[i].private = edge_port;
  2147. }
  2148. return 0;
  2149. }
  2150. static void edge_shutdown (struct usb_serial *serial)
  2151. {
  2152. int i;
  2153. dbg ("%s", __FUNCTION__);
  2154. for (i=0; i < serial->num_ports; ++i) {
  2155. kfree (serial->port[i].private);
  2156. serial->port[i].private = NULL;
  2157. }
  2158. kfree (serial->private);
  2159. serial->private = NULL;
  2160. }
  2161. static struct usb_serial_device_type edgeport_1port_device = {
  2162. owner: THIS_MODULE,
  2163. name: "Edgeport TI 1 port adapter",
  2164. id_table: edgeport_1port_id_table,
  2165. num_interrupt_in: 1,
  2166. num_bulk_in: 1,
  2167. num_bulk_out: 1,
  2168. num_ports: 1,
  2169. open: edge_open,
  2170. close: edge_close,
  2171. throttle: edge_throttle,
  2172. unthrottle: edge_unthrottle,
  2173. startup: edge_startup,
  2174. shutdown: edge_shutdown,
  2175. ioctl: edge_ioctl,
  2176. set_termios: edge_set_termios,
  2177. write: edge_write,
  2178. write_room: edge_write_room,
  2179. chars_in_buffer: edge_chars_in_buffer,
  2180. break_ctl: edge_break,
  2181. };
  2182. static struct usb_serial_device_type edgeport_2port_device = {
  2183. owner: THIS_MODULE,
  2184. name: "Edgeport TI 2 port adapter",
  2185. id_table: edgeport_2port_id_table,
  2186. num_interrupt_in: 1,
  2187. num_bulk_in: 2,
  2188. num_bulk_out: 2,
  2189. num_ports: 2,
  2190. open: edge_open,
  2191. close: edge_close,
  2192. throttle: edge_throttle,
  2193. unthrottle: edge_unthrottle,
  2194. startup: edge_startup,
  2195. shutdown: edge_shutdown,
  2196. ioctl: edge_ioctl,
  2197. set_termios: edge_set_termios,
  2198. write: edge_write,
  2199. write_room: edge_write_room,
  2200. chars_in_buffer: edge_chars_in_buffer,
  2201. break_ctl: edge_break,
  2202. };
  2203. static int __init edgeport_init(void)
  2204. {
  2205. usb_serial_register (&edgeport_1port_device);
  2206. usb_serial_register (&edgeport_2port_device);
  2207. info(DRIVER_DESC " " DRIVER_VERSION);
  2208. return 0;
  2209. }
  2210. static void __exit edgeport_exit (void)
  2211. {
  2212. usb_serial_deregister (&edgeport_1port_device);
  2213. usb_serial_deregister (&edgeport_2port_device);
  2214. }
  2215. module_init(edgeport_init);
  2216. module_exit(edgeport_exit);
  2217. /* Module information */
  2218. MODULE_AUTHOR(DRIVER_AUTHOR);
  2219. MODULE_DESCRIPTION(DRIVER_DESC);
  2220. MODULE_LICENSE("GPL");
  2221. MODULE_PARM(debug, "i");
  2222. MODULE_PARM_DESC(debug, "Debug enabled or not");
  2223. MODULE_PARM(ignore_cpu_rev, "i");
  2224. MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device");