Print this page
NEX-17006 backport mpt_sas tri-mode parts support change
9044 Need support for mpt_sas tri-mode parts
9045 Clean up mpt_sas compiler warnings
9046 mptsas_handle_topo_change can return without its locks held
9047 workaround SAS3408 firmware issue
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@joyent.com>
Reviewed by: Albert Lee <trisk@forkgnu.org>
Reviewed by: Yuri Pankov <yuripv@yuripv.net>
Approved by: Richard Lowe <richlowe@richlowe.net>
NEX-16174 scsi error messages should go to system log only
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-9450 NMI panic with SAS9305-16e HBA installed and JBOD connected
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
NEX-2103 12G mpt_sas needs additional minor enhancements
NEX-1889 mpt_sas should support 12G HBAs
        
*** 20,29 ****
--- 20,30 ----
   */
  
  /*
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
+  * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
   * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
   * Copyright (c) 2017, Joyent, Inc.
   */
  
  /*
*** 135,144 ****
--- 136,175 ----
          case MPI25_MFGPAGE_DEVID_SAS3108_1:
          case MPI25_MFGPAGE_DEVID_SAS3108_2:
          case MPI25_MFGPAGE_DEVID_SAS3108_5:
          case MPI25_MFGPAGE_DEVID_SAS3108_6:
                  return ("SAS3108");
+         case MPI26_MFGPAGE_DEVID_SAS3216:
+         case MPI26_MFGPAGE_DEVID_SAS3316_1:
+         case MPI26_MFGPAGE_DEVID_SAS3316_2:
+         case MPI26_MFGPAGE_DEVID_SAS3316_3:
+         case MPI26_MFGPAGE_DEVID_SAS3316_4:
+                 return ("SAS3216");
+         case MPI26_MFGPAGE_DEVID_SAS3224:
+         case MPI26_MFGPAGE_DEVID_SAS3324_1:
+         case MPI26_MFGPAGE_DEVID_SAS3324_2:
+         case MPI26_MFGPAGE_DEVID_SAS3324_3:
+         case MPI26_MFGPAGE_DEVID_SAS3324_4:
+                 return ("SAS3224");
+         case MPI26_MFGPAGE_DEVID_SAS3408:
+                 return ("SAS3408");
+         case MPI26_MFGPAGE_DEVID_SAS3416:
+                 return ("SAS3416");
+         case MPI26_MFGPAGE_DEVID_SAS3508:
+         case MPI26_MFGPAGE_DEVID_SAS3508_1:
+                 return ("SAS3508");
+         case MPI26_MFGPAGE_DEVID_SAS3516:
+         case MPI26_MFGPAGE_DEVID_SAS3516_1:
+                 return ("SAS3516");
+         case MPI26_MFGPAGE_DEVID_SAS3616:
+                 return ("SAS3616");
+         case MPI26_MFGPAGE_DEVID_SAS3708:
+                 return ("SAS3708");
+         case MPI26_MFGPAGE_DEVID_SAS3716:
+                 return ("SAS3716");
+         case MPI26_MFGPAGE_DEVID_SAS4008:
+                 return ("SAS4008");
          default:
                  return ("?");
          }
  }
  
*** 217,227 ****
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if (iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) {
                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_facts_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &factsreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
--- 248,258 ----
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if ((iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) != 0) {
                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_facts_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &factsreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
*** 236,246 ****
          (void) sprintf(buf, "%u.%u.%u.%u",
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Major),
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Minor),
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Unit),
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Dev));
!         mptsas_log(mpt, CE_NOTE, "?MPT Firmware version v%s (%s)\n",
              buf, mptsas_devid_type_string(mpt));
          (void) ddi_prop_update_string(DDI_DEV_T_NONE, mpt->m_dip,
              "firmware-version", buf);
  
          /*
--- 267,277 ----
          (void) sprintf(buf, "%u.%u.%u.%u",
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Major),
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Minor),
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Unit),
              ddi_get8(accessp, &factsreply->FWVersion.Struct.Dev));
!         mptsas_log(mpt, CE_NOTE, "MPT Firmware version v%s (%s)",
              buf, mptsas_devid_type_string(mpt));
          (void) ddi_prop_update_string(DDI_DEV_T_NONE, mpt->m_dip,
              "firmware-version", buf);
  
          /*
*** 306,321 ****
          /*
           * Set flag to check for SAS3 support.
           */
          msgversion = ddi_get16(accessp, &factsreply->MsgVersion);
          if (msgversion >= MPI2_VERSION_02_05) {
!                 mptsas_log(mpt, CE_NOTE, "?mpt_sas%d SAS 3 Supported\n",
!                     mpt->m_instance);
                  mpt->m_MPI25 = TRUE;
          } else {
!                 mptsas_log(mpt, CE_NOTE, "?mpt_sas%d MPI Version 0x%x\n",
!                     mpt->m_instance, msgversion);
          }
  
          /*
           * Calculate max frames per request based on DMA S/G length.
           */
