cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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);