[SCSI] megaraid_{mm,mbox}: a fix on INQUIRY with EVPD
authorJu, Seokmann <Seokmann.Ju@lsil.com>
Tue, 25 Jul 2006 14:44:58 +0000 (08:44 -0600)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Fri, 28 Jul 2006 18:13:50 +0000 (13:13 -0500)
With this patch, driver will protect data corruption created by
INQUIRY with EVPD request to megaraid controllers.  As specified in
the changelog, megaraid F/W already has fixed the issue and being
under process of release. Meanwhile, driver will protect the system
with this patch.

Signed-Off By: Seokmann Ju <seokmann.ju@lsil.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Documentation/scsi/ChangeLog.megaraid
drivers/scsi/megaraid/mega_common.h
drivers/scsi/megaraid/megaraid_mbox.c

index fd8939e..0edb048 100644 (file)
@@ -59,6 +59,13 @@ Older Version        : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
        > Buffer I/O error on device sda6, logical block 522067228
        > attempt to access beyond end of device
 
+2.     When INQUIRY with EVPD bit set issued to the MegaRAID controller,
+       system memory gets corrupted.
+       Root Cause: MegaRAID F/W handle the INQUIRY with EVPD bit set
+       incorrectly.
+       Fix: MegaRAID F/W has fixed the problem and being process of release,
+       soon. Meanwhile, driver will filter out the request.
+
 Release Date   : Mon Apr 11 12:27:22 EST 2006 - Seokmann Ju <sju@lsil.com>
 Current Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
 Older Version  : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module)
index 12e3812..8cd0bd1 100644 (file)
@@ -40,6 +40,9 @@
 #define HBA_SIGNATURE_64_BIT           0x299
 #define PCI_CONF_AMISIG64              0xa4
 
+#define MEGA_SCSI_INQ_EVPD             1
+#define MEGA_INVALID_FIELD_IN_CDB      0x24
+
 
 /**
  * scb_t - scsi command control block
index e671af0..cd982c8 100644 (file)
@@ -1644,6 +1644,14 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
                                rdev->last_disp |= (1L << SCP2CHANNEL(scp));
                        }
 
+                       if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) {
+                               scp->sense_buffer[0] = 0x70;
+                               scp->sense_buffer[2] = ILLEGAL_REQUEST;
+                               scp->sense_buffer[12] = MEGA_INVALID_FIELD_IN_CDB;
+                               scp->result = CHECK_CONDITION << 1;
+                               return NULL;
+                       }
+
                        /* Fall through */
 
                case READ_CAPACITY: