Skip to content
Snippets Groups Projects
Commit 57b9576b authored by qzhou's avatar qzhou
Browse files

add link status check before register access

parent a591ff2f
No related branches found
No related tags found
No related merge requests found
......@@ -337,44 +337,47 @@ int main(int argc, char** argv){
// open pcie40 device driver for current process
ecs_open( dev_slot , SLC_BAR );
pcie40reg_t pcie40;
int result = -1;
if(USE_FEE8 && READ_ONLY){
result = pcie40_readfee8( dev_slot , ch , addr );
printf("reg%04x = %08x\n", addr, result);
}else if(USE_FEE8 && WRITE){
result = pcie40_writefee8( dev_slot , ch , addr, data );
if(result == 0)
printf("Write 0x%04x to register 0x%04x\n", data, addr);
else
printf("ERROR: Failed to write 0x%04x to register 0x%04x\n", data, addr);
}else if(USE_FEE32 && READ_ONLY){
result = pcie40_readfee32( dev_slot , ch , addr );
printf("reg%04x = %08x\n", addr, result);
}else if(USE_FEE32 && WRITE){
result = pcie40_writefee32( dev_slot , ch , addr, data );
if(result == 0)
printf("Write 0x%08x to register 0x%04x\n", data, addr);
else
printf("ERROR: Failed to write 0x%08x to register %04x\n", data, addr);
}else if(STREAM){
if(STREAM_ARICH)
result = pcie40_writestream_arich( dev_slot , ch , filename ) ;
else
result = pcie40_writestream_klm( dev_slot , ch , filename ) ;
if(result == 0)
std::cerr<<"Succeed streaming file: " << filename << std::endl;
else
std::cerr<<"ERROR: Failed streaming file: " << filename << std::endl;
}
//This is only frame for register operation in the furture
if(OP_FLAG){
unsigned int op_addr = hsreg( operation );
if(pcie40_b2l_status(dev_slot, ch) && pcie40_b2l_rxready(dev_slot, ch) && pcie40_b2l_txready(dev_slot, ch)){
if(USE_FEE8 && READ_ONLY){
result = pcie40_readfee8( dev_slot , ch , addr );
printf("reg%04x = %08x\n", addr, result);
}else if(USE_FEE8 && WRITE){
result = pcie40_writefee8( dev_slot , ch , addr, data );
if(result == 0)
printf("Write 0x%04x to register 0x%04x\n", data, addr);
else
printf("ERROR: Failed to write 0x%04x to register 0x%04x\n", data, addr);
}else if(USE_FEE32 && READ_ONLY){
result = pcie40_readfee32( dev_slot , ch , addr );
printf("reg%04x = %08x\n", addr, result);
}else if(USE_FEE32 && WRITE){
result = pcie40_writefee32( dev_slot , ch , addr, data );
if(result == 0)
printf("Write 0x%08x to register 0x%04x\n", data, addr);
else
printf("ERROR: Failed to write 0x%08x to register %04x\n", data, addr);
}else if(STREAM){
if(STREAM_ARICH)
result = pcie40_writestream_arich( dev_slot , ch , filename ) ;
else
result = pcie40_writestream_klm( dev_slot , ch , filename ) ;
if(result == 0)
std::cerr<<"Succeed streaming file: " << filename << std::endl;
else
std::cerr<<"ERROR: Failed streaming file: " << filename << std::endl;
}
//This is only frame for register operation in the furture
if(OP_FLAG){
unsigned int op_addr = hsreg( operation );
pcie40_op(dev_slot, ch, op_addr, addr, data);
}
}else{
printf("ERROR: b2link-%02d is down or not ready\n", ch);
}
// close pcie40 device driver for current process
ecs_close( dev_slot , SLC_BAR) ;
......
......@@ -21,7 +21,7 @@
extern "C" int ecs_open(int dev, int bar);
extern "C" void ecs_close(int dev, int bar);
//#define PCIE_DEV 0
#define MAX_NUM_CH 48
#define MAX_SLOT 3
#define SLC_BAR 2
......@@ -151,32 +151,35 @@ readregs(std::bitset<48> link_mask, pcie40reg_t pcie40reg[])
int o_readonly = 1;
int notfound = 1;
// for (i=0; i<48; i++) {
for (i=0; i<48; i++) {
pcie40reg_t *pcie = &pcie40reg[i];
memset(pcie, 0, sizeof(*pcie));
// if (!link_mask[i]) continue;
if (!link_mask[i]) continue;
pcie->xbusy = pcie40_readfee32(dev_slot, ch, PCIE40REG_CCLK);
pcie->conf = pcie40_readfee32(dev_slot, ch, PCIE40REG_CONF);
pcie->pcie40ver = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VER); /* 81 */
pcie->rxdata = pcie40_readfee32(dev_slot, ch, PCIE40REGL_RXDATA); /* 84 */
pcie->eventsz = pcie40_readfee32(dev_slot, ch, PCIE40REGL_EVENTSZ); /* 85 */
pcie->nevent = pcie40_readfee32(dev_slot, ch, PCIE40REGL_NEVENT); /* 86 */
pcie->nkbyte = pcie40_readfee32(dev_slot, ch, PCIE40REGL_NKBYTE); /* 87 */
pcie->nword = pcie40_readfee32(dev_slot, ch, PCIE40REGL_NWORD); /* 88 */
pcie->vetoset = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOSET); /* 89 */
pcie->vetocnt = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOCNT); /* 8a */
pcie->vetobuf[0] = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOBUF0); /* 8b */
pcie->vetobuf[1] = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOBUF1); /* 8c */
pcie->feeser = 0xffff;
pcie->feever = 0xffff;
if ( pcie40_b2l_status(dev_slot, i) ) {
getfee(pcie);
}
// }
if ( !pcie40_b2l_status(dev_slot, i) ) {
printf("b2link-%02d is down\n", i);
continue;
}
pcie->xbusy = pcie40_readfee32(dev_slot, ch, PCIE40REG_CCLK);
pcie->conf = pcie40_readfee32(dev_slot, ch, PCIE40REG_CONF);
pcie->pcie40ver = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VER); /* 81 */
pcie->rxdata = pcie40_readfee32(dev_slot, ch, PCIE40REGL_RXDATA); /* 84 */
pcie->eventsz = pcie40_readfee32(dev_slot, ch, PCIE40REGL_EVENTSZ); /* 85 */
pcie->nevent = pcie40_readfee32(dev_slot, ch, PCIE40REGL_NEVENT); /* 86 */
pcie->nkbyte = pcie40_readfee32(dev_slot, ch, PCIE40REGL_NKBYTE); /* 87 */
pcie->nword = pcie40_readfee32(dev_slot, ch, PCIE40REGL_NWORD); /* 88 */
pcie->vetoset = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOSET); /* 89 */
pcie->vetocnt = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOCNT); /* 8a */
pcie->vetobuf[0] = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOBUF0); /* 8b */
pcie->vetobuf[1] = pcie40_readfee32(dev_slot, ch, PCIE40REGL_VETOBUF1); /* 8c */
pcie->feeser = 0xffff;
pcie->feever = 0xffff;
if ( pcie40_b2l_status(dev_slot, i) ) {
getfee(pcie);
}
}
return notfound;
}
......@@ -196,22 +199,22 @@ statlink(std::bitset<48> link_mask, pcie40reg_t pcie40reg[])
char prompt[128];
if (!link_mask[i]) continue;
quiet = 0;
if (! first) printf("\n");
first =0;
sprintf(prompt, "(%02d) ", i);
if ( !pcie40_b2l_status(dev_slot, i) ) {
printf("b2link is down\n");
} else if (pcie->feeser & 0x8000) {
printf("fee info is not available\n");
} else {
printf("%s serial %d version %d\n",
feename(pcie->feehw, pcie->feefw), pcie->feeser, pcie->feever);
if ( pcie40_b2l_status(dev_slot, i) ) {
if (pcie->feeser & 0x8000) {
printf("fee info is not available\n");
} else {
printf("%s serial %d version %d\n",
feename(pcie->feehw, pcie->feefw), pcie->feeser, pcie->feever);
}
}
printf("%s", prompt);
printf("b2l=%s (rx=%s tx=%s rxsta=%s txsta=%s mask=%s)\n",
pcie40_b2l_status(dev_slot, i)?"UP":"DOWN",
......@@ -223,10 +226,9 @@ statlink(std::bitset<48> link_mask, pcie40reg_t pcie40reg[])
printf("%s", prompt);
printf("%s", prompt);
printf("rxdata=%04x rxlinkdown=%d rxcrcerr=%d feecrcerr=%d\n",
D(pcie->rxdata,15,0), D(pcie->rxdata,31,24), D(pcie->rxdata,23,16),
pcie->feecrce);
D(pcie->rxdata,15,0), D(pcie->rxdata,31,24), D(pcie->rxdata,23,16),
pcie->feecrce);
printf("%s", prompt);
total = (pcie->nkbyte * 256.0 + (pcie->nword & 0xff)) * 4.0;
printf("event=%d total=%1.0fkB", pcie->nevent, total / 1000);
......@@ -234,14 +236,14 @@ statlink(std::bitset<48> link_mask, pcie40reg_t pcie40reg[])
double avg = total / pcie->nevent;
printf(" (avg=%1.0fB", avg);
if (D(pcie->eventsz,31,16) == 0xffff) {
printf(" last=oflow");
printf(" last=oflow");
} else {
printf(" last=%dB", D(pcie->eventsz,31,16)*4);
printf(" last=%dB", D(pcie->eventsz,31,16)*4);
}
if (D(pcie->eventsz,15,0) == 0xffff) {
printf(" max=oflow)");
printf(" max=oflow)");
} else {
printf(" max=%dB)", D(pcie->eventsz,15,0)*4);
printf(" max=%dB)", D(pcie->eventsz,15,0)*4);
}
}
printf("\n");
......@@ -253,19 +255,20 @@ statlink(std::bitset<48> link_mask, pcie40reg_t pcie40reg[])
printf("no b2link error");
} else {
printf("b2link error %d(%c) %d(%c) %c%02x %c%02x %c%02x %c%02x %c%02x %c%02x",
D(pcie->vetocnt,31,16),
B(pcie->vetoset,1) ? 'i' : '-',
D(pcie->vetocnt,15,0),
B(pcie->vetoset,0) ? 'd' : '-',
B(pcie->vetobuf[0],25)?'K':'D', D(pcie->vetobuf[0],15,8),
B(pcie->vetobuf[0],24)?'K':'D', D(pcie->vetobuf[0],7,0),
B(pcie->vetobuf[0],21)?'K':'D', D(pcie->vetobuf[1],31,24),
B(pcie->vetobuf[0],20)?'K':'D', D(pcie->vetobuf[1],23,16),
B(pcie->vetobuf[0],17)?'K':'D', D(pcie->vetobuf[1],15,8),
B(pcie->vetobuf[0],16)?'K':'D', D(pcie->vetobuf[1],7,0));
D(pcie->vetocnt,31,16),
B(pcie->vetoset,1) ? 'i' : '-',
D(pcie->vetocnt,15,0),
B(pcie->vetoset,0) ? 'd' : '-',
B(pcie->vetobuf[0],25)?'K':'D', D(pcie->vetobuf[0],15,8),
B(pcie->vetobuf[0],24)?'K':'D', D(pcie->vetobuf[0],7,0),
B(pcie->vetobuf[0],21)?'K':'D', D(pcie->vetobuf[1],31,24),
B(pcie->vetobuf[0],20)?'K':'D', D(pcie->vetobuf[1],23,16),
B(pcie->vetobuf[0],17)?'K':'D', D(pcie->vetobuf[1],15,8),
B(pcie->vetobuf[0],16)?'K':'D', D(pcie->vetobuf[1],7,0));
}
printf("\n");
}
if (quiet) {
printf("no PCIE40 was found.\n");
......@@ -285,7 +288,8 @@ int main(int argc, char** argv){
ecs_open( dev_slot , SLC_BAR );
printf("statlink version %d (%d) / ", VERSION, MOD_DATE);
statpice40(pcie40);
statpice40(pcie40);
readregs(link_mask, pcie40reg);
statlink(link_mask, pcie40reg);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment