int ipmi_cmdraw_mv(uchar cmd, uchar netfn, uchar lun, uchar sa, uchar bus, uchar *pdata, int sdata, uchar *presp, int *sresp, uchar *pcc, char fdebugcmd) { uchar buf[MV_BUFFER_SIZE]; int rc, szbuf; int rlen = 0; uchar cc; if (fdebugcmd) { dbgmsg("mv cmd=%02x netfn=%02x lun=%02x sdata=%d sresp=%d\n", cmd,netfn,lun,sdata,*sresp); dump_buf("mv cmd data",pdata,sdata,0); } szbuf = sizeof(buf); if (*sresp < 2) ; /*just completion code*/ else if (*sresp < szbuf) szbuf = *sresp + 1; else if (fdebugcmd) dbgmsg("mv sresp %d >= szbuf %d, truncated\n",*sresp,szbuf); rc = ipmicmd_mv(cmd,netfn,lun,sa, bus, pdata,sdata, buf,szbuf,&rlen); cc = buf[0]; if (fdebugcmd) { dbgmsg("ipmi_cmdraw_mv: status=%d ccode=%x rlen=%d\n", (uint)rc,cc,rlen); if (rc == 0) dump_buf("mv rsp data",buf,rlen,0); } if (rlen > 0) { /* copy data, except first byte */ rlen -= 1; if (rlen > *sresp) rlen = *sresp; memcpy(presp,&buf[1],rlen); } *pcc = cc; *sresp = rlen; return(rc); }
int main(int argc, char *argv[]) { fd_set readfds; struct timeval tv; char data[40]; int i, j; int err; int rlen; err = ipmicmd_mv(0x01, 0x06, 0, NULL, 0, data, sizeof(data), &rlen); printf("ipmicmd_mv ret=%d, cc=%02x\n",err,(uchar)data[0]); printf(" ** Return Code: %2.2X\n", data[0]); printf(" ** Data[%d]: ",rlen); for (i=1; i < rlen; i++) printf("%2.2X ", (uchar)data[i]); printf("\n"); printf("\n"); ipmi_close_mv(); return 0; }
int ipmi_cmd_mv(ushort cmd, uchar *pdata, int sdata, uchar *presp, int *sresp, uchar *pcc, char fdebugcmd) { uchar buf[MV_BUFFER_SIZE]; int rc, i, szbuf; uchar cc; int rlen = 0; int xlen, j; uchar sa, lun, bus, mtype; for (i = 0; i < NCMDS; i++) { if (ipmi_cmds[i].cmdtyp == cmd) break; } if (i >= NCMDS) { fprintf(fperr, "ipmi_cmd_mv: Unknown command %x\n",cmd); return(-1); } if (cmd >= CMDMASK) cmd = cmd & CMDMASK; /* unmask it */ if (fdebugcmd) { dbgmsg( "mv cmd=%02x netfn=%02x lun=%02x sdata=%d sresp=%d\n", cmd,ipmi_cmds[i].netfn,ipmi_cmds[i].lun,sdata, *sresp); dump_buf("mv cmd data",pdata,sdata,0); } szbuf = sizeof(buf); if (*sresp < szbuf && *sresp >= 2) szbuf = *sresp + 1; else if (fdebugcmd) dbgmsg("mv sresp %d >= szbuf %d, truncated\n",*sresp,szbuf); // ipmi_cmds[i].lun, ipmi_cmds[i].sa, ipmi_cmds[i].bus, ipmi_get_mc(&bus, &sa, &lun, &mtype); rc = ipmicmd_mv(cmd,ipmi_cmds[i].netfn, lun, sa, bus, pdata,sdata,buf,szbuf,&rlen); // if (rc == -1) dbgmsg("ipmi_cmd_mv: cannot open /dev/ipmi0\n"); cc = buf[0]; if (fdebugcmd) { dbgmsg("ipmi_cmd_mv: ipmicmd_mv status=%x, ccode=%x\n", (uint)rc, cc); if (rc == ACCESS_OK) { uchar * pc; int sz; sz = rlen; pc = (uchar *)buf; dbgmsg("ipmi_cmd_mv: response (len=%d): ",sz); for (j = 0; j < sz; j++) dbgmsg("%02x ",pc[j]); dbgmsg("\n"); } } xlen = ipmi_cmds[i].rslen + 1; if ((ipmi_cmds[i].cmdtyp == GET_SEL_ENTRY) && (rlen < xlen) && (rc == 0) && (cc != 0) && (i > 0) && (rlen > 1)) /*not temp slot, have data*/ { /* Detect/Handle MV driver SEL bug returning missing bytes */ if (fdebugcmd) { dbgmsg("ipmi_cmd_mv[%d] BUG: returned %d, expected %d\n", i,rlen,xlen); } cc = 0x80; /*flag as busy, retry*/ j = xlen - rlen; j--; /* omit cc */ for (i = 0; i < j; i++) presp[i] = 0xff; if ((rlen+j) > *sresp) rlen = *sresp - j; memcpy(&presp[j],&buf[0],rlen); rlen += j; } if (rlen > 0) { /* copy data, except first byte */ rlen -= 1; if (rlen > *sresp) rlen = *sresp; memcpy(presp,&buf[1],rlen); } *pcc = cc; *sresp = rlen; return(rc); } /*end ipmi_cmd_mv*/