To support ibping, winmad needs to support registering for unsolicited
MADs.  We just need to change the MAD service context from referencing
the WMProvider to the WMRegistration.

Signed-off-by: Sean Hefty <[email protected]>
---

diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' 
trunk\core\winmad/kernel/wm_provider.c
branches\winverbs\core\winmad/kernel/wm_provider.c
--- trunk\core\winmad/kernel/wm_provider.c      2009-05-05 11:54:32.247285400 
-0700
+++ branches\winverbs\core\winmad/kernel/wm_provider.c  2009-05-06 
11:29:12.287547100 -0700
@@ -106,7 +106,7 @@ void WmProviderDeregister(WM_PROVIDER *p
                next = mad->p_next;
                mad->p_next = NULL;
 
-               if (mad->send_context1 == pRegistration) {
+               if (mad->context1 == pRegistration) {
                        pRegistration->pDevice->IbInterface.put_mad(mad);
                } else {
                        WmInsertMad(pProvider, mad);
@@ -215,14 +215,9 @@ void WmProviderRemoveHandler(WM_PROVIDER
        WmProviderUnlockRemove(pProvider);
 }
 
-static NTSTATUS WmCopyRead(WM_PROVIDER *pProvider, WM_IO_MAD *pIoMad,
-                                                  ib_mad_element_t *pMad, 
size_t *pLen)
+static NTSTATUS WmCopyMad(WM_IO_MAD *pIoMad, ib_mad_element_t *pMad, size_t 
*pLen)
 {
-       WM_REGISTRATION         *reg;
-
-       reg = (WM_REGISTRATION *) pMad->send_context1;
-       pIoMad->Id = reg->Id;
-
+       pIoMad->Id = ((WM_REGISTRATION *) pMad->context1)->Id;
        pIoMad->Status = pMad->status;
        pIoMad->Timeout = pMad->timeout_ms;
        pIoMad->Retries = pMad->retry_cnt;
@@ -278,9 +273,9 @@ void WmProviderRead(WM_PROVIDER *pProvid
        }
 
        len = outlen;
-       status = WmCopyRead(pProvider, wmad, pProvider->MadHead, &len);
+       status = WmCopyMad(wmad, pProvider->MadHead, &len);
        if (status == STATUS_SUCCESS) {
-               reg = (WM_REGISTRATION *) pProvider->MadHead->send_context1;
+               reg = (WM_REGISTRATION *) pProvider->MadHead->context1;
                reg->pDevice->IbInterface.put_mad(WmRemoveMad(pProvider));
        }
        WdfObjectReleaseLock(pProvider->ReadQueue);
@@ -302,7 +297,6 @@ static NTSTATUS WmSendMad(WM_REGISTRATIO
                return STATUS_NO_MEMORY;
        }
 
-       mad->context1 = pRegistration;
        RtlCopyMemory(mad->p_mad_buf, pIoMad + 1, size);
        mad->remote_qp = pIoMad->Address.Qpn;
        mad->remote_qkey = pIoMad->Address.Qkey;
@@ -322,7 +316,9 @@ static NTSTATUS WmSendMad(WM_REGISTRATIO
        mad->remote_sl = pIoMad->Address.ServiceLevel;
        mad->pkey_index = pIoMad->Address.PkeyIndex;
        mad->path_bits = pIoMad->Address.PathBits;
-       mad->p_mad_buf->trans_id &= 0xFFFFFFFF00000000;
+       if (!ib_mad_is_response(mad->p_mad_buf)) {
+               mad->p_mad_buf->trans_id &= 0xFFFFFFFF00000000;
+       }
 
        ib_status = pifc->send_mad(pRegistration->hService, mad, NULL);
        if (ib_status != IB_SUCCESS) {
@@ -366,15 +362,16 @@ out:
 void WmReceiveHandler(ib_mad_svc_handle_t hService, void *Context,
                                          ib_mad_element_t *pMad)
 {
-       WM_REGISTRATION *reg;
-       WM_PROVIDER             *prov = Context;
+       WM_REGISTRATION *reg = Context;
+       WM_PROVIDER             *prov;
        WDFREQUEST              request;
        NTSTATUS                status;
        WM_IO_MAD               *wmad;
        size_t                  len = 0;
 
        UNREFERENCED_PARAMETER(hService);
-       reg = (WM_REGISTRATION *) pMad->send_context1;
+       prov = reg->pProvider;
+       pMad->context1 = reg;
 
        WdfObjectAcquireLock(prov->ReadQueue);
        if (reg->hService == NULL) {
@@ -394,9 +391,8 @@ void WmReceiveHandler(ib_mad_svc_handle_
                goto complete;
        }
 
-       status = WmCopyRead(prov, wmad, pMad, &len);
+       status = WmCopyMad(wmad, pMad, &len);
        if (status == STATUS_SUCCESS) {
-               reg = (WM_REGISTRATION *) pMad->send_context1;
                reg->pDevice->IbInterface.put_mad(pMad);
        } else {
                WmInsertMad(prov, pMad);
@@ -412,9 +408,8 @@ void WmSendHandler(ib_mad_svc_handle_t h
                                   ib_mad_element_t *pMad)
 {
        if (pMad->status == IB_SUCCESS) {
-               ((WM_REGISTRATION *) 
pMad->context1)->pDevice->IbInterface.put_mad(pMad);
+               ((WM_REGISTRATION *) 
Context)->pDevice->IbInterface.put_mad(pMad);
        } else {
-               pMad->send_context1 = (void*) pMad->context1;
                WmReceiveHandler(hService, Context, pMad);
        }
 }
diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' 
trunk\core\winmad/kernel/wm_reg.c
branches\winverbs\core\winmad/kernel/wm_reg.c
--- trunk\core\winmad/kernel/wm_reg.c   2009-05-05 11:54:32.356661800 -0700
+++ branches\winverbs\core\winmad/kernel/wm_reg.c       2009-05-06 
10:00:53.643734500 -0700
@@ -146,7 +146,7 @@ static NTSTATUS WmRegInit(WM_REGISTRATIO
                goto err4;
        }
 
-       svc.mad_svc_context = pRegistration->pProvider;
+       svc.mad_svc_context = pRegistration;
        svc.pfn_mad_send_cb = WmSendHandler;
        svc.pfn_mad_recv_cb = WmReceiveHandler;
        svc.support_unsol = WmConvertMethods(&svc, pAttributes);


_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to