static int handle_dnload(struct usb_gadget *gadget, u16 len) { struct usb_composite_dev *cdev = get_gadget_data(gadget); struct usb_request *req = cdev->req; struct f_dfu *f_dfu = req->context; if (len == 0) f_dfu->dfu_state = DFU_STATE_dfuMANIFEST_SYNC; req->complete = dnload_request_complete; return len; } static int state_dfu_idle(struct f_dfu *f_dfu, const struct usb_ctrlrequest *ctrl, struct usb_gadget *gadget, struct usb_request *req) { u16 w_value = le16_to_cpu(ctrl->wValue); u16 len = le16_to_cpu(ctrl->wLength); int value = 0; switch (ctrl->bRequest) { case USB_REQ_DFU_DNLOAD: if (len == 0) { f_dfu->dfu_state = DFU_STATE_dfuERROR; value = RET_STALL; break; } f_dfu->dfu_state = DFU_STATE_dfuDNLOAD_SYNC; f_dfu->blk_seq_num = w_value; value = handle_dnload(gadget, len); break; … } return value; }