--- 337,351 ----
          /*
           * Set flag to check for SAS3 support.
           */
          msgversion = ddi_get16(accessp, &factsreply->MsgVersion);
          if (msgversion >= MPI2_VERSION_02_05) {
!                 mptsas_log(mpt, CE_NOTE, "SAS 3 supported Version (0x%x)",
!                     msgversion);
                  mpt->m_MPI25 = TRUE;
          } else {
!                 mptsas_log(mpt, CE_NOTE, "MPI Version 0x%x", msgversion);
          }
  
          /*
           * Calculate max frames per request based on DMA S/G length.
           */
*** 430,440 ****
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if (iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) {
                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_port_facts_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &factsreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
--- 460,470 ----
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if ((iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) != 0) {
                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_port_facts_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &factsreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
*** 510,520 ****
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if (iocstatus = ddi_get16(accessp, &portreply->IOCStatus)) {
                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_enable_port_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &portreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
--- 540,550 ----
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if ((iocstatus = ddi_get16(accessp, &portreply->IOCStatus)) != 0) {
                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_enable_port_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &portreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
*** 592,602 ****
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if (iocstatus = ddi_get16(accessp, &eventsreply->IOCStatus)) {
                  mptsas_log(mpt, CE_WARN,
                      "mptsas_ioc_do_enable_event_notification_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &eventsreply->IOCLogInfo));
                  return (DDI_FAILURE);
--- 622,632 ----
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if ((iocstatus = ddi_get16(accessp, &eventsreply->IOCStatus)) != 0) {
                  mptsas_log(mpt, CE_WARN,
                      "mptsas_ioc_do_enable_event_notification_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &eventsreply->IOCLogInfo));
                  return (DDI_FAILURE);
*** 719,739 ****
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if (iocstatus = ddi_get16(accessp, &initreply->IOCStatus)) {
                  mptsas_log(mpt, CE_WARN, "mptsas_do_ioc_init_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &initreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
  
          if ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell)) &
              MPI2_IOC_STATE_OPERATIONAL) {
!                 mptsas_log(mpt, CE_NOTE,
!                     "?mpt%d: IOC Operational.\n", mpt->m_instance);
          } else {
                  return (DDI_FAILURE);
          }
  
          return (DDI_SUCCESS);
--- 749,768 ----
           */
          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
                  return (DDI_FAILURE);
          }
  
!         if ((iocstatus = ddi_get16(accessp, &initreply->IOCStatus)) != 0) {
                  mptsas_log(mpt, CE_WARN, "mptsas_do_ioc_init_reply: "
                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
                      ddi_get32(accessp, &initreply->IOCLogInfo));
                  return (DDI_FAILURE);
          }
  
          if ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell)) &
              MPI2_IOC_STATE_OPERATIONAL) {
!                 mptsas_log(mpt, CE_NOTE, "IOC Operational");
          } else {
                  return (DDI_FAILURE);
          }
  
          return (DDI_SUCCESS);