changeset 11000:939a0e5586d1

6890270 Solaris gen2 driver: Inaccessible drives not removed after zone configuration 6889844 Deleting hot spare as first operation after reboot fails 6883972 mpt_sas driver is false positive detected by wsdiff
author Ada <Ada.Feng@Sun.COM>
date Mon, 09 Nov 2009 10:42:34 +0800
parents 1e3c6bd245c1
children 8bd1359d891b
files usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c
diffstat 1 files changed, 19 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c	Sun Nov 08 10:11:47 2009 -0800
+++ b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c	Mon Nov 09 10:42:34 2009 +0800
@@ -490,10 +490,7 @@
 };
 
 
-#define	MPTSAS_MOD_STRING "MPTSAS HBA Driver 00.00.00.18"
-#define	CDATE "MPTSAS was compiled on "__DATE__
-/* LINTED E_STATIC_UNUSED */
-static char *MPTWASCOMPILEDON = CDATE;
+#define	MPTSAS_MOD_STRING "MPTSAS HBA Driver 00.00.00.19"
 
 static struct modldrv modldrv = {
 	&mod_driverops,	/* Type of module. This one is a driver */
@@ -5740,6 +5737,12 @@
 
 		if (ptgt == NULL) {
 			/*
+			 * If a Phys Disk was deleted, RAID info needs to be
+			 * updated to reflect the new topology.
+			 */
+			(void) mptsas_get_raid_info(mpt);
+
+			/*
 			 * Get sas device page 0 by DevHandle to make sure if
 			 * SSP/SATA end device exist.
 			 */
@@ -6116,7 +6119,7 @@
 		uint8_t				num_entries, expstatus, phy;
 		uint8_t				phystatus, physport, state, i;
 		uint8_t				start_phy_num, link_rate;
-		uint16_t			dev_handle;
+		uint16_t			dev_handle, reason_code;
 		uint16_t			enc_handle, expd_handle;
 		char				string[80], curr[80], prev[80];
 		mptsas_topo_change_list_t	*topo_head = NULL;
@@ -6219,13 +6222,22 @@
 			    &sas_topo_change_list->PHY[i].PhyStatus);
 			dev_handle = ddi_get16(mpt->m_acc_reply_frame_hdl,
 			    &sas_topo_change_list->PHY[i].AttachedDevHandle);
-			if (phystatus & MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) {
+			reason_code = phystatus & MPI2_EVENT_SAS_TOPO_RC_MASK;
+			/*
+			 * Filter out processing of Phy Vacant Status unless
+			 * the reason code is "Not Responding".  Process all
+			 * other combinations of Phy Status and Reason Codes.
+			 */
+			if ((phystatus &
+			    MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) &&
+			    (reason_code !=
+			    MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING)) {
 				continue;
 			}
 			curr[0] = 0;
 			prev[0] = 0;
 			string[0] = 0;
-			switch (phystatus & MPI2_EVENT_SAS_TOPO_RC_MASK) {
+			switch (reason_code) {
 			case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
 			{
 				NDBG20(("mptsas%d phy %d physical_port %d "