diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/uwb/hwa-rc.c | 2 | ||||
-rw-r--r-- | drivers/uwb/i1480/dfu/usb.c | 12 | ||||
-rw-r--r-- | drivers/uwb/wlp/messages.c | 106 |
3 files changed, 69 insertions, 51 deletions
diff --git a/drivers/uwb/hwa-rc.c b/drivers/uwb/hwa-rc.c index e7eeb63fab23..b409c228f254 100644 --- a/drivers/uwb/hwa-rc.c +++ b/drivers/uwb/hwa-rc.c | |||
@@ -891,7 +891,7 @@ static int hwarc_post_reset(struct usb_interface *iface) | |||
891 | } | 891 | } |
892 | 892 | ||
893 | /** USB device ID's that we handle */ | 893 | /** USB device ID's that we handle */ |
894 | static struct usb_device_id hwarc_id_table[] = { | 894 | static const struct usb_device_id hwarc_id_table[] = { |
895 | /* D-Link DUB-1210 */ | 895 | /* D-Link DUB-1210 */ |
896 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3d02, 0xe0, 0x01, 0x02), | 896 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3d02, 0xe0, 0x01, 0x02), |
897 | .driver_info = WUSB_QUIRK_WHCI_CMD_EVT }, | 897 | .driver_info = WUSB_QUIRK_WHCI_CMD_EVT }, |
diff --git a/drivers/uwb/i1480/dfu/usb.c b/drivers/uwb/i1480/dfu/usb.c index 0bb665a0c024..a99e211a1b87 100644 --- a/drivers/uwb/i1480/dfu/usb.c +++ b/drivers/uwb/i1480/dfu/usb.c | |||
@@ -120,8 +120,7 @@ int i1480_usb_write(struct i1480 *i1480, u32 memory_address, | |||
120 | result = usb_control_msg( | 120 | result = usb_control_msg( |
121 | i1480_usb->usb_dev, usb_sndctrlpipe(i1480_usb->usb_dev, 0), | 121 | i1480_usb->usb_dev, usb_sndctrlpipe(i1480_usb->usb_dev, 0), |
122 | 0xf0, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 122 | 0xf0, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
123 | cpu_to_le16(memory_address & 0xffff), | 123 | memory_address, (memory_address >> 16), |
124 | cpu_to_le16((memory_address >> 16) & 0xffff), | ||
125 | i1480->cmd_buf, buffer_size, 100 /* FIXME: arbitrary */); | 124 | i1480->cmd_buf, buffer_size, 100 /* FIXME: arbitrary */); |
126 | if (result < 0) | 125 | if (result < 0) |
127 | break; | 126 | break; |
@@ -166,8 +165,7 @@ int i1480_usb_read(struct i1480 *i1480, u32 addr, size_t size) | |||
166 | result = usb_control_msg( | 165 | result = usb_control_msg( |
167 | i1480_usb->usb_dev, usb_rcvctrlpipe(i1480_usb->usb_dev, 0), | 166 | i1480_usb->usb_dev, usb_rcvctrlpipe(i1480_usb->usb_dev, 0), |
168 | 0xf0, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 167 | 0xf0, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
169 | cpu_to_le16(itr_addr & 0xffff), | 168 | itr_addr, (itr_addr >> 16), |
170 | cpu_to_le16((itr_addr >> 16) & 0xffff), | ||
171 | i1480->cmd_buf + itr, itr_size, | 169 | i1480->cmd_buf + itr, itr_size, |
172 | 100 /* FIXME: arbitrary */); | 170 | 100 /* FIXME: arbitrary */); |
173 | if (result < 0) { | 171 | if (result < 0) { |
@@ -413,6 +411,10 @@ error: | |||
413 | return result; | 411 | return result; |
414 | } | 412 | } |
415 | 413 | ||
414 | MODULE_FIRMWARE("i1480-pre-phy-0.0.bin"); | ||
415 | MODULE_FIRMWARE("i1480-usb-0.0.bin"); | ||
416 | MODULE_FIRMWARE("i1480-phy-0.0.bin"); | ||
417 | |||
416 | #define i1480_USB_DEV(v, p) \ | 418 | #define i1480_USB_DEV(v, p) \ |
417 | { \ | 419 | { \ |
418 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE \ | 420 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE \ |
@@ -430,7 +432,7 @@ error: | |||
430 | 432 | ||
431 | 433 | ||
432 | /** USB device ID's that we handle */ | 434 | /** USB device ID's that we handle */ |
433 | static struct usb_device_id i1480_usb_id_table[] = { | 435 | static const struct usb_device_id i1480_usb_id_table[] = { |
434 | i1480_USB_DEV(0x8086, 0xdf3b), | 436 | i1480_USB_DEV(0x8086, 0xdf3b), |
435 | i1480_USB_DEV(0x15a9, 0x0005), | 437 | i1480_USB_DEV(0x15a9, 0x0005), |
436 | i1480_USB_DEV(0x07d1, 0x3802), | 438 | i1480_USB_DEV(0x07d1, 0x3802), |
diff --git a/drivers/uwb/wlp/messages.c b/drivers/uwb/wlp/messages.c index aa42fcee4c4f..75164866c2d8 100644 --- a/drivers/uwb/wlp/messages.c +++ b/drivers/uwb/wlp/messages.c | |||
@@ -259,6 +259,63 @@ out: | |||
259 | } | 259 | } |
260 | 260 | ||
261 | 261 | ||
262 | static ssize_t wlp_get_attribute(struct wlp *wlp, u16 type_code, | ||
263 | struct wlp_attr_hdr *attr_hdr, void *value, ssize_t value_len, | ||
264 | ssize_t buflen) | ||
265 | { | ||
266 | struct device *dev = &wlp->rc->uwb_dev.dev; | ||
267 | ssize_t attr_len = sizeof(*attr_hdr) + value_len; | ||
268 | if (buflen < 0) | ||
269 | return -EINVAL; | ||
270 | if (buflen < attr_len) { | ||
271 | dev_err(dev, "WLP: Not enough space in buffer to parse" | ||
272 | " attribute field. Need %d, received %zu\n", | ||
273 | (int)attr_len, buflen); | ||
274 | return -EIO; | ||
275 | } | ||
276 | if (wlp_check_attr_hdr(wlp, attr_hdr, type_code, value_len) < 0) { | ||
277 | dev_err(dev, "WLP: Header verification failed. \n"); | ||
278 | return -EINVAL; | ||
279 | } | ||
280 | memcpy(value, (void *)attr_hdr + sizeof(*attr_hdr), value_len); | ||
281 | return attr_len; | ||
282 | } | ||
283 | |||
284 | static ssize_t wlp_vget_attribute(struct wlp *wlp, u16 type_code, | ||
285 | struct wlp_attr_hdr *attr_hdr, void *value, ssize_t max_value_len, | ||
286 | ssize_t buflen) | ||
287 | { | ||
288 | struct device *dev = &wlp->rc->uwb_dev.dev; | ||
289 | size_t len; | ||
290 | if (buflen < 0) | ||
291 | return -EINVAL; | ||
292 | if (buflen < sizeof(*attr_hdr)) { | ||
293 | dev_err(dev, "WLP: Not enough space in buffer to parse" | ||
294 | " header.\n"); | ||
295 | return -EIO; | ||
296 | } | ||
297 | if (le16_to_cpu(attr_hdr->type) != type_code) { | ||
298 | dev_err(dev, "WLP: Unexpected attribute type. Got %u, " | ||
299 | "expected %u.\n", le16_to_cpu(attr_hdr->type), | ||
300 | type_code); | ||
301 | return -EINVAL; | ||
302 | } | ||
303 | len = le16_to_cpu(attr_hdr->length); | ||
304 | if (len > max_value_len) { | ||
305 | dev_err(dev, "WLP: Attribute larger than maximum " | ||
306 | "allowed. Received %zu, max is %d.\n", len, | ||
307 | (int)max_value_len); | ||
308 | return -EFBIG; | ||
309 | } | ||
310 | if (buflen < sizeof(*attr_hdr) + len) { | ||
311 | dev_err(dev, "WLP: Not enough space in buffer to parse " | ||
312 | "variable data.\n"); | ||
313 | return -EIO; | ||
314 | } | ||
315 | memcpy(value, (void *)attr_hdr + sizeof(*attr_hdr), len); | ||
316 | return sizeof(*attr_hdr) + len; | ||
317 | } | ||
318 | |||
262 | /** | 319 | /** |
263 | * Get value of attribute from fixed size attribute field. | 320 | * Get value of attribute from fixed size attribute field. |
264 | * | 321 | * |
@@ -274,22 +331,8 @@ out: | |||
274 | ssize_t wlp_get_##name(struct wlp *wlp, struct wlp_attr_##name *attr, \ | 331 | ssize_t wlp_get_##name(struct wlp *wlp, struct wlp_attr_##name *attr, \ |
275 | type *value, ssize_t buflen) \ | 332 | type *value, ssize_t buflen) \ |
276 | { \ | 333 | { \ |
277 | struct device *dev = &wlp->rc->uwb_dev.dev; \ | 334 | return wlp_get_attribute(wlp, (type_code), &attr->hdr, \ |
278 | if (buflen < 0) \ | 335 | value, sizeof(*value), buflen); \ |
279 | return -EINVAL; \ | ||
280 | if (buflen < sizeof(*attr)) { \ | ||
281 | dev_err(dev, "WLP: Not enough space in buffer to parse" \ | ||
282 | " attribute field. Need %d, received %zu\n", \ | ||
283 | (int)sizeof(*attr), buflen); \ | ||
284 | return -EIO; \ | ||
285 | } \ | ||
286 | if (wlp_check_attr_hdr(wlp, &attr->hdr, type_code, \ | ||
287 | sizeof(attr->name)) < 0) { \ | ||
288 | dev_err(dev, "WLP: Header verification failed. \n"); \ | ||
289 | return -EINVAL; \ | ||
290 | } \ | ||
291 | *value = attr->name; \ | ||
292 | return sizeof(*attr); \ | ||
293 | } | 336 | } |
294 | 337 | ||
295 | #define wlp_get_sparse(type, type_code, name) \ | 338 | #define wlp_get_sparse(type, type_code, name) \ |
@@ -313,35 +356,8 @@ static ssize_t wlp_get_##name(struct wlp *wlp, \ | |||
313 | struct wlp_attr_##name *attr, \ | 356 | struct wlp_attr_##name *attr, \ |
314 | type_val *value, ssize_t buflen) \ | 357 | type_val *value, ssize_t buflen) \ |
315 | { \ | 358 | { \ |
316 | struct device *dev = &wlp->rc->uwb_dev.dev; \ | 359 | return wlp_vget_attribute(wlp, (type_code), &attr->hdr, \ |
317 | size_t len; \ | 360 | value, (max), buflen); \ |
318 | if (buflen < 0) \ | ||
319 | return -EINVAL; \ | ||
320 | if (buflen < sizeof(*attr)) { \ | ||
321 | dev_err(dev, "WLP: Not enough space in buffer to parse" \ | ||
322 | " header.\n"); \ | ||
323 | return -EIO; \ | ||
324 | } \ | ||
325 | if (le16_to_cpu(attr->hdr.type) != type_code) { \ | ||
326 | dev_err(dev, "WLP: Unexpected attribute type. Got %u, " \ | ||
327 | "expected %u.\n", le16_to_cpu(attr->hdr.type), \ | ||
328 | type_code); \ | ||
329 | return -EINVAL; \ | ||
330 | } \ | ||
331 | len = le16_to_cpu(attr->hdr.length); \ | ||
332 | if (len > max) { \ | ||
333 | dev_err(dev, "WLP: Attribute larger than maximum " \ | ||
334 | "allowed. Received %zu, max is %d.\n", len, \ | ||
335 | (int)max); \ | ||
336 | return -EFBIG; \ | ||
337 | } \ | ||
338 | if (buflen < sizeof(*attr) + len) { \ | ||
339 | dev_err(dev, "WLP: Not enough space in buffer to parse "\ | ||
340 | "variable data.\n"); \ | ||
341 | return -EIO; \ | ||
342 | } \ | ||
343 | memcpy(value, (void *) attr + sizeof(*attr), len); \ | ||
344 | return sizeof(*attr) + len; \ | ||
345 | } | 361 | } |
346 | 362 | ||
347 | wlp_get(u8, WLP_ATTR_WLP_VER, version) | 363 | wlp_get(u8, WLP_ATTR_WLP_VER, version) |