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