The SRQ receive code assumes that ND_SGE can map to a WV_SGE. This is only true for 64-bit platforms. A 32-bit library must convert ND_SGE to WV_SGE. The ND_SGE size varies based on the build; WV_SGE is a fixed size for all platforms.
Signed-off-by: Sean Hefty <[email protected]> --- trunk/ulp/netdirect2/user/nd_srq.cpp | 44 ++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+), 0 deletions(-) diff --git a/trunk/ulp/netdirect2/user/nd_srq.cpp b/trunk/ulp/netdirect2/user/nd_srq.cpp index 7499617..0703aa9 100644 --- a/trunk/ulp/netdirect2/user/nd_srq.cpp +++ b/trunk/ulp/netdirect2/user/nd_srq.cpp @@ -123,6 +123,16 @@ Notify(OVERLAPPED* pOverlapped) return NDConvertWVStatus(hr); } +#ifdef _WIN64 + +C_ASSERT(sizeof(WV_SGE) == sizeof(ND_SGE)); +C_ASSERT(FIELD_OFFSET(WV_SGE, pAddress) == FIELD_OFFSET(ND_SGE, Buffer)); +C_ASSERT(RTL_FIELD_SIZE(WV_SGE, pAddress) == RTL_FIELD_SIZE(ND_SGE, Buffer)); +C_ASSERT(FIELD_OFFSET(WV_SGE, Length) == FIELD_OFFSET(ND_SGE, BufferLength)); +C_ASSERT(RTL_FIELD_SIZE(WV_SGE, Length) == RTL_FIELD_SIZE(ND_SGE, BufferLength)); +C_ASSERT(FIELD_OFFSET(WV_SGE, Lkey) == FIELD_OFFSET(ND_SGE, MemoryRegionToken)); +C_ASSERT(RTL_FIELD_SIZE(WV_SGE, Lkey) == RTL_FIELD_SIZE(ND_SGE, MemoryRegionToken)); + STDMETHODIMP CNDSharedReceiveQueue:: Receive(VOID* requestContext, const ND_SGE* pSge, DWORD nSge) { @@ -131,3 +141,37 @@ Receive(VOID* requestContext, const ND_SGE* pSge, DWORD nSge) hr = m_pWvSrq->PostReceive((UINT64) (ULONG_PTR) requestContext, (WV_SGE *) pSge, nSge); return NDConvertWVStatus(hr); } + +#else + +STDMETHODIMP CNDSharedReceiveQueue:: +Receive(VOID* requestContext, const ND_SGE* pSge, DWORD nSge) +{ + WV_SGE sge_array[4]; + WV_SGE *sge; + DWORD i; + HRESULT hr; + + if (nSge > _countof(sge_array)) { + sge = new WV_SGE[nSge]; + if (pShadowSge == NULL) { + return ND_NO_MEMORY; + } + } else { + sge = sge_array; + } + + for (i = 0; i < nSge; i++) { + sge->pAddress = pSge[i].Buffer; + sge->Length = pSge[i].BufferLength; + sge->Lkey = pSge[i].MemoryRegionToken; + } + + hr = m_pWvSrq->PostReceive((UINT64) (ULONG_PTR) requestContext, sge, nSge); + if (nSge > _countof(sge_array)) { + delete[] sge; + } + return NDConvertWVStatus(hr); +} + +#endif \ No newline at end of file _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
