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