@@ -613,7 +613,7 @@ static void init_pci_device_addresses(struct pm8001_hba_info *pm8001_ha)
613
613
* pm80xx_set_thermal_config - support the thermal configuration
614
614
* @pm8001_ha: our hba card information.
615
615
*/
616
- static int
616
+ int
617
617
pm80xx_set_thermal_config (struct pm8001_hba_info * pm8001_ha )
618
618
{
619
619
struct set_ctrl_cfg_req payload ;
@@ -638,6 +638,86 @@ pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha)
638
638
639
639
}
640
640
641
+ /**
642
+ * pm80xx_set_sas_protocol_timer_config - support the SAS Protocol
643
+ * Timer configuration page
644
+ * @pm8001_ha: our hba card information.
645
+ */
646
+ static int
647
+ pm80xx_set_sas_protocol_timer_config (struct pm8001_hba_info * pm8001_ha )
648
+ {
649
+ struct set_ctrl_cfg_req payload ;
650
+ struct inbound_queue_table * circularQ ;
651
+ SASProtocolTimerConfig_t SASConfigPage ;
652
+ int rc ;
653
+ u32 tag ;
654
+ u32 opc = OPC_INB_SET_CONTROLLER_CONFIG ;
655
+
656
+ memset (& payload , 0 , sizeof (struct set_ctrl_cfg_req ));
657
+ memset (& SASConfigPage , 0 , sizeof (SASProtocolTimerConfig_t ));
658
+
659
+ rc = pm8001_tag_alloc (pm8001_ha , & tag );
660
+
661
+ if (rc )
662
+ return -1 ;
663
+
664
+ circularQ = & pm8001_ha -> inbnd_q_tbl [0 ];
665
+ payload .tag = cpu_to_le32 (tag );
666
+
667
+ SASConfigPage .pageCode = SAS_PROTOCOL_TIMER_CONFIG_PAGE ;
668
+ SASConfigPage .MST_MSI = 3 << 15 ;
669
+ SASConfigPage .STP_SSP_MCT_TMO = (STP_MCT_TMO << 16 ) | SSP_MCT_TMO ;
670
+ SASConfigPage .STP_FRM_TMO = (SAS_MAX_OPEN_TIME << 24 ) |
671
+ (SMP_MAX_CONN_TIMER << 16 ) | STP_FRM_TIMER ;
672
+ SASConfigPage .STP_IDLE_TMO = STP_IDLE_TIME ;
673
+
674
+ if (SASConfigPage .STP_IDLE_TMO > 0x3FFFFFF )
675
+ SASConfigPage .STP_IDLE_TMO = 0x3FFFFFF ;
676
+
677
+
678
+ SASConfigPage .OPNRJT_RTRY_INTVL = (SAS_MFD << 16 ) |
679
+ SAS_OPNRJT_RTRY_INTVL ;
680
+ SASConfigPage .Data_Cmd_OPNRJT_RTRY_TMO = (SAS_DOPNRJT_RTRY_TMO << 16 )
681
+ | SAS_COPNRJT_RTRY_TMO ;
682
+ SASConfigPage .Data_Cmd_OPNRJT_RTRY_THR = (SAS_DOPNRJT_RTRY_THR << 16 )
683
+ | SAS_COPNRJT_RTRY_THR ;
684
+ SASConfigPage .MAX_AIP = SAS_MAX_AIP ;
685
+
686
+ PM8001_INIT_DBG (pm8001_ha ,
687
+ pm8001_printk ("SASConfigPage.pageCode "
688
+ "0x%08x\n" , SASConfigPage .pageCode ));
689
+ PM8001_INIT_DBG (pm8001_ha ,
690
+ pm8001_printk ("SASConfigPage.MST_MSI "
691
+ " 0x%08x\n" , SASConfigPage .MST_MSI ));
692
+ PM8001_INIT_DBG (pm8001_ha ,
693
+ pm8001_printk ("SASConfigPage.STP_SSP_MCT_TMO "
694
+ " 0x%08x\n" , SASConfigPage .STP_SSP_MCT_TMO ));
695
+ PM8001_INIT_DBG (pm8001_ha ,
696
+ pm8001_printk ("SASConfigPage.STP_FRM_TMO "
697
+ " 0x%08x\n" , SASConfigPage .STP_FRM_TMO ));
698
+ PM8001_INIT_DBG (pm8001_ha ,
699
+ pm8001_printk ("SASConfigPage.STP_IDLE_TMO "
700
+ " 0x%08x\n" , SASConfigPage .STP_IDLE_TMO ));
701
+ PM8001_INIT_DBG (pm8001_ha ,
702
+ pm8001_printk ("SASConfigPage.OPNRJT_RTRY_INTVL "
703
+ " 0x%08x\n" , SASConfigPage .OPNRJT_RTRY_INTVL ));
704
+ PM8001_INIT_DBG (pm8001_ha ,
705
+ pm8001_printk ("SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO "
706
+ " 0x%08x\n" , SASConfigPage .Data_Cmd_OPNRJT_RTRY_TMO ));
707
+ PM8001_INIT_DBG (pm8001_ha ,
708
+ pm8001_printk ("SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR "
709
+ " 0x%08x\n" , SASConfigPage .Data_Cmd_OPNRJT_RTRY_THR ));
710
+ PM8001_INIT_DBG (pm8001_ha , pm8001_printk ("SASConfigPage.MAX_AIP "
711
+ " 0x%08x\n" , SASConfigPage .MAX_AIP ));
712
+
713
+ memcpy (& payload .cfg_pg , & SASConfigPage ,
714
+ sizeof (SASProtocolTimerConfig_t ));
715
+
716
+ rc = pm8001_mpi_build_cmd (pm8001_ha , circularQ , opc , & payload , 0 );
717
+
718
+ return rc ;
719
+ }
720
+
641
721
/**
642
722
* pm80xx_get_encrypt_info - Check for encryption
643
723
* @pm8001_ha: our hba card information.
@@ -800,11 +880,8 @@ static int pm80xx_chip_init(struct pm8001_hba_info *pm8001_ha)
800
880
} else
801
881
return - EBUSY ;
802
882
803
- /* configure thermal */
804
- pm80xx_set_thermal_config (pm8001_ha );
805
-
806
- PM8001_INIT_DBG (pm8001_ha ,
807
- pm8001_printk ("Thermal configuration successful!\n" ));
883
+ /* send SAS protocol timer configuration page to FW */
884
+ ret = pm80xx_set_sas_protocol_timer_config (pm8001_ha );
808
885
809
886
/* Check for encryption */
810
887
if (pm8001_ha -> chip -> encrypt ) {
@@ -1269,6 +1346,11 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha , void *piomb)
1269
1346
ts -> open_rej_reason = SAS_OREJ_RSVD_RETRY ;
1270
1347
break ;
1271
1348
case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS :
1349
+ case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED :
1350
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO :
1351
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST :
1352
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE :
1353
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED :
1272
1354
PM8001_IO_DBG (pm8001_ha ,
1273
1355
pm8001_printk ("IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n" ));
1274
1356
ts -> resp = SAS_TASK_COMPLETE ;
@@ -1472,6 +1554,11 @@ static void mpi_ssp_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
1472
1554
ts -> open_rej_reason = SAS_OREJ_RSVD_RETRY ;
1473
1555
break ;
1474
1556
case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS :
1557
+ case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED :
1558
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO :
1559
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST :
1560
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE :
1561
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED :
1475
1562
PM8001_IO_DBG (pm8001_ha ,
1476
1563
pm8001_printk ("IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n" ));
1477
1564
ts -> resp = SAS_TASK_COMPLETE ;
@@ -1557,6 +1644,13 @@ static void mpi_ssp_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
1557
1644
ts -> resp = SAS_TASK_COMPLETE ;
1558
1645
ts -> stat = SAS_DATA_OVERRUN ;
1559
1646
break ;
1647
+ case IO_XFER_ERROR_INTERNAL_CRC_ERROR :
1648
+ PM8001_IO_DBG (pm8001_ha ,
1649
+ pm8001_printk ("IO_XFR_ERROR_INTERNAL_CRC_ERROR\n" ));
1650
+ /* TBC: used default set values */
1651
+ ts -> resp = SAS_TASK_COMPLETE ;
1652
+ ts -> stat = SAS_DATA_OVERRUN ;
1653
+ break ;
1560
1654
case IO_XFER_CMD_FRAME_ISSUED :
1561
1655
PM8001_IO_DBG (pm8001_ha ,
1562
1656
pm8001_printk ("IO_XFER_CMD_FRAME_ISSUED\n" ));
@@ -1761,6 +1855,11 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
1761
1855
ts -> open_rej_reason = SAS_OREJ_RSVD_CONT0 ;
1762
1856
break ;
1763
1857
case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS :
1858
+ case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED :
1859
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO :
1860
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST :
1861
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE :
1862
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED :
1764
1863
PM8001_IO_DBG (pm8001_ha ,
1765
1864
pm8001_printk ("IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n" ));
1766
1865
ts -> resp = SAS_TASK_COMPLETE ;
@@ -2051,7 +2150,12 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2051
2150
ts -> open_rej_reason = SAS_OREJ_RSVD_CONT0 ;
2052
2151
break ;
2053
2152
case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS :
2054
- PM8001_IO_DBG (pm8001_ha ,
2153
+ case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED :
2154
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO :
2155
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST :
2156
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE :
2157
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED :
2158
+ PM8001_FAIL_DBG (pm8001_ha ,
2055
2159
pm8001_printk ("IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n" ));
2056
2160
ts -> resp = SAS_TASK_UNDELIVERED ;
2057
2161
ts -> stat = SAS_DEV_NO_RESPONSE ;
@@ -2154,6 +2258,20 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2154
2258
ts -> resp = SAS_TASK_COMPLETE ;
2155
2259
ts -> stat = SAS_OPEN_TO ;
2156
2260
break ;
2261
+ case IO_XFER_ERROR_INTERNAL_CRC_ERROR :
2262
+ PM8001_FAIL_DBG (pm8001_ha ,
2263
+ pm8001_printk ("IO_XFR_ERROR_INTERNAL_CRC_ERROR\n" ));
2264
+ /* TBC: used default set values */
2265
+ ts -> resp = SAS_TASK_COMPLETE ;
2266
+ ts -> stat = SAS_OPEN_TO ;
2267
+ break ;
2268
+ case IO_XFER_DMA_ACTIVATE_TIMEOUT :
2269
+ PM8001_FAIL_DBG (pm8001_ha ,
2270
+ pm8001_printk ("IO_XFR_DMA_ACTIVATE_TIMEOUT\n" ));
2271
+ /* TBC: used default set values */
2272
+ ts -> resp = SAS_TASK_COMPLETE ;
2273
+ ts -> stat = SAS_OPEN_TO ;
2274
+ break ;
2157
2275
default :
2158
2276
PM8001_IO_DBG (pm8001_ha ,
2159
2277
pm8001_printk ("Unknown status 0x%x\n" , event ));
@@ -2305,6 +2423,11 @@ mpi_smp_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2305
2423
ts -> open_rej_reason = SAS_OREJ_RSVD_CONT0 ;
2306
2424
break ;
2307
2425
case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS :
2426
+ case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED :
2427
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO :
2428
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST :
2429
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE :
2430
+ case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED :
2308
2431
PM8001_IO_DBG (pm8001_ha ,
2309
2432
pm8001_printk ("IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n" ));
2310
2433
ts -> resp = SAS_TASK_COMPLETE ;
@@ -2862,6 +2985,9 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
2862
2985
case HW_EVENT_PORT_RECOVERY_TIMER_TMO :
2863
2986
PM8001_MSG_DBG (pm8001_ha ,
2864
2987
pm8001_printk ("HW_EVENT_PORT_RECOVERY_TIMER_TMO\n" ));
2988
+ pm80xx_hw_event_ack_req (pm8001_ha , 0 ,
2989
+ HW_EVENT_PORT_RECOVERY_TIMER_TMO ,
2990
+ port_id , phy_id , 0 , 0 );
2865
2991
sas_phy_disconnected (sas_phy );
2866
2992
phy -> phy_attached = 0 ;
2867
2993
sas_ha -> notify_port_event (sas_phy , PORTE_LINK_RESET_ERR );
@@ -3499,10 +3625,7 @@ static int pm80xx_chip_ssp_io_req(struct pm8001_hba_info *pm8001_ha,
3499
3625
ssp_cmd .ssp_iu .efb_prio_attr |= (task -> ssp_task .task_prio << 3 );
3500
3626
ssp_cmd .ssp_iu .efb_prio_attr |= (task -> ssp_task .task_attr & 7 );
3501
3627
memcpy (ssp_cmd .ssp_iu .cdb , task -> ssp_task .cdb , 16 );
3502
- circularQ = & pm8001_ha -> inbnd_q_tbl [inb ++ ];
3503
-
3504
- /* rotate the inb queue */
3505
- inb = inb %PM8001_MAX_SPCV_INB_NUM ;
3628
+ circularQ = & pm8001_ha -> inbnd_q_tbl [0 ];
3506
3629
3507
3630
/* Check if encryption is set */
3508
3631
if (pm8001_ha -> chip -> encrypt &&
@@ -3603,10 +3726,7 @@ static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
3603
3726
unsigned long flags ;
3604
3727
u32 opc = OPC_INB_SATA_HOST_OPSTART ;
3605
3728
memset (& sata_cmd , 0 , sizeof (sata_cmd ));
3606
- circularQ = & pm8001_ha -> inbnd_q_tbl [inb ++ ];
3607
-
3608
- /* rotate the inb queue */
3609
- inb = inb %PM8001_MAX_SPCV_INB_NUM ;
3729
+ circularQ = & pm8001_ha -> inbnd_q_tbl [0 ];
3610
3730
3611
3731
if (task -> data_dir == PCI_DMA_NONE ) {
3612
3732
ATAP = 0x04 ; /* no data*/
0 commit comments