[SCSI] aacraid: expose physical devices for models with newer firmware
authorRajashekhara, Mahesh <Mahesh_Rajashekhara@adaptec.com>
Mon, 10 May 2010 11:12:28 +0000 (04:12 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Mon, 17 May 2010 02:35:54 +0000 (22:35 -0400)
The default driver setting is "expose_physicals=0", which means raw
physical drives are not exposed to OS.  If the user wants to expose
connected physical drives, enable "expose_physicals" module parameter.
With the new JBOD firmware, physical drives are not available for
"expose_physicals>0".  In function "aac_expose_phy_device", modified
to reset the appropriate bit in the first byte of inquiry data.  This
fix exposes the connected physical drives.

Signed-off-by: Mahesh Rajashekhara <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/aacraid/aachba.c

index 7e26ebc266614ad18030622a4db2c7cc16c9f450..24b1ba06ece4f102bf51bc2c43dab63eb057a322 100644 (file)
@@ -328,6 +328,16 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag)
        return status;
 }
 
+static void aac_expose_phy_device(struct scsi_cmnd *scsicmd)
+{
+       char inq_data;
+       scsi_sg_copy_to_buffer(scsicmd,  &inq_data, sizeof(inq_data));
+       if ((inq_data & 0x20) && (inq_data & 0x1f) == TYPE_DISK) {
+               inq_data &= 0xdf;
+               scsi_sg_copy_from_buffer(scsicmd, &inq_data, sizeof(inq_data));
+       }
+}
+
 /**
  *     aac_get_containers      -       list containers
  *     @common: adapter to probe
@@ -2573,6 +2583,11 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
 
        scsi_dma_unmap(scsicmd);
 
+       /* expose physical device if expose_physicald flag is on */
+       if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
+         && expose_physicals > 0)
+               aac_expose_phy_device(scsicmd);
+
        /*
         * First check the fib status
         */