From: Greg KH <greg@kroah.com>
To: linux-usb-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] More USB fixes for 2.5.68
Date: Thu, 24 Apr 2003 16:47:33 -0700 [thread overview]
Message-ID: <10512280533869@kroah.com> (raw)
In-Reply-To: <10512280532458@kroah.com>
ChangeSet 1.1165.2.15, 2003/04/23 17:48:10-07:00, greg@kroah.com
[PATCH] USB: kobil_sct: add support for new tty tiocmget and tiocmset functions.
drivers/usb/serial/kobil_sct.c | 200 +++++++++++++++++++++++------------------
1 files changed, 116 insertions(+), 84 deletions(-)
diff -Nru a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
--- a/drivers/usb/serial/kobil_sct.c Thu Apr 24 16:21:37 2003
+++ b/drivers/usb/serial/kobil_sct.c Thu Apr 24 16:21:37 2003
@@ -81,6 +81,9 @@
static int kobil_write_room(struct usb_serial_port *port);
static int kobil_ioctl(struct usb_serial_port *port, struct file *file,
unsigned int cmd, unsigned long arg);
+static int kobil_tiocmget(struct usb_serial_port *port, struct file *file);
+static int kobil_tiocmset(struct usb_serial_port *port, struct file *file,
+ unsigned int set, unsigned int clear);
static void kobil_read_int_callback( struct urb *urb, struct pt_regs *regs );
static void kobil_write_callback( struct urb *purb, struct pt_regs *regs );
@@ -106,6 +109,8 @@
.attach = kobil_startup,
.shutdown = kobil_shutdown,
.ioctl = kobil_ioctl,
+ .tiocmget = kobil_tiocmget,
+ .tiocmset = kobil_tiocmset,
.open = kobil_open,
.close = kobil_close,
.write = kobil_write,
@@ -490,11 +495,120 @@
}
+static int kobil_tiocmget(struct usb_serial_port *port, struct file *file)
+{
+ struct kobil_private * priv;
+ int result;
+ unsigned char *transfer_buffer;
+ int transfer_buffer_length = 8;
+
+ priv = usb_get_serial_port_data(port);
+ if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) {
+ // This device doesn't support ioctl calls
+ return -EINVAL;
+ }
+
+ // allocate memory for transfer buffer
+ transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
+ if (!transfer_buffer) {
+ return -ENOMEM;
+ }
+ memset(transfer_buffer, 0, transfer_buffer_length);
+
+ result = usb_control_msg( port->serial->dev,
+ usb_rcvctrlpipe(port->serial->dev, 0 ),
+ SUSBCRequest_GetStatusLineState,
+ USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
+ 0,
+ 0,
+ transfer_buffer,
+ transfer_buffer_length,
+ KOBIL_TIMEOUT);
+
+ dbg("%s - port %d Send get_status_line_state URB returns: %i. Statusline: %02x",
+ __FUNCTION__, port->number, result, transfer_buffer[0]);
+
+ if ((transfer_buffer[0] & SUSBCR_GSL_DSR) != 0) {
+ priv->line_state |= TIOCM_DSR;
+ } else {
+ priv->line_state &= ~TIOCM_DSR;
+ }
+
+ kfree(transfer_buffer);
+ return priv->line_state;
+}
+
+static int kobil_tiocmset(struct usb_serial_port *port, struct file *file,
+ unsigned int set, unsigned int clear)
+{
+ struct kobil_private * priv;
+ int result;
+ int dtr = 0;
+ int rts = 0;
+ unsigned char *transfer_buffer;
+ int transfer_buffer_length = 8;
+
+ priv = usb_get_serial_port_data(port);
+ if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) {
+ // This device doesn't support ioctl calls
+ return -EINVAL;
+ }
+
+ // allocate memory for transfer buffer
+ transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
+ if (! transfer_buffer) {
+ return -ENOMEM;
+ }
+ memset(transfer_buffer, 0, transfer_buffer_length);
+
+ if (set & TIOCM_RTS)
+ rts = 1;
+ if (set & TIOCM_DTR)
+ dtr = 1;
+ if (clear & TIOCM_RTS)
+ rts = 0;
+ if (clear & TIOCM_DTR)
+ dtr = 0;
+
+ if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) {
+ if (dtr != 0)
+ dbg("%s - port %d Setting DTR", __FUNCTION__, port->number);
+ else
+ dbg("%s - port %d Clearing DTR", __FUNCTION__, port->number);
+ result = usb_control_msg( port->serial->dev,
+ usb_rcvctrlpipe(port->serial->dev, 0 ),
+ SUSBCRequest_SetStatusLinesOrQueues,
+ USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
+ ((dtr != 0) ? SUSBCR_SSL_SETDTR : SUSBCR_SSL_CLRDTR),
+ 0,
+ transfer_buffer,
+ 0,
+ KOBIL_TIMEOUT);
+ } else {
+ if (rts != 0)
+ dbg("%s - port %d Setting RTS", __FUNCTION__, port->number);
+ else
+ dbg("%s - port %d Clearing RTS", __FUNCTION__, port->number);
+ result = usb_control_msg( port->serial->dev,
+ usb_rcvctrlpipe(port->serial->dev, 0 ),
+ SUSBCRequest_SetStatusLinesOrQueues,
+ USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
+ ((rts != 0) ? SUSBCR_SSL_SETRTS : SUSBCR_SSL_CLRRTS),
+ 0,
+ transfer_buffer,
+ 0,
+ KOBIL_TIMEOUT);
+ }
+ dbg("%s - port %d Send set_status_line URB returns: %i", __FUNCTION__, port->number, result);
+ kfree(transfer_buffer);
+ return (result < 0) ? result : 0;
+}
+
+
static int kobil_ioctl(struct usb_serial_port *port, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct kobil_private * priv;
- int mask;
int result;
unsigned short urb_val = 0;
unsigned char *transfer_buffer;
@@ -605,90 +719,8 @@
kfree(transfer_buffer);
return ((result < 0) ? -EFAULT : 0);
- case TIOCMGET: // 0x5415
- // allocate memory for transfer buffer
- transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
- if (! transfer_buffer) {
- return -ENOBUFS;
- } else {
- memset(transfer_buffer, 0, transfer_buffer_length);
- }
-
- result = usb_control_msg( port->serial->dev,
- usb_rcvctrlpipe(port->serial->dev, 0 ),
- SUSBCRequest_GetStatusLineState,
- USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
- 0,
- 0,
- transfer_buffer,
- transfer_buffer_length,
- KOBIL_TIMEOUT
- );
-
- dbg("%s - port %d Send get_status_line_state (TIOCMGET) URB returns: %i. Statusline: %02x",
- __FUNCTION__, port->number, result, transfer_buffer[0]);
-
- if ((transfer_buffer[0] & SUSBCR_GSL_DSR) != 0) {
- priv->line_state |= TIOCM_DSR;
- } else {
- priv->line_state &= ~TIOCM_DSR;
- }
-
- kfree(transfer_buffer);
- return put_user(priv->line_state, (unsigned long *) arg);
-
- case TIOCMSET: // 0x5418
- if (get_user(mask, (unsigned long *) arg)){
- return -EFAULT;
- }
- // allocate memory for transfer buffer
- transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
- if (! transfer_buffer) {
- return -ENOBUFS;
- } else {
- memset(transfer_buffer, 0, transfer_buffer_length);
- }
-
- if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) {
- if ((mask & TIOCM_DTR) != 0){
- dbg("%s - port %d Setting DTR", __FUNCTION__, port->number);
- } else {
- dbg("%s - port %d Clearing DTR", __FUNCTION__, port->number);
- }
- result = usb_control_msg( port->serial->dev,
- usb_rcvctrlpipe(port->serial->dev, 0 ),
- SUSBCRequest_SetStatusLinesOrQueues,
- USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
- ( ((mask & TIOCM_DTR) != 0) ? SUSBCR_SSL_SETDTR : SUSBCR_SSL_CLRDTR),
- 0,
- transfer_buffer,
- 0,
- KOBIL_TIMEOUT
- );
-
- } else {
- if ((mask & TIOCM_RTS) != 0){
- dbg("%s - port %d Setting RTS", __FUNCTION__, port->number);
- } else {
- dbg("%s - port %d Clearing RTS", __FUNCTION__, port->number);
- }
- result = usb_control_msg( port->serial->dev,
- usb_rcvctrlpipe(port->serial->dev, 0 ),
- SUSBCRequest_SetStatusLinesOrQueues,
- USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
- (((mask & TIOCM_RTS) != 0) ? SUSBCR_SSL_SETRTS : SUSBCR_SSL_CLRRTS),
- 0,
- transfer_buffer,
- 0,
- KOBIL_TIMEOUT
- );
- }
- dbg("%s - port %d Send set_status_line (TIOCMSET) URB returns: %i", __FUNCTION__, port->number, result);
-
- kfree(transfer_buffer);
- return ((result < 0) ? -EFAULT : 0);
}
- return 0;
+ return -ENOIOCTLCMD;
}
next prev parent reply other threads:[~2003-04-25 0:22 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-04-24 23:46 [BK PATCH] USB changes for 2.5.68 Greg KH
2003-04-24 23:47 ` [PATCH] More USB fixes " Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH [this message]
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-24 23:47 ` Greg KH
2003-04-25 4:14 ` [BK PATCH] USB changes " Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=10512280533869@kroah.com \
--to=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.