16b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/*
2d2145cde58135dabe7c48a599de4b81c2fe3ea61Ajit Khaparde * Copyright (C) 2005 - 2011 Emulex
36b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * All rights reserved.
46b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla *
56b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * This program is free software; you can redistribute it and/or
66b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * modify it under the terms of the GNU General Public License version 2
76b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * as published by the Free Software Foundation.  The full GNU General
86b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * Public License is included in this distribution in the file called COPYING.
96b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla *
106b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * Contact Information:
11d2145cde58135dabe7c48a599de4b81c2fe3ea61Ajit Khaparde * linux-drivers@emulex.com
126b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla *
13d2145cde58135dabe7c48a599de4b81c2fe3ea61Ajit Khaparde * Emulex
14d2145cde58135dabe7c48a599de4b81c2fe3ea61Ajit Khaparde * 3333 Susan Street
15d2145cde58135dabe7c48a599de4b81c2fe3ea61Ajit Khaparde * Costa Mesa, CA 92626
166b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla */
176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#ifndef BE_H
196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_H
206b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
216b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/pci.h>
226b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/etherdevice.h>
236b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/delay.h>
246b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <net/tcp.h>
256b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <net/ip.h>
266b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <net/ipv6.h>
276b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/if_vlan.h>
286b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/workqueue.h>
296b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/interrupt.h>
3084517482e19bc775de7b3b4e998dee2f506bc34eAjit Khaparde#include <linux/firmware.h>
315a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
32ab1594e92e6765fd4af316f130eea8f5c920823dSathya Perla#include <linux/u64_stats_sync.h>
336b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
346b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include "be_hw.h"
356b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
36d708f6039b21ca8f0508ba1da1aaf3d00a36446fSathya Perla#define DRV_VER			"4.2.116u"
376b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define DRV_NAME		"be2net"
386b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NAME			"ServerEngines BladeEngine2 10Gbps NIC"
3912d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde#define BE3_NAME		"ServerEngines BladeEngine3 10Gbps NIC"
40c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define OC_NAME			"Emulex OneConnect 10Gbps NIC"
41fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla#define OC_NAME_BE		OC_NAME	"(be3)"
42fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla#define OC_NAME_LANCER		OC_NAME "(Lancer)"
43ecedb6ae908e3a8a19942da921a3ffb1c5a0d6abAjit Khaparde#define OC_NAME_SH		OC_NAME "(Skyhawk)"
4435ecf03c833d9aae35df9f1d86e6efa86d3d2628Ajit Khaparde#define DRV_DESC		"ServerEngines BladeEngine 10Gbps NIC Driver"
456b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
46c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define BE_VENDOR_ID 		0x19a2
47fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla#define EMULEX_VENDOR_ID	0x10df
48c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define BE_DEVICE_ID1		0x211
4912d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde#define BE_DEVICE_ID2		0x221
50fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla#define OC_DEVICE_ID1		0x700	/* Device Id for BE2 cards */
51fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla#define OC_DEVICE_ID2		0x710	/* Device Id for BE3 cards */
52fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla#define OC_DEVICE_ID3		0xe220	/* Device id for Lancer cards */
5312f4d0a8770ab26639091d0b2509b19681daad69Mammatha Edhala#define OC_DEVICE_ID4           0xe228   /* Device id for VF in Lancer */
54ecedb6ae908e3a8a19942da921a3ffb1c5a0d6abAjit Khaparde#define OC_DEVICE_ID5		0x720	/* Device Id for Skyhawk cards */
554762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde#define OC_SUBSYS_DEVICE_ID1	0xE602
564762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde#define OC_SUBSYS_DEVICE_ID2	0xE642
574762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde#define OC_SUBSYS_DEVICE_ID3	0xE612
584762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde#define OC_SUBSYS_DEVICE_ID4	0xE652
59c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde
60c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khapardestatic inline char *nic_name(struct pci_dev *pdev)
61c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde{
6212d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	switch (pdev->device) {
6312d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	case OC_DEVICE_ID1:
64c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde		return OC_NAME;
65e254f6ecaeb4e7c0588e739bf4641df0e8c22bbaAjit Khaparde	case OC_DEVICE_ID2:
66fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla		return OC_NAME_BE;
67fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla	case OC_DEVICE_ID3:
6812f4d0a8770ab26639091d0b2509b19681daad69Mammatha Edhala	case OC_DEVICE_ID4:
69fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla		return OC_NAME_LANCER;
7012d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	case BE_DEVICE_ID2:
7112d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde		return BE3_NAME;
72ecedb6ae908e3a8a19942da921a3ffb1c5a0d6abAjit Khaparde	case OC_DEVICE_ID5:
73ecedb6ae908e3a8a19942da921a3ffb1c5a0d6abAjit Khaparde		return OC_NAME_SH;
7412d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	default:
75c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde		return BE_NAME;
7612d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	}
77c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde}
78c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde
796b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Number of bytes of an RX frame that are copied to skb->data */
802e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla#define BE_HDR_LEN		((u16) 64)
81bb349bb4b19b39830e0486aedfd7c7dca23b7bafEric Dumazet/* allocate extra space to allow tunneling decapsulation without head reallocation */
82bb349bb4b19b39830e0486aedfd7c7dca23b7bafEric Dumazet#define BE_RX_SKB_ALLOC_SIZE (BE_HDR_LEN + 64)
83bb349bb4b19b39830e0486aedfd7c7dca23b7bafEric Dumazet
846b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_MAX_JUMBO_FRAME_SIZE	9018
856b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_MIN_MTU		256
866b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
876b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NUM_VLANS_SUPPORTED	64
8810ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define BE_MAX_EQD		96u
896b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define	BE_MAX_TX_FRAG_COUNT	30
906b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
916b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define EVNT_Q_LEN		1024
926b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define TX_Q_LEN		2048
936b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define TX_CQ_LEN		1024
946b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define RX_Q_LEN		1024	/* Does not support any other value */
956b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define RX_CQ_LEN		1024
965fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla#define MCC_Q_LEN		128	/* total size not to exceed 8 pages */
976b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define MCC_CQ_LEN		256
986b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
9910ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define BE3_MAX_RSS_QS		8
10010ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define BE2_MAX_RSS_QS		4
10110ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define MAX_RSS_QS		BE3_MAX_RSS_QS
102ac6a0c4aab16070d7d55f49a52de33f716ae1d3dSathya Perla#define MAX_RX_QS		(MAX_RSS_QS + 1) /* RSS qs + 1 def Rx */
10310ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla
1043c8def9776c3d4636291432522ea312f7a44be95Sathya Perla#define MAX_TX_QS		8
10510ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define MAX_MSIX_VECTORS	MAX_RSS_QS
10610ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define BE_TX_BUDGET		256
1076b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NAPI_WEIGHT		64
10810ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define MAX_RX_POST		BE_NAPI_WEIGHT /* Frags posted at a time */
1096b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define RX_FRAGS_REFILL_WM	(RX_Q_LEN - MAX_RX_POST)
1106b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1118788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla#define FW_VER_LEN		32
1128788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla
1136b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_dma_mem {
1146b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	void *va;
1156b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	dma_addr_t dma;
1166b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 size;
1176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
1186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_queue_info {
1206b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_dma_mem dma_mem;
1216b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 len;
1226b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 entry_size;	/* Size of an element in the queue */
1236b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 id;
1246b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 tail, head;
1256b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool created;
1266b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	atomic_t used;	/* Number of valid elements in the queue */
1276b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
1286b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1295fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline u32 MODULO(u16 val, u16 limit)
1305fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1315fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	BUG_ON(limit & (limit - 1));
1325fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	return val & (limit - 1);
1335fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1345fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1355fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void index_adv(u16 *index, u16 val, u16 limit)
1365fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1375fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	*index = MODULO((*index + val), limit);
1385fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1395fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1405fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void index_inc(u16 *index, u16 limit)
1415fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1425fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	*index = MODULO((*index + 1), limit);
1435fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1445fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1455fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void *queue_head_node(struct be_queue_info *q)
1465fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1475fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	return q->dma_mem.va + q->head * q->entry_size;
1485fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1495fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1505fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void *queue_tail_node(struct be_queue_info *q)
1515fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1525fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	return q->dma_mem.va + q->tail * q->entry_size;
1535fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1545fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1553de09455cfcde1898fb435ad425b9ad5d13ed362Somnath Koturstatic inline void *queue_index_node(struct be_queue_info *q, u16 index)
1563de09455cfcde1898fb435ad425b9ad5d13ed362Somnath Kotur{
1573de09455cfcde1898fb435ad425b9ad5d13ed362Somnath Kotur	return q->dma_mem.va + index * q->entry_size;
1583de09455cfcde1898fb435ad425b9ad5d13ed362Somnath Kotur}
1593de09455cfcde1898fb435ad425b9ad5d13ed362Somnath Kotur
1605fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void queue_head_inc(struct be_queue_info *q)
1615fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1625fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	index_inc(&q->head, q->len);
1635fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1645fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1655fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void queue_tail_inc(struct be_queue_info *q)
1665fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1675fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	index_inc(&q->tail, q->len);
1685fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1695fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1705fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastruct be_eq_obj {
1715fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct be_queue_info q;
1725fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	char desc[32];
1735fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1745fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	/* Adaptive interrupt coalescing (AIC) info */
1755fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	bool enable_aic;
17610ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u32 min_eqd;		/* in usecs */
17710ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u32 max_eqd;		/* in usecs */
17810ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u32 eqd;		/* configured val when aic is off */
17910ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u32 cur_eqd;		/* in usecs */
1805fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
18110ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u8 idx;			/* array index */
18210ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u16 tx_budget;
1835fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct napi_struct napi;
18410ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	struct be_adapter *adapter;
18510ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla} ____cacheline_aligned_in_smp;
1865fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1875fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastruct be_mcc_obj {
1885fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct be_queue_info q;
1895fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct be_queue_info cq;
1907a1e9b2059d147461cff3dfbabbfb43f296a1eefSathya Perla	bool rearm_cq;
1915fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla};
1925fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1933abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perlastruct be_tx_stats {
194ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u64 tx_bytes;
195ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u64 tx_pkts;
196ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u64 tx_reqs;
197ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u64 tx_wrbs;
198ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u64 tx_compl;
199ac124ff973e2780279774a30dd924affef758a51Sathya Perla	ulong tx_jiffies;
200ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 tx_stops;
201ab1594e92e6765fd4af316f130eea8f5c920823dSathya Perla	struct u64_stats_sync sync;
202ab1594e92e6765fd4af316f130eea8f5c920823dSathya Perla	struct u64_stats_sync sync_compl;
2036b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
2046b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2056b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_tx_obj {
2066b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info q;
2076b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info cq;
2086b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Remember the skbs that were transmitted */
2096b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct sk_buff *sent_skb_list[TX_Q_LEN];
2103c8def9776c3d4636291432522ea312f7a44be95Sathya Perla	struct be_tx_stats stats;
21110ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla} ____cacheline_aligned_in_smp;
2126b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2136b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Struct to remember the pages posted for rx frags */
2146b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_rx_page_info {
2156b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct page *page;
216fac6da5b7a1b9779ba124ce92314d02378892855FUJITA Tomonori	DEFINE_DMA_UNMAP_ADDR(bus);
2176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 page_offset;
2186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool last_page_user;
2196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
2206b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2213abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perlastruct be_rx_stats {
2223abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	u64 rx_bytes;
2233abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	u64 rx_pkts;
224ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u64 rx_pkts_prev;
225ac124ff973e2780279774a30dd924affef758a51Sathya Perla	ulong rx_jiffies;
226ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_no_skbs;	/* skb allocation errors */
227ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_no_frags;	/* HW has no fetched frags */
228ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_post_fail;	/* page post alloc failures */
229ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_compl;
2303abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	u32 rx_mcast_pkts;
231ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_compl_err;	/* completions with err set */
232ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_pps;		/* pkts per second */
233ab1594e92e6765fd4af316f130eea8f5c920823dSathya Perla	struct u64_stats_sync sync;
2343abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla};
2353abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla
2362e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perlastruct be_rx_compl_info {
2372e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u32 rss_hash;
2386709d9521df05c105343473ab8b147e2ef1e13d8Somnath Kotur	u16 vlan_tag;
2392e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u16 pkt_size;
2402e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u16 rxq_idx;
24112004ae99c009a4ff3c8ea0843f1980aa5bcb4eaSathya Perla	u16 port;
2422e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 vlanf;
2432e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 num_rcvd;
2442e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 err;
2452e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 ipf;
2462e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 tcpf;
2472e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 udpf;
2482e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 ip_csum;
2492e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 l4_csum;
2502e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 ipv6;
2512e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 vtm;
2522e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	u8 pkt_type;
2532e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla};
2542e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla
2556b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_rx_obj {
2563abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	struct be_adapter *adapter;
2576b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info q;
2586b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info cq;
2592e588f84f254cca0fc3b9f01297d06799b8c85d3Sathya Perla	struct be_rx_compl_info rxcp;
2606b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_rx_page_info page_info_tbl[RX_Q_LEN];
2613abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	struct be_rx_stats stats;
2623abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	u8 rss_id;
2633abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	bool rx_post_starved;	/* Zero rx frags have been posted to BE */
26410ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla} ____cacheline_aligned_in_smp;
2656b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
266609ff3bb8f6cd38c68c719bbc3c31d6b0b9ce894Ajit Khapardestruct be_drv_stats {
2679ae081c66eb8ba0fdb38cca180952782a8744da4Somnath Kotur	u32 be_on_die_temperature;
268ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 eth_red_drops;
269ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_no_pbuf;
270ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_no_txpb;
271ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_no_erx_descr;
272ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_no_tpre_descr;
273ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_too_many_frags;
274ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 forwarded_packets;
275ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_drops_mtu;
276ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_crc_errors;
277ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_alignment_symbol_errors;
278ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_pause_frames;
279ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_priority_pause_frames;
280ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_control_frames;
281ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_in_range_errors;
282ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_out_range_errors;
283ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_frame_too_long;
284d45b9d39a1aed7851948460d29b843ce70eb0a68Sathya Perla	u32 rx_address_mismatch_drops;
285ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_dropped_too_small;
286ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_dropped_too_short;
287ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_dropped_header_too_small;
288ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_dropped_tcp_length;
289ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_dropped_runt;
290ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_ip_checksum_errs;
291ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_tcp_checksum_errs;
292ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_udp_checksum_errs;
293ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 tx_pauseframes;
294ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 tx_priority_pauseframes;
295ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 tx_controlframes;
296ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rxpp_fifo_overflow_drop;
297ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 rx_input_fifo_overflow_drop;
298ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 pmem_fifo_overflow_drop;
299ac124ff973e2780279774a30dd924affef758a51Sathya Perla	u32 jabber_events;
300609ff3bb8f6cd38c68c719bbc3c31d6b0b9ce894Ajit Khaparde};
301609ff3bb8f6cd38c68c719bbc3c31d6b0b9ce894Ajit Khaparde
30264600ea5f389858e183d3739776f4667265cc77fAjit Khapardestruct be_vf_cfg {
30311ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	unsigned char mac_addr[ETH_ALEN];
30411ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	int if_handle;
30511ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	int pmac_id;
306f1f3ee1bcc996e21f122442fd8c34de51622c76aAjit Khaparde	u16 def_vid;
30711ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	u16 vlan_tag;
30811ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	u32 tx_rate;
30964600ea5f389858e183d3739776f4667265cc77fAjit Khaparde};
31064600ea5f389858e183d3739776f4667265cc77fAjit Khaparde
311b236916a68d923acff15787b5439d7d684c17ae5Ajit Khaparde#define BE_FLAGS_LINK_STATUS_INIT		1
312191eb7563164529bc7d6a693742fe5bed33cf004Sathya Perla#define BE_FLAGS_WORKER_SCHEDULED		(1 << 3)
313fbc13f018c0043146f8eccc7d6a6c0e66339e2d5Ajit Khaparde#define BE_UC_PMAC_COUNT		30
314fbc13f018c0043146f8eccc7d6a6c0e66339e2d5Ajit Khaparde#define BE_VF_UC_PMAC_COUNT		2
315b236916a68d923acff15787b5439d7d684c17ae5Ajit Khaparde
3166b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_adapter {
3176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct pci_dev *pdev;
3186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct net_device *netdev;
3196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3208788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	u8 __iomem *csr;
3218788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	u8 __iomem *db;		/* Door Bell */
3228788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla
3232984961c388381c1830f95e1c2dc2137301b1009Ivan Vecera	struct mutex mbox_lock; /* For serializing mbox cmds to BE card */
3248788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	struct be_dma_mem mbox_mem;
3258788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	/* Mbox mem is adjusted to align to 16 bytes. The allocated addr
3268788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	 * is stored for freeing purpose */
3278788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	struct be_dma_mem mbox_mem_alloced;
3288788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla
3298788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	struct be_mcc_obj mcc_obj;
3308788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	spinlock_t mcc_lock;	/* For serializing mcc cmds to BE card */
3318788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	spinlock_t mcc_cq_lock;
3326b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
333ac6a0c4aab16070d7d55f49a52de33f716ae1d3dSathya Perla	u32 num_msix_vec;
33410ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u32 num_evt_qs;
33510ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	struct be_eq_obj eq_obj[MAX_MSIX_VECTORS];
33610ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	struct msix_entry msix_entries[MAX_MSIX_VECTORS];
3376b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool isr_registered;
3386b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3396b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* TX Rings */
34010ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	u32 num_tx_qs;
3413c8def9776c3d4636291432522ea312f7a44be95Sathya Perla	struct be_tx_obj tx_obj[MAX_TX_QS];
3426b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3436b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Rx rings */
3443abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	u32 num_rx_qs;
34510ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	struct be_rx_obj rx_obj[MAX_RX_QS];
3466b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 big_page_size;	/* Compounded page size shared by rx wrbs */
3476b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
348ecd6210765f93bd2c578d370d45bb49c710f3e89Padmanabh Ratnakar	u8 eq_next_idx;
349609ff3bb8f6cd38c68c719bbc3c31d6b0b9ce894Ajit Khaparde	struct be_drv_stats drv_stats;
350fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla
35182903e4bfca1578336a91c0c17839b484c12295dAjit Khaparde	u16 vlans_added;
35282903e4bfca1578336a91c0c17839b484c12295dAjit Khaparde	u16 max_vlans;	/* Number of vlans supported */
353b738127dfb469bb9f595cdace30e7f881e8146b2Jesse Gross	u8 vlan_tag[VLAN_N_VID];
354cc4ce020935eab2d261b7b8d24a9843b56ad594cSomnath Kotur	u8 vlan_prio_bmap;	/* Available Priority BitMap */
355cc4ce020935eab2d261b7b8d24a9843b56ad594cSomnath Kotur	u16 recommended_prio;	/* Recommended Priority */
3565b8821b787495273ba4fb333a3561c6da382a9a7Sathya Perla	struct be_dma_mem rx_filter; /* Cmd DMA mem for rx-filter */
3576b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3583abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	struct be_dma_mem stats_cmd;
3596b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Work queue used to perform periodic tasks like getting statistics */
3606b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct delayed_work work;
361609ff3bb8f6cd38c68c719bbc3c31d6b0b9ce894Ajit Khaparde	u16 work_counter;
3626b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
363b236916a68d923acff15787b5439d7d684c17ae5Ajit Khaparde	u32 flags;
3646b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Ethtool knobs and info */
3656b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	char fw_ver[FW_VER_LEN];
36630128031d71741ef7d0e32c345e3bf02aa8a0704Sathya Perla	int if_handle;		/* Used to configure filtering */
367fbc13f018c0043146f8eccc7d6a6c0e66339e2d5Ajit Khaparde	u32 *pmac_id;		/* MAC addr handle used by BE card */
3681a64246913849b0cef0be88c23381468ce169ab6stephen hemminger	u32 beacon_state;	/* for set_phys_id */
3696b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
370cf588477a3fbf085426e5c0b6205984ebb7e2187Sathya Perla	bool eeh_err;
3716589ade019dcab245d3bb847370f855b56cdf6adSathya Perla	bool ue_detected;
3726589ade019dcab245d3bb847370f855b56cdf6adSathya Perla	bool fw_timeout;
3736b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 port_num;
37424307eef74bd38e3fc6a6df8f8a1bfc48967f9f6Sathya Perla	bool promiscuous;
3753486be29e63a9e8b0b013a9581879d8a48790d20Ajit Khaparde	u32 function_mode;
3763abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	u32 function_caps;
3779e90c961134929678022aee0c68b16c1ed520614Ajit Khaparde	u32 rx_fc;		/* Rx flow control */
3789e90c961134929678022aee0c68b16c1ed520614Ajit Khaparde	u32 tx_fc;		/* Tx flow control */
379b2aebe6d8102ed55c161371a6ac4d945c95c334cAjit Khaparde	bool stats_cmd_sent;
3800dffc83e5b831df1df83dfe32a0c267347f9950bAjit Khaparde	int link_speed;
3810dffc83e5b831df1df83dfe32a0c267347f9950bAjit Khaparde	u8 port_type;
38216c02145902d8597841a25e8443cfb082898a2d7Sarveshwar Bandi	u8 transceiver;
383ee3cb6295144b0adfa75ccaca307643a6998b1e2Ajit Khaparde	u8 autoneg;
3847b139c83c590d4965259aad8889cbb08104b2891Ajit Khaparde	u8 generation;		/* BladeEngine ASIC generation */
385dd131e76e562fa0c6f9dd53130e8d08d39a0b62cSarveshwar Bandi	u32 flash_status;
386dd131e76e562fa0c6f9dd53130e8d08d39a0b62cSarveshwar Bandi	struct completion flash_compl;
387ba343c7736b36d62d276e20383588bcf9403d6c6Sarveshwar Bandi
38811ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	u32 num_vfs;
389344dbf1073d1cea179ed0831547cab2b7ea4ea27Sarveshwar Bandi	u8 is_virtfn;
39011ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	struct be_vf_cfg *vf_cfg;
39111ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	bool be3_native;
392fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla	u32 sli_family;
3939e1453c5c5fe670bb98a6097b262122386b0d3feAjit Khaparde	u8 hba_port_num;
3943968fa1e58896187ee5629db0720d93b9313ad9fAjit Khaparde	u16 pvid;
3954762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	u8 wol_cap;
3964762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	bool wol;
397fbc13f018c0043146f8eccc7d6a6c0e66339e2d5Ajit Khaparde	u32 max_pmac_cnt;	/* Max secondary UC MACs programmable */
398fbc13f018c0043146f8eccc7d6a6c0e66339e2d5Ajit Khaparde	u32 uc_macs;		/* Count of secondary UC MAC programmed */
3996b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
4006b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
401344dbf1073d1cea179ed0831547cab2b7ea4ea27Sarveshwar Bandi#define be_physfn(adapter) (!adapter->is_virtfn)
40211ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla#define	sriov_enabled(adapter)		(adapter->num_vfs > 0)
40311ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla#define for_all_vfs(adapter, vf_cfg, i)					\
40411ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla	for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs;	\
40511ac75ed1eb9d8f5ff067fa9a82ebf5075989281Sathya Perla		i++, vf_cfg++)
406ba343c7736b36d62d276e20383588bcf9403d6c6Sarveshwar Bandi
4077b139c83c590d4965259aad8889cbb08104b2891Ajit Khaparde/* BladeEngine Generation numbers */
4087b139c83c590d4965259aad8889cbb08104b2891Ajit Khaparde#define BE_GEN2 2
4097b139c83c590d4965259aad8889cbb08104b2891Ajit Khaparde#define BE_GEN3 3
4107b139c83c590d4965259aad8889cbb08104b2891Ajit Khaparde
4115b8821b787495273ba4fb333a3561c6da382a9a7Sathya Perla#define ON				1
4125b8821b787495273ba4fb333a3561c6da382a9a7Sathya Perla#define OFF				0
41312f4d0a8770ab26639091d0b2509b19681daad69Mammatha Edhala#define lancer_chip(adapter)	((adapter->pdev->device == OC_DEVICE_ID3) || \
41412f4d0a8770ab26639091d0b2509b19681daad69Mammatha Edhala				 (adapter->pdev->device == OC_DEVICE_ID4))
415fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla
4160fc0b732eaa38beb93a6fb62f77c7bd9622c76ecStephen Hemmingerextern const struct ethtool_ops be_ethtool_ops;
4176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
418ac6a0c4aab16070d7d55f49a52de33f716ae1d3dSathya Perla#define msix_enabled(adapter)		(adapter->num_msix_vec > 0)
41910ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define num_irqs(adapter)		(msix_enabled(adapter) ?	\
42010ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla						adapter->num_msix_vec : 1)
42110ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define tx_stats(txo)			(&(txo)->stats)
42210ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define rx_stats(rxo)			(&(rxo)->stats)
4236b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
42410ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla/* The default RXQ is the last RXQ */
42510ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define default_rxo(adpt)		(&adpt->rx_obj[adpt->num_rx_qs - 1])
4266b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4273abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla#define for_all_rx_queues(adapter, rxo, i)				\
4283abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla	for (i = 0, rxo = &adapter->rx_obj[i]; i < adapter->num_rx_qs;	\
4293abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla		i++, rxo++)
4303abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla
43110ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla/* Skip the default non-rss queue (last one)*/
4323abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla#define for_all_rss_queues(adapter, rxo, i)				\
43310ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	for (i = 0, rxo = &adapter->rx_obj[i]; i < (adapter->num_rx_qs - 1);\
4343abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla		i++, rxo++)
4353abcdeda59c1d4cf2bf83311ed2d544355ec7c2dSathya Perla
4363c8def9776c3d4636291432522ea312f7a44be95Sathya Perla#define for_all_tx_queues(adapter, txo, i)				\
4373c8def9776c3d4636291432522ea312f7a44be95Sathya Perla	for (i = 0, txo = &adapter->tx_obj[i]; i < adapter->num_tx_qs;	\
4383c8def9776c3d4636291432522ea312f7a44be95Sathya Perla		i++, txo++)
4393c8def9776c3d4636291432522ea312f7a44be95Sathya Perla
44010ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define for_all_evt_queues(adapter, eqo, i)				\
44110ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla	for (i = 0, eqo = &adapter->eq_obj[i]; i < adapter->num_evt_qs; \
44210ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla		i++, eqo++)
44310ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla
44410ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define is_mcc_eqo(eqo)			(eqo->idx == 0)
44510ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla#define mcc_eqo(adapter)		(&adapter->eq_obj[0])
44610ef9ab4329edd08bccc7a8d34b96b85714195ceSathya Perla
4476b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define PAGE_SHIFT_4K		12
4486b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define PAGE_SIZE_4K		(1 << PAGE_SHIFT_4K)
4496b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4506b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Returns number of pages spanned by the data starting at the given addr */
4516b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define PAGES_4K_SPANNED(_address, size) 				\
4526b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		((u32)((((size_t)(_address) & (PAGE_SIZE_4K - 1)) + 	\
4536b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			(size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
4546b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4556b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Returns bit offset within a DWORD of a bitfield */
4566b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define AMAP_BIT_OFFSET(_struct, field)  				\
4576b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		(((size_t)&(((_struct *)0)->field))%32)
4586b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4596b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Returns the bit mask of the field that is NOT shifted into location. */
4606b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u32 amap_mask(u32 bitsize)
4616b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
4626b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return (bitsize == 32 ? 0xFFFFFFFF : (1 << bitsize) - 1);
4636b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
4646b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4656b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline void
4666b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlaamap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
4676b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
4686b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 *dw = (u32 *) ptr + dw_offset;
4696b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	*dw &= ~(mask << offset);
4706b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	*dw |= (mask & value) << offset;
4716b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
4726b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4736b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define AMAP_SET_BITS(_struct, field, ptr, val)				\
4746b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		amap_set(ptr,						\
4756b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			offsetof(_struct, field)/32,			\
4766b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			amap_mask(sizeof(((_struct *)0)->field)),	\
4776b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			AMAP_BIT_OFFSET(_struct, field),		\
4786b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			val)
4796b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4806b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
4816b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
4826b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 *dw = (u32 *) ptr;
4836b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return mask & (*(dw + dw_offset) >> offset);
4846b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
4856b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4866b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define AMAP_GET_BITS(_struct, field, ptr)				\
4876b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		amap_get(ptr,						\
4886b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			offsetof(_struct, field)/32,			\
4896b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			amap_mask(sizeof(((_struct *)0)->field)),	\
4906b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			AMAP_BIT_OFFSET(_struct, field))
4916b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
4926b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define be_dws_cpu_to_le(wrb, len)	swap_dws(wrb, len)
4936b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define be_dws_le_to_cpu(wrb, len)	swap_dws(wrb, len)
4946b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline void swap_dws(void *wrb, int len)
4956b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
4966b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#ifdef __BIG_ENDIAN
4976b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 *dw = wrb;
4986b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	BUG_ON(len % 4);
4996b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	do {
5006b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		*dw = cpu_to_le32(*dw);
5016b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		dw++;
5026b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		len -= 4;
5036b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	} while (len);
5046b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#endif				/* __BIG_ENDIAN */
5056b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
5066b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
5076b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u8 is_tcp_pkt(struct sk_buff *skb)
5086b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
5096b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u8 val = 0;
5106b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
5116b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	if (ip_hdr(skb)->version == 4)
5126b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ip_hdr(skb)->protocol == IPPROTO_TCP);
5136b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	else if (ip_hdr(skb)->version == 6)
5146b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_TCP);
5156b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
5166b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return val;
5176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
5186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
5196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u8 is_udp_pkt(struct sk_buff *skb)
5206b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
5216b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u8 val = 0;
5226b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
5236b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	if (ip_hdr(skb)->version == 4)
5246b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ip_hdr(skb)->protocol == IPPROTO_UDP);
5256b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	else if (ip_hdr(skb)->version == 6)
5266b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_UDP);
5276b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
5286b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return val;
5296b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
5306b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
531344dbf1073d1cea179ed0831547cab2b7ea4ea27Sarveshwar Bandistatic inline void be_check_sriov_fn_type(struct be_adapter *adapter)
532344dbf1073d1cea179ed0831547cab2b7ea4ea27Sarveshwar Bandi{
533fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla	u32 sli_intf;
534fe6d2a38b2076cba515dc95b5dc1589a7ab51c17Sathya Perla
535b0060586d23968d66325d775651d92ee830c032fAjit Khaparde	pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);
536b0060586d23968d66325d775651d92ee830c032fAjit Khaparde	adapter->is_virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0;
537344dbf1073d1cea179ed0831547cab2b7ea4ea27Sarveshwar Bandi}
538344dbf1073d1cea179ed0831547cab2b7ea4ea27Sarveshwar Bandi
5396d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khapardestatic inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
5406d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde{
5416d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde	u32 addr;
5426d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde
5436d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde	addr = jhash(adapter->netdev->dev_addr, ETH_ALEN, 0);
5446d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde
5456d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde	mac[5] = (u8)(addr & 0xFF);
5466d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde	mac[4] = (u8)((addr >> 8) & 0xFF);
5476d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde	mac[3] = (u8)((addr >> 16) & 0xFF);
5487a2414a50b071d84dae8fbca51d10009e07e535fAjit Khaparde	/* Use the OUI from the current MAC address */
5497a2414a50b071d84dae8fbca51d10009e07e535fAjit Khaparde	memcpy(mac, adapter->netdev->dev_addr, 3);
5506d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde}
5516d87f5c3ac5856bf1309700e2f15e2e7fcd3c578Ajit Khaparde
5524b97291429bf59c09a969184a7d2ebde7287e7ebAjit Khapardestatic inline bool be_multi_rxq(const struct be_adapter *adapter)
5534b97291429bf59c09a969184a7d2ebde7287e7ebAjit Khaparde{
5544b97291429bf59c09a969184a7d2ebde7287e7ebAjit Khaparde	return adapter->num_rx_qs > 1;
5554b97291429bf59c09a969184a7d2ebde7287e7ebAjit Khaparde}
5564b97291429bf59c09a969184a7d2ebde7287e7ebAjit Khaparde
5576589ade019dcab245d3bb847370f855b56cdf6adSathya Perlastatic inline bool be_error(struct be_adapter *adapter)
5586589ade019dcab245d3bb847370f855b56cdf6adSathya Perla{
5596589ade019dcab245d3bb847370f855b56cdf6adSathya Perla	return adapter->eeh_err || adapter->ue_detected || adapter->fw_timeout;
5606589ade019dcab245d3bb847370f855b56cdf6adSathya Perla}
5616589ade019dcab245d3bb847370f855b56cdf6adSathya Perla
5624762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khapardestatic inline bool be_is_wol_excluded(struct be_adapter *adapter)
5634762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde{
5644762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	struct pci_dev *pdev = adapter->pdev;
5654762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde
5664762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	if (!be_physfn(adapter))
5674762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde		return true;
5684762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde
5694762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	switch (pdev->subsystem_device) {
5704762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	case OC_SUBSYS_DEVICE_ID1:
5714762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	case OC_SUBSYS_DEVICE_ID2:
5724762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	case OC_SUBSYS_DEVICE_ID3:
5734762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	case OC_SUBSYS_DEVICE_ID4:
5744762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde		return true;
5754762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	default:
5764762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde		return false;
5774762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde	}
5784762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde}
5794762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khaparde
5808788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perlaextern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
5815fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla		u16 num_popped);
582b236916a68d923acff15787b5439d7d684c17ae5Ajit Khapardeextern void be_link_status_update(struct be_adapter *adapter, u8 link_status);
58389a88ab84b946a90839fb66ca3583a2504c11292Ajit Khapardeextern void be_parse_stats(struct be_adapter *adapter);
58484517482e19bc775de7b3b4e998dee2f506bc34eAjit Khapardeextern int be_load_fw(struct be_adapter *adapter, u8 *func);
5854762f6cec4455f3bbe4ca82c100fe5d85d3c02a2Ajit Khapardeextern bool be_is_wol_supported(struct be_adapter *adapter);
5866b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#endif				/* BE_H */
587