Hi
C6472, CCSv4,
We are using the ISR handler in the latest RapidIO library and have evidence that the our second doorbell is being dropped by the library ISR routine or hardware. Here is our understanding on how the dbell hardware and software should work. Can you please confirm?
1) we receive a dbell on port 0 and another on port 1 almost simultaneously with info = 0 and info = 1
note: we'll assume that the dbell on port0 got put in the dbell queue first. There is a que right? (the sprue13j documentation only mentions this once)
2) The dbell ISR fires and for dbell info = 0 we see ICSR0 has bit0 set. We then write this value back to register ICCR
clarification: The sprue13j documentationstates that ICSR bits 15, 8, and 0 correspond to bits dbell info bits 15, 8, and 0 yet the diagram for the dbell packet on p92 says b15 and b8 are reserved. My understanding is that b6-5 select the register and b0-3 set values in the ICCR (i.e. if dbell info = 0x2a, then ICCR1 will have b10 set. A dbell info = 0x60 will have ICCR2 with bit 0 set. True?.
3) The write back to the ICCR pops the dbell info = 0 out of the queue.
clarification: there is only one dbell queue shared by port 0 and port 1?
4) the ISR returns and is fired again for the dbell info = 1
5) we repeat steps 2 and 3 but this time b1 of the ICSR0 is set.
Thanks for your help
Cheers
DIO_getPendingDbell (
RIO_SrioHandle srioHandle,
RIO_DbellStatus* hPendingdBell
)
{
CSL_SrioRegs *srioRegs = (CSL_SrioRegs*)(srioHandle->hCslObj->regs);
Uint32 i;
for (i=0;i<RIO_DBELL_SUBGROUP_SIZE_MAX;i++) {
// Retrieve and store the pending doorbells
hPendingdBell[i] = (Uint16)(srioRegs->DOORBELL_INTR[i].DOORBELL_ICSR);
// Clear the pending doorbells
srioRegs->DOORBELL_INTR[i].DOORBELL_ICCR = hPendingdBell[i];
}
}