Tool/software:
Hello Team,
MCAL Package: MCAL_SitaraMPU_10.01.00.03
SDK Package: mcu_plus_sdk_am62x_10_01_00_33
When we are integrating Eth driver as part of Autosar Stack for ethernet Communication, we are facing interrupts disabled scenario for upper layer EthIf_RxIndication
Eth_RxStatusType Eth_receiveProcess(uint8 ctrlIdx, uint8 fifoIdx)
{
Eth_RxStatusType status = ETH_NOT_RECEIVED;
Eth_DescType *descPtr = (Eth_DescType *)NULL_PTR;
Eth_Frame *frame = (Eth_Frame *)NULL_PTR;
uint8 *payload = (uint8 *)NULL_PTR;
uint64 descAddr;
boolean isBroadcast;
uint16 len;
Eth_FrameType etherType;
uint16 userLen;
uint32 pendingPktNum;
uint32 Idx;
SchM_Enter_Eth_ETH_EXCLUSIVE_AREA_0();
pendingPktNum = CpswDma_retrieveReadPendingDescNumber(ctrlIdx, Eth_GetIngressFifoCqIdx(ctrlIdx, fifoIdx));
for(Idx = 0u; Idx < pendingPktNum; ++Idx)
{
if(Idx >= Eth_GetRxDmaThresholdNum(ctrlIdx))
{
break;
}
if(E_OK == CpswDma_retrieveDesc(ctrlIdx, Eth_GetIngressFifoCqIdx(ctrlIdx, fifoIdx), &descAddr))
{
descPtr = (Eth_DescType*)descAddr;
userLen = (uint16)Eth_GetLLDescBufferLen(Eth_GetIngressFifoDescAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx));
#if ((STD_ON == ETH_CTRL_ENABLE_OFFLOAD_CHECKSUM_TCP) || \
(STD_ON == ETH_CTRL_ENABLE_OFFLOAD_CHECKSUM_UDP))
uint8 *ipPktStart = Eth_getIpPktStart((uint8*)Eth_GetIngressFifoBufferDataAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx));
/* Both Ipv4/Ipv6 protocol field has same byte position */
if((IP_PROTO_UDPLITE != htons(((Eth_Ip4Hdr *)ipPktStart)->protocol)) &&
(FALSE == Eth_IsCheckCheckSumValid(Eth_GetIngressFifoDescAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx))))
{
if(Eth_IsPacketMemCacheable(ctrlIdx) == TRUE)
{
CSL_armR5CacheInv(Eth_GetIngressFifoBufferDataAddress(ctrlIdx,
fifoIdx, descPtr->bufferInfo.Idx), (sint32)Eth_GetIngressFifoPacketSize(ctrlIdx, fifoIdx));
}
if(Eth_IsDescMemCacheable(ctrlIdx) == TRUE)
{
CSL_armR5CacheInv((uint8*)descPtr, (sint32)sizeof(Eth_DescType));
}
CpswDma_submitDesc(ctrlIdx, Eth_GetIngressFifoFqIdx(ctrlIdx, fifoIdx), descAddr);
}
else
#endif
{
frame = (Eth_Frame *)Eth_GetIngressFifoBufferDataAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx);
etherType = ntohs(frame->hdr.etherType);
len = userLen - (uint16)sizeof(Eth_FrameHeader);
payload = frame->payload;
isBroadcast = Eth_isBcastMacAddr(frame->hdr.dstMac);
#if (STD_ON == ETH_ZERO_COPY_API)
Eth_GetIngressFifoDescUserInfoAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx)->BufPtr =
(Eth_DataType*)payload;
Eth_GetIngressFifoDescUserInfoAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx)->Length =
userLen;
Eth_Queue_add(Eth_GetIngressFifoQueueAddress(ctrlIdx, fifoIdx),
Eth_GetIngressFifoDescUserInfoAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.Idx));
#endif
Eth_CurrentRxBufferIdx[ctrlIdx] = Eth_getBufferIdxFromFifo(fifoIdx, (uint16)descPtr->bufferInfo.Idx);
EthIf_RxIndication(ctrlIdx, etherType, isBroadcast, frame->hdr.srcMac,
(Eth_DataType *)payload, len);
Eth_CurrentRxBufferIdx[ctrlIdx] = ETH_INVALID_BUFFER_ID;
#if (STD_OFF == ETH_ZERO_COPY_API)
if(Eth_IsPacketMemCacheable(ctrlIdx) == TRUE)
{
CSL_armR5CacheInv(Eth_GetIngressFifoBufferDataAddress(ctrlIdx,
fifoIdx, descPtr->bufferInfo.Idx), (sint32)Eth_GetIngressFifoPacketSize(ctrlIdx, fifoIdx));
}
if(Eth_IsDescMemCacheable(ctrlIdx) == TRUE)
{
CSL_armR5CacheInv((uint8*)descPtr, (sint32)sizeof(Eth_DescType));
}
CpswDma_submitDesc(ctrlIdx, Eth_GetIngressFifoFqIdx(ctrlIdx, fifoIdx), descAddr);
#endif
status = ETH_RECEIVED;
}
}
}
if(CpswDma_retrieveReadPendingDescNumber(ctrlIdx, Eth_GetIngressFifoCqIdx(ctrlIdx, fifoIdx)) > 0u)
{
status = ETH_RECEIVED_MORE_DATA_AVAILABLE;
}
SchM_Exit_Eth_ETH_EXCLUSIVE_AREA_0();
return status;
}
Here the issue is whenever there is an event based message received, the Ethernet deriver will notify upper layer of Autosar stack which in turn notifies application layer. During event based notfication, interrupts should be enabled for the Event tasks to execute and perform the operation.
But in the current iimplementation, Eth_receiveProcess Function disables interrupts and give notification to Upper Layer EthIf through "EthIf_RxIndication", this will cause error during event based tasks executions.
Can you please confirm on this behaviour
Regards,
Pradeep R