fastbootd: usb: fallback to v1 descriptors
Change-Id: Ibe8ae5ca8ffd44c3871a8855b06849034c74eb2f
diff --git a/fastboot/device/usb_client.cpp b/fastboot/device/usb_client.cpp
index 3f9b0f0..02315fe 100644
--- a/fastboot/device/usb_client.cpp
+++ b/fastboot/device/usb_client.cpp
@@ -53,6 +53,16 @@
struct usb_ss_ep_comp_descriptor sink_comp;
} __attribute__((packed));
+struct DescV1 {
+ struct usb_functionfs_descs_head_v1 {
+ __le32 magic;
+ __le32 length;
+ __le32 fs_count;
+ __le32 hs_count;
+ } __attribute__((packed)) header;
+ struct FuncDesc fs_descs, hs_descs;
+} __attribute__((packed));
+
struct DescV2 {
struct usb_functionfs_descs_head_v2 header;
// The rest of the structure depends on the flags in the header.
@@ -169,6 +179,17 @@
},
};
+static struct DescV1 v1_descriptor = {
+ .header = {
+ .magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC),
+ .length = htole32(sizeof(v1_descriptor)),
+ .fs_count = 3,
+ .hs_count = 3,
+ },
+ .fs_descs = fs_descriptors,
+ .hs_descs = hs_descriptors,
+};
+
static struct DescV2 v2_descriptor = {
.header =
{
@@ -205,8 +226,12 @@
auto ret = write(h->control.get(), &v2_descriptor, sizeof(v2_descriptor));
if (ret < 0) {
- PLOG(ERROR) << "cannot write descriptors " << kUsbFfsFastbootEp0;
- goto err;
+ // fallback to v1 descriptor
+ ret = write(h->control.get(), &v1_descriptor, sizeof(v1_descriptor));
+ if (ret < 0) {
+ PLOG(ERROR) << "cannot write descriptors " << kUsbFfsFastbootEp0;
+ goto err;
+ }
}
ret = write(h->control.get(), &strings, sizeof(strings));