1 /*
   2  * Copyright (c) 2009-2015 Solarflare Communications Inc.
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions are met:
   7  *
   8  * 1. Redistributions of source code must retain the above copyright notice,
   9  *    this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright notice,
  11  *    this list of conditions and the following disclaimer in the documentation
  12  *    and/or other materials provided with the distribution.
  13  *
  14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  21  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  23  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  24  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25  *
  26  * The views and conclusions contained in the software and documentation are
  27  * those of the authors and should not be interpreted as representing official
  28  * policies, either expressed or implied, of the FreeBSD Project.
  29  */
  30 
  31 #ifndef _SYS_SIENA_IMPL_H
  32 #define _SYS_SIENA_IMPL_H
  33 
  34 #include "efx.h"
  35 #include "efx_regs.h"
  36 #include "efx_mcdi.h"
  37 #include "siena_flash.h"
  38 
  39 #ifdef  __cplusplus
  40 extern "C" {
  41 #endif
  42 
  43 #define SIENA_NVRAM_CHUNK 0x80
  44 
  45 extern  __checkReturn   efx_rc_t
  46 siena_nic_probe(
  47         __in            efx_nic_t *enp);
  48 
  49 extern  __checkReturn   efx_rc_t
  50 siena_nic_reset(
  51         __in            efx_nic_t *enp);
  52 
  53 extern  __checkReturn   efx_rc_t
  54 siena_nic_init(
  55         __in            efx_nic_t *enp);
  56 
  57 #if EFSYS_OPT_DIAG
  58 
  59 extern  __checkReturn   efx_rc_t
  60 siena_nic_register_test(
  61         __in            efx_nic_t *enp);
  62 
  63 #endif  /* EFSYS_OPT_DIAG */
  64 
  65 extern                  void
  66 siena_nic_fini(
  67         __in            efx_nic_t *enp);
  68 
  69 extern                  void
  70 siena_nic_unprobe(
  71         __in            efx_nic_t *enp);
  72 
  73 #define SIENA_SRAM_ROWS 0x12000
  74 
  75 extern                  void
  76 siena_sram_init(
  77         __in            efx_nic_t *enp);
  78 
  79 #if EFSYS_OPT_DIAG
  80 
  81 extern  __checkReturn   efx_rc_t
  82 siena_sram_test(
  83         __in            efx_nic_t *enp,
  84         __in            efx_sram_pattern_fn_t func);
  85 
  86 #endif  /* EFSYS_OPT_DIAG */
  87 
  88 #if EFSYS_OPT_MCDI
  89 
  90 extern  __checkReturn   efx_rc_t
  91 siena_mcdi_init(
  92         __in            efx_nic_t *enp,
  93         __in            const efx_mcdi_transport_t *mtp);
  94 
  95 extern                  void
  96 siena_mcdi_send_request(
  97         __in            efx_nic_t *enp,
  98         __in            void *hdrp,
  99         __in            size_t hdr_len,
 100         __in            void *sdup,
 101         __in            size_t sdu_len);
 102 
 103 extern  __checkReturn   boolean_t
 104 siena_mcdi_poll_response(
 105         __in            efx_nic_t *enp);
 106 
 107 extern                  void
 108 siena_mcdi_read_response(
 109         __in                    efx_nic_t *enp,
 110         __out_bcount(length)    void *bufferp,
 111         __in                    size_t offset,
 112         __in                    size_t length);
 113 
 114 extern                  efx_rc_t
 115 siena_mcdi_poll_reboot(
 116         __in            efx_nic_t *enp);
 117 
 118 extern                  void
 119 siena_mcdi_fini(
 120         __in            efx_nic_t *enp);
 121 
 122 extern  __checkReturn   efx_rc_t
 123 siena_mcdi_feature_supported(
 124         __in            efx_nic_t *enp,
 125         __in            efx_mcdi_feature_id_t id,
 126         __out           boolean_t *supportedp);
 127 
 128 #endif /* EFSYS_OPT_MCDI */
 129 
 130 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
 131 
 132 extern  __checkReturn           efx_rc_t
 133 siena_nvram_partn_lock(
 134         __in                    efx_nic_t *enp,
 135         __in                    uint32_t partn);
 136 
 137 extern                          void
 138 siena_nvram_partn_unlock(
 139         __in                    efx_nic_t *enp,
 140         __in                    uint32_t partn);
 141 
 142 extern  __checkReturn           efx_rc_t
 143 siena_nvram_get_dynamic_cfg(
 144         __in                    efx_nic_t *enp,
 145         __in                    uint32_t partn,
 146         __in                    boolean_t vpd,
 147         __out                   siena_mc_dynamic_config_hdr_t **dcfgp,
 148         __out                   size_t *sizep);
 149 
 150 #endif  /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
 151 
 152 #if EFSYS_OPT_NVRAM
 153 
 154 #if EFSYS_OPT_DIAG
 155 
 156 extern  __checkReturn           efx_rc_t
 157 siena_nvram_test(
 158         __in                    efx_nic_t *enp);
 159 
 160 #endif  /* EFSYS_OPT_DIAG */
 161 
 162 extern  __checkReturn           efx_rc_t
 163 siena_nvram_get_subtype(
 164         __in                    efx_nic_t *enp,
 165         __in                    uint32_t partn,
 166         __out                   uint32_t *subtypep);
 167 
 168 extern  __checkReturn           efx_rc_t
 169 siena_nvram_type_to_partn(
 170         __in                    efx_nic_t *enp,
 171         __in                    efx_nvram_type_t type,
 172         __out                   uint32_t *partnp);
 173 
 174 extern  __checkReturn           efx_rc_t
 175 siena_nvram_partn_size(
 176         __in                    efx_nic_t *enp,
 177         __in                    uint32_t partn,
 178         __out                   size_t *sizep);
 179 
 180 extern  __checkReturn           efx_rc_t
 181 siena_nvram_partn_rw_start(
 182         __in                    efx_nic_t *enp,
 183         __in                    uint32_t partn,
 184         __out                   size_t *chunk_sizep);
 185 
 186 extern  __checkReturn           efx_rc_t
 187 siena_nvram_partn_read(
 188         __in                    efx_nic_t *enp,
 189         __in                    uint32_t partn,
 190         __in                    unsigned int offset,
 191         __out_bcount(size)      caddr_t data,
 192         __in                    size_t size);
 193 
 194 extern  __checkReturn           efx_rc_t
 195 siena_nvram_partn_erase(
 196         __in                    efx_nic_t *enp,
 197         __in                    uint32_t partn,
 198         __in                    unsigned int offset,
 199         __in                    size_t size);
 200 
 201 extern  __checkReturn           efx_rc_t
 202 siena_nvram_partn_write(
 203         __in                    efx_nic_t *enp,
 204         __in                    uint32_t partn,
 205         __in                    unsigned int offset,
 206         __out_bcount(size)      caddr_t data,
 207         __in                    size_t size);
 208 
 209 extern                          void
 210 siena_nvram_partn_rw_finish(
 211         __in                    efx_nic_t *enp,
 212         __in                    uint32_t partn);
 213 
 214 extern  __checkReturn           efx_rc_t
 215 siena_nvram_partn_get_version(
 216         __in                    efx_nic_t *enp,
 217         __in                    uint32_t partn,
 218         __out                   uint32_t *subtypep,
 219         __out_ecount(4)         uint16_t version[4]);
 220 
 221 extern  __checkReturn           efx_rc_t
 222 siena_nvram_partn_set_version(
 223         __in                    efx_nic_t *enp,
 224         __in                    uint32_t partn,
 225         __in_ecount(4)          uint16_t version[4]);
 226 
 227 #endif  /* EFSYS_OPT_NVRAM */
 228 
 229 #if EFSYS_OPT_VPD
 230 
 231 extern  __checkReturn           efx_rc_t
 232 siena_vpd_init(
 233         __in                    efx_nic_t *enp);
 234 
 235 extern  __checkReturn           efx_rc_t
 236 siena_vpd_size(
 237         __in                    efx_nic_t *enp,
 238         __out                   size_t *sizep);
 239 
 240 extern  __checkReturn           efx_rc_t
 241 siena_vpd_read(
 242         __in                    efx_nic_t *enp,
 243         __out_bcount(size)      caddr_t data,
 244         __in                    size_t size);
 245 
 246 extern  __checkReturn           efx_rc_t
 247 siena_vpd_verify(
 248         __in                    efx_nic_t *enp,
 249         __in_bcount(size)       caddr_t data,
 250         __in                    size_t size);
 251 
 252 extern  __checkReturn           efx_rc_t
 253 siena_vpd_reinit(
 254         __in                    efx_nic_t *enp,
 255         __in_bcount(size)       caddr_t data,
 256         __in                    size_t size);
 257 
 258 extern  __checkReturn           efx_rc_t
 259 siena_vpd_get(
 260         __in                    efx_nic_t *enp,
 261         __in_bcount(size)       caddr_t data,
 262         __in                    size_t size,
 263         __inout                 efx_vpd_value_t *evvp);
 264 
 265 extern  __checkReturn           efx_rc_t
 266 siena_vpd_set(
 267         __in                    efx_nic_t *enp,
 268         __in_bcount(size)       caddr_t data,
 269         __in                    size_t size,
 270         __in                    efx_vpd_value_t *evvp);
 271 
 272 extern  __checkReturn           efx_rc_t
 273 siena_vpd_next(
 274         __in                    efx_nic_t *enp,
 275         __in_bcount(size)       caddr_t data,
 276         __in                    size_t size,
 277         __out                   efx_vpd_value_t *evvp,
 278         __inout                 unsigned int *contp);
 279 
 280 extern __checkReturn            efx_rc_t
 281 siena_vpd_write(
 282         __in                    efx_nic_t *enp,
 283         __in_bcount(size)       caddr_t data,
 284         __in                    size_t size);
 285 
 286 extern                          void
 287 siena_vpd_fini(
 288         __in                    efx_nic_t *enp);
 289 
 290 #endif  /* EFSYS_OPT_VPD */
 291 
 292 typedef struct siena_link_state_s {
 293         uint32_t                sls_adv_cap_mask;
 294         uint32_t                sls_lp_cap_mask;
 295         unsigned int            sls_fcntl;
 296         efx_link_mode_t         sls_link_mode;
 297 #if EFSYS_OPT_LOOPBACK
 298         efx_loopback_type_t     sls_loopback;
 299 #endif
 300         boolean_t               sls_mac_up;
 301 } siena_link_state_t;
 302 
 303 extern                  void
 304 siena_phy_link_ev(
 305         __in            efx_nic_t *enp,
 306         __in            efx_qword_t *eqp,
 307         __out           efx_link_mode_t *link_modep);
 308 
 309 extern  __checkReturn   efx_rc_t
 310 siena_phy_get_link(
 311         __in            efx_nic_t *enp,
 312         __out           siena_link_state_t *slsp);
 313 
 314 extern  __checkReturn   efx_rc_t
 315 siena_phy_power(
 316         __in            efx_nic_t *enp,
 317         __in            boolean_t on);
 318 
 319 extern  __checkReturn   efx_rc_t
 320 siena_phy_reconfigure(
 321         __in            efx_nic_t *enp);
 322 
 323 extern  __checkReturn   efx_rc_t
 324 siena_phy_verify(
 325         __in            efx_nic_t *enp);
 326 
 327 extern  __checkReturn   efx_rc_t
 328 siena_phy_oui_get(
 329         __in            efx_nic_t *enp,
 330         __out           uint32_t *ouip);
 331 
 332 #if EFSYS_OPT_PHY_STATS
 333 
 334 extern                                          void
 335 siena_phy_decode_stats(
 336         __in                                    efx_nic_t *enp,
 337         __in                                    uint32_t vmask,
 338         __in_opt                                efsys_mem_t *esmp,
 339         __out_opt                               uint64_t *smaskp,
 340         __inout_ecount_opt(EFX_PHY_NSTATS)      uint32_t *stat);
 341 
 342 extern  __checkReturn                   efx_rc_t
 343 siena_phy_stats_update(
 344         __in                            efx_nic_t *enp,
 345         __in                            efsys_mem_t *esmp,
 346         __inout_ecount(EFX_PHY_NSTATS)  uint32_t *stat);
 347 
 348 #endif  /* EFSYS_OPT_PHY_STATS */
 349 
 350 #if EFSYS_OPT_BIST
 351 
 352 extern  __checkReturn           efx_rc_t
 353 siena_phy_bist_start(
 354         __in                    efx_nic_t *enp,
 355         __in                    efx_bist_type_t type);
 356 
 357 extern  __checkReturn           efx_rc_t
 358 siena_phy_bist_poll(
 359         __in                    efx_nic_t *enp,
 360         __in                    efx_bist_type_t type,
 361         __out                   efx_bist_result_t *resultp,
 362         __out_opt __drv_when(count > 0, __notnull)
 363         uint32_t        *value_maskp,
 364         __out_ecount_opt(count) __drv_when(count > 0, __notnull)
 365         unsigned long   *valuesp,
 366         __in                    size_t count);
 367 
 368 extern                          void
 369 siena_phy_bist_stop(
 370         __in                    efx_nic_t *enp,
 371         __in                    efx_bist_type_t type);
 372 
 373 #endif  /* EFSYS_OPT_BIST */
 374 
 375 extern  __checkReturn   efx_rc_t
 376 siena_mac_poll(
 377         __in            efx_nic_t *enp,
 378         __out           efx_link_mode_t *link_modep);
 379 
 380 extern  __checkReturn   efx_rc_t
 381 siena_mac_up(
 382         __in            efx_nic_t *enp,
 383         __out           boolean_t *mac_upp);
 384 
 385 extern  __checkReturn   efx_rc_t
 386 siena_mac_reconfigure(
 387         __in    efx_nic_t *enp);
 388 
 389 #if EFSYS_OPT_LOOPBACK
 390 
 391 extern  __checkReturn   efx_rc_t
 392 siena_mac_loopback_set(
 393         __in            efx_nic_t *enp,
 394         __in            efx_link_mode_t link_mode,
 395         __in            efx_loopback_type_t loopback_type);
 396 
 397 #endif  /* EFSYS_OPT_LOOPBACK */
 398 
 399 #if EFSYS_OPT_MAC_STATS
 400 
 401 extern  __checkReturn                   efx_rc_t
 402 siena_mac_stats_update(
 403         __in                            efx_nic_t *enp,
 404         __in                            efsys_mem_t *esmp,
 405         __inout_ecount(EFX_MAC_NSTATS)  efsys_stat_t *stat,
 406         __inout_opt                     uint32_t *generationp);
 407 
 408 #endif  /* EFSYS_OPT_MAC_STATS */
 409 
 410 #ifdef  __cplusplus
 411 }
 412 #endif
 413 
 414 #endif  /* _SYS_SIENA_IMPL_H */