acornscsi_dma_cleanup(host);
 
-       SCpnt->result = result << 16 | host->scsi.SCp.Message << 8 | host->scsi.SCp.Status;
+       set_host_byte(SCpnt, result);
+       if (result == DID_OK)
+               scsi_msg_to_host_byte(SCpnt, host->scsi.SCp.Message);
+       set_status_byte(SCpnt, host->scsi.SCp.Status);
 
        /*
         * In theory, this should not happen.  In practice, it seems to.
                        xfer_warn = 0;
 
                if (xfer_warn) {
-                   switch (status_byte(SCpnt->result)) {
-                   case CHECK_CONDITION:
-                   case COMMAND_TERMINATED:
-                   case BUSY:
-                   case QUEUE_FULL:
-                   case RESERVATION_CONFLICT:
+                   switch (get_status_byte(SCpnt)) {
+                   case SAM_STAT_CHECK_CONDITION:
+                   case SAM_STAT_COMMAND_TERMINATED:
+                   case SAM_STAT_BUSY:
+                   case SAM_STAT_TASK_SET_FULL:
+                   case SAM_STAT_RESERVATION_CONFLICT:
                        break;
 
                    default:
     if (acornscsi_cmdtype(SCpnt->cmnd[0]) == CMD_WRITE && (NO_WRITE & (1 << SCpnt->device->id))) {
        printk(KERN_CRIT "scsi%d.%c: WRITE attempted with NO_WRITE flag set\n",
            host->host->host_no, '0' + SCpnt->device->id);
-       SCpnt->result = DID_NO_CONNECT << 16;
+       set_host_byte(SCpnt, DID_NO_CONNECT);
        done(SCpnt);
        return 0;
     }
        unsigned long flags;
 
        if (!queue_add_cmd_ordered(&host->queues.issue, SCpnt)) {
-           SCpnt->result = DID_ERROR << 16;
+               set_host_byte(SCpnt, DID_ERROR);
            done(SCpnt);
            return 0;
        }