devio.c 51.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/*****************************************************************************/

/*
 *      devio.c  --  User space communication with USB devices.
 *
 *      Copyright (C) 1999-2000  Thomas Sailer (sailer@ife.ee.ethz.ch)
 *
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  This file implements the usbfs/x/y files, where
 *  x is the bus number and y the device number.
 *
 *  It allows user space programs/"drivers" to communicate directly
 *  with USB devices without intervening kernel driver.
 *
 *  Revision history
 *    22.12.1999   0.1   Initial release (split from proc_usb.c)
 *    04.01.2000   0.2   Turned into its own filesystem
31 32
 *    30.09.2005   0.3   Fix user-triggerable oops in async URB delivery
 *    			 (CAN-2005-3055)
L
Linus Torvalds 已提交
33 34 35 36 37 38 39 40 41 42 43 44
 */

/*****************************************************************************/

#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/signal.h>
#include <linux/poll.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
45
#include <linux/usb/hcd.h>	/* for usbcore internals */
46
#include <linux/cdev.h>
47
#include <linux/notifier.h>
48
#include <linux/security.h>
49
#include <linux/user_namespace.h>
L
Linus Torvalds 已提交
50 51 52 53 54 55
#include <asm/uaccess.h>
#include <asm/byteorder.h>
#include <linux/moduleparam.h>

#include "usb.h"

56 57 58
#define USB_MAXBUS			64
#define USB_DEVICE_MAX			USB_MAXBUS * 128

59 60 61
/* Mutual exclusion for removal, open, and release */
DEFINE_MUTEX(usbfs_mutex);

62 63 64 65 66 67 68 69 70 71
struct dev_state {
	struct list_head list;      /* state list */
	struct usb_device *dev;
	struct file *file;
	spinlock_t lock;            /* protects the async urb lists */
	struct list_head async_pending;
	struct list_head async_completed;
	wait_queue_head_t wait;     /* wake up if a request completed */
	unsigned int discsignr;
	struct pid *disc_pid;
72
	const struct cred *cred;
73 74 75
	void __user *disccontext;
	unsigned long ifclaimed;
	u32 secid;
76
	u32 disabled_bulk_eps;
77 78
};

L
Linus Torvalds 已提交
79 80 81
struct async {
	struct list_head asynclist;
	struct dev_state *ps;
82
	struct pid *pid;
83
	const struct cred *cred;
L
Linus Torvalds 已提交
84 85 86 87 88
	unsigned int signr;
	unsigned int ifnum;
	void __user *userbuffer;
	void __user *userurb;
	struct urb *urb;
89
	unsigned int mem_usage;
90
	int status;
91
	u32 secid;
92 93
	u8 bulk_addr;
	u8 bulk_status;
L
Linus Torvalds 已提交
94 95
};

96
static bool usbfs_snoop;
97 98
module_param(usbfs_snoop, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(usbfs_snoop, "true to log all usbfs traffic");
L
Linus Torvalds 已提交
99 100 101 102

#define snoop(dev, format, arg...)				\
	do {							\
		if (usbfs_snoop)				\
103
			dev_info(dev , format , ## arg);	\
L
Linus Torvalds 已提交
104 105
	} while (0)

106 107 108
enum snoop_when {
	SUBMIT, COMPLETE
};
109

110
#define USB_DEVICE_DEV		MKDEV(USB_DEVICE_MAJOR, 0)
L
Linus Torvalds 已提交
111

112
/* Limit on the total amount of memory we can allocate for transfers */
113 114 115 116 117 118 119
static unsigned usbfs_memory_mb = 16;
module_param(usbfs_memory_mb, uint, 0644);
MODULE_PARM_DESC(usbfs_memory_mb,
		"maximum MB allowed for usbfs buffers (0 = no limit)");

/* Hard limit, necessary to avoid aithmetic overflow */
#define USBFS_XFER_MAX		(UINT_MAX / 2 - 1000000)
L
Linus Torvalds 已提交
120

121 122 123 124 125
static atomic_t usbfs_memory_usage;	/* Total memory currently allocated */

/* Check whether it's okay to allocate more memory for a transfer */
static int usbfs_increase_memory_usage(unsigned amount)
{
126 127 128 129 130 131 132 133 134 135 136 137
	unsigned lim;

	/*
	 * Convert usbfs_memory_mb to bytes, avoiding overflows.
	 * 0 means use the hard limit (effectively unlimited).
	 */
	lim = ACCESS_ONCE(usbfs_memory_mb);
	if (lim == 0 || lim > (USBFS_XFER_MAX >> 20))
		lim = USBFS_XFER_MAX;
	else
		lim <<= 20;

138
	atomic_add(amount, &usbfs_memory_usage);
139
	if (atomic_read(&usbfs_memory_usage) <= lim)
140 141 142 143 144 145 146 147 148 149
		return 0;
	atomic_sub(amount, &usbfs_memory_usage);
	return -ENOMEM;
}

/* Memory for a transfer is being deallocated */
static void usbfs_decrease_memory_usage(unsigned amount)
{
	atomic_sub(amount, &usbfs_memory_usage);
}
150

151
static int connected(struct dev_state *ps)
L
Linus Torvalds 已提交
152
{
A
Alan Stern 已提交
153 154
	return (!list_empty(&ps->list) &&
			ps->dev->state != USB_STATE_NOTATTACHED);
L
Linus Torvalds 已提交
155 156 157 158 159 160
}

static loff_t usbdev_lseek(struct file *file, loff_t offset, int orig)
{
	loff_t ret;

161
	mutex_lock(&file->f_dentry->d_inode->i_mutex);
L
Linus Torvalds 已提交
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176

	switch (orig) {
	case 0:
		file->f_pos = offset;
		ret = file->f_pos;
		break;
	case 1:
		file->f_pos += offset;
		ret = file->f_pos;
		break;
	case 2:
	default:
		ret = -EINVAL;
	}

177
	mutex_unlock(&file->f_dentry->d_inode->i_mutex);
L
Linus Torvalds 已提交
178 179 180
	return ret;
}

181 182
static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes,
			   loff_t *ppos)
L
Linus Torvalds 已提交
183
{
184
	struct dev_state *ps = file->private_data;
L
Linus Torvalds 已提交
185 186 187 188 189 190 191 192
	struct usb_device *dev = ps->dev;
	ssize_t ret = 0;
	unsigned len;
	loff_t pos;
	int i;

	pos = *ppos;
	usb_lock_device(dev);
A
Alan Stern 已提交
193
	if (!connected(ps)) {
L
Linus Torvalds 已提交
194 195 196 197 198 199 200 201
		ret = -ENODEV;
		goto err;
	} else if (pos < 0) {
		ret = -EINVAL;
		goto err;
	}

	if (pos < sizeof(struct usb_device_descriptor)) {
202 203
		/* 18 bytes - fits on the stack */
		struct usb_device_descriptor temp_desc;
204 205

		memcpy(&temp_desc, &dev->descriptor, sizeof(dev->descriptor));
206 207 208 209
		le16_to_cpus(&temp_desc.bcdUSB);
		le16_to_cpus(&temp_desc.idVendor);
		le16_to_cpus(&temp_desc.idProduct);
		le16_to_cpus(&temp_desc.bcdDevice);
L
Linus Torvalds 已提交
210 211 212 213

		len = sizeof(struct usb_device_descriptor) - pos;
		if (len > nbytes)
			len = nbytes;
214
		if (copy_to_user(buf, ((char *)&temp_desc) + pos, len)) {
L
Linus Torvalds 已提交
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 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
			ret = -EFAULT;
			goto err;
		}

		*ppos += len;
		buf += len;
		nbytes -= len;
		ret += len;
	}

	pos = sizeof(struct usb_device_descriptor);
	for (i = 0; nbytes && i < dev->descriptor.bNumConfigurations; i++) {
		struct usb_config_descriptor *config =
			(struct usb_config_descriptor *)dev->rawdescriptors[i];
		unsigned int length = le16_to_cpu(config->wTotalLength);

		if (*ppos < pos + length) {

			/* The descriptor may claim to be longer than it
			 * really is.  Here is the actual allocated length. */
			unsigned alloclen =
				le16_to_cpu(dev->config[i].desc.wTotalLength);

			len = length - (*ppos - pos);
			if (len > nbytes)
				len = nbytes;

			/* Simply don't write (skip over) unallocated parts */
			if (alloclen > (*ppos - pos)) {
				alloclen -= (*ppos - pos);
				if (copy_to_user(buf,
				    dev->rawdescriptors[i] + (*ppos - pos),
				    min(len, alloclen))) {
					ret = -EFAULT;
					goto err;
				}
			}

			*ppos += len;
			buf += len;
			nbytes -= len;
			ret += len;
		}

		pos += length;
	}

err:
	usb_unlock_device(dev);
	return ret;
}

/*
 * async list handling
 */

static struct async *alloc_async(unsigned int numisoframes)
{
273
	struct async *as;
274

275
	as = kzalloc(sizeof(struct async), GFP_KERNEL);
276 277
	if (!as)
		return NULL;
L
Linus Torvalds 已提交
278 279 280 281 282
	as->urb = usb_alloc_urb(numisoframes, GFP_KERNEL);
	if (!as->urb) {
		kfree(as);
		return NULL;
	}
283
	return as;
L
Linus Torvalds 已提交
284 285 286 287
}

static void free_async(struct async *as)
{
288
	put_pid(as->pid);
289 290
	if (as->cred)
		put_cred(as->cred);
291 292
	kfree(as->urb->transfer_buffer);
	kfree(as->urb->setup_packet);
L
Linus Torvalds 已提交
293
	usb_free_urb(as->urb);
294
	usbfs_decrease_memory_usage(as->mem_usage);
295
	kfree(as);
L
Linus Torvalds 已提交
296 297
}

298
static void async_newpending(struct async *as)
L
Linus Torvalds 已提交
299
{
300 301 302 303 304 305
	struct dev_state *ps = as->ps;
	unsigned long flags;

	spin_lock_irqsave(&ps->lock, flags);
	list_add_tail(&as->asynclist, &ps->async_pending);
	spin_unlock_irqrestore(&ps->lock, flags);
L
Linus Torvalds 已提交
306 307
}

308
static void async_removepending(struct async *as)
L
Linus Torvalds 已提交
309
{
310 311 312 313 314 315
	struct dev_state *ps = as->ps;
	unsigned long flags;

	spin_lock_irqsave(&ps->lock, flags);
	list_del_init(&as->asynclist);
	spin_unlock_irqrestore(&ps->lock, flags);
L
Linus Torvalds 已提交
316 317
}

318
static struct async *async_getcompleted(struct dev_state *ps)
L
Linus Torvalds 已提交
319
{
320 321 322 323 324 325 326 327 328 329 330
	unsigned long flags;
	struct async *as = NULL;

	spin_lock_irqsave(&ps->lock, flags);
	if (!list_empty(&ps->async_completed)) {
		as = list_entry(ps->async_completed.next, struct async,
				asynclist);
		list_del_init(&as->asynclist);
	}
	spin_unlock_irqrestore(&ps->lock, flags);
	return as;
L
Linus Torvalds 已提交
331 332
}

333
static struct async *async_getpending(struct dev_state *ps,
334
					     void __user *userurb)
L
Linus Torvalds 已提交
335
{
336
	struct async *as;
L
Linus Torvalds 已提交
337 338 339 340 341 342

	list_for_each_entry(as, &ps->async_pending, asynclist)
		if (as->userurb == userurb) {
			list_del_init(&as->asynclist);
			return as;
		}
H
Huajun Li 已提交
343

344
	return NULL;
L
Linus Torvalds 已提交
345 346
}

347 348
static void snoop_urb(struct usb_device *udev,
		void __user *userurb, int pipe, unsigned length,
349 350
		int timeout_or_status, enum snoop_when when,
		unsigned char *data, unsigned data_len)
351
{
352 353 354 355
	static const char *types[] = {"isoc", "int", "ctrl", "bulk"};
	static const char *dirs[] = {"out", "in"};
	int ep;
	const char *t, *d;
356 357 358 359

	if (!usbfs_snoop)
		return;

360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
	ep = usb_pipeendpoint(pipe);
	t = types[usb_pipetype(pipe)];
	d = dirs[!!usb_pipein(pipe)];

	if (userurb) {		/* Async */
		if (when == SUBMIT)
			dev_info(&udev->dev, "userurb %p, ep%d %s-%s, "
					"length %u\n",
					userurb, ep, t, d, length);
		else
			dev_info(&udev->dev, "userurb %p, ep%d %s-%s, "
					"actual_length %u status %d\n",
					userurb, ep, t, d, length,
					timeout_or_status);
	} else {
		if (when == SUBMIT)
			dev_info(&udev->dev, "ep%d %s-%s, length %u, "
					"timeout %d\n",
					ep, t, d, length, timeout_or_status);
		else
			dev_info(&udev->dev, "ep%d %s-%s, actual_length %u, "
					"status %d\n",
					ep, t, d, length, timeout_or_status);
	}
384 385 386 387 388

	if (data && data_len > 0) {
		print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_NONE, 32, 1,
			data, data_len, 1);
	}
389 390
}

391 392 393 394 395 396 397
#define AS_CONTINUATION	1
#define AS_UNLINK	2

static void cancel_bulk_urbs(struct dev_state *ps, unsigned bulk_addr)
__releases(ps->lock)
__acquires(ps->lock)
{
H
Huajun Li 已提交
398
	struct urb *urb;
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
	struct async *as;

	/* Mark all the pending URBs that match bulk_addr, up to but not
	 * including the first one without AS_CONTINUATION.  If such an
	 * URB is encountered then a new transfer has already started so
	 * the endpoint doesn't need to be disabled; otherwise it does.
	 */
	list_for_each_entry(as, &ps->async_pending, asynclist) {
		if (as->bulk_addr == bulk_addr) {
			if (as->bulk_status != AS_CONTINUATION)
				goto rescan;
			as->bulk_status = AS_UNLINK;
			as->bulk_addr = 0;
		}
	}
	ps->disabled_bulk_eps |= (1 << bulk_addr);

	/* Now carefully unlink all the marked pending URBs */
 rescan:
	list_for_each_entry(as, &ps->async_pending, asynclist) {
		if (as->bulk_status == AS_UNLINK) {
			as->bulk_status = 0;		/* Only once */
H
Huajun Li 已提交
421 422
			urb = as->urb;
			usb_get_urb(urb);
423
			spin_unlock(&ps->lock);		/* Allow completions */
H
Huajun Li 已提交
424 425
			usb_unlink_urb(urb);
			usb_put_urb(urb);
426 427 428 429 430 431
			spin_lock(&ps->lock);
			goto rescan;
		}
	}
}

432
static void async_completed(struct urb *urb)
L
Linus Torvalds 已提交
433
{
434 435
	struct async *as = urb->context;
	struct dev_state *ps = as->ps;
L
Linus Torvalds 已提交
436
	struct siginfo sinfo;
437 438
	struct pid *pid = NULL;
	u32 secid = 0;
439
	const struct cred *cred = NULL;
440
	int signr;
L
Linus Torvalds 已提交
441

442 443
	spin_lock(&ps->lock);
	list_move_tail(&as->asynclist, &ps->async_completed);
444
	as->status = urb->status;
445 446
	signr = as->signr;
	if (signr) {
L
Linus Torvalds 已提交
447
		sinfo.si_signo = as->signr;
448
		sinfo.si_errno = as->status;
L
Linus Torvalds 已提交
449 450
		sinfo.si_code = SI_ASYNCIO;
		sinfo.si_addr = as->userurb;
451
		pid = get_pid(as->pid);
452
		cred = get_cred(as->cred);
453
		secid = as->secid;
L
Linus Torvalds 已提交
454
	}
455
	snoop(&urb->dev->dev, "urb complete\n");
456
	snoop_urb(urb->dev, as->userurb, urb->pipe, urb->actual_length,
457 458 459
			as->status, COMPLETE,
			((urb->transfer_flags & URB_DIR_MASK) == USB_DIR_OUT) ?
				NULL : urb->transfer_buffer, urb->actual_length);
460 461 462
	if (as->status < 0 && as->bulk_addr && as->status != -ECONNRESET &&
			as->status != -ENOENT)
		cancel_bulk_urbs(ps, as->bulk_addr);
463 464
	spin_unlock(&ps->lock);

465
	if (signr) {
466
		kill_pid_info_as_cred(sinfo.si_signo, &sinfo, pid, cred, secid);
467
		put_pid(pid);
468
		put_cred(cred);
469
	}
470

471
	wake_up(&ps->wait);
L
Linus Torvalds 已提交
472 473
}

474
static void destroy_async(struct dev_state *ps, struct list_head *list)
L
Linus Torvalds 已提交
475
{
H
Huajun Li 已提交
476
	struct urb *urb;
L
Linus Torvalds 已提交
477 478 479 480 481 482 483
	struct async *as;
	unsigned long flags;

	spin_lock_irqsave(&ps->lock, flags);
	while (!list_empty(list)) {
		as = list_entry(list->next, struct async, asynclist);
		list_del_init(&as->asynclist);
H
Huajun Li 已提交
484 485
		urb = as->urb;
		usb_get_urb(urb);
L
Linus Torvalds 已提交
486 487 488

		/* drop the spinlock so the completion handler can run */
		spin_unlock_irqrestore(&ps->lock, flags);
H
Huajun Li 已提交
489 490
		usb_kill_urb(urb);
		usb_put_urb(urb);
L
Linus Torvalds 已提交
491 492 493 494 495
		spin_lock_irqsave(&ps->lock, flags);
	}
	spin_unlock_irqrestore(&ps->lock, flags);
}

496 497
static void destroy_async_on_interface(struct dev_state *ps,
				       unsigned int ifnum)
L
Linus Torvalds 已提交
498 499 500 501 502 503 504 505 506 507 508 509 510
{
	struct list_head *p, *q, hitlist;
	unsigned long flags;

	INIT_LIST_HEAD(&hitlist);
	spin_lock_irqsave(&ps->lock, flags);
	list_for_each_safe(p, q, &ps->async_pending)
		if (ifnum == list_entry(p, struct async, asynclist)->ifnum)
			list_move_tail(p, &hitlist);
	spin_unlock_irqrestore(&ps->lock, flags);
	destroy_async(ps, &hitlist);
}

511
static void destroy_all_async(struct dev_state *ps)
L
Linus Torvalds 已提交
512
{
513
	destroy_async(ps, &ps->async_pending);
L
Linus Torvalds 已提交
514 515 516 517 518 519 520 521
}

/*
 * interface claims are made only at the request of user level code,
 * which can also release them (explicitly or by closing files).
 * they're also undone when devices disconnect.
 */

522 523
static int driver_probe(struct usb_interface *intf,
			const struct usb_device_id *id)
L
Linus Torvalds 已提交
524 525 526 527 528 529
{
	return -ENODEV;
}

static void driver_disconnect(struct usb_interface *intf)
{
530
	struct dev_state *ps = usb_get_intfdata(intf);
L
Linus Torvalds 已提交
531 532 533 534 535 536 537 538 539 540 541 542
	unsigned int ifnum = intf->altsetting->desc.bInterfaceNumber;

	if (!ps)
		return;

	/* NOTE:  this relies on usbcore having canceled and completed
	 * all pending I/O requests; 2.6 does that.
	 */

	if (likely(ifnum < 8*sizeof(ps->ifclaimed)))
		clear_bit(ifnum, &ps->ifclaimed);
	else
543 544
		dev_warn(&intf->dev, "interface number %u out of range\n",
			 ifnum);
L
Linus Torvalds 已提交
545

546
	usb_set_intfdata(intf, NULL);
L
Linus Torvalds 已提交
547 548 549 550 551

	/* force async requests to complete */
	destroy_async_on_interface(ps, ifnum);
}

552 553 554 555 556 557 558 559 560 561 562 563 564
/* The following routines are merely placeholders.  There is no way
 * to inform a user task about suspend or resumes.
 */
static int driver_suspend(struct usb_interface *intf, pm_message_t msg)
{
	return 0;
}

static int driver_resume(struct usb_interface *intf)
{
	return 0;
}

L
Linus Torvalds 已提交
565 566 567 568
struct usb_driver usbfs_driver = {
	.name =		"usbfs",
	.probe =	driver_probe,
	.disconnect =	driver_disconnect,
569 570
	.suspend =	driver_suspend,
	.resume =	driver_resume,
L
Linus Torvalds 已提交
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
};

static int claimintf(struct dev_state *ps, unsigned int ifnum)
{
	struct usb_device *dev = ps->dev;
	struct usb_interface *intf;
	int err;

	if (ifnum >= 8*sizeof(ps->ifclaimed))
		return -EINVAL;
	/* already claimed */
	if (test_bit(ifnum, &ps->ifclaimed))
		return 0;

	intf = usb_ifnum_to_if(dev, ifnum);
	if (!intf)
		err = -ENOENT;
	else
		err = usb_driver_claim_interface(&usbfs_driver, intf, ps);
	if (err == 0)
		set_bit(ifnum, &ps->ifclaimed);
	return err;
}

