@@ -6640,6 +6640,48 @@ static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
6640
6640
return rc ;
6641
6641
}
6642
6642
6643
+ /**
6644
+ * ipr_reset_slot_reset_done - Clear PCI reset to the adapter
6645
+ * @ipr_cmd: ipr command struct
6646
+ *
6647
+ * Description: This clears PCI reset to the adapter and delays two seconds.
6648
+ *
6649
+ * Return value:
6650
+ * IPR_RC_JOB_RETURN
6651
+ **/
6652
+ static int ipr_reset_slot_reset_done (struct ipr_cmnd * ipr_cmd )
6653
+ {
6654
+ ENTER ;
6655
+ pci_set_pcie_reset_state (ipr_cmd -> ioa_cfg -> pdev , pcie_deassert_reset );
6656
+ ipr_cmd -> job_step = ipr_reset_bist_done ;
6657
+ ipr_reset_start_timer (ipr_cmd , IPR_WAIT_FOR_BIST_TIMEOUT );
6658
+ LEAVE ;
6659
+ return IPR_RC_JOB_RETURN ;
6660
+ }
6661
+
6662
+ /**
6663
+ * ipr_reset_slot_reset - Reset the PCI slot of the adapter.
6664
+ * @ipr_cmd: ipr command struct
6665
+ *
6666
+ * Description: This asserts PCI reset to the adapter.
6667
+ *
6668
+ * Return value:
6669
+ * IPR_RC_JOB_RETURN
6670
+ **/
6671
+ static int ipr_reset_slot_reset (struct ipr_cmnd * ipr_cmd )
6672
+ {
6673
+ struct ipr_ioa_cfg * ioa_cfg = ipr_cmd -> ioa_cfg ;
6674
+ struct pci_dev * pdev = ioa_cfg -> pdev ;
6675
+
6676
+ ENTER ;
6677
+ pci_block_user_cfg_access (pdev );
6678
+ pci_set_pcie_reset_state (pdev , pcie_warm_reset );
6679
+ ipr_cmd -> job_step = ipr_reset_slot_reset_done ;
6680
+ ipr_reset_start_timer (ipr_cmd , IPR_PCI_RESET_TIMEOUT );
6681
+ LEAVE ;
6682
+ return IPR_RC_JOB_RETURN ;
6683
+ }
6684
+
6643
6685
/**
6644
6686
* ipr_reset_allowed - Query whether or not IOA can be reset
6645
6687
* @ioa_cfg: ioa config struct
@@ -6679,7 +6721,7 @@ static int ipr_reset_wait_to_start_bist(struct ipr_cmnd *ipr_cmd)
6679
6721
ipr_cmd -> u .time_left -= IPR_CHECK_FOR_RESET_TIMEOUT ;
6680
6722
ipr_reset_start_timer (ipr_cmd , IPR_CHECK_FOR_RESET_TIMEOUT );
6681
6723
} else {
6682
- ipr_cmd -> job_step = ipr_reset_start_bist ;
6724
+ ipr_cmd -> job_step = ioa_cfg -> reset ;
6683
6725
rc = IPR_RC_JOB_CONTINUE ;
6684
6726
}
6685
6727
@@ -6712,7 +6754,7 @@ static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd)
6712
6754
writel (IPR_UPROCI_RESET_ALERT , ioa_cfg -> regs .set_uproc_interrupt_reg );
6713
6755
ipr_cmd -> job_step = ipr_reset_wait_to_start_bist ;
6714
6756
} else {
6715
- ipr_cmd -> job_step = ipr_reset_start_bist ;
6757
+ ipr_cmd -> job_step = ioa_cfg -> reset ;
6716
6758
}
6717
6759
6718
6760
ipr_cmd -> u .time_left = IPR_WAIT_FOR_RESET_TIMEOUT ;
@@ -6994,8 +7036,11 @@ static pci_ers_result_t ipr_pci_slot_reset(struct pci_dev *pdev)
6994
7036
struct ipr_ioa_cfg * ioa_cfg = pci_get_drvdata (pdev );
6995
7037
6996
7038
spin_lock_irqsave (ioa_cfg -> host -> host_lock , flags );
6997
- _ipr_initiate_ioa_reset (ioa_cfg , ipr_reset_restore_cfg_space ,
6998
- IPR_SHUTDOWN_NONE );
7039
+ if (ioa_cfg -> needs_warm_reset )
7040
+ ipr_initiate_ioa_reset (ioa_cfg , IPR_SHUTDOWN_NONE );
7041
+ else
7042
+ _ipr_initiate_ioa_reset (ioa_cfg , ipr_reset_restore_cfg_space ,
7043
+ IPR_SHUTDOWN_NONE );
6999
7044
spin_unlock_irqrestore (ioa_cfg -> host -> host_lock , flags );
7000
7045
return PCI_ERS_RESULT_RECOVERED ;
7001
7046
}
@@ -7483,6 +7528,14 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7483
7528
else
7484
7529
ioa_cfg -> transop_timeout = IPR_OPERATIONAL_TIMEOUT ;
7485
7530
7531
+ rc = pci_read_config_byte (pdev , PCI_REVISION_ID , & ioa_cfg -> revid );
7532
+
7533
+ if (rc != PCIBIOS_SUCCESSFUL ) {
7534
+ dev_err (& pdev -> dev , "Failed to read PCI revision ID\n" );
7535
+ rc = - EIO ;
7536
+ goto out_scsi_host_put ;
7537
+ }
7538
+
7486
7539
ipr_regs_pci = pci_resource_start (pdev , 0 );
7487
7540
7488
7541
rc = pci_request_regions (pdev , IPR_NAME );
@@ -7569,6 +7622,13 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7569
7622
goto cleanup_nolog ;
7570
7623
}
7571
7624
7625
+ if ((dev_id -> driver_data & IPR_USE_PCI_WARM_RESET ) ||
7626
+ (dev_id -> device == PCI_DEVICE_ID_IBM_OBSIDIAN_E && !ioa_cfg -> revid )) {
7627
+ ioa_cfg -> needs_warm_reset = 1 ;
7628
+ ioa_cfg -> reset = ipr_reset_slot_reset ;
7629
+ } else
7630
+ ioa_cfg -> reset = ipr_reset_start_bist ;
7631
+
7572
7632
spin_lock (& ipr_driver_lock );
7573
7633
list_add_tail (& ioa_cfg -> queue , & ipr_ioa_head );
7574
7634
spin_unlock (& ipr_driver_lock );
@@ -7835,7 +7895,7 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = {
7835
7895
PCI_VENDOR_ID_IBM , IPR_SUBS_DEV_ID_57B3 , 0 , 0 , 0 },
7836
7896
{ PCI_VENDOR_ID_IBM , PCI_DEVICE_ID_IBM_OBSIDIAN_E ,
7837
7897
PCI_VENDOR_ID_IBM , IPR_SUBS_DEV_ID_57B7 , 0 , 0 ,
7838
- IPR_USE_LONG_TRANSOP_TIMEOUT },
7898
+ IPR_USE_LONG_TRANSOP_TIMEOUT | IPR_USE_PCI_WARM_RESET },
7839
7899
{ PCI_VENDOR_ID_IBM , PCI_DEVICE_ID_IBM_SNIPE ,
7840
7900
PCI_VENDOR_ID_IBM , IPR_SUBS_DEV_ID_2780 , 0 , 0 , 0 },
7841
7901
{ PCI_VENDOR_ID_ADAPTEC2 , PCI_DEVICE_ID_ADAPTEC2_SCAMP ,
0 commit comments