Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

vipclosenic.c

Go to the documentation of this file.
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 }
VI-GM-1.3 by Myricom © 1997-2006. Documentation generated on 20 May 2006 by doxygen 1.4.4.