Skip site navigation (1)Skip section navigation (2)
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>