Date: Wed, 11 Mar 2009 08:25:07 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 159053 for review Message-ID: <200903110825.n2B8P7Fg093867@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=159053 Change 159053 by hselasky@hselasky_laptop001 on 2009/03/11 08:24:55 USB CORE: More HID fixes: - preserve item size and count accross items - add some more debugging prints Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_hid.c#22 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_hid.c#22 (text+ko) ==== @@ -68,7 +68,9 @@ struct hid_item cur[MAXPUSH]; int32_t usages_min[MAXUSAGE]; int32_t usages_max[MAXUSAGE]; - int kindset; + uint32_t loc_size; /* last seen size */ + uint32_t loc_count; /* last seen count */ + uint8_t kindset; /* we have 5 kinds so 8 bits are enough */ uint8_t pushlevel; /* current pushlevel */ uint8_t ncount; /* end usage item count */ uint8_t icount; /* current usage item count */ @@ -268,6 +270,9 @@ c->kind = hid_input; c->flags = dval; ret: + c->loc.count = s->loc_count; + c->loc.size = s->loc_size; + if (c->flags & HIO_VARIABLE) { /* range check usage count */ if (c->loc.count > 255) { @@ -287,6 +292,7 @@ } /* make sure we have a usage */ if (s->nusage == 0) { + DPRINTFN(1, "Using default usage\n"); /* use the undefined HID PAGE */ s->usages_min[s->nusage] = 0x0000; s->usages_max[s->nusage] = 0xFFFF; @@ -346,7 +352,8 @@ c->unit = dval; break; case 7: - c->loc.size = dval; + /* mask because value is unsigned */ + s->loc_size = dval & mask; break; case 8: c->report_ID = dval; @@ -354,12 +361,17 @@ c->loc.pos = 0; break; case 9: - c->loc.count = dval; + /* mask because value is unsigned */ + s->loc_count = dval & mask; break; case 10: /* Push */ s->pushlevel ++; if (s->pushlevel < MAXPUSH) { s->cur[s->pushlevel] = *c; + /* store size and count */ + c->loc.size = s->loc_size; + c->loc.count = s->loc_count; + /* update current item pointer */ c = &s->cur[s->pushlevel]; } else { DPRINTFN(0, "Cannot push " @@ -372,7 +384,13 @@ /* preserve position */ oldpos = c->loc.pos; c = &s->cur[s->pushlevel]; + /* restore size and count */ + s->loc_size = c->loc.size; + s->loc_count = c->loc.count; + /* set default item location */ c->loc.pos = oldpos; + c->loc.size = 0; + c->loc.count = 0; } else { DPRINTFN(0, "Cannot pop " "item @ %d!\n", s->pushlevel);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903110825.n2B8P7Fg093867>