aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow/*
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * This file and its contents are supplied under the terms of the
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * Common Development and Distribution License ("CDDL"), version 1.0.
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * You may only use this file in accordance with the terms of version
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * 1.0 of the CDDL.
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow *
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * A full copy of the text of the CDDL should have accompanied this
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * source. A copy of the CDDL is also available via the Internet at
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * http://www.illumos.org/license/CDDL.
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow */
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow/*
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * Copyright (c) 2013, Joyent, Inc. All rights reserved.
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow */
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <stdlib.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <sys/types.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <sys/stat.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <fcntl.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <unistd.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <stropts.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <string.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <strings.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <fm/topo_mod.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <fm/topo_list.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_type.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <sys/scsi/adapters/mpt_sas/mpi/mpi2.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_init.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include <sys/scsi/adapters/mpt_sas/mptsas_ioctl.h>
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include "disk.h"
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow#include "disk_drivers.h"
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulowstatic int
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulowget_sas_address(topo_mod_t *mod, char *devctl, uint32_t enclosure,
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow uint32_t slot, char **sas_address)
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow{
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow int fd, err, i;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow mptsas_get_disk_info_t gdi;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow mptsas_disk_info_t *di;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow size_t disz;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow bzero(&gdi, sizeof (gdi));
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if ((fd = open(devctl, O_RDWR)) == -1) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_dprintf(mod, "could not open '%s' for ioctl: %s\n",
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow devctl, strerror(errno));
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (-1);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_dprintf(mod, "ioctl 1 on '%s' failed: %s\n", devctl,
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow strerror(errno));
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow (void) close(fd);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (-1);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow gdi.DiskInfoArraySize = disz = sizeof (mptsas_disk_info_t) *
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow gdi.DiskCount;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow gdi.PtrDiskInfoArray = di = topo_mod_alloc(mod, disz);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if (di == NULL) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_dprintf(mod, "memory allocation failed\n");
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow (void) close(fd);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (-1);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_dprintf(mod, "ioctl 2 on '%s' failed: %s\n", devctl,
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow strerror(errno));
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_free(mod, di, disz);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow (void) close(fd);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (-1);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow err = -1;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow for (i = 0; i < gdi.DiskCount; i++) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if (di[i].Enclosure == enclosure && di[i].Slot == slot) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow char sas[17]; /* 16 hex digits and NUL */
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow (void) snprintf(sas, 17, "%llx", di[i].SasAddress);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_dprintf(mod, "found mpt_sas disk (%d/%d) "
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow "with adddress %s\n", enclosure, slot, sas);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow *sas_address = topo_mod_strdup(mod, sas);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow err = 0;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow break;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_free(mod, di, disz);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow (void) close(fd);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (err);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow}
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulowint
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulowdisk_mptsas_find_disk(topo_mod_t *mod, tnode_t *baynode, char **sas_address)
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow{
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow char *devctl = NULL;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow uint32_t enclosure, slot;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow int err;
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow /*
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * Get the required properties from the node. These come from
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow * the static XML mapping.
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow */
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if (topo_prop_get_string(baynode, TOPO_PGROUP_BINDING,
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow TOPO_BINDING_DEVCTL, &devctl, &err) != 0 ||
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_prop_get_uint32(baynode, TOPO_PGROUP_BINDING,
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow TOPO_BINDING_ENCLOSURE, &enclosure, &err) != 0 ||
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_prop_get_uint32(baynode, TOPO_PGROUP_BINDING,
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow TOPO_BINDING_SLOT, &slot, &err) != 0) {
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow if (devctl != NULL)
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_strfree(mod, devctl);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow topo_mod_dprintf(mod, "bay node was missing mpt_sas binding "
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow "properties\n");
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (-1);
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow }
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow return (get_sas_address(mod, devctl, enclosure, slot, sas_address));
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow
aed5247ff899ec457005d93dfbdb4ffd74574695Joshua M. Clulow}