Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 71239
b: refs/heads/master
c: d8c9861
h: refs/heads/master
i:
  71237: 0e0057d
  71235: b7eeb4d
  71231: 2c85cb6
v: v3
  • Loading branch information
Corey Minyard authored and Linus Torvalds committed Oct 18, 2007
1 parent bbc8f2e commit fa3e9f3
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ac0191517c3b5f2cf68ab36756d64ef035c4a770
refs/heads/master: d8c98618f4bb8161cc0c14e110b07ba37249332b
15 changes: 2 additions & 13 deletions trunk/drivers/char/ipmi/ipmi_si_intf.c
Original file line number Diff line number Diff line change
Expand Up @@ -2380,20 +2380,9 @@ static int try_get_dev_id(struct smi_info *smi_info)
/* Otherwise, we got some data. */
resp_len = smi_info->handlers->get_result(smi_info->si_sm,
resp, IPMI_MAX_MSG_LENGTH);
if (resp_len < 14) {
/* That's odd, it should be longer. */
rv = -EINVAL;
goto out;
}

if ((resp[1] != IPMI_GET_DEVICE_ID_CMD) || (resp[2] != 0)) {
/* That's odd, it shouldn't be able to fail. */
rv = -EINVAL;
goto out;
}

/* Record info from the get device id, in case we need it. */
ipmi_demangle_device_id(resp+3, resp_len-3, &smi_info->device_id);
/* Check and record info from the get device id, in case we need it. */
rv = ipmi_demangle_device_id(resp, resp_len, &smi_info->device_id);

out:
kfree(resp);
Expand Down
36 changes: 28 additions & 8 deletions trunk/include/linux/ipmi_smi.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,26 +148,46 @@ struct ipmi_device_id {

/* Take a pointer to a raw data buffer and a length and extract device
id information from it. The first byte of data must point to the
byte from the get device id response after the completion code.
The caller is responsible for making sure the length is at least
11 and the command completed without error. */
static inline void ipmi_demangle_device_id(unsigned char *data,
unsigned int data_len,
struct ipmi_device_id *id)
netfn << 2, the data should be of the format:
netfn << 2, cmd, completion code, data
as normally comes from a device interface. */
static inline int ipmi_demangle_device_id(const unsigned char *data,
unsigned int data_len,
struct ipmi_device_id *id)
{
if (data_len < 9)
return -EINVAL;
if (data[0] != IPMI_NETFN_APP_RESPONSE << 2 ||
data[1] != IPMI_GET_DEVICE_ID_CMD)
/* Strange, didn't get the response we expected. */
return -EINVAL;
if (data[2] != 0)
/* That's odd, it shouldn't be able to fail. */
return -EINVAL;

data += 3;
data_len -= 3;
id->device_id = data[0];
id->device_revision = data[1];
id->firmware_revision_1 = data[2];
id->firmware_revision_2 = data[3];
id->ipmi_version = data[4];
id->additional_device_support = data[5];
id->manufacturer_id = data[6] | (data[7] << 8) | (data[8] << 16);
id->product_id = data[9] | (data[10] << 8);
if (data_len >= 6) {
id->manufacturer_id = (data[6] | (data[7] << 8) |
(data[8] << 16));
id->product_id = data[9] | (data[10] << 8);
} else {
id->manufacturer_id = 0;
id->product_id = 0;
}
if (data_len >= 15) {
memcpy(id->aux_firmware_revision, data+11, 4);
id->aux_firmware_revision_set = 1;
} else
id->aux_firmware_revision_set = 0;

return 0;
}

/* Add a low-level interface to the IPMI driver. Note that if the
Expand Down

0 comments on commit fa3e9f3

Please sign in to comment.