hid-core.c 44.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
 *  USB HID support for Linux
 *
 *  Copyright (c) 1999 Andreas Gal
5 6
 *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
 *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7
 *  Copyright (c) 2007-2008 Oliver Neukum
J
Jiri Kosina 已提交
8
 *  Copyright (c) 2006-2010 Jiri Kosina
L
Linus Torvalds 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 */

/*
 * 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.
 */

#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/mm.h>
24
#include <linux/mutex.h>
L
Linus Torvalds 已提交
25 26 27 28 29
#include <linux/spinlock.h>
#include <asm/unaligned.h>
#include <asm/byteorder.h>
#include <linux/input.h>
#include <linux/wait.h>
30
#include <linux/workqueue.h>
31
#include <linux/string.h>
L
Linus Torvalds 已提交
32 33 34

#include <linux/usb.h>

35
#include <linux/hid.h>
L
Linus Torvalds 已提交
36
#include <linux/hiddev.h>
37
#include <linux/hid-debug.h>
J
Jiri Kosina 已提交
38
#include <linux/hidraw.h>
J
Jiri Kosina 已提交
39
#include "usbhid.h"
L
Linus Torvalds 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

/*
 * Version Information
 */

#define DRIVER_DESC "USB HID core driver"
#define DRIVER_LICENSE "GPL"

/*
 * Module parameters.
 */

static unsigned int hid_mousepoll_interval;
module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
MODULE_PARM_DESC(mousepoll, "Polling interval of mice");

56 57 58 59
static unsigned int ignoreled;
module_param_named(ignoreled, ignoreled, uint, 0644);
MODULE_PARM_DESC(ignoreled, "Autosuspend with active leds");

60
/* Quirks specified at module load time */
61
static char *quirks_param[MAX_USBHID_BOOT_QUIRKS];
62 63 64 65 66
module_param_array_named(quirks, quirks_param, charp, NULL, 0444);
MODULE_PARM_DESC(quirks, "Add/modify USB HID quirks by specifying "
		" quirks=vendorID:productID:quirks"
		" where vendorID, productID, and quirks are all in"
		" 0x-prefixed hex");
L
Linus Torvalds 已提交
67
/*
68
 * Input submission and I/O error handler.
L
Linus Torvalds 已提交
69
 */
70
static DEFINE_MUTEX(hid_open_mut);
L
Linus Torvalds 已提交
71

72
static void hid_io_error(struct hid_device *hid);
73 74 75
static int hid_submit_out(struct hid_device *hid);
static int hid_submit_ctrl(struct hid_device *hid);
static void hid_cancel_delayed_stuff(struct usbhid_device *usbhid);
76 77 78

/* Start up the input URB */
static int hid_start_in(struct hid_device *hid)
L
Linus Torvalds 已提交
79 80
{
	unsigned long flags;
81 82
	int rc = 0;
	struct usbhid_device *usbhid = hid->driver_data;
L
Linus Torvalds 已提交
83

84
	spin_lock_irqsave(&usbhid->lock, flags);
85
	if ((hid->open > 0 || hid->quirks & HID_QUIRK_ALWAYS_POLL) &&
86
			!test_bit(HID_DISCONNECTED, &usbhid->iofl) &&
87
			!test_bit(HID_SUSPENDED, &usbhid->iofl) &&
88 89
			!test_and_set_bit(HID_IN_RUNNING, &usbhid->iofl)) {
		rc = usb_submit_urb(usbhid->urbin, GFP_ATOMIC);
90
		if (rc != 0) {
91
			clear_bit(HID_IN_RUNNING, &usbhid->iofl);
92 93 94 95 96
			if (rc == -ENOSPC)
				set_bit(HID_NO_BANDWIDTH, &usbhid->iofl);
		} else {
			clear_bit(HID_NO_BANDWIDTH, &usbhid->iofl);
		}
L
Linus Torvalds 已提交
97
	}
98
	spin_unlock_irqrestore(&usbhid->lock, flags);
99
	return rc;
L
Linus Torvalds 已提交
100 101
}

102 103
/* I/O retry timer routine */
static void hid_retry_timeout(unsigned long _hid)
L
Linus Torvalds 已提交
104
{
105
	struct hid_device *hid = (struct hid_device *) _hid;
J
Jiri Kosina 已提交
106
	struct usbhid_device *usbhid = hid->driver_data;
L
Linus Torvalds 已提交
107

108 109 110
	dev_dbg(&usbhid->intf->dev, "retrying intr urb\n");
	if (hid_start_in(hid))
		hid_io_error(hid);
L
Linus Torvalds 已提交
111 112
}

113 114
/* Workqueue routine to reset the device or clear a halt */
static void hid_reset(struct work_struct *work)
L
Linus Torvalds 已提交
115
{
116 117 118
	struct usbhid_device *usbhid =
		container_of(work, struct usbhid_device, reset_work);
	struct hid_device *hid = usbhid->hid;
119
	int rc;
L
Linus Torvalds 已提交
120

121 122 123 124
	if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) {
		dev_dbg(&usbhid->intf->dev, "clear halt\n");
		rc = usb_clear_halt(hid_to_usb_dev(hid), usbhid->urbin->pipe);
		clear_bit(HID_CLEAR_HALT, &usbhid->iofl);
125
		if (rc == 0) {
126 127 128 129 130
			hid_start_in(hid);
		} else {
			dev_dbg(&usbhid->intf->dev,
					"clear-halt failed: %d\n", rc);
			set_bit(HID_RESET_PENDING, &usbhid->iofl);
L
Linus Torvalds 已提交
131 132 133
		}
	}

134 135 136
	if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) {
		dev_dbg(&usbhid->intf->dev, "resetting device\n");
		usb_queue_reset_device(usbhid->intf);
L
Linus Torvalds 已提交
137 138 139
	}
}

140 141
/* Main I/O error handler */
static void hid_io_error(struct hid_device *hid)
142
{
143 144
	unsigned long flags;
	struct usbhid_device *usbhid = hid->driver_data;
145

146
	spin_lock_irqsave(&usbhid->lock, flags);
147

148
	/* Stop when disconnected */
149
	if (test_bit(HID_DISCONNECTED, &usbhid->iofl))
150
		goto done;
151

A
Alan Stern 已提交
152 153 154 155 156
	/* If it has been a while since the last error, we'll assume
	 * this a brand new error and reset the retry timeout. */
	if (time_after(jiffies, usbhid->stop_retry + HZ/2))
		usbhid->retry_delay = 0;

157 158 159 160 161 162
	/* When an error occurs, retry at increasing intervals */
	if (usbhid->retry_delay == 0) {
		usbhid->retry_delay = 13;	/* Then 26, 52, 104, 104, ... */
		usbhid->stop_retry = jiffies + msecs_to_jiffies(1000);
	} else if (usbhid->retry_delay < 100)
		usbhid->retry_delay *= 2;
163

164
	if (time_after(jiffies, usbhid->stop_retry)) {
J
Jiri Kosina 已提交
165

166 167 168 169
		/* Retries failed, so do a port reset unless we lack bandwidth*/
		if (test_bit(HID_NO_BANDWIDTH, &usbhid->iofl)
		     && !test_and_set_bit(HID_RESET_PENDING, &usbhid->iofl)) {

170 171 172
			schedule_work(&usbhid->reset_work);
			goto done;
		}
L
Linus Torvalds 已提交
173 174
	}

175 176 177
	mod_timer(&usbhid->io_retry,
			jiffies + msecs_to_jiffies(usbhid->retry_delay));
done:
178 179 180 181 182 183 184 185 186 187 188 189 190 191
	spin_unlock_irqrestore(&usbhid->lock, flags);
}

static void usbhid_mark_busy(struct usbhid_device *usbhid)
{
	struct usb_interface *intf = usbhid->intf;

	usb_mark_last_busy(interface_to_usbdev(intf));
}

static int usbhid_restart_out_queue(struct usbhid_device *usbhid)
{
	struct hid_device *hid = usb_get_intfdata(usbhid->intf);
	int kicked;
192
	int r;
193

194 195
	if (!hid || test_bit(HID_RESET_PENDING, &usbhid->iofl) ||
			test_bit(HID_SUSPENDED, &usbhid->iofl))
196 197 198
		return 0;

	if ((kicked = (usbhid->outhead != usbhid->outtail))) {
199
		hid_dbg(hid, "Kicking head %d tail %d", usbhid->outhead, usbhid->outtail);
200

A
Alan Stern 已提交
201
		/* Try to wake up from autosuspend... */
202 203 204
		r = usb_autopm_get_interface_async(usbhid->intf);
		if (r < 0)
			return r;
A
Alan Stern 已提交
205 206 207 208 209

		/*
		 * If still suspended, don't submit.  Submission will
		 * occur if/when resume drains the queue.
		 */
210
		if (test_bit(HID_SUSPENDED, &usbhid->iofl)) {
A
Alan Stern 已提交
211 212 213 214
			usb_autopm_put_interface_no_suspend(usbhid->intf);
			return r;
		}

215 216
		/* Asynchronously flush queue. */
		set_bit(HID_OUT_RUNNING, &usbhid->iofl);
217 218
		if (hid_submit_out(hid)) {
			clear_bit(HID_OUT_RUNNING, &usbhid->iofl);
219
			usb_autopm_put_interface_async(usbhid->intf);
220
		}
221
		wake_up(&usbhid->wait);
222 223 224 225 226 227 228 229
	}
	return kicked;
}