static int releaseintf(struct dev_state *ps, unsigned int ifnum)
{
	struct usb_device *dev;
	struct usb_interface *intf;
	int err;

	err = -EINVAL;
	if (ifnum >= 8*sizeof(ps->ifclaimed))
		return err;
	dev = ps->dev;
	intf = usb_ifnum_to_if(dev, ifnum);
	if (!intf)
		err = -ENOENT;
	else if (test_and_clear_bit(ifnum, &ps->ifclaimed)) {
		usb_driver_release_interface(&usbfs_driver, intf);
		err = 0;
	}
	return err;
}

static int checkintf(struct dev_state *ps, unsigned int ifnum)
{
	if (ps->dev->state != USB_STATE_CONFIGURED)
		return -EHOSTUNREACH;
	if (ifnum >= 8*sizeof(ps->ifclaimed))
		return -EINVAL;
	if (test_bit(ifnum, &ps->ifclaimed))
		return 0;
	/* if not yet claimed, claim it for the driver */
624 625 626
	dev_warn(&ps->dev->dev, "usbfs: process %d (%s) did not claim "
		 "interface %u before use\n", task_pid_nr(current),
		 current->comm, ifnum);
L
Linus Torvalds 已提交
627 628 629 630 631 632
	return claimintf(ps, ifnum);
}

static int findintfep(struct usb_device *dev, unsigned int ep)
{
	unsigned int i, j, e;
633
	struct usb_interface *intf;
L
Linus Torvalds 已提交
634 635 636 637 638 639 640 641 642 643
	struct usb_host_interface *alts;
	struct usb_endpoint_descriptor *endpt;

	if (ep & ~(USB_DIR_IN|0xf))
		return -EINVAL;
	if (!dev->actconfig)
		return -ESRCH;
	for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
		intf = dev->actconfig->interface[i];
		for (j = 0; j < intf->num_altsetting; j++) {
644
			alts = &intf->altsetting[j];
L
Linus Torvalds 已提交
645 646 647 648 649 650 651
			for (e = 0; e < alts->desc.bNumEndpoints; e++) {
				endpt = &alts->endpoint[e].desc;
				if (endpt->bEndpointAddress == ep)
					return alts->desc.bInterfaceNumber;
			}
		}
	}
652
	return -ENOENT;
L
Linus Torvalds 已提交
653 654
}

655
static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype,
656
			   unsigned int request, unsigned int index)
L
Linus Torvalds 已提交
657 658
{
	int ret = 0;
659
	struct usb_host_interface *alt_setting;
L
Linus Torvalds 已提交
660

661 662
	if (ps->dev->state != USB_STATE_UNAUTHENTICATED
	 && ps->dev->state != USB_STATE_ADDRESS
663
	 && ps->dev->state != USB_STATE_CONFIGURED)
L
Linus Torvalds 已提交
664 665 666 667
		return -EHOSTUNREACH;
	if (USB_TYPE_VENDOR == (USB_TYPE_MASK & requesttype))
		return 0;

668 669 670 671 672 673 674 675 676 677 678 679 680
	/*
	 * check for the special corner case 'get_device_id' in the printer
	 * class specification, where wIndex is (interface << 8 | altsetting)
	 * instead of just interface
	 */
	if (requesttype == 0xa1 && request == 0) {
		alt_setting = usb_find_alt_setting(ps->dev->actconfig,
						   index >> 8, index & 0xff);
		if (alt_setting
		 && alt_setting->desc.bInterfaceClass == USB_CLASS_PRINTER)
			index >>= 8;
	}

L
Linus Torvalds 已提交
681 682 683
	index &= 0xff;
	switch (requesttype & USB_RECIP_MASK) {
	case USB_RECIP_ENDPOINT:
684 685
		ret = findintfep(ps->dev, index);
		if (ret >= 0)
L
Linus Torvalds 已提交
686 687 688 689 690 691 692 693 694 695
			ret = checkintf(ps, ret);
		break;

	case USB_RECIP_INTERFACE:
		ret = checkintf(ps, index);
		break;
	}
	return ret;
}

696
static int match_devt(struct device *dev, void *data)
697
{
698
	return dev->devt == (dev_t) (unsigned long) data;
699
}
700

701
static struct usb_device *usbdev_lookup_by_devt(dev_t devt)
702 703 704
{
	struct device *dev;

705 706
	dev = bus_find_device(&usb_bus_type, NULL,
			      (void *) (unsigned long) devt, match_devt);
707 708 709 710
	if (!dev)
		return NULL;
	return container_of(dev, struct usb_device, dev);
}
711

L
Linus Torvalds 已提交
712 713 714 715 716
/*
 * file operations
 */
static int usbdev_open(struct inode *inode, struct file *file)
{
717
	struct usb_device *dev = NULL;
L
Linus Torvalds 已提交
718 719 720 721
	struct dev_state *ps;
	int ret;

	ret = -ENOMEM;
722 723
	ps = kmalloc(sizeof(struct dev_state), GFP_KERNEL);
	if (!ps)
724
		goto out_free_ps;
L
Linus Torvalds 已提交
725

726
	ret = -ENODEV;
727

728 729 730
	/* Protect against simultaneous removal or release */
	mutex_lock(&usbfs_mutex);

731
	/* usbdev device-node */
732
	if (imajor(inode) == USB_DEVICE_MAJOR)
733
		dev = usbdev_lookup_by_devt(inode->i_rdev);
734 735 736 737 738 739 740 741 742 743

	mutex_unlock(&usbfs_mutex);

	if (!dev)
		goto out_free_ps;

	usb_lock_device(dev);
	if (dev->state == USB_STATE_NOTATTACHED)
		goto out_unlock_device;

744
	ret = usb_autoresume_device(dev);
745
	if (ret)
746
		goto out_unlock_device;
747

L
Linus Torvalds 已提交
748 749 750
	ps->dev = dev;
	ps->file = file;
	spin_lock_init(&ps->lock);
751
	INIT_LIST_HEAD(&ps->list);
L
Linus Torvalds 已提交
752 753 754 755
	INIT_LIST_HEAD(&ps->async_pending);
	INIT_LIST_HEAD(&ps->async_completed);
	init_waitqueue_head(&ps->wait);
	ps->discsignr = 0;
756
	ps->disc_pid = get_pid(task_pid(current));
757
	ps->cred = get_current_cred();
L
Linus Torvalds 已提交
758 759
	ps->disccontext = NULL;
	ps->ifclaimed = 0;
760
	security_task_getsecid(current, &ps->secid);
O
Oliver Neukum 已提交
761
	smp_wmb();
L
Linus Torvalds 已提交
762 763
	list_add_tail(&ps->list, &dev->filelist);
	file->private_data = ps;
764
	usb_unlock_device(dev);
765 766
	snoop(&dev->dev, "opened by process %d: %s\n", task_pid_nr(current),
			current->comm);
767 768 769 770 771 772 773
	return ret;

 out_unlock_device:
	usb_unlock_device(dev);
	usb_put_dev(dev);
 out_free_ps:
	kfree(ps);
774
	return ret;
L
Linus Torvalds 已提交
775 776 777 778
}

static int usbdev_release(struct inode *inode, struct file *file)
{
779
	struct dev_state *ps = file->private_data;
L
Linus Torvalds 已提交
780 781
	struct usb_device *dev = ps->dev;
	unsigned int ifnum;
782
	struct async *as;
L
Linus Torvalds 已提交
783 784

	usb_lock_device(dev);
785
	usb_hub_release_all_ports(dev, ps);
786

L
Linus Torvalds 已提交
787
	list_del_init(&ps->list);
788

L
Linus Torvalds 已提交
789 790 791 792 793 794
	for (ifnum = 0; ps->ifclaimed && ifnum < 8*sizeof(ps->ifclaimed);
			ifnum++) {
		if (test_bit(ifnum, &ps->ifclaimed))
			releaseintf(ps, ifnum);
	}
	destroy_all_async(ps);
795
	usb_autosuspend_device(dev);
L
Linus Torvalds 已提交
796 797
	usb_unlock_device(dev);
	usb_put_dev(dev);
798
	put_pid(ps->disc_pid);
799
	put_cred(ps->cred);
800 801 802 803 804 805

	as = async_getcompleted(ps);
	while (as) {
		free_async(as);
		as = async_getcompleted(ps);
	}
L
Linus Torvalds 已提交
806
	kfree(ps);
807
	return 0;
L
Linus Torvalds 已提交
808 809 810 811 812 813 814 815
}

static int proc_control(struct dev_state *ps, void __user *arg)
{
	struct usb_device *dev = ps->dev;
	struct usbdevfs_ctrltransfer ctrl;
	unsigned int tmo;
	unsigned char *tbuf;
816
	unsigned wLength;
817
	int i, pipe, ret;
L
Linus Torvalds 已提交
818 819 820

	if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
		return -EFAULT;
821 822
	ret = check_ctrlrecip(ps, ctrl.bRequestType, ctrl.bRequest,
			      ctrl.wIndex);
823
	if (ret)
L
Linus Torvalds 已提交
824
		return ret;
825 826
	wLength = ctrl.wLength;		/* To suppress 64k PAGE_SIZE warning */
	if (wLength > PAGE_SIZE)
L
Linus Torvalds 已提交
827
		return -EINVAL;
828 829 830 831
	ret = usbfs_increase_memory_usage(PAGE_SIZE + sizeof(struct urb) +
			sizeof(struct usb_ctrlrequest));
	if (ret)
		return ret;
832
	tbuf = (unsigned char *)__get_free_page(GFP_KERNEL);
833 834 835 836
	if (!tbuf) {
		ret = -ENOMEM;
		goto done;
	}
L
Linus Torvalds 已提交
837
	tmo = ctrl.timeout;
838 839 840 841 842 843 844
	snoop(&dev->dev, "control urb: bRequestType=%02x "
		"bRequest=%02x wValue=%04x "
		"wIndex=%04x wLength=%04x\n",
		ctrl.bRequestType, ctrl.bRequest,
		__le16_to_cpup(&ctrl.wValue),
		__le16_to_cpup(&ctrl.wIndex),
		__le16_to_cpup(&ctrl.wLength));
L
Linus Torvalds 已提交
845
	if (ctrl.bRequestType & 0x80) {
846 847
		if (ctrl.wLength && !access_ok(VERIFY_WRITE, ctrl.data,
					       ctrl.wLength)) {
848 849
			ret = -EINVAL;
			goto done;
L
Linus Torvalds 已提交
850
		}
851
		pipe = usb_rcvctrlpipe(dev, 0);
852
		snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT, NULL, 0);
L
Linus Torvalds 已提交
853 854

		usb_unlock_device(dev);
855
		i = usb_control_msg(dev, pipe, ctrl.bRequest,
856 857
				    ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
				    tbuf, ctrl.wLength, tmo);
L
Linus Torvalds 已提交
858
		usb_lock_device(dev);
859
		snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE,
860
			  tbuf, max(i, 0));
L
Linus Torvalds 已提交
861
		if ((i > 0) && ctrl.wLength) {
862
			if (copy_to_user(ctrl.data, tbuf, i)) {
863 864
				ret = -EFAULT;
				goto done;
L
Linus Torvalds 已提交
865 866 867 868 869
			}
		}
	} else {
		if (ctrl.wLength) {
			if (copy_from_user(tbuf, ctrl.data, ctrl.wLength)) {
870 871
				ret = -EFAULT;
				goto done;
L
Linus Torvalds 已提交
872 873
			}
		}
874
		pipe = usb_sndctrlpipe(dev, 0);
875 876
		snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT,
			tbuf, ctrl.wLength);
877

L
Linus Torvalds 已提交
878
		usb_unlock_device(dev);
879 880 881
		i = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ctrl.bRequest,
				    ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
				    tbuf, ctrl.wLength, tmo);
L
Linus Torvalds 已提交
882
		usb_lock_device(dev);
883
		snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE, NULL, 0);
L
Linus Torvalds 已提交
884
	}
885
	if (i < 0 && i != -EPIPE) {
L
Linus Torvalds 已提交
886 887 888 889 890
		dev_printk(KERN_DEBUG, &dev->dev, "usbfs: USBDEVFS_CONTROL "
			   "failed cmd %s rqt %u rq %u len %u ret %d\n",
			   current->comm, ctrl.bRequestType, ctrl.bRequest,
			   ctrl.wLength, i);
	}
891 892 893
	ret = i;
 done:
	free_page((unsigned long) tbuf);
894 895
	usbfs_decrease_memory_usage(PAGE_SIZE + sizeof(struct urb) +
			sizeof(struct usb_ctrlrequest));
896
	return ret;
L
Linus Torvalds 已提交
897 898 899 900 901 902 903 904 905
}

static int proc_bulk(struct dev_state *ps, void __user *arg)
{
	struct usb_device *dev = ps->dev;
	struct usbdevfs_bulktransfer bulk;
	unsigned int tmo, len1, pipe;
	int len2;
	unsigned char *tbuf;
906
	int i, ret;
L
Linus Torvalds 已提交
907 908 909

	if (copy_from_user(&bulk, arg, sizeof(bulk)))
		return -EFAULT;
910 911
	ret = findintfep(ps->dev, bulk.ep);
	if (ret < 0)
L
Linus Torvalds 已提交
912
		return ret;
913 914
	ret = checkintf(ps, ret);
	if (ret)
L
Linus Torvalds 已提交
915 916 917 918 919 920 921 922
		return ret;
	if (bulk.ep & USB_DIR_IN)
		pipe = usb_rcvbulkpipe(dev, bulk.ep & 0x7f);
	else
		pipe = usb_sndbulkpipe(dev, bulk.ep & 0x7f);
	if (!usb_maxpacket(dev, pipe, !(bulk.ep & USB_DIR_IN)))
		return -EINVAL;
	len1 = bulk.len;
923
	if (len1 >= USBFS_XFER_MAX)
L
Linus Torvalds 已提交
924
		return -EINVAL;
925 926 927 928 929 930 931
	ret = usbfs_increase_memory_usage(len1 + sizeof(struct urb));
	if (ret)
		return ret;
	if (!(tbuf = kmalloc(len1, GFP_KERNEL))) {
		ret = -ENOMEM;
		goto done;
	}
L
Linus Torvalds 已提交
932 933 934
	tmo = bulk.timeout;
	if (bulk.ep & 0x80) {
		if (len1 && !access_ok(VERIFY_WRITE, bulk.data, len1)) {
935 936
			ret = -EINVAL;
			goto done;
L
Linus Torvalds 已提交
937
		}
938
		snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT, NULL, 0);
939

L
Linus Torvalds 已提交
940 941 942
		usb_unlock_device(dev);
		i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
		usb_lock_device(dev);
943
		snoop_urb(dev, NULL, pipe, len2, i, COMPLETE, tbuf, len2);
944

L
Linus Torvalds 已提交
945 946
		if (!i && len2) {
			if (copy_to_user(bulk.data, tbuf, len2)) {
947 948
				ret = -EFAULT;
				goto done;
L
Linus Torvalds 已提交
949 950 951 952 953
			}
		}
	} else {
		if (len1) {
			if (copy_from_user(tbuf, bulk.data, len1)) {
954 955
				ret = -EFAULT;
				goto done;
L
Linus Torvalds 已提交
956 957
			}
		}
958
		snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT, tbuf, len1);
959

L
Linus Torvalds 已提交
960 961 962
		usb_unlock_device(dev);
		i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
		usb_lock_device(dev);
963
		snoop_urb(dev, NULL, pipe, len2, i, COMPLETE, NULL, 0);
L
Linus Torvalds 已提交
964
	}
965 966
	ret = (i < 0 ? i : len2);
 done:
L
Linus Torvalds 已提交
967
	kfree(tbuf);
968
	usbfs_decrease_memory_usage(len1 + sizeof(struct urb));
969
	return ret;
L
Linus Torvalds 已提交
970 971 972 973 974 975 976 977 978
}

static int proc_resetep(struct dev_state *ps, void __user *arg)
{
	unsigned int ep;
	int ret;

	if (get_user(ep, (unsigned int __user *)arg))
		return -EFAULT;
979 980
	ret = findintfep(ps->dev, ep);
	if (ret < 0)
L
Linus Torvalds 已提交
981
		return ret;
982 983
	ret = checkintf(ps, ret);
	if (ret)
L
Linus Torvalds 已提交
984
		return ret;
985
	usb_reset_endpoint(ps->dev, ep);
L
Linus Torvalds 已提交
986 987 988 989 990 991 992 993 994 995 996
	return 0;
}

static int proc_clearhalt(struct dev_state *ps, void __user *arg)
{
	unsigned int ep;
	int pipe;
	int ret;

	if (get_user(ep, (unsigned int __user *)arg))
		return -EFAULT;
997 998
	ret = findintfep(ps->dev, ep);
	if (ret < 0)
L
Linus Torvalds 已提交
999
		return ret;
1000 1001
	ret = checkintf(ps, ret);
	if (ret)
L
Linus Torvalds 已提交
1002 1003
		return ret;
	if (ep & USB_DIR_IN)
1004 1005 1006
		pipe = usb_rcvbulkpipe(ps->dev, ep & 0x7f);
	else
		pipe = usb_sndbulkpipe(ps->dev, ep & 0x7f);
L
Linus Torvalds 已提交
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031

	return usb_clear_halt(ps->dev, pipe);
}

static int proc_getdriver(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_getdriver gd;
	struct usb_interface *intf;
	int ret;

	if (copy_from_user(&gd, arg, sizeof(gd)))
		return -EFAULT;
	intf = usb_ifnum_to_if(ps->dev, gd.interface);
	if (!intf || !intf->dev.driver)
		ret = -ENODATA;
	else {
		strncpy(gd.driver, intf->dev.driver->name,
				sizeof(gd.driver));
		ret = (copy_to_user(arg, &gd, sizeof(gd)) ? -EFAULT : 0);
	}
	return ret;
}

static int proc_connectinfo(struct dev_state *ps, void __user *arg)
{
1032 1033 1034 1035
	struct usbdevfs_connectinfo ci = {
		.devnum = ps->dev->devnum,
		.slow = ps->dev->speed == USB_SPEED_LOW
	};
L
Linus Torvalds 已提交
1036 1037 1038 1039 1040 1041 1042 1043

	if (copy_to_user(arg, &ci, sizeof(ci)))
		return -EFAULT;
	return 0;
}

static int proc_resetdevice(struct dev_state *ps)
{
1044
	return usb_reset_device(ps->dev);
L
Linus Torvalds 已提交
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
}

static int proc_setintf(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_setinterface setintf;
	int ret;

	if (copy_from_user(&setintf, arg, sizeof(setintf)))
		return -EFAULT;
	if ((ret = checkintf(ps, setintf.interface)))
		return ret;
	return usb_set_interface(ps->dev, setintf.interface,
			setintf.altsetting);
}

static int proc_setconfig(struct dev_state *ps, void __user *arg)
{
1062
	int u;
L
Linus Torvalds 已提交
1063
	int status = 0;
1064
	struct usb_host_config *actconfig;
L
Linus Torvalds 已提交
1065

1066
	if (get_user(u, (int __user *)arg))
L
Linus Torvalds 已提交
1067 1068
		return -EFAULT;

1069 1070 1071 1072
	actconfig = ps->dev->actconfig;

	/* Don't touch the device if any interfaces are claimed.
	 * It could interfere with other drivers' operations, and if
L
Linus Torvalds 已提交
1073 1074
	 * an interface is claimed by usbfs it could easily deadlock.
	 */
1075 1076 1077 1078 1079 1080
	if (actconfig) {
		int i;

		for (i = 0; i < actconfig->desc.bNumInterfaces; ++i) {
			if (usb_interface_claimed(actconfig->interface[i])) {
				dev_warn(&ps->dev->dev,
1081
					"usbfs: interface %d claimed by %s "
L
Linus Torvalds 已提交
1082 1083 1084 1085
					"while '%s' sets config #%d\n",
					actconfig->interface[i]
						->cur_altsetting
						->desc.bInterfaceNumber,
1086 1087
					actconfig->interface[i]
						->dev.driver->name,
L
Linus Torvalds 已提交
1088
					current->comm, u);
1089
				status = -EBUSY;
L
Linus Torvalds 已提交
1090 1091
				break;
			}
1092 1093
		}
	}
L
Linus Torvalds 已提交
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108

	/* SET_CONFIGURATION is often abused as a "cheap" driver reset,
	 * so avoid usb_set_configuration()'s kick to sysfs
	 */
	if (status == 0) {
		if (actconfig && actconfig->desc.bConfigurationValue == u)
			status = usb_reset_configuration(ps->dev);
		else
			status = usb_set_configuration(ps->dev, u);
	}

	return status;
}

static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
1109 1110
			struct usbdevfs_iso_packet_desc __user *iso_frame_desc,
			void __user *arg)
L
Linus Torvalds 已提交
1111 1112 1113
{
	struct usbdevfs_iso_packet_desc *isopkt = NULL;
	struct usb_host_endpoint *ep;
1114
	struct async *as = NULL;
L
Linus Torvalds 已提交
1115 1116
	struct usb_ctrlrequest *dr = NULL;
	unsigned int u, totlen, isofrmlen;
1117
	int ret, ifnum = -1;
A
Alan Stern 已提交
1118
	int is_in;
L
Linus Torvalds 已提交
1119

1120 1121
	if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP |
				USBDEVFS_URB_SHORT_NOT_OK |
1122
				USBDEVFS_URB_BULK_CONTINUATION |
1123 1124 1125
				USBDEVFS_URB_NO_FSBR |
				USBDEVFS_URB_ZERO_PACKET |
				USBDEVFS_URB_NO_INTERRUPT))
