enic.h 7.3 KB
Newer Older
1
/*
V
Vasanthy Kolluri 已提交
2
 * Copyright 2008-2010 Cisco Systems, Inc.  All rights reserved.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
 *
 * This program is free software; you may redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 */

#ifndef _ENIC_H_
#define _ENIC_H_

#include "vnic_enet.h"
#include "vnic_dev.h"
#include "vnic_wq.h"
#include "vnic_rq.h"
#include "vnic_cq.h"
#include "vnic_intr.h"
#include "vnic_stats.h"
30
#include "vnic_nic.h"
31
#include "vnic_rss.h"
32
#include <linux/irq.h>
33 34

#define DRV_NAME		"enic"
35
#define DRV_DESCRIPTION		"Cisco VIC Ethernet NIC Driver"
G
Govindarajulu Varadarajan 已提交
36
#define DRV_VERSION		"2.3.0.12"
37
#define DRV_COPYRIGHT		"Copyright 2008-2013 Cisco Systems, Inc"
38

39 40
#define ENIC_BARS_MAX		6

41
#define ENIC_WQ_MAX		8
42
#define ENIC_RQ_MAX		8
43 44 45
#define ENIC_CQ_MAX		(ENIC_WQ_MAX + ENIC_RQ_MAX)
#define ENIC_INTR_MAX		(ENIC_CQ_MAX + 2)

46 47
#define ENIC_AIC_LARGE_PKT_DIFF	3

48 49 50 51 52 53 54
struct enic_msix_entry {
	int requested;
	char devname[IFNAMSIZ];
	irqreturn_t (*isr)(int, void *);
	void *devid;
};

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/* Store only the lower range.  Higher range is given by fw. */
struct enic_intr_mod_range {
	u32 small_pkt_range_start;
	u32 large_pkt_range_start;
};

struct enic_intr_mod_table {
	u32 rx_rate;
	u32 range_percent;
};

#define ENIC_MAX_LINK_SPEEDS		3
#define ENIC_LINK_SPEED_10G		10000
#define ENIC_LINK_SPEED_4G		4000
#define ENIC_LINK_40G_INDEX		2
#define ENIC_LINK_10G_INDEX		1
#define ENIC_LINK_4G_INDEX		0
#define ENIC_RX_COALESCE_RANGE_END	125
#define ENIC_AIC_TS_BREAK		100

struct enic_rx_coal {
	u32 small_pkt_range_start;
	u32 large_pkt_range_start;
	u32 range_end;
	u32 use_adaptive_rx_coalesce;
};

R
Roopa Prabhu 已提交
82 83 84 85
/* priv_flags */
#define ENIC_SRIOV_ENABLED		(1 << 0)

/* enic port profile set flags */
86
#define ENIC_PORT_REQUEST_APPLIED	(1 << 0)
87 88 89 90 91
#define ENIC_SET_REQUEST		(1 << 1)
#define ENIC_SET_NAME			(1 << 2)
#define ENIC_SET_INSTANCE		(1 << 3)
#define ENIC_SET_HOST			(1 << 4)

92
struct enic_port_profile {
93
	u32 set;
94 95 96 97
	u8 request;
	char name[PORT_PROFILE_MAX];
	u8 instance_uuid[PORT_UUID_MAX];
	u8 host_uuid[PORT_UUID_MAX];
98
	u8 vf_mac[ETH_ALEN];
99
	u8 mac_addr[ETH_ALEN];
100 101
};

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/* enic_rfs_fltr_node - rfs filter node in hash table
 *	@@keys: IPv4 5 tuple
 *	@flow_id: flow_id of clsf filter provided by kernel
 *	@fltr_id: filter id of clsf filter returned by adaptor
 *	@rq_id: desired rq index
 *	@node: hlist_node
 */
struct enic_rfs_fltr_node {
	struct flow_keys keys;
	u32 flow_id;
	u16 fltr_id;
	u16 rq_id;
	struct hlist_node node;
};

/* enic_rfs_flw_tbl - rfs flow table
 *	@max: Maximum number of filters vNIC supports
 *	@free: Number of free filters available
 *	@toclean: hash table index to clean next
 *	@ht_head: hash table list head
 *	@lock: spin lock
 *	@rfs_may_expire: timer function for enic_rps_may_expire_flow
 */
struct enic_rfs_flw_tbl {
	u16 max;
	int free;

#define ENIC_RFS_FLW_BITSHIFT	(10)
#define ENIC_RFS_FLW_MASK	((1 << ENIC_RFS_FLW_BITSHIFT) - 1)
	u16 toclean:ENIC_RFS_FLW_BITSHIFT;
	struct hlist_head ht_head[1 << ENIC_RFS_FLW_BITSHIFT];
	spinlock_t lock;
	struct timer_list rfs_may_expire;
};

