1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*
  27  * hermon_event.c
  28  *    Hermon Interrupt and Event Processing Routines
  29  *
  30  *    Implements all the routines necessary for allocating, freeing, and
  31  *    handling all of the various event types that the Hermon hardware can
  32  *    generate.
  33  *    These routines include the main Hermon interrupt service routine
  34  *    (hermon_isr()) as well as all the code necessary to setup and handle
  35  *    events from each of the many event queues used by the Hermon device.
  36  */
  37 
  38 #include <sys/types.h>
  39 #include <sys/conf.h>
  40 #include <sys/ddi.h>
  41 #include <sys/sunddi.h>
  42 #include <sys/modctl.h>
  43 
  44 #include <sys/ib/adapters/hermon/hermon.h>
  45 
  46 static void hermon_eq_poll(hermon_state_t *state, hermon_eqhdl_t eq);
  47 static void hermon_eq_catastrophic(hermon_state_t *state);
  48 static int hermon_eq_alloc(hermon_state_t *state, uint32_t log_eq_size,
  49     uint_t intr, hermon_eqhdl_t *eqhdl);
  50 static int hermon_eq_free(hermon_state_t *state, hermon_eqhdl_t *eqhdl);
  51 static int hermon_eq_handler_init(hermon_state_t *state, hermon_eqhdl_t eq,
  52     uint_t evt_type_mask, int (*eqfunc)(hermon_state_t *state,
  53     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe));
  54 static int hermon_eq_handler_fini(hermon_state_t *state, hermon_eqhdl_t eq);
  55 static int hermon_port_state_change_handler(hermon_state_t *state,
  56     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  57 static int hermon_comm_estbl_handler(hermon_state_t *state,
  58     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  59 static int hermon_local_wq_cat_err_handler(hermon_state_t *state,
  60     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  61 static int hermon_invreq_local_wq_err_handler(hermon_state_t *state,
  62     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  63 static int hermon_local_acc_vio_wq_err_handler(hermon_state_t *state,
  64     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  65 static int hermon_sendq_drained_handler(hermon_state_t *state,
  66     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  67 static int hermon_path_mig_handler(hermon_state_t *state,
  68     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  69 static int hermon_path_mig_err_handler(hermon_state_t *state,
  70     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  71 static int hermon_catastrophic_handler(hermon_state_t *state,
  72     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  73 static int hermon_srq_last_wqe_reached_handler(hermon_state_t *state,
  74     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  75 static int hermon_fexch_error_handler(hermon_state_t *state,
  76     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe);
  77 static int hermon_no_eqhandler(hermon_state_t *state, hermon_eqhdl_t eq,
  78     hermon_hw_eqe_t *eqe);
  79 static int hermon_eq_demux(hermon_state_t *state, hermon_eqhdl_t eq,
  80     hermon_hw_eqe_t *eqe);
  81 
  82 /*
  83  * hermon_eq_init_all
  84  *    Context: Only called from attach() path context
  85  */
  86 int
  87 hermon_eq_init_all(hermon_state_t *state)
  88 {
  89         uint_t          log_eq_size, intr_num;
  90         uint_t          num_eq, num_eq_init, num_eq_unmap, num_eq_rsvd;
  91         uint32_t        event_mask;     /* used for multiple event types */
  92         int             status, i, num_extra;
  93         struct hermon_sw_eq_s **eq;
  94         ddi_acc_handle_t uarhdl = hermon_get_uarhdl(state);
  95 
  96         /* initialize the FMA retry loop */
  97         hermon_pio_init(fm_loop_cnt, fm_status, fm_test);
  98 
  99         /*
 100          * For now, all Event Queues default to the same size (pulled from
 101          * the current configuration profile) and are all assigned to the
 102          * same interrupt or MSI.  In the future we may support assigning
 103          * EQs to specific interrupts or MSIs XXX
 104          */
 105         log_eq_size = state->hs_cfg_profile->cp_log_eq_sz;
 106 
 107         /*
 108          * Total number of supported EQs is fixed.  Hermon hardware
 109          * supports up to 512 EQs, though in theory they will one day be
 110          * alloc'd to virtual HCA's.  We are currently using only 47 of them
 111          * - that is, in Arbel and Tavor, before HERMON, where
 112          * we had set aside the first 32 for use with Completion Queues (CQ)
 113          * and reserved a few of the other 32 for each specific class of event
 114          *
 115          * However, with the coming of vitualization, we'll have only 4 per
 116          * potential guest - so, we'll try alloc'ing them differntly
 117          * (see below for more details).
 118          */
 119         num_eq = HERMON_NUM_EQ_USED;
 120         num_eq_rsvd = state->hs_rsvd_eqs;
 121         eq = &state->hs_eqhdl[num_eq_rsvd];
 122 
 123         /*
 124          * If MSI is to be used, then set intr_num to the MSI number.
 125          * Otherwise, for fixed (i.e. 'legacy') interrupts,
 126          * it is what the card tells us in 'inta_pin'.
 127          */
 128         if (state->hs_intr_type_chosen == DDI_INTR_TYPE_FIXED) {
 129                 intr_num = state->hs_adapter.inta_pin;
 130                 num_extra = 0;
 131         } else {
 132                 /* If we have more than one MSI-X vector, init them. */
 133                 for (i = 0; i + 1 < state->hs_intrmsi_allocd; i++) {
 134                         status = hermon_eq_alloc(state, log_eq_size, i, &eq[i]);
 135                         if (status != DDI_SUCCESS) {
 136                                 while (--i >= 0) {
 137                                         (void) hermon_eq_handler_fini(state,
 138                                             eq[i]);
 139                                         (void) hermon_eq_free(state, &eq[i]);
 140                                 }
 141                                 return (DDI_FAILURE);
 142                         }
 143 
 144                         (void) hermon_eq_handler_init(state, eq[i],
 145                             HERMON_EVT_NO_MASK, hermon_cq_handler);
 146                 }
 147                 intr_num = i;
 148                 num_extra = i;
 149         }
 150 
 151         /*
 152          * Allocate and initialize the rest of the Event Queues to be used.
 153          * If any of these EQ allocations fail then jump to the end, cleanup
 154          * what had been successfully initialized, and return an error.
 155          */
 156         for (i = 0; i < num_eq; i++) {
 157                 status = hermon_eq_alloc(state, log_eq_size, intr_num,
 158                     &eq[num_extra + i]);
 159                 if (status != DDI_SUCCESS) {
 160                         num_eq_init = i;
 161                         goto all_eq_init_fail;
 162                 }
 163         }
 164         num_eq_init = num_eq;
 165         /*
 166          * The "num_eq_unmap" variable is used in any possible failure
 167          * cleanup (below) to indicate which events queues might require
 168          * possible event class unmapping.
 169          */
 170         num_eq_unmap = 0;
 171 
 172         /*
 173          * Setup EQ0 (first avail) for use with Completion Queues.  Note: We can
 174          * cast the return value to void here because, when we use the
 175          * HERMON_EVT_NO_MASK flag, it is not possible for
 176          * hermon_eq_handler_init() to return an error.
 177          */
 178         (void) hermon_eq_handler_init(state, eq[num_eq_unmap + num_extra],
 179             HERMON_EVT_NO_MASK, hermon_cq_handler);
 180 
 181         num_eq_unmap++;
 182 
 183         /*
 184          * Setup EQ1 for handling Completion Queue Error Events.
 185          *
 186          * These events include things like CQ overflow or CQ access
 187          * violation errors.  If this setup fails for any reason (which, in
 188          * general, it really never should), then jump to the end, cleanup
 189          * everything that has been successfully initialized, and return an
 190          * error.
 191          */
 192         status = hermon_eq_handler_init(state, eq[num_eq_unmap + num_extra],
 193             HERMON_EVT_MSK_CQ_ERRORS, hermon_cq_err_handler);
 194         if (status != DDI_SUCCESS) {
 195                 goto all_eq_init_fail;
 196         }
 197         state->hs_cq_erreqnum = num_eq_unmap + num_extra + num_eq_rsvd;
 198         num_eq_unmap++;
 199 
 200         /*
 201          * Setup EQ2 for handling most other things including:
 202          *
 203          * Port State Change Events
 204          *   These events include things like Port Up and Port Down events.
 205          *
 206          * Communication Established Events
 207          *   These events correspond to the IB affiliated asynchronous events
 208          *   that are used for connection management
 209          *
 210          * Path Migration Succeeded Events
 211          *   These evens corresponid to the IB affiliated asynchronous events
 212          *   that are used to indicate successful completion of a
 213          *   Path Migration.
 214          *
 215          * Command Completion Events
 216          *   These events correspond to the Arbel generated events that are used
 217          *   to indicate Arbel firmware command completion.
 218          *
 219          * Local WQ Catastrophic Error Events
 220          * Invalid Req Local WQ Error Events
 221          * Local Access Violation WQ Error Events
 222          * SRQ Catastrophic Error Events
 223          * SRQ Last WQE Reached Events
 224          * ECC error detection events
 225          *   These events also correspond to the similarly-named IB affiliated
 226          *   asynchronous error type.
 227          *
 228          * Send Queue Drained Events
 229          *   These events correspond to the IB affiliated asynchronous events
 230          *   that are used to indicate completion of a Send Queue Drained QP
 231          *   state transition.
 232          *
 233          * Path Migration Failed Events
 234          *   These events correspond to the IB affiliated asynchronous events
 235          *   that are used to indicate that path migration was not successful.
 236          *
 237          * Fibre Channel Error Event
 238          *   This event is affiliated with an Fexch QP.
 239          *
 240          * NOTE: When an event fires on this EQ, it will demux the type and
 241          *      send it to the right specific handler routine
 242          *
 243          */
 244         event_mask =
 245             HERMON_EVT_MSK_PORT_STATE_CHANGE |
 246             HERMON_EVT_MSK_COMM_ESTABLISHED |
 247             HERMON_EVT_MSK_COMMAND_INTF_COMP |
 248             HERMON_EVT_MSK_LOCAL_WQ_CAT_ERROR |
 249             HERMON_EVT_MSK_INV_REQ_LOCAL_WQ_ERROR |
 250             HERMON_EVT_MSK_LOCAL_ACC_VIO_WQ_ERROR |
 251             HERMON_EVT_MSK_SEND_QUEUE_DRAINED |
 252             HERMON_EVT_MSK_PATH_MIGRATED |
 253             HERMON_EVT_MSK_PATH_MIGRATE_FAILED |
 254             HERMON_EVT_MSK_SRQ_CATASTROPHIC_ERROR |
 255             HERMON_EVT_MSK_SRQ_LAST_WQE_REACHED |
 256             HERMON_EVT_MSK_FEXCH_ERROR;
 257 
 258         status = hermon_eq_handler_init(state, eq[num_eq_unmap + num_extra],
 259             event_mask, hermon_eq_demux);
 260         if (status != DDI_SUCCESS) {
 261                 goto all_eq_init_fail;
 262         }
 263         num_eq_unmap++;
 264 
 265         /*
 266          * Setup EQ3 to catch all other types of events.  Specifically, we
 267          * do not catch the "Local EEC Catastrophic Error Event" because we
 268          * should have no EEC (the Arbel driver does not support RD).  We also
 269          * choose not to handle any of the address translation page fault
 270          * event types.  Since we are not doing any page fault handling (and
 271          * since the Arbel firmware does not currently support any such
 272          * handling), we allow these events to go to the catch-all handler.
 273          */
 274         status = hermon_eq_handler_init(state, eq[num_eq_unmap + num_extra],
 275             HERMON_EVT_CATCHALL_MASK, hermon_no_eqhandler);
 276         if (status != DDI_SUCCESS) {
 277                 goto all_eq_init_fail;
 278         }
 279         num_eq_unmap++;
 280 
 281         /* the FMA retry loop starts. */
 282         hermon_pio_start(state, uarhdl, all_eq_init_fail, fm_loop_cnt,
 283             fm_status, fm_test);
 284 
 285         /*
 286          * Run through and initialize the Consumer Index for each EQC.
 287          */
 288         for (i = 0; i < num_eq + num_extra; i++) {
 289                 ddi_put32(uarhdl, eq[i]->eq_doorbell, 0x0);
 290         }
 291 
 292         /* the FMA retry loop ends. */
 293         hermon_pio_end(state, uarhdl, all_eq_init_fail, fm_loop_cnt,
 294             fm_status, fm_test);
 295 
 296         return (DDI_SUCCESS);
 297 
 298 all_eq_init_fail:
 299 
 300         /* Unmap any of the partially mapped EQs from above */
 301         for (i = 0; i < num_eq_unmap + num_extra; i++) {
 302                 (void) hermon_eq_handler_fini(state, eq[i]);
 303         }
 304 
 305         /* Free up any of the partially allocated EQs from above */
 306         for (i = 0; i < num_eq_init + num_extra; i++) {
 307                 (void) hermon_eq_free(state, &eq[i]);
 308         }
 309 
 310         /* If a HW error happen during ddi_pio, return DDI_FAILURE */
 311         if (fm_status == HCA_PIO_PERSISTENT) {
 312                 hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_NON_FATAL);
 313                 status = DDI_FAILURE;
 314         }
 315 
 316         return (status);
 317 }
 318 
 319 
 320 /*
 321  * hermon_eq_fini_all
 322  *    Context: Only called from attach() and/or detach() path contexts
 323  */
 324 int
 325 hermon_eq_fini_all(hermon_state_t *state)
 326 {
 327         uint_t          num_eq, num_eq_rsvd;
 328         int             status, i;
 329         struct hermon_sw_eq_s **eq;
 330 
 331         /*
 332          * Grab the total number of supported EQs again.  This is the same
 333          * hardcoded value that was used above (during the event queue
 334          * initialization.)
 335          */
 336         num_eq = HERMON_NUM_EQ_USED + state->hs_intrmsi_allocd - 1;
 337         num_eq_rsvd = state->hs_rsvd_eqs;
 338         eq = &state->hs_eqhdl[num_eq_rsvd];
 339 
 340         /*
 341          * For each of the event queues that we initialized and mapped
 342          * earlier, attempt to unmap the events from the EQ.
 343          */
 344         for (i = 0; i < num_eq; i++) {
 345                 status = hermon_eq_handler_fini(state, eq[i]);
 346                 if (status != DDI_SUCCESS) {
 347                         return (DDI_FAILURE);
 348                 }
 349         }
 350 
 351         /*
 352          * Teardown and free up all the Event Queues that were allocated
 353          * earlier.
 354          */
 355         for (i = 0; i < num_eq; i++) {
 356                 status = hermon_eq_free(state, &eq[i]);
 357                 if (status != DDI_SUCCESS) {
 358                         return (DDI_FAILURE);
 359                 }
 360         }
 361 
 362         return (DDI_SUCCESS);
 363 }
 364 
 365 
 366 /*
 367  * hermon_eq_reset_uar_baseaddr
 368  *    Context: Only called from attach()
 369  */
 370 void
 371 hermon_eq_reset_uar_baseaddr(hermon_state_t *state)
 372 {
 373         int i, num_eq;
 374         hermon_eqhdl_t eq, *eqh;
 375 
 376         num_eq = HERMON_NUM_EQ_USED + state->hs_intrmsi_allocd - 1;
 377         eqh = &state->hs_eqhdl[state->hs_rsvd_eqs];
 378         for (i = 0; i < num_eq; i++) {
 379                 eq = eqh[i];
 380                 eq->eq_doorbell = (uint32_t *)
 381                     ((uintptr_t)state->hs_reg_uar_baseaddr +
 382                     (uint32_t)ARM_EQ_INDEX(eq->eq_eqnum));
 383         }
 384 }
 385 
 386 
 387 /*
 388  * hermon_eq_arm_all
 389  *    Context: Only called from attach() and/or detach() path contexts
 390  */
 391 int
 392 hermon_eq_arm_all(hermon_state_t *state)
 393 {
 394         uint_t          num_eq, num_eq_rsvd;
 395         uint64_t        offset;
 396         hermon_eqhdl_t  eq;
 397         uint32_t        eq_ci;
 398         int             i;
 399         ddi_acc_handle_t uarhdl = hermon_get_uarhdl(state);
 400 
 401         /* initialize the FMA retry loop */
 402         hermon_pio_init(fm_loop_cnt, fm_status, fm_test);
 403 
 404         num_eq = HERMON_NUM_EQ_USED + state->hs_intrmsi_allocd - 1;
 405         num_eq_rsvd = state->hs_rsvd_eqs;
 406 
 407         /* the FMA retry loop starts. */
 408         hermon_pio_start(state, uarhdl, pio_error, fm_loop_cnt, fm_status,
 409             fm_test);
 410 
 411         for (i = 0; i < num_eq; i++) {
 412                 offset = ARM_EQ_INDEX(i + num_eq_rsvd);
 413                 eq = state->hs_eqhdl[i + num_eq_rsvd];
 414                 eq_ci = (eq->eq_consindx & HERMON_EQ_CI_MASK) | EQ_ARM_BIT;
 415                 ddi_put32(uarhdl,
 416                     (uint32_t *)((uintptr_t)state->hs_reg_uar_baseaddr +
 417                     (uint32_t)offset), eq_ci);
 418         }
 419 
 420         /* the FMA retry loop ends. */
 421         hermon_pio_end(state, uarhdl, pio_error, fm_loop_cnt, fm_status,
 422             fm_test);
 423 
 424         return (DDI_SUCCESS);
 425 
 426 pio_error:
 427         hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_NON_FATAL);
 428         return (DDI_FAILURE);
 429 }
 430 
 431 
 432 /*
 433  * hermon_isr()
 434  *    Context: Only called from interrupt context (and during panic)
 435  */
 436 uint_t
 437 hermon_isr(caddr_t arg1, caddr_t arg2)
 438 {
 439         hermon_state_t  *state;
 440         int             i, r;
 441         int             intr;
 442 
 443         /*
 444          * Grab the Hermon softstate pointer from the input parameter
 445          */
 446         state   = (hermon_state_t *)(void *)arg1;
 447 
 448         /* Get the interrupt number */
 449         intr = (int)(uintptr_t)arg2;
 450 
 451         /*
 452          * Clear the interrupt.  Note: This is only needed for
 453          * fixed interrupts as the framework does what is needed for
 454          * MSI-X interrupts.
 455          */
 456         if (state->hs_intr_type_chosen == DDI_INTR_TYPE_FIXED) {
 457                 ddi_acc_handle_t cmdhdl = hermon_get_cmdhdl(state);
 458 
 459                 /* initialize the FMA retry loop */
 460                 hermon_pio_init(fm_loop_cnt, fm_status, fm_test);
 461 
 462                 /* the FMA retry loop starts. */
 463                 hermon_pio_start(state, cmdhdl, pio_error, fm_loop_cnt,
 464                     fm_status, fm_test);
 465 
 466                 ddi_put64(cmdhdl, state->hs_cmd_regs.clr_intr,
 467                     (uint64_t)1 << state->hs_adapter.inta_pin);
 468 
 469                 /* the FMA retry loop ends. */
 470                 hermon_pio_end(state, cmdhdl, pio_error, fm_loop_cnt, fm_status,
 471                     fm_test);
 472         }
 473 
 474         /*
 475          * Loop through all the EQs looking for ones that have "fired".
 476          * To determine if an EQ is fired, the ownership will be the SW
 477          * (the HW will set the owner appropriately). Update the Consumer Index
 478          * of the Event Queue Entry (EQE) and pass it to HW by writing it
 479          * to the respective Set CI DB Register.
 480          *
 481          * The "else" case handles the extra EQs used only for completion
 482          * events, whereas the "if" case deals with the required interrupt
 483          * vector that is used for all classes of events.
 484          */
 485         r = state->hs_rsvd_eqs;
 486 
 487         if (intr + 1 == state->hs_intrmsi_allocd) {  /* last intr */
 488                 r += state->hs_intrmsi_allocd - 1;
 489                 for (i = 0; i < HERMON_NUM_EQ_USED; i++) {
 490                         hermon_eq_poll(state, state->hs_eqhdl[i + r]);
 491                 }
 492         } else {        /* only poll the one EQ */
 493                 hermon_eq_poll(state, state->hs_eqhdl[intr + r]);
 494         }
 495 
 496         return (DDI_INTR_CLAIMED);
 497 
 498 pio_error:
 499         hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_FATAL);
 500         return (DDI_INTR_UNCLAIMED);
 501 }
 502 
 503 
 504 /*
 505  * hermon_eq_poll
 506  *    Context: Only called from interrupt context (and during panic)
 507  */
 508 static void
 509 hermon_eq_poll(hermon_state_t *state, hermon_eqhdl_t eq)
 510 {
 511         hermon_hw_eqe_t *eqe;
 512         int             polled_some;
 513         uint32_t        cons_indx, wrap_around_mask, shift;
 514         int (*eqfunction)(hermon_state_t *state, hermon_eqhdl_t eq,
 515             hermon_hw_eqe_t *eqe);
 516         ddi_acc_handle_t uarhdl = hermon_get_uarhdl(state);
 517 
 518         /* initialize the FMA retry loop */
 519         hermon_pio_init(fm_loop_cnt, fm_status, fm_test);
 520 
 521         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*eq))
 522 
 523         /* Get the consumer pointer index */
 524         cons_indx = eq->eq_consindx;
 525         shift = eq->eq_log_eqsz - HERMON_EQE_OWNER_SHIFT;
 526 
 527         /*
 528          * Calculate the wrap around mask.  Note: This operation only works
 529          * because all Hermon event queues have power-of-2 sizes
 530          */
 531         wrap_around_mask = (eq->eq_bufsz - 1);
 532 
 533         /* Calculate the pointer to the first EQ entry */
 534         eqe = &eq->eq_buf[(cons_indx & wrap_around_mask)];
 535 
 536 
 537         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*eqe))
 538 
 539         /*
 540          * Pull the handler function for this EQ from the Hermon Event Queue
 541          * handle
 542          */
 543         eqfunction = eq->eq_func;
 544 
 545         for (;;) {
 546                 polled_some = 0;
 547                 while (HERMON_EQE_OWNER_IS_SW(eq, eqe, cons_indx, shift)) {
 548 
 549                         /*
 550                          * Call the EQ handler function.  But only call if we
 551                          * are not in polled I/O mode (i.e. not processing
 552                          * because of a system panic).  Note: We don't call
 553                          * the EQ handling functions from a system panic
 554                          * because we are primarily concerned only with
 555                          * ensuring that the event queues do not overflow (or,
 556                          * more specifically, the event queue associated with
 557                          * the CQ that is being used in the sync/dump process).
 558                          * Also, we don't want to make any upcalls (to the
 559                          * IBTF) because we can't guarantee when/if those
 560                          * calls would ever return.  And, if we're in panic,
 561                          * then we reached here through a PollCQ() call (from
 562                          * hermon_cq_poll()), and we need to ensure that we
 563                          * successfully return any work completions to the
 564                          * caller.
 565                          */
 566                         if (ddi_in_panic() == 0) {
 567                                 eqfunction(state, eq, eqe);
 568                         }
 569 
 570                         /* Reset to hardware ownership is implicit */
 571 
 572                         /* Increment the consumer index */
 573                         cons_indx++;
 574 
 575                         /* Update the pointer to the next EQ entry */
 576                         eqe = &eq->eq_buf[(cons_indx & wrap_around_mask)];
 577 
 578                         polled_some = 1;
 579                 }
 580 
 581                 /*
 582                  * write consumer index via EQ set CI Doorbell, to keep overflow
 583                  * from occuring during poll
 584                  */
 585 
 586                 eq->eq_consindx = cons_indx;
 587 
 588                 /* the FMA retry loop starts. */
 589                 hermon_pio_start(state, uarhdl, pio_error, fm_loop_cnt,
 590                     fm_status, fm_test);
 591 
 592                 ddi_put32(uarhdl, eq->eq_doorbell,
 593                     (cons_indx & HERMON_EQ_CI_MASK) | EQ_ARM_BIT);
 594 
 595                 /* the FMA retry loop starts. */
 596                 hermon_pio_end(state, uarhdl, pio_error, fm_loop_cnt,
 597                     fm_status, fm_test);
 598 
 599                 if (polled_some == 0)
 600                         break;
 601         };
 602         return;
 603 
 604 pio_error:
 605         hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_FATAL);
 606 }
 607 
 608 
 609 /*
 610  * hermon_eq_catastrophic
 611  *    Context: Only called from interrupt context (and during panic)
 612  */
 613 static void
 614 hermon_eq_catastrophic(hermon_state_t *state)
 615 {
 616         ddi_acc_handle_t        cmdhdl = hermon_get_cmdhdl(state);
 617         ibt_async_code_t        type;
 618         ibc_async_event_t       event;
 619         uint32_t                *base_addr;
 620         uint32_t                buf_size;
 621         uint32_t                word;
 622         uint8_t                 err_type;
 623         uint32_t                err_buf;
 624         int                     i;
 625 
 626         /* initialize the FMA retry loop */
 627         hermon_pio_init(fm_loop_cnt, fm_status, fm_test);
 628 
 629         bzero(&event, sizeof (ibc_async_event_t));
 630         base_addr = state->hs_cmd_regs.fw_err_buf;
 631 
 632         buf_size = state->hs_fw.error_buf_sz;        /* in #dwords */
 633 
 634         /* the FMA retry loop starts. */
 635         hermon_pio_start(state, cmdhdl, pio_error, fm_loop_cnt, fm_status,
 636             fm_test);
 637 
 638         word = ddi_get32(cmdhdl, base_addr);
 639 
 640         /* the FMA retry loop ends. */
 641         hermon_pio_end(state, cmdhdl, pio_error, fm_loop_cnt, fm_status,
 642             fm_test);
 643 
 644         err_type = (word & 0xFF000000) >> 24;
 645         type     = IBT_ERROR_LOCAL_CATASTROPHIC;
 646 
 647         switch (err_type) {
 648         case HERMON_CATASTROPHIC_INTERNAL_ERROR:
 649                 cmn_err(CE_WARN, "Catastrophic Internal Error: 0x%02x",
 650                     err_type);
 651 
 652                 break;
 653 
 654         case HERMON_CATASTROPHIC_UPLINK_BUS_ERROR:
 655                 cmn_err(CE_WARN, "Catastrophic Uplink Bus Error: 0x%02x",
 656                     err_type);
 657 
 658                 break;
 659 
 660         case HERMON_CATASTROPHIC_DDR_DATA_ERROR:
 661                 cmn_err(CE_WARN, "Catastrophic DDR Data Error: 0x%02x",
 662                     err_type);
 663 
 664                 break;
 665 
 666         case HERMON_CATASTROPHIC_INTERNAL_PARITY_ERROR:
 667                 cmn_err(CE_WARN, "Catastrophic Internal Parity Error: 0x%02x",
 668                     err_type);
 669 
 670                 break;
 671 
 672         default:
 673                 /* Unknown type of Catastrophic error */
 674                 cmn_err(CE_WARN, "Catastrophic Unknown Error: 0x%02x",
 675                     err_type);
 676 
 677                 break;
 678         }
 679 
 680         /* the FMA retry loop starts. */
 681         hermon_pio_start(state, cmdhdl, pio_error, fm_loop_cnt, fm_status,
 682             fm_test);
 683 
 684         /*
 685          * Read in the catastrophic error buffer from the hardware.
 686          */
 687         for (i = 0; i < buf_size; i++) {
 688                 base_addr =
 689                     (state->hs_cmd_regs.fw_err_buf + i);
 690                 err_buf = ddi_get32(cmdhdl, base_addr);
 691                 cmn_err(CE_NOTE, "hermon%d: catastrophic_error[%02x]: %08X",
 692                     state->hs_instance, i, err_buf);
 693         }
 694 
 695         /* the FMA retry loop ends. */
 696         hermon_pio_end(state, cmdhdl, pio_error, fm_loop_cnt, fm_status,
 697             fm_test);
 698 
 699         /*
 700          * We also call the IBTF here to inform it of the catastrophic error.
 701          * Note: Since no event information (i.e. QP handles, CQ handles,
 702          * etc.) is necessary, we pass a NULL pointer instead of a pointer to
 703          * an empty ibc_async_event_t struct.
 704          *
 705          * But we also check if "hs_ibtfpriv" is NULL.  If it is then it
 706          * means that we've have either received this event before we
 707          * finished attaching to the IBTF or we've received it while we
 708          * are in the process of detaching.
 709          */
 710         if (state->hs_ibtfpriv != NULL) {
 711                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
 712         }
 713 
 714 pio_error:
 715         /* ignore these errors but log them because they're harmless. */
 716         hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_NON_FATAL);
 717 }
 718 
 719 
 720 /*
 721  * hermon_eq_alloc()
 722  *    Context: Only called from attach() path context
 723  */
 724 static int
 725 hermon_eq_alloc(hermon_state_t *state, uint32_t log_eq_size, uint_t intr,
 726     hermon_eqhdl_t *eqhdl)
 727 {
 728         hermon_rsrc_t           *eqc, *rsrc;
 729         hermon_hw_eqc_t         eqc_entry;
 730         hermon_eqhdl_t          eq;
 731         ibt_mr_attr_t           mr_attr;
 732         hermon_mr_options_t     op;
 733         hermon_pdhdl_t          pd;
 734         hermon_mrhdl_t          mr;
 735         hermon_hw_eqe_t         *buf;
 736         int                     status;
 737 
 738         /* Use the internal protection domain (PD) for setting up EQs */
 739         pd = state->hs_pdhdl_internal;
 740 
 741         /* Increment the reference count on the protection domain (PD) */
 742         hermon_pd_refcnt_inc(pd);
 743 
 744         /*
 745          * Allocate an EQ context entry.  This will be filled in with all
 746          * the necessary parameters to define the Event Queue.  And then
 747          * ownership will be passed to the hardware in the final step
 748          * below.  If we fail here, we must undo the protection domain
 749          * reference count.
 750          */
 751         status = hermon_rsrc_alloc(state, HERMON_EQC, 1, HERMON_SLEEP, &eqc);
 752         if (status != DDI_SUCCESS) {
 753                 status = DDI_FAILURE;
 754                 goto eqalloc_fail1;
 755         }
 756 
 757         /*
 758          * Allocate the software structure for tracking the event queue (i.e.
 759          * the Hermon Event Queue handle).  If we fail here, we must undo the
 760          * protection domain reference count and the previous resource
 761          * allocation.
 762          */
 763         status = hermon_rsrc_alloc(state, HERMON_EQHDL, 1, HERMON_SLEEP, &rsrc);
 764         if (status != DDI_SUCCESS) {
 765                 status = DDI_FAILURE;
 766                 goto eqalloc_fail2;
 767         }
 768 
 769         eq = (hermon_eqhdl_t)rsrc->hr_addr;
 770 
 771         /*
 772          * Allocate the memory for Event Queue.
 773          */
 774         eq->eq_eqinfo.qa_size = (1 << log_eq_size) * sizeof (hermon_hw_eqe_t);
 775         eq->eq_eqinfo.qa_alloc_align = eq->eq_eqinfo.qa_bind_align = PAGESIZE;
 776 
 777         eq->eq_eqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
 778         status = hermon_queue_alloc(state, &eq->eq_eqinfo, HERMON_SLEEP);
 779         if (status != DDI_SUCCESS) {
 780                 status = DDI_FAILURE;
 781                 goto eqalloc_fail3;
 782         }
 783 
 784         buf = (hermon_hw_eqe_t *)eq->eq_eqinfo.qa_buf_aligned;
 785         /*
 786          * Initializing each of the Event Queue Entries (EQE) by setting their
 787          * ownership to hardware ("owner" bit set to HW) is now done by HW
 788          * when the transfer of ownership (below) of the
 789          * EQ context itself is done.
 790          */
 791 
 792         /*
 793          * Register the memory for the EQ.
 794          *
 795          * Because we are in the attach path we use NOSLEEP here so that we
 796          * SPIN in the HCR since the event queues are not setup yet, and we
 797          * cannot NOSPIN at this point in time.
 798          */
 799 
 800         mr_attr.mr_vaddr = (uint64_t)(uintptr_t)buf;
 801         mr_attr.mr_len   = eq->eq_eqinfo.qa_size;
 802         mr_attr.mr_as    = NULL;
 803         mr_attr.mr_flags = IBT_MR_NOSLEEP | IBT_MR_ENABLE_LOCAL_WRITE;
 804         op.mro_bind_type   = state->hs_cfg_profile->cp_iommu_bypass;
 805         op.mro_bind_dmahdl = eq->eq_eqinfo.qa_dmahdl;
 806         op.mro_bind_override_addr = 0;
 807         status = hermon_mr_register(state, pd, &mr_attr, &mr, &op,
 808             HERMON_EQ_CMPT);
 809         if (status != DDI_SUCCESS) {
 810                 status = DDI_FAILURE;
 811                 goto eqalloc_fail4;
 812         }
 813         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr))
 814 
 815         /*
 816          * Fill in the EQC entry.  This is the final step before passing
 817          * ownership of the EQC entry to the Hermon hardware.  We use all of
 818          * the information collected/calculated above to fill in the
 819          * requisite portions of the EQC.  Note:  We create all EQs in the
 820          * "fired" state.  We will arm them later (after our interrupt
 821          * routine had been registered.)
 822          */
 823         bzero(&eqc_entry, sizeof (hermon_hw_eqc_t));
 824         eqc_entry.state         = HERMON_EQ_ARMED;
 825         eqc_entry.log_eq_sz     = log_eq_size;
 826         eqc_entry.intr          = intr;
 827         eqc_entry.log2_pgsz     = mr->mr_log2_pgsz;
 828         eqc_entry.pg_offs       = eq->eq_eqinfo.qa_pgoffs >> 5;
 829         eqc_entry.mtt_base_addrh = (uint32_t)((mr->mr_mttaddr >> 32) & 0xFF);
 830         eqc_entry.mtt_base_addrl =  mr->mr_mttaddr >> 3;
 831         eqc_entry.cons_indx     = 0x0;
 832         eqc_entry.prod_indx     = 0x0;
 833 
 834         /*
 835          * Write the EQC entry to hardware.  Lastly, we pass ownership of
 836          * the entry to the hardware (using the Hermon SW2HW_EQ firmware
 837          * command).  Note: in general, this operation shouldn't fail.  But
 838          * if it does, we have to undo everything we've done above before
 839          * returning error.
 840          */
 841         status = hermon_cmn_ownership_cmd_post(state, SW2HW_EQ, &eqc_entry,
 842             sizeof (hermon_hw_eqc_t), eqc->hr_indx, HERMON_CMD_NOSLEEP_SPIN);
 843         if (status != HERMON_CMD_SUCCESS) {
 844                 cmn_err(CE_NOTE, "hermon%d: SW2HW_EQ command failed: %08x\n",
 845                     state->hs_instance, status);
 846                 if (status == HERMON_CMD_INVALID_STATUS) {
 847                         hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_SRV_LOST);
 848                 }
 849                 status = ibc_get_ci_failure(0);
 850                 goto eqalloc_fail5;
 851         }
 852 
 853         /*
 854          * Fill in the rest of the Hermon Event Queue handle.  Having
 855          * successfully transferred ownership of the EQC, we can update the
 856          * following fields for use in further operations on the EQ.
 857          */
 858         eq->eq_eqcrsrcp       = eqc;
 859         eq->eq_rsrcp  = rsrc;
 860         eq->eq_consindx       = 0;
 861         eq->eq_eqnum  = eqc->hr_indx;
 862         eq->eq_buf    = buf;
 863         eq->eq_bufsz  = (1 << log_eq_size);
 864         eq->eq_log_eqsz       = log_eq_size;
 865         eq->eq_mrhdl  = mr;
 866         eq->eq_doorbell       = (uint32_t *)((uintptr_t)state->hs_reg_uar_baseaddr +
 867             (uint32_t)ARM_EQ_INDEX(eq->eq_eqnum));
 868         *eqhdl           = eq;
 869 
 870         return (DDI_SUCCESS);
 871 
 872 /*
 873  * The following is cleanup for all possible failure cases in this routine
 874  */
 875 eqalloc_fail5:
 876         if (hermon_mr_deregister(state, &mr, HERMON_MR_DEREG_ALL,
 877             HERMON_NOSLEEP) != DDI_SUCCESS) {
 878                 HERMON_WARNING(state, "failed to deregister EQ memory");
 879         }
 880 eqalloc_fail4:
 881         hermon_queue_free(&eq->eq_eqinfo);
 882 eqalloc_fail3:
 883         hermon_rsrc_free(state, &rsrc);
 884 eqalloc_fail2:
 885         hermon_rsrc_free(state, &eqc);
 886 eqalloc_fail1:
 887         hermon_pd_refcnt_dec(pd);
 888 eqalloc_fail:
 889         return (status);
 890 }
 891 
 892 
 893 /*
 894  * hermon_eq_free()
 895  *    Context: Only called from attach() and/or detach() path contexts
 896  */
 897 static int
 898 hermon_eq_free(hermon_state_t *state, hermon_eqhdl_t *eqhdl)
 899 {
 900         hermon_rsrc_t           *eqc, *rsrc;
 901         hermon_hw_eqc_t         eqc_entry;
 902         hermon_pdhdl_t          pd;
 903         hermon_mrhdl_t          mr;
 904         hermon_eqhdl_t          eq;
 905         uint32_t                eqnum;
 906         int                     status;
 907 
 908         /*
 909          * Pull all the necessary information from the Hermon Event Queue
 910          * handle.  This is necessary here because the resource for the
 911          * EQ handle is going to be freed up as part of this operation.
 912          */
 913         eq      = *eqhdl;
 914         eqc     = eq->eq_eqcrsrcp;
 915         rsrc    = eq->eq_rsrcp;
 916         pd      = state->hs_pdhdl_internal;
 917         mr      = eq->eq_mrhdl;
 918         eqnum   = eq->eq_eqnum;
 919 
 920         /*
 921          * Reclaim EQC entry from hardware (using the Hermon HW2SW_EQ
 922          * firmware command).  If the ownership transfer fails for any reason,
 923          * then it is an indication that something (either in HW or SW) has
 924          * gone seriously wrong.
 925          */
 926         status = hermon_cmn_ownership_cmd_post(state, HW2SW_EQ, &eqc_entry,
 927             sizeof (hermon_hw_eqc_t), eqnum, HERMON_CMD_NOSLEEP_SPIN);
 928         if (status != HERMON_CMD_SUCCESS) {
 929                 HERMON_WARNING(state, "failed to reclaim EQC ownership");
 930                 cmn_err(CE_CONT, "Hermon: HW2SW_EQ command failed: %08x\n",
 931                     status);
 932                 return (DDI_FAILURE);
 933         }
 934 
 935         /*
 936          * Deregister the memory for the Event Queue.  If this fails
 937          * for any reason, then it is an indication that something (either
 938          * in HW or SW) has gone seriously wrong.  So we print a warning
 939          * message and continue.
 940          */
 941         status = hermon_mr_deregister(state, &mr, HERMON_MR_DEREG_ALL,
 942             HERMON_NOSLEEP);
 943         if (status != DDI_SUCCESS) {
 944                 HERMON_WARNING(state, "failed to deregister EQ memory");
 945         }
 946 
 947         /* Free the memory for the EQ */
 948         hermon_queue_free(&eq->eq_eqinfo);
 949 
 950         /* Free the Hermon Event Queue handle */
 951         hermon_rsrc_free(state, &rsrc);
 952 
 953         /* Free up the EQC entry resource */
 954         hermon_rsrc_free(state, &eqc);
 955 
 956         /* Decrement the reference count on the protection domain (PD) */
 957         hermon_pd_refcnt_dec(pd);
 958 
 959         /* Set the eqhdl pointer to NULL and return success */
 960         *eqhdl = NULL;
 961 
 962         return (DDI_SUCCESS);
 963 }
 964 
 965 
 966 /*
 967  * hermon_eq_handler_init
 968  *    Context: Only called from attach() path context
 969  */
 970 static int
 971 hermon_eq_handler_init(hermon_state_t *state, hermon_eqhdl_t eq,
 972     uint_t evt_type_mask, int (*eq_func)(hermon_state_t *state,
 973     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe))
 974 {
 975         int             status;
 976 
 977         /*
 978          * Save away the EQ handler function and the event type mask.  These
 979          * will be used later during interrupt and event queue processing.
 980          */
 981         eq->eq_func     = eq_func;
 982         eq->eq_evttypemask = evt_type_mask;
 983 
 984         /*
 985          * Map the EQ to a specific class of event (or events) depending
 986          * on the mask value passed in.  The HERMON_EVT_NO_MASK means not
 987          * to attempt associating the EQ with any specific class of event.
 988          * This is particularly useful when initializing the events queues
 989          * used for CQ events.   The mapping is done using the Hermon MAP_EQ
 990          * firmware command.  Note: This command should not, in general, fail.
 991          * If it does, then something (probably HW related) has gone seriously
 992          * wrong.
 993          */
 994         if (evt_type_mask != HERMON_EVT_NO_MASK) {
 995                 status = hermon_map_eq_cmd_post(state,
 996                     HERMON_CMD_MAP_EQ_EVT_MAP, eq->eq_eqnum, evt_type_mask,
 997                     HERMON_CMD_NOSLEEP_SPIN);
 998                 if (status != HERMON_CMD_SUCCESS) {
 999                         cmn_err(CE_NOTE, "hermon%d: MAP_EQ command failed: "
1000                             "%08x\n", state->hs_instance, status);
1001                         return (DDI_FAILURE);
1002                 }
1003         }
1004 
1005         return (DDI_SUCCESS);
1006 }
1007 
1008 
1009 /*
1010  * hermon_eq_handler_fini
1011  *    Context: Only called from attach() and/or detach() path contexts
1012  */
1013 static int
1014 hermon_eq_handler_fini(hermon_state_t *state, hermon_eqhdl_t eq)
1015 {
1016         int                     status;
1017 
1018         /*
1019          * Unmap the EQ from the event class to which it had been previously
1020          * mapped.  The unmapping is done using the Hermon MAP_EQ (in much
1021          * the same way that the initial mapping was done).  The difference,
1022          * however, is in the HERMON_EQ_EVT_UNMAP flag that is passed to the
1023          * MAP_EQ firmware command.  The HERMON_EVT_NO_MASK (which may have
1024          * been passed in at init time) still means that no association has
1025          * been made between the EQ and any specific class of event (and,
1026          * hence, no unmapping is necessary).  Note: This command should not,
1027          * in general, fail.  If it does, then something (probably HW related)
1028          * has gone seriously wrong.
1029          */
1030         if (eq->eq_evttypemask != HERMON_EVT_NO_MASK) {
1031                 status = hermon_map_eq_cmd_post(state,
1032                     HERMON_CMD_MAP_EQ_EVT_UNMAP, eq->eq_eqnum,
1033                     eq->eq_evttypemask, HERMON_CMD_NOSLEEP_SPIN);
1034                 if (status != HERMON_CMD_SUCCESS) {
1035                         cmn_err(CE_NOTE, "hermon%d: MAP_EQ command failed: "
1036                             "%08x\n", state->hs_instance, status);
1037                         return (DDI_FAILURE);
1038                 }
1039         }
1040 
1041         return (DDI_SUCCESS);
1042 }
1043 
1044 
1045 /*
1046  * hermon_eq_demux()
1047  *      Context: Called only from interrupt context
1048  *      Usage:  to demux the various type reported on one EQ
1049  */
1050 static int
1051 hermon_eq_demux(hermon_state_t *state, hermon_eqhdl_t eq,
1052     hermon_hw_eqe_t *eqe)
1053 {
1054         uint_t                  eqe_evttype;
1055         int                     status = DDI_FAILURE;
1056 
1057         eqe_evttype = HERMON_EQE_EVTTYPE_GET(eq, eqe);
1058 
1059         switch (eqe_evttype) {
1060 
1061         case HERMON_EVT_PORT_STATE_CHANGE:
1062                 status = hermon_port_state_change_handler(state, eq, eqe);
1063                 break;
1064 
1065         case HERMON_EVT_COMM_ESTABLISHED:
1066                 status = hermon_comm_estbl_handler(state, eq, eqe);
1067                 break;
1068 
1069         case HERMON_EVT_COMMAND_INTF_COMP:
1070                 status = hermon_cmd_complete_handler(state, eq, eqe);
1071                 break;
1072 
1073         case HERMON_EVT_LOCAL_WQ_CAT_ERROR:
1074                 HERMON_WARNING(state, HERMON_FMA_LOCCAT);
1075                 status = hermon_local_wq_cat_err_handler(state, eq, eqe);
1076                 break;
1077 
1078         case HERMON_EVT_INV_REQ_LOCAL_WQ_ERROR:
1079                 HERMON_WARNING(state, HERMON_FMA_LOCINV);
1080                 status = hermon_invreq_local_wq_err_handler(state, eq, eqe);
1081                 break;
1082 
1083         case HERMON_EVT_LOCAL_ACC_VIO_WQ_ERROR:
1084                 HERMON_WARNING(state, HERMON_FMA_LOCACEQ);
1085                 IBTF_DPRINTF_L2("async", HERMON_FMA_LOCACEQ);
1086                 status = hermon_local_acc_vio_wq_err_handler(state, eq, eqe);
1087                 break;
1088         case HERMON_EVT_SEND_QUEUE_DRAINED:
1089                 status = hermon_sendq_drained_handler(state, eq, eqe);
1090                 break;
1091 
1092         case HERMON_EVT_PATH_MIGRATED:
1093                 status = hermon_path_mig_handler(state, eq, eqe);
1094                 break;
1095 
1096         case HERMON_EVT_PATH_MIGRATE_FAILED:
1097                 HERMON_WARNING(state, HERMON_FMA_PATHMIG);
1098                 status = hermon_path_mig_err_handler(state, eq, eqe);
1099                 break;
1100 
1101         case HERMON_EVT_SRQ_CATASTROPHIC_ERROR:
1102                 HERMON_WARNING(state, HERMON_FMA_SRQCAT);
1103                 status = hermon_catastrophic_handler(state, eq, eqe);
1104                 break;
1105 
1106         case HERMON_EVT_SRQ_LAST_WQE_REACHED:
1107                 status = hermon_srq_last_wqe_reached_handler(state, eq, eqe);
1108                 break;
1109 
1110         case HERMON_EVT_FEXCH_ERROR:
1111                 status = hermon_fexch_error_handler(state, eq, eqe);
1112                 break;
1113 
1114         default:
1115                 break;
1116         }
1117         return (status);
1118 }
1119 
1120 /*
1121  * hermon_port_state_change_handler()
1122  *    Context: Only called from interrupt context
1123  */
1124 /* ARGSUSED */
1125 static int
1126 hermon_port_state_change_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1127     hermon_hw_eqe_t *eqe)
1128 {
1129         ibc_async_event_t       event;
1130         ibt_async_code_t        type;
1131         uint_t                  subtype;
1132         uint8_t                 port;
1133         char                    link_msg[24];
1134 
1135         /*
1136          * Depending on the type of Port State Change event, pass the
1137          * appropriate asynch event to the IBTF.
1138          */
1139         port = (uint8_t)HERMON_EQE_PORTNUM_GET(eq, eqe);
1140 
1141         /* Check for valid port number in event */
1142         if ((port == 0) || (port > state->hs_cfg_profile->cp_num_ports)) {
1143                 HERMON_WARNING(state, "Unexpected port number in port state "
1144                     "change event");
1145                 cmn_err(CE_CONT, "  Port number: %02x\n", port);
1146                 return (DDI_FAILURE);
1147         }
1148 
1149         subtype = HERMON_EQE_EVTSUBTYPE_GET(eq, eqe);
1150         if (subtype == HERMON_PORT_LINK_ACTIVE) {
1151                 event.ev_port   = port;
1152                 type            = IBT_EVENT_PORT_UP;
1153 
1154                 (void) snprintf(link_msg, 23, "port %d up", port);
1155                 ddi_dev_report_fault(state->hs_dip, DDI_SERVICE_RESTORED,
1156                     DDI_EXTERNAL_FAULT, link_msg);
1157         } else if (subtype == HERMON_PORT_LINK_DOWN) {
1158                 event.ev_port   = port;
1159                 type            = IBT_ERROR_PORT_DOWN;
1160 
1161                 (void) snprintf(link_msg, 23, "port %d down", port);
1162                 ddi_dev_report_fault(state->hs_dip, DDI_SERVICE_LOST,
1163                     DDI_EXTERNAL_FAULT, link_msg);
1164         } else {
1165                 HERMON_WARNING(state, "Unexpected subtype in port state change "
1166                     "event");
1167                 cmn_err(CE_CONT, "  Event type: %02x, subtype: %02x\n",
1168                     HERMON_EQE_EVTTYPE_GET(eq, eqe), subtype);
1169                 return (DDI_FAILURE);
1170         }
1171 
1172         /*
1173          * Deliver the event to the IBTF.  Note: If "hs_ibtfpriv" is NULL,
1174          * then we have either received this event before we finished
1175          * attaching to the IBTF or we've received it while we are in the
1176          * process of detaching.
1177          */
1178         if (state->hs_ibtfpriv != NULL) {
1179                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1180         }
1181 
1182         return (DDI_SUCCESS);
1183 }
1184 
1185 
1186 /*
1187  * hermon_comm_estbl_handler()
1188  *    Context: Only called from interrupt context
1189  */
1190 /* ARGSUSED */
1191 static int
1192 hermon_comm_estbl_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1193     hermon_hw_eqe_t *eqe)
1194 {
1195         hermon_qphdl_t          qp;
1196         uint_t                  qpnum;
1197         ibc_async_event_t       event;
1198         ibt_async_code_t        type;
1199 
1200         /* Get the QP handle from QP number in event descriptor */
1201         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1202         qp = hermon_qphdl_from_qpnum(state, qpnum);
1203 
1204         /*
1205          * If the QP handle is NULL, this is probably an indication
1206          * that the QP has been freed already.  In which case, we
1207          * should not deliver this event.
1208          *
1209          * We also check that the QP number in the handle is the
1210          * same as the QP number in the event queue entry.  This
1211          * extra check allows us to handle the case where a QP was
1212          * freed and then allocated again in the time it took to
1213          * handle the event queue processing.  By constantly incrementing
1214          * the non-constrained portion of the QP number every time
1215          * a new QP is allocated, we mitigate (somewhat) the chance
1216          * that a stale event could be passed to the client's QP
1217          * handler.
1218          *
1219          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1220          * means that we've have either received this event before we
1221          * finished attaching to the IBTF or we've received it while we
1222          * are in the process of detaching.
1223          */
1224         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1225             (state->hs_ibtfpriv != NULL)) {
1226                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1227                 type            = IBT_EVENT_COM_EST_QP;
1228 
1229                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1230         }
1231 
1232         return (DDI_SUCCESS);
1233 }
1234 
1235 
1236 /*
1237  * hermon_local_wq_cat_err_handler()
1238  *    Context: Only called from interrupt context
1239  */
1240 /* ARGSUSED */
1241 static int
1242 hermon_local_wq_cat_err_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1243     hermon_hw_eqe_t *eqe)
1244 {
1245         hermon_qphdl_t          qp;
1246         uint_t                  qpnum;
1247         ibc_async_event_t       event;
1248         ibt_async_code_t        type;
1249 
1250         /* Get the QP handle from QP number in event descriptor */
1251         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1252         qp = hermon_qphdl_from_qpnum(state, qpnum);
1253 
1254         /*
1255          * If the QP handle is NULL, this is probably an indication
1256          * that the QP has been freed already.  In which case, we
1257          * should not deliver this event.
1258          *
1259          * We also check that the QP number in the handle is the
1260          * same as the QP number in the event queue entry.  This
1261          * extra check allows us to handle the case where a QP was
1262          * freed and then allocated again in the time it took to
1263          * handle the event queue processing.  By constantly incrementing
1264          * the non-constrained portion of the QP number every time
1265          * a new QP is allocated, we mitigate (somewhat) the chance
1266          * that a stale event could be passed to the client's QP
1267          * handler.
1268          *
1269          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1270          * means that we've have either received this event before we
1271          * finished attaching to the IBTF or we've received it while we
1272          * are in the process of detaching.
1273          */
1274         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1275             (state->hs_ibtfpriv != NULL)) {
1276                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1277                 type            = IBT_ERROR_CATASTROPHIC_QP;
1278 
1279                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1280         }
1281 
1282         return (DDI_SUCCESS);
1283 }
1284 
1285 
1286 /*
1287  * hermon_invreq_local_wq_err_handler()
1288  *    Context: Only called from interrupt context
1289  */
1290 /* ARGSUSED */
1291 static int
1292 hermon_invreq_local_wq_err_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1293     hermon_hw_eqe_t *eqe)
1294 {
1295         hermon_qphdl_t          qp;
1296         uint_t                  qpnum;
1297         ibc_async_event_t       event;
1298         ibt_async_code_t        type;
1299 
1300         /* Get the QP handle from QP number in event descriptor */
1301         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1302         qp = hermon_qphdl_from_qpnum(state, qpnum);
1303 
1304         /*
1305          * If the QP handle is NULL, this is probably an indication
1306          * that the QP has been freed already.  In which case, we
1307          * should not deliver this event.
1308          *
1309          * We also check that the QP number in the handle is the
1310          * same as the QP number in the event queue entry.  This
1311          * extra check allows us to handle the case where a QP was
1312          * freed and then allocated again in the time it took to
1313          * handle the event queue processing.  By constantly incrementing
1314          * the non-constrained portion of the QP number every time
1315          * a new QP is allocated, we mitigate (somewhat) the chance
1316          * that a stale event could be passed to the client's QP
1317          * handler.
1318          *
1319          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1320          * means that we've have either received this event before we
1321          * finished attaching to the IBTF or we've received it while we
1322          * are in the process of detaching.
1323          */
1324         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1325             (state->hs_ibtfpriv != NULL)) {
1326                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1327                 type            = IBT_ERROR_INVALID_REQUEST_QP;
1328 
1329                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1330         }
1331 
1332         return (DDI_SUCCESS);
1333 }
1334 
1335 
1336 /*
1337  * hermon_local_acc_vio_wq_err_handler()
1338  *    Context: Only called from interrupt context
1339  */
1340 /* ARGSUSED */
1341 static int
1342 hermon_local_acc_vio_wq_err_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1343     hermon_hw_eqe_t *eqe)
1344 {
1345         hermon_qphdl_t          qp;
1346         uint_t                  qpnum;
1347         ibc_async_event_t       event;
1348         ibt_async_code_t        type;
1349 
1350         /* Get the QP handle from QP number in event descriptor */
1351         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1352         qp = hermon_qphdl_from_qpnum(state, qpnum);
1353 
1354         /*
1355          * If the QP handle is NULL, this is probably an indication
1356          * that the QP has been freed already.  In which case, we
1357          * should not deliver this event.
1358          *
1359          * We also check that the QP number in the handle is the
1360          * same as the QP number in the event queue entry.  This
1361          * extra check allows us to handle the case where a QP was
1362          * freed and then allocated again in the time it took to
1363          * handle the event queue processing.  By constantly incrementing
1364          * the non-constrained portion of the QP number every time
1365          * a new QP is allocated, we mitigate (somewhat) the chance
1366          * that a stale event could be passed to the client's QP
1367          * handler.
1368          *
1369          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1370          * means that we've have either received this event before we
1371          * finished attaching to the IBTF or we've received it while we
1372          * are in the process of detaching.
1373          */
1374         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1375             (state->hs_ibtfpriv != NULL)) {
1376                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1377                 type            = IBT_ERROR_ACCESS_VIOLATION_QP;
1378 
1379                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1380         }
1381 
1382         return (DDI_SUCCESS);
1383 }
1384 
1385 
1386 /*
1387  * hermon_sendq_drained_handler()
1388  *    Context: Only called from interrupt context
1389  */
1390 /* ARGSUSED */
1391 static int
1392 hermon_sendq_drained_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1393     hermon_hw_eqe_t *eqe)
1394 {
1395         hermon_qphdl_t          qp;
1396         uint_t                  qpnum;
1397         ibc_async_event_t       event;
1398         uint_t                  forward_sqd_event;
1399         ibt_async_code_t        type;
1400 
1401         /* Get the QP handle from QP number in event descriptor */
1402         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1403         qp = hermon_qphdl_from_qpnum(state, qpnum);
1404 
1405         /*
1406          * If the QP handle is NULL, this is probably an indication
1407          * that the QP has been freed already.  In which case, we
1408          * should not deliver this event.
1409          *
1410          * We also check that the QP number in the handle is the
1411          * same as the QP number in the event queue entry.  This
1412          * extra check allows us to handle the case where a QP was
1413          * freed and then allocated again in the time it took to
1414          * handle the event queue processing.  By constantly incrementing
1415          * the non-constrained portion of the QP number every time
1416          * a new QP is allocated, we mitigate (somewhat) the chance
1417          * that a stale event could be passed to the client's QP
1418          * handler.
1419          *
1420          * And then we check if "hs_ibtfpriv" is NULL.  If it is then it
1421          * means that we've have either received this event before we
1422          * finished attaching to the IBTF or we've received it while we
1423          * are in the process of detaching.
1424          */
1425         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1426             (state->hs_ibtfpriv != NULL)) {
1427                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1428                 type            = IBT_EVENT_SQD;
1429 
1430                 /*
1431                  * Grab the QP lock and update the QP state to reflect that
1432                  * the Send Queue Drained event has arrived.  Also determine
1433                  * whether the event is intended to be forwarded on to the
1434                  * consumer or not.  This information is used below in
1435                  * determining whether or not to call the IBTF.
1436                  */
1437                 mutex_enter(&qp->qp_lock);
1438                 forward_sqd_event = qp->qp_forward_sqd_event;
1439                 qp->qp_forward_sqd_event  = 0;
1440                 qp->qp_sqd_still_draining = 0;
1441                 mutex_exit(&qp->qp_lock);
1442 
1443                 if (forward_sqd_event != 0) {
1444                         HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1445                 }
1446         }
1447 
1448         return (DDI_SUCCESS);
1449 }
1450 
1451 
1452 /*
1453  * hermon_path_mig_handler()
1454  *    Context: Only called from interrupt context
1455  */
1456 /* ARGSUSED */
1457 static int
1458 hermon_path_mig_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1459     hermon_hw_eqe_t *eqe)
1460 {
1461         hermon_qphdl_t          qp;
1462         uint_t                  qpnum;
1463         ibc_async_event_t       event;
1464         ibt_async_code_t        type;
1465 
1466         /* Get the QP handle from QP number in event descriptor */
1467         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1468         qp = hermon_qphdl_from_qpnum(state, qpnum);
1469 
1470         /*
1471          * If the QP handle is NULL, this is probably an indication
1472          * that the QP has been freed already.  In which case, we
1473          * should not deliver this event.
1474          *
1475          * We also check that the QP number in the handle is the
1476          * same as the QP number in the event queue entry.  This
1477          * extra check allows us to handle the case where a QP was
1478          * freed and then allocated again in the time it took to
1479          * handle the event queue processing.  By constantly incrementing
1480          * the non-constrained portion of the QP number every time
1481          * a new QP is allocated, we mitigate (somewhat) the chance
1482          * that a stale event could be passed to the client's QP
1483          * handler.
1484          *
1485          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1486          * means that we've have either received this event before we
1487          * finished attaching to the IBTF or we've received it while we
1488          * are in the process of detaching.
1489          */
1490         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1491             (state->hs_ibtfpriv != NULL)) {
1492                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1493                 type            = IBT_EVENT_PATH_MIGRATED_QP;
1494 
1495                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1496         }
1497 
1498         return (DDI_SUCCESS);
1499 }
1500 
1501 
1502 /*
1503  * hermon_path_mig_err_handler()
1504  *    Context: Only called from interrupt context
1505  */
1506 /* ARGSUSED */
1507 static int
1508 hermon_path_mig_err_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1509     hermon_hw_eqe_t *eqe)
1510 {
1511         hermon_qphdl_t          qp;
1512         uint_t                  qpnum;
1513         ibc_async_event_t       event;
1514         ibt_async_code_t        type;
1515 
1516         /* Get the QP handle from QP number in event descriptor */
1517         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1518         qp = hermon_qphdl_from_qpnum(state, qpnum);
1519 
1520         /*
1521          * If the QP handle is NULL, this is probably an indication
1522          * that the QP has been freed already.  In which case, we
1523          * should not deliver this event.
1524          *
1525          * We also check that the QP number in the handle is the
1526          * same as the QP number in the event queue entry.  This
1527          * extra check allows us to handle the case where a QP was
1528          * freed and then allocated again in the time it took to
1529          * handle the event queue processing.  By constantly incrementing
1530          * the non-constrained portion of the QP number every time
1531          * a new QP is allocated, we mitigate (somewhat) the chance
1532          * that a stale event could be passed to the client's QP
1533          * handler.
1534          *
1535          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1536          * means that we've have either received this event before we
1537          * finished attaching to the IBTF or we've received it while we
1538          * are in the process of detaching.
1539          */
1540         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1541             (state->hs_ibtfpriv != NULL)) {
1542                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1543                 type            = IBT_ERROR_PATH_MIGRATE_REQ_QP;
1544 
1545                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1546         }
1547 
1548         return (DDI_SUCCESS);
1549 }
1550 
1551 
1552 /*
1553  * hermon_catastrophic_handler()
1554  *    Context: Only called from interrupt context
1555  */
1556 /* ARGSUSED */
1557 static int
1558 hermon_catastrophic_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1559     hermon_hw_eqe_t *eqe)
1560 {
1561         hermon_qphdl_t          qp;
1562         uint_t                  qpnum;
1563         ibc_async_event_t       event;
1564         ibt_async_code_t        type;
1565 
1566         if (eq->eq_evttypemask == HERMON_EVT_MSK_LOCAL_CAT_ERROR) {
1567                 HERMON_FMANOTE(state, HERMON_FMA_INTERNAL);
1568                 hermon_eq_catastrophic(state);
1569                 return (DDI_SUCCESS);
1570         }
1571 
1572         /* Get the QP handle from QP number in event descriptor */
1573         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1574         qp = hermon_qphdl_from_qpnum(state, qpnum);
1575 
1576         /*
1577          * If the QP handle is NULL, this is probably an indication
1578          * that the QP has been freed already.  In which case, we
1579          * should not deliver this event.
1580          *
1581          * We also check that the QP number in the handle is the
1582          * same as the QP number in the event queue entry.  This
1583          * extra check allows us to handle the case where a QP was
1584          * freed and then allocated again in the time it took to
1585          * handle the event queue processing.  By constantly incrementing
1586          * the non-constrained portion of the QP number every time
1587          * a new QP is allocated, we mitigate (somewhat) the chance
1588          * that a stale event could be passed to the client's QP
1589          * handler.
1590          *
1591          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1592          * means that we've have either received this event before we
1593          * finished attaching to the IBTF or we've received it while we
1594          * are in the process of detaching.
1595          */
1596         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1597             (state->hs_ibtfpriv != NULL)) {
1598                 event.ev_srq_hdl = (ibt_srq_hdl_t)qp->qp_srqhdl->srq_hdlrarg;
1599                 type            = IBT_ERROR_CATASTROPHIC_SRQ;
1600 
1601                 mutex_enter(&qp->qp_srqhdl->srq_lock);
1602                 qp->qp_srqhdl->srq_state = HERMON_SRQ_STATE_ERROR;
1603                 mutex_exit(&qp->qp_srqhdl->srq_lock);
1604 
1605                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1606         }
1607 
1608         return (DDI_SUCCESS);
1609 }
1610 
1611 
1612 /*
1613  * hermon_srq_last_wqe_reached_handler()
1614  *    Context: Only called from interrupt context
1615  */
1616 /* ARGSUSED */
1617 static int
1618 hermon_srq_last_wqe_reached_handler(hermon_state_t *state, hermon_eqhdl_t eq,
1619     hermon_hw_eqe_t *eqe)
1620 {
1621         hermon_qphdl_t          qp;
1622         uint_t                  qpnum;
1623         ibc_async_event_t       event;
1624         ibt_async_code_t        type;
1625 
1626         /* Get the QP handle from QP number in event descriptor */
1627         qpnum = HERMON_EQE_QPNUM_GET(eq, eqe);
1628         qp = hermon_qphdl_from_qpnum(state, qpnum);
1629 
1630         /*
1631          * If the QP handle is NULL, this is probably an indication
1632          * that the QP has been freed already.  In which case, we
1633          * should not deliver this event.
1634          *
1635          * We also check that the QP number in the handle is the
1636          * same as the QP number in the event queue entry.  This
1637          * extra check allows us to handle the case where a QP was
1638          * freed and then allocated again in the time it took to
1639          * handle the event queue processing.  By constantly incrementing
1640          * the non-constrained portion of the QP number every time
1641          * a new QP is allocated, we mitigate (somewhat) the chance
1642          * that a stale event could be passed to the client's QP
1643          * handler.
1644          *
1645          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1646          * means that we've have either received this event before we
1647          * finished attaching to the IBTF or we've received it while we
1648          * are in the process of detaching.
1649          */
1650         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1651             (state->hs_ibtfpriv != NULL)) {
1652                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1653                 type            = IBT_EVENT_EMPTY_CHAN;
1654 
1655                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1656         }
1657 
1658         return (DDI_SUCCESS);
1659 }
1660 
1661 
1662 /* ARGSUSED */
1663 static int hermon_fexch_error_handler(hermon_state_t *state,
1664     hermon_eqhdl_t eq, hermon_hw_eqe_t *eqe)
1665 {
1666         hermon_qphdl_t          qp;
1667         uint_t                  qpnum;
1668         ibc_async_event_t       event;
1669         ibt_async_code_t        type;
1670 
1671         /* Get the QP handle from QP number in event descriptor */
1672         event.ev_port = HERMON_EQE_FEXCH_PORTNUM_GET(eq, eqe);
1673         qpnum = hermon_fcoib_qpnum_from_fexch(state,
1674             event.ev_port, HERMON_EQE_FEXCH_FEXCH_GET(eq, eqe));
1675         qp = hermon_qphdl_from_qpnum(state, qpnum);
1676 
1677         event.ev_fc = HERMON_EQE_FEXCH_SYNDROME_GET(eq, eqe);
1678 
1679         /*
1680          * If the QP handle is NULL, this is probably an indication
1681          * that the QP has been freed already.  In which case, we
1682          * should not deliver this event.
1683          *
1684          * We also check that the QP number in the handle is the
1685          * same as the QP number in the event queue entry.  This
1686          * extra check allows us to handle the case where a QP was
1687          * freed and then allocated again in the time it took to
1688          * handle the event queue processing.  By constantly incrementing
1689          * the non-constrained portion of the QP number every time
1690          * a new QP is allocated, we mitigate (somewhat) the chance
1691          * that a stale event could be passed to the client's QP
1692          * handler.
1693          *
1694          * Lastly, we check if "hs_ibtfpriv" is NULL.  If it is then it
1695          * means that we've have either received this event before we
1696          * finished attaching to the IBTF or we've received it while we
1697          * are in the process of detaching.
1698          */
1699         if ((qp != NULL) && (qp->qp_qpnum == qpnum) &&
1700             (state->hs_ibtfpriv != NULL)) {
1701                 event.ev_qp_hdl = (ibtl_qp_hdl_t)qp->qp_hdlrarg;
1702                 type            = IBT_FEXCH_ERROR;
1703 
1704                 HERMON_DO_IBTF_ASYNC_CALLB(state, type, &event);
1705         }
1706 
1707         return (DDI_SUCCESS);
1708 }
1709 
1710 
1711 /*
1712  * hermon_no_eqhandler
1713  *    Context: Only called from interrupt context
1714  */
1715 /* ARGSUSED */
1716 static int
1717 hermon_no_eqhandler(hermon_state_t *state, hermon_eqhdl_t eq,
1718     hermon_hw_eqe_t *eqe)
1719 {
1720         uint_t          data;
1721         int             i;
1722 
1723         /*
1724          * This "unexpected event" handler (or "catch-all" handler) will
1725          * receive all events for which no other handler has been registered.
1726          * If we end up here, then something has probably gone seriously wrong
1727          * with the Hermon hardware (or, perhaps, with the software... though
1728          * it's unlikely in this case).  The EQE provides all the information
1729          * about the event.  So we print a warning message here along with
1730          * the contents of the EQE.
1731          */
1732         HERMON_WARNING(state, "Unexpected Event handler");
1733         cmn_err(CE_CONT, "  Event type: %02x, subtype: %02x\n",
1734             HERMON_EQE_EVTTYPE_GET(eq, eqe),
1735             HERMON_EQE_EVTSUBTYPE_GET(eq, eqe));
1736         for (i = 0; i < sizeof (hermon_hw_eqe_t) >> 2; i++) {
1737                 data = ((uint_t *)eqe)[i];
1738                 cmn_err(CE_CONT, "  EQE[%02x]: %08x\n", i, data);
1739         }
1740 
1741         return (DDI_SUCCESS);
1742 }