To whom might concern,
I want to try the maintenance rd&wr transaction on our board using the loopback mode.
The problem is that the normal read write loopback transaction works ok, but the maintenance fails as " reg6 =
011b - Transaction complete, non-posted response packet (type 8 and 13) contained ERROR status, or response payload length was in error"
the configuration is as follows:
void srio_maintR(Uint32 src, Uint32 dst, Uint32 len)
{
Uint8 lsu_no;
CSL_SrioDirectIO_ConfigXfr lsu_conf = {0};
/* Create an LSU configuration */
lsu_conf.srcNodeAddr = dst; /* Local address */
lsu_conf.dstNodeAddr.addressHi = 0;
lsu_conf.dstNodeAddr.addressLo = src ; /* Remote address */
lsu_conf.byteCnt = len;
lsu_conf.idSize = 1; /* 16 bit device id */
lsu_conf.priority = 0; /* PKT priority is 2 */
lsu_conf.xambs = 0; /* Not an extended
address */
lsu_conf.dstId = LARGE_DEV_ID;//;
lsu_conf.intrReq = 0; /* No interrupts */
lsu_conf.pktType = SRIO_PKT_TYPE_MAINTR;
/* write with no
response */
lsu_conf.hopCount = 0x1; /* Valid for
maintainance pkt */
lsu_conf.doorbellInfo = 0; /* doorbell pkt */
lsu_conf.outPortId = 0; /* Tx on Port 0 */
lsu_no = SELECTED_LSU;
CSL_srioLsuSetup (hSrio, &lsu_conf, lsu_no);
/* Wait for the completion of transfer */
response.index = lsu_no;
do {
CSL_srioGetHwStatus (hSrio, CSL_SRIO_QUERY_LSU_BSY_STAT, &response);
} while(response.data == 1);
}
void main (void) {
int i, k;
volatile Uint8 *pdata;
srio_init(DSP_MASTER);
memset((void *)0x850000, 0, 0x100);
memset((void *)0x851000, 0, 0x100);
pdata = (Uint8*) 0x850000;
for(i=0;i<0x10;i++)
*pdata++ = i+1;
// srio_write(0x850000,0x851000,0x10);
// srio_read(0x851000,0x852000,0x10);
// srio_maintW(0x850000,0xd01068,0x4);
srio_maintR(0xd0106c,0x851000,0x4);
for (k = 1; k < 1000000; k++) ;
printf("\n\t loopback finished! \n");
}
Can anyone help me to figure out the problem, please?