]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/usb/serial/mos7840.c
USB: serial: add FTDI USB/Serial converter devices
[mv-sheeva.git] / drivers / usb / serial / mos7840.c
index 60543d79ef56b643d10b0ef78e0206cc717ae631..2c20e88a91b3df84b8a19b7d2e5d46caf2f329f9 100644 (file)
@@ -214,6 +214,7 @@ struct moschip_port {
        spinlock_t pool_lock;
        struct urb *write_urb_pool[NUM_URBS];
        char busy[NUM_URBS];
+       bool read_urb_busy;
 };
 
 
@@ -679,26 +680,30 @@ static void mos7840_bulk_in_callback(struct urb *urb)
        struct tty_struct *tty;
        int status = urb->status;
 
-       if (status) {
-               dbg("nonzero read bulk status received: %d", status);
-               return;
-       }
-
        mos7840_port = urb->context;
        if (!mos7840_port) {
                dbg("%s", "NULL mos7840_port pointer \n");
+               mos7840_port->read_urb_busy = false;
+               return;
+       }
+
+       if (status) {
+               dbg("nonzero read bulk status received: %d", status);
+               mos7840_port->read_urb_busy = false;
                return;
        }
 
        port = (struct usb_serial_port *)mos7840_port->port;
        if (mos7840_port_paranoia_check(port, __func__)) {
                dbg("%s", "Port Paranoia failed \n");
+               mos7840_port->read_urb_busy = false;
                return;
        }
 
        serial = mos7840_get_usb_serial(port, __func__);
        if (!serial) {
                dbg("%s\n", "Bad serial pointer ");
+               mos7840_port->read_urb_busy = false;
                return;
        }
 
@@ -725,17 +730,19 @@ static void mos7840_bulk_in_callback(struct urb *urb)
 
        if (!mos7840_port->read_urb) {
                dbg("%s", "URB KILLED !!!\n");
+               mos7840_port->read_urb_busy = false;
                return;
        }
 
 
        mos7840_port->read_urb->dev = serial->dev;
 
+       mos7840_port->read_urb_busy = true;
        retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
 
        if (retval) {
-               dbg(" usb_submit_urb(read bulk) failed, retval = %d",
-                retval);
+               dbg("usb_submit_urb(read bulk) failed, retval = %d", retval);
+               mos7840_port->read_urb_busy = false;
        }
 }
 
