generic.c 15.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * USB Serial Converter Generic functions
 *
4
 * Copyright (C) 2010 - 2013 Johan Hovold (jhovold@gmail.com)
L
Linus Torvalds 已提交
5 6 7 8 9 10 11 12 13 14
 * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com)
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License version
 *	2 as published by the Free Software Foundation.
 */

#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>
15
#include <linux/sysrq.h>
L
Linus Torvalds 已提交
16 17 18 19 20
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/usb.h>
21
#include <linux/usb/serial.h>
A
Alan Cox 已提交
22
#include <linux/uaccess.h>
23
#include <linux/kfifo.h>
24
#include <linux/serial.h>
25

L
Linus Torvalds 已提交
26
#ifdef CONFIG_USB_SERIAL_GENERIC
27

L
Linus Torvalds 已提交
28 29 30 31 32 33 34 35 36 37 38
static __u16 vendor  = 0x05f9;
static __u16 product = 0xffff;

module_param(vendor, ushort, 0);
MODULE_PARM_DESC(vendor, "User specified USB idVendor");

module_param(product, ushort, 0);
MODULE_PARM_DESC(product, "User specified USB idProduct");

static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */

39
struct usb_serial_driver usb_serial_generic_device = {
40 41
	.driver = {
		.owner =	THIS_MODULE,
42
		.name =		"generic",
43
	},
L
Linus Torvalds 已提交
44 45
	.id_table =		generic_device_ids,
	.num_ports =		1,
46 47
	.throttle =		usb_serial_generic_throttle,
	.unthrottle =		usb_serial_generic_unthrottle,
48
	.resume =		usb_serial_generic_resume,
L
Linus Torvalds 已提交
49 50
};

51 52 53 54
static struct usb_serial_driver * const serial_drivers[] = {
	&usb_serial_generic_device, NULL
};

L
Linus Torvalds 已提交
55 56
#endif

57
int usb_serial_generic_register(void)
L
Linus Torvalds 已提交
58 59 60 61 62 63
{
	int retval = 0;

#ifdef CONFIG_USB_SERIAL_GENERIC
	generic_device_ids[0].idVendor = vendor;
	generic_device_ids[0].idProduct = product;
A
Alan Cox 已提交
64 65
	generic_device_ids[0].match_flags =
		USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
L
Linus Torvalds 已提交
66

67 68
	retval = usb_serial_register_drivers(serial_drivers,
			"usbserial_generic", generic_device_ids);
L
Linus Torvalds 已提交
69 70 71 72
#endif
	return retval;
}

A
Alan Cox 已提交
73
void usb_serial_generic_deregister(void)
L
Linus Torvalds 已提交
74 75
{
#ifdef CONFIG_USB_SERIAL_GENERIC
76
	usb_serial_deregister_drivers(serial_drivers);
L
Linus Torvalds 已提交
77 78 79
#endif
}

80
int usb_serial_generic_open(struct tty_struct *tty, struct usb_serial_port *port)
L
Linus Torvalds 已提交
81 82
{
	int result = 0;
83
	unsigned long flags;
L
Linus Torvalds 已提交
84

85 86 87 88 89
	spin_lock_irqsave(&port->lock, flags);
	port->throttled = 0;
	port->throttle_req = 0;
	spin_unlock_irqrestore(&port->lock, flags);

90
	if (port->bulk_in_size)
91
		result = usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
L
Linus Torvalds 已提交
92 93 94

	return result;
}
95
EXPORT_SYMBOL_GPL(usb_serial_generic_open);
L
Linus Torvalds 已提交
96

97
void usb_serial_generic_close(struct usb_serial_port *port)
L
Linus Torvalds 已提交
98
{
J
Johan Hovold 已提交
99
	unsigned long flags;
100
	int i;
L
Linus Torvalds 已提交
101

102 103 104 105 106 107 108 109 110 111 112
	if (port->bulk_out_size) {
		for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
			usb_kill_urb(port->write_urbs[i]);

		spin_lock_irqsave(&port->lock, flags);
		kfifo_reset_out(&port->write_fifo);
		spin_unlock_irqrestore(&port->lock, flags);
	}
	if (port->bulk_in_size) {
		for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
			usb_kill_urb(port->read_urbs[i]);
L
Linus Torvalds 已提交
113 114
	}
}
115
EXPORT_SYMBOL_GPL(usb_serial_generic_close);
L
Linus Torvalds 已提交
116

117
int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port,
118
						void *dest, size_t size)
