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