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