137 138 139 140 141
/* Per-instance private data structure */
struct enic {
	struct net_device *netdev;
	struct pci_dev *pdev;
	struct vnic_enet_config config;
142
	struct vnic_dev_bar bar[ENIC_BARS_MAX];
143 144 145
	struct vnic_dev *vdev;
	struct timer_list notify_timer;
	struct work_struct reset;
146
	struct work_struct tx_hang_reset;
147
	struct work_struct change_mtu_work;
148 149
	struct msix_entry msix_entry[ENIC_INTR_MAX];
	struct enic_msix_entry msix[ENIC_INTR_MAX];
150 151 152
	u32 msg_enable;
	spinlock_t devcmd_lock;
	u8 mac_addr[ETH_ALEN];
153
	unsigned int flags;
R
Roopa Prabhu 已提交
154
	unsigned int priv_flags;
155
	unsigned int mc_count;
156
	unsigned int uc_count;
157
	u32 port_mtu;
158
	struct enic_rx_coal rx_coalesce_setting;
159 160
	u32 rx_coalesce_usecs;
	u32 tx_coalesce_usecs;
R
Roopa Prabhu 已提交
161
#ifdef CONFIG_PCI_IOV
162
	u16 num_vfs;
R
Roopa Prabhu 已提交
163
#endif
164
	spinlock_t enic_api_lock;
165
	struct enic_port_profile *pp;
166 167

	/* work queue cache line section */
168 169
	____cacheline_aligned struct vnic_wq wq[ENIC_WQ_MAX];
	spinlock_t wq_lock[ENIC_WQ_MAX];
170
	unsigned int wq_count;
171 172
	u16 loop_enable;
	u16 loop_tag;
173 174

	/* receive queue cache line section */
175
	____cacheline_aligned struct vnic_rq rq[ENIC_RQ_MAX];
176
	unsigned int rq_count;
177
	u64 rq_truncated_pkts;
178
	u64 rq_bad_fcs;
179
	struct napi_struct napi[ENIC_RQ_MAX + ENIC_WQ_MAX];
180 181

	/* interrupt resource cache line section */
182
	____cacheline_aligned struct vnic_intr intr[ENIC_INTR_MAX];
183 184 185 186 187 188
	unsigned int intr_count;
	u32 __iomem *legacy_pba;		/* memory-mapped */

	/* completion queue cache line section */
	____cacheline_aligned struct vnic_cq cq[ENIC_CQ_MAX];
	unsigned int cq_count;
189
	struct enic_rfs_flw_tbl rfs_h;
190
	u32 rx_copybreak;
191
	u8 rss_key[ENIC_RSS_LEN];
192
	struct vnic_gen_stats gen_stats;
193 194
};

195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
static inline struct net_device *vnic_get_netdev(struct vnic_dev *vdev)
{
	struct enic *enic = vdev->priv;

	return enic->netdev;
}

/* wrappers function for kernel log
 * Make sure variable vdev of struct vnic_dev is available in the block where
 * these macros are used
 */
#define vdev_info(args...)	dev_info(&vdev->pdev->dev, args)
#define vdev_warn(args...)	dev_warn(&vdev->pdev->dev, args)
#define vdev_err(args...)	dev_err(&vdev->pdev->dev, args)

#define vdev_netinfo(args...)	netdev_info(vnic_get_netdev(vdev), args)
#define vdev_netwarn(args...)	netdev_warn(vnic_get_netdev(vdev), args)
#define vdev_neterr(args...)	netdev_err(vnic_get_netdev(vdev), args)

214 215 216 217 218
static inline struct device *enic_get_dev(struct enic *enic)
{
	return &(enic->pdev->dev);
}

219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
static inline unsigned int enic_cq_rq(struct enic *enic, unsigned int rq)
{
	return rq;
}

static inline unsigned int enic_cq_wq(struct enic *enic, unsigned int wq)
{
	return enic->rq_count + wq;
}

static inline unsigned int enic_legacy_io_intr(void)
{
	return 0;
}

static inline unsigned int enic_legacy_err_intr(void)
{
	return 1;
}

static inline unsigned int enic_legacy_notify_intr(void)
{
	return 2;
}

static inline unsigned int enic_msix_rq_intr(struct enic *enic,
	unsigned int rq)
{
	return enic->cq[enic_cq_rq(enic, rq)].interrupt_offset;
}

static inline unsigned int enic_msix_wq_intr(struct enic *enic,
	unsigned int wq)
{
	return enic->cq[enic_cq_wq(enic, wq)].interrupt_offset;
}

static inline unsigned int enic_msix_err_intr(struct enic *enic)
{
	return enic->rq_count + enic->wq_count;
}

static inline unsigned int enic_msix_notify_intr(struct enic *enic)
{
	return enic->rq_count + enic->wq_count + 1;
}

266 267 268 269 270
static inline int enic_dma_map_check(struct enic *enic, dma_addr_t dma_addr)
{
	if (unlikely(pci_dma_mapping_error(enic->pdev, dma_addr))) {
		net_warn_ratelimited("%s: PCI dma mapping failed!\n",
				     enic->netdev->name);
271
		enic->gen_stats.dma_map_error++;
272 273 274 275 276 277 278

		return -ENOMEM;
	}

	return 0;
}

279
void enic_reset_addr_lists(struct enic *enic);
R
Roopa Prabhu 已提交
280
int enic_sriov_enabled(struct enic *enic);
281
int enic_is_valid_vf(struct enic *enic, int vf);
282
int enic_is_dynamic(struct enic *enic);
283
void enic_set_ethtool_ops(struct net_device *netdev);
284
int __enic_set_rsskey(struct enic *enic);
285

286
#endif /* _ENIC_H_ */