119
{
120
	return kfifo_out_locked(&port->write_fifo, dest, size, &port->lock);
121 122
}

123
/**
124 125
 * usb_serial_generic_write_start - start writing buffered data
 * @port: usb-serial port
126
 * @mem_flags: flags to use for memory allocations
127 128
 *
 * Serialised using USB_SERIAL_WRITE_BUSY flag.
129
 *
130
 * Return: Zero on success or if busy, otherwise a negative errno value.
131
 */
132
int usb_serial_generic_write_start(struct usb_serial_port *port,
133
							gfp_t mem_flags)
134
{
135 136
	struct urb *urb;
	int count, result;
137
	unsigned long flags;
138
	int i;
139

140 141 142
	if (test_and_set_bit_lock(USB_SERIAL_WRITE_BUSY, &port->flags))
		return 0;
retry:
143
	spin_lock_irqsave(&port->lock, flags);
144 145
	if (!port->write_urbs_free || !kfifo_len(&port->write_fifo)) {
		clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
146 147
		spin_unlock_irqrestore(&port->lock, flags);
		return 0;
148
	}
149 150
	i = (int)find_first_bit(&port->write_urbs_free,
						ARRAY_SIZE(port->write_urbs));
151 152
	spin_unlock_irqrestore(&port->lock, flags);

153
	urb = port->write_urbs[i];
154
	count = port->serial->type->prepare_write_buffer(port,
155 156
						urb->transfer_buffer,
						port->bulk_out_size);
157
	urb->transfer_buffer_length = count;
158
	usb_serial_debug_data(&port->dev, __func__, count, urb->transfer_buffer);
J
Johan Hovold 已提交
159 160 161 162 163
	spin_lock_irqsave(&port->lock, flags);
	port->tx_bytes += count;
	spin_unlock_irqrestore(&port->lock, flags);

	clear_bit(i, &port->write_urbs_free);
164
	result = usb_submit_urb(urb, mem_flags);
165
	if (result) {
166
		dev_err_console(port, "%s - error submitting urb: %d\n",
167
						__func__, result);
J
Johan Hovold 已提交
168 169 170 171 172
		set_bit(i, &port->write_urbs_free);
		spin_lock_irqsave(&port->lock, flags);
		port->tx_bytes -= count;
		spin_unlock_irqrestore(&port->lock, flags);

173
		clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
174 175
		return result;
	}
176

177
	goto retry;	/* try sending off another urb */
178
}
179
EXPORT_SYMBOL_GPL(usb_serial_generic_write_start);
180 181

/**
182 183 184 185 186
 * usb_serial_generic_write - generic write function
 * @tty: tty for the port
 * @port: usb-serial port
 * @buf: data to write
 * @count: number of bytes to write
187
 *
188 189
 * Return: The number of characters buffered, which may be anything from
 * zero to @count, or a negative errno value.
190
 */
A
Alan Cox 已提交
191 192
int usb_serial_generic_write(struct tty_struct *tty,
	struct usb_serial_port *port, const unsigned char *buf, int count)
L
Linus Torvalds 已提交
193 194 195
{
	int result;

196 197 198
	if (!port->bulk_out_size)
		return -ENODEV;

199
	if (!count)
A
Alan Cox 已提交
200
		return 0;
L
Linus Torvalds 已提交
201

202
	count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock);
203
	result = usb_serial_generic_write_start(port, GFP_KERNEL);
204 205
	if (result)
		return result;
L
Linus Torvalds 已提交
206

207
	return count;
L
Linus Torvalds 已提交
208
}
209
EXPORT_SYMBOL_GPL(usb_serial_generic_write);
L
Linus Torvalds 已提交
210

A
Alan Cox 已提交
211
int usb_serial_generic_write_room(struct tty_struct *tty)
L
Linus Torvalds 已提交
212
{
A
Alan Cox 已提交
213
	struct usb_serial_port *port = tty->driver_data;
214
	unsigned long flags;
215
	int room;
L
Linus Torvalds 已提交
216

217 218 219
	if (!port->bulk_out_size)
		return 0;

220
	spin_lock_irqsave(&port->lock, flags);
221
	room = kfifo_avail(&port->write_fifo);
222
	spin_unlock_irqrestore(&port->lock, flags);
L
Linus Torvalds 已提交
223

224
	dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
225
	return room;
L
Linus Torvalds 已提交
226 227
}

A
Alan Cox 已提交
228
int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)
L
Linus Torvalds 已提交
229
{
A
Alan Cox 已提交
230
	struct usb_serial_port *port = tty->driver_data;
231
	unsigned long flags;
232
	int chars;
L
Linus Torvalds 已提交
233

234 235 236
	if (!port->bulk_out_size)
		return 0;

237
	spin_lock_irqsave(&port->lock, flags);
238
	chars = kfifo_len(&port->write_fifo) + port->tx_bytes;
239
	spin_unlock_irqrestore(&port->lock, flags);
L
Linus Torvalds 已提交
240

241
	dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
A
Alan Cox 已提交
242
	return chars;
L
Linus Torvalds 已提交
243
}
244
EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer);
L
Linus Torvalds 已提交
245

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout)
{
	struct usb_serial_port *port = tty->driver_data;
	unsigned int bps;
	unsigned long period;
	unsigned long expire;

	bps = tty_get_baud_rate(tty);
	if (!bps)
		bps = 9600;	/* B0 */
	/*
	 * Use a poll-period of roughly the time it takes to send one
	 * character or at least one jiffy.
	 */
	period = max_t(unsigned long, (10 * HZ / bps), 1);
	period = min_t(unsigned long, period, timeout);

	dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n",
					__func__, jiffies_to_msecs(timeout),
					jiffies_to_msecs(period));
	expire = jiffies + timeout;
	while (!port->serial->type->tx_empty(port)) {
		schedule_timeout_interruptible(period);
		if (signal_pending(current))
			break;
		if (time_after(jiffies, expire))
			break;
	}
}
EXPORT_SYMBOL_GPL(usb_serial_generic_wait_until_sent);

277 278 279 280 281 282 283 284
static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
						int index, gfp_t mem_flags)
{
	int res;

	if (!test_and_clear_bit(index, &port->read_urbs_free))
		return 0;

285
	dev_dbg(&port->dev, "%s - urb %d\n", __func__, index);
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301

	res = usb_submit_urb(port->read_urbs[index], mem_flags);
	if (res) {
		if (res != -EPERM) {
			dev_err(&port->dev,
					"%s - usb_submit_urb failed: %d\n",
					__func__, res);
		}
		set_bit(index, &port->read_urbs_free);
		return res;
	}

	return 0;
}

int usb_serial_generic_submit_read_urbs(struct usb_serial_port *port,
302
					gfp_t mem_flags)
L
Linus Torvalds 已提交
303
{
304 305
	int res;
	int i;
L
Linus Torvalds 已提交
306

307 308 309 310
	for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
		res = usb_serial_generic_submit_read_urb(port, i, mem_flags);
		if (res)
			goto err;
311
	}
312 313 314 315 316 317 318

	return 0;
err:
	for (; i >= 0; --i)
		usb_kill_urb(port->read_urbs[i]);

	return res;
L
Linus Torvalds 已提交
319
}
320
EXPORT_SYMBOL_GPL(usb_serial_generic_submit_read_urbs);
321

322
void usb_serial_generic_process_read_urb(struct urb *urb)
323
{
324
	struct usb_serial_port *port = urb->context;
325 326 327
	char *ch = (char *)urb->transfer_buffer;
	int i;

328 329
	if (!urb->actual_length)
		return;
330 331 332 333 334
	/*
	 * The per character mucking around with sysrq path it too slow for
	 * stuff like 3G modems, so shortcircuit it in the 99.9999999% of
	 * cases where the USB serial is not a console anyway.
	 */
335
	if (!port->port.console || !port->sysrq)
J
Jiri Slaby 已提交
336
		tty_insert_flip_string(&port->port, ch, urb->actual_length);
337 338
	else {
		for (i = 0; i < urb->actual_length; i++, ch++) {
339
			if (!usb_serial_handle_sysrq_char(port, *ch))
J
Jiri Slaby 已提交
340
				tty_insert_flip_char(&port->port, *ch, TTY_NORMAL);
341
		}
342
	}
J
Jiri Slaby 已提交
343
	tty_flip_buffer_push(&port->port);
344
}
345
EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb);
346

A
Alan Cox 已提交
347
void usb_serial_generic_read_bulk_callback(struct urb *urb)
348
{
349
	struct usb_serial_port *port = urb->context;
350
	unsigned char *data = urb->transfer_buffer;
351
	unsigned long flags;
352
	int i;
353

354 355 356 357 358
	for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
		if (urb == port->read_urbs[i])
			break;
	}
	set_bit(i, &port->read_urbs_free);
359

360 361
	dev_dbg(&port->dev, "%s - urb %d, len %d\n", __func__, i,
							urb->actual_length);
362

363
	if (urb->status) {
364 365
		dev_dbg(&port->dev, "%s - non-zero urb status: %d\n",
			__func__, urb->status);
366 367 368
		return;
	}

369
	usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
370
	port->serial->type->process_read_urb(urb);
371 372

	/* Throttle the device if requested by tty */
373
	spin_lock_irqsave(&port->lock, flags);
A
Alan Cox 已提交
374 375
	port->throttled = port->throttle_req;
	if (!port->throttled) {
376
		spin_unlock_irqrestore(&port->lock, flags);
377
		usb_serial_generic_submit_read_urb(port, i, GFP_ATOMIC);
A
Alan Cox 已提交
378
	} else
379
		spin_unlock_irqrestore(&port->lock, flags);
380
}
381
EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
L
Linus Torvalds 已提交
382

A
Alan Cox 已提交
383
void usb_serial_generic_write_bulk_callback(struct urb *urb)
L
Linus Torvalds 已提交
384
{
385
	unsigned long flags;
386
	struct usb_serial_port *port = urb->context;
387
	int status = urb->status;
388
	int i;
L
Linus Torvalds 已提交
389

390 391 392
	for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
		if (port->write_urbs[i] == urb)
			break;
393

394 395 396 397 398 399
	spin_lock_irqsave(&port->lock, flags);
	port->tx_bytes -= urb->transfer_buffer_length;
	set_bit(i, &port->write_urbs_free);
	spin_unlock_irqrestore(&port->lock, flags);

	if (status) {
400 401
		dev_dbg(&port->dev, "%s - non-zero urb status: %d\n",
			__func__, status);
402

403
		spin_lock_irqsave(&port->lock, flags);
404
		kfifo_reset_out(&port->write_fifo);
405
		spin_unlock_irqrestore(&port->lock, flags);
406
	} else {
407
		usb_serial_generic_write_start(port, GFP_ATOMIC);
L
Linus Torvalds 已提交
408
	}
409

410
	usb_serial_port_softint(port);
L
Linus Torvalds 已提交
411
}
412
EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
L
Linus Torvalds 已提交
413

A
Alan Cox 已提交
414
void usb_serial_generic_throttle(struct tty_struct *tty)
415
{
A
Alan Cox 已提交
416
	struct usb_serial_port *port = tty->driver_data;
417 418 419 420 421 422
	unsigned long flags;

	spin_lock_irqsave(&port->lock, flags);
	port->throttle_req = 1;
	spin_unlock_irqrestore(&port->lock, flags);
}
423
EXPORT_SYMBOL_GPL(usb_serial_generic_throttle);
424

A
Alan Cox 已提交
425
void usb_serial_generic_unthrottle(struct tty_struct *tty)
426
{
A
Alan Cox 已提交
427
	struct usb_serial_port *port = tty->driver_data;
428 429
	int was_throttled;

430
	spin_lock_irq(&port->lock);
431 432
	was_throttled = port->throttled;
	port->throttled = port->throttle_req = 0;
433
	spin_unlock_irq(&port->lock);
434

435
	if (was_throttled)
436
		usb_serial_generic_submit_read_urbs(port, GFP_KERNEL);
437
}
438
EXPORT_SYMBOL_GPL(usb_serial_generic_unthrottle);
439

