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.c (22402B)


      1/*
      2 * IEEE-1284 implementation for parport.
      3 *
      4 * Authors: Phil Blundell <philb@gnu.org>
      5 *          Carsten Gross <carsten@sol.wohnheim.uni-ulm.de>
      6 *	    Jose Renau <renau@acm.org>
      7 *          Tim Waugh <tim@cyberelk.demon.co.uk> (largely rewritten)
      8 *
      9 * This file is responsible for IEEE 1284 negotiation, and for handing
     10 * read/write requests to low-level drivers.
     11 *
     12 * Any part of this program may be used in documents licensed under
     13 * the GNU Free Documentation License, Version 1.1 or any later version
     14 * published by the Free Software Foundation.
     15 *
     16 * Various hacks, Fred Barnes <frmb2@ukc.ac.uk>, 04/2000
     17 */
     18
     19#include <linux/module.h>
     20#include <linux/threads.h>
     21#include <linux/parport.h>
     22#include <linux/delay.h>
     23#include <linux/kernel.h>
     24#include <linux/interrupt.h>
     25#include <linux/timer.h>
     26#include <linux/sched/signal.h>
     27
     28#undef DEBUG /* undef me for production */
     29
     30#ifdef CONFIG_LP_CONSOLE
     31#undef DEBUG /* Don't want a garbled console */
     32#endif
     33
     34/* Make parport_wait_peripheral wake up.
     35 * It will be useful to call this from an interrupt handler. */
     36static void parport_ieee1284_wakeup (struct parport *port)
     37{
     38	up (&port->physport->ieee1284.irq);
     39}
     40
     41static void timeout_waiting_on_port (struct timer_list *t)
     42{
     43	struct parport *port = from_timer(port, t, timer);
     44
     45	parport_ieee1284_wakeup (port);
     46}
     47
     48/**
     49 *	parport_wait_event - wait for an event on a parallel port
     50 *	@port: port to wait on
     51 *	@timeout: time to wait (in jiffies)
     52 *
     53 *	This function waits for up to @timeout jiffies for an
     54 *	interrupt to occur on a parallel port.  If the port timeout is
     55 *	set to zero, it returns immediately.
     56 *
     57 *	If an interrupt occurs before the timeout period elapses, this
     58 *	function returns zero immediately.  If it times out, it returns
     59 *	one.  An error code less than zero indicates an error (most
     60 *	likely a pending signal), and the calling code should finish
     61 *	what it's doing as soon as it can.
     62 */
     63
     64int parport_wait_event (struct parport *port, signed long timeout)
     65{
     66	int ret;
     67
     68	if (!port->physport->cad->timeout)
     69		/* Zero timeout is special, and we can't down() the
     70		   semaphore. */
     71		return 1;
     72
     73	timer_setup(&port->timer, timeout_waiting_on_port, 0);
     74	mod_timer(&port->timer, jiffies + timeout);
     75	ret = down_interruptible (&port->physport->ieee1284.irq);
     76	if (!del_timer_sync(&port->timer) && !ret)
     77		/* Timed out. */
     78		ret = 1;
     79
     80	return ret;
     81}
     82
     83/**
     84 *	parport_poll_peripheral - poll status lines
     85 *	@port: port to watch
     86 *	@mask: status lines to watch
     87 *	@result: desired values of chosen status lines
     88 *	@usec: timeout
     89 *
     90 *	This function busy-waits until the masked status lines have
     91 *	the desired values, or until the timeout period elapses.  The
     92 *	@mask and @result parameters are bitmasks, with the bits
     93 *	defined by the constants in parport.h: %PARPORT_STATUS_BUSY,
     94 *	and so on.
     95 *
     96 *	This function does not call schedule(); instead it busy-waits
     97 *	using udelay().  It currently has a resolution of 5usec.
     98 *
     99 *	If the status lines take on the desired values before the
    100 *	timeout period elapses, parport_poll_peripheral() returns zero
    101 *	immediately.  A return value greater than zero indicates
    102 *	a timeout.  An error code (less than zero) indicates an error,
    103 *	most likely a signal that arrived, and the caller should
    104 *	finish what it is doing as soon as possible.
    105*/
    106
    107int parport_poll_peripheral(struct parport *port,
    108			    unsigned char mask,
    109			    unsigned char result,
    110			    int usec)
    111{
    112	/* Zero return code is success, >0 is timeout. */
    113	int count = usec / 5 + 2;
    114	int i;
    115	unsigned char status;
    116	for (i = 0; i < count; i++) {
    117		status = parport_read_status (port);
    118		if ((status & mask) == result)
    119			return 0;
    120		if (signal_pending (current))
    121			return -EINTR;
    122		if (need_resched())
    123			break;
    124		if (i >= 2)
    125			udelay (5);
    126	}
    127
    128	return 1;
    129}
    130
    131/**
    132 *	parport_wait_peripheral - wait for status lines to change in 35ms
    133 *	@port: port to watch
    134 *	@mask: status lines to watch
    135 *	@result: desired values of chosen status lines
    136 *
    137 *	This function waits until the masked status lines have the
    138 *	desired values, or until 35ms have elapsed (see IEEE 1284-1994
    139 *	page 24 to 25 for why this value in particular is hardcoded).
    140 *	The @mask and @result parameters are bitmasks, with the bits
    141 *	defined by the constants in parport.h: %PARPORT_STATUS_BUSY,
    142 *	and so on.
    143 *
    144 *	The port is polled quickly to start off with, in anticipation
    145 *	of a fast response from the peripheral.  This fast polling
    146 *	time is configurable (using /proc), and defaults to 500usec.
    147 *	If the timeout for this port (see parport_set_timeout()) is
    148 *	zero, the fast polling time is 35ms, and this function does
    149 *	not call schedule().
    150 *
    151 *	If the timeout for this port is non-zero, after the fast
    152 *	polling fails it uses parport_wait_event() to wait for up to
    153 *	10ms, waking up if an interrupt occurs.
    154 */
    155
    156int parport_wait_peripheral(struct parport *port,
    157			    unsigned char mask, 
    158			    unsigned char result)
    159{
    160	int ret;
    161	int usec;
    162	unsigned long deadline;
    163	unsigned char status;
    164
    165	usec = port->physport->spintime; /* usecs of fast polling */
    166	if (!port->physport->cad->timeout)
    167		/* A zero timeout is "special": busy wait for the
    168		   entire 35ms. */
    169		usec = 35000;
    170
    171	/* Fast polling.
    172	 *
    173	 * This should be adjustable.
    174	 * How about making a note (in the device structure) of how long
    175	 * it takes, so we know for next time?
    176	 */
    177	ret = parport_poll_peripheral (port, mask, result, usec);
    178	if (ret != 1)
    179		return ret;
    180
    181	if (!port->physport->cad->timeout)
    182		/* We may be in an interrupt handler, so we can't poll
    183		 * slowly anyway. */
    184		return 1;
    185
    186	/* 40ms of slow polling. */
    187	deadline = jiffies + msecs_to_jiffies(40);
    188	while (time_before (jiffies, deadline)) {
    189		if (signal_pending (current))
    190			return -EINTR;
    191
    192		/* Wait for 10ms (or until an interrupt occurs if
    193		 * the handler is set) */
    194		if ((ret = parport_wait_event (port, msecs_to_jiffies(10))) < 0)
    195			return ret;
    196
    197		status = parport_read_status (port);
    198		if ((status & mask) == result)
    199			return 0;
    200
    201		if (!ret) {
    202			/* parport_wait_event didn't time out, but the
    203			 * peripheral wasn't actually ready either.
    204			 * Wait for another 10ms. */
    205			schedule_timeout_interruptible(msecs_to_jiffies(10));
    206		}
    207	}
    208
    209	return 1;
    210}
    211
    212#ifdef CONFIG_PARPORT_1284
    213/* Terminate a negotiated mode. */
    214static void parport_ieee1284_terminate (struct parport *port)
    215{
    216	int r;
    217	port = port->physport;
    218
    219	/* EPP terminates differently. */
    220	switch (port->ieee1284.mode) {
    221	case IEEE1284_MODE_EPP:
    222	case IEEE1284_MODE_EPPSL:
    223	case IEEE1284_MODE_EPPSWE:
    224		/* Terminate from EPP mode. */
    225
    226		/* Event 68: Set nInit low */
    227		parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
    228		udelay (50);
    229
    230		/* Event 69: Set nInit high, nSelectIn low */
    231		parport_frob_control (port,
    232				      PARPORT_CONTROL_SELECT
    233				      | PARPORT_CONTROL_INIT,
    234				      PARPORT_CONTROL_SELECT
    235				      | PARPORT_CONTROL_INIT);
    236		break;
    237
    238	case IEEE1284_MODE_ECP:
    239	case IEEE1284_MODE_ECPRLE:
    240	case IEEE1284_MODE_ECPSWE:
    241		/* In ECP we can only terminate from fwd idle phase. */
    242		if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE) {
    243			/* Event 47: Set nInit high */
    244			parport_frob_control (port,
    245					      PARPORT_CONTROL_INIT
    246					      | PARPORT_CONTROL_AUTOFD,
    247					      PARPORT_CONTROL_INIT
    248					      | PARPORT_CONTROL_AUTOFD);
    249
    250			/* Event 49: PError goes high */
    251			r = parport_wait_peripheral (port,
    252						     PARPORT_STATUS_PAPEROUT,
    253						     PARPORT_STATUS_PAPEROUT);
    254			if (r)
    255				pr_debug("%s: Timeout at event 49\n",
    256					 port->name);
    257
    258			parport_data_forward (port);
    259			pr_debug("%s: ECP direction: forward\n", port->name);
    260			port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
    261		}
    262
    263		fallthrough;
    264
    265	default:
    266		/* Terminate from all other modes. */
    267
    268		/* Event 22: Set nSelectIn low, nAutoFd high */
    269		parport_frob_control (port,
    270				      PARPORT_CONTROL_SELECT
    271				      | PARPORT_CONTROL_AUTOFD,
    272				      PARPORT_CONTROL_SELECT);
    273
    274		/* Event 24: nAck goes low */
    275		r = parport_wait_peripheral (port, PARPORT_STATUS_ACK, 0);
    276		if (r)
    277			pr_debug("%s: Timeout at event 24\n", port->name);
    278
    279		/* Event 25: Set nAutoFd low */
    280		parport_frob_control (port,
    281				      PARPORT_CONTROL_AUTOFD,
    282				      PARPORT_CONTROL_AUTOFD);
    283
    284		/* Event 27: nAck goes high */
    285		r = parport_wait_peripheral (port,
    286					     PARPORT_STATUS_ACK, 
    287					     PARPORT_STATUS_ACK);
    288		if (r)
    289			pr_debug("%s: Timeout at event 27\n", port->name);
    290
    291		/* Event 29: Set nAutoFd high */
    292		parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
    293	}
    294
    295	port->ieee1284.mode = IEEE1284_MODE_COMPAT;
    296	port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
    297
    298	pr_debug("%s: In compatibility (forward idle) mode\n", port->name);
    299}		
    300#endif /* IEEE1284 support */
    301
    302/**
    303 *	parport_negotiate - negotiate an IEEE 1284 mode
    304 *	@port: port to use
    305 *	@mode: mode to negotiate to
    306 *
    307 *	Use this to negotiate to a particular IEEE 1284 transfer mode.
    308 *	The @mode parameter should be one of the constants in
    309 *	parport.h starting %IEEE1284_MODE_xxx.
    310 *
    311 *	The return value is 0 if the peripheral has accepted the
    312 *	negotiation to the mode specified, -1 if the peripheral is not
    313 *	IEEE 1284 compliant (or not present), or 1 if the peripheral
    314 *	has rejected the negotiation.
    315 */
    316
    317int parport_negotiate (struct parport *port, int mode)
    318{
    319#ifndef CONFIG_PARPORT_1284
    320	if (mode == IEEE1284_MODE_COMPAT)
    321		return 0;
    322	pr_err("parport: IEEE1284 not supported in this kernel\n");
    323	return -1;
    324#else
    325	int m = mode & ~IEEE1284_ADDR;
    326	int r;
    327	unsigned char xflag;
    328
    329	port = port->physport;
    330
    331	/* Is there anything to do? */
    332	if (port->ieee1284.mode == mode)
    333		return 0;
    334
    335	/* Is the difference just an address-or-not bit? */
    336	if ((port->ieee1284.mode & ~IEEE1284_ADDR) == (mode & ~IEEE1284_ADDR)){
    337		port->ieee1284.mode = mode;
    338		return 0;
    339	}
    340
    341	/* Go to compatibility forward idle mode */
    342	if (port->ieee1284.mode != IEEE1284_MODE_COMPAT)
    343		parport_ieee1284_terminate (port);
    344
    345	if (mode == IEEE1284_MODE_COMPAT)
    346		/* Compatibility mode: no negotiation. */
    347		return 0; 
    348
    349	switch (mode) {
    350	case IEEE1284_MODE_ECPSWE:
    351		m = IEEE1284_MODE_ECP;
    352		break;
    353	case IEEE1284_MODE_EPPSL:
    354	case IEEE1284_MODE_EPPSWE:
    355		m = IEEE1284_MODE_EPP;
    356		break;
    357	case IEEE1284_MODE_BECP:
    358		return -ENOSYS; /* FIXME (implement BECP) */
    359	}
    360
    361	if (mode & IEEE1284_EXT_LINK)
    362		m = 1<<7; /* request extensibility link */
    363
    364	port->ieee1284.phase = IEEE1284_PH_NEGOTIATION;
    365
    366	/* Start off with nStrobe and nAutoFd high, and nSelectIn low */
    367	parport_frob_control (port,
    368			      PARPORT_CONTROL_STROBE
    369			      | PARPORT_CONTROL_AUTOFD
    370			      | PARPORT_CONTROL_SELECT,
    371			      PARPORT_CONTROL_SELECT);
    372	udelay(1);
    373
    374	/* Event 0: Set data */
    375	parport_data_forward (port);
    376	parport_write_data (port, m);
    377	udelay (400); /* Shouldn't need to wait this long. */
    378
    379	/* Event 1: Set nSelectIn high, nAutoFd low */
    380	parport_frob_control (port,
    381			      PARPORT_CONTROL_SELECT
    382			      | PARPORT_CONTROL_AUTOFD,
    383			      PARPORT_CONTROL_AUTOFD);
    384
    385	/* Event 2: PError, Select, nFault go high, nAck goes low */
    386	if (parport_wait_peripheral (port,
    387				     PARPORT_STATUS_ERROR
    388				     | PARPORT_STATUS_SELECT
    389				     | PARPORT_STATUS_PAPEROUT
    390				     | PARPORT_STATUS_ACK,
    391				     PARPORT_STATUS_ERROR
    392				     | PARPORT_STATUS_SELECT
    393				     | PARPORT_STATUS_PAPEROUT)) {
    394		/* Timeout */
    395		parport_frob_control (port,
    396				      PARPORT_CONTROL_SELECT
    397				      | PARPORT_CONTROL_AUTOFD,
    398				      PARPORT_CONTROL_SELECT);
    399		pr_debug("%s: Peripheral not IEEE1284 compliant (0x%02X)\n",
    400			 port->name, parport_read_status (port));
    401		port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
    402		return -1; /* Not IEEE1284 compliant */
    403	}
    404
    405	/* Event 3: Set nStrobe low */
    406	parport_frob_control (port,
    407			      PARPORT_CONTROL_STROBE,
    408			      PARPORT_CONTROL_STROBE);
    409
    410	/* Event 4: Set nStrobe and nAutoFd high */
    411	udelay (5);
    412	parport_frob_control (port,
    413			      PARPORT_CONTROL_STROBE
    414			      | PARPORT_CONTROL_AUTOFD,
    415			      0);
    416
    417	/* Event 6: nAck goes high */
    418	if (parport_wait_peripheral (port,
    419				     PARPORT_STATUS_ACK,
    420				     PARPORT_STATUS_ACK)) {
    421		/* This shouldn't really happen with a compliant device. */
    422		pr_debug("%s: Mode 0x%02x not supported? (0x%02x)\n",
    423			 port->name, mode, port->ops->read_status (port));
    424		parport_ieee1284_terminate (port);
    425		return 1;
    426	}
    427
    428	xflag = parport_read_status (port) & PARPORT_STATUS_SELECT;
    429
    430	/* xflag should be high for all modes other than nibble (0). */
    431	if (mode && !xflag) {
    432		/* Mode not supported. */
    433		pr_debug("%s: Mode 0x%02x rejected by peripheral\n",
    434			 port->name, mode);
    435		parport_ieee1284_terminate (port);
    436		return 1;
    437	}
    438
    439	/* More to do if we've requested extensibility link. */
    440	if (mode & IEEE1284_EXT_LINK) {
    441		m = mode & 0x7f;
    442		udelay (1);
    443		parport_write_data (port, m);
    444		udelay (1);
    445
    446		/* Event 51: Set nStrobe low */
    447		parport_frob_control (port,
    448				      PARPORT_CONTROL_STROBE,
    449				      PARPORT_CONTROL_STROBE);
    450
    451		/* Event 52: nAck goes low */
    452		if (parport_wait_peripheral (port, PARPORT_STATUS_ACK, 0)) {
    453			/* This peripheral is _very_ slow. */
    454			pr_debug("%s: Event 52 didn't happen\n", port->name);
    455			parport_ieee1284_terminate (port);
    456			return 1;
    457		}
    458
    459		/* Event 53: Set nStrobe high */
    460		parport_frob_control (port,
    461				      PARPORT_CONTROL_STROBE,
    462				      0);
    463
    464		/* Event 55: nAck goes high */
    465		if (parport_wait_peripheral (port,
    466					     PARPORT_STATUS_ACK,
    467					     PARPORT_STATUS_ACK)) {
    468			/* This shouldn't really happen with a compliant
    469			 * device. */
    470			pr_debug("%s: Mode 0x%02x not supported? (0x%02x)\n",
    471				 port->name, mode,
    472				 port->ops->read_status(port));
    473			parport_ieee1284_terminate (port);
    474			return 1;
    475		}
    476
    477		/* Event 54: Peripheral sets XFlag to reflect support */
    478		xflag = parport_read_status (port) & PARPORT_STATUS_SELECT;
    479
    480		/* xflag should be high. */
    481		if (!xflag) {
    482			/* Extended mode not supported. */
    483			pr_debug("%s: Extended mode 0x%02x not supported\n",
    484				 port->name, mode);
    485			parport_ieee1284_terminate (port);
    486			return 1;
    487		}
    488
    489		/* Any further setup is left to the caller. */
    490	}
    491
    492	/* Mode is supported */
    493	pr_debug("%s: In mode 0x%02x\n", port->name, mode);
    494	port->ieee1284.mode = mode;
    495
    496	/* But ECP is special */
    497	if (!(mode & IEEE1284_EXT_LINK) && (m & IEEE1284_MODE_ECP)) {
    498		port->ieee1284.phase = IEEE1284_PH_ECP_SETUP;
    499
    500		/* Event 30: Set nAutoFd low */
    501		parport_frob_control (port,
    502				      PARPORT_CONTROL_AUTOFD,
    503				      PARPORT_CONTROL_AUTOFD);
    504
    505		/* Event 31: PError goes high. */
    506		r = parport_wait_peripheral (port,
    507					     PARPORT_STATUS_PAPEROUT,
    508					     PARPORT_STATUS_PAPEROUT);
    509		if (r) {
    510			pr_debug("%s: Timeout at event 31\n", port->name);
    511		}
    512
    513		port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
    514		pr_debug("%s: ECP direction: forward\n", port->name);
    515	} else switch (mode) {
    516	case IEEE1284_MODE_NIBBLE:
    517	case IEEE1284_MODE_BYTE:
    518		port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
    519		break;
    520	default:
    521		port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
    522	}
    523
    524
    525	return 0;
    526#endif /* IEEE1284 support */
    527}
    528
    529/* Acknowledge that the peripheral has data available.
    530 * Events 18-20, in order to get from Reverse Idle phase
    531 * to Host Busy Data Available.
    532 * This will most likely be called from an interrupt.
    533 * Returns zero if data was available.
    534 */
    535#ifdef CONFIG_PARPORT_1284
    536static int parport_ieee1284_ack_data_avail (struct parport *port)
    537{
    538	if (parport_read_status (port) & PARPORT_STATUS_ERROR)
    539		/* Event 18 didn't happen. */
    540		return -1;
    541
    542	/* Event 20: nAutoFd goes high. */
    543	port->ops->frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
    544	port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
    545	return 0;
    546}
    547#endif /* IEEE1284 support */
    548
    549/* Handle an interrupt. */
    550void parport_ieee1284_interrupt (void *handle)
    551{
    552	struct parport *port = handle;
    553	parport_ieee1284_wakeup (port);
    554
    555#ifdef CONFIG_PARPORT_1284
    556	if (port->ieee1284.phase == IEEE1284_PH_REV_IDLE) {
    557		/* An interrupt in this phase means that data
    558		 * is now available. */
    559		pr_debug("%s: Data available\n", port->name);
    560		parport_ieee1284_ack_data_avail (port);
    561	}
    562#endif /* IEEE1284 support */
    563}
    564
    565/**
    566 *	parport_write - write a block of data to a parallel port
    567 *	@port: port to write to
    568 *	@buffer: data buffer (in kernel space)
    569 *	@len: number of bytes of data to transfer
    570 *
    571 *	This will write up to @len bytes of @buffer to the port
    572 *	specified, using the IEEE 1284 transfer mode most recently
    573 *	negotiated to (using parport_negotiate()), as long as that
    574 *	mode supports forward transfers (host to peripheral).
    575 *
    576 *	It is the caller's responsibility to ensure that the first
    577 *	@len bytes of @buffer are valid.
    578 *
    579 *	This function returns the number of bytes transferred (if zero
    580 *	or positive), or else an error code.
    581 */
    582
    583ssize_t parport_write (struct parport *port, const void *buffer, size_t len)
    584{
    585#ifndef CONFIG_PARPORT_1284
    586	return port->ops->compat_write_data (port, buffer, len, 0);
    587#else
    588	ssize_t retval;
    589	int mode = port->ieee1284.mode;
    590	int addr = mode & IEEE1284_ADDR;
    591	size_t (*fn) (struct parport *, const void *, size_t, int);
    592
    593	/* Ignore the device-ID-request bit and the address bit. */
    594	mode &= ~(IEEE1284_DEVICEID | IEEE1284_ADDR);
    595
    596	/* Use the mode we're in. */
    597	switch (mode) {
    598	case IEEE1284_MODE_NIBBLE:
    599	case IEEE1284_MODE_BYTE:
    600		parport_negotiate (port, IEEE1284_MODE_COMPAT);
    601		fallthrough;
    602	case IEEE1284_MODE_COMPAT:
    603		pr_debug("%s: Using compatibility mode\n", port->name);
    604		fn = port->ops->compat_write_data;
    605		break;
    606
    607	case IEEE1284_MODE_EPP:
    608		pr_debug("%s: Using EPP mode\n", port->name);
    609		if (addr) {
    610			fn = port->ops->epp_write_addr;
    611		} else {
    612			fn = port->ops->epp_write_data;
    613		}
    614		break;
    615	case IEEE1284_MODE_EPPSWE:
    616		pr_debug("%s: Using software-emulated EPP mode\n", port->name);
    617		if (addr) {
    618			fn = parport_ieee1284_epp_write_addr;
    619		} else {
    620			fn = parport_ieee1284_epp_write_data;
    621		}
    622		break;
    623	case IEEE1284_MODE_ECP:
    624	case IEEE1284_MODE_ECPRLE:
    625		pr_debug("%s: Using ECP mode\n", port->name);
    626		if (addr) {
    627			fn = port->ops->ecp_write_addr;
    628		} else {
    629			fn = port->ops->ecp_write_data;
    630		}
    631		break;
    632
    633	case IEEE1284_MODE_ECPSWE:
    634		pr_debug("%s: Using software-emulated ECP mode\n", port->name);
    635		/* The caller has specified that it must be emulated,
    636		 * even if we have ECP hardware! */
    637		if (addr) {
    638			fn = parport_ieee1284_ecp_write_addr;
    639		} else {
    640			fn = parport_ieee1284_ecp_write_data;
    641		}
    642		break;
    643
    644	default:
    645		pr_debug("%s: Unknown mode 0x%02x\n",
    646			 port->name, port->ieee1284.mode);
    647		return -ENOSYS;
    648	}
    649
    650	retval = (*fn) (port, buffer, len, 0);
    651	pr_debug("%s: wrote %zd/%zu bytes\n", port->name, retval, len);
    652	return retval;
    653#endif /* IEEE1284 support */
    654}
    655
    656/**
    657 *	parport_read - read a block of data from a parallel port
    658 *	@port: port to read from
    659 *	@buffer: data buffer (in kernel space)
    660 *	@len: number of bytes of data to transfer
    661 *
    662 *	This will read up to @len bytes of @buffer to the port
    663 *	specified, using the IEEE 1284 transfer mode most recently
    664 *	negotiated to (using parport_negotiate()), as long as that
    665 *	mode supports reverse transfers (peripheral to host).
    666 *
    667 *	It is the caller's responsibility to ensure that the first
    668 *	@len bytes of @buffer are available to write to.
    669 *
    670 *	This function returns the number of bytes transferred (if zero
    671 *	or positive), or else an error code.
    672 */
    673
    674ssize_t parport_read (struct parport *port, void *buffer, size_t len)
    675{
    676#ifndef CONFIG_PARPORT_1284
    677	pr_err("parport: IEEE1284 not supported in this kernel\n");
    678	return -ENODEV;
    679#else
    680	int mode = port->physport->ieee1284.mode;
    681	int addr = mode & IEEE1284_ADDR;
    682	size_t (*fn) (struct parport *, void *, size_t, int);
    683
    684	/* Ignore the device-ID-request bit and the address bit. */
    685	mode &= ~(IEEE1284_DEVICEID | IEEE1284_ADDR);
    686
    687	/* Use the mode we're in. */
    688	switch (mode) {
    689	case IEEE1284_MODE_COMPAT:
    690		/* if we can tri-state use BYTE mode instead of NIBBLE mode,
    691		 * if that fails, revert to NIBBLE mode -- ought to store somewhere
    692		 * the device's ability to do BYTE mode reverse transfers, so we don't
    693		 * end up needlessly calling negotiate(BYTE) repeately..  (fb)
    694		 */
    695		if ((port->physport->modes & PARPORT_MODE_TRISTATE) &&
    696		    !parport_negotiate (port, IEEE1284_MODE_BYTE)) {
    697			/* got into BYTE mode OK */
    698			pr_debug("%s: Using byte mode\n", port->name);
    699			fn = port->ops->byte_read_data;
    700			break;
    701		}
    702		if (parport_negotiate (port, IEEE1284_MODE_NIBBLE)) {
    703			return -EIO;
    704		}
    705		fallthrough;	/* to NIBBLE */
    706	case IEEE1284_MODE_NIBBLE:
    707		pr_debug("%s: Using nibble mode\n", port->name);
    708		fn = port->ops->nibble_read_data;
    709		break;
    710
    711	case IEEE1284_MODE_BYTE:
    712		pr_debug("%s: Using byte mode\n", port->name);
    713		fn = port->ops->byte_read_data;
    714		break;
    715
    716	case IEEE1284_MODE_EPP:
    717		pr_debug("%s: Using EPP mode\n", port->name);
    718		if (addr) {
    719			fn = port->ops->epp_read_addr;
    720		} else {
    721			fn = port->ops->epp_read_data;
    722		}
    723		break;
    724	case IEEE1284_MODE_EPPSWE:
    725		pr_debug("%s: Using software-emulated EPP mode\n", port->name);
    726		if (addr) {
    727			fn = parport_ieee1284_epp_read_addr;
    728		} else {
    729			fn = parport_ieee1284_epp_read_data;
    730		}
    731		break;
    732	case IEEE1284_MODE_ECP:
    733	case IEEE1284_MODE_ECPRLE:
    734		pr_debug("%s: Using ECP mode\n", port->name);
    735		fn = port->ops->ecp_read_data;
    736		break;
    737
    738	case IEEE1284_MODE_ECPSWE:
    739		pr_debug("%s: Using software-emulated ECP mode\n", port->name);
    740		fn = parport_ieee1284_ecp_read_data;
    741		break;
    742
    743	default:
    744		pr_debug("%s: Unknown mode 0x%02x\n",
    745			 port->name, port->physport->ieee1284.mode);
    746		return -ENOSYS;
    747	}
    748
    749	return (*fn) (port, buffer, len, 0);
    750#endif /* IEEE1284 support */
    751}
    752
    753/**
    754 *	parport_set_timeout - set the inactivity timeout for a device
    755 *	@dev: device on a port
    756 *	@inactivity: inactivity timeout (in jiffies)
    757 *
    758 *	This sets the inactivity timeout for a particular device on a
    759 *	port.  This affects functions like parport_wait_peripheral().
    760 *	The special value 0 means not to call schedule() while dealing
    761 *	with this device.
    762 *
    763 *	The return value is the previous inactivity timeout.
    764 *
    765 *	Any callers of parport_wait_event() for this device are woken
    766 *	up.
    767 */
    768
    769long parport_set_timeout (struct pardevice *dev, long inactivity)
    770{
    771	long int old = dev->timeout;
    772
    773	dev->timeout = inactivity;
    774
    775	if (dev->port->physport->cad == dev)
    776		parport_ieee1284_wakeup (dev->port);
    777
    778	return old;
    779}
    780
    781/* Exported symbols for modules. */
    782
    783EXPORT_SYMBOL(parport_negotiate);
    784EXPORT_SYMBOL(parport_write);
    785EXPORT_SYMBOL(parport_read);
    786EXPORT_SYMBOL(parport_wait_peripheral);
    787EXPORT_SYMBOL(parport_wait_event);
    788EXPORT_SYMBOL(parport_set_timeout);
    789EXPORT_SYMBOL(parport_ieee1284_interrupt);