Deleted Added
full compact
ufoma.c (187970) ufoma.c (188413)
1/* $NetBSD: umodem.c,v 1.45 2002/09/23 05:51:23 simonb Exp $ */
2
3#include <sys/cdefs.h>
1/* $NetBSD: umodem.c,v 1.45 2002/09/23 05:51:23 simonb Exp $ */
2
3#include <sys/cdefs.h>
4__FBSDID("$FreeBSD: head/sys/dev/usb2/serial/ufoma2.c 187970 2009-02-01 00:51:25Z thompsa $");
4__FBSDID("$FreeBSD: head/sys/dev/usb2/serial/ufoma2.c 188413 2009-02-09 22:05:25Z thompsa $");
5#define UFOMA_HANDSFREE
6/*-
7 * Copyright (c) 2005, Takanori Watanabe
8 * Copyright (c) 2003, M. Warner Losh <imp@freebsd.org>.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions

--- 127 unchanged lines hidden (view full) ---

140
141#define UFOMA_MAX_TIMEOUT 15 /* standard says 10 seconds */
142#define UFOMA_CMD_BUF_SIZE 64 /* bytes */
143
144#define UFOMA_BULK_BUF_SIZE 1024 /* bytes */
145
146enum {
147 UFOMA_CTRL_ENDPT_INTR,
5#define UFOMA_HANDSFREE
6/*-
7 * Copyright (c) 2005, Takanori Watanabe
8 * Copyright (c) 2003, M. Warner Losh <imp@freebsd.org>.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions

--- 127 unchanged lines hidden (view full) ---

140
141#define UFOMA_MAX_TIMEOUT 15 /* standard says 10 seconds */
142#define UFOMA_CMD_BUF_SIZE 64 /* bytes */
143
144#define UFOMA_BULK_BUF_SIZE 1024 /* bytes */
145
146enum {
147 UFOMA_CTRL_ENDPT_INTR,
148 UFOMA_CTRL_ENDPT_INTR_CLEAR,
149 UFOMA_CTRL_ENDPT_READ,
150 UFOMA_CTRL_ENDPT_WRITE,
148 UFOMA_CTRL_ENDPT_READ,
149 UFOMA_CTRL_ENDPT_WRITE,
151 UFOMA_CTRL_ENDPT_MAX = 4,
150 UFOMA_CTRL_ENDPT_MAX,
152};
153
154enum {
155 UFOMA_BULK_ENDPT_WRITE,
156 UFOMA_BULK_ENDPT_READ,
151};
152
153enum {
154 UFOMA_BULK_ENDPT_WRITE,
155 UFOMA_BULK_ENDPT_READ,
157 UFOMA_BULK_ENDPT_WRITE_CLEAR,
158 UFOMA_BULK_ENDPT_READ_CLEAR,
159 UFOMA_BULK_ENDPT_MAX = 4,
156 UFOMA_BULK_ENDPT_MAX,
160};
161
162struct ufoma_softc {
163 struct usb2_com_super_softc sc_super_ucom;
164 struct usb2_com_softc sc_ucom;
165 struct cv sc_cv;
166
167 struct usb2_xfer *sc_ctrl_xfer[UFOMA_CTRL_ENDPT_MAX];

--- 13 unchanged lines hidden (view full) ---

181 uint8_t sc_data_iface_no;
182 uint8_t sc_data_iface_index;
183 uint8_t sc_cm_cap;
184 uint8_t sc_acm_cap;
185 uint8_t sc_lsr;
186 uint8_t sc_msr;
187 uint8_t sc_modetoactivate;
188 uint8_t sc_currentmode;
157};
158
159struct ufoma_softc {
160 struct usb2_com_super_softc sc_super_ucom;
161 struct usb2_com_softc sc_ucom;
162 struct cv sc_cv;
163
164 struct usb2_xfer *sc_ctrl_xfer[UFOMA_CTRL_ENDPT_MAX];

--- 13 unchanged lines hidden (view full) ---

178 uint8_t sc_data_iface_no;
179 uint8_t sc_data_iface_index;
180 uint8_t sc_cm_cap;
181 uint8_t sc_acm_cap;
182 uint8_t sc_lsr;
183 uint8_t sc_msr;
184 uint8_t sc_modetoactivate;
185 uint8_t sc_currentmode;
189 uint8_t sc_flags;
190#define UFOMA_FLAG_INTR_STALL 0x01
191#define UFOMA_FLAG_BULK_WRITE_STALL 0x02
192#define UFOMA_FLAG_BULK_READ_STALL 0x04
193
194 uint8_t sc_name[16];
195};
196
197/* prototypes */
198
199static device_probe_t ufoma_probe;
200static device_attach_t ufoma_attach;
201static device_detach_t ufoma_detach;
202
203static usb2_callback_t ufoma_ctrl_read_callback;
204static usb2_callback_t ufoma_ctrl_write_callback;
186 uint8_t sc_name[16];
187};
188
189/* prototypes */
190
191static device_probe_t ufoma_probe;
192static device_attach_t ufoma_attach;
193static device_detach_t ufoma_detach;
194
195static usb2_callback_t ufoma_ctrl_read_callback;
196static usb2_callback_t ufoma_ctrl_write_callback;
205static usb2_callback_t ufoma_intr_clear_stall_callback;
206static usb2_callback_t ufoma_intr_callback;
207static usb2_callback_t ufoma_bulk_write_callback;
197static usb2_callback_t ufoma_intr_callback;
198static usb2_callback_t ufoma_bulk_write_callback;
208static usb2_callback_t ufoma_bulk_write_clear_stall_callback;
209static usb2_callback_t ufoma_bulk_read_callback;
199static usb2_callback_t ufoma_bulk_read_callback;
210static usb2_callback_t ufoma_bulk_read_clear_stall_callback;
211
200
212static void ufoma_cfg_do_request(struct ufoma_softc *,
213 struct usb2_device_request *, void *);
214static void *ufoma_get_intconf(struct usb2_config_descriptor *,
215 struct usb2_interface_descriptor *, uint8_t, uint8_t);
216static void ufoma_cfg_link_state(struct ufoma_softc *);
217static void ufoma_cfg_activate_state(struct ufoma_softc *, uint16_t);
218static void ufoma_cfg_open(struct usb2_com_softc *);
219static void ufoma_cfg_close(struct usb2_com_softc *);
220static void ufoma_cfg_set_break(struct usb2_com_softc *, uint8_t);
221static void ufoma_cfg_get_status(struct usb2_com_softc *, uint8_t *,

--- 22 unchanged lines hidden (view full) ---

244 .type = UE_INTERRUPT,
245 .endpoint = UE_ADDR_ANY,
246 .direction = UE_DIR_IN,
247 .mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
248 .mh.bufsize = sizeof(struct usb2_cdc_notification),
249 .mh.callback = &ufoma_intr_callback,
250 },
251
201static void *ufoma_get_intconf(struct usb2_config_descriptor *,
202 struct usb2_interface_descriptor *, uint8_t, uint8_t);
203static void ufoma_cfg_link_state(struct ufoma_softc *);
204static void ufoma_cfg_activate_state(struct ufoma_softc *, uint16_t);
205static void ufoma_cfg_open(struct usb2_com_softc *);
206static void ufoma_cfg_close(struct usb2_com_softc *);
207static void ufoma_cfg_set_break(struct usb2_com_softc *, uint8_t);
208static void ufoma_cfg_get_status(struct usb2_com_softc *, uint8_t *,

--- 22 unchanged lines hidden (view full) ---

231 .type = UE_INTERRUPT,
232 .endpoint = UE_ADDR_ANY,
233 .direction = UE_DIR_IN,
234 .mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
235 .mh.bufsize = sizeof(struct usb2_cdc_notification),
236 .mh.callback = &ufoma_intr_callback,
237 },
238
252 [UFOMA_CTRL_ENDPT_INTR_CLEAR] = {
253 .type = UE_CONTROL,
254 .endpoint = 0x00, /* Control pipe */
255 .direction = UE_DIR_ANY,
256 .mh.bufsize = sizeof(struct usb2_device_request),
257 .mh.flags = {},
258 .mh.callback = &ufoma_intr_clear_stall_callback,
259 .mh.timeout = 1000, /* 1 second */
260 .mh.interval = 50, /* 50ms */
261 },
262
263 [UFOMA_CTRL_ENDPT_READ] = {
264 .type = UE_CONTROL,
265 .endpoint = 0x00, /* Control pipe */
266 .direction = UE_DIR_ANY,
267 .mh.bufsize = (sizeof(struct usb2_device_request) + UFOMA_CMD_BUF_SIZE),
268 .mh.flags = {.short_xfer_ok = 1,},
269 .mh.callback = &ufoma_ctrl_read_callback,
270 .mh.timeout = 1000, /* 1 second */

--- 25 unchanged lines hidden (view full) ---

296 [UFOMA_BULK_ENDPT_READ] = {
297 .type = UE_BULK,
298 .endpoint = UE_ADDR_ANY,
299 .direction = UE_DIR_IN,
300 .mh.bufsize = UFOMA_BULK_BUF_SIZE,
301 .mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
302 .mh.callback = &ufoma_bulk_read_callback,
303 },
239 [UFOMA_CTRL_ENDPT_READ] = {
240 .type = UE_CONTROL,
241 .endpoint = 0x00, /* Control pipe */
242 .direction = UE_DIR_ANY,
243 .mh.bufsize = (sizeof(struct usb2_device_request) + UFOMA_CMD_BUF_SIZE),
244 .mh.flags = {.short_xfer_ok = 1,},
245 .mh.callback = &ufoma_ctrl_read_callback,
246 .mh.timeout = 1000, /* 1 second */

--- 25 unchanged lines hidden (view full) ---

272 [UFOMA_BULK_ENDPT_READ] = {
273 .type = UE_BULK,
274 .endpoint = UE_ADDR_ANY,
275 .direction = UE_DIR_IN,
276 .mh.bufsize = UFOMA_BULK_BUF_SIZE,
277 .mh.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
278 .mh.callback = &ufoma_bulk_read_callback,
279 },
304
305 [UFOMA_BULK_ENDPT_WRITE_CLEAR] = {
306 .type = UE_CONTROL,
307 .endpoint = 0x00, /* Control pipe */
308 .direction = UE_DIR_ANY,
309 .mh.bufsize = sizeof(struct usb2_device_request),
310 .mh.flags = {},
311 .mh.callback = &ufoma_bulk_write_clear_stall_callback,
312 .mh.timeout = 1000, /* 1 second */
313 .mh.interval = 50, /* 50ms */
314 },
315
316 [UFOMA_BULK_ENDPT_READ_CLEAR] = {
317 .type = UE_CONTROL,
318 .endpoint = 0x00, /* Control pipe */
319 .direction = UE_DIR_ANY,
320 .mh.bufsize = sizeof(struct usb2_device_request),
321 .mh.flags = {},
322 .mh.callback = &ufoma_bulk_read_clear_stall_callback,
323 .mh.timeout = 1000, /* 1 second */
324 .mh.interval = 50, /* 50ms */
325 },
326};
327
328static const struct usb2_com_callback ufoma_callback = {
329 .usb2_com_cfg_get_status = &ufoma_cfg_get_status,
330 .usb2_com_cfg_set_dtr = &ufoma_cfg_set_dtr,
331 .usb2_com_cfg_set_rts = &ufoma_cfg_set_rts,
332 .usb2_com_cfg_set_break = &ufoma_cfg_set_break,
333 .usb2_com_cfg_param = &ufoma_cfg_param,

--- 130 unchanged lines hidden (view full) ---

464 goto detach;
465 }
466 sc->sc_modetable[0] = (elements + 1);
467 bcopy(mad->bMode, &sc->sc_modetable[1], elements);
468
469 sc->sc_currentmode = UMCPC_ACM_MODE_UNLINKED;
470 sc->sc_modetoactivate = mad->bMode[0];
471
280};
281
282static const struct usb2_com_callback ufoma_callback = {
283 .usb2_com_cfg_get_status = &ufoma_cfg_get_status,
284 .usb2_com_cfg_set_dtr = &ufoma_cfg_set_dtr,
285 .usb2_com_cfg_set_rts = &ufoma_cfg_set_rts,
286 .usb2_com_cfg_set_break = &ufoma_cfg_set_break,
287 .usb2_com_cfg_param = &ufoma_cfg_param,

--- 130 unchanged lines hidden (view full) ---

418 goto detach;
419 }
420 sc->sc_modetable[0] = (elements + 1);
421 bcopy(mad->bMode, &sc->sc_modetable[1], elements);
422
423 sc->sc_currentmode = UMCPC_ACM_MODE_UNLINKED;
424 sc->sc_modetoactivate = mad->bMode[0];
425
472 /* clear stall at first run */
473 sc->sc_flags |= (UFOMA_FLAG_BULK_WRITE_STALL |
474 UFOMA_FLAG_BULK_READ_STALL);
426 /* clear stall at first run, if any */
427 usb2_transfer_set_stall(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE]);
428 usb2_transfer_set_stall(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ]);
475
476 error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
477 &ufoma_callback, &Giant);
478 if (error) {
479 DPRINTF("usb2_com_attach failed\n");
480 goto detach;
481 }
482 /*Sysctls*/

