Hi Pavel, On Sat, Jul 11, 2015 at 01:47:46AM +0200, Pavel Rojtberg wrote: > From: Pavel Rojtberg <rojtberg@xxxxxxxxx> > > The pad_nr should be consistent after disconnecting/ reconnecting a > xbox360 controllers. > Use a bitmask to track connected pads - this way we can re-assign freed > up pad numbers. > > Consider the following case: > 1. pad A is connected and gets pad_nr = 0 > 2. pad B is connected and gets pad_nr = 1 > 3. pad A is disconnected > 4. pad A is connected again > > using the bitmask controller A now correctly gets pad_nr = 0 again. And what happens if I pull both out and plug B first? Why do we care about this? If we really want stable numbering maybe it should be driven from userspace based on connection path? > > Note: this sets a limit of 32 simultaneous connected xbox360 > controllers. However this should be tolerable. > > Signed-off-by: Pavel Rojtberg <rojtberg@xxxxxxxxx> > --- > drivers/input/joystick/xpad.c | 20 +++++++++++++++----- > 1 file changed, 15 insertions(+), 5 deletions(-) > > diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c > index a9ff4c2..e28a9c1 100644 > --- a/drivers/input/joystick/xpad.c > +++ b/drivers/input/joystick/xpad.c > @@ -346,6 +346,8 @@ struct usb_xpad { > struct work_struct work; /* init/remove device from callback */ > }; > > +static unsigned long xpad_pad_seq; > + > static int xpad_init_input(struct usb_xpad *xpad); > static void xpad_deinit_input(struct usb_xpad *xpad); > > @@ -940,6 +942,12 @@ static void xpad_send_led_command(struct usb_xpad *xpad, int command) > */ > static void xpad_identify_controller(struct usb_xpad *xpad) > { > + if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX360W) > + return; > + > + xpad->pad_nr = find_first_zero_bit(&xpad_pad_seq, 32); > + set_bit(xpad->pad_nr, &xpad_pad_seq); > + This is racy. If we really want it you might consider idr/ida. Thanks. -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html