1a23fd118Syl /* 2a23fd118Syl * CDDL HEADER START 3a23fd118Syl * 4a23fd118Syl * The contents of this file are subject to the terms of the 5a23fd118Syl * Common Development and Distribution License (the "License"). 6a23fd118Syl * You may not use this file except in compliance with the License. 7a23fd118Syl * 8a23fd118Syl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9a23fd118Syl * or http://www.opensolaris.org/os/licensing. 10a23fd118Syl * See the License for the specific language governing permissions 11a23fd118Syl * and limitations under the License. 12a23fd118Syl * 13a23fd118Syl * When distributing Covered Code, include this CDDL HEADER in each 14a23fd118Syl * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15a23fd118Syl * If applicable, add the following below this CDDL HEADER, with the 16a23fd118Syl * fields enclosed by brackets "[]" replaced with your own identifying 17a23fd118Syl * information: Portions Copyright [yyyy] [name of copyright owner] 18a23fd118Syl * 19a23fd118Syl * CDDL HEADER END 20a23fd118Syl */ 21a23fd118Syl 22a23fd118Syl /* 23*7eced415Sxw * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24a23fd118Syl * Use is subject to license terms. 25a23fd118Syl */ 26a23fd118Syl 27a23fd118Syl /* 28a23fd118Syl * Copyright (c) 2002-2005 Neterion, Inc. 29a23fd118Syl * All right Reserved. 30a23fd118Syl * 31a23fd118Syl * FileName : xgell.h 32a23fd118Syl * 33a23fd118Syl * Description: Link Layer driver declaration 34a23fd118Syl * 35a23fd118Syl */ 36a23fd118Syl 37a23fd118Syl #ifndef _SYS_XGELL_H 38a23fd118Syl #define _SYS_XGELL_H 39a23fd118Syl 40a23fd118Syl #pragma ident "%Z%%M% %I% %E% SMI" 41a23fd118Syl 42a23fd118Syl #include <sys/types.h> 43a23fd118Syl #include <sys/errno.h> 44a23fd118Syl #include <sys/param.h> 45a23fd118Syl #include <sys/stropts.h> 46a23fd118Syl #include <sys/stream.h> 47a23fd118Syl #include <sys/strsubr.h> 48a23fd118Syl #include <sys/kmem.h> 49a23fd118Syl #include <sys/conf.h> 50a23fd118Syl #include <sys/devops.h> 51a23fd118Syl #include <sys/ksynch.h> 52a23fd118Syl #include <sys/stat.h> 53a23fd118Syl #include <sys/modctl.h> 54a23fd118Syl #include <sys/debug.h> 55a23fd118Syl #include <sys/pci.h> 56a23fd118Syl #include <sys/ethernet.h> 57a23fd118Syl #include <sys/vlan.h> 58a23fd118Syl #include <sys/dlpi.h> 59a23fd118Syl #include <sys/taskq.h> 60a23fd118Syl #include <sys/cyclic.h> 61a23fd118Syl 62a23fd118Syl #include <sys/pattr.h> 63a23fd118Syl #include <sys/strsun.h> 64a23fd118Syl 65a23fd118Syl #include <sys/mac.h> 66ba2e4443Sseb #include <sys/mac_ether.h> 67a23fd118Syl 68a23fd118Syl #ifdef __cplusplus 69a23fd118Syl extern "C" { 70a23fd118Syl #endif 71a23fd118Syl 72*7eced415Sxw #define XGELL_DESC "Xframe I/II 10Gb Ethernet 1.11" 73a23fd118Syl #define XGELL_IFNAME "xge" 74a23fd118Syl #define XGELL_TX_LEVEL_LOW 8 75a23fd118Syl #define XGELL_TX_LEVEL_HIGH 32 76*7eced415Sxw #define XGELL_TX_LEVEL_CHECK 3 77*7eced415Sxw #define XGELL_MAX_RING_DEFAULT 8 78*7eced415Sxw #define XGELL_MAX_FIFO_DEFAULT 1 79a23fd118Syl 80a23fd118Syl #include <xgehal.h> 81a23fd118Syl 82*7eced415Sxw /* 83*7eced415Sxw * The definition of XGELL_RX_BUFFER_RECYCLE_CACHE is an experimental value. 84*7eced415Sxw * With this value, the lock contention between xgell_rx_buffer_recycle() 85*7eced415Sxw * and xgell_rx_1b_compl() is reduced to great extent. And multiple rx rings 86*7eced415Sxw * alleviate the lock contention further since each rx ring has its own mutex. 87*7eced415Sxw */ 88*7eced415Sxw #define XGELL_RX_BUFFER_RECYCLE_CACHE XGE_HAL_RING_RXDS_PER_BLOCK(1) * 2 89*7eced415Sxw #define MSG_SIZE 64 90*7eced415Sxw 918347601bSyl /* 928347601bSyl * These default values can be overridden by vaules in xge.conf. 938347601bSyl * In xge.conf user has to specify actual (not percentages) values. 948347601bSyl */ 958347601bSyl #define XGELL_RX_BUFFER_TOTAL XGE_HAL_RING_RXDS_PER_BLOCK(1) * 6 968347601bSyl #define XGELL_RX_BUFFER_POST_HIWAT XGE_HAL_RING_RXDS_PER_BLOCK(1) * 5 97a23fd118Syl 988347601bSyl /* Control driver to copy or DMA received packets */ 998347601bSyl #define XGELL_RX_DMA_LOWAT 256 100a23fd118Syl 101a23fd118Syl #define XGELL_RING_MAIN_QID 0 102a23fd118Syl 1038347601bSyl #if defined(__x86) 1048347601bSyl #define XGELL_TX_DMA_LOWAT 128 1058347601bSyl #else 106*7eced415Sxw #define XGELL_TX_DMA_LOWAT 512 1078347601bSyl #endif 1088347601bSyl 1098347601bSyl /* 1108347601bSyl * Try to collapse up to XGELL_RX_PKT_BURST packets into single mblk 1118347601bSyl * sequence before mac_rx() is called. 1128347601bSyl */ 1138347601bSyl #define XGELL_RX_PKT_BURST 32 1148347601bSyl 115a23fd118Syl /* About 1s */ 116a23fd118Syl #define XGE_DEV_POLL_TICKS drv_usectohz(1000000) 117a23fd118Syl 1188347601bSyl #define XGELL_LSO_MAXLEN 65535 1198347601bSyl #define XGELL_CONF_ENABLE_BY_DEFAULT 1 1208347601bSyl #define XGELL_CONF_DISABLE_BY_DEFAULT 0 1218347601bSyl 1228347601bSyl /* LRO configuration */ 123*7eced415Sxw #define XGE_HAL_DEFAULT_LRO_SG_SIZE 2 /* <=2 LRO fix not required */ 1248347601bSyl #define XGE_HAL_DEFAULT_LRO_FRM_LEN 65535 1258347601bSyl 126a23fd118Syl /* 127*7eced415Sxw * Default values for tunables used in HAL. Please refer to xgehal-config.h 128*7eced415Sxw * for more details. 129a23fd118Syl */ 130a23fd118Syl #define XGE_HAL_DEFAULT_USE_HARDCODE -1 131a23fd118Syl 132*7eced415Sxw /* Bimodal adaptive schema defaults - ENABLED */ 1338347601bSyl #define XGE_HAL_DEFAULT_BIMODAL_INTERRUPTS -1 1348347601bSyl #define XGE_HAL_DEFAULT_BIMODAL_TIMER_LO_US 24 1358347601bSyl #define XGE_HAL_DEFAULT_BIMODAL_TIMER_HI_US 256 1368347601bSyl 137*7eced415Sxw /* Interrupt moderation/utilization defaults */ 1388347601bSyl #define XGE_HAL_DEFAULT_TX_URANGE_A 5 1398347601bSyl #define XGE_HAL_DEFAULT_TX_URANGE_B 15 1408347601bSyl #define XGE_HAL_DEFAULT_TX_URANGE_C 30 1418347601bSyl #define XGE_HAL_DEFAULT_TX_UFC_A 15 1428347601bSyl #define XGE_HAL_DEFAULT_TX_UFC_B 30 1438347601bSyl #define XGE_HAL_DEFAULT_TX_UFC_C 45 1448347601bSyl #define XGE_HAL_DEFAULT_TX_UFC_D 60 145a23fd118Syl #define XGE_HAL_DEFAULT_TX_TIMER_CI_EN 1 146a23fd118Syl #define XGE_HAL_DEFAULT_TX_TIMER_AC_EN 1 1478347601bSyl #define XGE_HAL_DEFAULT_TX_TIMER_VAL 10000 1488347601bSyl #define XGE_HAL_DEFAULT_INDICATE_MAX_PKTS_B 512 /* bimodal */ 1498347601bSyl #define XGE_HAL_DEFAULT_INDICATE_MAX_PKTS_N 256 /* normal UFC */ 150a23fd118Syl #define XGE_HAL_DEFAULT_RX_URANGE_A 10 1518347601bSyl #define XGE_HAL_DEFAULT_RX_URANGE_B 30 152a23fd118Syl #define XGE_HAL_DEFAULT_RX_URANGE_C 50 1538347601bSyl #define XGE_HAL_DEFAULT_RX_UFC_A 1 1548347601bSyl #define XGE_HAL_DEFAULT_RX_UFC_B_J 2 1558347601bSyl #define XGE_HAL_DEFAULT_RX_UFC_B_N 8 1568347601bSyl #define XGE_HAL_DEFAULT_RX_UFC_C_J 4 1578347601bSyl #define XGE_HAL_DEFAULT_RX_UFC_C_N 16 1588347601bSyl #define XGE_HAL_DEFAULT_RX_UFC_D 32 159a23fd118Syl #define XGE_HAL_DEFAULT_RX_TIMER_AC_EN 1 1608347601bSyl #define XGE_HAL_DEFAULT_RX_TIMER_VAL 384 161a23fd118Syl 162a23fd118Syl #define XGE_HAL_DEFAULT_FIFO_QUEUE_LENGTH_J 2048 163a23fd118Syl #define XGE_HAL_DEFAULT_FIFO_QUEUE_LENGTH_N 4096 164a23fd118Syl #define XGE_HAL_DEFAULT_FIFO_QUEUE_INTR 0 165a23fd118Syl #define XGE_HAL_DEFAULT_FIFO_RESERVE_THRESHOLD 0 166a23fd118Syl #define XGE_HAL_DEFAULT_FIFO_MEMBLOCK_SIZE PAGESIZE 167a23fd118Syl 1688347601bSyl /* 169*7eced415Sxw * This will force HAL to allocate extra copied buffer per TXDL which 1708347601bSyl * size calculated by formula: 1718347601bSyl * 1728347601bSyl * (ALIGNMENT_SIZE * ALIGNED_FRAGS) 1738347601bSyl */ 1748347601bSyl #define XGE_HAL_DEFAULT_FIFO_ALIGNMENT_SIZE 4096 175a23fd118Syl #define XGE_HAL_DEFAULT_FIFO_MAX_ALIGNED_FRAGS 1 176a23fd118Syl #if defined(__x86) 1778347601bSyl #define XGE_HAL_DEFAULT_FIFO_FRAGS 128 178a23fd118Syl #else 1798347601bSyl #define XGE_HAL_DEFAULT_FIFO_FRAGS 64 180a23fd118Syl #endif 1818347601bSyl #define XGE_HAL_DEFAULT_FIFO_FRAGS_THRESHOLD 18 182a23fd118Syl 1838347601bSyl #define XGE_HAL_DEFAULT_RING_QUEUE_BLOCKS_J 2 1848347601bSyl #define XGE_HAL_DEFAULT_RING_QUEUE_BLOCKS_N 2 185a23fd118Syl #define XGE_HAL_RING_QUEUE_BUFFER_MODE_DEFAULT 1 1868347601bSyl #define XGE_HAL_DEFAULT_BACKOFF_INTERVAL_US 64 187a23fd118Syl #define XGE_HAL_DEFAULT_RING_PRIORITY 0 188a23fd118Syl #define XGE_HAL_DEFAULT_RING_MEMBLOCK_SIZE PAGESIZE 189a23fd118Syl 190a23fd118Syl #define XGE_HAL_DEFAULT_RING_NUM 8 191a23fd118Syl #define XGE_HAL_DEFAULT_TMAC_UTIL_PERIOD 5 192a23fd118Syl #define XGE_HAL_DEFAULT_RMAC_UTIL_PERIOD 5 193a23fd118Syl #define XGE_HAL_DEFAULT_RMAC_HIGH_PTIME 65535 194a23fd118Syl #define XGE_HAL_DEFAULT_MC_PAUSE_THRESHOLD_Q0Q3 187 195a23fd118Syl #define XGE_HAL_DEFAULT_MC_PAUSE_THRESHOLD_Q4Q7 187 1968347601bSyl #define XGE_HAL_DEFAULT_RMAC_PAUSE_GEN_EN 1 1978347601bSyl #define XGE_HAL_DEFAULT_RMAC_PAUSE_GEN_DIS 0 1988347601bSyl #define XGE_HAL_DEFAULT_RMAC_PAUSE_RCV_EN 1 1998347601bSyl #define XGE_HAL_DEFAULT_RMAC_PAUSE_RCV_DIS 0 200a23fd118Syl #define XGE_HAL_DEFAULT_INITIAL_MTU XGE_HAL_DEFAULT_MTU /* 1500 */ 2018347601bSyl #define XGE_HAL_DEFAULT_ISR_POLLING_CNT 0 202a23fd118Syl #define XGE_HAL_DEFAULT_LATENCY_TIMER 255 203*7eced415Sxw #define XGE_HAL_DEFAULT_SHARED_SPLITS 0 204a23fd118Syl #define XGE_HAL_DEFAULT_STATS_REFRESH_TIME 1 205a23fd118Syl 206*7eced415Sxw #if defined(__sparc) 207*7eced415Sxw #define XGE_HAL_DEFAULT_MMRB_COUNT \ 208*7eced415Sxw XGE_HAL_MAX_MMRB_COUNT 209*7eced415Sxw #define XGE_HAL_DEFAULT_SPLIT_TRANSACTION \ 210*7eced415Sxw XGE_HAL_EIGHT_SPLIT_TRANSACTION 211*7eced415Sxw #else 212*7eced415Sxw #define XGE_HAL_DEFAULT_MMRB_COUNT 1 /* 1k */ 213*7eced415Sxw #define XGE_HAL_DEFAULT_SPLIT_TRANSACTION \ 214*7eced415Sxw XGE_HAL_TWO_SPLIT_TRANSACTION 215*7eced415Sxw #endif 216*7eced415Sxw 217a23fd118Syl /* 218a23fd118Syl * default the size of buffers allocated for ndd interface functions 219a23fd118Syl */ 220*7eced415Sxw #define XGELL_STATS_BUFSIZE 8192 221a23fd118Syl #define XGELL_PCICONF_BUFSIZE 2048 222a23fd118Syl #define XGELL_ABOUT_BUFSIZE 512 223a23fd118Syl #define XGELL_IOCTL_BUFSIZE 64 224*7eced415Sxw #define XGELL_DEVCONF_BUFSIZE 8192 225a23fd118Syl 226a23fd118Syl /* 227a23fd118Syl * xgell_event_e 228a23fd118Syl * 229a23fd118Syl * This enumeration derived from xgehal_event_e. It extends it 230a23fd118Syl * for the reason to get serialized context. 231a23fd118Syl */ 232a23fd118Syl /* Renamb the macro from HAL */ 233a23fd118Syl #define XGELL_EVENT_BASE XGE_LL_EVENT_BASE 234a23fd118Syl typedef enum xgell_event_e { 235a23fd118Syl /* LL events */ 236a23fd118Syl XGELL_EVENT_RESCHED_NEEDED = XGELL_EVENT_BASE + 1, 237a23fd118Syl } xgell_event_e; 238a23fd118Syl 239a23fd118Syl typedef struct { 2408347601bSyl int rx_pkt_burst; 241a23fd118Syl int rx_buffer_total; 242a23fd118Syl int rx_buffer_post_hiwat; 2438347601bSyl int rx_dma_lowat; 2448347601bSyl int tx_dma_lowat; 245*7eced415Sxw int msix_enable; 2468347601bSyl int lso_enable; 247a23fd118Syl } xgell_config_t; 248a23fd118Syl 249*7eced415Sxw typedef struct xgell_ring xgell_ring_t; 250*7eced415Sxw typedef struct xgell_fifo xgell_fifo_t; 251*7eced415Sxw 252a23fd118Syl typedef struct xgell_rx_buffer_t { 253a23fd118Syl struct xgell_rx_buffer_t *next; 254a23fd118Syl void *vaddr; 255a23fd118Syl dma_addr_t dma_addr; 256a23fd118Syl ddi_dma_handle_t dma_handle; 257a23fd118Syl ddi_acc_handle_t dma_acch; 258*7eced415Sxw xgell_ring_t *ring; 259a23fd118Syl frtn_t frtn; 260a23fd118Syl } xgell_rx_buffer_t; 261a23fd118Syl 262a23fd118Syl /* Buffer pool for all rings */ 263a23fd118Syl typedef struct xgell_rx_buffer_pool_t { 264a23fd118Syl uint_t total; /* total buffers */ 265a23fd118Syl uint_t size; /* buffer size */ 266a23fd118Syl xgell_rx_buffer_t *head; /* header pointer */ 267a23fd118Syl uint_t free; /* free buffers */ 268a23fd118Syl uint_t post; /* posted buffers */ 269a23fd118Syl uint_t post_hiwat; /* hiwat to stop post */ 270a23fd118Syl spinlock_t pool_lock; /* buffer pool lock */ 271*7eced415Sxw xgell_rx_buffer_t *recycle_head; /* recycle list's head */ 272*7eced415Sxw xgell_rx_buffer_t *recycle_tail; /* recycle list's tail */ 273*7eced415Sxw uint_t recycle; /* # of rx buffers recycled */ 274*7eced415Sxw spinlock_t recycle_lock; /* buffer recycle lock */ 275a23fd118Syl } xgell_rx_buffer_pool_t; 276a23fd118Syl 277ba2e4443Sseb typedef struct xgelldev xgelldev_t; 278ba2e4443Sseb 279*7eced415Sxw struct xgell_ring { 280a23fd118Syl xge_hal_channel_h channelh; 281ba2e4443Sseb xgelldev_t *lldev; 282a23fd118Syl mac_resource_handle_t handle; /* per ring cookie */ 283*7eced415Sxw xgell_rx_buffer_pool_t bf_pool; 284*7eced415Sxw }; 285*7eced415Sxw 286*7eced415Sxw struct xgell_fifo { 287*7eced415Sxw xge_hal_channel_h channelh; 288*7eced415Sxw xgelldev_t *lldev; 289*7eced415Sxw int level_low; 290*7eced415Sxw }; 291a23fd118Syl 292ba2e4443Sseb struct xgelldev { 293a23fd118Syl caddr_t ndp; 294ba2e4443Sseb mac_handle_t mh; 295a23fd118Syl int instance; 296a23fd118Syl dev_info_t *dev_info; 297a23fd118Syl xge_hal_device_h devh; 298*7eced415Sxw xgell_ring_t rings[XGE_HAL_MAX_RING_NUM]; 299*7eced415Sxw xgell_fifo_t fifos[XGE_HAL_MAX_FIFO_NUM]; 300a23fd118Syl int resched_avail; 301a23fd118Syl int resched_send; 302a23fd118Syl int resched_retry; 3038347601bSyl int tx_copied_max; 304a23fd118Syl volatile int is_initialized; 305a23fd118Syl xgell_config_t config; 306a23fd118Syl volatile int in_reset; 307a23fd118Syl timeout_id_t timeout_id; 308a23fd118Syl kmutex_t genlock; 309*7eced415Sxw ddi_intr_handle_t *intr_table; 310*7eced415Sxw uint_t intr_table_size; 311*7eced415Sxw int intr_type; 312*7eced415Sxw int intr_cnt; 313*7eced415Sxw uint_t intr_pri; 314*7eced415Sxw int intr_cap; 315ba2e4443Sseb }; 316a23fd118Syl 317a23fd118Syl typedef struct { 318a23fd118Syl mblk_t *mblk; 319a23fd118Syl ddi_dma_handle_t dma_handles[XGE_HAL_DEFAULT_FIFO_FRAGS]; 320a23fd118Syl int handle_cnt; 321a23fd118Syl } xgell_txd_priv_t; 322a23fd118Syl 323a23fd118Syl typedef struct { 324a23fd118Syl xgell_rx_buffer_t *rx_buffer; 325a23fd118Syl } xgell_rxd_priv_t; 326a23fd118Syl 327a23fd118Syl int xgell_device_alloc(xge_hal_device_h devh, dev_info_t *dev_info, 328a23fd118Syl xgelldev_t **lldev_out); 329a23fd118Syl 330a23fd118Syl void xgell_device_free(xgelldev_t *lldev); 331a23fd118Syl 332a23fd118Syl int xgell_device_register(xgelldev_t *lldev, xgell_config_t *config); 333a23fd118Syl 334a23fd118Syl int xgell_device_unregister(xgelldev_t *lldev); 335a23fd118Syl 336a23fd118Syl void xgell_callback_link_up(void *userdata); 337a23fd118Syl 338a23fd118Syl void xgell_callback_link_down(void *userdata); 339a23fd118Syl 340a23fd118Syl int xgell_onerr_reset(xgelldev_t *lldev); 341a23fd118Syl 342a23fd118Syl void xge_device_poll_now(void *data); 343a23fd118Syl 344*7eced415Sxw int xge_add_intrs(xgelldev_t *lldev); 345*7eced415Sxw 346*7eced415Sxw int xge_enable_intrs(xgelldev_t *lldev); 347*7eced415Sxw 348*7eced415Sxw void xge_disable_intrs(xgelldev_t *lldev); 349*7eced415Sxw 350*7eced415Sxw void xge_rem_intrs(xgelldev_t *lldev); 351*7eced415Sxw 352*7eced415Sxw 353*7eced415Sxw 354*7eced415Sxw 355a23fd118Syl #ifdef __cplusplus 356a23fd118Syl } 357a23fd118Syl #endif 358a23fd118Syl 359a23fd118Syl #endif /* _SYS_XGELL_H */ 360