static int usbhid_restart_ctrl_queue(struct usbhid_device *usbhid)
{
	struct hid_device *hid = usb_get_intfdata(usbhid->intf);
	int kicked;
230
	int r;
231 232

	WARN_ON(hid == NULL);
233 234
	if (!hid || test_bit(HID_RESET_PENDING, &usbhid->iofl) ||
			test_bit(HID_SUSPENDED, &usbhid->iofl))
235 236 237
		return 0;

	if ((kicked = (usbhid->ctrlhead != usbhid->ctrltail))) {
238
		hid_dbg(hid, "Kicking head %d tail %d", usbhid->ctrlhead, usbhid->ctrltail);
239

A
Alan Stern 已提交
240
		/* Try to wake up from autosuspend... */
241 242 243
		r = usb_autopm_get_interface_async(usbhid->intf);
		if (r < 0)
			return r;
A
Alan Stern 已提交
244 245 246 247 248

		/*
		 * If still suspended, don't submit.  Submission will
		 * occur if/when resume drains the queue.
		 */
249
		if (test_bit(HID_SUSPENDED, &usbhid->iofl)) {
A
Alan Stern 已提交
250 251 252 253
			usb_autopm_put_interface_no_suspend(usbhid->intf);
			return r;
		}

254 255
		/* Asynchronously flush queue. */
		set_bit(HID_CTRL_RUNNING, &usbhid->iofl);
256 257
		if (hid_submit_ctrl(hid)) {
			clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
258
			usb_autopm_put_interface_async(usbhid->intf);
259
		}
260
		wake_up(&usbhid->wait);
261 262
	}
	return kicked;
L
Linus Torvalds 已提交
263 264
}

265 266 267
/*
 * Input interrupt completion handler.
 */
268

269
static void hid_irq_in(struct urb *urb)
L
Linus Torvalds 已提交
270
{
271 272 273
	struct hid_device	*hid = urb->context;
	struct usbhid_device 	*usbhid = hid->driver_data;
	int			status;
L
Linus Torvalds 已提交
274

275
	switch (urb->status) {
J
Jiri Slaby 已提交
276
	case 0:			/* success */
277
		usbhid_mark_busy(usbhid);
J
Jiri Slaby 已提交
278
		usbhid->retry_delay = 0;
279 280
		if ((hid->quirks & HID_QUIRK_ALWAYS_POLL) && !hid->open)
			break;
J
Jiri Slaby 已提交
281 282 283
		hid_input_report(urb->context, HID_INPUT_REPORT,
				 urb->transfer_buffer,
				 urb->actual_length, 1);
284 285 286 287 288 289 290 291 292
		/*
		 * autosuspend refused while keys are pressed
		 * because most keyboards don't wake up when
		 * a key is released
		 */
		if (hid_check_keys_pressed(hid))
			set_bit(HID_KEYS_PRESSED, &usbhid->iofl);
		else
			clear_bit(HID_KEYS_PRESSED, &usbhid->iofl);
J
Jiri Slaby 已提交
293 294
		break;
	case -EPIPE:		/* stall */
295
		usbhid_mark_busy(usbhid);
J
Jiri Slaby 已提交
296 297 298 299 300 301 302 303 304 305 306 307 308
		clear_bit(HID_IN_RUNNING, &usbhid->iofl);
		set_bit(HID_CLEAR_HALT, &usbhid->iofl);
		schedule_work(&usbhid->reset_work);
		return;
	case -ECONNRESET:	/* unlink */
	case -ENOENT:
	case -ESHUTDOWN:	/* unplug */
		clear_bit(HID_IN_RUNNING, &usbhid->iofl);
		return;
	case -EILSEQ:		/* protocol error or unplug */
	case -EPROTO:		/* protocol error or unplug */
	case -ETIME:		/* protocol error or unplug */
	case -ETIMEDOUT:	/* Should never happen, but... */
309
		usbhid_mark_busy(usbhid);
J
Jiri Slaby 已提交
310 311 312 313
		clear_bit(HID_IN_RUNNING, &usbhid->iofl);
		hid_io_error(hid);
		return;
	default:		/* error */
314 315
		hid_warn(urb->dev, "input irq status %d received\n",
			 urb->status);
316
	}
L
Linus Torvalds 已提交
317

318 319 320 321
	status = usb_submit_urb(urb, GFP_ATOMIC);
	if (status) {
		clear_bit(HID_IN_RUNNING, &usbhid->iofl);
		if (status != -EPERM) {
322 323 324 325
			hid_err(hid, "can't resubmit intr, %s-%s/input%d, status %d\n",
				hid_to_usb_dev(hid)->bus->bus_name,
				hid_to_usb_dev(hid)->devpath,
				usbhid->ifnum, status);
326 327 328
			hid_io_error(hid);
		}
	}
L
Linus Torvalds 已提交
329 330
}

331
static int hid_submit_out(struct hid_device *hid)
L
Linus Torvalds 已提交
332
{
333
	struct hid_report *report;
334
	char *raw_report;
J
Jiri Kosina 已提交
335
	struct usbhid_device *usbhid = hid->driver_data;
336
	int r;
J
Jiri Kosina 已提交
337

338 339
	report = usbhid->out[usbhid->outtail].report;
	raw_report = usbhid->out[usbhid->outtail].raw_report;
L
Linus Torvalds 已提交
340

341 342 343
	usbhid->urbout->transfer_buffer_length = ((report->size - 1) >> 3) +
						 1 + (report->id > 0);
	usbhid->urbout->dev = hid_to_usb_dev(hid);
A
Alan Stern 已提交
344 345 346 347 348 349
	if (raw_report) {
		memcpy(usbhid->outbuf, raw_report,
				usbhid->urbout->transfer_buffer_length);
		kfree(raw_report);
		usbhid->out[usbhid->outtail].raw_report = NULL;
	}
350

351
	dbg_hid("submitting out urb\n");
352

353 354 355 356
	r = usb_submit_urb(usbhid->urbout, GFP_ATOMIC);
	if (r < 0) {
		hid_err(hid, "usb_submit_urb(out) failed: %d\n", r);
		return r;
357
	}
358
	usbhid->last_out = jiffies;
359 360 361 362
	return 0;
}

static int hid_submit_ctrl(struct hid_device *hid)
L
Linus Torvalds 已提交
363 364
{
	struct hid_report *report;
365
	unsigned char dir;
366
	char *raw_report;
367
	int len, r;
J
Jiri Kosina 已提交
368
	struct usbhid_device *usbhid = hid->driver_data;
L
Linus Torvalds 已提交
369

370
	report = usbhid->ctrl[usbhid->ctrltail].report;
371
	raw_report = usbhid->ctrl[usbhid->ctrltail].raw_report;
372
	dir = usbhid->ctrl[usbhid->ctrltail].dir;
L
Linus Torvalds 已提交
373

374 375 376 377
	len = ((report->size - 1) >> 3) + 1 + (report->id > 0);
	if (dir == USB_DIR_OUT) {
		usbhid->urbctrl->pipe = usb_sndctrlpipe(hid_to_usb_dev(hid), 0);
		usbhid->urbctrl->transfer_buffer_length = len;
A
Alan Stern 已提交
378 379 380 381 382
		if (raw_report) {
			memcpy(usbhid->ctrlbuf, raw_report, len);
			kfree(raw_report);
			usbhid->ctrl[usbhid->ctrltail].raw_report = NULL;
		}
383 384 385 386 387 388 389 390 391 392 393 394 395 396
	} else {
		int maxpacket, padlen;

		usbhid->urbctrl->pipe = usb_rcvctrlpipe(hid_to_usb_dev(hid), 0);
		maxpacket = usb_maxpacket(hid_to_usb_dev(hid),
					  usbhid->urbctrl->pipe, 0);
		if (maxpacket > 0) {
			padlen = DIV_ROUND_UP(len, maxpacket);
			padlen *= maxpacket;
			if (padlen > usbhid->bufsize)
				padlen = usbhid->bufsize;
		} else
			padlen = 0;
		usbhid->urbctrl->transfer_buffer_length = padlen;
397
	}
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
	usbhid->urbctrl->dev = hid_to_usb_dev(hid);

	usbhid->cr->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | dir;
	usbhid->cr->bRequest = (dir == USB_DIR_OUT) ? HID_REQ_SET_REPORT :
						      HID_REQ_GET_REPORT;
	usbhid->cr->wValue = cpu_to_le16(((report->type + 1) << 8) |
					 report->id);
	usbhid->cr->wIndex = cpu_to_le16(usbhid->ifnum);
	usbhid->cr->wLength = cpu_to_le16(len);

	dbg_hid("submitting ctrl urb: %s wValue=0x%04x wIndex=0x%04x wLength=%u\n",
		usbhid->cr->bRequest == HID_REQ_SET_REPORT ? "Set_Report" :
							     "Get_Report",
		usbhid->cr->wValue, usbhid->cr->wIndex, usbhid->cr->wLength);

	r = usb_submit_urb(usbhid->urbctrl, GFP_ATOMIC);
	if (r < 0) {
		hid_err(hid, "usb_submit_urb(ctrl) failed: %d\n", r);
		return r;
	}
	usbhid->last_ctrl = jiffies;
419 420
	return 0;
}
L
Linus Torvalds 已提交
421

