825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * CDDL HEADER START
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * The contents of this file are subject to the terms of the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Common Development and Distribution License (the "License").
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * You may not use this file except in compliance with the License.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * You can obtain a copy of the license at
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * See the License for the specific language governing permissions
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * and limitations under the License.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * CDDL HEADER END
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#define DEF_EVENT_STRUCT /* Needed for emlxs_events.h in emlxs_event.h */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#include <emlxs.h>
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar SwaminathanEMLXS_MSG_DEF(EMLXS_EVENT_C);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_event_check(emlxs_port_t *port, emlxs_event_t *evt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_event_destroy(emlxs_hba_t *hba, emlxs_event_entry_t *entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_null_func() {}
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_event_check(emlxs_port_t *port, emlxs_event_t *evt)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((hba->event_mask & evt->mask)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SAN_DIAG_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((port->sd_event_mask & evt->mask)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SAN_DIAG_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_event_check() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_event_queue_create(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_iblock_cookie_t iblock;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clear the queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(eventq, sizeof (emlxs_event_queue_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cv_init(&eventq->lock_cv, NULL, CV_DRIVER, NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(hba->intr_flags & EMLXS_MSI_ENABLED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the current interrupt block cookie */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) ddi_get_iblock_cookie(hba->dip, (uint_t)EMLXS_INUMBER,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &iblock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create the mutex lock */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&eventq->lock, NULL, MUTEX_DRIVER, (void *)iblock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef MSI_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan else {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Create event mutex lock */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&eventq->lock, NULL, MUTEX_DRIVER,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore DDI_INTR_PRI(hba->intr_arg));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_event_queue_create() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_event_queue_destroy(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *vport;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t wakeup = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clear all event masks and broadcast a wakeup */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* to clear any sleeping threads */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->event_mask) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->event_mask = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->event_timer = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wakeup = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport = &VPORT(i);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vport->sd_event_mask) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->sd_event_mask = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wakeup = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (wakeup) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cv_broadcast(&eventq->lock_cv);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BUSYWAIT_MS(10);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Destroy the remaining events */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (eventq->first) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_destroy(hba, eventq->first);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Destroy the queue lock */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_destroy(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cv_destroy(&eventq->lock_cv);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clear the queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(eventq, sizeof (emlxs_event_queue_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_event_queue_destroy() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Event queue lock must be held */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_event_destroy(emlxs_hba_t *hba, emlxs_event_entry_t *entry)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t missed = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port = (emlxs_port_t *)entry->port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (eventq->count == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->first = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->last = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->prev) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->prev->next = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->next) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->next->prev = entry->prev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (eventq->first == entry) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->first = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (eventq->last == entry) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->last = entry->prev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((entry->evt->mask == EVT_LINK) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (entry->evt->mask == EVT_RSCN)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(entry->flag & EMLXS_DFC_EVENT_DONE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.missed++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan missed = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_dequeued_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s[%d]: flag=%x missed=%d cnt=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->evt->label, entry->id, entry->flag, missed, eventq->count);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Call notification handler */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (entry->evt->destroy != emlxs_null_func) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld entry->evt->destroy(entry);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free context buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->bp && entry->size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan kmem_free(entry->bp, entry->size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free entry buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan kmem_free(entry, sizeof (emlxs_event_entry_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_event_destroy() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_event(emlxs_port_t *port, emlxs_event_t *evt, void *bp, uint32_t size)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_entry_t *entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t mask;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, evt) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create event entry */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(entry = (emlxs_event_entry_t *)kmem_alloc(
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (emlxs_event_entry_t), KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate event entry.", evt->label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(entry, sizeof (emlxs_event_entry_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->evt = evt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->port = (void *)port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->bp = bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->size = size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the event timer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->timestamp = hba->timer_tics;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (evt->timeout) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->timer = entry->timestamp + evt->timeout;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Eventq id starts with 1 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (eventq->next_id == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld eventq->next_id = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the event id */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->id = eventq->next_id++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set last event table */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mask = evt->mask;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < 32; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mask & 0x01) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->last_id[i] = entry->id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mask >>= 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Put event on bottom of queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (eventq->count == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->first = entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->last = entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->prev = eventq->last;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->prev->next = entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->last = entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventq->count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((entry->evt->mask == EVT_LINK) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (entry->evt->mask == EVT_RSCN)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.new++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_queued_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s[%d]: bp=%p size=%d cnt=%d", entry->evt->label,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->id, bp, size, eventq->count);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Broadcast the event */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cv_broadcast(&eventq->lock_cv);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanfailed:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (bp && size) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld kmem_free(bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_timer_check_events(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_entry_t *entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_entry_t *next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!cfg[CFG_TIMEOUT_ENABLE].current) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((hba->event_timer > hba->timer_tics)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (eventq->count) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = eventq->first;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (entry) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((!entry->timer) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (entry->timer > hba->timer_tics)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan continue;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Event timed out, destroy it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_destroy(hba, entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set next event timer check */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->event_timer = hba->timer_tics + EMLXS_EVENT_PERIOD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_timer_check_events() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_rscn_event(emlxs_port_t *port, uint8_t *payload, uint32_t size)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *ptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_rscn_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (size > MAX_RSCN_PAYLOAD) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = MAX_RSCN_PAYLOAD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size += sizeof (uint32_t);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save a copy of the payload for the event log */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_rscn_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Buffer Format:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0] = DID of the RSCN
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[1] = RSCN Payload
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr = (uint32_t *)bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *ptr++ = port->did;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(payload, (char *)ptr, (size - sizeof (uint32_t)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_rscn_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_rscn_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_vportrscn_event(emlxs_port_t *port, uint8_t *payload, uint32_t size)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *ptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_vportrscn_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (size > MAX_RSCN_PAYLOAD) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = MAX_RSCN_PAYLOAD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size += sizeof (NAME_TYPE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save a copy of the payload for the event log */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_vportrscn_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Buffer Format:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0 - 4] = WWPN of the RSCN
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[5] = RSCN Payload
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr = bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(&port->wwpn, ptr, sizeof (NAME_TYPE));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr += sizeof (NAME_TYPE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(payload, ptr, (size - sizeof (NAME_TYPE)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_vportrscn_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_vportrscn_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_flush_ct_event(emlxs_port_t *port, uint32_t rxid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_event_queue_t *eventq = &EVENTQ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_event_entry_t *entry;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t *ptr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t found = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (entry = eventq->first; entry != NULL; entry = entry->next) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((entry->port != port) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (entry->evt != &emlxs_ct_event)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ptr = (uint32_t *)entry->bp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rxid == *ptr) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This will prevent a CT exchange abort */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* in emlxs_ct_event_destroy() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld entry->flag |= EMLXS_DFC_EVENT_DONE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_event_destroy(hba, entry);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld found = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (found);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_flush_ct_event() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_ct_event(emlxs_port_t *port, uint8_t *payload, uint32_t size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rxid)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *ptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_ct_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (size > MAX_CT_PAYLOAD) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = MAX_CT_PAYLOAD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size += sizeof (uint32_t);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save a copy of the payload for the event log */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_ct_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Buffer Format:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0] = RXID tag for outgoing reply to this CT request
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[1] = CT Payload
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr = (uint32_t *)bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *ptr++ = rxid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(payload, (char *)ptr, (size - sizeof (uint32_t)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_ct_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_ct_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_ct_event_destroy(emlxs_event_entry_t *entry)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = (emlxs_port_t *)entry->port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rxid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(entry->flag & EMLXS_DFC_EVENT_DONE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxid = *(uint32_t *)entry->bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Abort exchange */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_thread_spawn(hba, emlxs_abort_ct_exchange,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->port, (void *)(unsigned long)rxid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_ct_event_destroy() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_link_event(emlxs_port_t *port)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_linkinfo_t *linkinfo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *byte;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *linkspeed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *liptype;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *resv1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *resv2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_link_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (dfc_linkinfo_t) + sizeof (uint32_t);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save a copy of the buffer for the event log */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_link_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Buffer Format:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0] = Linkspeed:8
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0] = LIP_type:8
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0] = resv1:8
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[0] = resv2:8
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * word[1] = dfc_linkinfo_t data
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan byte = (uint8_t *)bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkspeed = &byte[0];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan liptype = &byte[1];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan resv1 = &byte[2];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan resv2 = &byte[3];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo = (dfc_linkinfo_t *)&byte[4];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *resv1 = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *resv2 = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->state <= FC_LINK_DOWN) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *linkspeed = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *liptype = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set linkspeed */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->linkspeed == LA_2GHZ_LINK) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *linkspeed = HBA_PORTSPEED_2GBIT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else if (hba->linkspeed == LA_4GHZ_LINK) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *linkspeed = HBA_PORTSPEED_4GBIT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else if (hba->linkspeed == LA_8GHZ_LINK) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *linkspeed = HBA_PORTSPEED_8GBIT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else if (hba->linkspeed == LA_10GHZ_LINK) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *linkspeed = HBA_PORTSPEED_10GBIT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hba->linkspeed == LA_16GHZ_LINK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *linkspeed = HBA_PORTSPEED_16GBIT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *linkspeed = HBA_PORTSPEED_1GBIT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set LIP type */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *liptype = port->lip_type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(linkinfo, sizeof (dfc_linkinfo_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkEventTag = hba->link_event_tag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkUp = HBASTATS.LinkUp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkDown = HBASTATS.LinkDown;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkMulti = HBASTATS.LinkMultiEvent;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->state <= FC_LINK_DOWN) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkState = LNK_DOWN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_DID = port->prev_did;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else if (hba->state < FC_READY) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkState = LNK_DISCOVERY;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_linkState = LNK_READY;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (linkinfo->a_linkState != LNK_DOWN) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->topology == TOPOLOGY_LOOP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_FABRIC_ATTACHED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_topology = LNK_PUBLIC_LOOP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_topology = LNK_LOOP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_alpa = port->did & 0xff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_DID = linkinfo->a_alpa;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_alpaCnt = port->alpa_map[0];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (linkinfo->a_alpaCnt > 127) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_alpaCnt = 127;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((void *)&port->alpa_map[1], linkinfo->a_alpaMap,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_alpaCnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (port->node_count == 1) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_topology = LNK_PT2PT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_topology = LNK_FABRIC;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo->a_DID = port->did;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(&hba->wwpn, linkinfo->a_wwpName, 8);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(&hba->wwnn, linkinfo->a_wwnName, 8);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_link_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_link_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_dump_event(emlxs_port_t *port, uint8_t *buffer, uint32_t size)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_dump_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DUMP_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Schedule a dump thread */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_dump(hba, EMLXS_DRV_DUMP, 0, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* DUMP_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (buffer && size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save a copy of the buffer for the event log */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_dump_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(buffer, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_dump_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_dump_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_temp_event(emlxs_port_t *port, uint32_t type, uint32_t temp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_temp_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DUMP_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Schedule a dump thread */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_dump(hba, EMLXS_TEMP_DUMP, type, temp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* DUMP_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = 2 * sizeof (uint32_t);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint32_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_temp_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp[0] = type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp[1] = temp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_temp_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_temp_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_fcoe_event(emlxs_port_t *port, menlo_init_rsp_t *init_rsp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_fcoe_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if this is a FCOE adapter */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (menlo_init_rsp_t);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_fcoe_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)init_rsp, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_fcoe_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_fcoe_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_async_event(emlxs_port_t *port, IOCB *iocb)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_async_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ASYNC_STATUS_CN response size */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = 64;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (uint8_t *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_async_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)iocb, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_async_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_async_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_get_dfc_eventinfo(emlxs_port_t *port, HBA_EVENTINFO *eventinfo,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *eventcount, uint32_t *missed)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_entry_t *entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t max_events;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_linkinfo_t *linkinfo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *word;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *byte;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t linkspeed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t liptype;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_affected_id_t *aid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t events;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t format;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!eventinfo || !eventcount || !missed) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (DFC_ARG_NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan max_events = *eventcount;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *eventcount = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *missed = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Account for missed events */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->hba_event.new > hba->hba_event.missed) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.new -= hba->hba_event.missed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.new = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *missed = hba->hba_event.missed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.missed = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!hba->hba_event.new) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.last_id = eventq->next_id - 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* A new event has occurred since last acquisition */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan events = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = eventq->first;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (entry && (events < max_events)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Skip old events */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->id <= hba->hba_event.last_id) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan continue;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Process this entry */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (entry->evt->mask) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EVT_LINK:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan byte = (uint8_t *)entry->bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkspeed = byte[0];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan liptype = byte[1];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan linkinfo = (dfc_linkinfo_t *)&byte[4];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (linkinfo->a_linkState == LNK_DOWN) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->EventCode =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBA_EVENT_LINK_DOWN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PortFcId = linkinfo->a_DID;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[1] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[2] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->EventCode =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBA_EVENT_LINK_UP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PortFcId = linkinfo->a_DID;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((linkinfo->a_topology ==
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan LNK_PUBLIC_LOOP) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (linkinfo->a_topology ==
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan LNK_LOOP)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[0] = 2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[0] = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[1] = liptype;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.Link_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan Reserved[2] = linkspeed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan events++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.new--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EVT_RSCN:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan word = (uint32_t *)entry->bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->EventCode = HBA_EVENT_RSCN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.PortFcId =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan word[0] & 0xFFFFFF;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* word[1] is the RSCN payload command */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan aid = (fc_affected_id_t *)&word[2];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan format = aid->aff_format;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (format) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0: /* Port */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NPortPage =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan aid->aff_d_id & 0x00ffffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 1: /* Area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NPortPage =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan aid->aff_d_id & 0x00ffff00;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 2: /* Domain */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NPortPage =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan aid->aff_d_id & 0x00ff0000;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 3: /* Network */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NPortPage = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.Reserved[0] =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo->Event.RSCN_EventInfo.Reserved[1] =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eventinfo++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan events++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.new--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->hba_event.last_id = entry->id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Return number of events acquired */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *eventcount = events;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_get_dfc_eventinfo() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldvoid
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_get_dfc_event(emlxs_port_t *port, emlxs_dfc_event_t *dfc_event,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t sleep)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_entry_t *entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t found;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t mask;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rc;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (dfc_event->dataout && dfc_event->size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = dfc_event->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->size = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Calculate the event index */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mask = dfc_event->event;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < 32; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mask & 0x01) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mask >>= 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (i == 32) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanwait_for_event:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if no new event has occurred */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (dfc_event->last_id == eventq->last_id[i]) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!sleep) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* While event is still active and */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* no new event has been logged */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while ((dfc_event->event & hba->event_mask) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (dfc_event->last_id == eventq->last_id[i])) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = cv_wait_sig(&eventq->lock_cv, &eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if thread was killed by kernel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->pid = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->event = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If the event is no longer registered then */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* return immediately */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(dfc_event->event & hba->event_mask)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! An event has occurred since last_id !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if event data is not being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If so, then just return the last event id */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->last_id = eventq->last_id[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! The requester wants the next event buffer !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan found = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = eventq->first;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (entry) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((entry->id > dfc_event->last_id) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (entry->evt->mask == dfc_event->event)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan found = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!found) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Update last_id to the last known event */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->last_id = eventq->last_id[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Try waiting again if we can */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto wait_for_event;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! Next event found !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy the context buffer to the buffer provided */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->bp && entry->size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->size < size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = entry->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((void *)entry->bp, dfc_event->dataout, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Event has been retrieved by DFCLIB */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->flag |= EMLXS_DFC_EVENT_DONE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->size = size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->last_id = entry->id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_get_dfc_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanuint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_kill_dfc_event(emlxs_port_t *port, emlxs_dfc_event_t *dfc_event)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->pid = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->event = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cv_broadcast(&eventq->lock_cv);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_kill_dfc_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SAN_DIAG_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_basic_els_event(emlxs_port_t *port, uint32_t subcat,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBA_WWN *portname, HBA_WWN *nodename)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_plogi_rcv_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_els_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_plogi_rcv_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_plogi_rcv_v0 *)kmem_alloc(size, KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.", emlxs_sd_els_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_plogir_version = subcat;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)portname, (uint8_t *)&bp->sd_plogir_portname,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)nodename, (uint8_t *)&bp->sd_plogir_nodename,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_els_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_basic_els_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_prlo_event(emlxs_port_t *port, HBA_WWN *remoteport)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_prlo_rcv_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_els_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_prlo_rcv_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_prlo_rcv_v0 *)kmem_alloc(size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s PRLO: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sd_els_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_prlor_version = SD_ELS_SUBCATEGORY_PRLO_RCV;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)remoteport, (uint8_t *)&bp->sd_prlor_remoteport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_els_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_prlo_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_lsrjt_event(emlxs_port_t *port, HBA_WWN *remoteport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t orig_cmd, uint32_t reason, uint32_t reason_expl)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_lsrjt_rcv_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_els_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_lsrjt_rcv_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_lsrjt_rcv_v0 *)kmem_alloc(size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s LSRJT: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sd_els_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_lsrjtr_version = SD_ELS_SUBCATEGORY_LSRJT_RCV;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)remoteport, (uint8_t *)&bp->sd_lsrjtr_remoteport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_lsrjtr_original_cmd = orig_cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_lsrjtr_reasoncode = reason;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_lsrjtr_reasoncodeexpl = reason_expl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_els_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_lsrjt_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_fc_bsy_event(emlxs_port_t *port, HBA_WWN *remoteport)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_pbsy_rcv_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_fabric_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_pbsy_rcv_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_pbsy_rcv_v0 *)kmem_alloc(size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s BSY: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sd_fabric_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (remoteport == NULL)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_pbsyr_evt_version = SD_FABRIC_SUBCATEGORY_FABRIC_BUSY;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan else
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_pbsyr_evt_version = SD_FABRIC_SUBCATEGORY_PORT_BUSY;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)remoteport, (uint8_t *)&bp->sd_pbsyr_rport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_fabric_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_fc_bsy_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_fc_rdchk_event(emlxs_port_t *port, HBA_WWN *remoteport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t lun, uint32_t opcode, uint32_t fcp_param)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_fcprdchkerr_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_fabric_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_fcprdchkerr_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_fcprdchkerr_v0 *)kmem_alloc(size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s RDCHK: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sd_fabric_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_fcprdchkerr_version = SD_FABRIC_SUBCATEGORY_FCPRDCHKERR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)remoteport, (uint8_t *)&bp->sd_fcprdchkerr_rport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_fcprdchkerr_lun = lun;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_fcprdchkerr_opcode = opcode;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_fcprdchkerr_fcpiparam = fcp_param;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_fabric_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_rdchk_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_scsi_event(emlxs_port_t *port, uint32_t type,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBA_WWN *remoteport, int32_t lun)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_scsi_generic_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_scsi_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_scsi_generic_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_scsi_generic_v0 *)kmem_alloc(size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sd_scsi_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_generic_version = type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)remoteport, (uint8_t *)&bp->sd_scsi_generic_rport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_generic_lun = lun;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_scsi_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_scsi_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_log_sd_scsi_check_event(emlxs_port_t *port, HBA_WWN *remoteport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t lun, uint32_t cmdcode, uint32_t sensekey,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t asc, uint32_t ascq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan struct sd_scsi_checkcond_v0 *bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the event is being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_event_check(port, &emlxs_sd_scsi_event) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = sizeof (struct sd_scsi_checkcond_v0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(bp = (struct sd_scsi_checkcond_v0 *)kmem_alloc(size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan KM_NOSLEEP))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_event_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s CHECK: Unable to allocate buffer.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sd_scsi_event.label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * we are using version field to store subtype, libdfc
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * will fix this up before returning data to app.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_checkcond_version = SD_SCSI_SUBCATEGORY_CHECKCONDITION;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)remoteport, (uint8_t *)&bp->sd_scsi_checkcond_rport,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (HBA_WWN));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_checkcond_lun = lun;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_checkcond_cmdcode = cmdcode;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_checkcond_sensekey = sensekey;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_checkcond_asc = asc;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bp->sd_scsi_checkcond_ascq = ascq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event(port, &emlxs_sd_scsi_event, bp, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_log_sd_scsi_check_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldvoid
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_get_sd_event(emlxs_port_t *port, emlxs_dfc_event_t *dfc_event,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t sleep)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_queue_t *eventq = &EVENTQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_event_entry_t *entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t found;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t mask;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rc;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (dfc_event->dataout && dfc_event->size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = dfc_event->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->size = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Calculate the event index */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mask = dfc_event->event;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < 32; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mask & 0x01) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mask >>= 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (i == 32) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanwait_for_event:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if no new event has ocurred */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (dfc_event->last_id == eventq->last_id[i]) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!sleep) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* While event is active and no new event has been logged */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while ((dfc_event->event & port->sd_event_mask) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (dfc_event->last_id == eventq->last_id[i])) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = cv_wait_sig(&eventq->lock_cv, &eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if thread was killed by kernel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->pid = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->event = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If the event is no longer registered then return */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(dfc_event->event & port->sd_event_mask)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! An event has occurred since last_id !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if event data is not being requested */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If so, then just return the last event id */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->last_id = eventq->last_id[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! The requester wants the next event buffer !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan found = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = eventq->first;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (entry) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((entry->id > dfc_event->last_id) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (entry->port == (void *)port) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (entry->evt->mask == dfc_event->event)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan found = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry = entry->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!found) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Update last_id to the last known event */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->last_id = eventq->last_id[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Try waiting again if we can */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto wait_for_event;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! Next event found !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy the context buffer to the buffer provided */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->bp && entry->size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (entry->size < size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = entry->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((void *)entry->bp, dfc_event->dataout, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Event has been retrieved by SANDIAG */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan entry->flag |= EMLXS_SD_EVENT_DONE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->size = size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dfc_event->last_id = entry->id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&eventq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_get_sd_event */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SAN_DIAG_SUPPORT */