3. A blocking, synchronous GET_REPORT transfer was easy when I implemented this for USB because data is both sent and received as part of a single control transfer. Because of the nature of Bluetooth however, where it is viewed more as an asynchronous network device, and with hidraw allowing multiple handles to a single device to exist, there could be a race when two handles call the hidp_get_raw_report() function concurrently, requesting the same report. I've convinced myself that this is not a problem, because since both callers requested the same report, the worst that could happen is that one could get a report which is slightly out of date.
Consider the following case:
1. Client 1 requests report (Userspace call to HIDIOCGFEATURE)
2. Client 2 requests report (Userspace call to HIDIOCGFEATURE)
3. Client 1's report is returned, and delivered to BOTH clients
4. Client 2's report is returned (and discarded)
Note here that Client 1's report and Client 2's report are the same report, ie: they reflect the state of the same data on the device, just at different times. In this case, they are indeed exactly the same data, but consider this case:
1. Client 1 requests report (Userspace call to HIDIOCGFEATURE)
2. Client 2 SETS report (Userspace call to HIDIOCSFEATURE)
2. Client 2 requests report (Userspace call to HIDIOCGFEATURE)
3. Client 1's report is returned, and delivered to Clients 1 and 2
4. Client 2's report is returned
In this case, client 2 receives OLD data (since it set new data, and the call to write the reports is currently not synchronous). To make writes synchronous, we'd run into the same problem, of two writes happening concurrently, and the 2nd one receiving the ACK from the first one.
Alan.