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