
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 00055 VIP_ENTRY_POINT VIP_RETURN 00056 VipSetViAttributes (VIP_VI_HANDLE ViHandle, VIP_VI_ATTRIBUTES * ViAttribs) 00057 { 00058 VIP_VI *vip_vi_ptr; 00059 VIP_PTAG *new_vip_ptag_ptr; 00060 VIP_DEBUG_LABEL (("VipSetViAttributes")); 00061 00062 00063 if (ViAttribs == NULL) 00064 { 00065 VIP_DEBUG (("ViAttribs is NULL")); 00066 return VIP_INVALID_PARAMETER; 00067 } 00068 00069 if (ViAttribs->EnableRdmaRead != VI_GM_ENABLE_RDMAREAD) 00070 { 00071 VIP_DEBUG (("Invalid EnableRdmaRead in ViAttribs")); 00072 return VIP_INVALID_RDMAREAD; 00073 } 00074 00075 if (((ViAttribs->ReliabilityLevel & VI_GM_RELIABILITY_SUPPORT) == 0) 00076 || ((ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_RECEPTION) 00077 && (ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_DELIVERY) 00078 && (ViAttribs->ReliabilityLevel != VIP_SERVICE_UNRELIABLE))) 00079 { 00080 VIP_DEBUG (("Invalid ReliabilityLevel in ViAttribs")); 00081 return VIP_INVALID_RELIABILITY_LEVEL; 00082 } 00083 00084 if (ViAttribs->MaxTransferSize > VI_GM_MAX_TRANSFER_SIZE) 00085 { 00086 VIP_DEBUG (("Invalid MaxTransferSize in ViAttribs")); 00087 return VIP_INVALID_MTU; 00088 } 00089 00090 if (ViAttribs->QoS != NULL) 00091 { 00092 VIP_DEBUG (("Invalid QoS in ViAttribs (Only NULL supported)")); 00093 return VIP_INVALID_QOS; 00094 } 00095 00096 if ((ViAttribs->EnableRdmaWrite != VIP_TRUE) 00097 && (ViAttribs->EnableRdmaWrite != VIP_FALSE)) 00098 { 00099 VIP_DEBUG (("Invalid EnableRdmaWrite in ViAttribs")); 00100 return VIP_INVALID_PARAMETER; 00101 } 00102 00103 /* check vi handle */ 00104 vip_vi_ptr = (VIP_VI *) ViHandle; 00105 if (VIP_INVALID_VI_HANDLE (vip_vi_ptr)) 00106 { 00107 VIP_DEBUG (("Invalid VI handle")); 00108 return VIP_INVALID_PARAMETER; 00109 } 00110 VIP_MUTEX_LOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock)); 00111 00112 /* check vi state */ 00113 if (vip_vi_ptr->state != VIP_STATE_IDLE) 00114 { 00115 VIP_DEBUG (("VI is not in idle state")); 00116 VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock)); 00117 return VIP_INVALID_STATE; 00118 } 00119 00120 /* check new ptag */ 00121 new_vip_ptag_ptr = (VIP_PTAG *) ViAttribs->Ptag; 00122 if (VIP_INVALID_PTAG_HANDLE (new_vip_ptag_ptr)) 00123 { 00124 VIP_DEBUG (("Invalid PTAG handle")); 00125 VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock)); 00126 return VIP_INVALID_PTAG; 00127 } 00128 00129 /* check new ptag's NIC */ 00130 if (new_vip_ptag_ptr->handle.vip_nic_ptr != vip_vi_ptr->handle.vip_nic_ptr) 00131 { 00132 VIP_DEBUG (("PTAG handle's NIC inconsistency")); 00133 VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock)); 00134 return VIP_INVALID_PTAG; 00135 } 00136 00137 /* replace the ptag in VI attributes */ 00138 if (vip_vi_ptr->vip_ptag_ptr != new_vip_ptag_ptr) 00139 { 00140 VIP_ASSERT (vip_vi_ptr->vip_ptag_ptr->handle.ref_count > 0); 00141 vip_vi_ptr->vip_ptag_ptr->handle.ref_count--; 00142 new_vip_ptag_ptr->handle.ref_count++; 00143 } 00144 00145 vip_vi_ptr->vip_ptag_ptr = new_vip_ptag_ptr; 00146 vip_vi_ptr->qos = ViAttribs->QoS; 00147 vip_vi_ptr->mtu = ViAttribs->MaxTransferSize; 00148 vip_vi_ptr->rdma_write = ViAttribs->EnableRdmaWrite; 00149 vip_vi_ptr->reliability = ViAttribs->ReliabilityLevel; 00150 00151 VIP_DEBUG (("Success")); 00152 VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock)); 00153 return VIP_SUCCESS; 00154 }
1.4.4.