imsm: prepare detail_platform_imsm to support different types of controllers

Pull out the AHCI specific parts of detail_platform_imsm to separate functions.
Introduce support new types of controllers.

Based on code From: Artur Wojcik <artur.wojcik@intel.com>
Signed-off-by: Marcin Labun <marcin.labun@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Labun Marcin 2011-01-25 17:44:11 +11:00 committed by NeilBrown
parent 88654014d4
commit 120dc88745
1 changed files with 62 additions and 34 deletions

View File

@ -1133,10 +1133,10 @@ static void brief_detail_super_imsm(struct supertype *st)
static int imsm_read_serial(int fd, char *devname, __u8 *serial);
static void fd2devname(int fd, char *name);
static int imsm_enumerate_ports(const char *hba_path, int port_count, int host_base, int verbose)
static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_base, int verbose)
{
/* dump an unsorted list of devices attached to ahci, as well as
* non-connected ports
/* dump an unsorted list of devices attached to AHCI Intel storage
* controller, as well as non-connected ports
*/
int hba_len = strlen(hba_path) + 1;
struct dirent *ent;
@ -1296,6 +1296,49 @@ static int imsm_enumerate_ports(const char *hba_path, int port_count, int host_b
return err;
}
static void print_found_intel_controllers(struct sys_dev *elem)
{
for (; elem; elem = elem->next) {
fprintf(stderr, Name ": found Intel(R) ");
if (elem->type == SYS_DEV_SATA)
fprintf(stderr, "SATA ");
fprintf(stderr, "RAID controller");
if (elem->pci_id)
fprintf(stderr, " at %s", elem->pci_id);
fprintf(stderr, ".\n");
}
fflush(stderr);
}
static int ahci_get_port_count(const char *hba_path, int *port_count)
{
struct dirent *ent;
DIR *dir;
int host_base = -1;
*port_count = 0;
if ((dir = opendir(hba_path)) == NULL)
return -1;
for (ent = readdir(dir); ent; ent = readdir(dir)) {
int host;
if (sscanf(ent->d_name, "host%d", &host) != 1)
continue;
if (*port_count == 0)
host_base = host;
else if (host < host_base)
host_base = host;
if (host + 1 > *port_count + host_base)
*port_count = host + 1 - host_base;
}
closedir(dir);
return host_base;
}
static int detail_platform_imsm(int verbose, int enumerate_only)
{
/* There are two components to imsm platform support, the ahci SATA
@ -1311,11 +1354,9 @@ static int detail_platform_imsm(int verbose, int enumerate_only)
*/
const struct imsm_orom *orom;
struct sys_dev *list, *hba;
DIR *dir;
struct dirent *ent;
const char *hba_path;
int host_base = 0;
int port_count = 0;
int result=0;
if (enumerate_only) {
if (check_env("IMSM_NO_PLATFORM") || find_imsm_orom())
@ -1335,10 +1376,8 @@ static int detail_platform_imsm(int verbose, int enumerate_only)
return 2;
} else if (verbose)
fprintf(stderr, Name ": found Intel SATA AHCI Controller\n");
hba_path = hba->path;
hba->path = NULL;
free_sys_dev(&list);
print_found_intel_controllers(list);
orom = find_imsm_orom();
if (!orom) {
if (verbose)
@ -1374,35 +1413,24 @@ static int detail_platform_imsm(int verbose, int enumerate_only)
imsm_orom_has_chunk(orom, 1024*64) ? " 64M" : "");
printf(" Max Disks : %d\n", orom->tds);
printf(" Max Volumes : %d\n", orom->vpa);
printf(" I/O Controller : %s\n", hba_path);
/* find the smallest scsi host number to determine a port number base */
dir = opendir(hba_path);
for (ent = dir ? readdir(dir) : NULL; ent; ent = readdir(dir)) {
int host;
if (sscanf(ent->d_name, "host%d", &host) != 1)
continue;
if (port_count == 0)
host_base = host;
else if (host < host_base)
host_base = host;
if (host + 1 > port_count + host_base)
port_count = host + 1 - host_base;
for (hba = list; hba; hba = hba->next) {
printf(" I/O Controller : %s (%s)\n",
hba->path, get_sys_dev_type(hba->type));
if (hba->type == SYS_DEV_SATA) {
host_base = ahci_get_port_count(hba->path, &port_count);
if (ahci_enumerate_ports(hba->path, port_count, host_base, verbose)) {
if (verbose)
fprintf(stderr, Name ": failed to enumerate "
"ports on SATA controller at %s.", hba->pci_id);
result |= 2;
}
}
}
if (dir)
closedir(dir);
if (!port_count || imsm_enumerate_ports(hba_path, port_count,
host_base, verbose) != 0) {
if (verbose)
fprintf(stderr, Name ": failed to enumerate ports\n");
return 2;
}
return 0;
free_sys_dev(&list);
return result;
}
#endif