]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/serial/option.c
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux...
[linux-2.6-omap-h63xx.git] / drivers / usb / serial / option.c
index d101025a4c637176a0503e5c71a0079700fc7e9a..e4be2d442b1ebbc6ea3bca507e85d4905d4f526f 100644 (file)
@@ -28,7 +28,7 @@
   device features.
 */
 
-#define DRIVER_VERSION "v0.7.1"
+#define DRIVER_VERSION "v0.7.2"
 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
 #define DRIVER_DESC "USB Driver for GSM modems"
 
@@ -325,9 +325,6 @@ static struct usb_serial_driver option_1port_device = {
        .description       = "GSM modem (1-port)",
        .usb_driver        = &option_driver,
        .id_table          = option_ids,
-       .num_interrupt_in  = NUM_DONT_CARE,
-       .num_bulk_in       = NUM_DONT_CARE,
-       .num_bulk_out      = NUM_DONT_CARE,
        .num_ports         = 1,
        .open              = option_open,
        .close             = option_close,
@@ -411,24 +408,24 @@ module_exit(option_exit);
 
 static void option_rx_throttle(struct usb_serial_port *port)
 {
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 }
 
 static void option_rx_unthrottle(struct usb_serial_port *port)
 {
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 }
 
 static void option_break_ctl(struct usb_serial_port *port, int break_state)
 {
        /* Unfortunately, I don't know how to send a break */
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 }
 
 static void option_set_termios(struct usb_serial_port *port,
                        struct ktermios *old_termios)
 {
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
        /* Doesn't support option setting */
        tty_termios_copy_hw(port->tty->termios, old_termios);
        option_send_setup(port);
@@ -458,6 +455,7 @@ static int option_tiocmset(struct usb_serial_port *port, struct file *file,
 
        portdata = usb_get_serial_port_data(port);
 
+       /* FIXME: what locks portdata fields ? */
        if (set & TIOCM_RTS)
                portdata->rts_state = 1;
        if (set & TIOCM_DTR)
@@ -488,7 +486,7 @@ static int option_write(struct usb_serial_port *port,
 
        portdata = usb_get_serial_port_data(port);
 
-       dbg("%s: write (%d chars)", __FUNCTION__, count);
+       dbg("%s: write (%d chars)", __func__, count);
 
        i = 0;
        left = count;
@@ -509,7 +507,7 @@ static int option_write(struct usb_serial_port *port,
                        dbg("usb_write %p failed (err=%d)",
                                this_urb, this_urb->status);
 
-               dbg("%s: endpoint %d buf %d", __FUNCTION__,
+               dbg("%s: endpoint %d buf %d", __func__,
                        usb_pipeendpoint(this_urb->pipe), i);
 
                /* send the data */
@@ -531,7 +529,7 @@ static int option_write(struct usb_serial_port *port,
        }
 
        count -= left;
-       dbg("%s: wrote (did %d)", __FUNCTION__, count);
+       dbg("%s: wrote (did %d)", __func__, count);
        return count;
 }
 
@@ -544,14 +542,14 @@ static void option_indat_callback(struct urb *urb)
        unsigned char *data = urb->transfer_buffer;
        int status = urb->status;
 
-       dbg("%s: %p", __FUNCTION__, urb);
+       dbg("%s: %p", __func__, urb);
 
        endpoint = usb_pipeendpoint(urb->pipe);
-       port = (struct usb_serial_port *) urb->context;
+       port =  urb->context;
 
        if (status) {
                dbg("%s: nonzero status: %d on endpoint %02x.",
-                   __FUNCTION__, status, endpoint);
+                   __func__, status, endpoint);
        } else {
                tty = port->tty;
                if (urb->actual_length) {
@@ -559,7 +557,7 @@ static void option_indat_callback(struct urb *urb)
                        tty_insert_flip_string(tty, data, urb->actual_length);
                        tty_flip_buffer_push(tty);
                } else {
-                       dbg("%s: empty read urb received", __FUNCTION__);
+                       dbg("%s: empty read urb received", __func__);
                }
 
                /* Resubmit urb so we continue receiving */
@@ -567,7 +565,7 @@ static void option_indat_callback(struct urb *urb)
                        err = usb_submit_urb(urb, GFP_ATOMIC);
                        if (err)
                                printk(KERN_ERR "%s: resubmit read urb failed. "
-                                       "(%d)", __FUNCTION__, err);
+                                       "(%d)", __func__, err);
                }
        }
        return;
@@ -579,9 +577,9 @@ static void option_outdat_callback(struct urb *urb)
        struct option_port_private *portdata;
        int i;
 
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 
-       port = (struct usb_serial_port *) urb->context;
+       port =  urb->context;
 
        usb_serial_port_softint(port);
 
@@ -599,19 +597,19 @@ static void option_instat_callback(struct urb *urb)
 {
        int err;
        int status = urb->status;
-       struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
+       struct usb_serial_port *port =  urb->context;
        struct option_port_private *portdata = usb_get_serial_port_data(port);
        struct usb_serial *serial = port->serial;
 
-       dbg("%s", __FUNCTION__);
-       dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
+       dbg("%s", __func__);
+       dbg("%s: urb %p port %p has data %p", __func__,urb,port,portdata);
 
        if (status == 0) {
                struct usb_ctrlrequest *req_pkt =
                                (struct usb_ctrlrequest *)urb->transfer_buffer;
 
                if (!req_pkt) {
-                       dbg("%s: NULL req_pkt\n", __FUNCTION__);
+                       dbg("%s: NULL req_pkt\n", __func__);
                        return;
                }
                if ((req_pkt->bRequestType == 0xA1) &&
@@ -621,7 +619,7 @@ static void option_instat_callback(struct urb *urb)
                                        urb->transfer_buffer +
                                        sizeof(struct usb_ctrlrequest));
 
-                       dbg("%s: signal x%x", __FUNCTION__, signals);
+                       dbg("%s: signal x%x", __func__, signals);
 
                        old_dcd_state = portdata->dcd_state;
                        portdata->cts_state = 1;
@@ -633,11 +631,11 @@ static void option_instat_callback(struct urb *urb)
                                        old_dcd_state && !portdata->dcd_state)
                                tty_hangup(port->tty);
                } else {
-                       dbg("%s: type %x req %x", __FUNCTION__,
+                       dbg("%s: type %x req %x", __func__,
                                req_pkt->bRequestType,req_pkt->bRequest);
                }
        } else
-               dbg("%s: error %d", __FUNCTION__, status);
+               dbg("%s: error %d", __func__, status);
 
        /* Resubmit urb so we continue receiving IRQ data */
        if (status != -ESHUTDOWN) {
@@ -645,7 +643,7 @@ static void option_instat_callback(struct urb *urb)
                err = usb_submit_urb(urb, GFP_ATOMIC);
                if (err)
                        dbg("%s: resubmit intr urb failed. (%d)",
-                               __FUNCTION__, err);
+                               __func__, err);
        }
 }
 
