Loading drivers/staging/uc2322/aten2011.c +328 −369 Original line number Diff line number Diff line Loading @@ -88,20 +88,12 @@ #define ATENINTL_DEVICE_ID_2011 0x2011 #define ATENINTL_DEVICE_ID_7820 0x7820 /* different USB-serial Adapter's ID's table */ static struct usb_device_id ATENINTL_port_id_table [] = { static struct usb_device_id id_table [] = { { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_2011) }, { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_7820) }, { } /* terminating entry */ }; static __devinitdata struct usb_device_id id_table_combined [] = { { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_2011) }, { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_7820) }, { } /* terminating entry */ }; MODULE_DEVICE_TABLE (usb, id_table_combined); MODULE_DEVICE_TABLE (usb, id_table); /* This structure holds all of the local port information */ struct ATENINTL_port Loading Loading @@ -177,39 +169,12 @@ struct ATENINTL_serial unsigned char status_polling_started; }; static void ATEN2011_interrupt_callback(struct urb *urb); static void ATEN2011_bulk_in_callback(struct urb *urb); static void ATEN2011_bulk_out_data_callback(struct urb *urb); static void ATEN2011_control_callback(struct urb *urb); static int ATEN2011_get_reg(struct ATENINTL_port *ATEN,__u16 Wval, __u16 reg, __u16 * val); int handle_newMsr(struct ATENINTL_port *port,__u8 newMsr); int handle_newLsr(struct ATENINTL_port *port,__u8 newLsr); static int ATEN2011_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static void ATEN2011_close(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static int ATEN2011_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *data, int count); static int ATEN2011_write_room(struct tty_struct *tty); static int ATEN2011_chars_in_buffer(struct tty_struct *tty); static void ATEN2011_throttle(struct tty_struct *tty); static void ATEN2011_unthrottle(struct tty_struct *tty); static void ATEN2011_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static int ATEN2011_tiocmset(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear); static int ATEN2011_tiocmget(struct tty_struct *tty, struct file *file); static int ATEN2011_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg); static void ATEN2011_break(struct tty_struct *tty, int break_state); static int ATEN2011_startup(struct usb_serial *serial); static void ATEN2011_shutdown(struct usb_serial *serial); static int ATEN2011_calc_num_ports(struct usb_serial *serial); static int ATEN2011_calc_baud_rate_divisor(int baudRate, int *divisor,__u16 *clk_sel_val); static int ATEN2011_send_cmd_write_baud_rate(struct ATENINTL_port *ATEN2011_port, int baudRate); static void ATEN2011_change_port_settings(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port, struct ktermios *old_termios); static void ATEN2011_block_until_chase_response(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port); static void ATEN2011_block_until_tx_empty(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port); int __init ATENINTL2011_init(void); void __exit ATENINTL2011_exit(void); static void ATEN2011_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static void ATEN2011_change_port_settings(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port, struct ktermios *old_termios); /************************************* * Bit definitions for each register * Loading Loading @@ -300,7 +265,7 @@ static int ATEN2011_set_Uart_Reg(struct usb_serial_port *port, __u16 reg, static int ATEN2011_get_Uart_Reg(struct usb_serial_port *port, __u16 reg, __u16 * val); void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port); static void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port); static inline void ATEN2011_set_serial_private(struct usb_serial *serial, Loading Loading @@ -439,7 +404,7 @@ static int ATEN2011_get_Uart_Reg(struct usb_serial_port *port, __u16 reg, return ret; } void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port) static void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port) { DPRINTK("***************************************\n"); Loading @@ -451,45 +416,138 @@ void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port) } static struct usb_serial_driver ATENINTL2011_4port_device = { .driver = { .owner = THIS_MODULE, .name = "ATEN2011", }, .description = DRIVER_DESC, .id_table = ATENINTL_port_id_table, .open = ATEN2011_open, .close = ATEN2011_close, .write = ATEN2011_write, .write_room = ATEN2011_write_room, .chars_in_buffer = ATEN2011_chars_in_buffer, .throttle = ATEN2011_throttle, .unthrottle = ATEN2011_unthrottle, .calc_num_ports = ATEN2011_calc_num_ports, static int handle_newMsr(struct ATENINTL_port *port, __u8 newMsr) { struct ATENINTL_port *ATEN2011_port; struct async_icount *icount; ATEN2011_port = port; icount = &ATEN2011_port->icount; if (newMsr & (ATEN_MSR_DELTA_CTS | ATEN_MSR_DELTA_DSR | ATEN_MSR_DELTA_RI | ATEN_MSR_DELTA_CD)) { icount = &ATEN2011_port->icount; #ifdef ATENSerialProbe .probe = ATEN2011_serial_probe, #endif .ioctl = ATEN2011_ioctl, .set_termios = ATEN2011_set_termios, .break_ctl = ATEN2011_break, // .break_ctl = ATEN2011_break_ctl, .tiocmget = ATEN2011_tiocmget, .tiocmset = ATEN2011_tiocmset, .attach = ATEN2011_startup, .shutdown = ATEN2011_shutdown, .read_bulk_callback = ATEN2011_bulk_in_callback, .read_int_callback = ATEN2011_interrupt_callback, }; /* update input line counters */ if (newMsr & ATEN_MSR_DELTA_CTS) { icount->cts++; } if (newMsr & ATEN_MSR_DELTA_DSR) { icount->dsr++; } if (newMsr & ATEN_MSR_DELTA_CD) { icount->dcd++; } if (newMsr & ATEN_MSR_DELTA_RI) { icount->rng++; } } static struct usb_driver io_driver = { .name = "ATEN2011", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table_combined, }; return 0; } static int handle_newLsr(struct ATENINTL_port *port, __u8 newLsr) { struct async_icount *icount; dbg("%s - %02x", __FUNCTION__, newLsr); if (newLsr & SERIAL_LSR_BI) { // // Parity and Framing errors only count if they // occur exclusive of a break being // received. // newLsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI); } /* update input line counters */ icount = &port->icount; if (newLsr & SERIAL_LSR_BI) { icount->brk++; } if (newLsr & SERIAL_LSR_OE) { icount->overrun++; } if (newLsr & SERIAL_LSR_PE) { icount->parity++; } if (newLsr & SERIAL_LSR_FE) { icount->frame++; } return 0; } static void ATEN2011_control_callback(struct urb *urb) { unsigned char *data; struct ATENINTL_port *ATEN2011_port; __u8 regval = 0x0; if (!urb) { DPRINTK("%s", "Invalid Pointer !!!!:\n"); return; } switch (urb->status) { case 0: /* success */ break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; default: dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); goto exit; } ATEN2011_port = (struct ATENINTL_port *)urb->context; DPRINTK("%s urb buffer size is %d\n", __FUNCTION__, urb->actual_length); DPRINTK("%s ATEN2011_port->MsrLsr is %d port %d\n", __FUNCTION__, ATEN2011_port->MsrLsr, ATEN2011_port->port_num); data = urb->transfer_buffer; regval = (__u8) data[0]; DPRINTK("%s data is %x\n", __FUNCTION__, regval); if (ATEN2011_port->MsrLsr == 0) handle_newMsr(ATEN2011_port, regval); else if (ATEN2011_port->MsrLsr == 1) handle_newLsr(ATEN2011_port, regval); exit: return; } static int ATEN2011_get_reg(struct ATENINTL_port *ATEN, __u16 Wval, __u16 reg, __u16 * val) { struct usb_device *dev = ATEN->port->serial->dev; struct usb_ctrlrequest *dr = NULL; unsigned char *buffer = NULL; int ret = 0; buffer = (__u8 *) ATEN->ctrl_buf; // dr=(struct usb_ctrlrequest *)(buffer); dr = (void *)(buffer + 2); dr->bRequestType = ATEN_RD_RTYPE; dr->bRequest = ATEN_RDREQ; dr->wValue = cpu_to_le16(Wval); //0; dr->wIndex = cpu_to_le16(reg); dr->wLength = cpu_to_le16(2); usb_fill_control_urb(ATEN->control_urb, dev, usb_rcvctrlpipe(dev, 0), (unsigned char *)dr, buffer, 2, ATEN2011_control_callback, ATEN); ATEN->control_urb->transfer_buffer_length = 2; ret = usb_submit_urb(ATEN->control_urb, GFP_ATOMIC); return ret; } //#ifdef ATEN2011 static void ATEN2011_interrupt_callback(struct urb *urb) { int result; Loading Loading @@ -625,139 +683,6 @@ static void ATEN2011_interrupt_callback(struct urb *urb) } //#endif static void ATEN2011_control_callback(struct urb *urb) { unsigned char *data; struct ATENINTL_port *ATEN2011_port; __u8 regval = 0x0; if (!urb) { DPRINTK("%s", "Invalid Pointer !!!!:\n"); return; } switch (urb->status) { case 0: /* success */ break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; default: dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); goto exit; } ATEN2011_port = (struct ATENINTL_port *)urb->context; DPRINTK("%s urb buffer size is %d\n", __FUNCTION__, urb->actual_length); DPRINTK("%s ATEN2011_port->MsrLsr is %d port %d\n", __FUNCTION__, ATEN2011_port->MsrLsr, ATEN2011_port->port_num); data = urb->transfer_buffer; regval = (__u8) data[0]; DPRINTK("%s data is %x\n", __FUNCTION__, regval); if (ATEN2011_port->MsrLsr == 0) handle_newMsr(ATEN2011_port, regval); else if (ATEN2011_port->MsrLsr == 1) handle_newLsr(ATEN2011_port, regval); exit: return; } int handle_newMsr(struct ATENINTL_port *port, __u8 newMsr) { struct ATENINTL_port *ATEN2011_port; struct async_icount *icount; ATEN2011_port = port; icount = &ATEN2011_port->icount; if (newMsr & (ATEN_MSR_DELTA_CTS | ATEN_MSR_DELTA_DSR | ATEN_MSR_DELTA_RI | ATEN_MSR_DELTA_CD)) { icount = &ATEN2011_port->icount; /* update input line counters */ if (newMsr & ATEN_MSR_DELTA_CTS) { icount->cts++; } if (newMsr & ATEN_MSR_DELTA_DSR) { icount->dsr++; } if (newMsr & ATEN_MSR_DELTA_CD) { icount->dcd++; } if (newMsr & ATEN_MSR_DELTA_RI) { icount->rng++; } } return 0; } int handle_newLsr(struct ATENINTL_port *port, __u8 newLsr) { struct async_icount *icount; dbg("%s - %02x", __FUNCTION__, newLsr); if (newLsr & SERIAL_LSR_BI) { // // Parity and Framing errors only count if they // occur exclusive of a break being // received. // newLsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI); } /* update input line counters */ icount = &port->icount; if (newLsr & SERIAL_LSR_BI) { icount->brk++; } if (newLsr & SERIAL_LSR_OE) { icount->overrun++; } if (newLsr & SERIAL_LSR_PE) { icount->parity++; } if (newLsr & SERIAL_LSR_FE) { icount->frame++; } return 0; } static int ATEN2011_get_reg(struct ATENINTL_port *ATEN, __u16 Wval, __u16 reg, __u16 * val) { struct usb_device *dev = ATEN->port->serial->dev; struct usb_ctrlrequest *dr = NULL; unsigned char *buffer = NULL; int ret = 0; buffer = (__u8 *) ATEN->ctrl_buf; // dr=(struct usb_ctrlrequest *)(buffer); dr = (void *)(buffer + 2); dr->bRequestType = ATEN_RD_RTYPE; dr->bRequest = ATEN_RDREQ; dr->wValue = cpu_to_le16(Wval); //0; dr->wIndex = cpu_to_le16(reg); dr->wLength = cpu_to_le16(2); usb_fill_control_urb(ATEN->control_urb, dev, usb_rcvctrlpipe(dev, 0), (unsigned char *)dr, buffer, 2, ATEN2011_control_callback, ATEN); ATEN->control_urb->transfer_buffer_length = 2; ret = usb_submit_urb(ATEN->control_urb, GFP_ATOMIC); return ret; } static void ATEN2011_bulk_in_callback(struct urb *urb) { int status; Loading Loading @@ -1294,13 +1219,75 @@ static int ATEN2011_open(struct tty_struct *tty, struct usb_serial_port *port, ATEN2011_port->icount.tx = 0; ATEN2011_port->icount.rx = 0; DPRINTK ("\n\nusb_serial serial:%x ATEN2011_port:%x\nATEN2011_serial:%x usb_serial_port port:%x\n\n", (unsigned int)serial, (unsigned int)ATEN2011_port, (unsigned int)ATEN2011_serial, (unsigned int)port); DPRINTK ("\n\nusb_serial serial:%x ATEN2011_port:%x\nATEN2011_serial:%x usb_serial_port port:%x\n\n", (unsigned int)serial, (unsigned int)ATEN2011_port, (unsigned int)ATEN2011_serial, (unsigned int)port); return 0; } static int ATEN2011_chars_in_buffer(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; int i; int chars = 0; struct ATENINTL_port *ATEN2011_port; //DPRINTK("%s \n"," ATEN2011_chars_in_buffer:entering ..........."); if (ATEN2011_port_paranoia_check(port, __FUNCTION__)) { DPRINTK("%s", "Invalid port \n"); return -1; } ATEN2011_port = ATEN2011_get_port_private(port); if (ATEN2011_port == NULL) { DPRINTK("%s \n", "ATEN2011_break:leaving ..........."); return -1; } for (i = 0; i < NUM_URBS; ++i) { if (ATEN2011_port->write_urb_pool[i]->status == -EINPROGRESS) { chars += URB_TRANSFER_BUFFER_SIZE; } } dbg("%s - returns %d", __FUNCTION__, chars); return (chars); } static void ATEN2011_block_until_tx_empty(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = HZ / 10; int wait = 30; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); return 0; /* Check for Buffer status */ if (count <= 0) { return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 30; } } } static void ATEN2011_close(struct tty_struct *tty, struct usb_serial_port *port, Loading Loading @@ -1407,6 +1394,39 @@ static void ATEN2011_close(struct tty_struct *tty, struct usb_serial_port *port, } static void ATEN2011_block_until_chase_response(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = 1 * HZ; int wait = 10; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); /* Check for Buffer status */ if (count <= 0) { ATEN2011_port->chaseResponsePending = 0; return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 10; } } } static void ATEN2011_break(struct tty_struct *tty, int break_state) { struct usb_serial_port *port = tty->driver_data; Loading Loading @@ -1460,71 +1480,6 @@ static void ATEN2011_break(struct tty_struct *tty, int break_state) return; } static void ATEN2011_block_until_chase_response(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = 1 * HZ; int wait = 10; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); /* Check for Buffer status */ if (count <= 0) { ATEN2011_port->chaseResponsePending = 0; return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 10; } } } static void ATEN2011_block_until_tx_empty(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = HZ / 10; int wait = 30; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); /* Check for Buffer status */ if (count <= 0) { return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 30; } } } static int ATEN2011_write_room(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; Loading Loading @@ -1557,36 +1512,6 @@ static int ATEN2011_write_room(struct tty_struct *tty) } static int ATEN2011_chars_in_buffer(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; int i; int chars = 0; struct ATENINTL_port *ATEN2011_port; //DPRINTK("%s \n"," ATEN2011_chars_in_buffer:entering ..........."); if (ATEN2011_port_paranoia_check(port, __FUNCTION__)) { DPRINTK("%s", "Invalid port \n"); return -1; } ATEN2011_port = ATEN2011_get_port_private(port); if (ATEN2011_port == NULL) { DPRINTK("%s \n", "ATEN2011_break:leaving ..........."); return -1; } for (i = 0; i < NUM_URBS; ++i) { if (ATEN2011_port->write_urb_pool[i]->status == -EINPROGRESS) { chars += URB_TRANSFER_BUFFER_SIZE; } } dbg("%s - returns %d", __FUNCTION__, chars); return (chars); } static int ATEN2011_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *data, int count) { Loading Loading @@ -2256,6 +2181,43 @@ static int ATEN2011_ioctl(struct tty_struct *tty, struct file *file, return -ENOIOCTLCMD; } static int ATEN2011_calc_baud_rate_divisor(int baudRate, int *divisor, __u16 * clk_sel_val) { //int i; //__u16 custom,round1, round; dbg("%s - %d", __FUNCTION__, baudRate); if (baudRate <= 115200) { *divisor = 115200 / baudRate; *clk_sel_val = 0x0; } if ((baudRate > 115200) && (baudRate <= 230400)) { *divisor = 230400 / baudRate; *clk_sel_val = 0x10; } else if ((baudRate > 230400) && (baudRate <= 403200)) { *divisor = 403200 / baudRate; *clk_sel_val = 0x20; } else if ((baudRate > 403200) && (baudRate <= 460800)) { *divisor = 460800 / baudRate; *clk_sel_val = 0x30; } else if ((baudRate > 460800) && (baudRate <= 806400)) { *divisor = 806400 / baudRate; *clk_sel_val = 0x40; } else if ((baudRate > 806400) && (baudRate <= 921600)) { *divisor = 921600 / baudRate; *clk_sel_val = 0x50; } else if ((baudRate > 921600) && (baudRate <= 1572864)) { *divisor = 1572864 / baudRate; *clk_sel_val = 0x60; } else if ((baudRate > 1572864) && (baudRate <= 3145728)) { *divisor = 3145728 / baudRate; *clk_sel_val = 0x70; } return 0; } static int ATEN2011_send_cmd_write_baud_rate(struct ATENINTL_port *ATEN2011_port, int baudRate) { Loading Loading @@ -2379,43 +2341,6 @@ static int ATEN2011_send_cmd_write_baud_rate(struct ATENINTL_port return status; } static int ATEN2011_calc_baud_rate_divisor(int baudRate, int *divisor, __u16 * clk_sel_val) { //int i; //__u16 custom,round1, round; dbg("%s - %d", __FUNCTION__, baudRate); if (baudRate <= 115200) { *divisor = 115200 / baudRate; *clk_sel_val = 0x0; } if ((baudRate > 115200) && (baudRate <= 230400)) { *divisor = 230400 / baudRate; *clk_sel_val = 0x10; } else if ((baudRate > 230400) && (baudRate <= 403200)) { *divisor = 403200 / baudRate; *clk_sel_val = 0x20; } else if ((baudRate > 403200) && (baudRate <= 460800)) { *divisor = 460800 / baudRate; *clk_sel_val = 0x30; } else if ((baudRate > 460800) && (baudRate <= 806400)) { *divisor = 806400 / baudRate; *clk_sel_val = 0x40; } else if ((baudRate > 806400) && (baudRate <= 921600)) { *divisor = 921600 / baudRate; *clk_sel_val = 0x50; } else if ((baudRate > 921600) && (baudRate <= 1572864)) { *divisor = 1572864 / baudRate; *clk_sel_val = 0x60; } else if ((baudRate > 1572864) && (baudRate <= 3145728)) { *divisor = 3145728 / baudRate; *clk_sel_val = 0x70; } return 0; } static void ATEN2011_change_port_settings(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port, struct ktermios *old_termios) Loading Loading @@ -2988,7 +2913,41 @@ static struct usb_serial *ATEN2011_get_usb_serial(struct usb_serial_port *port, return port->serial; } int __init ATENINTL2011_init(void) static struct usb_serial_driver ATENINTL2011_4port_device = { .driver = { .owner = THIS_MODULE, .name = "aten2011", }, .description = DRIVER_DESC, .id_table = id_table, .open = ATEN2011_open, .close = ATEN2011_close, .write = ATEN2011_write, .write_room = ATEN2011_write_room, .chars_in_buffer = ATEN2011_chars_in_buffer, .throttle = ATEN2011_throttle, .unthrottle = ATEN2011_unthrottle, .calc_num_ports = ATEN2011_calc_num_ports, .ioctl = ATEN2011_ioctl, .set_termios = ATEN2011_set_termios, .break_ctl = ATEN2011_break, .tiocmget = ATEN2011_tiocmget, .tiocmset = ATEN2011_tiocmset, .attach = ATEN2011_startup, .shutdown = ATEN2011_shutdown, .read_bulk_callback = ATEN2011_bulk_in_callback, .read_int_callback = ATEN2011_interrupt_callback, }; static struct usb_driver aten_driver = { .name = "aten2011", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table, }; static int __init ATENINTL2011_init(void) { int retval; Loading @@ -3005,7 +2964,7 @@ int __init ATENINTL2011_init(void) DRIVER_DESC " " DRIVER_VERSION "\n"); /* Register with the usb */ retval = usb_register(&io_driver); retval = usb_register(&aten_driver); if (retval) goto failed_usb_register; Loading @@ -3023,12 +2982,12 @@ int __init ATENINTL2011_init(void) return retval; } void __exit ATENINTL2011_exit(void) static void __exit ATENINTL2011_exit(void) { DPRINTK("%s \n", " ATEN2011_exit :entering.........."); usb_deregister(&io_driver); usb_deregister(&aten_driver); usb_serial_deregister(&ATENINTL2011_4port_device); Loading Loading
drivers/staging/uc2322/aten2011.c +328 −369 Original line number Diff line number Diff line Loading @@ -88,20 +88,12 @@ #define ATENINTL_DEVICE_ID_2011 0x2011 #define ATENINTL_DEVICE_ID_7820 0x7820 /* different USB-serial Adapter's ID's table */ static struct usb_device_id ATENINTL_port_id_table [] = { static struct usb_device_id id_table [] = { { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_2011) }, { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_7820) }, { } /* terminating entry */ }; static __devinitdata struct usb_device_id id_table_combined [] = { { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_2011) }, { USB_DEVICE(USB_VENDOR_ID_ATENINTL,ATENINTL_DEVICE_ID_7820) }, { } /* terminating entry */ }; MODULE_DEVICE_TABLE (usb, id_table_combined); MODULE_DEVICE_TABLE (usb, id_table); /* This structure holds all of the local port information */ struct ATENINTL_port Loading Loading @@ -177,39 +169,12 @@ struct ATENINTL_serial unsigned char status_polling_started; }; static void ATEN2011_interrupt_callback(struct urb *urb); static void ATEN2011_bulk_in_callback(struct urb *urb); static void ATEN2011_bulk_out_data_callback(struct urb *urb); static void ATEN2011_control_callback(struct urb *urb); static int ATEN2011_get_reg(struct ATENINTL_port *ATEN,__u16 Wval, __u16 reg, __u16 * val); int handle_newMsr(struct ATENINTL_port *port,__u8 newMsr); int handle_newLsr(struct ATENINTL_port *port,__u8 newLsr); static int ATEN2011_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static void ATEN2011_close(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp); static int ATEN2011_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *data, int count); static int ATEN2011_write_room(struct tty_struct *tty); static int ATEN2011_chars_in_buffer(struct tty_struct *tty); static void ATEN2011_throttle(struct tty_struct *tty); static void ATEN2011_unthrottle(struct tty_struct *tty); static void ATEN2011_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static int ATEN2011_tiocmset(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear); static int ATEN2011_tiocmget(struct tty_struct *tty, struct file *file); static int ATEN2011_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg); static void ATEN2011_break(struct tty_struct *tty, int break_state); static int ATEN2011_startup(struct usb_serial *serial); static void ATEN2011_shutdown(struct usb_serial *serial); static int ATEN2011_calc_num_ports(struct usb_serial *serial); static int ATEN2011_calc_baud_rate_divisor(int baudRate, int *divisor,__u16 *clk_sel_val); static int ATEN2011_send_cmd_write_baud_rate(struct ATENINTL_port *ATEN2011_port, int baudRate); static void ATEN2011_change_port_settings(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port, struct ktermios *old_termios); static void ATEN2011_block_until_chase_response(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port); static void ATEN2011_block_until_tx_empty(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port); int __init ATENINTL2011_init(void); void __exit ATENINTL2011_exit(void); static void ATEN2011_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); static void ATEN2011_change_port_settings(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port, struct ktermios *old_termios); /************************************* * Bit definitions for each register * Loading Loading @@ -300,7 +265,7 @@ static int ATEN2011_set_Uart_Reg(struct usb_serial_port *port, __u16 reg, static int ATEN2011_get_Uart_Reg(struct usb_serial_port *port, __u16 reg, __u16 * val); void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port); static void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port); static inline void ATEN2011_set_serial_private(struct usb_serial *serial, Loading Loading @@ -439,7 +404,7 @@ static int ATEN2011_get_Uart_Reg(struct usb_serial_port *port, __u16 reg, return ret; } void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port) static void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port) { DPRINTK("***************************************\n"); Loading @@ -451,45 +416,138 @@ void ATEN2011_Dump_serial_port(struct ATENINTL_port *ATEN2011_port) } static struct usb_serial_driver ATENINTL2011_4port_device = { .driver = { .owner = THIS_MODULE, .name = "ATEN2011", }, .description = DRIVER_DESC, .id_table = ATENINTL_port_id_table, .open = ATEN2011_open, .close = ATEN2011_close, .write = ATEN2011_write, .write_room = ATEN2011_write_room, .chars_in_buffer = ATEN2011_chars_in_buffer, .throttle = ATEN2011_throttle, .unthrottle = ATEN2011_unthrottle, .calc_num_ports = ATEN2011_calc_num_ports, static int handle_newMsr(struct ATENINTL_port *port, __u8 newMsr) { struct ATENINTL_port *ATEN2011_port; struct async_icount *icount; ATEN2011_port = port; icount = &ATEN2011_port->icount; if (newMsr & (ATEN_MSR_DELTA_CTS | ATEN_MSR_DELTA_DSR | ATEN_MSR_DELTA_RI | ATEN_MSR_DELTA_CD)) { icount = &ATEN2011_port->icount; #ifdef ATENSerialProbe .probe = ATEN2011_serial_probe, #endif .ioctl = ATEN2011_ioctl, .set_termios = ATEN2011_set_termios, .break_ctl = ATEN2011_break, // .break_ctl = ATEN2011_break_ctl, .tiocmget = ATEN2011_tiocmget, .tiocmset = ATEN2011_tiocmset, .attach = ATEN2011_startup, .shutdown = ATEN2011_shutdown, .read_bulk_callback = ATEN2011_bulk_in_callback, .read_int_callback = ATEN2011_interrupt_callback, }; /* update input line counters */ if (newMsr & ATEN_MSR_DELTA_CTS) { icount->cts++; } if (newMsr & ATEN_MSR_DELTA_DSR) { icount->dsr++; } if (newMsr & ATEN_MSR_DELTA_CD) { icount->dcd++; } if (newMsr & ATEN_MSR_DELTA_RI) { icount->rng++; } } static struct usb_driver io_driver = { .name = "ATEN2011", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table_combined, }; return 0; } static int handle_newLsr(struct ATENINTL_port *port, __u8 newLsr) { struct async_icount *icount; dbg("%s - %02x", __FUNCTION__, newLsr); if (newLsr & SERIAL_LSR_BI) { // // Parity and Framing errors only count if they // occur exclusive of a break being // received. // newLsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI); } /* update input line counters */ icount = &port->icount; if (newLsr & SERIAL_LSR_BI) { icount->brk++; } if (newLsr & SERIAL_LSR_OE) { icount->overrun++; } if (newLsr & SERIAL_LSR_PE) { icount->parity++; } if (newLsr & SERIAL_LSR_FE) { icount->frame++; } return 0; } static void ATEN2011_control_callback(struct urb *urb) { unsigned char *data; struct ATENINTL_port *ATEN2011_port; __u8 regval = 0x0; if (!urb) { DPRINTK("%s", "Invalid Pointer !!!!:\n"); return; } switch (urb->status) { case 0: /* success */ break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; default: dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); goto exit; } ATEN2011_port = (struct ATENINTL_port *)urb->context; DPRINTK("%s urb buffer size is %d\n", __FUNCTION__, urb->actual_length); DPRINTK("%s ATEN2011_port->MsrLsr is %d port %d\n", __FUNCTION__, ATEN2011_port->MsrLsr, ATEN2011_port->port_num); data = urb->transfer_buffer; regval = (__u8) data[0]; DPRINTK("%s data is %x\n", __FUNCTION__, regval); if (ATEN2011_port->MsrLsr == 0) handle_newMsr(ATEN2011_port, regval); else if (ATEN2011_port->MsrLsr == 1) handle_newLsr(ATEN2011_port, regval); exit: return; } static int ATEN2011_get_reg(struct ATENINTL_port *ATEN, __u16 Wval, __u16 reg, __u16 * val) { struct usb_device *dev = ATEN->port->serial->dev; struct usb_ctrlrequest *dr = NULL; unsigned char *buffer = NULL; int ret = 0; buffer = (__u8 *) ATEN->ctrl_buf; // dr=(struct usb_ctrlrequest *)(buffer); dr = (void *)(buffer + 2); dr->bRequestType = ATEN_RD_RTYPE; dr->bRequest = ATEN_RDREQ; dr->wValue = cpu_to_le16(Wval); //0; dr->wIndex = cpu_to_le16(reg); dr->wLength = cpu_to_le16(2); usb_fill_control_urb(ATEN->control_urb, dev, usb_rcvctrlpipe(dev, 0), (unsigned char *)dr, buffer, 2, ATEN2011_control_callback, ATEN); ATEN->control_urb->transfer_buffer_length = 2; ret = usb_submit_urb(ATEN->control_urb, GFP_ATOMIC); return ret; } //#ifdef ATEN2011 static void ATEN2011_interrupt_callback(struct urb *urb) { int result; Loading Loading @@ -625,139 +683,6 @@ static void ATEN2011_interrupt_callback(struct urb *urb) } //#endif static void ATEN2011_control_callback(struct urb *urb) { unsigned char *data; struct ATENINTL_port *ATEN2011_port; __u8 regval = 0x0; if (!urb) { DPRINTK("%s", "Invalid Pointer !!!!:\n"); return; } switch (urb->status) { case 0: /* success */ break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; default: dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); goto exit; } ATEN2011_port = (struct ATENINTL_port *)urb->context; DPRINTK("%s urb buffer size is %d\n", __FUNCTION__, urb->actual_length); DPRINTK("%s ATEN2011_port->MsrLsr is %d port %d\n", __FUNCTION__, ATEN2011_port->MsrLsr, ATEN2011_port->port_num); data = urb->transfer_buffer; regval = (__u8) data[0]; DPRINTK("%s data is %x\n", __FUNCTION__, regval); if (ATEN2011_port->MsrLsr == 0) handle_newMsr(ATEN2011_port, regval); else if (ATEN2011_port->MsrLsr == 1) handle_newLsr(ATEN2011_port, regval); exit: return; } int handle_newMsr(struct ATENINTL_port *port, __u8 newMsr) { struct ATENINTL_port *ATEN2011_port; struct async_icount *icount; ATEN2011_port = port; icount = &ATEN2011_port->icount; if (newMsr & (ATEN_MSR_DELTA_CTS | ATEN_MSR_DELTA_DSR | ATEN_MSR_DELTA_RI | ATEN_MSR_DELTA_CD)) { icount = &ATEN2011_port->icount; /* update input line counters */ if (newMsr & ATEN_MSR_DELTA_CTS) { icount->cts++; } if (newMsr & ATEN_MSR_DELTA_DSR) { icount->dsr++; } if (newMsr & ATEN_MSR_DELTA_CD) { icount->dcd++; } if (newMsr & ATEN_MSR_DELTA_RI) { icount->rng++; } } return 0; } int handle_newLsr(struct ATENINTL_port *port, __u8 newLsr) { struct async_icount *icount; dbg("%s - %02x", __FUNCTION__, newLsr); if (newLsr & SERIAL_LSR_BI) { // // Parity and Framing errors only count if they // occur exclusive of a break being // received. // newLsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI); } /* update input line counters */ icount = &port->icount; if (newLsr & SERIAL_LSR_BI) { icount->brk++; } if (newLsr & SERIAL_LSR_OE) { icount->overrun++; } if (newLsr & SERIAL_LSR_PE) { icount->parity++; } if (newLsr & SERIAL_LSR_FE) { icount->frame++; } return 0; } static int ATEN2011_get_reg(struct ATENINTL_port *ATEN, __u16 Wval, __u16 reg, __u16 * val) { struct usb_device *dev = ATEN->port->serial->dev; struct usb_ctrlrequest *dr = NULL; unsigned char *buffer = NULL; int ret = 0; buffer = (__u8 *) ATEN->ctrl_buf; // dr=(struct usb_ctrlrequest *)(buffer); dr = (void *)(buffer + 2); dr->bRequestType = ATEN_RD_RTYPE; dr->bRequest = ATEN_RDREQ; dr->wValue = cpu_to_le16(Wval); //0; dr->wIndex = cpu_to_le16(reg); dr->wLength = cpu_to_le16(2); usb_fill_control_urb(ATEN->control_urb, dev, usb_rcvctrlpipe(dev, 0), (unsigned char *)dr, buffer, 2, ATEN2011_control_callback, ATEN); ATEN->control_urb->transfer_buffer_length = 2; ret = usb_submit_urb(ATEN->control_urb, GFP_ATOMIC); return ret; } static void ATEN2011_bulk_in_callback(struct urb *urb) { int status; Loading Loading @@ -1294,13 +1219,75 @@ static int ATEN2011_open(struct tty_struct *tty, struct usb_serial_port *port, ATEN2011_port->icount.tx = 0; ATEN2011_port->icount.rx = 0; DPRINTK ("\n\nusb_serial serial:%x ATEN2011_port:%x\nATEN2011_serial:%x usb_serial_port port:%x\n\n", (unsigned int)serial, (unsigned int)ATEN2011_port, (unsigned int)ATEN2011_serial, (unsigned int)port); DPRINTK ("\n\nusb_serial serial:%x ATEN2011_port:%x\nATEN2011_serial:%x usb_serial_port port:%x\n\n", (unsigned int)serial, (unsigned int)ATEN2011_port, (unsigned int)ATEN2011_serial, (unsigned int)port); return 0; } static int ATEN2011_chars_in_buffer(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; int i; int chars = 0; struct ATENINTL_port *ATEN2011_port; //DPRINTK("%s \n"," ATEN2011_chars_in_buffer:entering ..........."); if (ATEN2011_port_paranoia_check(port, __FUNCTION__)) { DPRINTK("%s", "Invalid port \n"); return -1; } ATEN2011_port = ATEN2011_get_port_private(port); if (ATEN2011_port == NULL) { DPRINTK("%s \n", "ATEN2011_break:leaving ..........."); return -1; } for (i = 0; i < NUM_URBS; ++i) { if (ATEN2011_port->write_urb_pool[i]->status == -EINPROGRESS) { chars += URB_TRANSFER_BUFFER_SIZE; } } dbg("%s - returns %d", __FUNCTION__, chars); return (chars); } static void ATEN2011_block_until_tx_empty(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = HZ / 10; int wait = 30; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); return 0; /* Check for Buffer status */ if (count <= 0) { return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 30; } } } static void ATEN2011_close(struct tty_struct *tty, struct usb_serial_port *port, Loading Loading @@ -1407,6 +1394,39 @@ static void ATEN2011_close(struct tty_struct *tty, struct usb_serial_port *port, } static void ATEN2011_block_until_chase_response(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = 1 * HZ; int wait = 10; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); /* Check for Buffer status */ if (count <= 0) { ATEN2011_port->chaseResponsePending = 0; return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 10; } } } static void ATEN2011_break(struct tty_struct *tty, int break_state) { struct usb_serial_port *port = tty->driver_data; Loading Loading @@ -1460,71 +1480,6 @@ static void ATEN2011_break(struct tty_struct *tty, int break_state) return; } static void ATEN2011_block_until_chase_response(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = 1 * HZ; int wait = 10; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); /* Check for Buffer status */ if (count <= 0) { ATEN2011_port->chaseResponsePending = 0; return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 10; } } } static void ATEN2011_block_until_tx_empty(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port) { int timeout = HZ / 10; int wait = 30; int count; while (1) { count = ATEN2011_chars_in_buffer(tty); /* Check for Buffer status */ if (count <= 0) { return; } /* Block the thread for a while */ interruptible_sleep_on_timeout(&ATEN2011_port->wait_chase, timeout); /* No activity.. count down section */ wait--; if (wait == 0) { dbg("%s - TIMEOUT", __FUNCTION__); return; } else { /* Reset timout value back to seconds */ wait = 30; } } } static int ATEN2011_write_room(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; Loading Loading @@ -1557,36 +1512,6 @@ static int ATEN2011_write_room(struct tty_struct *tty) } static int ATEN2011_chars_in_buffer(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; int i; int chars = 0; struct ATENINTL_port *ATEN2011_port; //DPRINTK("%s \n"," ATEN2011_chars_in_buffer:entering ..........."); if (ATEN2011_port_paranoia_check(port, __FUNCTION__)) { DPRINTK("%s", "Invalid port \n"); return -1; } ATEN2011_port = ATEN2011_get_port_private(port); if (ATEN2011_port == NULL) { DPRINTK("%s \n", "ATEN2011_break:leaving ..........."); return -1; } for (i = 0; i < NUM_URBS; ++i) { if (ATEN2011_port->write_urb_pool[i]->status == -EINPROGRESS) { chars += URB_TRANSFER_BUFFER_SIZE; } } dbg("%s - returns %d", __FUNCTION__, chars); return (chars); } static int ATEN2011_write(struct tty_struct *tty, struct usb_serial_port *port, const unsigned char *data, int count) { Loading Loading @@ -2256,6 +2181,43 @@ static int ATEN2011_ioctl(struct tty_struct *tty, struct file *file, return -ENOIOCTLCMD; } static int ATEN2011_calc_baud_rate_divisor(int baudRate, int *divisor, __u16 * clk_sel_val) { //int i; //__u16 custom,round1, round; dbg("%s - %d", __FUNCTION__, baudRate); if (baudRate <= 115200) { *divisor = 115200 / baudRate; *clk_sel_val = 0x0; } if ((baudRate > 115200) && (baudRate <= 230400)) { *divisor = 230400 / baudRate; *clk_sel_val = 0x10; } else if ((baudRate > 230400) && (baudRate <= 403200)) { *divisor = 403200 / baudRate; *clk_sel_val = 0x20; } else if ((baudRate > 403200) && (baudRate <= 460800)) { *divisor = 460800 / baudRate; *clk_sel_val = 0x30; } else if ((baudRate > 460800) && (baudRate <= 806400)) { *divisor = 806400 / baudRate; *clk_sel_val = 0x40; } else if ((baudRate > 806400) && (baudRate <= 921600)) { *divisor = 921600 / baudRate; *clk_sel_val = 0x50; } else if ((baudRate > 921600) && (baudRate <= 1572864)) { *divisor = 1572864 / baudRate; *clk_sel_val = 0x60; } else if ((baudRate > 1572864) && (baudRate <= 3145728)) { *divisor = 3145728 / baudRate; *clk_sel_val = 0x70; } return 0; } static int ATEN2011_send_cmd_write_baud_rate(struct ATENINTL_port *ATEN2011_port, int baudRate) { Loading Loading @@ -2379,43 +2341,6 @@ static int ATEN2011_send_cmd_write_baud_rate(struct ATENINTL_port return status; } static int ATEN2011_calc_baud_rate_divisor(int baudRate, int *divisor, __u16 * clk_sel_val) { //int i; //__u16 custom,round1, round; dbg("%s - %d", __FUNCTION__, baudRate); if (baudRate <= 115200) { *divisor = 115200 / baudRate; *clk_sel_val = 0x0; } if ((baudRate > 115200) && (baudRate <= 230400)) { *divisor = 230400 / baudRate; *clk_sel_val = 0x10; } else if ((baudRate > 230400) && (baudRate <= 403200)) { *divisor = 403200 / baudRate; *clk_sel_val = 0x20; } else if ((baudRate > 403200) && (baudRate <= 460800)) { *divisor = 460800 / baudRate; *clk_sel_val = 0x30; } else if ((baudRate > 460800) && (baudRate <= 806400)) { *divisor = 806400 / baudRate; *clk_sel_val = 0x40; } else if ((baudRate > 806400) && (baudRate <= 921600)) { *divisor = 921600 / baudRate; *clk_sel_val = 0x50; } else if ((baudRate > 921600) && (baudRate <= 1572864)) { *divisor = 1572864 / baudRate; *clk_sel_val = 0x60; } else if ((baudRate > 1572864) && (baudRate <= 3145728)) { *divisor = 3145728 / baudRate; *clk_sel_val = 0x70; } return 0; } static void ATEN2011_change_port_settings(struct tty_struct *tty, struct ATENINTL_port *ATEN2011_port, struct ktermios *old_termios) Loading Loading @@ -2988,7 +2913,41 @@ static struct usb_serial *ATEN2011_get_usb_serial(struct usb_serial_port *port, return port->serial; } int __init ATENINTL2011_init(void) static struct usb_serial_driver ATENINTL2011_4port_device = { .driver = { .owner = THIS_MODULE, .name = "aten2011", }, .description = DRIVER_DESC, .id_table = id_table, .open = ATEN2011_open, .close = ATEN2011_close, .write = ATEN2011_write, .write_room = ATEN2011_write_room, .chars_in_buffer = ATEN2011_chars_in_buffer, .throttle = ATEN2011_throttle, .unthrottle = ATEN2011_unthrottle, .calc_num_ports = ATEN2011_calc_num_ports, .ioctl = ATEN2011_ioctl, .set_termios = ATEN2011_set_termios, .break_ctl = ATEN2011_break, .tiocmget = ATEN2011_tiocmget, .tiocmset = ATEN2011_tiocmset, .attach = ATEN2011_startup, .shutdown = ATEN2011_shutdown, .read_bulk_callback = ATEN2011_bulk_in_callback, .read_int_callback = ATEN2011_interrupt_callback, }; static struct usb_driver aten_driver = { .name = "aten2011", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table, }; static int __init ATENINTL2011_init(void) { int retval; Loading @@ -3005,7 +2964,7 @@ int __init ATENINTL2011_init(void) DRIVER_DESC " " DRIVER_VERSION "\n"); /* Register with the usb */ retval = usb_register(&io_driver); retval = usb_register(&aten_driver); if (retval) goto failed_usb_register; Loading @@ -3023,12 +2982,12 @@ int __init ATENINTL2011_init(void) return retval; } void __exit ATENINTL2011_exit(void) static void __exit ATENINTL2011_exit(void) { DPRINTK("%s \n", " ATEN2011_exit :entering.........."); usb_deregister(&io_driver); usb_deregister(&aten_driver); usb_serial_deregister(&ATENINTL2011_4port_device); Loading