ARC: ioremap: use more commonly used PAGE_KERNEL based uncached flag
[linux-2.6-microblaze.git] / drivers / scsi / dc395x.c
index be87d5a..24c7cef 100644 (file)
 #define DC395x_write16(acb,address,value)      outw((value), acb->io_port_base + (address))
 #define DC395x_write32(acb,address,value)      outl((value), acb->io_port_base + (address))
 
-/* cmd->result */
-#define RES_TARGET             0x000000FF      /* Target State */
-#define RES_TARGET_LNX  STATUS_MASK    /* Only official ... */
-#define RES_ENDMSG             0x0000FF00      /* End Message */
-#define RES_DID                        0x00FF0000      /* DID_ codes */
-#define RES_DRV                        0xFF000000      /* DRIVER_ codes */
-
-#define MK_RES(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt))
-#define MK_RES_LNX(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt)<<1)
-
-#define SET_RES_TARGET(who,tgt) { who &= ~RES_TARGET; who |= (int)(tgt); }
-#define SET_RES_TARGET_LNX(who,tgt) { who &= ~RES_TARGET_LNX; who |= (int)(tgt) << 1; }
-#define SET_RES_MSG(who,msg) { who &= ~RES_ENDMSG; who |= (int)(msg) << 8; }
-#define SET_RES_DID(who,did) { who &= ~RES_DID; who |= (int)(did) << 16; }
-#define SET_RES_DRV(who,drv) { who &= ~RES_DRV; who |= (int)(drv) << 24; }
-
 #define TAG_NONE 255
 
 /*
@@ -986,7 +970,7 @@ static int dc395x_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct s
                cmd, cmd->device->id, (u8)cmd->device->lun, cmd->cmnd[0]);
 
        /* Assume BAD_TARGET; will be cleared later */
-       cmd->result = DID_BAD_TARGET << 16;
+       set_host_byte(cmd, DID_BAD_TARGET);
 
        /* ignore invalid targets */
        if (cmd->device->id >= acb->scsi_host->max_id ||
@@ -1013,7 +997,8 @@ static int dc395x_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct s
 
        /* set callback and clear result in the command */
        cmd->scsi_done = done;
-       cmd->result = 0;
+       set_host_byte(cmd, DID_OK);
+       set_status_byte(cmd, SAM_STAT_GOOD);
 
        srb = list_first_entry_or_null(&acb->srb_free_list,
                        struct ScsiReqBlk, list);
@@ -1250,7 +1235,7 @@ static int dc395x_eh_abort(struct scsi_cmnd *cmd)
                free_tag(dcb, srb);
                list_add_tail(&srb->list, &acb->srb_free_list);
                dprintkl(KERN_DEBUG, "eh_abort: Command was waiting\n");
-               cmd->result = DID_ABORT << 16;
+               set_host_byte(cmd, DID_ABORT);
                return SUCCESS;
        }
        srb = find_cmd(cmd, &dcb->srb_going_list);
@@ -3178,6 +3163,8 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                   srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count,
                   scsi_sgtalbe(cmd));
        status = srb->target_status;