@@ -658,13 +656,14 @@ static int option_write_room(struct usb_serial_port *port)
 
        portdata = usb_get_serial_port_data(port);
 
+
        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;
        }
 
-       dbg("%s: %d", __FUNCTION__, data_len);
+       dbg("%s: %d", __func__, data_len);
        return data_len;
 }
 
@@ -679,10 +678,12 @@ static int option_chars_in_buffer(struct usb_serial_port *port)
 
        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 */
                if (this_urb && test_bit(i, &portdata->out_busy))
                        data_len += this_urb->transfer_buffer_length;
        }
-       dbg("%s: %d", __FUNCTION__, data_len);
+       dbg("%s: %d", __func__, data_len);
        return data_len;
 }
 
@@ -695,7 +696,7 @@ static int option_open(struct usb_serial_port *port, struct file *filp)
 
        portdata = usb_get_serial_port_data(port);
 
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 
        /* Set some sane defaults */
        portdata->rts_state = 1;
@@ -707,7 +708,7 @@ static int option_open(struct usb_serial_port *port, struct file *filp)
                if (! urb)
                        continue;
                if (urb->dev != serial->dev) {
-                       dbg("%s: dev %p != %p", __FUNCTION__,
+                       dbg("%s: dev %p != %p", __func__,
                                urb->dev, serial->dev);
                        continue;
                }
@@ -721,7 +722,7 @@ static int option_open(struct usb_serial_port *port, struct file *filp)
                err = usb_submit_urb(urb, GFP_KERNEL);
                if (err) {
                        dbg("%s: submit urb %d failed (%d) %d",
-                               __FUNCTION__, i, err,
+                               __func__, i, err,
                                urb->transfer_buffer_length);
                }
        }
