root/drivers/parport/ieee1284_ops.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. parport_ieee1284_write_compat
  2. parport_ieee1284_read_nibble
  3. parport_ieee1284_read_byte
  4. ecp_forward_to_reverse
  5. ecp_reverse_to_forward
  6. parport_ieee1284_ecp_write_data
  7. parport_ieee1284_ecp_read_data
  8. parport_ieee1284_ecp_write_addr
  9. parport_ieee1284_epp_write_data
  10. parport_ieee1284_epp_read_data
  11. parport_ieee1284_epp_write_addr
  12. parport_ieee1284_epp_read_addr

   1 // SPDX-License-Identifier: GPL-2.0
   2 /* IEEE-1284 operations for parport.
   3  *
   4  * This file is for generic IEEE 1284 operations.  The idea is that
   5  * they are used by the low-level drivers.  If they have a special way
   6  * of doing something, they can provide their own routines (and put
   7  * the function pointers in port->ops); if not, they can just use these
   8  * as a fallback.
   9  *
  10  * Note: Make no assumptions about hardware or architecture in this file!
  11  *
  12  * Author: Tim Waugh <tim@cyberelk.demon.co.uk>
  13  * Fixed AUTOFD polarity in ecp_forward_to_reverse().  Fred Barnes, 1999
  14  * Software emulated EPP fixes, Fred Barnes, 04/2001.
  15  */
  16 
  17 
  18 #include <linux/module.h>
  19 #include <linux/parport.h>
  20 #include <linux/delay.h>
  21 #include <linux/sched/signal.h>
  22 #include <linux/uaccess.h>
  23 
  24 #undef DEBUG /* undef me for production */
  25 
  26 #ifdef CONFIG_LP_CONSOLE
  27 #undef DEBUG /* Don't want a garbled console */
  28 #endif
  29 
  30 #ifdef DEBUG
  31 #define DPRINTK(stuff...) printk (stuff)
  32 #else
  33 #define DPRINTK(stuff...)
  34 #endif
  35 
  36 /***                                *
  37  * One-way data transfer functions. *
  38  *                                ***/
  39 
  40 /* Compatibility mode. */
  41 size_t parport_ieee1284_write_compat (struct parport *port,
  42                                       const void *buffer, size_t len,
  43                                       int flags)
  44 {
  45         int no_irq = 1;
  46         ssize_t count = 0;
  47         const unsigned char *addr = buffer;
  48         unsigned char byte;
  49         struct pardevice *dev = port->physport->cad;
  50         unsigned char ctl = (PARPORT_CONTROL_SELECT
  51                              | PARPORT_CONTROL_INIT);
  52 
  53         if (port->irq != PARPORT_IRQ_NONE) {
  54                 parport_enable_irq (port);
  55                 no_irq = 0;
  56         }
  57 
  58         port->physport->ieee1284.phase = IEEE1284_PH_FWD_DATA;
  59         parport_write_control (port, ctl);
  60         parport_data_forward (port);
  61         while (count < len) {
  62                 unsigned long expire = jiffies + dev->timeout;
  63                 long wait = msecs_to_jiffies(10);
  64                 unsigned char mask = (PARPORT_STATUS_ERROR
  65                                       | PARPORT_STATUS_BUSY);
  66                 unsigned char val = (PARPORT_STATUS_ERROR
  67                                      | PARPORT_STATUS_BUSY);
  68 
  69                 /* Wait until the peripheral's ready */
  70                 do {
  71                         /* Is the peripheral ready yet? */
  72                         if (!parport_wait_peripheral (port, mask, val))
  73                                 /* Skip the loop */
  74                                 goto ready;
  75 
  76                         /* Is the peripheral upset? */
  77                         if ((parport_read_status (port) &
  78                              (PARPORT_STATUS_PAPEROUT |
  79                               PARPORT_STATUS_SELECT |
  80                               PARPORT_STATUS_ERROR))
  81                             != (PARPORT_STATUS_SELECT |
  82                                 PARPORT_STATUS_ERROR))
  83                                 /* If nFault is asserted (i.e. no
  84                                  * error) and PAPEROUT and SELECT are
  85                                  * just red herrings, give the driver
  86                                  * a chance to check it's happy with
  87                                  * that before continuing. */
  88                                 goto stop;
  89 
  90                         /* Have we run out of time? */
  91                         if (!time_before (jiffies, expire))
  92                                 break;
  93 
  94                         /* Yield the port for a while.  If this is the
  95                            first time around the loop, don't let go of
  96                            the port.  This way, we find out if we have
  97                            our interrupt handler called. */
  98                         if (count && no_irq) {
  99                                 parport_release (dev);
 100                                 schedule_timeout_interruptible(wait);
 101                                 parport_claim_or_block (dev);
 102                         }
 103                         else
 104                                 /* We must have the device claimed here */
 105                                 parport_wait_event (port, wait);
 106 
 107                         /* Is there a signal pending? */
 108                         if (signal_pending (current))
 109                                 break;
 110 
 111                         /* Wait longer next time. */
 112                         wait *= 2;
 113                 } while (time_before (jiffies, expire));
 114 
 115                 if (signal_pending (current))
 116                         break;
 117 
 118                 DPRINTK (KERN_DEBUG "%s: Timed out\n", port->name);
 119                 break;
 120 
 121         ready:
 122                 /* Write the character to the data lines. */
 123                 byte = *addr++;
 124                 parport_write_data (port, byte);
 125                 udelay (1);
 126 
 127                 /* Pulse strobe. */
 128                 parport_write_control (port, ctl | PARPORT_CONTROL_STROBE);
 129                 udelay (1); /* strobe */
 130 
 131                 parport_write_control (port, ctl);
 132                 udelay (1); /* hold */
 133 
 134                 /* Assume the peripheral received it. */
 135                 count++;
 136 
 137                 /* Let another process run if it needs to. */
 138                 if (time_before (jiffies, expire))
 139                         if (!parport_yield_blocking (dev)
 140                             && need_resched())
 141                                 schedule ();
 142         }
 143  stop:
 144         port->physport->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 145 
 146         return count;
 147 }
 148 
 149 /* Nibble mode. */
 150 size_t parport_ieee1284_read_nibble (struct parport *port, 
 151                                      void *buffer, size_t len,
 152                                      int flags)
 153 {
 154 #ifndef CONFIG_PARPORT_1284
 155         return 0;
 156 #else
 157         unsigned char *buf = buffer;
 158         int i;
 159         unsigned char byte = 0;
 160 
 161         len *= 2; /* in nibbles */
 162         for (i=0; i < len; i++) {
 163                 unsigned char nibble;
 164 
 165                 /* Does the error line indicate end of data? */
 166                 if (((i & 1) == 0) &&
 167                     (parport_read_status(port) & PARPORT_STATUS_ERROR)) {
 168                         goto end_of_data;
 169                 }
 170 
 171                 /* Event 7: Set nAutoFd low. */
 172                 parport_frob_control (port,
 173                                       PARPORT_CONTROL_AUTOFD,
 174                                       PARPORT_CONTROL_AUTOFD);
 175 
 176                 /* Event 9: nAck goes low. */
 177                 port->ieee1284.phase = IEEE1284_PH_REV_DATA;
 178                 if (parport_wait_peripheral (port,
 179                                              PARPORT_STATUS_ACK, 0)) {
 180                         /* Timeout -- no more data? */
 181                         DPRINTK (KERN_DEBUG
 182                                  "%s: Nibble timeout at event 9 (%d bytes)\n",
 183                                  port->name, i/2);
 184                         parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 185                         break;
 186                 }
 187 
 188 
 189                 /* Read a nibble. */
 190                 nibble = parport_read_status (port) >> 3;
 191                 nibble &= ~8;
 192                 if ((nibble & 0x10) == 0)
 193                         nibble |= 8;
 194                 nibble &= 0xf;
 195 
 196                 /* Event 10: Set nAutoFd high. */
 197                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 198 
 199                 /* Event 11: nAck goes high. */
 200                 if (parport_wait_peripheral (port,
 201                                              PARPORT_STATUS_ACK,
 202                                              PARPORT_STATUS_ACK)) {
 203                         /* Timeout -- no more data? */
 204                         DPRINTK (KERN_DEBUG
 205                                  "%s: Nibble timeout at event 11\n",
 206                                  port->name);
 207                         break;
 208                 }
 209 
 210                 if (i & 1) {
 211                         /* Second nibble */
 212                         byte |= nibble << 4;
 213                         *buf++ = byte;
 214                 } else 
 215                         byte = nibble;
 216         }
 217 
 218         if (i == len) {
 219                 /* Read the last nibble without checking data avail. */
 220                 if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
 221                 end_of_data:
 222                         DPRINTK (KERN_DEBUG
 223                                 "%s: No more nibble data (%d bytes)\n",
 224                                 port->name, i/2);
 225 
 226                         /* Go to reverse idle phase. */
 227                         parport_frob_control (port,
 228                                               PARPORT_CONTROL_AUTOFD,
 229                                               PARPORT_CONTROL_AUTOFD);
 230                         port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 231                 }
 232                 else
 233                         port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
 234         }
 235 
 236         return i/2;
 237 #endif /* IEEE1284 support */
 238 }
 239 
 240 /* Byte mode. */
 241 size_t parport_ieee1284_read_byte (struct parport *port,
 242                                    void *buffer, size_t len,
 243                                    int flags)
 244 {
 245 #ifndef CONFIG_PARPORT_1284
 246         return 0;
 247 #else
 248         unsigned char *buf = buffer;
 249         ssize_t count = 0;
 250 
 251         for (count = 0; count < len; count++) {
 252                 unsigned char byte;
 253 
 254                 /* Data available? */
 255                 if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
 256                         goto end_of_data;
 257                 }
 258 
 259                 /* Event 14: Place data bus in high impedance state. */
 260                 parport_data_reverse (port);
 261 
 262                 /* Event 7: Set nAutoFd low. */
 263                 parport_frob_control (port,
 264                                       PARPORT_CONTROL_AUTOFD,
 265                                       PARPORT_CONTROL_AUTOFD);
 266 
 267                 /* Event 9: nAck goes low. */
 268                 port->physport->ieee1284.phase = IEEE1284_PH_REV_DATA;
 269                 if (parport_wait_peripheral (port,
 270                                              PARPORT_STATUS_ACK,
 271                                              0)) {
 272                         /* Timeout -- no more data? */
 273                         parport_frob_control (port, PARPORT_CONTROL_AUTOFD,
 274                                                  0);
 275                         DPRINTK (KERN_DEBUG "%s: Byte timeout at event 9\n",
 276                                  port->name);
 277                         break;
 278                 }
 279 
 280                 byte = parport_read_data (port);
 281                 *buf++ = byte;
 282 
 283                 /* Event 10: Set nAutoFd high */
 284                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 285 
 286                 /* Event 11: nAck goes high. */
 287                 if (parport_wait_peripheral (port,
 288                                              PARPORT_STATUS_ACK,
 289                                              PARPORT_STATUS_ACK)) {
 290                         /* Timeout -- no more data? */
 291                         DPRINTK (KERN_DEBUG "%s: Byte timeout at event 11\n",
 292                                  port->name);
 293                         break;
 294                 }
 295 
 296                 /* Event 16: Set nStrobe low. */
 297                 parport_frob_control (port,
 298                                       PARPORT_CONTROL_STROBE,
 299                                       PARPORT_CONTROL_STROBE);
 300                 udelay (5);
 301 
 302                 /* Event 17: Set nStrobe high. */
 303                 parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 304         }
 305 
 306         if (count == len) {
 307                 /* Read the last byte without checking data avail. */
 308                 if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
 309                 end_of_data:
 310                         DPRINTK (KERN_DEBUG
 311                                  "%s: No more byte data (%zd bytes)\n",
 312                                  port->name, count);
 313 
 314                         /* Go to reverse idle phase. */
 315                         parport_frob_control (port,
 316                                               PARPORT_CONTROL_AUTOFD,
 317                                               PARPORT_CONTROL_AUTOFD);
 318                         port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 319                 }
 320                 else
 321                         port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
 322         }
 323 
 324         return count;
 325 #endif /* IEEE1284 support */
 326 }
 327 
 328 /***              *
 329  * ECP Functions. *
 330  *              ***/
 331 
 332 #ifdef CONFIG_PARPORT_1284
 333 
 334 static inline
 335 int ecp_forward_to_reverse (struct parport *port)
 336 {
 337         int retval;
 338 
 339         /* Event 38: Set nAutoFd low */
 340         parport_frob_control (port,
 341                               PARPORT_CONTROL_AUTOFD,
 342                               PARPORT_CONTROL_AUTOFD);
 343         parport_data_reverse (port);
 344         udelay (5);
 345 
 346         /* Event 39: Set nInit low to initiate bus reversal */
 347         parport_frob_control (port,
 348                               PARPORT_CONTROL_INIT,
 349                               0);
 350 
 351         /* Event 40: PError goes low */
 352         retval = parport_wait_peripheral (port,
 353                                           PARPORT_STATUS_PAPEROUT, 0);
 354 
 355         if (!retval) {
 356                 DPRINTK (KERN_DEBUG "%s: ECP direction: reverse\n",
 357                          port->name);
 358                 port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 359         } else {
 360                 DPRINTK (KERN_DEBUG "%s: ECP direction: failed to reverse\n",
 361                          port->name);
 362                 port->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN;
 363         }
 364 
 365         return retval;
 366 }
 367 
 368 static inline
 369 int ecp_reverse_to_forward (struct parport *port)
 370 {
 371         int retval;
 372 
 373         /* Event 47: Set nInit high */
 374         parport_frob_control (port,
 375                               PARPORT_CONTROL_INIT
 376                               | PARPORT_CONTROL_AUTOFD,
 377                               PARPORT_CONTROL_INIT
 378                               | PARPORT_CONTROL_AUTOFD);
 379 
 380         /* Event 49: PError goes high */
 381         retval = parport_wait_peripheral (port,
 382                                           PARPORT_STATUS_PAPEROUT,
 383                                           PARPORT_STATUS_PAPEROUT);
 384 
 385         if (!retval) {
 386                 parport_data_forward (port);
 387                 DPRINTK (KERN_DEBUG "%s: ECP direction: forward\n",
 388                          port->name);
 389                 port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 390         } else {
 391                 DPRINTK (KERN_DEBUG
 392                          "%s: ECP direction: failed to switch forward\n",
 393                          port->name);
 394                 port->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN;
 395         }
 396 
 397 
 398         return retval;
 399 }
 400 
 401 #endif /* IEEE1284 support */
 402 
 403 /* ECP mode, forward channel, data. */
 404 size_t parport_ieee1284_ecp_write_data (struct parport *port,
 405                                         const void *buffer, size_t len,
 406                                         int flags)
 407 {
 408 #ifndef CONFIG_PARPORT_1284
 409         return 0;
 410 #else
 411         const unsigned char *buf = buffer;
 412         size_t written;
 413         int retry;
 414 
 415         port = port->physport;
 416 
 417         if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE)
 418                 if (ecp_reverse_to_forward (port))
 419                         return 0;
 420 
 421         port->ieee1284.phase = IEEE1284_PH_FWD_DATA;
 422 
 423         /* HostAck high (data, not command) */
 424         parport_frob_control (port,
 425                               PARPORT_CONTROL_AUTOFD
 426                               | PARPORT_CONTROL_STROBE
 427                               | PARPORT_CONTROL_INIT,
 428                               PARPORT_CONTROL_INIT);
 429         for (written = 0; written < len; written++, buf++) {
 430                 unsigned long expire = jiffies + port->cad->timeout;
 431                 unsigned char byte;
 432 
 433                 byte = *buf;
 434         try_again:
 435                 parport_write_data (port, byte);
 436                 parport_frob_control (port, PARPORT_CONTROL_STROBE,
 437                                       PARPORT_CONTROL_STROBE);
 438                 udelay (5);
 439                 for (retry = 0; retry < 100; retry++) {
 440                         if (!parport_wait_peripheral (port,
 441                                                       PARPORT_STATUS_BUSY, 0))
 442                                 goto success;
 443 
 444                         if (signal_pending (current)) {
 445                                 parport_frob_control (port,
 446                                                       PARPORT_CONTROL_STROBE,
 447                                                       0);
 448                                 break;
 449                         }
 450                 }
 451 
 452                 /* Time for Host Transfer Recovery (page 41 of IEEE1284) */
 453                 DPRINTK (KERN_DEBUG "%s: ECP transfer stalled!\n", port->name);
 454 
 455                 parport_frob_control (port, PARPORT_CONTROL_INIT,
 456                                       PARPORT_CONTROL_INIT);
 457                 udelay (50);
 458                 if (parport_read_status (port) & PARPORT_STATUS_PAPEROUT) {
 459                         /* It's buggered. */
 460                         parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 461                         break;
 462                 }
 463 
 464                 parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 465                 udelay (50);
 466                 if (!(parport_read_status (port) & PARPORT_STATUS_PAPEROUT))
 467                         break;
 468 
 469                 DPRINTK (KERN_DEBUG "%s: Host transfer recovered\n",
 470                          port->name);
 471 
 472                 if (time_after_eq (jiffies, expire)) break;
 473                 goto try_again;
 474         success:
 475                 parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 476                 udelay (5);
 477                 if (parport_wait_peripheral (port,
 478                                              PARPORT_STATUS_BUSY,
 479                                              PARPORT_STATUS_BUSY))
 480                         /* Peripheral hasn't accepted the data. */
 481                         break;
 482         }
 483 
 484         port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 485 
 486         return written;
 487 #endif /* IEEE1284 support */
 488 }
 489 
 490 /* ECP mode, reverse channel, data. */
 491 size_t parport_ieee1284_ecp_read_data (struct parport *port,
 492                                        void *buffer, size_t len, int flags)
 493 {
 494 #ifndef CONFIG_PARPORT_1284
 495         return 0;
 496 #else
 497         struct pardevice *dev = port->cad;
 498         unsigned char *buf = buffer;
 499         int rle_count = 0; /* shut gcc up */
 500         unsigned char ctl;
 501         int rle = 0;
 502         ssize_t count = 0;
 503 
 504         port = port->physport;
 505 
 506         if (port->ieee1284.phase != IEEE1284_PH_REV_IDLE)
 507                 if (ecp_forward_to_reverse (port))
 508                         return 0;
 509 
 510         port->ieee1284.phase = IEEE1284_PH_REV_DATA;
 511 
 512         /* Set HostAck low to start accepting data. */
 513         ctl = parport_read_control (port);
 514         ctl &= ~(PARPORT_CONTROL_STROBE | PARPORT_CONTROL_INIT |
 515                  PARPORT_CONTROL_AUTOFD);
 516         parport_write_control (port,
 517                                ctl | PARPORT_CONTROL_AUTOFD);
 518         while (count < len) {
 519                 unsigned long expire = jiffies + dev->timeout;
 520                 unsigned char byte;
 521                 int command;
 522 
 523                 /* Event 43: Peripheral sets nAck low. It can take as
 524                    long as it wants. */
 525                 while (parport_wait_peripheral (port, PARPORT_STATUS_ACK, 0)) {
 526                         /* The peripheral hasn't given us data in
 527                            35ms.  If we have data to give back to the
 528                            caller, do it now. */
 529                         if (count)
 530                                 goto out;
 531 
 532                         /* If we've used up all the time we were allowed,
 533                            give up altogether. */
 534                         if (!time_before (jiffies, expire))
 535                                 goto out;
 536 
 537                         /* Yield the port for a while. */
 538                         if (count && dev->port->irq != PARPORT_IRQ_NONE) {
 539                                 parport_release (dev);
 540                                 schedule_timeout_interruptible(msecs_to_jiffies(40));
 541                                 parport_claim_or_block (dev);
 542                         }
 543                         else
 544                                 /* We must have the device claimed here. */
 545                                 parport_wait_event (port, msecs_to_jiffies(40));
 546 
 547                         /* Is there a signal pending? */
 548                         if (signal_pending (current))
 549                                 goto out;
 550                 }
 551 
 552                 /* Is this a command? */
 553                 if (rle)
 554                         /* The last byte was a run-length count, so
 555                            this can't be as well. */
 556                         command = 0;
 557                 else
 558                         command = (parport_read_status (port) &
 559                                    PARPORT_STATUS_BUSY) ? 1 : 0;
 560 
 561                 /* Read the data. */
 562                 byte = parport_read_data (port);
 563 
 564                 /* If this is a channel command, rather than an RLE
 565                    command or a normal data byte, don't accept it. */
 566                 if (command) {
 567                         if (byte & 0x80) {
 568                                 DPRINTK (KERN_DEBUG "%s: stopping short at "
 569                                          "channel command (%02x)\n",
 570                                          port->name, byte);
 571                                 goto out;
 572                         }
 573                         else if (port->ieee1284.mode != IEEE1284_MODE_ECPRLE)
 574                                 DPRINTK (KERN_DEBUG "%s: device illegally "
 575                                          "using RLE; accepting anyway\n",
 576                                          port->name);
 577 
 578                         rle_count = byte + 1;
 579 
 580                         /* Are we allowed to read that many bytes? */
 581                         if (rle_count > (len - count)) {
 582                                 DPRINTK (KERN_DEBUG "%s: leaving %d RLE bytes "
 583                                          "for next time\n", port->name,
 584                                          rle_count);
 585                                 break;
 586                         }
 587 
 588                         rle = 1;
 589                 }
 590 
 591                 /* Event 44: Set HostAck high, acknowledging handshake. */
 592                 parport_write_control (port, ctl);
 593 
 594                 /* Event 45: The peripheral has 35ms to set nAck high. */
 595                 if (parport_wait_peripheral (port, PARPORT_STATUS_ACK,
 596                                              PARPORT_STATUS_ACK)) {
 597                         /* It's gone wrong.  Return what data we have
 598                            to the caller. */
 599                         DPRINTK (KERN_DEBUG "ECP read timed out at 45\n");
 600 
 601                         if (command)
 602                                 printk (KERN_WARNING
 603                                         "%s: command ignored (%02x)\n",
 604                                         port->name, byte);
 605 
 606                         break;
 607                 }
 608 
 609                 /* Event 46: Set HostAck low and accept the data. */
 610                 parport_write_control (port,
 611                                        ctl | PARPORT_CONTROL_AUTOFD);
 612 
 613                 /* If we just read a run-length count, fetch the data. */
 614                 if (command)
 615                         continue;
 616 
 617                 /* If this is the byte after a run-length count, decompress. */
 618                 if (rle) {
 619                         rle = 0;
 620                         memset (buf, byte, rle_count);
 621                         buf += rle_count;
 622                         count += rle_count;
 623                         DPRINTK (KERN_DEBUG "%s: decompressed to %d bytes\n",
 624                                  port->name, rle_count);
 625                 } else {
 626                         /* Normal data byte. */
 627                         *buf = byte;
 628                         buf++, count++;
 629                 }
 630         }
 631 
 632  out:
 633         port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
 634         return count;
 635 #endif /* IEEE1284 support */
 636 }
 637 
 638 /* ECP mode, forward channel, commands. */
 639 size_t parport_ieee1284_ecp_write_addr (struct parport *port,
 640                                         const void *buffer, size_t len,
 641                                         int flags)
 642 {
 643 #ifndef CONFIG_PARPORT_1284
 644         return 0;
 645 #else
 646         const unsigned char *buf = buffer;
 647         size_t written;
 648         int retry;
 649 
 650         port = port->physport;
 651 
 652         if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE)
 653                 if (ecp_reverse_to_forward (port))
 654                         return 0;
 655 
 656         port->ieee1284.phase = IEEE1284_PH_FWD_DATA;
 657 
 658         /* HostAck low (command, not data) */
 659         parport_frob_control (port,
 660                               PARPORT_CONTROL_AUTOFD
 661                               | PARPORT_CONTROL_STROBE
 662                               | PARPORT_CONTROL_INIT,
 663                               PARPORT_CONTROL_AUTOFD
 664                               | PARPORT_CONTROL_INIT);
 665         for (written = 0; written < len; written++, buf++) {
 666                 unsigned long expire = jiffies + port->cad->timeout;
 667                 unsigned char byte;
 668 
 669                 byte = *buf;
 670         try_again:
 671                 parport_write_data (port, byte);
 672                 parport_frob_control (port, PARPORT_CONTROL_STROBE,
 673                                       PARPORT_CONTROL_STROBE);
 674                 udelay (5);
 675                 for (retry = 0; retry < 100; retry++) {
 676                         if (!parport_wait_peripheral (port,
 677                                                       PARPORT_STATUS_BUSY, 0))
 678                                 goto success;
 679 
 680                         if (signal_pending (current)) {
 681                                 parport_frob_control (port,
 682                                                       PARPORT_CONTROL_STROBE,
 683                                                       0);
 684                                 break;
 685                         }
 686                 }
 687 
 688                 /* Time for Host Transfer Recovery (page 41 of IEEE1284) */
 689                 DPRINTK (KERN_DEBUG "%s: ECP transfer stalled!\n", port->name);
 690 
 691                 parport_frob_control (port, PARPORT_CONTROL_INIT,
 692                                       PARPORT_CONTROL_INIT);
 693                 udelay (50);
 694                 if (parport_read_status (port) & PARPORT_STATUS_PAPEROUT) {
 695                         /* It's buggered. */
 696                         parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 697                         break;
 698                 }
 699 
 700                 parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
 701                 udelay (50);
 702                 if (!(parport_read_status (port) & PARPORT_STATUS_PAPEROUT))
 703                         break;
 704 
 705                 DPRINTK (KERN_DEBUG "%s: Host transfer recovered\n",
 706                          port->name);
 707 
 708                 if (time_after_eq (jiffies, expire)) break;
 709                 goto try_again;
 710         success:
 711                 parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 712                 udelay (5);
 713                 if (parport_wait_peripheral (port,
 714                                              PARPORT_STATUS_BUSY,
 715                                              PARPORT_STATUS_BUSY))
 716                         /* Peripheral hasn't accepted the data. */
 717                         break;
 718         }
 719 
 720         port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
 721 
 722         return written;
 723 #endif /* IEEE1284 support */
 724 }
 725 
 726 /***              *
 727  * EPP functions. *
 728  *              ***/
 729 
 730 /* EPP mode, forward channel, data. */
 731 size_t parport_ieee1284_epp_write_data (struct parport *port,
 732                                         const void *buffer, size_t len,
 733                                         int flags)
 734 {
 735         unsigned char *bp = (unsigned char *) buffer;
 736         size_t ret = 0;
 737 
 738         /* set EPP idle state (just to make sure) with strobe low */
 739         parport_frob_control (port,
 740                               PARPORT_CONTROL_STROBE |
 741                               PARPORT_CONTROL_AUTOFD |
 742                               PARPORT_CONTROL_SELECT |
 743                               PARPORT_CONTROL_INIT,
 744                               PARPORT_CONTROL_STROBE |
 745                               PARPORT_CONTROL_INIT);
 746         port->ops->data_forward (port);
 747         for (; len > 0; len--, bp++) {
 748                 /* Event 62: Write data and set autofd low */
 749                 parport_write_data (port, *bp);
 750                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD,
 751                                       PARPORT_CONTROL_AUTOFD);
 752 
 753                 /* Event 58: wait for busy (nWait) to go high */
 754                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 0, 10))
 755                         break;
 756 
 757                 /* Event 63: set nAutoFd (nDStrb) high */
 758                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 759 
 760                 /* Event 60: wait for busy (nWait) to go low */
 761                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
 762                                              PARPORT_STATUS_BUSY, 5))
 763                         break;
 764 
 765                 ret++;
 766         }
 767 
 768         /* Event 61: set strobe (nWrite) high */
 769         parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 770 
 771         return ret;
 772 }
 773 
 774 /* EPP mode, reverse channel, data. */
 775 size_t parport_ieee1284_epp_read_data (struct parport *port,
 776                                        void *buffer, size_t len,
 777                                        int flags)
 778 {
 779         unsigned char *bp = (unsigned char *) buffer;
 780         unsigned ret = 0;
 781 
 782         /* set EPP idle state (just to make sure) with strobe high */
 783         parport_frob_control (port,
 784                               PARPORT_CONTROL_STROBE |
 785                               PARPORT_CONTROL_AUTOFD |
 786                               PARPORT_CONTROL_SELECT |
 787                               PARPORT_CONTROL_INIT,
 788                               PARPORT_CONTROL_INIT);
 789         port->ops->data_reverse (port);
 790         for (; len > 0; len--, bp++) {
 791                 /* Event 67: set nAutoFd (nDStrb) low */
 792                 parport_frob_control (port,
 793                                       PARPORT_CONTROL_AUTOFD,
 794                                       PARPORT_CONTROL_AUTOFD);
 795                 /* Event 58: wait for Busy to go high */
 796                 if (parport_wait_peripheral (port, PARPORT_STATUS_BUSY, 0)) {
 797                         break;
 798                 }
 799 
 800                 *bp = parport_read_data (port);
 801 
 802                 /* Event 63: set nAutoFd (nDStrb) high */
 803                 parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
 804 
 805                 /* Event 60: wait for Busy to go low */
 806                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
 807                                              PARPORT_STATUS_BUSY, 5)) {
 808                         break;
 809                 }
 810 
 811                 ret++;
 812         }
 813         port->ops->data_forward (port);
 814 
 815         return ret;
 816 }
 817 
 818 /* EPP mode, forward channel, addresses. */
 819 size_t parport_ieee1284_epp_write_addr (struct parport *port,
 820                                         const void *buffer, size_t len,
 821                                         int flags)
 822 {
 823         unsigned char *bp = (unsigned char *) buffer;
 824         size_t ret = 0;
 825 
 826         /* set EPP idle state (just to make sure) with strobe low */
 827         parport_frob_control (port,
 828                               PARPORT_CONTROL_STROBE |
 829                               PARPORT_CONTROL_AUTOFD |
 830                               PARPORT_CONTROL_SELECT |
 831                               PARPORT_CONTROL_INIT,
 832                               PARPORT_CONTROL_STROBE |
 833                               PARPORT_CONTROL_INIT);
 834         port->ops->data_forward (port);
 835         for (; len > 0; len--, bp++) {
 836                 /* Event 56: Write data and set nAStrb low. */
 837                 parport_write_data (port, *bp);
 838                 parport_frob_control (port, PARPORT_CONTROL_SELECT,
 839                                       PARPORT_CONTROL_SELECT);
 840 
 841                 /* Event 58: wait for busy (nWait) to go high */
 842                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 0, 10))
 843                         break;
 844 
 845                 /* Event 59: set nAStrb high */
 846                 parport_frob_control (port, PARPORT_CONTROL_SELECT, 0);
 847 
 848                 /* Event 60: wait for busy (nWait) to go low */
 849                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
 850                                              PARPORT_STATUS_BUSY, 5))
 851                         break;
 852 
 853                 ret++;
 854         }
 855 
 856         /* Event 61: set strobe (nWrite) high */
 857         parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
 858 
 859         return ret;
 860 }
 861 
 862 /* EPP mode, reverse channel, addresses. */
 863 size_t parport_ieee1284_epp_read_addr (struct parport *port,
 864                                        void *buffer, size_t len,
 865                                        int flags)
 866 {
 867         unsigned char *bp = (unsigned char *) buffer;
 868         unsigned ret = 0;
 869 
 870         /* Set EPP idle state (just to make sure) with strobe high */
 871         parport_frob_control (port,
 872                               PARPORT_CONTROL_STROBE |
 873                               PARPORT_CONTROL_AUTOFD |
 874                               PARPORT_CONTROL_SELECT |
 875                               PARPORT_CONTROL_INIT,
 876                               PARPORT_CONTROL_INIT);
 877         port->ops->data_reverse (port);
 878         for (; len > 0; len--, bp++) {
 879                 /* Event 64: set nSelectIn (nAStrb) low */
 880                 parport_frob_control (port, PARPORT_CONTROL_SELECT,
 881                                       PARPORT_CONTROL_SELECT);
 882 
 883                 /* Event 58: wait for Busy to go high */
 884                 if (parport_wait_peripheral (port, PARPORT_STATUS_BUSY, 0)) {
 885                         break;
 886                 }
 887 
 888                 *bp = parport_read_data (port);
 889 
 890                 /* Event 59: set nSelectIn (nAStrb) high */
 891                 parport_frob_control (port, PARPORT_CONTROL_SELECT,
 892                                       0);
 893 
 894                 /* Event 60: wait for Busy to go low */
 895                 if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 
 896                                              PARPORT_STATUS_BUSY, 5))
 897                         break;
 898 
 899                 ret++;
 900         }
 901         port->ops->data_forward (port);
 902 
 903         return ret;
 904 }
 905 
 906 EXPORT_SYMBOL(parport_ieee1284_ecp_write_data);
 907 EXPORT_SYMBOL(parport_ieee1284_ecp_read_data);
 908 EXPORT_SYMBOL(parport_ieee1284_ecp_write_addr);
 909 EXPORT_SYMBOL(parport_ieee1284_write_compat);
 910 EXPORT_SYMBOL(parport_ieee1284_read_nibble);
 911 EXPORT_SYMBOL(parport_ieee1284_read_byte);
 912 EXPORT_SYMBOL(parport_ieee1284_epp_write_data);
 913 EXPORT_SYMBOL(parport_ieee1284_epp_read_data);
 914 EXPORT_SYMBOL(parport_ieee1284_epp_write_addr);
 915 EXPORT_SYMBOL(parport_ieee1284_epp_read_addr);

/* [<][>][^][v][top][bottom][index][help] */