boolean SMSC951xDeviceReceiveFrame (TSMSC951xDevice *pThis, void *pBuffer, unsigned *pResultLength) { assert (pThis != 0); assert (pThis->m_pEndpointBulkIn != 0); assert (pBuffer != 0); TUSBRequest URB; USBRequest (&URB, pThis->m_pEndpointBulkIn, pBuffer, FRAME_BUFFER_SIZE, 0); if (!DWHCIDeviceSubmitBlockingRequest (USBDeviceGetHost (&pThis->m_USBDevice), &URB)) { _USBRequest (&URB); return FALSE; } u32 nResultLength = USBRequestGetResultLength (&URB); if (nResultLength < 4) // should not happen with HW_CFG_BIR set { _USBRequest (&URB); return FALSE; } u32 nRxStatus = *(u32 *) pBuffer; if (nRxStatus & RX_STS_ERROR) { LogWrite (FromSMSC951x, LOG_WARNING, "RX error (status 0x%X)", nRxStatus); _USBRequest (&URB); return FALSE; } u32 nFrameLength = RX_STS_FRAMELEN (nRxStatus); assert (nFrameLength == nResultLength-4); assert (nFrameLength > 4); if (nFrameLength <= 4) { _USBRequest (&URB); return FALSE; } nFrameLength -= 4; // ignore CRC //LogWrite (FromSMSC951x, LOG_DEBUG, "Frame received (status 0x%X)", nRxStatus); memcpy (pBuffer, (u8 *) pBuffer + 4, nFrameLength); // overwrite RX status assert (pResultLength != 0); *pResultLength = nFrameLength; _USBRequest (&URB); return TRUE; }
boolean CSMSC951xDevice::ReceiveFrame (void *pBuffer, unsigned *pResultLength) { assert (m_pEndpointBulkIn != 0); assert (pBuffer != 0); CUSBRequest URB (m_pEndpointBulkIn, pBuffer, FRAME_BUFFER_SIZE); if (!GetHost ()->SubmitBlockingRequest (&URB)) { return FALSE; } u32 nResultLength = URB.GetResultLength (); if (nResultLength < 4) // should not happen with HW_CFG_BIR set { return FALSE; } u32 nRxStatus = *(u32 *) pBuffer; if (nRxStatus & RX_STS_ERROR) { CLogger::Get ()->Write (FromSMSC951x, LogWarning, "RX error (status 0x%X)", nRxStatus); return FALSE; } u32 nFrameLength = RX_STS_FRAMELEN (nRxStatus); assert (nFrameLength == nResultLength-4); assert (nFrameLength > 4); if (nFrameLength <= 4) { return FALSE; } nFrameLength -= 4; // ignore CRC //CLogger::Get ()->Write (FromSMSC951x, LogDebug, "Frame received (status 0x%X)", nRxStatus); memcpy (pBuffer, (u8 *) pBuffer + 4, nFrameLength); // overwrite RX status assert (pResultLength != 0); *pResultLength = nFrameLength; return TRUE; }