Print this page
First pass at 4310
*** 1061,1070 ****
--- 1061,1071 ----
char config_setup = 0;
char hba_attach_setup = 0;
char smp_attach_setup = 0;
char mutex_init_done = 0;
char event_taskq_create = 0;
+ char reset_taskq_create = 0;
char dr_taskq_create = 0;
char doneq_thread_create = 0;
char added_watchdog = 0;
scsi_hba_tran_t *hba_tran;
uint_t mem_bar = MEM_SPACE;
*** 1267,1276 ****
--- 1268,1289 ----
"failed");
goto fail;
}
dr_taskq_create++;
+ /*
+ * A taskq is created for dealing with reset events
+ */
+ if ((mpt->m_reset_taskq = ddi_taskq_create(dip,
+ "mptsas_reset_taskq",
+ 1, TASKQ_DEFAULTPRI, 0)) == NULL) {
+ mptsas_log(mpt, CE_NOTE, "ddi_taskq_create for reset "
+ "failed");
+ goto fail;
+ }
+ reset_taskq_create++;
+
mpt->m_doneq_thread_threshold = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
0, "mptsas_doneq_thread_threshold_prop", 10);
mpt->m_doneq_length_threshold = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
0, "mptsas_doneq_length_threshold_prop", 8);
mpt->m_doneq_thread_n = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
*** 1591,1600 ****
--- 1604,1616 ----
ddi_taskq_destroy(mpt->m_event_taskq);
}
if (dr_taskq_create) {
ddi_taskq_destroy(mpt->m_dr_taskq);
}
+ if (reset_taskq_create) {
+ ddi_taskq_destroy(mpt->m_reset_taskq);
+ }
if (mutex_init_done) {
mutex_destroy(&mpt->m_tx_waitq_mutex);
mutex_destroy(&mpt->m_passthru_mutex);
mutex_destroy(&mpt->m_mutex);
for (i = 0; i < MPTSAS_MAX_PHYS; i++) {
*** 1723,1732 ****
--- 1739,1749 ----
mptsas_raid_action_system_shutdown(mpt);
mutex_exit(&mpt->m_mutex);
/* drain the taskq */
+ ddi_taskq_wait(mpt->m_reset_taskq);
ddi_taskq_wait(mpt->m_event_taskq);
ddi_taskq_wait(mpt->m_dr_taskq);
return (DDI_SUCCESS);
}
*** 1898,1907 ****
--- 1915,1925 ----
mptsas_raid_action_system_shutdown(mpt);
mpt->m_softstate |= MPTSAS_SS_MSG_UNIT_RESET;
(void) mptsas_ioc_reset(mpt, FALSE);
mutex_exit(&mpt->m_mutex);
mptsas_rem_intrs(mpt);
+ ddi_taskq_destroy(mpt->m_reset_taskq);
ddi_taskq_destroy(mpt->m_event_taskq);
ddi_taskq_destroy(mpt->m_dr_taskq);
if (mpt->m_doneq_thread_n) {
mutex_enter(&mpt->m_doneq_mutex);
*** 12735,12744 ****
--- 12753,12768 ----
out:
return (status);
}
+ /* Dirty wrapper for taskq */
+ void
+ mptsas_handle_restart_ioc(void *mpt) {
+ mptsas_restart_ioc((mptsas_t *) mpt);
+ }
+
int
mptsas_restart_ioc(mptsas_t *mpt)
{
int rval = DDI_SUCCESS;
mptsas_target_t *ptgt = NULL;