L
Linus Torvalds 已提交
1126
		return -EINVAL;
1127
	if (uurb->buffer_length > 0 && !uurb->buffer)
L
Linus Torvalds 已提交
1128
		return -EINVAL;
1129 1130 1131 1132
	if (!(uurb->type == USBDEVFS_URB_TYPE_CONTROL &&
	    (uurb->endpoint & ~USB_ENDPOINT_DIR_MASK) == 0)) {
		ifnum = findintfep(ps->dev, uurb->endpoint);
		if (ifnum < 0)
L
Linus Torvalds 已提交
1133
			return ifnum;
1134 1135
		ret = checkintf(ps, ifnum);
		if (ret)
L
Linus Torvalds 已提交
1136 1137
			return ret;
	}
A
Alan Stern 已提交
1138 1139 1140 1141 1142 1143 1144
	if ((uurb->endpoint & USB_ENDPOINT_DIR_MASK) != 0) {
		is_in = 1;
		ep = ps->dev->ep_in[uurb->endpoint & USB_ENDPOINT_NUMBER_MASK];
	} else {
		is_in = 0;
		ep = ps->dev->ep_out[uurb->endpoint & USB_ENDPOINT_NUMBER_MASK];
	}
L
Linus Torvalds 已提交
1145 1146
	if (!ep)
		return -ENOENT;
1147 1148

	u = 0;
L
Linus Torvalds 已提交
1149 1150
	switch(uurb->type) {
	case USBDEVFS_URB_TYPE_CONTROL:
A
Alan Stern 已提交
1151
		if (!usb_endpoint_xfer_control(&ep->desc))
L
Linus Torvalds 已提交
1152
			return -EINVAL;
1153 1154
		/* min 8 byte setup packet */
		if (uurb->buffer_length < 8)
L
Linus Torvalds 已提交
1155
			return -EINVAL;
1156 1157
		dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
		if (!dr)
L
Linus Torvalds 已提交
1158 1159
			return -ENOMEM;
		if (copy_from_user(dr, uurb->buffer, 8)) {
1160 1161
			ret = -EFAULT;
			goto error;
L
Linus Torvalds 已提交
1162 1163
		}
		if (uurb->buffer_length < (le16_to_cpup(&dr->wLength) + 8)) {
1164 1165
			ret = -EINVAL;
			goto error;
L
Linus Torvalds 已提交
1166
		}
1167
		ret = check_ctrlrecip(ps, dr->bRequestType, dr->bRequest,
1168
				      le16_to_cpup(&dr->wIndex));
1169 1170
		if (ret)
			goto error;
L
Linus Torvalds 已提交
1171 1172 1173
		uurb->number_of_packets = 0;
		uurb->buffer_length = le16_to_cpup(&dr->wLength);
		uurb->buffer += 8;
A
Alan Stern 已提交
1174 1175 1176 1177 1178 1179 1180
		if ((dr->bRequestType & USB_DIR_IN) && uurb->buffer_length) {
			is_in = 1;
			uurb->endpoint |= USB_DIR_IN;
		} else {
			is_in = 0;
			uurb->endpoint &= ~USB_DIR_IN;
		}
1181 1182 1183 1184 1185 1186 1187
		snoop(&ps->dev->dev, "control urb: bRequestType=%02x "
			"bRequest=%02x wValue=%04x "
			"wIndex=%04x wLength=%04x\n",
			dr->bRequestType, dr->bRequest,
			__le16_to_cpup(&dr->wValue),
			__le16_to_cpup(&dr->wIndex),
			__le16_to_cpup(&dr->wLength));
1188
		u = sizeof(struct usb_ctrlrequest);
L
Linus Torvalds 已提交
1189 1190 1191
		break;

	case USBDEVFS_URB_TYPE_BULK:
A
Alan Stern 已提交
1192
		switch (usb_endpoint_type(&ep->desc)) {
L
Linus Torvalds 已提交
1193 1194 1195
		case USB_ENDPOINT_XFER_CONTROL:
		case USB_ENDPOINT_XFER_ISOC:
			return -EINVAL;
1196 1197 1198 1199
		case USB_ENDPOINT_XFER_INT:
			/* allow single-shot interrupt transfers */
			uurb->type = USBDEVFS_URB_TYPE_INTERRUPT;
			goto interrupt_urb;
L
Linus Torvalds 已提交
1200 1201 1202 1203
		}
		uurb->number_of_packets = 0;
		break;

1204 1205 1206 1207 1208 1209 1210
	case USBDEVFS_URB_TYPE_INTERRUPT:
		if (!usb_endpoint_xfer_int(&ep->desc))
			return -EINVAL;
 interrupt_urb:
		uurb->number_of_packets = 0;
		break;

L
Linus Torvalds 已提交
1211 1212
	case USBDEVFS_URB_TYPE_ISO:
		/* arbitrary limit */
1213 1214
		if (uurb->number_of_packets < 1 ||
		    uurb->number_of_packets > 128)
L
Linus Torvalds 已提交
1215
			return -EINVAL;
A
Alan Stern 已提交
1216
		if (!usb_endpoint_xfer_isoc(&ep->desc))
L
Linus Torvalds 已提交
1217
			return -EINVAL;
1218 1219
		isofrmlen = sizeof(struct usbdevfs_iso_packet_desc) *
				   uurb->number_of_packets;
L
Linus Torvalds 已提交
1220 1221 1222
		if (!(isopkt = kmalloc(isofrmlen, GFP_KERNEL)))
			return -ENOMEM;
		if (copy_from_user(isopkt, iso_frame_desc, isofrmlen)) {
1223 1224
			ret = -EFAULT;
			goto error;
L
Linus Torvalds 已提交
1225 1226
		}
		for (totlen = u = 0; u < uurb->number_of_packets; u++) {
1227 1228
			/* arbitrary limit,
			 * sufficient for USB 2.0 high-bandwidth iso */
1229
			if (isopkt[u].length > 8192) {
1230 1231
				ret = -EINVAL;
				goto error;
L
Linus Torvalds 已提交
1232 1233 1234
			}
			totlen += isopkt[u].length;
		}
1235
		u *= sizeof(struct usb_iso_packet_descriptor);
L
Linus Torvalds 已提交
1236 1237 1238 1239 1240 1241
		uurb->buffer_length = totlen;
		break;

	default:
		return -EINVAL;
	}
1242

1243
	if (uurb->buffer_length >= USBFS_XFER_MAX) {
1244 1245 1246
		ret = -EINVAL;
		goto error;
	}
1247 1248 1249
	if (uurb->buffer_length > 0 &&
			!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
				uurb->buffer, uurb->buffer_length)) {
1250 1251
		ret = -EFAULT;
		goto error;
L
Linus Torvalds 已提交
1252
	}
1253 1254
	as = alloc_async(uurb->number_of_packets);
	if (!as) {
1255 1256
		ret = -ENOMEM;
		goto error;
L
Linus Torvalds 已提交
1257
	}
1258 1259 1260 1261 1262 1263
	u += sizeof(struct async) + sizeof(struct urb) + uurb->buffer_length;
	ret = usbfs_increase_memory_usage(u);
	if (ret)
		goto error;
	as->mem_usage = u;

1264 1265 1266 1267
	if (uurb->buffer_length > 0) {
		as->urb->transfer_buffer = kmalloc(uurb->buffer_length,
				GFP_KERNEL);
		if (!as->urb->transfer_buffer) {
1268 1269
			ret = -ENOMEM;
			goto error;
1270
		}
A
Alan Stern 已提交
1271 1272 1273 1274 1275 1276 1277
		/* Isochronous input data may end up being discontiguous
		 * if some of the packets are short.  Clear the buffer so
		 * that the gaps don't leak kernel data to userspace.
		 */
		if (is_in && uurb->type == USBDEVFS_URB_TYPE_ISO)
			memset(as->urb->transfer_buffer, 0,
					uurb->buffer_length);
1278
	}
1279 1280
	as->urb->dev = ps->dev;
	as->urb->pipe = (uurb->type << 30) |
A
Alan Stern 已提交
1281 1282
			__create_pipe(ps->dev, uurb->endpoint & 0xf) |
			(uurb->endpoint & USB_DIR_IN);
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300

	/* This tedious sequence is necessary because the URB_* flags
	 * are internal to the kernel and subject to change, whereas
	 * the USBDEVFS_URB_* flags are a user API and must not be changed.
	 */
	u = (is_in ? URB_DIR_IN : URB_DIR_OUT);
	if (uurb->flags & USBDEVFS_URB_ISO_ASAP)
		u |= URB_ISO_ASAP;
	if (uurb->flags & USBDEVFS_URB_SHORT_NOT_OK)
		u |= URB_SHORT_NOT_OK;
	if (uurb->flags & USBDEVFS_URB_NO_FSBR)
		u |= URB_NO_FSBR;
	if (uurb->flags & USBDEVFS_URB_ZERO_PACKET)
		u |= URB_ZERO_PACKET;
	if (uurb->flags & USBDEVFS_URB_NO_INTERRUPT)
		u |= URB_NO_INTERRUPT;
	as->urb->transfer_flags = u;

L
Linus Torvalds 已提交
1301
	as->urb->transfer_buffer_length = uurb->buffer_length;
1302
	as->urb->setup_packet = (unsigned char *)dr;
1303
	dr = NULL;
L
Linus Torvalds 已提交
1304 1305
	as->urb->start_frame = uurb->start_frame;
	as->urb->number_of_packets = uurb->number_of_packets;
1306 1307 1308 1309 1310
	if (uurb->type == USBDEVFS_URB_TYPE_ISO ||
			ps->dev->speed == USB_SPEED_HIGH)
		as->urb->interval = 1 << min(15, ep->desc.bInterval - 1);
	else
		as->urb->interval = ep->desc.bInterval;
1311 1312
	as->urb->context = as;
	as->urb->complete = async_completed;
L
Linus Torvalds 已提交
1313 1314 1315 1316 1317
	for (totlen = u = 0; u < uurb->number_of_packets; u++) {
		as->urb->iso_frame_desc[u].offset = totlen;
		as->urb->iso_frame_desc[u].length = isopkt[u].length;
		totlen += isopkt[u].length;
	}
1318
	kfree(isopkt);
1319
	isopkt = NULL;
L
Linus Torvalds 已提交
1320
	as->ps = ps;
1321
	as->userurb = arg;
1322
	if (is_in && uurb->buffer_length > 0)
