During Full port cable breaks get sas iounit config page0 timeout
PATCH 4/6 During Full port cable breaks get sas iounit config page0 timeout
1) inhibit 0x3117 loginfos - during cable pull, there are too many printks going to the syslog, this is have impact on how fast the interrupt routine can handle keeping up with command completions; this was the root cause to the config pages timeouts
2) clean up interrupt routine to be more effiecent.
3) clean up config page API - moving the setting and clearing of the mutex's to _config_request. There was a mutex deadlock when diag reset is called from inside _config_request, so diag reset was moved to outside the mutexs. Also deleted redundant code thru out the API, moving to common area; thus reducing the code size by 1/3.
---
---
drivers/scsi/mpt2sas/mpt2sas_base.c +37 -40
@@ -440,6 +440,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info)if (sas_loginfo.dw.bus_type !=3 /*SAS*/ )return ; +/* each nexus loss loginfo */ +if (log_info ==0x31170000 ) +return ; +/* eat the loginfos associated with task aborts */ if (ioc->ignore_loginfos && (log_info ==30050000 || log_info ==0x31140000 || log_info ==0x31130000 ))
@@ -625,6 +629,14 @@ _base_unmask_interrupts(struct MPT2SAS_ADAPTER *ioc) ioc->mask_interrupts =0 ; } +union reply_descriptor { +u64 word; +struct { +u32 low; +u32 high; + } u; +}; +/** * _base_interrupt - MPT adapter (IOC) specific interrupt handler. * @irq: irq number (not used)
@@ -636,47 +648,38 @@ _base_unmask_interrupts(struct MPT2SAS_ADAPTER *ioc)static irqreturn_t _base_interrupt (int irq,void *bus_id) { -union reply_descriptor { -u64 word; -struct { -u32 low; -u32 high; - } u; - };union reply_descriptor rd; -u32 post_index, post_index_next, completed_cmds; +u32 completed_cmds;u8 request_desript_type;u16 smid;u8 cb_idx;u32 reply;u8 VF_ID ; -int i;struct MPT2SAS_ADAPTER *ioc = bus_id; +Mpi2ReplyDescriptorsUnion_t *rpf;if (ioc->mask_interrupts)return IRQ_NONE ; - post_index = ioc->reply_post_host_index; - request_desript_type = ioc->reply_post_free[post_index]. - Default.ReplyFlags &MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK ; + rpf = &ioc->reply_post_free[ioc->reply_post_host_index]; + request_desript_type = rpf->Default.ReplyFlags + &MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK ;if (request_desript_type ==MPI2_RPY_DESCRIPT_FLAGS_UNUSED )return IRQ_NONE ; completed_cmds =0 ; do { - rd.word = ioc->reply_post_free[post_index].Words; + rd.word = rpf->Words; if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX) goto out; reply = 0; cb_idx = 0xFF; - smid = le16_to_cpu(ioc->reply_post_free[post_index]. - Default.DescriptorTypeDependent1); - VF_ID = ioc->reply_post_free[post_index]. - Default.VF_ID; + smid = le16_to_cpu(rpf->Default.DescriptorTypeDependent1); + VF_ID = rpf->Default.VF_ID; if (request_desript_type == MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY) { - reply = le32_to_cpu(ioc->reply_post_free[post_index]. - AddressReply.ReplyFrameAddress); + reply = le32_to_cpu + (rpf->AddressReply.ReplyFrameAddress); } else if (request_desript_type == MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER) goto next;
@@ -703,21 +706,27 @@ _base_interrupt(int irq, void *bus_id) 0 : ioc->reply_free_host_index + 1; ioc->reply_free[ioc->reply_free_host_index] =cpu_to_le32 (reply); +wmb ();writel (ioc->reply_free_host_index, &ioc->chip->ReplyFreeHostIndex); -wmb (); } next: - post_index_next = (post_index == (ioc->reply_post_queue_depth - -1 )) ?0 : post_index +1 ; + + rpf->Words =ULLONG_MAX ; + ioc->reply_post_host_index = (ioc->reply_post_host_index == + (ioc->reply_post_queue_depth -1 )) ?0 : + ioc->reply_post_host_index +1 ; request_desript_type = - ioc->reply_post_free[post_index_next].Default.ReplyFlags - &MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK ; + ioc->reply_post_free[ioc->reply_post_host_index].Default. + ReplyFlags &MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK ; completed_cmds++;if (request_desript_type ==MPI2_RPY_DESCRIPT_FLAGS_UNUSED ) goto out; - post_index = post_index_next; +if (!ioc->reply_post_host_index) + rpf = ioc->reply_post_free; +else + rpf++; }while (1 ); out:
@@ -725,19 +734,8 @@ _base_interrupt(int irq, void *bus_id)if (!completed_cmds)return IRQ_NONE ; -/* reply post descriptor handling */ - post_index_next = ioc->reply_post_host_index; -for (i =0 ; i < completed_cmds; i++) { - post_index = post_index_next; -/* poison the reply post descriptor */ - ioc->reply_post_free[post_index_next].Words =ULLONG_MAX ; - post_index_next = (post_index == - (ioc->reply_post_queue_depth -1 )) - ?0 : post_index +1 ; - } - ioc->reply_post_host_index = post_index_next; -writel (post_index_next, &ioc->chip->ReplyPostHostIndex);wmb (); +writel (ioc->reply_post_host_index, &ioc->chip->ReplyPostHostIndex);return IRQ_HANDLED ; }
@@ -1590,7 +1588,7 @@ _base_static_config_pages(struct MPT2SAS_ADAPTER *ioc) iounit_pg1_flags |=MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING ; ioc->iounit_pg1.Flags =cpu_to_le32 (iounit_pg1_flags); -mpt2sas_config_set_iounit_pg1 (ioc, &mpi_reply, ioc->iounit_pg1); +mpt2sas_config_set_iounit_pg1 (ioc, &mpi_reply, &ioc->iounit_pg1); }/**
@@ -3247,13 +3245,11 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) ioc->tm_cmds.reply =kzalloc (ioc->reply_sz,GFP_KERNEL ); ioc->tm_cmds.status =MPT2_CMD_NOT_USED ;mutex_init (&ioc->tm_cmds.mutex); -init_completion (&ioc->tm_cmds.done);/* config page internal command bits */ ioc->config_cmds.reply =kzalloc (ioc->reply_sz,GFP_KERNEL ); ioc->config_cmds.status =MPT2_CMD_NOT_USED ;mutex_init (&ioc->config_cmds.mutex); -init_completion (&ioc->config_cmds.done);/* ctl module internal command bits */ ioc->ctl_cmds.reply =kzalloc (ioc->reply_sz,GFP_KERNEL );
@@ -3400,6 +3396,7 @@ _base_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)if (ioc->config_cmds.status &MPT2_CMD_PENDING ) { ioc->config_cmds.status |=MPT2_CMD_RESET ;mpt2sas_base_free_smid (ioc, ioc->config_cmds.smid); + ioc->config_cmds.smid =USHORT_MAX ;complete (&ioc->config_cmds.done); }break ;
drivers/scsi/mpt2sas/mpt2sas_base.h +1 -1
@@ -781,7 +781,7 @@ int mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRepint mpt2sas_config_get_iounit_pg1 (struct MPT2SAS_ADAPTER *ioc,Mpi2ConfigReply_t *mpi_reply,Mpi2IOUnitPage1_t *config_page);int mpt2sas_config_set_iounit_pg1 (struct MPT2SAS_ADAPTER *ioc,Mpi2ConfigReply_t - *mpi_reply,Mpi2IOUnitPage1_t config_page); + *mpi_reply,Mpi2IOUnitPage1_t *config_page);int mpt2sas_config_get_sas_iounit_pg1 (struct MPT2SAS_ADAPTER *ioc,Mpi2ConfigReply_t *mpi_reply,Mpi2SasIOUnitPage1_t *config_page,u16 sz); int mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
drivers/scsi/mpt2sas/mpt2sas_config.c +204 -755
1,538 lines not on this page · raw message
drivers/scsi/mpt2sas/mpt2sas_scsih.c +5 -0
@@ -1836,6 +1836,7 @@ mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun, mpi_request->TaskMID =cpu_to_le16 (smid_task);int_to_scsilun (lun, (struct scsi_lun *)mpi_request->LUN);mpt2sas_scsih_set_tm_flag (ioc, handle); +init_completion (&ioc->tm_cmds.done);mpt2sas_base_put_smid_hi_priority (ioc, smid,VF_ID ); timeleft =wait_for_completion_timeout (&ioc->tm_cmds.done, timeout*HZ );mpt2sas_scsih_clear_tm_flag (ioc, handle);
@@ -2714,6 +2715,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,char *desc_ioc_state =NULL ;char *desc_scsi_status =NULL ;char *desc_scsi_state = ioc->tmp_string; +u32 log_info =le32_to_cpu (mpi_reply->IOCLogInfo); + +if (log_info ==0x31170000 ) +return ;switch (ioc_status) {case MPI2_IOCSTATUS_SUCCESS :