mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	[PATCH] PCI Error Recovery: header file patch
Various PCI bus errors can be signaled by newer PCI controllers. Recovering from those errors requires an infrastructure to notify affected device drivers of the error, and a way of walking through a reset sequence. This patch adds a set of callbacks to be used by error recovery routines to notify device drivers of the various stages of recovery. Signed-off-by: Linas Vepstas <linas@austin.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
		
							parent
							
								
									19272684b8
								
							
						
					
					
						commit
						392a1ce761
					
				
					 1 changed files with 67 additions and 0 deletions
				
			
		|  | @ -78,6 +78,23 @@ typedef int __bitwise pci_power_t; | |||
| #define PCI_UNKNOWN	((pci_power_t __force) 5) | ||||
| #define PCI_POWER_ERROR	((pci_power_t __force) -1) | ||||
| 
 | ||||
| /** The pci_channel state describes connectivity between the CPU and
 | ||||
|  *  the pci device.  If some PCI bus between here and the pci device | ||||
|  *  has crashed or locked up, this info is reflected here. | ||||
|  */ | ||||
| typedef unsigned int __bitwise pci_channel_state_t; | ||||
| 
 | ||||
| enum pci_channel_state { | ||||
| 	/* I/O channel is in normal state */ | ||||
| 	pci_channel_io_normal = (__force pci_channel_state_t) 1, | ||||
| 
 | ||||
| 	/* I/O to channel is blocked */ | ||||
| 	pci_channel_io_frozen = (__force pci_channel_state_t) 2, | ||||
| 
 | ||||
| 	/* PCI card is dead */ | ||||
| 	pci_channel_io_perm_failure = (__force pci_channel_state_t) 3, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * The pci_dev structure is used to describe PCI devices. | ||||
|  */ | ||||
|  | @ -111,6 +128,7 @@ struct pci_dev { | |||
| 					   this is D0-D3, D0 being fully functional, | ||||
| 					   and D3 being off. */ | ||||
| 
 | ||||
| 	pci_channel_state_t error_state;	/* current connectivity state */ | ||||
| 	struct	device	dev;		/* Generic device interface */ | ||||
| 
 | ||||
| 	/* device is compatible with these IDs */ | ||||
|  | @ -233,6 +251,54 @@ struct pci_dynids { | |||
| 	unsigned int use_driver_data:1; /* pci_driver->driver_data is used */ | ||||
| }; | ||||
| 
 | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /** PCI Error Recovery System (PCI-ERS).  If a PCI device driver provides
 | ||||
|  *  a set fof callbacks in struct pci_error_handlers, then that device driver | ||||
|  *  will be notified of PCI bus errors, and will be driven to recovery | ||||
|  *  when an error occurs. | ||||
|  */ | ||||
| 
 | ||||
| typedef unsigned int __bitwise pci_ers_result_t; | ||||
| 
 | ||||
| enum pci_ers_result { | ||||
| 	/* no result/none/not supported in device driver */ | ||||
| 	PCI_ERS_RESULT_NONE = (__force pci_ers_result_t) 1, | ||||
| 
 | ||||
| 	/* Device driver can recover without slot reset */ | ||||
| 	PCI_ERS_RESULT_CAN_RECOVER = (__force pci_ers_result_t) 2, | ||||
| 
 | ||||
| 	/* Device driver wants slot to be reset. */ | ||||
| 	PCI_ERS_RESULT_NEED_RESET = (__force pci_ers_result_t) 3, | ||||
| 
 | ||||
| 	/* Device has completely failed, is unrecoverable */ | ||||
| 	PCI_ERS_RESULT_DISCONNECT = (__force pci_ers_result_t) 4, | ||||
| 
 | ||||
| 	/* Device driver is fully recovered and operational */ | ||||
| 	PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5, | ||||
| }; | ||||
| 
 | ||||
| /* PCI bus error event callbacks */ | ||||
| struct pci_error_handlers | ||||
| { | ||||
| 	/* PCI bus error detected on this device */ | ||||
| 	pci_ers_result_t (*error_detected)(struct pci_dev *dev, | ||||
| 	                      enum pci_channel_state error); | ||||
| 
 | ||||
| 	/* MMIO has been re-enabled, but not DMA */ | ||||
| 	pci_ers_result_t (*mmio_enabled)(struct pci_dev *dev); | ||||
| 
 | ||||
| 	/* PCI Express link has been reset */ | ||||
| 	pci_ers_result_t (*link_reset)(struct pci_dev *dev); | ||||
| 
 | ||||
| 	/* PCI slot has been reset */ | ||||
| 	pci_ers_result_t (*slot_reset)(struct pci_dev *dev); | ||||
| 
 | ||||
| 	/* Device driver may resume normal operations */ | ||||
| 	void (*resume)(struct pci_dev *dev); | ||||
| }; | ||||
| 
 | ||||
| /* ---------------------------------------------------------------- */ | ||||
| 
 | ||||
| struct module; | ||||
| struct pci_driver { | ||||
| 	struct list_head node; | ||||
|  | @ -245,6 +311,7 @@ struct pci_driver { | |||
| 	int  (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable);   /* Enable wake event */ | ||||
| 	void (*shutdown) (struct pci_dev *dev); | ||||
| 
 | ||||
| 	struct pci_error_handlers *err_handler; | ||||
| 	struct device_driver	driver; | ||||
| 	struct pci_dynids dynids; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 linas
						linas