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
