cdl.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id$
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 1992 - 1997, 2000-2001 Silicon Graphics, Inc. All rights reserved.
  8.  */
  9. #ifndef _ASM_IA64_SN_CDL_H
  10. #define _ASM_IA64_SN_CDL_H
  11. #include <asm/sn/sgi.h>
  12. /*
  13.  * cdl: connection/driver list
  14.  *
  15.  * support code for bus infrastructure for busses
  16.  * that have self-identifying devices; initially
  17.  * constructed for xtalk, pciio and gioio modules.
  18.  */
  19. typedef struct cdl     *cdl_p;
  20. /*
  21.  * cdl_itr_f is the type for the functions
  22.  * that are handled by cdl_iterate.
  23.  */
  24. typedef void
  25. cdl_iter_f (devfs_handle_t vhdl);
  26. /*
  27.  * cdl_drv_f is the type for the functions
  28.  * that are called by cdl_add_driver and 
  29.  *      cdl_del_driver.
  30.  */
  31. typedef void
  32. cdl_drv_f (devfs_handle_t vhdl, int key1, int key2, int error);
  33. /*
  34.  * If CDL_PRI_HI is specified in the flags
  35.  * parameter for cdl_add_driver, then that driver's
  36.  * attach routine will be called for future connect
  37.  * points before any (non-CDL_PRI_HI) drivers.
  38.  *
  39.  * The IOC3 driver uses this facility to make sure
  40.  * that the ioc3_attach() function is called before
  41.  * the attach routines of any subdevices.
  42.  *
  43.  * Drivers for bridge-based crosstalk cards that
  44.  * are almost but not quite generic can use it to
  45.  * arrange that their attach() functions get called
  46.  * before the generic bridge drivers, so they can
  47.  * leave behind "hint" structures that will
  48.  * properly configure the generic driver.
  49.  */
  50. #define CDL_PRI_HI 0x0001
  51. /*
  52.  * cdl_new: construct a new connection/driver list
  53.  *
  54.  * Called once for each "kind" of bus. Returns an
  55.  * opaque cookie representing the particular list
  56.  * that will be operated on by the other calls.
  57.  */
  58. extern cdl_p cdl_new(char *, char *, char *);
  59. /*
  60.  * cdl_del: destroy a connection/driver list.
  61.  *
  62.  * Releases all dynamically allocated resources
  63.  * associated with the specified list. Forgets what
  64.  * drivers might be involved in this kind of bus,
  65.  * forgets what connection points have been noticed
  66.  * on this kind of bus.
  67.  */
  68. extern void cdl_del(cdl_p reg);
  69. /*
  70.  * cdl_add_driver: register a device driver
  71.  *
  72.  * Calls the driver's attach routine with all
  73.  * connection points on the list that have the same
  74.  * key information as the driver; call-back the 
  75.  *      specified function to notify the driver of the 
  76.  *      attach status for each device.  Place the driver
  77.  *      on the list so that any connection points
  78.  * discovered in the future that match the driver
  79.  * can be handed off to the driver's attach
  80.  * routine.
  81.  *
  82.  * CDL_PRI_HI may be specified (see above).
  83.  */
  84. extern int cdl_add_driver(cdl_p reg,
  85.        int key1,
  86.        int key2,
  87.        char *prefix,
  88.        int flags,
  89.        cdl_drv_f *func);
  90. /*
  91.  * cdl_del_driver: remove a device driver
  92.  *
  93.  * Calls the driver's detach routine with all
  94.  * connection points on the list that match the
  95.  * driver;  call-back the specified function to
  96.  *      notify the driver of the detach status for each
  97.  *      device.  Then forget about the driver.  Future
  98.  * calls to cdl_add_connpt with connections that
  99.  * would match this driver no longer trigger calls
  100.  * to the driver's attach routine.
  101.  *
  102.  * NOTE: Yes, I said CONNECTION POINTS, not
  103.  * verticies that the driver has been attached to
  104.  * with hwgraph_driver_add(); this gives the driver
  105.  * a chance to clean up anything it did to the
  106.  * connection point in its attach routine. Also,
  107.  * this is done whether or not the attach routine
  108.  * was successful.
  109.  */
  110. extern void cdl_del_driver(cdl_p reg, 
  111.        char *prefix,
  112.        cdl_drv_f *func);
  113. /*
  114.  * cdl_add_connpt: add a connection point
  115.  *
  116.  * Calls the attach routines of all the drivers on
  117.  * the list that match this connection point, in
  118.  * the order that they were added to the list,
  119.  * except that CDL_PRI_HI drivers are called first.
  120.  *
  121.  * Then the vertex is added to the list, so it can
  122.  * be presented to any matching drivers that may be
  123.  * subsequently added to the list.
  124.  */
  125. extern int cdl_add_connpt(cdl_p reg,
  126.        int key1,
  127.        int key2,
  128.        devfs_handle_t conn,
  129.        int drv_flags);
  130. /*
  131.  * cdl_del_connpt: delete a connection point
  132.  *
  133.  * Calls the detach routines of all matching
  134.  * drivers for this connection point, in the same
  135.  * order that the attach routines were called; then
  136.  * forgets about this vertex, so drivers added in
  137.  * the future will not be told about it.
  138.  *
  139.  * NOTE: Same caveat here about the detach calls as
  140.  * in the cdl_del_driver() comment above.
  141.  */
  142. extern int cdl_del_connpt(cdl_p reg,
  143.        int key1,
  144.        int key2,
  145.        devfs_handle_t conn,
  146.        int drv_flags);
  147. /*
  148.  * cdl_iterate: find all verticies in the registry
  149.  * corresponding to the named driver and call them
  150.  * with the specified function (giving the vertex
  151.  * as the parameter).
  152.  */
  153. extern void cdl_iterate(cdl_p reg,
  154.     char *prefix,
  155.     cdl_iter_f *func);
  156. /*
  157.  * An INFO_LBL_ASYNC_ATTACH label is attached to a vertex, pointing to
  158.  * an instance of async_attach_s to indicate that asynchronous
  159.  * attachment may be applied to that device ... if the corresponding
  160.  * driver allows it.
  161.  */
  162. struct async_attach_s {
  163. struct semaphore async_sema;
  164. int    async_count;
  165. };
  166. typedef struct async_attach_s *async_attach_t;
  167. async_attach_t async_attach_new(void);
  168. void async_attach_free(async_attach_t);
  169. async_attach_t  async_attach_get_info(devfs_handle_t);
  170. void            async_attach_add_info(devfs_handle_t, async_attach_t);
  171. void            async_attach_del_info(devfs_handle_t);
  172. void async_attach_signal_start(async_attach_t);
  173. void async_attach_signal_done(async_attach_t);
  174. void async_attach_waitall(async_attach_t);
  175. #endif /* _ASM_IA64_SN_CDL_H */