422 423 424
/*
 * Output interrupt completion handler.
 */
L
Linus Torvalds 已提交
425

426 427 428 429 430 431
static void hid_irq_out(struct urb *urb)
{
	struct hid_device *hid = urb->context;
	struct usbhid_device *usbhid = hid->driver_data;
	unsigned long flags;
	int unplug = 0;
L
Linus Torvalds 已提交
432

433
	switch (urb->status) {
J
Jiri Slaby 已提交
434 435 436 437 438 439 440 441 442 443
	case 0:			/* success */
		break;
	case -ESHUTDOWN:	/* unplug */
		unplug = 1;
	case -EILSEQ:		/* protocol error or unplug */
	case -EPROTO:		/* protocol error or unplug */
	case -ECONNRESET:	/* unlink */
	case -ENOENT:
		break;
	default:		/* error */
444 445
		hid_warn(urb->dev, "output irq status %d received\n",
			 urb->status);
446
	}
L
Linus Torvalds 已提交
447

448
	spin_lock_irqsave(&usbhid->lock, flags);
L
Linus Torvalds 已提交
449

450
	if (unplug) {
451
		usbhid->outtail = usbhid->outhead;
452
	} else {
453
		usbhid->outtail = (usbhid->outtail + 1) & (HID_OUTPUT_FIFO_SIZE - 1);
L
Linus Torvalds 已提交
454

455 456 457 458 459 460
		if (usbhid->outhead != usbhid->outtail &&
				hid_submit_out(hid) == 0) {
			/* Successfully submitted next urb in queue */
			spin_unlock_irqrestore(&usbhid->lock, flags);
			return;
		}
461
	}
L
Linus Torvalds 已提交
462

463
	clear_bit(HID_OUT_RUNNING, &usbhid->iofl);
464
	spin_unlock_irqrestore(&usbhid->lock, flags);
465
	usb_autopm_put_interface_async(usbhid->intf);
J
Jiri Slaby 已提交
466
	wake_up(&usbhid->wait);
467
}
468

469 470 471
/*
 * Control pipe completion handler.
 */
L
Linus Torvalds 已提交
472

473 474 475 476
static void hid_ctrl(struct urb *urb)
{
	struct hid_device *hid = urb->context;
	struct usbhid_device *usbhid = hid->driver_data;
477
	int unplug = 0, status = urb->status;
L
Linus Torvalds 已提交
478

479
	spin_lock(&usbhid->lock);
L
Linus Torvalds 已提交
480

481
	switch (status) {
J
Jiri Slaby 已提交
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
	case 0:			/* success */
		if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_IN)
			hid_input_report(urb->context,
				usbhid->ctrl[usbhid->ctrltail].report->type,
				urb->transfer_buffer, urb->actual_length, 0);
		break;
	case -ESHUTDOWN:	/* unplug */
		unplug = 1;
	case -EILSEQ:		/* protocol error or unplug */
	case -EPROTO:		/* protocol error or unplug */
	case -ECONNRESET:	/* unlink */
	case -ENOENT:
	case -EPIPE:		/* report not available */
		break;
	default:		/* error */
497
		hid_warn(urb->dev, "ctrl urb status %d received\n", status);
498
	}
L
Linus Torvalds 已提交
499

500
	if (unplug) {
501
		usbhid->ctrltail = usbhid->ctrlhead;
502
	} else {
503
		usbhid->ctrltail = (usbhid->ctrltail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
L
Linus Torvalds 已提交
504

505 506 507 508 509 510
		if (usbhid->ctrlhead != usbhid->ctrltail &&
				hid_submit_ctrl(hid) == 0) {
			/* Successfully submitted next urb in queue */
			spin_unlock(&usbhid->lock);
			return;
		}
511
	}
L
Linus Torvalds 已提交
512

513
	clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
514
	spin_unlock(&usbhid->lock);
515
	usb_autopm_put_interface_async(usbhid->intf);
J
Jiri Slaby 已提交
516
	wake_up(&usbhid->wait);
517
}
L
Linus Torvalds 已提交
518

519 520
static void __usbhid_submit_report(struct hid_device *hid, struct hid_report *report,
				   unsigned char dir)
521 522 523
{
	int head;
	struct usbhid_device *usbhid = hid->driver_data;
L
Linus Torvalds 已提交
524

525 526
	if (((hid->quirks & HID_QUIRK_NOGET) && dir == USB_DIR_IN) ||
		test_bit(HID_DISCONNECTED, &usbhid->iofl))
527
		return;
528

529 530
	if (usbhid->urbout && dir == USB_DIR_OUT && report->type == HID_OUTPUT_REPORT) {
		if ((head = (usbhid->outhead + 1) & (HID_OUTPUT_FIFO_SIZE - 1)) == usbhid->outtail) {
531
			hid_warn(hid, "output queue full\n");
532 533
			return;
		}
L
Linus Torvalds 已提交
534

535
		usbhid->out[usbhid->outhead].raw_report = hid_alloc_report_buf(report, GFP_ATOMIC);
536
		if (!usbhid->out[usbhid->outhead].raw_report) {
537
			hid_warn(hid, "output queueing failed\n");
538 539 540 541
			return;
		}
		hid_output_report(report, usbhid->out[usbhid->outhead].raw_report);
		usbhid->out[usbhid->outhead].report = report;
542
		usbhid->outhead = head;
543

A
Alan Stern 已提交
544 545 546
		/* If the queue isn't running, restart it */
		if (!test_bit(HID_OUT_RUNNING, &usbhid->iofl)) {
			usbhid_restart_out_queue(usbhid);
547

A
Alan Stern 已提交
548 549 550 551 552
		/* Otherwise see if an earlier request has timed out */
		} else if (time_after(jiffies, usbhid->last_out + HZ * 5)) {

			/* Prevent autosuspend following the unlink */
			usb_autopm_get_interface_no_resume(usbhid->intf);
553

554
			/*
A
Alan Stern 已提交
555 556 557
			 * Prevent resubmission in case the URB completes
			 * before we can unlink it.  We don't want to cancel
			 * the wrong transfer!
558
			 */
A
Alan Stern 已提交
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
			usb_block_urb(usbhid->urbout);

			/* Drop lock to avoid deadlock if the callback runs */
			spin_unlock(&usbhid->lock);

			usb_unlink_urb(usbhid->urbout);
			spin_lock(&usbhid->lock);
			usb_unblock_urb(usbhid->urbout);

			/* Unlink might have stopped the queue */
			if (!test_bit(HID_OUT_RUNNING, &usbhid->iofl))
				usbhid_restart_out_queue(usbhid);

			/* Now we can allow autosuspend again */
			usb_autopm_put_interface_async(usbhid->intf);
574
		}
575 576
		return;
	}
L
Linus Torvalds 已提交
577

578
	if ((head = (usbhid->ctrlhead + 1) & (HID_CONTROL_FIFO_SIZE - 1)) == usbhid->ctrltail) {
579
		hid_warn(hid, "control queue full\n");
580 581
		return;
	}
582

583
	if (dir == USB_DIR_OUT) {
584
		usbhid->ctrl[usbhid->ctrlhead].raw_report = hid_alloc_report_buf(report, GFP_ATOMIC);
585
		if (!usbhid->ctrl[usbhid->ctrlhead].raw_report) {
586
			hid_warn(hid, "control queueing failed\n");
587 588 589 590
			return;
		}
		hid_output_report(report, usbhid->ctrl[usbhid->ctrlhead].raw_report);
	}
591 592 593
	usbhid->ctrl[usbhid->ctrlhead].report = report;
	usbhid->ctrl[usbhid->ctrlhead].dir = dir;
	usbhid->ctrlhead = head;
594

A
Alan Stern 已提交
595 596 597
	/* If the queue isn't running, restart it */
	if (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl)) {
		usbhid_restart_ctrl_queue(usbhid);
598

A
Alan Stern 已提交
599 600 601 602 603
	/* Otherwise see if an earlier request has timed out */
	} else if (time_after(jiffies, usbhid->last_ctrl + HZ * 5)) {

		/* Prevent autosuspend following the unlink */
		usb_autopm_get_interface_no_resume(usbhid->intf);
604

605
		/*
A
Alan Stern 已提交
606 607 608
		 * Prevent resubmission in case the URB completes
		 * before we can unlink it.  We don't want to cancel
		 * the wrong transfer!
609
		 */
A
Alan Stern 已提交
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
		usb_block_urb(usbhid->urbctrl);

		/* Drop lock to avoid deadlock if the callback runs */
		spin_unlock(&usbhid->lock);

		usb_unlink_urb(usbhid->urbctrl);
		spin_lock(&usbhid->lock);
		usb_unblock_urb(usbhid->urbctrl);

		/* Unlink might have stopped the queue */
		if (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl))
			usbhid_restart_ctrl_queue(usbhid);

		/* Now we can allow autosuspend again */
		usb_autopm_put_interface_async(usbhid->intf);
