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, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
  24  * All rights reserved.
  25  */
  26 
  27 #ifndef _MONTECARLO_SYS_HSCIMPL_H
  28 #define _MONTECARLO_SYS_HSCIMPL_H
  29 
  30 #pragma ident   "%Z%%M% %I%     %E% SMI"
  31 
  32 #ifdef  __cplusplus
  33 extern "C" {
  34 #endif
  35 
  36 #include <sys/types.h>
  37 #include <sys/hotplug/hpctrl.h>
  38 
  39 /*
  40  * Flag values
  41  */
  42 #define HSC_ENABLED             0x1     /* if not enabled, slot unmanaged */
  43 #define HSC_AUTOCFG             0x2     /* if set, ENUM# events will be sent */
  44 #define HSC_REGISTERED          HSC_ENABLED
  45 #define HSC_ALARM_CARD_PRES     0x4     /* Alarm Card on this slot */
  46 #define HSC_BOARD_TYPE_HS       0x8
  47 #define HSC_BOARD_TYPE_UNKNOWN  0x10
  48 #define HSC_SLOT_ENABLED        0x20
  49 #define HSC_SLOT_BAD_STATE      0x40    /* Surprise Removal on this slot */
  50 #define HSC_ENUM_FAILED         0x80    /* Could not Enumerate this slot */
  51 #define HSC_SCB_HOTSWAPPED      0x100   /* slot status change due to SCB swap */
  52 #define HSC_HOTSWAP_MODE_BASIC  0
  53 #define HSC_HOTSWAP_MODE_FULL   1
  54 
  55 
  56 typedef struct hsc_slot_state {
  57         int             pslotnum;
  58         int             state;
  59 } hsc_slot_state_t;
  60 
  61 typedef struct hsc_slot_table {
  62         char    nexus[128];
  63         int     pci_devno;
  64         int     pslotnum;
  65         int     ga;
  66 } hsc_slot_table_t;
  67 
  68 typedef struct hsc_prom_slot_table {
  69         int     phandle;
  70         int     pci_devno;
  71         int     pslotnum;
  72         int     ga;
  73 } hsc_prom_slot_table_t;
  74 
  75 typedef struct hsc_state {
  76         int             instance;
  77         int             state;
  78         dev_info_t      *dip;
  79         void            *scsb_handle;
  80         struct hsc_slot *hsp_last;      /* last board plugged in. */
  81         hsc_slot_table_t *slot_table_prop;
  82         int             slot_table_size;
  83         int             hsc_intr_counter;
  84         kmutex_t        hsc_mutex;
  85         ddi_iblock_cookie_t enum_iblock;
  86         boolean_t       regDone;
  87         int             n_registered_occupants;
  88         int     hotswap_mode;
  89 } hsc_state_t;
  90 
  91 /*
  92  * This struct describes a HS slot known to us. It maintains
  93  * all the state associated with the slot.
  94  * Slots are placed on a linked list.
  95  */
  96 typedef struct hsc_slot {
  97         struct hsc_slot         *hs_next;
  98 
  99         void                    *hs_hpchandle; /* HPC (scsb) handle */
 100 
 101         /*
 102          * The hs_slot_number identifies the plysical slot.
 103          * It should match with the documentation.
 104          */
 105         int                     hs_slot_number;
 106 
 107         hpc_slot_info_t         hs_info;
 108 
 109         hpc_board_type_t        hs_board_type;
 110         /*
 111          * We only have 2 LEDs/slot on MonteCarlo, so we map them
 112          * to the ACTIVE and FAULT ones.
 113          * ACTIVE will be set when a board is in the slot, and has
 114          * been configured.
 115          */
 116         hpc_led_state_t         hs_active_led_state;
 117         hpc_led_state_t         hs_fault_led_state;
 118 
 119         /*
 120          * hs_slot_handle is useful for supporting ENUM#
 121          * (when we need to inform the nexus of the event).
 122          */
 123         hpc_slot_t              hs_slot_handle;
 124 
 125         uint_t                  hs_flags;
 126 
 127         boolean_t               hs_board_configured;
 128         boolean_t               hs_board_configuring;
 129         boolean_t               hs_board_unconfiguring;
 130         boolean_t               hs_board_healthy;
 131 
 132         /*
 133          * The hs_slot_state is useful for HW-connection control
 134          */
 135         hpc_slot_state_t        hs_slot_state;
 136         hsc_state_t             *hsc;   /* pointer to our controller device */
 137 } hsc_slot_t;
 138 
 139 /* state values in our control structure */
 140 #define HSC_ENUM_ENABLED        1
 141 #define HSC_ATTACHED            2
 142 #define HSC_SCB_CONNECTED       4
 143 
 144 #ifdef  __cplusplus
 145 }
 146 #endif
 147 
 148 #endif  /* _MONTECARLO_SYS_HSCIMPL_H */