1 /* IEEE-1284 operations for parport.
 
   3  * This file is for generic IEEE 1284 operations.  The idea is that
 
   4  * they are used by the low-level drivers.  If they have a special way
 
   5  * of doing something, they can provide their own routines (and put
 
   6  * the function pointers in port->ops); if not, they can just use these
 
   9  * Note: Make no assumptions about hardware or architecture in this file!
 
  11  * Author: Tim Waugh <tim@cyberelk.demon.co.uk>
 
  12  * Fixed AUTOFD polarity in ecp_forward_to_reverse().  Fred Barnes, 1999
 
  13  * Software emulated EPP fixes, Fred Barnes, 04/2001.
 
  17 #include <linux/module.h>
 
  18 #include <linux/parport.h>
 
  19 #include <linux/delay.h>
 
  20 #include <linux/sched.h>
 
  21 #include <asm/uaccess.h>
 
  23 #undef DEBUG /* undef me for production */
 
  25 #ifdef CONFIG_LP_CONSOLE
 
  26 #undef DEBUG /* Don't want a garbled console */
 
  30 #define DPRINTK(stuff...) printk (stuff)
 
  32 #define DPRINTK(stuff...)
 
  36  * One-way data transfer functions. *
 
  39 /* Compatibility mode. */
 
  40 size_t parport_ieee1284_write_compat (struct parport *port,
 
  41                                       const void *buffer, size_t len,
 
  46         const unsigned char *addr = buffer;
 
  48         struct pardevice *dev = port->physport->cad;
 
  49         unsigned char ctl = (PARPORT_CONTROL_SELECT
 
  50                              | PARPORT_CONTROL_INIT);
 
  52         if (port->irq != PARPORT_IRQ_NONE) {
 
  53                 parport_enable_irq (port);
 
  57         port->physport->ieee1284.phase = IEEE1284_PH_FWD_DATA;
 
  58         parport_write_control (port, ctl);
 
  59         parport_data_forward (port);
 
  61                 unsigned long expire = jiffies + dev->timeout;
 
  62                 long wait = msecs_to_jiffies(10);
 
  63                 unsigned char mask = (PARPORT_STATUS_ERROR
 
  64                                       | PARPORT_STATUS_BUSY);
 
  65                 unsigned char val = (PARPORT_STATUS_ERROR
 
  66                                      | PARPORT_STATUS_BUSY);
 
  68                 /* Wait until the peripheral's ready */
 
  70                         /* Is the peripheral ready yet? */
 
  71                         if (!parport_wait_peripheral (port, mask, val))
 
  75                         /* Is the peripheral upset? */
 
  76                         if ((parport_read_status (port) &
 
  77                              (PARPORT_STATUS_PAPEROUT |
 
  78                               PARPORT_STATUS_SELECT |
 
  79                               PARPORT_STATUS_ERROR))
 
  80                             != (PARPORT_STATUS_SELECT |
 
  81                                 PARPORT_STATUS_ERROR))
 
  82                                 /* If nFault is asserted (i.e. no
 
  83                                  * error) and PAPEROUT and SELECT are
 
  84                                  * just red herrings, give the driver
 
  85                                  * a chance to check it's happy with
 
  86                                  * that before continuing. */
 
  89                         /* Have we run out of time? */
 
  90                         if (!time_before (jiffies, expire))
 
  93                         /* Yield the port for a while.  If this is the
 
  94                            first time around the loop, don't let go of
 
  95                            the port.  This way, we find out if we have
 
  96                            our interrupt handler called. */
 
  97                         if (count && no_irq) {
 
  98                                 parport_release (dev);
 
  99                                 schedule_timeout_interruptible(wait);
 
 100                                 parport_claim_or_block (dev);
 
 103                                 /* We must have the device claimed here */
 
 104                                 parport_wait_event (port, wait);
 
 106                         /* Is there a signal pending? */
 
 107                         if (signal_pending (current))
 
 110                         /* Wait longer next time. */
 
 112                 } while (time_before (jiffies, expire));
 
 114                 if (signal_pending (current))
 
 117                 DPRINTK (KERN_DEBUG "%s: Timed out\n", port->name);
 
 121                 /* Write the character to the data lines. */
 
 123                 parport_write_data (port, byte);
 
 127                 parport_write_control (port, ctl | PARPORT_CONTROL_STROBE);
 
 128                 udelay (1); /* strobe */
 
 130                 parport_write_control (port, ctl);
 
 131                 udelay (1); /* hold */
 
 133                 /* Assume the peripheral received it. */
 
 136                 /* Let another process run if it needs to. */
 
 137                 if (time_before (jiffies, expire))
 
 138                         if (!parport_yield_blocking (dev)
 
 143         port->physport->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 
 149 size_t parport_ieee1284_read_nibble (struct parport *port, 
 
 150                                      void *buffer, size_t len,
 
 153 #ifndef CONFIG_PARPORT_1284
 
 156         unsigned char *buf = buffer;
 
 158         unsigned char byte = 0;
 
 160         len *= 2; /* in nibbles */
 
 161         for (i=0; i < len; i++) {
 
 162                 unsigned char nibble;
 
 164                 /* Does the error line indicate end of data? */
 
 165                 if (((i & 1) == 0) &&
 
 166                     (parport_read_status(port) & PARPORT_STATUS_ERROR)) {
 
 170                 /* Event 7: Set nAutoFd low. */
 
 171                 parport_frob_control (port,
 
 172                                       PARPORT_CONTROL_AUTOFD,
 
 173                                       PARPORT_CONTROL_AUTOFD);
 
 175                 /* Event 9: nAck goes low. */
 
 176                 port->ieee1284.phase = IEEE1284_PH_REV_DATA;
 
 177                 if (parport_wait_peripheral (port,
 
 178                                              PARPORT_STATUS_ACK, 0)) {
 
 179                         /* Timeout -- no more data? */
 
 181                                  "%s: Nibble timeout at event 9 (%d bytes)\n",
 
 183                         parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 
 189                 nibble = parport_read_status (port) >> 3;
 
 191                 if ((nibble & 0x10) == 0)
 
 195                 /* Event 10: Set nAutoFd high. */
 
 196                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 
 198                 /* Event 11: nAck goes high. */
 
 199                 if (parport_wait_peripheral (port,
 
 201                                              PARPORT_STATUS_ACK)) {
 
 202                         /* Timeout -- no more data? */
 
 204                                  "%s: Nibble timeout at event 11\n",
 
 218                 /* Read the last nibble without checking data avail. */
 
 219                 if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
 
 222                                 "%s: No more nibble data (%d bytes)\n",
 
 225                         /* Go to reverse idle phase. */
 
 226                         parport_frob_control (port,
 
 227                                               PARPORT_CONTROL_AUTOFD,
 
 228                                               PARPORT_CONTROL_AUTOFD);
 
 229                         port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 
 232                         port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
 
 236 #endif /* IEEE1284 support */
 
 240 size_t parport_ieee1284_read_byte (struct parport *port,
 
 241                                    void *buffer, size_t len,
 
 244 #ifndef CONFIG_PARPORT_1284
 
 247         unsigned char *buf = buffer;
 
 250         for (count = 0; count < len; count++) {
 
 253                 /* Data available? */
 
 254                 if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
 
 258                 /* Event 14: Place data bus in high impedance state. */
 
 259                 parport_data_reverse (port);
 
 261                 /* Event 7: Set nAutoFd low. */
 
 262                 parport_frob_control (port,
 
 263                                       PARPORT_CONTROL_AUTOFD,
 
 264                                       PARPORT_CONTROL_AUTOFD);
 
 266                 /* Event 9: nAck goes low. */
 
 267                 port->physport->ieee1284.phase = IEEE1284_PH_REV_DATA;
 
 268                 if (parport_wait_peripheral (port,
 
 271                         /* Timeout -- no more data? */
 
 272                         parport_frob_control (port, PARPORT_CONTROL_AUTOFD,
 
 274                         DPRINTK (KERN_DEBUG "%s: Byte timeout at event 9\n",
 
 279                 byte = parport_read_data (port);
 
 282                 /* Event 10: Set nAutoFd high */
 
 283                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 
 285                 /* Event 11: nAck goes high. */
 
 286                 if (parport_wait_peripheral (port,
 
 288                                              PARPORT_STATUS_ACK)) {
 
 289                         /* Timeout -- no more data? */
 
 290                         DPRINTK (KERN_DEBUG "%s: Byte timeout at event 11\n",
 
 295                 /* Event 16: Set nStrobe low. */
 
 296                 parport_frob_control (port,
 
 297                                       PARPORT_CONTROL_STROBE,
 
 298                                       PARPORT_CONTROL_STROBE);
 
 301                 /* Event 17: Set nStrobe high. */
 
 302                 parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 
 306                 /* Read the last byte without checking data avail. */
 
 307                 if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
 
 310                                  "%s: No more byte data (%Zd bytes)\n",
 
 313                         /* Go to reverse idle phase. */
 
 314                         parport_frob_control (port,
 
 315                                               PARPORT_CONTROL_AUTOFD,
 
 316                                               PARPORT_CONTROL_AUTOFD);
 
 317                         port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 
 320                         port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
 
 324 #endif /* IEEE1284 support */
 
 331 #ifdef CONFIG_PARPORT_1284
 
 334 int ecp_forward_to_reverse (struct parport *port)
 
 338         /* Event 38: Set nAutoFd low */
 
 339         parport_frob_control (port,
 
 340                               PARPORT_CONTROL_AUTOFD,
 
 341                               PARPORT_CONTROL_AUTOFD);
 
 342         parport_data_reverse (port);
 
 345         /* Event 39: Set nInit low to initiate bus reversal */
 
 346         parport_frob_control (port,
 
 347                               PARPORT_CONTROL_INIT,
 
 350         /* Event 40: PError goes low */
 
 351         retval = parport_wait_peripheral (port,
 
 352                                           PARPORT_STATUS_PAPEROUT, 0);
 
 355                 DPRINTK (KERN_DEBUG "%s: ECP direction: reverse\n",
 
 357                 port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 
 359                 DPRINTK (KERN_DEBUG "%s: ECP direction: failed to reverse\n",
 
 361                 port->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN;
 
 368 int ecp_reverse_to_forward (struct parport *port)
 
 372         /* Event 47: Set nInit high */
 
 373         parport_frob_control (port,
 
 375                               | PARPORT_CONTROL_AUTOFD,
 
 377                               | PARPORT_CONTROL_AUTOFD);
 
 379         /* Event 49: PError goes high */
 
 380         retval = parport_wait_peripheral (port,
 
 381                                           PARPORT_STATUS_PAPEROUT,
 
 382                                           PARPORT_STATUS_PAPEROUT);
 
 385                 parport_data_forward (port);
 
 386                 DPRINTK (KERN_DEBUG "%s: ECP direction: forward\n",
 
 388                 port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 
 391                          "%s: ECP direction: failed to switch forward\n",
 
 393                 port->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN;
 
 400 #endif /* IEEE1284 support */
 
 402 /* ECP mode, forward channel, data. */
 
 403 size_t parport_ieee1284_ecp_write_data (struct parport *port,
 
 404                                         const void *buffer, size_t len,
 
 407 #ifndef CONFIG_PARPORT_1284
 
 410         const unsigned char *buf = buffer;
 
 414         port = port->physport;
 
 416         if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE)
 
 417                 if (ecp_reverse_to_forward (port))
 
 420         port->ieee1284.phase = IEEE1284_PH_FWD_DATA;
 
 422         /* HostAck high (data, not command) */
 
 423         parport_frob_control (port,
 
 424                               PARPORT_CONTROL_AUTOFD
 
 425                               | PARPORT_CONTROL_STROBE
 
 426                               | PARPORT_CONTROL_INIT,
 
 427                               PARPORT_CONTROL_INIT);
 
 428         for (written = 0; written < len; written++, buf++) {
 
 429                 unsigned long expire = jiffies + port->cad->timeout;
 
 434                 parport_write_data (port, byte);
 
 435                 parport_frob_control (port, PARPORT_CONTROL_STROBE,
 
 436                                       PARPORT_CONTROL_STROBE);
 
 438                 for (retry = 0; retry < 100; retry++) {
 
 439                         if (!parport_wait_peripheral (port,
 
 440                                                       PARPORT_STATUS_BUSY, 0))
 
 443                         if (signal_pending (current)) {
 
 444                                 parport_frob_control (port,
 
 445                                                       PARPORT_CONTROL_STROBE,
 
 451                 /* Time for Host Transfer Recovery (page 41 of IEEE1284) */
 
 452                 DPRINTK (KERN_DEBUG "%s: ECP transfer stalled!\n", port->name);
 
 454                 parport_frob_control (port, PARPORT_CONTROL_INIT,
 
 455                                       PARPORT_CONTROL_INIT);
 
 457                 if (parport_read_status (port) & PARPORT_STATUS_PAPEROUT) {
 
 459                         parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 
 463                 parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 
 465                 if (!(parport_read_status (port) & PARPORT_STATUS_PAPEROUT))
 
 468                 DPRINTK (KERN_DEBUG "%s: Host transfer recovered\n",
 
 471                 if (time_after_eq (jiffies, expire)) break;
 
 474                 parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 
 476                 if (parport_wait_peripheral (port,
 
 478                                              PARPORT_STATUS_BUSY))
 
 479                         /* Peripheral hasn't accepted the data. */
 
 483         port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 
 486 #endif /* IEEE1284 support */
 
 489 /* ECP mode, reverse channel, data. */
 
 490 size_t parport_ieee1284_ecp_read_data (struct parport *port,
 
 491                                        void *buffer, size_t len, int flags)
 
 493 #ifndef CONFIG_PARPORT_1284
 
 496         struct pardevice *dev = port->cad;
 
 497         unsigned char *buf = buffer;
 
 498         int rle_count = 0; /* shut gcc up */
 
 503         port = port->physport;
 
 505         if (port->ieee1284.phase != IEEE1284_PH_REV_IDLE)
 
 506                 if (ecp_forward_to_reverse (port))
 
 509         port->ieee1284.phase = IEEE1284_PH_REV_DATA;
 
 511         /* Set HostAck low to start accepting data. */
 
 512         ctl = parport_read_control (port);
 
 513         ctl &= ~(PARPORT_CONTROL_STROBE | PARPORT_CONTROL_INIT |
 
 514                  PARPORT_CONTROL_AUTOFD);
 
 515         parport_write_control (port,
 
 516                                ctl | PARPORT_CONTROL_AUTOFD);
 
 517         while (count < len) {
 
 518                 unsigned long expire = jiffies + dev->timeout;
 
 522                 /* Event 43: Peripheral sets nAck low. It can take as
 
 524                 while (parport_wait_peripheral (port, PARPORT_STATUS_ACK, 0)) {
 
 525                         /* The peripheral hasn't given us data in
 
 526                            35ms.  If we have data to give back to the
 
 527                            caller, do it now. */
 
 531                         /* If we've used up all the time we were allowed,
 
 532                            give up altogether. */
 
 533                         if (!time_before (jiffies, expire))
 
 536                         /* Yield the port for a while. */
 
 537                         if (count && dev->port->irq != PARPORT_IRQ_NONE) {
 
 538                                 parport_release (dev);
 
 539                                 schedule_timeout_interruptible(msecs_to_jiffies(40));
 
 540                                 parport_claim_or_block (dev);
 
 543                                 /* We must have the device claimed here. */
 
 544                                 parport_wait_event (port, msecs_to_jiffies(40));
 
 546                         /* Is there a signal pending? */
 
 547                         if (signal_pending (current))
 
 551                 /* Is this a command? */
 
 553                         /* The last byte was a run-length count, so
 
 554                            this can't be as well. */
 
 557                         command = (parport_read_status (port) &
 
 558                                    PARPORT_STATUS_BUSY) ? 1 : 0;
 
 561                 byte = parport_read_data (port);
 
 563                 /* If this is a channel command, rather than an RLE
 
 564                    command or a normal data byte, don't accept it. */
 
 567                                 DPRINTK (KERN_DEBUG "%s: stopping short at "
 
 568                                          "channel command (%02x)\n",
 
 572                         else if (port->ieee1284.mode != IEEE1284_MODE_ECPRLE)
 
 573                                 DPRINTK (KERN_DEBUG "%s: device illegally "
 
 574                                          "using RLE; accepting anyway\n",
 
 577                         rle_count = byte + 1;
 
 579                         /* Are we allowed to read that many bytes? */
 
 580                         if (rle_count > (len - count)) {
 
 581                                 DPRINTK (KERN_DEBUG "%s: leaving %d RLE bytes "
 
 582                                          "for next time\n", port->name,
 
 590                 /* Event 44: Set HostAck high, acknowledging handshake. */
 
 591                 parport_write_control (port, ctl);
 
 593                 /* Event 45: The peripheral has 35ms to set nAck high. */
 
 594                 if (parport_wait_peripheral (port, PARPORT_STATUS_ACK,
 
 595                                              PARPORT_STATUS_ACK)) {
 
 596                         /* It's gone wrong.  Return what data we have
 
 598                         DPRINTK (KERN_DEBUG "ECP read timed out at 45\n");
 
 602                                         "%s: command ignored (%02x)\n",
 
 608                 /* Event 46: Set HostAck low and accept the data. */
 
 609                 parport_write_control (port,
 
 610                                        ctl | PARPORT_CONTROL_AUTOFD);
 
 612                 /* If we just read a run-length count, fetch the data. */
 
 616                 /* If this is the byte after a run-length count, decompress. */
 
 619                         memset (buf, byte, rle_count);
 
 622                         DPRINTK (KERN_DEBUG "%s: decompressed to %d bytes\n",
 
 623                                  port->name, rle_count);
 
 625                         /* Normal data byte. */
 
 632         port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 
 634 #endif /* IEEE1284 support */
 
 637 /* ECP mode, forward channel, commands. */
 
 638 size_t parport_ieee1284_ecp_write_addr (struct parport *port,
 
 639                                         const void *buffer, size_t len,
 
 642 #ifndef CONFIG_PARPORT_1284
 
 645         const unsigned char *buf = buffer;
 
 649         port = port->physport;
 
 651         if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE)
 
 652                 if (ecp_reverse_to_forward (port))
 
 655         port->ieee1284.phase = IEEE1284_PH_FWD_DATA;
 
 657         /* HostAck low (command, not data) */
 
 658         parport_frob_control (port,
 
 659                               PARPORT_CONTROL_AUTOFD
 
 660                               | PARPORT_CONTROL_STROBE
 
 661                               | PARPORT_CONTROL_INIT,
 
 662                               PARPORT_CONTROL_AUTOFD
 
 663                               | PARPORT_CONTROL_INIT);
 
 664         for (written = 0; written < len; written++, buf++) {
 
 665                 unsigned long expire = jiffies + port->cad->timeout;
 
 670                 parport_write_data (port, byte);
 
 671                 parport_frob_control (port, PARPORT_CONTROL_STROBE,
 
 672                                       PARPORT_CONTROL_STROBE);
 
 674                 for (retry = 0; retry < 100; retry++) {
 
 675                         if (!parport_wait_peripheral (port,
 
 676                                                       PARPORT_STATUS_BUSY, 0))
 
 679                         if (signal_pending (current)) {
 
 680                                 parport_frob_control (port,
 
 681                                                       PARPORT_CONTROL_STROBE,
 
 687                 /* Time for Host Transfer Recovery (page 41 of IEEE1284) */
 
 688                 DPRINTK (KERN_DEBUG "%s: ECP transfer stalled!\n", port->name);
 
 690                 parport_frob_control (port, PARPORT_CONTROL_INIT,
 
 691                                       PARPORT_CONTROL_INIT);
 
 693                 if (parport_read_status (port) & PARPORT_STATUS_PAPEROUT) {
 
 695                         parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 
 699                 parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 
 701                 if (!(parport_read_status (port) & PARPORT_STATUS_PAPEROUT))
 
 704                 DPRINTK (KERN_DEBUG "%s: Host transfer recovered\n",
 
 707                 if (time_after_eq (jiffies, expire)) break;
 
 710                 parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 
 712                 if (parport_wait_peripheral (port,
 
 714                                              PARPORT_STATUS_BUSY))
 
 715                         /* Peripheral hasn't accepted the data. */
 
 719         port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 
 722 #endif /* IEEE1284 support */
 
 729 /* EPP mode, forward channel, data. */
 
 730 size_t parport_ieee1284_epp_write_data (struct parport *port,
 
 731                                         const void *buffer, size_t len,
 
 734         unsigned char *bp = (unsigned char *) buffer;
 
 737         /* set EPP idle state (just to make sure) with strobe low */
 
 738         parport_frob_control (port,
 
 739                               PARPORT_CONTROL_STROBE |
 
 740                               PARPORT_CONTROL_AUTOFD |
 
 741                               PARPORT_CONTROL_SELECT |
 
 742                               PARPORT_CONTROL_INIT,
 
 743                               PARPORT_CONTROL_STROBE |
 
 744                               PARPORT_CONTROL_INIT);
 
 745         port->ops->data_forward (port);
 
 746         for (; len > 0; len--, bp++) {
 
 747                 /* Event 62: Write data and set autofd low */
 
 748                 parport_write_data (port, *bp);
 
 749                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD,
 
 750                                       PARPORT_CONTROL_AUTOFD);
 
 752                 /* Event 58: wait for busy (nWait) to go high */
 
 753                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 0, 10))
 
 756                 /* Event 63: set nAutoFd (nDStrb) high */
 
 757                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 
 759                 /* Event 60: wait for busy (nWait) to go low */
 
 760                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
 
 761                                              PARPORT_STATUS_BUSY, 5))
 
 767         /* Event 61: set strobe (nWrite) high */
 
 768         parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 
 773 /* EPP mode, reverse channel, data. */
 
 774 size_t parport_ieee1284_epp_read_data (struct parport *port,
 
 775                                        void *buffer, size_t len,
 
 778         unsigned char *bp = (unsigned char *) buffer;
 
 781         /* set EPP idle state (just to make sure) with strobe high */
 
 782         parport_frob_control (port,
 
 783                               PARPORT_CONTROL_STROBE |
 
 784                               PARPORT_CONTROL_AUTOFD |
 
 785                               PARPORT_CONTROL_SELECT |
 
 786                               PARPORT_CONTROL_INIT,
 
 787                               PARPORT_CONTROL_INIT);
 
 788         port->ops->data_reverse (port);
 
 789         for (; len > 0; len--, bp++) {
 
 790                 /* Event 67: set nAutoFd (nDStrb) low */
 
 791                 parport_frob_control (port,
 
 792                                       PARPORT_CONTROL_AUTOFD,
 
 793                                       PARPORT_CONTROL_AUTOFD);
 
 794                 /* Event 58: wait for Busy to go high */
 
 795                 if (parport_wait_peripheral (port, PARPORT_STATUS_BUSY, 0)) {
 
 799                 *bp = parport_read_data (port);
 
 801                 /* Event 63: set nAutoFd (nDStrb) high */
 
 802                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 
 804                 /* Event 60: wait for Busy to go low */
 
 805                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
 
 806                                              PARPORT_STATUS_BUSY, 5)) {
 
 812         port->ops->data_forward (port);
 
 817 /* EPP mode, forward channel, addresses. */
 
 818 size_t parport_ieee1284_epp_write_addr (struct parport *port,
 
 819                                         const void *buffer, size_t len,
 
 822         unsigned char *bp = (unsigned char *) buffer;
 
 825         /* set EPP idle state (just to make sure) with strobe low */
 
 826         parport_frob_control (port,
 
 827                               PARPORT_CONTROL_STROBE |
 
 828                               PARPORT_CONTROL_AUTOFD |
 
 829                               PARPORT_CONTROL_SELECT |
 
 830                               PARPORT_CONTROL_INIT,
 
 831                               PARPORT_CONTROL_STROBE |
 
 832                               PARPORT_CONTROL_INIT);
 
 833         port->ops->data_forward (port);
 
 834         for (; len > 0; len--, bp++) {
 
 835                 /* Event 56: Write data and set nAStrb low. */
 
 836                 parport_write_data (port, *bp);
 
 837                 parport_frob_control (port, PARPORT_CONTROL_SELECT,
 
 838                                       PARPORT_CONTROL_SELECT);
 
 840                 /* Event 58: wait for busy (nWait) to go high */
 
 841                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 0, 10))
 
 844                 /* Event 59: set nAStrb high */
 
 845                 parport_frob_control (port, PARPORT_CONTROL_SELECT, 0);
 
 847                 /* Event 60: wait for busy (nWait) to go low */
 
 848                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
 
 849                                              PARPORT_STATUS_BUSY, 5))
 
 855         /* Event 61: set strobe (nWrite) high */
 
 856         parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 
 861 /* EPP mode, reverse channel, addresses. */
 
 862 size_t parport_ieee1284_epp_read_addr (struct parport *port,
 
 863                                        void *buffer, size_t len,
 
 866         unsigned char *bp = (unsigned char *) buffer;
 
 869         /* Set EPP idle state (just to make sure) with strobe high */
 
 870         parport_frob_control (port,
 
 871                               PARPORT_CONTROL_STROBE |
 
 872                               PARPORT_CONTROL_AUTOFD |
 
 873                               PARPORT_CONTROL_SELECT |
 
 874                               PARPORT_CONTROL_INIT,
 
 875                               PARPORT_CONTROL_INIT);
 
 876         port->ops->data_reverse (port);
 
 877         for (; len > 0; len--, bp++) {
 
 878                 /* Event 64: set nSelectIn (nAStrb) low */
 
 879                 parport_frob_control (port, PARPORT_CONTROL_SELECT,
 
 880                                       PARPORT_CONTROL_SELECT);
 
 882                 /* Event 58: wait for Busy to go high */
 
 883                 if (parport_wait_peripheral (port, PARPORT_STATUS_BUSY, 0)) {
 
 887                 *bp = parport_read_data (port);
 
 889                 /* Event 59: set nSelectIn (nAStrb) high */
 
 890                 parport_frob_control (port, PARPORT_CONTROL_SELECT,
 
 893                 /* Event 60: wait for Busy to go low */
 
 894                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 
 
 895                                              PARPORT_STATUS_BUSY, 5))
 
 900         port->ops->data_forward (port);
 
 905 EXPORT_SYMBOL(parport_ieee1284_ecp_write_data);
 
 906 EXPORT_SYMBOL(parport_ieee1284_ecp_read_data);
 
 907 EXPORT_SYMBOL(parport_ieee1284_ecp_write_addr);
 
 908 EXPORT_SYMBOL(parport_ieee1284_write_compat);
 
 909 EXPORT_SYMBOL(parport_ieee1284_read_nibble);
 
 910 EXPORT_SYMBOL(parport_ieee1284_read_byte);
 
 911 EXPORT_SYMBOL(parport_ieee1284_epp_write_data);
 
 912 EXPORT_SYMBOL(parport_ieee1284_epp_read_data);
 
 913 EXPORT_SYMBOL(parport_ieee1284_epp_write_addr);
 
 914 EXPORT_SYMBOL(parport_ieee1284_epp_read_addr);