625
	}
626
}
627

628
static void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char dir)
629 630 631
{
	struct usbhid_device *usbhid = hid->driver_data;
	unsigned long flags;
632

633 634 635
	spin_lock_irqsave(&usbhid->lock, flags);
	__usbhid_submit_report(hid, report, dir);
	spin_unlock_irqrestore(&usbhid->lock, flags);
636
}
637

638
static int usbhid_wait_io(struct hid_device *hid)
639 640
{
	struct usbhid_device *usbhid = hid->driver_data;
641

J
Jiri Slaby 已提交
642 643 644
	if (!wait_event_timeout(usbhid->wait,
				(!test_bit(HID_CTRL_RUNNING, &usbhid->iofl) &&
				!test_bit(HID_OUT_RUNNING, &usbhid->iofl)),
645
					10*HZ)) {
646
		dbg_hid("timeout waiting for ctrl or out queue to clear\n");
647 648
		return -1;
	}
L
Linus Torvalds 已提交
649

650 651
	return 0;
}
652

653 654 655 656 657 658
static int hid_set_idle(struct usb_device *dev, int ifnum, int report, int idle)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		HID_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE, (idle << 8) | report,
		ifnum, NULL, 0, USB_CTRL_SET_TIMEOUT);
}
L
Linus Torvalds 已提交
659

660 661 662 663
static int hid_get_class_descriptor(struct usb_device *dev, int ifnum,
		unsigned char type, void *buf, int size)
{
	int result, retries = 4;
L
Linus Torvalds 已提交
664

665
	memset(buf, 0, size);
L
Linus Torvalds 已提交
666

667 668 669 670 671 672 673 674
	do {
		result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
				USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
				(type << 8), ifnum, buf, size, USB_CTRL_GET_TIMEOUT);
		retries--;
	} while (result < size && retries);
	return result;
}
675

676 677
int usbhid_open(struct hid_device *hid)
{
678
	struct usbhid_device *usbhid = hid->driver_data;
679
	int res = 0;
680

681
	mutex_lock(&hid_open_mut);
682 683
	if (!hid->open++) {
		res = usb_autopm_get_interface(usbhid->intf);
684
		/* the device must be awake to reliably request remote wakeup */
685 686
		if (res < 0) {
			hid->open--;
687 688
			res = -EIO;
			goto done;
689
		}
690
		usbhid->intf->needs_remote_wakeup = 1;
691 692 693 694 695 696 697 698 699 700 701 702
		res = hid_start_in(hid);
		if (res) {
			if (res != -ENOSPC) {
				hid_io_error(hid);
				res = 0;
			} else {
				/* no use opening if resources are insufficient */
				hid->open--;
				res = -EBUSY;
				usbhid->intf->needs_remote_wakeup = 0;
			}
		}
703
		usb_autopm_put_interface(usbhid->intf);
704
	}
705
done:
706
	mutex_unlock(&hid_open_mut);
707
	return res;
708
}
709

710 711 712
void usbhid_close(struct hid_device *hid)
{
	struct usbhid_device *usbhid = hid->driver_data;
713

714 715 716 717 718 719 720
	mutex_lock(&hid_open_mut);

	/* protecting hid->open to make sure we don't restart
	 * data acquistion due to a resumption we no longer
	 * care about
	 */
	spin_lock_irq(&usbhid->lock);
721
	if (!--hid->open) {
722
		spin_unlock_irq(&usbhid->lock);
723
		hid_cancel_delayed_stuff(usbhid);
724 725 726 727
		if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL)) {
			usb_kill_urb(usbhid->urbin);
			usbhid->intf->needs_remote_wakeup = 0;
		}
728 729
	} else {
		spin_unlock_irq(&usbhid->lock);
730
	}
731
	mutex_unlock(&hid_open_mut);
732
}
733

734 735 736
/*
 * Initialize all reports
 */
737

738 739 740 741
void usbhid_init_reports(struct hid_device *hid)
{
	struct hid_report *report;
	struct usbhid_device *usbhid = hid->driver_data;
742
	struct hid_report_enum *report_enum;
743
	int err, ret;
744

745 746 747 748 749
	if (!(hid->quirks & HID_QUIRK_NO_INIT_INPUT_REPORTS)) {
		report_enum = &hid->report_enum[HID_INPUT_REPORT];
		list_for_each_entry(report, &report_enum->report_list, list)
			usbhid_submit_report(hid, report, USB_DIR_IN);
	}
750

751 752
	report_enum = &hid->report_enum[HID_FEATURE_REPORT];
	list_for_each_entry(report, &report_enum->report_list, list)
753
		usbhid_submit_report(hid, report, USB_DIR_IN);
G
Geoff Levand 已提交
754

755 756 757 758 759 760 761 762 763 764
	err = 0;
	ret = usbhid_wait_io(hid);
	while (ret) {
		err |= ret;
		if (test_bit(HID_CTRL_RUNNING, &usbhid->iofl))
			usb_kill_urb(usbhid->urbctrl);
		if (test_bit(HID_OUT_RUNNING, &usbhid->iofl))
			usb_kill_urb(usbhid->urbout);
		ret = usbhid_wait_io(hid);
	}
765

766
	if (err)
767
		hid_warn(hid, "timeout initializing reports\n");
768
}
L
Linus Torvalds 已提交
769

770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
/*
 * Reset LEDs which BIOS might have left on. For now, just NumLock (0x01).
 */
static int hid_find_field_early(struct hid_device *hid, unsigned int page,
    unsigned int hid_code, struct hid_field **pfield)
{
	struct hid_report *report;
	struct hid_field *field;
	struct hid_usage *usage;
	int i, j;

	list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) {
		for (i = 0; i < report->maxfield; i++) {
			field = report->field[i];
			for (j = 0; j < field->maxusage; j++) {
				usage = &field->usage[j];
				if ((usage->hid & HID_USAGE_PAGE) == page &&
				    (usage->hid & 0xFFFF) == hid_code) {
					*pfield = field;
					return j;
				}
			}
		}
	}
	return -1;
}

797
static void usbhid_set_leds(struct hid_device *hid)
798 799 800 801 802 803 804 805 806 807
{
	struct hid_field *field;
	int offset;

	if ((offset = hid_find_field_early(hid, HID_UP_LED, 0x01, &field)) != -1) {
		hid_set_field(field, offset, 0);
		usbhid_submit_report(hid, field->report, USB_DIR_OUT);
	}
}

808 809 810
/*
 * Traverse the supplied list of reports and find the longest
 */
J
Jiri Slaby 已提交
811 812
static void hid_find_max_report(struct hid_device *hid, unsigned int type,
		unsigned int *max)
813 814
{
	struct hid_report *report;
J
Jiri Slaby 已提交
815
	unsigned int size;
816 817

	list_for_each_entry(report, &hid->report_enum[type].report_list, list) {
818
		size = ((report->size - 1) >> 3) + 1 + hid->report_enum[type].numbered;
819 820 821 822 823
		if (*max < size)
			*max = size;
	}
}

L
Linus Torvalds 已提交
824 825
static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
{
J
Jiri Kosina 已提交
826 827
	struct usbhid_device *usbhid = hid->driver_data;

828
	usbhid->inbuf = usb_alloc_coherent(dev, usbhid->bufsize, GFP_KERNEL,
829
			&usbhid->inbuf_dma);
830
	usbhid->outbuf = usb_alloc_coherent(dev, usbhid->bufsize, GFP_KERNEL,
831
			&usbhid->outbuf_dma);
832
	usbhid->cr = kmalloc(sizeof(*usbhid->cr), GFP_KERNEL);
833
	usbhid->ctrlbuf = usb_alloc_coherent(dev, usbhid->bufsize, GFP_KERNEL,
834 835 836
			&usbhid->ctrlbuf_dma);
	if (!usbhid->inbuf || !usbhid->outbuf || !usbhid->cr ||
			!usbhid->ctrlbuf)
L
Linus Torvalds 已提交
837 838 839 840 841
		return -1;

	return 0;
}

