summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/usb/clients/usbms/usbms.c268
-rw-r--r--usr/src/uts/common/io/vuidmice/vuidmice.c67
2 files changed, 167 insertions, 168 deletions
diff --git a/usr/src/uts/common/io/usb/clients/usbms/usbms.c b/usr/src/uts/common/io/usb/clients/usbms/usbms.c
index d87747924c..12e0874f24 100644
--- a/usr/src/uts/common/io/usb/clients/usbms/usbms.c
+++ b/usr/src/uts/common/io/usb/clients/usbms/usbms.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -78,7 +78,7 @@ _init(void)
if (rval == 0) {
usbms_log_handle = usb_alloc_log_hdl(NULL, "usbms",
- &usbms_errlevel, &usbms_errmask, NULL, 0);
+ &usbms_errlevel, &usbms_errmask, NULL, 0);
}
return (rval);
@@ -426,13 +426,13 @@ usbms_close(queue_t *q,
register struct ms_softc *ms = &usbmsp->usbms_softc;
USB_DPRINTF_L3(PRINT_MASK_CLOSE, usbms_log_handle,
- "usbms_close entering");
+ "usbms_close entering");
qprocsoff(q);
if (usbmsp->usbms_jitter) {
(void) quntimeout(q,
- (timeout_id_t)(long)usbmsp->usbms_timeout_id);
+ (timeout_id_t)(long)usbmsp->usbms_timeout_id);
usbmsp->usbms_jitter = 0;
}
if (usbmsp->usbms_reioctl_id) {
@@ -467,7 +467,7 @@ usbms_close(queue_t *q,
USB_DPRINTF_L3(PRINT_MASK_CLOSE, usbms_log_handle,
- "usbms_close exiting");
+ "usbms_close exiting");
return (0);
}
@@ -493,7 +493,7 @@ usbms_rserv(queue_t *q)
b = usbmsp->usbms_buf;
USB_DPRINTF_L3(PRINT_MASK_SERV, usbms_log_handle,
- "usbms_rserv entering");
+ "usbms_rserv entering");
while (canputnext(q) && ms->ms_oldoff != b->mb_off) {
mi = &b->mb_info[ms->ms_oldoff];
@@ -524,13 +524,14 @@ usbms_rserv(queue_t *q)
} else {
if (usbmsp->usbms_resched_id) {
qunbufcall(q,
- (bufcall_id_t)usbmsp->usbms_resched_id);
+ (bufcall_id_t)usbmsp->
+ usbms_resched_id);
}
usbmsp->usbms_resched_id = qbufcall(q,
- (size_t)3,
- (uint_t)BPRI_HI,
- (void (*)())usbms_resched,
- (void *) usbmsp);
+ (size_t)3,
+ (uint_t)BPRI_HI,
+ (void (*)())usbms_resched,
+ (void *) usbmsp);
if (usbmsp->usbms_resched_id == 0)
return; /* try again later */
@@ -556,12 +557,12 @@ usbms_rserv(queue_t *q)
case EVENT_WHEEL:
loop = (usbmsp->usbms_num_wheels ?
- 1 : 0);
+ 1 : 0);
if (usbmsp->usbms_num_wheels) {
for (i = 0; i < loop; i++) {
- usbms_rserv_vuid_event_wheel
- (q, mi, &bp, i);
+ usbms_rserv_vuid_event_wheel
+ (q, mi, &bp, i);
}
}
@@ -612,7 +613,7 @@ usbms_rserv(queue_t *q)
}
}
USB_DPRINTF_L3(PRINT_MASK_SERV, usbms_log_handle,
- "usbms_rserv exiting");
+ "usbms_rserv exiting");
}
@@ -649,7 +650,7 @@ usbms_rserv_vuid_event_wheel(queue_t *q,
} else {
if (usbmsp->usbms_resched_id) {
qunbufcall(q,
- (bufcall_id_t)usbmsp->usbms_resched_id);
+ (bufcall_id_t)usbmsp->usbms_resched_id);
}
usbmsp->usbms_resched_id =
qbufcall(q, sizeof (Firm_event), BPRI_HI,
@@ -728,15 +729,15 @@ usbms_rserv_vuid_button(queue_t *q,
}
if ((ms->ms_prevbuttons & hwbit) !=
- (mi->mi_buttons & hwbit)) {
+ (mi->mi_buttons & hwbit)) {
if ((bp = allocb(sizeof (Firm_event),
- BPRI_HI)) != NULL) {
+ BPRI_HI)) != NULL) {
*bpaddr = bp;
fep = (Firm_event *)bp->b_wptr;
fep->id = vuid_id_addr(
- ms->ms_vuidaddr) |
- vuid_id_offset(BUT(1)
- + button_number);
+ ms->ms_vuidaddr) |
+ vuid_id_offset(BUT(1)
+ + button_number);
fep->pair_type = FE_PAIR_NONE;
fep->pair = 0;
@@ -747,24 +748,24 @@ usbms_rserv_vuid_button(queue_t *q,
if (mi->mi_buttons & hwbit) {
fep->value = 0;
ms->ms_prevbuttons |=
- hwbit;
+ hwbit;
} else {
fep->value = 1;
ms->ms_prevbuttons &=
- ~hwbit;
+ ~hwbit;
}
fep->time = mi->mi_time;
} else {
if (usbmsp->usbms_resched_id) {
qunbufcall(q,
- (bufcall_id_t)usbmsp->usbms_resched_id);
+ (bufcall_id_t)usbmsp->usbms_resched_id);
}
usbmsp->usbms_resched_id =
- qbufcall(q,
- sizeof (Firm_event),
- BPRI_HI,
- (void (*)())usbms_resched,
- (void *) usbmsp);
+ qbufcall(q,
+ sizeof (Firm_event),
+ BPRI_HI,
+ (void (*)())usbms_resched,
+ (void *) usbmsp);
if (usbmsp->usbms_resched_id == 0)
/* try again later */
return;
@@ -811,25 +812,25 @@ usbms_rserv_vuid_event_y(register queue_t *q,
/* Send y if changed. */
if (mi->mi_y != 0) {
if ((bp = allocb(sizeof (Firm_event),
- BPRI_HI)) != NULL) {
+ BPRI_HI)) != NULL) {
*bpaddr = bp;
fep = (Firm_event *)bp->b_wptr;
if (((usbmsp->usbms_idf).yattr) &
HID_MAIN_ITEM_RELATIVE) {
fep->id = vuid_id_addr(
- ms->ms_vuidaddr) |
- vuid_id_offset(
- LOC_Y_DELTA);
+ ms->ms_vuidaddr) |
+ vuid_id_offset(
+ LOC_Y_DELTA);
fep->pair_type =
- FE_PAIR_ABSOLUTE;
+ FE_PAIR_ABSOLUTE;
fep->pair =
- (uchar_t)LOC_Y_ABSOLUTE;
+ (uchar_t)LOC_Y_ABSOLUTE;
fep->value = -(mi->mi_y);
} else {
fep->id = vuid_id_addr(
- ms->ms_vuidaddr) |
- vuid_id_offset(
- LOC_Y_ABSOLUTE);
+ ms->ms_vuidaddr) |
+ vuid_id_offset(
+ LOC_Y_ABSOLUTE);
fep->pair_type = FE_PAIR_DELTA;
fep->pair = (uchar_t)LOC_Y_DELTA;
fep->value = (mi->mi_y *
@@ -846,14 +847,14 @@ usbms_rserv_vuid_event_y(register queue_t *q,
} else {
if (usbmsp->usbms_resched_id) {
qunbufcall(q,
- (bufcall_id_t)usbmsp->usbms_resched_id);
+ (bufcall_id_t)usbmsp->usbms_resched_id);
}
usbmsp->usbms_resched_id =
- qbufcall(q,
- sizeof (Firm_event),
- BPRI_HI,
- (void (*)())usbms_resched,
- (void *)usbmsp);
+ qbufcall(q,
+ sizeof (Firm_event),
+ BPRI_HI,
+ (void (*)())usbms_resched,
+ (void *)usbmsp);
if (usbmsp->usbms_resched_id == 0) {
/* try again later */
return;
@@ -902,22 +903,22 @@ usbms_rserv_vuid_event_x(register queue_t *q,
/* Send x if changed. */
if (mi->mi_x != 0) {
if ((bp = allocb(sizeof (Firm_event),
- BPRI_HI)) != NULL) {
+ BPRI_HI)) != NULL) {
*bpaddr = bp;
fep = (Firm_event *)bp->b_wptr;
if (((usbmsp->usbms_idf).xattr) &
HID_MAIN_ITEM_RELATIVE) {
fep->id = vuid_id_addr(
- ms->ms_vuidaddr) |
- vuid_id_offset(LOC_X_DELTA);
+ ms->ms_vuidaddr) |
+ vuid_id_offset(LOC_X_DELTA);
fep->pair_type =
- FE_PAIR_ABSOLUTE;
+ FE_PAIR_ABSOLUTE;
fep->pair =
- (uchar_t)LOC_X_ABSOLUTE;
+ (uchar_t)LOC_X_ABSOLUTE;
fep->value = mi->mi_x;
} else {
fep->id = vuid_id_addr(ms->ms_vuidaddr) |
- vuid_id_offset(LOC_X_ABSOLUTE);
+ vuid_id_offset(LOC_X_ABSOLUTE);
fep->pair_type = FE_PAIR_DELTA;
fep->pair = (uchar_t)LOC_X_DELTA;
fep->value = (mi->mi_x *
@@ -934,13 +935,13 @@ usbms_rserv_vuid_event_x(register queue_t *q,
} else {
if (usbmsp->usbms_resched_id)
qunbufcall(q,
- (bufcall_id_t)usbmsp->usbms_resched_id);
+ (bufcall_id_t)usbmsp->usbms_resched_id);
usbmsp->usbms_resched_id =
- qbufcall(q,
- sizeof (Firm_event),
- BPRI_HI,
- (void (*)())usbms_resched,
- (void *) usbmsp);
+ qbufcall(q,
+ sizeof (Firm_event),
+ BPRI_HI,
+ (void (*)())usbms_resched,
+ (void *) usbmsp);
if (usbmsp->usbms_resched_id == 0)
/* try again later */
return;
@@ -983,7 +984,7 @@ usbms_wput(queue_t *q,
mblk_t *mp)
{
USB_DPRINTF_L3(PRINT_MASK_ALL, usbms_log_handle,
- "usbms_wput entering");
+ "usbms_wput entering");
switch (mp->b_datap->db_type) {
case M_FLUSH: /* Canonical flush handling */
@@ -1011,7 +1012,7 @@ usbms_wput(queue_t *q,
}
USB_DPRINTF_L3(PRINT_MASK_ALL, usbms_log_handle,
- "usbms_wput exiting");
+ "usbms_wput exiting");
return (0);
}
@@ -1037,7 +1038,7 @@ usbms_ioctl(register queue_t *q,
mblk_t *mb;
USB_DPRINTF_L3(PRINT_MASK_IOCTL, usbms_log_handle,
- "usbms_ioctl entering");
+ "usbms_ioctl entering");
if (usbmsp == NULL) {
miocnak(q, mp, 0, EINVAL);
@@ -1185,7 +1186,7 @@ usbms_ioctl(register queue_t *q,
return;
}
if (mp->b_cont == NULL || iocp->ioc_count !=
- sizeof (wheel_info)) {
+ sizeof (wheel_info)) {
err = EINVAL;
break;
}
@@ -1321,8 +1322,8 @@ allocfailure:
qunbufcall(q, (bufcall_id_t)usbmsp->usbms_reioctl_id);
}
usbmsp->usbms_reioctl_id = qbufcall(q, ioctlrespsize, BPRI_HI,
- (void (*)())usbms_reioctl,
- (void *)usbmsp);
+ (void (*)())usbms_reioctl,
+ (void *)usbmsp);
}
@@ -1525,7 +1526,7 @@ usbms_flush(usbms_state_t *usbmsp)
register queue_t *q;
USB_DPRINTF_L3(PRINT_MASK_ALL, usbms_log_handle,
- "usbms_flush entering");
+ "usbms_flush entering");
ms->ms_oldoff = 0;
ms->ms_eventstate = EVENT_BUT(usbmsp->usbms_num_buttons);
@@ -1537,7 +1538,7 @@ usbms_flush(usbms_state_t *usbmsp)
}
USB_DPRINTF_L3(PRINT_MASK_ALL, usbms_log_handle,
- "usbms_flush exiting");
+ "usbms_flush exiting");
}
@@ -1675,8 +1676,8 @@ usbms_mctl_receive(register queue_t *q,
/* FALLTHRU */
default:
- freemsg(mp);
- break;
+ freemsg(mp);
+ break;
}
}
@@ -1716,7 +1717,7 @@ usbms_input(usbms_state_t *usbmsp,
b = usbmsp->usbms_buf;
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "usbms_input entering");
+ "usbms_input entering");
if (b == NULL) {
@@ -1733,49 +1734,49 @@ usbms_input(usbms_state_t *usbmsp,
if (c & USBMS_BUT(1)) { /* left button is pressed */
mi->mi_buttons = mi->mi_buttons & USB_LEFT_BUT_PRESSED;
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR,
- usbms_log_handle,
- "left button pressed");
+ usbms_log_handle,
+ "left button pressed");
}
if (c & USBMS_BUT(2)) { /* right button is pressed */
mi->mi_buttons = mi->mi_buttons & USB_RIGHT_BUT_PRESSED;
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR,
- usbms_log_handle,
- "right button pressed");
+ usbms_log_handle,
+ "right button pressed");
}
if (c & USBMS_BUT(3)) { /* middle button is pressed */
mi->mi_buttons = mi->mi_buttons &
- USB_MIDDLE_BUT_PRESSED;
+ USB_MIDDLE_BUT_PRESSED;
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR,
- usbms_log_handle,
- "middle button pressed");
+ usbms_log_handle,
+ "middle button pressed");
}
if (nbutt > 3) {
for (i = 4; i < (nbutt + 1); i++) {
if (c & USBMS_BUT(i)) {
mi->mi_buttons = mi->mi_buttons &
- USB_BUT_PRESSED(i);
+ USB_BUT_PRESSED(i);
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR,
- usbms_log_handle,
- "%d button pressed", i);
+ usbms_log_handle,
+ "%d button pressed", i);
}
}
}
/* get the delta X and Y from the sample */
mi->mi_x += usbms_get_coordinate((usbmsp->usbms_idf).xpos,
- (usbmsp->usbms_idf).xlen, mp);
+ (usbmsp->usbms_idf).xlen, mp);
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR,
- usbms_log_handle, "x = %d", (int)mi->mi_x);
+ usbms_log_handle, "x = %d", (int)mi->mi_x);
uniqtime32(&mi->mi_time); /* record time when sample arrived */
mi->mi_y += usbms_get_coordinate((usbmsp->usbms_idf).ypos,
- (usbmsp->usbms_idf).ylen, mp);
+ (usbmsp->usbms_idf).ylen, mp);
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "y = %d", (int)mi->mi_y);
+ "y = %d", (int)mi->mi_y);
/*
* Check the wheel data in the current event.
@@ -1784,15 +1785,15 @@ usbms_input(usbms_state_t *usbmsp,
if (usbmsp->usbms_num_wheels) {
mi->mi_z += usbms_get_coordinate((usbmsp->usbms_idf).zpos,
- (usbmsp->usbms_idf).zlen, mp);
+ (usbmsp->usbms_idf).zlen, mp);
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "z = %d", (int)mi->mi_z);
+ "z = %d", (int)mi->mi_z);
}
if (usbmsp->usbms_jitter) {
(void) quntimeout(usbmsp->usbms_rq_ptr,
- (timeout_id_t)usbmsp->usbms_timeout_id);
+ (timeout_id_t)usbmsp->usbms_timeout_id);
usbmsp->usbms_jitter = 0;
}
@@ -1819,7 +1820,7 @@ usbms_input(usbms_state_t *usbmsp,
*/
jitter_radius = usbmsp->usbms_jitter_thresh;
if (USB_ABS((int)mi->mi_x) <= jitter_radius &&
- USB_ABS((int)mi->mi_y) <= jitter_radius) {
+ USB_ABS((int)mi->mi_y) <= jitter_radius) {
/*
* Mouse moved less than the jitter threshhold.
* Don't indicate an event; keep accumulating motions.
@@ -1828,8 +1829,10 @@ usbms_input(usbms_state_t *usbmsp,
*/
usbmsp->usbms_jitter = 1;
usbmsp->usbms_timeout_id =
- qtimeout(usbmsp->usbms_rq_ptr, (void (*)())usbms_incr,
- (void *)usbmsp, (clock_t)usbmsp->usbms_jittertimeout);
+ qtimeout(usbmsp->usbms_rq_ptr,
+ (void (*)())usbms_incr,
+ (void *)usbmsp,
+ (clock_t)usbmsp->usbms_jittertimeout);
return;
}
@@ -1838,7 +1841,7 @@ usbms_input(usbms_state_t *usbmsp,
usbms_incr(usbmsp);
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "usbms_input exiting");
+ "usbms_input exiting");
}
@@ -1898,7 +1901,7 @@ usbms_incr(void *arg)
b = usbmsp->usbms_buf;
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "usbms_incr entering");
+ "usbms_incr entering");
if (b == NULL) {
@@ -1940,7 +1943,7 @@ usbms_incr(void *arg)
if (b->mb_off == ms->ms_oldoff) {
if (overrun_msg) {
USB_DPRINTF_L1(PRINT_MASK_ALL, usbms_log_handle,
- "Mouse buffer flushed when overrun.");
+ "Mouse buffer flushed when overrun.");
}
usbms_flush(usbmsp);
overrun_cnt++;
@@ -1955,11 +1958,11 @@ usbms_incr(void *arg)
if (wake) {
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "usbms_incr run service");
+ "usbms_incr run service");
qenable(usbmsp->usbms_rq_ptr); /* run the service proc */
}
USB_DPRINTF_L3(PRINT_MASK_INPUT_INCR, usbms_log_handle,
- "usbms_incr exiting");
+ "usbms_incr exiting");
}
@@ -1991,20 +1994,20 @@ usbms_check_for_wheels(usbms_state_t *usbmsp)
/* find no. of wheels in this report */
rval = hidparser_get_usage_attribute(
- usbmsp->usbms_report_descr_handle,
- report_id,
- HIDPARSER_ITEM_INPUT,
- HID_GENERIC_DESKTOP,
- HID_GD_WHEEL,
- HIDPARSER_ITEM_REPORT_COUNT,
- &usbmsp->usbms_num_wheels);
+ usbmsp->usbms_report_descr_handle,
+ report_id,
+ HIDPARSER_ITEM_INPUT,
+ HID_GENERIC_DESKTOP,
+ HID_GD_WHEEL,
+ HIDPARSER_ITEM_REPORT_COUNT,
+ &usbmsp->usbms_num_wheels);
if (rval == HIDPARSER_SUCCESS) {
/*
* Found wheel. By default enable the wheel.
* Currently only enable only the first wheel.
*/
usbmsp->usbms_wheel_state_bf |=
- VUID_WHEEL_STATE_ENABLED;
+ VUID_WHEEL_STATE_ENABLED;
return (USB_SUCCESS);
}
@@ -2054,11 +2057,22 @@ usbms_make_copyreq(mblk_t *mp,
}
cq->cq_private = ioctmp;
ioctmp = cq->cq_private;
- }
+ } else {
+ /*
+ * Here we need to set cq_private even if there's
+ * no private data, otherwise its value will be
+ * TRANSPARENT (-1) on 64bit systems because it
+ * overlaps iocp->ioc_count. If user address (cq_addr)
+ * is invalid, it would cause panic later in
+ * usbms_miocdata:
+ * freemsg((mblk_t *)copyresp->cp_private);
+ */
+ cq->cq_private = NULL;
+ }
if (state) {
usbmsioc = (usbms_iocstate_t *)ioctmp->b_rptr;
usbmsioc->ioc_state = state;
- if (pvtsize) {
+ if (pvtsize) { /* M_COPYIN */
usbmsioc->u_addr = cq->cq_addr;
} else {
cq->cq_addr = usbmsioc->u_addr;
@@ -2254,10 +2268,10 @@ usbms_read_input_data_format(usbms_state_t *usbmsp)
*/
rval = hidparser_get_usage_list_in_order(
- usbmsp->usbms_report_descr_handle,
- usbmsp->usbms_rptid,
- HIDPARSER_ITEM_INPUT,
- ms_rpt);
+ usbmsp->usbms_report_descr_handle,
+ usbmsp->usbms_rptid,
+ HIDPARSER_ITEM_INPUT,
+ ms_rpt);
if (rval != HIDPARSER_SUCCESS) {
@@ -2270,7 +2284,7 @@ usbms_read_input_data_format(usbms_state_t *usbmsp)
rptcnt = ms_rpt->usage_descr[i].rptcnt;
rptsz = ms_rpt->usage_descr[i].rptsz;
if ((ms_rpt->usage_descr[i].usage_page ==
- HID_BUTTON_PAGE) && (!button_page)) {
+ HID_BUTTON_PAGE) && (!button_page)) {
idf->bpos = limit;
limit += (rptcnt * rptsz);
button_page = 1;
@@ -2321,12 +2335,12 @@ usbms_read_input_data_format(usbms_state_t *usbmsp)
/* Check whether X and Y are relative or absolute */
rval = hidparser_get_main_item_data_descr(
- usbmsp->usbms_report_descr_handle,
- usbmsp->usbms_rptid,
- HIDPARSER_ITEM_INPUT,
- HID_GENERIC_DESKTOP,
- HID_GD_X,
- &idf->xattr);
+ usbmsp->usbms_report_descr_handle,
+ usbmsp->usbms_rptid,
+ HIDPARSER_ITEM_INPUT,
+ HID_GENERIC_DESKTOP,
+ HID_GD_X,
+ &idf->xattr);
if (rval != HIDPARSER_SUCCESS) {
@@ -2347,13 +2361,13 @@ usbms_read_input_data_format(usbms_state_t *usbmsp)
return (USB_FAILURE);
}
if (hidparser_get_usage_attribute(
- usbmsp->usbms_report_descr_handle,
- usbmsp->usbms_rptid,
- HIDPARSER_ITEM_INPUT,
- HID_GENERIC_DESKTOP,
- HID_GD_X,
- HIDPARSER_ITEM_LOGICAL_MAXIMUM,
- &usbmsp->usbms_logical_Xmax) != HIDPARSER_SUCCESS) {
+ usbmsp->usbms_report_descr_handle,
+ usbmsp->usbms_rptid,
+ HIDPARSER_ITEM_INPUT,
+ HID_GENERIC_DESKTOP,
+ HID_GD_X,
+ HIDPARSER_ITEM_LOGICAL_MAXIMUM,
+ &usbmsp->usbms_logical_Xmax) != HIDPARSER_SUCCESS) {
USB_DPRINTF_L3(PRINT_MASK_ALL, usbms_log_handle,
"fail to get X logical max.");
@@ -2361,13 +2375,13 @@ usbms_read_input_data_format(usbms_state_t *usbmsp)
return (USB_FAILURE);
}
if (hidparser_get_usage_attribute(
- usbmsp->usbms_report_descr_handle,
- usbmsp->usbms_rptid,
- HIDPARSER_ITEM_INPUT,
- HID_GENERIC_DESKTOP,
- HID_GD_Y,
- HIDPARSER_ITEM_LOGICAL_MAXIMUM,
- &usbmsp->usbms_logical_Ymax) != HIDPARSER_SUCCESS) {
+ usbmsp->usbms_report_descr_handle,
+ usbmsp->usbms_rptid,
+ HIDPARSER_ITEM_INPUT,
+ HID_GENERIC_DESKTOP,
+ HID_GD_Y,
+ HIDPARSER_ITEM_LOGICAL_MAXIMUM,
+ &usbmsp->usbms_logical_Ymax) != HIDPARSER_SUCCESS) {
USB_DPRINTF_L3(PRINT_MASK_ALL, usbms_log_handle,
"fail to get Y logical max.");
diff --git a/usr/src/uts/common/io/vuidmice/vuidmice.c b/usr/src/uts/common/io/vuidmice/vuidmice.c
index 324147f49a..6b05d64928 100644
--- a/usr/src/uts/common/io/vuidmice/vuidmice.c
+++ b/usr/src/uts/common/io/vuidmice/vuidmice.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -519,16 +519,15 @@ static void
vuidmice_miocdata(queue_t *qp, mblk_t *mp)
{
struct copyresp *copyresp;
- struct copyreq *copyreq;
struct iocblk *iocbp;
mblk_t *ioctmp;
mblk_t *datap;
Mouse_iocstate_t *Mouseioc;
+ size_t size;
int err = 0;
copyresp = (struct copyresp *)mp->b_rptr;
- copyreq = (struct copyreq *)mp->b_rptr;
iocbp = (struct iocblk *)mp->b_rptr;
if (copyresp->cp_rval) {
@@ -571,17 +570,14 @@ vuidmice_miocdata(queue_t *qp, mblk_t *mp)
}
if (copyresp->cp_cmd == VUIDGWHEELSTATE) {
- copyreq->cq_size = sizeof (wheel_state);
+ size = sizeof (wheel_state);
} else {
- copyreq->cq_size = sizeof (wheel_info);
- copyreq->cq_flag = 0;
+ size = sizeof (wheel_info);
}
- copyreq->cq_private = ioctmp;
- copyreq->cq_addr = Mouseioc->u_addr;
Mouseioc->ioc_state = GETRESULT;
- mp->b_datap->db_type = M_COPYOUT;
- mp->b_wptr = mp->b_rptr + sizeof (struct copyreq);
+ ASSERT(Mouseioc->u_addr != NULL);
+ mcopyout(mp, ioctmp, size, Mouseioc->u_addr, NULL);
} else if (Mouseioc->ioc_state == GETRESULT) {
freemsg(ioctmp);
mp->b_datap->db_type = M_IOCACK;
@@ -664,63 +660,49 @@ vuidmice_handle_wheel_resolution_ioctl(queue_t *qp, mblk_t *mp, int cmd)
{
int err = 0;
Mouse_iocstate_t *Mouseioc;
- struct copyreq *copyreq;
+ caddr_t useraddr;
+ size_t size;
mblk_t *ioctmp;
mblk_t *datap;
struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
if (iocbp->ioc_count == TRANSPARENT) {
- copyreq = (struct copyreq *)mp->b_rptr;
- if (mp->b_cont == NULL) {
- err = EINVAL;
-
- return (err);
- }
- copyreq->cq_addr = (caddr_t)*((caddr_t *)mp->b_cont->b_rptr);
+ if (mp->b_cont == NULL)
+ return (EINVAL);
+ useraddr = (caddr_t)*((caddr_t *)mp->b_cont->b_rptr);
switch (cmd) {
case VUIDGWHEELCOUNT:
- copyreq->cq_size = sizeof (int);
- mp->b_datap->db_type = M_COPYOUT;
- mp->b_wptr = mp->b_rptr + sizeof (struct copyreq);
- freemsg(mp->b_cont);
- datap = allocb(sizeof (int), BPRI_HI);
+ size = sizeof (int);
+ if ((datap = allocb(sizeof (int), BPRI_HI)) == NULL)
+ return (EAGAIN);
*((int *)datap->b_wptr) = STATEP->vuid_mouse_mode;
- datap->b_wptr += sizeof (int);
- mp->b_cont = datap;
+ mcopyout(mp, NULL, size, NULL, datap);
qreply(qp, mp);
return (err);
case VUIDGWHEELINFO:
- copyreq->cq_size = sizeof (wheel_info);
+ size = sizeof (wheel_info);
break;
case VUIDSWHEELSTATE:
case VUIDGWHEELSTATE:
- copyreq->cq_size = sizeof (wheel_state);
+ size = sizeof (wheel_state);
break;
case MSIOSRESOLUTION:
- copyreq->cq_size = sizeof (Ms_screen_resolution);
+ size = sizeof (Ms_screen_resolution);
break;
}
if ((ioctmp = (mblk_t *)allocb(sizeof (Mouse_iocstate_t),
- BPRI_MED)) == NULL) {
- err = EAGAIN;
-
- return (err);
- }
- copyreq->cq_private = ioctmp;
+ BPRI_MED)) == NULL)
+ return (EAGAIN);
Mouseioc = (Mouse_iocstate_t *)ioctmp->b_rptr;
Mouseioc->ioc_state = GETSTRUCT;
- Mouseioc->u_addr = copyreq->cq_addr;
+ Mouseioc->u_addr = useraddr;
ioctmp->b_wptr = ioctmp->b_rptr + sizeof (Mouse_iocstate_t);
- copyreq->cq_flag = 0;
- mp->b_datap->db_type = M_COPYIN;
- freemsg(mp->b_cont);
- mp->b_cont = (mblk_t *)NULL;
- mp->b_wptr = mp->b_rptr + sizeof (struct copyreq);
+ mcopyin(mp, ioctmp, size, NULL);
qreply(qp, mp);
return (err);
@@ -731,7 +713,10 @@ vuidmice_handle_wheel_resolution_ioctl(queue_t *qp, mblk_t *mp, int cmd)
freemsg(mp->b_cont);
mp->b_cont = NULL;
}
- datap = allocb(sizeof (int), BPRI_HI);
+ if ((datap = allocb(sizeof (int), BPRI_HI)) == NULL) {
+ err = EAGAIN;
+ break;
+ }
*((int *)datap->b_wptr) = STATEP->vuid_mouse_mode;
datap->b_wptr += sizeof (int);
mp->b_cont = datap;