18b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 28b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * Linux network driver for Brocade Converged Network Adapter. 38b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * 48b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * This program is free software; you can redistribute it and/or modify it 58b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * under the terms of the GNU General Public License (GPL) Version 2 as 68b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * published by the Free Software Foundation 78b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * 88b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * This program is distributed in the hope that it will be useful, but 98b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * WITHOUT ANY WARRANTY; without even the implied warranty of 108b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 118b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * General Public License for more details. 128b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 138b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 148b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. 158b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * All rights reserved 168b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * www.brocade.com 178b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 188b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#ifndef __BNAD_H__ 198b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define __BNAD_H__ 208b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 218b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <linux/rtnetlink.h> 228b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <linux/workqueue.h> 238b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <linux/ipv6.h> 248b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <linux/etherdevice.h> 258b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <linux/mutex.h> 268b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <linux/firmware.h> 27f859d7cb7967efaedae194dd90a23a7a72fb216dJiri Pirko#include <linux/if_vlan.h> 288b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 298b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Fix for IA64 */ 308b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <asm/checksum.h> 318b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <net/ip6_checksum.h> 328b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 338b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <net/ip.h> 348b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include <net/tcp.h> 358b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 368b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#include "bna.h" 378b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 388b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_TXQ_DEPTH 2048 398b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_RXQ_DEPTH 2048 408b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 41772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody#define BNAD_MAX_TX 1 428b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_MAX_TXQ_PER_TX 8 /* 8 priority queues */ 438b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_TXQ_NUM 1 448b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 45772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody#define BNAD_MAX_RX 1 46772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody#define BNAD_MAX_RXP_PER_RX 16 47078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_MAX_RXQ_PER_RXP 2 488b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 498b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 508b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * Control structure pointed to ccb->ctrl, which 518b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * determines the NAPI / LRO behavior CCB 528b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * There is 1:1 corres. between ccb & ctrl 538b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 548b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_rx_ctrl { 558b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_ccb *ccb; 562be671442214402f890e367a19b5fc64cc13f878Rasesh Mody struct bnad *bnad; 57be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody unsigned long flags; 588b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct napi_struct napi; 59271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 rx_intr_ctr; 60271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 rx_poll_ctr; 61271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 rx_schedule; 62271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 rx_keep_poll; 63271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 rx_complete; 648b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 658b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 668b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_RXMODE_PROMISC_DEFAULT BNA_RXMODE_PROMISC 678b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 688b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 698b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * GLOBAL #defines (CONSTANTS) 708b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 718b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_NAME "bna" 728b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_NAME_LEN 64 738b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 7456fd49e399ce1d82200fad5b8924d4e35a587809Rasesh Mody#define BNAD_VERSION "3.0.2.2" 758b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 768811e267d0443af9caca6f127d62c0119c96314fRasesh Mody#define BNAD_MAILBOX_MSIX_INDEX 0 778b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_MAILBOX_MSIX_VECTORS 1 788811e267d0443af9caca6f127d62c0119c96314fRasesh Mody#define BNAD_INTX_TX_IB_BITMASK 0x1 798811e267d0443af9caca6f127d62c0119c96314fRasesh Mody#define BNAD_INTX_RX_IB_BITMASK 0x2 808b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 810120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody#define BNAD_STATS_TIMER_FREQ 1000 /* in msecs */ 820120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody#define BNAD_DIM_TIMER_FREQ 1000 /* in msecs */ 838b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 84078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_IOCETH_TIMEOUT 10000 85078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody 868b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_MAX_Q_DEPTH 0x10000 878b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_MIN_Q_DEPTH 0x200 888b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 8941eb5ba42d6108029ccc0cdb0c95dfc6a9e348e7Rasesh Mody#define BNAD_MAX_RXQ_DEPTH (BNAD_MAX_Q_DEPTH / bnad_rxqs_per_cq) 9041eb5ba42d6108029ccc0cdb0c95dfc6a9e348e7Rasesh Mody/* keeping MAX TX and RX Q depth equal */ 9141eb5ba42d6108029ccc0cdb0c95dfc6a9e348e7Rasesh Mody#define BNAD_MAX_TXQ_DEPTH BNAD_MAX_RXQ_DEPTH 9241eb5ba42d6108029ccc0cdb0c95dfc6a9e348e7Rasesh Mody 938b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_JUMBO_MTU 9000 948b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 958b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_NETIF_WAKE_THRESHOLD 8 968b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 978b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_RXQ_REFILL_THRESHOLD_SHIFT 3 988b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 998b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Bit positions for tcb->flags */ 1008b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_TXQ_FREE_SENT 0 101be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody#define BNAD_TXQ_TX_STARTED 1 1028b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1038b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Bit positions for rcb->flags */ 1048b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_RXQ_REFILL 0 1058b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_RXQ_STARTED 1 1065bcf6ac036556fcb4f9b5637f61e1227b66416ccRasesh Mody#define BNAD_RXQ_POST_OK 2 1078b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 108078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody/* Resource limits */ 109078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_NUM_TXQ (bnad->num_tx * bnad->num_txq_per_tx) 110078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_NUM_RXP (bnad->num_rx * bnad->num_rxp_per_rx) 111078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody 1128b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 1138b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * DATA STRUCTURES 1148b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 1158b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1168b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* enums */ 1178b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyenum bnad_intr_source { 1188b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody BNAD_INTR_TX = 1, 1198b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody BNAD_INTR_RX = 2 1208b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 1218b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1228b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyenum bnad_link_state { 1238b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody BNAD_LS_DOWN = 0, 1240120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody BNAD_LS_UP = 1 1258b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 1268b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 12772a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipatistruct bnad_iocmd_comp { 12872a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati struct bnad *bnad; 12972a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati struct completion comp; 13072a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati int comp_status; 13172a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati}; 13272a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati 1338b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_completion { 1340120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody struct completion ioc_comp; 1350120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody struct completion ucast_comp; 1368b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct completion mcast_comp; 1378b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct completion tx_comp; 1388b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct completion rx_comp; 1398b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct completion stats_comp; 140078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody struct completion enet_comp; 141078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody struct completion mtu_comp; 1428b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1438b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 ioc_comp_status; 1448b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 ucast_comp_status; 1458b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 mcast_comp_status; 1468b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 tx_comp_status; 1478b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 rx_comp_status; 1488b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 stats_comp_status; 1498b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 port_comp_status; 150078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody u8 mtu_comp_status; 1518b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 1528b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1538b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Tx Rx Control Stats */ 1548b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_drv_stats { 1550120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody u64 netif_queue_stop; 1568b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 netif_queue_wakeup; 157f7c0fa4cd5dcf58dd95b216d2c33444a3b4a44e0Rasesh Mody u64 netif_queue_stopped; 1588b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 tso4; 1598b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 tso6; 1608b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 tso_err; 1618b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 tcpcsum_offload; 1628b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 udpcsum_offload; 1638b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 csum_help; 164271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_too_short; 165271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_stopping; 166271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_max_vectors; 167271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_mss_too_long; 168271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_tso_too_short; 169271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_tso_prepare; 170271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_non_tso_too_long; 171271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_tcp_hdr; 172271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_udp_hdr; 173271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_csum_err; 174271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_headlen_too_long; 175271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_headlen_zero; 176271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_frag_zero; 177271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody u64 tx_skb_len_mismatch; 1788b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1798b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 hw_stats_updates; 1808b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 netif_rx_dropped; 1818b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1828b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 link_toggle; 183078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody u64 cee_toggle; 1848b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1858b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 rxp_info_alloc_failed; 1868b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 mbox_intr_disabled; 1878b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 mbox_intr_enabled; 1888b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 tx_unmap_q_alloc_failed; 1898b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 rx_unmap_q_alloc_failed; 1908b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1918b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 rxbuf_alloc_failed; 1928b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 1938b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 1948b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Complete driver stats */ 1958b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_stats { 1968b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bnad_drv_stats drv_stats; 1978b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_stats *bna_stats; 1988b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 1998b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2008b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Tx / Rx Resources */ 2018b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_tx_res_info { 2028b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_res_info res_info[BNA_TX_RES_T_MAX]; 2038b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 2048b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2058b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_rx_res_info { 2068b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_res_info res_info[BNA_RX_RES_T_MAX]; 2078b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 2088b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2098b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_tx_info { 2108b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_tx *tx; /* 1:1 between tx_info & tx */ 2118b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_tcb *tcb[BNAD_MAX_TXQ_PER_TX]; 212078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody u32 tx_id; 2138b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody} ____cacheline_aligned; 2148b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2158b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_rx_info { 2168b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_rx *rx; /* 1:1 between rx_info & rx */ 2178b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 218772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bnad_rx_ctrl rx_ctrl[BNAD_MAX_RXP_PER_RX]; 219078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody u32 rx_id; 2208b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody} ____cacheline_aligned; 2218b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2228b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Unmap queues for Tx / Rx cleanup */ 2238b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_skb_unmap { 2248b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct sk_buff *skb; 2255ea74318c68fcb38f02fc2fc920abd37d9a9bc33Ivan Vecera DEFINE_DMA_UNMAP_ADDR(dma_addr); 2268b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 2278b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2288b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad_unmap_q { 2298b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 producer_index; 2308b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 consumer_index; 2310120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody u32 q_depth; 2328b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* This should be the last one */ 2338b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bnad_skb_unmap unmap_array[1]; 2348b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 2358b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2368b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Bit mask values for bnad->cfg_flags */ 2378b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_CF_DIM_ENABLED 0x01 /* DIM */ 2388b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_CF_PROMISC 0x02 2398b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_CF_ALLMULTI 0x04 2408b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_CF_MSIX 0x08 /* If in MSIx mode */ 2418b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2428b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Defines for run_flags bit-mask */ 2438b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Set, tested & cleared using xxx_bit() functions */ 2448b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Values indicated bit positions */ 245078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_RF_CEE_RUNNING 0 246078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_RF_MTU_SET 1 247be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody#define BNAD_RF_MBOX_IRQ_DISABLED 2 248078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_RF_NETDEV_REGISTERED 3 249be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody#define BNAD_RF_DIM_TIMER_RUNNING 4 250be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody#define BNAD_RF_STATS_TIMER_RUNNING 5 251078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_RF_TX_PRIO_SET 6 252078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody 253078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody 254078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody/* Define for Fast Path flags */ 255078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody/* Defined as bit positions */ 256078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody#define BNAD_FP_IN_RX_PATH 0 2578b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2588b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modystruct bnad { 2590120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody struct net_device *netdev; 26072a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati u32 id; 26172a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipati struct list_head list_entry; 2628b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2638b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* Data path */ 264772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bnad_tx_info tx_info[BNAD_MAX_TX]; 265772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bnad_rx_info rx_info[BNAD_MAX_RX]; 2668b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 267f859d7cb7967efaedae194dd90a23a7a72fb216dJiri Pirko unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 2688b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* 2698b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * These q numbers are global only because 2708b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * they are used to calculate MSIx vectors. 2718b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * Actually the exact # of queues are per Tx/Rx 2728b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * object. 2738b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 2748b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 num_tx; 2758b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 num_rx; 2768b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 num_txq_per_tx; 2778b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 num_rxp_per_rx; 2788b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2798b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 txq_depth; 2808b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 rxq_depth; 2818b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2828b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 tx_coalescing_timeo; 2838b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u8 rx_coalescing_timeo; 2848b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 285772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bna_rx_config rx_config[BNAD_MAX_RX]; 286772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bna_tx_config tx_config[BNAD_MAX_TX]; 2878b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2888b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody void __iomem *bar0; /* BAR0 address */ 2898b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2908b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna bna; 2918b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2928b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 cfg_flags; 2938b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody unsigned long run_flags; 2948b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2950120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody struct pci_dev *pcidev; 2968b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 mmio_start; 2978b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u64 mmio_len; 2988b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 2998b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody u32 msix_num; 3008b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct msix_entry *msix_table; 3018b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3028b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct mutex conf_mutex; 3038b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody spinlock_t bna_lock ____cacheline_aligned; 3048b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3058b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* Timers */ 3068b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct timer_list ioc_timer; 3078b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct timer_list dim_timer; 3088b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct timer_list stats_timer; 3098b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3108b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* Control path resources, memory & irq */ 3118b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bna_res_info res_info[BNA_RES_T_MAX]; 312078086f3c17fae8af6c077153773c4a10392ffbfRasesh Mody struct bna_res_info mod_res_info[BNA_MOD_RES_T_MAX]; 313772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bnad_tx_res_info tx_res_info[BNAD_MAX_TX]; 314772b5235d86563b00786030d9f42af3a89fd0833Rasesh Mody struct bnad_rx_res_info rx_res_info[BNAD_MAX_RX]; 3158b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3168b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bnad_completion bnad_completions; 3178b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3188b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* Burnt in MAC address */ 3198b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody mac_t perm_addr; 3208b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3218b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct tasklet_struct tx_free_tasklet; 3228b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3238b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody /* Statistics */ 3248b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bnad_stats stats; 3258b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3268b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody struct bnad_diag *diag; 3278b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3288b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody char adapter_name[BNAD_NAME_LEN]; 3290120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Mody char port_name[BNAD_NAME_LEN]; 3308b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody char mbox_irq_name[BNAD_NAME_LEN]; 3317afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati 3327afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati /* debugfs specific data */ 3337afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati char *regdata; 3347afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati u32 reglen; 3357afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati struct dentry *bnad_dentry_files[5]; 3367afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati struct dentry *port_debugfs_root; 3377afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati}; 3387afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati 3397afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipatistruct bnad_drvinfo { 3407afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati struct bfa_ioc_attr ioc_attr; 3417afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati struct bfa_cee_attr cee_attr; 3427afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati struct bfa_flash_attr flash_attr; 3437afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati u32 cee_status; 3447afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati u32 flash_status; 3458b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody}; 3468b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3478b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 3488b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * EXTERN VARIABLES 3498b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 350e1e0918fcaea7b8100ed9f96f3ecd9eb9b867102stephen hemmingerextern const struct firmware *bfi_fw; 3510120b99c8d56b5d3f2d80aaf8769dea05ef80439Rasesh Modyextern u32 bnad_rxqs_per_cq; 3528b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3538b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* 3548b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * EXTERN PROTOTYPES 3558b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 3568b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyextern u32 *cna_get_firmware_buf(struct pci_dev *pdev); 3578b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Netdev entry point prototypes */ 358a2122d95be5bab420741167913a9f39af673d11cRasesh Modyextern void bnad_set_rx_mode(struct net_device *netdev); 359a2122d95be5bab420741167913a9f39af673d11cRasesh Modyextern struct net_device_stats *bnad_get_netdev_stats( 360a2122d95be5bab420741167913a9f39af673d11cRasesh Mody struct net_device *netdev); 361a2122d95be5bab420741167913a9f39af673d11cRasesh Modyextern int bnad_mac_addr_set_locked(struct bnad *bnad, u8 *mac_addr); 362a2122d95be5bab420741167913a9f39af673d11cRasesh Modyextern int bnad_enable_default_bcast(struct bnad *bnad); 363a2122d95be5bab420741167913a9f39af673d11cRasesh Modyextern void bnad_restore_vlans(struct bnad *bnad, u32 rx_id); 3648b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyextern void bnad_set_ethtool_ops(struct net_device *netdev); 36572a9730b3f556e18912f3e1b494a7aee7ae3dd91Krishna Gudipatiextern void bnad_cb_completion(void *arg, enum bfa_status status); 3668b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3678b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Configuration & setup */ 3688b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyextern void bnad_tx_coalescing_timeo_set(struct bnad *bnad); 3698b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyextern void bnad_rx_coalescing_timeo_set(struct bnad *bnad); 3708b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 371078086f3c17fae8af6c077153773c4a10392ffbfRasesh Modyextern int bnad_setup_rx(struct bnad *bnad, u32 rx_id); 372078086f3c17fae8af6c077153773c4a10392ffbfRasesh Modyextern int bnad_setup_tx(struct bnad *bnad, u32 tx_id); 373078086f3c17fae8af6c077153773c4a10392ffbfRasesh Modyextern void bnad_cleanup_tx(struct bnad *bnad, u32 tx_id); 374078086f3c17fae8af6c077153773c4a10392ffbfRasesh Modyextern void bnad_cleanup_rx(struct bnad *bnad, u32 rx_id); 3758b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3768b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Timer start/stop protos */ 3778b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Modyextern void bnad_dim_timer_start(struct bnad *bnad); 3788b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3798b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* Statistics */ 380f7c0fa4cd5dcf58dd95b216d2c33444a3b4a44e0Rasesh Modyextern void bnad_netdev_qstats_fill(struct bnad *bnad, 381f7c0fa4cd5dcf58dd95b216d2c33444a3b4a44e0Rasesh Mody struct rtnl_link_stats64 *stats); 382f7c0fa4cd5dcf58dd95b216d2c33444a3b4a44e0Rasesh Modyextern void bnad_netdev_hwstats_fill(struct bnad *bnad, 383f7c0fa4cd5dcf58dd95b216d2c33444a3b4a44e0Rasesh Mody struct rtnl_link_stats64 *stats); 3848b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3857afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati/* Debugfs */ 3867afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipativoid bnad_debugfs_init(struct bnad *bnad); 3877afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipativoid bnad_debugfs_uninit(struct bnad *bnad); 3887afc5dbde09104b023ce04465ba71aaba0fc4346Krishna Gudipati 3898b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/** 3908b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody * MACROS 3918b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody */ 3928b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody/* To set & get the stats counters */ 3938b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_UPDATE_CTR(_bnad, _ctr) \ 3948b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody (((_bnad)->stats.drv_stats._ctr)++) 3958b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3968b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define BNAD_GET_CTR(_bnad, _ctr) ((_bnad)->stats.drv_stats._ctr) 3978b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 3988b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#define bnad_enable_rx_irq_unsafe(_ccb) \ 3998b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody{ \ 400271e8b794700022fcd93d37967fa999ddee47698Rasesh Mody if (likely(test_bit(BNAD_RXQ_STARTED, &(_ccb)->rcb[0]->flags))) {\ 401be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody bna_ib_coalescing_timer_set((_ccb)->i_dbell, \ 402be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody (_ccb)->rx_coalescing_timeo); \ 403be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody bna_ib_ack((_ccb)->i_dbell, 0); \ 404be7fa3263a15d3f278c3bfbf606ec169aaa3a920Rasesh Mody } \ 4058b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody} 4068b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody 4078b230ed8ec96c933047dd0625cf95f739e4939a6Rasesh Mody#endif /* __BNAD_H__ */ 408