ibfoo.c (141768) | ibfoo.c (141777) |
---|---|
1/*- 2 * Copyright (c) 2005 Poul-Henning Kamp <phk@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 14 unchanged lines hidden (view full) --- 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * High-level driver for �PD7210 based GPIB cards. 27 * 28 */ 29 30#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2005 Poul-Henning Kamp <phk@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 14 unchanged lines hidden (view full) --- 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * High-level driver for �PD7210 based GPIB cards. 27 * 28 */ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/dev/ieee488/ibfoo.c 141768 2005-02-12 21:07:09Z phk $"); | 31__FBSDID("$FreeBSD: head/sys/dev/ieee488/ibfoo.c 141777 2005-02-12 23:52:44Z phk $"); |
32 33# define IBDEBUG 34# undef IBDEBUG 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/conf.h> 39#include <sys/malloc.h> --- 16 unchanged lines hidden (view full) --- 56 57static MALLOC_DEFINE(M_IBFOO, "IBFOO", "IBFOO"); 58 59 60/* ibfoo API */ 61 62#include <dev/ieee488/ibfoo_int.h> 63 | 32 33# define IBDEBUG 34# undef IBDEBUG 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/conf.h> 39#include <sys/malloc.h> --- 16 unchanged lines hidden (view full) --- 56 57static MALLOC_DEFINE(M_IBFOO, "IBFOO", "IBFOO"); 58 59 60/* ibfoo API */ 61 62#include <dev/ieee488/ibfoo_int.h> 63 |
64/* XXX: This is really a bitmap */ 65enum h_kind { 66 H_DEV = 1, 67 H_BOARD = 2, 68 H_EITHER = 3 69}; 70 |
|
64struct handle { 65 LIST_ENTRY(handle) list; 66 int handle; | 71struct handle { 72 LIST_ENTRY(handle) list; 73 int handle; |
74 enum h_kind kind; |
|
67 int pad; 68 int sad; 69 struct timeval timeout; 70 int eot; 71 int eos; 72 int dma; 73}; 74 --- 144 unchanged lines hidden (view full) --- 219 struct upd7210 *u; 220 struct ibfoo *ib; 221 struct timeval tv; 222 223 u = arg; 224 ib = u->ibfoo; 225 mtx_lock(&u->mutex); 226 if (ib->mode == DMA_IDATA && isa_dmatc(u->dmachan)) { | 75 int pad; 76 int sad; 77 struct timeval timeout; 78 int eot; 79 int eos; 80 int dma; 81}; 82 --- 144 unchanged lines hidden (view full) --- 227 struct upd7210 *u; 228 struct ibfoo *ib; 229 struct timeval tv; 230 231 u = arg; 232 ib = u->ibfoo; 233 mtx_lock(&u->mutex); 234 if (ib->mode == DMA_IDATA && isa_dmatc(u->dmachan)) { |
235 KASSERT(u->dmachan >= 0, ("Bogus dmachan = %d", u->dmachan)); |
|
227 upd7210_wr(u, IMR1, 0); 228 upd7210_wr(u, IMR2, 0); 229 ib->mode = IDLE; 230 wakeup(&ib->buflen); 231 } 232 if (ib->mode > BUSY) { 233 upd7210_rd(u, ISR1); 234 upd7210_rd(u, ISR2); --- 147 unchanged lines hidden (view full) --- 382} 383 384static int 385dma_idata(struct upd7210 *u, u_char *data, int len) 386{ 387 int j; 388 struct ibfoo *ib; 389 | 236 upd7210_wr(u, IMR1, 0); 237 upd7210_wr(u, IMR2, 0); 238 ib->mode = IDLE; 239 wakeup(&ib->buflen); 240 } 241 if (ib->mode > BUSY) { 242 upd7210_rd(u, ISR1); 243 upd7210_rd(u, ISR2); --- 147 unchanged lines hidden (view full) --- 391} 392 393static int 394dma_idata(struct upd7210 *u, u_char *data, int len) 395{ 396 int j; 397 struct ibfoo *ib; 398 |
399 KASSERT(u->dmachan >= 0, ("Bogus dmachan %d", u->dmachan)); |
|
390 ib = u->ibfoo; 391 ib->mode = DMA_IDATA; 392 mtx_lock(&Giant); 393 isa_dmastart(ISADMA_READ, data, len, u->dmachan); 394 mtx_unlock(&Giant); 395 mtx_lock(&u->mutex); 396 upd7210_wr(u, IMR1, IXR1_ENDRX); 397 upd7210_wr(u, IMR2, IMR2_DMAI); 398 gpib_ib_wait_xfer(u, ib); 399 mtx_unlock(&u->mutex); 400 mtx_lock(&Giant); 401 j = isa_dmastatus(u->dmachan); 402 isa_dmadone(ISADMA_READ, data, len, u->dmachan); 403 mtx_unlock(&Giant); 404 return (len - j); 405} 406 | 400 ib = u->ibfoo; 401 ib->mode = DMA_IDATA; 402 mtx_lock(&Giant); 403 isa_dmastart(ISADMA_READ, data, len, u->dmachan); 404 mtx_unlock(&Giant); 405 mtx_lock(&u->mutex); 406 upd7210_wr(u, IMR1, IXR1_ENDRX); 407 upd7210_wr(u, IMR2, IMR2_DMAI); 408 gpib_ib_wait_xfer(u, ib); 409 mtx_unlock(&u->mutex); 410 mtx_lock(&Giant); 411 j = isa_dmastatus(u->dmachan); 412 isa_dmadone(ISADMA_READ, data, len, u->dmachan); 413 mtx_unlock(&Giant); 414 return (len - j); 415} 416 |
407#define ibask NULL | 417static int 418ib_send_msg(struct ibfoo *ib, int msg) 419{ 420 u_char buf[10]; 421 int i, j; 422 423 i = 0; 424 buf[i++] = UNT; 425 buf[i++] = UNL; 426 buf[i++] = LAD | ib->h->pad; 427 if (ib->h->sad) 428 buf[i++] = LAD | TAD | ib->h->sad; 429 buf[i++] = TAD | 0; 430 buf[i++] = msg; 431 j = pio_cmd(ib->u, buf, i); 432 if (i != j) 433 ib_set_error(ib->ap, EABO); /* XXX ? */ 434 return (0); 435} 436 437static int 438ibask(struct ibfoo *ib) 439{ /* XXX */ 440 441 ibdebug = ib->ap->option; 442 return (0); 443} 444 |
408#define ibbna NULL 409#define ibcac NULL | 445#define ibbna NULL 446#define ibcac NULL |
410#define ibclr NULL | 447 448static int 449ibclr(struct ibfoo *ib) 450{ 451 452 return (ib_send_msg(ib, SDC)); 453} 454 |
411#define ibcmd NULL 412#define ibcmda NULL 413#define ibconfig NULL 414 415static int 416ibdev(struct ibfoo *ib) | 455#define ibcmd NULL 456#define ibcmda NULL 457#define ibconfig NULL 458 459static int 460ibdev(struct ibfoo *ib) |
417{ | 461{ /* TBD */ |
418 struct handle *h; 419 420 h = malloc(sizeof *h, M_IBFOO, M_ZERO | M_WAITOK); 421 h->handle = alloc_unr(ib->unrhdr); | 462 struct handle *h; 463 464 h = malloc(sizeof *h, M_IBFOO, M_ZERO | M_WAITOK); 465 h->handle = alloc_unr(ib->unrhdr); |
466 h->kind = H_DEV; |
|
422 h->pad = ib->ap->pad; 423 h->sad = ib->ap->sad; 424 h->timeout = timeouts[ib->ap->tmo]; 425 h->eot = ib->ap->eot; 426 h->eos = ib->ap->eos; 427 mtx_lock(&ib->u->mutex); 428 LIST_INSERT_HEAD(&ib->handles, h, list); 429 mtx_unlock(&ib->u->mutex); 430 ib->ap->__retval = h->handle; 431 return (0); 432} 433 434#define ibdiag NULL 435 436static int 437ibdma(struct ibfoo *ib) 438{ 439 | 467 h->pad = ib->ap->pad; 468 h->sad = ib->ap->sad; 469 h->timeout = timeouts[ib->ap->tmo]; 470 h->eot = ib->ap->eot; 471 h->eos = ib->ap->eos; 472 mtx_lock(&ib->u->mutex); 473 LIST_INSERT_HEAD(&ib->handles, h, list); 474 mtx_unlock(&ib->u->mutex); 475 ib->ap->__retval = h->handle; 476 return (0); 477} 478 479#define ibdiag NULL 480 481static int 482ibdma(struct ibfoo *ib) 483{ 484 |
485 if (ib->u->dmachan < 0 && ib->ap->v) 486 return (ib_set_error(ib->ap, EARG)); |
|
440 ib->h->dma = ib->ap->v; 441 return (0); 442} 443 444static int 445ibeos(struct ibfoo *ib) 446{ 447 | 487 ib->h->dma = ib->ap->v; 488 return (0); 489} 490 491static int 492ibeos(struct ibfoo *ib) 493{ 494 |
495 ib->ap->__iberr = ib->h->eos; |
|
448 ib->h->eos = ib->ap->eos; 449 if (ib->rdh == ib->h) 450 config_eos(ib->u, ib->h); 451 return (0); 452} 453 454static int 455ibeot(struct ibfoo *ib) --- 5 unchanged lines hidden (view full) --- 461 462#define ibevent NULL 463#define ibfind NULL 464#define ibgts NULL 465#define ibist NULL 466#define iblines NULL 467#define ibllo NULL 468#define ibln NULL | 496 ib->h->eos = ib->ap->eos; 497 if (ib->rdh == ib->h) 498 config_eos(ib->u, ib->h); 499 return (0); 500} 501 502static int 503ibeot(struct ibfoo *ib) --- 5 unchanged lines hidden (view full) --- 509 510#define ibevent NULL 511#define ibfind NULL 512#define ibgts NULL 513#define ibist NULL 514#define iblines NULL 515#define ibllo NULL 516#define ibln NULL |
469#define ibloc NULL 470#define ibonl NULL 471#define ibpad NULL | 517 518static int 519ibloc(struct ibfoo *ib) 520{ /* XXX */ 521 522 if (ib->h->kind == H_BOARD) 523 return (EOPNOTSUPP); /* XXX */ 524 return (ib_send_msg(ib, GTL)); 525} 526 527static int 528ibonl(struct ibfoo *ib) 529{ /* XXX */ 530 531 if (ib->ap->v) 532 return (EOPNOTSUPP); /* XXX */ 533 mtx_lock(&ib->u->mutex); 534 LIST_REMOVE(ib->h, list); 535 mtx_unlock(&ib->u->mutex); 536 free(ib->h, M_IBFOO); 537 ib->h = NULL; 538 return (0); 539} 540 541static int 542ibpad(struct ibfoo *ib) 543{ 544 545 ib->h->pad = ib->ap->pad; 546 return (0); 547} 548 |
472#define ibpct NULL 473#define ibpoke NULL 474#define ibppc NULL 475 476static int 477ibrd(struct ibfoo *ib) | 549#define ibpct NULL 550#define ibpoke NULL 551#define ibppc NULL 552 553static int 554ibrd(struct ibfoo *ib) |
478{ | 555{ /* TBD */ |
479 u_char buf[10], *bp; 480 int i, j, error, bl, bc; 481 u_char *dp; 482 | 556 u_char buf[10], *bp; 557 int i, j, error, bl, bc; 558 u_char *dp; 559 |
560 if (ib->h->kind == H_BOARD) 561 return (EOPNOTSUPP); /* XXX */ |
|
483 bl = ib->ap->cnt; 484 if (bl > PAGE_SIZE) 485 bl = PAGE_SIZE; 486 bp = malloc(bl, M_IBFOO, M_WAITOK); 487 488 if (ib->rdh != ib->h) { 489 i = 0; 490 buf[i++] = UNT; --- 12 unchanged lines hidden (view full) --- 503 bc = ib->ap->cnt; 504 error = 0; 505 while (bc > 0 && ib->ap->__iberr == 0) { 506 j = imin(bc, PAGE_SIZE); 507 if (ib->h->dma) 508 i = dma_idata(ib->u, bp, j); 509 else 510 i = pio_idata(ib->u, bp, j); | 562 bl = ib->ap->cnt; 563 if (bl > PAGE_SIZE) 564 bl = PAGE_SIZE; 565 bp = malloc(bl, M_IBFOO, M_WAITOK); 566 567 if (ib->rdh != ib->h) { 568 i = 0; 569 buf[i++] = UNT; --- 12 unchanged lines hidden (view full) --- 582 bc = ib->ap->cnt; 583 error = 0; 584 while (bc > 0 && ib->ap->__iberr == 0) { 585 j = imin(bc, PAGE_SIZE); 586 if (ib->h->dma) 587 i = dma_idata(ib->u, bp, j); 588 else 589 i = pio_idata(ib->u, bp, j); |
511 if (i <= 0) 512 break; | |
513 error = copyout(bp, dp , i); 514 if (error) 515 break; 516 ib->ap->__ibcnt += i; 517 if (i != j) 518 break; 519 bc -= i; 520 dp += i; --- 4 unchanged lines hidden (view full) --- 525 526#define ibrda NULL 527#define ibrdf NULL 528#define ibrdkey NULL 529#define ibrpp NULL 530#define ibrsc NULL 531#define ibrsp NULL 532#define ibrsv NULL | 590 error = copyout(bp, dp , i); 591 if (error) 592 break; 593 ib->ap->__ibcnt += i; 594 if (i != j) 595 break; 596 bc -= i; 597 dp += i; --- 4 unchanged lines hidden (view full) --- 602 603#define ibrda NULL 604#define ibrdf NULL 605#define ibrdkey NULL 606#define ibrpp NULL 607#define ibrsc NULL 608#define ibrsp NULL 609#define ibrsv NULL |
533#define ibsad NULL | 610 611static int 612ibsad(struct ibfoo *ib) 613{ 614 615 ib->h->sad = ib->ap->sad; 616 return (0); 617} 618 |
534#define ibsgnl NULL | 619#define ibsgnl NULL |
535#define ibsic NULL | 620 621static int 622ibsic(struct ibfoo *ib) 623{ /* TBD */ 624 625 upd7210_wr(ib->u, AUXMR, AUXMR_SIFC); 626 DELAY(100); 627 upd7210_wr(ib->u, AUXMR, AUXMR_CIFC); 628 return (0); 629} 630 |
536#define ibsre NULL 537#define ibsrq NULL 538#define ibstop NULL 539 540static int 541ibtmo(struct ibfoo *ib) 542{ 543 544 ib->h->timeout = timeouts[ib->ap->tmo]; 545 return (0); 546} 547 548#define ibtrap NULL | 631#define ibsre NULL 632#define ibsrq NULL 633#define ibstop NULL 634 635static int 636ibtmo(struct ibfoo *ib) 637{ 638 639 ib->h->timeout = timeouts[ib->ap->tmo]; 640 return (0); 641} 642 643#define ibtrap NULL |
549#define ibtrg NULL | 644 645static int 646ibtrg(struct ibfoo *ib) 647{ 648 649 return (ib_send_msg(ib, GET)); 650} 651 |
550#define ibwait NULL 551 552static int 553ibwrt(struct ibfoo *ib) | 652#define ibwait NULL 653 654static int 655ibwrt(struct ibfoo *ib) |
554{ | 656{ /* XXX */ |
555 u_char buf[10], *bp; 556 int i; 557 | 657 u_char buf[10], *bp; 658 int i; 659 |
660 if (ib->h->kind == H_BOARD) 661 return (EOPNOTSUPP); |
|
558 bp = malloc(ib->ap->cnt, M_IBFOO, M_WAITOK); 559 /* XXX: bigger than PAGE_SIZE handling */ 560 i = copyin(ib->ap->buffer, bp, ib->ap->cnt); 561 if (i) { 562 free(bp, M_IBFOO); 563 return (i); 564 } 565 if (ib->wrh != ib->h) { --- 19 unchanged lines hidden (view full) --- 585 586#define ibwrta NULL 587#define ibwrtf NULL 588#define ibwrtkey NULL 589#define ibxtrc NULL 590 591static struct ibhandler { 592 const char *name; | 662 bp = malloc(ib->ap->cnt, M_IBFOO, M_WAITOK); 663 /* XXX: bigger than PAGE_SIZE handling */ 664 i = copyin(ib->ap->buffer, bp, ib->ap->cnt); 665 if (i) { 666 free(bp, M_IBFOO); 667 return (i); 668 } 669 if (ib->wrh != ib->h) { --- 19 unchanged lines hidden (view full) --- 689 690#define ibwrta NULL 691#define ibwrtf NULL 692#define ibwrtkey NULL 693#define ibxtrc NULL 694 695static struct ibhandler { 696 const char *name; |
697 enum h_kind kind; |
|
593 ibhandler_t *func; 594 u_int args; 595} ibhandlers[] = { | 698 ibhandler_t *func; 699 u_int args; 700} ibhandlers[] = { |
596 [__ID_IBASK] = { "ibask", ibask, __F_HANDLE | __F_OPTION | __F_RETVAL }, 597 [__ID_IBBNA] = { "ibbna", ibbna, __F_HANDLE | __F_BDNAME }, 598 [__ID_IBCAC] = { "ibcac", ibcac, __F_HANDLE | __F_V }, 599 [__ID_IBCLR] = { "ibclr", ibclr, __F_HANDLE }, 600 [__ID_IBCMDA] = { "ibcmda", ibcmda, __F_HANDLE | __F_BUFFER | __F_CNT }, 601 [__ID_IBCMD] = { "ibcmd", ibcmd, __F_HANDLE | __F_BUFFER | __F_CNT }, 602 [__ID_IBCONFIG] = { "ibconfig", ibconfig, __F_HANDLE | __F_OPTION | __F_VALUE }, 603 [__ID_IBDEV] = { "ibdev", ibdev, __F_BOARDID | __F_PAD | __F_SAD | __F_TMO | __F_EOT | __F_EOS }, 604 [__ID_IBDIAG] = { "ibdiag", ibdiag, __F_HANDLE | __F_BUFFER | __F_CNT }, 605 [__ID_IBDMA] = { "ibdma", ibdma, __F_HANDLE | __F_V }, 606 [__ID_IBEOS] = { "ibeos", ibeos, __F_HANDLE | __F_EOS }, 607 [__ID_IBEOT] = { "ibeot", ibeot, __F_HANDLE | __F_EOT }, 608 [__ID_IBEVENT] = { "ibevent", ibevent, __F_HANDLE | __F_EVENT }, 609 [__ID_IBFIND] = { "ibfind", ibfind, __F_BDNAME }, 610 [__ID_IBGTS] = { "ibgts", ibgts, __F_HANDLE | __F_V }, 611 [__ID_IBIST] = { "ibist", ibist, __F_HANDLE | __F_V }, 612 [__ID_IBLINES] = { "iblines", iblines, __F_HANDLE | __F_LINES }, 613 [__ID_IBLLO] = { "ibllo", ibllo, __F_HANDLE }, 614 [__ID_IBLN] = { "ibln", ibln, __F_HANDLE | __F_PADVAL | __F_SADVAL | __F_LISTENFLAG }, 615 [__ID_IBLOC] = { "ibloc", ibloc, __F_HANDLE }, 616 [__ID_IBONL] = { "ibonl", ibonl, __F_HANDLE | __F_V }, 617 [__ID_IBPAD] = { "ibpad", ibpad, __F_HANDLE | __F_V }, 618 [__ID_IBPCT] = { "ibpct", ibpct, __F_HANDLE }, 619 [__ID_IBPOKE] = { "ibpoke", ibpoke, __F_HANDLE | __F_OPTION | __F_VALUE }, 620 [__ID_IBPPC] = { "ibppc", ibppc, __F_HANDLE | __F_V }, 621 [__ID_IBRDA] = { "ibrda", ibrda, __F_HANDLE | __F_BUFFER | __F_CNT }, 622 [__ID_IBRDF] = { "ibrdf", ibrdf, __F_HANDLE | __F_FLNAME }, 623 [__ID_IBRDKEY] = { "ibrdkey", ibrdkey, __F_HANDLE | __F_BUFFER | __F_CNT }, 624 [__ID_IBRD] = { "ibrd", ibrd, __F_HANDLE | __F_BUFFER | __F_CNT }, 625 [__ID_IBRPP] = { "ibrpp", ibrpp, __F_HANDLE | __F_PPR }, 626 [__ID_IBRSC] = { "ibrsc", ibrsc, __F_HANDLE | __F_V }, 627 [__ID_IBRSP] = { "ibrsp", ibrsp, __F_HANDLE | __F_SPR }, 628 [__ID_IBRSV] = { "ibrsv", ibrsv, __F_HANDLE | __F_V }, 629 [__ID_IBSAD] = { "ibsad", ibsad, __F_HANDLE | __F_V }, 630 [__ID_IBSGNL] = { "ibsgnl", ibsgnl, __F_HANDLE | __F_V }, 631 [__ID_IBSIC] = { "ibsic", ibsic, __F_HANDLE }, 632 [__ID_IBSRE] = { "ibsre", ibsre, __F_HANDLE | __F_V }, 633 [__ID_IBSRQ] = { "ibsrq", ibsrq, __F_FUNC }, 634 [__ID_IBSTOP] = { "ibstop", ibstop, __F_HANDLE }, 635 [__ID_IBTMO] = { "ibtmo", ibtmo, __F_HANDLE | __F_TMO }, 636 [__ID_IBTRAP] = { "ibtrap", ibtrap, __F_MASK | __F_MODE }, 637 [__ID_IBTRG] = { "ibtrg", ibtrg, __F_HANDLE }, 638 [__ID_IBWAIT] = { "ibwait", ibwait, __F_HANDLE | __F_MASK }, 639 [__ID_IBWRTA] = { "ibwrta", ibwrta, __F_HANDLE | __F_BUFFER | __F_CNT }, 640 [__ID_IBWRTF] = { "ibwrtf", ibwrtf, __F_HANDLE | __F_FLNAME }, 641 [__ID_IBWRTKEY] = { "ibwrtkey", ibwrtkey, __F_HANDLE | __F_BUFFER | __F_CNT }, 642 [__ID_IBWRT] = { "ibwrt", ibwrt, __F_HANDLE | __F_BUFFER | __F_CNT }, 643 [__ID_IBXTRC] = { "ibxtrc", ibxtrc, __F_HANDLE | __F_BUFFER | __F_CNT }, | 701 [__ID_IBASK] = { "ibask", H_EITHER, ibask, __F_HANDLE | __F_OPTION | __F_RETVAL }, 702 [__ID_IBBNA] = { "ibbna", H_DEV, ibbna, __F_HANDLE | __F_BDNAME }, 703 [__ID_IBCAC] = { "ibcac", H_BOARD, ibcac, __F_HANDLE | __F_V }, 704 [__ID_IBCLR] = { "ibclr", H_DEV, ibclr, __F_HANDLE }, 705 [__ID_IBCMD] = { "ibcmd", H_BOARD, ibcmd, __F_HANDLE | __F_BUFFER | __F_CNT }, 706 [__ID_IBCMDA] = { "ibcmda", H_BOARD, ibcmda, __F_HANDLE | __F_BUFFER | __F_CNT }, 707 [__ID_IBCONFIG] = { "ibconfig", H_EITHER, ibconfig, __F_HANDLE | __F_OPTION | __F_VALUE }, 708 [__ID_IBDEV] = { "ibdev", 0, ibdev, __F_BOARDID | __F_PAD | __F_SAD | __F_TMO | __F_EOT | __F_EOS }, 709 [__ID_IBDIAG] = { "ibdiag", H_EITHER, ibdiag, __F_HANDLE | __F_BUFFER | __F_CNT }, 710 [__ID_IBDMA] = { "ibdma", H_EITHER, ibdma, __F_HANDLE | __F_V }, 711 [__ID_IBEOS] = { "ibeos", H_EITHER, ibeos, __F_HANDLE | __F_EOS }, 712 [__ID_IBEOT] = { "ibeot", H_EITHER, ibeot, __F_HANDLE | __F_EOT }, 713 [__ID_IBEVENT] = { "ibevent", H_BOARD, ibevent, __F_HANDLE | __F_EVENT }, 714 [__ID_IBFIND] = { "ibfind", 0, ibfind, __F_BDNAME }, 715 [__ID_IBGTS] = { "ibgts", H_BOARD, ibgts, __F_HANDLE | __F_V }, 716 [__ID_IBIST] = { "ibist", H_BOARD, ibist, __F_HANDLE | __F_V }, 717 [__ID_IBLINES] = { "iblines", H_BOARD, iblines, __F_HANDLE | __F_LINES }, 718 [__ID_IBLLO] = { "ibllo", H_EITHER, ibllo, __F_HANDLE }, 719 [__ID_IBLN] = { "ibln", H_BOARD, ibln, __F_HANDLE | __F_PADVAL | __F_SADVAL | __F_LISTENFLAG }, 720 [__ID_IBLOC] = { "ibloc", H_EITHER, ibloc, __F_HANDLE }, 721 [__ID_IBONL] = { "ibonl", H_EITHER, ibonl, __F_HANDLE | __F_V }, 722 [__ID_IBPAD] = { "ibpad", H_EITHER, ibpad, __F_HANDLE | __F_PAD }, 723 [__ID_IBPCT] = { "ibpct", H_DEV, ibpct, __F_HANDLE }, 724 [__ID_IBPOKE] = { "ibpoke", H_EITHER, ibpoke, __F_HANDLE | __F_OPTION | __F_VALUE }, 725 [__ID_IBPPC] = { "ibppc", H_EITHER, ibppc, __F_HANDLE | __F_V }, 726 [__ID_IBRD] = { "ibrd", H_EITHER, ibrd, __F_HANDLE | __F_BUFFER | __F_CNT }, 727 [__ID_IBRDA] = { "ibrda", H_EITHER, ibrda, __F_HANDLE | __F_BUFFER | __F_CNT }, 728 [__ID_IBRDF] = { "ibrdf", H_EITHER, ibrdf, __F_HANDLE | __F_FLNAME }, 729 [__ID_IBRDKEY] = { "ibrdkey", H_EITHER, ibrdkey, __F_HANDLE | __F_BUFFER | __F_CNT }, 730 [__ID_IBRPP] = { "ibrpp", H_EITHER, ibrpp, __F_HANDLE | __F_PPR }, 731 [__ID_IBRSC] = { "ibrsc", H_BOARD, ibrsc, __F_HANDLE | __F_V }, 732 [__ID_IBRSP] = { "ibrsp", H_DEV, ibrsp, __F_HANDLE | __F_SPR }, 733 [__ID_IBRSV] = { "ibrsv", H_EITHER, ibrsv, __F_HANDLE | __F_V }, 734 [__ID_IBSAD] = { "ibsad", H_EITHER, ibsad, __F_HANDLE | __F_SAD }, 735 [__ID_IBSGNL] = { "ibsgnl", H_EITHER, ibsgnl, __F_HANDLE | __F_V }, 736 [__ID_IBSIC] = { "ibsic", H_BOARD, ibsic, __F_HANDLE }, 737 [__ID_IBSRE] = { "ibsre", H_BOARD, ibsre, __F_HANDLE | __F_V }, 738 [__ID_IBSRQ] = { "ibsrq", H_EITHER, ibsrq, __F_FUNC }, 739 [__ID_IBSTOP] = { "ibstop", H_EITHER, ibstop, __F_HANDLE }, 740 [__ID_IBTMO] = { "ibtmo", H_EITHER, ibtmo, __F_HANDLE | __F_TMO }, 741 [__ID_IBTRAP] = { "ibtrap", H_EITHER, ibtrap, __F_MASK | __F_MODE }, 742 [__ID_IBTRG] = { "ibtrg", H_DEV, ibtrg, __F_HANDLE }, 743 [__ID_IBWAIT] = { "ibwait", H_EITHER, ibwait, __F_HANDLE | __F_MASK }, 744 [__ID_IBWRT] = { "ibwrt", H_EITHER, ibwrt, __F_HANDLE | __F_BUFFER | __F_CNT }, 745 [__ID_IBWRTA] = { "ibwrta", H_EITHER, ibwrta, __F_HANDLE | __F_BUFFER | __F_CNT }, 746 [__ID_IBWRTF] = { "ibwrtf", H_EITHER, ibwrtf, __F_HANDLE | __F_FLNAME }, 747 [__ID_IBWRTKEY] = { "ibwrtkey", H_EITHER, ibwrtkey, __F_HANDLE | __F_BUFFER | __F_CNT }, 748 [__ID_IBXTRC] = { "ibxtrc", H_EITHER, ibxtrc, __F_HANDLE | __F_BUFFER | __F_CNT }, |
644}; 645 646static const u_int max_ibhandler = sizeof ibhandlers / sizeof ibhandlers[0]; 647 648static void 649ib_dump_args(struct ibhandler *ih, struct ibarg *ap) 650{ 651 652 if (ih->name != NULL) 653 printf("%s(", ih->name); 654 else 655 printf("ibinvalid("); 656 printf("[0x%x]", ap->__field); 657 if (ap->__field & __F_HANDLE) printf(" handle=%d", ap->handle); | 749}; 750 751static const u_int max_ibhandler = sizeof ibhandlers / sizeof ibhandlers[0]; 752 753static void 754ib_dump_args(struct ibhandler *ih, struct ibarg *ap) 755{ 756 757 if (ih->name != NULL) 758 printf("%s(", ih->name); 759 else 760 printf("ibinvalid("); 761 printf("[0x%x]", ap->__field); 762 if (ap->__field & __F_HANDLE) printf(" handle=%d", ap->handle); |
658 if (ap->__field & __F_EOS) printf(" eos=%d", ap->eos); | 763 if (ap->__field & __F_EOS) printf(" eos=0x%x", ap->eos); |
659 if (ap->__field & __F_EOT) printf(" eot=%d", ap->eot); 660 if (ap->__field & __F_TMO) printf(" tmo=%d", ap->tmo); | 764 if (ap->__field & __F_EOT) printf(" eot=%d", ap->eot); 765 if (ap->__field & __F_TMO) printf(" tmo=%d", ap->tmo); |
661 if (ap->__field & __F_PAD) printf(" pad=%d", ap->pad); 662 if (ap->__field & __F_SAD) printf(" sad=%d", ap->sad); | 766 if (ap->__field & __F_PAD) printf(" pad=0x%x", ap->pad); 767 if (ap->__field & __F_SAD) printf(" sad=0x%x", ap->sad); |
663 if (ap->__field & __F_BUFFER) printf(" buffer=%p", ap->buffer); 664 if (ap->__field & __F_CNT) printf(" cnt=%ld", ap->cnt); | 768 if (ap->__field & __F_BUFFER) printf(" buffer=%p", ap->buffer); 769 if (ap->__field & __F_CNT) printf(" cnt=%ld", ap->cnt); |
770 if (ap->__field & __F_V) printf(" v=%d/0x%x", ap->v, ap->v); |
|
665 /* XXX more ... */ 666 printf(")\n"); 667} 668 669static int 670gpib_ib_open(struct cdev *dev, int oflags, int devtype, struct thread *td) 671{ 672 struct upd7210 *u; 673 struct ibfoo *ib; | 771 /* XXX more ... */ 772 printf(")\n"); 773} 774 775static int 776gpib_ib_open(struct cdev *dev, int oflags, int devtype, struct thread *td) 777{ 778 struct upd7210 *u; 779 struct ibfoo *ib; |
674 int error; | 780 int error = 0; |
675 676 u = dev->si_drv1; 677 678 mtx_lock(&u->mutex); 679 if (u->busy) { 680 mtx_unlock(&u->mutex); 681 return (EBUSY); 682 } 683 u->busy = 1; 684 mtx_unlock(&u->mutex); 685 | 781 782 u = dev->si_drv1; 783 784 mtx_lock(&u->mutex); 785 if (u->busy) { 786 mtx_unlock(&u->mutex); 787 return (EBUSY); 788 } 789 u->busy = 1; 790 mtx_unlock(&u->mutex); 791 |
686 mtx_lock(&Giant); 687 error = isa_dma_acquire(u->dmachan); 688 if (!error) { 689 error = isa_dma_init(u->dmachan, PAGE_SIZE, M_WAITOK); 690 if (error) 691 isa_dma_release(u->dmachan); | 792 if (u->dmachan >= 0) { 793 mtx_lock(&Giant); 794 error = isa_dma_acquire(u->dmachan); 795 if (!error) { 796 error = isa_dma_init(u->dmachan, PAGE_SIZE, M_WAITOK); 797 if (error) 798 isa_dma_release(u->dmachan); 799 } 800 mtx_unlock(&Giant); |
692 } | 801 } |
693 mtx_unlock(&Giant); | 802 |
694 if (error) { 695 mtx_lock(&u->mutex); 696 u->busy = 0; 697 mtx_unlock(&u->mutex); 698 return (error); 699 } 700 701 ib = malloc(sizeof *ib, M_IBFOO, M_WAITOK | M_ZERO); --- 38 unchanged lines hidden (view full) --- 740 ib = dev->si_drv2; 741 /* XXX: assert pointer consistency */ 742 743 u->ibfoo = NULL; 744 /* XXX: free handles */ 745 dev->si_drv2 = NULL; 746 free(ib, M_IBFOO); 747 | 803 if (error) { 804 mtx_lock(&u->mutex); 805 u->busy = 0; 806 mtx_unlock(&u->mutex); 807 return (error); 808 } 809 810 ib = malloc(sizeof *ib, M_IBFOO, M_WAITOK | M_ZERO); --- 38 unchanged lines hidden (view full) --- 849 ib = dev->si_drv2; 850 /* XXX: assert pointer consistency */ 851 852 u->ibfoo = NULL; 853 /* XXX: free handles */ 854 dev->si_drv2 = NULL; 855 free(ib, M_IBFOO); 856 |
748 mtx_lock(&Giant); 749 isa_dma_release(u->dmachan); 750 mtx_unlock(&Giant); | 857 if (u->dmachan >= 0) { 858 mtx_lock(&Giant); 859 isa_dma_release(u->dmachan); 860 mtx_unlock(&Giant); 861 } |
751 mtx_lock(&u->mutex); 752 u->busy = 0; | 862 mtx_lock(&u->mutex); 863 u->busy = 0; |
864 ibdebug = 0; |
|
753 upd7210_wr(u, IMR1, 0x00); 754 upd7210_wr(u, IMR2, 0x00); 755 upd7210_wr(u, AUXMR, AUXMR_CRST); 756 DELAY(10000); 757 mtx_unlock(&u->mutex); 758 return (0); 759} 760 --- 59 unchanged lines hidden (view full) --- 820 821 /* Find the handle, if any */ 822 h = NULL; 823 if ((ap->__field & __F_HANDLE) && gethandle(u, ap, &h)) { 824 mtx_unlock(&u->mutex); 825 return (0); 826 } 827 | 865 upd7210_wr(u, IMR1, 0x00); 866 upd7210_wr(u, IMR2, 0x00); 867 upd7210_wr(u, AUXMR, AUXMR_CRST); 868 DELAY(10000); 869 mtx_unlock(&u->mutex); 870 return (0); 871} 872 --- 59 unchanged lines hidden (view full) --- 932 933 /* Find the handle, if any */ 934 h = NULL; 935 if ((ap->__field & __F_HANDLE) && gethandle(u, ap, &h)) { 936 mtx_unlock(&u->mutex); 937 return (0); 938 } 939 |
940 /* Check that the handle is the right kind */ 941 if (h != NULL && !(h->kind & ih->kind)) { 942 mtx_unlock(&u->mutex); 943 return (ib_set_error(ap, EARG)); 944 } 945 |
|
828 /* Set up handle and deadline */ 829 if (h != NULL && timevalisset(&h->timeout)) { 830 getmicrouptime(&deadline); 831 timevaladd(&deadline, &h->timeout); 832 } else { 833 timevalclear(&deadline); 834 } 835 --- 52 unchanged lines hidden --- | 946 /* Set up handle and deadline */ 947 if (h != NULL && timevalisset(&h->timeout)) { 948 getmicrouptime(&deadline); 949 timevaladd(&deadline, &h->timeout); 950 } else { 951 timevalclear(&deadline); 952 } 953 --- 52 unchanged lines hidden --- |