842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
static int usbhid_get_raw_report(struct hid_device *hid,
		unsigned char report_number, __u8 *buf, size_t count,
		unsigned char report_type)
{
	struct usbhid_device *usbhid = hid->driver_data;
	struct usb_device *dev = hid_to_usb_dev(hid);
	struct usb_interface *intf = usbhid->intf;
	struct usb_host_interface *interface = intf->cur_altsetting;
	int skipped_report_id = 0;
	int ret;

	/* Byte 0 is the report number. Report data starts at byte 1.*/
	buf[0] = report_number;
	if (report_number == 0x0) {
		/* Offset the return buffer by 1, so that the report ID
		   will remain in byte 0. */
		buf++;
		count--;
		skipped_report_id = 1;
	}
	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
		HID_REQ_GET_REPORT,
		USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
		((report_type + 1) << 8) | report_number,
		interface->desc.bInterfaceNumber, buf, count,
		USB_CTRL_SET_TIMEOUT);

	/* count also the report id */
	if (ret > 0 && skipped_report_id)
		ret++;

	return ret;
}

876 877 878 879 880 881 882 883 884 885
static int usbhid_set_raw_report(struct hid_device *hid, unsigned int reportnum,
				 __u8 *buf, size_t count, unsigned char rtype)
{
	struct usbhid_device *usbhid = hid->driver_data;
	struct usb_device *dev = hid_to_usb_dev(hid);
	struct usb_interface *intf = usbhid->intf;
	struct usb_host_interface *interface = intf->cur_altsetting;
	int ret, skipped_report_id = 0;

	/* Byte 0 is the report number. Report data starts at byte 1.*/
886 887 888 889 890 891
	if ((rtype == HID_OUTPUT_REPORT) &&
	    (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORT_ID))
		buf[0] = 0;
	else
		buf[0] = reportnum;

892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918
	if (buf[0] == 0x0) {
		/* Don't send the Report ID */
		buf++;
		count--;
		skipped_report_id = 1;
	}

	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
			HID_REQ_SET_REPORT,
			USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			((rtype + 1) << 8) | reportnum,
			interface->desc.bInterfaceNumber, buf, count,
			USB_CTRL_SET_TIMEOUT);
	/* count also the report id, if this was a numbered report. */
	if (ret > 0 && skipped_report_id)
		ret++;

	return ret;
}

static int usbhid_output_report(struct hid_device *hid, __u8 *buf, size_t count)
{
	struct usbhid_device *usbhid = hid->driver_data;
	struct usb_device *dev = hid_to_usb_dev(hid);
	int actual_length, skipped_report_id = 0, ret;

	if (!usbhid->urbout)
919
		return -ENOSYS;
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941

	if (buf[0] == 0x0) {
		/* Don't send the Report ID */
		buf++;
		count--;
		skipped_report_id = 1;
	}

	ret = usb_interrupt_msg(dev, usbhid->urbout->pipe,
				buf, count, &actual_length,
				USB_CTRL_SET_TIMEOUT);
	/* return the number of bytes transferred */
	if (ret == 0) {
		ret = actual_length;
		/* count also the report id */
		if (skipped_report_id)
			ret++;
	}

	return ret;
}

942 943
static void usbhid_restart_queues(struct usbhid_device *usbhid)
{
944
	if (usbhid->urbout && !test_bit(HID_OUT_RUNNING, &usbhid->iofl))
945
		usbhid_restart_out_queue(usbhid);
946 947
	if (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl))
		usbhid_restart_ctrl_queue(usbhid);
948 949
}

L
Linus Torvalds 已提交
950 951
static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid)
{
J
Jiri Kosina 已提交
952 953
	struct usbhid_device *usbhid = hid->driver_data;

954 955
	usb_free_coherent(dev, usbhid->bufsize, usbhid->inbuf, usbhid->inbuf_dma);
	usb_free_coherent(dev, usbhid->bufsize, usbhid->outbuf, usbhid->outbuf_dma);
956
	kfree(usbhid->cr);
957
	usb_free_coherent(dev, usbhid->bufsize, usbhid->ctrlbuf, usbhid->ctrlbuf_dma);
L
Linus Torvalds 已提交
958 959
}

J
Jiri Slaby 已提交
960 961 962
static int usbhid_parse(struct hid_device *hid)
{
	struct usb_interface *intf = to_usb_interface(hid->dev.parent);
L
Linus Torvalds 已提交
963 964 965
	struct usb_host_interface *interface = intf->cur_altsetting;
	struct usb_device *dev = interface_to_usbdev (intf);
	struct hid_descriptor *hdesc;
966
	u32 quirks = 0;
J
Jiri Slaby 已提交
967
	unsigned int rsize = 0;
968
	char *rdesc;
J
Jiri Slaby 已提交
969
	int ret, n;
L
Linus Torvalds 已提交
970

971 972
	quirks = usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
			le16_to_cpu(dev->descriptor.idProduct));
L
Linus Torvalds 已提交
973

974 975 976
	if (quirks & HID_QUIRK_IGNORE)
		return -ENODEV;

977 978 979 980 981 982 983 984
	/* Many keyboards and mice don't like to be polled for reports,
	 * so we will always set the HID_QUIRK_NOGET flag for them. */
	if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) {
		if (interface->desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_KEYBOARD ||
			interface->desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE)
				quirks |= HID_QUIRK_NOGET;
	}

985 986 987
	if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) &&
	    (!interface->desc.bNumEndpoints ||
	     usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
988
		dbg_hid("class descriptor not present\n");
J
Jiri Slaby 已提交
989
		return -ENODEV;
L
Linus Torvalds 已提交
990 991
	}

J
Jiri Slaby 已提交
992 993 994
	hid->version = le16_to_cpu(hdesc->bcdHID);
	hid->country = hdesc->bCountryCode;

L
Linus Torvalds 已提交
995 996 997 998 999
	for (n = 0; n < hdesc->bNumDescriptors; n++)
		if (hdesc->desc[n].bDescriptorType == HID_DT_REPORT)
			rsize = le16_to_cpu(hdesc->desc[n].wDescriptorLength);

	if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {
1000
		dbg_hid("weird size of report descriptor (%u)\n", rsize);
J
Jiri Slaby 已提交
1001
		return -EINVAL;
L
Linus Torvalds 已提交
1002 1003 1004
	}

	if (!(rdesc = kmalloc(rsize, GFP_KERNEL))) {
1005
		dbg_hid("couldn't allocate rdesc memory\n");
J
Jiri Slaby 已提交
1006
		return -ENOMEM;
L
Linus Torvalds 已提交
1007 1008
	}

1009 1010
	hid_set_idle(dev, interface->desc.bInterfaceNumber, 0, 0);

J
Jiri Slaby 已提交
1011 1012 1013
	ret = hid_get_class_descriptor(dev, interface->desc.bInterfaceNumber,
			HID_DT_REPORT, rdesc, rsize);
	if (ret < 0) {
1014
		dbg_hid("reading report descriptor failed\n");
L
Linus Torvalds 已提交
1015
		kfree(rdesc);
J
Jiri Slaby 已提交
1016
		goto err;
L
Linus Torvalds 已提交
1017 1018
	}

J
Jiri Slaby 已提交
1019 1020 1021
	ret = hid_parse_report(hid, rdesc, rsize);
	kfree(rdesc);
	if (ret) {
1022
		dbg_hid("parsing report descriptor failed\n");
J
Jiri Slaby 已提交
1023
		goto err;
L
Linus Torvalds 已提交
1024 1025
	}

1026
	hid->quirks |= quirks;
L
Linus Torvalds 已提交
1027

J
Jiri Slaby 已提交
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
	return 0;
err:
	return ret;
}

static int usbhid_start(struct hid_device *hid)
{
	struct usb_interface *intf = to_usb_interface(hid->dev.parent);
	struct usb_host_interface *interface = intf->cur_altsetting;
	struct usb_device *dev = interface_to_usbdev(intf);
1038
	struct usbhid_device *usbhid = hid->driver_data;
J
Jiri Slaby 已提交
1039 1040 1041
	unsigned int n, insize = 0;
	int ret;

1042 1043
	clear_bit(HID_DISCONNECTED, &usbhid->iofl);

J
Jiri Kosina 已提交
1044 1045 1046 1047
	usbhid->bufsize = HID_MIN_BUFFER_SIZE;
	hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize);
	hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize);
	hid_find_max_report(hid, HID_FEATURE_REPORT, &usbhid->bufsize);
1048

J
Jiri Kosina 已提交
1049 1050
	if (usbhid->bufsize > HID_MAX_BUFFER_SIZE)
		usbhid->bufsize = HID_MAX_BUFFER_SIZE;
1051 1052 1053 1054 1055 1056

	hid_find_max_report(hid, HID_INPUT_REPORT, &insize);

	if (insize > HID_MAX_BUFFER_SIZE)
		insize = HID_MAX_BUFFER_SIZE;

J
Jiri Slaby 已提交
1057 1058
	if (hid_alloc_buffers(dev, hid)) {
		ret = -ENOMEM;
L
Linus Torvalds 已提交
1059
		goto fail;
1060 1061
	}

