powerpc: Export PCI slot reset API
Subsystems (2)
PATCH 1/1 powerpc: Export PCI slot reset API
Adds two new APIs to assert/deassert PCI reset to a given device. This is needed for an ipr PCI-E adapter which does not properly implement either BIST nor PCI-E hot reset, requiring a PCI-E warm reset, which is what this implements.
---
linux-2.6-bjking1/arch/powerpc/platforms/pseries/eeh.c | 41 +++++++++++++++++ linux-2.6-bjking1/include/asm-powerpc/ppc-pci.h | 3 + 2 files changed, 44 insertions(+)
arch/powerpc/platforms/pseries/eeh.c renamed from arch/powerpc/platforms/pseries/eeh.c~powerpc_slot_reset_api2 +41 -0
@@ -591,6 +591,47 @@ static void __rtas_set_slot_reset(structmsleep (PCI_BUS_SETTLE_TIME_MSEC ); } +/** +* pci_set_slot_reset - Assert PCI reset to the PCI slot +* @dev: pci device struct +* +* After asserting PCI reset, the caller should wait for +* 100 milliseconds or longer. +* +* Return value: +* 0 if success +**/ +int pci_set_slot_reset (struct pci_dev *dev) +{ +struct device_node *dn =pci_device_to_OF_node (dev); +struct pci_dn *pdn =PCI_DN (dn); + +rtas_pci_slot_reset (pdn,3 ); +return 0 ; +} +EXPORT_SYMBOL_GPL (pci_set_slot_reset); + +/** +* pci_clear_slot_reset - Clear PCI reset to the PCI slot +* @dev: pci device struct +* +* After clearing PCI reset, the caller should wait 1.8 seconds +* or longer for the bus to stabilize and the device to come +* ready. +* +* Return value: +* 0 if success +**/ +int pci_clear_slot_reset (struct pci_dev *dev) +{ +struct device_node *dn =pci_device_to_OF_node (dev); +struct pci_dn *pdn =PCI_DN (dn); + +rtas_pci_slot_reset (pdn,0 ); +return 0 ; +} +EXPORT_SYMBOL_GPL (pci_clear_slot_reset); +int rtas_set_slot_reset (struct pci_dn *pdn) {int i, rc;
include/asm-powerpc/ppc-pci.h renamed from include/asm-powerpc/ppc-pci.h~powerpc_slot_reset_api2 +3 -0
@@ -124,6 +124,9 @@ void eeh_clear_slot (struct device_node/* Find the associated "Partiationable Endpoint" PE */ struct device_node *find_device_pe (struct device_node *dn); +int pci_set_slot_reset (struct pci_dev *dev); +int pci_clear_slot_reset (struct pci_dev *dev); +#endif #endif /* __KERNEL__ */
_
Any comments on this?
Thanks,
Brian
Quoted 77 lines · Brian King
Adds two new APIs to assert/deassert PCI reset to a given device. This is needed for an ipr PCI-E adapter which does not properly implement either BIST nor PCI-E hot reset, requiring a PCI-E warm reset, which is what this implements.
Signed-off-by Brian King <[email protected]>---
linux-2.6-bjking1/arch/powerpc/platforms/pseries/eeh.c | 41 +++++++++++++++++ linux-2.6-bjking1/include/asm-powerpc/ppc-pci.h | 3 + 2 files changed, 44 insertions(+)diff -puN
arch/powerpc/platforms/pseries/eeh.c~powerpc_slot_reset_api2arch/powerpc/platforms/pseries/eeh.carch/powerpc/platforms/pseries/eeh.c renamed from arch/powerpc/platforms/pseries/eeh.c~powerpc_slot_reset_api2 +41
-0@@ -591,6 +591,47 @@ static void __rtas_set_slot_reset(structmsleep (PCI_BUS_SETTLE_TIME_MSEC ); } +/** +* pci_set_slot_reset - Assert PCI reset to the PCI slot +* @dev: pci device struct +* +* After asserting PCI reset, the caller should wait for +* 100 milliseconds or longer. +* +* Return value: +* 0 if success +**/ +int pci_set_slot_reset (struct pci_dev *dev) +{ +struct device_node *dn =pci_device_to_OF_node (dev); +struct pci_dn *pdn =PCI_DN (dn); + +rtas_pci_slot_reset (pdn,3 ); +return 0 ; +} +EXPORT_SYMBOL_GPL (pci_set_slot_reset); + +/** +* pci_clear_slot_reset - Clear PCI reset to the PCI slot +* @dev: pci device struct +* +* After clearing PCI reset, the caller should wait 1.8 seconds +* or longer for the bus to stabilize and the device to come +* ready. +* +* Return value: +* 0 if success +**/ +int pci_clear_slot_reset (struct pci_dev *dev) +{ +struct device_node *dn =pci_device_to_OF_node (dev); +struct pci_dn *pdn =PCI_DN (dn); + +rtas_pci_slot_reset (pdn,0 ); +return 0 ; +} +EXPORT_SYMBOL_GPL (pci_clear_slot_reset); +int rtas_set_slot_reset (struct pci_dn *pdn) {int i, rc;diff -puN
include/asm-powerpc/ppc-pci.h~powerpc_slot_reset_api2include/asm-powerpc/ppc-pci.hinclude/asm-powerpc/ppc-pci.h renamed from include/asm-powerpc/ppc-pci.h~powerpc_slot_reset_api2 +3
-0@@ -124,6 +124,9 @@ void eeh_clear_slot (struct device_node/* Find the associated "Partiationable Endpoint" PE */ struct device_node *find_device_pe (struct device_node *dn); +int pci_set_slot_reset (struct pci_dev *dev); +int pci_clear_slot_reset (struct pci_dev *dev); +#endif #endif /* __KERNEL__ */ _
Signature · 3 lines
Brian King eServer Storage I/O IBM Linux Technology Center