static irqreturn_t intr(int irq, void *dev_id);
 static void reset_ports(struct Scsi_Host *shpnt);
 static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
-static void done(struct Scsi_Host *shpnt, int error);
+static void done(struct Scsi_Host *shpnt, unsigned char status_byte,
+                unsigned char msg_byte, unsigned char host_byte);
 
 /* diagnostics */
 static void show_command(struct scsi_cmnd * ptr);
  *  Internal done function
  *
  */
-static void done(struct Scsi_Host *shpnt, int error)
+static void done(struct Scsi_Host *shpnt, unsigned char status_byte,
+                unsigned char msg_byte, unsigned char host_byte)
 {
        if (CURRENT_SC) {
                if(DONE_SC)
 
                DONE_SC = CURRENT_SC;
                CURRENT_SC = NULL;
-               DONE_SC->result = error;
+               DONE_SC->result = status_byte;
+               set_msg_byte(DONE_SC, msg_byte);
+               set_host_byte(DONE_SC, host_byte);
        } else
                printk(KERN_ERR "aha152x: done() called outside of command\n");
 }
 
                if(CURRENT_SC->SCp.phase & completed) {
                        /* target sent COMMAND COMPLETE */
-                       done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
+                       done(shpnt, CURRENT_SC->SCp.Status,
+                            CURRENT_SC->SCp.Message, DID_OK);
 
                } else if(CURRENT_SC->SCp.phase & aborted) {
-                       done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
+                       done(shpnt, CURRENT_SC->SCp.Status,
+                            CURRENT_SC->SCp.Message, DID_ABORT);
 
                } else if(CURRENT_SC->SCp.phase & resetted) {
-                       done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
+                       done(shpnt, CURRENT_SC->SCp.Status,
+                            CURRENT_SC->SCp.Message, DID_RESET);
 
                } else if(CURRENT_SC->SCp.phase & disconnected) {
                        /* target sent DISCONNECT */
                        CURRENT_SC = NULL;
 
                } else {
-                       done(shpnt, DID_ERROR << 16);
+                       done(shpnt, SAM_STAT_GOOD,
+                            COMMAND_COMPLETE, DID_ERROR);
                }
 #if defined(AHA152X_STAT)
        } else {
        if (TESTLO(SSTAT0, SELDO)) {
                scmd_printk(KERN_ERR, CURRENT_SC,
                            "aha152x: passing bus free condition\n");
-               done(shpnt, DID_NO_CONNECT << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_NO_CONNECT);
                return;
        }
 
        CURRENT_SC->SCp.phase &= ~selecting;
 
        if (CURRENT_SC->SCp.phase & aborted)
-               done(shpnt, DID_ABORT << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_ABORT);
        else if (TESTLO(SSTAT0, SELINGO))
-               done(shpnt, DID_BUS_BUSY << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_BUS_BUSY);
        else
                /* ARBITRATION won, but SELECTION failed */
-               done(shpnt, DID_NO_CONNECT << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_NO_CONNECT);
 }
 
 /*
        if (CURRENT_SC->SCp.sent_command) {
                scmd_printk(KERN_ERR, CURRENT_SC,
                            "command already sent\n");
-               done(shpnt, DID_ERROR << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_ERROR);
                return;
        }
 
 static void parerr_run(struct Scsi_Host *shpnt)
 {
        scmd_printk(KERN_ERR, CURRENT_SC, "parity error\n");
-       done(shpnt, DID_PARITY << 16);
+       done(shpnt, SAM_STAT_GOOD,
+            COMMAND_COMPLETE, DID_PARITY);
 }
 
 /*
        }
 
        if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
-               done(shpnt, DID_RESET << 16 );
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_RESET);
 }