be.h revision 0dffc83e5b831df1df83dfe32a0c267347f9950b
16b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/*
26b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * Copyright (C) 2005 - 2009 ServerEngines
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:
116b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * linux-drivers@serverengines.com
126b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla *
136b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * ServerEngines
146b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * 209 N. Fair Oaks Ave
156b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla * Sunnyvale, CA 94085
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/version.h>
246b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/delay.h>
256b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <net/tcp.h>
266b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <net/ip.h>
276b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <net/ipv6.h>
286b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/if_vlan.h>
296b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/workqueue.h>
306b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include <linux/interrupt.h>
3184517482e19bc775de7b3b4e998dee2f506bc34eAjit Khaparde#include <linux/firmware.h>
326b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
336b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#include "be_hw.h"
346b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3584517482e19bc775de7b3b4e998dee2f506bc34eAjit Khaparde#define DRV_VER			"2.101.205"
366b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define DRV_NAME		"be2net"
376b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NAME			"ServerEngines BladeEngine2 10Gbps NIC"
3812d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde#define BE3_NAME		"ServerEngines BladeEngine3 10Gbps NIC"
39c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define OC_NAME			"Emulex OneConnect 10Gbps NIC"
4012d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde#define OC_NAME1		"Emulex OneConnect 10Gbps NIC (be3)"
416b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define DRV_DESC		BE_NAME "Driver"
426b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
43c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define BE_VENDOR_ID 		0x19a2
44c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define BE_DEVICE_ID1		0x211
4512d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde#define BE_DEVICE_ID2		0x221
46c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define OC_DEVICE_ID1		0x700
47c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde#define OC_DEVICE_ID2		0x701
4812d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde#define OC_DEVICE_ID3		0x710
49c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde
50c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khapardestatic inline char *nic_name(struct pci_dev *pdev)
51c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde{
5212d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	switch (pdev->device) {
5312d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	case OC_DEVICE_ID1:
5412d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	case OC_DEVICE_ID2:
55c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde		return OC_NAME;
5612d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	case OC_DEVICE_ID3:
5712d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde		return OC_NAME1;
5812d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	case BE_DEVICE_ID2:
5912d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde		return BE3_NAME;
6012d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	default:
61c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde		return BE_NAME;
6212d7ea2c5a5c87834daf9fcd920aab80ff6248b1Ajit Khaparde	}
63c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde}
64c4ca2374312b4de819dd700e72a68395eddb5fcbAjit Khaparde
656b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Number of bytes of an RX frame that are copied to skb->data */
666b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_HDR_LEN 		64
676b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_MAX_JUMBO_FRAME_SIZE	9018
686b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_MIN_MTU		256
696b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
706b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NUM_VLANS_SUPPORTED	64
716b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_MAX_EQD		96
726b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define	BE_MAX_TX_FRAG_COUNT	30
736b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
746b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define EVNT_Q_LEN		1024
756b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define TX_Q_LEN		2048
766b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define TX_CQ_LEN		1024
776b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define RX_Q_LEN		1024	/* Does not support any other value */
786b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define RX_CQ_LEN		1024
795fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla#define MCC_Q_LEN		128	/* total size not to exceed 8 pages */
806b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define MCC_CQ_LEN		256
816b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
826b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NAPI_WEIGHT		64
836b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define MAX_RX_POST 		BE_NAPI_WEIGHT /* Frags posted at a time */
846b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define RX_FRAGS_REFILL_WM	(RX_Q_LEN - MAX_RX_POST)
856b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
868788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla#define FW_VER_LEN		32
878788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla
886b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_dma_mem {
896b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	void *va;
906b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	dma_addr_t dma;
916b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 size;
926b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
936b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
946b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_queue_info {
956b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_dma_mem dma_mem;
966b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 len;
976b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 entry_size;	/* Size of an element in the queue */
986b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 id;
996b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 tail, head;
1006b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool created;
1016b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	atomic_t used;	/* Number of valid elements in the queue */
1026b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
1036b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1045fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline u32 MODULO(u16 val, u16 limit)
1055fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1065fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	BUG_ON(limit & (limit - 1));
1075fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	return val & (limit - 1);
1085fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1095fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1105fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void index_adv(u16 *index, u16 val, u16 limit)
1115fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1125fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	*index = MODULO((*index + val), limit);
1135fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1145fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1155fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void index_inc(u16 *index, u16 limit)
1165fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1175fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	*index = MODULO((*index + 1), limit);
1185fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1195fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1205fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void *queue_head_node(struct be_queue_info *q)
1215fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1225fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	return q->dma_mem.va + q->head * q->entry_size;
1235fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1245fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1255fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void *queue_tail_node(struct be_queue_info *q)
1265fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1275fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	return q->dma_mem.va + q->tail * q->entry_size;
1285fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1295fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1305fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void queue_head_inc(struct be_queue_info *q)
1315fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1325fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	index_inc(&q->head, q->len);
1335fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1345fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1355fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastatic inline void queue_tail_inc(struct be_queue_info *q)
1365fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla{
1375fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	index_inc(&q->tail, q->len);
1385fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla}
1395fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1405fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastruct be_eq_obj {
1415fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct be_queue_info q;
1425fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	char desc[32];
1435fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1445fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	/* Adaptive interrupt coalescing (AIC) info */
1455fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	bool enable_aic;
1465fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	u16 min_eqd;		/* in usecs */
1475fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	u16 max_eqd;		/* in usecs */
1485fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	u16 cur_eqd;		/* in usecs */
1495fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1505fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct napi_struct napi;
1515fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla};
1525fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1535fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perlastruct be_mcc_obj {
1545fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct be_queue_info q;
1555fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla	struct be_queue_info cq;
1565fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla};
1575fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla
1586b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_drvr_stats {
1596b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_tx_reqs;		/* number of TX requests initiated */
1606b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_tx_stops;	/* number of times TX Q was stopped */
1616b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_fwd_reqs;	/* number of send reqs through forwarding i/f */
1626b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_tx_wrbs;		/* number of tx WRBs used */
1636b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_tx_events;	/* number of tx completion events  */
1646b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_tx_compl;	/* number of tx completion entries processed */
1654097f663cbe9e58de7ebed222f8af33267f297a8Sathya Perla	ulong be_tx_jiffies;
1664097f663cbe9e58de7ebed222f8af33267f297a8Sathya Perla	u64 be_tx_bytes;
1674097f663cbe9e58de7ebed222f8af33267f297a8Sathya Perla	u64 be_tx_bytes_prev;
1686b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_tx_rate;
1696b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1706b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 cache_barrier[16];
1716b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1726b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_ethrx_post_fail;/* number of ethrx buffer alloc failures */
173b7b83ac39a177741a378d728d82e87de9b0a01a5Ajit Khaparde	u32 be_rx_polls;	/* number of times NAPI called poll function */
1746b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_rx_events;	/* number of ucast rx completion events  */
1756b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_rx_compl;	/* number of rx completion entries processed */
1764097f663cbe9e58de7ebed222f8af33267f297a8Sathya Perla	ulong be_rx_jiffies;
1774097f663cbe9e58de7ebed222f8af33267f297a8Sathya Perla	u64 be_rx_bytes;
1784097f663cbe9e58de7ebed222f8af33267f297a8Sathya Perla	u64 be_rx_bytes_prev;
1796b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_rx_rate;
1806b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* number of non ether type II frames dropped where
1816b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	 * frame len > length field of Mac Hdr */
1826b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_802_3_dropped_frames;
1836b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* number of non ether type II frames malformed where
1846b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	 * in frame len < length field of Mac Hdr */
1856b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_802_3_malformed_frames;
1866b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_rxcp_err;	/* Num rx completion entries w/ err set. */
1876b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	ulong rx_fps_jiffies;	/* jiffies at last FPS calc */
1886b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_rx_frags;
1896b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_prev_rx_frags;
1906b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 be_rx_fps;		/* Rx frags per second */
1916b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
1926b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1936b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_stats_obj {
1946b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_drvr_stats drvr_stats;
1956b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_dma_mem cmd;
1966b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
1976b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
1986b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_tx_obj {
1996b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info q;
2006b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info cq;
2016b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Remember the skbs that were transmitted */
2026b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct sk_buff *sent_skb_list[TX_Q_LEN];
2036b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
2046b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2056b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Struct to remember the pages posted for rx frags */
2066b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_rx_page_info {
2076b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct page *page;
2086b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	dma_addr_t bus;
2096b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 page_offset;
2106b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool last_page_user;
2116b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
2126b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2136b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_rx_obj {
2146b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info q;
2156b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_queue_info cq;
2166b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_rx_page_info page_info_tbl[RX_Q_LEN];
2176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
2186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_NUM_MSIX_VECTORS		2	/* 1 each for Tx and Rx */
2206b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastruct be_adapter {
2216b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct pci_dev *pdev;
2226b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct net_device *netdev;
2236b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2248788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	u8 __iomem *csr;
2258788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	u8 __iomem *db;		/* Door Bell */
2268788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	u8 __iomem *pcicfg;	/* PCI config space */
2278788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla
2288788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	spinlock_t mbox_lock;	/* For serializing mbox cmds to BE card */
2298788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	struct be_dma_mem mbox_mem;
2308788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	/* Mbox mem is adjusted to align to 16 bytes. The allocated addr
2318788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	 * is stored for freeing purpose */
2328788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	struct be_dma_mem mbox_mem_alloced;
2338788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla
2348788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	struct be_mcc_obj mcc_obj;
2358788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	spinlock_t mcc_lock;	/* For serializing mcc cmds to BE card */
2368788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perla	spinlock_t mcc_cq_lock;
2376b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2386b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct msix_entry msix_entries[BE_NUM_MSIX_VECTORS];
2396b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool msix_enabled;
2406b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool isr_registered;
2416b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2426b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* TX Rings */
2436b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_eq_obj tx_eq;
2446b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_tx_obj tx_obj;
2456b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2466b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 cache_line_break[8];
2476b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2486b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Rx rings */
2496b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_eq_obj rx_eq;
2506b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_rx_obj rx_obj;
2516b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 big_page_size;	/* Compounded page size shared by rx wrbs */
252ea1dae11e0baca5d633207fe50fc3cd30a5d68eeSathya Perla	bool rx_post_starved;	/* Zero rx frags have been posted to BE */
2536b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2546b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct vlan_group *vlan_grp;
2556b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u16 num_vlans;
2566b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u8 vlan_tag[VLAN_GROUP_ARRAY_LEN];
257e7b909a68cfb83e4bafdadac39534969ce260518Sathya Perla	struct be_dma_mem mc_cmd_mem;
2586b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2596b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct be_stats_obj stats;
2606b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Work queue used to perform periodic tasks like getting statistics */
2616b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	struct delayed_work work;
2626b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2636b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	/* Ethtool knobs and info */
2646b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	bool rx_csum; 		/* BE card must perform rx-checksumming */
2656b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	char fw_ver[FW_VER_LEN];
2666b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 if_handle;		/* Used to configure filtering */
2676b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 pmac_id;		/* MAC addr handle used by BE card */
2686b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
269a8f447bda3ee00e3a3ab080c48db40078ea65221Sathya Perla	bool link_up;
2706b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 port_num;
27124307eef74bd38e3fc6a6df8f8a1bfc48967f9f6Sathya Perla	bool promiscuous;
272dcb9b5648a04d9178f9af9d8b684831a8ea59b9fAjit Khaparde	u32 cap;
2739e90c961134929678022aee0c68b16c1ed520614Ajit Khaparde	u32 rx_fc;		/* Rx flow control */
2749e90c961134929678022aee0c68b16c1ed520614Ajit Khaparde	u32 tx_fc;		/* Tx flow control */
2750dffc83e5b831df1df83dfe32a0c267347f9950bAjit Khaparde	int link_speed;
2760dffc83e5b831df1df83dfe32a0c267347f9950bAjit Khaparde	u8 port_type;
2776b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla};
2786b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2790fc0b732eaa38beb93a6fb62f77c7bd9622c76ecStephen Hemmingerextern const struct ethtool_ops be_ethtool_ops;
2806b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2816b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define drvr_stats(adapter)		(&adapter->stats.drvr_stats)
2826b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
283eec368fb3ce3ee9e7bb042bbafb03f297d96e55eSathya Perlastatic inline unsigned int be_pci_func(struct be_adapter *adapter)
284eec368fb3ce3ee9e7bb042bbafb03f297d96e55eSathya Perla{
285eec368fb3ce3ee9e7bb042bbafb03f297d96e55eSathya Perla	return PCI_FUNC(adapter->pdev->devfn);
286eec368fb3ce3ee9e7bb042bbafb03f297d96e55eSathya Perla}
287eec368fb3ce3ee9e7bb042bbafb03f297d96e55eSathya Perla
2886b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define BE_SET_NETDEV_OPS(netdev, ops)	(netdev->netdev_ops = ops)
2896b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2906b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define PAGE_SHIFT_4K		12
2916b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define PAGE_SIZE_4K		(1 << PAGE_SHIFT_4K)
2926b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2936b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Returns number of pages spanned by the data starting at the given addr */
2946b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define PAGES_4K_SPANNED(_address, size) 				\
2956b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		((u32)((((size_t)(_address) & (PAGE_SIZE_4K - 1)) + 	\
2966b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			(size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
2976b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
2986b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Byte offset into the page corresponding to given address */
2996b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define OFFSET_IN_PAGE(addr)						\
3006b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		 ((size_t)(addr) & (PAGE_SIZE_4K-1))
3016b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3026b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Returns bit offset within a DWORD of a bitfield */
3036b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define AMAP_BIT_OFFSET(_struct, field)  				\
3046b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		(((size_t)&(((_struct *)0)->field))%32)
3056b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3066b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla/* Returns the bit mask of the field that is NOT shifted into location. */
3076b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u32 amap_mask(u32 bitsize)
3086b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
3096b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return (bitsize == 32 ? 0xFFFFFFFF : (1 << bitsize) - 1);
3106b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
3116b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3126b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline void
3136b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlaamap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
3146b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
3156b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 *dw = (u32 *) ptr + dw_offset;
3166b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	*dw &= ~(mask << offset);
3176b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	*dw |= (mask & value) << offset;
3186b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
3196b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3206b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define AMAP_SET_BITS(_struct, field, ptr, val)				\
3216b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		amap_set(ptr,						\
3226b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			offsetof(_struct, field)/32,			\
3236b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			amap_mask(sizeof(((_struct *)0)->field)),	\
3246b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			AMAP_BIT_OFFSET(_struct, field),		\
3256b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			val)
3266b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3276b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
3286b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
3296b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 *dw = (u32 *) ptr;
3306b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return mask & (*(dw + dw_offset) >> offset);
3316b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
3326b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3336b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define AMAP_GET_BITS(_struct, field, ptr)				\
3346b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		amap_get(ptr,						\
3356b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			offsetof(_struct, field)/32,			\
3366b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			amap_mask(sizeof(((_struct *)0)->field)),	\
3376b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla			AMAP_BIT_OFFSET(_struct, field))
3386b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3396b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define be_dws_cpu_to_le(wrb, len)	swap_dws(wrb, len)
3406b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#define be_dws_le_to_cpu(wrb, len)	swap_dws(wrb, len)
3416b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline void swap_dws(void *wrb, int len)
3426b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
3436b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#ifdef __BIG_ENDIAN
3446b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u32 *dw = wrb;
3456b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	BUG_ON(len % 4);
3466b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	do {
3476b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		*dw = cpu_to_le32(*dw);
3486b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		dw++;
3496b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		len -= 4;
3506b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	} while (len);
3516b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#endif				/* __BIG_ENDIAN */
3526b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
3536b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3546b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u8 is_tcp_pkt(struct sk_buff *skb)
3556b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
3566b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u8 val = 0;
3576b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3586b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	if (ip_hdr(skb)->version == 4)
3596b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ip_hdr(skb)->protocol == IPPROTO_TCP);
3606b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	else if (ip_hdr(skb)->version == 6)
3616b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_TCP);
3626b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3636b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return val;
3646b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
3656b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3666b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perlastatic inline u8 is_udp_pkt(struct sk_buff *skb)
3676b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla{
3686b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	u8 val = 0;
3696b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3706b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	if (ip_hdr(skb)->version == 4)
3716b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ip_hdr(skb)->protocol == IPPROTO_UDP);
3726b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	else if (ip_hdr(skb)->version == 6)
3736b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla		val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_UDP);
3746b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3756b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla	return val;
3766b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla}
3776b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla
3788788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perlaextern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
3795fb379ee67a7ec55ff65b467b472f3d69b60ba16Sathya Perla		u16 num_popped);
3808788fdc2a53cf012a43808877eaa6ac7e3c923b4Sathya Perlaextern void be_link_status_update(struct be_adapter *adapter, bool link_up);
381b31c50a7f9e93a61d14740dedcbbf2c376998bc7Sathya Perlaextern void netdev_stats_update(struct be_adapter *adapter);
38284517482e19bc775de7b3b4e998dee2f506bc34eAjit Khapardeextern int be_load_fw(struct be_adapter *adapter, u8 *func);
3836b7c5b947c671a96e39f9526a5fd70c178b8dfd1Sathya Perla#endif				/* BE_H */
384