From owner-p4-projects@FreeBSD.ORG Wed Mar 11 08:25:08 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0E46D1065677; Wed, 11 Mar 2009 08:25:08 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B8D861065675 for ; Wed, 11 Mar 2009 08:25:07 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8C8628FC15 for ; Wed, 11 Mar 2009 08:25:07 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n2B8P7rM093869 for ; Wed, 11 Mar 2009 08:25:07 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n2B8P7Fg093867 for perforce@freebsd.org; Wed, 11 Mar 2009 08:25:07 GMT (envelope-from hselasky@FreeBSD.org) Date: Wed, 11 Mar 2009 08:25:07 GMT Message-Id: <200903110825.n2B8P7Fg093867@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 159053 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Mar 2009 08:25:09 -0000 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);