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 --- |