示例#1
0
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;
}
示例#2
0
文件: smsc951x.cpp 项目: rsta2/circle
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;
}