mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 10:37:22 +00:00
lib/ipmi_kontronoem.c - clean up formatting, code
Commit cleans up formatting in 'lib/ipmi_kontronoem.c'. Also, it adds some error messages and fixes return codes.
This commit is contained in:
parent
5c85c7bc61
commit
58837647c2
@ -39,15 +39,13 @@
|
|||||||
*
|
*
|
||||||
* This code implements an Kontron OEM proprietary commands.
|
* This code implements an Kontron OEM proprietary commands.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ipmitool/helper.h>
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/log.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
#include <ipmitool/ipmi_intf.h>
|
#include <ipmitool/ipmi_intf.h>
|
||||||
#include <ipmitool/ipmi_fru.h>
|
#include <ipmitool/ipmi_fru.h>
|
||||||
|
|
||||||
|
|
||||||
extern int verbose;
|
extern int verbose;
|
||||||
extern int read_fru_area(struct ipmi_intf *intf, struct fru_info *fru,
|
extern int read_fru_area(struct ipmi_intf *intf, struct fru_info *fru,
|
||||||
uint8_t id, uint32_t offset, uint32_t length,
|
uint8_t id, uint32_t offset, uint32_t length,
|
||||||
@ -56,158 +54,114 @@ extern int write_fru_area(struct ipmi_intf * intf, struct fru_info *fru,
|
|||||||
uint8_t id, uint16_t soffset,
|
uint8_t id, uint16_t soffset,
|
||||||
uint16_t doffset, uint16_t length,
|
uint16_t doffset, uint16_t length,
|
||||||
uint8_t *pFrubuf);
|
uint8_t *pFrubuf);
|
||||||
|
|
||||||
extern char *get_fru_area_str(uint8_t *data, uint32_t *offset);
|
extern char *get_fru_area_str(uint8_t *data, uint32_t *offset);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ipmi_kontron_help(void);
|
static void ipmi_kontron_help(void);
|
||||||
static int ipmi_kontron_set_serial_number(struct ipmi_intf *intf);
|
static int ipmi_kontron_set_serial_number(struct ipmi_intf *intf);
|
||||||
static int ipmi_kontron_set_mfg_date (struct ipmi_intf *intf);
|
static int ipmi_kontron_set_mfg_date (struct ipmi_intf *intf);
|
||||||
|
|
||||||
static void ipmi_kontron_nextboot_help(void);
|
static void ipmi_kontron_nextboot_help(void);
|
||||||
static int ipmi_kontron_nextboot_set(struct ipmi_intf * intf,
|
static int ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc,
|
||||||
int argc, char **argv);
|
char **argv);
|
||||||
|
|
||||||
static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf,
|
static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf,
|
||||||
unsigned char channel,
|
unsigned char channel, unsigned char size);
|
||||||
unsigned char size);
|
|
||||||
|
static char *bootdev[] = {"BIOS", "FDD", "HDD", "CDROM", "network", 0};
|
||||||
|
|
||||||
int
|
int
|
||||||
ipmi_kontronoem_main(struct ipmi_intf *intf, int argc, char **argv)
|
ipmi_kontronoem_main(struct ipmi_intf *intf, int argc, char **argv)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
if (argc == 0) {
|
||||||
if (argc == 0)
|
lprintf(LOG_ERR, "Not enough parameters given.");
|
||||||
ipmi_kontron_help();
|
ipmi_kontron_help();
|
||||||
else if (strncmp(argv[0], "help", 4) == 0)
|
return (-1);
|
||||||
|
}
|
||||||
|
if (strncmp(argv[0], "help", 4) == 0) {
|
||||||
ipmi_kontron_help();
|
ipmi_kontron_help();
|
||||||
|
rc = 0;
|
||||||
else if (!strncmp(argv[0], "setsn", 5))
|
} else if (!strncmp(argv[0], "setsn", 5)) {
|
||||||
{
|
if (argc < 1) {
|
||||||
if(argc >= 1)
|
|
||||||
{
|
|
||||||
if(ipmi_kontron_set_serial_number(intf) > 0)
|
|
||||||
{
|
|
||||||
printf("FRU serial number setted successfully\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("FRU serial number set failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("fru setsn\n");
|
printf("fru setsn\n");
|
||||||
|
return (-1);
|
||||||
}
|
}
|
||||||
|
if (ipmi_kontron_set_serial_number(intf) > 0) {
|
||||||
|
printf("FRU serial number setted successfully\n");
|
||||||
|
} else {
|
||||||
|
printf("FRU serial number set failed\n");
|
||||||
|
rc = (-1);
|
||||||
}
|
}
|
||||||
else if (!strncmp(argv[0], "setmfgdate", 5))
|
} else if (!strncmp(argv[0], "setmfgdate", 10)) {
|
||||||
{
|
if (argc < 1) {
|
||||||
if(argc >= 1)
|
|
||||||
{
|
|
||||||
if(ipmi_kontron_set_mfg_date(intf) > 0)
|
|
||||||
{
|
|
||||||
printf("FRU manufacturing date setted successfully\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("FRU manufacturing date set failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("fru setmfgdate\n");
|
printf("fru setmfgdate\n");
|
||||||
|
return (-1);
|
||||||
}
|
}
|
||||||
|
if (ipmi_kontron_set_mfg_date(intf) > 0) {
|
||||||
|
printf("FRU manufacturing date setted successfully\n");
|
||||||
|
} else {
|
||||||
|
printf("FRU manufacturing date set failed\n");
|
||||||
|
rc = (-1);
|
||||||
}
|
}
|
||||||
else if (!strncmp(argv[0], "nextboot", sizeof("nextboot")-1))
|
} else if (!strncmp(argv[0], "nextboot", 8)) {
|
||||||
{
|
if (argc < 2) {
|
||||||
if (argc > 1)
|
lprintf(LOG_ERR, "Not enough parameters given.");
|
||||||
{
|
|
||||||
if ((rc = ipmi_kontron_nextboot_set(intf, argc-1, argv+1)) == 0)
|
|
||||||
{
|
|
||||||
printf("Nextboot set successfully\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("Nextboot set failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ipmi_kontron_nextboot_help();
|
ipmi_kontron_nextboot_help();
|
||||||
|
rc = (-1);
|
||||||
}
|
}
|
||||||
|
rc = ipmi_kontron_nextboot_set(intf, (argc - 1), (argv + 1));
|
||||||
|
if (rc == 0) {
|
||||||
|
printf("Nextboot set successfully\n");
|
||||||
|
} else {
|
||||||
|
printf("Nextboot set failed\n");
|
||||||
|
rc = (-1);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
else
|
lprintf(LOG_ERR, "Invalid Kontron command: %s", argv[0]);
|
||||||
{
|
|
||||||
printf("Invalid Kontron command: %s", argv[0]);
|
|
||||||
ipmi_kontron_help();
|
ipmi_kontron_help();
|
||||||
rc = -1;
|
rc = (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
static void ipmi_kontron_help(void)
|
ipmi_kontron_help(void)
|
||||||
{
|
{
|
||||||
printf("Kontron Commands: setsn setmfgdate nextboot\n");
|
printf("Kontron Commands: setsn setmfgdate nextboot\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int ipmi_kontronoem_set_large_buffer(struct ipmi_intf * intf, unsigned char size)
|
ipmi_kontronoem_set_large_buffer(struct ipmi_intf *intf, unsigned char size)
|
||||||
{
|
{
|
||||||
uint8_t error_occurs = 0;
|
uint8_t error_occurs = 0;
|
||||||
uint32_t prev_target_addr = intf->target_addr ;
|
uint32_t prev_target_addr = intf->target_addr ;
|
||||||
|
if (intf->target_addr > 0 && (intf->target_addr != intf->my_addr)) {
|
||||||
if ( intf->target_addr > 0 && (intf->target_addr != intf->my_addr) )
|
|
||||||
{
|
|
||||||
intf->target_addr = intf->my_addr;
|
intf->target_addr = intf->my_addr;
|
||||||
|
|
||||||
printf("Set local big buffer\n");
|
printf("Set local big buffer\n");
|
||||||
if(ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, size ) == 0)
|
if (ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, size) == 0) {
|
||||||
{
|
|
||||||
printf("Set local big buffer:success\n");
|
printf("Set local big buffer:success\n");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
error_occurs = 1;
|
error_occurs = 1;
|
||||||
}
|
}
|
||||||
|
if (error_occurs == 0) {
|
||||||
if (error_occurs == 0)
|
if (ipmi_kontronoem_send_set_large_buffer(intf, 0x00, size) == 0) {
|
||||||
{
|
|
||||||
if(ipmi_kontronoem_send_set_large_buffer( intf, 0x00, size ) == 0)
|
|
||||||
{
|
|
||||||
printf("IPMB was set\n");
|
printf("IPMB was set\n");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Revert back the previous set large buffer */
|
/* Revert back the previous set large buffer */
|
||||||
error_occurs = 1;
|
error_occurs = 1;
|
||||||
ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 );
|
ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore target address */
|
/* Restore target address */
|
||||||
intf->target_addr = prev_target_addr;
|
intf->target_addr = prev_target_addr;
|
||||||
}
|
}
|
||||||
|
if (error_occurs == 0) {
|
||||||
if (error_occurs == 0)
|
if(ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, size) == 0) {
|
||||||
{
|
/* printf("Set remote big buffer\n"); */
|
||||||
if(ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, size ) == 0)
|
} else {
|
||||||
{
|
if (intf->target_addr > 0 && (intf->target_addr != intf->my_addr)) {
|
||||||
//printf("Set remote big buffer\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( intf->target_addr > 0 && (intf->target_addr != intf->my_addr) )
|
|
||||||
{
|
|
||||||
/* Error occurs revert back the previous set large buffer */
|
/* Error occurs revert back the previous set large buffer */
|
||||||
intf->target_addr = intf->my_addr;
|
intf->target_addr = intf->my_addr;
|
||||||
|
/* ipmi_kontronoem_send_set_large_buffer(intf, 0x00, 0); */
|
||||||
//ipmi_kontronoem_send_set_large_buffer( intf, 0x00, 0 );
|
|
||||||
ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, 0);
|
ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, 0);
|
||||||
|
|
||||||
intf->target_addr = prev_target_addr;
|
intf->target_addr = prev_target_addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -215,34 +169,30 @@ int ipmi_kontronoem_set_large_buffer(struct ipmi_intf * intf, unsigned char size
|
|||||||
return error_occurs;
|
return error_occurs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char channel,unsigned char size)
|
ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf,
|
||||||
|
unsigned char channel, unsigned char size)
|
||||||
{
|
{
|
||||||
struct ipmi_rs *rsp;
|
struct ipmi_rs *rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
uint8_t msg_data[2];
|
uint8_t msg_data[2];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(msg_data, 0, sizeof(msg_data));
|
memset(msg_data, 0, sizeof(msg_data));
|
||||||
msg_data[0] = channel/*0x0e*/; // Currently running interface
|
/* channel =~ 0x0e => Currently running interface */
|
||||||
|
msg_data[0] = channel;
|
||||||
msg_data[1] = size;
|
msg_data[1] = size;
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = 0x3E; /* OEM NetFn */
|
req.msg.netfn = 0x3E;
|
||||||
req.msg.cmd = 0x82; /* Set Channel Buffer Length - OEM */
|
/* Set Channel Buffer Length - OEM */
|
||||||
|
req.msg.cmd = 0x82;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 2;
|
req.msg.data_len = 2;
|
||||||
|
|
||||||
req.msg.lun = 0x00;
|
req.msg.lun = 0x00;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL)
|
if (rsp == NULL) {
|
||||||
{
|
|
||||||
printf("Cannot send large buffer command\n");
|
printf("Cannot send large buffer command\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
if (rsp->ccode > 0)
|
|
||||||
{
|
|
||||||
printf("Invalid length for the selected interface (%s) %d\n",
|
printf("Invalid length for the selected interface (%s) %d\n",
|
||||||
val2str(rsp->ccode, completion_code_vals), rsp->ccode);
|
val2str(rsp->ccode, completion_code_vals), rsp->ccode);
|
||||||
return(-1);
|
return(-1);
|
||||||
@ -250,7 +200,6 @@ int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ipmi_fru_set_serial_number - Set the Serial Number in FRU
|
/* ipmi_fru_set_serial_number - Set the Serial Number in FRU
|
||||||
*
|
*
|
||||||
* @intf: ipmi interface
|
* @intf: ipmi interface
|
||||||
@ -262,16 +211,21 @@ int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char
|
|||||||
static int
|
static int
|
||||||
ipmi_kontron_set_serial_number(struct ipmi_intf *intf)
|
ipmi_kontron_set_serial_number(struct ipmi_intf *intf)
|
||||||
{
|
{
|
||||||
|
struct fru_header header;
|
||||||
|
struct fru_info fru;
|
||||||
struct ipmi_rs *rsp;
|
struct ipmi_rs *rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
struct fru_info fru;
|
|
||||||
struct fru_header header;
|
|
||||||
uint8_t msg_data[4];
|
|
||||||
char *sn;
|
char *sn;
|
||||||
uint8_t sn_size, checksum;
|
|
||||||
uint8_t *fru_data;
|
|
||||||
char *fru_area;
|
char *fru_area;
|
||||||
uint32_t fru_data_offset, fru_data_offset_tmp, board_sec_len, prod_sec_len, i;
|
uint8_t checksum;
|
||||||
|
uint8_t *fru_data;
|
||||||
|
uint8_t msg_data[4];
|
||||||
|
uint8_t sn_size;
|
||||||
|
uint32_t board_sec_len;
|
||||||
|
uint32_t fru_data_offset;
|
||||||
|
uint32_t fru_data_offset_tmp;
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t prod_sec_len;
|
||||||
|
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
@ -287,83 +241,57 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
|
|||||||
req.msg.cmd = 0x0C;
|
req.msg.cmd = 0x0C;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
|
|
||||||
/* Set Lun, necessary for this oem command */
|
/* Set Lun, necessary for this oem command */
|
||||||
req.msg.lun = 0x03;
|
req.msg.lun = 0x03;
|
||||||
|
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL)
|
if (rsp == NULL) {
|
||||||
{
|
|
||||||
printf(" Device not present (No Response)\n");
|
printf(" Device not present (No Response)\n");
|
||||||
return -11;
|
return (-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
|
|
||||||
if (rsp->ccode > 0)
|
|
||||||
{
|
|
||||||
printf(" This option is not implemented for this board\n");
|
printf(" This option is not implemented for this board\n");
|
||||||
return -1;
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
sn_size = rsp->data_len;
|
sn_size = rsp->data_len;
|
||||||
|
|
||||||
sn = malloc(sn_size + 1);
|
sn = malloc(sn_size + 1);
|
||||||
|
if (sn == NULL) {
|
||||||
if(sn == NULL)
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
{
|
return (-1);
|
||||||
printf("Out of memory!");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(sn, 0, sn_size + 1);
|
memset(sn, 0, sn_size + 1);
|
||||||
memcpy(sn, rsp->data, sn_size);
|
memcpy(sn, rsp->data, sn_size);
|
||||||
|
if (verbose >= 1) {
|
||||||
if(verbose >= 1)
|
|
||||||
{
|
|
||||||
printf("Original serial number is : [%s]\n", sn);
|
printf("Original serial number is : [%s]\n", sn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
memset(msg_data, 0, 4);
|
memset(msg_data, 0, 4);
|
||||||
msg_data[0] = 0;
|
msg_data[0] = 0;
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
req.msg.cmd = GET_FRU_INFO;
|
req.msg.cmd = GET_FRU_INFO;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (rsp == NULL) {
|
||||||
printf(" Device not present (No Response)\n");
|
printf(" Device not present (No Response)\n");
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return -1;
|
return (-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
if (rsp->ccode > 0) {
|
|
||||||
printf(" Device not present (%s)\n",
|
printf(" Device not present (%s)\n",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&fru, 0, sizeof(fru));
|
memset(&fru, 0, sizeof(fru));
|
||||||
fru.size = (rsp->data[1] << 8) | rsp->data[0];
|
fru.size = (rsp->data[1] << 8) | rsp->data[0];
|
||||||
fru.access = rsp->data[2] & 0x1;
|
fru.access = rsp->data[2] & 0x1;
|
||||||
|
|
||||||
if (fru.size < 1) {
|
if (fru.size < 1) {
|
||||||
printf(" Invalid FRU size %d", fru.size);
|
printf(" Invalid FRU size %d", fru.size);
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return -1;
|
return (-1);
|
||||||
}
|
}
|
||||||
|
/* retrieve the FRU header */
|
||||||
/*
|
|
||||||
* retrieve the FRU header
|
|
||||||
*/
|
|
||||||
msg_data[0] = 0;
|
msg_data[0] = 0;
|
||||||
msg_data[1] = 0;
|
msg_data[1] = 0;
|
||||||
msg_data[2] = 0;
|
msg_data[2] = 0;
|
||||||
@ -374,78 +302,58 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
|
|||||||
req.msg.cmd = GET_FRU_DATA;
|
req.msg.cmd = GET_FRU_DATA;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL)
|
if (rsp == NULL) {
|
||||||
{
|
|
||||||
printf(" Device not present (No Response)\n");
|
printf(" Device not present (No Response)\n");
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
if (rsp->ccode > 0)
|
|
||||||
{
|
|
||||||
printf(" Device not present (%s)\n",
|
printf(" Device not present (%s)\n",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
if (verbose > 1) {
|
||||||
if (verbose > 1)
|
|
||||||
printbuf(rsp->data, rsp->data_len, "FRU DATA");
|
printbuf(rsp->data, rsp->data_len, "FRU DATA");
|
||||||
|
}
|
||||||
memcpy(&header, rsp->data + 1, 8);
|
memcpy(&header, rsp->data + 1, 8);
|
||||||
|
if (header.version != 1) {
|
||||||
if (header.version != 1)
|
|
||||||
{
|
|
||||||
printf(" Unknown FRU header version 0x%02x",
|
printf(" Unknown FRU header version 0x%02x",
|
||||||
header.version);
|
header.version);
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the Board Section */
|
/* Set the Board Section */
|
||||||
board_sec_len = (header.offset.product * 8) - (header.offset.board * 8);
|
board_sec_len = (header.offset.product * 8) - (header.offset.board * 8);
|
||||||
|
|
||||||
|
|
||||||
fru_data = malloc(fru.size);
|
fru_data = malloc(fru.size);
|
||||||
|
if (fru_data == NULL) {
|
||||||
if(fru_data == NULL)
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
{
|
|
||||||
printf("Out of memory!");
|
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(fru_data, 0, fru.size);
|
memset(fru_data, 0, fru.size);
|
||||||
if(read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8) ,board_sec_len , fru_data) < 0)
|
if (read_fru_area(intf, &fru, 0, (header.offset.board * 8),
|
||||||
{
|
board_sec_len, fru_data) < 0) {
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Position at Board Manufacturer */
|
/* Position at Board Manufacturer */
|
||||||
fru_data_offset = (header.offset.board * 8) + 6;
|
fru_data_offset = (header.offset.board * 8) + 6;
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
||||||
|
|
||||||
/* Position at Board Product Name */
|
/* Position at Board Product Name */
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
||||||
|
|
||||||
fru_data_offset_tmp = fru_data_offset;
|
fru_data_offset_tmp = fru_data_offset;
|
||||||
|
|
||||||
/* Position at Serial Number */
|
/* Position at Serial Number */
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp);
|
||||||
|
|
||||||
fru_data_offset++;
|
fru_data_offset++;
|
||||||
|
if (strlen(fru_area) != sn_size) {
|
||||||
if(strlen(fru_area) != sn_size)
|
|
||||||
{
|
|
||||||
printf("The length of the serial number in the FRU Board Area is wrong.\n");
|
printf("The length of the serial number in the FRU Board Area is wrong.\n");
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
@ -453,110 +361,86 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
|
|||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy the new serial number in the board section saved in memory*/
|
/* Copy the new serial number in the board section saved in memory*/
|
||||||
memcpy(fru_data + fru_data_offset, sn, sn_size);
|
memcpy(fru_data + fru_data_offset, sn, sn_size);
|
||||||
|
|
||||||
checksum = 0;
|
checksum = 0;
|
||||||
/* Calculate Header Checksum */
|
/* Calculate Header Checksum */
|
||||||
for( i = (header.offset.board * 8); i < (((header.offset.board * 8)+board_sec_len) - 2) ; i ++ )
|
for(i = (header.offset.board * 8);
|
||||||
{
|
i < (((header.offset.board * 8) + board_sec_len) - 2);
|
||||||
|
i++) {
|
||||||
checksum += fru_data[i];
|
checksum += fru_data[i];
|
||||||
}
|
}
|
||||||
checksum = (~checksum) + 1;
|
checksum = (~checksum) + 1;
|
||||||
|
|
||||||
|
|
||||||
fru_data[(header.offset.board * 8) + board_sec_len - 1] = checksum;
|
fru_data[(header.offset.board * 8) + board_sec_len - 1] = checksum;
|
||||||
|
|
||||||
/* Write the new FRU Board section */
|
/* Write the new FRU Board section */
|
||||||
if(write_fru_area(intf, &fru, 0, (header.offset.board * 8), (header.offset.board * 8), board_sec_len, fru_data) < 0)
|
if (write_fru_area(intf, &fru, 0, (header.offset.board * 8),
|
||||||
{
|
(header.offset.board * 8),
|
||||||
|
board_sec_len, fru_data) < 0) {
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the Product Section */
|
/* Set the Product Section */
|
||||||
prod_sec_len = (header.offset.multi * 8) - (header.offset.product * 8);
|
prod_sec_len = (header.offset.multi * 8) - (header.offset.product * 8);
|
||||||
|
if (read_fru_area(intf, &fru, 0, (header.offset.product * 8),
|
||||||
if(read_fru_area(intf ,&fru ,0 ,(header.offset.product * 8) ,prod_sec_len , fru_data) < 0)
|
prod_sec_len, fru_data) < 0) {
|
||||||
{
|
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Position at Product Manufacturer */
|
/* Position at Product Manufacturer */
|
||||||
fru_data_offset = (header.offset.product * 8) + 3;
|
fru_data_offset = (header.offset.product * 8) + 3;
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
||||||
|
|
||||||
/* Position at Product Name */
|
/* Position at Product Name */
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
||||||
|
|
||||||
/* Position at Product Part */
|
/* Position at Product Part */
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
||||||
|
|
||||||
/* Position at Product Version */
|
/* Position at Product Version */
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fru_data_offset_tmp = fru_data_offset;
|
fru_data_offset_tmp = fru_data_offset;
|
||||||
|
|
||||||
/* Position at Serial Number */
|
/* Position at Serial Number */
|
||||||
fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp);
|
fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp);
|
||||||
|
|
||||||
fru_data_offset ++;
|
fru_data_offset ++;
|
||||||
|
if (strlen(fru_area) != sn_size) {
|
||||||
if(strlen(fru_area) != sn_size)
|
|
||||||
{
|
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
printf("The length of the serial number in the FRU Product Area is wrong.\n");
|
printf("The length of the serial number in the FRU Product Area is wrong.\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy the new serial number in the product section saved in memory*/
|
/* Copy the new serial number in the product section saved in memory*/
|
||||||
memcpy(fru_data + fru_data_offset, sn, sn_size);
|
memcpy(fru_data + fru_data_offset, sn, sn_size);
|
||||||
|
|
||||||
checksum = 0;
|
checksum = 0;
|
||||||
/* Calculate Header Checksum */
|
/* Calculate Header Checksum */
|
||||||
for( i = (header.offset.product * 8); i < (((header.offset.product * 8)+prod_sec_len) - 2) ; i ++ )
|
for (i = (header.offset.product * 8);
|
||||||
{
|
i < (((header.offset.product * 8) + prod_sec_len) - 2);
|
||||||
|
i ++) {
|
||||||
checksum += fru_data[i];
|
checksum += fru_data[i];
|
||||||
}
|
}
|
||||||
checksum = (~checksum) + 1;
|
checksum = (~checksum) + 1;
|
||||||
|
|
||||||
|
|
||||||
fru_data[(header.offset.product * 8)+prod_sec_len - 1] = checksum;
|
fru_data[(header.offset.product * 8)+prod_sec_len - 1] = checksum;
|
||||||
|
|
||||||
/* Write the new FRU Board section */
|
/* Write the new FRU Board section */
|
||||||
if(write_fru_area(intf, &fru, 0, (header.offset.product * 8), (header.offset.product * 8), prod_sec_len, fru_data) < 0)
|
if (write_fru_area(intf, &fru, 0, (header.offset.product * 8),
|
||||||
{
|
(header.offset.product * 8),
|
||||||
|
prod_sec_len, fru_data) < 0) {
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(sn);
|
free(sn);
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
|
|
||||||
return(1);
|
return(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ipmi_fru_set_mfg_date - Set the Manufacturing Date in FRU
|
/* ipmi_fru_set_mfg_date - Set the Manufacturing Date in FRU
|
||||||
*
|
*
|
||||||
* @intf: ipmi interface
|
* @intf: ipmi interface
|
||||||
@ -568,18 +452,16 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
|
|||||||
static int
|
static int
|
||||||
ipmi_kontron_set_mfg_date (struct ipmi_intf *intf)
|
ipmi_kontron_set_mfg_date (struct ipmi_intf *intf)
|
||||||
{
|
{
|
||||||
|
struct fru_header header;
|
||||||
|
struct fru_info fru;
|
||||||
struct ipmi_rs *rsp;
|
struct ipmi_rs *rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
struct fru_info fru;
|
uint8_t *fru_data;
|
||||||
struct fru_header header;
|
uint8_t checksum;
|
||||||
uint8_t msg_data[4];
|
uint8_t msg_data[4];
|
||||||
uint8_t mfg_date[3];
|
uint8_t mfg_date[3];
|
||||||
|
uint32_t board_sec_len;
|
||||||
uint32_t board_sec_len, i;
|
uint32_t i;
|
||||||
uint8_t *fru_data, checksum;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
memset(msg_data, 0, 4);
|
memset(msg_data, 0, 4);
|
||||||
msg_data[0] = 0xb4;
|
msg_data[0] = 0xb4;
|
||||||
@ -592,32 +474,22 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
|
|||||||
req.msg.cmd = 0x0E;
|
req.msg.cmd = 0x0E;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
/* Set Lun temporary, necessary for this oem command */
|
/* Set Lun temporary, necessary for this oem command */
|
||||||
req.msg.lun = 0x03;
|
req.msg.lun = 0x03;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL)
|
if (rsp == NULL) {
|
||||||
{
|
|
||||||
printf("Device not present (No Response)\n");
|
printf("Device not present (No Response)\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
|
|
||||||
if (rsp->ccode > 0)
|
|
||||||
{
|
|
||||||
printf("This option is not implemented for this board\n");
|
printf("This option is not implemented for this board\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
if (rsp->data_len != 3) {
|
||||||
if(rsp->data_len != 3)
|
|
||||||
{
|
|
||||||
printf("Invalid response for the Manufacturing date\n");
|
printf("Invalid response for the Manufacturing date\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(mfg_date, 0, 3);
|
memset(mfg_date, 0, 3);
|
||||||
memcpy(mfg_date, rsp->data, 3);
|
memcpy(mfg_date, rsp->data, 3);
|
||||||
|
|
||||||
memset(msg_data, 0, 4);
|
memset(msg_data, 0, 4);
|
||||||
msg_data[0] = 0;
|
msg_data[0] = 0;
|
||||||
|
|
||||||
@ -626,13 +498,11 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
|
|||||||
req.msg.cmd = GET_FRU_INFO;
|
req.msg.cmd = GET_FRU_INFO;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (rsp == NULL) {
|
||||||
printf(" Device not present (No Response)\n");
|
printf(" Device not present (No Response)\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
if (rsp->ccode > 0) {
|
|
||||||
printf(" Device not present (%s)\n",
|
printf(" Device not present (%s)\n",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return(-1);
|
return(-1);
|
||||||
@ -641,15 +511,11 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
|
|||||||
memset(&fru, 0, sizeof(fru));
|
memset(&fru, 0, sizeof(fru));
|
||||||
fru.size = (rsp->data[1] << 8) | rsp->data[0];
|
fru.size = (rsp->data[1] << 8) | rsp->data[0];
|
||||||
fru.access = rsp->data[2] & 0x1;
|
fru.access = rsp->data[2] & 0x1;
|
||||||
|
|
||||||
if (fru.size < 1) {
|
if (fru.size < 1) {
|
||||||
printf(" Invalid FRU size %d", fru.size);
|
printf(" Invalid FRU size %d", fru.size);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
/* retrieve the FRU header */
|
||||||
/*
|
|
||||||
* retrieve the FRU header
|
|
||||||
*/
|
|
||||||
msg_data[0] = 0;
|
msg_data[0] = 0;
|
||||||
msg_data[1] = 0;
|
msg_data[1] = 0;
|
||||||
msg_data[2] = 0;
|
msg_data[2] = 0;
|
||||||
@ -660,80 +526,61 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
|
|||||||
req.msg.cmd = GET_FRU_DATA;
|
req.msg.cmd = GET_FRU_DATA;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL)
|
if (rsp == NULL) {
|
||||||
{
|
|
||||||
printf(" Device not present (No Response)\n");
|
printf(" Device not present (No Response)\n");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
if (rsp->ccode > 0)
|
|
||||||
{
|
|
||||||
printf(" Device not present (%s)\n",
|
printf(" Device not present (%s)\n",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
if (verbose > 1) {
|
||||||
if (verbose > 1)
|
|
||||||
printbuf(rsp->data, rsp->data_len, "FRU DATA");
|
printbuf(rsp->data, rsp->data_len, "FRU DATA");
|
||||||
|
}
|
||||||
memcpy(&header, rsp->data + 1, 8);
|
memcpy(&header, rsp->data + 1, 8);
|
||||||
|
if (header.version != 1) {
|
||||||
if (header.version != 1)
|
|
||||||
{
|
|
||||||
printf(" Unknown FRU header version 0x%02x",
|
printf(" Unknown FRU header version 0x%02x",
|
||||||
header.version);
|
header.version);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
board_sec_len = (header.offset.product * 8) - (header.offset.board * 8);
|
board_sec_len = (header.offset.product * 8) - (header.offset.board * 8);
|
||||||
|
|
||||||
fru_data = malloc(fru.size);
|
fru_data = malloc(fru.size);
|
||||||
|
if(fru_data == NULL) {
|
||||||
if(fru_data == NULL)
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
{
|
|
||||||
printf("Out of memory!");
|
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(fru_data, 0, fru.size);
|
memset(fru_data, 0, fru.size);
|
||||||
if(read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8) ,board_sec_len , fru_data) < 0)
|
if (read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8),
|
||||||
{
|
board_sec_len ,fru_data) < 0) {
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy the new manufacturing date in the board section saved in memory*/
|
/* Copy the new manufacturing date in the board section saved in memory*/
|
||||||
memcpy(fru_data + (header.offset.board * 8) + 3, mfg_date, 3);
|
memcpy(fru_data + (header.offset.board * 8) + 3, mfg_date, 3);
|
||||||
|
|
||||||
checksum = 0;
|
checksum = 0;
|
||||||
/* Calculate Header Checksum */
|
/* Calculate Header Checksum */
|
||||||
for( i = (header.offset.board * 8); i < (((header.offset.board * 8)+board_sec_len) - 2) ; i ++ )
|
for (i = (header.offset.board * 8);
|
||||||
{
|
i < (((header.offset.board * 8) + board_sec_len) - 2);
|
||||||
|
i ++ ) {
|
||||||
checksum += fru_data[i];
|
checksum += fru_data[i];
|
||||||
}
|
}
|
||||||
checksum = (~checksum) + 1;
|
checksum = (~checksum) + 1;
|
||||||
|
|
||||||
fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum;
|
fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum;
|
||||||
|
|
||||||
/* Write the new FRU Board section */
|
/* Write the new FRU Board section */
|
||||||
if(write_fru_area(intf, &fru, 0, (header.offset.board * 8), (header.offset.board * 8), board_sec_len, fru_data) < 0)
|
if (write_fru_area(intf, &fru, 0, (header.offset.board * 8),
|
||||||
{
|
(header.offset.board * 8),
|
||||||
|
board_sec_len, fru_data) < 0) {
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(fru_data);
|
free(fru_data);
|
||||||
fru_data = NULL;
|
fru_data = NULL;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static char *bootdev[] = {"BIOS", "FDD", "HDD", "CDROM", "network", 0};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ipmi_kontron_nextboot_help(void)
|
ipmi_kontron_nextboot_help(void)
|
||||||
{
|
{
|
||||||
@ -769,40 +616,32 @@ ipmi_kontron_nextboot_set(struct ipmi_intf * intf, int argc, char **argv)
|
|||||||
msg_data[4] = 0x9d;
|
msg_data[4] = 0x9d;
|
||||||
msg_data[5] = 0xFF;
|
msg_data[5] = 0xFF;
|
||||||
msg_data[6] = 0xFF; /* any */
|
msg_data[6] = 0xFF; /* any */
|
||||||
|
|
||||||
for (i = 0; bootdev[i] != 0; i++) {
|
for (i = 0; bootdev[i] != 0; i++) {
|
||||||
if (strcmp(argv[0], bootdev[i]) == 0) {
|
if (strcmp(argv[0], bootdev[i]) == 0) {
|
||||||
msg_data[5] = i;
|
msg_data[5] = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Invalid device selected? */
|
/* Invalid device selected? */
|
||||||
if (msg_data[5] == 0xFF) {
|
if (msg_data[5] == 0xFF) {
|
||||||
printf("Unknown boot device: %s\n", argv[0]);
|
printf("Unknown boot device: %s\n", argv[0]);
|
||||||
return -1;
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = 0x3E;
|
req.msg.netfn = 0x3E;
|
||||||
req.msg.cmd = 0x02;
|
req.msg.cmd = 0x02;
|
||||||
req.msg.data = msg_data;
|
req.msg.data = msg_data;
|
||||||
req.msg.data_len = 7;
|
req.msg.data_len = 7;
|
||||||
|
|
||||||
/* Set Lun temporary, necessary for this oem command */
|
/* Set Lun temporary, necessary for this oem command */
|
||||||
req.msg.lun = 0x03;
|
req.msg.lun = 0x03;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL)
|
if (rsp == NULL) {
|
||||||
{
|
|
||||||
printf("Device not present (No Response)\n");
|
printf("Device not present (No Response)\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
} else if (rsp->ccode > 0) {
|
||||||
if (rsp->ccode > 0) {
|
|
||||||
printf("Device not present (%s)\n",
|
printf("Device not present (%s)\n",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user