• Home
  • Raw
  • Download

Lines Matching +full:serial +full:- +full:dir

1 // SPDX-License-Identifier: GPL-2.0
13 This driver exists because the "normal" serial driver doesn't work too well
15 - data loss -- one single Receive URB is not nearly enough
16 - controlling the baud rate doesn't make sense
32 #include <linux/usb/serial.h>
33 #include <linux/serial.h>
34 #include "usb-wwan.h"
42 struct usb_serial *serial = port->serial; in usb_wwan_send_setup() local
50 if (portdata->dtr_state) in usb_wwan_send_setup()
52 if (portdata->rts_state) in usb_wwan_send_setup()
55 ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber; in usb_wwan_send_setup()
57 res = usb_autopm_get_interface(serial->interface); in usb_wwan_send_setup()
61 res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), in usb_wwan_send_setup()
65 usb_autopm_put_interface(port->serial->interface); in usb_wwan_send_setup()
75 intfdata = usb_get_serial_data(port->serial); in usb_wwan_dtr_rts()
77 if (!intfdata->use_send_setup) in usb_wwan_dtr_rts()
82 portdata->rts_state = on; in usb_wwan_dtr_rts()
83 portdata->dtr_state = on; in usb_wwan_dtr_rts()
91 struct usb_serial_port *port = tty->driver_data; in usb_wwan_tiocmget()
97 value = ((portdata->rts_state) ? TIOCM_RTS : 0) | in usb_wwan_tiocmget()
98 ((portdata->dtr_state) ? TIOCM_DTR : 0) | in usb_wwan_tiocmget()
99 ((portdata->cts_state) ? TIOCM_CTS : 0) | in usb_wwan_tiocmget()
100 ((portdata->dsr_state) ? TIOCM_DSR : 0) | in usb_wwan_tiocmget()
101 ((portdata->dcd_state) ? TIOCM_CAR : 0) | in usb_wwan_tiocmget()
102 ((portdata->ri_state) ? TIOCM_RNG : 0); in usb_wwan_tiocmget()
111 struct usb_serial_port *port = tty->driver_data; in usb_wwan_tiocmset()
116 intfdata = usb_get_serial_data(port->serial); in usb_wwan_tiocmset()
118 if (!intfdata->use_send_setup) in usb_wwan_tiocmset()
119 return -EINVAL; in usb_wwan_tiocmset()
123 portdata->rts_state = 1; in usb_wwan_tiocmset()
125 portdata->dtr_state = 1; in usb_wwan_tiocmset()
128 portdata->rts_state = 0; in usb_wwan_tiocmset()
130 portdata->dtr_state = 0; in usb_wwan_tiocmset()
138 struct usb_serial_port *port = tty->driver_data; in usb_wwan_get_serial_info()
140 ss->line = port->minor; in usb_wwan_get_serial_info()
141 ss->port = port->port_number; in usb_wwan_get_serial_info()
142 ss->baud_base = tty_get_baud_rate(port->port.tty); in usb_wwan_get_serial_info()
143 ss->close_delay = jiffies_to_msecs(port->port.close_delay) / 10; in usb_wwan_get_serial_info()
144 ss->closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? in usb_wwan_get_serial_info()
146 jiffies_to_msecs(port->port.closing_wait) / 10; in usb_wwan_get_serial_info()
154 struct usb_serial_port *port = tty->driver_data; in usb_wwan_set_serial_info()
158 close_delay = msecs_to_jiffies(ss->close_delay * 10); in usb_wwan_set_serial_info()
159 closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ? in usb_wwan_set_serial_info()
161 msecs_to_jiffies(ss->closing_wait * 10); in usb_wwan_set_serial_info()
163 mutex_lock(&port->port.mutex); in usb_wwan_set_serial_info()
166 if ((close_delay != port->port.close_delay) || in usb_wwan_set_serial_info()
167 (closing_wait != port->port.closing_wait)) in usb_wwan_set_serial_info()
168 retval = -EPERM; in usb_wwan_set_serial_info()
170 retval = -EOPNOTSUPP; in usb_wwan_set_serial_info()
172 port->port.close_delay = close_delay; in usb_wwan_set_serial_info()
173 port->port.closing_wait = closing_wait; in usb_wwan_set_serial_info()
176 mutex_unlock(&port->port.mutex); in usb_wwan_set_serial_info()
193 intfdata = usb_get_serial_data(port->serial); in usb_wwan_write()
195 dev_dbg(&port->dev, "%s: write (%d chars)\n", __func__, count); in usb_wwan_write()
204 this_urb = portdata->out_urbs[i]; in usb_wwan_write()
205 if (test_and_set_bit(i, &portdata->out_busy)) { in usb_wwan_write()
207 portdata->tx_start_time[i] + 10 * HZ)) in usb_wwan_write()
212 dev_dbg(&port->dev, "%s: endpoint %d buf %d\n", __func__, in usb_wwan_write()
213 usb_pipeendpoint(this_urb->pipe), i); in usb_wwan_write()
215 err = usb_autopm_get_interface_async(port->serial->interface); in usb_wwan_write()
217 clear_bit(i, &portdata->out_busy); in usb_wwan_write()
222 memcpy(this_urb->transfer_buffer, buf, todo); in usb_wwan_write()
223 this_urb->transfer_buffer_length = todo; in usb_wwan_write()
225 spin_lock_irqsave(&intfdata->susp_lock, flags); in usb_wwan_write()
226 if (intfdata->suspended) { in usb_wwan_write()
227 usb_anchor_urb(this_urb, &portdata->delayed); in usb_wwan_write()
228 spin_unlock_irqrestore(&intfdata->susp_lock, flags); in usb_wwan_write()
230 intfdata->in_flight++; in usb_wwan_write()
231 spin_unlock_irqrestore(&intfdata->susp_lock, flags); in usb_wwan_write()
234 dev_err(&port->dev, in usb_wwan_write()
237 clear_bit(i, &portdata->out_busy); in usb_wwan_write()
238 spin_lock_irqsave(&intfdata->susp_lock, flags); in usb_wwan_write()
239 intfdata->in_flight--; in usb_wwan_write()
240 spin_unlock_irqrestore(&intfdata->susp_lock, in usb_wwan_write()
242 usb_autopm_put_interface_async(port->serial->interface); in usb_wwan_write()
247 portdata->tx_start_time[i] = jiffies; in usb_wwan_write()
249 left -= todo; in usb_wwan_write()
252 count -= left; in usb_wwan_write()
253 dev_dbg(&port->dev, "%s: wrote (did %d)\n", __func__, count); in usb_wwan_write()
264 unsigned char *data = urb->transfer_buffer; in usb_wwan_indat_callback()
265 int status = urb->status; in usb_wwan_indat_callback()
267 endpoint = usb_pipeendpoint(urb->pipe); in usb_wwan_indat_callback()
268 port = urb->context; in usb_wwan_indat_callback()
269 dev = &port->dev; in usb_wwan_indat_callback()
276 if (status == -ESHUTDOWN || status == -ENOENT) in usb_wwan_indat_callback()
279 if (urb->actual_length) { in usb_wwan_indat_callback()
280 tty_insert_flip_string(&port->port, data, in usb_wwan_indat_callback()
281 urb->actual_length); in usb_wwan_indat_callback()
282 tty_flip_buffer_push(&port->port); in usb_wwan_indat_callback()
289 if (err != -EPERM && err != -ENODEV) { in usb_wwan_indat_callback()
293 usb_mark_last_busy(port->serial->dev); in usb_wwan_indat_callback()
296 usb_mark_last_busy(port->serial->dev); in usb_wwan_indat_callback()
308 port = urb->context; in usb_wwan_outdat_callback()
309 intfdata = usb_get_serial_data(port->serial); in usb_wwan_outdat_callback()
312 usb_autopm_put_interface_async(port->serial->interface); in usb_wwan_outdat_callback()
314 spin_lock_irqsave(&intfdata->susp_lock, flags); in usb_wwan_outdat_callback()
315 intfdata->in_flight--; in usb_wwan_outdat_callback()
316 spin_unlock_irqrestore(&intfdata->susp_lock, flags); in usb_wwan_outdat_callback()
319 if (portdata->out_urbs[i] == urb) { in usb_wwan_outdat_callback()
321 clear_bit(i, &portdata->out_busy); in usb_wwan_outdat_callback()
329 struct usb_serial_port *port = tty->driver_data; in usb_wwan_write_room()
338 this_urb = portdata->out_urbs[i]; in usb_wwan_write_room()
339 if (this_urb && !test_bit(i, &portdata->out_busy)) in usb_wwan_write_room()
343 dev_dbg(&port->dev, "%s: %d\n", __func__, data_len); in usb_wwan_write_room()
350 struct usb_serial_port *port = tty->driver_data; in usb_wwan_chars_in_buffer()
359 this_urb = portdata->out_urbs[i]; in usb_wwan_chars_in_buffer()
362 if (this_urb && test_bit(i, &portdata->out_busy)) in usb_wwan_chars_in_buffer()
363 data_len += this_urb->transfer_buffer_length; in usb_wwan_chars_in_buffer()
365 dev_dbg(&port->dev, "%s: %d\n", __func__, data_len); in usb_wwan_chars_in_buffer()
374 struct usb_serial *serial = port->serial; in usb_wwan_open() local
379 intfdata = usb_get_serial_data(serial); in usb_wwan_open()
381 if (port->interrupt_in_urb) { in usb_wwan_open()
382 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); in usb_wwan_open()
384 dev_err(&port->dev, "%s: submit int urb failed: %d\n", in usb_wwan_open()
391 urb = portdata->in_urbs[i]; in usb_wwan_open()
396 dev_err(&port->dev, in usb_wwan_open()
402 spin_lock_irq(&intfdata->susp_lock); in usb_wwan_open()
403 if (++intfdata->open_ports == 1) in usb_wwan_open()
404 serial->interface->needs_remote_wakeup = 1; in usb_wwan_open()
405 spin_unlock_irq(&intfdata->susp_lock); in usb_wwan_open()
406 /* this balances a get in the generic USB serial code */ in usb_wwan_open()
407 usb_autopm_put_interface(serial->interface); in usb_wwan_open()
419 if (urb == portdata->out_urbs[i]) { in unbusy_queued_urb()
420 clear_bit(i, &portdata->out_busy); in unbusy_queued_urb()
429 struct usb_serial *serial = port->serial; in usb_wwan_close() local
431 struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial); in usb_wwan_close()
438 * resumed, but no need to hold it due to the tty-port initialized in usb_wwan_close()
441 spin_lock_irq(&intfdata->susp_lock); in usb_wwan_close()
442 if (--intfdata->open_ports == 0) in usb_wwan_close()
443 serial->interface->needs_remote_wakeup = 0; in usb_wwan_close()
444 spin_unlock_irq(&intfdata->susp_lock); in usb_wwan_close()
447 urb = usb_get_from_anchor(&portdata->delayed); in usb_wwan_close()
451 usb_autopm_put_interface_async(serial->interface); in usb_wwan_close()
455 usb_kill_urb(portdata->in_urbs[i]); in usb_wwan_close()
457 usb_kill_urb(portdata->out_urbs[i]); in usb_wwan_close()
458 usb_kill_urb(port->interrupt_in_urb); in usb_wwan_close()
460 usb_autopm_get_interface_no_resume(serial->interface); in usb_wwan_close()
466 int dir, void *ctx, char *buf, int len, in usb_wwan_setup_urb() argument
469 struct usb_serial *serial = port->serial; in usb_wwan_setup_urb() local
470 struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial); in usb_wwan_setup_urb()
477 usb_fill_bulk_urb(urb, serial->dev, in usb_wwan_setup_urb()
478 usb_sndbulkpipe(serial->dev, endpoint) | dir, in usb_wwan_setup_urb()
481 if (intfdata->use_zlp && dir == USB_DIR_OUT) in usb_wwan_setup_urb()
482 urb->transfer_flags |= URB_ZERO_PACKET; in usb_wwan_setup_urb()
494 if (!port->bulk_in_size || !port->bulk_out_size) in usb_wwan_port_probe()
495 return -ENODEV; in usb_wwan_port_probe()
499 return -ENOMEM; in usb_wwan_port_probe()
501 init_usb_anchor(&portdata->delayed); in usb_wwan_port_probe()
507 portdata->in_buffer[i] = buffer; in usb_wwan_port_probe()
509 urb = usb_wwan_setup_urb(port, port->bulk_in_endpointAddress, in usb_wwan_port_probe()
513 portdata->in_urbs[i] = urb; in usb_wwan_port_probe()
520 portdata->out_buffer[i] = buffer; in usb_wwan_port_probe()
522 urb = usb_wwan_setup_urb(port, port->bulk_out_endpointAddress, in usb_wwan_port_probe()
526 portdata->out_urbs[i] = urb; in usb_wwan_port_probe()
535 usb_free_urb(portdata->out_urbs[i]); in usb_wwan_port_probe()
536 kfree(portdata->out_buffer[i]); in usb_wwan_port_probe()
540 usb_free_urb(portdata->in_urbs[i]); in usb_wwan_port_probe()
541 free_page((unsigned long)portdata->in_buffer[i]); in usb_wwan_port_probe()
545 return -ENOMEM; in usb_wwan_port_probe()
558 usb_free_urb(portdata->in_urbs[i]); in usb_wwan_port_remove()
559 free_page((unsigned long)portdata->in_buffer[i]); in usb_wwan_port_remove()
562 usb_free_urb(portdata->out_urbs[i]); in usb_wwan_port_remove()
563 kfree(portdata->out_buffer[i]); in usb_wwan_port_remove()
573 static void stop_urbs(struct usb_serial *serial) in stop_urbs() argument
579 for (i = 0; i < serial->num_ports; ++i) { in stop_urbs()
580 port = serial->port[i]; in stop_urbs()
585 usb_kill_urb(portdata->in_urbs[j]); in stop_urbs()
587 usb_kill_urb(portdata->out_urbs[j]); in stop_urbs()
588 usb_kill_urb(port->interrupt_in_urb); in stop_urbs()
592 int usb_wwan_suspend(struct usb_serial *serial, pm_message_t message) in usb_wwan_suspend() argument
594 struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial); in usb_wwan_suspend()
596 spin_lock_irq(&intfdata->susp_lock); in usb_wwan_suspend()
598 if (intfdata->in_flight) { in usb_wwan_suspend()
599 spin_unlock_irq(&intfdata->susp_lock); in usb_wwan_suspend()
600 return -EBUSY; in usb_wwan_suspend()
603 intfdata->suspended = 1; in usb_wwan_suspend()
604 spin_unlock_irq(&intfdata->susp_lock); in usb_wwan_suspend()
606 stop_urbs(serial); in usb_wwan_suspend()
615 struct usb_serial *serial = port->serial; in usb_wwan_submit_delayed_urbs() local
616 struct usb_wwan_intf_private *data = usb_get_serial_data(serial); in usb_wwan_submit_delayed_urbs()
625 urb = usb_get_from_anchor(&portdata->delayed); in usb_wwan_submit_delayed_urbs()
631 dev_err(&port->dev, "%s: submit urb failed: %d\n", in usb_wwan_submit_delayed_urbs()
635 usb_autopm_put_interface_async(serial->interface); in usb_wwan_submit_delayed_urbs()
638 data->in_flight++; in usb_wwan_submit_delayed_urbs()
642 return -EIO; in usb_wwan_submit_delayed_urbs()
647 int usb_wwan_resume(struct usb_serial *serial) in usb_wwan_resume() argument
651 struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial); in usb_wwan_resume()
657 spin_lock_irq(&intfdata->susp_lock); in usb_wwan_resume()
658 for (i = 0; i < serial->num_ports; i++) { in usb_wwan_resume()
659 port = serial->port[i]; in usb_wwan_resume()
661 if (!tty_port_initialized(&port->port)) in usb_wwan_resume()
666 if (port->interrupt_in_urb) { in usb_wwan_resume()
667 err = usb_submit_urb(port->interrupt_in_urb, in usb_wwan_resume()
670 dev_err(&port->dev, in usb_wwan_resume()
682 urb = portdata->in_urbs[j]; in usb_wwan_resume()
685 dev_err(&port->dev, in usb_wwan_resume()
692 intfdata->suspended = 0; in usb_wwan_resume()
693 spin_unlock_irq(&intfdata->susp_lock); in usb_wwan_resume()
696 return -EIO; in usb_wwan_resume()