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

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_init.c
          +++ new/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_init.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
       25 + * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
  25   26   * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
  26   27   * Copyright (c) 2017, Joyent, Inc.
  27   28   */
  28   29  
  29   30  /*
  30   31   * Copyright (c) 2000 to 2009, LSI Corporation.
  31   32   * All rights reserved.
  32   33   *
  33   34   * Redistribution and use in source and binary forms of all code within
  34   35   * this file that is exclusively owned by LSI, with or without
↓ open down ↓ 95 lines elided ↑ open up ↑
 130  131                  return ("SAS2308");
 131  132          case MPI25_MFGPAGE_DEVID_SAS3004:
 132  133                  return ("SAS3004");
 133  134          case MPI25_MFGPAGE_DEVID_SAS3008:
 134  135                  return ("SAS3008");
 135  136          case MPI25_MFGPAGE_DEVID_SAS3108_1:
 136  137          case MPI25_MFGPAGE_DEVID_SAS3108_2:
 137  138          case MPI25_MFGPAGE_DEVID_SAS3108_5:
 138  139          case MPI25_MFGPAGE_DEVID_SAS3108_6:
 139  140                  return ("SAS3108");
      141 +        case MPI26_MFGPAGE_DEVID_SAS3216:
      142 +        case MPI26_MFGPAGE_DEVID_SAS3316_1:
      143 +        case MPI26_MFGPAGE_DEVID_SAS3316_2:
      144 +        case MPI26_MFGPAGE_DEVID_SAS3316_3:
      145 +        case MPI26_MFGPAGE_DEVID_SAS3316_4:
      146 +                return ("SAS3216");
      147 +        case MPI26_MFGPAGE_DEVID_SAS3224:
      148 +        case MPI26_MFGPAGE_DEVID_SAS3324_1:
      149 +        case MPI26_MFGPAGE_DEVID_SAS3324_2:
      150 +        case MPI26_MFGPAGE_DEVID_SAS3324_3:
      151 +        case MPI26_MFGPAGE_DEVID_SAS3324_4:
      152 +                return ("SAS3224");
      153 +        case MPI26_MFGPAGE_DEVID_SAS3408:
      154 +                return ("SAS3408");
      155 +        case MPI26_MFGPAGE_DEVID_SAS3416:
      156 +                return ("SAS3416");
      157 +        case MPI26_MFGPAGE_DEVID_SAS3508:
      158 +        case MPI26_MFGPAGE_DEVID_SAS3508_1:
      159 +                return ("SAS3508");
      160 +        case MPI26_MFGPAGE_DEVID_SAS3516:
      161 +        case MPI26_MFGPAGE_DEVID_SAS3516_1:
      162 +                return ("SAS3516");
      163 +        case MPI26_MFGPAGE_DEVID_SAS3616:
      164 +                return ("SAS3616");
      165 +        case MPI26_MFGPAGE_DEVID_SAS3708:
      166 +                return ("SAS3708");
      167 +        case MPI26_MFGPAGE_DEVID_SAS3716:
      168 +                return ("SAS3716");
      169 +        case MPI26_MFGPAGE_DEVID_SAS4008:
      170 +                return ("SAS4008");
 140  171          default:
 141  172                  return ("?");
 142  173          }
 143  174  }
 144  175  
 145  176  int
 146  177  mptsas_ioc_get_facts(mptsas_t *mpt)
 147  178  {
 148  179          /*
 149  180           * Send get facts messages
↓ open down ↓ 62 lines elided ↑ open up ↑
 212  243          factsreply = (void *)memp;
 213  244          numbytes = sizeof (*factsreply);
 214  245  
 215  246          /*
 216  247           * get ioc facts reply message
 217  248           */
 218  249          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
 219  250                  return (DDI_FAILURE);
 220  251          }
 221  252  
 222      -        if (iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) {
      253 +        if ((iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) != 0) {
 223  254                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_facts_reply: "
 224  255                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
 225  256                      ddi_get32(accessp, &factsreply->IOCLogInfo));
 226  257                  return (DDI_FAILURE);
 227  258          }
 228  259  
 229  260          /*
 230  261           * store key values from reply to mpt structure
 231  262           */
 232  263          mpt->m_fwversion = ddi_get32(accessp, &factsreply->FWVersion.Word);
 233  264          mpt->m_productid = ddi_get16(accessp, &factsreply->ProductID);
 234  265  
 235  266  
 236  267          (void) sprintf(buf, "%u.%u.%u.%u",
 237  268              ddi_get8(accessp, &factsreply->FWVersion.Struct.Major),
 238  269              ddi_get8(accessp, &factsreply->FWVersion.Struct.Minor),
 239  270              ddi_get8(accessp, &factsreply->FWVersion.Struct.Unit),
 240  271              ddi_get8(accessp, &factsreply->FWVersion.Struct.Dev));
 241      -        mptsas_log(mpt, CE_NOTE, "?MPT Firmware version v%s (%s)\n",
      272 +        mptsas_log(mpt, CE_NOTE, "MPT Firmware version v%s (%s)",
 242  273              buf, mptsas_devid_type_string(mpt));
 243  274          (void) ddi_prop_update_string(DDI_DEV_T_NONE, mpt->m_dip,
 244  275              "firmware-version", buf);
 245  276  
 246  277          /*
 247  278           * Set up request info.
 248  279           */
 249  280          mpt->m_max_requests = ddi_get16(accessp,
 250  281              &factsreply->RequestCredit) - 1;
 251  282          mpt->m_req_frame_size = ddi_get16(accessp,
↓ open down ↓ 49 lines elided ↑ open up ↑
 301  332          mpt->m_max_chain_depth = ddi_get8(accessp,
 302  333              &factsreply->MaxChainDepth);
 303  334          mpt->m_ioc_capabilities = ddi_get32(accessp,
 304  335              &factsreply->IOCCapabilities);
 305  336  
 306  337          /*
 307  338           * Set flag to check for SAS3 support.
 308  339           */
 309  340          msgversion = ddi_get16(accessp, &factsreply->MsgVersion);
 310  341          if (msgversion >= MPI2_VERSION_02_05) {
 311      -                mptsas_log(mpt, CE_NOTE, "?mpt_sas%d SAS 3 Supported\n",
 312      -                    mpt->m_instance);
      342 +                mptsas_log(mpt, CE_NOTE, "SAS 3 supported Version (0x%x)",
      343 +                    msgversion);
 313  344                  mpt->m_MPI25 = TRUE;
 314  345          } else {
 315      -                mptsas_log(mpt, CE_NOTE, "?mpt_sas%d MPI Version 0x%x\n",
 316      -                    mpt->m_instance, msgversion);
      346 +                mptsas_log(mpt, CE_NOTE, "MPI Version 0x%x", msgversion);
 317  347          }
 318  348  
 319  349          /*
 320  350           * Calculate max frames per request based on DMA S/G length.
 321  351           */
 322  352          simple_sge_main = MPTSAS_MAX_FRAME_SGES64(mpt) - 1;
 323  353          simple_sge_next = mpt->m_req_frame_size / MPTSAS_SGE_SIZE(mpt) - 1;
 324  354  
 325  355          mpt->m_max_request_frames = (MPTSAS_MAX_DMA_SEGS -
 326  356              simple_sge_main) / simple_sge_next + 1;
↓ open down ↓ 98 lines elided ↑ open up ↑
 425  455          factsreply = (void *)memp;
 426  456          numbytes = sizeof (*factsreply);
 427  457  
 428  458          /*
 429  459           * Get port facts reply message via handshake
 430  460           */
 431  461          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
 432  462                  return (DDI_FAILURE);
 433  463          }
 434  464  
 435      -        if (iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) {
      465 +        if ((iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) != 0) {
 436  466                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_port_facts_reply: "
 437  467                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
 438  468                      ddi_get32(accessp, &factsreply->IOCLogInfo));
 439  469                  return (DDI_FAILURE);
 440  470          }
 441  471  
 442  472          return (DDI_SUCCESS);
 443  473  }
 444  474  
 445  475  int
