diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-09 21:41:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-09 21:41:42 -0500 |
commit | 977127174a7dff52d17faeeb4c4949a54221881f (patch) | |
tree | b05b9d18a1256d7ed97bdfb537213a8d70ccca57 /include | |
parent | 80c0531514516e43ae118ddf38424e06e5c3cb3c (diff) | |
parent | 93b47684f60cf25e8cefe19a21d94aa0257fdf36 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/pci.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index de690ca73d58..0a44072383ec 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -78,6 +78,23 @@ typedef int __bitwise pci_power_t; | |||
78 | #define PCI_UNKNOWN ((pci_power_t __force) 5) | 78 | #define PCI_UNKNOWN ((pci_power_t __force) 5) |
79 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) | 79 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) |
80 | 80 | ||
81 | /** The pci_channel state describes connectivity between the CPU and | ||
82 | * the pci device. If some PCI bus between here and the pci device | ||
83 | * has crashed or locked up, this info is reflected here. | ||
84 | */ | ||
85 | typedef unsigned int __bitwise pci_channel_state_t; | ||
86 | |||
87 | enum pci_channel_state { | ||
88 | /* I/O channel is in normal state */ | ||
89 | pci_channel_io_normal = (__force pci_channel_state_t) 1, | ||
90 | |||
91 | /* I/O to channel is blocked */ | ||
92 | pci_channel_io_frozen = (__force pci_channel_state_t) 2, | ||
93 | |||
94 | /* PCI card is dead */ | ||
95 | pci_channel_io_perm_failure = (__force pci_channel_state_t) 3, | ||
96 | }; | ||
97 | |||
81 | /* | 98 | /* |
82 | * The pci_dev structure is used to describe PCI devices. | 99 | * The pci_dev structure is used to describe PCI devices. |
83 | */ | 100 | */ |
@@ -98,6 +115,7 @@ struct pci_dev { | |||
98 | unsigned int class; /* 3 bytes: (base,sub,prog-if) */ | 115 | unsigned int class; /* 3 bytes: (base,sub,prog-if) */ |
99 | u8 hdr_type; /* PCI header type (`multi' flag masked out) */ | 116 | u8 hdr_type; /* PCI header type (`multi' flag masked out) */ |
100 | u8 rom_base_reg; /* which config register controls the ROM */ | 117 | u8 rom_base_reg; /* which config register controls the ROM */ |
118 | u8 pin; /* which interrupt pin this device uses */ | ||
101 | 119 | ||
102 | struct pci_driver *driver; /* which driver has allocated this device */ | 120 | struct pci_driver *driver; /* which driver has allocated this device */ |
103 | u64 dma_mask; /* Mask of the bits of bus address this | 121 | u64 dma_mask; /* Mask of the bits of bus address this |
@@ -110,6 +128,7 @@ struct pci_dev { | |||
110 | this is D0-D3, D0 being fully functional, | 128 | this is D0-D3, D0 being fully functional, |
111 | and D3 being off. */ | 129 | and D3 being off. */ |
112 | 130 | ||
131 | pci_channel_state_t error_state; /* current connectivity state */ | ||
113 | struct device dev; /* Generic device interface */ | 132 | struct device dev; /* Generic device interface */ |
114 | 133 | ||
115 | /* device is compatible with these IDs */ | 134 | /* device is compatible with these IDs */ |
@@ -232,6 +251,54 @@ struct pci_dynids { | |||
232 | unsigned int use_driver_data:1; /* pci_driver->driver_data is used */ | 251 | unsigned int use_driver_data:1; /* pci_driver->driver_data is used */ |
233 | }; | 252 | }; |
234 | 253 | ||
254 | /* ---------------------------------------------------------------- */ | ||
255 | /** PCI Error Recovery System (PCI-ERS). If a PCI device driver provides | ||
256 | * a set fof callbacks in struct pci_error_handlers, then that device driver | ||
257 | * will be notified of PCI bus errors, and will be driven to recovery | ||
258 | * when an error occurs. | ||
259 | */ | ||
260 | |||
261 | typedef unsigned int __bitwise pci_ers_result_t; | ||
262 | |||
263 | enum pci_ers_result { | ||
264 | /* no result/none/not supported in device driver */ | ||
265 | PCI_ERS_RESULT_NONE = (__force pci_ers_result_t) 1, | ||
266 | |||
267 | /* Device driver can recover without slot reset */ | ||
268 | PCI_ERS_RESULT_CAN_RECOVER = (__force pci_ers_result_t) 2, | ||
269 | |||
270 | /* Device driver wants slot to be reset. */ | ||
271 | PCI_ERS_RESULT_NEED_RESET = (__force pci_ers_result_t) 3, | ||
272 | |||
273 | /* Device has completely failed, is unrecoverable */ | ||
274 | PCI_ERS_RESULT_DISCONNECT = (__force pci_ers_result_t) 4, | ||
275 | |||
276 | /* Device driver is fully recovered and operational */ | ||
277 | PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5, | ||
278 | }; | ||
279 | |||
280 | /* PCI bus error event callbacks */ | ||
281 | struct pci_error_handlers | ||
282 | { | ||
283 | /* PCI bus error detected on this device */ | ||
284 | pci_ers_result_t (*error_detected)(struct pci_dev *dev, | ||
285 | enum pci_channel_state error); | ||
286 | |||
287 | /* MMIO has been re-enabled, but not DMA */ | ||
288 | pci_ers_result_t (*mmio_enabled)(struct pci_dev *dev); | ||
289 | |||
290 | /* PCI Express link has been reset */ | ||
291 | pci_ers_result_t (*link_reset)(struct pci_dev *dev); | ||
292 | |||
293 | /* PCI slot has been reset */ | ||
294 | pci_ers_result_t (*slot_reset)(struct pci_dev *dev); | ||
295 | |||
296 | /* Device driver may resume normal operations */ | ||
297 | void (*resume)(struct pci_dev *dev); | ||
298 | }; | ||
299 | |||
300 | /* ---------------------------------------------------------------- */ | ||
301 | |||
235 | struct module; | 302 | struct module; |
236 | struct pci_driver { | 303 | struct pci_driver { |
237 | struct list_head node; | 304 | struct list_head node; |
@@ -244,6 +311,7 @@ struct pci_driver { | |||
244 | int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */ | 311 | int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */ |
245 | void (*shutdown) (struct pci_dev *dev); | 312 | void (*shutdown) (struct pci_dev *dev); |
246 | 313 | ||
314 | struct pci_error_handlers *err_handler; | ||
247 | struct device_driver driver; | 315 | struct device_driver driver; |
248 | struct pci_dynids dynids; | 316 | struct pci_dynids dynids; |
249 | }; | 317 | }; |
@@ -448,6 +516,7 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass | |||
448 | 516 | ||
449 | void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), | 517 | void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), |
450 | void *userdata); | 518 | void *userdata); |
519 | int pci_cfg_space_size(struct pci_dev *dev); | ||
451 | 520 | ||
452 | /* kmem_cache style wrapper around pci_alloc_consistent() */ | 521 | /* kmem_cache style wrapper around pci_alloc_consistent() */ |
453 | 522 | ||