1 /*-
   2  * Copyright 2007-2013 Solarflare Communications Inc.  All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  * 1. Redistributions of source code must retain the above copyright
   8  *    notice, this list of conditions and the following disclaimer.
   9  * 2. Redistributions in binary form must reproduce the above copyright
  10  *    notice, this list of conditions and the following disclaimer in the
  11  *    documentation and/or other materials provided with the distribution.
  12  *
  13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
  14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23  * SUCH DAMAGE.
  24  */
  25 
  26 #ifndef _SYS_FALCON_IMPL_H
  27 #define _SYS_FALCON_IMPL_H
  28 
  29 #include "efx.h"
  30 #include "efx_regs.h"
  31 
  32 #ifdef  __cplusplus
  33 extern "C" {
  34 #endif
  35 
  36 typedef struct falcon_i2c_s {
  37         boolean_t       fi_sda;
  38         boolean_t       fi_scl;
  39 } falcon_i2c_t;
  40 
  41 typedef struct falcon_spi_dev_s {
  42         uint32_t        fsd_sf_sel;
  43         size_t          fsd_size;
  44         uint32_t        fsd_adbcnt;
  45         boolean_t       fsd_munge;
  46         uint32_t        fsd_erase_cmd;
  47         size_t          fsd_erase_size;
  48         size_t          fsd_write_size;
  49 } falcon_spi_dev_t;
  50 
  51 extern  __checkReturn   int
  52 falcon_nic_probe(
  53         __in            efx_nic_t *enp);
  54 
  55 #if EFSYS_OPT_PCIE_TUNE
  56 
  57 extern                  int
  58 falcon_nic_pcie_tune(
  59         __in            efx_nic_t *enp,
  60         __in            unsigned int nlanes);
  61 
  62 #endif
  63 
  64 #define FALCON_NIC_CFG_RAW_SZ 0x400
  65 
  66 extern  __checkReturn   int
  67 falcon_nic_cfg_raw_read_verify(
  68         __in            efx_nic_t *enp,
  69         __in            uint32_t offset,
  70         __in            uint32_t size,
  71         __out           uint8_t *cfg);
  72 
  73 extern  __checkReturn   int
  74 falcon_nic_cfg_build(
  75         __in            efx_nic_t *enp,
  76         __out           efx_nic_cfg_t *encp);
  77 
  78 extern  __checkReturn   int
  79 falcon_nic_reset(
  80         __in            efx_nic_t *enp);
  81 
  82 extern  __checkReturn   int
  83 falcon_nic_init(
  84         __in            efx_nic_t *enp);
  85 
  86 #if EFSYS_OPT_DIAG
  87 
  88 extern  __checkReturn   int
  89 falcon_nic_register_test(
  90         __in            efx_nic_t *enp);
  91 
  92 #endif  /* EFSYS_OPT_DIAG */
  93 
  94 extern                  void
  95 falcon_nic_fini(
  96         __in            efx_nic_t *enp);
  97 
  98 extern                  void
  99 falcon_nic_unprobe(
 100         __in            efx_nic_t *enp);
 101 
 102 extern  __checkReturn   int
 103 falcon_nic_mac_reset(
 104         __in            efx_nic_t *enp);
 105 
 106 extern                  void
 107 falcon_mac_wrapper_enable(
 108         __in            efx_nic_t *enp);
 109 
 110 extern  __checkReturn   int
 111 falcon_mac_wrapper_disable(
 112         __in            efx_nic_t *enp);
 113 
 114 #if EFSYS_OPT_LOOPBACK
 115 
 116 extern  __checkReturn   int
 117 falcon_mac_loopback_set(
 118         __in            efx_nic_t *enp,
 119         __in            efx_link_mode_t link_mode,
 120         __in            efx_loopback_type_t loopback_type);
 121 
 122 #endif  /* EFSYS_OPT_LOOPBACK */
 123 
 124 extern                  void
 125 falcon_nic_phy_reset(
 126         __in            efx_nic_t *enp);
 127 
 128 extern  __checkReturn           int
 129 falcon_nvram_init(
 130         __in                    efx_nic_t *enp);
 131 
 132 #if EFSYS_OPT_NVRAM
 133 
 134 #if EFSYS_OPT_DIAG
 135 
 136 extern  __checkReturn           int
 137 falcon_nvram_test(
 138         __in                    efx_nic_t *enp);
 139 
 140 #endif  /* EFSYS_OPT_DIAG */
 141 
 142 extern  __checkReturn           int
 143 falcon_nvram_size(
 144         __in                    efx_nic_t *enp,
 145         __in                    efx_nvram_type_t type,
 146         __out                   size_t *sizep);
 147 
 148 extern  __checkReturn           int
 149 falcon_nvram_get_version(
 150         __in                    efx_nic_t *enp,
 151         __in                    efx_nvram_type_t type,
 152         __out                   uint32_t *subtypep,
 153         __out_ecount(4)         uint16_t version[4]);
 154 
 155 extern  __checkReturn           int
 156 falcon_nvram_rw_start(
 157         __in                    efx_nic_t *enp,
 158         __in                    efx_nvram_type_t type,
 159         __out                   size_t *pref_chunkp);
 160 
 161 extern  __checkReturn           int
 162 falcon_nvram_read_chunk(
 163         __in                    efx_nic_t *enp,
 164         __in                    efx_nvram_type_t type,
 165         __in                    unsigned int offset,
 166         __out_bcount(size)      caddr_t data,
 167         __in                    size_t size);
 168 
 169 extern   __checkReturn          int
 170 falcon_nvram_erase(
 171         __in                    efx_nic_t *enp,
 172         __in                    efx_nvram_type_t type);
 173 
 174 extern  __checkReturn           int
 175 falcon_nvram_write_chunk(
 176         __in                    efx_nic_t *enp,
 177         __in                    efx_nvram_type_t type,
 178         __in                    unsigned int offset,
 179         __in_bcount(size)       caddr_t data,
 180         __in                    size_t size);
 181 
 182 extern                          void
 183 falcon_nvram_rw_finish(
 184         __in                    efx_nic_t *enp,
 185         __in                    efx_nvram_type_t type);
 186 
 187 extern  __checkReturn           int
 188 falcon_nvram_set_version(
 189         __in                    efx_nic_t *enp,
 190         __in                    efx_nvram_type_t type,
 191         __out                   uint16_t version[4]);
 192 
 193 #endif  /* EFSYS_OPT_NVRAM */
 194 
 195 extern                          void
 196 falcon_nvram_fini(
 197         __in                    efx_nic_t *enp);
 198 
 199 #if EFSYS_OPT_VPD
 200 
 201 extern  __checkReturn           int
 202 falcon_vpd_size(
 203         __in                    efx_nic_t *enp,
 204         __out                   size_t *sizep);
 205 
 206 extern  __checkReturn           int
 207 falcon_vpd_read(
 208         __in                    efx_nic_t *enp,
 209         __out_bcount(size)      caddr_t data,
 210         __in                    size_t size);
 211 
 212 extern  __checkReturn           int
 213 falcon_vpd_verify(
 214         __in                    efx_nic_t *enp,
 215         __in_bcount(size)       caddr_t data,
 216         __in                    size_t size);
 217 
 218 extern  __checkReturn           int
 219 falcon_vpd_get(
 220         __in                    efx_nic_t *enp,
 221         __in_bcount(size)       caddr_t data,
 222         __in                    size_t size,
 223         __inout                 efx_vpd_value_t *evvp);
 224 
 225 extern  __checkReturn           int
 226 falcon_vpd_set(
 227         __in                    efx_nic_t *enp,
 228         __in_bcount(size)       caddr_t data,
 229         __in                    size_t size,
 230         __in                    efx_vpd_value_t *evvp);
 231 
 232 extern  __checkReturn           int
 233 falcon_vpd_next(
 234         __in                    efx_nic_t *enp,
 235         __in_bcount(size)       caddr_t data,
 236         __in                    size_t size,
 237         __out                   efx_vpd_value_t *evvp,
 238         __inout                 unsigned int *contp);
 239 
 240 extern __checkReturn            int
 241 falcon_vpd_write(
 242         __in                    efx_nic_t *enp,
 243         __in_bcount(size)       caddr_t data,
 244         __in                    size_t size);
 245 
 246 #endif  /* EFSYS_OPT_VPD */
 247 
 248 extern  __checkReturn   int
 249 falcon_sram_init(
 250         __in            efx_nic_t *enp);
 251 
 252 #if EFSYS_OPT_DIAG
 253 
 254 extern  __checkReturn   int
 255 falcon_sram_test(
 256         __in            efx_nic_t *enp,
 257         __in            efx_sram_pattern_fn_t func);
 258 
 259 #endif  /* EFSYS_OPT_DIAG */
 260 
 261 extern          void
 262 falcon_sram_fini(
 263         __in    efx_nic_t *enp);
 264 
 265 extern  __checkReturn   int
 266 falcon_i2c_check(
 267         __in            efx_nic_t *enp,
 268         __in            uint8_t devid);
 269 
 270 extern  __checkReturn           int
 271 falcon_i2c_read(
 272         __in                    efx_nic_t *enp,
 273         __in                    uint8_t devid,
 274         __in                    uint8_t addr,
 275         __out_bcount(size)      caddr_t base,
 276         __in                    size_t size);
 277 
 278 extern  __checkReturn           int
 279 falcon_i2c_write(
 280         __in                    efx_nic_t *enp,
 281         __in                    uint8_t devid,
 282         __in                    uint8_t addr,
 283         __in_bcount(size)       caddr_t base,
 284         __in                    size_t size);
 285 
 286 #if EFSYS_OPT_PHY_NULL
 287 
 288 extern  __checkReturn           int
 289 falcon_i2c_recv(
 290         __in                    efx_nic_t *enp,
 291         __in                    uint8_t devid,
 292         __out_bcount(size)      caddr_t base,
 293         __in                    size_t size);
 294 
 295 extern  __checkReturn           int
 296 falcon_i2c_send(
 297         __in                    efx_nic_t *enp,
 298         __in                    uint8_t devid,
 299         __in_bcount(size)       caddr_t base,
 300         __in                    size_t size);
 301 
 302 #endif  /* EFSYS_OPT_PHY_NULL */
 303 
 304 extern  __checkReturn   int
 305 falcon_mdio_write(
 306         __in            efx_nic_t *enp,
 307         __in            uint8_t port,
 308         __in            uint8_t mmd,
 309         __in            uint16_t reg,
 310         __in            efx_word_t *ewp);
 311 
 312 extern  __checkReturn   int
 313 falcon_mdio_read(
 314         __in            efx_nic_t *enp,
 315         __in            uint8_t port,
 316         __in            uint8_t mmd,
 317         __in            uint16_t reg,
 318         __out           efx_word_t *ewp);
 319 
 320 #if EFSYS_OPT_MAC_STATS
 321 
 322 extern  __checkReturn                   int
 323 falcon_mac_stats_upload(
 324         __in                            efx_nic_t *enp,
 325         __in                            efsys_mem_t *esmp);
 326 
 327 #endif  /* EFSYS_OPT_MAC_STATS */
 328 
 329 extern  __checkReturn   int
 330 falcon_mac_poll(
 331        __in             efx_nic_t *enp,
 332        __out            efx_link_mode_t *link_modep);
 333 
 334 extern  __checkReturn   int
 335 falcon_mac_up(
 336         __in            efx_nic_t *enp,
 337         __out           boolean_t *mac_upp);
 338 
 339 #if EFSYS_OPT_LOOPBACK
 340 
 341 extern  __checkReturn   int
 342 falcon_mac_loopback_set(
 343         __in            efx_nic_t *enp,
 344         __in            efx_link_mode_t link_mode,
 345         __in            efx_loopback_type_t loopback_type);
 346 
 347 #endif  /* EFSYS_OPT_LOOPBACK */
 348 
 349 typedef enum falcon_spi_type_e {
 350         FALCON_SPI_FLASH = 0,
 351         FALCON_SPI_EEPROM,
 352         FALCON_SPI_NTYPES
 353 } falcon_spi_type_t;
 354 
 355 extern  __checkReturn           int
 356 falcon_spi_dev_read(
 357         __in                    efx_nic_t *enp,
 358         __in                    falcon_spi_type_t type,
 359         __in                    uint32_t addr,
 360         __out_bcount(size)      caddr_t base,
 361         __in                    size_t size);
 362 
 363 extern  __checkReturn           int
 364 falcon_spi_dev_write(
 365         __in                    efx_nic_t *enp,
 366         __in                    falcon_spi_type_t type,
 367         __in                    uint32_t addr,
 368         __in_bcount(size)       caddr_t base,
 369         __in                    size_t size);
 370 
 371 extern  __checkReturn           int
 372 falcon_spi_dev_erase(
 373         __in                    efx_nic_t *enp,
 374         __in                    falcon_spi_type_t type,
 375         __in                    uint32_t addr,
 376         __in                    size_t size);
 377 
 378 #ifdef  __cplusplus
 379 }
 380 #endif
 381 
 382 #endif  /* _SYS_FALCON_IMPL_H */