Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Sep 2012 19:00:27 GMT
From:      dfilter@FreeBSD.ORG (dfilter service)
To:        freebsd-usb@FreeBSD.org
Subject:   Re: usb/171810: commit references a PR
Message-ID:  <201209201900.q8KJ0R8B009148@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR usb/171810; it has been noted by GNATS.

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: usb/171810: commit references a PR
Date: Thu, 20 Sep 2012 18:56:39 +0000 (UTC)

 Author: mav
 Date: Thu Sep 20 18:56:27 2012
 New Revision: 240762
 URL: http://svn.freebsd.org/changeset/base/240762
 
 Log:
   Restore handling of the third argument (id) of hid_start_parse(), same as
   it is done in NetBSD/OpenBSD, and as it was here before r205728.
   
   I personally think this API or its implementation is incorrect, as it is not
   correct to filter collections based on report ID, as they are orthogonal
   in general case, but I see no harm from supporting this feature.
   
   PR:		usb/171810
   Submitted by:	Vitaly Magerya <vmagerya@gmail.com>
   MFC after:	1 month
 
 Modified:
   head/lib/libusbhid/descr.c
   head/lib/libusbhid/parse.c
   head/lib/libusbhid/usbhid.3
 
 Modified: head/lib/libusbhid/descr.c
 ==============================================================================
 --- head/lib/libusbhid/descr.c	Thu Sep 20 18:42:00 2012	(r240761)
 +++ head/lib/libusbhid/descr.c	Thu Sep 20 18:56:27 2012	(r240762)
 @@ -68,7 +68,7 @@ hid_get_report_id(int fd)
  	if ((rep = hid_get_report_desc(fd)) == NULL)
  		goto use_ioctl;
  	kindset = 1 << hid_input | 1 << hid_output | 1 << hid_feature;
 -	for (d = hid_start_parse(rep, kindset, 0); hid_get_item(d, &h); ) {
 +	for (d = hid_start_parse(rep, kindset, -1); hid_get_item(d, &h); ) {
  		/* Return the first report ID we met. */
  		if (h.report_ID != 0) {
  			temp = h.report_ID;
 
 Modified: head/lib/libusbhid/parse.c
 ==============================================================================
 --- head/lib/libusbhid/parse.c	Thu Sep 20 18:42:00 2012	(r240761)
 +++ head/lib/libusbhid/parse.c	Thu Sep 20 18:56:27 2012	(r240762)
 @@ -70,6 +70,7 @@ struct hid_data {
  	uint8_t	iusage;		/* current "usages_min/max" index */
  	uint8_t ousage;		/* current "usages_min/max" offset */
  	uint8_t	susage;		/* usage set flags */
 +	int32_t	reportid;	/* requested report ID */
  };
  
  /*------------------------------------------------------------------------*
 @@ -149,7 +150,7 @@ hid_switch_rid(struct hid_data *s, struc
   *	hid_start_parse
   *------------------------------------------------------------------------*/
  hid_data_t
 -hid_start_parse(report_desc_t d, int kindset, int id __unused)
 +hid_start_parse(report_desc_t d, int kindset, int id)
  {
  	struct hid_data *s;
  
 @@ -158,6 +159,7 @@ hid_start_parse(report_desc_t d, int kin
  	s->start = s->p = d->data;
  	s->end = d->data + d->size;
  	s->kindset = kindset;
 +	s->reportid = id;
  	return (s);
  }
  
 @@ -207,8 +209,8 @@ hid_get_byte(struct hid_data *s, const u
  /*------------------------------------------------------------------------*
   *	hid_get_item
   *------------------------------------------------------------------------*/
 -int
 -hid_get_item(hid_data_t s, hid_item_t *h)
 +static int
 +hid_get_item_raw(hid_data_t s, hid_item_t *h)
  {
  	hid_item_t *c;
  	unsigned int bTag, bType, bSize;
 @@ -509,6 +511,19 @@ hid_get_item(hid_data_t s, hid_item_t *h
  }
  
  int
 +hid_get_item(hid_data_t s, hid_item_t *h)
 +{
 +	int r;
 +
 +	for (;;) {
 +		r = hid_get_item_raw(s, h);
 +		if (r <= 0 || s->reportid == -1 || h->report_ID == s->reportid)
 +			break;
 +	}
 +	return (r);
 +}
 +
 +int
  hid_report_size(report_desc_t r, enum hid_kind k, int id)
  {
  	struct hid_data *d;
 @@ -523,7 +538,7 @@ hid_report_size(report_desc_t r, enum hi
  
  	memset(&h, 0, sizeof h);
  	for (d = hid_start_parse(r, 1 << k, id); hid_get_item(d, &h); ) {
 -		if ((h.report_ID == id || id < 0) && h.kind == k) {
 +		if (h.kind == k) {
  			/* compute minimum */
  			if (lpos > h.pos)
  				lpos = h.pos;
 
 Modified: head/lib/libusbhid/usbhid.3
 ==============================================================================
 --- head/lib/libusbhid/usbhid.3	Thu Sep 20 18:42:00 2012	(r240761)
 +++ head/lib/libusbhid/usbhid.3	Thu Sep 20 18:56:27 2012	(r240762)
 @@ -144,16 +144,15 @@ fails it will return
  .Ss Descriptor Parsing Functions
  To parse the report descriptor the
  .Fn hid_start_parse
 -function should be called with a report descriptor and a set that
 -describes which items that are interesting.
 +function should be called with a report descriptor, a set that
 +describes which items that are interesting, and the desired report
 +ID (or -1 to obtain items of all report IDs).
  The set is obtained by OR-ing together values
  .Fa "(1 << k)"
  where
  .Fa k
  is an item of type
  .Vt hid_kind_t .
 -The report ID (if present) is given by
 -.Fa id .
  The function returns
  .Dv NULL
  if the initialization fails, otherwise an opaque value to be used
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209201900.q8KJ0R8B009148>