440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
static bool usb_serial_generic_msr_changed(struct tty_struct *tty,
				unsigned long arg, struct async_icount *cprev)
{
	struct usb_serial_port *port = tty->driver_data;
	struct async_icount cnow;
	unsigned long flags;
	bool ret;

	/*
	 * Use tty-port initialised flag to detect all hangups including the
	 * one generated at USB-device disconnect.
	 */
	if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
		return true;

	spin_lock_irqsave(&port->lock, flags);
	cnow = port->icount;				/* atomic copy*/
	spin_unlock_irqrestore(&port->lock, flags);

	ret =	((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) ||
		((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) ||
		((arg & TIOCM_CD)  && (cnow.dcd != cprev->dcd)) ||
		((arg & TIOCM_CTS) && (cnow.cts != cprev->cts));

	*cprev = cnow;

	return ret;
}

int usb_serial_generic_tiocmiwait(struct tty_struct *tty, unsigned long arg)
{
	struct usb_serial_port *port = tty->driver_data;
	struct async_icount cnow;
	unsigned long flags;
	int ret;

	spin_lock_irqsave(&port->lock, flags);
	cnow = port->icount;				/* atomic copy */
	spin_unlock_irqrestore(&port->lock, flags);

	ret = wait_event_interruptible(port->port.delta_msr_wait,
			usb_serial_generic_msr_changed(tty, arg, &cnow));
482 483
	if (!ret && !test_bit(ASYNCB_INITIALIZED, &port->port.flags))
		ret = -EIO;
484 485 486 487 488

	return ret;
}
EXPORT_SYMBOL_GPL(usb_serial_generic_tiocmiwait);

489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
int usb_serial_generic_get_icount(struct tty_struct *tty,
					struct serial_icounter_struct *icount)
{
	struct usb_serial_port *port = tty->driver_data;
	struct async_icount cnow;
	unsigned long flags;

	spin_lock_irqsave(&port->lock, flags);
	cnow = port->icount;				/* atomic copy */
	spin_unlock_irqrestore(&port->lock, flags);

	icount->cts = cnow.cts;
	icount->dsr = cnow.dsr;
	icount->rng = cnow.rng;
	icount->dcd = cnow.dcd;
	icount->tx = cnow.tx;
	icount->rx = cnow.rx;
	icount->frame = cnow.frame;
	icount->parity = cnow.parity;
	icount->overrun = cnow.overrun;
	icount->brk = cnow.brk;
	icount->buf_overrun = cnow.buf_overrun;

	return 0;
}
EXPORT_SYMBOL_GPL(usb_serial_generic_get_icount);

516
#ifdef CONFIG_MAGIC_SYSRQ
517
int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
518
{
519
	if (port->sysrq && port->port.console) {
520
		if (ch && time_before(jiffies, port->sysrq)) {
521
			handle_sysrq(ch);
522 523 524 525 526 527 528
			port->sysrq = 0;
			return 1;
		}
		port->sysrq = 0;
	}
	return 0;
}
529
#else
530
int usb_serial_handle_sysrq_char(struct usb_serial_port *port, unsigned int ch)
531 532 533 534
{
	return 0;
}
#endif
535 536 537 538 539 540 541 542 543 544 545 546 547
EXPORT_SYMBOL_GPL(usb_serial_handle_sysrq_char);

int usb_serial_handle_break(struct usb_serial_port *port)
{
	if (!port->sysrq) {
		port->sysrq = jiffies + HZ*5;
		return 1;
	}
	port->sysrq = 0;
	return 0;
}
EXPORT_SYMBOL_GPL(usb_serial_handle_break);

548
/**
549 550 551 552
 * usb_serial_handle_dcd_change - handle a change of carrier detect state
 * @port: usb-serial port
 * @tty: tty for the port
 * @status: new carrier detect status, nonzero if active
553 554 555 556 557 558
 */
void usb_serial_handle_dcd_change(struct usb_serial_port *usb_port,
				struct tty_struct *tty, unsigned int status)
{
	struct tty_port *port = &usb_port->port;

559
	dev_dbg(&usb_port->dev, "%s - status %d\n", __func__, status);
560

561 562 563 564 565 566 567 568 569 570
	if (tty) {
		struct tty_ldisc *ld = tty_ldisc_ref(tty);

		if (ld) {
			if (ld->ops->dcd_change)
				ld->ops->dcd_change(tty, status);
			tty_ldisc_deref(ld);
		}
	}

571 572 573 574 575 576 577
	if (status)
		wake_up_interruptible(&port->open_wait);
	else if (tty && !C_CLOCAL(tty))
		tty_hangup(tty);
}
EXPORT_SYMBOL_GPL(usb_serial_handle_dcd_change);

578 579 580 581 582 583 584
int usb_serial_generic_resume(struct usb_serial *serial)
{
	struct usb_serial_port *port;
	int i, c = 0, r;

	for (i = 0; i < serial->num_ports; i++) {
		port = serial->port[i];
585
		if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
586 587
			continue;

588 589 590
		if (port->bulk_in_size) {
			r = usb_serial_generic_submit_read_urbs(port,
								GFP_NOIO);
591 592 593 594
			if (r < 0)
				c++;
		}

595
		if (port->bulk_out_size) {
596
			r = usb_serial_generic_write_start(port, GFP_NOIO);
597 598 599 600 601 602 603 604
			if (r < 0)
				c++;
		}
	}

	return c ? -EIO : 0;
}
EXPORT_SYMBOL_GPL(usb_serial_generic_resume);