@@ -749,7 +750,7 @@ static void option_close(struct usb_serial_port *port, struct file *filp)
        struct usb_serial *serial = port->serial;
        struct option_port_private *portdata;
 
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
        portdata = usb_get_serial_port_data(port);
 
        portdata->rts_state = 0;
@@ -782,7 +783,7 @@ static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
 
        urb = usb_alloc_urb(0, GFP_KERNEL);             /* No ISO */
        if (urb == NULL) {
-               dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
+               dbg("%s: alloc for endpoint %d failed.", __func__, endpoint);
                return NULL;
        }
 
@@ -801,7 +802,7 @@ static void option_setup_urbs(struct usb_serial *serial)
        struct usb_serial_port *port;
        struct option_port_private *portdata;
 
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 
        for (i = 0; i < serial->num_ports; i++) {
                port = serial->port[i];
@@ -823,15 +824,18 @@ static void option_setup_urbs(struct usb_serial *serial)
        }
 }
 
+
+/** send RTS/DTR state to the port.
+ *
+ * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN
+ * CDC.
+*/
 static int option_send_setup(struct usb_serial_port *port)
 {
        struct usb_serial *serial = port->serial;
        struct option_port_private *portdata;
-
-       dbg("%s", __FUNCTION__);
-
-       if (port->number != 0)
-               return 0;
+       int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
+       dbg("%s", __func__);
 
        portdata = usb_get_serial_port_data(port);
 
@@ -844,7 +848,7 @@ static int option_send_setup(struct usb_serial_port *port)
 
                return usb_control_msg(serial->dev,
                                usb_rcvctrlpipe(serial->dev, 0),
-                               0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
+                               0x22,0x21,val,ifNum,NULL,0,USB_CTRL_SET_TIMEOUT);
        }
 
        return 0;
@@ -857,7 +861,7 @@ static int option_startup(struct usb_serial *serial)
        struct option_port_private *portdata;
        u8 *buffer;
 
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 
        /* Now setup per port private data */
        for (i = 0; i < serial->num_ports; i++) {
@@ -865,7 +869,7 @@ static int option_startup(struct usb_serial *serial)
                portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
                if (!portdata) {
                        dbg("%s: kmalloc for option_port_private (%d) failed!.",
-                                       __FUNCTION__, i);
+                                       __func__, i);
                        return (1);
                }
 
@@ -890,7 +894,7 @@ static int option_startup(struct usb_serial *serial)
                err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
                if (err)
                        dbg("%s: submit irq_in urb failed %d",
-                               __FUNCTION__, err);
+                               __func__, err);
        }
 
        option_setup_urbs(serial);
@@ -914,7 +918,7 @@ static void option_shutdown(struct usb_serial *serial)
        struct usb_serial_port *port;
        struct option_port_private *portdata;
 
-       dbg("%s", __FUNCTION__);
+       dbg("%s", __func__);
 
        /* Stop reading/writing urbs */
        for (i = 0; i < serial->num_ports; ++i) {