L
Linus Torvalds 已提交
1062 1063 1064 1065 1066 1067
	for (n = 0; n < interface->desc.bNumEndpoints; n++) {
		struct usb_endpoint_descriptor *endpoint;
		int pipe;
		int interval;

		endpoint = &interface->endpoint[n].desc;
1068
		if (!usb_endpoint_xfer_int(endpoint))
L
Linus Torvalds 已提交
1069 1070 1071 1072
			continue;

		interval = endpoint->bInterval;

1073
		/* Some vendors give fullspeed interval on highspeed devides */
J
Jiri Slaby 已提交
1074
		if (hid->quirks & HID_QUIRK_FULLSPEED_INTERVAL &&
1075 1076 1077 1078 1079 1080
		    dev->speed == USB_SPEED_HIGH) {
			interval = fls(endpoint->bInterval*8);
			printk(KERN_INFO "%s: Fixing fullspeed to highspeed interval: %d -> %d\n",
			       hid->name, endpoint->bInterval, interval);
		}

L
Linus Torvalds 已提交
1081 1082 1083
		/* Change the polling interval of mice. */
		if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0)
			interval = hid_mousepoll_interval;
1084

J
Jiri Slaby 已提交
1085
		ret = -ENOMEM;
1086
		if (usb_endpoint_dir_in(endpoint)) {
J
Jiri Kosina 已提交
1087
			if (usbhid->urbin)
L
Linus Torvalds 已提交
1088
				continue;
J
Jiri Kosina 已提交
1089
			if (!(usbhid->urbin = usb_alloc_urb(0, GFP_KERNEL)))
L
Linus Torvalds 已提交
1090 1091
				goto fail;
			pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
J
Jiri Kosina 已提交
1092
			usb_fill_int_urb(usbhid->urbin, dev, pipe, usbhid->inbuf, insize,
L
Linus Torvalds 已提交
1093
					 hid_irq_in, hid, interval);
J
Jiri Kosina 已提交
1094 1095
			usbhid->urbin->transfer_dma = usbhid->inbuf_dma;
			usbhid->urbin->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
L
Linus Torvalds 已提交
1096
		} else {
J
Jiri Kosina 已提交
1097
			if (usbhid->urbout)
L
Linus Torvalds 已提交
1098
				continue;
J
Jiri Kosina 已提交
1099
			if (!(usbhid->urbout = usb_alloc_urb(0, GFP_KERNEL)))
L
Linus Torvalds 已提交
1100 1101
				goto fail;
			pipe = usb_sndintpipe(dev, endpoint->bEndpointAddress);
J
Jiri Kosina 已提交
1102
			usb_fill_int_urb(usbhid->urbout, dev, pipe, usbhid->outbuf, 0,
L
Linus Torvalds 已提交
1103
					 hid_irq_out, hid, interval);
J
Jiri Kosina 已提交
1104 1105
			usbhid->urbout->transfer_dma = usbhid->outbuf_dma;
			usbhid->urbout->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
L
Linus Torvalds 已提交
1106 1107 1108
		}
	}

J
Jiri Kosina 已提交
1109
	usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL);
J
Jiri Slaby 已提交
1110 1111
	if (!usbhid->urbctrl) {
		ret = -ENOMEM;
L
Linus Torvalds 已提交
1112
		goto fail;
J
Jiri Slaby 已提交
1113
	}
1114

J
Jiri Kosina 已提交
1115 1116 1117
	usb_fill_control_urb(usbhid->urbctrl, dev, 0, (void *) usbhid->cr,
			     usbhid->ctrlbuf, 1, hid_ctrl, hid);
	usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
1118
	usbhid->urbctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
J
Jiri Slaby 已提交
1119

J
Jiri Kosina 已提交
1120 1121
	if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
		usbhid_init_reports(hid);
J
Jiri Slaby 已提交
1122

1123 1124
	set_bit(HID_STARTED, &usbhid->iofl);

1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
	if (hid->quirks & HID_QUIRK_ALWAYS_POLL) {
		ret = usb_autopm_get_interface(usbhid->intf);
		if (ret)
			goto fail;
		usbhid->intf->needs_remote_wakeup = 1;
		ret = hid_start_in(hid);
		if (ret) {
			dev_err(&hid->dev,
				"failed to start in urb: %d\n", ret);
		}
		usb_autopm_put_interface(usbhid->intf);
	}

1138 1139 1140
	/* Some keyboards don't work until their LEDs have been set.
	 * Since BIOSes do set the LEDs, it must be safe for any device
	 * that supports the keyboard boot protocol.
1141 1142
	 * In addition, enable remote wakeup by default for all keyboard
	 * devices supporting the boot protocol.
1143 1144 1145
	 */
	if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT &&
			interface->desc.bInterfaceProtocol ==
1146
				USB_INTERFACE_PROTOCOL_KEYBOARD) {
1147
		usbhid_set_leds(hid);
1148 1149
		device_set_wakeup_enable(&dev->dev, 1);
	}
J
Jiri Slaby 已提交
1150
	return 0;
L
Linus Torvalds 已提交
1151 1152

fail:
J
Jiri Kosina 已提交
1153 1154 1155
	usb_free_urb(usbhid->urbin);
	usb_free_urb(usbhid->urbout);
	usb_free_urb(usbhid->urbctrl);
1156 1157 1158
	usbhid->urbin = NULL;
	usbhid->urbout = NULL;
	usbhid->urbctrl = NULL;
1159
	hid_free_buffers(dev, hid);
J
Jiri Slaby 已提交
1160
	return ret;
L
Linus Torvalds 已提交
1161 1162
}

J
Jiri Slaby 已提交
1163
static void usbhid_stop(struct hid_device *hid)
L
Linus Torvalds 已提交
1164
{
J
Jiri Slaby 已提交
1165
	struct usbhid_device *usbhid = hid->driver_data;
L
Linus Torvalds 已提交
1166

J
Jiri Slaby 已提交
1167
	if (WARN_ON(!usbhid))
L
Linus Torvalds 已提交
1168 1169
		return;

1170 1171 1172
	if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
		usbhid->intf->needs_remote_wakeup = 0;

1173
	clear_bit(HID_STARTED, &usbhid->iofl);
1174
	spin_lock_irq(&usbhid->lock);	/* Sync with error and led handlers */
1175
	set_bit(HID_DISCONNECTED, &usbhid->iofl);
1176
	spin_unlock_irq(&usbhid->lock);
J
Jiri Kosina 已提交
1177 1178 1179
	usb_kill_urb(usbhid->urbin);
	usb_kill_urb(usbhid->urbout);
	usb_kill_urb(usbhid->urbctrl);
L
Linus Torvalds 已提交
1180

1181
	hid_cancel_delayed_stuff(usbhid);
A
Alan Stern 已提交
1182

J
Jiri Slaby 已提交
1183 1184
	hid->claimed = 0;

J
Jiri Kosina 已提交
1185 1186 1187
	usb_free_urb(usbhid->urbin);
	usb_free_urb(usbhid->urbctrl);
	usb_free_urb(usbhid->urbout);
1188 1189 1190
	usbhid->urbin = NULL; /* don't mess up next start */
	usbhid->urbctrl = NULL;
	usbhid->urbout = NULL;
L
Linus Torvalds 已提交
1191

1192
	hid_free_buffers(hid_to_usb_dev(hid), hid);
L
Linus Torvalds 已提交
1193 1194
}

1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
static int usbhid_power(struct hid_device *hid, int lvl)
{
	int r = 0;

	switch (lvl) {
	case PM_HINT_FULLON:
		r = usbhid_get_power(hid);
		break;
	case PM_HINT_NORMAL:
		usbhid_put_power(hid);
		break;
	}
	return r;
}

1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
static void usbhid_request(struct hid_device *hid, struct hid_report *rep, int reqtype)
{
	switch (reqtype) {
	case HID_REQ_GET_REPORT:
		usbhid_submit_report(hid, rep, USB_DIR_IN);
		break;
	case HID_REQ_SET_REPORT:
		usbhid_submit_report(hid, rep, USB_DIR_OUT);
		break;
	}
}

1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
static int usbhid_raw_request(struct hid_device *hid, unsigned char reportnum,
			      __u8 *buf, size_t len, unsigned char rtype,
			      int reqtype)
{
	switch (reqtype) {
	case HID_REQ_GET_REPORT:
		return usbhid_get_raw_report(hid, reportnum, buf, len, rtype);
	case HID_REQ_SET_REPORT:
		return usbhid_set_raw_report(hid, reportnum, buf, len, rtype);
	default:
		return -EIO;
	}
}

1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
static int usbhid_idle(struct hid_device *hid, int report, int idle,
		int reqtype)
{
	struct usb_device *dev = hid_to_usb_dev(hid);
	struct usb_interface *intf = to_usb_interface(hid->dev.parent);
	struct usb_host_interface *interface = intf->cur_altsetting;
	int ifnum = interface->desc.bInterfaceNumber;

	if (reqtype != HID_REQ_SET_IDLE)
		return -EINVAL;

	return hid_set_idle(dev, ifnum, report, idle);
}

