9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER START
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The contents of this file are subject to the terms of the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common Development and Distribution License (the "License").
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * You may not use this file except in compliance with the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * or http://www.opensolaris.org/os/licensing.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * See the License for the specific language governing permissions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and limitations under the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If applicable, add the following below this CDDL HEADER, with the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER END
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Use is subject to license terms.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <sun_sas.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <libsysevent.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <sys/types.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <netinet/in.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <inttypes.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <ctype.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Remove these 5 when the header containing the event names aver available. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Event definitions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Event Class */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define EC_HBA "EC_hba"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define EC_DR "EC_dr"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Event Sub-Class */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define ESC_SAS_HBA_PORT_BROADCAST "ESC_sas_hba_port_broadcast"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define ESC_SAS_PHY_EVENT "ESC_sas_phy_event"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define ESC_DR_TARGET_STATE_CHANGE "ESC_dr_target_state_change"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Broadcast Event Types */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_CHANGE "port_broadcast_change"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_SES "port_broadcast_ses"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_D24_0 "port_broadcast_d24_0"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_D27_4 "port_broadcast_d27_4"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_D01_4 "port_broadcast_d01_4"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_D04_7 "port_broadcast_d04_7"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_D16_7 "port_broadcast_d16_7"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_BROADCAST_D29_7 "port_broadcast_d29_7"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Phy Event Types */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PHY_ONLINE "port_online"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PHY_OFFLINE "port_offline"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PHY_REMOVE "port_remove"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Event payload */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_DRV_INST "driver_instance"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_PORT_ADDR "port_address"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_DEVFS_PATH "devfs_path"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define SAS_EVENT_TYPE "event_type"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define HBA_PORT_MATCH 1
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define TARGET_PORT_MATCH 2
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define PHY_MATCH 3
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define REMOVED 1
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define ONLINE 2
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define OFFLINE 3
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsysevent_handle_t *gSysEventHandle = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Calls the client callback function, if one is registered */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic HBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimupdateMatchingPhy(HBA_WWN portAddr, uint8_t phyId, int update, uint8_t linkRate)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char ROUTINE[] = "updateMatchingPhy";
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct sun_sas_hba *hba_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct sun_sas_port *hba_port_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct phy_info *phy_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "- phy matching");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* grab write lock */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* loop through HBAs */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (hba_ptr = global_hba_head; hba_ptr != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hba_ptr = hba_ptr->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* loop through HBA ports */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (hba_port_ptr = hba_ptr->first_port;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hba_port_ptr != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hba_port_ptr = hba_port_ptr->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(hba_port_ptr->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_attributes.PortSpecificAttribute.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SASPort->LocalSASAddress.wwn) ==
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(portAddr.wwn)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* loop through phys */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (phy_ptr = hba_port_ptr->first_phy;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr != NULL; phy_ptr =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phy_ptr->phy.PhyIdentifier ==
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phyId) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (update == REMOVED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr->invalid =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (update == OFFLINE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr->phy.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NegotiatedLinkRate
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else { /* online */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr->phy.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NegotiatedLinkRate
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim = linkRate;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } /* for phys */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } /* wwn mismatch. continue */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } /* for HBA ports */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } /* for HBAs */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Event handler called by system */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimsyseventHandler(sysevent_t *ev)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char ROUTINE[] = "syseventHandler";
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim nvlist_t *attrList = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *eventStr, *portAddrStr, *charptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int update;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t addr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint8_t phyId, linkRate;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portAddr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Is the event one of ours? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strncmp(EC_HBA, sysevent_get_class_name(ev), strlen(EC_HBA)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* handle phy events */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strncmp(ESC_SAS_PHY_EVENT, sysevent_get_subclass_name(ev),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim strlen(ESC_SAS_PHY_EVENT)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (sysevent_get_attr_list(ev, &attrList) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Failed to get event attributes on %s/%s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim EC_HBA, ESC_SAS_PHY_EVENT);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (nvlist_lookup_string(attrList,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "event_type", &eventStr) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Event type not found");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strncmp(eventStr, "phy_online",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (eventStr)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim update = ONLINE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (nvlist_lookup_uint8(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrList, "link_rate",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &linkRate) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Link Rate not \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim found");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (strncmp(eventStr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "phy_offline",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (eventStr)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim update = OFFLINE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (strncmp(eventStr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "phy_remove",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (eventStr)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim update = REMOVED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Invalid event type");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (nvlist_lookup_string(attrList,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "port_address", &portAddrStr) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Port SAS address not found");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (charptr = portAddrStr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim charptr != NULL; charptr++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isxdigit(*charptr)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim addr = htonll(strtoll(charptr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NULL, 16));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy(portAddr.wwn, &addr, 8);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (nvlist_lookup_uint8(attrList,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "PhyIdentifier", &phyId) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Port SAS address not found");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (updateMatchingPhy(portAddr, phyId, update,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim linkRate) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "updating phy for the events failed.");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (strncmp(EC_DR, sysevent_get_class_name(ev), 2) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* handle DR events */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "handle EC_dr events.");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Found Unregistered event. - exit");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "- exit");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Registers events to the sysevent framework */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimregisterSysevent() {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char ROUTINE[] = "registerSysevent";
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char *hba_subclass_list[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ESC_SAS_PHY_EVENT
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim };
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char *dr_subclass_list[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ESC_DR_TARGET_STATE_CHANGE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim };
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gSysEventHandle = sysevent_bind_handle(syseventHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (gSysEventHandle == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "- sysevent_bind_handle() failed");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "- error exit");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (sysevent_subscribe_event(gSysEventHandle, EC_HBA,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hba_subclass_list, 1) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "- sysevent_subscribe_event() failed for EC_HBA subclass");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "- error exit");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sysevent_unbind_handle(gSysEventHandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (sysevent_subscribe_event(gSysEventHandle, EC_DR,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dr_subclass_list, 1) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "- sysevent_subscribe_event() failed for DR subclass");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "- error exit");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sysevent_unbind_handle(gSysEventHandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "- exit");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}