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/module.h>
#include <linux/spinlock.h>
#include <asm/uaccess.h>
#include <linux/uaccess.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
#include "ipaq.h"
@ -82,8 +82,8 @@ static int ipaq_startup(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,
const unsigned char *buf, int count);
static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf,
int count);
static int ipaq_write_bulk(struct usb_serial_port *port,
const unsigned char *buf, int count);
static void ipaq_write_gather(struct usb_serial_port *port);
static void ipaq_read_bulk_callback(struct urb *urb);
static void ipaq_write_bulk_callback(struct urb *urb);
@ -620,9 +620,9 @@ static int ipaq_open(struct tty_struct *tty,
for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
if (pkt == NULL) {
if (pkt == NULL)
goto enomem;
}
pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
if (pkt->data == NULL) {
kfree(pkt);
@ -667,7 +667,8 @@ static int ipaq_open(struct tty_struct *tty,
port->read_urb->transfer_buffer = port->bulk_in_buffer;
port->write_urb->transfer_buffer = port->bulk_out_buffer;
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);
@ -698,12 +699,14 @@ static int ipaq_open(struct tty_struct *tty,
/* Start reading from the device */
usb_fill_bulk_urb(port->read_urb, serial->dev,
usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
ipaq_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_KERNEL);
if (result) {
err("%s - failed submitting read urb, error %d", __func__, result);
err("%s - failed submitting read urb, error %d",
__func__, result);
goto error;
}
@ -735,7 +738,8 @@ static void ipaq_close(struct tty_struct *tty,
kfree(priv);
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); */
}
@ -755,7 +759,8 @@ static void ipaq_read_bulk_callback(struct urb *urb)
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;
if (tty && urb->actual_length) {
@ -768,11 +773,13 @@ static void ipaq_read_bulk_callback(struct urb *urb)
/* Continue trying to always read */
usb_fill_bulk_urb(port->read_urb, port->serial->dev,
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,
port->read_urb->transfer_buffer_length,
ipaq_read_bulk_callback, port);
result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result)
err("%s - failed resubmitting read urb, error %d", __func__, result);
err("%s - failed resubmitting read urb, error %d",
__func__, result);
return;
}
@ -787,9 +794,8 @@ static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
while (count > 0) {
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;
}
current_position += transfer_size;
bytes_sent += transfer_size;
count -= transfer_size;
@ -799,8 +805,8 @@ static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
return bytes_sent;
}
static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf,
int count)
static int ipaq_write_bulk(struct usb_serial_port *port,
const unsigned char *buf, int count)
{
struct ipaq_private *priv = usb_get_serial_port_data(port);
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);
spin_unlock_irqrestore(&write_list_lock, flags);
result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) {
err("%s - failed submitting write urb, error %d", __func__, result);
}
if (result)
err("%s - failed submitting write urb, error %d",
__func__, result);
} else {
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);
priv->free_len += PACKET_SIZE;
}
if (room == 0) {
if (room == 0)
break;
}
}
count = URBDATA_SIZE - room;
usb_fill_bulk_urb(port->write_urb, serial->dev,
usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback,
port);
port->write_urb->transfer_buffer, count,
ipaq_write_bulk_callback, port);
return;
}
@ -900,9 +905,9 @@ static void ipaq_write_bulk_callback(struct urb *urb)
ipaq_write_gather(port);
spin_unlock_irqrestore(&write_list_lock, flags);
result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
if (result) {
err("%s - failed submitting write urb, error %d", __func__, result);
}
if (result)
err("%s - failed submitting write urb, error %d",
__func__, result);
} else {
priv->active = 0;
spin_unlock_irqrestore(&write_list_lock, flags);
@ -1009,7 +1014,9 @@ module_param(product, ushort, 0);
MODULE_PARM_DESC(product, "User specified USB idProduct");
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_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)");