return -csum;
}
-void ipmb_send(struct ipmb_resp *resp)
+void ipmb_send(struct ipmb_resp *resp, unsigned char *data, uint8_t datalen)
{
unsigned char buf[24];
int len;
buf[3] = resp->rsSA;
buf[4] = ((resp->rqSEQ)<<2) | (resp->rsLUN & 0x3);
buf[5] = resp->cmd;
- memcpy(buf+6, resp->data, resp->datalen);
- len = resp->datalen + 7;
+ memcpy(buf+6, data, datalen);
+ len = datalen + 7;
buf[len-1] = ipmb_csum(buf+3, len - 4);
#ifdef DEBUG
void ipmb_invalid(struct ipmb_resp *resp)
{
-#if 0
- static unsigned char cmd_invalid[] = {0xc2};
+#if 1
+ static unsigned char cmd_invalid[] = {IPMB_CC_INVALID};
- resp->data = cmd_invalid;
- resp->datalen = sizeof(cmd_invalid);
- ipmb_send(resp);
+ ipmb_send(resp, cmd_invalid, sizeof(cmd_invalid));
#endif
}
{IPMB_CC_NORMALLY, 0x42, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfe, 0xfe};
static unsigned char cc_normal[] =
{IPMB_CC_NORMALLY};
+ static unsigned char sel_info[] =
+ {IPMB_CC_NORMALLY, 0x51, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00};
+ static unsigned char sel_alloc_info[] =
+ {IPMB_CC_NORMALLY, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ static unsigned char sel_entry[] =
+ {IPMB_CC_ERROR};
+ static unsigned char sel_timestamp[] =
+ {IPMB_CC_NORMALLY, 0x00, 0x00, 0x00, 0x00};
+ static unsigned char chassis_status[] =
+ {IPMB_CC_NORMALLY, 0x60, 0x10, 0x00, 0x00};
+ static unsigned char reserve_sdr[] =
+ {IPMB_CC_NORMALLY, 0x00, 0x00};
+ static unsigned char get_sdr[] =
+ {IPMB_CC_NORMALLY, 0xff, 0xff};
resp.rqSA = req->rqSA;
resp.netFn = req->netFn+1;
switch (req->netFn) {
case IPMB_NETFN_CHASSIS:
switch (req->cmd) {
+ case IPMB_CHASSIS_GET_STATUS:
+ ipmb_send(&resp, chassis_status, sizeof(chassis_status));
+ break;
case IPMB_CHASSIS_CONTROL:
chassis_control(*(req->data));
- resp.data = cc_normal;
- resp.datalen = sizeof(cc_normal);
- ipmb_send(&resp);
+ ipmb_send(&resp, cc_normal, sizeof(cc_normal));
break;
default:
#ifdef DEBUG
* data[5] - Event Data: 0x8f
* data[6] - Event Data: 0x03
*/
- resp.data = cc_normal;
- resp.datalen = sizeof(cc_normal);
- ipmb_send(&resp);
+ ipmb_send(&resp, cc_normal, sizeof(cc_normal));
break;
case IPMB_NETFN_APP:
switch (req->cmd) {
case IPMB_APP_GET_DEVICE_ID:
- resp.data = get_devid;
- resp.datalen = sizeof(get_devid);
- ipmb_send(&resp);
+ ipmb_send(&resp, get_devid, sizeof(get_devid));
break;
case IPMB_APP_GET_WATCHDOG_TIMER:
- resp.data = get_wd_timer;
- resp.datalen = sizeof(get_wd_timer);
- ipmb_send(&resp);
+ ipmb_send(&resp, get_wd_timer, sizeof(get_wd_timer));
break;
default:
case IPMB_NETFN_STORAGE:
switch (req->cmd) {
+ case IPMB_STORAGE_RESERVE_SDR:
+ ipmb_send(&resp, reserve_sdr, sizeof(reserve_sdr));
+ break;
+ case IPMB_STORAGE_GET_SDR:
+ ipmb_send(&resp, get_sdr, sizeof(get_sdr));
+ break;
+ case IPMB_STORAGE_GET_SEL_INFO:
+ ipmb_send(&resp, sel_info, sizeof(sel_info));
+ break;
+ case IPMB_STORAGE_GET_SEL_ALLOCATION:
+ ipmb_send(&resp, sel_alloc_info, sizeof(sel_alloc_info));
+ break;
+ case IPMB_STORAGE_GET_SEL_ENTRY:
+ ipmb_send(&resp, sel_entry, sizeof(sel_entry));
+ break;
+ case IPMB_STORAGE_GET_SEL_TIME:
+ ipmb_send(&resp, sel_timestamp, sizeof(sel_timestamp));
+ break;
default:
#ifdef DEBUG
printf("Unknown storage cmd 0x%02x\n", req->cmd);