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 (c) 2012 Gary Mills
  23  *
  24  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  25  * Use is subject to license terms.
  26  */
  27 
  28 #ifndef _ATGE_H
  29 #define _ATGE_H
  30 
  31 #ifdef __cplusplus
  32         extern "C" {
  33 #endif
  34 
  35 #include <sys/ethernet.h>
  36 #include <sys/mac_provider.h>
  37 #include "atge_l1e_reg.h"
  38 #include "atge_l1c_reg.h"
  39 
  40 #define ATGE_PCI_REG_NUMBER     1
  41 
  42 #define ROUNDUP(x, a)           (((x) + (a) - 1) & ~((a) - 1))
  43 
  44 /*
  45  * Flags.
  46  */
  47 #define ATGE_FLAG_PCIE          0x0001
  48 #define ATGE_FIXED_TYPE         0x0002
  49 #define ATGE_MSI_TYPE           0x0004
  50 #define ATGE_MSIX_TYPE          0x0008
  51 #define ATGE_FLAG_FASTETHER     0x0010
  52 #define ATGE_FLAG_JUMBO         0x0020
  53 #define ATGE_MII_CHECK          0x0040
  54 #define ATGE_FLAG_ASPM_MON      0x0080
  55 #define ATGE_FLAG_CMB_BUG       0x0100
  56 #define ATGE_FLAG_SMB_BUG       0x0200
  57 #define ATGE_FLAG_APS           0x1000
  58 
  59 #define ATGE_CHIP_L1_DEV_ID     0x1048
  60 #define ATGE_CHIP_L2_DEV_ID     0x2048
  61 #define ATGE_CHIP_L1E_DEV_ID    0x1026
  62 #define ATGE_CHIP_L1CG_DEV_ID   0x1063
  63 #define ATGE_CHIP_L1CF_DEV_ID   0x1062
  64 #define ATGE_CHIP_AR8151V1_DEV_ID       0x1073
  65 #define ATGE_CHIP_AR8151V2_DEV_ID       0x1083
  66 #define ATGE_CHIP_AR8152V1_DEV_ID       0x2060
  67 #define ATGE_CHIP_AR8152V2_DEV_ID       0x2062
  68 
  69 #define ATGE_PROMISC            0x001
  70 #define ATGE_ALL_MULTICST       0x002
  71 
  72 /*
  73  * Timer for one second interval.
  74  */
  75 #define ATGE_TIMER_INTERVAL     (1000 * 1000 * 1000)
  76 
  77 /*
  78  * Chip state.
  79  */
  80 #define ATGE_CHIP_INITIALIZED   0x0001
  81 #define ATGE_CHIP_RUNNING       0x0002
  82 #define ATGE_CHIP_STOPPED       0x0004
  83 #define ATGE_CHIP_SUSPENDED     0x0008
  84 
  85 #define ETHER_CRC_LEN           0x4
  86 
  87 /*
  88  * Descriptor increment and decrment operation.
  89  */
  90 #define ATGE_INC_SLOT(x, y)     \
  91         ((x) = ((x) + 1) % (y))
  92 
  93 #define ATGE_DEC_SLOT(x, y)     \
  94         (x = ((x + y - 1) % y))
  95 
  96 /*
  97  * I/O instructions
  98  */
  99 #define OUTB(atge, p, v)  \
 100         ddi_put8((atge)->atge_io_handle, \
 101                 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
 102 
 103 #define OUTW(atge, p, v)  \
 104         ddi_put16((atge)->atge_io_handle, \
 105                 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
 106 
 107 #define OUTL(atge, p, v)  \
 108         ddi_put32((atge)->atge_io_handle, \
 109                 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
 110 
 111 #define INB(atge, p)      \
 112         ddi_get8((atge)->atge_io_handle, \
 113                 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
 114 #define INW(atge, p)      \
 115         ddi_get16((atge)->atge_io_handle, \
 116                 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
 117 
 118 #define INL(atge, p)      \
 119         ddi_get32((atge)->atge_io_handle, \
 120                 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
 121 
 122 #define FLUSH(atge, reg) \
 123         (void) INL(atge, reg)
 124 
 125 #define OUTL_OR(atge, reg, v) \
 126         OUTL(atge, reg, (INL(atge, reg) | v))
 127 
 128 #define OUTL_AND(atge, reg, v) \
 129         OUTL(atge, reg, (INL(atge, reg) & v))
 130 
 131 /*
 132  * Descriptor and other endianess aware access.
 133  */
 134 #define ATGE_PUT64(dma, addr, v) \
 135         ddi_put64(dma->acchdl, (addr), (v))
 136 
 137 #define ATGE_PUT32(dma, addr, v) \
 138         ddi_put32(dma->acchdl, (addr), (v))
 139 
 140 #define ATGE_GET32(dma, addr) \
 141         ddi_get32(dma->acchdl, (addr))
 142 
 143 #define ATGE_GET64(dma, addr) \
 144         ddi_get64(dma->acchdl, (addr))
 145 
 146 #define DMA_SYNC(dma, s, l, d)  \
 147         (void) ddi_dma_sync(dma->hdl, (off_t)(s), (l), d)
 148 
 149 
 150 #define ATGE_ADDR_LO(x)         ((uint64_t)(x) & 0xFFFFFFFF)
 151 #define ATGE_ADDR_HI(x)         ((uint64_t)(x) >> 32)
 152 
 153 
 154 /*
 155  * General purpose macros.
 156  */
 157 #define ATGE_MODEL(atgep)       atgep->atge_model
 158 #define ATGE_VID(atgep)         atgep->atge_vid
 159 #define ATGE_DID(atgep)         atgep->atge_did
 160 
 161 /*
 162  * Different type of chip models.
 163  */
 164 typedef enum {
 165         ATGE_CHIP_L1 = 1,
 166         ATGE_CHIP_L2,
 167         ATGE_CHIP_L1E,
 168         ATGE_CHIP_L1C,
 169 } atge_model_t;
 170 
 171 typedef struct  atge_cards {
 172         uint16_t        vendor_id;      /* PCI vendor id */
 173         uint16_t        device_id;      /* PCI device id */
 174         char            *cardname;      /* Description of the card */
 175         atge_model_t    model;          /* Model of the card */
 176 } atge_cards_t;
 177 
 178 /*
 179  * Number of Descriptors for TX and RX Ring.
 180  */
 181 #define ATGE_TX_NUM_DESC        256
 182 #define ATGE_RX_NUM_DESC        256
 183 
 184 /*
 185  * DMA Handle for all DMA work.
 186  */
 187 typedef struct  atge_dma_data {
 188         ddi_dma_handle_t        hdl;
 189         ddi_acc_handle_t        acchdl;
 190         ddi_dma_cookie_t        cookie;
 191         caddr_t                 addr;
 192         size_t                  len;
 193         uint_t                  count;
 194 } atge_dma_t;
 195 
 196 struct  atge;
 197 
 198 /*
 199  * Structure for ring data (TX/RX).
 200  */
 201 typedef struct  atge_ring {
 202         struct  atge    *r_atge;
 203         atge_dma_t      **r_buf_tbl;
 204         atge_dma_t      *r_desc_ring;
 205         int             r_ndesc;
 206         int             r_consumer;
 207         int             r_producer;
 208         int             r_avail_desc;
 209 } atge_ring_t;
 210 
 211 /*
 212  * L1E specific private data.
 213  */
 214 typedef struct  atge_l1e_data {
 215         atge_dma_t      **atge_l1e_rx_page;
 216         atge_dma_t      *atge_l1e_rx_cmb;
 217         int             atge_l1e_pagesize;
 218         int             atge_l1e_rx_curp;
 219         uint16_t        atge_l1e_rx_seqno;
 220         uint32_t        atge_l1e_proc_max;
 221         uint32_t        atge_l1e_rx_page_cons;
 222         uint32_t        atge_l1e_rx_page_prods[L1E_RX_PAGES];
 223 } atge_l1e_data_t;
 224 
 225 /*
 226  * L1 specific private data.
 227  */
 228 typedef struct  atge_l1_data {
 229         atge_ring_t             *atge_rx_ring;
 230         atge_dma_t              *atge_l1_cmb;
 231         atge_dma_t              *atge_l1_rr;
 232         atge_dma_t              *atge_l1_smb;
 233         int                     atge_l1_rr_consumers;
 234         uint32_t                atge_l1_intr_status;
 235         uint32_t                atge_l1_rx_prod_cons;
 236         uint32_t                atge_l1_tx_prod_cons;
 237 } atge_l1_data_t;
 238 
 239 /*
 240  * L1C specific private data.
 241  */
 242 typedef struct  atge_l1c_data {
 243         atge_ring_t             *atge_rx_ring;
 244         atge_dma_t              *atge_l1c_cmb;
 245         atge_dma_t              *atge_l1c_rr;
 246         atge_dma_t              *atge_l1c_smb;
 247         int                     atge_l1c_rr_consumers;
 248         uint32_t                atge_l1c_intr_status;
 249         uint32_t                atge_l1c_rx_prod_cons;
 250         uint32_t                atge_l1c_tx_prod_cons;
 251 } atge_l1c_data_t;
 252 
 253 /*
 254  * TX descriptor table is same with L1, L1E and L2E chips.
 255  */
 256 #pragma pack(1)
 257 typedef struct  atge_tx_desc {
 258         uint64_t        addr;
 259         uint32_t        len;
 260         uint32_t        flags;
 261 } atge_tx_desc_t;
 262 #pragma pack()
 263 
 264 #define ATGE_TX_RING_CNT                256
 265 #define ATGE_TX_RING_SZ \
 266         (sizeof (struct atge_tx_desc) * ATGE_TX_RING_CNT)
 267 
 268 /*
 269  * Private instance data structure (per-instance soft-state).
 270  */
 271 typedef struct  atge {
 272         /*
 273          * Lock for the TX ring, RX ring and interrupt. In order to align
 274          * these locks at 8-byte boundary, we have kept it at the beginning
 275          * of atge_t.
 276          */
 277         kmutex_t                atge_tx_lock;
 278         kmutex_t                atge_rx_lock;
 279         kmutex_t                atge_intr_lock;
 280         kmutex_t                atge_mii_lock;
 281         kmutex_t                atge_mbox_lock;
 282 
 283         /*
 284          * Instance number and devinfo pointer.
 285          */
 286         int                     atge_unit;
 287         dev_info_t              *atge_dip;
 288         char                    atge_name[8];
 289         atge_model_t            atge_model;
 290         uint16_t                atge_vid;
 291         uint16_t                atge_did;
 292         int                     atge_chip_rev;
 293         uint8_t                 atge_revid;
 294 
 295         /*
 296          * Mac handle.
 297          */
 298         mac_handle_t            atge_mh;
 299 
 300         /*
 301          * MII layer handle.
 302          */
 303         mii_handle_t            atge_mii;
 304         link_state_t            atge_link_state;
 305 
 306         /*
 307          * Config Space Handle.
 308          */
 309         ddi_acc_handle_t        atge_conf_handle;
 310 
 311         /*
 312          * IO registers mapped by DDI.
 313          */
 314         ddi_acc_handle_t        atge_io_handle;
 315         caddr_t                 atge_io_regs;
 316         uint_t                  atge_intrs;
 317 
 318         /*
 319          * Interrupt management structures.
 320          */
 321         ddi_intr_handle_t       *atge_intr_handle;
 322         int                     atge_intr_types;
 323         int                     atge_intr_cnt;
 324         uint_t                  atge_intr_pri;
 325         int                     atge_intr_size;
 326         int                     atge_intr_cap;
 327 
 328         /*
 329          * Common structures.
 330          */
 331         atge_ring_t             *atge_tx_ring;
 332         int                     atge_tx_resched;
 333         int                     atge_mtu;
 334         int                     atge_int_mod;
 335         int                     atge_int_rx_mod; /* L1C */
 336         int                     atge_int_tx_mod; /* L1C */
 337         int                     atge_max_frame_size;
 338 
 339 
 340         /*
 341          * Ethernet addresses.
 342          */
 343         ether_addr_t            atge_ether_addr;
 344         ether_addr_t            atge_dev_addr;
 345         uint64_t                atge_mchash;
 346         uint32_t                atge_mchash_ref_cnt[64];
 347 
 348         /*
 349          * PHY register.
 350          */
 351         int                     atge_phyaddr;
 352 
 353         /*
 354          * Flags.
 355          */
 356         int                     atge_flags;
 357         uint32_t                atge_dma_rd_burst;
 358         uint32_t                atge_dma_wr_burst;
 359         int                     atge_filter_flags;
 360         int                     atge_chip_state;
 361 
 362         /*
 363          * Private data for the chip.
 364          */
 365         void                    *atge_private_data;
 366 
 367         /*
 368          * Buffer length.
 369          */
 370         int                     atge_rx_buf_len;
 371         int                     atge_tx_buf_len;
 372 
 373         /*
 374          * Common stats.
 375          */
 376         void                    *atge_hw_stats;
 377         uint64_t                atge_ipackets;
 378         uint64_t                atge_opackets;
 379         uint64_t                atge_rbytes;
 380         uint64_t                atge_obytes;
 381         uint64_t                atge_brdcstxmt;
 382         uint64_t                atge_multixmt;
 383         uint64_t                atge_brdcstrcv;
 384         uint64_t                atge_multircv;
 385         unsigned                atge_norcvbuf;
 386         unsigned                atge_errrcv;
 387         unsigned                atge_errxmt;
 388         unsigned                atge_missed;
 389         unsigned                atge_underflow;
 390         unsigned                atge_overflow;
 391         unsigned                atge_align_errors;
 392         unsigned                atge_fcs_errors;
 393         unsigned                atge_carrier_errors;
 394         unsigned                atge_collisions;
 395         unsigned                atge_ex_collisions;
 396         unsigned                atge_tx_late_collisions;
 397         unsigned                atge_defer_xmts;
 398         unsigned                atge_first_collisions;
 399         unsigned                atge_multi_collisions;
 400         unsigned                atge_sqe_errors;
 401         unsigned                atge_macxmt_errors;
 402         unsigned                atge_macrcv_errors;
 403         unsigned                atge_toolong_errors;
 404         unsigned                atge_runt;
 405         unsigned                atge_jabber;
 406         unsigned                atge_noxmtbuf;
 407 } atge_t;
 408 
 409 /*
 410  * extern functions.
 411  */
 412 extern  void    atge_error(dev_info_t *, char *, ...);
 413 
 414 /*
 415  * Debugging Support.
 416  */
 417 #ifdef  DEBUG
 418 #define ATGE_DB(arg)    atge_debug_func arg
 419 #else
 420 #define ATGE_DB(arg)
 421 #endif
 422 
 423 extern  int     atge_debug;
 424 extern  void    atge_debug_func(char *, ...);
 425 extern  atge_dma_t      *atge_alloc_a_dma_blk(atge_t *, ddi_dma_attr_t *,
 426     int, int);
 427 extern  void    atge_free_a_dma_blk(atge_dma_t *);
 428 extern  atge_dma_t *atge_buf_alloc(atge_t *, size_t, int);
 429 extern  void    atge_buf_free(atge_dma_t *);
 430 extern  mblk_t *atge_get_mblk(int);
 431 extern  void    atge_device_restart(atge_t *);
 432 extern  int     atge_alloc_buffers(atge_ring_t *, size_t, size_t, int);
 433 extern  void    atge_free_buffers(atge_ring_t *, size_t);
 434 extern  void    atge_stop_timer(atge_t *);
 435 extern  void    atge_start_timer(atge_t *);
 436 extern  void    atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
 437 extern  uint16_t        atge_mii_read(void *, uint8_t, uint8_t);
 438 extern  void    atge_device_stop(atge_t *);
 439 extern  void    atge_tx_reclaim(atge_t *, int);
 440 
 441 
 442 #ifdef __cplusplus
 443 }
 444 #endif
 445 
 446 #endif  /* _ATGE_H */