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