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:12:41 +01:00 коммит произвёл Linus Torvalds
Родитель 2e0ddd626d
Коммит eb6215ccd4
1 изменённых файлов: 52 добавлений и 45 удалений

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

@ -53,7 +53,7 @@
#include <linux/tty_flip.h> #include <linux/tty_flip.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/uaccess.h> #include <linux/uaccess.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/serial.h> #include <linux/usb/serial.h>
#include "ipaq.h" #include "ipaq.h"
@ -82,10 +82,10 @@ static int ipaq_startup(struct usb_serial *serial);
static void ipaq_shutdown(struct usb_serial *serial); static void ipaq_shutdown(struct usb_serial *serial);
static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port, static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
const unsigned char *buf, int count); const unsigned char *buf, int count);
static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf, static int ipaq_write_bulk(struct usb_serial_port *port,
int count); const unsigned char *buf, int count);
static void ipaq_write_gather(struct usb_serial_port *port); static void ipaq_write_gather(struct usb_serial_port *port);
static void ipaq_read_bulk_callback (struct urb *urb); static void ipaq_read_bulk_callback(struct urb *urb);
static void ipaq_write_bulk_callback(struct urb *urb); static void ipaq_write_bulk_callback(struct urb *urb);
static int ipaq_write_room(struct tty_struct *tty); static int ipaq_write_room(struct tty_struct *tty);
static int ipaq_chars_in_buffer(struct tty_struct *tty); static int ipaq_chars_in_buffer(struct tty_struct *tty);
@ -552,7 +552,7 @@ static struct usb_device_id ipaq_id_table [] = {
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
MODULE_DEVICE_TABLE (usb, ipaq_id_table); MODULE_DEVICE_TABLE(usb, ipaq_id_table);
static struct usb_driver ipaq_driver = { static struct usb_driver ipaq_driver = {
.name = "ipaq", .name = "ipaq",
@ -620,9 +620,9 @@ static int ipaq_open(struct tty_struct *tty,
for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) { for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL); pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
if (pkt == NULL) { if (pkt == NULL)
goto enomem; goto enomem;
}
pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL); pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
if (pkt->data == NULL) { if (pkt->data == NULL) {
kfree(pkt); kfree(pkt);
@ -667,8 +667,9 @@ static int ipaq_open(struct tty_struct *tty,
port->read_urb->transfer_buffer = port->bulk_in_buffer; port->read_urb->transfer_buffer = port->bulk_in_buffer;
port->write_urb->transfer_buffer = port->bulk_out_buffer; port->write_urb->transfer_buffer = port->bulk_out_buffer;
port->read_urb->transfer_buffer_length = URBDATA_SIZE; port->read_urb->transfer_buffer_length = URBDATA_SIZE;
port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; port->bulk_out_size = port->write_urb->transfer_buffer_length
= URBDATA_SIZE;
msleep(1000*initial_wait); msleep(1000*initial_wait);
/* /*
@ -697,13 +698,15 @@ static int ipaq_open(struct tty_struct *tty,
/* Start reading from the device */ /* Start reading from the device */
usb_fill_bulk_urb(port->read_urb, serial->dev, usb_fill_bulk_urb(port->read_urb, serial->dev,
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer,
ipaq_read_bulk_callback, port); port->read_urb->transfer_buffer_length,
ipaq_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL); result = usb_submit_urb(port->read_urb, GFP_KERNEL);
if (result) { if (result) {
err("%s - failed submitting read urb, error %d", __func__, result); err("%s - failed submitting read urb, error %d",
__func__, result);
goto error; goto error;
} }
@ -725,7 +728,7 @@ static void ipaq_close(struct tty_struct *tty,
struct ipaq_private *priv = usb_get_serial_port_data(port); struct ipaq_private *priv = usb_get_serial_port_data(port);
dbg("%s - port %d", __func__, port->number); dbg("%s - port %d", __func__, port->number);
/* /*
* shut down bulk read and write * shut down bulk read and write
*/ */
@ -735,7 +738,8 @@ static void ipaq_close(struct tty_struct *tty,
kfree(priv); kfree(priv);
usb_set_serial_port_data(port, NULL); usb_set_serial_port_data(port, NULL);
/* Uncomment the following line if you want to see some statistics in your syslog */ /* Uncomment the following line if you want to see some statistics
* in your syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */ /* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
} }
@ -755,7 +759,8 @@ static void ipaq_read_bulk_callback(struct urb *urb)
return; return;
} }
usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); usb_serial_debug_data(debug, &port->dev, __func__,
urb->actual_length, data);
tty = port->port.tty; tty = port->port.tty;
if (tty && urb->actual_length) { if (tty && urb->actual_length) {
@ -766,13 +771,15 @@ static void ipaq_read_bulk_callback(struct urb *urb)
} }
/* Continue trying to always read */ /* Continue trying to always read */
usb_fill_bulk_urb(port->read_urb, port->serial->dev, usb_fill_bulk_urb(port->read_urb, port->serial->dev,
usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress), usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, port->read_urb->transfer_buffer,
ipaq_read_bulk_callback, port); port->read_urb->transfer_buffer_length,
ipaq_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_ATOMIC); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
err("%s - failed resubmitting read urb, error %d", __func__, result); err("%s - failed resubmitting read urb, error %d",
__func__, result);
return; return;
} }
@ -787,9 +794,8 @@ static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
while (count > 0) { while (count > 0) {
transfer_size = min(count, PACKET_SIZE); transfer_size = min(count, PACKET_SIZE);
if (ipaq_write_bulk(port, current_position, transfer_size)) { if (ipaq_write_bulk(port, current_position, transfer_size))
break; break;
}
current_position += transfer_size; current_position += transfer_size;
bytes_sent += transfer_size; bytes_sent += transfer_size;
count -= transfer_size; count -= transfer_size;
@ -797,10 +803,10 @@ static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
} }
return bytes_sent; return bytes_sent;
} }
static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf, static int ipaq_write_bulk(struct usb_serial_port *port,
int count) const unsigned char *buf, int count)
{ {
struct ipaq_private *priv = usb_get_serial_port_data(port); struct ipaq_private *priv = usb_get_serial_port_data(port);
struct ipaq_packet *pkt = NULL; struct ipaq_packet *pkt = NULL;
@ -837,9 +843,9 @@ static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *bu
ipaq_write_gather(port); ipaq_write_gather(port);
spin_unlock_irqrestore(&write_list_lock, flags); spin_unlock_irqrestore(&write_list_lock, flags);
result = usb_submit_urb(port->write_urb, GFP_ATOMIC); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) { if (result)
err("%s - failed submitting write urb, error %d", __func__, result); err("%s - failed submitting write urb, error %d",
} __func__, result);
} else { } else {
spin_unlock_irqrestore(&write_list_lock, flags); spin_unlock_irqrestore(&write_list_lock, flags);
} }
@ -866,16 +872,15 @@ static void ipaq_write_gather(struct usb_serial_port *port)
list_move(&pkt->list, &priv->freelist); list_move(&pkt->list, &priv->freelist);
priv->free_len += PACKET_SIZE; priv->free_len += PACKET_SIZE;
} }
if (room == 0) { if (room == 0)
break; break;
}
} }
count = URBDATA_SIZE - room; count = URBDATA_SIZE - room;
usb_fill_bulk_urb(port->write_urb, serial->dev, usb_fill_bulk_urb(port->write_urb, serial->dev,
usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback, port->write_urb->transfer_buffer, count,
port); ipaq_write_bulk_callback, port);
return; return;
} }
@ -900,9 +905,9 @@ static void ipaq_write_bulk_callback(struct urb *urb)
ipaq_write_gather(port); ipaq_write_gather(port);
spin_unlock_irqrestore(&write_list_lock, flags); spin_unlock_irqrestore(&write_list_lock, flags);
result = usb_submit_urb(port->write_urb, GFP_ATOMIC); result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) { if (result)
err("%s - failed submitting write urb, error %d", __func__, result); err("%s - failed submitting write urb, error %d",
} __func__, result);
} else { } else {
priv->active = 0; priv->active = 0;
spin_unlock_irqrestore(&write_list_lock, flags); spin_unlock_irqrestore(&write_list_lock, flags);
@ -953,7 +958,7 @@ static int ipaq_startup(struct usb_serial *serial)
serial->dev->actconfig->desc.bConfigurationValue); serial->dev->actconfig->desc.bConfigurationValue);
return -ENODEV; return -ENODEV;
} }
return usb_reset_configuration (serial->dev); return usb_reset_configuration(serial->dev);
} }
static void ipaq_shutdown(struct usb_serial *serial) static void ipaq_shutdown(struct usb_serial *serial)
@ -966,7 +971,7 @@ static int __init ipaq_init(void)
int retval; int retval;
spin_lock_init(&write_list_lock); spin_lock_init(&write_list_lock);
retval = usb_serial_register(&ipaq_device); retval = usb_serial_register(&ipaq_device);
if (retval) if (retval)
goto failed_usb_serial_register; goto failed_usb_serial_register;
info(DRIVER_DESC " " DRIVER_VERSION); info(DRIVER_DESC " " DRIVER_VERSION);
if (vendor) { if (vendor) {
@ -976,7 +981,7 @@ static int __init ipaq_init(void)
retval = usb_register(&ipaq_driver); retval = usb_register(&ipaq_driver);
if (retval) if (retval)
goto failed_usb_register; goto failed_usb_register;
return 0; return 0;
failed_usb_register: failed_usb_register:
usb_serial_deregister(&ipaq_device); usb_serial_deregister(&ipaq_device);
@ -995,8 +1000,8 @@ static void __exit ipaq_exit(void)
module_init(ipaq_init); module_init(ipaq_init);
module_exit(ipaq_exit); module_exit(ipaq_exit);
MODULE_AUTHOR( DRIVER_AUTHOR ); MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_param(debug, bool, S_IRUGO | S_IWUSR); module_param(debug, bool, S_IRUGO | S_IWUSR);
@ -1009,7 +1014,9 @@ module_param(product, ushort, 0);
MODULE_PARM_DESC(product, "User specified USB idProduct"); MODULE_PARM_DESC(product, "User specified USB idProduct");
module_param(connect_retries, int, S_IRUGO|S_IWUSR); module_param(connect_retries, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)"); MODULE_PARM_DESC(connect_retries,
"Maximum number of connect retries (one second each)");
module_param(initial_wait, int, S_IRUGO|S_IWUSR); module_param(initial_wait, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)"); MODULE_PARM_DESC(initial_wait,
"Time to wait before attempting a connection (in seconds)");