#ifndef _QEDE_FP_H
#define _QEDE_FP_H
#define RX_INDICATE_UPSTREAM(rx_ring, mp) \
mac_rx_ring(rx_ring->qede->mac_handle, \
rx_ring->mac_ring_handle, mp, \
rx_ring->mr_gen_num)
#define MAX_TX_RING_SIZE 8192
#define RESUME_TX(tx_ring) mac_tx_ring_update(tx_ring->qede->mac_handle, \
tx_ring->mac_ring_handle)
#define CQE_FLAGS_ERR (PARSING_AND_ERR_FLAGS_IPHDRERROR_MASK << \
PARSING_AND_ERR_FLAGS_IPHDRERROR_SHIFT | \
PARSING_AND_ERR_FLAGS_L4CHKSMERROR_MASK << \
PARSING_AND_ERR_FLAGS_L4CHKSMERROR_SHIFT | \
PARSING_AND_ERR_FLAGS_TUNNELIPHDRERROR_MASK << \
PARSING_AND_ERR_FLAGS_TUNNELIPHDRERROR_SHIFT | \
PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_MASK << \
PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_SHIFT)
#ifndef QEDE_POLL_ALL
#define QEDE_POLL_ALL INT_MAX
#endif
#ifndef QEDE_MAX_RX_PKTS_PER_INTR
#define QEDE_MAX_RX_PKTS_PER_INTR 128
#endif
#ifndef QEDE_TX_MAP_PATH_PAUSE_THRESHOLD
#define QEDE_TX_MAP_PATH_PAUSE_THRESHOLD 128
#endif
#ifndef QEDE_TX_COPY_PATH_PAUSE_THRESHOLD
#define QEDE_TX_COPY_PATH_PAUSE_THRESHOLD 8
#endif
#define ETHER_VLAN_HEADER_LEN sizeof (struct ether_vlan_header)
#define ETHER_HEADER_LEN sizeof (struct ether_header)
#define IP_HEADER_LEN sizeof (ipha_t)
#ifndef MBLKL
#define MBLKL(_mp_) ((uintptr_t)(_mp_)->b_wptr - (uintptr_t)(_mp_)->b_rptr)
#endif
#define UPDATE_RX_PROD(_ptr, data) \
internal_ram_wr(&(_ptr)->qede->edev.hwfns[0], \
(_ptr)->hw_rxq_prod_addr, sizeof (data), \
(u32 *)&data);
#define BD_SET_ADDR_LEN(_bd, _addr, _len) \
do { \
(_bd)->addr.hi = HOST_TO_LE_32(U64_HI(_addr)); \
(_bd)->addr.lo = HOST_TO_LE_32(U64_LO(_addr)); \
(_bd)->nbytes = HOST_TO_LE_32(_len); \
} while (0)
enum qede_xmit_mode {
XMIT_MODE_UNUSED,
USE_DMA_BIND,
USE_BCOPY,
USE_PULLUP
};
enum qede_xmit_status {
XMIT_FAILED,
XMIT_DONE,
XMIT_FALLBACK_BCOPY,
XMIT_FALLBACK_PULLUP,
XMIT_PAUSE_QUEUE,
XMIT_TOO_MANY_COOKIES
};
typedef struct qede_tx_pktinfo_s {
u32 total_len;
u32 mblk_no;
u32 cksum_flags;
bool use_lso;
u16 mss;
bool pulled_up;
u16 ether_type;
u16 mac_hlen;
u16 ip_hlen;
u16 l4_hlen;
u16 total_hlen;
u16 l4_proto;
u16 vlan_tag;
} qede_tx_pktinfo_t;
typedef struct qede_tx_bcopy_pkt_s {
mblk_t *mp;
ddi_acc_handle_t acc_handle;
ddi_dma_handle_t dma_handle;
u32 ncookies;
u32 offset;
u64 phys_addr;
void *virt_addr;
u32 padding;
} qede_tx_bcopy_pkt_t;
typedef struct qede_tx_bcopy_list_s {
qede_tx_bcopy_pkt_t *bcopy_pool;
qede_tx_bcopy_pkt_t *free_list[MAX_TX_RING_SIZE];
u16 head;
u16 tail;
kmutex_t lock;
size_t size;
} qede_tx_bcopy_list_t;
typedef struct qede_dma_handle_entry_s {
mblk_t *mp;
ddi_dma_handle_t dma_handle;
struct qede_dma_handle_entry_s *next;
} qede_dma_handle_entry_t;
typedef struct qede_dma_handles_list_s {
qede_dma_handle_entry_t *dmah_pool;
qede_dma_handle_entry_t *free_list[MAX_TX_RING_SIZE];
u16 head;
u16 tail;
kmutex_t lock;
size_t size;
} qede_dma_handles_list_t;
typedef struct qede_tx_recycle_list_s {
qede_tx_bcopy_pkt_t *bcopy_pkt;
qede_dma_handle_entry_t *dmah_entry;
} qede_tx_recycle_list_t;
mblk_t *qede_ring_tx(void *arg, mblk_t *mp);
#endif