From: Pavel Rojtberg <[email protected]>

We initializing the driver/device, we really don't know how many
controllers are connected.  So send a "query presence" command to the
base-station. (Command discovered by Zachary Lund)

Note, this means we now do not "preallocate" all 4 devices when a single
wireless base station is seen, but require the device to be properly
connected to the base station before that can happen.  The allocation of
the device happens in the next patch, not here, so in a way, this patch
breaks all wireless devices...

based on patch by
"Pierre-Loup A. Griffais" <[email protected]>

presence packet taken from:
https://github.com/computerquip/xpad5

Signed-off-by: Pavel Rojtberg <[email protected]>
---
 drivers/input/joystick/xpad.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index ed17e5d..3349861 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -1223,11 +1223,36 @@ static int xpad_probe(struct usb_interface *intf, const 
struct usb_device_id *id
                        usb_kill_urb(xpad->irq_in);
                        goto fail4;
                }
+
+               /*
+                * send presence packet
+                * This will force the controller to resend connection packets.
+                * This is useful in the case we activate the module after the
+                * adapter has been plugged in, as it won't automatically
+                * send us info about the controllers.
+                */
+               mutex_lock(&xpad->odata_mutex);
+               xpad->odata[0] = 0x08;
+               xpad->odata[1] = 0x00;
+               xpad->odata[2] = 0x0F;
+               xpad->odata[3] = 0xC0;
+               xpad->odata[4] = 0x00;
+               xpad->odata[5] = 0x00;
+               xpad->odata[6] = 0x00;
+               xpad->odata[7] = 0x00;
+               xpad->odata[8] = 0x00;
+               xpad->odata[9] = 0x00;
+               xpad->odata[10] = 0x00;
+               xpad->odata[11] = 0x00;
+               xpad->irq_out->transfer_buffer_length = 12;
+               usb_submit_urb(xpad->irq_out, GFP_KERNEL);
+               mutex_unlock(&xpad->odata_mutex);
+       } else {
+               xpad->pad_present = 1;
+               error = xpad_init_input(xpad);
+               if (error)
+                       goto fail4;
        }
-       xpad->pad_present = 1;
-       error = xpad_init_input(xpad);
-       if (error)
-               goto fail4;
 
        return 0;
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to