
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 "vipl_priv.h" 00014 00015 00060 VIP_ENTRY_POINT VIP_RETURN 00061 VipCreateVi (VIP_NIC_HANDLE NicHandle, 00062 VIP_VI_ATTRIBUTES * ViAttribs, 00063 VIP_CQ_HANDLE SendCQHandle, 00064 VIP_CQ_HANDLE RecvCQHandle, VIP_VI_HANDLE * ViHandle) 00065 { 00066 VIP_VI *vip_vi_ptr; 00067 VIP_NIC *vip_nic_ptr; 00068 VIP_PTAG *vip_ptag_ptr; 00069 VIP_UINT16 index; 00070 VIP_CQ *send_vip_cq_ptr = NULL; 00071 VIP_CQ *recv_vip_cq_ptr = NULL; 00072 VIP_DEBUG_LABEL (("VipCreateVi")); 00073 00074 00075 if (ViAttribs == NULL) 00076 { 00077 VIP_DEBUG (("ViAttribs is NULL")); 00078 return VIP_INVALID_PARAMETER; 00079 } 00080 00081 if (ViAttribs->EnableRdmaRead != VI_GM_ENABLE_RDMAREAD) 00082 { 00083 VIP_DEBUG (("Invalid EnableRdmaRead in ViAttribs")); 00084 return VIP_INVALID_RDMAREAD; 00085 } 00086 00087 if (((ViAttribs->ReliabilityLevel & VI_GM_RELIABILITY_SUPPORT) == 0) 00088 || ((ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_RECEPTION) 00089 && (ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_DELIVERY) 00090 && (ViAttribs->ReliabilityLevel != VIP_SERVICE_UNRELIABLE))) 00091 { 00092 VIP_DEBUG (("Invalid ReliabilityLevel in ViAttribs")); 00093 return VIP_INVALID_RELIABILITY_LEVEL; 00094 } 00095 00096 if (ViAttribs->MaxTransferSize > VI_GM_MAX_TRANSFER_SIZE) 00097 { 00098 VIP_DEBUG (("Invalid MaxTransferSize in ViAttribs")); 00099 return VIP_INVALID_MTU; 00100 } 00101 00102 if (ViAttribs->QoS != NULL) 00103 { 00104 VIP_DEBUG (("Invalid QoS in ViAttribs (Only NULL supported)")); 00105 return VIP_INVALID_QOS; 00106 } 00107 00108 if ((ViAttribs->EnableRdmaWrite != VIP_TRUE) 00109 && (ViAttribs->EnableRdmaWrite != VIP_FALSE)) 00110 { 00111 VIP_DEBUG (("Invalid EnableRdmaWrite in ViAttribs")); 00112 return VIP_INVALID_PARAMETER; 00113 } 00114 00115 /* check nic handle */ 00116 vip_nic_ptr = (VIP_NIC *) NicHandle; 00117 if (VIP_INVALID_NIC_HANDLE (vip_nic_ptr)) 00118 { 00119 VIP_DEBUG (("Invalid NIC handle")); 00120 return VIP_INVALID_PARAMETER; 00121 } 00122 VIP_MUTEX_LOCK (&(vip_nic_ptr->lock)); 00123 00124 /* check send cq handle */ 00125 if (SendCQHandle != NULL) 00126 { 00127 send_vip_cq_ptr = (VIP_CQ *) SendCQHandle; 00128 if (VIP_INVALID_CQ_HANDLE (send_vip_cq_ptr)) 00129 { 00130 VIP_DEBUG (("Invalid Send CQ handle")); 00131 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00132 return VIP_INVALID_PARAMETER; 00133 } 00134 00135 if (send_vip_cq_ptr->handle.vip_nic_ptr != vip_nic_ptr) 00136 { 00137 VIP_DEBUG (("Inconsistent NIC in Send CQ handle")); 00138 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00139 return VIP_INVALID_PARAMETER; 00140 } 00141 } 00142 00143 /* check recv cq handle */ 00144 if (RecvCQHandle != NULL) 00145 { 00146 recv_vip_cq_ptr = (VIP_CQ *) RecvCQHandle; 00147 if (VIP_INVALID_CQ_HANDLE (recv_vip_cq_ptr)) 00148 { 00149 VIP_DEBUG (("Invalid Recv CQ handle")); 00150 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00151 return VIP_INVALID_PARAMETER; 00152 } 00153 00154 if (recv_vip_cq_ptr->handle.vip_nic_ptr != vip_nic_ptr) 00155 { 00156 VIP_DEBUG (("Inconsistent NIC in Recv CQ handle")); 00157 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00158 return VIP_INVALID_PARAMETER; 00159 } 00160 } 00161 00162 /* check ptag */ 00163 vip_ptag_ptr = (VIP_PTAG *) ViAttribs->Ptag; 00164 if (VIP_INVALID_PTAG_HANDLE (vip_ptag_ptr)) 00165 { 00166 VIP_DEBUG (("Invalid PTAG handle")); 00167 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00168 return VIP_INVALID_PTAG; 00169 } 00170 00171 /* check ptag's NIC */ 00172 if (vip_ptag_ptr->handle.vip_nic_ptr != vip_nic_ptr) 00173 { 00174 VIP_DEBUG (("PTAG handle's NIC inconsistency")); 00175 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00176 return VIP_INVALID_PTAG; 00177 } 00178 00179 /* allocate vi */ 00180 vip_vi_ptr = (VIP_VI *) vip_allocate_handle (&(vip_nic_ptr->vip_vi_set)); 00181 if (vip_vi_ptr == NULL) 00182 { 00183 VIP_DEBUG (("VIP_VI alloc failed")); 00184 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00185 return VIP_ERROR_RESOURCE; 00186 } 00187 00188 vip_ptag_ptr->handle.ref_count++; 00189 vip_vi_ptr->vip_ptag_ptr = vip_ptag_ptr; 00190 00191 if (send_vip_cq_ptr != NULL) 00192 { 00193 vip_vi_ptr->send_queue.vip_cq_ptr = send_vip_cq_ptr; 00194 send_vip_cq_ptr->handle.ref_count++; 00195 } 00196 else 00197 { 00198 vip_vi_ptr->send_queue.vip_cq_ptr = NULL; 00199 } 00200 00201 if (recv_vip_cq_ptr != NULL) 00202 { 00203 vip_vi_ptr->recv_queue.vip_cq_ptr = recv_vip_cq_ptr; 00204 recv_vip_cq_ptr->handle.ref_count++; 00205 } 00206 else 00207 { 00208 vip_vi_ptr->recv_queue.vip_cq_ptr = NULL; 00209 } 00210 00211 vip_vi_ptr->send_queue.first = NULL; 00212 vip_vi_ptr->send_queue.last = NULL; 00213 vip_vi_ptr->send_queue.current_desc = NULL; 00214 vip_vi_ptr->send_queue.current_mem = 0; 00215 vip_vi_ptr->send_queue.total_count = 0; 00216 vip_vi_ptr->send_queue.count_to_process = 0; 00217 vip_vi_ptr->send_queue.event_count = 0; 00218 VIP_EVENT_INIT (&(vip_vi_ptr->send_queue.event)); 00219 VIP_SEMAPHORE_INIT (&(vip_vi_ptr->send_queue.notify_tokens), 0); 00220 vip_vi_ptr->send_queue.notify_initialized = VIP_FALSE; 00221 vip_vi_ptr->send_queue.notify_cancelled = VIP_FALSE; 00222 vip_vi_ptr->send_queue.first_notify_handler = NULL; 00223 vip_vi_ptr->send_queue.last_notify_handler = NULL; 00224 00225 vip_vi_ptr->recv_queue.first = NULL; 00226 vip_vi_ptr->recv_queue.last = NULL; 00227 vip_vi_ptr->recv_queue.current_desc = NULL; 00228 vip_vi_ptr->recv_queue.current_mem = 0; 00229 vip_vi_ptr->recv_queue.total_count = 0; 00230 vip_vi_ptr->recv_queue.count_to_process = 0; 00231 vip_vi_ptr->recv_queue.event_count = 0; 00232 VIP_EVENT_INIT (&(vip_vi_ptr->recv_queue.event)); 00233 VIP_SEMAPHORE_INIT (&(vip_vi_ptr->recv_queue.notify_tokens), 0); 00234 vip_vi_ptr->recv_queue.notify_initialized = VIP_FALSE; 00235 vip_vi_ptr->recv_queue.notify_cancelled = VIP_FALSE; 00236 vip_vi_ptr->recv_queue.first_notify_handler = NULL; 00237 vip_vi_ptr->recv_queue.last_notify_handler = NULL; 00238 00239 vip_vi_ptr->conn_ptr = NULL; 00240 vip_vi_ptr->net_remote_nic_index = VIP_HTON_UINT16 (0); 00241 vip_vi_ptr->net_remote_vi_index = VIP_HTON_UINT16 (0); 00242 vip_vi_ptr->mtu = ViAttribs->MaxTransferSize; 00243 vip_vi_ptr->qos = ViAttribs->QoS; 00244 vip_vi_ptr->gm_dest_id = 0; 00245 vip_vi_ptr->gm_dest_port = 0; 00246 vip_vi_ptr->rdma_write = ViAttribs->EnableRdmaWrite; 00247 vip_vi_ptr->reliability = ViAttribs->ReliabilityLevel; 00248 vip_vi_ptr->pending_callbacks = 0; 00249 vip_vi_ptr->state = VIP_STATE_IDLE; 00250 00251 /* register the VI handle pointer into the VI pts tab */ 00252 index = vip_nic_ptr->vip_vi_index_free; 00253 vip_nic_ptr->vip_vi_index_free = 00254 (((VIP_UINTPTR) (vip_nic_ptr->vip_vi_ptrs[index])) & 0xFFFF); 00255 vip_nic_ptr->vip_vi_ptrs[index] = vip_vi_ptr; 00256 vip_vi_ptr->index = index; 00257 00258 *ViHandle = (VIP_VI_HANDLE) vip_vi_ptr; 00259 VIP_DEBUG (("Success")); 00260 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00261 return VIP_SUCCESS; 00262 }
1.4.4.