|
@@ -197,54 +197,6 @@ static int change_mode(struct parport *p, int m)
|
|
|
ECR_WRITE(p, oecr);
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
-#ifdef CONFIG_PARPORT_1284
|
|
|
-/* Find FIFO lossage; FIFO is reset */
|
|
|
-#if 0
|
|
|
-static int get_fifo_residue(struct parport *p)
|
|
|
-{
|
|
|
- int residue;
|
|
|
- int cnfga;
|
|
|
- const struct parport_pc_private *priv = p->physport->private_data;
|
|
|
-
|
|
|
- /* Adjust for the contents of the FIFO. */
|
|
|
- for (residue = priv->fifo_depth; ; residue--) {
|
|
|
- if (inb(ECONTROL(p)) & 0x2)
|
|
|
- /* Full up. */
|
|
|
- break;
|
|
|
-
|
|
|
- outb(0, FIFO(p));
|
|
|
- }
|
|
|
-
|
|
|
- printk(KERN_DEBUG "%s: %d PWords were left in FIFO\n", p->name,
|
|
|
- residue);
|
|
|
-
|
|
|
- /* Reset the FIFO. */
|
|
|
- frob_set_mode(p, ECR_PS2);
|
|
|
-
|
|
|
- /* Now change to config mode and clean up. FIXME */
|
|
|
- frob_set_mode(p, ECR_CNF);
|
|
|
- cnfga = inb(CONFIGA(p));
|
|
|
- printk(KERN_DEBUG "%s: cnfgA contains 0x%02x\n", p->name, cnfga);
|
|
|
-
|
|
|
- if (!(cnfga & (1<<2))) {
|
|
|
- printk(KERN_DEBUG "%s: Accounting for extra byte\n", p->name);
|
|
|
- residue++;
|
|
|
- }
|
|
|
-
|
|
|
- /* Don't care about partial PWords until support is added for
|
|
|
- * PWord != 1 byte. */
|
|
|
-
|
|
|
- /* Back to PS2 mode. */
|
|
|
- frob_set_mode(p, ECR_PS2);
|
|
|
-
|
|
|
- DPRINTK(KERN_DEBUG
|
|
|
- "*** get_fifo_residue: done residue collecting (ecr = 0x%2.2x)\n",
|
|
|
- inb(ECONTROL(p)));
|
|
|
- return residue;
|
|
|
-}
|
|
|
-#endif /* 0 */
|
|
|
-#endif /* IEEE 1284 support */
|
|
|
#endif /* FIFO support */
|
|
|
|
|
|
/*
|
|
@@ -940,234 +892,6 @@ static size_t parport_pc_ecp_write_block_pio(struct parport *port,
|
|
|
|
|
|
return written;
|
|
|
}
|
|
|
-
|
|
|
-#if 0
|
|
|
-static size_t parport_pc_ecp_read_block_pio(struct parport *port,
|
|
|
- void *buf, size_t length,
|
|
|
- int flags)
|
|
|
-{
|
|
|
- size_t left = length;
|
|
|
- size_t fifofull;
|
|
|
- int r;
|
|
|
- const int fifo = FIFO(port);
|
|
|
- const struct parport_pc_private *priv = port->physport->private_data;
|
|
|
- const int fifo_depth = priv->fifo_depth;
|
|
|
- char *bufp = buf;
|
|
|
-
|
|
|
- port = port->physport;
|
|
|
- DPRINTK(KERN_DEBUG "parport_pc: parport_pc_ecp_read_block_pio\n");
|
|
|
- dump_parport_state("enter fcn", port);
|
|
|
-
|
|
|
- /* Special case: a timeout of zero means we cannot call schedule().
|
|
|
- * Also if O_NONBLOCK is set then use the default implementation. */
|
|
|
- if (port->cad->timeout <= PARPORT_INACTIVITY_O_NONBLOCK)
|
|
|
- return parport_ieee1284_ecp_read_data(port, buf,
|
|
|
- length, flags);
|
|
|
-
|
|
|
- if (port->ieee1284.mode == IEEE1284_MODE_ECPRLE) {
|
|
|
- /* If the peripheral is allowed to send RLE compressed
|
|
|
- * data, it is possible for a byte to expand to 128
|
|
|
- * bytes in the FIFO. */
|
|
|
- fifofull = 128;
|
|
|
- } else {
|
|
|
- fifofull = fifo_depth;
|
|
|
- }
|
|
|
-
|
|
|
- /* If the caller wants less than a full FIFO's worth of data,
|
|
|
- * go through software emulation. Otherwise we may have to throw
|
|
|
- * away data. */
|
|
|
- if (length < fifofull)
|
|
|
- return parport_ieee1284_ecp_read_data(port, buf,
|
|
|
- length, flags);
|
|
|
-
|
|
|
- if (port->ieee1284.phase != IEEE1284_PH_REV_IDLE) {
|
|
|
- /* change to reverse-idle phase (must be in forward-idle) */
|
|
|
-
|
|
|
- /* Event 38: Set nAutoFd low (also make sure nStrobe is high) */
|
|
|
- parport_frob_control(port,
|
|
|
- PARPORT_CONTROL_AUTOFD
|
|
|
- | PARPORT_CONTROL_STROBE,
|
|
|
- PARPORT_CONTROL_AUTOFD);
|
|
|
- parport_pc_data_reverse(port); /* Must be in PS2 mode */
|
|
|
- udelay(5);
|
|
|
- /* Event 39: Set nInit low to initiate bus reversal */
|
|
|
- parport_frob_control(port,
|
|
|
- PARPORT_CONTROL_INIT,
|
|
|
- 0);
|
|
|
- /* Event 40: Wait for nAckReverse (PError) to go low */
|
|
|
- r = parport_wait_peripheral(port, PARPORT_STATUS_PAPEROUT, 0);
|
|
|
- if (r) {
|
|
|
- printk(KERN_DEBUG "%s: PE timeout Event 40 (%d) "
|
|
|
- "in ecp_read_block_pio\n", port->name, r);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* Set up ECP FIFO mode.*/
|
|
|
-/* parport_pc_frob_control(port,
|
|
|
- PARPORT_CONTROL_STROBE |
|
|
|
- PARPORT_CONTROL_AUTOFD,
|
|
|
- PARPORT_CONTROL_AUTOFD); */
|
|
|
- r = change_mode(port, ECR_ECP); /* ECP FIFO */
|
|
|
- if (r)
|
|
|
- printk(KERN_DEBUG "%s: Warning change_mode ECR_ECP failed\n",
|
|
|
- port->name);
|
|
|
-
|
|
|
- port->ieee1284.phase = IEEE1284_PH_REV_DATA;
|
|
|
-
|
|
|
- /* the first byte must be collected manually */
|
|
|
- dump_parport_state("pre 43", port);
|
|
|
- /* Event 43: Wait for nAck to go low */
|
|
|
- r = parport_wait_peripheral(port, PARPORT_STATUS_ACK, 0);
|
|
|
- if (r) {
|
|
|
- /* timed out while reading -- no data */
|
|
|
- printk(KERN_DEBUG "PIO read timed out (initial byte)\n");
|
|
|
- goto out_no_data;
|
|
|
- }
|
|
|
- /* read byte */
|
|
|
- *bufp++ = inb(DATA(port));
|
|
|
- left--;
|
|
|
- dump_parport_state("43-44", port);
|
|
|
- /* Event 44: nAutoFd (HostAck) goes high to acknowledge */
|
|
|
- parport_pc_frob_control(port,
|
|
|
- PARPORT_CONTROL_AUTOFD,
|
|
|
- 0);
|
|
|
- dump_parport_state("pre 45", port);
|
|
|
- /* Event 45: Wait for nAck to go high */
|
|
|
- /* r = parport_wait_peripheral(port, PARPORT_STATUS_ACK,
|
|
|
- PARPORT_STATUS_ACK); */
|
|
|
- dump_parport_state("post 45", port);
|
|
|
- r = 0;
|
|
|
- if (r) {
|
|
|
- /* timed out while waiting for peripheral to respond to ack */
|
|
|
- printk(KERN_DEBUG "ECP PIO read timed out (waiting for nAck)\n");
|
|
|
-
|
|
|
- /* keep hold of the byte we've got already */
|
|
|
- goto out_no_data;
|
|
|
- }
|
|
|
- /* Event 46: nAutoFd (HostAck) goes low to accept more data */
|
|
|
- parport_pc_frob_control(port,
|
|
|
- PARPORT_CONTROL_AUTOFD,
|
|
|
- PARPORT_CONTROL_AUTOFD);
|
|
|
-
|
|
|
-
|
|
|
- dump_parport_state("rev idle", port);
|
|
|
- /* Do the transfer. */
|
|
|
- while (left > fifofull) {
|
|
|
- int ret;
|
|
|
- unsigned long expire = jiffies + port->cad->timeout;
|
|
|
- unsigned char ecrval = inb(ECONTROL(port));
|
|
|
-
|
|
|
- if (need_resched() && time_before(jiffies, expire))
|
|
|
- /* Can't yield the port. */
|
|
|
- schedule();
|
|
|
-
|
|
|
- /* At this point, the FIFO may already be full. In
|
|
|
- * that case ECP is already holding back the
|
|
|
- * peripheral (assuming proper design) with a delayed
|
|
|
- * handshake. Work fast to avoid a peripheral
|
|
|
- * timeout. */
|
|
|
-
|
|
|
- if (ecrval & 0x01) {
|
|
|
- /* FIFO is empty. Wait for interrupt. */
|
|
|
- dump_parport_state("FIFO empty", port);
|
|
|
-
|
|
|
- /* Anyone else waiting for the port? */
|
|
|
- if (port->waithead) {
|
|
|
- printk(KERN_DEBUG "Somebody wants the port\n");
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- /* Clear serviceIntr */
|
|
|
- ECR_WRITE(port, ecrval & ~(1<<2));
|
|
|
-false_alarm:
|
|
|
- dump_parport_state("waiting", port);
|
|
|
- ret = parport_wait_event(port, HZ);
|
|
|
- DPRINTK(KERN_DEBUG "parport_wait_event returned %d\n",
|
|
|
- ret);
|
|
|
- if (ret < 0)
|
|
|
- break;
|
|
|
- ret = 0;
|
|
|
- if (!time_before(jiffies, expire)) {
|
|
|
- /* Timed out. */
|
|
|
- dump_parport_state("timeout", port);
|
|
|
- printk(KERN_DEBUG "PIO read timed out\n");
|
|
|
- break;
|
|
|
- }
|
|
|
- ecrval = inb(ECONTROL(port));
|
|
|
- if (!(ecrval & (1<<2))) {
|
|
|
- if (need_resched() &&
|
|
|
- time_before(jiffies, expire)) {
|
|
|
- schedule();
|
|
|
- }
|
|
|
- goto false_alarm;
|
|
|
- }
|
|
|
-
|
|
|
- /* Depending on how the FIFO threshold was
|
|
|
- * set, how long interrupt service took, and
|
|
|
- * how fast the peripheral is, we might be
|
|
|
- * lucky and have a just filled FIFO. */
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if (ecrval & 0x02) {
|
|
|
- /* FIFO is full. */
|
|
|
- dump_parport_state("FIFO full", port);
|
|
|
- insb(fifo, bufp, fifo_depth);
|
|
|
- bufp += fifo_depth;
|
|
|
- left -= fifo_depth;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- DPRINTK(KERN_DEBUG
|
|
|
- "*** ecp_read_block_pio: reading one byte from the FIFO\n");
|
|
|
-
|
|
|
- /* FIFO not filled. We will cycle this loop for a while
|
|
|
- * and either the peripheral will fill it faster,
|
|
|
- * tripping a fast empty with insb, or we empty it. */
|
|
|
- *bufp++ = inb(fifo);
|
|
|
- left--;
|
|
|
- }
|
|
|
-
|
|
|
- /* scoop up anything left in the FIFO */
|
|
|
- while (left && !(inb(ECONTROL(port) & 0x01))) {
|
|
|
- *bufp++ = inb(fifo);
|
|
|
- left--;
|
|
|
- }
|
|
|
-
|
|
|
- port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
|
|
|
- dump_parport_state("rev idle2", port);
|
|
|
-
|
|
|
-out_no_data:
|
|
|
-
|
|
|
- /* Go to forward idle mode to shut the peripheral up (event 47). */
|
|
|
- parport_frob_control(port, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
|
|
|
-
|
|
|
- /* event 49: PError goes high */
|
|
|
- r = parport_wait_peripheral(port,
|
|
|
- PARPORT_STATUS_PAPEROUT,
|
|
|
- PARPORT_STATUS_PAPEROUT);
|
|
|
- if (r) {
|
|
|
- printk(KERN_DEBUG
|
|
|
- "%s: PE timeout FWDIDLE (%d) in ecp_read_block_pio\n",
|
|
|
- port->name, r);
|
|
|
- }
|
|
|
-
|
|
|
- port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
|
|
|
-
|
|
|
- /* Finish up. */
|
|
|
- {
|
|
|
- int lost = get_fifo_residue(port);
|
|
|
- if (lost)
|
|
|
- /* Shouldn't happen with compliant peripherals. */
|
|
|
- printk(KERN_DEBUG "%s: DATA LOSS (%d bytes)!\n",
|
|
|
- port->name, lost);
|
|
|
- }
|
|
|
-
|
|
|
- dump_parport_state("fwd idle", port);
|
|
|
- return length - left;
|
|
|
-}
|
|
|
-#endif /* 0 */
|
|
|
#endif /* IEEE 1284 support */
|
|
|
#endif /* Allowed to use FIFO/DMA */
|
|
|
|