@@ -49,6 +49,13 @@ static void mpi3mr_send_event_ack(struct mpi3mr_ioc *mrioc, u8 event,
4949
5050#define MPI3_EVENT_WAIT_FOR_DEVICES_TO_REFRESH (0xFFFE)
5151
52+ /*
53+ * SAS Log info code for a NCQ collateral abort after an NCQ error:
54+ * IOC_LOGINFO_PREFIX_PL | PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR
55+ * See: drivers/message/fusion/lsi/mpi_log_sas.h
56+ */
57+ #define IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR 0x31080000
58+
5259/**
5360 * mpi3mr_host_tag_for_scmd - Get host tag for a scmd
5461 * @mrioc: Adapter instance reference
@@ -1301,6 +1308,12 @@ static void mpi3mr_update_tgtdev(struct mpi3mr_ioc *mrioc,
13011308 if (vdinf -> vd_state == MPI3_DEVICE0_VD_STATE_OFFLINE )
13021309 tgtdev -> is_hidden = 1 ;
13031310 tgtdev -> non_stl = 1 ;
1311+ tgtdev -> dev_spec .vd_inf .reset_to =
1312+ max_t (u8 , vdinf -> vd_reset_to ,
1313+ MPI3MR_INTADMCMD_TIMEOUT );
1314+ tgtdev -> dev_spec .vd_inf .abort_to =
1315+ max_t (u8 , vdinf -> vd_abort_to ,
1316+ MPI3MR_INTADMCMD_TIMEOUT );
13041317 tgtdev -> dev_spec .vd_inf .tg_id = vdinf_io_throttle_group ;
13051318 tgtdev -> dev_spec .vd_inf .tg_high =
13061319 le16_to_cpu (vdinf -> io_throttle_group_high ) * 2048 ;
@@ -2042,8 +2055,8 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,
20422055 if (!fwevt -> process_evt )
20432056 goto evt_ack ;
20442057
2045- dprint_event_bh (mrioc , "processing event(0x%02x) in the bottom half handler\n" ,
2046- fwevt -> event_id );
2058+ dprint_event_bh (mrioc , "processing event(0x%02x) -(0x%08x) in the bottom half handler\n" ,
2059+ fwevt -> event_id , fwevt -> evt_ctx );
20472060
20482061 switch (fwevt -> event_id ) {
20492062 case MPI3_EVENT_DEVICE_ADDED :
@@ -2859,12 +2872,14 @@ static void mpi3mr_preparereset_evt_th(struct mpi3mr_ioc *mrioc,
28592872 "prepare for reset event top half with rc=start\n" );
28602873 if (mrioc -> prepare_for_reset )
28612874 return ;
2875+ scsi_block_requests (mrioc -> shost );
28622876 mrioc -> prepare_for_reset = 1 ;
28632877 mrioc -> prepare_for_reset_timeout_counter = 0 ;
28642878 } else if (evtdata -> reason_code == MPI3_EVENT_PREPARE_RESET_RC_ABORT ) {
28652879 dprint_event_th (mrioc ,
28662880 "prepare for reset top half with rc=abort\n" );
28672881 mrioc -> prepare_for_reset = 0 ;
2882+ scsi_unblock_requests (mrioc -> shost );
28682883 mrioc -> prepare_for_reset_timeout_counter = 0 ;
28692884 }
28702885 if ((event_reply -> msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK )
@@ -3069,8 +3084,8 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
30693084 }
30703085 if (process_evt_bh || ack_req ) {
30713086 dprint_event_th (mrioc ,
3072- "scheduling bottom half handler for event(0x%02x), ack_required=%d\n" ,
3073- evt_type , ack_req );
3087+ "scheduling bottom half handler for event(0x%02x) - (0x%08x), ack_required=%d\n" ,
3088+ evt_type , le32_to_cpu ( event_reply -> event_context ) , ack_req );
30743089 sz = event_reply -> event_data_length * 4 ;
30753090 fwevt = mpi3mr_alloc_fwevt (sz );
30763091 if (!fwevt ) {
@@ -3430,7 +3445,18 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
34303445 scmd -> result = DID_NO_CONNECT << 16 ;
34313446 break ;
34323447 case MPI3_IOCSTATUS_SCSI_IOC_TERMINATED :
3433- scmd -> result = DID_SOFT_ERROR << 16 ;
3448+ if (ioc_loginfo == IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR ) {
3449+ /*
3450+ * This is a ATA NCQ command aborted due to another NCQ
3451+ * command failure. We must retry this command
3452+ * immediately but without incrementing its retry
3453+ * counter.
3454+ */
3455+ WARN_ON_ONCE (xfer_count != 0 );
3456+ scmd -> result = DID_IMM_RETRY << 16 ;
3457+ } else {
3458+ scmd -> result = DID_SOFT_ERROR << 16 ;
3459+ }
34343460 break ;
34353461 case MPI3_IOCSTATUS_SCSI_TASK_TERMINATED :
34363462 case MPI3_IOCSTATUS_SCSI_EXT_TERMINATED :
@@ -3897,11 +3923,13 @@ int mpi3mr_issue_tm(struct mpi3mr_ioc *mrioc, u8 tm_type,
38973923 if (scsi_tgt_priv_data )
38983924 atomic_inc (& scsi_tgt_priv_data -> block_io );
38993925
3900- if (tgtdev && (tgtdev -> dev_type == MPI3_DEVICE_DEVFORM_PCIE )) {
3901- if (cmd_priv && tgtdev -> dev_spec .pcie_inf .abort_to )
3902- timeout = tgtdev -> dev_spec .pcie_inf .abort_to ;
3903- else if (!cmd_priv && tgtdev -> dev_spec .pcie_inf .reset_to )
3904- timeout = tgtdev -> dev_spec .pcie_inf .reset_to ;
3926+ if (tgtdev ) {
3927+ if (tgtdev -> dev_type == MPI3_DEVICE_DEVFORM_PCIE )
3928+ timeout = cmd_priv ? tgtdev -> dev_spec .pcie_inf .abort_to
3929+ : tgtdev -> dev_spec .pcie_inf .reset_to ;
3930+ else if (tgtdev -> dev_type == MPI3_DEVICE_DEVFORM_VD )
3931+ timeout = cmd_priv ? tgtdev -> dev_spec .vd_inf .abort_to
3932+ : tgtdev -> dev_spec .vd_inf .reset_to ;
39053933 }
39063934
39073935 init_completion (& drv_cmd -> done );
@@ -5365,6 +5393,8 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
53655393 spin_lock_init (& mrioc -> tgtdev_lock );
53665394 spin_lock_init (& mrioc -> watchdog_lock );
53675395 spin_lock_init (& mrioc -> chain_buf_lock );
5396+ spin_lock_init (& mrioc -> adm_req_q_bar_writeq_lock );
5397+ spin_lock_init (& mrioc -> adm_reply_q_bar_writeq_lock );
53685398 spin_lock_init (& mrioc -> sas_node_lock );
53695399 spin_lock_init (& mrioc -> trigger_lock );
53705400
0 commit comments