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  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #ifndef _SYS_USB_HWAHC_H
  27 #define _SYS_USB_HWAHC_H
  28 
  29 #ifdef  __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 
  34 #include <sys/usb/usba/wa.h>
  35 #include <sys/usb/hubd/hub.h>
  36 #include <sys/usb/hubd/hubdvar.h>
  37 #include <sys/usb/usba/hcdi.h>
  38 #include <sys/usb/usba/whcdi.h>
  39 #include <sys/disp.h>
  40 #include <sys/sunldi.h>
  41 
  42 /*
  43  * Power Management support
  44  */
  45 typedef struct hwahc_power  {
  46         void            *hwahc_state;   /* points back to hwahc_state */
  47         uint8_t         hwahc_pwr_states; /* bit mask of device pwr states */
  48         int             hwahc_pm_busy; /* device busy counting */
  49         uint8_t         hwahc_wakeup_enabled;
  50 
  51         /* wakeup and power transistion capabilites of an interface */
  52         uint8_t         hwahc_pm_capabilities;
  53 
  54         /* current power level the device is in */
  55         uint8_t         hwahc_current_power;
  56 } hwahc_power_t;
  57 
  58 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_power_t::hwahc_wakeup_enabled))
  59 
  60 /* softstate init state */
  61 #define HWAHC_LOCK_INITED               0x0001
  62 #define HWAHC_HUBDI_REGISTERED          0x0002
  63 #define HWAHC_MINOR_NODE_CREATED        0x0004
  64 #define HWAHC_EVENTS_REGISTERED         0x0010
  65 #define HWAHC_HUBREG                    0x0020
  66 #define HWAHC_WA_INITED                 0x0040
  67 #define HWAHC_HCDI_REGISTERED           0x0080
  68 #define HWAHC_HC_INITED                 0x0400
  69 #define HWAHC_WA_STARTED                0x0800
  70 
  71 /* hardware operation state */
  72 #define HWAHC_HW_STOPPED                0
  73 #define HWAHC_HW_STARTED                1
  74 #define HWAHC_HW_CH_STOPPED             2
  75 #define HWAHC_HW_CH_SUSPEND             3
  76 
  77 /* Tracking events registered by children */
  78 #define HWAHC_CHILD_EVENT_DISCONNECT    0x01
  79 #define HWAHC_CHILD_EVENT_PRESUSPEND    0x02
  80 
  81 /* Host controller software states */
  82 #define HWAHC_CTRL_INIT_STATE           0       /* Initialization state */
  83 #define HWAHC_CTRL_SUSPEND_STATE        1       /* Suspend state */
  84 #define HWAHC_CTRL_OPERATIONAL_STATE    2       /* Operational state */
  85 #define HWAHC_CTRL_ERROR_STATE          3       /* Error state */
  86 
  87 /* Host controller pipe states */
  88 #define HWAHC_PIPE_STATE_IDLE           1       /* Pipe is in ready state */
  89 #define HWAHC_PIPE_STATE_ACTIVE         2       /* Pipe is in busy state */
  90 #define HWAHC_PIPE_STATE_ERROR          3       /* Pipe is in error state */
  91 
  92 /* Additional pipe states for the hwahc_pipe_cleanup */
  93 #define HWAHC_PIPE_STATE_CLOSE          4       /* Pipe close */
  94 #define HWAHC_PIPE_STATE_RESET          5       /* Pipe reset */
  95 #define HWAHC_PIPE_STATE_STOP_POLLING   6       /* Pipe stop polling */
  96 
  97 typedef struct hwahc_pipe_private {
  98         usba_pipe_handle_data_t *pp_pipe_handle;
  99         uint_t                  pp_state;
 100         usb_pipe_policy_t       pp_policy;
 101         wusb_wa_rpipe_hdl_t     *pp_rp;
 102         wusb_dev_info_t         *pp_wdev; /* parent device */
 103 
 104         /*
 105          * To support Intr/Isoc IN polling.
 106          * Save the original client's request
 107          */
 108         usb_opaque_t            pp_client_periodic_in_reqp;
 109         kcondvar_t              pp_xfer_cmpl_cv;
 110 } hwahc_pipe_private_t;
 111 
 112 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_pipe_private_t::pp_pipe_handle))
 113 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_pipe_private_t::pp_rp))
 114 _NOTE(DATA_READABLE_WITHOUT_LOCK(
 115     hwahc_pipe_private_t::pp_client_periodic_in_reqp))
 116 
 117 /*
 118  * Softstate structure
 119  */
 120 typedef struct hwahc_state {
 121         int                     hwahc_instance;
 122         uint_t                  hwahc_flags;
 123         uint_t                  hwahc_dev_state;        /* USB device states */
 124         usb_log_handle_t        hwahc_log_handle;
 125 
 126         hwahc_power_t           *hwahc_pm;
 127         dev_info_t              *hwahc_dip;             /* device info handle */
 128 
 129         /* mutex to protect softstate and hw regs */
 130         kmutex_t                hwahc_mutex;
 131 
 132         hubd_t                  *hwahc_hubd;
 133         int                     hwahc_hw_state;         /* hc start flag */
 134         uint_t                  hwahc_open_count;
 135 
 136         int                     hwahc_hc_soft_state;    /* driver states. */
 137 
 138         /* default pipe handle as a usba client device */
 139         usb_pipe_handle_t       hwahc_default_pipe;
 140 
 141         uint_t                  hwahc_open_pipe_count;
 142 
 143         /* wire adapter common data */
 144         wusb_wa_data_t          hwahc_wa_data;
 145         wusb_secrt_data_t       hwahc_secrt_data;
 146 
 147         /* WUSB HC common data. hold HC and children info */
 148         wusb_hc_data_t          hwahc_hc_data;
 149 
 150         /* for DN notification */
 151         usba_list_entry_t       hwahc_dn_notif_queue;
 152         kthread_t               *hwahc_notif_thread_id;
 153 
 154         /* for transfer result notification */
 155         kthread_t               *hwahc_result_thread_id;
 156         kcondvar_t              hwahc_result_thread_cv;
 157 
 158         int8_t                  hwahc_bus_pwr; /* bus power event count */
 159 
 160         /* track event registration of children */
 161         uint8_t                 hwahc_child_events[128];
 162 
 163         ndi_event_hdl_t         hwahc_ndi_event_hdl;
 164 
 165         usb_client_dev_data_t   *hwahc_dev_data;        /* registration data */
 166         usba_hcdi_ops_t         *hwahc_hcdi_ops;        /* HCDI structure */
 167 
 168 } hwahc_state_t;
 169 
 170 /* warlock directives */
 171 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_state_t))
 172 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_pipe_private_t))
 173 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex,
 174         hwahc_pipe_private_t::pp_state))
 175 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_power_t))
 176 
 177 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_log_handle))
 178 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_wa_data))
 179 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_dip))
 180 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_default_pipe))
 181 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_ndi_event_hdl))
 182 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_pm
 183                 hwahc_state_t::hwahc_hubd))
 184 
 185 _NOTE(SCHEME_PROTECTS_DATA("stable data", usb_ep_comp_descr))
 186 _NOTE(SCHEME_PROTECTS_DATA("stable data", usba_device_t))
 187 
 188 /* Debug masks */
 189 #define PRINT_MASK_ATTA         0x00000001      /* Attach time */
 190 #define PRINT_MASK_RPIPES       0x00000002      /* Rpipe management */
 191 #define PRINT_MASK_HUB          0x00000004      /* Hub related stuff */
 192 #define PRINT_MASK_EVENTS       0x00000008      /* Intr notification */
 193 #define PRINT_MASK_SECURITY     0x00000020      /* Security info */
 194 #define PRINT_MASK_CBOPS        0x00000040      /* CB-OPS */
 195 #define PRINT_MASK_HCDI         0x00000080      /* HCDI entry points */
 196 #define PRINT_MASK_DUMPING      0x00000100      /* Dump hwa info */
 197 #define PRINT_MASK_OPEN         0x00000200      /* Open time */
 198 #define PRINT_MASK_CLOSE        0x00000400      /* Close time */
 199 #define PRINT_MASK_PM           0x00000800      /* For pwr mgmt */
 200 #define PRINT_MASK_ALL          0xFFFFFFFF
 201 
 202 #define HWAHC_MINOR_HUB_BITS_MASK               0xff
 203 #define HWAHC_MINOR_INSTANCE_MASK               ~HWAHC_MINOR_HUB_BITS_MASK
 204 #define HWAHC_MINOR_INSTANCE_SHIFT      8
 205 
 206 #define HWAHC_MINOR_TO_INSTANCE(minor)  \
 207                 (((minor) & HWAHC_MINOR_INSTANCE_MASK) >> \
 208                 HWAHC_MINOR_INSTANCE_SHIFT)
 209 
 210 #define HWAHC_CONSTRUCT_MINOR(inst)     \
 211                 (inst << HWAHC_MINOR_INSTANCE_SHIFT)
 212 
 213 /* base of MAC layer dev address for HWA class device */
 214 #define HWAHC_DEV_ADDR_BASE             0xA100
 215 
 216 typedef struct hwahc_dn_notif_list {
 217         hwa_notif_dn_recvd_t    *dn_notif;
 218         usba_list_entry_t       notif_list;
 219 } hwahc_dn_notif_list_t;
 220 
 221 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_dn_notif_list_t))
 222 
 223 /* max elements in notification queue */
 224 #define HWAHC_MAX_NOTIF                 100
 225 
 226 /* notification queue drain timeout - 60sec */
 227 #define HWAHC_NOTIF_DRAIN_TIMEOUT       60
 228 
 229 /*
 230  * cfgadm state values
 231  */
 232 #define HWAHC_CFGADM_NORMAL             0       /* normal state */
 233 #define HWAHC_CFGADM_DISCONNECTED       1       /* logically disconnected */
 234 #define HWAHC_CFGADM_UNCONFIGURED       2       /* port is unconfigured */
 235 #define HWAHC_CFGADM_EMPTY              3       /* port is empty */
 236 #define HWAHC_CFGADM_STILL_REFERENCED   4       /* ndi_devi_offline failed */
 237 #define HWAHC_CFGADM_CONFIGURED         5       /* port is configured */
 238 #define HWAHC_CFGADM_INVALID            0xFF    /* invalid state */
 239 
 240 #ifdef __cplusplus
 241 }
 242 #endif
 243 
 244 #endif /* _SYS_USB_HWAHC_H */