Loading drivers/usb/serial/ipw.c +144 −135 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ #include <linux/spinlock.h> #include <linux/usb.h> #include <linux/usb/serial.h> #include <asm/uaccess.h> #include <linux/uaccess.h> /* * Version Information Loading Loading @@ -94,33 +94,34 @@ enum { /* data bits */ #define ipw_dtb_7 0x700 #define ipw_dtb_8 0x810 // ok so the define is misleading, I know, but forces 8,n,1 // I mean, is there a point to any other setting these days? :) #define ipw_dtb_8 0x810 /* ok so the define is misleading, I know, but forces 8,n,1 */ /* I mean, is there a point to any other setting these days? :) */ /* usb control request types : */ #define IPW_SIO_RXCTL 0x00 // control bulk rx channel transmissions, value=1/0 (on/off) #define IPW_SIO_SET_BAUD 0x01 // set baud, value=requested ipw_sio_bxxxx #define IPW_SIO_SET_LINE 0x03 // set databits, parity. value=ipw_dtb_x #define IPW_SIO_SET_PIN 0x03 // set/clear dtr/rts value=ipw_pin_xxx #define IPW_SIO_POLL 0x08 // get serial port status byte, call with value=0 #define IPW_SIO_INIT 0x11 // initializes ? value=0 (appears as first thing todo on open) #define IPW_SIO_PURGE 0x12 // purge all transmissions?, call with value=numchar_to_purge #define IPW_SIO_HANDFLOW 0x13 // set xon/xoff limits value=0, and a buffer of 0x10 bytes #define IPW_SIO_SETCHARS 0x13 // set the flowcontrol special chars, value=0, buf=6 bytes, // last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13 #define IPW_SIO_RXCTL 0x00 /* control bulk rx channel transmissions, value=1/0 (on/off) */ #define IPW_SIO_SET_BAUD 0x01 /* set baud, value=requested ipw_sio_bxxxx */ #define IPW_SIO_SET_LINE 0x03 /* set databits, parity. value=ipw_dtb_x */ #define IPW_SIO_SET_PIN 0x03 /* set/clear dtr/rts value=ipw_pin_xxx */ #define IPW_SIO_POLL 0x08 /* get serial port status byte, call with value=0 */ #define IPW_SIO_INIT 0x11 /* initializes ? value=0 (appears as first thing todo on open) */ #define IPW_SIO_PURGE 0x12 /* purge all transmissions?, call with value=numchar_to_purge */ #define IPW_SIO_HANDFLOW 0x13 /* set xon/xoff limits value=0, and a buffer of 0x10 bytes */ #define IPW_SIO_SETCHARS 0x13 /* set the flowcontrol special chars, value=0, buf=6 bytes, */ /* last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13 */ /* values used for request IPW_SIO_SET_PIN */ #define IPW_PIN_SETDTR 0x101 #define IPW_PIN_SETRTS 0x202 #define IPW_PIN_CLRDTR 0x100 #define IPW_PIN_CLRRTS 0x200 // unconfirmed #define IPW_PIN_CLRRTS 0x200 /* unconfirmed */ /* values used for request IPW_SIO_RXCTL */ #define IPW_RXBULK_ON 1 #define IPW_RXBULK_OFF 0 /* various 16 byte hardcoded transferbuffers used by flow control */ #define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } #define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0 } /* Interpretation of modem status lines */ /* These need sorting out by individually connecting pins and checking Loading @@ -132,17 +133,6 @@ enum { #define IPW_CTS ((1<<5) | (1<<4)) #define IPW_WANTS_TO_SEND 0x30 //#define IPW_DTR /* Data Terminal Ready */ //#define IPW_CTS /* Clear To Send */ //#define IPW_CD /* Carrier Detect */ //#define IPW_DSR /* Data Set Ready */ //#define IPW_RxD /* Receive pin */ //#define IPW_LE //#define IPW_RTS //#define IPW_ST //#define IPW_SR //#define IPW_RI /* Ring Indicator */ static struct usb_device_id usb_ipw_ids[] = { { USB_DEVICE(IPW_VID, IPW_PID) }, Loading Loading @@ -177,7 +167,8 @@ static void ipw_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) { Loading @@ -195,7 +186,9 @@ static void ipw_read_bulk_callback(struct urb *urb) ipw_read_bulk_callback, port); result = usb_submit_urb(port->read_urb, GFP_ATOMIC); if (result) dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); return; } Loading @@ -216,8 +209,9 @@ static int ipw_open(struct tty_struct *tty, if (tty) tty->low_latency = 1; /* --1: Tell the modem to initialize (we think) From sniffs this is always the * first thing that gets sent to the modem during opening of the device */ /* --1: Tell the modem to initialize (we think) From sniffs this is * always the first thing that gets sent to the modem during * opening of the device */ dbg("%s: Sending SIO_INIT (we guess)", __func__); result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_INIT, Loading @@ -228,11 +222,14 @@ static int ipw_open(struct tty_struct *tty, 0, 100000); if (result < 0) dev_err(&port->dev, "Init of modem failed (error = %d)\n", result); dev_err(&port->dev, "Init of modem failed (error = %d)\n", result); /* reset the bulk pipes */ usb_clear_halt(dev, usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress)); usb_clear_halt(dev, usb_sndbulkpipe(dev, port->bulk_out_endpointAddress)); usb_clear_halt(dev, usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress)); usb_clear_halt(dev, usb_sndbulkpipe(dev, port->bulk_out_endpointAddress)); /*--2: Start reading from the device */ dbg("%s: setting up bulk read callback", __func__); Loading @@ -243,7 +240,8 @@ static int ipw_open(struct tty_struct *tty, ipw_read_bulk_callback, port); result = usb_submit_urb(port->read_urb, GFP_KERNEL); if (result < 0) dbg("%s - usb_submit_urb(read bulk) failed with status %d", __func__, result); dbg("%s - usb_submit_urb(read bulk) failed with status %d", __func__, result); /*--3: Tell the modem to open the floodgates on the rx bulk channel */ dbg("%s:asking modem for RxRead (RXBULK_ON)", __func__); Loading @@ -256,7 +254,8 @@ static int ipw_open(struct tty_struct *tty, 0, 100000); if (result < 0) dev_err(&port->dev, "Enabling bulk RxRead failed (error = %d)\n", result); dev_err(&port->dev, "Enabling bulk RxRead failed (error = %d)\n", result); /*--4: setup the initial flowcontrol */ dbg("%s:setting init flowcontrol (%s)", __func__, buf_flow_init); Loading @@ -269,7 +268,8 @@ static int ipw_open(struct tty_struct *tty, 0x10, 200000); if (result < 0) dev_err(&port->dev, "initial flowcontrol failed (error = %d)\n", result); dev_err(&port->dev, "initial flowcontrol failed (error = %d)\n", result); /*--5: raise the dtr */ Loading @@ -283,7 +283,8 @@ static int ipw_open(struct tty_struct *tty, 0, 200000); if (result < 0) dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); /*--6: raise the rts */ dbg("%s:raising rts", __func__); Loading @@ -296,7 +297,8 @@ static int ipw_open(struct tty_struct *tty, 0, 200000); if (result < 0) dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); kfree(buf_flow_init); return 0; Loading Loading @@ -324,25 +326,29 @@ static void ipw_close(struct tty_struct *tty, 0, 200000); if (result < 0) dev_err(&port->dev, "dropping dtr failed (error = %d)\n", result); dev_err(&port->dev, "dropping dtr failed (error = %d)\n", result); /*--2: drop the rts */ dbg("%s:dropping rts", __func__); result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_SET_PIN, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, IPW_SIO_SET_PIN, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, IPW_PIN_CLRRTS, 0, NULL, 0, 200000); if (result < 0) dev_err(&port->dev, "dropping rts failed (error = %d)\n", result); dev_err(&port->dev, "dropping rts failed (error = %d)\n", result); /*--3: purge */ dbg("%s:sending purge", __func__); result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_PURGE, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, IPW_SIO_PURGE, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 0x03, 0, NULL, Loading @@ -352,7 +358,8 @@ static void ipw_close(struct tty_struct *tty, dev_err(&port->dev, "purge failed (error = %d)\n", result); /* send RXBULK_off (tell modem to stop transmitting bulk data on rx chan) */ /* send RXBULK_off (tell modem to stop transmitting bulk data on rx chan) */ result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_RXCTL, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, Loading @@ -363,7 +370,8 @@ static void ipw_close(struct tty_struct *tty, 100000); if (result < 0) dev_err(&port->dev, "Disabling bulk RxRead failed (error = %d)\n", result); dev_err(&port->dev, "Disabling bulk RxRead failed (error = %d)\n", result); /* shutdown any in-flight urbs that we know about */ usb_kill_urb(port->read_urb); Loading Loading @@ -424,7 +432,8 @@ static int ipw_write(struct tty_struct *tty, struct usb_serial_port *port, ret = usb_submit_urb(port->write_urb, GFP_ATOMIC); if (ret != 0) { port->write_urb_busy = 0; dbg("%s - usb_submit_urb(write bulk) failed with error = %d", __func__, ret); dbg("%s - usb_submit_urb(write bulk) failed with error = %d", __func__, ret); return ret; } Loading Loading
drivers/usb/serial/ipw.c +144 −135 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ #include <linux/spinlock.h> #include <linux/usb.h> #include <linux/usb/serial.h> #include <asm/uaccess.h> #include <linux/uaccess.h> /* * Version Information Loading Loading @@ -94,33 +94,34 @@ enum { /* data bits */ #define ipw_dtb_7 0x700 #define ipw_dtb_8 0x810 // ok so the define is misleading, I know, but forces 8,n,1 // I mean, is there a point to any other setting these days? :) #define ipw_dtb_8 0x810 /* ok so the define is misleading, I know, but forces 8,n,1 */ /* I mean, is there a point to any other setting these days? :) */ /* usb control request types : */ #define IPW_SIO_RXCTL 0x00 // control bulk rx channel transmissions, value=1/0 (on/off) #define IPW_SIO_SET_BAUD 0x01 // set baud, value=requested ipw_sio_bxxxx #define IPW_SIO_SET_LINE 0x03 // set databits, parity. value=ipw_dtb_x #define IPW_SIO_SET_PIN 0x03 // set/clear dtr/rts value=ipw_pin_xxx #define IPW_SIO_POLL 0x08 // get serial port status byte, call with value=0 #define IPW_SIO_INIT 0x11 // initializes ? value=0 (appears as first thing todo on open) #define IPW_SIO_PURGE 0x12 // purge all transmissions?, call with value=numchar_to_purge #define IPW_SIO_HANDFLOW 0x13 // set xon/xoff limits value=0, and a buffer of 0x10 bytes #define IPW_SIO_SETCHARS 0x13 // set the flowcontrol special chars, value=0, buf=6 bytes, // last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13 #define IPW_SIO_RXCTL 0x00 /* control bulk rx channel transmissions, value=1/0 (on/off) */ #define IPW_SIO_SET_BAUD 0x01 /* set baud, value=requested ipw_sio_bxxxx */ #define IPW_SIO_SET_LINE 0x03 /* set databits, parity. value=ipw_dtb_x */ #define IPW_SIO_SET_PIN 0x03 /* set/clear dtr/rts value=ipw_pin_xxx */ #define IPW_SIO_POLL 0x08 /* get serial port status byte, call with value=0 */ #define IPW_SIO_INIT 0x11 /* initializes ? value=0 (appears as first thing todo on open) */ #define IPW_SIO_PURGE 0x12 /* purge all transmissions?, call with value=numchar_to_purge */ #define IPW_SIO_HANDFLOW 0x13 /* set xon/xoff limits value=0, and a buffer of 0x10 bytes */ #define IPW_SIO_SETCHARS 0x13 /* set the flowcontrol special chars, value=0, buf=6 bytes, */ /* last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13 */ /* values used for request IPW_SIO_SET_PIN */ #define IPW_PIN_SETDTR 0x101 #define IPW_PIN_SETRTS 0x202 #define IPW_PIN_CLRDTR 0x100 #define IPW_PIN_CLRRTS 0x200 // unconfirmed #define IPW_PIN_CLRRTS 0x200 /* unconfirmed */ /* values used for request IPW_SIO_RXCTL */ #define IPW_RXBULK_ON 1 #define IPW_RXBULK_OFF 0 /* various 16 byte hardcoded transferbuffers used by flow control */ #define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } #define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0 } /* Interpretation of modem status lines */ /* These need sorting out by individually connecting pins and checking Loading @@ -132,17 +133,6 @@ enum { #define IPW_CTS ((1<<5) | (1<<4)) #define IPW_WANTS_TO_SEND 0x30 //#define IPW_DTR /* Data Terminal Ready */ //#define IPW_CTS /* Clear To Send */ //#define IPW_CD /* Carrier Detect */ //#define IPW_DSR /* Data Set Ready */ //#define IPW_RxD /* Receive pin */ //#define IPW_LE //#define IPW_RTS //#define IPW_ST //#define IPW_SR //#define IPW_RI /* Ring Indicator */ static struct usb_device_id usb_ipw_ids[] = { { USB_DEVICE(IPW_VID, IPW_PID) }, Loading Loading @@ -177,7 +167,8 @@ static void ipw_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) { Loading @@ -195,7 +186,9 @@ static void ipw_read_bulk_callback(struct urb *urb) ipw_read_bulk_callback, port); result = usb_submit_urb(port->read_urb, GFP_ATOMIC); if (result) dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); return; } Loading @@ -216,8 +209,9 @@ static int ipw_open(struct tty_struct *tty, if (tty) tty->low_latency = 1; /* --1: Tell the modem to initialize (we think) From sniffs this is always the * first thing that gets sent to the modem during opening of the device */ /* --1: Tell the modem to initialize (we think) From sniffs this is * always the first thing that gets sent to the modem during * opening of the device */ dbg("%s: Sending SIO_INIT (we guess)", __func__); result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_INIT, Loading @@ -228,11 +222,14 @@ static int ipw_open(struct tty_struct *tty, 0, 100000); if (result < 0) dev_err(&port->dev, "Init of modem failed (error = %d)\n", result); dev_err(&port->dev, "Init of modem failed (error = %d)\n", result); /* reset the bulk pipes */ usb_clear_halt(dev, usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress)); usb_clear_halt(dev, usb_sndbulkpipe(dev, port->bulk_out_endpointAddress)); usb_clear_halt(dev, usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress)); usb_clear_halt(dev, usb_sndbulkpipe(dev, port->bulk_out_endpointAddress)); /*--2: Start reading from the device */ dbg("%s: setting up bulk read callback", __func__); Loading @@ -243,7 +240,8 @@ static int ipw_open(struct tty_struct *tty, ipw_read_bulk_callback, port); result = usb_submit_urb(port->read_urb, GFP_KERNEL); if (result < 0) dbg("%s - usb_submit_urb(read bulk) failed with status %d", __func__, result); dbg("%s - usb_submit_urb(read bulk) failed with status %d", __func__, result); /*--3: Tell the modem to open the floodgates on the rx bulk channel */ dbg("%s:asking modem for RxRead (RXBULK_ON)", __func__); Loading @@ -256,7 +254,8 @@ static int ipw_open(struct tty_struct *tty, 0, 100000); if (result < 0) dev_err(&port->dev, "Enabling bulk RxRead failed (error = %d)\n", result); dev_err(&port->dev, "Enabling bulk RxRead failed (error = %d)\n", result); /*--4: setup the initial flowcontrol */ dbg("%s:setting init flowcontrol (%s)", __func__, buf_flow_init); Loading @@ -269,7 +268,8 @@ static int ipw_open(struct tty_struct *tty, 0x10, 200000); if (result < 0) dev_err(&port->dev, "initial flowcontrol failed (error = %d)\n", result); dev_err(&port->dev, "initial flowcontrol failed (error = %d)\n", result); /*--5: raise the dtr */ Loading @@ -283,7 +283,8 @@ static int ipw_open(struct tty_struct *tty, 0, 200000); if (result < 0) dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); /*--6: raise the rts */ dbg("%s:raising rts", __func__); Loading @@ -296,7 +297,8 @@ static int ipw_open(struct tty_struct *tty, 0, 200000); if (result < 0) dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); kfree(buf_flow_init); return 0; Loading Loading @@ -324,25 +326,29 @@ static void ipw_close(struct tty_struct *tty, 0, 200000); if (result < 0) dev_err(&port->dev, "dropping dtr failed (error = %d)\n", result); dev_err(&port->dev, "dropping dtr failed (error = %d)\n", result); /*--2: drop the rts */ dbg("%s:dropping rts", __func__); result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_SET_PIN, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, IPW_SIO_SET_PIN, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, IPW_PIN_CLRRTS, 0, NULL, 0, 200000); if (result < 0) dev_err(&port->dev, "dropping rts failed (error = %d)\n", result); dev_err(&port->dev, "dropping rts failed (error = %d)\n", result); /*--3: purge */ dbg("%s:sending purge", __func__); result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_PURGE, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, IPW_SIO_PURGE, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 0x03, 0, NULL, Loading @@ -352,7 +358,8 @@ static void ipw_close(struct tty_struct *tty, dev_err(&port->dev, "purge failed (error = %d)\n", result); /* send RXBULK_off (tell modem to stop transmitting bulk data on rx chan) */ /* send RXBULK_off (tell modem to stop transmitting bulk data on rx chan) */ result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), IPW_SIO_RXCTL, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, Loading @@ -363,7 +370,8 @@ static void ipw_close(struct tty_struct *tty, 100000); if (result < 0) dev_err(&port->dev, "Disabling bulk RxRead failed (error = %d)\n", result); dev_err(&port->dev, "Disabling bulk RxRead failed (error = %d)\n", result); /* shutdown any in-flight urbs that we know about */ usb_kill_urb(port->read_urb); Loading Loading @@ -424,7 +432,8 @@ static int ipw_write(struct tty_struct *tty, struct usb_serial_port *port, ret = usb_submit_urb(port->write_urb, GFP_ATOMIC); if (ret != 0) { port->write_urb_busy = 0; dbg("%s - usb_submit_urb(write bulk) failed with error = %d", __func__, ret); dbg("%s - usb_submit_urb(write bulk) failed with error = %d", __func__, ret); return ret; } Loading