• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   USB Driver layer for GSM modems
3 
4   Copyright (C) 2005  Matthias Urlichs <smurf@smurf.noris.de>
5 
6   This driver is free software; you can redistribute it and/or modify
7   it under the terms of Version 2 of the GNU General Public License as
8   published by the Free Software Foundation.
9 
10   Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
11 
12   History: see the git log.
13 
14   Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
15 
16   This driver exists because the "normal" serial driver doesn't work too well
17   with GSM modems. Issues:
18   - data loss -- one single Receive URB is not nearly enough
19   - controlling the baud rate doesn't make sense
20 */
21 
22 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
23 #define DRIVER_DESC "USB Driver for GSM modems"
24 
25 #include <linux/kernel.h>
26 #include <linux/jiffies.h>
27 #include <linux/errno.h>
28 #include <linux/slab.h>
29 #include <linux/tty.h>
30 #include <linux/tty_flip.h>
31 #include <linux/module.h>
32 #include <linux/bitops.h>
33 #include <linux/uaccess.h>
34 #include <linux/usb.h>
35 #include <linux/usb/serial.h>
36 #include <linux/serial.h>
37 #include "usb-wwan.h"
38 
39 /*
40  * Generate DTR/RTS signals on the port using the SET_CONTROL_LINE_STATE request
41  * in CDC ACM.
42  */
usb_wwan_send_setup(struct usb_serial_port * port)43 static int usb_wwan_send_setup(struct usb_serial_port *port)
44 {
45 	struct usb_serial *serial = port->serial;
46 	struct usb_wwan_port_private *portdata;
47 	int val = 0;
48 	int ifnum;
49 	int res;
50 
51 	portdata = usb_get_serial_port_data(port);
52 
53 	if (portdata->dtr_state)
54 		val |= 0x01;
55 	if (portdata->rts_state)
56 		val |= 0x02;
57 
58 	ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
59 
60 	res = usb_autopm_get_interface(serial->interface);
61 	if (res)
62 		return res;
63 
64 	res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
65 				0x22, 0x21, val, ifnum, NULL, 0,
66 				USB_CTRL_SET_TIMEOUT);
67 
68 	usb_autopm_put_interface(port->serial->interface);
69 
70 	return res;
71 }
72 
usb_wwan_dtr_rts(struct usb_serial_port * port,int on)73 void usb_wwan_dtr_rts(struct usb_serial_port *port, int on)
74 {
75 	struct usb_wwan_port_private *portdata;
76 	struct usb_wwan_intf_private *intfdata;
77 
78 	intfdata = usb_get_serial_data(port->serial);
79 
80 	if (!intfdata->use_send_setup)
81 		return;
82 
83 	portdata = usb_get_serial_port_data(port);
84 	/* FIXME: locking */
85 	portdata->rts_state = on;
86 	portdata->dtr_state = on;
87 
88 	usb_wwan_send_setup(port);
89 }
90 EXPORT_SYMBOL(usb_wwan_dtr_rts);
91 
usb_wwan_tiocmget(struct tty_struct * tty)92 int usb_wwan_tiocmget(struct tty_struct *tty)
93 {
94 	struct usb_serial_port *port = tty->driver_data;
95 	unsigned int value;
96 	struct usb_wwan_port_private *portdata;
97 
98 	portdata = usb_get_serial_port_data(port);
99 
100 	value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
101 	    ((portdata->dtr_state) ? TIOCM_DTR : 0) |
102 	    ((portdata->cts_state) ? TIOCM_CTS : 0) |
103 	    ((portdata->dsr_state) ? TIOCM_DSR : 0) |
104 	    ((portdata->dcd_state) ? TIOCM_CAR : 0) |
105 	    ((portdata->ri_state) ? TIOCM_RNG : 0);
106 
107 	return value;
108 }
109 EXPORT_SYMBOL(usb_wwan_tiocmget);
110 
usb_wwan_tiocmset(struct tty_struct * tty,unsigned int set,unsigned int clear)111 int usb_wwan_tiocmset(struct tty_struct *tty,
112 		      unsigned int set, unsigned int clear)
113 {
114 	struct usb_serial_port *port = tty->driver_data;
115 	struct usb_wwan_port_private *portdata;
116 	struct usb_wwan_intf_private *intfdata;
117 
118 	portdata = usb_get_serial_port_data(port);
119 	intfdata = usb_get_serial_data(port->serial);
120 
121 	if (!intfdata->use_send_setup)
122 		return -EINVAL;
123 
124 	/* FIXME: what locks portdata fields ? */
125 	if (set & TIOCM_RTS)
126 		portdata->rts_state = 1;
127 	if (set & TIOCM_DTR)
128 		portdata->dtr_state = 1;
129 
130 	if (clear & TIOCM_RTS)
131 		portdata->rts_state = 0;
132 	if (clear & TIOCM_DTR)
133 		portdata->dtr_state = 0;
134 	return usb_wwan_send_setup(port);
135 }
136 EXPORT_SYMBOL(usb_wwan_tiocmset);
137 
get_serial_info(struct usb_serial_port * port,struct serial_struct __user * retinfo)138 static int get_serial_info(struct usb_serial_port *port,
139 			   struct serial_struct __user *retinfo)
140 {
141 	struct serial_struct tmp;
142 
143 	memset(&tmp, 0, sizeof(tmp));
144 	tmp.line            = port->minor;
145 	tmp.port            = port->port_number;
146 	tmp.baud_base       = tty_get_baud_rate(port->port.tty);
147 	tmp.close_delay	    = port->port.close_delay / 10;
148 	tmp.closing_wait    = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
149 				 ASYNC_CLOSING_WAIT_NONE :
150 				 port->port.closing_wait / 10;
151 
152 	if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
153 		return -EFAULT;
154 	return 0;
155 }
156 
set_serial_info(struct usb_serial_port * port,struct serial_struct __user * newinfo)157 static int set_serial_info(struct usb_serial_port *port,
158 			   struct serial_struct __user *newinfo)
159 {
160 	struct serial_struct new_serial;
161 	unsigned int closing_wait, close_delay;
162 	int retval = 0;
163 
164 	if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
165 		return -EFAULT;
166 
167 	close_delay = new_serial.close_delay * 10;
168 	closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
169 			ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
170 
171 	mutex_lock(&port->port.mutex);
172 
173 	if (!capable(CAP_SYS_ADMIN)) {
174 		if ((close_delay != port->port.close_delay) ||
175 		    (closing_wait != port->port.closing_wait))
176 			retval = -EPERM;
177 		else
178 			retval = -EOPNOTSUPP;
179 	} else {
180 		port->port.close_delay  = close_delay;
181 		port->port.closing_wait = closing_wait;
182 	}
183 
184 	mutex_unlock(&port->port.mutex);
185 	return retval;
186 }
187 
usb_wwan_ioctl(struct tty_struct * tty,unsigned int cmd,unsigned long arg)188 int usb_wwan_ioctl(struct tty_struct *tty,
189 		   unsigned int cmd, unsigned long arg)
190 {
191 	struct usb_serial_port *port = tty->driver_data;
192 
193 	dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd);
194 
195 	switch (cmd) {
196 	case TIOCGSERIAL:
197 		return get_serial_info(port,
198 				       (struct serial_struct __user *) arg);
199 	case TIOCSSERIAL:
200 		return set_serial_info(port,
201 				       (struct serial_struct __user *) arg);
202 	default:
203 		break;
204 	}
205 
206 	dev_dbg(&port->dev, "%s arg not supported\n", __func__);
207 
208 	return -ENOIOCTLCMD;
209 }
210 EXPORT_SYMBOL(usb_wwan_ioctl);
211 
usb_wwan_write(struct tty_struct * tty,struct usb_serial_port * port,const unsigned char * buf,int count)212 int usb_wwan_write(struct tty_struct *tty, struct usb_serial_port *port,
213 		   const unsigned char *buf, int count)
214 {
215 	struct usb_wwan_port_private *portdata;
216 	struct usb_wwan_intf_private *intfdata;
217 	int i;
218 	int left, todo;
219 	struct urb *this_urb = NULL;	/* spurious */
220 	int err;
221 	unsigned long flags;
222 
223 	portdata = usb_get_serial_port_data(port);
224 	intfdata = usb_get_serial_data(port->serial);
225 
226 	dev_dbg(&port->dev, "%s: write (%d chars)\n", __func__, count);
227 
228 	i = 0;
229 	left = count;
230 	for (i = 0; left > 0 && i < N_OUT_URB; i++) {
231 		todo = left;
232 		if (todo > OUT_BUFLEN)
233 			todo = OUT_BUFLEN;
234 
235 		this_urb = portdata->out_urbs[i];
236 		if (test_and_set_bit(i, &portdata->out_busy)) {
237 			if (time_before(jiffies,
238 					portdata->tx_start_time[i] + 10 * HZ))
239 				continue;
240 			usb_unlink_urb(this_urb);
241 			continue;
242 		}
243 		dev_dbg(&port->dev, "%s: endpoint %d buf %d\n", __func__,
244 			usb_pipeendpoint(this_urb->pipe), i);
245 
246 		err = usb_autopm_get_interface_async(port->serial->interface);
247 		if (err < 0) {
248 			clear_bit(i, &portdata->out_busy);
249 			break;
250 		}
251 
252 		/* send the data */
253 		memcpy(this_urb->transfer_buffer, buf, todo);
254 		this_urb->transfer_buffer_length = todo;
255 
256 		spin_lock_irqsave(&intfdata->susp_lock, flags);
257 		if (intfdata->suspended) {
258 			usb_anchor_urb(this_urb, &portdata->delayed);
259 			spin_unlock_irqrestore(&intfdata->susp_lock, flags);
260 		} else {
261 			intfdata->in_flight++;
262 			spin_unlock_irqrestore(&intfdata->susp_lock, flags);
263 			err = usb_submit_urb(this_urb, GFP_ATOMIC);
264 			if (err) {
265 				dev_err(&port->dev,
266 					"%s: submit urb %d failed: %d\n",
267 					__func__, i, err);
268 				clear_bit(i, &portdata->out_busy);
269 				spin_lock_irqsave(&intfdata->susp_lock, flags);
270 				intfdata->in_flight--;
271 				spin_unlock_irqrestore(&intfdata->susp_lock,
272 						       flags);
273 				usb_autopm_put_interface_async(port->serial->interface);
274 				break;
275 			}
276 		}
277 
278 		portdata->tx_start_time[i] = jiffies;
279 		buf += todo;
280 		left -= todo;
281 	}
282 
283 	count -= left;
284 	dev_dbg(&port->dev, "%s: wrote (did %d)\n", __func__, count);
285 	return count;
286 }
287 EXPORT_SYMBOL(usb_wwan_write);
288 
usb_wwan_indat_callback(struct urb * urb)289 static void usb_wwan_indat_callback(struct urb *urb)
290 {
291 	int err;
292 	int endpoint;
293 	struct usb_serial_port *port;
294 	struct device *dev;
295 	unsigned char *data = urb->transfer_buffer;
296 	int status = urb->status;
297 
298 	endpoint = usb_pipeendpoint(urb->pipe);
299 	port = urb->context;
300 	dev = &port->dev;
301 
302 	if (status) {
303 		dev_dbg(dev, "%s: nonzero status: %d on endpoint %02x.\n",
304 			__func__, status, endpoint);
305 	} else {
306 		if (urb->actual_length) {
307 			tty_insert_flip_string(&port->port, data,
308 					urb->actual_length);
309 			tty_flip_buffer_push(&port->port);
310 		} else
311 			dev_dbg(dev, "%s: empty read urb received\n", __func__);
312 	}
313 	/* Resubmit urb so we continue receiving */
314 	err = usb_submit_urb(urb, GFP_ATOMIC);
315 	if (err) {
316 		if (err != -EPERM && err != -ENODEV) {
317 			dev_err(dev, "%s: resubmit read urb failed. (%d)\n",
318 				__func__, err);
319 			/* busy also in error unless we are killed */
320 			usb_mark_last_busy(port->serial->dev);
321 		}
322 	} else {
323 		usb_mark_last_busy(port->serial->dev);
324 	}
325 }
326 
usb_wwan_outdat_callback(struct urb * urb)327 static void usb_wwan_outdat_callback(struct urb *urb)
328 {
329 	struct usb_serial_port *port;
330 	struct usb_wwan_port_private *portdata;
331 	struct usb_wwan_intf_private *intfdata;
332 	int i;
333 
334 	port = urb->context;
335 	intfdata = usb_get_serial_data(port->serial);
336 
337 	usb_serial_port_softint(port);
338 	usb_autopm_put_interface_async(port->serial->interface);
339 	portdata = usb_get_serial_port_data(port);
340 	spin_lock(&intfdata->susp_lock);
341 	intfdata->in_flight--;
342 	spin_unlock(&intfdata->susp_lock);
343 
344 	for (i = 0; i < N_OUT_URB; ++i) {
345 		if (portdata->out_urbs[i] == urb) {
346 			smp_mb__before_atomic();
347 			clear_bit(i, &portdata->out_busy);
348 			break;
349 		}
350 	}
351 }
352 
usb_wwan_write_room(struct tty_struct * tty)353 int usb_wwan_write_room(struct tty_struct *tty)
354 {
355 	struct usb_serial_port *port = tty->driver_data;
356 	struct usb_wwan_port_private *portdata;
357 	int i;
358 	int data_len = 0;
359 	struct urb *this_urb;
360 
361 	portdata = usb_get_serial_port_data(port);
362 
363 	for (i = 0; i < N_OUT_URB; i++) {
364 		this_urb = portdata->out_urbs[i];
365 		if (this_urb && !test_bit(i, &portdata->out_busy))
366 			data_len += OUT_BUFLEN;
367 	}
368 
369 	dev_dbg(&port->dev, "%s: %d\n", __func__, data_len);
370 	return data_len;
371 }
372 EXPORT_SYMBOL(usb_wwan_write_room);
373 
usb_wwan_chars_in_buffer(struct tty_struct * tty)374 int usb_wwan_chars_in_buffer(struct tty_struct *tty)
375 {
376 	struct usb_serial_port *port = tty->driver_data;
377 	struct usb_wwan_port_private *portdata;
378 	int i;
379 	int data_len = 0;
380 	struct urb *this_urb;
381 
382 	portdata = usb_get_serial_port_data(port);
383 
384 	for (i = 0; i < N_OUT_URB; i++) {
385 		this_urb = portdata->out_urbs[i];
386 		/* FIXME: This locking is insufficient as this_urb may
387 		   go unused during the test */
388 		if (this_urb && test_bit(i, &portdata->out_busy))
389 			data_len += this_urb->transfer_buffer_length;
390 	}
391 	dev_dbg(&port->dev, "%s: %d\n", __func__, data_len);
392 	return data_len;
393 }
394 EXPORT_SYMBOL(usb_wwan_chars_in_buffer);
395 
usb_wwan_open(struct tty_struct * tty,struct usb_serial_port * port)396 int usb_wwan_open(struct tty_struct *tty, struct usb_serial_port *port)
397 {
398 	struct usb_wwan_port_private *portdata;
399 	struct usb_wwan_intf_private *intfdata;
400 	struct usb_serial *serial = port->serial;
401 	int i, err;
402 	struct urb *urb;
403 
404 	portdata = usb_get_serial_port_data(port);
405 	intfdata = usb_get_serial_data(serial);
406 
407 	if (port->interrupt_in_urb) {
408 		err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
409 		if (err) {
410 			dev_err(&port->dev, "%s: submit int urb failed: %d\n",
411 				__func__, err);
412 		}
413 	}
414 
415 	/* Start reading from the IN endpoint */
416 	for (i = 0; i < N_IN_URB; i++) {
417 		urb = portdata->in_urbs[i];
418 		if (!urb)
419 			continue;
420 		err = usb_submit_urb(urb, GFP_KERNEL);
421 		if (err) {
422 			dev_err(&port->dev,
423 				"%s: submit read urb %d failed: %d\n",
424 				__func__, i, err);
425 		}
426 	}
427 
428 	spin_lock_irq(&intfdata->susp_lock);
429 	if (++intfdata->open_ports == 1)
430 		serial->interface->needs_remote_wakeup = 1;
431 	spin_unlock_irq(&intfdata->susp_lock);
432 	/* this balances a get in the generic USB serial code */
433 	usb_autopm_put_interface(serial->interface);
434 
435 	return 0;
436 }
437 EXPORT_SYMBOL(usb_wwan_open);
438 
unbusy_queued_urb(struct urb * urb,struct usb_wwan_port_private * portdata)439 static void unbusy_queued_urb(struct urb *urb,
440 					struct usb_wwan_port_private *portdata)
441 {
442 	int i;
443 
444 	for (i = 0; i < N_OUT_URB; i++) {
445 		if (urb == portdata->out_urbs[i]) {
446 			clear_bit(i, &portdata->out_busy);
447 			break;
448 		}
449 	}
450 }
451 
usb_wwan_close(struct usb_serial_port * port)452 void usb_wwan_close(struct usb_serial_port *port)
453 {
454 	int i;
455 	struct usb_serial *serial = port->serial;
456 	struct usb_wwan_port_private *portdata;
457 	struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial);
458 	struct urb *urb;
459 
460 	portdata = usb_get_serial_port_data(port);
461 
462 	/*
463 	 * Need to take susp_lock to make sure port is not already being
464 	 * resumed, but no need to hold it due to initialized
465 	 */
466 	spin_lock_irq(&intfdata->susp_lock);
467 	if (--intfdata->open_ports == 0)
468 		serial->interface->needs_remote_wakeup = 0;
469 	spin_unlock_irq(&intfdata->susp_lock);
470 
471 	for (;;) {
472 		urb = usb_get_from_anchor(&portdata->delayed);
473 		if (!urb)
474 			break;
475 		unbusy_queued_urb(urb, portdata);
476 		usb_autopm_put_interface_async(serial->interface);
477 	}
478 
479 	for (i = 0; i < N_IN_URB; i++)
480 		usb_kill_urb(portdata->in_urbs[i]);
481 	for (i = 0; i < N_OUT_URB; i++)
482 		usb_kill_urb(portdata->out_urbs[i]);
483 	usb_kill_urb(port->interrupt_in_urb);
484 
485 	usb_autopm_get_interface_no_resume(serial->interface);
486 }
487 EXPORT_SYMBOL(usb_wwan_close);
488 
usb_wwan_setup_urb(struct usb_serial_port * port,int endpoint,int dir,void * ctx,char * buf,int len,void (* callback)(struct urb *))489 static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
490 				      int endpoint,
491 				      int dir, void *ctx, char *buf, int len,
492 				      void (*callback) (struct urb *))
493 {
494 	struct usb_serial *serial = port->serial;
495 	struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial);
496 	struct urb *urb;
497 
498 	urb = usb_alloc_urb(0, GFP_KERNEL);	/* No ISO */
499 	if (!urb)
500 		return NULL;
501 
502 	usb_fill_bulk_urb(urb, serial->dev,
503 			  usb_sndbulkpipe(serial->dev, endpoint) | dir,
504 			  buf, len, callback, ctx);
505 
506 	if (intfdata->use_zlp && dir == USB_DIR_OUT)
507 		urb->transfer_flags |= URB_ZERO_PACKET;
508 
509 	return urb;
510 }
511 
usb_wwan_port_probe(struct usb_serial_port * port)512 int usb_wwan_port_probe(struct usb_serial_port *port)
513 {
514 	struct usb_wwan_port_private *portdata;
515 	struct urb *urb;
516 	u8 *buffer;
517 	int i;
518 
519 	if (!port->bulk_in_size || !port->bulk_out_size)
520 		return -ENODEV;
521 
522 	portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
523 	if (!portdata)
524 		return -ENOMEM;
525 
526 	init_usb_anchor(&portdata->delayed);
527 
528 	for (i = 0; i < N_IN_URB; i++) {
529 		buffer = (u8 *)__get_free_page(GFP_KERNEL);
530 		if (!buffer)
531 			goto bail_out_error;
532 		portdata->in_buffer[i] = buffer;
533 
534 		urb = usb_wwan_setup_urb(port, port->bulk_in_endpointAddress,
535 						USB_DIR_IN, port,
536 						buffer, IN_BUFLEN,
537 						usb_wwan_indat_callback);
538 		portdata->in_urbs[i] = urb;
539 	}
540 
541 	for (i = 0; i < N_OUT_URB; i++) {
542 		buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);
543 		if (!buffer)
544 			goto bail_out_error2;
545 		portdata->out_buffer[i] = buffer;
546 
547 		urb = usb_wwan_setup_urb(port, port->bulk_out_endpointAddress,
548 						USB_DIR_OUT, port,
549 						buffer, OUT_BUFLEN,
550 						usb_wwan_outdat_callback);
551 		portdata->out_urbs[i] = urb;
552 	}
553 
554 	usb_set_serial_port_data(port, portdata);
555 
556 	return 0;
557 
558 bail_out_error2:
559 	for (i = 0; i < N_OUT_URB; i++) {
560 		usb_free_urb(portdata->out_urbs[i]);
561 		kfree(portdata->out_buffer[i]);
562 	}
563 bail_out_error:
564 	for (i = 0; i < N_IN_URB; i++) {
565 		usb_free_urb(portdata->in_urbs[i]);
566 		free_page((unsigned long)portdata->in_buffer[i]);
567 	}
568 	kfree(portdata);
569 
570 	return -ENOMEM;
571 }
572 EXPORT_SYMBOL_GPL(usb_wwan_port_probe);
573 
usb_wwan_port_remove(struct usb_serial_port * port)574 int usb_wwan_port_remove(struct usb_serial_port *port)
575 {
576 	int i;
577 	struct usb_wwan_port_private *portdata;
578 
579 	portdata = usb_get_serial_port_data(port);
580 	usb_set_serial_port_data(port, NULL);
581 
582 	for (i = 0; i < N_IN_URB; i++) {
583 		usb_free_urb(portdata->in_urbs[i]);
584 		free_page((unsigned long)portdata->in_buffer[i]);
585 	}
586 	for (i = 0; i < N_OUT_URB; i++) {
587 		usb_free_urb(portdata->out_urbs[i]);
588 		kfree(portdata->out_buffer[i]);
589 	}
590 
591 	kfree(portdata);
592 
593 	return 0;
594 }
595 EXPORT_SYMBOL(usb_wwan_port_remove);
596 
597 #ifdef CONFIG_PM
stop_urbs(struct usb_serial * serial)598 static void stop_urbs(struct usb_serial *serial)
599 {
600 	int i, j;
601 	struct usb_serial_port *port;
602 	struct usb_wwan_port_private *portdata;
603 
604 	for (i = 0; i < serial->num_ports; ++i) {
605 		port = serial->port[i];
606 		portdata = usb_get_serial_port_data(port);
607 		if (!portdata)
608 			continue;
609 		for (j = 0; j < N_IN_URB; j++)
610 			usb_kill_urb(portdata->in_urbs[j]);
611 		for (j = 0; j < N_OUT_URB; j++)
612 			usb_kill_urb(portdata->out_urbs[j]);
613 		usb_kill_urb(port->interrupt_in_urb);
614 	}
615 }
616 
usb_wwan_suspend(struct usb_serial * serial,pm_message_t message)617 int usb_wwan_suspend(struct usb_serial *serial, pm_message_t message)
618 {
619 	struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial);
620 
621 	spin_lock_irq(&intfdata->susp_lock);
622 	if (PMSG_IS_AUTO(message)) {
623 		if (intfdata->in_flight) {
624 			spin_unlock_irq(&intfdata->susp_lock);
625 			return -EBUSY;
626 		}
627 	}
628 	intfdata->suspended = 1;
629 	spin_unlock_irq(&intfdata->susp_lock);
630 
631 	stop_urbs(serial);
632 
633 	return 0;
634 }
635 EXPORT_SYMBOL(usb_wwan_suspend);
636 
637 /* Caller must hold susp_lock. */
usb_wwan_submit_delayed_urbs(struct usb_serial_port * port)638 static int usb_wwan_submit_delayed_urbs(struct usb_serial_port *port)
639 {
640 	struct usb_serial *serial = port->serial;
641 	struct usb_wwan_intf_private *data = usb_get_serial_data(serial);
642 	struct usb_wwan_port_private *portdata;
643 	struct urb *urb;
644 	int err_count = 0;
645 	int err;
646 
647 	portdata = usb_get_serial_port_data(port);
648 
649 	for (;;) {
650 		urb = usb_get_from_anchor(&portdata->delayed);
651 		if (!urb)
652 			break;
653 
654 		err = usb_submit_urb(urb, GFP_ATOMIC);
655 		if (err) {
656 			dev_err(&port->dev, "%s: submit urb failed: %d\n",
657 					__func__, err);
658 			err_count++;
659 			unbusy_queued_urb(urb, portdata);
660 			usb_autopm_put_interface_async(serial->interface);
661 			continue;
662 		}
663 		data->in_flight++;
664 	}
665 
666 	if (err_count)
667 		return -EIO;
668 
669 	return 0;
670 }
671 
usb_wwan_resume(struct usb_serial * serial)672 int usb_wwan_resume(struct usb_serial *serial)
673 {
674 	int i, j;
675 	struct usb_serial_port *port;
676 	struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial);
677 	struct usb_wwan_port_private *portdata;
678 	struct urb *urb;
679 	int err;
680 	int err_count = 0;
681 
682 	spin_lock_irq(&intfdata->susp_lock);
683 	for (i = 0; i < serial->num_ports; i++) {
684 		port = serial->port[i];
685 
686 		if (!tty_port_initialized(&port->port))
687 			continue;
688 
689 		portdata = usb_get_serial_port_data(port);
690 
691 		if (port->interrupt_in_urb) {
692 			err = usb_submit_urb(port->interrupt_in_urb,
693 					GFP_ATOMIC);
694 			if (err) {
695 				dev_err(&port->dev,
696 					"%s: submit int urb failed: %d\n",
697 					__func__, err);
698 				err_count++;
699 			}
700 		}
701 
702 		err = usb_wwan_submit_delayed_urbs(port);
703 		if (err)
704 			err_count++;
705 
706 		for (j = 0; j < N_IN_URB; j++) {
707 			urb = portdata->in_urbs[j];
708 			err = usb_submit_urb(urb, GFP_ATOMIC);
709 			if (err < 0) {
710 				dev_err(&port->dev,
711 					"%s: submit read urb %d failed: %d\n",
712 					__func__, i, err);
713 				err_count++;
714 			}
715 		}
716 	}
717 	intfdata->suspended = 0;
718 	spin_unlock_irq(&intfdata->susp_lock);
719 
720 	if (err_count)
721 		return -EIO;
722 
723 	return 0;
724 }
725 EXPORT_SYMBOL(usb_wwan_resume);
726 #endif
727 
728 MODULE_AUTHOR(DRIVER_AUTHOR);
729 MODULE_DESCRIPTION(DRIVER_DESC);
730 MODULE_LICENSE("GPL");
731