xref: /illumos-gate/usr/src/uts/common/io/usb/clients/hid/hid.c (revision 628e3cbed6489fa1db545d8524a06cd6535af456)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 
28 /*
29  * Human Interface Device driver (HID)
30  *
31  * The HID driver is a software driver which acts as a class
32  * driver for USB human input devices like keyboard, mouse,
33  * joystick etc and provides the class-specific interfaces
34  * between these client driver modules and the Universal Serial
35  * Bus Driver(USBA).
36  *
37  * NOTE: This driver is not DDI compliant in that it uses undocumented
38  * functions for logging (USB_DPRINTF_L*, usb_alloc_log_hdl, usb_free_log_hdl).
39  *
40  * Undocumented functions may go away in a future Solaris OS release.
41  *
42  * Please see the DDK for sample code of these functions, and for the usbskel
43  * skeleton template driver which contains scaled-down versions of these
44  * functions written in a DDI-compliant way.
45  */
46 
47 #define	USBDRV_MAJOR_VER	2
48 #define	USBDRV_MINOR_VER	0
49 
50 #include <sys/usb/usba.h>
51 #include <sys/usb/usba/genconsole.h>
52 #include <sys/usb/clients/hid/hid.h>
53 #include <sys/usb/clients/hid/hid_polled.h>
54 #include <sys/usb/clients/hidparser/hidparser.h>
55 #include <sys/usb/clients/hid/hidvar.h>
56 #include <sys/usb/clients/hid/hidminor.h>
57 #include <sys/usb/clients/hidparser/hid_parser_driver.h>
58 #include <sys/stropts.h>
59 #include <sys/sunddi.h>
60 
61 extern int ddi_create_internal_pathname(dev_info_t *, char *, int, minor_t);
62 extern void consconfig_link(major_t major, minor_t minor);
63 extern int consconfig_unlink(major_t major, minor_t minor);
64 
65 static void hid_consconfig_relink(void *);
66 
67 /* Debugging support */
68 uint_t	hid_errmask	= (uint_t)PRINT_MASK_ALL;
69 uint_t	hid_errlevel	= USB_LOG_L4;
70 uint_t	hid_instance_debug = (uint_t)-1;
71 
72 /* tunables */
73 int	hid_default_pipe_drain_timeout = HID_DEFAULT_PIPE_DRAIN_TIMEOUT;
74 int	hid_pm_mouse = 0;
75 
76 /* soft state structures */
77 #define	HID_INITIAL_SOFT_SPACE	4
78 static void *hid_statep;
79 
80 /* Callbacks */
81 static void hid_interrupt_pipe_callback(usb_pipe_handle_t,
82 		usb_intr_req_t *);
83 static void hid_default_pipe_callback(usb_pipe_handle_t, usb_ctrl_req_t *);
84 static void hid_interrupt_pipe_exception_callback(usb_pipe_handle_t,
85 		usb_intr_req_t *);
86 static void hid_default_pipe_exception_callback(usb_pipe_handle_t,
87 		usb_ctrl_req_t *);
88 static int hid_restore_state_event_callback(dev_info_t *);
89 static int hid_disconnect_event_callback(dev_info_t *);
90 static int hid_cpr_suspend(hid_state_t *hidp);
91 static void hid_cpr_resume(hid_state_t *hidp);
92 static void hid_power_change_callback(void *arg, int rval);
93 
94 /* Supporting routines */
95 static size_t hid_parse_hid_descr(usb_hid_descr_t *, size_t,
96 		usb_alt_if_data_t *, usb_ep_data_t *);
97 static int hid_parse_hid_descr_failure(hid_state_t *);
98 static int hid_handle_report_descriptor(hid_state_t *, int);
99 static void hid_set_idle(hid_state_t *);
100 static void hid_set_protocol(hid_state_t *, int);
101 static void hid_detach_cleanup(dev_info_t *, hid_state_t *);
102 
103 static int hid_start_intr_polling(hid_state_t *);
104 static void hid_close_intr_pipe(hid_state_t *);
105 static int hid_mctl_execute_cmd(hid_state_t *, int, hid_req_t *, mblk_t *);
106 static int hid_mctl_receive(queue_t *, mblk_t *);
107 static int hid_send_async_ctrl_request(hid_state_t *, hid_req_t *,
108 		uchar_t, int, ushort_t, hid_default_pipe_arg_t *);
109 static void hid_ioctl(queue_t *, mblk_t *);
110 
111 static void hid_create_pm_components(dev_info_t *, hid_state_t *);
112 static int hid_is_pm_enabled(dev_info_t *);
113 static void hid_restore_device_state(dev_info_t *, hid_state_t *);
114 static void hid_save_device_state(hid_state_t *);
115 
116 static void hid_qreply_merror(queue_t *, mblk_t *, uchar_t);
117 static mblk_t *hid_data2mblk(uchar_t *, int);
118 static void hid_flush(queue_t *);
119 
120 static int hid_pwrlvl0(hid_state_t *);
121 static int hid_pwrlvl1(hid_state_t *);
122 static int hid_pwrlvl2(hid_state_t *);
123 static int hid_pwrlvl3(hid_state_t *);
124 static void hid_pm_busy_component(hid_state_t *);
125 static void hid_pm_idle_component(hid_state_t *);
126 
127 static int hid_polled_read(hid_polled_handle_t, uchar_t **);
128 static int hid_polled_input_enter(hid_polled_handle_t);
129 static int hid_polled_input_exit(hid_polled_handle_t);
130 static int hid_polled_input_init(hid_state_t *);
131 static int hid_polled_input_fini(hid_state_t *);
132 
133 /* Streams entry points */
134 static int	hid_open(queue_t *, dev_t *, int, int, cred_t *);
135 static int	hid_close(queue_t *, int, cred_t *);
136 static int	hid_wput(queue_t *, mblk_t *);
137 static int	hid_wsrv(queue_t *);
138 
139 /* dev_ops entry points */
140 static int	hid_info(dev_info_t *, ddi_info_cmd_t, void *, void **);
141 static int	hid_attach(dev_info_t *, ddi_attach_cmd_t);
142 static int	hid_detach(dev_info_t *, ddi_detach_cmd_t);
143 static int	hid_power(dev_info_t *, int, int);
144 
145 /*
146  * Warlock is not aware of the automatic locking mechanisms for
147  * streams drivers.  The hid streams enter points are protected by
148  * a per module perimeter.  If the locking in hid is a bottleneck
149  * per queue pair or per queue locking may be used.  Since warlock
150  * is not aware of the streams perimeters, these notes have been added.
151  *
152  * Note that the perimeters do not protect the driver from callbacks
153  * happening while a streams entry point is executing.	So, the hid_mutex
154  * has been created to protect the data.
155  */
156 _NOTE(SCHEME_PROTECTS_DATA("unique per call", iocblk))
157 _NOTE(SCHEME_PROTECTS_DATA("unique per call", datab))
158 _NOTE(SCHEME_PROTECTS_DATA("unique per call", msgb))
159 _NOTE(SCHEME_PROTECTS_DATA("unique per call", queue))
160 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ctrl_req))
161 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_intr_req))
162 
163 /* module information */
164 static struct module_info hid_mod_info = {
165 	0x0ffff,			/* module id number */
166 	"hid",				/* module name */
167 	0,				/* min packet size accepted */
168 	INFPSZ,				/* max packet size accepted */
169 	512,				/* hi-water mark */
170 	128				/* lo-water mark */
171 };
172 
173 /* read queue information structure */
174 static struct qinit rinit = {
175 	NULL,				/* put procedure not needed */
176 	NULL,				/* service procedure not needed */
177 	hid_open,			/* called on startup */
178 	hid_close,			/* called on finish */
179 	NULL,				/* for future use */
180 	&hid_mod_info,			/* module information structure */
181 	NULL				/* module statistics structure */
182 };
183 
184 /* write queue information structure */
185 static struct qinit winit = {
186 	hid_wput,			/* put procedure */
187 	hid_wsrv,			/* service procedure */
188 	NULL,				/* open not used on write side */
189 	NULL,				/* close not used on write side */
190 	NULL,				/* for future use */
191 	&hid_mod_info,			/* module information structure */
192 	NULL				/* module statistics structure */
193 };
194 
195 struct streamtab hid_streamtab = {
196 	&rinit,
197 	&winit,
198 	NULL,			/* not a MUX */
199 	NULL			/* not a MUX */
200 };
201 
202 struct cb_ops hid_cb_ops = {
203 	nulldev,		/* open  */
204 	nulldev,		/* close */
205 	nulldev,		/* strategy */
206 	nulldev,		/* print */
207 	nulldev,		/* dump */
208 	nulldev,		/* read */
209 	nulldev,		/* write */
210 	nulldev,		/* ioctl */
211 	nulldev,		/* devmap */
212 	nulldev,		/* mmap */
213 	nulldev,		/* segmap */
214 	nochpoll,		/* poll */
215 	ddi_prop_op,		/* cb_prop_op */
216 	&hid_streamtab,		/* streamtab  */
217 	D_MP | D_MTPERQ
218 };
219 
220 
221 static struct dev_ops hid_ops = {
222 	DEVO_REV,		/* devo_rev, */
223 	0,			/* refcnt  */
224 	hid_info,		/* info */
225 	nulldev,		/* identify */
226 	nulldev,		/* probe */
227 	hid_attach,		/* attach */
228 	hid_detach,		/* detach */
229 	nodev,			/* reset */
230 	&hid_cb_ops,		/* driver operations */
231 	NULL,			/* bus operations */
232 	hid_power,		/* power */
233 	ddi_quiesce_not_needed,		/* quiesce */
234 };
235 
236 static struct modldrv hidmodldrv =	{
237 	&mod_driverops,
238 	"USB HID Client Driver",
239 	&hid_ops			/* driver ops */
240 };
241 
242 static struct modlinkage modlinkage = {
243 	MODREV_1,
244 	&hidmodldrv,
245 	NULL,
246 };
247 
248 static usb_event_t hid_events = {
249 	hid_disconnect_event_callback,
250 	hid_restore_state_event_callback,
251 	NULL,
252 	NULL,
253 };
254 
255 
256 int
257 _init(void)
258 {
259 	int rval;
260 
261 	if (((rval = ddi_soft_state_init(&hid_statep, sizeof (hid_state_t),
262 	    HID_INITIAL_SOFT_SPACE)) != 0)) {
263 
264 		return (rval);
265 	}
266 
267 	if ((rval = mod_install(&modlinkage)) != 0) {
268 		ddi_soft_state_fini(&hid_statep);
269 	}
270 
271 	return (rval);
272 }
273 
274 
275 int
276 _fini(void)
277 {
278 	int rval;
279 
280 	if ((rval = mod_remove(&modlinkage)) != 0) {
281 
282 		return (rval);
283 	}
284 
285 	ddi_soft_state_fini(&hid_statep);
286 
287 	return (rval);
288 }
289 
290 
291 int
292 _info(struct modinfo *modinfop)
293 {
294 	return (mod_info(&modlinkage, modinfop));
295 }
296 
297 
298 /*
299  * hid_info :
300  *	Get minor number, soft state structure etc.
301  */
302 /*ARGSUSED*/
303 static int
304 hid_info(dev_info_t *dip, ddi_info_cmd_t infocmd,
305 			void *arg, void **result)
306 {
307 	hid_state_t	*hidp = NULL;
308 	int		error = DDI_FAILURE;
309 	minor_t		minor = getminor((dev_t)arg);
310 	int		instance = HID_MINOR_TO_INSTANCE(minor);
311 
312 	switch (infocmd) {
313 	case DDI_INFO_DEVT2DEVINFO:
314 		if ((hidp = ddi_get_soft_state(hid_statep, instance)) != NULL) {
315 			*result = hidp->hid_dip;
316 			if (*result != NULL) {
317 				error = DDI_SUCCESS;
318 			}
319 		} else
320 			*result = NULL;
321 		break;
322 	case DDI_INFO_DEVT2INSTANCE:
323 		*result = (void *)(uintptr_t)instance;
324 		error = DDI_SUCCESS;
325 		break;
326 	default:
327 		break;
328 	}
329 
330 	return (error);
331 }
332 
333 
334 /*
335  * hid_attach :
336  *	Gets called at the time of attach. Do allocation,
337  *	and initialization of the software structure.
338  *	Get all the descriptors, setup the
339  *	report descriptor tree by calling hidparser
340  *	function.
341  */
342 static int
343 hid_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
344 {
345 
346 	int			instance = ddi_get_instance(dip);
347 	int			parse_hid_descr_error = 0;
348 	hid_state_t		*hidp = NULL;
349 	uint32_t		usage_page;
350 	uint32_t		usage;
351 	usb_client_dev_data_t	*dev_data;
352 	usb_alt_if_data_t	*altif_data;
353 	char			minor_name[HID_MINOR_NAME_LEN];
354 	usb_ep_data_t		*ep_data;
355 
356 	switch (cmd) {
357 		case DDI_ATTACH:
358 			break;
359 		case DDI_RESUME:
360 			hidp = ddi_get_soft_state(hid_statep, instance);
361 			hid_cpr_resume(hidp);
362 			return (DDI_SUCCESS);
363 		default:
364 
365 			return (DDI_FAILURE);
366 	}
367 
368 	/*
369 	 * Allocate softstate information and get softstate pointer
370 	 */
371 	if (ddi_soft_state_zalloc(hid_statep, instance) == DDI_SUCCESS) {
372 		hidp = ddi_get_soft_state(hid_statep, instance);
373 	}
374 	if (hidp == NULL) {
375 
376 		goto fail;
377 	}
378 
379 	hidp->hid_log_handle = usb_alloc_log_hdl(dip, NULL, &hid_errlevel,
380 	    &hid_errmask, &hid_instance_debug, 0);
381 
382 	hidp->hid_instance = instance;
383 	hidp->hid_dip = dip;
384 
385 	/*
386 	 * Register with USBA. Just retrieve interface descriptor
387 	 */
388 	if (usb_client_attach(dip, USBDRV_VERSION, 0) != USB_SUCCESS) {
389 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
390 		    "hid_attach: client attach failed");
391 
392 		goto fail;
393 	}
394 
395 	if (usb_get_dev_data(dip, &dev_data, USB_PARSE_LVL_IF, 0) !=
396 	    USB_SUCCESS) {
397 
398 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
399 		    "hid_attach: usb_get_dev_data() failed");
400 
401 		goto fail;
402 	}
403 
404 	/* initialize mutex */
405 	mutex_init(&hidp->hid_mutex, NULL, MUTEX_DRIVER,
406 	    dev_data->dev_iblock_cookie);
407 
408 	hidp->hid_attach_flags	|= HID_LOCK_INIT;
409 
410 	/* get interface data for alternate 0 */
411 	altif_data = &dev_data->dev_curr_cfg->
412 	    cfg_if[dev_data->dev_curr_if].if_alt[0];
413 
414 	mutex_enter(&hidp->hid_mutex);
415 	hidp->hid_dev_data	= dev_data;
416 	hidp->hid_dev_descr	= dev_data->dev_descr;
417 	hidp->hid_interfaceno	= dev_data->dev_curr_if;
418 	hidp->hid_if_descr	= altif_data->altif_descr;
419 	/*
420 	 * Make sure that the bInterfaceProtocol only has meaning to
421 	 * Boot Interface Subclass.
422 	 */
423 	if (hidp->hid_if_descr.bInterfaceSubClass != BOOT_INTERFACE)
424 		hidp->hid_if_descr.bInterfaceProtocol = NONE_PROTOCOL;
425 	mutex_exit(&hidp->hid_mutex);
426 
427 	if ((ep_data = usb_lookup_ep_data(dip, dev_data,
428 	    hidp->hid_interfaceno, 0, 0,
429 	    (uint_t)USB_EP_ATTR_INTR, (uint_t)USB_EP_DIR_IN)) == NULL) {
430 
431 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
432 		    "no interrupt IN endpoint found");
433 
434 		goto fail;
435 	}
436 
437 	mutex_enter(&hidp->hid_mutex);
438 	hidp->hid_ep_intr_descr = ep_data->ep_descr;
439 
440 	/*
441 	 * Attempt to find the hid descriptor, it could be after interface
442 	 * or after endpoint descriptors
443 	 */
444 	if (hid_parse_hid_descr(&hidp->hid_hid_descr, USB_HID_DESCR_SIZE,
445 	    altif_data, ep_data) != USB_HID_DESCR_SIZE) {
446 		/*
447 		 * If parsing of hid descriptor failed and
448 		 * the device is a keyboard or mouse, use predefined
449 		 * length and packet size.
450 		 */
451 		if (hid_parse_hid_descr_failure(hidp) == USB_FAILURE) {
452 			mutex_exit(&hidp->hid_mutex);
453 
454 			goto fail;
455 		}
456 
457 		/*
458 		 * hid descriptor was bad but since
459 		 * the device is a keyboard or mouse,
460 		 * we will use the default length
461 		 * and packet size.
462 		 */
463 		parse_hid_descr_error = HID_BAD_DESCR;
464 	} else {
465 		/* Parse hid descriptor successful */
466 
467 		USB_DPRINTF_L3(PRINT_MASK_ATTA, hidp->hid_log_handle,
468 		    "Hid descriptor:\n\t"
469 		    "bLength = 0x%x bDescriptorType = 0x%x "
470 		    "bcdHID = 0x%x\n\t"
471 		    "bCountryCode = 0x%x bNumDescriptors = 0x%x\n\t"
472 		    "bReportDescriptorType = 0x%x\n\t"
473 		    "wReportDescriptorLength = 0x%x",
474 		    hidp->hid_hid_descr.bLength,
475 		    hidp->hid_hid_descr.bDescriptorType,
476 		    hidp->hid_hid_descr.bcdHID,
477 		    hidp->hid_hid_descr.bCountryCode,
478 		    hidp->hid_hid_descr.bNumDescriptors,
479 		    hidp->hid_hid_descr.bReportDescriptorType,
480 		    hidp->hid_hid_descr.wReportDescriptorLength);
481 	}
482 
483 	/*
484 	 * Save a copy of the default pipe for easy reference
485 	 */
486 	hidp->hid_default_pipe = hidp->hid_dev_data->dev_default_ph;
487 
488 	/* we copied the descriptors we need, free the dev_data */
489 	usb_free_dev_data(dip, dev_data);
490 	hidp->hid_dev_data = NULL;
491 
492 	/*
493 	 * Don't get the report descriptor if parsing hid descriptor earlier
494 	 * failed since device probably won't return valid report descriptor
495 	 * either. Though parsing of hid descriptor failed, we have reached
496 	 * this point because the device has been identified as a
497 	 * keyboard or a mouse successfully and the default packet
498 	 * size and layout(in case of keyboard only) will be used, so it
499 	 * is ok to go ahead even if parsing of hid descriptor failed and
500 	 * we will not try to get the report descriptor.
501 	 */
502 	if (parse_hid_descr_error != HID_BAD_DESCR) {
503 		/*
504 		 * Sun mouse rev 105 is a bit slow in responding to this
505 		 * request and requires multiple retries
506 		 */
507 		int retry;
508 
509 		/*
510 		 * Get and parse the report descriptor.
511 		 * Set the packet size if parsing is successful.
512 		 * Note that we start retry at 1 to have a delay
513 		 * in the first iteration.
514 		 */
515 		mutex_exit(&hidp->hid_mutex);
516 		for (retry = 1; retry < HID_RETRY; retry++) {
517 			if (hid_handle_report_descriptor(hidp,
518 			    hidp->hid_interfaceno) == USB_SUCCESS) {
519 				break;
520 			}
521 			delay(retry * drv_usectohz(1000));
522 		}
523 		if (retry >= HID_RETRY) {
524 
525 			goto fail;
526 		}
527 		mutex_enter(&hidp->hid_mutex);
528 
529 		/*
530 		 * If packet size is zero, but the device is identified
531 		 * as a mouse or a keyboard, use predefined packet
532 		 * size.
533 		 */
534 		if (hidp->hid_packet_size == 0) {
535 			if (hidp->hid_if_descr.bInterfaceProtocol ==
536 			    KEYBOARD_PROTOCOL) {
537 				/* device is a keyboard */
538 				hidp->hid_packet_size = USBKPSZ;
539 			} else if (hidp->
540 			    hid_if_descr.bInterfaceProtocol ==
541 			    MOUSE_PROTOCOL) {
542 				/* device is a mouse */
543 				hidp->hid_packet_size = USBMSSZ;
544 			} else {
545 				USB_DPRINTF_L2(PRINT_MASK_ATTA,
546 				    hidp->hid_log_handle,
547 				    "Failed to find hid packet size");
548 				mutex_exit(&hidp->hid_mutex);
549 
550 				goto fail;
551 			}
552 		}
553 	}
554 
555 	/*
556 	 * initialize the pipe policy for the interrupt pipe.
557 	 */
558 	hidp->hid_intr_pipe_policy.pp_max_async_reqs = 1;
559 
560 	/*
561 	 * Make a clas specific request to SET_IDLE
562 	 * In this case send no reports if state has not changed.
563 	 * See HID 7.2.4.
564 	 */
565 	mutex_exit(&hidp->hid_mutex);
566 	hid_set_idle(hidp);
567 
568 	/* always initialize to report protocol */
569 	hid_set_protocol(hidp, SET_REPORT_PROTOCOL);
570 	mutex_enter(&hidp->hid_mutex);
571 
572 	/*
573 	 * Create minor node based on information from the
574 	 * descriptors
575 	 */
576 	switch (hidp->hid_if_descr.bInterfaceProtocol) {
577 	case KEYBOARD_PROTOCOL:
578 		(void) strcpy(minor_name, "keyboard");
579 
580 		break;
581 	case MOUSE_PROTOCOL:
582 		(void) strcpy(minor_name, "mouse");
583 
584 		break;
585 	default:
586 		if (hidparser_get_top_level_collection_usage(
587 		    hidp->hid_report_descr, &usage_page, &usage) !=
588 		    HIDPARSER_FAILURE) {
589 			switch (usage_page) {
590 			case HID_CONSUMER:
591 				switch (usage) {
592 				case HID_CONSUMER_CONTROL:
593 					(void) strcpy(minor_name,
594 					    "consumer_control");
595 
596 					break;
597 				default:
598 					(void) sprintf(minor_name,
599 					    "hid_%d_%d", usage_page, usage);
600 
601 					break;
602 				}
603 
604 				break;
605 			case HID_GENERIC_DESKTOP:
606 				switch (usage) {
607 				case HID_GD_POINTER:
608 					(void) strcpy(minor_name,
609 					    "pointer");
610 
611 					break;
612 				case HID_GD_MOUSE:
613 					(void) strcpy(minor_name,
614 					    "mouse");
615 
616 					break;
617 				case HID_GD_KEYBOARD:
618 					(void) strcpy(minor_name,
619 					    "keyboard");
620 
621 					break;
622 				default:
623 					(void) sprintf(minor_name,
624 					    "hid_%d_%d", usage_page, usage);
625 
626 					break;
627 				}
628 
629 				break;
630 			default:
631 				(void) sprintf(minor_name,
632 				    "hid_%d_%d", usage_page, usage);
633 
634 				break;
635 			}
636 		} else {
637 			USB_DPRINTF_L1(PRINT_MASK_ATTA, hidp->hid_log_handle,
638 			    "hid_attach: Unsupported HID device");
639 			mutex_exit(&hidp->hid_mutex);
640 
641 			goto fail;
642 		}
643 
644 		break;
645 	}
646 
647 	mutex_exit(&hidp->hid_mutex);
648 
649 	if ((ddi_create_minor_node(dip, minor_name, S_IFCHR,
650 	    HID_CONSTRUCT_EXTERNAL_MINOR(instance),
651 	    DDI_PSEUDO, 0)) != DDI_SUCCESS) {
652 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
653 		    "hid_attach: Could not create minor node");
654 
655 		goto fail;
656 	}
657 
658 	hidp->hid_km = B_FALSE;
659 
660 	/* create internal path for virtual */
661 	if (strcmp(minor_name, "mouse") == 0) {
662 		hidp->hid_km = B_TRUE;	/* mouse */
663 		if (ddi_create_internal_pathname(dip, "internal_mouse", S_IFCHR,
664 		    HID_CONSTRUCT_INTERNAL_MINOR(instance)) != DDI_SUCCESS) {
665 
666 			goto fail;
667 		}
668 	}
669 
670 	if (strcmp(minor_name, "keyboard") == 0) {
671 		hidp->hid_km = B_TRUE;	/* keyboard */
672 		if (ddi_create_internal_pathname(dip, "internal_keyboard",
673 		    S_IFCHR, HID_CONSTRUCT_INTERNAL_MINOR(instance)) !=
674 		    DDI_SUCCESS) {
675 
676 			goto fail;
677 		}
678 	}
679 
680 	mutex_enter(&hidp->hid_mutex);
681 	hidp->hid_attach_flags |= HID_MINOR_NODES;
682 	hidp->hid_dev_state = USB_DEV_ONLINE;
683 	mutex_exit(&hidp->hid_mutex);
684 
685 	/* register for all events */
686 	if (usb_register_event_cbs(dip, &hid_events, 0) != USB_SUCCESS) {
687 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
688 		    "usb_register_event_cbs failed");
689 
690 		goto fail;
691 	}
692 
693 	/* now create components to power manage this device */
694 	hid_create_pm_components(dip, hidp);
695 	hid_pm_busy_component(hidp);
696 	(void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
697 	hid_pm_idle_component(hidp);
698 
699 	/*
700 	 * report device
701 	 */
702 	ddi_report_dev(dip);
703 
704 	USB_DPRINTF_L4(PRINT_MASK_ATTA, hidp->hid_log_handle,
705 	    "hid_attach: End");
706 
707 	return (DDI_SUCCESS);
708 
709 fail:
710 	if (hidp) {
711 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
712 		    "hid_attach: fail");
713 		hid_detach_cleanup(dip, hidp);
714 	}
715 
716 	return (DDI_FAILURE);
717 }
718 
719 
720 /*
721  * hid_detach :
722  *	Gets called at the time of detach.
723  */
724 static int
725 hid_detach(dev_info_t *dip, ddi_detach_cmd_t	cmd)
726 {
727 	int instance = ddi_get_instance(dip);
728 	hid_state_t	*hidp;
729 	int		rval = DDI_FAILURE;
730 
731 	hidp = ddi_get_soft_state(hid_statep, instance);
732 
733 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle, "hid_detach");
734 
735 	switch (cmd) {
736 	case DDI_DETACH:
737 		/*
738 		 * Undo	what we	did in client_attach, freeing resources
739 		 * and removing	things we installed.  The system
740 		 * framework guarantees	we are not active with this devinfo
741 		 * node	in any other entry points at this time.
742 		 */
743 		hid_detach_cleanup(dip, hidp);
744 
745 		return (DDI_SUCCESS);
746 	case DDI_SUSPEND:
747 		rval = hid_cpr_suspend(hidp);
748 
749 		return (rval == USB_SUCCESS ? DDI_SUCCESS : DDI_FAILURE);
750 	default:
751 		break;
752 	}
753 
754 	return (rval);
755 }
756 
757 /*
758  * hid_open :
759  *	Open entry point: Opens the interrupt pipe.  Sets up queues.
760  */
761 /*ARGSUSED*/
762 static int
763 hid_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
764 {
765 	int no_of_ep = 0;
766 	int rval;
767 	int instance;
768 	hid_state_t *hidp;
769 	ddi_taskq_t *taskq;
770 	char taskqname[32];
771 	minor_t minor = getminor(*devp);
772 
773 	instance = HID_MINOR_TO_INSTANCE(minor);
774 
775 	hidp = ddi_get_soft_state(hid_statep, instance);
776 	if (hidp == NULL) {
777 
778 		return (ENXIO);
779 	}
780 
781 	USB_DPRINTF_L4(PRINT_MASK_OPEN, hidp->hid_log_handle,
782 	    "hid_open: Begin");
783 
784 	if (sflag) {
785 		/* clone open NOT supported here */
786 
787 		return (ENXIO);
788 	}
789 
790 	mutex_enter(&hidp->hid_mutex);
791 
792 	/*
793 	 * This is a workaround:
794 	 *	Currently, if we open an already disconnected device, and send
795 	 *	a CONSOPENPOLL ioctl to it, the system will panic, please refer
796 	 *	to the processing HID_OPEN_POLLED_INPUT ioctl in the routine
797 	 *	hid_mctl_receive().
798 	 *	The consconfig_dacf module need this interface to detect if the
799 	 *	device is already disconnnected.
800 	 */
801 	if (HID_IS_INTERNAL_OPEN(minor) &&
802 	    (hidp->hid_dev_state == USB_DEV_DISCONNECTED)) {
803 		mutex_exit(&hidp->hid_mutex);
804 
805 		return (ENODEV);
806 	}
807 
808 	if (q->q_ptr || (hidp->hid_streams_flags == HID_STREAMS_OPEN)) {
809 		/*
810 		 * Exit if the same minor node is already open
811 		 */
812 		if (!hidp->hid_km || hidp->hid_minor == minor) {
813 			mutex_exit(&hidp->hid_mutex);
814 
815 			return (0);
816 		}
817 
818 		/*
819 		 * Check whether it is switch between physical and virtual
820 		 *
821 		 * Opening from virtual while the device is being physically
822 		 * opened by an application should not happen. So we ASSERT
823 		 * this in DEBUG version, and return error in the non-DEBUG
824 		 * case.
825 		 */
826 		ASSERT(!HID_IS_INTERNAL_OPEN(minor));
827 
828 		if (HID_IS_INTERNAL_OPEN(minor)) {
829 			mutex_exit(&hidp->hid_mutex);
830 
831 			return (EINVAL);
832 		}
833 
834 		/*
835 		 * Opening the physical one while it is being underneath
836 		 * the virtual one.
837 		 *
838 		 * consconfig_unlink is called to unlink this device from
839 		 * the virtual one, thus the old stream serving for this
840 		 * device under the virtual one is closed, and then the
841 		 * lower driver's close routine (here is hid_close) is also
842 		 * called to accomplish the whole stream close. Here we have
843 		 * to drop the lock because hid_close also needs the lock.
844 		 *
845 		 * For keyboard, the old stream is:
846 		 *	conskbd->["pushmod"->]"kbd_vp driver"
847 		 * For mouse, the old stream is:
848 		 *	consms->["pushmod"->]"mouse_vp driver"
849 		 *
850 		 * After the consconfig_unlink returns, the old stream is closed
851 		 * and we grab the lock again to reopen this device as normal.
852 		 */
853 		mutex_exit(&hidp->hid_mutex);
854 
855 		/*
856 		 * We create a taskq with one thread, which will be used at the
857 		 * time of closing physical keyboard, refer to hid_close().
858 		 */
859 		(void) sprintf(taskqname, "hid_taskq_%d", instance);
860 		taskq = ddi_taskq_create(hidp->hid_dip, taskqname, 1,
861 		    TASKQ_DEFAULTPRI, 0);
862 
863 		if (!taskq) {
864 			USB_DPRINTF_L3(PRINT_MASK_ALL, hidp->hid_log_handle,
865 			    "hid_open: device is temporarily unavailable,"
866 			    " try it later");
867 
868 			return (EAGAIN);
869 		}
870 
871 		/*
872 		 * If unlink fails, fail the physical open.
873 		 */
874 		if ((rval = consconfig_unlink(ddi_driver_major(hidp->hid_dip),
875 		    HID_MINOR_MAKE_INTERNAL(minor))) != 0) {
876 			ddi_taskq_destroy(taskq);
877 
878 			return (rval);
879 		}
880 
881 		mutex_enter(&hidp->hid_mutex);
882 
883 		ASSERT(!hidp->hid_taskq);
884 		hidp->hid_taskq = taskq;
885 	}
886 
887 	/* Initialize the queue pointers */
888 	q->q_ptr = hidp;
889 	WR(q)->q_ptr = hidp;
890 
891 	hidp->hid_rq_ptr = q;
892 	hidp->hid_wq_ptr = WR(q);
893 
894 	if (flag & FREAD) {
895 		hidp->hid_interrupt_pipe = NULL;
896 		no_of_ep = hidp->hid_if_descr.bNumEndpoints;
897 
898 		/* Check if interrupt endpoint exists */
899 		if (no_of_ep > 0) {
900 			/* Open the interrupt pipe */
901 			mutex_exit(&hidp->hid_mutex);
902 
903 			if (usb_pipe_open(hidp->hid_dip,
904 			    &hidp->hid_ep_intr_descr,
905 			    &hidp->hid_intr_pipe_policy, USB_FLAGS_SLEEP,
906 			    &hidp->hid_interrupt_pipe) !=
907 			    USB_SUCCESS) {
908 
909 				return (EIO);
910 			}
911 			mutex_enter(&hidp->hid_mutex);
912 		}
913 	} else {
914 		/* NOT FREAD */
915 		mutex_exit(&hidp->hid_mutex);
916 
917 		return (EIO);
918 	}
919 	mutex_exit(&hidp->hid_mutex);
920 
921 	hid_pm_busy_component(hidp);
922 	(void) pm_raise_power(hidp->hid_dip, 0, USB_DEV_OS_FULL_PWR);
923 
924 	mutex_enter(&hidp->hid_mutex);
925 	hidp->hid_streams_flags = HID_STREAMS_OPEN;
926 	mutex_exit(&hidp->hid_mutex);
927 
928 	qprocson(q);
929 
930 	mutex_enter(&hidp->hid_mutex);
931 
932 	if ((rval = hid_start_intr_polling(hidp)) != USB_SUCCESS) {
933 		USB_DPRINTF_L2(PRINT_MASK_OPEN, hidp->hid_log_handle,
934 		    "unable to start intr pipe polling. rval = %d", rval);
935 
936 		hidp->hid_streams_flags = HID_STREAMS_DISMANTLING;
937 		mutex_exit(&hidp->hid_mutex);
938 
939 		usb_pipe_close(hidp->hid_dip, hidp->hid_interrupt_pipe,
940 		    USB_FLAGS_SLEEP, NULL, NULL);
941 
942 		mutex_enter(&hidp->hid_mutex);
943 		hidp->hid_interrupt_pipe = NULL;
944 		mutex_exit(&hidp->hid_mutex);
945 
946 		qprocsoff(q);
947 		hid_pm_idle_component(hidp);
948 
949 		return (EIO);
950 	}
951 	hidp->hid_minor = minor;
952 	mutex_exit(&hidp->hid_mutex);
953 
954 	USB_DPRINTF_L4(PRINT_MASK_OPEN, hidp->hid_log_handle, "hid_open: End");
955 
956 	/*
957 	 * Keyboard and mouse is Power managed by device activity.
958 	 * All other devices go busy on open and idle on close.
959 	 */
960 	switch (hidp->hid_pm->hid_pm_strategy) {
961 	case HID_PM_ACTIVITY:
962 		hid_pm_idle_component(hidp);
963 
964 		break;
965 	default:
966 
967 		break;
968 	}
969 
970 	return (0);
971 }
972 
973 
974 /*
975  * hid_close :
976  *	Close entry point.
977  */
978 /*ARGSUSED*/
979 static int
980 hid_close(queue_t *q, int flag, cred_t *credp)
981 {
982 	hid_state_t	*hidp = q->q_ptr;
983 	ddi_taskq_t	*taskq;
984 	queue_t		*wq;
985 	mblk_t		*mp;
986 
987 	USB_DPRINTF_L4(PRINT_MASK_CLOSE, hidp->hid_log_handle, "hid_close:");
988 
989 	mutex_enter(&hidp->hid_mutex);
990 	hidp->hid_streams_flags = HID_STREAMS_DISMANTLING;
991 	hid_close_intr_pipe(hidp);
992 	mutex_exit(&hidp->hid_mutex);
993 
994 	/*
995 	 * In case there are any outstanding requests on
996 	 * the default pipe, wait forever for them to complete.
997 	 */
998 	(void) usb_pipe_drain_reqs(hidp->hid_dip,
999 	    hidp->hid_default_pipe, 0, USB_FLAGS_SLEEP, NULL, 0);
1000 
1001 	/* drain any M_CTLS on the WQ */
1002 	mutex_enter(&hidp->hid_mutex);
1003 	wq = hidp->hid_wq_ptr;
1004 	while (mp = getq(wq)) {
1005 		hid_qreply_merror(wq, mp, EIO);
1006 		mutex_exit(&hidp->hid_mutex);
1007 		hid_pm_idle_component(hidp);
1008 		mutex_enter(&hidp->hid_mutex);
1009 	}
1010 	mutex_exit(&hidp->hid_mutex);
1011 
1012 	qprocsoff(q);
1013 	q->q_ptr = NULL;
1014 
1015 	/*
1016 	 * Devices other than keyboard/mouse go idle on close.
1017 	 */
1018 	switch (hidp->hid_pm->hid_pm_strategy) {
1019 	case HID_PM_ACTIVITY:
1020 
1021 		break;
1022 	default:
1023 		hid_pm_idle_component(hidp);
1024 
1025 		break;
1026 	}
1027 	USB_DPRINTF_L4(PRINT_MASK_CLOSE, hidp->hid_log_handle,
1028 	    "hid_close: End");
1029 
1030 	if (hidp->hid_km && !HID_IS_INTERNAL_OPEN(hidp->hid_minor)) {
1031 		/*
1032 		 * Closing physical keyboard/mouse
1033 		 *
1034 		 * Link it back to virtual keyboard/mouse,
1035 		 * and hid_open will be called as a result
1036 		 * of the consconfig_link call.
1037 		 *
1038 		 * If linking back fails, this specific device
1039 		 * will not be available underneath the virtual
1040 		 * one, and can only be accessed via physical
1041 		 * open.
1042 		 *
1043 		 * Up to now, we have been running in a thread context
1044 		 * which has corresponding LWP and proc context. This
1045 		 * thread represents a user thread executing in kernel
1046 		 * mode. The action of linking current keyboard to virtual
1047 		 * keyboard is completely a kernel action. It should not
1048 		 * be executed in a user thread context. So, we start a
1049 		 * new kernel thread to relink the keyboard to virtual
1050 		 * keyboard.
1051 		 */
1052 		mutex_enter(&hidp->hid_mutex);
1053 		taskq = hidp->hid_taskq;
1054 		hidp->hid_taskq = NULL;
1055 		mutex_exit(&hidp->hid_mutex);
1056 		(void) ddi_taskq_dispatch(taskq, hid_consconfig_relink,
1057 		    hidp, DDI_SLEEP);
1058 		ddi_taskq_wait(taskq);
1059 		ddi_taskq_destroy(taskq);
1060 	}
1061 
1062 	return (0);
1063 }
1064 
1065 
1066 /*
1067  * hid_wput :
1068  *	write put routine for the hid module
1069  */
1070 static int
1071 hid_wput(queue_t *q, mblk_t *mp)
1072 {
1073 	int		error = USB_SUCCESS;
1074 	hid_state_t	*hidp = (hid_state_t *)q->q_ptr;
1075 
1076 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1077 	    "hid_wput: Begin");
1078 
1079 	/* See if the upper module is passing the right thing */
1080 	ASSERT(mp != NULL);
1081 	ASSERT(mp->b_datap != NULL);
1082 
1083 	switch (mp->b_datap->db_type) {
1084 	case M_FLUSH:  /* Canonical flush handling */
1085 		if (*mp->b_rptr & FLUSHW) {
1086 			flushq(q, FLUSHDATA);
1087 		}
1088 
1089 		/* read queue not used so just send up */
1090 		if (*mp->b_rptr & FLUSHR) {
1091 			*mp->b_rptr &= ~FLUSHW;
1092 			qreply(q, mp);
1093 		} else {
1094 			freemsg(mp);
1095 		}
1096 
1097 		break;
1098 	case M_IOCTL:
1099 		hid_ioctl(q, mp);
1100 
1101 		break;
1102 	case M_CTL:
1103 		/* we are busy now */
1104 		hid_pm_busy_component(hidp);
1105 
1106 		if (q->q_first) {
1107 			(void) putq(q, mp);
1108 		} else {
1109 			error = hid_mctl_receive(q, mp);
1110 			switch (error) {
1111 			case HID_ENQUEUE:
1112 				/*
1113 				 * put this mblk on the WQ for the wsrv to
1114 				 * process
1115 				 */
1116 				(void) putq(q, mp);
1117 
1118 				break;
1119 			case HID_INPROGRESS:
1120 				/* request has been queued to the device */
1121 
1122 				break;
1123 			case HID_SUCCESS:
1124 				/*
1125 				 * returned by M_CTLS that are processed
1126 				 * immediately
1127 				 */
1128 
1129 				/* FALLTHRU */
1130 			case HID_FAILURE:
1131 			default:
1132 				hid_pm_idle_component(hidp);
1133 				break;
1134 			}
1135 		}
1136 		break;
1137 	default:
1138 		hid_qreply_merror(q, mp, EINVAL);
1139 		error = USB_FAILURE;
1140 		break;
1141 	}
1142 
1143 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1144 	    "hid_wput: End");
1145 
1146 	return (DDI_SUCCESS);
1147 }
1148 
1149 
1150 /*
1151  * hid_wsrv :
1152  *	Write service routine for hid. When a message arrives through
1153  *	hid_wput(), it is kept in write queue to be serviced later.
1154  */
1155 static int
1156 hid_wsrv(queue_t *q)
1157 {
1158 	int		error;
1159 	mblk_t		*mp;
1160 	hid_state_t	*hidp = (hid_state_t *)q->q_ptr;
1161 
1162 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1163 	    "hid_wsrv: Begin");
1164 
1165 	mutex_enter(&hidp->hid_mutex);
1166 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1167 	    "hid_wsrv: dev_state: %s",
1168 	    usb_str_dev_state(hidp->hid_dev_state));
1169 
1170 	/*
1171 	 * raise power if we are powered down. It is OK to block here since
1172 	 * we have a separate thread to process this STREAM
1173 	 */
1174 	if (hidp->hid_dev_state == USB_DEV_PWRED_DOWN) {
1175 		mutex_exit(&hidp->hid_mutex);
1176 		(void) pm_raise_power(hidp->hid_dip, 0, USB_DEV_OS_FULL_PWR);
1177 		mutex_enter(&hidp->hid_mutex);
1178 	}
1179 
1180 	/*
1181 	 * continue servicing all the M_CTL's till the queue is empty
1182 	 * or the device gets disconnected or till a hid_close()
1183 	 */
1184 	while ((hidp->hid_dev_state == USB_DEV_ONLINE) &&
1185 	    (hidp->hid_streams_flags != HID_STREAMS_DISMANTLING) &&
1186 	    ((mp = getq(q)) != NULL)) {
1187 
1188 		/* Send a message down */
1189 		mutex_exit(&hidp->hid_mutex);
1190 		error = hid_mctl_receive(q, mp);
1191 		switch (error) {
1192 		case HID_ENQUEUE:
1193 			/* put this mblk back on q to preserve order */
1194 			(void) putbq(q, mp);
1195 
1196 			break;
1197 		case HID_INPROGRESS:
1198 			/* request has been queued to the device */
1199 
1200 			break;
1201 		case HID_SUCCESS:
1202 		case HID_FAILURE:
1203 		default:
1204 			hid_pm_idle_component(hidp);
1205 
1206 			break;
1207 		}
1208 		mutex_enter(&hidp->hid_mutex);
1209 	}
1210 	mutex_exit(&hidp->hid_mutex);
1211 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1212 	    "hid_wsrv: End");
1213 
1214 	return (DDI_SUCCESS);
1215 }
1216 
1217 
1218 /*
1219  * hid_power:
1220  *	power entry point
1221  */
1222 static int
1223 hid_power(dev_info_t *dip, int comp, int level)
1224 {
1225 	int		instance = ddi_get_instance(dip);
1226 	hid_state_t	*hidp;
1227 	hid_power_t	*hidpm;
1228 	int		retval;
1229 
1230 	hidp = ddi_get_soft_state(hid_statep, instance);
1231 
1232 	USB_DPRINTF_L3(PRINT_MASK_PM, hidp->hid_log_handle, "hid_power:"
1233 	    " hid_state: comp=%d level=%d", comp, level);
1234 
1235 	/* check if we are transitioning to a legal power level */
1236 	mutex_enter(&hidp->hid_mutex);
1237 	hidpm = hidp->hid_pm;
1238 
1239 	if (USB_DEV_PWRSTATE_OK(hidpm->hid_pwr_states, level)) {
1240 
1241 		USB_DPRINTF_L2(PRINT_MASK_PM, hidp->hid_log_handle,
1242 		    "hid_power: illegal level=%d hid_pwr_states=%d",
1243 		    level, hidpm->hid_pwr_states);
1244 
1245 		mutex_exit(&hidp->hid_mutex);
1246 
1247 		return (DDI_FAILURE);
1248 	}
1249 
1250 	switch (level) {
1251 	case USB_DEV_OS_PWR_OFF:
1252 		retval = hid_pwrlvl0(hidp);
1253 		break;
1254 	case USB_DEV_OS_PWR_1:
1255 		retval = hid_pwrlvl1(hidp);
1256 		break;
1257 	case USB_DEV_OS_PWR_2:
1258 		retval = hid_pwrlvl2(hidp);
1259 		break;
1260 	case USB_DEV_OS_FULL_PWR:
1261 		retval = hid_pwrlvl3(hidp);
1262 		break;
1263 	default:
1264 		retval = USB_FAILURE;
1265 		break;
1266 	}
1267 
1268 	mutex_exit(&hidp->hid_mutex);
1269 
1270 	return ((retval == USB_SUCCESS) ? DDI_SUCCESS : DDI_FAILURE);
1271 }
1272 
1273 
1274 /*
1275  * hid_interrupt_pipe_callback:
1276  *	Callback function for the hid intr pipe. This function is called by
1277  *	USBA when a buffer has been filled. This driver does not cook the data,
1278  *	it just sends the message up.
1279  */
1280 static void
1281 hid_interrupt_pipe_callback(usb_pipe_handle_t pipe, usb_intr_req_t *req)
1282 {
1283 	hid_state_t *hidp = (hid_state_t *)req->intr_client_private;
1284 	queue_t	*q;
1285 
1286 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1287 	    "hid_interrupt_pipe_callback: ph = 0x%p req = 0x%p",
1288 	    (void *)pipe, (void *)req);
1289 
1290 	hid_pm_busy_component(hidp);
1291 
1292 	mutex_enter(&hidp->hid_mutex);
1293 
1294 	/*
1295 	 * If hid_close() is in progress, we shouldn't try accessing queue
1296 	 * Otherwise indicate that a putnext is going to happen, so
1297 	 * if close after this, that should wait for the putnext to finish.
1298 	 */
1299 	if (hidp->hid_streams_flags != HID_STREAMS_DISMANTLING) {
1300 		/*
1301 		 * Check if data can be put to the next queue.
1302 		 */
1303 		if (!canputnext(hidp->hid_rq_ptr)) {
1304 			USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
1305 			    "Buffer flushed when overflowed.");
1306 
1307 			/* Flush the queue above */
1308 			hid_flush(hidp->hid_rq_ptr);
1309 			mutex_exit(&hidp->hid_mutex);
1310 		} else {
1311 			q = hidp->hid_rq_ptr;
1312 			mutex_exit(&hidp->hid_mutex);
1313 
1314 			/* Put data upstream */
1315 			putnext(q, req->intr_data);
1316 
1317 			/* usb_free_intr_req should not free data */
1318 			req->intr_data = NULL;
1319 		}
1320 	} else {
1321 		mutex_exit(&hidp->hid_mutex);
1322 	}
1323 
1324 	/* free request and data */
1325 	usb_free_intr_req(req);
1326 	hid_pm_idle_component(hidp);
1327 }
1328 
1329 
1330 /*
1331  * hid_default_pipe_callback :
1332  *	Callback routine for the asynchronous control transfer
1333  *	Called from hid_send_async_ctrl_request() where we open
1334  *	the pipe in exclusive mode
1335  */
1336 static void
1337 hid_default_pipe_callback(usb_pipe_handle_t pipe, usb_ctrl_req_t *req)
1338 {
1339 	hid_default_pipe_arg_t *hid_default_pipe_arg =
1340 	    (hid_default_pipe_arg_t *)req->ctrl_client_private;
1341 	hid_state_t *hidp = hid_default_pipe_arg->hid_default_pipe_arg_hidp;
1342 	mblk_t		*mctl_mp;
1343 	mblk_t		*data = NULL;
1344 	queue_t		*q;
1345 
1346 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1347 	    "hid_default_pipe_callback: "
1348 	    "ph = 0x%p, req = 0x%p, data= 0x%p",
1349 	    (void *)pipe, (void *)req, (void *)data);
1350 
1351 	ASSERT((req->ctrl_cb_flags & USB_CB_INTR_CONTEXT) == 0);
1352 
1353 	if (req->ctrl_data) {
1354 		data = req->ctrl_data;
1355 		req->ctrl_data = NULL;
1356 	}
1357 
1358 	/*
1359 	 * Free the b_cont of the original message that was sent down.
1360 	 */
1361 	mctl_mp = hid_default_pipe_arg->hid_default_pipe_arg_mblk;
1362 	freemsg(mctl_mp->b_cont);
1363 
1364 	/* chain the mblk received to the original & send it up */
1365 	mctl_mp->b_cont = data;
1366 	mutex_enter(&hidp->hid_mutex);
1367 	q = hidp->hid_rq_ptr;
1368 	mutex_exit(&hidp->hid_mutex);
1369 	if (canputnext(q)) {
1370 		putnext(q, mctl_mp);
1371 	} else {
1372 		freemsg(mctl_mp); /* avoid leak */
1373 	}
1374 
1375 	/*
1376 	 * Free the argument for the asynchronous callback
1377 	 */
1378 	kmem_free(hid_default_pipe_arg, sizeof (hid_default_pipe_arg_t));
1379 
1380 	/*
1381 	 * Free the control pipe request structure.
1382 	 */
1383 	usb_free_ctrl_req(req);
1384 
1385 	mutex_enter(&hidp->hid_mutex);
1386 	hidp->hid_default_pipe_req--;
1387 	ASSERT(hidp->hid_default_pipe_req >= 0);
1388 	mutex_exit(&hidp->hid_mutex);
1389 
1390 	hid_pm_idle_component(hidp);
1391 	qenable(hidp->hid_wq_ptr);
1392 }
1393 
1394 
1395 /*
1396  * hid_interrupt_pipe_exception_callback:
1397  *	Exception callback routine for interrupt pipe. If there is any data,
1398  *	destroy it. No threads are waiting for the exception callback.
1399  */
1400 /*ARGSUSED*/
1401 static void
1402 hid_interrupt_pipe_exception_callback(usb_pipe_handle_t pipe,
1403     usb_intr_req_t *req)
1404 {
1405 	hid_state_t	*hidp = (hid_state_t *)req->intr_client_private;
1406 	mblk_t		*data = req->intr_data;
1407 	usb_cb_flags_t	flags = req->intr_cb_flags;
1408 	int		rval;
1409 
1410 	USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
1411 	    "hid_interrupt_pipe_exception_callback: "
1412 	    "completion_reason = 0x%x, data = 0x%p, flag = 0x%x",
1413 	    req->intr_completion_reason, (void *)data, req->intr_cb_flags);
1414 
1415 	ASSERT((req->intr_cb_flags & USB_CB_INTR_CONTEXT) == 0);
1416 
1417 	if (((flags & USB_CB_FUNCTIONAL_STALL) != 0) &&
1418 	    ((flags & USB_CB_STALL_CLEARED) == 0)) {
1419 		USB_DPRINTF_L2(PRINT_MASK_ALL,
1420 		    hidp->hid_log_handle,
1421 		    "hid_interrupt_pipe_exception_callback: "
1422 		    "unable to clear stall.  flags = 0x%x",
1423 		    req->intr_cb_flags);
1424 	}
1425 
1426 	mutex_enter(&hidp->hid_mutex);
1427 
1428 	switch (req->intr_completion_reason) {
1429 	case USB_CR_STOPPED_POLLING:
1430 	case USB_CR_PIPE_CLOSING:
1431 	default:
1432 
1433 		break;
1434 	case USB_CR_PIPE_RESET:
1435 	case USB_CR_NO_RESOURCES:
1436 		if ((hidp->hid_dev_state == USB_DEV_ONLINE) &&
1437 		    ((rval = hid_start_intr_polling(hidp)) !=
1438 		    USB_SUCCESS)) {
1439 			USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
1440 			    "unable to restart interrupt poll. rval = %d",
1441 			    rval);
1442 		}
1443 
1444 		break;
1445 	}
1446 
1447 	mutex_exit(&hidp->hid_mutex);
1448 
1449 	usb_free_intr_req(req);
1450 }
1451 
1452 
1453 /*
1454  * hid_default_pipe_exception_callback:
1455  *	Exception callback routine for default pipe.
1456  */
1457 /*ARGSUSED*/
1458 static void
1459 hid_default_pipe_exception_callback(usb_pipe_handle_t pipe,
1460     usb_ctrl_req_t *req)
1461 {
1462 	hid_default_pipe_arg_t *hid_default_pipe_arg =
1463 	    (hid_default_pipe_arg_t *)req->ctrl_client_private;
1464 
1465 	hid_state_t *hidp = hid_default_pipe_arg->hid_default_pipe_arg_hidp;
1466 	mblk_t		*data = NULL;
1467 	usb_cr_t	ctrl_completion_reason = req->ctrl_completion_reason;
1468 	mblk_t		*mp;
1469 	queue_t		*q;
1470 
1471 	USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
1472 	    "hid_default_pipe_exception_callback: "
1473 	    "completion_reason = 0x%x, data = 0x%p, flag = 0x%x",
1474 	    ctrl_completion_reason, (void *)data, req->ctrl_cb_flags);
1475 
1476 	ASSERT((req->ctrl_cb_flags & USB_CB_INTR_CONTEXT) == 0);
1477 
1478 	/*
1479 	 * This is an exception callback, no need to pass data up
1480 	 */
1481 	q = hidp->hid_rq_ptr;
1482 
1483 	/*
1484 	 * Pass an error message up. Reuse existing mblk.
1485 	 */
1486 	if (canputnext(q)) {
1487 		mp = hid_default_pipe_arg->hid_default_pipe_arg_mblk;
1488 		mp->b_datap->db_type = M_ERROR;
1489 		mp->b_rptr = mp->b_datap->db_base;
1490 		mp->b_wptr = mp->b_rptr + sizeof (char);
1491 		*mp->b_rptr = EIO;
1492 		putnext(q, mp);
1493 	} else {
1494 		freemsg(hid_default_pipe_arg->hid_default_pipe_arg_mblk);
1495 	}
1496 	kmem_free(hid_default_pipe_arg, sizeof (hid_default_pipe_arg_t));
1497 
1498 	mutex_enter(&hidp->hid_mutex);
1499 	hidp->hid_default_pipe_req--;
1500 	ASSERT(hidp->hid_default_pipe_req >= 0);
1501 	mutex_exit(&hidp->hid_mutex);
1502 
1503 	qenable(hidp->hid_wq_ptr);
1504 	usb_free_ctrl_req(req);
1505 	hid_pm_idle_component(hidp);
1506 }
1507 
1508 
1509 /*
1510  * event handling:
1511  *
1512  * hid_reconnect_event_callback:
1513  *	the device was disconnected but this instance not detached, probably
1514  *	because the device was busy
1515  *
1516  *	If the same device, continue with restoring state
1517  */
1518 static int
1519 hid_restore_state_event_callback(dev_info_t *dip)
1520 {
1521 	hid_state_t	*hidp = (hid_state_t *)ddi_get_soft_state(hid_statep,
1522 	    ddi_get_instance(dip));
1523 
1524 	ASSERT(hidp != NULL);
1525 
1526 	USB_DPRINTF_L3(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1527 	    "hid_restore_state_event_callback: dip=0x%p", (void *)dip);
1528 
1529 	hid_restore_device_state(dip, hidp);
1530 
1531 	return (USB_SUCCESS);
1532 }
1533 
1534 
1535 /*
1536  * hid_cpr_suspend
1537  *	Fail suspend if we can't finish outstanding i/o activity.
1538  */
1539 static int
1540 hid_cpr_suspend(hid_state_t *hidp)
1541 {
1542 	int		rval, prev_state;
1543 	int		retval = USB_FAILURE;
1544 
1545 	USB_DPRINTF_L4(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1546 	    "hid_cpr_suspend: dip=0x%p", (void *)hidp->hid_dip);
1547 
1548 	mutex_enter(&hidp->hid_mutex);
1549 	switch (hidp->hid_dev_state) {
1550 	case USB_DEV_ONLINE:
1551 	case USB_DEV_PWRED_DOWN:
1552 	case USB_DEV_DISCONNECTED:
1553 		prev_state = hidp->hid_dev_state;
1554 		hidp->hid_dev_state = USB_DEV_SUSPENDED;
1555 		mutex_exit(&hidp->hid_mutex);
1556 
1557 		/* drain all request outstanding on the default control pipe */
1558 		rval = usb_pipe_drain_reqs(hidp->hid_dip,
1559 		    hidp->hid_default_pipe, hid_default_pipe_drain_timeout,
1560 		    USB_FLAGS_SLEEP, NULL, 0);
1561 
1562 		/* fail checkpoint if we haven't finished the job yet */
1563 		mutex_enter(&hidp->hid_mutex);
1564 		if ((rval != USB_SUCCESS) || (hidp->hid_default_pipe_req > 0)) {
1565 			USB_DPRINTF_L2(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1566 			    "hid_cpr_suspend: "
1567 			    "device busy - can't checkpoint");
1568 
1569 			/* fall back to previous state */
1570 			hidp->hid_dev_state = prev_state;
1571 		} else {
1572 			retval = USB_SUCCESS;
1573 			hid_save_device_state(hidp);
1574 		}
1575 
1576 		break;
1577 	case USB_DEV_SUSPENDED:
1578 	default:
1579 		USB_DPRINTF_L2(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1580 		    "hid_cpr_suspend: Illegal dev state: %d",
1581 		    hidp->hid_dev_state);
1582 
1583 		break;
1584 	}
1585 	mutex_exit(&hidp->hid_mutex);
1586 
1587 	return (retval);
1588 }
1589 
1590 
1591 static void
1592 hid_cpr_resume(hid_state_t *hidp)
1593 {
1594 	USB_DPRINTF_L4(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1595 	    "hid_cpr_resume: dip=0x%p", (void *)hidp->hid_dip);
1596 
1597 	hid_restore_device_state(hidp->hid_dip, hidp);
1598 }
1599 
1600 
1601 /*
1602  * hid_disconnect_event_callback:
1603  *	The device has been disconnected. We either wait for
1604  *	detach or a reconnect event. Close all pipes and timeouts.
1605  */
1606 static int
1607 hid_disconnect_event_callback(dev_info_t *dip)
1608 {
1609 	hid_state_t	*hidp;
1610 
1611 	hidp = (hid_state_t *)ddi_get_soft_state(hid_statep,
1612 	    ddi_get_instance(dip));
1613 	ASSERT(hidp != NULL);
1614 
1615 	USB_DPRINTF_L4(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1616 	    "hid_disconnect_event_callback: dip=0x%p", (void *)dip);
1617 
1618 	mutex_enter(&hidp->hid_mutex);
1619 	switch (hidp->hid_dev_state) {
1620 	case USB_DEV_ONLINE:
1621 	case USB_DEV_PWRED_DOWN:
1622 		hidp->hid_dev_state = USB_DEV_DISCONNECTED;
1623 		if (hidp->hid_streams_flags == HID_STREAMS_OPEN) {
1624 
1625 			USB_DPRINTF_L2(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1626 			    "busy device has been disconnected");
1627 		}
1628 		hid_save_device_state(hidp);
1629 
1630 		break;
1631 	case USB_DEV_SUSPENDED:
1632 		/* we remain suspended */
1633 
1634 		break;
1635 	default:
1636 		USB_DPRINTF_L2(PRINT_MASK_EVENTS, hidp->hid_log_handle,
1637 		    "hid_disconnect_event_callback: Illegal dev state: %d",
1638 		    hidp->hid_dev_state);
1639 
1640 		break;
1641 	}
1642 	mutex_exit(&hidp->hid_mutex);
1643 
1644 	return (USB_SUCCESS);
1645 }
1646 
1647 
1648 /*
1649  * hid_power_change_callback:
1650  *	Async callback function to notify pm_raise_power completion
1651  *	after hid_power entry point is called.
1652  */
1653 static void
1654 hid_power_change_callback(void *arg, int rval)
1655 {
1656 	hid_state_t	*hidp;
1657 	queue_t		*wq;
1658 
1659 	hidp = (hid_state_t *)arg;
1660 
1661 	USB_DPRINTF_L4(PRINT_MASK_PM, hidp->hid_log_handle,
1662 	    "hid_power_change_callback - rval: %d", rval);
1663 
1664 	mutex_enter(&hidp->hid_mutex);
1665 	hidp->hid_pm->hid_raise_power = B_FALSE;
1666 
1667 	if (hidp->hid_dev_state == USB_DEV_ONLINE) {
1668 		wq = hidp->hid_wq_ptr;
1669 		mutex_exit(&hidp->hid_mutex);
1670 
1671 		qenable(wq);
1672 
1673 	} else {
1674 		mutex_exit(&hidp->hid_mutex);
1675 	}
1676 }
1677 
1678 
1679 /*
1680  * hid_parse_hid_descr:
1681  *	Parse the hid descriptor, check after interface and after
1682  *	endpoint descriptor
1683  */
1684 static size_t
1685 hid_parse_hid_descr(
1686 	usb_hid_descr_t		*ret_descr,
1687 	size_t			ret_buf_len,
1688 	usb_alt_if_data_t	*altif_data,
1689 	usb_ep_data_t		*ep_data)
1690 {
1691 	usb_cvs_data_t *cvs;
1692 	int		which_cvs;
1693 
1694 	for (which_cvs = 0; which_cvs < altif_data->altif_n_cvs; which_cvs++) {
1695 		cvs = &altif_data->altif_cvs[which_cvs];
1696 		if (cvs->cvs_buf == NULL) {
1697 			continue;
1698 		}
1699 		if (cvs->cvs_buf[1] == USB_DESCR_TYPE_HID) {
1700 			return (usb_parse_data("ccscccs",
1701 			    cvs->cvs_buf, cvs->cvs_buf_len,
1702 			    (void *)ret_descr,
1703 			    (size_t)ret_buf_len));
1704 		}
1705 	}
1706 
1707 	/* now try after endpoint */
1708 	for (which_cvs = 0; which_cvs < ep_data->ep_n_cvs; which_cvs++) {
1709 		cvs = &ep_data->ep_cvs[which_cvs];
1710 		if (cvs->cvs_buf == NULL) {
1711 			continue;
1712 		}
1713 		if (cvs->cvs_buf[1] == USB_DESCR_TYPE_HID) {
1714 			return (usb_parse_data("ccscccs",
1715 			    cvs->cvs_buf, cvs->cvs_buf_len,
1716 			    (void *)ret_descr,
1717 			    (size_t)ret_buf_len));
1718 		}
1719 	}
1720 
1721 	return (USB_PARSE_ERROR);
1722 }
1723 
1724 
1725 /*
1726  * hid_parse_hid_descr_failure:
1727  *	If parsing of hid descriptor failed and the device is
1728  *	a keyboard or mouse, use predefined length and packet size.
1729  */
1730 static int
1731 hid_parse_hid_descr_failure(hid_state_t	*hidp)
1732 {
1733 	/*
1734 	 * Parsing hid descriptor failed, probably because the
1735 	 * device did not return a valid hid descriptor. Check to
1736 	 * see if this is a keyboard or mouse. If so, use the
1737 	 * predefined hid descriptor length and packet size.
1738 	 * Otherwise, detach and return failure.
1739 	 */
1740 	USB_DPRINTF_L1(PRINT_MASK_ATTA, hidp->hid_log_handle,
1741 	    "Parsing of hid descriptor failed");
1742 
1743 	if (hidp->hid_if_descr.bInterfaceProtocol == KEYBOARD_PROTOCOL) {
1744 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
1745 		    "Set hid descriptor length to predefined "
1746 		    "USB_KB_HID_DESCR_LENGTH for keyboard.");
1747 
1748 		/* device is a keyboard */
1749 		hidp->hid_hid_descr.wReportDescriptorLength =
1750 		    USB_KB_HID_DESCR_LENGTH;
1751 
1752 		hidp->hid_packet_size = USBKPSZ;
1753 
1754 	} else if (hidp->hid_if_descr.bInterfaceProtocol ==
1755 	    MOUSE_PROTOCOL) {
1756 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
1757 		    "Set hid descriptor length to predefined "
1758 		    "USB_MS_HID_DESCR_LENGTH for mouse.");
1759 
1760 		/* device is a mouse */
1761 		hidp->hid_hid_descr.wReportDescriptorLength =
1762 		    USB_MS_HID_DESCR_LENGTH;
1763 
1764 		hidp->hid_packet_size = USBMSSZ;
1765 	} else {
1766 
1767 		return (USB_FAILURE);
1768 	}
1769 
1770 	return (USB_SUCCESS);
1771 }
1772 
1773 
1774 /*
1775  * hid_handle_report_descriptor:
1776  *	Get the report descriptor, call hidparser routine to parse
1777  *	it and query the hidparser tree to get the packet size
1778  */
1779 static int
1780 hid_handle_report_descriptor(hid_state_t	*hidp,
1781 				int		interface)
1782 {
1783 	usb_cr_t		completion_reason;
1784 	usb_cb_flags_t		cb_flags;
1785 	mblk_t			*data = NULL;
1786 	hidparser_packet_info_t	hpack;
1787 	int			i;
1788 	usb_ctrl_setup_t setup = {
1789 	    USB_DEV_REQ_DEV_TO_HOST |	/* bmRequestType */
1790 	    USB_DEV_REQ_RCPT_IF,
1791 	    USB_REQ_GET_DESCR,		/* bRequest */
1792 	    USB_CLASS_DESCR_TYPE_REPORT, /* wValue */
1793 	    0,				/* wIndex: interface, fill in later */
1794 	    0,				/* wLength, fill in later  */
1795 	    0				/* attributes */
1796 	    };
1797 
1798 	/*
1799 	 * Parsing hid desciptor was successful earlier.
1800 	 * Get Report Descriptor
1801 	 */
1802 	setup.wIndex = (uint16_t)interface;
1803 	setup.wLength = hidp->hid_hid_descr.wReportDescriptorLength;
1804 	if (usb_pipe_ctrl_xfer_wait(hidp->hid_default_pipe,
1805 	    &setup,
1806 	    &data,				/* data */
1807 	    &completion_reason, &cb_flags, 0) != USB_SUCCESS) {
1808 
1809 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
1810 		    "Failed to receive the Report Descriptor");
1811 		freemsg(data);
1812 
1813 		return (USB_FAILURE);
1814 
1815 	} else {
1816 		int n =  hidp->hid_hid_descr.wReportDescriptorLength;
1817 
1818 		ASSERT(data);
1819 
1820 		/* Print the report descriptor */
1821 		for (i = 0; i < n; i++) {
1822 			USB_DPRINTF_L3(PRINT_MASK_ATTA, hidp->hid_log_handle,
1823 			    "Index = %d\tvalue =0x%x", i,
1824 			    (int)(data->b_rptr[i]));
1825 		}
1826 
1827 		/* Get Report Descriptor was successful */
1828 		if (hidparser_parse_report_descriptor(
1829 		    data->b_rptr,
1830 		    hidp->hid_hid_descr.wReportDescriptorLength,
1831 		    &hidp->hid_hid_descr,
1832 		    &hidp->hid_report_descr) == HIDPARSER_SUCCESS) {
1833 
1834 			/* find max intr-in xfer length */
1835 			hidparser_find_max_packet_size_from_report_descriptor(
1836 			    hidp->hid_report_descr, &hpack);
1837 			/* round up to the nearest byte */
1838 			hidp->hid_packet_size = (hpack.max_packet_size + 7) / 8;
1839 
1840 			/* if report id is used, add more more byte for it */
1841 			if (hpack.report_id != HID_REPORT_ID_UNDEFINED) {
1842 				hidp->hid_packet_size++;
1843 			}
1844 		} else {
1845 			USB_DPRINTF_L1(PRINT_MASK_ATTA, hidp->hid_log_handle,
1846 			    "Invalid Report Descriptor");
1847 			freemsg(data);
1848 
1849 			return (USB_FAILURE);
1850 		}
1851 
1852 		freemsg(data);
1853 
1854 		return (USB_SUCCESS);
1855 	}
1856 }
1857 
1858 
1859 /*
1860  * hid_set_idle:
1861  *	Make a clas specific request to SET_IDLE.
1862  *	In this case send no reports if state has not changed.
1863  *	See HID 7.2.4.
1864  */
1865 /*ARGSUSED*/
1866 static void
1867 hid_set_idle(hid_state_t	*hidp)
1868 {
1869 	usb_cr_t	completion_reason;
1870 	usb_cb_flags_t	cb_flags;
1871 	usb_ctrl_setup_t setup = {
1872 	    USB_DEV_REQ_HOST_TO_DEV |	/* bmRequestType */
1873 	    USB_DEV_REQ_TYPE_CLASS |
1874 	    USB_DEV_REQ_RCPT_IF,
1875 	    SET_IDLE,			/* bRequest */
1876 	    DURATION,			/* wValue */
1877 	    0,				/* wIndex: interface, fill in later */
1878 	    0,				/* wLength */
1879 	    0				/* attributes */
1880 	    };
1881 
1882 	USB_DPRINTF_L4(PRINT_MASK_ATTA, hidp->hid_log_handle,
1883 	    "hid_set_idle: Begin");
1884 
1885 	setup.wIndex = hidp->hid_if_descr.bInterfaceNumber;
1886 	if (usb_pipe_ctrl_xfer_wait(
1887 	    hidp->hid_default_pipe,
1888 	    &setup,
1889 	    NULL,			/* no data to send. */
1890 	    &completion_reason, &cb_flags, 0) != USB_SUCCESS) {
1891 
1892 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
1893 		    "Failed while trying to set idle,"
1894 		    "cr = %d, cb_flags = 0x%x\n",
1895 		    completion_reason, cb_flags);
1896 	}
1897 	USB_DPRINTF_L4(PRINT_MASK_ATTA, hidp->hid_log_handle,
1898 	    "hid_set_idle: End");
1899 }
1900 
1901 
1902 /*
1903  * hid_set_protocol:
1904  *	Initialize the device to set the preferred protocol
1905  */
1906 /*ARGSUSED*/
1907 static void
1908 hid_set_protocol(hid_state_t *hidp, int protocol)
1909 {
1910 	usb_cr_t	completion_reason;
1911 	usb_cb_flags_t	cb_flags;
1912 	usb_ctrl_setup_t setup;
1913 
1914 	USB_DPRINTF_L4(PRINT_MASK_ATTA, hidp->hid_log_handle,
1915 	    "hid_set_protocol(%d): Begin", protocol);
1916 
1917 	/* initialize the setup request */
1918 	setup.bmRequestType = USB_DEV_REQ_HOST_TO_DEV |
1919 	    USB_DEV_REQ_TYPE_CLASS | USB_DEV_REQ_RCPT_IF;
1920 	setup.bRequest = SET_PROTOCOL;
1921 	setup.wValue = (uint16_t)protocol;
1922 	setup.wIndex = hidp->hid_if_descr.bInterfaceNumber;
1923 	setup.wLength = 0;
1924 	setup.attrs = 0;
1925 	if (usb_pipe_ctrl_xfer_wait(
1926 	    hidp->hid_default_pipe,	/* bmRequestType */
1927 	    &setup,
1928 	    NULL,			/* no data to send */
1929 	    &completion_reason, &cb_flags, 0) != USB_SUCCESS) {
1930 		/*
1931 		 * Some devices fail to follow the specification
1932 		 * and instead of STALLing, they continously
1933 		 * NAK the SET_IDLE command. We need to reset
1934 		 * the pipe then, so that ohci doesn't panic.
1935 		 */
1936 		USB_DPRINTF_L2(PRINT_MASK_ATTA, hidp->hid_log_handle,
1937 		    "Failed while trying to set protocol:%d,"
1938 		    "cr =  %d cb_flags = 0x%x\n",
1939 		    completion_reason, cb_flags, protocol);
1940 	}
1941 
1942 	USB_DPRINTF_L4(PRINT_MASK_ATTA, hidp->hid_log_handle,
1943 	    "hid_set_protocol: End");
1944 }
1945 
1946 
1947 /*
1948  * hid_detach_cleanup:
1949  *	called by attach and detach for cleanup.
1950  */
1951 static void
1952 hid_detach_cleanup(dev_info_t *dip, hid_state_t *hidp)
1953 {
1954 	int	flags = hidp->hid_attach_flags;
1955 	int	rval;
1956 	hid_power_t	*hidpm;
1957 
1958 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
1959 	    "hid_detach_cleanup: Begin");
1960 
1961 	if ((hidp->hid_attach_flags & HID_LOCK_INIT) == 0) {
1962 
1963 		goto done;
1964 	}
1965 
1966 	/*
1967 	 * Disable the event callbacks first, after this point, event
1968 	 * callbacks will never get called. Note we shouldn't hold
1969 	 * mutex while unregistering events because there may be a
1970 	 * competing event callback thread. Event callbacks are done
1971 	 * with ndi mutex held and this can cause a potential deadlock.
1972 	 */
1973 	usb_unregister_event_cbs(dip, &hid_events);
1974 
1975 	mutex_enter(&hidp->hid_mutex);
1976 
1977 	hidpm = hidp->hid_pm;
1978 
1979 	USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
1980 	    "hid_detach_cleanup: hidpm=0x%p", (void *)hidpm);
1981 
1982 	if (hidpm && (hidp->hid_dev_state != USB_DEV_DISCONNECTED)) {
1983 
1984 		mutex_exit(&hidp->hid_mutex);
1985 		hid_pm_busy_component(hidp);
1986 		if (hid_is_pm_enabled(dip) == USB_SUCCESS) {
1987 
1988 			if (hidpm->hid_wakeup_enabled) {
1989 
1990 				/* First bring the device to full power */
1991 				(void) pm_raise_power(dip, 0,
1992 				    USB_DEV_OS_FULL_PWR);
1993 
1994 				/* Disable remote wakeup */
1995 				rval = usb_handle_remote_wakeup(dip,
1996 				    USB_REMOTE_WAKEUP_DISABLE);
1997 
1998 				if (rval != DDI_SUCCESS) {
1999 					USB_DPRINTF_L2(PRINT_MASK_ALL,
2000 					    hidp->hid_log_handle,
2001 					    "hid_detach_cleanup: "
2002 					    "disble remote wakeup failed, "
2003 					    "rval= %d", rval);
2004 				}
2005 			}
2006 
2007 			(void) pm_lower_power(dip, 0, USB_DEV_OS_PWR_OFF);
2008 		}
2009 		hid_pm_idle_component(hidp);
2010 		mutex_enter(&hidp->hid_mutex);
2011 	}
2012 
2013 	if (hidpm) {
2014 		freemsg(hidpm->hid_pm_pwrup);
2015 		kmem_free(hidpm, sizeof (hid_power_t));
2016 		hidp->hid_pm = NULL;
2017 	}
2018 
2019 	mutex_exit(&hidp->hid_mutex);
2020 
2021 	if (hidp->hid_report_descr != NULL) {
2022 		(void) hidparser_free_report_descriptor_handle(
2023 		    hidp->hid_report_descr);
2024 	}
2025 
2026 	if (flags & HID_MINOR_NODES) {
2027 		ddi_remove_minor_node(dip, NULL);
2028 	}
2029 
2030 	mutex_destroy(&hidp->hid_mutex);
2031 
2032 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
2033 	    "hid_detach_cleanup: End");
2034 
2035 done:
2036 	usb_client_detach(dip, hidp->hid_dev_data);
2037 	usb_free_log_hdl(hidp->hid_log_handle);
2038 	ddi_soft_state_free(hid_statep, hidp->hid_instance);
2039 
2040 	ddi_prop_remove_all(dip);
2041 }
2042 
2043 
2044 /*
2045  * hid_start_intr_polling:
2046  *	Allocate an interrupt request structure, initialize,
2047  *	and start interrupt transfers.
2048  */
2049 static int
2050 hid_start_intr_polling(hid_state_t *hidp)
2051 {
2052 	usb_intr_req_t	*req;
2053 	int rval = USB_SUCCESS;
2054 
2055 	USB_DPRINTF_L4(PRINT_MASK_PM, hidp->hid_log_handle,
2056 	    "hid_start_intr_polling: "
2057 	    "dev_state=%s str_flags=%d ph=0x%p",
2058 	    usb_str_dev_state(hidp->hid_dev_state), hidp->hid_streams_flags,
2059 	    (void *)hidp->hid_interrupt_pipe);
2060 
2061 	if ((hidp->hid_streams_flags == HID_STREAMS_OPEN) &&
2062 	    (hidp->hid_interrupt_pipe != NULL)) {
2063 		/*
2064 		 * initialize interrupt pipe request structure
2065 		 */
2066 		req = usb_alloc_intr_req(hidp->hid_dip, 0, USB_FLAGS_SLEEP);
2067 		req->intr_client_private = (usb_opaque_t)hidp;
2068 		req->intr_attributes = USB_ATTRS_SHORT_XFER_OK |
2069 		    USB_ATTRS_AUTOCLEARING;
2070 		req->intr_len = hidp->hid_packet_size;
2071 		req->intr_cb = hid_interrupt_pipe_callback;
2072 		req->intr_exc_cb = hid_interrupt_pipe_exception_callback;
2073 
2074 		/*
2075 		 * Start polling on the interrupt pipe.
2076 		 */
2077 		mutex_exit(&hidp->hid_mutex);
2078 
2079 		if ((rval = usb_pipe_intr_xfer(hidp->hid_interrupt_pipe, req,
2080 		    USB_FLAGS_SLEEP)) != USB_SUCCESS) {
2081 			USB_DPRINTF_L2(PRINT_MASK_PM, hidp->hid_log_handle,
2082 			    "hid_start_intr_polling failed: rval = %d",
2083 			    rval);
2084 			usb_free_intr_req(req);
2085 		}
2086 
2087 		mutex_enter(&hidp->hid_mutex);
2088 	}
2089 
2090 	USB_DPRINTF_L4(PRINT_MASK_PM, hidp->hid_log_handle,
2091 	    "hid_start_intr_polling: done, rval = %d", rval);
2092 
2093 	return (rval);
2094 }
2095 
2096 
2097 /*
2098  * hid_close_intr_pipe:
2099  *	close the interrupt pipe after draining all callbacks
2100  */
2101 static void
2102 hid_close_intr_pipe(hid_state_t *hidp)
2103 {
2104 	USB_DPRINTF_L4(PRINT_MASK_CLOSE, hidp->hid_log_handle,
2105 	    "hid_close_intr_pipe: Begin");
2106 
2107 	if (hidp->hid_interrupt_pipe) {
2108 		/*
2109 		 * Close the interrupt pipe
2110 		 */
2111 		mutex_exit(&hidp->hid_mutex);
2112 		usb_pipe_close(hidp->hid_dip, hidp->hid_interrupt_pipe,
2113 		    USB_FLAGS_SLEEP, NULL, NULL);
2114 		mutex_enter(&hidp->hid_mutex);
2115 		hidp->hid_interrupt_pipe = NULL;
2116 	}
2117 	USB_DPRINTF_L4(PRINT_MASK_CLOSE, hidp->hid_log_handle,
2118 	    "hid_close_intr_pipe: End");
2119 }
2120 
2121 
2122 /*
2123  * hid_mctl_receive:
2124  *	Handle M_CTL messages from upper stream.  If
2125  *	we don't understand the command, free message.
2126  */
2127 static int
2128 hid_mctl_receive(register queue_t *q, register mblk_t *mp)
2129 {
2130 	hid_state_t	*hidp = (hid_state_t *)q->q_ptr;
2131 	struct iocblk	*iocp;
2132 	int		error = HID_FAILURE;
2133 	uchar_t		request_type;
2134 	hid_req_t	*hid_req_data = NULL;
2135 	hid_polled_input_callback_t hid_polled_input;
2136 	hid_vid_pid_t	hid_vid_pid;
2137 
2138 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
2139 	    "hid_mctl_receive");
2140 
2141 	iocp = (struct iocblk *)mp->b_rptr;
2142 
2143 	switch (iocp->ioc_cmd) {
2144 	case HID_SET_REPORT:
2145 		/* FALLTHRU */
2146 	case HID_SET_IDLE:
2147 		/* FALLTHRU */
2148 	case HID_SET_PROTOCOL:
2149 		request_type = USB_DEV_REQ_HOST_TO_DEV |
2150 		    USB_DEV_REQ_RCPT_IF | USB_DEV_REQ_TYPE_CLASS;
2151 
2152 		break;
2153 	case HID_GET_REPORT:
2154 		/* FALLTHRU */
2155 	case HID_GET_IDLE:
2156 		/* FALLTHRU */
2157 	case HID_GET_PROTOCOL:
2158 		request_type = USB_DEV_REQ_DEV_TO_HOST |
2159 		    USB_DEV_REQ_RCPT_IF | USB_DEV_REQ_TYPE_CLASS;
2160 
2161 		break;
2162 	case HID_GET_PARSER_HANDLE:
2163 		if (canputnext(RD(q))) {
2164 			freemsg(mp->b_cont);
2165 			mp->b_cont = hid_data2mblk(
2166 			    (uchar_t *)&hidp->hid_report_descr,
2167 			    sizeof (hidp->hid_report_descr));
2168 			if (mp->b_cont == NULL) {
2169 				/*
2170 				 * can't allocate mblk, indicate
2171 				 * that nothing is returned
2172 				 */
2173 				iocp->ioc_count = 0;
2174 			} else {
2175 				iocp->ioc_count =
2176 				    sizeof (hidp->hid_report_descr);
2177 			}
2178 			qreply(q, mp);
2179 
2180 			return (HID_SUCCESS);
2181 		} else {
2182 
2183 			/* retry */
2184 			return (HID_ENQUEUE);
2185 		}
2186 	case HID_GET_VID_PID:
2187 		if (canputnext(RD(q))) {
2188 			freemsg(mp->b_cont);
2189 
2190 			hid_vid_pid.VendorId =
2191 			    hidp->hid_dev_descr->idVendor;
2192 			hid_vid_pid.ProductId =
2193 			    hidp->hid_dev_descr->idProduct;
2194 
2195 			mp->b_cont = hid_data2mblk(
2196 			    (uchar_t *)&hid_vid_pid, sizeof (hid_vid_pid_t));
2197 			if (mp->b_cont == NULL) {
2198 				/*
2199 				 * can't allocate mblk, indicate that nothing
2200 				 * is being returned.
2201 				 */
2202 				iocp->ioc_count = 0;
2203 			} else {
2204 				iocp->ioc_count =
2205 				    sizeof (hid_vid_pid_t);
2206 			}
2207 			qreply(q, mp);
2208 
2209 			return (HID_SUCCESS);
2210 		} else {
2211 
2212 			/* retry */
2213 			return (HID_ENQUEUE);
2214 		}
2215 	case HID_OPEN_POLLED_INPUT:
2216 		if (canputnext(RD(q))) {
2217 			freemsg(mp->b_cont);
2218 
2219 			/* Initialize the structure */
2220 			hid_polled_input.hid_polled_version =
2221 			    HID_POLLED_INPUT_V0;
2222 			hid_polled_input.hid_polled_read = hid_polled_read;
2223 			hid_polled_input.hid_polled_input_enter =
2224 			    hid_polled_input_enter;
2225 			hid_polled_input.hid_polled_input_exit =
2226 			    hid_polled_input_exit;
2227 			hid_polled_input.hid_polled_input_handle =
2228 			    (hid_polled_handle_t)hidp;
2229 
2230 			mp->b_cont = hid_data2mblk(
2231 			    (uchar_t *)&hid_polled_input,
2232 			    sizeof (hid_polled_input_callback_t));
2233 			if (mp->b_cont == NULL) {
2234 				/*
2235 				 * can't allocate mblk, indicate that nothing
2236 				 * is being returned.
2237 				 */
2238 				iocp->ioc_count = 0;
2239 			} else {
2240 				/* Call down into USBA */
2241 				(void) hid_polled_input_init(hidp);
2242 
2243 				iocp->ioc_count =
2244 				    sizeof (hid_polled_input_callback_t);
2245 			}
2246 			qreply(q, mp);
2247 
2248 			return (HID_SUCCESS);
2249 		} else {
2250 
2251 			/* retry */
2252 			return (HID_ENQUEUE);
2253 		}
2254 	case HID_CLOSE_POLLED_INPUT:
2255 		/* Call down into USBA */
2256 		(void) hid_polled_input_fini(hidp);
2257 
2258 		iocp->ioc_count = 0;
2259 		qreply(q, mp);
2260 
2261 		return (HID_SUCCESS);
2262 	default:
2263 		hid_qreply_merror(q, mp, EINVAL);
2264 
2265 		return (HID_FAILURE);
2266 	}
2267 
2268 	/*
2269 	 * These (device executable) commands require a hid_req_t.
2270 	 * Make sure one is present
2271 	 */
2272 	if (mp->b_cont == NULL) {
2273 		hid_qreply_merror(q, mp, EINVAL);
2274 
2275 		return (error);
2276 	} else {
2277 		hid_req_data = (hid_req_t *)mp->b_cont->b_rptr;
2278 		if ((iocp->ioc_cmd == HID_SET_REPORT) &&
2279 		    (hid_req_data->hid_req_wLength == 0)) {
2280 			hid_qreply_merror(q, mp, EINVAL);
2281 
2282 			return (error);
2283 		}
2284 	}
2285 
2286 	/*
2287 	 * Check is version no. is correct. This
2288 	 * is coming from the user
2289 	 */
2290 	if (hid_req_data->hid_req_version_no != HID_VERSION_V_0) {
2291 		hid_qreply_merror(q, mp, EINVAL);
2292 
2293 		return (error);
2294 	}
2295 
2296 	mutex_enter(&hidp->hid_mutex);
2297 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
2298 	    "hid_mctl_receive: dev_state=%s",
2299 	    usb_str_dev_state(hidp->hid_dev_state));
2300 
2301 	switch (hidp->hid_dev_state) {
2302 	case USB_DEV_PWRED_DOWN:
2303 		/*
2304 		 * get the device full powered. We get a callback
2305 		 * which enables the WQ and kicks off IO
2306 		 */
2307 		hidp->hid_dev_state = USB_DEV_HID_POWER_CHANGE;
2308 		mutex_exit(&hidp->hid_mutex);
2309 		if (usb_req_raise_power(hidp->hid_dip, 0,
2310 		    USB_DEV_OS_FULL_PWR, hid_power_change_callback,
2311 		    hidp, 0) != USB_SUCCESS) {
2312 			/* we retry raising power in wsrv */
2313 			mutex_enter(&hidp->hid_mutex);
2314 			hidp->hid_dev_state = USB_DEV_PWRED_DOWN;
2315 			mutex_exit(&hidp->hid_mutex);
2316 		}
2317 		error = HID_ENQUEUE;
2318 
2319 		break;
2320 	case USB_DEV_HID_POWER_CHANGE:
2321 		mutex_exit(&hidp->hid_mutex);
2322 		error = HID_ENQUEUE;
2323 
2324 		break;
2325 	case USB_DEV_ONLINE:
2326 		if (hidp->hid_streams_flags != HID_STREAMS_DISMANTLING) {
2327 			/* Send a message down */
2328 			mutex_exit(&hidp->hid_mutex);
2329 			error = hid_mctl_execute_cmd(hidp, request_type,
2330 			    hid_req_data, mp);
2331 			if (error == HID_FAILURE) {
2332 				hid_qreply_merror(q, mp, EIO);
2333 			}
2334 		} else {
2335 			mutex_exit(&hidp->hid_mutex);
2336 			hid_qreply_merror(q, mp, EIO);
2337 		}
2338 
2339 		break;
2340 	default:
2341 		mutex_exit(&hidp->hid_mutex);
2342 		hid_qreply_merror(q, mp, EIO);
2343 
2344 		break;
2345 	}
2346 
2347 	return (error);
2348 }
2349 
2350 
2351 /*
2352  * hid_mctl_execute_cmd:
2353  *	Send the command to the device.
2354  */
2355 static int
2356 hid_mctl_execute_cmd(hid_state_t *hidp, int request_type,
2357     hid_req_t *hid_req_data, mblk_t *mp)
2358 {
2359 	int		request_index;
2360 	struct iocblk	*iocp;
2361 	hid_default_pipe_arg_t	*def_pipe_arg;
2362 
2363 	iocp = (struct iocblk *)mp->b_rptr;
2364 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
2365 	    "hid_mctl_execute_cmd: iocp=0x%p", (void *)iocp);
2366 
2367 	request_index = hidp->hid_if_descr.bInterfaceNumber;
2368 
2369 	/*
2370 	 * Set up the argument to be passed back to hid
2371 	 * when the asynchronous control callback is
2372 	 * executed.
2373 	 */
2374 	def_pipe_arg = kmem_zalloc(sizeof (hid_default_pipe_arg_t), 0);
2375 
2376 	if (def_pipe_arg == NULL) {
2377 
2378 		return (HID_FAILURE);
2379 	}
2380 
2381 	def_pipe_arg->hid_default_pipe_arg_mctlmsg.ioc_cmd = iocp->ioc_cmd;
2382 	def_pipe_arg->hid_default_pipe_arg_mctlmsg.ioc_count = 0;
2383 	def_pipe_arg->hid_default_pipe_arg_hidp = hidp;
2384 	def_pipe_arg->hid_default_pipe_arg_mblk = mp;
2385 
2386 	/*
2387 	 * Send the command down to USBA through default
2388 	 * pipe.
2389 	 */
2390 	if (hid_send_async_ctrl_request(hidp, hid_req_data,
2391 	    request_type, iocp->ioc_cmd,
2392 	    request_index, def_pipe_arg) != USB_SUCCESS) {
2393 
2394 		kmem_free(def_pipe_arg, sizeof (hid_default_pipe_arg_t));
2395 
2396 		return (HID_FAILURE);
2397 	}
2398 
2399 	return (HID_INPROGRESS);
2400 }
2401 
2402 
2403 /*
2404  * hid_send_async_ctrl_request:
2405  *	Send an asynchronous control request to USBA.  Since hid is a STREAMS
2406  *	driver, it is not allowed to wait in its entry points except for the
2407  *	open and close entry points.  Therefore, hid must use the asynchronous
2408  *	USBA calls.
2409  */
2410 static int
2411 hid_send_async_ctrl_request(hid_state_t *hidp, hid_req_t *hid_request,
2412 			uchar_t request_type, int request_request,
2413 			ushort_t request_index,
2414 			hid_default_pipe_arg_t *hid_default_pipe_arg)
2415 {
2416 	usb_ctrl_req_t	*ctrl_req;
2417 	int		rval;
2418 	size_t		length = 0;
2419 
2420 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
2421 	    "hid_send_async_ctrl_request: "
2422 	    "rq_type=%d rq_rq=%d index=%d",
2423 	    request_type, request_request, request_index);
2424 
2425 	mutex_enter(&hidp->hid_mutex);
2426 	hidp->hid_default_pipe_req++;
2427 	mutex_exit(&hidp->hid_mutex);
2428 
2429 	/*
2430 	 * Note that ctrl_req->ctrl_data should be allocated by usba
2431 	 * only for IN requests. OUT request(e.g SET_REPORT) can have a
2432 	 * non-zero wLength value but ctrl_data would be allocated by
2433 	 * client for them.
2434 	 */
2435 	if (hid_request->hid_req_wLength >= MAX_REPORT_DATA) {
2436 		USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
2437 		    "hid_req_wLength is exceeded");
2438 		return (USB_FAILURE);
2439 	}
2440 	if ((request_type & USB_DEV_REQ_DIR_MASK) == USB_DEV_REQ_DEV_TO_HOST) {
2441 		length = hid_request->hid_req_wLength;
2442 	}
2443 
2444 	if ((ctrl_req = usb_alloc_ctrl_req(hidp->hid_dip, length, 0)) == NULL) {
2445 		USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
2446 		    "unable to alloc ctrl req. async trans failed");
2447 		mutex_enter(&hidp->hid_mutex);
2448 		hidp->hid_default_pipe_req--;
2449 		ASSERT(hidp->hid_default_pipe_req >= 0);
2450 		mutex_exit(&hidp->hid_mutex);
2451 
2452 		return (USB_FAILURE);
2453 	}
2454 
2455 	if ((request_type & USB_DEV_REQ_DIR_MASK) == USB_DEV_REQ_HOST_TO_DEV) {
2456 		ASSERT((length == 0) && (ctrl_req->ctrl_data == NULL));
2457 	}
2458 
2459 	ctrl_req->ctrl_bmRequestType	= request_type;
2460 	ctrl_req->ctrl_bRequest 	= (uint8_t)request_request;
2461 	ctrl_req->ctrl_wValue		= hid_request->hid_req_wValue;
2462 	ctrl_req->ctrl_wIndex		= request_index;
2463 	ctrl_req->ctrl_wLength		= hid_request->hid_req_wLength;
2464 	/* host to device: create a msg from hid_req_data */
2465 	if ((request_type & USB_DEV_REQ_DIR_MASK) == USB_DEV_REQ_HOST_TO_DEV) {
2466 		mblk_t *pblk = allocb(hid_request->hid_req_wLength, BPRI_HI);
2467 		if (pblk == NULL) {
2468 			usb_free_ctrl_req(ctrl_req);
2469 			return (USB_FAILURE);
2470 		}
2471 		bcopy(hid_request->hid_req_data, pblk->b_wptr,
2472 		    hid_request->hid_req_wLength);
2473 		pblk->b_wptr += hid_request->hid_req_wLength;
2474 		ctrl_req->ctrl_data = pblk;
2475 	}
2476 	ctrl_req->ctrl_attributes	= USB_ATTRS_AUTOCLEARING;
2477 	ctrl_req->ctrl_client_private	= (usb_opaque_t)hid_default_pipe_arg;
2478 	ctrl_req->ctrl_cb		= hid_default_pipe_callback;
2479 	ctrl_req->ctrl_exc_cb		= hid_default_pipe_exception_callback;
2480 
2481 	if ((rval = usb_pipe_ctrl_xfer(hidp->hid_default_pipe,
2482 	    ctrl_req, 0)) != USB_SUCCESS) {
2483 		mutex_enter(&hidp->hid_mutex);
2484 		hidp->hid_default_pipe_req--;
2485 		ASSERT(hidp->hid_default_pipe_req >= 0);
2486 		mutex_exit(&hidp->hid_mutex);
2487 
2488 		usb_free_ctrl_req(ctrl_req);
2489 		USB_DPRINTF_L2(PRINT_MASK_ALL, hidp->hid_log_handle,
2490 		    "usb_pipe_ctrl_xfer() failed. rval = %d", rval);
2491 
2492 		return (USB_FAILURE);
2493 	}
2494 
2495 	return (USB_SUCCESS);
2496 }
2497 
2498 
2499 /*
2500  * hid_ioctl:
2501  *	Hid currently doesn't handle any ioctls.  NACK
2502  *	the ioctl request.
2503  */
2504 static void
2505 hid_ioctl(register queue_t *q, register mblk_t *mp)
2506 {
2507 	register struct iocblk *iocp;
2508 
2509 	iocp = (struct iocblk *)mp->b_rptr;
2510 
2511 	iocp->ioc_rval = 0;
2512 
2513 	iocp->ioc_error = ENOTTY;
2514 
2515 	mp->b_datap->db_type = M_IOCNAK;
2516 
2517 	qreply(q, mp);
2518 }
2519 
2520 
2521 /*
2522  * hid_create_pm_components:
2523  *	Create the pm components required for power management.
2524  *	For keyboard/mouse, the components is created only if the device
2525  *	supports a remote wakeup.
2526  *	For other hid devices they are created unconditionally.
2527  */
2528 static void
2529 hid_create_pm_components(dev_info_t *dip, hid_state_t *hidp)
2530 {
2531 	hid_power_t	*hidpm;
2532 	uint_t		pwr_states;
2533 
2534 	USB_DPRINTF_L4(PRINT_MASK_PM, hidp->hid_log_handle,
2535 	    "hid_create_pm_components: Begin");
2536 
2537 	/* Allocate the state structure */
2538 	hidpm = kmem_zalloc(sizeof (hid_power_t), KM_SLEEP);
2539 	hidp->hid_pm = hidpm;
2540 	hidpm->hid_state = hidp;
2541 	hidpm->hid_raise_power = B_FALSE;
2542 	hidpm->hid_pm_capabilities = 0;
2543 	hidpm->hid_current_power = USB_DEV_OS_FULL_PWR;
2544 
2545 	switch (hidp->hid_if_descr.bInterfaceProtocol) {
2546 	case KEYBOARD_PROTOCOL:
2547 	case MOUSE_PROTOCOL:
2548 		hidpm->hid_pm_strategy = HID_PM_ACTIVITY;
2549 		if ((hid_is_pm_enabled(dip) == USB_SUCCESS) &&
2550 		    (usb_handle_remote_wakeup(dip, USB_REMOTE_WAKEUP_ENABLE) ==
2551 		    USB_SUCCESS)) {
2552 
2553 			USB_DPRINTF_L3(PRINT_MASK_PM, hidp->hid_log_handle,
2554 			    "hid_create_pm_components: Remote Wakeup Enabled");
2555 
2556 			if (usb_create_pm_components(dip, &pwr_states) ==
2557 			    USB_SUCCESS) {
2558 				hidpm->hid_wakeup_enabled = 1;
2559 				hidpm->hid_pwr_states = (uint8_t)pwr_states;
2560 			}
2561 		}
2562 
2563 		break;
2564 	default:
2565 		hidpm->hid_pm_strategy = HID_PM_OPEN_CLOSE;
2566 		if ((hid_is_pm_enabled(dip) == USB_SUCCESS) &&
2567 		    (usb_create_pm_components(dip, &pwr_states) ==
2568 		    USB_SUCCESS)) {
2569 			hidpm->hid_wakeup_enabled = 0;
2570 			hidpm->hid_pwr_states = (uint8_t)pwr_states;
2571 		}
2572 
2573 		break;
2574 	}
2575 
2576 	USB_DPRINTF_L4(PRINT_MASK_PM, hidp->hid_log_handle,
2577 	    "hid_create_pm_components: END");
2578 }
2579 
2580 
2581 /*
2582  * hid_is_pm_enabled
2583  *	Check if the device is pm enabled. Always enable
2584  *	pm on the new SUN mouse
2585  */
2586 static int
2587 hid_is_pm_enabled(dev_info_t *dip)
2588 {
2589 	hid_state_t	*hidp = ddi_get_soft_state(hid_statep,
2590 	    ddi_get_instance(dip));
2591 
2592 	if (strcmp(ddi_node_name(dip), "mouse") == 0) {
2593 		/* check for overrides first */
2594 		if (hid_pm_mouse ||
2595 		    (ddi_prop_exists(DDI_DEV_T_ANY, dip,
2596 		    (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM),
2597 		    "hid-mouse-pm-enable") == 1)) {
2598 
2599 			return (USB_SUCCESS);
2600 		}
2601 
2602 		/*
2603 		 * Always enable PM for 1.05 or greater SUN mouse
2604 		 * hidp->hid_dev_descr won't be NULL.
2605 		 */
2606 		if ((hidp->hid_dev_descr->idVendor ==
2607 		    HID_SUN_MOUSE_VENDOR_ID) &&
2608 		    (hidp->hid_dev_descr->idProduct ==
2609 		    HID_SUN_MOUSE_PROD_ID) &&
2610 		    (hidp->hid_dev_descr->bcdDevice >=
2611 		    HID_SUN_MOUSE_BCDDEVICE)) {
2612 
2613 			return (USB_SUCCESS);
2614 		}
2615 	} else {
2616 
2617 		return (USB_SUCCESS);
2618 	}
2619 
2620 	return (USB_FAILURE);
2621 }
2622 
2623 
2624 /*
2625  * hid_save_device_state
2626  *	Save the current device/driver state.
2627  */
2628 static void
2629 hid_save_device_state(hid_state_t *hidp)
2630 {
2631 	struct iocblk	*mctlmsg;
2632 	mblk_t		*mp;
2633 	queue_t		*q;
2634 
2635 	USB_DPRINTF_L4(PRINT_MASK_EVENTS, hidp->hid_log_handle,
2636 	    "hid_save_device_state");
2637 
2638 	if (hidp->hid_streams_flags == HID_STREAMS_OPEN) {
2639 		/*
2640 		 * Send an MCTL up indicating that
2641 		 * the device will loose its state
2642 		 */
2643 		q = hidp->hid_rq_ptr;
2644 		mutex_exit(&hidp->hid_mutex);
2645 		if (canputnext(q)) {
2646 			mp = allocb(sizeof (struct iocblk), BPRI_HI);
2647 			if (mp != NULL) {
2648 				mp->b_datap->db_type = M_CTL;
2649 				mctlmsg = (struct iocblk *)mp->b_datap->db_base;
2650 				mctlmsg->ioc_cmd = HID_DISCONNECT_EVENT;
2651 				mctlmsg->ioc_count = 0;
2652 				putnext(q, mp);
2653 			}
2654 		}
2655 		/* stop polling on the intr pipe */
2656 		usb_pipe_stop_intr_polling(hidp->hid_interrupt_pipe,
2657 		    USB_FLAGS_SLEEP);
2658 
2659 		mutex_enter(&hidp->hid_mutex);
2660 	}
2661 }
2662 
2663 
2664 /*
2665  * hid_restore_device_state:
2666  *	Set original configuration of the device.
2667  *	Reopen intr pipe.
2668  *	Enable wrq - this starts new transactions on the control pipe.
2669  */
2670 static void
2671 hid_restore_device_state(dev_info_t *dip, hid_state_t *hidp)
2672 {
2673 	int		rval;
2674 	queue_t		*rdq, *wrq;
2675 	hid_power_t	*hidpm;
2676 	struct iocblk	*mctlmsg;
2677 	mblk_t		*mp;
2678 
2679 	hid_pm_busy_component(hidp);
2680 	mutex_enter(&hidp->hid_mutex);
2681 
2682 	USB_DPRINTF_L4(PRINT_MASK_ATTA, hidp->hid_log_handle,
2683 	    "hid_restore_device_state: %s",
2684 	    usb_str_dev_state(hidp->hid_dev_state));
2685 
2686 	hidpm = hidp->hid_pm;
2687 	mutex_exit(&hidp->hid_mutex);
2688 
2689 	/* First bring the device to full power */
2690 	(void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
2691 
2692 	mutex_enter(&hidp->hid_mutex);
2693 	if (hidp->hid_dev_state == USB_DEV_ONLINE) {
2694 		/*
2695 		 * We failed the checkpoint, there is no need to restore
2696 		 * the device state
2697 		 */
2698 		mutex_exit(&hidp->hid_mutex);
2699 		hid_pm_idle_component(hidp);
2700 
2701 		return;
2702 	}
2703 	mutex_exit(&hidp->hid_mutex);
2704 
2705 
2706 	/* Check if we are talking to the same device */
2707 	if (usb_check_same_device(dip, hidp->hid_log_handle, USB_LOG_L2,
2708 	    PRINT_MASK_ALL, USB_CHK_BASIC|USB_CHK_CFG, NULL) != USB_SUCCESS) {
2709 
2710 		/* change the device state from suspended to disconnected */
2711 		mutex_enter(&hidp->hid_mutex);
2712 		hidp->hid_dev_state = USB_DEV_DISCONNECTED;
2713 		mutex_exit(&hidp->hid_mutex);
2714 		hid_pm_idle_component(hidp);
2715 
2716 		return;
2717 	}
2718 
2719 	hid_set_idle(hidp);
2720 	hid_set_protocol(hidp, SET_REPORT_PROTOCOL);
2721 
2722 	mutex_enter(&hidp->hid_mutex);
2723 	/* if the device had remote wakeup earlier, enable it again */
2724 	if (hidpm->hid_wakeup_enabled) {
2725 		mutex_exit(&hidp->hid_mutex);
2726 
2727 		if ((rval = usb_handle_remote_wakeup(hidp->hid_dip,
2728 		    USB_REMOTE_WAKEUP_ENABLE)) != USB_SUCCESS) {
2729 			USB_DPRINTF_L2(PRINT_MASK_ATTA,
2730 			    hidp->hid_log_handle,
2731 			    "usb_handle_remote_wakeup failed (%d)", rval);
2732 		}
2733 
2734 		mutex_enter(&hidp->hid_mutex);
2735 	}
2736 
2737 	/*
2738 	 * restart polling on the interrupt pipe only if the device
2739 	 * was previously operational (open)
2740 	 */
2741 	if (hidp->hid_streams_flags == HID_STREAMS_OPEN) {
2742 		rdq = hidp->hid_rq_ptr;
2743 		wrq = hidp->hid_wq_ptr;
2744 		if ((rval = hid_start_intr_polling(hidp)) != USB_SUCCESS) {
2745 			USB_DPRINTF_L3(PRINT_MASK_ATTA, hidp->hid_log_handle,
2746 			    "hid_restore_device_state:"
2747 			    "unable to restart intr pipe poll"
2748 			    " rval = %d ", rval);
2749 			/*
2750 			 * change the device state from
2751 			 * suspended to disconnected
2752 			 */
2753 			hidp->hid_dev_state = USB_DEV_DISCONNECTED;
2754 			mutex_exit(&hidp->hid_mutex);
2755 			hid_pm_idle_component(hidp);
2756 
2757 			return;
2758 		}
2759 
2760 		if (hidp->hid_dev_state == USB_DEV_DISCONNECTED) {
2761 			USB_DPRINTF_L2(PRINT_MASK_EVENTS, hidp->hid_log_handle,
2762 			    "device is being re-connected");
2763 		}
2764 
2765 		/* set the device state ONLINE */
2766 		hidp->hid_dev_state = USB_DEV_ONLINE;
2767 		mutex_exit(&hidp->hid_mutex);
2768 
2769 		/* inform upstream modules that the device is back */
2770 		if (canputnext(rdq)) {
2771 			mp = allocb(sizeof (struct iocblk), BPRI_HI);
2772 			if (mp != NULL) {
2773 				mp->b_datap->db_type = M_CTL;
2774 				mctlmsg = (struct iocblk *)mp->b_datap->db_base;
2775 				mctlmsg->ioc_cmd = HID_CONNECT_EVENT;
2776 				mctlmsg->ioc_count = 0;
2777 				putnext(rdq, mp);
2778 			}
2779 		}
2780 		/* enable write side q */
2781 		qenable(wrq);
2782 		mutex_enter(&hidp->hid_mutex);
2783 	} else {
2784 		/* set the device state ONLINE */
2785 		hidp->hid_dev_state = USB_DEV_ONLINE;
2786 	}
2787 
2788 	mutex_exit(&hidp->hid_mutex);
2789 	hid_pm_idle_component(hidp);
2790 }
2791 
2792 
2793 /*
2794  * hid_qreply_merror:
2795  *	Pass an error message up.
2796  */
2797 static void
2798 hid_qreply_merror(queue_t *q, mblk_t *mp, uchar_t errval)
2799 {
2800 	mp->b_datap->db_type = M_ERROR;
2801 	if (mp->b_cont) {
2802 		freemsg(mp->b_cont);
2803 		mp->b_cont = NULL;
2804 	}
2805 	mp->b_rptr = mp->b_datap->db_base;
2806 	mp->b_wptr = mp->b_rptr + sizeof (char);
2807 	*mp->b_rptr = errval;
2808 
2809 	qreply(q, mp);
2810 }
2811 
2812 
2813 /*
2814  * hid_data2mblk:
2815  *	Form an mblk from the given data
2816  */
2817 static mblk_t *
2818 hid_data2mblk(uchar_t *buf, int len)
2819 {
2820 	mblk_t	*mp = NULL;
2821 
2822 	if (len >= 0) {
2823 		mp = allocb(len, BPRI_HI);
2824 		if (mp) {
2825 			bcopy(buf, mp->b_datap->db_base, len);
2826 			mp->b_wptr += len;
2827 		}
2828 	}
2829 
2830 	return (mp);
2831 }
2832 
2833 
2834 /*
2835  * hid_flush :
2836  *	Flush data already sent upstreams to client module.
2837  */
2838 static void
2839 hid_flush(queue_t *q)
2840 {
2841 	/*
2842 	 * Flush pending data already sent upstream
2843 	 */
2844 	if ((q != NULL) && (q->q_next != NULL)) {
2845 		(void) putnextctl1(q, M_FLUSH, FLUSHR);
2846 	}
2847 }
2848 
2849 
2850 static void
2851 hid_pm_busy_component(hid_state_t *hid_statep)
2852 {
2853 	ASSERT(!mutex_owned(&hid_statep->hid_mutex));
2854 
2855 	if (hid_statep->hid_pm != NULL) {
2856 		mutex_enter(&hid_statep->hid_mutex);
2857 		hid_statep->hid_pm->hid_pm_busy++;
2858 
2859 		USB_DPRINTF_L4(PRINT_MASK_PM, hid_statep->hid_log_handle,
2860 		    "hid_pm_busy_component: %d",
2861 		    hid_statep->hid_pm->hid_pm_busy);
2862 
2863 		mutex_exit(&hid_statep->hid_mutex);
2864 		if (pm_busy_component(hid_statep->hid_dip, 0) != DDI_SUCCESS) {
2865 			mutex_enter(&hid_statep->hid_mutex);
2866 			hid_statep->hid_pm->hid_pm_busy--;
2867 
2868 			USB_DPRINTF_L2(PRINT_MASK_PM,
2869 			    hid_statep->hid_log_handle,
2870 			    "hid_pm_busy_component failed: %d",
2871 			    hid_statep->hid_pm->hid_pm_busy);
2872 
2873 			mutex_exit(&hid_statep->hid_mutex);
2874 		}
2875 
2876 	}
2877 }
2878 
2879 
2880 static void
2881 hid_pm_idle_component(hid_state_t *hid_statep)
2882 {
2883 	ASSERT(!mutex_owned(&hid_statep->hid_mutex));
2884 
2885 	if (hid_statep->hid_pm != NULL) {
2886 		if (pm_idle_component(hid_statep->hid_dip, 0) == DDI_SUCCESS) {
2887 			mutex_enter(&hid_statep->hid_mutex);
2888 			ASSERT(hid_statep->hid_pm->hid_pm_busy > 0);
2889 			hid_statep->hid_pm->hid_pm_busy--;
2890 
2891 			USB_DPRINTF_L4(PRINT_MASK_PM,
2892 			    hid_statep->hid_log_handle,
2893 			    "hid_pm_idle_component: %d",
2894 			    hid_statep->hid_pm->hid_pm_busy);
2895 
2896 			mutex_exit(&hid_statep->hid_mutex);
2897 		}
2898 	}
2899 }
2900 
2901 
2902 /*
2903  * hid_pwrlvl0:
2904  *	Functions to handle power transition for various levels
2905  *	These functions act as place holders to issue USB commands
2906  *	to the devices to change their power levels
2907  */
2908 static int
2909 hid_pwrlvl0(hid_state_t *hidp)
2910 {
2911 	hid_power_t	*hidpm;
2912 	int		rval;
2913 	struct iocblk	*mctlmsg;
2914 	mblk_t		*mp_lowpwr, *mp_fullpwr;
2915 	queue_t		*q;
2916 
2917 	hidpm = hidp->hid_pm;
2918 
2919 	switch (hidp->hid_dev_state) {
2920 	case USB_DEV_ONLINE:
2921 		/* Deny the powerdown request if the device is busy */
2922 		if (hidpm->hid_pm_busy != 0) {
2923 
2924 			return (USB_FAILURE);
2925 		}
2926 
2927 		if (hidp->hid_streams_flags == HID_STREAMS_OPEN) {
2928 			q = hidp->hid_rq_ptr;
2929 			mutex_exit(&hidp->hid_mutex);
2930 			if (canputnext(q)) {
2931 				/* try to preallocate mblks */
2932 				mp_lowpwr = allocb(
2933 				    (int)sizeof (struct iocblk), BPRI_HI);
2934 				mp_fullpwr = allocb(
2935 				    (int)sizeof (struct iocblk), BPRI_HI);
2936 				if ((mp_lowpwr != NULL) &&
2937 				    (mp_fullpwr != NULL)) {
2938 					/* stop polling */
2939 					usb_pipe_stop_intr_polling(
2940 					    hidp->hid_interrupt_pipe,
2941 					    USB_FLAGS_SLEEP);
2942 
2943 					/*
2944 					 * Send an MCTL up indicating that
2945 					 * we are powering off
2946 					 */
2947 					mp_lowpwr->b_datap->db_type = M_CTL;
2948 					mctlmsg = (struct iocblk *)
2949 					    mp_lowpwr->b_datap->db_base;
2950 					mctlmsg->ioc_cmd = HID_POWER_OFF;
2951 					mctlmsg->ioc_count = 0;
2952 					putnext(q, mp_lowpwr);
2953 
2954 					/* save the full powr mblk */
2955 					mutex_enter(&hidp->hid_mutex);
2956 					hidpm->hid_pm_pwrup = mp_fullpwr;
2957 				} else {
2958 					/*
2959 					 * Since we failed to allocate one
2960 					 * or more mblks, we fail attempt
2961 					 * to go into low power this time
2962 					 */
2963 					freemsg(mp_lowpwr);
2964 					freemsg(mp_fullpwr);
2965 					mutex_enter(&hidp->hid_mutex);
2966 
2967 					return (USB_FAILURE);
2968 				}
2969 			} else {
2970 				/*
2971 				 * Since we can't send an mblk up,
2972 				 * we fail this attempt to go to low power
2973 				 */
2974 				mutex_enter(&hidp->hid_mutex);
2975 
2976 				return (USB_FAILURE);
2977 			}
2978 		}
2979 		mutex_exit(&hidp->hid_mutex);
2980 		/* Issue USB D3 command to the device here */
2981 		rval = usb_set_device_pwrlvl3(hidp->hid_dip);
2982 		ASSERT(rval == USB_SUCCESS);
2983 
2984 		mutex_enter(&hidp->hid_mutex);
2985 		hidp->hid_dev_state = USB_DEV_PWRED_DOWN;
2986 		hidpm->hid_current_power = USB_DEV_OS_PWR_OFF;
2987 
2988 		/* FALLTHRU */
2989 	case USB_DEV_DISCONNECTED:
2990 	case USB_DEV_SUSPENDED:
2991 	case USB_DEV_PWRED_DOWN:
2992 	default:
2993 		break;
2994 	}
2995 
2996 	return (USB_SUCCESS);
2997 }
2998 
2999 
3000 /* ARGSUSED */
3001 static int
3002 hid_pwrlvl1(hid_state_t *hidp)
3003 {
3004 	int		rval;
3005 
3006 	/* Issue USB D2 command to the device here */
3007 	rval = usb_set_device_pwrlvl2(hidp->hid_dip);
3008 	ASSERT(rval == USB_SUCCESS);
3009 
3010 	return (USB_FAILURE);
3011 }
3012 
3013 
3014 /* ARGSUSED */
3015 static int
3016 hid_pwrlvl2(hid_state_t *hidp)
3017 {
3018 	int		rval;
3019 
3020 	rval = usb_set_device_pwrlvl1(hidp->hid_dip);
3021 	ASSERT(rval == USB_SUCCESS);
3022 
3023 	return (USB_FAILURE);
3024 }
3025 
3026 
3027 static int
3028 hid_pwrlvl3(hid_state_t *hidp)
3029 {
3030 	hid_power_t	*hidpm;
3031 	int		rval;
3032 	struct iocblk	*mctlmsg;
3033 	mblk_t		*mp;
3034 	queue_t		*q;
3035 
3036 	hidpm = hidp->hid_pm;
3037 
3038 	switch (hidp->hid_dev_state) {
3039 	case USB_DEV_HID_POWER_CHANGE:
3040 	case USB_DEV_PWRED_DOWN:
3041 		/* Issue USB D0 command to the device here */
3042 		rval = usb_set_device_pwrlvl0(hidp->hid_dip);
3043 		ASSERT(rval == USB_SUCCESS);
3044 
3045 		if (hidp->hid_streams_flags == HID_STREAMS_OPEN) {
3046 			/* restart polling on intr pipe */
3047 			rval = hid_start_intr_polling(hidp);
3048 			if (rval != USB_SUCCESS) {
3049 				USB_DPRINTF_L2(PRINT_MASK_EVENTS,
3050 				    hidp->hid_log_handle,
3051 				    "unable to restart intr polling rval = %d",
3052 				    rval);
3053 
3054 				return (USB_FAILURE);
3055 			}
3056 
3057 			/* Send an MCTL up indicating device in full  power */
3058 			q = hidp->hid_rq_ptr;
3059 			mp = hidpm->hid_pm_pwrup;
3060 			hidpm->hid_pm_pwrup = NULL;
3061 			mutex_exit(&hidp->hid_mutex);
3062 			if (canputnext(q)) {
3063 				mp->b_datap->db_type = M_CTL;
3064 				mctlmsg = (struct iocblk *)mp->b_datap->db_base;
3065 				mctlmsg->ioc_cmd = HID_FULL_POWER;
3066 				mctlmsg->ioc_count = 0;
3067 				putnext(q, mp);
3068 			} else {
3069 				freemsg(mp);
3070 			}
3071 			mutex_enter(&hidp->hid_mutex);
3072 		}
3073 		hidp->hid_dev_state = USB_DEV_ONLINE;
3074 		hidpm->hid_current_power = USB_DEV_OS_FULL_PWR;
3075 
3076 		/* FALLTHRU */
3077 	case USB_DEV_DISCONNECTED:
3078 	case USB_DEV_SUSPENDED:
3079 	case USB_DEV_ONLINE:
3080 
3081 		return (USB_SUCCESS);
3082 	default:
3083 		USB_DPRINTF_L2(PRINT_MASK_EVENTS, hidp->hid_log_handle,
3084 		    "hid_pwrlvl3: Improper State");
3085 
3086 		return (USB_FAILURE);
3087 	}
3088 }
3089 
3090 
3091 /*
3092  * hid_polled_input_init :
3093  *	This routine calls down to the lower layers to initialize any state
3094  *	information.  This routine initializes the lower layers for input.
3095  */
3096 static int
3097 hid_polled_input_init(hid_state_t *hidp)
3098 {
3099 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
3100 	    "hid_polled_input_init");
3101 
3102 	/*
3103 	 * Call the lower layers to intialize any state information
3104 	 * that they will need to provide the polled characters.
3105 	 */
3106 	if (usb_console_input_init(hidp->hid_dip, hidp->hid_interrupt_pipe,
3107 	    &hidp->hid_polled_raw_buf,
3108 	    &hidp->hid_polled_console_info) != USB_SUCCESS) {
3109 		/*
3110 		 * If for some reason the lower layers cannot initialized, then
3111 		 * bail.
3112 		 */
3113 		(void) hid_polled_input_fini(hidp);
3114 
3115 		return (USB_FAILURE);
3116 	}
3117 
3118 	return (USB_SUCCESS);
3119 }
3120 
3121 
3122 /*
3123  * hid_polled_input_fini:
3124  *	This routine is called when we are done using this device as an input
3125  *	device.
3126  */
3127 static int
3128 hid_polled_input_fini(hid_state_t *hidp)
3129 {
3130 	USB_DPRINTF_L4(PRINT_MASK_ALL, hidp->hid_log_handle,
3131 	    "hid_polled_input_fini");
3132 
3133 	/*
3134 	 * Call the lower layers to free any state information
3135 	 * only if polled input has been initialised.
3136 	 */
3137 	if ((hidp->hid_polled_console_info) &&
3138 	    (usb_console_input_fini(hidp->hid_polled_console_info) !=
3139 	    USB_SUCCESS)) {
3140 
3141 		return (USB_FAILURE);
3142 	}
3143 	hidp->hid_polled_console_info = NULL;
3144 
3145 	return (USB_SUCCESS);
3146 }
3147 
3148 
3149 /*
3150  * hid_polled_input_enter:
3151  *	This is the routine that is called in polled mode to save the USB
3152  *	state information before using the USB keyboard as an input device.
3153  *	This routine, and all of the routines that it calls, are responsible
3154  *	for saving any state information so that it can be restored when
3155  *	polling mode is over.
3156  */
3157 static int
3158 /* ARGSUSED */
3159 hid_polled_input_enter(hid_polled_handle_t hid_polled_inputp)
3160 {
3161 	hid_state_t *hidp = (hid_state_t *)hid_polled_inputp;
3162 
3163 	/*
3164 	 * Call the lower layers to tell them to save any state information.
3165 	 */
3166 	(void) usb_console_input_enter(hidp->hid_polled_console_info);
3167 
3168 	return (USB_SUCCESS);
3169 }
3170 
3171 
3172 /*
3173  * hid_polled_read :
3174  *	This is the routine that is called in polled mode when it wants to read
3175  *	a character.  We will call to the lower layers to see if there is any
3176  *	input data available.  If there is USB scancodes available, we will
3177  *	give them back.
3178  */
3179 static int
3180 hid_polled_read(hid_polled_handle_t hid_polled_input, uchar_t **buffer)
3181 {
3182 	hid_state_t *hidp = (hid_state_t *)hid_polled_input;
3183 	uint_t			num_bytes;
3184 
3185 	/*
3186 	 * Call the lower layers to get the character from the controller.
3187 	 * The lower layers will return the number of characters that
3188 	 * were put in the raw buffer.	The address of the raw buffer
3189 	 * was passed down to the lower layers during hid_polled_init.
3190 	 */
3191 	if (usb_console_read(hidp->hid_polled_console_info,
3192 	    &num_bytes) != USB_SUCCESS) {
3193 
3194 		return (0);
3195 	}
3196 
3197 	_NOTE(NO_COMPETING_THREADS_NOW);
3198 
3199 	*buffer = hidp->hid_polled_raw_buf;
3200 
3201 	_NOTE(COMPETING_THREADS_NOW);
3202 
3203 	/*
3204 	 * Return the number of characters that were copied into the
3205 	 * polled buffer.
3206 	 */
3207 	return (num_bytes);
3208 }
3209 
3210 
3211 /*
3212  * hid_polled_input_exit :
3213  *	This is the routine that is called in polled mode  when it is giving up
3214  *	control of the USB keyboard.  This routine, and the lower layer routines
3215  *	that it calls, are responsible for restoring the controller state to the
3216  *	state it was in before polled mode.
3217  */
3218 static int
3219 hid_polled_input_exit(hid_polled_handle_t hid_polled_inputp)
3220 {
3221 	hid_state_t *hidp = (hid_state_t *)hid_polled_inputp;
3222 
3223 	/*
3224 	 * Call the lower layers to restore any state information.
3225 	 */
3226 	(void) usb_console_input_exit(hidp->hid_polled_console_info);
3227 
3228 	return (0);
3229 }
3230 
3231 static void
3232 hid_consconfig_relink(void *arg)
3233 {
3234 	hid_state_t *hidp = (hid_state_t *)arg;
3235 
3236 	consconfig_link(ddi_driver_major(hidp->hid_dip),
3237 	    HID_MINOR_MAKE_INTERNAL(hidp->hid_minor));
3238 }
3239