hubdev.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

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 Silicon Graphics, Inc.
  8.  * Copyright (C) 2000 by Colin Ngam
  9.  */
  10. #include <linux/types.h>
  11. #include <linux/slab.h>
  12. #include <asm/sn/sgi.h>
  13. #include <asm/sn/iograph.h>
  14. #include <asm/sn/sn1/hubdev.h>
  15. #include <asm/sn/sn_private.h>
  16. #include <asm/sn/invent.h>
  17. #include <asm/sn/hcl.h>
  18. #include <asm/sn/labelcl.h>
  19. struct hubdev_callout {
  20.         int (*attach_method)(devfs_handle_t);
  21.         struct hubdev_callout *fp;
  22. };
  23. typedef struct hubdev_callout hubdev_callout_t;
  24. mutex_t hubdev_callout_mutex;
  25. hubdev_callout_t *hubdev_callout_list = NULL;
  26. void
  27. hubdev_init(void)
  28. {
  29. mutex_init(&hubdev_callout_mutex);
  30.         hubdev_callout_list = NULL;
  31. }
  32.         
  33. void
  34. hubdev_register(int (*attach_method)(devfs_handle_t))
  35. {
  36.         hubdev_callout_t *callout;
  37.         
  38.         ASSERT(attach_method);
  39.         callout =  (hubdev_callout_t *)kmem_zalloc(sizeof(hubdev_callout_t), KM_SLEEP);
  40.         ASSERT(callout);
  41.         
  42. mutex_lock(&hubdev_callout_mutex);
  43.         /*
  44.          * Insert at the end of the list
  45.          */
  46.         callout->fp = hubdev_callout_list;
  47.         hubdev_callout_list = callout;
  48.         callout->attach_method = attach_method;
  49. mutex_unlock(&hubdev_callout_mutex);
  50. }
  51. int
  52. hubdev_unregister(int (*attach_method)(devfs_handle_t))
  53. {
  54.         hubdev_callout_t **p;
  55.         
  56.         ASSERT(attach_method);
  57.    
  58. mutex_lock(&hubdev_callout_mutex);
  59.         /*
  60.          * Remove registry element containing attach_method
  61.          */
  62.         for (p = &hubdev_callout_list; *p != NULL; p = &(*p)->fp) {
  63.                 if ((*p)->attach_method == attach_method) {
  64.                         hubdev_callout_t* victim = *p;
  65.                         *p = (*p)->fp;
  66.                         kfree(victim);
  67.                         mutex_unlock(&hubdev_callout_mutex);
  68.                         return (0);
  69.                 }
  70.         }
  71.         mutex_unlock(&hubdev_callout_mutex);
  72.         return (ENOENT);
  73. }
  74. int
  75. hubdev_docallouts(devfs_handle_t hub)
  76. {
  77.         hubdev_callout_t *p;
  78.         int errcode;
  79. mutex_lock(&hubdev_callout_mutex);
  80.         
  81.         for (p = hubdev_callout_list; p != NULL; p = p->fp) {
  82.                 ASSERT(p->attach_method);
  83.                 errcode = (*p->attach_method)(hub);
  84.                 if (errcode != 0) {
  85. mutex_unlock(&hubdev_callout_mutex);
  86.                         return (errcode);
  87.                 }
  88.         }
  89.         mutex_unlock(&hubdev_callout_mutex);
  90.         return (0);
  91. }
  92. /*
  93.  * Given a hub vertex, return the base address of the Hspec space
  94.  * for that hub.
  95.  */
  96. caddr_t
  97. hubdev_prombase_get(devfs_handle_t hub)
  98. {
  99. hubinfo_t hinfo = NULL;
  100. hubinfo_get(hub, &hinfo);
  101. ASSERT(hinfo);
  102. return ((caddr_t)NODE_RBOOT_BASE(hinfo->h_nasid));
  103. }
  104. cnodeid_t
  105. hubdev_cnodeid_get(devfs_handle_t hub)
  106. {
  107. hubinfo_t hinfo = NULL;
  108. hubinfo_get(hub, &hinfo);
  109. ASSERT(hinfo);
  110. return hinfo->h_cnodeid;
  111. }