--- 36 unchanged lines hidden (view full) ---

519 if (sc->sc_modetable) {
520 free(sc->sc_modetable, M_USBDEV);
521 }
522 usb2_cv_destroy(&sc->sc_cv);
523
524 return (0);
525}
526
429
430 error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
431 &ufoma_callback, &Giant);
432 if (error) {
433 DPRINTF("usb2_com_attach failed\n");
434 goto detach;
435 }
436 /*Sysctls*/

--- 36 unchanged lines hidden (view full) ---

473 if (sc->sc_modetable) {
474 free(sc->sc_modetable, M_USBDEV);
475 }
476 usb2_cv_destroy(&sc->sc_cv);
477
478 return (0);
479}
480
527static void
528ufoma_cfg_do_request(struct ufoma_softc *sc, struct usb2_device_request *req,
529 void *data)
530{
531 uint16_t length;
532 usb2_error_t err;
533
534 if (usb2_com_cfg_is_gone(&sc->sc_ucom)) {
535 goto error;
536 }
537 err = usb2_do_request_flags
538 (sc->sc_udev, &Giant, req, data, 0, NULL, 1000);
539
540 if (err) {
541
542 DPRINTFN(0, "device request failed, err=%s "
543 "(ignored)\n", usb2_errstr(err));
544
545error:
546 length = UGETW(req->wLength);
547
548 if ((req->bmRequestType & UT_READ) && length) {
549 bzero(data, length);
550 }
551 }
552}
553
554static void *
555ufoma_get_intconf(struct usb2_config_descriptor *cd, struct usb2_interface_descriptor *id,
556 uint8_t type, uint8_t subtype)
557{
558 struct usb2_descriptor *desc = (void *)id;
559
560 while ((desc = usb2_desc_foreach(cd, desc))) {
561

--- 15 unchanged lines hidden (view full) ---

577 int32_t error;
578
579 req.bmRequestType = UT_WRITE_VENDOR_INTERFACE;
580 req.bRequest = UMCPC_SET_LINK;
581 USETW(req.wValue, UMCPC_CM_MOBILE_ACM);
582 USETW(req.wIndex, sc->sc_ctrl_iface_no);
583 USETW(req.wLength, sc->sc_modetable[0]);
584
481static void *
482ufoma_get_intconf(struct usb2_config_descriptor *cd, struct usb2_interface_descriptor *id,
483 uint8_t type, uint8_t subtype)
484{
485 struct usb2_descriptor *desc = (void *)id;
486
487 while ((desc = usb2_desc_foreach(cd, desc))) {
488

--- 15 unchanged lines hidden (view full) ---

504 int32_t error;
505
506 req.bmRequestType = UT_WRITE_VENDOR_INTERFACE;
507 req.bRequest = UMCPC_SET_LINK;
508 USETW(req.wValue, UMCPC_CM_MOBILE_ACM);
509 USETW(req.wIndex, sc->sc_ctrl_iface_no);
510 USETW(req.wLength, sc->sc_modetable[0]);
511
585 ufoma_cfg_do_request(sc, &req, sc->sc_modetable);
512 usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
513 &req, sc->sc_modetable, 0, 1000);
586
587 error = usb2_cv_timedwait(&sc->sc_cv, &Giant, hz);
588
589 if (error) {
590 DPRINTF("NO response\n");
591 }
592}
593

--- 4 unchanged lines hidden (view full) ---

598 int32_t error;
599
600 req.bmRequestType = UT_WRITE_VENDOR_INTERFACE;
601 req.bRequest = UMCPC_ACTIVATE_MODE;
602 USETW(req.wValue, state);
603 USETW(req.wIndex, sc->sc_ctrl_iface_no);
604 USETW(req.wLength, 0);
605
514
515 error = usb2_cv_timedwait(&sc->sc_cv, &Giant, hz);
516
517 if (error) {
518 DPRINTF("NO response\n");
519 }
520}
521

--- 4 unchanged lines hidden (view full) ---

526 int32_t error;
527
528 req.bmRequestType = UT_WRITE_VENDOR_INTERFACE;
529 req.bRequest = UMCPC_ACTIVATE_MODE;
530 USETW(req.wValue, state);
531 USETW(req.wIndex, sc->sc_ctrl_iface_no);
532 USETW(req.wLength, 0);
533
606 ufoma_cfg_do_request(sc, &req, NULL);
534 usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
535 &req, NULL, 0, 1000);
607
608 error = usb2_cv_timedwait(&sc->sc_cv, &Giant,
609 (UFOMA_MAX_TIMEOUT * hz));
610 if (error) {
611 DPRINTF("No response\n");
612 }
613}
614

