Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b50df7d1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb:
  uwb: remove duplicate cpu_to_le16()
  uwb: declare MODULE_FIRMWARE() in i1480 DFU driver
  uwb: make USB device id table constant
  uwb: wlp: refactor wlp_get_<attribute>() macros
parents 352d4657 bcf59e2c
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -891,7 +891,7 @@ static int hwarc_post_reset(struct usb_interface *iface)
}
}


/** USB device ID's that we handle */
/** USB device ID's that we handle */
static struct usb_device_id hwarc_id_table[] = {
static const struct usb_device_id hwarc_id_table[] = {
	/* D-Link DUB-1210 */
	/* D-Link DUB-1210 */
	{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3d02, 0xe0, 0x01, 0x02),
	{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3d02, 0xe0, 0x01, 0x02),
	  .driver_info = WUSB_QUIRK_WHCI_CMD_EVT },
	  .driver_info = WUSB_QUIRK_WHCI_CMD_EVT },
+7 −5
Original line number Original line Diff line number Diff line
@@ -120,8 +120,7 @@ int i1480_usb_write(struct i1480 *i1480, u32 memory_address,
		result = usb_control_msg(
		result = usb_control_msg(
			i1480_usb->usb_dev, usb_sndctrlpipe(i1480_usb->usb_dev, 0),
			i1480_usb->usb_dev, usb_sndctrlpipe(i1480_usb->usb_dev, 0),
			0xf0, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			0xf0, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			cpu_to_le16(memory_address & 0xffff),
			memory_address,	(memory_address >> 16),
			cpu_to_le16((memory_address >> 16) & 0xffff),
			i1480->cmd_buf, buffer_size, 100 /* FIXME: arbitrary */);
			i1480->cmd_buf, buffer_size, 100 /* FIXME: arbitrary */);
		if (result < 0)
		if (result < 0)
			break;
			break;
@@ -166,8 +165,7 @@ int i1480_usb_read(struct i1480 *i1480, u32 addr, size_t size)
		result = usb_control_msg(
		result = usb_control_msg(
			i1480_usb->usb_dev, usb_rcvctrlpipe(i1480_usb->usb_dev, 0),
			i1480_usb->usb_dev, usb_rcvctrlpipe(i1480_usb->usb_dev, 0),
			0xf0, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			0xf0, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			cpu_to_le16(itr_addr & 0xffff),
			itr_addr, (itr_addr >> 16),
			cpu_to_le16((itr_addr >> 16) & 0xffff),
			i1480->cmd_buf + itr, itr_size,
			i1480->cmd_buf + itr, itr_size,
			100 /* FIXME: arbitrary */);
			100 /* FIXME: arbitrary */);
		if (result < 0) {
		if (result < 0) {
@@ -413,6 +411,10 @@ int i1480_usb_probe(struct usb_interface *iface, const struct usb_device_id *id)
	return result;
	return result;
}
}


MODULE_FIRMWARE("i1480-pre-phy-0.0.bin");
MODULE_FIRMWARE("i1480-usb-0.0.bin");
MODULE_FIRMWARE("i1480-phy-0.0.bin");

#define i1480_USB_DEV(v, p)				\
#define i1480_USB_DEV(v, p)				\
{							\
{							\
	.match_flags = USB_DEVICE_ID_MATCH_DEVICE	\
	.match_flags = USB_DEVICE_ID_MATCH_DEVICE	\
@@ -430,7 +432,7 @@ int i1480_usb_probe(struct usb_interface *iface, const struct usb_device_id *id)




/** USB device ID's that we handle */
/** USB device ID's that we handle */
static struct usb_device_id i1480_usb_id_table[] = {
static const struct usb_device_id i1480_usb_id_table[] = {
	i1480_USB_DEV(0x8086, 0xdf3b),
	i1480_USB_DEV(0x8086, 0xdf3b),
	i1480_USB_DEV(0x15a9, 0x0005),
	i1480_USB_DEV(0x15a9, 0x0005),
	i1480_USB_DEV(0x07d1, 0x3802),
	i1480_USB_DEV(0x07d1, 0x3802),
+61 −45
Original line number Original line Diff line number Diff line
@@ -259,6 +259,63 @@ static int wlp_check_wss_info_attr_hdr(struct wlp *wlp,
}
}




static ssize_t wlp_get_attribute(struct wlp *wlp, u16 type_code,
	struct wlp_attr_hdr *attr_hdr, void *value, ssize_t value_len,
	ssize_t buflen)
{
	struct device *dev = &wlp->rc->uwb_dev.dev;
	ssize_t attr_len = sizeof(*attr_hdr) + value_len;
	if (buflen < 0)
		return -EINVAL;
	if (buflen < attr_len) {
		dev_err(dev, "WLP: Not enough space in buffer to parse"
			" attribute field. Need %d, received %zu\n",
			(int)attr_len, buflen);
		return -EIO;
	}
	if (wlp_check_attr_hdr(wlp, attr_hdr, type_code, value_len) < 0) {
		dev_err(dev, "WLP: Header verification failed. \n");
		return -EINVAL;
	}
	memcpy(value, (void *)attr_hdr + sizeof(*attr_hdr), value_len);
	return attr_len;
}

static ssize_t wlp_vget_attribute(struct wlp *wlp, u16 type_code,
	struct wlp_attr_hdr *attr_hdr, void *value, ssize_t max_value_len,
	ssize_t buflen)
{
	struct device *dev = &wlp->rc->uwb_dev.dev;
	size_t len;
	if (buflen < 0)
		return -EINVAL;
	if (buflen < sizeof(*attr_hdr)) {
		dev_err(dev, "WLP: Not enough space in buffer to parse"
			" header.\n");
		return -EIO;
	}
	if (le16_to_cpu(attr_hdr->type) != type_code) {
		dev_err(dev, "WLP: Unexpected attribute type. Got %u, "
			"expected %u.\n", le16_to_cpu(attr_hdr->type),
			type_code);
		return -EINVAL;
	}
	len = le16_to_cpu(attr_hdr->length);
	if (len > max_value_len) {
		dev_err(dev, "WLP: Attribute larger than maximum "
			"allowed. Received %zu, max is %d.\n", len,
			(int)max_value_len);
		return -EFBIG;
	}
	if (buflen < sizeof(*attr_hdr) + len) {
		dev_err(dev, "WLP: Not enough space in buffer to parse "
			"variable data.\n");
		return -EIO;
	}
	memcpy(value, (void *)attr_hdr + sizeof(*attr_hdr), len);
	return sizeof(*attr_hdr) + len;
}

/**
/**
 * Get value of attribute from fixed size attribute field.
 * Get value of attribute from fixed size attribute field.
 *
 *
@@ -274,22 +331,8 @@ static int wlp_check_wss_info_attr_hdr(struct wlp *wlp,
ssize_t wlp_get_##name(struct wlp *wlp, struct wlp_attr_##name *attr,	\
ssize_t wlp_get_##name(struct wlp *wlp, struct wlp_attr_##name *attr,	\
		      type *value, ssize_t buflen)			\
		      type *value, ssize_t buflen)			\
{									\
{									\
	struct device *dev = &wlp->rc->uwb_dev.dev;			\
	return wlp_get_attribute(wlp, (type_code), &attr->hdr,		\
	if (buflen < 0)							\
				 value, sizeof(*value), buflen);	\
		return -EINVAL;						\
	if (buflen < sizeof(*attr)) {					\
		dev_err(dev, "WLP: Not enough space in buffer to parse"	\
			" attribute field. Need %d, received %zu\n",	\
			(int)sizeof(*attr), buflen);			\
		return -EIO;						\
	}								\
	if (wlp_check_attr_hdr(wlp, &attr->hdr, type_code,		\
			       sizeof(attr->name)) < 0) {		\
		dev_err(dev, "WLP: Header verification failed. \n");	\
		return -EINVAL;						\
	}								\
	*value = attr->name;						\
	return sizeof(*attr);						\
}
}


#define wlp_get_sparse(type, type_code, name) \
#define wlp_get_sparse(type, type_code, name) \
@@ -313,35 +356,8 @@ static ssize_t wlp_get_##name(struct wlp *wlp, \
			      struct wlp_attr_##name *attr,		\
			      struct wlp_attr_##name *attr,		\
			      type_val *value, ssize_t buflen)		\
			      type_val *value, ssize_t buflen)		\
{									\
{									\
	struct device *dev = &wlp->rc->uwb_dev.dev;			\
	return wlp_vget_attribute(wlp, (type_code), &attr->hdr, 	\
	size_t len;							\
			      value, (max), buflen);			\
	if (buflen < 0)							\
		return -EINVAL;						\
	if (buflen < sizeof(*attr)) {					\
		dev_err(dev, "WLP: Not enough space in buffer to parse"	\
			" header.\n");					\
		return -EIO;						\
	}								\
	if (le16_to_cpu(attr->hdr.type) != type_code) {			\
		dev_err(dev, "WLP: Unexpected attribute type. Got %u, "	\
			"expected %u.\n", le16_to_cpu(attr->hdr.type),	\
			type_code);					\
		return -EINVAL;						\
	}								\
	len = le16_to_cpu(attr->hdr.length);				\
	if (len > max) {						\
		dev_err(dev, "WLP: Attribute larger than maximum "	\
			"allowed. Received %zu, max is %d.\n", len,	\
			(int)max);					\
		return -EFBIG;						\
	}								\
	if (buflen < sizeof(*attr) + len) {				\
		dev_err(dev, "WLP: Not enough space in buffer to parse "\
			"variable data.\n");				\
		return -EIO;						\
	}								\
	memcpy(value, (void *) attr + sizeof(*attr), len);		\
	return sizeof(*attr) + len;					\
}
}


wlp_get(u8, WLP_ATTR_WLP_VER, version)
wlp_get(u8, WLP_ATTR_WLP_VER, version)