@@ -844,7 +851,7 @@ static int mos7840_open(struct tty_struct *tty,
                mos7840_port->write_urb_pool[j] = urb;
 
                if (urb == NULL) {
-                       err("No more urbs???");
+                       dev_err(&port->dev, "No more urbs???\n");
                        continue;
                }
 
@@ -853,7 +860,9 @@ static int mos7840_open(struct tty_struct *tty,
                if (!urb->transfer_buffer) {
                        usb_free_urb(urb);
                        mos7840_port->write_urb_pool[j] = NULL;
-                       err("%s-out of memory for urb buffers.", __func__);
+                       dev_err(&port->dev,
+                               "%s-out of memory for urb buffers.\n",
+                               __func__);
                        continue;
                }
        }
@@ -1021,8 +1030,8 @@ static int mos7840_open(struct tty_struct *tty,
                            usb_submit_urb(serial->port[0]->interrupt_in_urb,
                                           GFP_KERNEL);
                        if (response) {
-                               err("%s - Error %d submitting interrupt urb",
-                                   __func__, response);
+                               dev_err(&port->dev, "%s - Error %d submitting "
+                                       "interrupt urb\n", __func__, response);
                        }
 
                }
@@ -1053,10 +1062,12 @@ static int mos7840_open(struct tty_struct *tty,
 
        dbg("mos7840_open: bulkin endpoint is %d\n",
            port->bulk_in_endpointAddress);
+       mos7840_port->read_urb_busy = true;
        response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
        if (response) {
-               err("%s - Error %d submitting control urb", __func__,
-                   response);
+               dev_err(&port->dev, "%s - Error %d submitting control urb\n",
+                       __func__, response);
+               mos7840_port->read_urb_busy = false;
        }
 
        /* initialize our wait queues */
@@ -1225,6 +1236,7 @@ static void mos7840_close(struct tty_struct *tty,
                if (mos7840_port->read_urb) {
                        dbg("%s", "Shutdown bulk read\n");
                        usb_kill_urb(mos7840_port->read_urb);
+                       mos7840_port->read_urb_busy = false;
                }
                if ((&mos7840_port->control_urb)) {
                        dbg("%s", "Shutdown control read\n");
@@ -1341,6 +1353,7 @@ static void mos7840_break(struct tty_struct *tty, int break_state)
        else
                data = mos7840_port->shadowLCR & ~LCR_SET_BREAK;
 
+       /* FIXME: no locking on shadowLCR anywhere in driver */
        mos7840_port->shadowLCR = data;
        dbg("mcs7840_break mos7840_port->shadowLCR is %x\n",
            mos7840_port->shadowLCR);
@@ -1492,7 +1505,8 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
                    kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
 
                if (urb->transfer_buffer == NULL) {
-                       err("%s no more kernel memory...", __func__);
+                       dev_err(&port->dev, "%s no more kernel memory...\n",
+                               __func__);
                        goto exit;
                }
        }
@@ -1517,8 +1531,8 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
 
        if (status) {
                mos7840_port->busy[i] = 0;
-               err("%s - usb_submit_urb(write bulk) failed with status = %d",
-                   __func__, status);
+               dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed "
+                       "with status = %d\n", __func__, status);
                bytes_sent = status;
                goto exit;
        }
@@ -1856,8 +1870,7 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
                /* Calculate the Divisor */
 
                if (status) {
-                       err("%s - bad baud rate", __func__);
-                       dbg("%s\n", "bad baud rate");
+                       dev_err(&port->dev, "%s - bad baud rate\n", __func__);
                        return status;
                }
                /* Enable access to divisor latch */
@@ -2040,14 +2053,14 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
        Data = 0x0c;
        mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
 
-       if (mos7840_port->read_urb->status != -EINPROGRESS) {
+       if (mos7840_port->read_urb_busy == false) {
                mos7840_port->read_urb->dev = serial->dev;
-
+               mos7840_port->read_urb_busy = true;
                status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
-
                if (status) {
-                       dbg(" usb_submit_urb(read bulk) failed, status = %d",
+                       dbg("usb_submit_urb(read bulk) failed, status = %d",
                            status);
+                       mos7840_port->read_urb_busy = false;
                }
        }
        wake_up(&mos7840_port->delta_msr_wait);
@@ -2114,12 +2127,14 @@ static void mos7840_set_termios(struct tty_struct *tty,
                return;
        }
 
-       if (mos7840_port->read_urb->status != -EINPROGRESS) {
+       if (mos7840_port->read_urb_busy == false) {
                mos7840_port->read_urb->dev = serial->dev;
+               mos7840_port->read_urb_busy = true;
                status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
                if (status) {
-                       dbg(" usb_submit_urb(read bulk) failed, status = %d",
+                       dbg("usb_submit_urb(read bulk) failed, status = %d",
                            status);
+                       mos7840_port->read_urb_busy = false;
                }
        }
        return;
@@ -2212,10 +2227,12 @@ static int mos7840_set_modem_info(struct moschip_port *mos7840_port,
                break;
        }
 
+       lock_kernel();
        mos7840_port->shadowMCR = mcr;
 
        Data = mos7840_port->shadowMCR;
        status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
+       unlock_kernel();
        if (status < 0) {
                dbg("setting MODEM_CONTROL_REGISTER Failed\n");
                return -1;
@@ -2446,7 +2463,7 @@ static int mos7840_startup(struct usb_serial *serial)
        for (i = 0; i < serial->num_ports; ++i) {
                mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL);
                if (mos7840_port == NULL) {
-                       err("%s - Out of memory", __func__);
+                       dev_err(&dev->dev, "%s - Out of memory\n", __func__);
                        status = -ENOMEM;
                        i--; /* don't follow NULL pointer cleaning up */
                        goto error;
@@ -2743,7 +2760,8 @@ static int __init moschip7840_init(void)
                goto failed_port_device_register;
 
        dbg("%s\n", "Entring...");
-       info(DRIVER_DESC " " DRIVER_VERSION);
+       printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
+              DRIVER_DESC "\n");
 
        /* Register with the usb */
        retval = usb_register(&io_driver);