↓ open down ↓ 59 lines elided ↑ open up ↑
 505  535          bzero(memp, numbytes);
 506  536          portreply = (void *)memp;
 507  537  
 508  538          /*
 509  539           * Get message via handshake
 510  540           */
 511  541          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
 512  542                  return (DDI_FAILURE);
 513  543          }
 514  544  
 515      -        if (iocstatus = ddi_get16(accessp, &portreply->IOCStatus)) {
      545 +        if ((iocstatus = ddi_get16(accessp, &portreply->IOCStatus)) != 0) {
 516  546                  mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_enable_port_reply: "
 517  547                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
 518  548                      ddi_get32(accessp, &portreply->IOCLogInfo));
 519  549                  return (DDI_FAILURE);
 520  550          }
 521  551  
 522  552          return (DDI_SUCCESS);
 523  553  }
 524  554  
 525  555  int
↓ open down ↓ 61 lines elided ↑ open up ↑
 587  617          bzero(memp, numbytes);
 588  618          eventsreply = (void *)memp;
 589  619  
 590  620          /*
 591  621           * Get message via handshake
 592  622           */
 593  623          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
 594  624                  return (DDI_FAILURE);
 595  625          }
 596  626  
 597      -        if (iocstatus = ddi_get16(accessp, &eventsreply->IOCStatus)) {
      627 +        if ((iocstatus = ddi_get16(accessp, &eventsreply->IOCStatus)) != 0) {
 598  628                  mptsas_log(mpt, CE_WARN,
 599  629                      "mptsas_ioc_do_enable_event_notification_reply: "
 600  630                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
 601  631                      ddi_get32(accessp, &eventsreply->IOCLogInfo));
 602  632                  return (DDI_FAILURE);
 603  633          }
 604  634  
 605  635          return (DDI_SUCCESS);
 606  636  }
 607  637  
↓ open down ↓ 106 lines elided ↑ open up ↑
 714  744          bzero(memp, numbytes);
 715  745          initreply = (void *)memp;
 716  746  
 717  747          /*
 718  748           * Get reply message via handshake
 719  749           */
 720  750          if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
 721  751                  return (DDI_FAILURE);
 722  752          }
 723  753  
 724      -        if (iocstatus = ddi_get16(accessp, &initreply->IOCStatus)) {
      754 +        if ((iocstatus = ddi_get16(accessp, &initreply->IOCStatus)) != 0) {
 725  755                  mptsas_log(mpt, CE_WARN, "mptsas_do_ioc_init_reply: "
 726  756                      "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
 727  757                      ddi_get32(accessp, &initreply->IOCLogInfo));
 728  758                  return (DDI_FAILURE);
 729  759          }
 730  760  
 731  761          if ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell)) &
 732  762              MPI2_IOC_STATE_OPERATIONAL) {
 733      -                mptsas_log(mpt, CE_NOTE,
 734      -                    "?mpt%d: IOC Operational.\n", mpt->m_instance);
      763 +                mptsas_log(mpt, CE_NOTE, "IOC Operational");
 735  764          } else {
 736  765                  return (DDI_FAILURE);
 737  766          }
 738  767  
 739  768          return (DDI_SUCCESS);
 740  769  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX