Print this page
4403 mpt_sas panic when pulling a drive

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c
          +++ new/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c
↓ open down ↓ 2013 lines elided ↑ open up ↑
2014 2014                  mptsas_tail = m;
2015 2015          }
2016 2016          rw_exit(&mptsas_global_rwlock);
2017 2017  }
2018 2018  
2019 2019  static int
2020 2020  mptsas_alloc_handshake_msg(mptsas_t *mpt, size_t alloc_size)
2021 2021  {
2022 2022          ddi_dma_attr_t  task_dma_attrs;
2023 2023  
     2024 +        mpt->m_hshk_dma_size = 0;
2024 2025          task_dma_attrs = mpt->m_msg_dma_attr;
2025 2026          task_dma_attrs.dma_attr_sgllen = 1;
2026 2027          task_dma_attrs.dma_attr_granular = (uint32_t)(alloc_size);
2027 2028  
2028 2029          /* allocate Task Management ddi_dma resources */
2029 2030          if (mptsas_dma_addr_create(mpt, task_dma_attrs,
2030 2031              &mpt->m_hshk_dma_hdl, &mpt->m_hshk_acc_hdl, &mpt->m_hshk_memp,
2031 2032              alloc_size, NULL) == FALSE) {
2032 2033                  return (DDI_FAILURE);
2033 2034          }
2034 2035          mpt->m_hshk_dma_size = alloc_size;
2035 2036  
2036 2037          return (DDI_SUCCESS);
2037 2038  }
2038 2039  
2039 2040  static void
2040 2041  mptsas_free_handshake_msg(mptsas_t *mpt)
2041 2042  {
     2043 +        if (mpt->m_hshk_dma_size == 0)
     2044 +                return;
2042 2045          mptsas_dma_addr_destroy(&mpt->m_hshk_dma_hdl, &mpt->m_hshk_acc_hdl);
2043 2046          mpt->m_hshk_dma_size = 0;
2044 2047  }
2045 2048  
2046 2049  static int
2047 2050  mptsas_hba_setup(mptsas_t *mpt)
2048 2051  {
2049 2052          scsi_hba_tran_t         *hba_tran;
2050 2053          int                     tran_flags;
2051 2054  
↓ open down ↓ 13385 lines elided ↑ open up ↑
15437 15440  {
15438 15441          ddi_dma_cookie_t        new_cookie;
15439 15442          size_t                  alloc_len;
15440 15443          uint_t                  ncookie;
15441 15444  
15442 15445          if (cookiep == NULL)
15443 15446                  cookiep = &new_cookie;
15444 15447  
15445 15448          if (ddi_dma_alloc_handle(mpt->m_dip, &dma_attr, DDI_DMA_SLEEP,
15446 15449              NULL, dma_hdp) != DDI_SUCCESS) {
15447      -                dma_hdp = NULL;
15448 15450                  return (FALSE);
15449 15451          }
15450 15452  
15451 15453          if (ddi_dma_mem_alloc(*dma_hdp, alloc_size, &mpt->m_dev_acc_attr,
15452 15454              DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, dma_memp, &alloc_len,
15453 15455              acc_hdp) != DDI_SUCCESS) {
15454 15456                  ddi_dma_free_handle(dma_hdp);
15455      -                dma_hdp = NULL;
15456 15457                  return (FALSE);
15457 15458          }
15458 15459  
15459 15460          if (ddi_dma_addr_bind_handle(*dma_hdp, NULL, *dma_memp, alloc_len,
15460 15461              (DDI_DMA_RDWR | DDI_DMA_CONSISTENT), DDI_DMA_SLEEP, NULL,
15461 15462              cookiep, &ncookie) != DDI_DMA_MAPPED) {
15462 15463                  (void) ddi_dma_mem_free(acc_hdp);
15463 15464                  ddi_dma_free_handle(dma_hdp);
15464      -                dma_hdp = NULL;
15465 15465                  return (FALSE);
15466 15466          }
15467 15467  
15468 15468          return (TRUE);
15469 15469  }
15470 15470  
15471 15471  void
15472 15472  mptsas_dma_addr_destroy(ddi_dma_handle_t *dma_hdp, ddi_acc_handle_t *acc_hdp)
15473 15473  {
15474 15474          if (*dma_hdp == NULL)
15475 15475                  return;
15476 15476  
15477 15477          (void) ddi_dma_unbind_handle(*dma_hdp);
15478 15478          (void) ddi_dma_mem_free(acc_hdp);
15479 15479          ddi_dma_free_handle(dma_hdp);
15480      -        dma_hdp = NULL;
15481 15480  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX