/* 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. */
                        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)
 
                /* 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. */
                        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 */
 }
 
 
                /* 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. */
 
        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;