Loading drivers/usb/gadget/f_mbim.c +96 −0 Original line number Diff line number Diff line Loading @@ -386,6 +386,80 @@ static struct usb_descriptor_header *mbim_hs_function[] = { NULL, }; /* Super Speed Support */ static struct usb_endpoint_descriptor ss_mbim_notify_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_IN, .bmAttributes = USB_ENDPOINT_XFER_INT, .wMaxPacketSize = 4*cpu_to_le16(NCM_STATUS_BYTECOUNT), .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, }; static struct usb_ss_ep_comp_descriptor ss_mbim_notify_comp_desc = { .bLength = sizeof(ss_mbim_notify_comp_desc), .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, /* the following 3 values can be tweaked if necessary */ /* .bMaxBurst = 0, */ /* .bmAttributes = 0, */ .wBytesPerInterval = 4*cpu_to_le16(NCM_STATUS_BYTECOUNT), }; static struct usb_endpoint_descriptor ss_mbim_in_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_IN, .bmAttributes = USB_ENDPOINT_XFER_BULK, .wMaxPacketSize = __constant_cpu_to_le16(1024), }; static struct usb_ss_ep_comp_descriptor ss_mbim_in_comp_desc = { .bLength = sizeof(ss_mbim_in_comp_desc), .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, /* the following 2 values can be tweaked if necessary */ /* .bMaxBurst = 0, */ /* .bmAttributes = 0, */ }; static struct usb_endpoint_descriptor ss_mbim_out_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_OUT, .bmAttributes = USB_ENDPOINT_XFER_BULK, .wMaxPacketSize = __constant_cpu_to_le16(1024), }; static struct usb_ss_ep_comp_descriptor ss_mbim_out_comp_desc = { .bLength = sizeof(ss_mbim_out_comp_desc), .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, /* the following 2 values can be tweaked if necessary */ /* .bMaxBurst = 0, */ /* .bmAttributes = 0, */ }; static struct usb_descriptor_header *mbim_ss_function[] = { (struct usb_descriptor_header *) &mbim_iad_desc, /* MBIM control descriptors */ (struct usb_descriptor_header *) &mbim_control_intf, (struct usb_descriptor_header *) &mbim_header_desc, (struct usb_descriptor_header *) &mbim_union_desc, (struct usb_descriptor_header *) &mbim_desc, (struct usb_descriptor_header *) &ext_mbb_desc, (struct usb_descriptor_header *) &ss_mbim_notify_desc, (struct usb_descriptor_header *) &ss_mbim_notify_comp_desc, /* data interface, altsettings 0 and 1 */ (struct usb_descriptor_header *) &mbim_data_nop_intf, (struct usb_descriptor_header *) &mbim_data_intf, (struct usb_descriptor_header *) &ss_mbim_in_desc, (struct usb_descriptor_header *) &ss_mbim_in_comp_desc, (struct usb_descriptor_header *) &ss_mbim_out_desc, (struct usb_descriptor_header *) &ss_mbim_out_comp_desc, NULL, }; /* string descriptors: */ #define STRING_CTRL_IDX 0 Loading Loading @@ -1562,6 +1636,20 @@ mbim_bind(struct usb_configuration *c, struct usb_function *f) goto fail; } if (gadget_is_superspeed(c->cdev->gadget)) { ss_mbim_in_desc.bEndpointAddress = fs_mbim_in_desc.bEndpointAddress; ss_mbim_out_desc.bEndpointAddress = fs_mbim_out_desc.bEndpointAddress; ss_mbim_notify_desc.bEndpointAddress = fs_mbim_notify_desc.bEndpointAddress; /* copy descriptors, and track endpoint copies */ f->ss_descriptors = usb_copy_descriptors(mbim_ss_function); if (!f->ss_descriptors) goto fail; } /* * If MBIM is bound in a config other than the first, tell Windows * about it by returning the num as a string in the OS descriptor's Loading @@ -1584,6 +1672,10 @@ mbim_bind(struct usb_configuration *c, struct usb_function *f) fail: pr_err("%s failed to bind, err %d\n", f->name, status); if (f->ss_descriptors) usb_free_descriptors(f->ss_descriptors); if (f->hs_descriptors) usb_free_descriptors(f->hs_descriptors); if (f->fs_descriptors) usb_free_descriptors(f->fs_descriptors); Loading @@ -1610,6 +1702,10 @@ static void mbim_unbind(struct usb_configuration *c, struct usb_function *f) pr_debug("unbinding mbim"); bam_data_destroy(mbim->port_num); if (gadget_is_superspeed(c->cdev->gadget)) usb_free_descriptors(f->ss_descriptors); if (gadget_is_dualspeed(c->cdev->gadget)) usb_free_descriptors(f->hs_descriptors); usb_free_descriptors(f->fs_descriptors); Loading Loading
drivers/usb/gadget/f_mbim.c +96 −0 Original line number Diff line number Diff line Loading @@ -386,6 +386,80 @@ static struct usb_descriptor_header *mbim_hs_function[] = { NULL, }; /* Super Speed Support */ static struct usb_endpoint_descriptor ss_mbim_notify_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_IN, .bmAttributes = USB_ENDPOINT_XFER_INT, .wMaxPacketSize = 4*cpu_to_le16(NCM_STATUS_BYTECOUNT), .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, }; static struct usb_ss_ep_comp_descriptor ss_mbim_notify_comp_desc = { .bLength = sizeof(ss_mbim_notify_comp_desc), .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, /* the following 3 values can be tweaked if necessary */ /* .bMaxBurst = 0, */ /* .bmAttributes = 0, */ .wBytesPerInterval = 4*cpu_to_le16(NCM_STATUS_BYTECOUNT), }; static struct usb_endpoint_descriptor ss_mbim_in_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_IN, .bmAttributes = USB_ENDPOINT_XFER_BULK, .wMaxPacketSize = __constant_cpu_to_le16(1024), }; static struct usb_ss_ep_comp_descriptor ss_mbim_in_comp_desc = { .bLength = sizeof(ss_mbim_in_comp_desc), .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, /* the following 2 values can be tweaked if necessary */ /* .bMaxBurst = 0, */ /* .bmAttributes = 0, */ }; static struct usb_endpoint_descriptor ss_mbim_out_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_OUT, .bmAttributes = USB_ENDPOINT_XFER_BULK, .wMaxPacketSize = __constant_cpu_to_le16(1024), }; static struct usb_ss_ep_comp_descriptor ss_mbim_out_comp_desc = { .bLength = sizeof(ss_mbim_out_comp_desc), .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, /* the following 2 values can be tweaked if necessary */ /* .bMaxBurst = 0, */ /* .bmAttributes = 0, */ }; static struct usb_descriptor_header *mbim_ss_function[] = { (struct usb_descriptor_header *) &mbim_iad_desc, /* MBIM control descriptors */ (struct usb_descriptor_header *) &mbim_control_intf, (struct usb_descriptor_header *) &mbim_header_desc, (struct usb_descriptor_header *) &mbim_union_desc, (struct usb_descriptor_header *) &mbim_desc, (struct usb_descriptor_header *) &ext_mbb_desc, (struct usb_descriptor_header *) &ss_mbim_notify_desc, (struct usb_descriptor_header *) &ss_mbim_notify_comp_desc, /* data interface, altsettings 0 and 1 */ (struct usb_descriptor_header *) &mbim_data_nop_intf, (struct usb_descriptor_header *) &mbim_data_intf, (struct usb_descriptor_header *) &ss_mbim_in_desc, (struct usb_descriptor_header *) &ss_mbim_in_comp_desc, (struct usb_descriptor_header *) &ss_mbim_out_desc, (struct usb_descriptor_header *) &ss_mbim_out_comp_desc, NULL, }; /* string descriptors: */ #define STRING_CTRL_IDX 0 Loading Loading @@ -1562,6 +1636,20 @@ mbim_bind(struct usb_configuration *c, struct usb_function *f) goto fail; } if (gadget_is_superspeed(c->cdev->gadget)) { ss_mbim_in_desc.bEndpointAddress = fs_mbim_in_desc.bEndpointAddress; ss_mbim_out_desc.bEndpointAddress = fs_mbim_out_desc.bEndpointAddress; ss_mbim_notify_desc.bEndpointAddress = fs_mbim_notify_desc.bEndpointAddress; /* copy descriptors, and track endpoint copies */ f->ss_descriptors = usb_copy_descriptors(mbim_ss_function); if (!f->ss_descriptors) goto fail; } /* * If MBIM is bound in a config other than the first, tell Windows * about it by returning the num as a string in the OS descriptor's Loading @@ -1584,6 +1672,10 @@ mbim_bind(struct usb_configuration *c, struct usb_function *f) fail: pr_err("%s failed to bind, err %d\n", f->name, status); if (f->ss_descriptors) usb_free_descriptors(f->ss_descriptors); if (f->hs_descriptors) usb_free_descriptors(f->hs_descriptors); if (f->fs_descriptors) usb_free_descriptors(f->fs_descriptors); Loading @@ -1610,6 +1702,10 @@ static void mbim_unbind(struct usb_configuration *c, struct usb_function *f) pr_debug("unbinding mbim"); bam_data_destroy(mbim->port_num); if (gadget_is_superspeed(c->cdev->gadget)) usb_free_descriptors(f->ss_descriptors); if (gadget_is_dualspeed(c->cdev->gadget)) usb_free_descriptors(f->hs_descriptors); usb_free_descriptors(f->fs_descriptors); Loading