19 Jun, 2020

1 commit

  • Using uhid and KASAN this driver crashed because it was getting
    several connection events where it only expected one. Then the
    device was added several times to the static device list and it got
    corrupted.

    This patch checks if the device is already in the list before adding
    it.

    Signed-off-by: Rodrigo Rivas Costa
    Tested-by: Siarhei Vishniakou
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     

09 Jan, 2020

1 commit

  • The `connected` value for wired devices was not properly initialized,
    it must be set to `true` upon creation, because wired devices do not
    generate connection events.

    When a raw client (the Steam Client) uses the device, the input device
    is destroyed. Then, when the raw client finishes, it must be recreated.
    But since the `connected` variable was false this never happended.

    Signed-off-by: Rodrigo Rivas Costa
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     

18 Mar, 2019

1 commit

  • When using this driver with the wireless dongle and some usermode
    program that monitors every input device (acpid, for example), while
    another usermode client opens and closes the low-level device
    repeadedly, the system eventually deadlocks.

    The reason is that steam_input_register_device() must not be called with
    the mutex held, because the input subsystem has its own synchronization
    that clashes with this one: it is possible that steam_input_open() is
    called before input_register_device() returns, and since
    steam_input_open() needs to lock the mutex, it deadlocks.

    However we must hold the mutex when calling any function that sends
    commands to the controller. If not, random commands end up falling fail.

    Reported-by: Simon Gene Gottlieb
    Signed-off-by: Rodrigo Rivas Costa
    Tested-by: Simon Gene Gottlieb
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     

14 Feb, 2019

1 commit

  • There is a new firmware for the Steam Controller with support for BLE
    connections. When using such a device with a wired connection, it
    reboots itself every 10 seconds unless an application has opened it.

    Doing hid_hw_open() unconditionally on probe fixes the issue, and the
    code becomes simpler.

    Signed-off-by: Rodrigo Rivas Costa
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     

19 Nov, 2018

1 commit

  • Previously, when a HID client such as the Steam Client was running, this
    driver disabled its input device to avoid doubling the input events.

    While it worked mostly fine, some games got confused by the idle gamepad,
    and switched to two player mode, or asked the user to choose which gamepad
    to use. Other games just crashed, probably a bug in Unity [1].

    With this commit, when a HID client starts, the input device is removed;
    when the HID client ends the input device is recreated.

    [1]: https://github.com/ValveSoftware/steam-for-linux/issues/5645

    Signed-off-by: Rodrigo Rivas Costa
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     

20 Jun, 2018

1 commit

  • When creating the low-level hidraw device, the reference to steam_device
    was stored using hid_set_drvdata(). But this value is not guaranteed to
    be kept when set before calling probe. If this pointer is reset, it
    crashes when opening the emulated hidraw device.

    It looks like hid_set_drvdata() is for users "avobe" this hid_device,
    while hid_device.driver_data it for users "below" this one.

    In this case, we are creating a virtual hidraw device, so we must use
    hid_device.driver_data.

    Signed-off-by: Rodrigo Rivas Costa
    Tested-by: Mariusz Ceier
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     

15 May, 2018

3 commits

  • ->product, ->version and ->type fields in the client struct were left out
    unitialized from the hid device fields; fix that.

    Reported-by: Rodrigo Rivas Costa
    Signed-off-by: Jiri Kosina

    Jiri Kosina
     
  • The wireless Steam Controller is battery operated, so add the battery
    device and power information.

    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa
     
  • There are two ways to connect the Steam Controller: directly to the USB
    or with the USB wireless adapter. Both methods are similar, but the
    wireless adapter can connect up to 4 devices at the same time.

    The wired device will appear as 3 interfaces: a virtual mouse, a virtual
    keyboard and a custom HID device.

    The wireless device will appear as 5 interfaces: a virtual keyboard and
    4 custom HID devices, that will remain silent until a device is actually
    connected.

    The custom HID device has a report descriptor with all vendor specific
    usages, so the hid-generic is not very useful. In a PC/SteamBox Valve
    Steam Client provices a software translation by using hidraw and a
    creates a uinput virtual gamepad and XTest keyboard/mouse.

    This driver intercepts the hidraw usage, so it can get out of the way
    when the Steam Client is in use.

    Signed-off-by: Rodrigo Rivas Costa
    Signed-off-by: Jiri Kosina

    Rodrigo Rivas Costa