diff -Nru sys/dev/usb.orig/hid.c sys/dev/usb/hid.c --- sys/dev/usb.orig/hid.c 2007-06-20 09:10:52.000000000 +0400 +++ sys/dev/usb/hid.c 2008-07-14 16:01:39.000000000 +0400 @@ -72,6 +72,7 @@ int multi; int multimax; int kindset; + int usage; }; static void @@ -115,7 +116,7 @@ } int -hid_get_item(struct hid_data *s, struct hid_item *h) +hid_get_item(struct hid_data *s, u_int32_t u, struct hid_item *h) { struct hid_item *c = &s->cur; unsigned int bTag, bType, bSize; @@ -193,6 +194,9 @@ case 0: /* Main */ switch (bTag) { case 8: /* Input */ + if (s->usage != u >>16 && u != 0) + break; + if (!(s->kindset & (1 << hid_input))) continue; c->kind = hid_input; @@ -223,6 +227,9 @@ return (1); } case 9: /* Output */ + if (s->usage != u >>16 && u != 0) + break; + if (!(s->kindset & (1 << hid_output))) continue; c->kind = hid_output; @@ -232,11 +239,16 @@ c->kind = hid_collection; c->collection = dval; c->collevel++; + if (c->collevel > 0 && u != 0) + s->usage = c->_usage_page >> 16; *h = *c; hid_clear_local(c); s->nu = 0; return (1); case 11: /* Feature */ + if (s->usage != u >>16 && u != 0) + break; + if (!(s->kindset & (1 << hid_feature))) continue; c->kind = hid_feature; @@ -258,6 +270,9 @@ switch (bTag) { case 0: c->_usage_page = dval << 16; + + if (u != 0 && u>>16 == dval) + s->usage = dval; break; case 1: c->logical_minimum = dval; @@ -364,7 +379,7 @@ } int -hid_report_size(void *buf, int len, enum hid_kind k, u_int8_t *idp) +hid_report_size(void *buf, int len, u_int32_t u, enum hid_kind k, u_int8_t *idp) { struct hid_data *d; struct hid_item h; @@ -372,7 +387,7 @@ id = 0; hi = lo = -1; - for (d = hid_start_parse(buf, len, 1<sc_flen = hid_report_size(urd, urdlen, hid_feature, &sc->sc_fid); - sc->sc_ilen = hid_report_size(urd, urdlen, hid_input, &sc->sc_iid); - sc->sc_olen = hid_report_size(urd, urdlen, hid_output, &sc->sc_oid); + sc->sc_flen = hid_report_size(urd, urdlen, 0, hid_feature, &sc->sc_fid); /* NEED TO BE FIXX ????? */ + sc->sc_ilen = hid_report_size(urd, urdlen, 0, hid_input, &sc->sc_iid); /* NEED TO BE FIXX ????? */ + sc->sc_olen = hid_report_size(urd, urdlen, 0, hid_output, &sc->sc_oid); /* NEED TO BE FIXX ????? */ if (sc->sc_ilen > UCYCOM_MAX_IOLEN || sc->sc_olen > UCYCOM_MAX_IOLEN) { device_printf(dev, "I/O report size too big (%zu, %zu, %u)\n", diff -Nru sys/dev/usb.orig/uhid.c sys/dev/usb/uhid.c --- sys/dev/usb.orig/uhid.c 2007-06-21 18:42:33.000000000 +0400 +++ sys/dev/usb/uhid.c 2008-07-14 16:01:39.000000000 +0400 @@ -320,9 +320,9 @@ (void)usbd_set_idle(iface, 0, 0); - sc->sc_isize = hid_report_size(desc, size, hid_input, &sc->sc_iid); - sc->sc_osize = hid_report_size(desc, size, hid_output, &sc->sc_oid); - sc->sc_fsize = hid_report_size(desc, size, hid_feature, &sc->sc_fid); + sc->sc_isize = hid_report_size(desc, size, 0, hid_input, &sc->sc_iid); + sc->sc_osize = hid_report_size(desc, size, 0, hid_output, &sc->sc_oid); + sc->sc_fsize = hid_report_size(desc, size, 0, hid_feature, &sc->sc_fid); sc->sc_repdesc = desc; sc->sc_repdesc_size = size; diff -Nru sys/dev/usb.orig/ums.c sys/dev/usb/ums.c --- sys/dev/usb.orig/ums.c 2008-04-30 23:37:54.000000000 +0400 +++ sys/dev/usb/ums.c 2008-07-14 16:01:39.000000000 +0400 @@ -358,7 +358,8 @@ hid_locate(desc, size, HID_USAGE2(HUP_BUTTON, i), hid_input, &sc->sc_loc_btn[i-1], 0); - sc->sc_isize = hid_report_size(desc, size, hid_input, &sc->sc_iid); + sc->sc_isize = hid_report_size(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE), + hid_input, &sc->sc_iid); sc->sc_ibuf = malloc(sc->sc_isize, M_USB, M_NOWAIT); if (!sc->sc_ibuf) { printf("%s: no memory\n", device_get_nameunit(sc->sc_dev)); @@ -393,6 +394,7 @@ * descriptor), it seems that report id 17 contains the necessary * mouse information(3-buttons,X,Y,wheel) so we specify it manually. */ + /* IS IT NESSESARY ??? NEED TO BE RECHECK !!!!!!! AND EXCLUDE */ if (uaa->vendor == USB_VENDOR_MICROSOFT && uaa->product == USB_PRODUCT_MICROSOFT_WLNOTEBOOK3) { sc->flags = UMS_Z;