Print this page
9048 mpt_sas should not require targets to send SEP messages
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Approved by: Gordon Ross <gwr@nexenta.com>
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-14838 Support 24 port version of SAS adapters
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
NEX-1774 mptsas error stats are always zero
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Steve Peng <steve.peng@nexenta.com>
NEX-2103 12G mpt_sas needs additional minor enhancements
NEX-2157 mpt_sas firmware update minor regression
NEX-1889 mpt_sas should support 12G HBAs
4500 mptsas_hash_traverse() is unsafe, leads to missing devices
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Approved by: Albert Lee <trisk@nexenta.com>
backout 4500 mptsas_hash_traverse() is unsafe, leads to missing devices
4403 mpt_sas panic when pulling a drive
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Reviewed by: Albert Lee <trisk@nexenta.com>
Reviewed by: Andy Giles <illumos@ang.homedns.org>
Approved by: Robert Mustacchi <rm@joyent.com>
4500 mptsas_hash_traverse() is unsafe, leads to missing devices
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Approved by: Albert Lee <trisk@nexenta.com>
re #9636 rb2836 - mpt_sas should attempt an MUR reset at attach time.
--HG--
branch : stable-4.0
re #9636 rb2836 - mpt_sas should attempt an MUR reset at attach time.
re #6530 mpt_sas crash when more than 1 Initiator involved - ie HA
*** 19,29 ****
* CDDL HEADER END
*/
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
* Copyright 2014 OmniTI Computer Consulting, Inc. All rights reserved.
* Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
* Copyright (c) 2017, Joyent, Inc.
*/
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
* Copyright 2014 OmniTI Computer Consulting, Inc. All rights reserved.
* Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
* Copyright (c) 2017, Joyent, Inc.
*/
*** 543,553 ****
iocstatus = MPTSAS_IOCSTATUS(iocstatus);
iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl,
&reply->IOCLogInfo);
}
! if (callback(mpt, page_memp, accessp, iocstatus, iocloginfo, ap)) {
rval = DDI_FAILURE;
goto page_done;
}
mptsas_fma_check(mpt, cmd);
--- 543,554 ----
iocstatus = MPTSAS_IOCSTATUS(iocstatus);
iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl,
&reply->IOCLogInfo);
}
! if (callback(mpt, page_memp, accessp, iocstatus, iocloginfo, ap)
! != DDI_SUCCESS) {
rval = DDI_FAILURE;
goto page_done;
}
mptsas_fma_check(mpt, cmd);
*** 1107,1117 ****
/*
* Can't start another task management routine.
*/
if (slots->m_slot[MPTSAS_TM_SLOT(mpt)] != NULL) {
mptsas_log(mpt, CE_WARN, "Can only start 1 task management"
! " command at a time\n");
return (FALSE);
}
cmd = &(mpt->m_event_task_mgmt.m_event_cmd);
pkt = &(mpt->m_event_task_mgmt.m_event_pkt);
--- 1108,1118 ----
/*
* Can't start another task management routine.
*/
if (slots->m_slot[MPTSAS_TM_SLOT(mpt)] != NULL) {
mptsas_log(mpt, CE_WARN, "Can only start 1 task management"
! " command at a time");
return (FALSE);
}
cmd = &(mpt->m_event_task_mgmt.m_event_cmd);
pkt = &(mpt->m_event_task_mgmt.m_event_pkt);
*** 1318,1335 ****
* The code is there but not tested yet.
* User has to know there are risks here.
*/
mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): "
"Updating firmware through MPI 2.5 has not been "
! "tested yet!\n"
! "To enable set mptsas_enable_mpi25_flashupdate to 1\n");
return (-1);
} /* Otherwise, you pay your money and you take your chances. */
if ((rvalue = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) {
mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): allocation "
! "failed. event ack command pool is full\n");
return (rvalue);
}
bzero((caddr_t)cmd, sizeof (*cmd));
bzero((caddr_t)pkt, scsi_pkt_size());
--- 1319,1336 ----
* The code is there but not tested yet.
* User has to know there are risks here.
*/
mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): "
"Updating firmware through MPI 2.5 has not been "
! "tested yet! "
! "To enable set mptsas_enable_mpi25_flashupdate to 1.");
return (-1);
} /* Otherwise, you pay your money and you take your chances. */
if ((rvalue = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) {
mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): allocation "
! "failed. event ack command pool is full");
return (rvalue);
}
bzero((caddr_t)cmd, sizeof (*cmd));
bzero((caddr_t)pkt, scsi_pkt_size());
*** 1705,1717 ****
num_phys = ddi_get8(accessp, &sasioupage0->NumPhys);
/*
* ASSERT that the num_phys value in SAS IO Unit Page 0 is the same as
* was initially set. This should never change throughout the life of
! * the driver.
*/
! ASSERT(num_phys == mpt->m_num_phys);
for (i = 0; i < num_phys; i++) {
cpdi[i] = ddi_get32(accessp,
&sasioupage0->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(accessp,
--- 1706,1721 ----
num_phys = ddi_get8(accessp, &sasioupage0->NumPhys);
/*
* ASSERT that the num_phys value in SAS IO Unit Page 0 is the same as
* was initially set. This should never change throughout the life of
! * the driver. Note, due to cases where we've seen page zero have more
! * phys than the reported manufacturing information, we limit the number
! * of phys here to what we got from the manufacturing information.
*/
! ASSERT3U(num_phys, >=, mpt->m_num_phys);
! num_phys = mpt->m_num_phys;
for (i = 0; i < num_phys; i++) {
cpdi[i] = ddi_get32(accessp,
&sasioupage0->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(accessp,
*** 1769,1783 ****
}
sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp;
num_phys = ddi_get8(accessp, &sasioupage1->NumPhys);
/*
! * ASSERT that the num_phys value in SAS IO Unit Page 1 is the same as
* was initially set. This should never change throughout the life of
! * the driver.
*/
! ASSERT(num_phys == mpt->m_num_phys);
for (i = 0; i < num_phys; i++) {
cpdi[i] = ddi_get32(accessp, &sasioupage1->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(accessp,
&sasioupage1->PhyData[i].PortFlags);
--- 1773,1790 ----
}
sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp;
num_phys = ddi_get8(accessp, &sasioupage1->NumPhys);
/*
! * ASSERT that the num_phys value in SAS IO Unit Page 0 is the same as
* was initially set. This should never change throughout the life of
! * the driver. Note, due to cases where we've seen page zero have more
! * phys than the reported manufacturing information, we limit the number
! * of phys here to what we got from the manufacturing information.
*/
! ASSERT3U(num_phys, >=, mpt->m_num_phys);
! num_phys = mpt->m_num_phys;
for (i = 0; i < num_phys; i++) {
cpdi[i] = ddi_get32(accessp, &sasioupage1->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(accessp,
&sasioupage1->PhyData[i].PortFlags);
*** 1930,1940 ****
pMpi2ConfigReply_t configreply;
pMpi2SasIOUnitPage0_t sasioupage0;
pMpi2SasIOUnitPage1_t sasioupage1;
int recv_numbytes;
caddr_t recv_memp, page_memp;
! int i, num_phys, start_phy = 0;
int page0_size =
sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_0) +
(sizeof (MPI2_SAS_IO_UNIT0_PHY_DATA) * (MPTSAS_MAX_PHYS - 1));
int page1_size =
sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_1) +
--- 1937,1947 ----
pMpi2ConfigReply_t configreply;
pMpi2SasIOUnitPage0_t sasioupage0;
pMpi2SasIOUnitPage1_t sasioupage1;
int recv_numbytes;
caddr_t recv_memp, page_memp;
! uint_t i, num_phys, start_phy = 0;
int page0_size =
sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_0) +
(sizeof (MPI2_SAS_IO_UNIT0_PHY_DATA) * (MPTSAS_MAX_PHYS - 1));
int page1_size =
sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_1) +
*** 2110,2129 ****
goto cleanup;
}
num_phys = ddi_get8(page_accessp,
&sasioupage0->NumPhys);
- ASSERT(num_phys == mpt->m_num_phys);
if (num_phys > MPTSAS_MAX_PHYS) {
mptsas_log(mpt, CE_WARN, "Number of phys "
"supported by HBA (%d) is more than max "
"supported by driver (%d). Driver will "
"not attach.", num_phys,
MPTSAS_MAX_PHYS);
rval = DDI_FAILURE;
goto cleanup;
}
for (i = start_phy; i < num_phys; i++, start_phy = i) {
cpdi[i] = ddi_get32(page_accessp,
&sasioupage0->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(page_accessp,
--- 2117,2155 ----
goto cleanup;
}
num_phys = ddi_get8(page_accessp,
&sasioupage0->NumPhys);
if (num_phys > MPTSAS_MAX_PHYS) {
mptsas_log(mpt, CE_WARN, "Number of phys "
"supported by HBA (%d) is more than max "
"supported by driver (%d). Driver will "
"not attach.", num_phys,
MPTSAS_MAX_PHYS);
rval = DDI_FAILURE;
goto cleanup;
}
+ if (num_phys > mpt->m_num_phys) {
+ mptsas_log(mpt, CE_WARN, "Number of phys "
+ "reported by HBA SAS IO Unit Page 0 (%u) "
+ "is greater than that reported by the "
+ "manufacturing information (%u). Driver "
+ "phy count limited to %u. Please contact "
+ "the firmware vendor about this.", num_phys,
+ mpt->m_num_phys, mpt->m_num_phys);
+ num_phys = mpt->m_num_phys;
+ } else if (num_phys < mpt->m_num_phys) {
+ mptsas_log(mpt, CE_WARN, "Number of phys "
+ "reported by HBA SAS IO Unit Page 0 (%u) "
+ "is less than that reported by the "
+ "manufacturing information (%u). Driver "
+ "will not attach. Please contact the "
+ "firmware vendor about this.", num_phys,
+ mpt->m_num_phys);
+ rval = DDI_FAILURE;
+ goto cleanup;
+ }
for (i = start_phy; i < num_phys; i++, start_phy = i) {
cpdi[i] = ddi_get32(page_accessp,
&sasioupage0->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(page_accessp,
*** 2191,2210 ****
goto cleanup;
}
num_phys = ddi_get8(page_accessp,
&sasioupage1->NumPhys);
- ASSERT(num_phys == mpt->m_num_phys);
if (num_phys > MPTSAS_MAX_PHYS) {
mptsas_log(mpt, CE_WARN, "Number of phys "
"supported by HBA (%d) is more than max "
"supported by driver (%d). Driver will "
"not attach.", num_phys,
MPTSAS_MAX_PHYS);
rval = DDI_FAILURE;
goto cleanup;
}
for (i = 0; i < num_phys; i++) {
cpdi[i] = ddi_get32(page_accessp,
&sasioupage1->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(page_accessp,
--- 2217,2255 ----
goto cleanup;
}
num_phys = ddi_get8(page_accessp,
&sasioupage1->NumPhys);
if (num_phys > MPTSAS_MAX_PHYS) {
mptsas_log(mpt, CE_WARN, "Number of phys "
"supported by HBA (%d) is more than max "
"supported by driver (%d). Driver will "
"not attach.", num_phys,
MPTSAS_MAX_PHYS);
rval = DDI_FAILURE;
goto cleanup;
}
+ if (num_phys > mpt->m_num_phys) {
+ mptsas_log(mpt, CE_WARN, "Number of phys "
+ "reported by HBA SAS IO Unit Page 1 (%u) "
+ "is greater than that reported by the "
+ "manufacturing information (%u). Limiting "
+ "phy count to %u. Please contact the "
+ "firmware vendor about this.", num_phys,
+ mpt->m_num_phys, mpt->m_num_phys);
+ num_phys = mpt->m_num_phys;
+ } else if (num_phys < mpt->m_num_phys) {
+ mptsas_log(mpt, CE_WARN, "Number of phys "
+ "reported by HBA SAS IO Unit Page 1 (%u) "
+ "is less than that reported by the "
+ "manufacturing information (%u). Driver "
+ "will not attach. Please contact the "
+ "firmware vendor about this.", num_phys,
+ mpt->m_num_phys);
+ rval = DDI_FAILURE;
+ goto cleanup;
+ }
for (i = 0; i < num_phys; i++) {
cpdi[i] = ddi_get32(page_accessp,
&sasioupage1->PhyData[i].
ControllerPhyDeviceInfo);
port_flags = ddi_get8(page_accessp,
*** 2305,2315 ****
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
--- 2350,2361 ----
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
! 0) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
*** 2365,2375 ****
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 config: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
--- 2411,2422 ----
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
! 0) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 config: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
*** 2400,2411 ****
"num-phys", mpt->m_num_phys) != DDI_PROP_SUCCESS) {
NDBG2(("%s%d: failed to create num-phys property",
ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip)));
}
! mptsas_log(mpt, CE_NOTE, "!mpt%d: Initiator WWNs: 0x%016llx-0x%016llx",
! mpt->m_instance, (unsigned long long)mpt->un.m_base_wwid,
(unsigned long long)mpt->un.m_base_wwid + mpt->m_num_phys - 1);
if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
(mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
--- 2447,2458 ----
"num-phys", mpt->m_num_phys) != DDI_PROP_SUCCESS) {
NDBG2(("%s%d: failed to create num-phys property",
ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip)));
}
! mptsas_log(mpt, CE_NOTE, "Initiator WWNs: 0x%016llx-0x%016llx",
! (unsigned long long)mpt->un.m_base_wwid,
(unsigned long long)mpt->un.m_base_wwid + mpt->m_num_phys - 1);
if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
(mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
*** 2552,2564 ****
uint32_t *phy_reset_problem_count;
uint32_t page_address;
if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
(iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
! mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page1 "
"config: IOCStatus=0x%x, IOCLogInfo=0x%x",
! iocstatus, iocloginfo);
rval = DDI_FAILURE;
return (rval);
}
page_address = va_arg(ap, uint32_t);
/*
--- 2599,2611 ----
uint32_t *phy_reset_problem_count;
uint32_t page_address;
if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
(iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
! mptsas_log(mpt, CE_WARN, "%s "
"config: IOCStatus=0x%x, IOCLogInfo=0x%x",
! __func__, iocstatus, iocloginfo);
rval = DDI_FAILURE;
return (rval);
}
page_address = va_arg(ap, uint32_t);
/*
*** 2683,2693 ****
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
--- 2730,2741 ----
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
! 0) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
*** 2741,2751 ****
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page0 config: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
--- 2789,2800 ----
recv_accessp)) {
rval = DDI_FAILURE;
goto done;
}
! if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
! 0) {
mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page0 config: "
"IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
ddi_get32(recv_accessp, &configreply->IOCLogInfo));
goto done;
}
*** 2888,2896 ****
--- 2937,2948 ----
mptsas_enclosurepage_0_cb, page_address, &encpage);
if (rval == DDI_SUCCESS) {
mep->me_enchdl = encpage.EnclosureHandle;
mep->me_flags = encpage.Flags;
+ mep->me_nslots = encpage.NumSlots;
+ mep->me_fslot = encpage.StartSlot;
+ mep->me_slotleds = NULL;
}
return (rval);
}