Skip to content

Commit bb3f47e

Browse files
committed
huion: Fail on parameter retrieval errors
Fail Huion tablet interface enabling and probing, if parameter retrieval fails. Move the main code path out of the else block accordingly. This should prevent devices appearing in a half-working state due to original report descriptor being used, simplifying diagnostics. This also makes it easier to add cleanup in later commits, as error handling is simplified.
1 parent 60ad849 commit bb3f47e

1 file changed

Lines changed: 49 additions & 47 deletions

File tree

hid-huion.c

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ static int huion_tablet_enable(struct hid_device *hdev)
116116
struct usb_device *usb_dev = hid_to_usb_dev(hdev);
117117
struct huion_drvdata *drvdata = hid_get_drvdata(hdev);
118118
__le16 buf[6];
119+
s32 params[HUION_PH_ID_NUM];
120+
s32 resolution;
121+
__u8 *p;
122+
s32 v;
119123

120124
/*
121125
* Read string descriptor containing tablet parameters. The specific
@@ -128,56 +132,54 @@ static int huion_tablet_enable(struct hid_device *hdev)
128132
(USB_DT_STRING << 8) + 0x64,
129133
0x0409, buf, sizeof(buf),
130134
USB_CTRL_GET_TIMEOUT);
131-
if (rc == -EPIPE)
132-
hid_warn(hdev, "device parameters not found\n");
133-
else if (rc < 0)
134-
hid_warn(hdev, "failed to get device parameters: %d\n", rc);
135-
else if (rc != sizeof(buf))
136-
hid_warn(hdev, "invalid device parameters\n");
137-
else {
138-
s32 params[HUION_PH_ID_NUM];
139-
s32 resolution;
140-
__u8 *p;
141-
s32 v;
135+
if (rc == -EPIPE) {
136+
hid_err(hdev, "device parameters not found\n");
137+
return -ENODEV;
138+
} else if (rc < 0) {
139+
hid_err(hdev, "failed to get device parameters: %d\n", rc);
140+
return -ENODEV;
141+
} else if (rc != sizeof(buf)) {
142+
hid_err(hdev, "invalid device parameters\n");
143+
return -ENODEV;
144+
}
142145

143-
/* Extract device parameters */
144-
params[HUION_PH_ID_X_LM] = le16_to_cpu(buf[1]);
145-
params[HUION_PH_ID_Y_LM] = le16_to_cpu(buf[2]);
146-
params[HUION_PH_ID_PRESSURE_LM] = le16_to_cpu(buf[4]);
147-
resolution = le16_to_cpu(buf[5]);
148-
if (resolution == 0) {
149-
params[HUION_PH_ID_X_PM] = 0;
150-
params[HUION_PH_ID_Y_PM] = 0;
151-
} else {
152-
params[HUION_PH_ID_X_PM] = params[HUION_PH_ID_X_LM] *
153-
1000 / resolution;
154-
params[HUION_PH_ID_Y_PM] = params[HUION_PH_ID_Y_LM] *
155-
1000 / resolution;
156-
}
146+
/* Extract device parameters */
147+
params[HUION_PH_ID_X_LM] = le16_to_cpu(buf[1]);
148+
params[HUION_PH_ID_Y_LM] = le16_to_cpu(buf[2]);
149+
params[HUION_PH_ID_PRESSURE_LM] = le16_to_cpu(buf[4]);
150+
resolution = le16_to_cpu(buf[5]);
151+
if (resolution == 0) {
152+
params[HUION_PH_ID_X_PM] = 0;
153+
params[HUION_PH_ID_Y_PM] = 0;
154+
} else {
155+
params[HUION_PH_ID_X_PM] = params[HUION_PH_ID_X_LM] *
156+
1000 / resolution;
157+
params[HUION_PH_ID_Y_PM] = params[HUION_PH_ID_Y_LM] *
158+
1000 / resolution;
159+
}
157160

158-
/* Allocate fixed report descriptor */
159-
drvdata->rdesc = devm_kmalloc(&hdev->dev,
160-
sizeof(huion_tablet_rdesc_template),
161-
GFP_KERNEL);
162-
if (drvdata->rdesc == NULL) {
163-
hid_err(hdev, "failed to allocate fixed rdesc\n");
164-
return -ENOMEM;
165-
}
166-
drvdata->rsize = sizeof(huion_tablet_rdesc_template);
161+
/* Allocate fixed report descriptor */
162+
drvdata->rdesc = devm_kmalloc(&hdev->dev,
163+
sizeof(huion_tablet_rdesc_template),
164+
GFP_KERNEL);
165+
if (drvdata->rdesc == NULL) {
166+
hid_err(hdev, "failed to allocate fixed rdesc\n");
167+
return -ENOMEM;
168+
}
169+
drvdata->rsize = sizeof(huion_tablet_rdesc_template);
167170

168-
/* Format fixed report descriptor */
169-
memcpy(drvdata->rdesc, huion_tablet_rdesc_template,
170-
drvdata->rsize);
171-
for (p = drvdata->rdesc;
172-
p <= drvdata->rdesc + drvdata->rsize - 4;) {
173-
if (p[0] == 0xFE && p[1] == 0xED && p[2] == 0x1D &&
174-
p[3] < sizeof(params)) {
175-
v = params[p[3]];
176-
put_unaligned(cpu_to_le32(v), (s32 *)p);
177-
p += 4;
178-
} else {
179-
p++;
180-
}
171+
/* Format fixed report descriptor */
172+
memcpy(drvdata->rdesc, huion_tablet_rdesc_template,
173+
drvdata->rsize);
174+
for (p = drvdata->rdesc;
175+
p <= drvdata->rdesc + drvdata->rsize - 4;) {
176+
if (p[0] == 0xFE && p[1] == 0xED && p[2] == 0x1D &&
177+
p[3] < sizeof(params)) {
178+
v = params[p[3]];
179+
put_unaligned(cpu_to_le32(v), (s32 *)p);
180+
p += 4;
181+
} else {
182+
p++;
181183
}
182184
}
183185

0 commit comments

Comments
 (0)