*/
 int scsi_track_queue_full(struct scsi_device *sdev, int depth)
 {
-       if ((jiffies >> 4) == sdev->last_queue_full_time)
+
+       /*
+        * Don't let QUEUE_FULLs on the same
+        * jiffies count, they could all be from
+        * same event.
+        */
+       if ((jiffies >> 4) == (sdev->last_queue_full_time >> 4))
                return 0;
 
-       sdev->last_queue_full_time = (jiffies >> 4);
+       sdev->last_queue_full_time = jiffies;
        if (sdev->last_queue_full_depth != depth) {
                sdev->last_queue_full_count = 1;
                sdev->last_queue_full_depth = depth;
 
        }
 }
 
+static void scsi_handle_queue_ramp_up(struct scsi_device *sdev)
+{
+       struct scsi_host_template *sht = sdev->host->hostt;
+       struct scsi_device *tmp_sdev;
+
+       if (!sht->change_queue_depth ||
+           sdev->queue_depth >= sdev->max_queue_depth)
+               return;
+
+       if (time_before(jiffies,
+           sdev->last_queue_ramp_up + sdev->queue_ramp_up_period))
+               return;
+
+       if (time_before(jiffies,
+           sdev->last_queue_full_time + sdev->queue_ramp_up_period))
+               return;
+
+       /*
+        * Walk all devices of a target and do
+        * ramp up on them.
+        */
+       shost_for_each_device(tmp_sdev, sdev->host) {
+               if (tmp_sdev->channel != sdev->channel ||
+                   tmp_sdev->id != sdev->id ||
+                   tmp_sdev->queue_depth == sdev->max_queue_depth)
+                       continue;
+               /*
+                * call back into LLD to increase queue_depth by one
+                * with ramp up reason code.
+                */
+               sht->change_queue_depth(tmp_sdev, tmp_sdev->queue_depth + 1,
+                                       SCSI_QDEPTH_RAMP_UP);
+               sdev->last_queue_ramp_up = jiffies;
+       }
+}
+
 static void scsi_handle_queue_full(struct scsi_device *sdev)
 {
        struct scsi_host_template *sht = sdev->host->hostt;
         */
        switch (status_byte(scmd->result)) {
        case GOOD:
+               scsi_handle_queue_ramp_up(scmd->device);
        case COMMAND_TERMINATED:
                return SUCCESS;
        case CHECK_CONDITION:
                 */
                return ADD_TO_MLQUEUE;
        case GOOD:
+               scsi_handle_queue_ramp_up(scmd->device);
        case COMMAND_TERMINATED:
                return SUCCESS;
        case TASK_ABORTED:
 
        sdev->model = scsi_null_device_strs;
        sdev->rev = scsi_null_device_strs;
        sdev->host = shost;
+       sdev->queue_ramp_up_period = SCSI_DEFAULT_RAMP_UP_PERIOD;
        sdev->id = starget->id;
        sdev->lun = lun;
        sdev->channel = starget->channel;
                }
        }
 
+       sdev->max_queue_depth = sdev->queue_depth;
+
        /*
         * Ok, the device is now all set up, we can
         * register it and tell the rest of the kernel
 
        if (retval < 0)
                return retval;
 
+       sdev->max_queue_depth = sdev->queue_depth;
+
        return count;
 }
 
        __ATTR(queue_depth, S_IRUGO | S_IWUSR, sdev_show_queue_depth,
               sdev_store_queue_depth_rw);
 
+static ssize_t
+sdev_show_queue_ramp_up_period(struct device *dev,
+                              struct device_attribute *attr,
+                              char *buf)
+{
+       struct scsi_device *sdev;
+       sdev = to_scsi_device(dev);
+       return snprintf(buf, 20, "%u\n",
+                       jiffies_to_msecs(sdev->queue_ramp_up_period));
+}
+
+static ssize_t
+sdev_store_queue_ramp_up_period(struct device *dev,
+                               struct device_attribute *attr,
+                               const char *buf, size_t count)
+{
+       struct scsi_device *sdev = to_scsi_device(dev);
+       unsigned long period;
+
+       if (strict_strtoul(buf, 10, &period))
+               return -EINVAL;
+
+       sdev->queue_ramp_up_period = msecs_to_jiffies(period);
+       return period;
+}
+
+static struct device_attribute sdev_attr_queue_ramp_up_period =
+       __ATTR(queue_ramp_up_period, S_IRUGO | S_IWUSR,
+              sdev_show_queue_ramp_up_period,
+              sdev_store_queue_ramp_up_period);
+
 static ssize_t
 sdev_store_queue_type_rw(struct device *dev, struct device_attribute *attr,
                         const char *buf, size_t count)
        }
 
        /* create queue files, which may be writable, depending on the host */
-       if (sdev->host->hostt->change_queue_depth)
-               error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw);
+       if (sdev->host->hostt->change_queue_depth) {
+               error = device_create_file(&sdev->sdev_gendev,
+                                          &sdev_attr_queue_depth_rw);
+               error = device_create_file(&sdev->sdev_gendev,
+                                          &sdev_attr_queue_ramp_up_period);
+       }
        else
                error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_depth);
        if (error) {
 
        struct list_head starved_entry;
        struct scsi_cmnd *current_cmnd; /* currently active command */
        unsigned short queue_depth;     /* How deep of a queue we want */
+       unsigned short max_queue_depth; /* max queue depth */
        unsigned short last_queue_full_depth; /* These two are used by */
        unsigned short last_queue_full_count; /* scsi_track_queue_full() */
-       unsigned long last_queue_full_time;/* don't let QUEUE_FULLs on the same
-                                          jiffie count on our counter, they
-                                          could all be from the same event. */
+       unsigned long last_queue_full_time;     /* last queue full time */
+       unsigned long queue_ramp_up_period;     /* ramp up period in jiffies */
+#define SCSI_DEFAULT_RAMP_UP_PERIOD    (120 * HZ)
+
+       unsigned long last_queue_ramp_up;       /* last queue ramp up time */
 
        unsigned int id, lun, channel;