L
Linus Torvalds 已提交
1323 1324 1325 1326 1327
		as->userbuffer = uurb->buffer;
	else
		as->userbuffer = NULL;
	as->signr = uurb->signr;
	as->ifnum = ifnum;
1328
	as->pid = get_pid(task_pid(current));
1329
	as->cred = get_current_cred();
1330
	security_task_getsecid(current, &as->secid);
1331
	if (!is_in && uurb->buffer_length > 0) {
A
Alan Stern 已提交
1332
		if (copy_from_user(as->urb->transfer_buffer, uurb->buffer,
1333
				uurb->buffer_length)) {
1334 1335
			ret = -EFAULT;
			goto error;
L
Linus Torvalds 已提交
1336 1337
		}
	}
1338
	snoop_urb(ps->dev, as->userurb, as->urb->pipe,
1339 1340 1341
			as->urb->transfer_buffer_length, 0, SUBMIT,
			is_in ? NULL : as->urb->transfer_buffer,
				uurb->buffer_length);
1342
	async_newpending(as);
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375

	if (usb_endpoint_xfer_bulk(&ep->desc)) {
		spin_lock_irq(&ps->lock);

		/* Not exactly the endpoint address; the direction bit is
		 * shifted to the 0x10 position so that the value will be
		 * between 0 and 31.
		 */
		as->bulk_addr = usb_endpoint_num(&ep->desc) |
			((ep->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK)
				>> 3);

		/* If this bulk URB is the start of a new transfer, re-enable
		 * the endpoint.  Otherwise mark it as a continuation URB.
		 */
		if (uurb->flags & USBDEVFS_URB_BULK_CONTINUATION)
			as->bulk_status = AS_CONTINUATION;
		else
			ps->disabled_bulk_eps &= ~(1 << as->bulk_addr);

		/* Don't accept continuation URBs if the endpoint is
		 * disabled because of an earlier error.
		 */
		if (ps->disabled_bulk_eps & (1 << as->bulk_addr))
			ret = -EREMOTEIO;
		else
			ret = usb_submit_urb(as->urb, GFP_ATOMIC);
		spin_unlock_irq(&ps->lock);
	} else {
		ret = usb_submit_urb(as->urb, GFP_KERNEL);
	}

	if (ret) {
1376 1377
		dev_printk(KERN_DEBUG, &ps->dev->dev,
			   "usbfs: usb_submit_urb returned %d\n", ret);
1378
		snoop_urb(ps->dev, as->userurb, as->urb->pipe,
1379
				0, ret, COMPLETE, NULL, 0);
1380
		async_removepending(as);
1381
		goto error;
1382 1383
	}
	return 0;
1384 1385 1386 1387 1388 1389 1390

 error:
	kfree(isopkt);
	kfree(dr);
	if (as)
		free_async(as);
	return ret;
L
Linus Torvalds 已提交
1391 1392 1393 1394 1395 1396 1397 1398 1399
}

static int proc_submiturb(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_urb uurb;

	if (copy_from_user(&uurb, arg, sizeof(uurb)))
		return -EFAULT;

1400 1401 1402
	return proc_do_submiturb(ps, &uurb,
			(((struct usbdevfs_urb __user *)arg)->iso_frame_desc),
			arg);
L
Linus Torvalds 已提交
1403 1404 1405 1406
}

static int proc_unlinkurb(struct dev_state *ps, void __user *arg)
{
H
Huajun Li 已提交
1407
	struct urb *urb;
L
Linus Torvalds 已提交
1408
	struct async *as;
H
Huajun Li 已提交
1409
	unsigned long flags;
L
Linus Torvalds 已提交
1410

H
Huajun Li 已提交
1411
	spin_lock_irqsave(&ps->lock, flags);
L
Linus Torvalds 已提交
1412
	as = async_getpending(ps, arg);
H
Huajun Li 已提交
1413 1414
	if (!as) {
		spin_unlock_irqrestore(&ps->lock, flags);
L
Linus Torvalds 已提交
1415
		return -EINVAL;
H
Huajun Li 已提交
1416 1417 1418 1419 1420 1421 1422 1423 1424
	}

	urb = as->urb;
	usb_get_urb(urb);
	spin_unlock_irqrestore(&ps->lock, flags);

	usb_kill_urb(urb);
	usb_put_urb(urb);

L
Linus Torvalds 已提交
1425 1426 1427 1428 1429 1430 1431 1432 1433 1434
	return 0;
}

static int processcompl(struct async *as, void __user * __user *arg)
{
	struct urb *urb = as->urb;
	struct usbdevfs_urb __user *userurb = as->userurb;
	void __user *addr = as->userurb;
	unsigned int i;

A
Alan Stern 已提交
1435 1436 1437 1438 1439 1440
	if (as->userbuffer && urb->actual_length) {
		if (urb->number_of_packets > 0)		/* Isochronous */
			i = urb->transfer_buffer_length;
		else					/* Non-Isoc */
			i = urb->actual_length;
		if (copy_to_user(as->userbuffer, urb->transfer_buffer, i))
O
Oliver Neukum 已提交
1441
			goto err_out;
A
Alan Stern 已提交
1442
	}
1443
	if (put_user(as->status, &userurb->status))
O
Oliver Neukum 已提交
1444
		goto err_out;
L
Linus Torvalds 已提交
1445
	if (put_user(urb->actual_length, &userurb->actual_length))
O
Oliver Neukum 已提交
1446
		goto err_out;
L
Linus Torvalds 已提交
1447
	if (put_user(urb->error_count, &userurb->error_count))
O
Oliver Neukum 已提交
1448
		goto err_out;
L
Linus Torvalds 已提交
1449

A
Alan Stern 已提交
1450
	if (usb_endpoint_xfer_isoc(&urb->ep->desc)) {
1451 1452 1453
		for (i = 0; i < urb->number_of_packets; i++) {
			if (put_user(urb->iso_frame_desc[i].actual_length,
				     &userurb->iso_frame_desc[i].actual_length))
O
Oliver Neukum 已提交
1454
				goto err_out;
1455 1456
			if (put_user(urb->iso_frame_desc[i].status,
				     &userurb->iso_frame_desc[i].status))
O
Oliver Neukum 已提交
1457
				goto err_out;
1458
		}
L
Linus Torvalds 已提交
1459 1460 1461 1462 1463
	}

	if (put_user(addr, (void __user * __user *)arg))
		return -EFAULT;
	return 0;
O
Oliver Neukum 已提交
1464 1465 1466

err_out:
	return -EFAULT;
L
Linus Torvalds 已提交
1467 1468
}

1469
static struct async *reap_as(struct dev_state *ps)
L
Linus Torvalds 已提交
1470
{
1471
	DECLARE_WAITQUEUE(wait, current);
L
Linus Torvalds 已提交
1472 1473 1474 1475 1476 1477
	struct async *as = NULL;
	struct usb_device *dev = ps->dev;

	add_wait_queue(&ps->wait, &wait);
	for (;;) {
		__set_current_state(TASK_INTERRUPTIBLE);
1478 1479
		as = async_getcompleted(ps);
		if (as)
L
Linus Torvalds 已提交
1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
			break;
		if (signal_pending(current))
			break;
		usb_unlock_device(dev);
		schedule();
		usb_lock_device(dev);
	}
	remove_wait_queue(&ps->wait, &wait);
	set_current_state(TASK_RUNNING);
	return as;
}

static int proc_reapurb(struct dev_state *ps, void __user *arg)
{
	struct async *as = reap_as(ps);
1495 1496 1497 1498 1499
	if (as) {
		int retval = processcompl(as, (void __user * __user *)arg);
		free_async(as);
		return retval;
	}
L
Linus Torvalds 已提交
1500 1501 1502 1503 1504 1505 1506
	if (signal_pending(current))
		return -EINTR;
	return -EIO;
}

static int proc_reapurbnonblock(struct dev_state *ps, void __user *arg)
{
1507
	int retval;
L
Linus Torvalds 已提交
1508 1509
	struct async *as;

1510 1511 1512 1513 1514 1515 1516
	as = async_getcompleted(ps);
	retval = -EAGAIN;
	if (as) {
		retval = processcompl(as, (void __user * __user *)arg);
		free_async(as);
	}
	return retval;
L
Linus Torvalds 已提交
1517 1518 1519
}

#ifdef CONFIG_COMPAT
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
static int proc_control_compat(struct dev_state *ps,
				struct usbdevfs_ctrltransfer32 __user *p32)
{
        struct usbdevfs_ctrltransfer __user *p;
        __u32 udata;
        p = compat_alloc_user_space(sizeof(*p));
        if (copy_in_user(p, p32, (sizeof(*p32) - sizeof(compat_caddr_t))) ||
            get_user(udata, &p32->data) ||
	    put_user(compat_ptr(udata), &p->data))
		return -EFAULT;
        return proc_control(ps, p);
}

static int proc_bulk_compat(struct dev_state *ps,
			struct usbdevfs_bulktransfer32 __user *p32)
{
        struct usbdevfs_bulktransfer __user *p;
        compat_uint_t n;
        compat_caddr_t addr;

        p = compat_alloc_user_space(sizeof(*p));

        if (get_user(n, &p32->ep) || put_user(n, &p->ep) ||
            get_user(n, &p32->len) || put_user(n, &p->len) ||
            get_user(n, &p32->timeout) || put_user(n, &p->timeout) ||
            get_user(addr, &p32->data) || put_user(compat_ptr(addr), &p->data))
                return -EFAULT;

        return proc_bulk(ps, p);
}
static int proc_disconnectsignal_compat(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_disconnectsignal32 ds;

	if (copy_from_user(&ds, arg, sizeof(ds)))
		return -EFAULT;
	ps->discsignr = ds.signr;
	ps->disccontext = compat_ptr(ds.context);
	return 0;
}
L
Linus Torvalds 已提交
1560 1561 1562 1563 1564

static int get_urb32(struct usbdevfs_urb *kurb,
		     struct usbdevfs_urb32 __user *uurb)
{
	__u32  uptr;
1565 1566
	if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
	    __get_user(kurb->type, &uurb->type) ||
L
Linus Torvalds 已提交
1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580
	    __get_user(kurb->endpoint, &uurb->endpoint) ||
	    __get_user(kurb->status, &uurb->status) ||
	    __get_user(kurb->flags, &uurb->flags) ||
	    __get_user(kurb->buffer_length, &uurb->buffer_length) ||
	    __get_user(kurb->actual_length, &uurb->actual_length) ||
	    __get_user(kurb->start_frame, &uurb->start_frame) ||
	    __get_user(kurb->number_of_packets, &uurb->number_of_packets) ||
	    __get_user(kurb->error_count, &uurb->error_count) ||
	    __get_user(kurb->signr, &uurb->signr))
		return -EFAULT;

	if (__get_user(uptr, &uurb->buffer))
		return -EFAULT;
	kurb->buffer = compat_ptr(uptr);
