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

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