Print this page
212 Atheros AR8132 / L1c Gigabit Ethernet Adapter


   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 /*


 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;


 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         /*


 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;




   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 /*


 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;


 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         /*


 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;