scsi_transport_spi: use spi target settings instead of inquiry data for DV
[pandora-kernel.git] / drivers / scsi / scsi_transport_spi.c
index f49f55c..00cfb40 100644 (file)
@@ -234,8 +234,10 @@ static int spi_setup_transport_attrs(struct transport_container *tc,
        spi_width(starget) = 0; /* narrow */
        spi_max_width(starget) = 1;
        spi_iu(starget) = 0;    /* no IU */
+       spi_max_iu(starget) = 1;
        spi_dt(starget) = 0;    /* ST */
        spi_qas(starget) = 0;
+       spi_max_qas(starget) = 1;
        spi_wr_flow(starget) = 0;
        spi_rd_strm(starget) = 0;
        spi_rti(starget) = 0;
@@ -360,9 +362,9 @@ static DEVICE_ATTR(field, S_IRUGO,                          \
 /* The Parallel SCSI Tranport Attributes: */
 spi_transport_max_attr(offset, "%d\n");
 spi_transport_max_attr(width, "%d\n");
-spi_transport_rd_attr(iu, "%d\n");
+spi_transport_max_attr(iu, "%d\n");
 spi_transport_rd_attr(dt, "%d\n");
-spi_transport_rd_attr(qas, "%d\n");
+spi_transport_max_attr(qas, "%d\n");
 spi_transport_rd_attr(wr_flow, "%d\n");
 spi_transport_rd_attr(rd_strm, "%d\n");
 spi_transport_rd_attr(rti, "%d\n");
@@ -831,7 +833,7 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
                return;
        }
 
-       if (!scsi_device_wide(sdev)) {
+       if (!spi_support_wide(starget)) {
                spi_max_width(starget) = 0;
                max_width = 0;
        }
@@ -858,7 +860,7 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
                return;
 
        /* device can't handle synchronous */
-       if (!scsi_device_sync(sdev) && !scsi_device_dt(sdev))
+       if (!spi_support_sync(starget) && !spi_support_dt(starget))
                return;
 
        /* len == -1 is the signal that we need to ascertain the
@@ -874,13 +876,14 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 
        /* try QAS requests; this should be harmless to set if the
         * target supports it */
-       if (scsi_device_qas(sdev)) {
+       if (spi_support_qas(starget) && spi_max_qas(starget)) {
                DV_SET(qas, 1);
        } else {
                DV_SET(qas, 0);
        }
 
-       if (scsi_device_ius(sdev) && min_period < 9) {
+       if (spi_support_ius(starget) && spi_max_iu(starget) &&
+           min_period < 9) {
                /* This u320 (or u640). Set IU transfers */
                DV_SET(iu, 1);
                /* Then set the optional parameters */
@@ -900,7 +903,7 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
                i->f->get_signalling(shost);
        if (spi_signalling(shost) == SPI_SIGNAL_SE ||
            spi_signalling(shost) == SPI_SIGNAL_HVD ||
-           !scsi_device_dt(sdev)) {
+           !spi_support_dt(starget)) {
                DV_SET(dt, 0);
        } else {
                DV_SET(dt, 1);
@@ -1412,12 +1415,18 @@ static mode_t target_attribute_is_visible(struct kobject *kobj,
        else if (attr == &dev_attr_iu.attr &&
                 spi_support_ius(starget))
                return TARGET_ATTRIBUTE_HELPER(iu);
+       else if (attr == &dev_attr_max_iu.attr &&
+                spi_support_ius(starget))
+               return TARGET_ATTRIBUTE_HELPER(iu);
        else if (attr == &dev_attr_dt.attr &&
                 spi_support_dt(starget))
                return TARGET_ATTRIBUTE_HELPER(dt);
        else if (attr == &dev_attr_qas.attr &&
                 spi_support_qas(starget))
                return TARGET_ATTRIBUTE_HELPER(qas);
+       else if (attr == &dev_attr_max_qas.attr &&
+                spi_support_qas(starget))
+               return TARGET_ATTRIBUTE_HELPER(qas);
        else if (attr == &dev_attr_wr_flow.attr &&
                 spi_support_ius(starget))
                return TARGET_ATTRIBUTE_HELPER(wr_flow);
@@ -1447,8 +1456,10 @@ static struct attribute *target_attributes[] = {
        &dev_attr_width.attr,
        &dev_attr_max_width.attr,
        &dev_attr_iu.attr,
+       &dev_attr_max_iu.attr,
        &dev_attr_dt.attr,
        &dev_attr_qas.attr,
+       &dev_attr_max_qas.attr,
        &dev_attr_wr_flow.attr,
        &dev_attr_rd_strm.attr,
        &dev_attr_rti.attr,