usb: gadget: add bos descriptor response for rockusb command

Rockchip upgrade tool use bcdUSB (0x0201) field distinguishing maskrom
or loader device at present. Unfortunately, it conflict with Windows 8
and beyond which request BOS descriptor in this case that bcdUSB is set
to 0x0201. This patch adds the HACK codes to fix it.

Change-Id: I6a186139f79ba27f5d9e099493e9e742a29bbe40
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
This commit is contained in:
Frank Wang 2017-11-16 10:13:47 +08:00
parent ba437c8c98
commit 8ddd5824c5
1 changed files with 24 additions and 0 deletions

View File

@ -271,6 +271,18 @@ static int count_configs(struct usb_composite_dev *cdev, unsigned type)
return count;
}
static int bos_desc(struct usb_composite_dev *cdev)
{
struct usb_bos_descriptor *bos = cdev->req->buf;
bos->bLength = USB_DT_BOS_SIZE;
bos->bDescriptorType = USB_DT_BOS;
bos->wTotalLength = cpu_to_le16(USB_DT_BOS_SIZE);
bos->bNumDeviceCaps = 0;
return le16_to_cpu(bos->wTotalLength);
}
static void device_qual(struct usb_composite_dev *cdev)
{
struct usb_qualifier_descriptor *qual = cdev->req->buf;
@ -764,6 +776,18 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
value = min(w_length, (u16) value);
break;
case USB_DT_BOS:
/* HACK: only for rockusb command.
* Rockchip upgrade tool use bcdUSB (0x0201) field
* distinguishing maskrom or loader device at present.
* Unfortunately, it conflict with Windows 8 and beyond
* which request BOS descriptor in this case that bcdUSB
* is set to 0x0201.
*/
if (!strncmp(cdev->driver->name, "rkusb_ums_dnl", 13)) {
value = bos_desc(cdev);
value = min(w_length, (u16) value);
}
/*
* The USB compliance test (USB 2.0 Command Verifier)
* issues this request. We should not run into the