Thread (7 messages) 7 messages, 2 authors, 2014-11-07

Re: Help writing a custom HID driver

From: Benjamin Tissoires <hidden>
Date: 2014-11-06 18:57:23

Hi Jose,

On Thu, Nov 6, 2014 at 1:33 PM, Jose Diez [off-list ref] wrote:
Hello linux-input,

I'm trying to write a custom HID driver. It works fine, and I can send
reports just fine, but one of the requirements of this device is that I have
to reply to reports with code 62 with another report with code 62, which
resets a watchdog in the device.

This is my code so far: http://codepad.org/m4QiWhDt

The problem is in line 40. It seems like I'm not allowed to call
hid_hw_output_report from the raw_event callback handler. I've tried
surrounding the call with spin_locks, but I still get the "scheduling while
atomic" error.
Yeah, when you are in the .event callback, you are basically called by
an IRQ, so you can not schedule a potentially blocking operation.
I'm not sure how to approach this - can someone help? It would be much
appreciated. Thanks.
I would use a worker to do what you are trying to do. You can have a
look at the reset_worker we have in drivers/hid/hid-rmi.c.
When the event is not one we expected, we schedule a worker thread
which then sends an output report to the device. This way, the
blocking operation is sent from a different thread than the IRQ one.
It is kind of what you are willing to do.
There are many other examples of workers in the hid subtree, or you
can refer to the doc to find out more.

Cheers,
Benjamin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help