[Linux-parport] [PATCH 1/3] read_nibble fix

Marko Kohtala marko.kohtala at kolumbus.fi
Wed Mar 30 15:15:38 EST 2005


This is against todays BitKeeper version of kernel. Please test and
comment.

I was testing my earlier changes to device ID reading with a real
printer and noticed the read_nibble does not work too well when the
buffer is read full and the device reports data not available. The test
for this condition did not match.

While fixing this I removed the IEEE1284_PH_HBUSY_DNA state as I see no
use for it. I also made corresponding changes to the read_byte function
and to a copy in cpia_pp.c.

Signed-off-by: Marko Kohtala <marko.kohtala at gmail.com>

diff -Nrup a/drivers/media/video/cpia_pp.c b/drivers/media/video/cpia_pp.c
--- a/drivers/media/video/cpia_pp.c	2005-03-30 22:28:26 +03:00
+++ b/drivers/media/video/cpia_pp.c	2005-03-30 22:28:26 +03:00
@@ -170,16 +170,9 @@ static size_t cpia_read_nibble (struct p
  		/* Does the error line indicate end of data? */
  		if (((i /*& 1*/) == 0) &&
  		    (parport_read_status(port) & PARPORT_STATUS_ERROR)) {
-			port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
-				DBG("%s: No more nibble data (%d bytes)\n",
-				port->name, i/2);
-
-			/* Go to reverse idle phase. */
-			parport_frob_control (port,
-					      PARPORT_CONTROL_AUTOFD,
-					      PARPORT_CONTROL_AUTOFD);
-			port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
-			break;
+			DBG("%s: No more nibble data (%d bytes)\n",
+			    port->name, i/2);
+			goto end_of_data;
  		}

  		/* Event 7: Set nAutoFd low. */
@@ -227,18 +220,21 @@ static size_t cpia_read_nibble (struct p
  			byte = nibble;
  	}

-	i /= 2; /* i is now in bytes */
-
  	if (i == len) {
  		/* Read the last nibble without checking data avail. */
-		port = port->physport;
-		if (parport_read_status (port) & PARPORT_STATUS_ERROR)
-			port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
+		if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
+		end_of_data:
+			/* Go to reverse idle phase. */
+			parport_frob_control (port,
+					      PARPORT_CONTROL_AUTOFD,
+					      PARPORT_CONTROL_AUTOFD);
+			port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
+		}
  		else
-			port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
+			port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
  	}

-	return i;
+	return i/2;
  }

  /* CPiA nonstandard "Nibble Stream" mode (2 nibbles per cycle, instead of 1)
diff -Nrup a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c
--- a/drivers/parport/ieee1284_ops.c	2005-03-30 22:28:26 +03:00
+++ b/drivers/parport/ieee1284_ops.c	2005-03-30 22:28:26 +03:00
@@ -166,17 +166,7 @@ size_t parport_ieee1284_read_nibble (str
  		/* Does the error line indicate end of data? */
  		if (((i & 1) == 0) &&
  		    (parport_read_status(port) & PARPORT_STATUS_ERROR)) {
-			port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
-			DPRINTK (KERN_DEBUG
-				"%s: No more nibble data (%d bytes)\n",
-				port->name, i/2);
-
-			/* Go to reverse idle phase. */
-			parport_frob_control (port,
-					      PARPORT_CONTROL_AUTOFD,
-					      PARPORT_CONTROL_AUTOFD);
-			port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
-			break;
+			goto end_of_data;
  		}

  		/* Event 7: Set nAutoFd low. */
@@ -226,18 +216,25 @@ size_t parport_ieee1284_read_nibble (str
  			byte = nibble;
  	}

-	i /= 2; /* i is now in bytes */
-
  	if (i == len) {
  		/* Read the last nibble without checking data avail. */
-		port = port->physport;
-		if (parport_read_status (port) & PARPORT_STATUS_ERROR)
-			port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
+		if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
+		end_of_data:
+			DPRINTK (KERN_DEBUG
+				"%s: No more nibble data (%d bytes)\n",
+				port->name, i/2);
+
+			/* Go to reverse idle phase. */
+			parport_frob_control (port,
+					      PARPORT_CONTROL_AUTOFD,
+					      PARPORT_CONTROL_AUTOFD);
+			port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
+		}
  		else
-			port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
+			port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
  	}

-	return i;
+	return i/2;
  #endif /* IEEE1284 support */
  }

@@ -257,17 +254,7 @@ size_t parport_ieee1284_read_byte (struc

  		/* Data available? */
  		if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
-			port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
-			DPRINTK (KERN_DEBUG
-				 "%s: No more byte data (%Zd bytes)\n",
-				 port->name, count);
-
-			/* Go to reverse idle phase. */
-			parport_frob_control (port,
-					      PARPORT_CONTROL_AUTOFD,
-					      PARPORT_CONTROL_AUTOFD);
-			port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
-			break;
+			goto end_of_data;
  		}

  		/* Event 14: Place data bus in high impedance state. */
@@ -319,11 +306,20 @@ size_t parport_ieee1284_read_byte (struc

  	if (count == len) {
  		/* Read the last byte without checking data avail. */
-		port = port->physport;
-		if (parport_read_status (port) & PARPORT_STATUS_ERROR)
-			port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
+		if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
+		end_of_data:
+			DPRINTK (KERN_DEBUG
+				 "%s: No more byte data (%Zd bytes)\n",
+				 port->name, count);
+
+			/* Go to reverse idle phase. */
+			parport_frob_control (port,
+					      PARPORT_CONTROL_AUTOFD,
+					      PARPORT_CONTROL_AUTOFD);
+			port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
+		}
  		else
-			port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
+			port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
  	}

  	return count;
diff -Nru a/include/linux/parport.h b/include/linux/parport.h
--- a/include/linux/parport.h	2005-03-30 22:28:26 +03:00
+++ b/include/linux/parport.h	2005-03-30 22:28:26 +03:00
@@ -242,7 +242,6 @@
  	IEEE1284_PH_FWD_IDLE,
  	IEEE1284_PH_TERMINATE,
  	IEEE1284_PH_NEGOTIATION,
-	IEEE1284_PH_HBUSY_DNA,
  	IEEE1284_PH_REV_IDLE,
  	IEEE1284_PH_HBUSY_DAVAIL,
  	IEEE1284_PH_REV_DATA,





More information about the Linux-parport mailing list