18cfa0ad2SJack F Vogel /****************************************************************************** 28cfa0ad2SJack F Vogel 37c669ab6SSean Bruno Copyright (c) 2001-2015, Intel Corporation 48cfa0ad2SJack F Vogel All rights reserved. 58cfa0ad2SJack F Vogel 68cfa0ad2SJack F Vogel Redistribution and use in source and binary forms, with or without 78cfa0ad2SJack F Vogel modification, are permitted provided that the following conditions are met: 88cfa0ad2SJack F Vogel 98cfa0ad2SJack F Vogel 1. Redistributions of source code must retain the above copyright notice, 108cfa0ad2SJack F Vogel this list of conditions and the following disclaimer. 118cfa0ad2SJack F Vogel 128cfa0ad2SJack F Vogel 2. Redistributions in binary form must reproduce the above copyright 138cfa0ad2SJack F Vogel notice, this list of conditions and the following disclaimer in the 148cfa0ad2SJack F Vogel documentation and/or other materials provided with the distribution. 158cfa0ad2SJack F Vogel 168cfa0ad2SJack F Vogel 3. Neither the name of the Intel Corporation nor the names of its 178cfa0ad2SJack F Vogel contributors may be used to endorse or promote products derived from 188cfa0ad2SJack F Vogel this software without specific prior written permission. 198cfa0ad2SJack F Vogel 208cfa0ad2SJack F Vogel THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 218cfa0ad2SJack F Vogel AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 228cfa0ad2SJack F Vogel IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 238cfa0ad2SJack F Vogel ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 248cfa0ad2SJack F Vogel LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 258cfa0ad2SJack F Vogel CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 268cfa0ad2SJack F Vogel SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 278cfa0ad2SJack F Vogel INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 288cfa0ad2SJack F Vogel CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 298cfa0ad2SJack F Vogel ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 308cfa0ad2SJack F Vogel POSSIBILITY OF SUCH DAMAGE. 318cfa0ad2SJack F Vogel 328cfa0ad2SJack F Vogel ******************************************************************************/ 338cfa0ad2SJack F Vogel /*$FreeBSD$*/ 348cfa0ad2SJack F Vogel 358cfa0ad2SJack F Vogel 368cfa0ad2SJack F Vogel #ifndef _FREEBSD_OS_H_ 378cfa0ad2SJack F Vogel #define _FREEBSD_OS_H_ 388cfa0ad2SJack F Vogel 398cfa0ad2SJack F Vogel #include <sys/types.h> 408cfa0ad2SJack F Vogel #include <sys/param.h> 418cfa0ad2SJack F Vogel #include <sys/systm.h> 42afb98829SJack F Vogel #include <sys/lock.h> 43afb98829SJack F Vogel #include <sys/mutex.h> 448cfa0ad2SJack F Vogel #include <sys/mbuf.h> 458cfa0ad2SJack F Vogel #include <sys/protosw.h> 468cfa0ad2SJack F Vogel #include <sys/socket.h> 478cfa0ad2SJack F Vogel #include <sys/malloc.h> 488cfa0ad2SJack F Vogel #include <sys/kernel.h> 498cfa0ad2SJack F Vogel #include <sys/bus.h> 508cfa0ad2SJack F Vogel #include <machine/bus.h> 518cfa0ad2SJack F Vogel #include <sys/rman.h> 528cfa0ad2SJack F Vogel #include <machine/resource.h> 538cfa0ad2SJack F Vogel #include <vm/vm.h> 548cfa0ad2SJack F Vogel #include <vm/pmap.h> 558cfa0ad2SJack F Vogel #include <machine/clock.h> 568cfa0ad2SJack F Vogel #include <dev/pci/pcivar.h> 578cfa0ad2SJack F Vogel #include <dev/pci/pcireg.h> 588cfa0ad2SJack F Vogel 598cfa0ad2SJack F Vogel 608cfa0ad2SJack F Vogel #define ASSERT(x) if(!(x)) panic("EM: x") 618cfa0ad2SJack F Vogel 62*ab2e3f79SStephen Hurd #define usec_delay(x) DELAY(x) 63c80429ceSEric Joyner #define usec_delay_irq(x) usec_delay(x) 64*ab2e3f79SStephen Hurd #define msec_delay(x) DELAY(1000*(x)) 65*ab2e3f79SStephen Hurd #define msec_delay_irq(x) DELAY(1000*(x)) 668cfa0ad2SJack F Vogel 67c80429ceSEric Joyner /* Enable/disable debugging statements in shared code */ 68c80429ceSEric Joyner #define DBG 0 69c80429ceSEric Joyner 70c80429ceSEric Joyner #define DEBUGOUT(...) \ 71c80429ceSEric Joyner do { if (DBG) printf(__VA_ARGS__); } while (0) 72c80429ceSEric Joyner #define DEBUGOUT1(...) DEBUGOUT(__VA_ARGS__) 73c80429ceSEric Joyner #define DEBUGOUT2(...) DEBUGOUT(__VA_ARGS__) 74c80429ceSEric Joyner #define DEBUGOUT3(...) DEBUGOUT(__VA_ARGS__) 75c80429ceSEric Joyner #define DEBUGOUT7(...) DEBUGOUT(__VA_ARGS__) 76c80429ceSEric Joyner #define DEBUGFUNC(F) DEBUGOUT(F "\n") 778cfa0ad2SJack F Vogel 788cfa0ad2SJack F Vogel #define STATIC static 798cfa0ad2SJack F Vogel #define FALSE 0 808cfa0ad2SJack F Vogel #define TRUE 1 818cfa0ad2SJack F Vogel #define CMD_MEM_WRT_INVALIDATE 0x0010 /* BIT_4 */ 828cfa0ad2SJack F Vogel #define PCI_COMMAND_REGISTER PCIR_COMMAND 838cfa0ad2SJack F Vogel 84*ab2e3f79SStephen Hurd /* Mutex used in the shared code */ 85*ab2e3f79SStephen Hurd #define E1000_MUTEX struct mtx 86*ab2e3f79SStephen Hurd #define E1000_MUTEX_INIT(mutex) mtx_init((mutex), #mutex, \ 87*ab2e3f79SStephen Hurd MTX_NETWORK_LOCK, \ 88*ab2e3f79SStephen Hurd MTX_DEF | MTX_DUPOK) 89*ab2e3f79SStephen Hurd #define E1000_MUTEX_DESTROY(mutex) mtx_destroy(mutex) 90*ab2e3f79SStephen Hurd #define E1000_MUTEX_LOCK(mutex) mtx_lock(mutex) 91*ab2e3f79SStephen Hurd #define E1000_MUTEX_TRYLOCK(mutex) mtx_trylock(mutex) 92*ab2e3f79SStephen Hurd #define E1000_MUTEX_UNLOCK(mutex) mtx_unlock(mutex) 93*ab2e3f79SStephen Hurd 948cfa0ad2SJack F Vogel typedef uint64_t u64; 958cfa0ad2SJack F Vogel typedef uint32_t u32; 968cfa0ad2SJack F Vogel typedef uint16_t u16; 978cfa0ad2SJack F Vogel typedef uint8_t u8; 988cfa0ad2SJack F Vogel typedef int64_t s64; 998cfa0ad2SJack F Vogel typedef int32_t s32; 1008cfa0ad2SJack F Vogel typedef int16_t s16; 1018cfa0ad2SJack F Vogel typedef int8_t s8; 1028cfa0ad2SJack F Vogel 103daf9197cSJack F Vogel #define __le16 u16 104daf9197cSJack F Vogel #define __le32 u32 105daf9197cSJack F Vogel #define __le64 u64 106daf9197cSJack F Vogel 1078cc64f1eSJack F Vogel #if __FreeBSD_version < 800000 1084edd8523SJack F Vogel #if defined(__i386__) || defined(__amd64__) 1094edd8523SJack F Vogel #define mb() __asm volatile("mfence" ::: "memory") 1104edd8523SJack F Vogel #define wmb() __asm volatile("sfence" ::: "memory") 1114edd8523SJack F Vogel #define rmb() __asm volatile("lfence" ::: "memory") 1124edd8523SJack F Vogel #else 1134edd8523SJack F Vogel #define mb() 1144edd8523SJack F Vogel #define rmb() 1154edd8523SJack F Vogel #define wmb() 1164edd8523SJack F Vogel #endif 1174edd8523SJack F Vogel #endif /*__FreeBSD_version < 800000 */ 1184edd8523SJack F Vogel 1194edd8523SJack F Vogel #if defined(__i386__) || defined(__amd64__) 1204edd8523SJack F Vogel static __inline 1214edd8523SJack F Vogel void prefetch(void *x) 1224edd8523SJack F Vogel { 1234edd8523SJack F Vogel __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x)); 1244edd8523SJack F Vogel } 1254edd8523SJack F Vogel #else 1264edd8523SJack F Vogel #define prefetch(x) 1274edd8523SJack F Vogel #endif 1284edd8523SJack F Vogel 1298cfa0ad2SJack F Vogel struct e1000_osdep 1308cfa0ad2SJack F Vogel { 1318cfa0ad2SJack F Vogel bus_space_tag_t mem_bus_space_tag; 1328cfa0ad2SJack F Vogel bus_space_handle_t mem_bus_space_handle; 1338cfa0ad2SJack F Vogel bus_space_tag_t io_bus_space_tag; 1348cfa0ad2SJack F Vogel bus_space_handle_t io_bus_space_handle; 1358cfa0ad2SJack F Vogel bus_space_tag_t flash_bus_space_tag; 1368cfa0ad2SJack F Vogel bus_space_handle_t flash_bus_space_handle; 137bd937497SJean-Sébastien Pédron device_t dev; 1388cfa0ad2SJack F Vogel }; 1398cfa0ad2SJack F Vogel 1408cfa0ad2SJack F Vogel #define E1000_REGISTER(hw, reg) (((hw)->mac.type >= e1000_82543) \ 1418cfa0ad2SJack F Vogel ? reg : e1000_translate_register_82542(reg)) 1428cfa0ad2SJack F Vogel 1438cfa0ad2SJack F Vogel #define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS) 1448cfa0ad2SJack F Vogel 1458cfa0ad2SJack F Vogel /* Read from an absolute offset in the adapter's memory space */ 1468cfa0ad2SJack F Vogel #define E1000_READ_OFFSET(hw, offset) \ 1478cfa0ad2SJack F Vogel bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1488cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, offset) 1498cfa0ad2SJack F Vogel 1508cfa0ad2SJack F Vogel /* Write to an absolute offset in the adapter's memory space */ 1518cfa0ad2SJack F Vogel #define E1000_WRITE_OFFSET(hw, offset, value) \ 1528cfa0ad2SJack F Vogel bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1538cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, offset, value) 1548cfa0ad2SJack F Vogel 1558cfa0ad2SJack F Vogel /* Register READ/WRITE macros */ 1568cfa0ad2SJack F Vogel 1578cfa0ad2SJack F Vogel #define E1000_READ_REG(hw, reg) \ 1588cfa0ad2SJack F Vogel bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1598cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1608cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg)) 1618cfa0ad2SJack F Vogel 1628cfa0ad2SJack F Vogel #define E1000_WRITE_REG(hw, reg, value) \ 1638cfa0ad2SJack F Vogel bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1648cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1658cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg), value) 1668cfa0ad2SJack F Vogel 1678cfa0ad2SJack F Vogel #define E1000_READ_REG_ARRAY(hw, reg, index) \ 1688cfa0ad2SJack F Vogel bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1698cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1708cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg) + ((index)<< 2)) 1718cfa0ad2SJack F Vogel 1728cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY(hw, reg, index, value) \ 1738cfa0ad2SJack F Vogel bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1748cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1758cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg) + ((index)<< 2), value) 1768cfa0ad2SJack F Vogel 1778cfa0ad2SJack F Vogel #define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY 1788cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY 1798cfa0ad2SJack F Vogel 1808cfa0ad2SJack F Vogel #define E1000_READ_REG_ARRAY_BYTE(hw, reg, index) \ 1818cfa0ad2SJack F Vogel bus_space_read_1(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1828cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1838cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg) + index) 1848cfa0ad2SJack F Vogel 1858cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY_BYTE(hw, reg, index, value) \ 1868cfa0ad2SJack F Vogel bus_space_write_1(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1878cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1888cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg) + index, value) 1898cfa0ad2SJack F Vogel 1908cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY_WORD(hw, reg, index, value) \ 1918cfa0ad2SJack F Vogel bus_space_write_2(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \ 1928cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \ 1938cfa0ad2SJack F Vogel E1000_REGISTER(hw, reg) + (index << 1), value) 1948cfa0ad2SJack F Vogel 1958cfa0ad2SJack F Vogel #define E1000_WRITE_REG_IO(hw, reg, value) do {\ 1968cfa0ad2SJack F Vogel bus_space_write_4(((struct e1000_osdep *)(hw)->back)->io_bus_space_tag, \ 1978cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->io_bus_space_handle, \ 1988cfa0ad2SJack F Vogel (hw)->io_base, reg); \ 1998cfa0ad2SJack F Vogel bus_space_write_4(((struct e1000_osdep *)(hw)->back)->io_bus_space_tag, \ 2008cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->io_bus_space_handle, \ 2018cfa0ad2SJack F Vogel (hw)->io_base + 4, value); } while (0) 2028cfa0ad2SJack F Vogel 2038cfa0ad2SJack F Vogel #define E1000_READ_FLASH_REG(hw, reg) \ 2048cfa0ad2SJack F Vogel bus_space_read_4(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \ 2058cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg) 2068cfa0ad2SJack F Vogel 2078cfa0ad2SJack F Vogel #define E1000_READ_FLASH_REG16(hw, reg) \ 2088cfa0ad2SJack F Vogel bus_space_read_2(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \ 2098cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg) 2108cfa0ad2SJack F Vogel 2118cfa0ad2SJack F Vogel #define E1000_WRITE_FLASH_REG(hw, reg, value) \ 2128cfa0ad2SJack F Vogel bus_space_write_4(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \ 2138cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg, value) 2148cfa0ad2SJack F Vogel 2158cfa0ad2SJack F Vogel #define E1000_WRITE_FLASH_REG16(hw, reg, value) \ 2168cfa0ad2SJack F Vogel bus_space_write_2(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \ 2178cfa0ad2SJack F Vogel ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg, value) 2188cfa0ad2SJack F Vogel 2198cfa0ad2SJack F Vogel #endif /* _FREEBSD_OS_H_ */ 2208cfa0ad2SJack F Vogel 221