1 /* $NetBSD: ustir.c,v 1.16 2006/10/12 01:32:00 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by David Sainty <David.Sainty@dtsp.co.nz> 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 #include <sys/cdefs.h> 40 __KERNEL_RCSID(0, "$NetBSD: ustir.c,v 1.16 2006/10/12 01:32:00 christos Exp $"); 41 42 #include <sys/param.h> 43 #include <sys/systm.h> 44 #include <sys/kernel.h> 45 #include <sys/device.h> 46 #include <sys/malloc.h> 47 #include <sys/conf.h> 48 #include <sys/file.h> 49 #include <sys/poll.h> 50 #include <sys/select.h> 51 #include <sys/proc.h> 52 #include <sys/kthread.h> 53 54 #ifdef USTIR_DEBUG_IOCTLS 55 #include <sys/ioctl.h> 56 #include <dev/usb/ustir.h> 57 #endif 58 59 #include <dev/usb/usb.h> 60 #include <dev/usb/usbdevs.h> 61 #include <dev/usb/usbdi.h> 62 #include <dev/usb/usbdi_util.h> 63 #include <dev/usb/ustirreg.h> 64 65 #include <dev/ir/ir.h> 66 #include <dev/ir/irdaio.h> 67 #include <dev/ir/irframevar.h> 68 #include <dev/ir/sir.h> 69 70 #ifdef USTIR_DEBUG 71 #define DPRINTFN(n,x) if (ustirdebug>(n)) logprintf x 72 int ustirdebug = 0; 73 #else 74 #define DPRINTFN(n,x) 75 #endif 76 77 /* Max size with framing. */ 78 #define MAX_USTIR_OUTPUT_FRAME (2*IRDA_MAX_FRAME_SIZE + IRDA_MAX_EBOFS + STIR_OUTPUT_HEADER_SIZE + 4) 79 80 #define USTIR_NSPEEDS 9 81 struct ustir_speedrec { 82 unsigned int speed; 83 unsigned int config; 84 }; 85 86 Static struct ustir_speedrec const ustir_speeds[USTIR_NSPEEDS] = { 87 { 4000000, STIR_BRMODE_4000000 }, 88 { 1152000, STIR_BRMODE_1152000 }, 89 { 576000, STIR_BRMODE_576000 }, 90 { 115200, STIR_BRMODE_115200 }, 91 { 57600, STIR_BRMODE_57600 }, 92 { 38400, STIR_BRMODE_38400 }, 93 { 19200, STIR_BRMODE_19200 }, 94 { 9600, STIR_BRMODE_9600 }, 95 { 2400, STIR_BRMODE_2400 } 96 }; 97 98 struct framedefn { 99 unsigned int bof_count; 100 u_int8_t bof_byte; 101 102 u_int8_t esc_byte; 103 u_int8_t esc_xor; 104 105 unsigned int eof_count; 106 u_int8_t eof_byte; 107 108 unsigned int fcs_count; 109 u_int32_t fcs_init; 110 u_int32_t fcs_correct; 111 112 u_int32_t (*fcs_calc)(u_int32_t, u_int8_t const*, size_t); 113 }; 114 115 Static u_int32_t crc_ccitt_16(u_int32_t, u_int8_t const*, size_t); 116 117 struct framedefn const framedef_sir = { 118 1, 0xc0, 119 0x7d, 0x20, 120 1, 0xc1, 121 2, INITFCS, GOODFCS, 122 crc_ccitt_16 123 }; 124 125 enum framefsmstate { 126 FSTATE_END_OF_FRAME, 127 FSTATE_START_OF_FRAME, 128 FSTATE_IN_DATA, 129 FSTATE_IN_END 130 }; 131 132 enum frameresult { 133 FR_IDLE, 134 FR_INPROGRESS, 135 FR_FRAMEOK, 136 FR_FRAMEBADFCS, 137 FR_FRAMEMALFORMED, 138 FR_BUFFEROVERRUN 139 }; 140 141 struct framestate { 142 struct framedefn const *definition; 143 144 u_int8_t *buffer; 145 size_t buflen; 146 size_t bufindex; 147 148 enum framefsmstate fsmstate; 149 u_int escaped; 150 u_int state_index; 151 }; 152 153 #define deframe_isclear(fs) ((fs)->fsmstate == FSTATE_END_OF_FRAME) 154 155 Static void deframe_clear(struct framestate *); 156 Static void deframe_init(struct framestate *, struct framedefn const *, 157 u_int8_t *, size_t); 158 Static enum frameresult deframe_process(struct framestate *, u_int8_t const **, 159 size_t *); 160 161 struct ustir_softc { 162 USBBASEDEVICE sc_dev; 163 usbd_device_handle sc_udev; 164 usbd_interface_handle sc_iface; 165 166 u_int8_t *sc_ur_buf; /* Unencapsulated frame */ 167 u_int sc_ur_framelen; 168 169 u_int8_t *sc_rd_buf; /* Raw incoming data stream */ 170 size_t sc_rd_index; 171 int sc_rd_addr; 172 usbd_pipe_handle sc_rd_pipe; 173 usbd_xfer_handle sc_rd_xfer; 174 u_int sc_rd_count; 175 int sc_rd_readinprogress; 176 u_int sc_rd_expectdataticks; 177 u_char sc_rd_err; 178 struct framestate sc_framestate; 179 struct proc *sc_thread; 180 struct selinfo sc_rd_sel; 181 182 u_int8_t *sc_wr_buf; 183 int sc_wr_addr; 184 int sc_wr_stalewrite; 185 usbd_xfer_handle sc_wr_xfer; 186 usbd_pipe_handle sc_wr_pipe; 187 struct selinfo sc_wr_sel; 188 189 enum { 190 udir_input, /* Receiving data */ 191 udir_output, /* Transmitting data */ 192 udir_stalled, /* Error preventing data flow */ 193 udir_idle /* Neither receiving nor transmitting */ 194 } sc_direction; 195 196 struct ustir_speedrec const *sc_speedrec; 197 198 struct device *sc_child; 199 struct irda_params sc_params; 200 201 int sc_refcnt; 202 char sc_closing; 203 char sc_dying; 204 }; 205 206 /* True if we cannot safely read data from the device */ 207 #define USTIR_BLOCK_RX_DATA(sc) ((sc)->sc_ur_framelen != 0) 208 209 #define USTIR_WR_TIMEOUT 200 210 211 Static int ustir_activate(device_ptr_t self, enum devact act); 212 Static int ustir_open(void *h, int flag, int mode, struct lwp *l); 213 Static int ustir_close(void *h, int flag, int mode, struct lwp *l); 214 Static int ustir_read(void *h, struct uio *uio, int flag); 215 Static int ustir_write(void *h, struct uio *uio, int flag); 216 Static int ustir_set_params(void *h, struct irda_params *params); 217 Static int ustir_get_speeds(void *h, int *speeds); 218 Static int ustir_get_turnarounds(void *h, int *times); 219 Static int ustir_poll(void *h, int events, struct lwp *l); 220 Static int ustir_kqfilter(void *h, struct knote *kn); 221 222 #ifdef USTIR_DEBUG_IOCTLS 223 Static int ustir_ioctl(void *h, u_long cmd, caddr_t addr, int flag, struct lwp *l); 224 #endif 225 226 Static struct irframe_methods const ustir_methods = { 227 ustir_open, ustir_close, ustir_read, ustir_write, ustir_poll, 228 ustir_kqfilter, ustir_set_params, ustir_get_speeds, 229 ustir_get_turnarounds, 230 #ifdef USTIR_DEBUG_IOCTLS 231 ustir_ioctl 232 #endif 233 }; 234 235 Static void ustir_rd_cb(usbd_xfer_handle, usbd_private_handle, usbd_status); 236 Static usbd_status ustir_start_read(struct ustir_softc *); 237 Static void ustir_periodic(struct ustir_softc *); 238 Static void ustir_thread(void *); 239 240 Static u_int32_t 241 crc_ccitt_16(u_int32_t crcinit, u_int8_t const *buf, size_t blen) 242 { 243 while (blen-- > 0) { 244 u_int8_t chr; 245 chr = *buf++; 246 crcinit = updateFCS(crcinit, chr); 247 } 248 return crcinit; 249 } 250 251 static usbd_status 252 ustir_read_reg(struct ustir_softc *sc, unsigned int reg, u_int8_t *data) 253 { 254 usb_device_request_t req; 255 256 req.bmRequestType = UT_READ_VENDOR_DEVICE; 257 req.bRequest = STIR_CMD_READMULTIREG; 258 USETW(req.wValue, 0); 259 USETW(req.wIndex, reg); 260 USETW(req.wLength, 1); 261 262 return usbd_do_request(sc->sc_udev, &req, data); 263 } 264 265 static usbd_status 266 ustir_write_reg(struct ustir_softc *sc, unsigned int reg, u_int8_t data) 267 { 268 usb_device_request_t req; 269 270 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 271 req.bRequest = STIR_CMD_WRITESINGLEREG; 272 USETW(req.wValue, data); 273 USETW(req.wIndex, reg); 274 USETW(req.wLength, 0); 275 276 return usbd_do_request(sc->sc_udev, &req, NULL); 277 } 278 279 #ifdef USTIR_DEBUG 280 static void 281 ustir_dumpdata(u_int8_t const *data, size_t dlen, char const *desc) 282 { 283 size_t bdindex; 284 printf("%s: (%lx)", desc, (unsigned long)dlen); 285 for (bdindex = 0; bdindex < dlen; bdindex++) 286 printf(" %02x", (unsigned int)data[bdindex]); 287 printf("\n"); 288 } 289 #endif 290 291 USB_DECLARE_DRIVER(ustir); 292 293 USB_MATCH(ustir) 294 { 295 USB_MATCH_START(ustir, uaa); 296 297 DPRINTFN(50,("ustir_match\n")); 298 299 if (uaa->iface == NULL) 300 return UMATCH_NONE; 301 302 if (uaa->vendor == USB_VENDOR_SIGMATEL && 303 uaa->product == USB_PRODUCT_SIGMATEL_IRDA) 304 return UMATCH_VENDOR_PRODUCT; 305 306 return UMATCH_NONE; 307 } 308 309 USB_ATTACH(ustir) 310 { 311 USB_ATTACH_START(ustir, sc, uaa); 312 usbd_device_handle dev = uaa->device; 313 usbd_interface_handle iface = uaa->iface; 314 char *devinfop; 315 usb_endpoint_descriptor_t *ed; 316 u_int8_t epcount; 317 int i; 318 struct ir_attach_args ia; 319 320 DPRINTFN(10,("ustir_attach: sc=%p\n", sc)); 321 322 devinfop = usbd_devinfo_alloc(dev, 0); 323 USB_ATTACH_SETUP; 324 printf("%s: %s\n", USBDEVNAME(sc->sc_dev), devinfop); 325 usbd_devinfo_free(devinfop); 326 327 sc->sc_udev = dev; 328 sc->sc_iface = iface; 329 330 epcount = 0; 331 (void)usbd_endpoint_count(iface, &epcount); 332 333 sc->sc_rd_addr = -1; 334 sc->sc_wr_addr = -1; 335 for (i = 0; i < epcount; i++) { 336 ed = usbd_interface2endpoint_descriptor(iface, i); 337 if (ed == NULL) { 338 printf("%s: couldn't get ep %d\n", 339 USBDEVNAME(sc->sc_dev), i); 340 USB_ATTACH_ERROR_RETURN; 341 } 342 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && 343 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { 344 sc->sc_rd_addr = ed->bEndpointAddress; 345 } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && 346 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { 347 sc->sc_wr_addr = ed->bEndpointAddress; 348 } 349 } 350 if (sc->sc_rd_addr == -1 || sc->sc_wr_addr == -1) { 351 printf("%s: missing endpoint\n", USBDEVNAME(sc->sc_dev)); 352 USB_ATTACH_ERROR_RETURN; 353 } 354 355 DPRINTFN(10, ("ustir_attach: %p\n", sc->sc_udev)); 356 357 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, 358 USBDEV(sc->sc_dev)); 359 360 ia.ia_type = IR_TYPE_IRFRAME; 361 ia.ia_methods = &ustir_methods; 362 ia.ia_handle = sc; 363 364 sc->sc_child = config_found(self, &ia, ir_print); 365 366 USB_ATTACH_SUCCESS_RETURN; 367 } 368 369 USB_DETACH(ustir) 370 { 371 USB_DETACH_START(ustir, sc); 372 int s; 373 int rv = 0; 374 375 DPRINTFN(0, ("ustir_detach: sc=%p flags=%d\n", sc, flags)); 376 377 sc->sc_closing = sc->sc_dying = 1; 378 379 wakeup(&sc->sc_thread); 380 381 while (sc->sc_thread != NULL) 382 tsleep(&sc->sc_closing, PWAIT, "usircl", 0); 383 384 /* Abort all pipes. Causes processes waiting for transfer to wake. */ 385 if (sc->sc_rd_pipe != NULL) { 386 usbd_abort_pipe(sc->sc_rd_pipe); 387 usbd_close_pipe(sc->sc_rd_pipe); 388 sc->sc_rd_pipe = NULL; 389 } 390 if (sc->sc_wr_pipe != NULL) { 391 usbd_abort_pipe(sc->sc_wr_pipe); 392 usbd_close_pipe(sc->sc_wr_pipe); 393 sc->sc_wr_pipe = NULL; 394 } 395 wakeup(&sc->sc_ur_framelen); 396 wakeup(&sc->sc_wr_buf); 397 398 s = splusb(); 399 if (--sc->sc_refcnt >= 0) { 400 /* Wait for processes to go away. */ 401 usb_detach_wait(USBDEV(sc->sc_dev)); 402 } 403 splx(s); 404 405 if (sc->sc_child != NULL) { 406 rv = config_detach(sc->sc_child, flags); 407 sc->sc_child = NULL; 408 } 409 410 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, 411 USBDEV(sc->sc_dev)); 412 413 return rv; 414 } 415 416 Static void 417 deframe_clear(struct framestate *fstate) 418 { 419 fstate->bufindex = 0; 420 fstate->fsmstate = FSTATE_END_OF_FRAME; 421 fstate->escaped = 0; 422 } 423 424 Static void 425 deframe_init(struct framestate *fstate, struct framedefn const *definition, 426 u_int8_t *buf, size_t buflen) 427 { 428 fstate->definition = definition; 429 fstate->buffer = buf; 430 fstate->buflen = buflen; 431 432 deframe_clear(fstate); 433 } 434 435 Static enum frameresult 436 deframe_process(struct framestate *fstate, u_int8_t const **bptr, size_t *blen) 437 { 438 struct framedefn const *definition; 439 u_int8_t const *cptr; 440 u_int8_t escchr; 441 size_t ibuflen, obufindex, obuflen; 442 enum framefsmstate fsmstate; 443 enum frameresult result; 444 445 cptr = *bptr; 446 fsmstate = fstate->fsmstate; 447 definition = fstate->definition; 448 escchr = definition->esc_byte; 449 obufindex = fstate->bufindex; 450 obuflen = fstate->buflen; 451 ibuflen = *blen; 452 453 while (ibuflen-- > 0) { 454 u_int8_t chr; 455 456 chr = *cptr++; 457 458 if (fstate->escaped) { 459 fstate->escaped = 0; 460 chr ^= definition->esc_xor; 461 } else if (chr == escchr) { 462 fstate->escaped = 1; 463 continue; 464 } 465 466 switch (fsmstate) { 467 case FSTATE_IN_DATA: 468 if (chr == definition->eof_byte) { 469 fsmstate = FSTATE_IN_END; 470 fstate->state_index = definition->eof_count; 471 goto state_in_end; 472 } 473 if (obufindex >= obuflen) { 474 result = FR_BUFFEROVERRUN; 475 fsmstate = FSTATE_END_OF_FRAME; 476 goto complete; 477 } 478 fstate->buffer[obufindex++] = chr; 479 break; 480 481 state_in_end: 482 /* FALLTHROUGH */ 483 484 case FSTATE_IN_END: 485 if (--fstate->state_index == 0) { 486 u_int32_t crc; 487 size_t fcslen; 488 489 fsmstate = FSTATE_END_OF_FRAME; 490 491 fcslen = definition->fcs_count; 492 493 if (obufindex < fcslen) { 494 result = FR_FRAMEMALFORMED; 495 goto complete; 496 } 497 498 crc = definition-> 499 fcs_calc(definition->fcs_init, 500 fstate->buffer, obufindex); 501 502 /* Remove check bytes from buffer length */ 503 obufindex -= fcslen; 504 505 if (crc == definition->fcs_correct) 506 result = FR_FRAMEOK; 507 else 508 result = FR_FRAMEBADFCS; 509 510 goto complete; 511 } 512 break; 513 514 case FSTATE_END_OF_FRAME: 515 if (chr != definition->bof_byte) 516 break; 517 518 fsmstate = FSTATE_START_OF_FRAME; 519 fstate->state_index = definition->bof_count; 520 /* FALLTHROUGH */ 521 case FSTATE_START_OF_FRAME: 522 if (--fstate->state_index == 0) { 523 fsmstate = FSTATE_IN_DATA; 524 obufindex = 0; 525 } 526 break; 527 } 528 } 529 530 result = (fsmstate == FSTATE_END_OF_FRAME) ? FR_IDLE : FR_INPROGRESS; 531 532 complete: 533 fstate->bufindex = obufindex; 534 fstate->fsmstate = fsmstate; 535 *blen = ibuflen; 536 537 return result; 538 } 539 540 /* Returns 0 if more data required, 1 if a complete frame was extracted */ 541 static int 542 deframe_rd_ur(struct ustir_softc *sc) 543 { 544 while (sc->sc_rd_index < sc->sc_rd_count) { 545 u_int8_t const *buf; 546 size_t buflen; 547 enum frameresult fresult; 548 549 buf = &sc->sc_rd_buf[sc->sc_rd_index]; 550 buflen = sc->sc_rd_count - sc->sc_rd_index; 551 552 fresult = deframe_process(&sc->sc_framestate, &buf, &buflen); 553 554 sc->sc_rd_index = sc->sc_rd_count - buflen; 555 556 DPRINTFN(1,("%s: result=%d\n", __func__, (int)fresult)); 557 558 switch (fresult) { 559 case FR_IDLE: 560 case FR_INPROGRESS: 561 case FR_FRAMEBADFCS: 562 case FR_FRAMEMALFORMED: 563 case FR_BUFFEROVERRUN: 564 break; 565 case FR_FRAMEOK: 566 sc->sc_ur_framelen = sc->sc_framestate.bufindex; 567 wakeup(&sc->sc_ur_framelen); /* XXX should use flag */ 568 selnotify(&sc->sc_rd_sel, 0); 569 return 1; 570 } 571 } 572 573 /* Reset indices into USB-side buffer */ 574 sc->sc_rd_index = sc->sc_rd_count = 0; 575 576 return 0; 577 } 578 579 /* 580 * Direction transitions: 581 * 582 * ustir_periodic() can switch the direction from: 583 * 584 * output -> idle 585 * output -> stalled 586 * stalled -> idle 587 * idle -> input 588 * 589 * ustir_rd_cb() can switch the direction from: 590 * 591 * input -> stalled 592 * input -> idle 593 * 594 * ustir_write() can switch the direction from: 595 * 596 * idle -> output 597 */ 598 Static void 599 ustir_periodic(struct ustir_softc *sc) 600 { 601 DPRINTFN(60, ("%s: direction = %d\n", 602 __func__, sc->sc_direction)); 603 604 if (sc->sc_direction == udir_output || 605 sc->sc_direction == udir_stalled) { 606 usbd_status err; 607 u_int8_t regval; 608 609 DPRINTFN(60, ("%s: reading status register\n", 610 __func__)); 611 612 err = ustir_read_reg(sc, STIR_REG_STATUS, 613 ®val); 614 if (err != USBD_NORMAL_COMPLETION) { 615 printf("%s: status register read failed: %s\n", 616 USBDEVNAME(sc->sc_dev), 617 usbd_errstr(err)); 618 } else { 619 DPRINTFN(10, ("%s: status register = 0x%x\n", 620 __func__, 621 (unsigned int)regval)); 622 if (sc->sc_direction == udir_output && 623 !(regval & STIR_RSTATUS_FFDIR)) 624 /* Output has completed */ 625 sc->sc_direction = udir_idle; 626 if (regval & STIR_RSTATUS_FFOVER) { 627 /* 628 * On an overrun the FIFO hangs, and 629 * any data bulk transfers will stall. 630 * Reset the FIFO. 631 */ 632 sc->sc_direction = udir_stalled; 633 634 DPRINTFN(10, ("%s: clearing FIFO error\n", 635 __func__)); 636 637 err = ustir_write_reg(sc, STIR_REG_STATUS, 638 STIR_RSTATUS_FFCLR); 639 /* XXX if we fail partway through 640 * this, we may not recover? */ 641 if (err == USBD_NORMAL_COMPLETION) 642 err = ustir_write_reg(sc, 643 STIR_REG_STATUS, 644 0); 645 if (err != USBD_NORMAL_COMPLETION) { 646 printf("%s: FIFO reset failed: %s\n", 647 USBDEVNAME(sc->sc_dev), 648 usbd_errstr(err)); 649 } else { 650 /* FIFO reset */ 651 sc->sc_direction = udir_idle; 652 } 653 } 654 } 655 } 656 657 if (sc->sc_wr_stalewrite && sc->sc_direction == udir_idle) { 658 /* 659 * In a stale write case, we need to check if the 660 * write has completed. Once that has happened, the 661 * write is no longer stale. 662 * 663 * But note that we may immediately start a read poll... 664 */ 665 sc->sc_wr_stalewrite = 0; 666 wakeup(&sc->sc_wr_buf); 667 } 668 669 if (!sc->sc_rd_readinprogress && 670 (sc->sc_direction == udir_idle || 671 sc->sc_direction == udir_input)) 672 /* Do a read poll if appropriate... */ 673 ustir_start_read(sc); 674 } 675 676 Static void 677 ustir_thread(void *arg) 678 { 679 struct ustir_softc *sc = arg; 680 681 DPRINTFN(20, ("%s: starting polling thread\n", __func__)); 682 683 while (!sc->sc_closing) { 684 if (!sc->sc_rd_readinprogress && !USTIR_BLOCK_RX_DATA(sc)) 685 ustir_periodic(sc); 686 687 if (!sc->sc_closing) { 688 int error; 689 error = tsleep(&sc->sc_thread, PWAIT, 690 "ustir", hz / 10); 691 if (error == EWOULDBLOCK && 692 sc->sc_rd_expectdataticks > 0) 693 /* 694 * After a timeout decrement the tick 695 * counter within which time we expect 696 * data to arrive if we are receiving 697 * data... 698 */ 699 sc->sc_rd_expectdataticks--; 700 } 701 } 702 703 DPRINTFN(20, ("%s: exiting polling thread\n", __func__)); 704 705 sc->sc_thread = NULL; 706 707 wakeup(&sc->sc_closing); 708 709 if (--sc->sc_refcnt < 0) 710 usb_detach_wakeup(USBDEV(sc->sc_dev)); 711 712 kthread_exit(0); 713 } 714 715 Static void 716 ustir_rd_cb(usbd_xfer_handle xfer, usbd_private_handle priv, 717 usbd_status status) 718 { 719 struct ustir_softc *sc = priv; 720 u_int32_t size; 721 722 DPRINTFN(60, ("%s: sc=%p\n", __func__, sc)); 723 724 /* Read is no longer in progress */ 725 sc->sc_rd_readinprogress = 0; 726 727 if (status == USBD_CANCELLED || sc->sc_closing) /* this is normal */ 728 return; 729 if (status) { 730 size = 0; 731 sc->sc_rd_err = 1; 732 733 if (sc->sc_direction == udir_input || 734 sc->sc_direction == udir_idle) { 735 /* 736 * Receive error, probably need to clear error 737 * condition. 738 */ 739 sc->sc_direction = udir_stalled; 740 } 741 } else { 742 usbd_get_xfer_status(xfer, NULL, NULL, &size, NULL); 743 } 744 745 sc->sc_rd_index = 0; 746 sc->sc_rd_count = size; 747 748 DPRINTFN(((size > 0 || sc->sc_rd_err != 0) ? 20 : 60), 749 ("%s: sc=%p size=%u, err=%d\n", __func__, 750 sc, size, sc->sc_rd_err)); 751 752 #ifdef USTIR_DEBUG 753 if (ustirdebug >= 20 && size > 0) 754 ustir_dumpdata(sc->sc_rd_buf, size, __func__); 755 #endif 756 757 if (!deframe_rd_ur(sc)) { 758 if (!deframe_isclear(&sc->sc_framestate) && size == 0 && 759 sc->sc_rd_expectdataticks == 0) { 760 /* 761 * Expected data, but didn't get it 762 * within expected time... 763 */ 764 DPRINTFN(5,("%s: incoming packet timeout\n", 765 __func__)); 766 deframe_clear(&sc->sc_framestate); 767 } else if (size > 0) { 768 /* 769 * If we also received actual data, reset the 770 * data read timeout and wake up the possibly 771 * sleeping thread... 772 */ 773 sc->sc_rd_expectdataticks = 2; 774 wakeup(&sc->sc_thread); 775 } 776 } 777 778 /* 779 * Check if incoming data has stopped, or that we cannot 780 * safely read any more data. In the case of the latter we 781 * must switch to idle so that a write will not block... 782 */ 783 if (sc->sc_direction == udir_input && 784 ((size == 0 && sc->sc_rd_expectdataticks == 0) || 785 USTIR_BLOCK_RX_DATA(sc))) { 786 DPRINTFN(8,("%s: idling on packet timeout, " 787 "complete frame, or no data\n", __func__)); 788 sc->sc_direction = udir_idle; 789 790 /* Wake up for possible output */ 791 wakeup(&sc->sc_wr_buf); 792 selnotify(&sc->sc_wr_sel, 0); 793 } 794 } 795 796 Static usbd_status 797 ustir_start_read(struct ustir_softc *sc) 798 { 799 usbd_status err; 800 801 DPRINTFN(60,("%s: sc=%p, size=%d\n", __func__, sc, 802 sc->sc_params.maxsize)); 803 804 if (sc->sc_dying) 805 return USBD_IOERROR; 806 807 if (USTIR_BLOCK_RX_DATA(sc) || deframe_rd_ur(sc)) { 808 /* 809 * Can't start reading just yet. Since we aren't 810 * going to start a read, have to switch direction to 811 * idle. 812 */ 813 sc->sc_direction = udir_idle; 814 return USBD_NORMAL_COMPLETION; 815 } 816 817 /* Starting a read... */ 818 sc->sc_rd_readinprogress = 1; 819 sc->sc_direction = udir_input; 820 821 if (sc->sc_rd_err) { 822 sc->sc_rd_err = 0; 823 DPRINTFN(0, ("%s: clear stall\n", __func__)); 824 usbd_clear_endpoint_stall(sc->sc_rd_pipe); 825 } 826 827 usbd_setup_xfer(sc->sc_rd_xfer, sc->sc_rd_pipe, sc, sc->sc_rd_buf, 828 sc->sc_params.maxsize, 829 USBD_SHORT_XFER_OK | USBD_NO_COPY, 830 USBD_NO_TIMEOUT, ustir_rd_cb); 831 err = usbd_transfer(sc->sc_rd_xfer); 832 if (err != USBD_IN_PROGRESS) { 833 DPRINTFN(0, ("%s: err=%d\n", __func__, (int)err)); 834 return err; 835 } 836 return USBD_NORMAL_COMPLETION; 837 } 838 839 Static int 840 ustir_activate(device_ptr_t self, enum devact act) 841 { 842 struct ustir_softc *sc = (struct ustir_softc *)self; 843 int error = 0; 844 845 switch (act) { 846 case DVACT_ACTIVATE: 847 return EOPNOTSUPP; 848 849 case DVACT_DEACTIVATE: 850 sc->sc_dying = 1; 851 if (sc->sc_child != NULL) 852 error = config_deactivate(sc->sc_child); 853 break; 854 } 855 return error; 856 } 857 858 /* ARGSUSED */ 859 Static int 860 ustir_open(void *h, int flag __unused, int mode __unused, 861 struct lwp *l __unused) 862 { 863 struct ustir_softc *sc = h; 864 int error; 865 usbd_status err; 866 867 DPRINTFN(0, ("%s: sc=%p\n", __func__, sc)); 868 869 err = usbd_open_pipe(sc->sc_iface, sc->sc_rd_addr, 0, &sc->sc_rd_pipe); 870 if (err != USBD_NORMAL_COMPLETION) { 871 error = EIO; 872 goto bad1; 873 } 874 err = usbd_open_pipe(sc->sc_iface, sc->sc_wr_addr, 0, &sc->sc_wr_pipe); 875 if (err != USBD_NORMAL_COMPLETION) { 876 error = EIO; 877 goto bad2; 878 } 879 sc->sc_rd_xfer = usbd_alloc_xfer(sc->sc_udev); 880 if (sc->sc_rd_xfer == NULL) { 881 error = ENOMEM; 882 goto bad3; 883 } 884 sc->sc_wr_xfer = usbd_alloc_xfer(sc->sc_udev); 885 if (sc->sc_wr_xfer == NULL) { 886 error = ENOMEM; 887 goto bad4; 888 } 889 sc->sc_rd_buf = usbd_alloc_buffer(sc->sc_rd_xfer, 890 IRDA_MAX_FRAME_SIZE); 891 if (sc->sc_rd_buf == NULL) { 892 error = ENOMEM; 893 goto bad5; 894 } 895 sc->sc_wr_buf = usbd_alloc_buffer(sc->sc_wr_xfer, 896 IRDA_MAX_FRAME_SIZE + STIR_OUTPUT_HEADER_SIZE); 897 if (sc->sc_wr_buf == NULL) { 898 error = ENOMEM; 899 goto bad5; 900 } 901 sc->sc_ur_buf = malloc(IRDA_MAX_FRAME_SIZE, M_USBDEV, M_NOWAIT); 902 if (sc->sc_ur_buf == NULL) { 903 error = ENOMEM; 904 goto bad5; 905 } 906 907 sc->sc_rd_index = sc->sc_rd_count = 0; 908 sc->sc_closing = 0; 909 sc->sc_rd_readinprogress = 0; 910 sc->sc_rd_expectdataticks = 0; 911 sc->sc_ur_framelen = 0; 912 sc->sc_rd_err = 0; 913 sc->sc_wr_stalewrite = 0; 914 sc->sc_speedrec = NULL; 915 sc->sc_direction = udir_idle; 916 sc->sc_params.speed = 0; 917 sc->sc_params.ebofs = 0; 918 sc->sc_params.maxsize = IRDA_MAX_FRAME_SIZE; 919 920 deframe_init(&sc->sc_framestate, &framedef_sir, sc->sc_ur_buf, 921 IRDA_MAX_FRAME_SIZE); 922 923 error = kthread_create1(ustir_thread, sc, &sc->sc_thread, "%s", 924 sc->sc_dev.dv_xname); 925 if (error) 926 goto bad5; 927 /* Increment reference for thread */ 928 sc->sc_refcnt++; 929 930 return 0; 931 932 bad5: 933 usbd_free_xfer(sc->sc_wr_xfer); 934 sc->sc_wr_xfer = NULL; 935 bad4: 936 usbd_free_xfer(sc->sc_rd_xfer); 937 sc->sc_rd_xfer = NULL; 938 bad3: 939 usbd_close_pipe(sc->sc_wr_pipe); 940 sc->sc_wr_pipe = NULL; 941 bad2: 942 usbd_close_pipe(sc->sc_rd_pipe); 943 sc->sc_rd_pipe = NULL; 944 bad1: 945 return error; 946 } 947 948 /* ARGSUSED */ 949 Static int 950 ustir_close(void *h, int flag __unused, int mode __unused, 951 struct lwp *l __unused) 952 { 953 struct ustir_softc *sc = h; 954 955 DPRINTFN(0, ("%s: sc=%p\n", __func__, sc)); 956 957 sc->sc_refcnt++; 958 959 sc->sc_rd_readinprogress = 1; 960 sc->sc_closing = 1; 961 962 wakeup(&sc->sc_thread); 963 964 while (sc->sc_thread != NULL) 965 tsleep(&sc->sc_closing, PWAIT, "usircl", 0); 966 967 if (sc->sc_rd_pipe != NULL) { 968 usbd_abort_pipe(sc->sc_rd_pipe); 969 usbd_close_pipe(sc->sc_rd_pipe); 970 sc->sc_rd_pipe = NULL; 971 } 972 if (sc->sc_wr_pipe != NULL) { 973 usbd_abort_pipe(sc->sc_wr_pipe); 974 usbd_close_pipe(sc->sc_wr_pipe); 975 sc->sc_wr_pipe = NULL; 976 } 977 if (sc->sc_rd_xfer != NULL) { 978 usbd_free_xfer(sc->sc_rd_xfer); 979 sc->sc_rd_xfer = NULL; 980 sc->sc_rd_buf = NULL; 981 } 982 if (sc->sc_wr_xfer != NULL) { 983 usbd_free_xfer(sc->sc_wr_xfer); 984 sc->sc_wr_xfer = NULL; 985 sc->sc_wr_buf = NULL; 986 } 987 if (sc->sc_ur_buf != NULL) { 988 free(sc->sc_ur_buf, M_USBDEV); 989 sc->sc_ur_buf = NULL; 990 } 991 992 if (--sc->sc_refcnt < 0) 993 usb_detach_wakeup(USBDEV(sc->sc_dev)); 994 995 return 0; 996 } 997 998 /* ARGSUSED */ 999 Static int 1000 ustir_read(void *h, struct uio *uio, int flag __unused) 1001 { 1002 struct ustir_softc *sc = h; 1003 int s; 1004 int error; 1005 u_int uframelen; 1006 1007 DPRINTFN(1,("%s: sc=%p\n", __func__, sc)); 1008 1009 if (sc->sc_dying) 1010 return EIO; 1011 1012 #ifdef DIAGNOSTIC 1013 if (sc->sc_rd_buf == NULL) 1014 return EINVAL; 1015 #endif 1016 1017 sc->sc_refcnt++; 1018 1019 if (!sc->sc_rd_readinprogress && !USTIR_BLOCK_RX_DATA(sc)) 1020 /* Possibly wake up polling thread */ 1021 wakeup(&sc->sc_thread); 1022 1023 do { 1024 s = splusb(); 1025 while (sc->sc_ur_framelen == 0) { 1026 DPRINTFN(5,("%s: calling tsleep()\n", __func__)); 1027 error = tsleep(&sc->sc_ur_framelen, PZERO | PCATCH, 1028 "usirrd", 0); 1029 if (sc->sc_dying) 1030 error = EIO; 1031 if (error) { 1032 splx(s); 1033 DPRINTFN(0, ("%s: tsleep() = %d\n", 1034 __func__, error)); 1035 goto ret; 1036 } 1037 } 1038 splx(s); 1039 1040 uframelen = sc->sc_ur_framelen; 1041 DPRINTFN(1,("%s: sc=%p framelen=%u, hdr=0x%02x\n", 1042 __func__, sc, uframelen, sc->sc_ur_buf[0])); 1043 if (uframelen > uio->uio_resid) 1044 error = EINVAL; 1045 else 1046 error = uiomove(sc->sc_ur_buf, uframelen, uio); 1047 sc->sc_ur_framelen = 0; 1048 1049 if (!deframe_rd_ur(sc) && uframelen > 0) { 1050 /* 1051 * Need to wait for another read to obtain a 1052 * complete frame... If we also obtained 1053 * actual data, wake up the possibly sleeping 1054 * thread immediately... 1055 */ 1056 wakeup(&sc->sc_thread); 1057 } 1058 } while (uframelen == 0); 1059 1060 DPRINTFN(1,("%s: return %d\n", __func__, error)); 1061 1062 ret: 1063 if (--sc->sc_refcnt < 0) 1064 usb_detach_wakeup(USBDEV(sc->sc_dev)); 1065 return error; 1066 } 1067 1068 /* ARGSUSED */ 1069 Static int 1070 ustir_write(void *h, struct uio *uio, int flag __unused) 1071 { 1072 struct ustir_softc *sc = h; 1073 usbd_status err; 1074 u_int32_t wrlen; 1075 int error, sirlength; 1076 u_int8_t *wrbuf; 1077 int s; 1078 1079 DPRINTFN(1,("%s: sc=%p\n", __func__, sc)); 1080 1081 if (sc->sc_dying) 1082 return EIO; 1083 1084 #ifdef DIAGNOSTIC 1085 if (sc->sc_wr_buf == NULL) 1086 return EINVAL; 1087 #endif 1088 1089 wrlen = uio->uio_resid; 1090 if (wrlen > sc->sc_params.maxsize) 1091 return EINVAL; 1092 1093 sc->sc_refcnt++; 1094 1095 if (!USTIR_BLOCK_RX_DATA(sc)) { 1096 /* 1097 * If reads are not blocked, determine what action we 1098 * should potentially take... 1099 */ 1100 if (sc->sc_direction == udir_output) { 1101 /* 1102 * If the last operation was an output, wait for the 1103 * polling thread to check for incoming data. 1104 */ 1105 sc->sc_wr_stalewrite = 1; 1106 wakeup(&sc->sc_thread); 1107 } else if (!sc->sc_rd_readinprogress && 1108 (sc->sc_direction == udir_idle || 1109 sc->sc_direction == udir_input)) { 1110 /* If idle, check for input before outputting */ 1111 ustir_start_read(sc); 1112 } 1113 } 1114 1115 s = splusb(); 1116 while (sc->sc_wr_stalewrite || 1117 (sc->sc_direction != udir_output && 1118 sc->sc_direction != udir_idle)) { 1119 DPRINTFN(5, ("%s: sc=%p stalewrite=%d direction=%d, " 1120 "calling tsleep()\n", __func__, 1121 sc, sc->sc_wr_stalewrite, sc->sc_direction)); 1122 error = tsleep(&sc->sc_wr_buf, PZERO | PCATCH, 1123 "usirwr", 0); 1124 if (sc->sc_dying) 1125 error = EIO; 1126 if (error) { 1127 splx(s); 1128 DPRINTFN(0, ("%s: tsleep() = %d\n", __func__, 1129 error)); 1130 goto ret; 1131 } 1132 } 1133 splx(s); 1134 1135 wrbuf = sc->sc_wr_buf; 1136 1137 /* Build header */ 1138 wrbuf[0] = STIR_OUTPUT_HEADER_BYTE0; 1139 wrbuf[1] = STIR_OUTPUT_HEADER_BYTE1; 1140 1141 sirlength = irda_sir_frame(&wrbuf[STIR_OUTPUT_HEADER_SIZE], 1142 MAX_USTIR_OUTPUT_FRAME - 1143 STIR_OUTPUT_HEADER_SIZE, 1144 uio, sc->sc_params.ebofs); 1145 if (sirlength < 0) { 1146 error = -sirlength; 1147 } else { 1148 u_int32_t btlen; 1149 1150 DPRINTFN(1, ("%s: transfer %u bytes\n", __func__, 1151 (unsigned int)wrlen)); 1152 1153 wrbuf[2] = sirlength & 0xff; 1154 wrbuf[3] = (sirlength >> 8) & 0xff; 1155 1156 btlen = STIR_OUTPUT_HEADER_SIZE + sirlength; 1157 1158 sc->sc_direction = udir_output; 1159 1160 #ifdef USTIR_DEBUG 1161 if (ustirdebug >= 20) 1162 ustir_dumpdata(wrbuf, btlen, __func__); 1163 #endif 1164 1165 err = usbd_bulk_transfer(sc->sc_wr_xfer, sc->sc_wr_pipe, 1166 USBD_FORCE_SHORT_XFER | USBD_NO_COPY, 1167 USTIR_WR_TIMEOUT, 1168 wrbuf, &btlen, "ustiwr"); 1169 DPRINTFN(2, ("%s: err=%d\n", __func__, err)); 1170 if (err != USBD_NORMAL_COMPLETION) { 1171 if (err == USBD_INTERRUPTED) 1172 error = EINTR; 1173 else if (err == USBD_TIMEOUT) 1174 error = ETIMEDOUT; 1175 else 1176 error = EIO; 1177 } else { 1178 error = 0; 1179 } 1180 } 1181 1182 ret: 1183 if (--sc->sc_refcnt < 0) 1184 usb_detach_wakeup(USBDEV(sc->sc_dev)); 1185 1186 DPRINTFN(1,("%s: sc=%p done\n", __func__, sc)); 1187 return error; 1188 } 1189 1190 Static int 1191 ustir_poll(void *h, int events, struct lwp *l) 1192 { 1193 struct ustir_softc *sc = h; 1194 int revents = 0; 1195 1196 DPRINTFN(1,("%s: sc=%p\n", __func__, sc)); 1197 1198 if (events & (POLLOUT | POLLWRNORM)) { 1199 if (sc->sc_direction != udir_input) { 1200 revents |= events & (POLLOUT | POLLWRNORM); 1201 } else { 1202 DPRINTFN(2,("%s: recording write select\n", 1203 __func__)); 1204 selrecord(l, &sc->sc_wr_sel); 1205 } 1206 } 1207 1208 if (events & (POLLIN | POLLRDNORM)) { 1209 if (sc->sc_ur_framelen != 0) { 1210 DPRINTFN(2,("%s: have data\n", __func__)); 1211 revents |= events & (POLLIN | POLLRDNORM); 1212 } else { 1213 DPRINTFN(2,("%s: recording read select\n", 1214 __func__)); 1215 selrecord(l, &sc->sc_rd_sel); 1216 } 1217 } 1218 1219 return revents; 1220 } 1221 1222 static void 1223 filt_ustirrdetach(struct knote *kn) 1224 { 1225 struct ustir_softc *sc = kn->kn_hook; 1226 int s; 1227 1228 s = splusb(); 1229 SLIST_REMOVE(&sc->sc_rd_sel.sel_klist, kn, knote, kn_selnext); 1230 splx(s); 1231 } 1232 1233 /* ARGSUSED */ 1234 static int 1235 filt_ustirread(struct knote *kn, long hint __unused) 1236 { 1237 struct ustir_softc *sc = kn->kn_hook; 1238 1239 kn->kn_data = sc->sc_ur_framelen; 1240 return (kn->kn_data > 0); 1241 } 1242 1243 static void 1244 filt_ustirwdetach(struct knote *kn) 1245 { 1246 struct ustir_softc *sc = kn->kn_hook; 1247 int s; 1248 1249 s = splusb(); 1250 SLIST_REMOVE(&sc->sc_wr_sel.sel_klist, kn, knote, kn_selnext); 1251 splx(s); 1252 } 1253 1254 /* ARGSUSED */ 1255 static int 1256 filt_ustirwrite(struct knote *kn, long hint __unused) 1257 { 1258 struct ustir_softc *sc = kn->kn_hook; 1259 1260 kn->kn_data = 0; 1261 return (sc->sc_direction != udir_input); 1262 } 1263 1264 static const struct filterops ustirread_filtops = 1265 { 1, NULL, filt_ustirrdetach, filt_ustirread }; 1266 static const struct filterops ustirwrite_filtops = 1267 { 1, NULL, filt_ustirwdetach, filt_ustirwrite }; 1268 1269 Static int 1270 ustir_kqfilter(void *h, struct knote *kn) 1271 { 1272 struct ustir_softc *sc = h; 1273 struct klist *klist; 1274 int s; 1275 1276 switch (kn->kn_filter) { 1277 case EVFILT_READ: 1278 klist = &sc->sc_rd_sel.sel_klist; 1279 kn->kn_fop = &ustirread_filtops; 1280 break; 1281 case EVFILT_WRITE: 1282 klist = &sc->sc_wr_sel.sel_klist; 1283 kn->kn_fop = &ustirwrite_filtops; 1284 break; 1285 default: 1286 return (1); 1287 } 1288 1289 kn->kn_hook = sc; 1290 1291 s = splusb(); 1292 SLIST_INSERT_HEAD(klist, kn, kn_selnext); 1293 splx(s); 1294 1295 return (0); 1296 } 1297 1298 #ifdef USTIR_DEBUG_IOCTLS 1299 Static int ustir_ioctl(void *h, u_long cmd, caddr_t addr, int flag, struct lwp *l) 1300 { 1301 struct ustir_softc *sc = h; 1302 int error; 1303 unsigned int regnum; 1304 usbd_status err; 1305 u_int8_t regdata; 1306 1307 if (sc->sc_dying) 1308 return EIO; 1309 1310 sc->sc_refcnt++; 1311 1312 error = 0; 1313 switch (cmd) { 1314 case USTIR_READ_REGISTER: 1315 regnum = *(unsigned int *)addr; 1316 1317 if (regnum > STIR_MAX_REG) { 1318 error = EINVAL; 1319 break; 1320 } 1321 1322 err = ustir_read_reg(sc, regnum, ®data); 1323 1324 DPRINTFN(10, ("%s: regget(%u) = 0x%x\n", __func__, 1325 regnum, (unsigned int)regdata)); 1326 1327 *(unsigned int *)addr = regdata; 1328 if (err != USBD_NORMAL_COMPLETION) { 1329 printf("%s: register read failed: %s\n", 1330 USBDEVNAME(sc->sc_dev), 1331 usbd_errstr(err)); 1332 error = EIO; 1333 } 1334 break; 1335 1336 case USTIR_WRITE_REGISTER: 1337 regnum = *(unsigned int *)addr; 1338 regdata = (regnum >> 8) & 0xff; 1339 regnum = regnum & 0xff; 1340 1341 if (regnum > STIR_MAX_REG) { 1342 error = EINVAL; 1343 break; 1344 } 1345 1346 DPRINTFN(10, ("%s: regset(%u, 0x%x)\n", __func__, 1347 regnum, (unsigned int)regdata)); 1348 1349 err = ustir_write_reg(sc, regnum, regdata); 1350 if (err != USBD_NORMAL_COMPLETION) { 1351 printf("%s: register write failed: %s\n", 1352 USBDEVNAME(sc->sc_dev), 1353 usbd_errstr(err)); 1354 error = EIO; 1355 } 1356 break; 1357 1358 case USTIR_DEBUG_LEVEL: 1359 #ifdef USTIR_DEBUG 1360 ustirdebug = *(int *)addr; 1361 #endif 1362 break; 1363 1364 case USTIR_DEBUG_OPERATION: 1365 break; 1366 1367 default: 1368 error = EINVAL; 1369 break; 1370 } 1371 1372 if (--sc->sc_refcnt < 0) 1373 usb_detach_wakeup(USBDEV(sc->sc_dev)); 1374 1375 return error; 1376 } 1377 #endif 1378 1379 Static int 1380 ustir_set_params(void *h, struct irda_params *p) 1381 { 1382 struct ustir_softc *sc = h; 1383 struct ustir_speedrec const *speedblk; 1384 int i; 1385 1386 DPRINTFN(0, ("%s: sc=%p, speed=%d ebofs=%d maxsize=%d\n", __func__, 1387 sc, p->speed, p->ebofs, p->maxsize)); 1388 1389 if (sc->sc_dying) 1390 return EIO; 1391 1392 speedblk = NULL; 1393 1394 if (sc->sc_speedrec == NULL || p->speed != sc->sc_speedrec->speed) { 1395 /* find speed */ 1396 for (i = 0; i < USTIR_NSPEEDS; i++) { 1397 if (ustir_speeds[i].speed == p->speed) { 1398 speedblk = &ustir_speeds[i]; 1399 goto found2; 1400 } 1401 } 1402 /* no good value found */ 1403 return EINVAL; 1404 found2: 1405 ; 1406 } 1407 if (p->maxsize != sc->sc_params.maxsize) { 1408 if (p->maxsize > IRDA_MAX_FRAME_SIZE) 1409 return EINVAL; 1410 sc->sc_params.maxsize = p->maxsize; 1411 } 1412 1413 sc->sc_params = *p; 1414 1415 if (speedblk != NULL) { 1416 usbd_status err; 1417 u_int8_t regmode; 1418 u_int8_t regbrate; 1419 1420 sc->sc_speedrec = speedblk; 1421 1422 regmode = STIR_BRMODE_MODEREG(speedblk->config); 1423 regbrate = STIR_BRMODE_BRATEREG(speedblk->config); 1424 1425 /* 1426 * FFSPRST must be set to enable the FIFO. 1427 */ 1428 regmode |= STIR_RMODE_FFSPRST; 1429 1430 DPRINTFN(10, ("%s: setting BRATE = %x\n", __func__, 1431 (unsigned int)regbrate)); 1432 err = ustir_write_reg(sc, STIR_REG_BRATE, regbrate); 1433 if (err == USBD_NORMAL_COMPLETION) { 1434 DPRINTFN(10, ("%s: setting MODE = %x\n", __func__, 1435 (unsigned int)regmode)); 1436 err = ustir_write_reg(sc, STIR_REG_MODE, regmode); 1437 } 1438 if (err != USBD_NORMAL_COMPLETION) { 1439 DPRINTFN(10, ("%s: error setting register: %s\n", 1440 __func__, usbd_errstr(err))); 1441 return EIO; 1442 } 1443 } 1444 1445 return 0; 1446 } 1447 1448 Static int 1449 ustir_get_speeds(void *h, int *speeds) 1450 { 1451 struct ustir_softc *sc = h; 1452 1453 DPRINTFN(0, ("%s: sc=%p\n", __func__, sc)); 1454 1455 if (sc->sc_dying) 1456 return EIO; 1457 1458 /* All these speeds are supported */ 1459 *speeds = IRDA_SPEED_4000000 | 1460 IRDA_SPEED_1152000 | 1461 IRDA_SPEED_576000 | 1462 IRDA_SPEED_115200 | 1463 IRDA_SPEED_57600 | 1464 IRDA_SPEED_38400 | 1465 IRDA_SPEED_19200 | 1466 IRDA_SPEED_9600 | 1467 IRDA_SPEED_2400; 1468 1469 return 0; 1470 } 1471 1472 Static int 1473 ustir_get_turnarounds(void *h, int *turnarounds) 1474 { 1475 struct ustir_softc *sc = h; 1476 1477 DPRINTFN(0, ("%s: sc=%p\n", __func__, sc)); 1478 1479 if (sc->sc_dying) 1480 return EIO; 1481 1482 /* 1483 * Documentation is on the light side with respect to 1484 * turnaround time for this device. 1485 */ 1486 *turnarounds = IRDA_TURNT_10000; 1487 1488 return 0; 1489 } 1490