]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/53c700.c
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / drivers / scsi / 53c700.c
index 5143d3213e8686a0a20bc701b1df4bd1baca3762..aa915da2a5e53c6a094b591e9effce404e813b21 100644 (file)
@@ -175,7 +175,7 @@ STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
 STATIC int NCR_700_slave_alloc(struct scsi_device *SDpnt);
 STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt);
 STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt);
-static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth, int reason);
+static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth);
 static int NCR_700_change_queue_type(struct scsi_device *SDpnt, int depth);
 
 STATIC struct device_attribute *NCR_700_dev_attrs[];
@@ -327,6 +327,7 @@ NCR_700_detect(struct scsi_host_template *tpnt,
        tpnt->slave_alloc = NCR_700_slave_alloc;
        tpnt->change_queue_depth = NCR_700_change_queue_depth;
        tpnt->change_queue_type = NCR_700_change_queue_type;
+       tpnt->use_blk_tags = 1;
 
        if(tpnt->name == NULL)
                tpnt->name = "53c700";
@@ -901,8 +902,10 @@ process_message(struct Scsi_Host *host,    struct NCR_700_Host_Parameters *hostdata
                        /* we're done negotiating */
                        NCR_700_set_tag_neg_state(SCp->device, NCR_700_FINISHED_TAG_NEGOTIATION);
                        hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
+
                        SCp->device->tagged_supported = 0;
-                       scsi_deactivate_tcq(SCp->device, host->cmd_per_lun);
+                       scsi_change_queue_depth(SCp->device, host->cmd_per_lun);
+                       scsi_set_tag_type(SCp->device, 0);
                } else {
                        shost_printk(KERN_WARNING, host,
                                "(%d:%d) Unexpected REJECT Message %s\n",
@@ -1427,7 +1430,7 @@ NCR_700_start_command(struct scsi_cmnd *SCp)
        if((hostdata->tag_negotiated & (1<<scmd_id(SCp)))
           && (slot->tag != SCSI_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE &&
               slot->flags != NCR_700_FLAG_AUTOSENSE)) {
-               count += scsi_populate_tag_msg(SCp, &hostdata->msgout[count]);
+               count += spi_populate_tag_msg(&hostdata->msgout[count], SCp);
        }
 
        if(hostdata->fast &&
@@ -2049,13 +2052,10 @@ NCR_700_slave_configure(struct scsi_device *SDp)
 
        /* to do here: allocate memory; build a queue_full list */
        if(SDp->tagged_supported) {
-               scsi_set_tag_type(SDp, MSG_ORDERED_TAG);
-               scsi_activate_tcq(SDp, NCR_700_DEFAULT_TAGS);
+               scsi_change_queue_depth(SDp, NCR_700_DEFAULT_TAGS);
                NCR_700_set_tag_neg_state(SDp, NCR_700_START_TAG_NEGOTIATION);
-       } else {
-               /* initialise to default depth */
-               scsi_adjust_queue_depth(SDp, 0, SDp->host->cmd_per_lun);
        }
+
        if(hostdata->fast) {
                /* Find the correct offset and period via domain validation */
                if (!spi_initial_dv(SDp->sdev_target))
@@ -2075,16 +2075,11 @@ NCR_700_slave_destroy(struct scsi_device *SDp)
 }
 
 static int
-NCR_700_change_queue_depth(struct scsi_device *SDp, int depth, int reason)
+NCR_700_change_queue_depth(struct scsi_device *SDp, int depth)
 {
-       if (reason != SCSI_QDEPTH_DEFAULT)
-               return -EOPNOTSUPP;
-
        if (depth > NCR_700_MAX_TAGS)
                depth = NCR_700_MAX_TAGS;
-
-       scsi_adjust_queue_depth(SDp, scsi_get_tag_type(SDp), depth);
-       return depth;
+       return scsi_change_queue_depth(SDp, depth);
 }
 
 static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)
@@ -2094,8 +2089,6 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)
        struct NCR_700_Host_Parameters *hostdata = 
                (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
 
-       scsi_set_tag_type(SDp, tag_type);
-
        /* We have a global (per target) flag to track whether TCQ is
         * enabled, so we'll be turning it off for the entire target here.
         * our tag algorithm will fail if we mix tagged and untagged commands,
@@ -2103,15 +2096,16 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)
        if (change_tag)
                scsi_target_quiesce(SDp->sdev_target);
 
+       scsi_set_tag_type(SDp, tag_type);
        if (!tag_type) {
                /* shift back to the default unqueued number of commands
                 * (the user can still raise this) */
-               scsi_deactivate_tcq(SDp, SDp->host->cmd_per_lun);
+               scsi_change_queue_depth(SDp, SDp->host->cmd_per_lun);
                hostdata->tag_negotiated &= ~(1 << sdev_id(SDp));
        } else {
                /* Here, we cleared the negotiation flag above, so this
                 * will force the driver to renegotiate */
-               scsi_activate_tcq(SDp, SDp->queue_depth);
+               scsi_change_queue_depth(SDp, SDp->queue_depth);
                if (change_tag)
                        NCR_700_set_tag_neg_state(SDp, NCR_700_START_TAG_NEGOTIATION);
        }