M
Mark Lord 已提交
1581
	if (__get_user(uptr, &uurb->usercontext))
L
Linus Torvalds 已提交
1582 1583 1584 1585 1586 1587 1588 1589 1590 1591
		return -EFAULT;
	kurb->usercontext = compat_ptr(uptr);

	return 0;
}

static int proc_submiturb_compat(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_urb uurb;

1592
	if (get_urb32(&uurb, (struct usbdevfs_urb32 __user *)arg))
L
Linus Torvalds 已提交
1593 1594
		return -EFAULT;

1595 1596 1597
	return proc_do_submiturb(ps, &uurb,
			((struct usbdevfs_urb32 __user *)arg)->iso_frame_desc,
			arg);
L
Linus Torvalds 已提交
1598 1599 1600 1601 1602 1603 1604 1605 1606
}

static int processcompl_compat(struct async *as, void __user * __user *arg)
{
	struct urb *urb = as->urb;
	struct usbdevfs_urb32 __user *userurb = as->userurb;
	void __user *addr = as->userurb;
	unsigned int i;

1607
	if (as->userbuffer && urb->actual_length)
1608
		if (copy_to_user(as->userbuffer, urb->transfer_buffer,
1609
				 urb->actual_length))
L
Linus Torvalds 已提交
1610
			return -EFAULT;
1611
	if (put_user(as->status, &userurb->status))
L
Linus Torvalds 已提交
1612 1613 1614 1615 1616 1617
		return -EFAULT;
	if (put_user(urb->actual_length, &userurb->actual_length))
		return -EFAULT;
	if (put_user(urb->error_count, &userurb->error_count))
		return -EFAULT;

A
Alan Stern 已提交
1618
	if (usb_endpoint_xfer_isoc(&urb->ep->desc)) {
1619 1620 1621 1622 1623 1624 1625 1626
		for (i = 0; i < urb->number_of_packets; i++) {
			if (put_user(urb->iso_frame_desc[i].actual_length,
				     &userurb->iso_frame_desc[i].actual_length))
				return -EFAULT;
			if (put_user(urb->iso_frame_desc[i].status,
				     &userurb->iso_frame_desc[i].status))
				return -EFAULT;
		}
L
Linus Torvalds 已提交
1627 1628
	}

A
Al Viro 已提交
1629
	if (put_user(ptr_to_compat(addr), (u32 __user *)arg))
L
Linus Torvalds 已提交
1630 1631 1632 1633 1634 1635 1636
		return -EFAULT;
	return 0;
}

static int proc_reapurb_compat(struct dev_state *ps, void __user *arg)
{
	struct async *as = reap_as(ps);
1637 1638 1639 1640 1641
	if (as) {
		int retval = processcompl_compat(as, (void __user * __user *)arg);
		free_async(as);
		return retval;
	}
L
Linus Torvalds 已提交
1642 1643 1644 1645 1646 1647 1648
	if (signal_pending(current))
		return -EINTR;
	return -EIO;
}

static int proc_reapurbnonblock_compat(struct dev_state *ps, void __user *arg)
{
1649
	int retval;
L
Linus Torvalds 已提交
1650 1651
	struct async *as;

1652 1653 1654 1655 1656 1657 1658
	retval = -EAGAIN;
	as = async_getcompleted(ps);
	if (as) {
		retval = processcompl_compat(as, (void __user * __user *)arg);
		free_async(as);
	}
	return retval;
L
Linus Torvalds 已提交
1659 1660
}

1661

L
Linus Torvalds 已提交
1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696
#endif

static int proc_disconnectsignal(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_disconnectsignal ds;

	if (copy_from_user(&ds, arg, sizeof(ds)))
		return -EFAULT;
	ps->discsignr = ds.signr;
	ps->disccontext = ds.context;
	return 0;
}

static int proc_claiminterface(struct dev_state *ps, void __user *arg)
{
	unsigned int ifnum;

	if (get_user(ifnum, (unsigned int __user *)arg))
		return -EFAULT;
	return claimintf(ps, ifnum);
}

static int proc_releaseinterface(struct dev_state *ps, void __user *arg)
{
	unsigned int ifnum;
	int ret;

	if (get_user(ifnum, (unsigned int __user *)arg))
		return -EFAULT;
	if ((ret = releaseintf(ps, ifnum)) < 0)
		return ret;
	destroy_async_on_interface (ps, ifnum);
	return 0;
}

1697
static int proc_ioctl(struct dev_state *ps, struct usbdevfs_ioctl *ctl)
L
Linus Torvalds 已提交
1698 1699 1700 1701 1702 1703 1704
{
	int			size;
	void			*buf = NULL;
	int			retval = 0;
	struct usb_interface    *intf = NULL;
	struct usb_driver       *driver = NULL;

1705
	/* alloc buffer */
1706 1707
	if ((size = _IOC_SIZE(ctl->ioctl_code)) > 0) {
		if ((buf = kmalloc(size, GFP_KERNEL)) == NULL)
L
Linus Torvalds 已提交
1708
			return -ENOMEM;
1709
		if ((_IOC_DIR(ctl->ioctl_code) & _IOC_WRITE)) {
1710
			if (copy_from_user(buf, ctl->data, size)) {
1711
				kfree(buf);
L
Linus Torvalds 已提交
1712 1713 1714
				return -EFAULT;
			}
		} else {
1715
			memset(buf, 0, size);
L
Linus Torvalds 已提交
1716 1717 1718
		}
	}

A
Alan Stern 已提交
1719
	if (!connected(ps)) {
1720
		kfree(buf);
L
Linus Torvalds 已提交
1721 1722 1723 1724 1725
		return -ENODEV;
	}

	if (ps->dev->state != USB_STATE_CONFIGURED)
		retval = -EHOSTUNREACH;
1726 1727
	else if (!(intf = usb_ifnum_to_if(ps->dev, ctl->ifno)))
		retval = -EINVAL;
1728
	else switch (ctl->ioctl_code) {
L
Linus Torvalds 已提交
1729 1730 1731 1732 1733

	/* disconnect kernel driver from interface */
	case USBDEVFS_DISCONNECT:
		if (intf->dev.driver) {
			driver = to_usb_driver(intf->dev.driver);
1734
			dev_dbg(&intf->dev, "disconnect by usbfs\n");
L
Linus Torvalds 已提交
1735 1736 1737 1738 1739 1740 1741
			usb_driver_release_interface(driver, intf);
		} else
			retval = -ENODATA;
		break;

	/* let kernel drivers try to (re)bind to the interface */
	case USBDEVFS_CONNECT:
A
Alan Stern 已提交
1742 1743 1744 1745
		if (!intf->dev.driver)
			retval = device_attach(&intf->dev);
		else
			retval = -EBUSY;
L
Linus Torvalds 已提交
1746 1747 1748 1749 1750 1751
		break;

	/* talk directly to the interface's driver */
	default:
		if (intf->dev.driver)
			driver = to_usb_driver(intf->dev.driver);
1752
		if (driver == NULL || driver->unlocked_ioctl == NULL) {
L
Linus Torvalds 已提交
1753 1754
			retval = -ENOTTY;
		} else {
1755
			retval = driver->unlocked_ioctl(intf, ctl->ioctl_code, buf);
L
Linus Torvalds 已提交
1756 1757 1758 1759 1760 1761 1762
			if (retval == -ENOIOCTLCMD)
				retval = -ENOTTY;
		}
	}

	/* cleanup and return */
	if (retval >= 0
1763
			&& (_IOC_DIR(ctl->ioctl_code) & _IOC_READ) != 0
L
Linus Torvalds 已提交
1764
			&& size > 0
1765
			&& copy_to_user(ctl->data, buf, size) != 0)
L
Linus Torvalds 已提交
1766
		retval = -EFAULT;
1767 1768

	kfree(buf);
L
Linus Torvalds 已提交
1769 1770 1771
	return retval;
}

1772 1773 1774 1775
static int proc_ioctl_default(struct dev_state *ps, void __user *arg)
{
	struct usbdevfs_ioctl	ctrl;

1776
	if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
1777 1778 1779 1780 1781
		return -EFAULT;
	return proc_ioctl(ps, &ctrl);
}

#ifdef CONFIG_COMPAT
1782
static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
1783 1784 1785 1786 1787
{
	struct usbdevfs_ioctl32 __user *uioc;
	struct usbdevfs_ioctl ctrl;
	u32 udata;

A
Andrew Morton 已提交
1788
	uioc = compat_ptr((long)arg);
1789 1790 1791
	if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
	    __get_user(ctrl.ifno, &uioc->ifno) ||
	    __get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
1792 1793 1794 1795 1796 1797 1798 1799
	    __get_user(udata, &uioc->data))
		return -EFAULT;
	ctrl.data = compat_ptr(udata);

	return proc_ioctl(ps, &ctrl);
}
#endif

1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822
static int proc_claim_port(struct dev_state *ps, void __user *arg)
{
	unsigned portnum;
	int rc;

	if (get_user(portnum, (unsigned __user *) arg))
		return -EFAULT;
	rc = usb_hub_claim_port(ps->dev, portnum, ps);
	if (rc == 0)
		snoop(&ps->dev->dev, "port %d claimed by process %d: %s\n",
			portnum, task_pid_nr(current), current->comm);
	return rc;
}

static int proc_release_port(struct dev_state *ps, void __user *arg)
{
	unsigned portnum;

	if (get_user(portnum, (unsigned __user *) arg))
		return -EFAULT;
	return usb_hub_release_port(ps->dev, portnum, ps);
}

L
Linus Torvalds 已提交
1823 1824 1825 1826 1827
/*
 * NOTE:  All requests here that have interface numbers as parameters
 * are assuming that somehow the configuration has been prevented from
 * changing.  But there's no mechanism to ensure that...
 */
1828 1829
static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
				void __user *p)
