[ofw] [PATCH 8/12] nd2: add SRQ support for 32-bit library

Hefty, Sean sean.hefty at intel.com
Tue Jul 27 00:57:52 PDT 2010


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 <sean.hefty at intel.com>
---
 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





More information about the ofw mailing list