aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-sparc64/vio.h
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2007-07-12 16:47:50 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-07-16 07:04:28 -0400
commit43fdf27470b216ebdef47e09ff83bed2f2894b13 (patch)
tree76b9b838089e5679471026037c93325c228df84a /include/asm-sparc64/vio.h
parent133f09a169f3022be3de671b29658b7ecb375022 (diff)
[SPARC64]: Abstract out mdesc accesses for better MD update handling.
Since we have to be able to handle MD updates, having an in-tree set of data structures representing the MD objects actually makes things more painful. The MD itself is easy to parse, and we can implement the existing interfaces using direct parsing of the MD binary image. The MD is now reference counted, so accesses have to now take the form: handle = mdesc_grab(); ... operations on MD ... mdesc_release(handle); The only remaining issue are cases where code holds on to references to MD property values. mdesc_get_property() returns a direct pointer to the property value, most cases just pull in the information they need and discard the pointer, but there are few that use the pointer directly over a long lifetime. Those will be fixed up in a subsequent changeset. A preliminary handler for MD update events from domain services is there, it is rudimentry but it works and handles all of the reference counting. It does not check the generation number of the MDs, and it does not generate a "add/delete" list for notification to interesting parties about MD changes but that will be forthcoming. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/asm-sparc64/vio.h')
-rw-r--r--include/asm-sparc64/vio.h23
1 files changed, 11 insertions, 12 deletions
diff --git a/include/asm-sparc64/vio.h b/include/asm-sparc64/vio.h
index 47c3da76dcb..a8a53e6fc25 100644
--- a/include/asm-sparc64/vio.h
+++ b/include/asm-sparc64/vio.h
@@ -265,13 +265,18 @@ static inline u32 vio_dring_avail(struct vio_dring_state *dr,
265} 265}
266 266
267struct vio_dev { 267struct vio_dev {
268 struct mdesc_node *mp; 268 u64 mp;
269 struct device_node *dp; 269 struct device_node *dp;
270 270
271 const char *type; 271 const char *type;
272 const char *compat; 272 const char *compat;
273 int compat_len; 273 int compat_len;
274 274
275 unsigned long channel_id;
276
277 unsigned int tx_irq;
278 unsigned int rx_irq;
279
275 struct device dev; 280 struct device dev;
276}; 281};
277 282
@@ -345,16 +350,10 @@ struct vio_driver_state {
345 350
346 struct vio_dev *vdev; 351 struct vio_dev *vdev;
347 352
348 unsigned long channel_id;
349 unsigned int tx_irq;
350 unsigned int rx_irq;
351
352 struct timer_list timer; 353 struct timer_list timer;
353 354
354 struct vio_version ver; 355 struct vio_version ver;
355 356
356 struct mdesc_node *endpoint;
357
358 struct vio_version *ver_table; 357 struct vio_version *ver_table;
359 int ver_table_entries; 358 int ver_table_entries;
360 359
@@ -365,7 +364,8 @@ struct vio_driver_state {
365 364
366#define viodbg(TYPE, f, a...) \ 365#define viodbg(TYPE, f, a...) \
367do { if (vio->debug & VIO_DEBUG_##TYPE) \ 366do { if (vio->debug & VIO_DEBUG_##TYPE) \
368 printk(KERN_INFO "vio: ID[%lu] " f, vio->channel_id, ## a); \ 367 printk(KERN_INFO "vio: ID[%lu] " f, \
368 vio->vdev->channel_id, ## a); \
369} while (0) 369} while (0)
370 370
371extern int vio_register_driver(struct vio_driver *drv); 371extern int vio_register_driver(struct vio_driver *drv);
@@ -392,11 +392,10 @@ extern int vio_ldc_alloc(struct vio_driver_state *vio,
392 struct ldc_channel_config *base_cfg, void *event_arg); 392 struct ldc_channel_config *base_cfg, void *event_arg);
393extern void vio_ldc_free(struct vio_driver_state *vio); 393extern void vio_ldc_free(struct vio_driver_state *vio);
394extern int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev, 394extern int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
395 u8 dev_class, struct mdesc_node *channel_endpoint, 395 u8 dev_class, struct vio_version *ver_table,
396 struct vio_version *ver_table, int ver_table_size, 396 int ver_table_size, struct vio_driver_ops *ops,
397 struct vio_driver_ops *ops, char *name); 397 char *name);
398 398
399extern struct mdesc_node *vio_find_endpoint(struct vio_dev *vdev);
400extern void vio_port_up(struct vio_driver_state *vio); 399extern void vio_port_up(struct vio_driver_state *vio);
401 400
402#endif /* _SPARC64_VIO_H */ 401#endif /* _SPARC64_VIO_H */