L
Linus Torvalds 已提交
1830
{
1831
	struct dev_state *ps = file->private_data;
1832
	struct inode *inode = file->f_path.dentry->d_inode;
L
Linus Torvalds 已提交
1833 1834 1835 1836 1837
	struct usb_device *dev = ps->dev;
	int ret = -ENOTTY;

	if (!(file->f_mode & FMODE_WRITE))
		return -EPERM;
1838

L
Linus Torvalds 已提交
1839
	usb_lock_device(dev);
A
Alan Stern 已提交
1840
	if (!connected(ps)) {
L
Linus Torvalds 已提交
1841 1842 1843 1844 1845 1846
		usb_unlock_device(dev);
		return -ENODEV;
	}

	switch (cmd) {
	case USBDEVFS_CONTROL:
1847
		snoop(&dev->dev, "%s: CONTROL\n", __func__);
L
Linus Torvalds 已提交
1848 1849 1850 1851 1852 1853
		ret = proc_control(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_BULK:
1854
		snoop(&dev->dev, "%s: BULK\n", __func__);
L
Linus Torvalds 已提交
1855 1856 1857 1858 1859 1860
		ret = proc_bulk(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_RESETEP:
1861
		snoop(&dev->dev, "%s: RESETEP\n", __func__);
L
Linus Torvalds 已提交
1862 1863 1864 1865 1866 1867
		ret = proc_resetep(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_RESET:
1868
		snoop(&dev->dev, "%s: RESET\n", __func__);
L
Linus Torvalds 已提交
1869 1870 1871 1872
		ret = proc_resetdevice(ps);
		break;

	case USBDEVFS_CLEAR_HALT:
1873
		snoop(&dev->dev, "%s: CLEAR_HALT\n", __func__);
L
Linus Torvalds 已提交
1874 1875 1876 1877 1878 1879
		ret = proc_clearhalt(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_GETDRIVER:
1880
		snoop(&dev->dev, "%s: GETDRIVER\n", __func__);
L
Linus Torvalds 已提交
1881 1882 1883 1884
		ret = proc_getdriver(ps, p);
		break;

	case USBDEVFS_CONNECTINFO:
1885
		snoop(&dev->dev, "%s: CONNECTINFO\n", __func__);
L
Linus Torvalds 已提交
1886 1887 1888 1889
		ret = proc_connectinfo(ps, p);
		break;

	case USBDEVFS_SETINTERFACE:
1890
		snoop(&dev->dev, "%s: SETINTERFACE\n", __func__);
L
Linus Torvalds 已提交
1891 1892 1893 1894
		ret = proc_setintf(ps, p);
		break;

	case USBDEVFS_SETCONFIGURATION:
1895
		snoop(&dev->dev, "%s: SETCONFIGURATION\n", __func__);
L
Linus Torvalds 已提交
1896 1897 1898 1899
		ret = proc_setconfig(ps, p);
		break;

	case USBDEVFS_SUBMITURB:
1900
		snoop(&dev->dev, "%s: SUBMITURB\n", __func__);
L
Linus Torvalds 已提交
1901 1902 1903 1904 1905 1906
		ret = proc_submiturb(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

#ifdef CONFIG_COMPAT
1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924
	case USBDEVFS_CONTROL32:
		snoop(&dev->dev, "%s: CONTROL32\n", __func__);
		ret = proc_control_compat(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_BULK32:
		snoop(&dev->dev, "%s: BULK32\n", __func__);
		ret = proc_bulk_compat(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_DISCSIGNAL32:
		snoop(&dev->dev, "%s: DISCSIGNAL32\n", __func__);
		ret = proc_disconnectsignal_compat(ps, p);
		break;
L
Linus Torvalds 已提交
1925 1926

	case USBDEVFS_SUBMITURB32:
1927
		snoop(&dev->dev, "%s: SUBMITURB32\n", __func__);
L
Linus Torvalds 已提交
1928 1929 1930 1931 1932 1933
		ret = proc_submiturb_compat(ps, p);
		if (ret >= 0)
			inode->i_mtime = CURRENT_TIME;
		break;

	case USBDEVFS_REAPURB32:
1934
		snoop(&dev->dev, "%s: REAPURB32\n", __func__);
L
Linus Torvalds 已提交
1935 1936 1937 1938
		ret = proc_reapurb_compat(ps, p);
		break;

	case USBDEVFS_REAPURBNDELAY32:
1939
		snoop(&dev->dev, "%s: REAPURBNDELAY32\n", __func__);
L
Linus Torvalds 已提交
1940 1941 1942
		ret = proc_reapurbnonblock_compat(ps, p);
		break;

1943
	case USBDEVFS_IOCTL32:
1944
		snoop(&dev->dev, "%s: IOCTL32\n", __func__);
A
Al Viro 已提交
1945
		ret = proc_ioctl_compat(ps, ptr_to_compat(p));
1946
		break;
L
Linus Torvalds 已提交
1947 1948 1949
#endif

	case USBDEVFS_DISCARDURB:
1950
		snoop(&dev->dev, "%s: DISCARDURB\n", __func__);
L
Linus Torvalds 已提交
1951 1952 1953 1954
		ret = proc_unlinkurb(ps, p);
		break;

	case USBDEVFS_REAPURB:
1955
		snoop(&dev->dev, "%s: REAPURB\n", __func__);
L
Linus Torvalds 已提交
1956 1957 1958 1959
		ret = proc_reapurb(ps, p);
		break;

	case USBDEVFS_REAPURBNDELAY:
1960
		snoop(&dev->dev, "%s: REAPURBNDELAY\n", __func__);
L
Linus Torvalds 已提交
1961 1962 1963 1964
		ret = proc_reapurbnonblock(ps, p);
		break;

	case USBDEVFS_DISCSIGNAL:
1965
		snoop(&dev->dev, "%s: DISCSIGNAL\n", __func__);
L
Linus Torvalds 已提交
1966 1967 1968 1969
		ret = proc_disconnectsignal(ps, p);
		break;

	case USBDEVFS_CLAIMINTERFACE:
1970
		snoop(&dev->dev, "%s: CLAIMINTERFACE\n", __func__);
L
Linus Torvalds 已提交
1971 1972 1973 1974
		ret = proc_claiminterface(ps, p);
		break;

	case USBDEVFS_RELEASEINTERFACE:
1975
		snoop(&dev->dev, "%s: RELEASEINTERFACE\n", __func__);
L
Linus Torvalds 已提交
1976 1977 1978 1979
		ret = proc_releaseinterface(ps, p);
		break;

	case USBDEVFS_IOCTL:
1980
		snoop(&dev->dev, "%s: IOCTL\n", __func__);
1981
		ret = proc_ioctl_default(ps, p);
L
Linus Torvalds 已提交
1982
		break;
1983 1984 1985 1986 1987 1988 1989 1990 1991 1992

	case USBDEVFS_CLAIM_PORT:
		snoop(&dev->dev, "%s: CLAIM_PORT\n", __func__);
		ret = proc_claim_port(ps, p);
		break;

	case USBDEVFS_RELEASE_PORT:
		snoop(&dev->dev, "%s: RELEASE_PORT\n", __func__);
		ret = proc_release_port(ps, p);
		break;
L
Linus Torvalds 已提交
1993 1994 1995 1996 1997 1998 1999
	}
	usb_unlock_device(dev);
	if (ret >= 0)
		inode->i_atime = CURRENT_TIME;
	return ret;
}

2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
static long usbdev_ioctl(struct file *file, unsigned int cmd,
			unsigned long arg)
{
	int ret;

	ret = usbdev_do_ioctl(file, cmd, (void __user *)arg);

	return ret;
}

#ifdef CONFIG_COMPAT
static long usbdev_compat_ioctl(struct file *file, unsigned int cmd,
			unsigned long arg)
{
	int ret;

	ret = usbdev_do_ioctl(file, cmd, compat_ptr(arg));

	return ret;
}
#endif

L
Linus Torvalds 已提交
2022
/* No kernel lock - fine */
2023 2024
static unsigned int usbdev_poll(struct file *file,
				struct poll_table_struct *wait)
L
Linus Torvalds 已提交
2025
{
2026 2027
	struct dev_state *ps = file->private_data;
	unsigned int mask = 0;
L
Linus Torvalds 已提交
2028 2029 2030 2031

	poll_wait(file, &ps->wait, wait);
	if (file->f_mode & FMODE_WRITE && !list_empty(&ps->async_completed))
		mask |= POLLOUT | POLLWRNORM;
A
Alan Stern 已提交
2032
	if (!connected(ps))
L
Linus Torvalds 已提交
2033 2034 2035 2036
		mask |= POLLERR | POLLHUP;
	return mask;
}

2037
const struct file_operations usbdev_file_operations = {
2038 2039 2040 2041 2042 2043 2044 2045 2046 2047
	.owner =	  THIS_MODULE,
	.llseek =	  usbdev_lseek,
	.read =		  usbdev_read,
	.poll =		  usbdev_poll,
	.unlocked_ioctl = usbdev_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl =   usbdev_compat_ioctl,
#endif
	.open =		  usbdev_open,
	.release =	  usbdev_release,
L
Linus Torvalds 已提交
2048
};
2049

2050
static void usbdev_remove(struct usb_device *udev)
2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
{
	struct dev_state *ps;
	struct siginfo sinfo;

	while (!list_empty(&udev->filelist)) {
		ps = list_entry(udev->filelist.next, struct dev_state, list);
		destroy_all_async(ps);
		wake_up_all(&ps->wait);
		list_del_init(&ps->list);
		if (ps->discsignr) {
			sinfo.si_signo = ps->discsignr;
			sinfo.si_errno = EPIPE;
			sinfo.si_code = SI_ASYNCIO;
			sinfo.si_addr = ps->disccontext;
2065 2066
			kill_pid_info_as_cred(ps->discsignr, &sinfo,
					ps->disc_pid, ps->cred, ps->secid);
2067 2068 2069 2070
		}
	}
}

2071
static int usbdev_notify(struct notifier_block *self,
2072
			       unsigned long action, void *dev)
2073 2074 2075 2076 2077
{
	switch (action) {
	case USB_DEVICE_ADD:
		break;
	case USB_DEVICE_REMOVE:
2078
		usbdev_remove(dev);
2079 2080 2081 2082 2083 2084
		break;
	}
	return NOTIFY_OK;
}

static struct notifier_block usbdev_nb = {
2085
	.notifier_call = 	usbdev_notify,
2086 2087
};

2088
static struct cdev usb_device_cdev;
2089

2090
int __init usb_devio_init(void)
2091 2092 2093
{
	int retval;

2094
	retval = register_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX,
2095
					"usb_device");
2096
	if (retval) {
2097
		printk(KERN_ERR "Unable to register minors for usb_device\n");
2098 2099
		goto out;
	}
2100
	cdev_init(&usb_device_cdev, &usbdev_file_operations);
2101
	retval = cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX);
2102
	if (retval) {
2103 2104
		printk(KERN_ERR "Unable to get usb_device major %d\n",
		       USB_DEVICE_MAJOR);
2105
		goto error_cdev;
2106
	}
2107
	usb_register_notify(&usbdev_nb);
2108 2109
out:
	return retval;
2110 2111 2112 2113

error_cdev:
	unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
	goto out;
2114 2115
}

2116
void usb_devio_cleanup(void)
2117
{
2118
	usb_unregister_notify(&usbdev_nb);
2119
	cdev_del(&usb_device_cdev);
2120
	unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
2121
}