xref: /illumos-gate/usr/src/uts/common/io/igb/e1000_osdep.h (revision fa4e188e8e6bc718b1a096b3d1dc046952a69304)
175eba5b6SRobert Mustacchi /*
275eba5b6SRobert Mustacchi  * CDDL HEADER START
375eba5b6SRobert Mustacchi  *
475eba5b6SRobert Mustacchi  * Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
575eba5b6SRobert Mustacchi  * The contents of this file are subject to the terms of the
675eba5b6SRobert Mustacchi  * Common Development and Distribution License (the "License").
775eba5b6SRobert Mustacchi  * You may not use this file except in compliance with the License.
875eba5b6SRobert Mustacchi  *
975eba5b6SRobert Mustacchi  * You can obtain a copy of the license at:
1075eba5b6SRobert Mustacchi  *	http://www.opensolaris.org/os/licensing.
1175eba5b6SRobert Mustacchi  * See the License for the specific language governing permissions
1275eba5b6SRobert Mustacchi  * and limitations under the License.
1375eba5b6SRobert Mustacchi  *
1475eba5b6SRobert Mustacchi  * When using or redistributing this file, you may do so under the
1575eba5b6SRobert Mustacchi  * License only. No other modification of this header is permitted.
1675eba5b6SRobert Mustacchi  *
1775eba5b6SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
1875eba5b6SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
1975eba5b6SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
2075eba5b6SRobert Mustacchi  *
2175eba5b6SRobert Mustacchi  * CDDL HEADER END
2275eba5b6SRobert Mustacchi  */
2375eba5b6SRobert Mustacchi 
2475eba5b6SRobert Mustacchi /*
2575eba5b6SRobert Mustacchi  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
2675eba5b6SRobert Mustacchi  * Use is subject to license terms of the CDDL.
2775eba5b6SRobert Mustacchi  */
2875eba5b6SRobert Mustacchi 
2975eba5b6SRobert Mustacchi #ifndef	_IGB_OSDEP_H
3075eba5b6SRobert Mustacchi #define	_IGB_OSDEP_H
3175eba5b6SRobert Mustacchi 
3275eba5b6SRobert Mustacchi #ifdef __cplusplus
3375eba5b6SRobert Mustacchi extern "C" {
3475eba5b6SRobert Mustacchi #endif
3575eba5b6SRobert Mustacchi 
3675eba5b6SRobert Mustacchi #include <sys/types.h>
3775eba5b6SRobert Mustacchi #include <sys/conf.h>
3875eba5b6SRobert Mustacchi #include <sys/debug.h>
3975eba5b6SRobert Mustacchi #include <sys/stropts.h>
4075eba5b6SRobert Mustacchi #include <sys/stream.h>
4175eba5b6SRobert Mustacchi #include <sys/strlog.h>
4275eba5b6SRobert Mustacchi #include <sys/kmem.h>
4375eba5b6SRobert Mustacchi #include <sys/stat.h>
4475eba5b6SRobert Mustacchi #include <sys/kstat.h>
4575eba5b6SRobert Mustacchi #include <sys/modctl.h>
4675eba5b6SRobert Mustacchi #include <sys/errno.h>
4775eba5b6SRobert Mustacchi #include <sys/ddi.h>
4875eba5b6SRobert Mustacchi #include <sys/dditypes.h>
4975eba5b6SRobert Mustacchi #include <sys/sunddi.h>
5075eba5b6SRobert Mustacchi #include <sys/pci.h>
5175eba5b6SRobert Mustacchi #include <sys/pci_cap.h>
5275eba5b6SRobert Mustacchi #include <sys/atomic.h>
5375eba5b6SRobert Mustacchi #include <sys/note.h>
5475eba5b6SRobert Mustacchi #include "igb_debug.h"
5575eba5b6SRobert Mustacchi 
5675eba5b6SRobert Mustacchi #define	usec_delay(x)		drv_usecwait(x)
57c124a83eSRobert Mustacchi #define	usec_delay_irq		usec_delay
5875eba5b6SRobert Mustacchi #define	msec_delay(x)		drv_usecwait(x * 1000)
5975eba5b6SRobert Mustacchi #define	msec_delay_irq		msec_delay
6075eba5b6SRobert Mustacchi 
6175eba5b6SRobert Mustacchi #define	DEBUGOUT(S)		IGB_DEBUGLOG_0(NULL, S)
6275eba5b6SRobert Mustacchi #define	DEBUGOUT1(S, A)		IGB_DEBUGLOG_1(NULL, S, A)
6375eba5b6SRobert Mustacchi #define	DEBUGOUT2(S, A, B)	IGB_DEBUGLOG_2(NULL, S, A, B)
6475eba5b6SRobert Mustacchi #define	DEBUGOUT3(S, A, B, C)	IGB_DEBUGLOG_3(NULL, S, A, B, C)
6575eba5b6SRobert Mustacchi 
66*fa4e188eSYuri Pankov #ifdef IGB_DEBUG
67*fa4e188eSYuri Pankov #define	DEBUGFUNC(F)		IGB_DEBUGFUNC(F)
68*fa4e188eSYuri Pankov #else
69*fa4e188eSYuri Pankov #define	DEBUGFUNC(F)
70*fa4e188eSYuri Pankov #endif
7175eba5b6SRobert Mustacchi 
7275eba5b6SRobert Mustacchi #define	OS_DEP(hw)		((struct igb_osdep *)((hw)->back))
7375eba5b6SRobert Mustacchi 
7475eba5b6SRobert Mustacchi #define	false			B_FALSE
7575eba5b6SRobert Mustacchi #define	true			B_TRUE
7675eba5b6SRobert Mustacchi #define	FALSE			false
7775eba5b6SRobert Mustacchi #define	TRUE			true
7875eba5b6SRobert Mustacchi 
7975eba5b6SRobert Mustacchi #define	CMD_MEM_WRT_INVALIDATE	0x0010	/* BIT_4 */
8075eba5b6SRobert Mustacchi #define	PCI_COMMAND_REGISTER	0x04
8175eba5b6SRobert Mustacchi #define	PCI_EX_CONF_CAP		0xE0
8275eba5b6SRobert Mustacchi 
8375eba5b6SRobert Mustacchi 
8475eba5b6SRobert Mustacchi /*
8575eba5b6SRobert Mustacchi  * Constants used in setting flow control thresholds
8675eba5b6SRobert Mustacchi  */
8775eba5b6SRobert Mustacchi #define	E1000_PBA_MASK		0xffff
8875eba5b6SRobert Mustacchi #define	E1000_PBA_SHIFT		10
8975eba5b6SRobert Mustacchi #define	E1000_FC_HIGH_DIFF	0x1638 /* High: 5688 bytes below Rx FIFO size */
9075eba5b6SRobert Mustacchi #define	E1000_FC_LOW_DIFF	0x1640 /* Low: 5696 bytes below Rx FIFO size */
9175eba5b6SRobert Mustacchi #define	E1000_FC_PAUSE_TIME	0x0680 /* 858 usec */
9275eba5b6SRobert Mustacchi 
9375eba5b6SRobert Mustacchi /* PHY Extended Status Register */
9475eba5b6SRobert Mustacchi #define	IEEE_ESR_1000T_HD_CAPS	0x1000	/* 1000T HD capable */
9575eba5b6SRobert Mustacchi #define	IEEE_ESR_1000T_FD_CAPS	0x2000	/* 1000T FD capable */
9675eba5b6SRobert Mustacchi #define	IEEE_ESR_1000X_HD_CAPS	0x4000	/* 1000X HD capable */
9775eba5b6SRobert Mustacchi #define	IEEE_ESR_1000X_FD_CAPS	0x8000	/* 1000X FD capable */
9875eba5b6SRobert Mustacchi 
9975eba5b6SRobert Mustacchi /* VMDq MODE supported by hardware */
10075eba5b6SRobert Mustacchi #define	E1000_VMDQ_OFF		0
10175eba5b6SRobert Mustacchi #define	E1000_VMDQ_MAC		1
10275eba5b6SRobert Mustacchi #define	E1000_VMDQ_MAC_RSS	2
10375eba5b6SRobert Mustacchi 
10475eba5b6SRobert Mustacchi /* VMDq based on packet destination MAC address */
10575eba5b6SRobert Mustacchi #define	E1000_MRQC_ENABLE_VMDQ_MAC_GROUP	0x00000003
10675eba5b6SRobert Mustacchi /* VMDq based on packet destination MAC address and RSS */
10775eba5b6SRobert Mustacchi #define	E1000_MRQC_ENABLE_VMDQ_MAC_RSS_GROUP	0x00000005
10875eba5b6SRobert Mustacchi /* The default queue in each VMDqs */
10975eba5b6SRobert Mustacchi #define	E1000_VMDQ_MAC_GROUP_DEFAULT_QUEUE	0x100
11075eba5b6SRobert Mustacchi 
11175eba5b6SRobert Mustacchi #define	E1000_WRITE_FLUSH(a)	(void) E1000_READ_REG(a, E1000_STATUS)
11275eba5b6SRobert Mustacchi 
11375eba5b6SRobert Mustacchi #define	E1000_WRITE_REG(hw, reg, value)	\
11475eba5b6SRobert Mustacchi 	ddi_put32((OS_DEP(hw))->reg_handle, \
11575eba5b6SRobert Mustacchi 	    (uint32_t *)((uintptr_t)(hw)->hw_addr + reg), (value))
11675eba5b6SRobert Mustacchi 
11775eba5b6SRobert Mustacchi #define	E1000_READ_REG(hw, reg)	\
11875eba5b6SRobert Mustacchi 	ddi_get32((OS_DEP(hw))->reg_handle, \
11975eba5b6SRobert Mustacchi 	    (uint32_t *)((uintptr_t)(hw)->hw_addr + reg))
12075eba5b6SRobert Mustacchi 
12175eba5b6SRobert Mustacchi #define	E1000_WRITE_REG_ARRAY(hw, reg, offset, value)	\
12275eba5b6SRobert Mustacchi 	ddi_put32((OS_DEP(hw))->reg_handle, \
12375eba5b6SRobert Mustacchi 	    (uint32_t *)((uintptr_t)(hw)->hw_addr + reg + ((offset) << 2)), \
12475eba5b6SRobert Mustacchi 	    (value))
12575eba5b6SRobert Mustacchi 
12675eba5b6SRobert Mustacchi #define	E1000_READ_REG_ARRAY(hw, reg, offset)	\
12775eba5b6SRobert Mustacchi 	ddi_get32((OS_DEP(hw))->reg_handle, \
12875eba5b6SRobert Mustacchi 	    (uint32_t *)((uintptr_t)(hw)->hw_addr + reg + ((offset) << 2)))
12975eba5b6SRobert Mustacchi 
13075eba5b6SRobert Mustacchi #define	E1000_WRITE_REG_ARRAY_DWORD(a, reg, offset, value)	\
13175eba5b6SRobert Mustacchi 	E1000_WRITE_REG_ARRAY(a, reg, offset, value)
13275eba5b6SRobert Mustacchi #define	E1000_READ_REG_ARRAY_DWORD(a, reg, offset)		\
13375eba5b6SRobert Mustacchi 	E1000_READ_REG_ARRAY(a, reg, offset)
13475eba5b6SRobert Mustacchi 
13575eba5b6SRobert Mustacchi 
13675eba5b6SRobert Mustacchi #define	E1000_READ_FLASH_REG(hw, reg)	\
13775eba5b6SRobert Mustacchi 	ddi_get32((OS_DEP(hw))->ich_flash_handle, \
13875eba5b6SRobert Mustacchi 		(uint32_t *)((uintptr_t)(hw)->flash_address + (reg)))
13975eba5b6SRobert Mustacchi 
14075eba5b6SRobert Mustacchi #define	E1000_READ_FLASH_REG16(hw, reg)	\
14175eba5b6SRobert Mustacchi 	ddi_get16((OS_DEP(hw))->ich_flash_handle, \
14275eba5b6SRobert Mustacchi 		(uint16_t *)((uintptr_t)(hw)->flash_address + (reg)))
14375eba5b6SRobert Mustacchi 
14475eba5b6SRobert Mustacchi #define	E1000_WRITE_FLASH_REG(hw, reg, value)	\
14575eba5b6SRobert Mustacchi 	ddi_put32((OS_DEP(hw))->ich_flash_handle, \
14675eba5b6SRobert Mustacchi 		(uint32_t *)((uintptr_t)(hw)->flash_address + (reg)), (value))
14775eba5b6SRobert Mustacchi 
14875eba5b6SRobert Mustacchi #define	E1000_WRITE_FLASH_REG16(hw, reg, value)	\
14975eba5b6SRobert Mustacchi 	ddi_put16((OS_DEP(hw))->ich_flash_handle, \
15075eba5b6SRobert Mustacchi 		(uint16_t *)((uintptr_t)(hw)->flash_address + (reg)), (value))
15175eba5b6SRobert Mustacchi 
15275eba5b6SRobert Mustacchi #define	UNREFERENCED_1PARAMETER(_p)		_NOTE(ARGUNUSED(_p))
15375eba5b6SRobert Mustacchi #define	UNREFERENCED_2PARAMETER(_p, _q)		_NOTE(ARGUNUSED(_p, _q))
15475eba5b6SRobert Mustacchi #define	UNREFERENCED_3PARAMETER(_p, _q, _r)	_NOTE(ARGUNUSED(_p, _q, _r))
15575eba5b6SRobert Mustacchi #define	UNREFERENCED_4PARAMETER(_p, _q, _r, _s)	_NOTE(ARGUNUSED(_p, _q, _r, _s))
15675eba5b6SRobert Mustacchi #define	UNREFERENCED_5PARAMETER(_p, _q, _r, _s, _t)	\
15775eba5b6SRobert Mustacchi 	_NOTE(ARGUNUSED(_p, _q, _r, _s, _t))
15875eba5b6SRobert Mustacchi 
15975eba5b6SRobert Mustacchi #define	__le16		u16
16075eba5b6SRobert Mustacchi #define	__le32		u32
16175eba5b6SRobert Mustacchi #define	__le64		u64
16275eba5b6SRobert Mustacchi 
16375eba5b6SRobert Mustacchi typedef	int8_t		s8;
16475eba5b6SRobert Mustacchi typedef	int16_t		s16;
16575eba5b6SRobert Mustacchi typedef	int32_t		s32;
16675eba5b6SRobert Mustacchi typedef	int64_t		s64;
16775eba5b6SRobert Mustacchi typedef uint8_t		u8;
16875eba5b6SRobert Mustacchi typedef	uint16_t 	u16;
16975eba5b6SRobert Mustacchi typedef	uint32_t	u32;
17075eba5b6SRobert Mustacchi typedef	uint64_t	u64;
17175eba5b6SRobert Mustacchi typedef	boolean_t	bool;
17275eba5b6SRobert Mustacchi 
17375eba5b6SRobert Mustacchi /*
17475eba5b6SRobert Mustacchi  * igb only uses the first two of the ddi_acc_handle_t, the latter end up coming
17575eba5b6SRobert Mustacchi  * from the common code for devices that igb doesn't support. For now, we end up
17675eba5b6SRobert Mustacchi  * bringing in those other two handles just for making life easier for sharin
17775eba5b6SRobert Mustacchi  * code.
17875eba5b6SRobert Mustacchi  */
17975eba5b6SRobert Mustacchi struct igb_osdep {
18075eba5b6SRobert Mustacchi 	ddi_acc_handle_t reg_handle;
18175eba5b6SRobert Mustacchi 	ddi_acc_handle_t cfg_handle;
18275eba5b6SRobert Mustacchi 	ddi_acc_handle_t ich_flash_handle; /* UNUSED */
18375eba5b6SRobert Mustacchi 	ddi_acc_handle_t io_reg_handle; /* UNUSED */
18475eba5b6SRobert Mustacchi 	struct igb *igb;
18575eba5b6SRobert Mustacchi };
18675eba5b6SRobert Mustacchi 
18775eba5b6SRobert Mustacchi /* Shared Code Mutex Defines */
18875eba5b6SRobert Mustacchi #define	E1000_MUTEX			kmutex_t
18975eba5b6SRobert Mustacchi #define	E1000_MUTEX_INIT(mutex)		mutex_init(mutex, NULL, \
19075eba5b6SRobert Mustacchi 	MUTEX_DRIVER, NULL)
19175eba5b6SRobert Mustacchi #define	E1000_MUTEX_DESTROY(mutex)	mutex_destroy(mutex)
19275eba5b6SRobert Mustacchi 
19375eba5b6SRobert Mustacchi #define	E1000_MUTEX_LOCK(mutex)		mutex_enter(mutex)
19475eba5b6SRobert Mustacchi #define	E1000_MUTEX_TRYLOCK(mutex)	mutex_tryenter(mutex)
19575eba5b6SRobert Mustacchi #define	E1000_MUTEX_UNLOCK(mutex)	mutex_exit(mutex)
19675eba5b6SRobert Mustacchi 
19775eba5b6SRobert Mustacchi #ifdef __sparc	/* on SPARC, use only memory-mapped routines */
19875eba5b6SRobert Mustacchi #define	E1000_WRITE_REG_IO	E1000_WRITE_REG
19975eba5b6SRobert Mustacchi #else	/* on x86, use port io routines */
20075eba5b6SRobert Mustacchi #define	E1000_WRITE_REG_IO(a, reg, val)	{ \
20175eba5b6SRobert Mustacchi 	ddi_put32((OS_DEP(a))->io_reg_handle, \
20275eba5b6SRobert Mustacchi 	    (uint32_t *)(a)->io_base, \
20375eba5b6SRobert Mustacchi 	    reg); \
20475eba5b6SRobert Mustacchi 	ddi_put32((OS_DEP(a))->io_reg_handle, \
20575eba5b6SRobert Mustacchi 	    (uint32_t *)((a)->io_base + 4), \
20675eba5b6SRobert Mustacchi 	    val); \
20775eba5b6SRobert Mustacchi }
20875eba5b6SRobert Mustacchi #endif	/* __sparc */
20975eba5b6SRobert Mustacchi 
21075eba5b6SRobert Mustacchi #ifdef __cplusplus
21175eba5b6SRobert Mustacchi }
21275eba5b6SRobert Mustacchi #endif
21375eba5b6SRobert Mustacchi 
21475eba5b6SRobert Mustacchi #endif	/* _IGB_OSDEP_H */
215