Commit 4bff980f authored by Rodrigo Rivas Costa's avatar Rodrigo Rivas Costa Committed by Jiri Kosina

HID: steam: use hid_device.driver_data instead of hid_set_drvdata()

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: default avatarRodrigo Rivas Costa <rodrigorivascosta@gmail.com>
Tested-by: default avatarMariusz Ceier <mceier+kernel@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 3e84c765
...@@ -573,7 +573,7 @@ static bool steam_is_valve_interface(struct hid_device *hdev) ...@@ -573,7 +573,7 @@ static bool steam_is_valve_interface(struct hid_device *hdev)
static int steam_client_ll_parse(struct hid_device *hdev) static int steam_client_ll_parse(struct hid_device *hdev)
{ {
struct steam_device *steam = hid_get_drvdata(hdev); struct steam_device *steam = hdev->driver_data;
return hid_parse_report(hdev, steam->hdev->dev_rdesc, return hid_parse_report(hdev, steam->hdev->dev_rdesc,
steam->hdev->dev_rsize); steam->hdev->dev_rsize);
...@@ -590,7 +590,7 @@ static void steam_client_ll_stop(struct hid_device *hdev) ...@@ -590,7 +590,7 @@ static void steam_client_ll_stop(struct hid_device *hdev)
static int steam_client_ll_open(struct hid_device *hdev) static int steam_client_ll_open(struct hid_device *hdev)
{ {
struct steam_device *steam = hid_get_drvdata(hdev); struct steam_device *steam = hdev->driver_data;
int ret; int ret;
ret = hid_hw_open(steam->hdev); ret = hid_hw_open(steam->hdev);
...@@ -605,7 +605,7 @@ static int steam_client_ll_open(struct hid_device *hdev) ...@@ -605,7 +605,7 @@ static int steam_client_ll_open(struct hid_device *hdev)
static void steam_client_ll_close(struct hid_device *hdev) static void steam_client_ll_close(struct hid_device *hdev)
{ {
struct steam_device *steam = hid_get_drvdata(hdev); struct steam_device *steam = hdev->driver_data;
mutex_lock(&steam->mutex); mutex_lock(&steam->mutex);
steam->client_opened = false; steam->client_opened = false;
...@@ -623,7 +623,7 @@ static int steam_client_ll_raw_request(struct hid_device *hdev, ...@@ -623,7 +623,7 @@ static int steam_client_ll_raw_request(struct hid_device *hdev,
size_t count, unsigned char report_type, size_t count, unsigned char report_type,
int reqtype) int reqtype)
{ {
struct steam_device *steam = hid_get_drvdata(hdev); struct steam_device *steam = hdev->driver_data;
return hid_hw_raw_request(steam->hdev, reportnum, buf, count, return hid_hw_raw_request(steam->hdev, reportnum, buf, count,
report_type, reqtype); report_type, reqtype);
...@@ -710,7 +710,7 @@ static int steam_probe(struct hid_device *hdev, ...@@ -710,7 +710,7 @@ static int steam_probe(struct hid_device *hdev,
ret = PTR_ERR(steam->client_hdev); ret = PTR_ERR(steam->client_hdev);
goto client_hdev_fail; goto client_hdev_fail;
} }
hid_set_drvdata(steam->client_hdev, steam); steam->client_hdev->driver_data = steam;
/* /*
* With the real steam controller interface, do not connect hidraw. * With the real steam controller interface, do not connect hidraw.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment