2 * Copyright (c) 2009 Intel Corporation. All rights reserved.
\r
4 * This software is available to you under the OpenIB.org BSD license
\r
7 * Redistribution and use in source and binary forms, with or
\r
8 * without modification, are permitted provided that the following
\r
9 * conditions are met:
\r
11 * - Redistributions of source code must retain the above
\r
12 * copyright notice, this list of conditions and the following
\r
15 * - Redistributions in binary form must reproduce the above
\r
16 * copyright notice, this list of conditions and the following
\r
17 * disclaimer in the documentation and/or other materials
\r
18 * provided with the distribution.
\r
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
\r
24 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
\r
25 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
\r
26 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
\r
32 CNDCompletionQueue::CNDCompletionQueue(CNDAdapter *pAdapter)
\r
35 m_pAdapter = pAdapter;
\r
39 STDMETHODIMP CNDCompletionQueue::
\r
40 Init(SIZE_T nEntries)
\r
44 hr = m_pAdapter->m_pWvDevice->CreateCompletionQueue(&nEntries, &m_pWvCq);
\r
45 return NDConvertWVStatus(hr);
\r
48 CNDCompletionQueue::~CNDCompletionQueue()
\r
50 if (m_pWvCq != NULL) {
\r
53 m_pAdapter->Release();
\r
56 STDMETHODIMP CNDCompletionQueue::
\r
57 QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
\r
59 if (riid != IID_IUnknown && riid != IID_INDCompletionQueue) {
\r
61 return E_NOINTERFACE;
\r
69 STDMETHODIMP_(ULONG) CNDCompletionQueue::
\r
72 return CNDBase::AddRef();
\r
75 STDMETHODIMP_(ULONG) CNDCompletionQueue::
\r
78 return CNDBase::Release();
\r
81 STDMETHODIMP CNDCompletionQueue::
\r
82 CancelOverlappedRequests(void)
\r
86 hr = m_pWvCq->CancelOverlappedRequests();
\r
87 return NDConvertWVStatus(hr);
\r
90 STDMETHODIMP CNDCompletionQueue::
\r
91 GetOverlappedResult(OVERLAPPED *pOverlapped,
\r
92 SIZE_T *pNumberOfBytesTransferred, BOOL bWait)
\r
96 hr = m_pWvCq->GetOverlappedResult(pOverlapped,
\r
97 (DWORD *) pNumberOfBytesTransferred, bWait);
\r
98 return NDConvertWVStatus(hr);
\r
101 STDMETHODIMP CNDCompletionQueue::
\r
102 Resize(SIZE_T nEntries)
\r
106 hr = m_pWvCq->Resize(&nEntries);
\r
107 return NDConvertWVStatus(hr);
\r
110 STDMETHODIMP CNDCompletionQueue::
\r
111 Notify(DWORD Type, OVERLAPPED* pOverlapped)
\r
115 hr = m_pWvCq->Notify((WV_CQ_NOTIFY_TYPE) Type, pOverlapped);
\r
116 return NDConvertWVStatus(hr);
\r
119 STDMETHODIMP_(SIZE_T) CNDCompletionQueue::
\r
120 GetResults(ND_RESULT* pResults[], SIZE_T nResults)
\r
122 WV_COMPLETION comp[8];
\r
123 SIZE_T cnt, total, i;
\r
125 for (total = 0; nResults; nResults -= cnt) {
\r
126 cnt = min(8, nResults);
\r
127 cnt = m_pWvCq->Poll(comp, cnt);
\r
132 for (i = 0; i < cnt; i++) {
\r
133 pResults[total] = (ND_RESULT *) comp[i].WrId;
\r
134 if (comp[i].Opcode & WvReceive) {
\r
135 pResults[total]->BytesTransferred = comp[i].Length;
\r
137 pResults[total++]->Status = comp[i].Status;
\r