.. | .. |
---|
132 | 132 | } |
---|
133 | 133 | EXPORT_SYMBOL(usb_wwan_tiocmset); |
---|
134 | 134 | |
---|
135 | | -static int get_serial_info(struct usb_serial_port *port, |
---|
136 | | - struct serial_struct __user *retinfo) |
---|
| 135 | +int usb_wwan_get_serial_info(struct tty_struct *tty, |
---|
| 136 | + struct serial_struct *ss) |
---|
137 | 137 | { |
---|
138 | | - struct serial_struct tmp; |
---|
| 138 | + struct usb_serial_port *port = tty->driver_data; |
---|
139 | 139 | |
---|
140 | | - memset(&tmp, 0, sizeof(tmp)); |
---|
141 | | - tmp.line = port->minor; |
---|
142 | | - tmp.port = port->port_number; |
---|
143 | | - tmp.baud_base = tty_get_baud_rate(port->port.tty); |
---|
144 | | - tmp.close_delay = port->port.close_delay / 10; |
---|
145 | | - tmp.closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
---|
| 140 | + ss->line = port->minor; |
---|
| 141 | + ss->port = port->port_number; |
---|
| 142 | + ss->baud_base = tty_get_baud_rate(port->port.tty); |
---|
| 143 | + ss->close_delay = jiffies_to_msecs(port->port.close_delay) / 10; |
---|
| 144 | + ss->closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
---|
146 | 145 | ASYNC_CLOSING_WAIT_NONE : |
---|
147 | | - port->port.closing_wait / 10; |
---|
148 | | - |
---|
149 | | - if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) |
---|
150 | | - return -EFAULT; |
---|
| 146 | + jiffies_to_msecs(port->port.closing_wait) / 10; |
---|
151 | 147 | return 0; |
---|
152 | 148 | } |
---|
| 149 | +EXPORT_SYMBOL(usb_wwan_get_serial_info); |
---|
153 | 150 | |
---|
154 | | -static int set_serial_info(struct usb_serial_port *port, |
---|
155 | | - struct serial_struct __user *newinfo) |
---|
| 151 | +int usb_wwan_set_serial_info(struct tty_struct *tty, |
---|
| 152 | + struct serial_struct *ss) |
---|
156 | 153 | { |
---|
157 | | - struct serial_struct new_serial; |
---|
| 154 | + struct usb_serial_port *port = tty->driver_data; |
---|
158 | 155 | unsigned int closing_wait, close_delay; |
---|
159 | 156 | int retval = 0; |
---|
160 | 157 | |
---|
161 | | - if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) |
---|
162 | | - return -EFAULT; |
---|
163 | | - |
---|
164 | | - close_delay = new_serial.close_delay * 10; |
---|
165 | | - closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
---|
166 | | - ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; |
---|
| 158 | + close_delay = msecs_to_jiffies(ss->close_delay * 10); |
---|
| 159 | + closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
---|
| 160 | + ASYNC_CLOSING_WAIT_NONE : |
---|
| 161 | + msecs_to_jiffies(ss->closing_wait * 10); |
---|
167 | 162 | |
---|
168 | 163 | mutex_lock(&port->port.mutex); |
---|
169 | 164 | |
---|
.. | .. |
---|
181 | 176 | mutex_unlock(&port->port.mutex); |
---|
182 | 177 | return retval; |
---|
183 | 178 | } |
---|
184 | | - |
---|
185 | | -int usb_wwan_ioctl(struct tty_struct *tty, |
---|
186 | | - unsigned int cmd, unsigned long arg) |
---|
187 | | -{ |
---|
188 | | - struct usb_serial_port *port = tty->driver_data; |
---|
189 | | - |
---|
190 | | - dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd); |
---|
191 | | - |
---|
192 | | - switch (cmd) { |
---|
193 | | - case TIOCGSERIAL: |
---|
194 | | - return get_serial_info(port, |
---|
195 | | - (struct serial_struct __user *) arg); |
---|
196 | | - case TIOCSSERIAL: |
---|
197 | | - return set_serial_info(port, |
---|
198 | | - (struct serial_struct __user *) arg); |
---|
199 | | - default: |
---|
200 | | - break; |
---|
201 | | - } |
---|
202 | | - |
---|
203 | | - dev_dbg(&port->dev, "%s arg not supported\n", __func__); |
---|
204 | | - |
---|
205 | | - return -ENOIOCTLCMD; |
---|
206 | | -} |
---|
207 | | -EXPORT_SYMBOL(usb_wwan_ioctl); |
---|
| 179 | +EXPORT_SYMBOL(usb_wwan_set_serial_info); |
---|
208 | 180 | |
---|
209 | 181 | int usb_wwan_write(struct tty_struct *tty, struct usb_serial_port *port, |
---|
210 | 182 | const unsigned char *buf, int count) |
---|
.. | .. |
---|
463 | 435 | |
---|
464 | 436 | /* |
---|
465 | 437 | * Need to take susp_lock to make sure port is not already being |
---|
466 | | - * resumed, but no need to hold it due to initialized |
---|
| 438 | + * resumed, but no need to hold it due to the tty-port initialized |
---|
| 439 | + * flag. |
---|
467 | 440 | */ |
---|
468 | 441 | spin_lock_irq(&intfdata->susp_lock); |
---|
469 | 442 | if (--intfdata->open_ports == 0) |
---|
.. | .. |
---|
496 | 469 | struct usb_serial *serial = port->serial; |
---|
497 | 470 | struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial); |
---|
498 | 471 | struct urb *urb; |
---|
499 | | - struct usb_device_descriptor *desc = &serial->dev->descriptor; |
---|
500 | 472 | |
---|
501 | 473 | urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ |
---|
502 | 474 | if (!urb) |
---|
.. | .. |
---|
509 | 481 | if (intfdata->use_zlp && dir == USB_DIR_OUT) |
---|
510 | 482 | urb->transfer_flags |= URB_ZERO_PACKET; |
---|
511 | 483 | |
---|
512 | | - if (dir == USB_DIR_OUT) { |
---|
513 | | - if ((desc->idVendor == cpu_to_le16(0x1286) && |
---|
514 | | - desc->idProduct == cpu_to_le16(0x4e3c))) |
---|
515 | | - urb->transfer_flags |= URB_ZERO_PACKET; |
---|
516 | | - } |
---|
517 | 484 | return urb; |
---|
518 | 485 | } |
---|
519 | 486 | |
---|