]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/serial/mos7720.c
Merge Linux 2.6.23
[linux-2.6-omap-h63xx.git] / drivers / usb / serial / mos7720.c
index 2d588fb82573f998aa6b899dae13a84fceff4e1b..01e811becec4659055bc27f02ec2693ac66011d2 100644 (file)
@@ -9,9 +9,9 @@
  * the Free Software Foundation, version 2 of the License.
  *
  * Developed by:
- *     VijayaKumar.G.N. <vijaykumar@aspirecom.net>
- *     AjayKumar <ajay@aspirecom.net>
- *     Gurudeva.N. <gurudev@aspirecom.net>
+ *     Vijaya Kumar <vijaykumar.gn@gmail.com>
+ *     Ajay Kumar <naanuajay@yahoo.com>
+ *     Gurudeva <ngurudeva@yahoo.com>
  *
  * Cleaned up from the original by:
  *     Greg Kroah-Hartman <gregkh@suse.de>
@@ -103,20 +103,14 @@ static void mos7720_interrupt_callback(struct urb *urb)
 {
        int result;
        int length;
-       __u32 *data;
-       unsigned int status;
+       int status = urb->status;
+       __u8 *data;
        __u8 sp1;
        __u8 sp2;
-       __u8 st;
 
        dbg("%s"," : Entering\n");
 
-       if (!urb) {
-               dbg("%s","Invalid Pointer !!!!:\n");
-               return;
-       }
-
-       switch (urb->status) {
+       switch (status) {
        case 0:
                /* success */
                break;
@@ -125,11 +119,11 @@ static void mos7720_interrupt_callback(struct urb *urb)
        case -ESHUTDOWN:
                /* this urb is terminated, clean up */
                dbg("%s - urb shutting down with status: %d", __FUNCTION__,
-                   urb->status);
+                   status);
                return;
        default:
                dbg("%s - nonzero urb status received: %d", __FUNCTION__,
-                   urb->status);
+                   status);
                goto exit;
        }
 
@@ -141,18 +135,19 @@ static void mos7720_interrupt_callback(struct urb *urb)
         * Byte 2 IIR Port 2 (port.number is 1)
         * Byte 3 --------------
         * Byte 4 FIFO status for both */
-       if (length && length > 4) {
+
+       /* the above description is inverted
+        *      oneukum 2007-03-14 */
+
+       if (unlikely(length != 4)) {
                dbg("Wrong data !!!");
                return;
        }
 
-       status = *data;
-
-       sp1 = (status & 0xff000000)>>24;
-       sp2 = (status & 0x00ff0000)>>16;
-       st = status & 0x000000ff;
+       sp1 = data[3];
+       sp2 = data[2];
 
-       if ((sp1 & 0x01) || (sp2 & 0x01)) {
+       if ((sp1 | sp2) & 0x01) {
                /* No Interrupt Pending in both the ports */
                dbg("No Interrupt !!!");
        } else {
@@ -199,14 +194,15 @@ exit:
  */
 static void mos7720_bulk_in_callback(struct urb *urb)
 {
-       int status;
+       int retval;
        unsigned char *data ;
        struct usb_serial_port *port;
        struct moschip_port *mos7720_port;
        struct tty_struct *tty;
+       int status = urb->status;
 
-       if (urb->status) {
-               dbg("nonzero read bulk status received: %d",urb->status);
+       if (status) {
+               dbg("nonzero read bulk status received: %d", status);
                return;
        }
 
@@ -237,10 +233,10 @@ static void mos7720_bulk_in_callback(struct urb *urb)
        if (port->read_urb->status != -EINPROGRESS) {
                port->read_urb->dev = port->serial->dev;
 
-               status = usb_submit_urb(port->read_urb, GFP_ATOMIC);
-               if (status)
-                       dbg("usb_submit_urb(read bulk) failed, status = %d",
-                           status);
+               retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
+               if (retval)
+                       dbg("usb_submit_urb(read bulk) failed, retval = %d",
+                           retval);
        }
 }
 
@@ -253,9 +249,10 @@ static void mos7720_bulk_out_data_callback(struct urb *urb)
 {
        struct moschip_port *mos7720_port;
        struct tty_struct *tty;
+       int status = urb->status;
 
-       if (urb->status) {
-               dbg("nonzero write bulk status received:%d", urb->status);
+       if (status) {
+               dbg("nonzero write bulk status received:%d", status);
                return;
        }
 
@@ -333,6 +330,7 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
        int response;
        int port_number;
        char data;
+       int allocated_urbs = 0;
        int j;
 
        serial = port->serial;
@@ -353,7 +351,7 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
 
        /* Initialising the write urb pool */
        for (j = 0; j < NUM_URBS; ++j) {
-               urb = usb_alloc_urb(0,GFP_ATOMIC);
+               urb = usb_alloc_urb(0,GFP_KERNEL);
                mos7720_port->write_urb_pool[j] = urb;
 
                if (urb == NULL) {
@@ -365,10 +363,16 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
                                               GFP_KERNEL);
                if (!urb->transfer_buffer) {
                        err("%s-out of memory for urb buffers.", __FUNCTION__);
+                       usb_free_urb(mos7720_port->write_urb_pool[j]);
+                       mos7720_port->write_urb_pool[j] = NULL;
                        continue;
                }
+               allocated_urbs++;
        }
 
+       if (!allocated_urbs)
+               return -ENOMEM;
+
         /* Initialize MCS7720 -- Write Init values to corresponding Registers
          *
          * Register Index
@@ -526,7 +530,7 @@ static int mos7720_chars_in_buffer(struct usb_serial_port *port)
        }
 
        for (i = 0; i < NUM_URBS; ++i) {
-               if (mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
+               if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
                        chars += URB_TRANSFER_BUFFER_SIZE;
        }
        dbg("%s - returns %d", __FUNCTION__, chars);
@@ -629,7 +633,7 @@ static int mos7720_write_room(struct usb_serial_port *port)
        }
 
        for (i = 0; i < NUM_URBS; ++i) {
-               if (mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
+               if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
                        room += URB_TRANSFER_BUFFER_SIZE;
        }
 
@@ -664,7 +668,7 @@ static int mos7720_write(struct usb_serial_port *port,
        urb = NULL;
 
        for (i = 0; i < NUM_URBS; ++i) {
-               if (mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
+               if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
                        urb = mos7720_port->write_urb_pool[i];
                        dbg("URB:%d",i);
                        break;
@@ -1229,16 +1233,6 @@ static void mos7720_set_termios(struct usb_serial_port *port,
                return;
        }
 
-       /* check that they really want us to change something */
-       if (old_termios) {
-               if ((cflag == old_termios->c_cflag) &&
-                   (RELEVANT_IFLAG(tty->termios->c_iflag) ==
-                    RELEVANT_IFLAG(old_termios->c_iflag))) {
-                       dbg("Nothing to change");
-                       return;
-               }
-       }
-
        dbg("%s - clfag %08x iflag %08x", __FUNCTION__,
            tty->termios->c_cflag,
            RELEVANT_IFLAG(tty->termios->c_iflag));
@@ -1628,6 +1622,7 @@ static struct usb_serial_driver moschip7720_2port_driver = {
        .chars_in_buffer        = mos7720_chars_in_buffer,
        .break_ctl              = mos7720_break,
        .read_bulk_callback     = mos7720_bulk_in_callback,
+       .read_int_callback      = mos7720_interrupt_callback,
 };
 
 static int __init moschip7720_init(void)