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