Lines Matching refs:fu
46 static int bot_enqueue_cmd_cbw(struct f_uas *fu)
50 if (fu->flags & USBG_BOT_CMD_PEND)
53 ret = usb_ep_queue(fu->ep_out, fu->cmd.req, GFP_ATOMIC);
55 fu->flags |= USBG_BOT_CMD_PEND;
62 struct f_uas *fu = cmd->fu;
71 bot_enqueue_cmd_cbw(fu);
74 static void bot_enqueue_sense_code(struct f_uas *fu, struct usbg_cmd *cmd)
76 struct bulk_cs_wrap *csw = &fu->bot_status.csw;
83 fu->bot_status.req->context = cmd;
84 ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_ATOMIC);
92 struct f_uas *fu = cmd->fu;
109 bot_enqueue_sense_code(fu, cmd);
114 struct f_uas *fu = cmd->fu;
115 struct bulk_cs_wrap *csw = &fu->bot_status.csw;
123 ep = fu->ep_in;
124 req = fu->bot_req_in;
126 ep = fu->ep_out;
127 req = fu->bot_req_out;
130 if (cmd->data_len > fu->ep_in->maxpacket) {
139 req->buf = fu->cmd.buf;
142 bot_enqueue_sense_code(fu, cmd);
148 struct f_uas *fu = cmd->fu;
149 struct bulk_cs_wrap *csw = &fu->bot_status.csw;
166 fu->bot_status.req->context = cmd;
168 ret = usb_ep_queue(fu->ep_in, fu->bot_status.req, GFP_KERNEL);
204 struct f_uas *fu = cmd->fu;
206 struct usb_gadget *gadget = fuas_to_gadget(fu);
225 fu->bot_req_in->buf = cmd->data_buf;
227 fu->bot_req_in->buf = NULL;
228 fu->bot_req_in->num_sgs = se_cmd->t_data_nents;
229 fu->bot_req_in->sg = se_cmd->t_data_sg;
232 fu->bot_req_in->complete = bot_read_compl;
233 fu->bot_req_in->length = se_cmd->data_length;
234 fu->bot_req_in->context = cmd;
235 ret = usb_ep_queue(fu->ep_in, fu->bot_req_in, GFP_ATOMIC);
246 struct f_uas *fu = cmd->fu;
248 struct usb_gadget *gadget = fuas_to_gadget(fu);
252 cmd->fu = fu;
264 fu->bot_req_out->buf = cmd->data_buf;
266 fu->bot_req_out->buf = NULL;
267 fu->bot_req_out->num_sgs = se_cmd->t_data_nents;
268 fu->bot_req_out->sg = se_cmd->t_data_sg;
271 fu->bot_req_out->complete = usbg_data_write_cmpl;
272 fu->bot_req_out->length = se_cmd->data_length;
273 fu->bot_req_out->context = cmd;
275 ret = usbg_prepare_w_request(cmd, fu->bot_req_out);
278 ret = usb_ep_queue(fu->ep_out, fu->bot_req_out, GFP_KERNEL);
292 struct f_uas *fu = req->context;
295 fu->flags &= ~USBG_BOT_CMD_PEND;
300 ret = bot_submit_command(fu, req->buf, req->actual);
305 static int bot_prepare_reqs(struct f_uas *fu)
309 fu->bot_req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL);
310 if (!fu->bot_req_in)
313 fu->bot_req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL);
314 if (!fu->bot_req_out)
317 fu->cmd.req = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL);
318 if (!fu->cmd.req)
321 fu->bot_status.req = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL);
322 if (!fu->bot_status.req)
325 fu->bot_status.req->buf = &fu->bot_status.csw;
326 fu->bot_status.req->length = US_BULK_CS_WRAP_LEN;
327 fu->bot_status.req->complete = bot_status_complete;
328 fu->bot_status.csw.Signature = cpu_to_le32(US_BULK_CS_SIGN);
330 fu->cmd.buf = kmalloc(fu->ep_out->maxpacket, GFP_KERNEL);
331 if (!fu->cmd.buf)
334 fu->cmd.req->complete = bot_cmd_complete;
335 fu->cmd.req->buf = fu->cmd.buf;
336 fu->cmd.req->length = fu->ep_out->maxpacket;
337 fu->cmd.req->context = fu;
339 ret = bot_enqueue_cmd_cbw(fu);
344 kfree(fu->cmd.buf);
345 fu->cmd.buf = NULL;
347 usb_ep_free_request(fu->ep_in, fu->bot_status.req);
349 usb_ep_free_request(fu->ep_out, fu->cmd.req);
350 fu->cmd.req = NULL;
352 usb_ep_free_request(fu->ep_out, fu->bot_req_out);
353 fu->bot_req_out = NULL;
355 usb_ep_free_request(fu->ep_in, fu->bot_req_in);
356 fu->bot_req_in = NULL;
362 static void bot_cleanup_old_alt(struct f_uas *fu)
364 if (!(fu->flags & USBG_ENABLED))
367 usb_ep_disable(fu->ep_in);
368 usb_ep_disable(fu->ep_out);
370 if (!fu->bot_req_in)
373 usb_ep_free_request(fu->ep_in, fu->bot_req_in);
374 usb_ep_free_request(fu->ep_out, fu->bot_req_out);
375 usb_ep_free_request(fu->ep_out, fu->cmd.req);
376 usb_ep_free_request(fu->ep_in, fu->bot_status.req);
378 kfree(fu->cmd.buf);
380 fu->bot_req_in = NULL;
381 fu->bot_req_out = NULL;
382 fu->cmd.req = NULL;
383 fu->bot_status.req = NULL;
384 fu->cmd.buf = NULL;
387 static void bot_set_alt(struct f_uas *fu)
389 struct usb_function *f = &fu->function;
393 fu->flags = USBG_IS_BOT;
395 config_ep_by_speed_and_alt(gadget, f, fu->ep_in, USB_G_ALT_INT_BBB);
396 ret = usb_ep_enable(fu->ep_in);
400 config_ep_by_speed_and_alt(gadget, f, fu->ep_out, USB_G_ALT_INT_BBB);
401 ret = usb_ep_enable(fu->ep_out);
405 ret = bot_prepare_reqs(fu);
408 fu->flags |= USBG_ENABLED;
412 usb_ep_disable(fu->ep_out);
414 usb_ep_disable(fu->ep_in);
416 fu->flags = USBG_IS_BOT;
422 struct f_uas *fu = to_f_uas(f);
439 luns = atomic_read(&fu->tpg->tpg_port_count);
460 bot_enqueue_cmd_cbw(fu);
468 static void uasp_cleanup_one_stream(struct f_uas *fu, struct uas_stream *stream)
474 usb_ep_free_request(fu->ep_in, stream->req_in);
475 usb_ep_free_request(fu->ep_out, stream->req_out);
476 usb_ep_free_request(fu->ep_status, stream->req_status);
483 static void uasp_free_cmdreq(struct f_uas *fu)
485 usb_ep_free_request(fu->ep_cmd, fu->cmd.req);
486 kfree(fu->cmd.buf);
487 fu->cmd.req = NULL;
488 fu->cmd.buf = NULL;
491 static void uasp_cleanup_old_alt(struct f_uas *fu)
495 if (!(fu->flags & USBG_ENABLED))
498 usb_ep_disable(fu->ep_in);
499 usb_ep_disable(fu->ep_out);
500 usb_ep_disable(fu->ep_status);
501 usb_ep_disable(fu->ep_cmd);
504 uasp_cleanup_one_stream(fu, &fu->stream[i]);
505 uasp_free_cmdreq(fu);
513 struct f_uas *fu = cmd->fu;
514 struct usb_gadget *gadget = fuas_to_gadget(fu);
569 struct f_uas *fu = cmd->fu;
580 ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC);
589 ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC);
596 ret = usb_ep_queue(fu->ep_status, stream->req_status,
604 usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC);
618 struct f_uas *fu = cmd->fu;
625 cmd->fu = fu;
627 return usb_ep_queue(fu->ep_status, stream->req_status, GFP_ATOMIC);
632 struct f_uas *fu = cmd->fu;
637 cmd->fu = fu;
640 if (fu->flags & USBG_USE_STREAMS) {
645 ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC);
664 ret = usb_ep_queue(fu->ep_status, stream->req_status,
675 struct f_uas *fu = cmd->fu;
682 cmd->fu = fu;
686 if (fu->flags & USBG_USE_STREAMS) {
691 ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC);
707 ret = usb_ep_queue(fu->ep_status, stream->req_status,
723 struct f_uas *fu = req->context;
729 ret = usbg_submit_command(fu, req->buf, req->actual);
738 usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC);
741 static int uasp_alloc_stream_res(struct f_uas *fu, struct uas_stream *stream)
743 stream->req_in = usb_ep_alloc_request(fu->ep_in, GFP_KERNEL);
747 stream->req_out = usb_ep_alloc_request(fu->ep_out, GFP_KERNEL);
751 stream->req_status = usb_ep_alloc_request(fu->ep_status, GFP_KERNEL);
758 usb_ep_free_request(fu->ep_out, stream->req_out);
761 usb_ep_free_request(fu->ep_in, stream->req_in);
767 static int uasp_alloc_cmd(struct f_uas *fu)
769 fu->cmd.req = usb_ep_alloc_request(fu->ep_cmd, GFP_KERNEL);
770 if (!fu->cmd.req)
773 fu->cmd.buf = kmalloc(fu->ep_cmd->maxpacket, GFP_KERNEL);
774 if (!fu->cmd.buf)
777 fu->cmd.req->complete = uasp_cmd_complete;
778 fu->cmd.req->buf = fu->cmd.buf;
779 fu->cmd.req->length = fu->ep_cmd->maxpacket;
780 fu->cmd.req->context = fu;
784 usb_ep_free_request(fu->ep_cmd, fu->cmd.req);
789 static void uasp_setup_stream_res(struct f_uas *fu, int max_streams)
794 struct uas_stream *s = &fu->stream[i];
802 static int uasp_prepare_reqs(struct f_uas *fu)
808 if (fu->flags & USBG_USE_STREAMS)
814 ret = uasp_alloc_stream_res(fu, &fu->stream[i]);
819 ret = uasp_alloc_cmd(fu);
822 uasp_setup_stream_res(fu, max_streams);
824 ret = usb_ep_queue(fu->ep_cmd, fu->cmd.req, GFP_ATOMIC);
831 uasp_free_cmdreq(fu);
836 uasp_cleanup_one_stream(fu, &fu->stream[i - 1]);
844 static void uasp_set_alt(struct f_uas *fu)
846 struct usb_function *f = &fu->function;
850 fu->flags = USBG_IS_UAS;
853 fu->flags |= USBG_USE_STREAMS;
855 config_ep_by_speed_and_alt(gadget, f, fu->ep_in, USB_G_ALT_INT_UAS);
856 ret = usb_ep_enable(fu->ep_in);
860 config_ep_by_speed_and_alt(gadget, f, fu->ep_out, USB_G_ALT_INT_UAS);
861 ret = usb_ep_enable(fu->ep_out);
865 config_ep_by_speed_and_alt(gadget, f, fu->ep_cmd, USB_G_ALT_INT_UAS);
866 ret = usb_ep_enable(fu->ep_cmd);
869 config_ep_by_speed_and_alt(gadget, f, fu->ep_status, USB_G_ALT_INT_UAS);
870 ret = usb_ep_enable(fu->ep_status);
874 ret = uasp_prepare_reqs(fu);
877 fu->flags |= USBG_ENABLED;
882 usb_ep_disable(fu->ep_status);
884 usb_ep_disable(fu->ep_cmd);
886 usb_ep_disable(fu->ep_out);
888 usb_ep_disable(fu->ep_in);
890 fu->flags = 0;
982 struct f_uas *fu = cmd->fu;
983 struct usb_gadget *gadget = fuas_to_gadget(fu);
1008 struct f_uas *fu = cmd->fu;
1010 if (fu->flags & USBG_IS_BOT)
1020 struct f_uas *fu = cmd->fu;
1022 if (fu->flags & USBG_IS_BOT)
1032 struct f_uas *fu = cmd->fu;
1034 if (fu->flags & USBG_IS_BOT)
1049 tpg = cmd->fu->tpg;
1072 static struct usbg_cmd *usbg_get_cmd(struct f_uas *fu,
1088 cmd->fu = fu;
1095 static int usbg_submit_command(struct f_uas *fu,
1100 struct usbg_tpg *tpg = fu->tpg;
1121 cmd = usbg_get_cmd(fu, tv_nexus, scsi_tag);
1128 if (fu->flags & USBG_USE_STREAMS) {
1132 cmd->stream = &fu->stream[0];
1134 cmd->stream = &fu->stream[cmd->tag - 1];
1136 cmd->stream = &fu->stream[0];
1178 tpg = cmd->fu->tpg;
1201 static int bot_submit_command(struct f_uas *fu,
1206 struct usbg_tpg *tpg = fu->tpg;
1229 cmd = usbg_get_cmd(fu, tv_nexus, cbw->Tag);
1941 struct f_uas *fu = to_f_uas(f);
1970 fu->iface = iface;
1976 fu->ep_in = ep;
1982 fu->ep_out = ep;
1988 fu->ep_status = ep;
1994 fu->ep_cmd = ep;
2024 struct f_uas *fu;
2032 struct f_uas *fu = work->fu;
2037 if (fu->flags & USBG_IS_BOT)
2038 bot_cleanup_old_alt(fu);
2039 if (fu->flags & USBG_IS_UAS)
2040 uasp_cleanup_old_alt(fu);
2043 bot_set_alt(fu);
2045 uasp_set_alt(fu);
2046 usb_composite_setup_continue(fu->function.config->cdev);
2061 struct f_uas *fu = to_f_uas(f);
2070 work->fu = fu;
2080 struct f_uas *fu = to_f_uas(f);
2082 if (fu->flags & USBG_IS_UAS)
2083 uasp_cleanup_old_alt(fu);
2084 else if (fu->flags & USBG_IS_BOT)
2085 bot_cleanup_old_alt(fu);
2086 fu->flags = 0;
2092 struct f_uas *fu = to_f_uas(f);
2094 if (!(fu->flags & USBG_IS_BOT))
2244 struct f_uas *fu;
2256 fu = kzalloc(sizeof(*fu), GFP_KERNEL);
2257 if (!fu) {
2262 fu->function.name = "Target Function";
2263 fu->function.bind = tcm_bind;
2264 fu->function.unbind = tcm_unbind;
2265 fu->function.set_alt = tcm_set_alt;
2266 fu->function.get_alt = tcm_get_alt;
2267 fu->function.setup = tcm_setup;
2268 fu->function.disable = tcm_disable;
2269 fu->function.free_func = tcm_free;
2270 fu->tpg = tpg_instances[i].tpg;
2273 return &fu->function;