9772 Panic in ahci when the failed slot spkt is NULL
Reviewed by: Andy Stormont <astormont@racktopsystems.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Robert Mustacchi <rm@joyent.com>
diff --git a/usr/src/uts/common/io/sata/adapters/ahci/ahci.c b/usr/src/uts/common/io/sata/adapters/ahci/ahci.c
index 10e71db..811fc26 100644
--- a/usr/src/uts/common/io/sata/adapters/ahci/ahci.c
+++ b/usr/src/uts/common/io/sata/adapters/ahci/ahci.c
@@ -22,6 +22,7 @@
 /*
  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
  */
 
 /*
@@ -1182,7 +1183,7 @@
 static int
 ahci_register_sata_hba_tran(ahci_ctl_t *ahci_ctlp, uint32_t cap_status)
 {
-	struct 	sata_hba_tran	*sata_hba_tran;
+	struct	sata_hba_tran	*sata_hba_tran;
 
 	AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
 	    "ahci_register_sata_hba_tran enter", NULL);
@@ -1884,8 +1885,8 @@
  *
  * NOTE: it will always return slot 0 for following commands to simplify the
  * algorithm.
- * 	1. REQUEST SENSE or READ LOG EXT command during error recovery process
- * 	2. READ/WRITE PORTMULT command
+ *	1. REQUEST SENSE or READ LOG EXT command during error recovery process
+ *	2. READ/WRITE PORTMULT command
  */
 static int
 ahci_claim_free_slot(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
@@ -2041,7 +2042,7 @@
  * Builds the Command Table for the sata packet and delivers it to controller.
  *
  * Returns:
- * 	slot number if we can obtain a slot successfully
+ *	slot number if we can obtain a slot successfully
  *	otherwise, return AHCI_FAILURE
  */
 static int
@@ -2160,17 +2161,17 @@
 	case 0:
 		/*
 		 * satacmd_addr_type will be 0 for the commands below:
-		 * 	ATAPI command
-		 * 	SATAC_IDLE_IM
-		 * 	SATAC_STANDBY_IM
-		 * 	SATAC_DOWNLOAD_MICROCODE
-		 * 	SATAC_FLUSH_CACHE
-		 * 	SATAC_SET_FEATURES
-		 * 	SATAC_SMART
-		 * 	SATAC_ID_PACKET_DEVICE
-		 * 	SATAC_ID_DEVICE
-		 * 	SATAC_READ_PORTMULT
-		 * 	SATAC_WRITE_PORTMULT
+		 *	ATAPI command
+		 *	SATAC_IDLE_IM
+		 *	SATAC_STANDBY_IM
+		 *	SATAC_DOWNLOAD_MICROCODE
+		 *	SATAC_FLUSH_CACHE
+		 *	SATAC_SET_FEATURES
+		 *	SATAC_SMART
+		 *	SATAC_ID_PACKET_DEVICE
+		 *	SATAC_ID_DEVICE
+		 *	SATAC_READ_PORTMULT
+		 *	SATAC_WRITE_PORTMULT
 		 */
 		/* FALLTHRU */
 
@@ -6738,10 +6739,10 @@
  * AHCI_INTR_STATUS_DHRS means a D2H Register FIS has been received
  * with the 'I' bit set. And the following commands will send thus
  * FIS with 'I' bit set upon the successful completion:
- * 	1. Non-data commands
- * 	2. DMA data-in command
- * 	3. DMA data-out command
- * 	4. PIO data-out command
+ *	1. Non-data commands
+ *	2. DMA data-in command
+ *	3. DMA data-out command
+ *	4. PIO data-out command
  *	5. PACKET non-data commands
  *	6. PACKET PIO data-in command
  *	7. PACKET PIO data-out command
@@ -6751,7 +6752,7 @@
  * AHCI_INTR_STATUS_PSS means a PIO Setup FIS has been received
  * with the 'I' bit set. And the following commands will send this
  * FIS upon the successful completion:
- * 	1. PIO data-in command
+ *	1. PIO data-in command
  */
 static int
 ahci_intr_cmd_cmplt(ahci_ctl_t *ahci_ctlp,
@@ -7705,7 +7706,7 @@
  * HBA, and the respective PxSERR register bit will be set. And PxIS.IFS
  * (fatal) or PxIS.INFS (non-fatal) will be set. The conditions that
  * causes PxIS.IFS/PxIS.INFS to be set are
- * 	1. in PxSERR.ERR, P bit is set to '1'
+ *	1. in PxSERR.ERR, P bit is set to '1'
  *	2. in PxSERR.DIAG, C or H bit is set to '1'
  *	3. PhyRdy drop unexpectly, N bit is set to '1'
  * If the error occurred during a non-data FIS, the FIS must be
@@ -8406,7 +8407,7 @@
  * the process.
  *
  * The routine will be called under following scenarios:
- * 	+ To reset the HBA
+ *	+ To reset the HBA
  *	+ To abort the packet(s)
  *	+ To reset the port
  *	+ To activate the port
@@ -9478,8 +9479,8 @@
 
 /*
  * Used to recovery a PMULT pmport fatal error under FIS-based switching.
- * 	1. device specific.PxFBS.SDE=1
- * 	2. Non-Deivce specific.
+ *	1. device specific.PxFBS.SDE=1
+ *	2. Non Device specific.
  * Nothing will be done when Command-based switching is employed.
  *
  * Currently code is neither completed nor tested.
@@ -9993,23 +9994,24 @@
 		}
 
 		spkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
-		ASSERT(spkt != NULL);
-		cmd = spkt->satapkt_cmd;
+		if (spkt != NULL) {
+			cmd = spkt->satapkt_cmd;
 
-		cmn_err(CE_WARN, "!satapkt 0x%p: cmd_reg = 0x%x "
-		    "features_reg = 0x%x sec_count_msb = 0x%x "
-		    "lba_low_msb = 0x%x lba_mid_msb = 0x%x "
-		    "lba_high_msb = 0x%x sec_count_lsb = 0x%x "
-		    "lba_low_lsb = 0x%x lba_mid_lsb = 0x%x "
-		    "lba_high_lsb = 0x%x device_reg = 0x%x "
-		    "addr_type = 0x%x cmd_flags = 0x%x", (void *)spkt,
-		    cmd.satacmd_cmd_reg, cmd.satacmd_features_reg,
-		    cmd.satacmd_sec_count_msb, cmd.satacmd_lba_low_msb,
-		    cmd.satacmd_lba_mid_msb, cmd.satacmd_lba_high_msb,
-		    cmd.satacmd_sec_count_lsb, cmd.satacmd_lba_low_lsb,
-		    cmd.satacmd_lba_mid_lsb, cmd.satacmd_lba_high_lsb,
-		    cmd.satacmd_device_reg, cmd.satacmd_addr_type,
-		    *((uint32_t *)&(cmd.satacmd_flags)));
+			cmn_err(CE_WARN, "!satapkt 0x%p: cmd_reg = 0x%x "
+			    "features_reg = 0x%x sec_count_msb = 0x%x "
+			    "lba_low_msb = 0x%x lba_mid_msb = 0x%x "
+			    "lba_high_msb = 0x%x sec_count_lsb = 0x%x "
+			    "lba_low_lsb = 0x%x lba_mid_lsb = 0x%x "
+			    "lba_high_lsb = 0x%x device_reg = 0x%x "
+			    "addr_type = 0x%x cmd_flags = 0x%x", (void *)spkt,
+			    cmd.satacmd_cmd_reg, cmd.satacmd_features_reg,
+			    cmd.satacmd_sec_count_msb, cmd.satacmd_lba_low_msb,
+			    cmd.satacmd_lba_mid_msb, cmd.satacmd_lba_high_msb,
+			    cmd.satacmd_sec_count_lsb, cmd.satacmd_lba_low_lsb,
+			    cmd.satacmd_lba_mid_lsb, cmd.satacmd_lba_high_lsb,
+			    cmd.satacmd_device_reg, cmd.satacmd_addr_type,
+			    *((uint32_t *)&(cmd.satacmd_flags)));
+		}
 
 		CLEAR_BIT(slot_tags, tmp_slot);
 	}