1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux network driver for QLogic BR-series Converged Network Adapter. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 7*4882a593Smuzhiyun * Copyright (c) 2014-2015 QLogic Corporation 8*4882a593Smuzhiyun * All rights reserved 9*4882a593Smuzhiyun * www.qlogic.com 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun #ifndef __BNAD_H__ 12*4882a593Smuzhiyun #define __BNAD_H__ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/rtnetlink.h> 15*4882a593Smuzhiyun #include <linux/workqueue.h> 16*4882a593Smuzhiyun #include <linux/ipv6.h> 17*4882a593Smuzhiyun #include <linux/etherdevice.h> 18*4882a593Smuzhiyun #include <linux/mutex.h> 19*4882a593Smuzhiyun #include <linux/firmware.h> 20*4882a593Smuzhiyun #include <linux/if_vlan.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Fix for IA64 */ 23*4882a593Smuzhiyun #include <asm/checksum.h> 24*4882a593Smuzhiyun #include <net/ip6_checksum.h> 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #include <net/ip.h> 27*4882a593Smuzhiyun #include <net/tcp.h> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #include "bna.h" 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define BNAD_TXQ_DEPTH 2048 32*4882a593Smuzhiyun #define BNAD_RXQ_DEPTH 2048 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define BNAD_MAX_TX 1 35*4882a593Smuzhiyun #define BNAD_MAX_TXQ_PER_TX 8 /* 8 priority queues */ 36*4882a593Smuzhiyun #define BNAD_TXQ_NUM 1 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define BNAD_MAX_RX 1 39*4882a593Smuzhiyun #define BNAD_MAX_RXP_PER_RX 16 40*4882a593Smuzhiyun #define BNAD_MAX_RXQ_PER_RXP 2 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* 43*4882a593Smuzhiyun * Control structure pointed to ccb->ctrl, which 44*4882a593Smuzhiyun * determines the NAPI / LRO behavior CCB 45*4882a593Smuzhiyun * There is 1:1 corres. between ccb & ctrl 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun struct bnad_rx_ctrl { 48*4882a593Smuzhiyun struct bna_ccb *ccb; 49*4882a593Smuzhiyun struct bnad *bnad; 50*4882a593Smuzhiyun unsigned long flags; 51*4882a593Smuzhiyun struct napi_struct napi; 52*4882a593Smuzhiyun u64 rx_intr_ctr; 53*4882a593Smuzhiyun u64 rx_poll_ctr; 54*4882a593Smuzhiyun u64 rx_schedule; 55*4882a593Smuzhiyun u64 rx_keep_poll; 56*4882a593Smuzhiyun u64 rx_complete; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define BNAD_RXMODE_PROMISC_DEFAULT BNA_RXMODE_PROMISC 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* 62*4882a593Smuzhiyun * GLOBAL #defines (CONSTANTS) 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun #define BNAD_NAME "bna" 65*4882a593Smuzhiyun #define BNAD_NAME_LEN 64 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define BNAD_MAILBOX_MSIX_INDEX 0 68*4882a593Smuzhiyun #define BNAD_MAILBOX_MSIX_VECTORS 1 69*4882a593Smuzhiyun #define BNAD_INTX_TX_IB_BITMASK 0x1 70*4882a593Smuzhiyun #define BNAD_INTX_RX_IB_BITMASK 0x2 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define BNAD_STATS_TIMER_FREQ 1000 /* in msecs */ 73*4882a593Smuzhiyun #define BNAD_DIM_TIMER_FREQ 1000 /* in msecs */ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define BNAD_IOCETH_TIMEOUT 10000 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define BNAD_MIN_Q_DEPTH 512 78*4882a593Smuzhiyun #define BNAD_MAX_RXQ_DEPTH 16384 79*4882a593Smuzhiyun #define BNAD_MAX_TXQ_DEPTH 2048 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define BNAD_JUMBO_MTU 9000 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define BNAD_NETIF_WAKE_THRESHOLD 8 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define BNAD_RXQ_REFILL_THRESHOLD_SHIFT 3 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Bit positions for tcb->flags */ 88*4882a593Smuzhiyun #define BNAD_TXQ_FREE_SENT 0 89*4882a593Smuzhiyun #define BNAD_TXQ_TX_STARTED 1 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Bit positions for rcb->flags */ 92*4882a593Smuzhiyun #define BNAD_RXQ_STARTED 0 93*4882a593Smuzhiyun #define BNAD_RXQ_POST_OK 1 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* Resource limits */ 96*4882a593Smuzhiyun #define BNAD_NUM_TXQ (bnad->num_tx * bnad->num_txq_per_tx) 97*4882a593Smuzhiyun #define BNAD_NUM_RXP (bnad->num_rx * bnad->num_rxp_per_rx) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define BNAD_FRAME_SIZE(_mtu) \ 100*4882a593Smuzhiyun (ETH_HLEN + VLAN_HLEN + (_mtu) + ETH_FCS_LEN) 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* 103*4882a593Smuzhiyun * DATA STRUCTURES 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* enums */ 107*4882a593Smuzhiyun enum bnad_intr_source { 108*4882a593Smuzhiyun BNAD_INTR_TX = 1, 109*4882a593Smuzhiyun BNAD_INTR_RX = 2 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun enum bnad_link_state { 113*4882a593Smuzhiyun BNAD_LS_DOWN = 0, 114*4882a593Smuzhiyun BNAD_LS_UP = 1 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct bnad_iocmd_comp { 118*4882a593Smuzhiyun struct bnad *bnad; 119*4882a593Smuzhiyun struct completion comp; 120*4882a593Smuzhiyun int comp_status; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun struct bnad_completion { 124*4882a593Smuzhiyun struct completion ioc_comp; 125*4882a593Smuzhiyun struct completion ucast_comp; 126*4882a593Smuzhiyun struct completion mcast_comp; 127*4882a593Smuzhiyun struct completion tx_comp; 128*4882a593Smuzhiyun struct completion rx_comp; 129*4882a593Smuzhiyun struct completion stats_comp; 130*4882a593Smuzhiyun struct completion enet_comp; 131*4882a593Smuzhiyun struct completion mtu_comp; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun u8 ioc_comp_status; 134*4882a593Smuzhiyun u8 ucast_comp_status; 135*4882a593Smuzhiyun u8 mcast_comp_status; 136*4882a593Smuzhiyun u8 tx_comp_status; 137*4882a593Smuzhiyun u8 rx_comp_status; 138*4882a593Smuzhiyun u8 stats_comp_status; 139*4882a593Smuzhiyun u8 port_comp_status; 140*4882a593Smuzhiyun u8 mtu_comp_status; 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* Tx Rx Control Stats */ 144*4882a593Smuzhiyun struct bnad_drv_stats { 145*4882a593Smuzhiyun u64 netif_queue_stop; 146*4882a593Smuzhiyun u64 netif_queue_wakeup; 147*4882a593Smuzhiyun u64 netif_queue_stopped; 148*4882a593Smuzhiyun u64 tso4; 149*4882a593Smuzhiyun u64 tso6; 150*4882a593Smuzhiyun u64 tso_err; 151*4882a593Smuzhiyun u64 tcpcsum_offload; 152*4882a593Smuzhiyun u64 udpcsum_offload; 153*4882a593Smuzhiyun u64 csum_help; 154*4882a593Smuzhiyun u64 tx_skb_too_short; 155*4882a593Smuzhiyun u64 tx_skb_stopping; 156*4882a593Smuzhiyun u64 tx_skb_max_vectors; 157*4882a593Smuzhiyun u64 tx_skb_mss_too_long; 158*4882a593Smuzhiyun u64 tx_skb_tso_too_short; 159*4882a593Smuzhiyun u64 tx_skb_tso_prepare; 160*4882a593Smuzhiyun u64 tx_skb_non_tso_too_long; 161*4882a593Smuzhiyun u64 tx_skb_tcp_hdr; 162*4882a593Smuzhiyun u64 tx_skb_udp_hdr; 163*4882a593Smuzhiyun u64 tx_skb_csum_err; 164*4882a593Smuzhiyun u64 tx_skb_headlen_too_long; 165*4882a593Smuzhiyun u64 tx_skb_headlen_zero; 166*4882a593Smuzhiyun u64 tx_skb_frag_zero; 167*4882a593Smuzhiyun u64 tx_skb_len_mismatch; 168*4882a593Smuzhiyun u64 tx_skb_map_failed; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun u64 hw_stats_updates; 171*4882a593Smuzhiyun u64 netif_rx_dropped; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun u64 link_toggle; 174*4882a593Smuzhiyun u64 cee_toggle; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun u64 rxp_info_alloc_failed; 177*4882a593Smuzhiyun u64 mbox_intr_disabled; 178*4882a593Smuzhiyun u64 mbox_intr_enabled; 179*4882a593Smuzhiyun u64 tx_unmap_q_alloc_failed; 180*4882a593Smuzhiyun u64 rx_unmap_q_alloc_failed; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun u64 rxbuf_alloc_failed; 183*4882a593Smuzhiyun u64 rxbuf_map_failed; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* Complete driver stats */ 187*4882a593Smuzhiyun struct bnad_stats { 188*4882a593Smuzhiyun struct bnad_drv_stats drv_stats; 189*4882a593Smuzhiyun struct bna_stats *bna_stats; 190*4882a593Smuzhiyun }; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* Tx / Rx Resources */ 193*4882a593Smuzhiyun struct bnad_tx_res_info { 194*4882a593Smuzhiyun struct bna_res_info res_info[BNA_TX_RES_T_MAX]; 195*4882a593Smuzhiyun }; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct bnad_rx_res_info { 198*4882a593Smuzhiyun struct bna_res_info res_info[BNA_RX_RES_T_MAX]; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun struct bnad_tx_info { 202*4882a593Smuzhiyun struct bna_tx *tx; /* 1:1 between tx_info & tx */ 203*4882a593Smuzhiyun struct bna_tcb *tcb[BNAD_MAX_TXQ_PER_TX]; 204*4882a593Smuzhiyun u32 tx_id; 205*4882a593Smuzhiyun struct delayed_work tx_cleanup_work; 206*4882a593Smuzhiyun } ____cacheline_aligned; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun struct bnad_rx_info { 209*4882a593Smuzhiyun struct bna_rx *rx; /* 1:1 between rx_info & rx */ 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun struct bnad_rx_ctrl rx_ctrl[BNAD_MAX_RXP_PER_RX]; 212*4882a593Smuzhiyun u32 rx_id; 213*4882a593Smuzhiyun struct work_struct rx_cleanup_work; 214*4882a593Smuzhiyun } ____cacheline_aligned; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun struct bnad_tx_vector { 217*4882a593Smuzhiyun DEFINE_DMA_UNMAP_ADDR(dma_addr); 218*4882a593Smuzhiyun DEFINE_DMA_UNMAP_LEN(dma_len); 219*4882a593Smuzhiyun }; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun struct bnad_tx_unmap { 222*4882a593Smuzhiyun struct sk_buff *skb; 223*4882a593Smuzhiyun u32 nvecs; 224*4882a593Smuzhiyun struct bnad_tx_vector vectors[BFI_TX_MAX_VECTORS_PER_WI]; 225*4882a593Smuzhiyun }; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun struct bnad_rx_vector { 228*4882a593Smuzhiyun DEFINE_DMA_UNMAP_ADDR(dma_addr); 229*4882a593Smuzhiyun u32 len; 230*4882a593Smuzhiyun }; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun struct bnad_rx_unmap { 233*4882a593Smuzhiyun struct page *page; 234*4882a593Smuzhiyun struct sk_buff *skb; 235*4882a593Smuzhiyun struct bnad_rx_vector vector; 236*4882a593Smuzhiyun u32 page_offset; 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun enum bnad_rxbuf_type { 240*4882a593Smuzhiyun BNAD_RXBUF_NONE = 0, 241*4882a593Smuzhiyun BNAD_RXBUF_SK_BUFF = 1, 242*4882a593Smuzhiyun BNAD_RXBUF_PAGE = 2, 243*4882a593Smuzhiyun BNAD_RXBUF_MULTI_BUFF = 3 244*4882a593Smuzhiyun }; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun #define BNAD_RXBUF_IS_SK_BUFF(_type) ((_type) == BNAD_RXBUF_SK_BUFF) 247*4882a593Smuzhiyun #define BNAD_RXBUF_IS_MULTI_BUFF(_type) ((_type) == BNAD_RXBUF_MULTI_BUFF) 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun struct bnad_rx_unmap_q { 250*4882a593Smuzhiyun int reuse_pi; 251*4882a593Smuzhiyun int alloc_order; 252*4882a593Smuzhiyun u32 map_size; 253*4882a593Smuzhiyun enum bnad_rxbuf_type type; 254*4882a593Smuzhiyun struct bnad_rx_unmap unmap[] ____cacheline_aligned; 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun #define BNAD_PCI_DEV_IS_CAT2(_bnad) \ 258*4882a593Smuzhiyun ((_bnad)->pcidev->device == BFA_PCI_DEVICE_ID_CT2) 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* Bit mask values for bnad->cfg_flags */ 261*4882a593Smuzhiyun #define BNAD_CF_DIM_ENABLED 0x01 /* DIM */ 262*4882a593Smuzhiyun #define BNAD_CF_PROMISC 0x02 263*4882a593Smuzhiyun #define BNAD_CF_ALLMULTI 0x04 264*4882a593Smuzhiyun #define BNAD_CF_DEFAULT 0x08 265*4882a593Smuzhiyun #define BNAD_CF_MSIX 0x10 /* If in MSIx mode */ 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* Defines for run_flags bit-mask */ 268*4882a593Smuzhiyun /* Set, tested & cleared using xxx_bit() functions */ 269*4882a593Smuzhiyun /* Values indicated bit positions */ 270*4882a593Smuzhiyun #define BNAD_RF_CEE_RUNNING 0 271*4882a593Smuzhiyun #define BNAD_RF_MTU_SET 1 272*4882a593Smuzhiyun #define BNAD_RF_MBOX_IRQ_DISABLED 2 273*4882a593Smuzhiyun #define BNAD_RF_NETDEV_REGISTERED 3 274*4882a593Smuzhiyun #define BNAD_RF_DIM_TIMER_RUNNING 4 275*4882a593Smuzhiyun #define BNAD_RF_STATS_TIMER_RUNNING 5 276*4882a593Smuzhiyun #define BNAD_RF_TX_PRIO_SET 6 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun struct bnad { 279*4882a593Smuzhiyun struct net_device *netdev; 280*4882a593Smuzhiyun u32 id; 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /* Data path */ 283*4882a593Smuzhiyun struct bnad_tx_info tx_info[BNAD_MAX_TX]; 284*4882a593Smuzhiyun struct bnad_rx_info rx_info[BNAD_MAX_RX]; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 287*4882a593Smuzhiyun /* 288*4882a593Smuzhiyun * These q numbers are global only because 289*4882a593Smuzhiyun * they are used to calculate MSIx vectors. 290*4882a593Smuzhiyun * Actually the exact # of queues are per Tx/Rx 291*4882a593Smuzhiyun * object. 292*4882a593Smuzhiyun */ 293*4882a593Smuzhiyun u32 num_tx; 294*4882a593Smuzhiyun u32 num_rx; 295*4882a593Smuzhiyun u32 num_txq_per_tx; 296*4882a593Smuzhiyun u32 num_rxp_per_rx; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun u32 txq_depth; 299*4882a593Smuzhiyun u32 rxq_depth; 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun u8 tx_coalescing_timeo; 302*4882a593Smuzhiyun u8 rx_coalescing_timeo; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun struct bna_rx_config rx_config[BNAD_MAX_RX] ____cacheline_aligned; 305*4882a593Smuzhiyun struct bna_tx_config tx_config[BNAD_MAX_TX] ____cacheline_aligned; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun void __iomem *bar0; /* BAR0 address */ 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun struct bna bna; 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun u32 cfg_flags; 312*4882a593Smuzhiyun unsigned long run_flags; 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun struct pci_dev *pcidev; 315*4882a593Smuzhiyun u64 mmio_start; 316*4882a593Smuzhiyun u64 mmio_len; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun u32 msix_num; 319*4882a593Smuzhiyun struct msix_entry *msix_table; 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun struct mutex conf_mutex; 322*4882a593Smuzhiyun spinlock_t bna_lock ____cacheline_aligned; 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun /* Timers */ 325*4882a593Smuzhiyun struct timer_list ioc_timer; 326*4882a593Smuzhiyun struct timer_list dim_timer; 327*4882a593Smuzhiyun struct timer_list stats_timer; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* Control path resources, memory & irq */ 330*4882a593Smuzhiyun struct bna_res_info res_info[BNA_RES_T_MAX]; 331*4882a593Smuzhiyun struct bna_res_info mod_res_info[BNA_MOD_RES_T_MAX]; 332*4882a593Smuzhiyun struct bnad_tx_res_info tx_res_info[BNAD_MAX_TX]; 333*4882a593Smuzhiyun struct bnad_rx_res_info rx_res_info[BNAD_MAX_RX]; 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun struct bnad_completion bnad_completions; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /* Burnt in MAC address */ 338*4882a593Smuzhiyun u8 perm_addr[ETH_ALEN]; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun struct workqueue_struct *work_q; 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* Statistics */ 343*4882a593Smuzhiyun struct bnad_stats stats; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun struct bnad_diag *diag; 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun char adapter_name[BNAD_NAME_LEN]; 348*4882a593Smuzhiyun char port_name[BNAD_NAME_LEN]; 349*4882a593Smuzhiyun char mbox_irq_name[BNAD_NAME_LEN]; 350*4882a593Smuzhiyun char wq_name[BNAD_NAME_LEN]; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* debugfs specific data */ 353*4882a593Smuzhiyun char *regdata; 354*4882a593Smuzhiyun u32 reglen; 355*4882a593Smuzhiyun struct dentry *bnad_dentry_files[5]; 356*4882a593Smuzhiyun struct dentry *port_debugfs_root; 357*4882a593Smuzhiyun }; 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun struct bnad_drvinfo { 360*4882a593Smuzhiyun struct bfa_ioc_attr ioc_attr; 361*4882a593Smuzhiyun struct bfa_cee_attr cee_attr; 362*4882a593Smuzhiyun struct bfa_flash_attr flash_attr; 363*4882a593Smuzhiyun u32 cee_status; 364*4882a593Smuzhiyun u32 flash_status; 365*4882a593Smuzhiyun }; 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /* 368*4882a593Smuzhiyun * EXTERN VARIABLES 369*4882a593Smuzhiyun */ 370*4882a593Smuzhiyun extern const struct firmware *bfi_fw; 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* 373*4882a593Smuzhiyun * EXTERN PROTOTYPES 374*4882a593Smuzhiyun */ 375*4882a593Smuzhiyun u32 *cna_get_firmware_buf(struct pci_dev *pdev); 376*4882a593Smuzhiyun /* Netdev entry point prototypes */ 377*4882a593Smuzhiyun void bnad_set_rx_mode(struct net_device *netdev); 378*4882a593Smuzhiyun struct net_device_stats *bnad_get_netdev_stats(struct net_device *netdev); 379*4882a593Smuzhiyun int bnad_mac_addr_set_locked(struct bnad *bnad, const u8 *mac_addr); 380*4882a593Smuzhiyun int bnad_enable_default_bcast(struct bnad *bnad); 381*4882a593Smuzhiyun void bnad_restore_vlans(struct bnad *bnad, u32 rx_id); 382*4882a593Smuzhiyun void bnad_set_ethtool_ops(struct net_device *netdev); 383*4882a593Smuzhiyun void bnad_cb_completion(void *arg, enum bfa_status status); 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun /* Configuration & setup */ 386*4882a593Smuzhiyun void bnad_tx_coalescing_timeo_set(struct bnad *bnad); 387*4882a593Smuzhiyun void bnad_rx_coalescing_timeo_set(struct bnad *bnad); 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun int bnad_setup_rx(struct bnad *bnad, u32 rx_id); 390*4882a593Smuzhiyun int bnad_setup_tx(struct bnad *bnad, u32 tx_id); 391*4882a593Smuzhiyun void bnad_destroy_tx(struct bnad *bnad, u32 tx_id); 392*4882a593Smuzhiyun void bnad_destroy_rx(struct bnad *bnad, u32 rx_id); 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun /* Timer start/stop protos */ 395*4882a593Smuzhiyun void bnad_dim_timer_start(struct bnad *bnad); 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* Statistics */ 398*4882a593Smuzhiyun void bnad_netdev_qstats_fill(struct bnad *bnad, 399*4882a593Smuzhiyun struct rtnl_link_stats64 *stats); 400*4882a593Smuzhiyun void bnad_netdev_hwstats_fill(struct bnad *bnad, 401*4882a593Smuzhiyun struct rtnl_link_stats64 *stats); 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /* Debugfs */ 404*4882a593Smuzhiyun void bnad_debugfs_init(struct bnad *bnad); 405*4882a593Smuzhiyun void bnad_debugfs_uninit(struct bnad *bnad); 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun /* MACROS */ 408*4882a593Smuzhiyun /* To set & get the stats counters */ 409*4882a593Smuzhiyun #define BNAD_UPDATE_CTR(_bnad, _ctr) \ 410*4882a593Smuzhiyun (((_bnad)->stats.drv_stats._ctr)++) 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun #define BNAD_GET_CTR(_bnad, _ctr) ((_bnad)->stats.drv_stats._ctr) 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun #define bnad_enable_rx_irq_unsafe(_ccb) \ 415*4882a593Smuzhiyun { \ 416*4882a593Smuzhiyun if (likely(test_bit(BNAD_RXQ_STARTED, &(_ccb)->rcb[0]->flags))) {\ 417*4882a593Smuzhiyun bna_ib_coalescing_timer_set((_ccb)->i_dbell, \ 418*4882a593Smuzhiyun (_ccb)->rx_coalescing_timeo); \ 419*4882a593Smuzhiyun bna_ib_ack((_ccb)->i_dbell, 0); \ 420*4882a593Smuzhiyun } \ 421*4882a593Smuzhiyun } 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun #endif /* __BNAD_H__ */ 424