
00001 /******************************************************** 00002 * Myricom VI-GM networking software and documentation * 00003 * Copyright (c) 2001 by Myricom, Inc. * 00004 * All rights reserved. * 00005 * See the file `COPYING' for copyright notice. * 00006 ********************************************************/ 00007 00013 #include <stdlib.h> 00014 #include <signal.h> 00015 00016 #include "vipl_priv.h" 00017 00018 00041 VIP_ENTRY_POINT VIP_RETURN 00042 VipCloseNic (VIP_NIC_HANDLE NicHandle) 00043 { 00044 VIP_UINT16 i; 00045 VIP_NIC *vip_nic_ptr; 00046 VIP_GM *vip_gm_ptr; 00047 VIP_DEBUG_LABEL (("VipCloseNic")); 00048 00049 /* check nic handle */ 00050 vip_nic_ptr = (VIP_NIC *) NicHandle; 00051 if (VIP_INVALID_NIC_HANDLE (vip_nic_ptr)) 00052 { 00053 VIP_DEBUG (("Invalid NIC handle")); 00054 return VIP_INVALID_PARAMETER; 00055 } 00056 VIP_MUTEX_LOCK (&vip_glob_lock); 00057 vip_gm_ptr = vip_nic_ptr->vip_gm_ptr; 00058 VIP_MUTEX_LOCK (&(vip_gm_ptr->lock)); 00059 VIP_MUTEX_LOCK (&(vip_nic_ptr->lock)); 00060 00061 vip_nic_ptr->magic = 0; 00062 vip_destroy_conn_handle_set (&(vip_nic_ptr->vip_conn_set)); 00063 vip_destroy_vi_handle_set (&(vip_nic_ptr->vip_vi_set)); 00064 vip_destroy_cq_handle_set (&(vip_nic_ptr->vip_cq_set)); 00065 vip_destroy_mem_handle_set (&(vip_nic_ptr->vip_mem_set)); 00066 vip_destroy_ptag_handle_set (&(vip_nic_ptr->vip_ptag_set)); 00067 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00068 VIP_MUTEX_DESTROY (&(vip_nic_ptr->lock)); 00069 vip_gm_ptr->vip_nic_ptrs[vip_nic_ptr->index] = NULL; 00070 00071 gm_lookaside_free (vip_nic_ptr); 00072 vip_gm_ptr->ref_count--; 00073 if (vip_gm_ptr->ref_count == 0) 00074 { 00075 vip_gm_ptr->blocking_plumber_cancelled = VIP_TRUE; 00076 vip_gm_ptr->periodic_plumber_cancelled = VIP_TRUE; 00077 VIP_SEMAPHORE_POST (&(vip_gm_ptr->blocking_plumber_tokens)); 00078 VIP_MUTEX_UNLOCK (&vip_gm_ptr->lock); 00079 VIP_THREAD_JOIN (vip_gm_ptr->plumber_blocking); 00080 VIP_THREAD_JOIN (vip_gm_ptr->plumber_periodic); 00081 VIP_MUTEX_LOCK (&vip_gm_ptr->lock); 00082 00083 VIP_SEMAPHORE_DESTROY (&(vip_gm_ptr->blocking_plumber_tokens)); 00084 gm_destroy_lookaside (vip_gm_ptr->notify_lookaside); 00085 VIP_AVL_TREE_DESTROY (vip_gm_ptr->regmem_avl_tree); 00086 gm_destroy_lookaside (vip_gm_ptr->regmem_avl_lookaside); 00087 gm_cancel_alarm (&(vip_gm_ptr->alive_alarm)); 00088 VIP_MUTEX_UNLOCK (&vip_gm_ptr->lock); 00089 VIP_MUTEX_DESTROY (&(vip_gm_ptr->recv_lock)); 00090 VIP_MUTEX_DESTROY (&(vip_gm_ptr->lock)); 00091 gm_dma_free (vip_gm_ptr->gm_port, vip_gm_ptr->alive_buffer); 00092 00093 for (i = 0; i < VI_GM_NUMBER_SEND_BUF; i++) 00094 { 00095 gm_dma_free (vip_gm_ptr->gm_port, vip_gm_ptr->send_buffers[i]); 00096 } 00097 free (vip_gm_ptr->send_buffers); 00098 gm_destroy_lookaside (vip_gm_ptr->vip_send_req_lookaside); 00099 for (i = 0; i < vip_gm_ptr->max_recv_tokens; i++) 00100 { 00101 gm_dma_free (vip_gm_ptr->gm_port, vip_gm_ptr->recv_buffers[i]); 00102 } 00103 free (vip_gm_ptr->recv_buffers); 00104 gm_close (vip_gm_ptr->gm_port); 00105 vip_glob_gm_ptrs[vip_gm_ptr->gm_board_id] = NULL; 00106 free (vip_gm_ptr); 00107 } 00108 else 00109 { 00110 VIP_MUTEX_UNLOCK (&vip_gm_ptr->lock); 00111 } 00112 VIP_MUTEX_UNLOCK (&vip_glob_lock); 00113 00114 VIP_DEBUG (("Success")); 00115 return VIP_SUCCESS; 00116 }
1.4.4.