J
Jiri Slaby 已提交
1250 1251 1252 1253 1254 1255
static struct hid_ll_driver usb_hid_driver = {
	.parse = usbhid_parse,
	.start = usbhid_start,
	.stop = usbhid_stop,
	.open = usbhid_open,
	.close = usbhid_close,
1256
	.power = usbhid_power,
1257
	.request = usbhid_request,
1258
	.wait = usbhid_wait_io,
1259 1260
	.raw_request = usbhid_raw_request,
	.output_report = usbhid_output_report,
1261
	.idle = usbhid_idle,
J
Jiri Slaby 已提交
1262 1263
};

1264
static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
L
Linus Torvalds 已提交
1265
{
J
Jiri Slaby 已提交
1266
	struct usb_host_interface *interface = intf->cur_altsetting;
J
Jiri Slaby 已提交
1267
	struct usb_device *dev = interface_to_usbdev(intf);
1268
	struct usbhid_device *usbhid;
L
Linus Torvalds 已提交
1269
	struct hid_device *hid;
J
Jiri Slaby 已提交
1270
	unsigned int n, has_in = 0;
J
Jiri Slaby 已提交
1271 1272
	size_t len;
	int ret;
L
Linus Torvalds 已提交
1273

1274
	dbg_hid("HID probe called for ifnum %d\n",
L
Linus Torvalds 已提交
1275 1276
			intf->altsetting->desc.bInterfaceNumber);

J
Jiri Slaby 已提交
1277 1278 1279 1280
	for (n = 0; n < interface->desc.bNumEndpoints; n++)
		if (usb_endpoint_is_int_in(&interface->endpoint[n].desc))
			has_in++;
	if (!has_in) {
1281
		hid_err(intf, "couldn't find an input interrupt endpoint\n");
J
Jiri Slaby 已提交
1282 1283 1284
		return -ENODEV;
	}

J
Jiri Slaby 已提交
1285 1286 1287
	hid = hid_allocate_device();
	if (IS_ERR(hid))
		return PTR_ERR(hid);
L
Linus Torvalds 已提交
1288 1289

	usb_set_intfdata(intf, hid);
J
Jiri Slaby 已提交
1290
	hid->ll_driver = &usb_hid_driver;
J
Jiri Slaby 已提交
1291
	hid->ff_init = hid_pidff_init;
J
Jiri Slaby 已提交
1292
#ifdef CONFIG_USB_HIDDEV
J
Jiri Slaby 已提交
1293
	hid->hiddev_connect = hiddev_connect;
1294
	hid->hiddev_disconnect = hiddev_disconnect;
J
Jiri Slaby 已提交
1295 1296 1297 1298 1299 1300 1301 1302
	hid->hiddev_hid_event = hiddev_hid_event;
	hid->hiddev_report_event = hiddev_report_event;
#endif
	hid->dev.parent = &intf->dev;
	hid->bus = BUS_USB;
	hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
	hid->product = le16_to_cpu(dev->descriptor.idProduct);
	hid->name[0] = 0;
1303
	hid->quirks = usbhid_lookup_quirk(hid->vendor, hid->product);
1304 1305 1306
	if (intf->cur_altsetting->desc.bInterfaceProtocol ==
			USB_INTERFACE_PROTOCOL_MOUSE)
		hid->type = HID_TYPE_USBMOUSE;
1307 1308
	else if (intf->cur_altsetting->desc.bInterfaceProtocol == 0)
		hid->type = HID_TYPE_USBNONE;
L
Linus Torvalds 已提交
1309

J
Jiri Slaby 已提交
1310 1311
	if (dev->manufacturer)
		strlcpy(hid->name, dev->manufacturer, sizeof(hid->name));
L
Linus Torvalds 已提交
1312

J
Jiri Slaby 已提交
1313 1314 1315 1316
	if (dev->product) {
		if (dev->manufacturer)
			strlcat(hid->name, " ", sizeof(hid->name));
		strlcat(hid->name, dev->product, sizeof(hid->name));
L
Linus Torvalds 已提交
1317 1318
	}

J
Jiri Slaby 已提交
1319 1320 1321 1322
	if (!strlen(hid->name))
		snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x",
			 le16_to_cpu(dev->descriptor.idVendor),
			 le16_to_cpu(dev->descriptor.idProduct));
L
Linus Torvalds 已提交
1323

J
Jiri Slaby 已提交
1324 1325 1326 1327 1328 1329 1330 1331 1332
	usb_make_path(dev, hid->phys, sizeof(hid->phys));
	strlcat(hid->phys, "/input", sizeof(hid->phys));
	len = strlen(hid->phys);
	if (len < sizeof(hid->phys) - 1)
		snprintf(hid->phys + len, sizeof(hid->phys) - len,
			 "%d", intf->altsetting[0].desc.bInterfaceNumber);

	if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0)
		hid->uniq[0] = 0;
L
Linus Torvalds 已提交
1333

1334 1335 1336 1337 1338 1339 1340 1341
	usbhid = kzalloc(sizeof(*usbhid), GFP_KERNEL);
	if (usbhid == NULL) {
		ret = -ENOMEM;
		goto err;
	}

	hid->driver_data = usbhid;
	usbhid->hid = hid;
1342 1343
	usbhid->intf = intf;
	usbhid->ifnum = interface->desc.bInterfaceNumber;
1344

1345 1346 1347 1348 1349
	init_waitqueue_head(&usbhid->wait);
	INIT_WORK(&usbhid->reset_work, hid_reset);
	setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
	spin_lock_init(&usbhid->lock);

J
Jiri Slaby 已提交
1350 1351
	ret = hid_add_device(hid);
	if (ret) {
J
Jiri Slaby 已提交
1352
		if (ret != -ENODEV)
1353
			hid_err(intf, "can't add hid device: %d\n", ret);
1354
		goto err_free;
J
Jiri Slaby 已提交
1355
	}
J
Jiri Slaby 已提交
1356 1357

	return 0;
1358 1359
err_free:
	kfree(usbhid);
J
Jiri Slaby 已提交
1360 1361
err:
	hid_destroy_device(hid);
J
Jiri Slaby 已提交
1362
	return ret;
L
Linus Torvalds 已提交
1363 1364
}

1365
static void usbhid_disconnect(struct usb_interface *intf)
J
Jiri Slaby 已提交
1366 1367
{
	struct hid_device *hid = usb_get_intfdata(intf);
1368
	struct usbhid_device *usbhid;
J
Jiri Slaby 已提交
1369 1370 1371 1372

	if (WARN_ON(!hid))
		return;

1373
	usbhid = hid->driver_data;
1374 1375 1376
	spin_lock_irq(&usbhid->lock);	/* Sync with error and led handlers */
	set_bit(HID_DISCONNECTED, &usbhid->iofl);
	spin_unlock_irq(&usbhid->lock);
J
Jiri Slaby 已提交
1377
	hid_destroy_device(hid);
1378
	kfree(usbhid);
J
Jiri Slaby 已提交
1379 1380
}

1381 1382 1383 1384 1385 1386 1387 1388
static void hid_cancel_delayed_stuff(struct usbhid_device *usbhid)
{
	del_timer_sync(&usbhid->io_retry);
	cancel_work_sync(&usbhid->reset_work);
}

static void hid_cease_io(struct usbhid_device *usbhid)
{
1389
	del_timer_sync(&usbhid->io_retry);
1390 1391 1392 1393 1394
	usb_kill_urb(usbhid->urbin);
	usb_kill_urb(usbhid->urbctrl);
	usb_kill_urb(usbhid->urbout);
}

1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414
/* Treat USB reset pretty much the same as suspend/resume */
static int hid_pre_reset(struct usb_interface *intf)
{
	struct hid_device *hid = usb_get_intfdata(intf);
	struct usbhid_device *usbhid = hid->driver_data;

	spin_lock_irq(&usbhid->lock);
	set_bit(HID_RESET_PENDING, &usbhid->iofl);
	spin_unlock_irq(&usbhid->lock);
	hid_cease_io(usbhid);

	return 0;
}

/* Same routine used for post_reset and reset_resume */
static int hid_post_reset(struct usb_interface *intf)
{
	struct usb_device *dev = interface_to_usbdev (intf);
	struct hid_device *hid = usb_get_intfdata(intf);
	struct usbhid_device *usbhid = hid->driver_data;
1415
	struct usb_host_interface *interface = intf->cur_altsetting;
1416
	int status;
1417 1418 1419 1420 1421 1422 1423
	char *rdesc;

	/* Fetch and examine the HID report descriptor. If this
	 * has changed, then rebind. Since usbcore's check of the
	 * configuration descriptors passed, we already know that
	 * the size of the HID report descriptor has not changed.
	 */
1424
	rdesc = kmalloc(hid->dev_rsize, GFP_KERNEL);
1425 1426 1427 1428 1429 1430
	if (!rdesc) {
		dbg_hid("couldn't allocate rdesc memory (post_reset)\n");
		return 1;
	}
	status = hid_get_class_descriptor(dev,
				interface->desc.bInterfaceNumber,
1431
				HID_DT_REPORT, rdesc, hid->dev_rsize);
1432 1433 1434 1435 1436
	if (status < 0) {
		dbg_hid("reading report descriptor failed (post_reset)\n");
		kfree(rdesc);
		return 1;
	}
1437
	status = memcmp(rdesc, hid->dev_rdesc, hid->dev_rsize);
1438 1439 1440 1441 1442
	kfree(rdesc);
	if (status != 0) {
		dbg_hid("report descriptor changed\n");
		return 1;
	}
1443

1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
	spin_lock_irq(&usbhid->lock);
	clear_bit(HID_RESET_PENDING, &usbhid->iofl);
	spin_unlock_irq(&usbhid->lock);
	hid_set_idle(dev, intf->cur_altsetting->desc.bInterfaceNumber, 0, 0);
	status = hid_start_in(hid);
	if (status < 0)
		hid_io_error(hid);
	usbhid_restart_queues(usbhid);

	return 0;
}

