108057504Sxy150489 /* 208057504Sxy150489 * This file is provided under a CDDLv1 license. When using or 308057504Sxy150489 * redistributing this file, you may do so under this license. 408057504Sxy150489 * In redistributing this file this license must be included 508057504Sxy150489 * and no other modification of this header file is permitted. 608057504Sxy150489 * 708057504Sxy150489 * CDDL LICENSE SUMMARY 808057504Sxy150489 * 9d5c3073dSchenlu chen - Sun Microsystems - Beijing China * Copyright(c) 1999 - 2009 Intel Corporation. All rights reserved. 1008057504Sxy150489 * 1108057504Sxy150489 * The contents of this file are subject to the terms of Version 1208057504Sxy150489 * 1.0 of the Common Development and Distribution License (the "License"). 1308057504Sxy150489 * 1408057504Sxy150489 * You should have received a copy of the License with this software. 1508057504Sxy150489 * You can obtain a copy of the License at 1608057504Sxy150489 * http://www.opensolaris.org/os/licensing. 1708057504Sxy150489 * See the License for the specific language governing permissions 1808057504Sxy150489 * and limitations under the License. 1908057504Sxy150489 */ 2008057504Sxy150489 2108057504Sxy150489 /* 223fb4efefSchangqing li - Sun Microsystems - Beijing China * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 2329fd2c16SDavid Höppner * Copyright 2012 David Höppner. All rights reserved. 24*4d210590SRobert Mustacchi * Copyright (c) 2017, Joyent, Inc. 2508057504Sxy150489 */ 2608057504Sxy150489 2708057504Sxy150489 #ifndef _E1000G_SW_H 2808057504Sxy150489 #define _E1000G_SW_H 2908057504Sxy150489 3008057504Sxy150489 #ifdef __cplusplus 3108057504Sxy150489 extern "C" { 3208057504Sxy150489 #endif 3308057504Sxy150489 3408057504Sxy150489 /* 3508057504Sxy150489 * ********************************************************************** 3608057504Sxy150489 * Module Name: * 3708057504Sxy150489 * e1000g_sw.h * 3808057504Sxy150489 * * 3908057504Sxy150489 * Abstract: * 4008057504Sxy150489 * This header file contains Software-related data structures * 4108057504Sxy150489 * definitions. * 4208057504Sxy150489 * * 4308057504Sxy150489 * ********************************************************************** 4408057504Sxy150489 */ 4508057504Sxy150489 4608057504Sxy150489 #include <sys/types.h> 4708057504Sxy150489 #include <sys/conf.h> 4808057504Sxy150489 #include <sys/debug.h> 4908057504Sxy150489 #include <sys/stropts.h> 5008057504Sxy150489 #include <sys/stream.h> 5108057504Sxy150489 #include <sys/strsun.h> 5208057504Sxy150489 #include <sys/strlog.h> 5308057504Sxy150489 #include <sys/kmem.h> 5408057504Sxy150489 #include <sys/stat.h> 5508057504Sxy150489 #include <sys/kstat.h> 5608057504Sxy150489 #include <sys/modctl.h> 5708057504Sxy150489 #include <sys/errno.h> 58da14cebeSEric Cheng #include <sys/mac_provider.h> 5908057504Sxy150489 #include <sys/mac_ether.h> 6008057504Sxy150489 #include <sys/vlan.h> 6108057504Sxy150489 #include <sys/ddi.h> 6208057504Sxy150489 #include <sys/sunddi.h> 6347b7744cSyy150190 #include <sys/disp.h> 6408057504Sxy150489 #include <sys/pci.h> 6508057504Sxy150489 #include <sys/sdt.h> 6608057504Sxy150489 #include <sys/ethernet.h> 6708057504Sxy150489 #include <sys/pattr.h> 6808057504Sxy150489 #include <sys/strsubr.h> 6908057504Sxy150489 #include <sys/netlb.h> 7008057504Sxy150489 #include <inet/common.h> 7108057504Sxy150489 #include <inet/ip.h> 72c7770590Smx205022 #include <inet/tcp.h> 7308057504Sxy150489 #include <inet/mi.h> 7408057504Sxy150489 #include <inet/nd.h> 759b6541b3Sgl147354 #include <sys/ddifm.h> 769b6541b3Sgl147354 #include <sys/fm/protocol.h> 779b6541b3Sgl147354 #include <sys/fm/util.h> 789b6541b3Sgl147354 #include <sys/fm/io/ddi.h> 7925f2d433Sxy150489 #include "e1000_api.h" 8008057504Sxy150489 81d5c3073dSchenlu chen - Sun Microsystems - Beijing China /* Driver states */ 82d5c3073dSchenlu chen - Sun Microsystems - Beijing China #define E1000G_UNKNOWN 0x00 83d5c3073dSchenlu chen - Sun Microsystems - Beijing China #define E1000G_INITIALIZED 0x01 84d5c3073dSchenlu chen - Sun Microsystems - Beijing China #define E1000G_STARTED 0x02 85d5c3073dSchenlu chen - Sun Microsystems - Beijing China #define E1000G_SUSPENDED 0x04 86d5c3073dSchenlu chen - Sun Microsystems - Beijing China #define E1000G_ERROR 0x80 87d5c3073dSchenlu chen - Sun Microsystems - Beijing China 8808057504Sxy150489 #define JUMBO_FRAG_LENGTH 4096 8908057504Sxy150489 9008057504Sxy150489 #define LAST_RAR_ENTRY (E1000_RAR_ENTRIES - 1) 9108057504Sxy150489 #define MAX_NUM_UNICAST_ADDRESSES E1000_RAR_ENTRIES 920c56b8d9Schangqing li - Sun Microsystems - Beijing China #define MCAST_ALLOC_SIZE 256 9308057504Sxy150489 94c7770590Smx205022 /* 9543a17687SMiles Xu, Sun Microsystems * MAX_COOKIES = max_LSO_packet_size(65535 + ethernet_header_len)/page_size 9643a17687SMiles Xu, Sun Microsystems * + one for cross page split 974d737963Sxiangtao you - Sun Microsystems - Beijing China * MAX_TX_DESC_PER_PACKET = MAX_COOKIES + one for the context descriptor + 98c7770590Smx205022 * two for the workaround of the 82546 chip 99c7770590Smx205022 */ 1004d737963Sxiangtao you - Sun Microsystems - Beijing China #define MAX_COOKIES 18 1014d737963Sxiangtao you - Sun Microsystems - Beijing China #define MAX_TX_DESC_PER_PACKET 21 10208057504Sxy150489 10308057504Sxy150489 /* 10408057504Sxy150489 * constants used in setting flow control thresholds 10508057504Sxy150489 */ 10608057504Sxy150489 #define E1000_PBA_MASK 0xffff 10708057504Sxy150489 #define E1000_PBA_SHIFT 10 10808057504Sxy150489 #define E1000_FC_HIGH_DIFF 0x1638 /* High: 5688 bytes below Rx FIFO size */ 10908057504Sxy150489 #define E1000_FC_LOW_DIFF 0x1640 /* Low: 5696 bytes below Rx FIFO size */ 11008057504Sxy150489 #define E1000_FC_PAUSE_TIME 0x0680 /* 858 usec */ 11108057504Sxy150489 11225f2d433Sxy150489 #define MAX_NUM_TX_DESCRIPTOR 4096 11325f2d433Sxy150489 #define MAX_NUM_RX_DESCRIPTOR 4096 11425f2d433Sxy150489 #define MAX_NUM_RX_FREELIST 4096 11525f2d433Sxy150489 #define MAX_NUM_TX_FREELIST 4096 11625f2d433Sxy150489 #define MAX_RX_LIMIT_ON_INTR 4096 11725f2d433Sxy150489 #define MAX_RX_INTR_DELAY 65535 11825f2d433Sxy150489 #define MAX_RX_INTR_ABS_DELAY 65535 11925f2d433Sxy150489 #define MAX_TX_INTR_DELAY 65535 12025f2d433Sxy150489 #define MAX_TX_INTR_ABS_DELAY 65535 12125f2d433Sxy150489 #define MAX_INTR_THROTTLING 65535 12225f2d433Sxy150489 #define MAX_RX_BCOPY_THRESHOLD E1000_RX_BUFFER_SIZE_2K 12325f2d433Sxy150489 #define MAX_TX_BCOPY_THRESHOLD E1000_TX_BUFFER_SIZE_2K 1240c56b8d9Schangqing li - Sun Microsystems - Beijing China #define MAX_MCAST_NUM 8192 12508057504Sxy150489 12625f2d433Sxy150489 #define MIN_NUM_TX_DESCRIPTOR 80 12725f2d433Sxy150489 #define MIN_NUM_RX_DESCRIPTOR 80 12825f2d433Sxy150489 #define MIN_NUM_RX_FREELIST 64 12925f2d433Sxy150489 #define MIN_NUM_TX_FREELIST 80 13025f2d433Sxy150489 #define MIN_RX_LIMIT_ON_INTR 16 13125f2d433Sxy150489 #define MIN_RX_INTR_DELAY 0 13225f2d433Sxy150489 #define MIN_RX_INTR_ABS_DELAY 0 13325f2d433Sxy150489 #define MIN_TX_INTR_DELAY 0 13425f2d433Sxy150489 #define MIN_TX_INTR_ABS_DELAY 0 13525f2d433Sxy150489 #define MIN_INTR_THROTTLING 0 13625f2d433Sxy150489 #define MIN_RX_BCOPY_THRESHOLD 0 1379ce7e93cScc210113 #define MIN_TX_BCOPY_THRESHOLD ETHERMIN 1380c56b8d9Schangqing li - Sun Microsystems - Beijing China #define MIN_MCAST_NUM 8 13908057504Sxy150489 14025f2d433Sxy150489 #define DEFAULT_NUM_RX_DESCRIPTOR 2048 14125f2d433Sxy150489 #define DEFAULT_NUM_TX_DESCRIPTOR 2048 14225f2d433Sxy150489 #define DEFAULT_NUM_RX_FREELIST 4096 14347b7744cSyy150190 #define DEFAULT_NUM_TX_FREELIST 2304 1441bc1c721Sguoqing zhu - Sun Microsystems - Beijing China #define DEFAULT_JUMBO_NUM_RX_DESC 1024 1451bc1c721Sguoqing zhu - Sun Microsystems - Beijing China #define DEFAULT_JUMBO_NUM_TX_DESC 1024 1461bc1c721Sguoqing zhu - Sun Microsystems - Beijing China #define DEFAULT_JUMBO_NUM_RX_BUF 2048 1471bc1c721Sguoqing zhu - Sun Microsystems - Beijing China #define DEFAULT_JUMBO_NUM_TX_BUF 1152 14847b7744cSyy150190 #define DEFAULT_RX_LIMIT_ON_INTR 128 1493fb4efefSchangqing li - Sun Microsystems - Beijing China #define RX_FREELIST_INCREASE_SIZE 512 15025f2d433Sxy150489 15147b7744cSyy150190 #ifdef __sparc 15247b7744cSyy150190 #define MAX_INTR_PER_SEC 7100 15347b7744cSyy150190 #define MIN_INTR_PER_SEC 3000 15447b7744cSyy150190 #define DEFAULT_INTR_PACKET_LOW 5 15547b7744cSyy150190 #define DEFAULT_INTR_PACKET_HIGH 128 15647b7744cSyy150190 #else 15747b7744cSyy150190 #define MAX_INTR_PER_SEC 15000 15847b7744cSyy150190 #define MIN_INTR_PER_SEC 4000 15947b7744cSyy150190 #define DEFAULT_INTR_PACKET_LOW 10 16047b7744cSyy150190 #define DEFAULT_INTR_PACKET_HIGH 48 16147b7744cSyy150190 #endif 16247b7744cSyy150190 16347b7744cSyy150190 #define DEFAULT_RX_INTR_DELAY 0 16447b7744cSyy150190 #define DEFAULT_RX_INTR_ABS_DELAY 64 16547b7744cSyy150190 #define DEFAULT_TX_INTR_DELAY 64 16647b7744cSyy150190 #define DEFAULT_TX_INTR_ABS_DELAY 64 16747b7744cSyy150190 #define DEFAULT_INTR_THROTTLING_HIGH 1000000000/(MIN_INTR_PER_SEC*256) 16847b7744cSyy150190 #define DEFAULT_INTR_THROTTLING_LOW 1000000000/(MAX_INTR_PER_SEC*256) 16947b7744cSyy150190 #define DEFAULT_INTR_THROTTLING DEFAULT_INTR_THROTTLING_LOW 17047b7744cSyy150190 17147b7744cSyy150190 #define DEFAULT_RX_BCOPY_THRESHOLD 128 17247b7744cSyy150190 #define DEFAULT_TX_BCOPY_THRESHOLD 512 17347b7744cSyy150190 #define DEFAULT_TX_UPDATE_THRESHOLD 256 174c7770590Smx205022 #define DEFAULT_TX_NO_RESOURCE MAX_TX_DESC_PER_PACKET 17547b7744cSyy150190 17625f2d433Sxy150489 #define DEFAULT_TX_INTR_ENABLE 1 17725f2d433Sxy150489 #define DEFAULT_FLOW_CONTROL 3 17825f2d433Sxy150489 #define DEFAULT_MASTER_LATENCY_TIMER 0 /* BIOS should decide */ 17908057504Sxy150489 /* which is normally 0x040 */ 18025f2d433Sxy150489 #define DEFAULT_TBI_COMPAT_ENABLE 1 /* Enable SBP workaround */ 18125f2d433Sxy150489 #define DEFAULT_MSI_ENABLE 1 /* MSI Enable */ 1826ad5fc39Ssv141092 #define DEFAULT_TX_HCKSUM_ENABLE 1 /* Hardware checksum enable */ 183c7770590Smx205022 #define DEFAULT_LSO_ENABLE 1 /* LSO enable */ 1843d15c084Schenlu chen - Sun Microsystems - Beijing China #define DEFAULT_MEM_WORKAROUND_82546 1 /* 82546 memory workaround */ 18508057504Sxy150489 18625f2d433Sxy150489 #define TX_DRAIN_TIME (200) /* # milliseconds xmit drain */ 18754e0d7a5SMiles Xu, Sun Microsystems #define RX_DRAIN_TIME (200) /* # milliseconds recv drain */ 18854e0d7a5SMiles Xu, Sun Microsystems 18954e0d7a5SMiles Xu, Sun Microsystems #define TX_STALL_TIME_2S (200) /* in unit of tick */ 19054e0d7a5SMiles Xu, Sun Microsystems #define TX_STALL_TIME_8S (800) /* in unit of tick */ 19108057504Sxy150489 19208057504Sxy150489 /* 19308057504Sxy150489 * The size of the receive/transmite buffers 19408057504Sxy150489 */ 19508057504Sxy150489 #define E1000_RX_BUFFER_SIZE_2K (2048) 19608057504Sxy150489 #define E1000_RX_BUFFER_SIZE_4K (4096) 19708057504Sxy150489 #define E1000_RX_BUFFER_SIZE_8K (8192) 19808057504Sxy150489 #define E1000_RX_BUFFER_SIZE_16K (16384) 19908057504Sxy150489 20008057504Sxy150489 #define E1000_TX_BUFFER_SIZE_2K (2048) 20108057504Sxy150489 #define E1000_TX_BUFFER_SIZE_4K (4096) 20208057504Sxy150489 #define E1000_TX_BUFFER_SIZE_8K (8192) 20308057504Sxy150489 #define E1000_TX_BUFFER_SIZE_16K (16384) 20408057504Sxy150489 205c7770590Smx205022 #define E1000_TX_BUFFER_OEVRRUN_THRESHOLD (2015) 20608057504Sxy150489 20754e0d7a5SMiles Xu, Sun Microsystems #define E1000G_RX_NORMAL 0x0 20854e0d7a5SMiles Xu, Sun Microsystems #define E1000G_RX_STOPPED 0x1 20908057504Sxy150489 210ae6aa22aSVenugopal Iyer #define E1000G_CHAIN_NO_LIMIT 0 211ae6aa22aSVenugopal Iyer 21208057504Sxy150489 /* 21308057504Sxy150489 * definitions for smartspeed workaround 21408057504Sxy150489 */ 21508057504Sxy150489 #define E1000_SMARTSPEED_MAX 30 /* 30 watchdog iterations */ 21608057504Sxy150489 /* or 30 seconds */ 21708057504Sxy150489 #define E1000_SMARTSPEED_DOWNSHIFT 6 /* 6 watchdog iterations */ 21808057504Sxy150489 /* or 6 seconds */ 21908057504Sxy150489 22008057504Sxy150489 /* 22108057504Sxy150489 * Definitions for module_info. 22208057504Sxy150489 */ 22308057504Sxy150489 #define WSNAME "e1000g" /* module name */ 22408057504Sxy150489 22508057504Sxy150489 /* 22608057504Sxy150489 * Defined for IP header alignment. We also need to preserve space for 22708057504Sxy150489 * VLAN tag (4 bytes) 22808057504Sxy150489 */ 2293fb4efefSchangqing li - Sun Microsystems - Beijing China #define E1000G_IPALIGNROOM 2 23008057504Sxy150489 23108057504Sxy150489 /* 23208057504Sxy150489 * bit flags for 'attach_progress' which is a member variable in struct e1000g 23308057504Sxy150489 */ 23425f2d433Sxy150489 #define ATTACH_PROGRESS_PCI_CONFIG 0x0001 /* PCI config setup */ 23525f2d433Sxy150489 #define ATTACH_PROGRESS_REGS_MAP 0x0002 /* Registers mapped */ 23625f2d433Sxy150489 #define ATTACH_PROGRESS_SETUP 0x0004 /* Setup driver parameters */ 23725f2d433Sxy150489 #define ATTACH_PROGRESS_ADD_INTR 0x0008 /* Interrupt added */ 23825f2d433Sxy150489 #define ATTACH_PROGRESS_LOCKS 0x0010 /* Locks initialized */ 23925f2d433Sxy150489 #define ATTACH_PROGRESS_SOFT_INTR 0x0020 /* Soft interrupt added */ 24025f2d433Sxy150489 #define ATTACH_PROGRESS_KSTATS 0x0040 /* Kstats created */ 24125f2d433Sxy150489 #define ATTACH_PROGRESS_ALLOC 0x0080 /* DMA resources allocated */ 24225f2d433Sxy150489 #define ATTACH_PROGRESS_INIT 0x0100 /* Driver initialization */ 2434045d941Ssowmini /* 0200 used to be PROGRESS_NDD. Now unused */ 24425f2d433Sxy150489 #define ATTACH_PROGRESS_MAC 0x0400 /* MAC registered */ 24525f2d433Sxy150489 #define ATTACH_PROGRESS_ENABLE_INTR 0x0800 /* DDI interrupts enabled */ 2469b6541b3Sgl147354 #define ATTACH_PROGRESS_FMINIT 0x1000 /* FMA initiated */ 24708057504Sxy150489 24808057504Sxy150489 /* 24908057504Sxy150489 * Speed and Duplex Settings 25008057504Sxy150489 */ 25108057504Sxy150489 #define GDIAG_10_HALF 1 25208057504Sxy150489 #define GDIAG_10_FULL 2 25308057504Sxy150489 #define GDIAG_100_HALF 3 25408057504Sxy150489 #define GDIAG_100_FULL 4 25508057504Sxy150489 #define GDIAG_1000_FULL 6 25608057504Sxy150489 #define GDIAG_ANY 7 25708057504Sxy150489 25808057504Sxy150489 /* 25908057504Sxy150489 * Coexist Workaround RP: 07/04/03 26008057504Sxy150489 * 82544 Workaround : Co-existence 26108057504Sxy150489 */ 26208057504Sxy150489 #define MAX_TX_BUF_SIZE (8 * 1024) 26308057504Sxy150489 26408057504Sxy150489 /* 26508057504Sxy150489 * Defines for Jumbo Frame 26608057504Sxy150489 */ 26708057504Sxy150489 #define FRAME_SIZE_UPTO_2K 2048 26808057504Sxy150489 #define FRAME_SIZE_UPTO_4K 4096 26908057504Sxy150489 #define FRAME_SIZE_UPTO_8K 8192 27008057504Sxy150489 #define FRAME_SIZE_UPTO_16K 16384 27125f2d433Sxy150489 #define FRAME_SIZE_UPTO_9K 9234 27208057504Sxy150489 2739ce7e93cScc210113 #define DEFAULT_MTU ETHERMTU 274caf05df5SMiles Xu, Sun Microsystems #define MAXIMUM_MTU_4K 4096 275caf05df5SMiles Xu, Sun Microsystems #define MAXIMUM_MTU_9K 9216 2769ce7e93cScc210113 2779ce7e93cScc210113 #define DEFAULT_FRAME_SIZE \ 2789ce7e93cScc210113 (DEFAULT_MTU + sizeof (struct ether_vlan_header) + ETHERFCSL) 2799ce7e93cScc210113 #define MAXIMUM_FRAME_SIZE \ 2809ce7e93cScc210113 (MAXIMUM_MTU + sizeof (struct ether_vlan_header) + ETHERFCSL) 28108057504Sxy150489 282c7770590Smx205022 #define E1000_LSO_MAXLEN 65535 28396ea4e93Schangqing li - Sun Microsystems - Beijing China #define E1000_LSO_FIRST_DESC_ALIGNMENT_BOUNDARY_4K 4096 28496ea4e93Schangqing li - Sun Microsystems - Beijing China #define E1000_LSO_FIRST_DESC_ALIGNMENT 128 285c7770590Smx205022 28608057504Sxy150489 /* Defines for Tx stall check */ 28708057504Sxy150489 #define E1000G_STALL_WATCHDOG_COUNT 8 28808057504Sxy150489 2897941757cSxy150489 #define MAX_TX_LINK_DOWN_TIMEOUT 8 2907941757cSxy150489 29108057504Sxy150489 /* Defines for DVMA */ 29208057504Sxy150489 #ifdef __sparc 29308057504Sxy150489 #define E1000G_DEFAULT_DVMA_PAGE_NUM 2 29408057504Sxy150489 #endif 29508057504Sxy150489 29608057504Sxy150489 /* 29708057504Sxy150489 * Loopback definitions 29808057504Sxy150489 */ 29908057504Sxy150489 #define E1000G_LB_NONE 0 30008057504Sxy150489 #define E1000G_LB_EXTERNAL_1000 1 30108057504Sxy150489 #define E1000G_LB_EXTERNAL_100 2 30208057504Sxy150489 #define E1000G_LB_EXTERNAL_10 3 30308057504Sxy150489 #define E1000G_LB_INTERNAL_PHY 4 30408057504Sxy150489 305ea6b684aSyy150190 /* 306ea6b684aSyy150190 * Private dip list definitions 307ea6b684aSyy150190 */ 308ea6b684aSyy150190 #define E1000G_PRIV_DEVI_ATTACH 0x0 309ea6b684aSyy150190 #define E1000G_PRIV_DEVI_DETACH 0x1 31008057504Sxy150489 31108057504Sxy150489 /* 312c7770590Smx205022 * Tx descriptor LENGTH field mask 313c7770590Smx205022 */ 314c7770590Smx205022 #define E1000G_TBD_LENGTH_MASK 0x000fffff 315c7770590Smx205022 31646ebaa55SMiles Xu, Sun Microsystems #define E1000G_IS_VLAN_PACKET(ptr) \ 31746ebaa55SMiles Xu, Sun Microsystems ((((struct ether_vlan_header *)(uintptr_t)ptr)->ether_tpid) == \ 31846ebaa55SMiles Xu, Sun Microsystems htons(ETHERTYPE_VLAN)) 31946ebaa55SMiles Xu, Sun Microsystems 320c7770590Smx205022 /* 32108057504Sxy150489 * QUEUE_INIT_LIST -- Macro which will init ialize a queue to NULL. 32208057504Sxy150489 */ 32308057504Sxy150489 #define QUEUE_INIT_LIST(_LH) \ 32408057504Sxy150489 (_LH)->Flink = (_LH)->Blink = (PSINGLE_LIST_LINK)0 32508057504Sxy150489 32608057504Sxy150489 /* 32708057504Sxy150489 * IS_QUEUE_EMPTY -- Macro which checks to see if a queue is empty. 32808057504Sxy150489 */ 32908057504Sxy150489 #define IS_QUEUE_EMPTY(_LH) \ 33008057504Sxy150489 ((_LH)->Flink == (PSINGLE_LIST_LINK)0) 33108057504Sxy150489 33208057504Sxy150489 /* 33308057504Sxy150489 * QUEUE_GET_HEAD -- Macro which returns the head of the queue, but does 33408057504Sxy150489 * not remove the head from the queue. 33508057504Sxy150489 */ 33608057504Sxy150489 #define QUEUE_GET_HEAD(_LH) ((PSINGLE_LIST_LINK)((_LH)->Flink)) 33708057504Sxy150489 33808057504Sxy150489 /* 33908057504Sxy150489 * QUEUE_REMOVE_HEAD -- Macro which removes the head of the head of a queue. 34008057504Sxy150489 */ 34108057504Sxy150489 #define QUEUE_REMOVE_HEAD(_LH) \ 34208057504Sxy150489 { \ 34308057504Sxy150489 PSINGLE_LIST_LINK ListElem; \ 34408057504Sxy150489 if (ListElem = (_LH)->Flink) \ 34508057504Sxy150489 { \ 34608057504Sxy150489 if (!((_LH)->Flink = ListElem->Flink)) \ 34708057504Sxy150489 (_LH)->Blink = (PSINGLE_LIST_LINK) 0; \ 34808057504Sxy150489 } \ 34908057504Sxy150489 } 35008057504Sxy150489 35108057504Sxy150489 /* 35208057504Sxy150489 * QUEUE_POP_HEAD -- Macro which will pop the head off of a queue (list), 35308057504Sxy150489 * and return it (this differs from QUEUE_REMOVE_HEAD only in 35408057504Sxy150489 * the 1st line). 35508057504Sxy150489 */ 35608057504Sxy150489 #define QUEUE_POP_HEAD(_LH) \ 35708057504Sxy150489 (PSINGLE_LIST_LINK)(_LH)->Flink; \ 35808057504Sxy150489 { \ 35908057504Sxy150489 PSINGLE_LIST_LINK ListElem; \ 36008057504Sxy150489 ListElem = (_LH)->Flink; \ 36108057504Sxy150489 if (ListElem) \ 36208057504Sxy150489 { \ 36308057504Sxy150489 (_LH)->Flink = ListElem->Flink; \ 36408057504Sxy150489 if (!(_LH)->Flink) \ 36508057504Sxy150489 (_LH)->Blink = (PSINGLE_LIST_LINK)0; \ 36608057504Sxy150489 } \ 36708057504Sxy150489 } 36808057504Sxy150489 36908057504Sxy150489 /* 37008057504Sxy150489 * QUEUE_GET_TAIL -- Macro which returns the tail of the queue, but does not 37108057504Sxy150489 * remove the tail from the queue. 37208057504Sxy150489 */ 37308057504Sxy150489 #define QUEUE_GET_TAIL(_LH) ((PSINGLE_LIST_LINK)((_LH)->Blink)) 37408057504Sxy150489 37508057504Sxy150489 /* 37608057504Sxy150489 * QUEUE_PUSH_TAIL -- Macro which puts an element at the tail (end) of the queue 37708057504Sxy150489 */ 37808057504Sxy150489 #define QUEUE_PUSH_TAIL(_LH, _E) \ 37908057504Sxy150489 if ((_LH)->Blink) \ 38008057504Sxy150489 { \ 38108057504Sxy150489 ((PSINGLE_LIST_LINK)(_LH)->Blink)->Flink = \ 38208057504Sxy150489 (PSINGLE_LIST_LINK)(_E); \ 38308057504Sxy150489 (_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \ 38408057504Sxy150489 } else { \ 38508057504Sxy150489 (_LH)->Flink = \ 38608057504Sxy150489 (_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \ 38708057504Sxy150489 } \ 38808057504Sxy150489 (_E)->Flink = (PSINGLE_LIST_LINK)0; 38908057504Sxy150489 39008057504Sxy150489 /* 39108057504Sxy150489 * QUEUE_PUSH_HEAD -- Macro which puts an element at the head of the queue. 39208057504Sxy150489 */ 39308057504Sxy150489 #define QUEUE_PUSH_HEAD(_LH, _E) \ 39408057504Sxy150489 if (!((_E)->Flink = (_LH)->Flink)) \ 39508057504Sxy150489 { \ 39608057504Sxy150489 (_LH)->Blink = (PSINGLE_LIST_LINK)(_E); \ 39708057504Sxy150489 } \ 39808057504Sxy150489 (_LH)->Flink = (PSINGLE_LIST_LINK)(_E); 39908057504Sxy150489 40008057504Sxy150489 /* 40108057504Sxy150489 * QUEUE_GET_NEXT -- Macro which returns the next element linked to the 40208057504Sxy150489 * current element. 40308057504Sxy150489 */ 40408057504Sxy150489 #define QUEUE_GET_NEXT(_LH, _E) \ 40508057504Sxy150489 (PSINGLE_LIST_LINK)((((_LH)->Blink) == (_E)) ? \ 40608057504Sxy150489 (0) : ((_E)->Flink)) 40708057504Sxy150489 40808057504Sxy150489 /* 40908057504Sxy150489 * QUEUE_APPEND -- Macro which appends a queue to the tail of another queue 41008057504Sxy150489 */ 41108057504Sxy150489 #define QUEUE_APPEND(_LH1, _LH2) \ 41208057504Sxy150489 if ((_LH2)->Flink) { \ 41308057504Sxy150489 if ((_LH1)->Flink) { \ 41408057504Sxy150489 ((PSINGLE_LIST_LINK)(_LH1)->Blink)->Flink = \ 41508057504Sxy150489 ((PSINGLE_LIST_LINK)(_LH2)->Flink); \ 41608057504Sxy150489 } else { \ 41708057504Sxy150489 (_LH1)->Flink = \ 41808057504Sxy150489 ((PSINGLE_LIST_LINK)(_LH2)->Flink); \ 41908057504Sxy150489 } \ 42008057504Sxy150489 (_LH1)->Blink = ((PSINGLE_LIST_LINK)(_LH2)->Blink); \ 42108057504Sxy150489 } 42208057504Sxy150489 423da14cebeSEric Cheng 424da14cebeSEric Cheng #define QUEUE_SWITCH(_LH1, _LH2) \ 425da14cebeSEric Cheng if ((_LH2)->Flink) { \ 426da14cebeSEric Cheng (_LH1)->Flink = (_LH2)->Flink; \ 427da14cebeSEric Cheng (_LH1)->Blink = (_LH2)->Blink; \ 428da14cebeSEric Cheng (_LH2)->Flink = (_LH2)->Blink = (PSINGLE_LIST_LINK)0; \ 429da14cebeSEric Cheng } 430da14cebeSEric Cheng 43108057504Sxy150489 /* 43208057504Sxy150489 * Property lookups 43308057504Sxy150489 */ 43408057504Sxy150489 #define E1000G_PROP_EXISTS(d, n) ddi_prop_exists(DDI_DEV_T_ANY, (d), \ 43508057504Sxy150489 DDI_PROP_DONTPASS, (n)) 43608057504Sxy150489 #define E1000G_PROP_GET_INT(d, n) ddi_prop_get_int(DDI_DEV_T_ANY, (d), \ 43708057504Sxy150489 DDI_PROP_DONTPASS, (n), -1) 43808057504Sxy150489 43925f2d433Sxy150489 #ifdef E1000G_DEBUG 44008057504Sxy150489 /* 44108057504Sxy150489 * E1000G-specific ioctls ... 44208057504Sxy150489 */ 44308057504Sxy150489 #define E1000G_IOC ((((((('E' << 4) + '1') << 4) \ 44408057504Sxy150489 + 'K') << 4) + 'G') << 4) 44508057504Sxy150489 44608057504Sxy150489 /* 44708057504Sxy150489 * These diagnostic IOCTLS are enabled only in DEBUG drivers 44808057504Sxy150489 */ 44908057504Sxy150489 #define E1000G_IOC_REG_PEEK (E1000G_IOC | 1) 45008057504Sxy150489 #define E1000G_IOC_REG_POKE (E1000G_IOC | 2) 45108057504Sxy150489 #define E1000G_IOC_CHIP_RESET (E1000G_IOC | 3) 45208057504Sxy150489 45308057504Sxy150489 #define E1000G_PP_SPACE_REG 0 /* PCI memory space */ 45408057504Sxy150489 #define E1000G_PP_SPACE_E1000G 1 /* driver's soft state */ 45508057504Sxy150489 45608057504Sxy150489 typedef struct { 45708057504Sxy150489 uint64_t pp_acc_size; /* It's 1, 2, 4 or 8 */ 45808057504Sxy150489 uint64_t pp_acc_space; /* See #defines below */ 45908057504Sxy150489 uint64_t pp_acc_offset; /* See regs definition */ 46008057504Sxy150489 uint64_t pp_acc_data; /* output for peek */ 46108057504Sxy150489 /* input for poke */ 46208057504Sxy150489 } e1000g_peekpoke_t; 46325f2d433Sxy150489 #endif /* E1000G_DEBUG */ 46408057504Sxy150489 46508057504Sxy150489 /* 46608057504Sxy150489 * (Internal) return values from ioctl subroutines 46708057504Sxy150489 */ 46808057504Sxy150489 enum ioc_reply { 46908057504Sxy150489 IOC_INVAL = -1, /* bad, NAK with EINVAL */ 47008057504Sxy150489 IOC_DONE, /* OK, reply sent */ 47108057504Sxy150489 IOC_ACK, /* OK, just send ACK */ 47208057504Sxy150489 IOC_REPLY /* OK, just send reply */ 47308057504Sxy150489 }; 47408057504Sxy150489 47508057504Sxy150489 /* 47608057504Sxy150489 * Named Data (ND) Parameter Management Structure 47708057504Sxy150489 */ 47808057504Sxy150489 typedef struct { 47908057504Sxy150489 uint32_t ndp_info; 48008057504Sxy150489 uint32_t ndp_min; 48108057504Sxy150489 uint32_t ndp_max; 48208057504Sxy150489 uint32_t ndp_val; 48308057504Sxy150489 struct e1000g *ndp_instance; 48408057504Sxy150489 char *ndp_name; 48508057504Sxy150489 } nd_param_t; 48608057504Sxy150489 48708057504Sxy150489 /* 488ea6b684aSyy150190 * The entry of the private dip list 489ea6b684aSyy150190 */ 4900f70fbf8Sxy150489 typedef struct _private_devi_list { 4910f70fbf8Sxy150489 dev_info_t *priv_dip; 49254e0d7a5SMiles Xu, Sun Microsystems uint32_t flag; 49354e0d7a5SMiles Xu, Sun Microsystems uint32_t pending_rx_count; 49454e0d7a5SMiles Xu, Sun Microsystems struct _private_devi_list *prev; 4950f70fbf8Sxy150489 struct _private_devi_list *next; 4960f70fbf8Sxy150489 } private_devi_list_t; 4970f70fbf8Sxy150489 49808057504Sxy150489 /* 49908057504Sxy150489 * A structure that points to the next entry in the queue. 50008057504Sxy150489 */ 50108057504Sxy150489 typedef struct _SINGLE_LIST_LINK { 50208057504Sxy150489 struct _SINGLE_LIST_LINK *Flink; 50308057504Sxy150489 } SINGLE_LIST_LINK, *PSINGLE_LIST_LINK; 50408057504Sxy150489 50508057504Sxy150489 /* 50608057504Sxy150489 * A "ListHead" structure that points to the head and tail of a queue 50708057504Sxy150489 */ 50808057504Sxy150489 typedef struct _LIST_DESCRIBER { 50908057504Sxy150489 struct _SINGLE_LIST_LINK *volatile Flink; 51008057504Sxy150489 struct _SINGLE_LIST_LINK *volatile Blink; 51108057504Sxy150489 } LIST_DESCRIBER, *PLIST_DESCRIBER; 51208057504Sxy150489 5133f64cd55Sguoqing zhu - Sun Microsystems - Beijing China enum e1000g_bar_type { 5143f64cd55Sguoqing zhu - Sun Microsystems - Beijing China E1000G_BAR_CONFIG = 0, 5153f64cd55Sguoqing zhu - Sun Microsystems - Beijing China E1000G_BAR_IO, 5163f64cd55Sguoqing zhu - Sun Microsystems - Beijing China E1000G_BAR_MEM32, 5173f64cd55Sguoqing zhu - Sun Microsystems - Beijing China E1000G_BAR_MEM64 5183f64cd55Sguoqing zhu - Sun Microsystems - Beijing China }; 5193f64cd55Sguoqing zhu - Sun Microsystems - Beijing China 5203f64cd55Sguoqing zhu - Sun Microsystems - Beijing China typedef struct { 5213f64cd55Sguoqing zhu - Sun Microsystems - Beijing China enum e1000g_bar_type type; 5223f64cd55Sguoqing zhu - Sun Microsystems - Beijing China int rnumber; 5233f64cd55Sguoqing zhu - Sun Microsystems - Beijing China } bar_info_t; 5243f64cd55Sguoqing zhu - Sun Microsystems - Beijing China 52508057504Sxy150489 /* 52608057504Sxy150489 * Address-Length pair structure that stores descriptor info 52708057504Sxy150489 */ 52825f2d433Sxy150489 typedef struct _sw_desc { 52925f2d433Sxy150489 uint64_t address; 53025f2d433Sxy150489 uint32_t length; 53125f2d433Sxy150489 } sw_desc_t, *p_sw_desc_t; 53208057504Sxy150489 53325f2d433Sxy150489 typedef struct _desc_array { 53425f2d433Sxy150489 sw_desc_t descriptor[4]; 53525f2d433Sxy150489 uint32_t elements; 53625f2d433Sxy150489 } desc_array_t, *p_desc_array_t; 53708057504Sxy150489 53808057504Sxy150489 typedef enum { 53908057504Sxy150489 USE_NONE, 54008057504Sxy150489 USE_BCOPY, 54108057504Sxy150489 USE_DVMA, 54208057504Sxy150489 USE_DMA 54308057504Sxy150489 } dma_type_t; 54408057504Sxy150489 54508057504Sxy150489 typedef struct _dma_buffer { 54608057504Sxy150489 caddr_t address; 54708057504Sxy150489 uint64_t dma_address; 54808057504Sxy150489 ddi_acc_handle_t acc_handle; 54908057504Sxy150489 ddi_dma_handle_t dma_handle; 55008057504Sxy150489 size_t size; 55108057504Sxy150489 size_t len; 55225f2d433Sxy150489 } dma_buffer_t, *p_dma_buffer_t; 55308057504Sxy150489 55408057504Sxy150489 /* 55508057504Sxy150489 * Transmit Control Block (TCB), Ndis equiv of SWPacket This 55608057504Sxy150489 * structure stores the additional information that is 55708057504Sxy150489 * associated with every packet to be transmitted. It stores the 55808057504Sxy150489 * message block pointer and the TBD addresses associated with 55908057504Sxy150489 * the m_blk and also the link to the next tcb in the chain 56008057504Sxy150489 */ 56125f2d433Sxy150489 typedef struct _tx_sw_packet { 56225f2d433Sxy150489 /* Link to the next tx_sw_packet in the list */ 56308057504Sxy150489 SINGLE_LIST_LINK Link; 56408057504Sxy150489 mblk_t *mp; 56525f2d433Sxy150489 uint32_t num_desc; 56625f2d433Sxy150489 uint32_t num_mblk_frag; 56708057504Sxy150489 dma_type_t dma_type; 56808057504Sxy150489 dma_type_t data_transfer_type; 56908057504Sxy150489 ddi_dma_handle_t tx_dma_handle; 57008057504Sxy150489 dma_buffer_t tx_buf[1]; 57125f2d433Sxy150489 sw_desc_t desc[MAX_TX_DESC_PER_PACKET]; 57254e0d7a5SMiles Xu, Sun Microsystems int64_t tickstamp; 57325f2d433Sxy150489 } tx_sw_packet_t, *p_tx_sw_packet_t; 57408057504Sxy150489 57508057504Sxy150489 /* 57625f2d433Sxy150489 * This structure is similar to the rx_sw_packet structure used 57708057504Sxy150489 * for Ndis. This structure stores information about the 2k 57808057504Sxy150489 * aligned receive buffer into which the FX1000 DMA's frames. 57908057504Sxy150489 * This structure is maintained as a linked list of many 58008057504Sxy150489 * receiver buffer pointers. 58108057504Sxy150489 */ 582ea6b684aSyy150190 typedef struct _rx_sw_packet { 58325f2d433Sxy150489 /* Link to the next rx_sw_packet_t in the list */ 58408057504Sxy150489 SINGLE_LIST_LINK Link; 585ea6b684aSyy150190 struct _rx_sw_packet *next; 58654e0d7a5SMiles Xu, Sun Microsystems uint32_t ref_cnt; 58708057504Sxy150489 mblk_t *mp; 58854e0d7a5SMiles Xu, Sun Microsystems caddr_t rx_data; 58908057504Sxy150489 dma_type_t dma_type; 59008057504Sxy150489 frtn_t free_rtn; 59108057504Sxy150489 dma_buffer_t rx_buf[1]; 59225f2d433Sxy150489 } rx_sw_packet_t, *p_rx_sw_packet_t; 59308057504Sxy150489 59425f2d433Sxy150489 typedef struct _mblk_list { 59508057504Sxy150489 mblk_t *head; 59608057504Sxy150489 mblk_t *tail; 59725f2d433Sxy150489 } mblk_list_t, *p_mblk_list_t; 59808057504Sxy150489 599c7770590Smx205022 typedef struct _context_data { 6007941757cSxy150489 uint32_t ether_header_size; 6017941757cSxy150489 uint32_t cksum_flags; 6027941757cSxy150489 uint32_t cksum_start; 6037941757cSxy150489 uint32_t cksum_stuff; 604c7770590Smx205022 uint16_t mss; 605c7770590Smx205022 uint8_t hdr_len; 606c7770590Smx205022 uint32_t pay_len; 607c7770590Smx205022 boolean_t lso_flag; 608c7770590Smx205022 } context_data_t; 6097941757cSxy150489 61008057504Sxy150489 typedef union _e1000g_ether_addr { 61108057504Sxy150489 struct { 61208057504Sxy150489 uint32_t high; 61308057504Sxy150489 uint32_t low; 61408057504Sxy150489 } reg; 61508057504Sxy150489 struct { 61608057504Sxy150489 uint8_t set; 61708057504Sxy150489 uint8_t redundant; 61825f2d433Sxy150489 uint8_t addr[ETHERADDRL]; 61908057504Sxy150489 } mac; 62008057504Sxy150489 } e1000g_ether_addr_t; 62108057504Sxy150489 62225f2d433Sxy150489 typedef struct _e1000g_stat { 62325f2d433Sxy150489 kstat_named_t reset_count; /* Reset Count */ 62425f2d433Sxy150489 62508057504Sxy150489 kstat_named_t rx_error; /* Rx Error in Packet */ 62608057504Sxy150489 kstat_named_t rx_allocb_fail; /* Rx Allocb Failure */ 62746ebaa55SMiles Xu, Sun Microsystems kstat_named_t rx_size_error; /* Rx Size Error */ 62825f2d433Sxy150489 62908057504Sxy150489 kstat_named_t tx_no_desc; /* Tx No Desc */ 63008057504Sxy150489 kstat_named_t tx_no_swpkt; /* Tx No Pkt Buffer */ 63108057504Sxy150489 kstat_named_t tx_send_fail; /* Tx SendPkt Failure */ 63208057504Sxy150489 kstat_named_t tx_over_size; /* Tx Pkt Too Long */ 63308057504Sxy150489 kstat_named_t tx_reschedule; /* Tx Reschedule */ 63425f2d433Sxy150489 63525f2d433Sxy150489 #ifdef E1000G_DEBUG 63625f2d433Sxy150489 kstat_named_t rx_none; /* Rx No Incoming Data */ 63725f2d433Sxy150489 kstat_named_t rx_multi_desc; /* Rx Multi Spanned Pkt */ 63825f2d433Sxy150489 kstat_named_t rx_no_freepkt; /* Rx No Free Pkt */ 63925f2d433Sxy150489 kstat_named_t rx_avail_freepkt; /* Rx Freelist Avail Buffers */ 64025f2d433Sxy150489 64125f2d433Sxy150489 kstat_named_t tx_under_size; /* Tx Packet Under Size */ 64208057504Sxy150489 kstat_named_t tx_empty_frags; /* Tx Empty Frags */ 64308057504Sxy150489 kstat_named_t tx_exceed_frags; /* Tx Exceed Max Frags */ 64408057504Sxy150489 kstat_named_t tx_recycle; /* Tx Recycle */ 64508057504Sxy150489 kstat_named_t tx_recycle_intr; /* Tx Recycle in Intr */ 64625f2d433Sxy150489 kstat_named_t tx_recycle_retry; /* Tx Recycle Retry */ 64708057504Sxy150489 kstat_named_t tx_recycle_none; /* Tx No Desc Recycled */ 64808057504Sxy150489 kstat_named_t tx_copy; /* Tx Send Copy */ 64908057504Sxy150489 kstat_named_t tx_bind; /* Tx Send Bind */ 65008057504Sxy150489 kstat_named_t tx_multi_copy; /* Tx Copy Multi Fragments */ 65125f2d433Sxy150489 kstat_named_t tx_multi_cookie; /* Tx Pkt Span Multi Cookies */ 65225f2d433Sxy150489 kstat_named_t tx_lack_desc; /* Tx Lack of Desc */ 65325f2d433Sxy150489 #endif 65425f2d433Sxy150489 65508057504Sxy150489 kstat_named_t Symerrs; /* Symbol Error Count */ 65608057504Sxy150489 kstat_named_t Mpc; /* Missed Packet Count */ 65708057504Sxy150489 kstat_named_t Rlec; /* Receive Length Error Count */ 65808057504Sxy150489 kstat_named_t Xonrxc; /* XON Received Count */ 65908057504Sxy150489 kstat_named_t Xontxc; /* XON Xmitted Count */ 66008057504Sxy150489 kstat_named_t Xoffrxc; /* XOFF Received Count */ 66108057504Sxy150489 kstat_named_t Xofftxc; /* Xoff Xmitted Count */ 66208057504Sxy150489 kstat_named_t Fcruc; /* Unknown Flow Conrol Packet Rcvd Count */ 66347b7744cSyy150190 #ifdef E1000G_DEBUG 66408057504Sxy150489 kstat_named_t Prc64; /* Packets Received - 64b */ 66508057504Sxy150489 kstat_named_t Prc127; /* Packets Received - 65-127b */ 66608057504Sxy150489 kstat_named_t Prc255; /* Packets Received - 127-255b */ 66708057504Sxy150489 kstat_named_t Prc511; /* Packets Received - 256-511b */ 66808057504Sxy150489 kstat_named_t Prc1023; /* Packets Received - 511-1023b */ 66908057504Sxy150489 kstat_named_t Prc1522; /* Packets Received - 1024-1522b */ 67047b7744cSyy150190 #endif 67108057504Sxy150489 kstat_named_t Gprc; /* Good Packets Received Count */ 67208057504Sxy150489 kstat_named_t Gptc; /* Good Packets Xmitted Count */ 67308057504Sxy150489 kstat_named_t Gorl; /* Good Octets Recvd Lo Count */ 67408057504Sxy150489 kstat_named_t Gorh; /* Good Octets Recvd Hi Count */ 67508057504Sxy150489 kstat_named_t Gotl; /* Good Octets Xmitd Lo Count */ 67608057504Sxy150489 kstat_named_t Goth; /* Good Octets Xmitd Hi Count */ 67708057504Sxy150489 kstat_named_t Rfc; /* Receive Frag Count */ 67847b7744cSyy150190 #ifdef E1000G_DEBUG 67908057504Sxy150489 kstat_named_t Ptc64; /* Packets Xmitted (64b) */ 68008057504Sxy150489 kstat_named_t Ptc127; /* Packets Xmitted (64-127b) */ 68108057504Sxy150489 kstat_named_t Ptc255; /* Packets Xmitted (128-255b) */ 68208057504Sxy150489 kstat_named_t Ptc511; /* Packets Xmitted (255-511b) */ 68308057504Sxy150489 kstat_named_t Ptc1023; /* Packets Xmitted (512-1023b) */ 68408057504Sxy150489 kstat_named_t Ptc1522; /* Packets Xmitted (1024-1522b */ 68547b7744cSyy150190 #endif 68608057504Sxy150489 kstat_named_t Tncrs; /* Transmit with no CRS */ 68708057504Sxy150489 kstat_named_t Tsctc; /* TCP seg contexts xmit count */ 68808057504Sxy150489 kstat_named_t Tsctfc; /* TCP seg contexts xmit fail count */ 68925f2d433Sxy150489 } e1000g_stat_t, *p_e1000g_stat_t; 69008057504Sxy150489 69108057504Sxy150489 typedef struct _e1000g_tx_ring { 69208057504Sxy150489 kmutex_t tx_lock; 69308057504Sxy150489 kmutex_t freelist_lock; 69408057504Sxy150489 kmutex_t usedlist_lock; 69508057504Sxy150489 /* 69608057504Sxy150489 * Descriptor queue definitions 69708057504Sxy150489 */ 69808057504Sxy150489 ddi_dma_handle_t tbd_dma_handle; 69908057504Sxy150489 ddi_acc_handle_t tbd_acc_handle; 70008057504Sxy150489 struct e1000_tx_desc *tbd_area; 70108057504Sxy150489 uint64_t tbd_dma_addr; 70208057504Sxy150489 struct e1000_tx_desc *tbd_first; 70308057504Sxy150489 struct e1000_tx_desc *tbd_last; 70408057504Sxy150489 struct e1000_tx_desc *tbd_oldest; 70508057504Sxy150489 struct e1000_tx_desc *tbd_next; 70625f2d433Sxy150489 uint32_t tbd_avail; 70708057504Sxy150489 /* 70808057504Sxy150489 * Software packet structures definitions 70908057504Sxy150489 */ 71025f2d433Sxy150489 p_tx_sw_packet_t packet_area; 71108057504Sxy150489 LIST_DESCRIBER used_list; 71208057504Sxy150489 LIST_DESCRIBER free_list; 71308057504Sxy150489 /* 714c7770590Smx205022 * TCP/UDP Context Data Information 71508057504Sxy150489 */ 716c7770590Smx205022 context_data_t pre_context; 71708057504Sxy150489 /* 71808057504Sxy150489 * Timer definitions for 82547 71908057504Sxy150489 */ 72008057504Sxy150489 timeout_id_t timer_id_82547; 72108057504Sxy150489 boolean_t timer_enable_82547; 72208057504Sxy150489 /* 72325f2d433Sxy150489 * reschedule when tx resource is available 72425f2d433Sxy150489 */ 72525f2d433Sxy150489 boolean_t resched_needed; 726da14cebeSEric Cheng clock_t resched_timestamp; 72725f2d433Sxy150489 mblk_list_t mblks; 72825f2d433Sxy150489 /* 72925f2d433Sxy150489 * Statistics 73025f2d433Sxy150489 */ 73125f2d433Sxy150489 uint32_t stat_no_swpkt; 73225f2d433Sxy150489 uint32_t stat_no_desc; 73325f2d433Sxy150489 uint32_t stat_send_fail; 73425f2d433Sxy150489 uint32_t stat_reschedule; 735da14cebeSEric Cheng uint32_t stat_timer_reschedule; 73625f2d433Sxy150489 uint32_t stat_over_size; 73725f2d433Sxy150489 #ifdef E1000G_DEBUG 73825f2d433Sxy150489 uint32_t stat_under_size; 73925f2d433Sxy150489 uint32_t stat_exceed_frags; 74025f2d433Sxy150489 uint32_t stat_empty_frags; 74125f2d433Sxy150489 uint32_t stat_recycle; 74225f2d433Sxy150489 uint32_t stat_recycle_intr; 74325f2d433Sxy150489 uint32_t stat_recycle_retry; 74425f2d433Sxy150489 uint32_t stat_recycle_none; 74525f2d433Sxy150489 uint32_t stat_copy; 74625f2d433Sxy150489 uint32_t stat_bind; 74725f2d433Sxy150489 uint32_t stat_multi_copy; 74825f2d433Sxy150489 uint32_t stat_multi_cookie; 74925f2d433Sxy150489 uint32_t stat_lack_desc; 75043a17687SMiles Xu, Sun Microsystems uint32_t stat_lso_header_fail; 75125f2d433Sxy150489 #endif 75225f2d433Sxy150489 /* 75308057504Sxy150489 * Pointer to the adapter 75408057504Sxy150489 */ 75508057504Sxy150489 struct e1000g *adapter; 75608057504Sxy150489 } e1000g_tx_ring_t, *pe1000g_tx_ring_t; 75708057504Sxy150489 75854e0d7a5SMiles Xu, Sun Microsystems typedef struct _e1000g_rx_data { 75908057504Sxy150489 kmutex_t freelist_lock; 760da14cebeSEric Cheng kmutex_t recycle_lock; 76108057504Sxy150489 /* 76208057504Sxy150489 * Descriptor queue definitions 76308057504Sxy150489 */ 76408057504Sxy150489 ddi_dma_handle_t rbd_dma_handle; 76508057504Sxy150489 ddi_acc_handle_t rbd_acc_handle; 76608057504Sxy150489 struct e1000_rx_desc *rbd_area; 76708057504Sxy150489 uint64_t rbd_dma_addr; 76808057504Sxy150489 struct e1000_rx_desc *rbd_first; 76908057504Sxy150489 struct e1000_rx_desc *rbd_last; 77008057504Sxy150489 struct e1000_rx_desc *rbd_next; 77108057504Sxy150489 /* 77208057504Sxy150489 * Software packet structures definitions 77308057504Sxy150489 */ 77425f2d433Sxy150489 p_rx_sw_packet_t packet_area; 77508057504Sxy150489 LIST_DESCRIBER recv_list; 77608057504Sxy150489 LIST_DESCRIBER free_list; 777da14cebeSEric Cheng LIST_DESCRIBER recycle_list; 77854e0d7a5SMiles Xu, Sun Microsystems uint32_t flag; 77925f2d433Sxy150489 78025f2d433Sxy150489 uint32_t pending_count; 78125f2d433Sxy150489 uint32_t avail_freepkt; 782da14cebeSEric Cheng uint32_t recycle_freepkt; 78325f2d433Sxy150489 uint32_t rx_mblk_len; 78425f2d433Sxy150489 mblk_t *rx_mblk; 78525f2d433Sxy150489 mblk_t *rx_mblk_tail; 78654e0d7a5SMiles Xu, Sun Microsystems 78754e0d7a5SMiles Xu, Sun Microsystems private_devi_list_t *priv_devi_node; 78854e0d7a5SMiles Xu, Sun Microsystems struct _e1000g_rx_ring *rx_ring; 78954e0d7a5SMiles Xu, Sun Microsystems } e1000g_rx_data_t; 79054e0d7a5SMiles Xu, Sun Microsystems 79154e0d7a5SMiles Xu, Sun Microsystems typedef struct _e1000g_rx_ring { 79254e0d7a5SMiles Xu, Sun Microsystems e1000g_rx_data_t *rx_data; 79354e0d7a5SMiles Xu, Sun Microsystems 79454e0d7a5SMiles Xu, Sun Microsystems kmutex_t rx_lock; 79554e0d7a5SMiles Xu, Sun Microsystems 796da14cebeSEric Cheng mac_ring_handle_t mrh; 797da14cebeSEric Cheng mac_ring_handle_t mrh_init; 798da14cebeSEric Cheng uint64_t ring_gen_num; 799da14cebeSEric Cheng boolean_t poll_flag; 800da14cebeSEric Cheng 80125f2d433Sxy150489 /* 80225f2d433Sxy150489 * Statistics 80325f2d433Sxy150489 */ 80425f2d433Sxy150489 uint32_t stat_error; 80525f2d433Sxy150489 uint32_t stat_allocb_fail; 80625f2d433Sxy150489 uint32_t stat_exceed_pkt; 80746ebaa55SMiles Xu, Sun Microsystems uint32_t stat_size_error; 8083fb4efefSchangqing li - Sun Microsystems - Beijing China uint32_t stat_crc_only_pkt; 80925f2d433Sxy150489 #ifdef E1000G_DEBUG 81025f2d433Sxy150489 uint32_t stat_none; 81125f2d433Sxy150489 uint32_t stat_multi_desc; 81225f2d433Sxy150489 uint32_t stat_no_freepkt; 81325f2d433Sxy150489 #endif 81408057504Sxy150489 /* 81508057504Sxy150489 * Pointer to the adapter 81608057504Sxy150489 */ 81708057504Sxy150489 struct e1000g *adapter; 81808057504Sxy150489 } e1000g_rx_ring_t, *pe1000g_rx_ring_t; 81908057504Sxy150489 82008057504Sxy150489 typedef struct e1000g { 82125f2d433Sxy150489 int instance; 82208057504Sxy150489 dev_info_t *dip; 8230f70fbf8Sxy150489 dev_info_t *priv_dip; 82454e0d7a5SMiles Xu, Sun Microsystems private_devi_list_t *priv_devi_node; 82525f2d433Sxy150489 mac_handle_t mh; 82625f2d433Sxy150489 mac_resource_handle_t mrh; 82725f2d433Sxy150489 struct e1000_hw shared; 82808057504Sxy150489 struct e1000g_osdep osdep; 82908057504Sxy150489 830d5c3073dSchenlu chen - Sun Microsystems - Beijing China uint32_t e1000g_state; 83125f2d433Sxy150489 boolean_t e1000g_promisc; 8325633182fSyy150190 boolean_t strip_crc; 83325f2d433Sxy150489 boolean_t rx_buffer_setup; 834a2e9a830Scc210113 boolean_t esb2_workaround; 83525f2d433Sxy150489 link_state_t link_state; 83629fd2c16SDavid Höppner uint64_t link_speed; 83725f2d433Sxy150489 uint32_t link_duplex; 83825f2d433Sxy150489 uint32_t master_latency_timer; 83925f2d433Sxy150489 uint32_t smartspeed; /* smartspeed w/a counter */ 84025f2d433Sxy150489 uint32_t init_count; 84125f2d433Sxy150489 uint32_t reset_count; 84254e0d7a5SMiles Xu, Sun Microsystems boolean_t reset_flag; 84354e0d7a5SMiles Xu, Sun Microsystems uint32_t stall_threshold; 84454e0d7a5SMiles Xu, Sun Microsystems boolean_t stall_flag; 84525f2d433Sxy150489 uint32_t attach_progress; /* attach tracking */ 84625f2d433Sxy150489 uint32_t loopback_mode; 84754e0d7a5SMiles Xu, Sun Microsystems uint32_t pending_rx_count; 84825f2d433Sxy150489 84929fd2c16SDavid Höppner uint32_t align_errors; 85029fd2c16SDavid Höppner uint32_t brdcstrcv; 85129fd2c16SDavid Höppner uint32_t brdcstxmt; 85229fd2c16SDavid Höppner uint32_t carrier_errors; 85329fd2c16SDavid Höppner uint32_t collisions; 85429fd2c16SDavid Höppner uint32_t defer_xmts; 85529fd2c16SDavid Höppner uint32_t ex_collisions; 85629fd2c16SDavid Höppner uint32_t fcs_errors; 85729fd2c16SDavid Höppner uint32_t first_collisions; 85829fd2c16SDavid Höppner uint32_t ipackets; 85929fd2c16SDavid Höppner uint32_t jabber_errors; 86029fd2c16SDavid Höppner uint32_t macrcv_errors; 86129fd2c16SDavid Höppner uint32_t macxmt_errors; 86229fd2c16SDavid Höppner uint32_t multi_collisions; 86329fd2c16SDavid Höppner uint32_t multircv; 86429fd2c16SDavid Höppner uint32_t multixmt; 86529fd2c16SDavid Höppner uint32_t norcvbuf; 86629fd2c16SDavid Höppner uint32_t oerrors; 86729fd2c16SDavid Höppner uint32_t opackets; 86829fd2c16SDavid Höppner uint32_t sqe_errors; 86929fd2c16SDavid Höppner uint32_t toolong_errors; 87029fd2c16SDavid Höppner uint32_t tooshort_errors; 87129fd2c16SDavid Höppner uint32_t tx_late_collisions; 87229fd2c16SDavid Höppner uint64_t obytes; 87329fd2c16SDavid Höppner uint64_t rbytes; 87429fd2c16SDavid Höppner 87525f2d433Sxy150489 uint32_t tx_desc_num; 87625f2d433Sxy150489 uint32_t tx_freelist_num; 87725f2d433Sxy150489 uint32_t rx_desc_num; 87825f2d433Sxy150489 uint32_t rx_freelist_num; 8793fb4efefSchangqing li - Sun Microsystems - Beijing China uint32_t rx_freelist_limit; 88025f2d433Sxy150489 uint32_t tx_buffer_size; 88125f2d433Sxy150489 uint32_t rx_buffer_size; 88225f2d433Sxy150489 88325f2d433Sxy150489 uint32_t tx_link_down_timeout; 88425f2d433Sxy150489 uint32_t tx_bcopy_thresh; 88525f2d433Sxy150489 uint32_t rx_limit_onintr; 88625f2d433Sxy150489 uint32_t rx_bcopy_thresh; 88725f2d433Sxy150489 uint32_t rx_buf_align; 888ede5269eSchenlu chen - Sun Microsystems - Beijing China uint32_t desc_align; 88925f2d433Sxy150489 89025f2d433Sxy150489 boolean_t intr_adaptive; 89125f2d433Sxy150489 boolean_t tx_intr_enable; 89225f2d433Sxy150489 uint32_t tx_intr_delay; 89325f2d433Sxy150489 uint32_t tx_intr_abs_delay; 89425f2d433Sxy150489 uint32_t rx_intr_delay; 89525f2d433Sxy150489 uint32_t rx_intr_abs_delay; 89625f2d433Sxy150489 uint32_t intr_throttling_rate; 89725f2d433Sxy150489 8981bc1c721Sguoqing zhu - Sun Microsystems - Beijing China uint32_t tx_desc_num_flag:1, 8991bc1c721Sguoqing zhu - Sun Microsystems - Beijing China rx_desc_num_flag:1, 9001bc1c721Sguoqing zhu - Sun Microsystems - Beijing China tx_buf_num_flag:1, 9011bc1c721Sguoqing zhu - Sun Microsystems - Beijing China rx_buf_num_flag:1, 9021bc1c721Sguoqing zhu - Sun Microsystems - Beijing China pad_to_32:28; 9031bc1c721Sguoqing zhu - Sun Microsystems - Beijing China 9049ce7e93cScc210113 uint32_t default_mtu; 905caf05df5SMiles Xu, Sun Microsystems uint32_t max_mtu; 906592a4d85Scc210113 uint32_t max_frame_size; 907592a4d85Scc210113 uint32_t min_frame_size; 9089ce7e93cScc210113 90925f2d433Sxy150489 boolean_t watchdog_timer_enabled; 91025f2d433Sxy150489 boolean_t watchdog_timer_started; 91125f2d433Sxy150489 timeout_id_t watchdog_tid; 91225f2d433Sxy150489 boolean_t link_complete; 91325f2d433Sxy150489 timeout_id_t link_tid; 91425f2d433Sxy150489 91525f2d433Sxy150489 e1000g_rx_ring_t rx_ring[1]; 91625f2d433Sxy150489 e1000g_tx_ring_t tx_ring[1]; 917da14cebeSEric Cheng mac_group_handle_t rx_group; 918da14cebeSEric Cheng 91908057504Sxy150489 /* 92047b7744cSyy150190 * Rx and Tx packet count for interrupt adaptive setting 92147b7744cSyy150190 */ 92247b7744cSyy150190 uint32_t rx_pkt_cnt; 92347b7744cSyy150190 uint32_t tx_pkt_cnt; 92447b7744cSyy150190 92547b7744cSyy150190 /* 92625f2d433Sxy150489 * The watchdog_lock must be held when updateing the 92708057504Sxy150489 * timeout fields in struct e1000g, that is, 92825f2d433Sxy150489 * watchdog_tid, watchdog_timer_started. 92908057504Sxy150489 */ 93025f2d433Sxy150489 kmutex_t watchdog_lock; 93108057504Sxy150489 /* 93296ea4e93Schangqing li - Sun Microsystems - Beijing China * The link_lock protects the link_complete and link_tid 93396ea4e93Schangqing li - Sun Microsystems - Beijing China * fields in struct e1000g. 93408057504Sxy150489 */ 93525f2d433Sxy150489 kmutex_t link_lock; 93608057504Sxy150489 /* 93708057504Sxy150489 * The chip_lock assures that the Rx/Tx process must be 93808057504Sxy150489 * stopped while other functions change the hardware 93908057504Sxy150489 * configuration of e1000g card, such as e1000g_reset(), 94008057504Sxy150489 * e1000g_reset_hw() etc are executed. 94108057504Sxy150489 */ 94208057504Sxy150489 krwlock_t chip_lock; 94308057504Sxy150489 9449b6541b3Sgl147354 boolean_t unicst_init; 94508057504Sxy150489 uint32_t unicst_avail; 94608057504Sxy150489 uint32_t unicst_total; 94708057504Sxy150489 e1000g_ether_addr_t unicst_addr[MAX_NUM_UNICAST_ADDRESSES]; 94808057504Sxy150489 94908057504Sxy150489 uint32_t mcast_count; 9500c56b8d9Schangqing li - Sun Microsystems - Beijing China uint32_t mcast_max_num; 9510c56b8d9Schangqing li - Sun Microsystems - Beijing China uint32_t mcast_alloc_count; 9520c56b8d9Schangqing li - Sun Microsystems - Beijing China struct ether_addr *mcast_table; 95308057504Sxy150489 95408057504Sxy150489 ulong_t sys_page_sz; 95543a17687SMiles Xu, Sun Microsystems #ifdef __sparc 95608057504Sxy150489 uint_t dvma_page_num; 95708057504Sxy150489 #endif 95808057504Sxy150489 959c7770590Smx205022 boolean_t msi_enable; 960c7770590Smx205022 boolean_t tx_hcksum_enable; 961c7770590Smx205022 boolean_t lso_enable; 962c7770590Smx205022 boolean_t lso_premature_issue; 9633d15c084Schenlu chen - Sun Microsystems - Beijing China boolean_t mem_workaround_82546; 96408057504Sxy150489 int intr_type; 96508057504Sxy150489 int intr_cnt; 96608057504Sxy150489 int intr_cap; 96708057504Sxy150489 size_t intr_size; 96808057504Sxy150489 uint_t intr_pri; 96908057504Sxy150489 ddi_intr_handle_t *htable; 97008057504Sxy150489 97125f2d433Sxy150489 int tx_softint_pri; 97225f2d433Sxy150489 ddi_softint_handle_t tx_softint_handle; 97325f2d433Sxy150489 97425f2d433Sxy150489 kstat_t *e1000g_ksp; 97525f2d433Sxy150489 976da14cebeSEric Cheng boolean_t poll_mode; 977da14cebeSEric Cheng 9784914a7d0Syy150190 uint16_t phy_ctrl; /* contents of PHY_CTRL */ 9794914a7d0Syy150190 uint16_t phy_status; /* contents of PHY_STATUS */ 9804914a7d0Syy150190 uint16_t phy_an_adv; /* contents of PHY_AUTONEG_ADV */ 9814914a7d0Syy150190 uint16_t phy_an_exp; /* contents of PHY_AUTONEG_EXP */ 9824914a7d0Syy150190 uint16_t phy_ext_status; /* contents of PHY_EXT_STATUS */ 9834914a7d0Syy150190 uint16_t phy_1000t_ctrl; /* contents of PHY_1000T_CTRL */ 9844914a7d0Syy150190 uint16_t phy_1000t_status; /* contents of PHY_1000T_STATUS */ 9854914a7d0Syy150190 uint16_t phy_lp_able; /* contents of PHY_LP_ABILITY */ 9864914a7d0Syy150190 9879b6541b3Sgl147354 /* 988*4d210590SRobert Mustacchi * LED Controls 989*4d210590SRobert Mustacchi */ 990*4d210590SRobert Mustacchi kmutex_t e1000g_led_lock; 991*4d210590SRobert Mustacchi boolean_t e1000g_led_setup; 992*4d210590SRobert Mustacchi boolean_t e1000g_emul_blink; 993*4d210590SRobert Mustacchi boolean_t e1000g_emul_state; 994*4d210590SRobert Mustacchi ddi_periodic_t e1000g_blink; 995*4d210590SRobert Mustacchi 996*4d210590SRobert Mustacchi /* 9979b6541b3Sgl147354 * FMA capabilities 9989b6541b3Sgl147354 */ 9999b6541b3Sgl147354 int fm_capabilities; 10009ce7e93cScc210113 10019ce7e93cScc210113 uint32_t param_en_1000fdx:1, 10029ce7e93cScc210113 param_en_1000hdx:1, 10039ce7e93cScc210113 param_en_100fdx:1, 10049ce7e93cScc210113 param_en_100hdx:1, 10059ce7e93cScc210113 param_en_10fdx:1, 10069ce7e93cScc210113 param_en_10hdx:1, 10074045d941Ssowmini param_autoneg_cap:1, 10084045d941Ssowmini param_pause_cap:1, 10094045d941Ssowmini param_asym_pause_cap:1, 10104045d941Ssowmini param_1000fdx_cap:1, 10114045d941Ssowmini param_1000hdx_cap:1, 10124045d941Ssowmini param_100t4_cap:1, 10134045d941Ssowmini param_100fdx_cap:1, 10144045d941Ssowmini param_100hdx_cap:1, 10154045d941Ssowmini param_10fdx_cap:1, 10164045d941Ssowmini param_10hdx_cap:1, 10174045d941Ssowmini param_adv_autoneg:1, 10184045d941Ssowmini param_adv_pause:1, 10194045d941Ssowmini param_adv_asym_pause:1, 10204045d941Ssowmini param_adv_1000fdx:1, 10214045d941Ssowmini param_adv_1000hdx:1, 10224045d941Ssowmini param_adv_100t4:1, 10234045d941Ssowmini param_adv_100fdx:1, 10244045d941Ssowmini param_adv_100hdx:1, 10254045d941Ssowmini param_adv_10fdx:1, 10264045d941Ssowmini param_adv_10hdx:1, 10274045d941Ssowmini param_lp_autoneg:1, 10284045d941Ssowmini param_lp_pause:1, 10294045d941Ssowmini param_lp_asym_pause:1, 10304045d941Ssowmini param_lp_1000fdx:1, 10314045d941Ssowmini param_lp_1000hdx:1, 10324045d941Ssowmini param_lp_100t4:1; 10334045d941Ssowmini 10344045d941Ssowmini uint32_t param_lp_100fdx:1, 10354045d941Ssowmini param_lp_100hdx:1, 10364045d941Ssowmini param_lp_10fdx:1, 10374045d941Ssowmini param_lp_10hdx:1, 10384045d941Ssowmini param_pad_to_32:28; 10394045d941Ssowmini 104025f2d433Sxy150489 } e1000g_t; 104108057504Sxy150489 104208057504Sxy150489 104308057504Sxy150489 /* 104408057504Sxy150489 * Function prototypes 104508057504Sxy150489 */ 104654e0d7a5SMiles Xu, Sun Microsystems void e1000g_free_priv_devi_node(private_devi_list_t *devi_node); 104754e0d7a5SMiles Xu, Sun Microsystems void e1000g_free_rx_pending_buffers(e1000g_rx_data_t *rx_data); 104854e0d7a5SMiles Xu, Sun Microsystems void e1000g_free_rx_data(e1000g_rx_data_t *rx_data); 104908057504Sxy150489 int e1000g_alloc_dma_resources(struct e1000g *Adapter); 105008057504Sxy150489 void e1000g_release_dma_resources(struct e1000g *Adapter); 105154e0d7a5SMiles Xu, Sun Microsystems void e1000g_free_rx_sw_packet(p_rx_sw_packet_t packet, boolean_t full_release); 105225f2d433Sxy150489 void e1000g_tx_setup(struct e1000g *Adapter); 105325f2d433Sxy150489 void e1000g_rx_setup(struct e1000g *Adapter); 10543fb4efefSchangqing li - Sun Microsystems - Beijing China int e1000g_increase_rx_packets(e1000g_rx_data_t *rx_data); 105508057504Sxy150489 105608057504Sxy150489 int e1000g_recycle(e1000g_tx_ring_t *tx_ring); 105725f2d433Sxy150489 void e1000g_free_tx_swpkt(p_tx_sw_packet_t packet); 105825f2d433Sxy150489 void e1000g_tx_freemsg(e1000g_tx_ring_t *tx_ring); 105925f2d433Sxy150489 uint_t e1000g_tx_softint_worker(caddr_t arg1, caddr_t arg2); 106008057504Sxy150489 mblk_t *e1000g_m_tx(void *arg, mblk_t *mp); 1061ae6aa22aSVenugopal Iyer mblk_t *e1000g_receive(e1000g_rx_ring_t *rx_ring, mblk_t **tail, uint_t sz); 106225f2d433Sxy150489 void e1000g_rxfree_func(p_rx_sw_packet_t packet); 106308057504Sxy150489 106408057504Sxy150489 int e1000g_m_stat(void *arg, uint_t stat, uint64_t *val); 106525f2d433Sxy150489 int e1000g_init_stats(struct e1000g *Adapter); 10660dc2366fSVenugopal Iyer int e1000g_rx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *); 106725f2d433Sxy150489 void e1000_tbi_adjust_stats(struct e1000g *Adapter, 106825f2d433Sxy150489 uint32_t frame_len, uint8_t *mac_addr); 106908057504Sxy150489 107025f2d433Sxy150489 void e1000g_clear_interrupt(struct e1000g *Adapter); 107125f2d433Sxy150489 void e1000g_mask_interrupt(struct e1000g *Adapter); 107225f2d433Sxy150489 void e1000g_clear_all_interrupts(struct e1000g *Adapter); 107325f2d433Sxy150489 void e1000g_clear_tx_interrupt(struct e1000g *Adapter); 107425f2d433Sxy150489 void e1000g_mask_tx_interrupt(struct e1000g *Adapter); 107508057504Sxy150489 void phy_spd_state(struct e1000_hw *hw, boolean_t enable); 1076caf05df5SMiles Xu, Sun Microsystems void e1000_destroy_hw_mutex(struct e1000_hw *hw); 107708057504Sxy150489 void e1000_enable_pciex_master(struct e1000_hw *hw); 10789b6541b3Sgl147354 int e1000g_check_acc_handle(ddi_acc_handle_t handle); 10799b6541b3Sgl147354 int e1000g_check_dma_handle(ddi_dma_handle_t handle); 10809b6541b3Sgl147354 void e1000g_fm_ereport(struct e1000g *Adapter, char *detail); 1081837c1ac4SStephen Hanson void e1000g_set_fma_flags(int dma_flag); 10829ce7e93cScc210113 int e1000g_reset_link(struct e1000g *Adapter); 10839ce7e93cScc210113 108408057504Sxy150489 /* 10857c5988f9SRobert Mustacchi * Functions for working around various problems, these used to be from the 10867c5988f9SRobert Mustacchi * common code. 10877c5988f9SRobert Mustacchi */ 10887c5988f9SRobert Mustacchi s32 e1000_fifo_workaround_82547(struct e1000_hw *hw, u16 length); 10897c5988f9SRobert Mustacchi void e1000_update_tx_fifo_head_82547(struct e1000_hw *hw, u32 length); 10907c5988f9SRobert Mustacchi void e1000_set_ttl_workaround_state_82541(struct e1000_hw *hw, bool state); 10917c5988f9SRobert Mustacchi bool e1000_ttl_workaround_enabled_82541(struct e1000_hw *hw); 10927c5988f9SRobert Mustacchi s32 e1000_igp_ttl_workaround_82547(struct e1000_hw *hw); 10937c5988f9SRobert Mustacchi 10947c5988f9SRobert Mustacchi /* 10957c5988f9SRobert Mustacchi * I219 specific workarounds 10967c5988f9SRobert Mustacchi */ 10977c5988f9SRobert Mustacchi #define PCICFG_DESC_RING_STATUS 0xe4 10987c5988f9SRobert Mustacchi #define FLUSH_DESC_REQUIRED 0x100 10997c5988f9SRobert Mustacchi extern void e1000g_flush_rx_ring(struct e1000g *); 11007c5988f9SRobert Mustacchi extern void e1000g_flush_tx_ring(struct e1000g *); 11017c5988f9SRobert Mustacchi 11027c5988f9SRobert Mustacchi /* 110308057504Sxy150489 * Global variables 110408057504Sxy150489 */ 11050f70fbf8Sxy150489 extern boolean_t e1000g_force_detach; 110608057504Sxy150489 extern uint32_t e1000g_mblks_pending; 110754e0d7a5SMiles Xu, Sun Microsystems extern kmutex_t e1000g_rx_detach_lock; 1108ea6b684aSyy150190 extern private_devi_list_t *e1000g_private_devi_list; 1109da14cebeSEric Cheng extern int e1000g_poll_mode; 111008057504Sxy150489 111108057504Sxy150489 #ifdef __cplusplus 111208057504Sxy150489 } 111308057504Sxy150489 #endif 111408057504Sxy150489 111508057504Sxy150489 #endif /* _E1000G_SW_H */ 1116