mfiutil(8)/mrsasutil(8): display/parse enclosure by device ID (EID)

mfi_drive_name() built the "Exx:Syy" drive location string using
struct mfi_pd_info's encl_index field, the enclosure's firmware-
internal position index. Broadcom's own storcli/MegaCli tooling
instead leads with the enclosure's Device ID (EID) in its primary
drive listing; encl_index only shows up as "Position" in a detailed
per-enclosure view. Both numbers are raw, unmodified firmware values
already fetched into struct mfi_pd_info/mfi_pd_address, but only
encl_index was ever displayed or accepted as input, leading to
confusion when cross-referencing drive locations against storcli
output.

Switch mfi_drive_name() and mfi_lookup_drive() to use encl_device_id
instead, aligning FreeBSD's enclosure numbering with Broadcom's own
utilities. Since mrsasutil(8) is the same binary as mfiutil(8) under
a different name, this applies to both mfi(4) and mrsas(4) alike.

This is a user-visible behavior change: the numeric value of "xx" in
"Exx:Syy" now differs from before for any enclosure whose EID and
position index don't match, affecting anyone scripting against the
previous numbering.

PR:		294353
Reviewed by:	imp
Relnotes:	yes
Differential Revision:	https://reviews.freebsd.org/D59654
This commit is contained in:
Michael Osipov committed 2026-09-16 10:40:55 +02:00
1 parent 32878e64e6
commit acdb2cdcd6
2 files changed
+16 -8

No files matched your search

+9
View File
@@ -27,6 +27,15 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 16.x IS SLOW:
world, or to merely disable the most expensive debugging functionality
at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20260916:
mfiutil(8)/mrsasutil(8) now display and parse the Exx:Syy drive
location notation using the controller's enclosure device ID (EID)
instead of its firmware-internal enclosure position index, aligning
with Broadcom's storcli/MegaCli tooling. This changes the numeric
value of "xx" for enclosures where the two differ; scripts relying
on the previous numbering should be updated to use "show drives"
output or storcli's EID column.
20260914:
The size of multiple embedded structs have changed and may lead to
problems (pci_error_handlers in pci_driver, dev_pm_info in struct device).
+7 -8
View File
@@ -108,10 +108,10 @@ mfi_drive_name(struct mfi_pd_info *pinfo, uint16_t device_id, uint32_t def)
pinfo->slot_number);
else if (pinfo->encl_device_id == pinfo->ref.v.device_id)
sbuf_printf(&sb, "E%u",
pinfo->encl_index);
pinfo->encl_device_id);
else
sbuf_printf(&sb, "E%u:S%u",
pinfo->encl_index, pinfo->slot_number);
pinfo->encl_device_id, pinfo->slot_number);
}
sbuf_finish(&sb);
@@ -156,7 +156,8 @@ mfi_lookup_drive(int fd, char *drive, uint16_t *device_id)
int error;
u_int i;
char *cp;
uint8_t encl, slot;
uint16_t encl;
uint8_t slot;
/* Look for a raw device id first. */
val = strtol(drive, &cp, 0);
@@ -175,14 +176,14 @@ mfi_lookup_drive(int fd, char *drive, uint16_t *device_id)
if (toupper(drive[0]) == 'E') {
cp++; /* Eat 'E' */
val = strtol(cp, &cp, 0);
if (val < 0 || val > 0xff || *cp != ':')
if (val < 0 || val >= 0xffff || *cp != ':')
goto bad;
encl = val;
cp++; /* Eat ':' */
if (toupper(*cp) != 'S')
goto bad;
} else
encl = 0xff;
encl = 0xffff;
cp++; /* Eat 'S' */
if (*cp == '\0')
goto bad;
@@ -201,9 +202,7 @@ mfi_lookup_drive(int fd, char *drive, uint16_t *device_id)
if (list->addr[i].scsi_dev_type != 0)
continue;
if (((encl == 0xff &&
list->addr[i].encl_device_id == 0xffff) ||
list->addr[i].encl_index == encl) &&
if (list->addr[i].encl_device_id == encl &&
list->addr[i].slot_number == slot) {
*device_id = list->addr[i].device_id;
free(list);