+       set_host_byte(cmd, DID_OK);
+       set_status_byte(cmd, SAM_STAT_GOOD);
        if (srb->flag & AUTO_REQSENSE) {
                dprintkdbg(DBG_0, "srb_done: AUTO_REQSENSE1\n");
                pci_unmap_srb_sense(acb, srb);
@@ -3186,7 +3173,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                 */
                srb->flag &= ~AUTO_REQSENSE;
                srb->adapter_status = 0;
-               srb->target_status = CHECK_CONDITION << 1;
+               srb->target_status = SAM_STAT_CHECK_CONDITION;
                if (debug_enabled(DBG_1)) {
                        switch (cmd->sense_buffer[2] & 0x0f) {
                        case NOT_READY:
@@ -3233,22 +3220,13 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                                        *((unsigned int *)(cmd->sense_buffer + 3)));
                }
 
-               if (status == (CHECK_CONDITION << 1)) {
-                       cmd->result = DID_BAD_TARGET << 16;
+               if (status == SAM_STAT_CHECK_CONDITION) {
+                       set_host_byte(cmd, DID_BAD_TARGET);
                        goto ckc_e;
                }
                dprintkdbg(DBG_0, "srb_done: AUTO_REQSENSE2\n");
 
-               if (srb->total_xfer_length
-                   && srb->total_xfer_length >= cmd->underflow)
-                       cmd->result =
-                           MK_RES_LNX(DRIVER_SENSE, DID_OK,
-                                      srb->end_message, CHECK_CONDITION);
-               /*SET_RES_DID(cmd->result,DID_OK) */
-               else
-                       cmd->result =
-                           MK_RES_LNX(DRIVER_SENSE, DID_OK,
-                                      srb->end_message, CHECK_CONDITION);
+               set_status_byte(cmd, SAM_STAT_CHECK_CONDITION);
 
                goto ckc_e;
        }
@@ -3258,10 +3236,10 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                /*
                 * target status..........................
                 */
-               if (status >> 1 == CHECK_CONDITION) {
+               if (status == SAM_STAT_CHECK_CONDITION) {
                        request_sense(acb, dcb, srb);
                        return;
-               } else if (status >> 1 == QUEUE_FULL) {
+               } else if (status == SAM_STAT_TASK_SET_FULL) {
                        tempcnt = (u8)list_size(&dcb->srb_going_list);
                        dprintkl(KERN_INFO, "QUEUE_FULL for dev <%02i-%i> with %i cmnds\n",
                             dcb->target_id, dcb->target_lun, tempcnt);
@@ -3277,13 +3255,11 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                } else if (status == SCSI_STAT_SEL_TIMEOUT) {
                        srb->adapter_status = H_SEL_TIMEOUT;
                        srb->target_status = 0;
-                       cmd->result = DID_NO_CONNECT << 16;
+                       set_host_byte(cmd, DID_NO_CONNECT);
                } else {
                        srb->adapter_status = 0;
-                       SET_RES_DID(cmd->result, DID_ERROR);
-                       SET_RES_MSG(cmd->result, srb->end_message);
-                       SET_RES_TARGET(cmd->result, status);
-
+                       set_host_byte(cmd, DID_ERROR);
+                       set_status_byte(cmd, status);
                }
        } else {
                /*
@@ -3292,16 +3268,13 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                status = srb->adapter_status;
                if (status & H_OVER_UNDER_RUN) {
                        srb->target_status = 0;
-                       SET_RES_DID(cmd->result, DID_OK);
-                       SET_RES_MSG(cmd->result, srb->end_message);
+                       scsi_msg_to_host_byte(cmd, srb->end_message);
                } else if (srb->status & PARITY_ERROR) {
-                       SET_RES_DID(cmd->result, DID_PARITY);
-                       SET_RES_MSG(cmd->result, srb->end_message);
+                       set_host_byte(cmd, DID_PARITY);
                } else {        /* No error */
 
                        srb->adapter_status = 0;
                        srb->target_status = 0;
-                       SET_RES_DID(cmd->result, DID_OK);
                }
        }
 
@@ -3322,15 +3295,15 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
                base = scsi_kmap_atomic_sg(sg, scsi_sg_count(cmd), &offset, &len);
                ptr = (struct ScsiInqData *)(base + offset);
 
-               if (!ckc_only && (cmd->result & RES_DID) == 0
+               if (!ckc_only && get_host_byte(cmd) == DID_OK
                    && cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8
                    && dir != DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2)
                        dcb->inquiry7 = ptr->Flags;
 
        /*if( srb->cmd->cmnd[0] == INQUIRY && */
        /*  (host_byte(cmd->result) == DID_OK || status_byte(cmd->result) & CHECK_CONDITION) ) */
-               if ((cmd->result == (DID_OK << 16) ||
-                    status_byte(cmd->result) == CHECK_CONDITION)) {
+               if ((get_host_byte(cmd) == DID_OK) ||
+                   (get_status_byte(cmd) == SAM_STAT_CHECK_CONDITION)) {
                        if (!dcb->init_tcq_flag) {
                                add_dev(acb, dcb, ptr);
                                dcb->init_tcq_flag = 1;
@@ -3357,7 +3330,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
        if (srb != acb->tmp_srb) {
                /* Add to free list */
                dprintkdbg(DBG_0, "srb_done: (0x%p) done result=0x%08x\n",
-                       cmd, cmd->result);
+                          cmd, cmd->result);
                list_move_tail(&srb->list, &acb->srb_free_list);
        } else {
                dprintkl(KERN_ERR, "srb_done: ERROR! Completed cmd with tmp_srb\n");
@@ -3381,16 +3354,14 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
                struct scsi_cmnd *p;
 
                list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) {
-                       int result;
-
                        p = srb->cmd;
-                       result = MK_RES(0, did_flag, 0, 0);
                        printk("G:%p(%02i-%i) ", p,
                               p->device->id, (u8)p->device->lun);
                        list_del(&srb->list);
                        free_tag(dcb, srb);
                        list_add_tail(&srb->list, &acb->srb_free_list);
-                       p->result = result;
+                       set_host_byte(p, did_flag);
+                       set_status_byte(p, SAM_STAT_GOOD);
                        pci_unmap_srb_sense(acb, srb);
                        pci_unmap_srb(acb, srb);
                        if (force) {
@@ -3411,14 +3382,13 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
 
                /* Waiting queue */
                list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) {
-                       int result;
                        p = srb->cmd;
 
-                       result = MK_RES(0, did_flag, 0, 0);
                        printk("W:%p<%02i-%i>", p, p->device->id,
                               (u8)p->device->lun);
                        list_move_tail(&srb->list, &acb->srb_free_list);
-                       p->result = result;
+                       set_host_byte(p, did_flag);
+                       set_status_byte(p, SAM_STAT_GOOD);
                        pci_unmap_srb_sense(acb, srb);
                        pci_unmap_srb(acb, srb);
                        if (force) {