--- 88 unchanged lines hidden (view full) ---

703 goto tr_setup;
704 }
705
706 goto tr_transferred;
707 }
708}
709
710static void
536
537 error = usb2_cv_timedwait(&sc->sc_cv, &Giant,
538 (UFOMA_MAX_TIMEOUT * hz));
539 if (error) {
540 DPRINTF("No response\n");
541 }
542}
543

--- 88 unchanged lines hidden (view full) ---

632 goto tr_setup;
633 }
634
635 goto tr_transferred;
636 }
637}
638
639static void
711ufoma_intr_clear_stall_callback(struct usb2_xfer *xfer)
712{
713 struct ufoma_softc *sc = xfer->priv_sc;
714 struct usb2_xfer *xfer_other = sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_INTR];
715
716 if (usb2_clear_stall_callback(xfer, xfer_other)) {
717 DPRINTF("stall cleared\n");
718 sc->sc_flags &= ~UFOMA_FLAG_INTR_STALL;
719 usb2_transfer_start(xfer_other);
720 }
721}
722
723static void
724ufoma_intr_callback(struct usb2_xfer *xfer)
725{
726 struct ufoma_softc *sc = xfer->priv_sc;
727 struct usb2_cdc_notification pkt;
728 uint16_t wLen;
729 uint16_t temp;
730 uint8_t mstatus;
731

--- 75 unchanged lines hidden (view full) ---

807 break;
808
809 default:
810 break;
811 }
812
813 case USB_ST_SETUP:
814tr_setup:
640ufoma_intr_callback(struct usb2_xfer *xfer)
641{
642 struct ufoma_softc *sc = xfer->priv_sc;
643 struct usb2_cdc_notification pkt;
644 uint16_t wLen;
645 uint16_t temp;
646 uint8_t mstatus;
647

--- 75 unchanged lines hidden (view full) ---

723 break;
724
725 default:
726 break;
727 }
728
729 case USB_ST_SETUP:
730tr_setup:
815 if (sc->sc_flags & UFOMA_FLAG_INTR_STALL) {
816 usb2_transfer_start(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_INTR_CLEAR]);
817 } else {
818 xfer->frlengths[0] = xfer->max_data_length;
819 usb2_start_hardware(xfer);
820 }
731 xfer->frlengths[0] = xfer->max_data_length;
732 usb2_start_hardware(xfer);
821 return;
822
823 default: /* Error */
824 if (xfer->error != USB_ERR_CANCELLED) {
733 return;
734
735 default: /* Error */
736 if (xfer->error != USB_ERR_CANCELLED) {
825 /* start clear stall */
826 sc->sc_flags |= UFOMA_FLAG_INTR_STALL;
827 usb2_transfer_start(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_INTR_CLEAR]);
737 /* try to clear stall first */
738 xfer->flags.stall_pipe = 1;
739 goto tr_setup;
828 }
829 return;
740 }
741 return;
830
831 }
832}
833
834static void
835ufoma_bulk_write_callback(struct usb2_xfer *xfer)
836{
837 struct ufoma_softc *sc = xfer->priv_sc;
838 uint32_t actlen;
839
840 switch (USB_GET_STATE(xfer)) {
841 case USB_ST_SETUP:
842 case USB_ST_TRANSFERRED:
742 }
743}
744
745static void
746ufoma_bulk_write_callback(struct usb2_xfer *xfer)
747{
748 struct ufoma_softc *sc = xfer->priv_sc;
749 uint32_t actlen;
750
751 switch (USB_GET_STATE(xfer)) {
752 case USB_ST_SETUP:
753 case USB_ST_TRANSFERRED:
843 if (sc->sc_flags & UFOMA_FLAG_BULK_WRITE_STALL) {
844 usb2_transfer_start(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE_CLEAR]);
845 return;
846 }
754tr_setup:
847 if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
848 UFOMA_BULK_BUF_SIZE, &actlen)) {
849 xfer->frlengths[0] = actlen;
850 usb2_start_hardware(xfer);
851 }
852 return;
853
854 default: /* Error */
855 if (xfer->error != USB_ERR_CANCELLED) {
755 if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
756 UFOMA_BULK_BUF_SIZE, &actlen)) {
757 xfer->frlengths[0] = actlen;
758 usb2_start_hardware(xfer);
759 }
760 return;
761
762 default: /* Error */
763 if (xfer->error != USB_ERR_CANCELLED) {
856 sc->sc_flags |= UFOMA_FLAG_BULK_WRITE_STALL;
857 usb2_transfer_start(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE_CLEAR]);
764 /* try to clear stall first */
765 xfer->flags.stall_pipe = 1;
766 goto tr_setup;
858 }
859 return;
767 }
768 return;
860
861 }
862}
863
864static void
769 }
770}
771
772static void
865ufoma_bulk_write_clear_stall_callback(struct usb2_xfer *xfer)
866{
867 struct ufoma_softc *sc = xfer->priv_sc;
868 struct usb2_xfer *xfer_other = sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE];
869
870 if (usb2_clear_stall_callback(xfer, xfer_other)) {
871 DPRINTF("stall cleared\n");
872 sc->sc_flags &= ~UFOMA_FLAG_BULK_WRITE_STALL;
873 usb2_transfer_start(xfer_other);
874 }
875}
876
877static void
878ufoma_bulk_read_callback(struct usb2_xfer *xfer)
879{
880 struct ufoma_softc *sc = xfer->priv_sc;
881
882 switch (USB_GET_STATE(xfer)) {
883 case USB_ST_TRANSFERRED:
884 usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0,
885 xfer->actlen);
886
887 case USB_ST_SETUP:
773ufoma_bulk_read_callback(struct usb2_xfer *xfer)
774{
775 struct ufoma_softc *sc = xfer->priv_sc;
776
777 switch (USB_GET_STATE(xfer)) {
778 case USB_ST_TRANSFERRED:
779 usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0,
780 xfer->actlen);
781
782 case USB_ST_SETUP:
888 if (sc->sc_flags & UFOMA_FLAG_BULK_READ_STALL) {
889 usb2_transfer_start(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ_CLEAR]);
890 } else {
891 xfer->frlengths[0] = xfer->max_data_length;
892 usb2_start_hardware(xfer);
893 }
783tr_setup:
784 xfer->frlengths[0] = xfer->max_data_length;
785 usb2_start_hardware(xfer);
894 return;
895
896 default: /* Error */
897 if (xfer->error != USB_ERR_CANCELLED) {
786 return;
787
788 default: /* Error */
789 if (xfer->error != USB_ERR_CANCELLED) {
898 sc->sc_flags |= UFOMA_FLAG_BULK_READ_STALL;
899 usb2_transfer_start(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ_CLEAR]);
790 /* try to clear stall first */
791 xfer->flags.stall_pipe = 1;
792 goto tr_setup;
900 }
901 return;
793 }
794 return;
902
903 }
904}
905
906static void
795 }
796}
797
798static void
907ufoma_bulk_read_clear_stall_callback(struct usb2_xfer *xfer)
908{
909 struct ufoma_softc *sc = xfer->priv_sc;
910 struct usb2_xfer *xfer_other = sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ];
911
912 if (usb2_clear_stall_callback(xfer, xfer_other)) {
913 DPRINTF("stall cleared\n");
914 sc->sc_flags &= ~UFOMA_FLAG_BULK_READ_STALL;
915 usb2_transfer_start(xfer_other);
916 }
917}
918
919static void
920ufoma_cfg_open(struct usb2_com_softc *ucom)
921{
922 struct ufoma_softc *sc = ucom->sc_parent;
923
924 /* empty input queue */
925
926 if (sc->sc_num_msg != 0xFF) {
927 sc->sc_num_msg++;

--- 32 unchanged lines hidden (view full) ---

960
961 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
962 req.bRequest = UCDC_SEND_BREAK;
963 USETW(req.wValue, wValue);
964 req.wIndex[0] = sc->sc_ctrl_iface_no;
965 req.wIndex[1] = 0;
966 USETW(req.wLength, 0);
967
799ufoma_cfg_open(struct usb2_com_softc *ucom)
800{
801 struct ufoma_softc *sc = ucom->sc_parent;
802
803 /* empty input queue */
804
805 if (sc->sc_num_msg != 0xFF) {
806 sc->sc_num_msg++;

--- 32 unchanged lines hidden (view full) ---

839
840 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
841 req.bRequest = UCDC_SEND_BREAK;
842 USETW(req.wValue, wValue);
843 req.wIndex[0] = sc->sc_ctrl_iface_no;
844 req.wIndex[1] = 0;
845 USETW(req.wLength, 0);
846
968 ufoma_cfg_do_request(sc, &req, 0);
847 usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
848 &req, NULL, 0, 1000);
969}
970
971static void
972ufoma_cfg_get_status(struct usb2_com_softc *ucom, uint8_t *lsr, uint8_t *msr)
973{
974 struct ufoma_softc *sc = ucom->sc_parent;
975
976 *lsr = sc->sc_lsr;

--- 11 unchanged lines hidden (view full) ---

988 }
989 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
990 req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
991 USETW(req.wValue, sc->sc_line);
992 req.wIndex[0] = sc->sc_ctrl_iface_no;
993 req.wIndex[1] = 0;
994 USETW(req.wLength, 0);
995
849}
850
851static void
852ufoma_cfg_get_status(struct usb2_com_softc *ucom, uint8_t *lsr, uint8_t *msr)
853{
854 struct ufoma_softc *sc = ucom->sc_parent;
855
856 *lsr = sc->sc_lsr;

--- 11 unchanged lines hidden (view full) ---

868 }
869 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
870 req.bRequest = UCDC_SET_CONTROL_LINE_STATE;
871 USETW(req.wValue, sc->sc_line);
872 req.wIndex[0] = sc->sc_ctrl_iface_no;
873 req.wIndex[1] = 0;
874 USETW(req.wLength, 0);
875
996 ufoma_cfg_do_request(sc, &req, 0);
876 usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
877 &req, NULL, 0, 1000);
997}
998
999static void
1000ufoma_cfg_set_dtr(struct usb2_com_softc *ucom, uint8_t onoff)
1001{
1002 struct ufoma_softc *sc = ucom->sc_parent;
1003
1004 if (sc->sc_nobulk) {

--- 79 unchanged lines hidden (view full) ---

1084
1085 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
1086 req.bRequest = UCDC_SET_LINE_CODING;
1087 USETW(req.wValue, 0);
1088 req.wIndex[0] = sc->sc_ctrl_iface_no;
1089 req.wIndex[1] = 0;
1090 USETW(req.wLength, UCDC_LINE_STATE_LENGTH);
1091
878}
879
880static void
881ufoma_cfg_set_dtr(struct usb2_com_softc *ucom, uint8_t onoff)
882{
883 struct ufoma_softc *sc = ucom->sc_parent;
884
885 if (sc->sc_nobulk) {

--- 79 unchanged lines hidden (view full) ---

965
966 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
967 req.bRequest = UCDC_SET_LINE_CODING;
968 USETW(req.wValue, 0);
969 req.wIndex[0] = sc->sc_ctrl_iface_no;
970 req.wIndex[1] = 0;
971 USETW(req.wLength, UCDC_LINE_STATE_LENGTH);
972
1092 ufoma_cfg_do_request(sc, &req, &ls);
973 usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
974 &req, &ls, 0, 1000);
1093}
1094
1095static int
1096ufoma_modem_setup(device_t dev, struct ufoma_softc *sc,
1097 struct usb2_attach_arg *uaa)
1098{
1099 struct usb2_config_descriptor *cd;
1100 struct usb2_cdc_acm_descriptor *acm;

--- 80 unchanged lines hidden (view full) ---

1181
1182static void
1183ufoma_stop_read(struct usb2_com_softc *ucom)
1184{
1185 struct ufoma_softc *sc = ucom->sc_parent;
1186
1187 /* stop interrupt transfer */
1188 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_INTR]);
975}
976
977static int
978ufoma_modem_setup(device_t dev, struct ufoma_softc *sc,
979 struct usb2_attach_arg *uaa)
980{
981 struct usb2_config_descriptor *cd;
982 struct usb2_cdc_acm_descriptor *acm;

--- 80 unchanged lines hidden (view full) ---

1063
1064static void
1065ufoma_stop_read(struct usb2_com_softc *ucom)
1066{
1067 struct ufoma_softc *sc = ucom->sc_parent;
1068
1069 /* stop interrupt transfer */
1070 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_INTR]);
1189 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_INTR_CLEAR]);
1190
1191 /* stop data transfer */
1192 if (sc->sc_nobulk) {
1193 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_READ]);
1194 } else {
1071
1072 /* stop data transfer */
1073 if (sc->sc_nobulk) {
1074 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_READ]);
1075 } else {
1195 usb2_transfer_stop(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ_CLEAR]);
1196 usb2_transfer_stop(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ]);
1197 }
1198}
1199
1200static void
1201ufoma_start_write(struct usb2_com_softc *ucom)
1202{
1203 struct ufoma_softc *sc = ucom->sc_parent;

--- 8 unchanged lines hidden (view full) ---

1212static void
1213ufoma_stop_write(struct usb2_com_softc *ucom)
1214{
1215 struct ufoma_softc *sc = ucom->sc_parent;
1216
1217 if (sc->sc_nobulk) {
1218 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_WRITE]);
1219 } else {
1076 usb2_transfer_stop(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ]);
1077 }
1078}
1079
1080static void
1081ufoma_start_write(struct usb2_com_softc *ucom)
1082{
1083 struct ufoma_softc *sc = ucom->sc_parent;

--- 8 unchanged lines hidden (view full) ---

1092static void
1093ufoma_stop_write(struct usb2_com_softc *ucom)
1094{
1095 struct ufoma_softc *sc = ucom->sc_parent;
1096
1097 if (sc->sc_nobulk) {
1098 usb2_transfer_stop(sc->sc_ctrl_xfer[UFOMA_CTRL_ENDPT_WRITE]);
1099 } else {
1220 usb2_transfer_stop(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE_CLEAR]);
1221 usb2_transfer_stop(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE]);
1222 }
1223}
1224
1225struct umcpc_modetostr_tab{
1226 int mode;
1227 char *str;
1228}umcpc_modetostr_tab[]={

--- 105 unchanged lines hidden ---
1100 usb2_transfer_stop(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE]);
1101 }
1102}
1103
1104struct umcpc_modetostr_tab{
1105 int mode;
1106 char *str;
1107}umcpc_modetostr_tab[]={

--- 105 unchanged lines hidden ---