diff options
Diffstat (limited to 'sys/dev/nxge/if_nxge.h')
-rw-r--r-- | sys/dev/nxge/if_nxge.h | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/sys/dev/nxge/if_nxge.h b/sys/dev/nxge/if_nxge.h new file mode 100644 index 0000000..1e99a62 --- /dev/null +++ b/sys/dev/nxge/if_nxge.h @@ -0,0 +1,287 @@ +/*- + * Copyright (c) 2002-2007 Neterion, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * if_xge.h + */ + +#ifndef _IF_XGE_H +#define _IF_XGE_H + +#include <dev/nxge/include/xgehal.h> +#include <dev/nxge/xge-osdep.h> + +#if defined(XGE_FEATURE_TSO) && (__FreeBSD_version < 700026) +#undef XGE_FEATURE_TSO +#endif + +#if defined(XGE_FEATURE_LRO) +#if __FreeBSD_version < 700047 +#undef XGE_FEATURE_LRO +#undef XGE_HAL_CONFIG_LRO +#else +#define XGE_HAL_CONFIG_LRO +#endif +#endif + +#ifdef FUNC_PRINT +#define ENTER_FUNCTION xge_os_printf("Enter\t==>[%s]\n", __FUNCTION__); +#define LEAVE_FUNCTION xge_os_printf("Leave\t<==[%s]\n", __FUNCTION__); +#else +#define ENTER_FUNCTION +#define LEAVE_FUNCTION +#endif + +/* Printing description, Copyright */ +#define DRIVER_VERSION XGELL_VERSION_MAJOR"." \ + XGELL_VERSION_MINOR"." \ + XGELL_VERSION_FIX"." \ + XGELL_VERSION_BUILD +#define COPYRIGHT_STRING "Copyright(c) 2002-2007 Neterion Inc." +#define PRINT_COPYRIGHT xge_os_printf("%s", COPYRIGHT_STRING) + +/* Printing */ +#define xge_trace(trace, fmt, args...) xge_debug_ll(trace, fmt, ## args); +#define xge_ctrace(trace, fmt...) xge_debug_ll(trace, fmt); + +#define BUFALIGN(buffer_length) \ + if((buffer_length % 128) != 0) { \ + buffer_length += (128 - (buffer_length % 128)); \ + } + +static inline void * +xge_malloc(unsigned long size) { + void *vaddr = malloc(size, M_DEVBUF, M_NOWAIT); + bzero(vaddr, size); + return vaddr; +} + +#define SINGLE_ALLOC 0 +#define MULTI_ALLOC 1 +#define SAVE 0 +#define RESTORE 1 +#define UP 1 +#define DOWN 0 +#define XGE_DEFAULT_USER_HARDCODED -1 +#define MAX_MBUF_FRAGS 20 /* Maximum number of fragments */ +#define MAX_SEGS 100 /* Maximum number of segments */ +#define XGELL_TX_LEVEL_LOW 16 +#define XGE_RING_COUNT XGE_HAL_MIN_RING_NUM +#define BUFFER_SIZE 20 + +/* Default values to configuration parameters */ +#define XGE_DEFAULT_INITIAL_MTU 1500 +#define XGE_DEFAULT_LATENCY_TIMER -1 +#define XGE_DEFAULT_MAX_SPLITS_TRANS -1 +#define XGE_DEFAULT_MMRB_COUNT -1 +#define XGE_DEFAULT_SHARED_SPLITS 0 +#define XGE_DEFAULT_ISR_POLLING_CNT 8 +#define XGE_DEFAULT_STATS_REFRESH_TIME_SEC 4 +#define XGE_DEFAULT_MAC_RMAC_BCAST_EN 1 +#define XGE_DEFAULT_MAC_TMAC_UTIL_PERIOD 5 +#define XGE_DEFAULT_MAC_RMAC_UTIL_PERIOD 5 +#define XGE_DEFAULT_MAC_RMAC_PAUSE_GEN_EN 1 +#define XGE_DEFAULT_MAC_RMAC_PAUSE_RCV_EN 1 +#define XGE_DEFAULT_MAC_RMAC_PAUSE_TIME 65535 +#define XGE_DEFAULT_MAC_MC_PAUSE_THRESHOLD_Q0Q3 187 +#define XGE_DEFAULT_MAC_MC_PAUSE_THRESHOLD_Q4Q7 187 +#define XGE_DEFAULT_FIFO_MEMBLOCK_SIZE PAGE_SIZE +#define XGE_DEFAULT_FIFO_RESERVE_THRESHOLD 0 +#define XGE_DEFAULT_FIFO_MAX_FRAGS 64 +#define XGE_DEFAULT_FIFO_QUEUE_INTR 0 +#define XGE_DEFAULT_FIFO_QUEUE_MAX 2048 +#define XGE_DEFAULT_FIFO_QUEUE_INITIAL 2048 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_URANGE_A 5 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_URANGE_B 10 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_URANGE_C 20 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_UFC_A 15 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_UFC_B 30 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_UFC_C 45 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_UFC_D 60 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_TIMER_CI_EN 1 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_TIMER_AC_EN 1 +#define XGE_DEFAULT_FIFO_QUEUE_TTI_TIMER_VAL_US 8000 +#define XGE_DEFAULT_FIFO_ALIGNMENT_SIZE sizeof(u64) +#define XGE_DEFAULT_RING_MEMBLOCK_SIZE PAGE_SIZE +#define XGE_DEFAULT_RING_STRIP_VLAN_TAG 1 +#define XGE_DEFAULT_RING_QUEUE_MAX 16 +#define XGE_DEFAULT_RING_QUEUE_INITIAL 16 +#define XGE_DEFAULT_RING_QUEUE_DRAM_SIZE_MB 32 +#define XGE_DEFAULT_RING_QUEUE_INDICATE_MAX_PKTS 16 +#define XGE_DEFAULT_RING_QUEUE_BACKOFF_INTERVAL_US 1000 +#define XGE_DEFAULT_RING_QUEUE_RTI_URANGE_A 5 +#define XGE_DEFAULT_RING_QUEUE_RTI_URANGE_B 10 +#define XGE_DEFAULT_RING_QUEUE_RTI_URANGE_C 50 +#define XGE_DEFAULT_RING_QUEUE_RTI_UFC_A 1 +#define XGE_DEFAULT_RING_QUEUE_RTI_UFC_B 8 +#define XGE_DEFAULT_RING_QUEUE_RTI_UFC_C 16 +#define XGE_DEFAULT_RING_QUEUE_RTI_UFC_D 32 +#define XGE_DEFAULT_RING_QUEUE_RTI_TIMER_AC_EN 1 +#define XGE_DEFAULT_RING_QUEUE_RTI_TIMER_VAL_US 250 + +/* Values to identify the requests from getinfo tool in ioctl */ +#define XGE_QUERY_STATS 1 +#define XGE_QUERY_PCICONF 2 +#define XGE_QUERY_INTRSTATS 3 +#define XGE_QUERY_DEVCONF 4 +#define XGE_READ_VERSION 5 +#define XGE_QUERY_TCODE 6 +#define XGE_SET_BUFFER_MODE_1 7 +#define XGE_SET_BUFFER_MODE_2 8 +#define XGE_SET_BUFFER_MODE_3 9 +#define XGE_SET_BUFFER_MODE_5 10 +#define XGE_QUERY_BUFFER_MODE 11 + +#define XGE_OFFSET_OF_LAST_REG 0x3180 + +#define VENDOR_ID_AMD 0x1022 +#define DEVICE_ID_8131_PCI_BRIDGE 0x7450 + +typedef struct mbuf *mbuf_t; + +typedef enum xgell_event_e { + XGE_LL_EVENT_TRY_XMIT_AGAIN = XGE_LL_EVENT_BASE + 1, + XGE_LL_EVENT_DEVICE_RESETTING = XGE_LL_EVENT_BASE + 2, +} xgell_event_e; + +/* Adapter structure */ +typedef struct xgelldev { + device_t device; /* Device */ + struct ifnet *ifnetp; /* Interface ifnet structure */ + struct resource *irq; /* Resource structure for IRQ */ + void *irqhandle; /* IRQ handle */ + pci_info_t *pdev; + struct ifmedia xge_media; /* In-kernel representation of a */ + /* single supported media type */ + xge_hal_device_t *devh; /* HAL: Device Handle */ + xge_hal_channel_h ring_channel[XGE_HAL_MAX_FIFO_NUM]; + /* Ring channel */ + xge_hal_channel_h fifo_channel_0; /* FIFO channel */ + struct mtx xge_lock; /* Mutex - Default */ + struct callout timer; /* Timer for polling */ + struct xge_hal_stats_hw_info_t *hwstats; /* Hardware Statistics */ + int saved_regs[16]; /* To save register space */ + int xge_mtu; /* MTU */ + int initialized; /* Flag: Initialized or not */ + bus_dma_tag_t dma_tag_tx; /* Tag for dtr dma mapping (Tx) */ + bus_dma_tag_t dma_tag_rx; /* Tag for dtr dma mapping (Rx) */ + int all_multicast; /* All multicast flag */ + int macaddr_count; /* Multicast address count */ + int in_detach; /* To avoid ioctl during detach */ + int buffer_mode; /* Buffer Mode */ + int rxd_mbuf_cnt; /* Number of buffers used */ + int rxd_mbuf_len[5];/* Buffer lengths */ +} xgelldev_t; + +/* Rx descriptor private structure */ +typedef struct { + mbuf_t *bufferArray; + struct xge_dma_mbuf dmainfo[5]; +} xgell_rx_priv_t; + +/* Tx descriptor private structure */ +typedef struct { + mbuf_t buffer; + bus_dmamap_t dma_map; +} xgell_tx_priv_t; + +/* BAR0 Register */ +typedef struct barregister { + char option[2]; + u64 offset; + u64 value; +}bar0reg_t; + +void xge_init_params(xge_hal_device_config_t *dconfig, device_t dev); +void xge_init(void *); +void xge_init_locked(void *); +void xge_stop(xgelldev_t *); +void freeResources(device_t, int); +void xgell_callback_link_up(void *); +void xgell_callback_link_down(void *); +void xgell_callback_crit_err(void *, xge_hal_event_e, u64); +void xgell_callback_event(xge_queue_item_t *); +int xge_ifmedia_change(struct ifnet *); +void xge_ifmedia_status(struct ifnet *, struct ifmediareq *); +int xge_ioctl(struct ifnet *, unsigned long, caddr_t); +void xge_timer(void *); +int xge_intr_filter(void *); +void xge_intr(void *); +int xgell_rx_open(int, xgelldev_t *, xge_hal_channel_reopen_e); +int xgell_tx_open(xgelldev_t *, xge_hal_channel_reopen_e); +int xgell_channel_close(xgelldev_t *, xge_hal_channel_reopen_e); +int xgell_channel_open(xgelldev_t *, xge_hal_channel_reopen_e); +xge_hal_status_e xgell_rx_compl(xge_hal_channel_h, xge_hal_dtr_h, u8, void *); +xge_hal_status_e xgell_tx_compl(xge_hal_channel_h, xge_hal_dtr_h, u8, void *); +xge_hal_status_e xgell_tx_initial_replenish(xge_hal_channel_h, xge_hal_dtr_h, + int, void *, xge_hal_channel_reopen_e); +xge_hal_status_e xgell_rx_initial_replenish(xge_hal_channel_h, xge_hal_dtr_h, + int, void *, xge_hal_channel_reopen_e); +void xgell_rx_term(xge_hal_channel_h, xge_hal_dtr_h, xge_hal_dtr_state_e, + void *, xge_hal_channel_reopen_e); +void xgell_tx_term(xge_hal_channel_h, xge_hal_dtr_h, xge_hal_dtr_state_e, + void *, xge_hal_channel_reopen_e); +void xgell_set_mbuf_cflags(mbuf_t); +void xge_send(struct ifnet *); +void xge_send_locked(struct ifnet *); +int xgell_get_multimode_normalbuf(xge_hal_dtr_h dtrh, xgell_rx_priv_t *rxd_priv, + xgelldev_t *lldev); +int xgell_get_multimode_jumbobuf(xge_hal_dtr_h dtrh, xgell_rx_priv_t *rxd_priv, + xgelldev_t *lldev, int lock); +int xgell_get_second_buffer(xgell_rx_priv_t *rxd_priv, xgelldev_t *lldev); +int xgell_get_buf(xge_hal_dtr_h dtrh, xgell_rx_priv_t *rxd_priv, + xgelldev_t *lldev, int index); +int xge_ring_dtr_get(mbuf_t mbuf_up, xge_hal_channel_h channelh, xge_hal_dtr_h dtr, + xgelldev_t *lldev, xgell_rx_priv_t *rxd_priv); +int xgell_get_buf_3b_5b(xge_hal_dtr_h dtrh, xgell_rx_priv_t *rxd_priv, + xgelldev_t *lldev); +void dmamap_cb(void *, bus_dma_segment_t *, int, int); +void xgell_reset(xgelldev_t *); +void xge_setmulti(xgelldev_t *); +void xge_enable_promisc(xgelldev_t *); +void xge_disable_promisc(xgelldev_t *); +int changeMtu(xgelldev_t *, int); +int changeBufmode(xgelldev_t *, int); +void xge_initialize(device_t, xge_hal_channel_reopen_e); +void xge_terminate(device_t, xge_hal_channel_reopen_e); +void if_up_locked(xgelldev_t *); +void if_down_locked(xgelldev_t *); +int xge_probe(device_t); +int xge_driver_initialize(void); +void xge_media_init(device_t); +void xge_pci_space_save(device_t); +void xge_pci_space_restore(device_t); +int xge_attach(device_t); +int xge_interface_setup(device_t); +int xge_detach(device_t); +int xge_shutdown(device_t); +int xge_suspend(device_t); +int xge_resume(device_t); + +#endif // _IF_XGE_H + |