• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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. */
parport_ieee1284_write_compat(struct parport * port,const void * buffer,size_t len,int flags)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. */
parport_ieee1284_read_nibble(struct parport * port,void * buffer,size_t len,int flags)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. */
parport_ieee1284_read_byte(struct parport * port,void * buffer,size_t len,int flags)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
ecp_forward_to_reverse(struct parport * port)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
ecp_reverse_to_forward(struct parport * port)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. */
parport_ieee1284_ecp_write_data(struct parport * port,const void * buffer,size_t len,int flags)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. */
parport_ieee1284_ecp_read_data(struct parport * port,void * buffer,size_t len,int flags)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. */
parport_ieee1284_ecp_write_addr(struct parport * port,const void * buffer,size_t len,int flags)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. */
parport_ieee1284_epp_write_data(struct parport * port,const void * buffer,size_t len,int flags)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. */
parport_ieee1284_epp_read_data(struct parport * port,void * buffer,size_t len,int flags)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. */
parport_ieee1284_epp_write_addr(struct parport * port,const void * buffer,size_t len,int flags)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. */
parport_ieee1284_epp_read_addr(struct parport * port,void * buffer,size_t len,int flags)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