blob: 180ba0aecbe34eb618f6f957725f065b2e8f9f2a [file] [log] [blame]
/*
* Copyright 2010
* Princeton University. 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 PRINCETON UNIVERSITY ``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 PRINCETON UNIVERSITY 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.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of Princeton University.
*
*/
/*
* @(#)if_host.h (Princeton) 11/19/2010
*
*/
/*
* Host interface driver for protocol testing and timing.
* This driver is derived from Intel Gigabit Ethernet Driver.
*/
#ifndef _IF_HOST_H_
#define _IF_HOST_H_
/*
* Listen Ports
*/
#define HIF_SEND_PORT 48972
#define HIF_RECV_PORT 48973
/*
* Share memory buffer
*/
#define HIF_MAX_SHMBUF 8192
#define HIF_SHMBUF_SIZE 2048
/*
* HIF_TXB: Maximum number of Transmit Buffers in One TX Ring
*/
#define HIF_MIN_TXB 80
#define HIF_DEFAULT_TXB 256
#define HIF_MAX_TXB 4096
/*
* HIF_RXB: Maximum number of Receive Buffers in one RX Ring
*/
#define HIF_MIN_RXB 80
#define HIF_DEFAULT_RXB 256
#define HIF_MAX_RXB 4096
/*
* Micellaneous constants
*/
#define HIF_VENDOR_ID 0x8086
#define HIF_JUMBO_PBA 0x00000028
#define HIF_DEFAULT_PBA 0x00000030
#define HIF_SMARTSPEED_DOWNSHIFT 3
#define HIF_SMARTSPEED_MAX 15
#define HIF_MAX_LOOP 10
#define HIF_RX_PTHRESH 16
#define HIF_RX_HTHRESH 8
#define HIF_RX_WTHRESH 1
#define MAX_NUM_MULTICAST_ADDRESSES 128
#define PCI_ANY_ID (~0U)
#define ETHER_ALIGN 2
#define HIF_TX_BUFFER_SIZE ((uint32_t) 1514)
#define HIF_FC_PAUSE_TIME 0x0680
#define HIF_EEPROM_APME 0x400
#define HIF_MTU 1500
//#define HIF_MTU 16436 //16KB
/*
* The number of TX_Rings and RX_Rings
*/
#define HIF_TXRING_NUM 1
#define HIF_RXRING_NUM 1
#define HIF_MAX_SCATTER 64
#define HIF_VFTA_SIZE 128
#define HIF_BR_SIZE 4096 /* ring buf size */
#define HIF_TSO_SIZE (65535 + sizeof(struct ether_vlan_header))
#define HIF_TSO_SEG_SIZE 4096 /* Max dma segment size */
#define HIF_HDR_BUF 128
#define ETH_ZLEN 60
#define ETH_ADDR_LEN 6
/* Offload bits in mbuf flag */
#if __FreeBSD_version >= 800000
#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
#else
#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP)
#endif
#ifdef NIF_CSUM_ENABLE
#define HIF_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_SCTP)
#define HIF_CSUM_SET (CSUM_DATA_VALID | CSUM_PSEUDO_HDR | \
CSUM_IP_CHECKED | CSUM_IP_VALID | \
CSUM_SCTP_VALID)
#else
#define HIF_CSUM_FEATURES 0
#define HIF_CSUM_SET 0
#endif
/* Header split codes for get_buf */
#define HIF_CLEAN_HEADER 1
#define HIF_CLEAN_PAYLOAD 2
#define HIF_CLEAN_BOTH 3
/*
* Interrupt Moderation parameters
*/
#define HIF_LOW_LATENCY 128
#define HIF_AVE_LATENCY 450
#define HIF_BULK_LATENCY 1200
#define HIF_LINK_ITR 2000
/* Precision Time Sync (IEEE 1588) defines */
#define ETHERTYPE_IEEE1588 0x88F7
#define PICOSECS_PER_TICK 20833
#define TSYNC_PORT 319 /* UDP port for the protocol */
;
struct hif_tx_buffer {
int next_eop; /* Index of the desc to watch */
struct mbuf *m_head;
};
struct hif_rx_buffer {
struct mbuf *m_head;
};
/*
* Transmit ring: one per tx queue
*/
struct tx_ring {
struct adapter *adapter;
unsigned int me;
struct mtx tx_mtx;
char mtx_name[16];
void* tx_cond;
unsigned int tx_sleep;
struct buf_ring *br;
unsigned long no_buf_avail;
unsigned long tx_irq;
unsigned long tx_packets;
};
/*
* Receive ring: one per rx queue
*/
struct rx_ring {
struct adapter *adapter;
unsigned int me;
struct mtx rx_mtx;
char mtx_name[16];
void* rx_cond;
unsigned int rx_sleep;
struct buf_ring *br;
/* Soft stats */
unsigned long rx_irq;
unsigned long rx_split_packets;
unsigned long rx_packets;
unsigned long rx_bytes;
};
struct adapter {
struct ifnet *ifp;
int if_flags;
int max_frame_size;
int min_frame_size;
struct mtx core_mtx;
unsigned short num_tx_rings;
unsigned short num_rx_rings;
/*
* Transmit rings
*/
struct tx_ring *tx_rings;
unsigned short num_tx_buf;
/*
* Receive rings
*/
struct rx_ring *rx_rings;
unsigned short num_rx_buf;
unsigned int rx_mbuf_sz;
//int rx_process_limit;
/* Misc stats maintained by the driver */
unsigned long dropped_pkts;
unsigned long mbuf_defrag_failed;
unsigned long mbuf_header_failed;
unsigned long mbuf_packet_failed;
unsigned long rx_overruns;
};
struct thread_args{
struct adapter* p_adapter;
int ring_index;
};
#define HIF_CORE_LOCK_INIT(_sc, _name) mtx_init(&(_sc)->core_mtx, _name, "IGB Core Lock", MTX_DEF)
#define HIF_CORE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->core_mtx)
#define HIF_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx)
#define HIF_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx)
#define HIF_CORE_LOCK(_sc) mtx_lock(&(_sc)->core_mtx)
#define HIF_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx)
#define HIF_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx)
#define HIF_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx)
#define HIF_CORE_UNLOCK(_sc) mtx_unlock(&(_sc)->core_mtx)
#define HIF_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->tx_mtx)
#define HIF_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->rx_mtx)
#define HIF_CORE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->core_mtx, MA_OWNED)
#define HIF_TX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->tx_mtx, MA_OWNED)
#define HIF_TX_SLEEP(_sc) mtx_sleep((_sc)->tx_cond, &(_sc)->tx_mtx, 0, NULL, 0)
#define HIF_RX_SLEEP(_sc) mtx_sleep((_sc)->rx_cond, &(_sc)->rx_mtx, 0, NULL, 0)
#define HIF_TX_WAKEUP(_sc) wakeup((_sc)->tx_cond)
#define HIF_RX_WAKEUP(_sc) wakeup((_sc)->rx_cond)
#endif /* _IF_HOST_H_ */