int usbhid_get_power(struct hid_device *hid)
{
	struct usbhid_device *usbhid = hid->driver_data;
1459

1460 1461 1462 1463 1464 1465
	return usb_autopm_get_interface(usbhid->intf);
}

void usbhid_put_power(struct hid_device *hid)
{
	struct usbhid_device *usbhid = hid->driver_data;
1466

1467 1468 1469 1470
	usb_autopm_put_interface(usbhid->intf);
}


1471
#ifdef CONFIG_PM
1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
static int hid_resume_common(struct hid_device *hid, bool driver_suspended)
{
	struct usbhid_device *usbhid = hid->driver_data;
	int status;

	spin_lock_irq(&usbhid->lock);
	clear_bit(HID_SUSPENDED, &usbhid->iofl);
	usbhid_mark_busy(usbhid);

	if (test_bit(HID_CLEAR_HALT, &usbhid->iofl) ||
			test_bit(HID_RESET_PENDING, &usbhid->iofl))
		schedule_work(&usbhid->reset_work);
	usbhid->retry_delay = 0;

	usbhid_restart_queues(usbhid);
	spin_unlock_irq(&usbhid->lock);

	status = hid_start_in(hid);
	if (status < 0)
		hid_io_error(hid);

	if (driver_suspended && hid->driver && hid->driver->resume)
		status = hid->driver->resume(hid);
	return status;
}

1498
static int hid_suspend(struct usb_interface *intf, pm_message_t message)
L
Linus Torvalds 已提交
1499
{
1500
	struct hid_device *hid = usb_get_intfdata(intf);
J
Jiri Kosina 已提交
1501
	struct usbhid_device *usbhid = hid->driver_data;
1502
	int status = 0;
1503
	bool driver_suspended = false;
1504
	unsigned int ledcount;
L
Linus Torvalds 已提交
1505

1506
	if (PMSG_IS_AUTO(message)) {
1507
		ledcount = hidinput_count_leds(hid);
1508 1509 1510 1511 1512 1513
		spin_lock_irq(&usbhid->lock);	/* Sync with error handler */
		if (!test_bit(HID_RESET_PENDING, &usbhid->iofl)
		    && !test_bit(HID_CLEAR_HALT, &usbhid->iofl)
		    && !test_bit(HID_OUT_RUNNING, &usbhid->iofl)
		    && !test_bit(HID_CTRL_RUNNING, &usbhid->iofl)
		    && !test_bit(HID_KEYS_PRESSED, &usbhid->iofl)
1514
		    && (!ledcount || ignoreled))
1515
		{
1516
			set_bit(HID_SUSPENDED, &usbhid->iofl);
1517
			spin_unlock_irq(&usbhid->lock);
1518 1519 1520
			if (hid->driver && hid->driver->suspend) {
				status = hid->driver->suspend(hid, message);
				if (status < 0)
1521
					goto failed;
1522
			}
1523
			driver_suspended = true;
1524 1525 1526 1527 1528
		} else {
			usbhid_mark_busy(usbhid);
			spin_unlock_irq(&usbhid->lock);
			return -EBUSY;
		}
1529

1530
	} else {
1531 1532
		/* TODO: resume() might need to handle suspend failure */
		if (hid->driver && hid->driver->suspend)
1533
			status = hid->driver->suspend(hid, message);
1534
		driver_suspended = true;
1535
		spin_lock_irq(&usbhid->lock);
1536
		set_bit(HID_SUSPENDED, &usbhid->iofl);
1537
		spin_unlock_irq(&usbhid->lock);
1538
		if (usbhid_wait_io(hid) < 0)
1539
			status = -EIO;
1540 1541 1542 1543 1544
	}

	hid_cancel_delayed_stuff(usbhid);
	hid_cease_io(usbhid);

1545
	if (PMSG_IS_AUTO(message) && test_bit(HID_KEYS_PRESSED, &usbhid->iofl)) {
1546
		/* lost race against keypresses */
1547 1548
		status = -EBUSY;
		goto failed;
1549
	}
L
Linus Torvalds 已提交
1550
	dev_dbg(&intf->dev, "suspend\n");
1551
	return status;
1552 1553 1554 1555

 failed:
	hid_resume_common(hid, driver_suspended);
	return status;
L
Linus Torvalds 已提交
1556 1557 1558 1559 1560
}

static int hid_resume(struct usb_interface *intf)
{
	struct hid_device *hid = usb_get_intfdata (intf);
J
Jiri Kosina 已提交
1561
	struct usbhid_device *usbhid = hid->driver_data;
L
Linus Torvalds 已提交
1562 1563
	int status;

1564
	if (!test_bit(HID_STARTED, &usbhid->iofl))
1565 1566
		return 0;

1567
	status = hid_resume_common(hid, true);
L
Linus Torvalds 已提交
1568
	dev_dbg(&intf->dev, "resume status %d\n", status);
A
Alan Stern 已提交
1569
	return 0;
1570 1571
}

1572
static int hid_reset_resume(struct usb_interface *intf)
1573
{
1574 1575
	struct hid_device *hid = usb_get_intfdata(intf);
	struct usbhid_device *usbhid = hid->driver_data;
1576
	int status;
1577

1578
	clear_bit(HID_SUSPENDED, &usbhid->iofl);
1579 1580 1581 1582 1583 1584 1585
	status = hid_post_reset(intf);
	if (status >= 0 && hid->driver && hid->driver->reset_resume) {
		int ret = hid->driver->reset_resume(hid);
		if (ret < 0)
			status = ret;
	}
	return status;
1586 1587
}

1588
#endif /* CONFIG_PM */
1589

1590
static const struct usb_device_id hid_usb_ids[] = {
L
Linus Torvalds 已提交
1591 1592 1593 1594 1595 1596 1597 1598 1599
	{ .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
		.bInterfaceClass = USB_INTERFACE_CLASS_HID },
	{ }						/* Terminating entry */
};

MODULE_DEVICE_TABLE (usb, hid_usb_ids);

static struct usb_driver hid_driver = {
	.name =		"usbhid",
1600 1601
	.probe =	usbhid_probe,
	.disconnect =	usbhid_disconnect,
1602
#ifdef CONFIG_PM
L
Linus Torvalds 已提交
1603 1604
	.suspend =	hid_suspend,
	.resume =	hid_resume,
1605
	.reset_resume =	hid_reset_resume,
1606
#endif
1607 1608
	.pre_reset =	hid_pre_reset,
	.post_reset =	hid_post_reset,
L
Linus Torvalds 已提交
1609
	.id_table =	hid_usb_ids,
1610
	.supports_autosuspend = 1,
L
Linus Torvalds 已提交
1611 1612
};

1613 1614 1615 1616 1617
struct usb_interface *usbhid_find_interface(int minor)
{
	return usb_find_interface(&hid_driver, minor);
}

L
Linus Torvalds 已提交
1618 1619
static int __init hid_init(void)
{
1620 1621
	int retval = -ENOMEM;

1622 1623 1624
	retval = usbhid_quirks_init(quirks_param);
	if (retval)
		goto usbhid_quirks_init_fail;
L
Linus Torvalds 已提交
1625 1626 1627
	retval = usb_register(&hid_driver);
	if (retval)
		goto usb_register_fail;
1628
	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
L
Linus Torvalds 已提交
1629 1630 1631

	return 0;
usb_register_fail:
1632 1633
	usbhid_quirks_exit();
usbhid_quirks_init_fail:
L
Linus Torvalds 已提交
1634 1635 1636 1637 1638 1639
	return retval;
}

static void __exit hid_exit(void)
{
	usb_deregister(&hid_driver);
1640
	usbhid_quirks_exit();
L
Linus Torvalds 已提交
1641 1642 1643 1644 1645
}

module_init(hid_init);
module_exit(hid_exit);

1646 1647 1648
MODULE_AUTHOR("Andreas Gal");
MODULE_AUTHOR("Vojtech Pavlik");
MODULE_AUTHOR("Jiri Kosina");
L
Linus Torvalds 已提交
1649 1650
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE(DRIVER_LICENSE);