Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Alan Cox 2008-07-22 11:15:45 +01:00 коммит произвёл Linus Torvalds
Родитель 2a77c81449
Коммит 19e58fae0c
1 изменённых файлов: 35 добавлений и 30 удалений

Просмотреть файл

@ -43,8 +43,10 @@
#include <linux/usb/serial.h>
/* Function prototypes */
static int option_open(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp);
static void option_close(struct tty_struct *tty, struct usb_serial_port *port, struct file *filp);
static int option_open(struct tty_struct *tty, struct usb_serial_port *port,
struct file *filp);
static void option_close(struct tty_struct *tty, struct usb_serial_port *port,
struct file *filp);
static int option_startup(struct usb_serial *serial);
static void option_shutdown(struct usb_serial *serial);
static int option_write_room(struct tty_struct *tty);
@ -393,15 +395,15 @@ static int __init option_init(void)
return 0;
failed_driver_register:
usb_serial_deregister (&option_1port_device);
usb_serial_deregister(&option_1port_device);
failed_1port_device_register:
return retval;
}
static void __exit option_exit(void)
{
usb_deregister (&option_driver);
usb_serial_deregister (&option_1port_device);
usb_deregister(&option_driver);
usb_serial_deregister(&option_1port_device);
}
module_init(option_init);
@ -471,7 +473,7 @@ static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
i = 0;
left = count;
for (i=0; left > 0 && i < N_OUT_URB; i++) {
for (i = 0; left > 0 && i < N_OUT_URB; i++) {
todo = left;
if (todo > OUT_BUFLEN)
todo = OUT_BUFLEN;
@ -492,7 +494,7 @@ static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
usb_pipeendpoint(this_urb->pipe), i);
/* send the data */
memcpy (this_urb->transfer_buffer, buf, todo);
memcpy(this_urb->transfer_buffer, buf, todo);
this_urb->transfer_buffer_length = todo;
this_urb->dev = port->serial->dev;
@ -583,7 +585,7 @@ static void option_instat_callback(struct urb *urb)
struct usb_serial *serial = port->serial;
dbg("%s", __func__);
dbg("%s: urb %p port %p has data %p", __func__,urb,port,portdata);
dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
if (status == 0) {
struct usb_ctrlrequest *req_pkt =
@ -613,7 +615,7 @@ static void option_instat_callback(struct urb *urb)
tty_hangup(port->port.tty);
} else {
dbg("%s: type %x req %x", __func__,
req_pkt->bRequestType,req_pkt->bRequest);
req_pkt->bRequestType, req_pkt->bRequest);
}
} else
dbg("%s: error %d", __func__, status);
@ -639,7 +641,7 @@ static int option_write_room(struct tty_struct *tty)
portdata = usb_get_serial_port_data(port);
for (i=0; i < N_OUT_URB; i++) {
for (i = 0; i < N_OUT_URB; i++) {
this_urb = portdata->out_urbs[i];
if (this_urb && !test_bit(i, &portdata->out_busy))
data_len += OUT_BUFLEN;
@ -659,7 +661,7 @@ static int option_chars_in_buffer(struct tty_struct *tty)
portdata = usb_get_serial_port_data(port);
for (i=0; i < N_OUT_URB; i++) {
for (i = 0; i < N_OUT_URB; i++) {
this_urb = portdata->out_urbs[i];
/* FIXME: This locking is insufficient as this_urb may
go unused during the test */
@ -689,7 +691,7 @@ static int option_open(struct tty_struct *tty,
/* Reset low level data toggle and start reading from endpoints */
for (i = 0; i < N_IN_URB; i++) {
urb = portdata->in_urbs[i];
if (! urb)
if (!urb)
continue;
if (urb->dev != serial->dev) {
dbg("%s: dev %p != %p", __func__,
@ -714,7 +716,7 @@ static int option_open(struct tty_struct *tty,
/* Reset low level data toggle on out endpoints */
for (i = 0; i < N_OUT_URB; i++) {
urb = portdata->out_urbs[i];
if (! urb)
if (!urb)
continue;
urb->dev = serial->dev;
/* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
@ -726,7 +728,7 @@ static int option_open(struct tty_struct *tty,
option_send_setup(tty, port);
return (0);
return 0;
}
static void option_close(struct tty_struct *tty,
@ -784,7 +786,7 @@ static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
/* Setup urbs */
static void option_setup_urbs(struct usb_serial *serial)
{
int i,j;
int i, j;
struct usb_serial_port *port;
struct option_port_private *portdata;
@ -794,18 +796,22 @@ static void option_setup_urbs(struct usb_serial *serial)
port = serial->port[i];
portdata = usb_get_serial_port_data(port);
/* Do indat endpoints first */
/* Do indat endpoints first */
for (j = 0; j < N_IN_URB; ++j) {
portdata->in_urbs[j] = option_setup_urb (serial,
port->bulk_in_endpointAddress, USB_DIR_IN, port,
portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
portdata->in_urbs[j] = option_setup_urb(serial,
port->bulk_in_endpointAddress,
USB_DIR_IN, port,
portdata->in_buffer[j],
IN_BUFLEN, option_indat_callback);
}
/* outdat endpoints */
for (j = 0; j < N_OUT_URB; ++j) {
portdata->out_urbs[j] = option_setup_urb (serial,
port->bulk_out_endpointAddress, USB_DIR_OUT, port,
portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
portdata->out_urbs[j] = option_setup_urb(serial,
port->bulk_out_endpointAddress,
USB_DIR_OUT, port,
portdata->out_buffer[j],
OUT_BUFLEN, option_outdat_callback);
}
}
}
@ -834,8 +840,8 @@ static int option_send_setup(struct tty_struct *tty,
val |= 0x02;
return usb_control_msg(serial->dev,
usb_rcvctrlpipe(serial->dev, 0),
0x22,0x21,val,ifNum,NULL,0,USB_CTRL_SET_TIMEOUT);
usb_rcvctrlpipe(serial->dev, 0),
0x22, 0x21, val, ifNum, NULL, 0, USB_CTRL_SET_TIMEOUT);
}
return 0;
}
@ -856,7 +862,7 @@ static int option_startup(struct usb_serial *serial)
if (!portdata) {
dbg("%s: kmalloc for option_port_private (%d) failed!.",
__func__, i);
return (1);
return 1;
}
for (j = 0; j < N_IN_URB; j++) {
@ -875,17 +881,15 @@ static int option_startup(struct usb_serial *serial)
usb_set_serial_port_data(port, portdata);
if (! port->interrupt_in_urb)
if (!port->interrupt_in_urb)
continue;
err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
if (err)
dbg("%s: submit irq_in urb failed %d",
__func__, err);
}
option_setup_urbs(serial);
return (0);
return 0;
bail_out_error2:
for (j = 0; j < N_OUT_URB; j++)
@ -924,7 +928,8 @@ static void option_shutdown(struct usb_serial *serial)
for (j = 0; j < N_IN_URB; j++) {
if (portdata->in_urbs[j]) {
usb_free_urb(portdata->in_urbs[j]);
free_page((unsigned long)portdata->in_buffer[j]);
free_page((unsigned long)
portdata->in_buffer[j]);
portdata->in_urbs[j] = NULL;
}
}