101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman/*
229046f9b1e36f6e3332ce2d8e366005fd177b37aVasanthy Kolluri * Copyright 2008-2010 Cisco Systems, Inc.  All rights reserved.
301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *
501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * This program is free software; you may redistribute it and/or modify
601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * it under the terms of the GNU General Public License as published by
701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * the Free Software Foundation; version 2 of the License.
801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *
901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
1301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
1401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * SOFTWARE.
1701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *
1801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman */
1901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
2001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#ifndef _ENIC_H_
2101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define _ENIC_H_
2201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
2301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_enet.h"
2401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_dev.h"
2501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_wq.h"
2601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_rq.h"
2701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_cq.h"
2801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_intr.h"
2901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_stats.h"
306ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman#include "vnic_nic.h"
31717258ba4b3ecca9c7c0ef2b76d7aa5800242badVasanthy Kolluri#include "vnic_rss.h"
3201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
3301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define DRV_NAME		"enic"
34641cb85e68945878d520d5fc3c2dc64aa1dda868Vasanthy Kolluri#define DRV_DESCRIPTION		"Cisco VIC Ethernet NIC Driver"
35b8622cbd58f345d48f683d881abe3037c60aa673Roopa Prabhu#define DRV_VERSION		"2.1.1.39"
364dce2396b329ef6a14b40c5416d6f76005097b0dRoopa Prabhu#define DRV_COPYRIGHT		"Copyright 2008-2011 Cisco Systems, Inc"
3701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
3827e6c7d33835e7f347cdfb5025766b7d9a6596d1Scott Feldman#define ENIC_BARS_MAX		6
3927e6c7d33835e7f347cdfb5025766b7d9a6596d1Scott Feldman
401cbb1a61d59b7552e1e3fde485d8af5699fe16e0Vasanthy Kolluri#define ENIC_WQ_MAX		1
4163da93d932af04cf80507b110afe894a8a8d1f90Neel Patel#define ENIC_RQ_MAX		8
426ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman#define ENIC_CQ_MAX		(ENIC_WQ_MAX + ENIC_RQ_MAX)
436ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman#define ENIC_INTR_MAX		(ENIC_CQ_MAX + 2)
446ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman
4501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanstruct enic_msix_entry {
4601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	int requested;
4701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	char devname[IFNAMSIZ];
4801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	irqreturn_t (*isr)(int, void *);
4901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	void *devid;
5001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman};
5101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
528749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu/* priv_flags */
538749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu#define ENIC_SRIOV_ENABLED		(1 << 0)
548749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu
558749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu/* enic port profile set flags */
564dce2396b329ef6a14b40c5416d6f76005097b0dRoopa Prabhu#define ENIC_PORT_REQUEST_APPLIED	(1 << 0)
5708f382ebb8a9efb898840aa74cf55148c7a98af6Scott Feldman#define ENIC_SET_REQUEST		(1 << 1)
5808f382ebb8a9efb898840aa74cf55148c7a98af6Scott Feldman#define ENIC_SET_NAME			(1 << 2)
5908f382ebb8a9efb898840aa74cf55148c7a98af6Scott Feldman#define ENIC_SET_INSTANCE		(1 << 3)
6008f382ebb8a9efb898840aa74cf55148c7a98af6Scott Feldman#define ENIC_SET_HOST			(1 << 4)
6108f382ebb8a9efb898840aa74cf55148c7a98af6Scott Feldman
62f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldmanstruct enic_port_profile {
6308f382ebb8a9efb898840aa74cf55148c7a98af6Scott Feldman	u32 set;
64f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldman	u8 request;
65f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldman	char name[PORT_PROFILE_MAX];
66f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldman	u8 instance_uuid[PORT_UUID_MAX];
67f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldman	u8 host_uuid[PORT_UUID_MAX];
680b1c00fc3e9f8d658e0632da7e7ee57bed779ec7Roopa Prabhu	u8 vf_mac[ETH_ALEN];
6929639059a0122d95b34b5475bd9fee3910b401a3Roopa Prabhu	u8 mac_addr[ETH_ALEN];
70f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldman};
71f8bd909183acffad68780b10c1cdf36161cfd5d1Scott Feldman
7201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman/* Per-instance private data structure */
7301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanstruct enic {
7401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	struct net_device *netdev;
7501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	struct pci_dev *pdev;
7601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	struct vnic_enet_config config;
7727e6c7d33835e7f347cdfb5025766b7d9a6596d1Scott Feldman	struct vnic_dev_bar bar[ENIC_BARS_MAX];
7801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	struct vnic_dev *vdev;
7901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	struct timer_list notify_timer;
8001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	struct work_struct reset;
81c97c894dc7bcae28d0308dbcd010185079de4a28Roopa Prabhu	struct work_struct change_mtu_work;
82717258ba4b3ecca9c7c0ef2b76d7aa5800242badVasanthy Kolluri	struct msix_entry msix_entry[ENIC_INTR_MAX];
83717258ba4b3ecca9c7c0ef2b76d7aa5800242badVasanthy Kolluri	struct enic_msix_entry msix[ENIC_INTR_MAX];
8401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	u32 msg_enable;
8501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	spinlock_t devcmd_lock;
8601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	u8 mac_addr[ETH_ALEN];
8701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	u8 mc_addr[ENIC_MULTICAST_PERFECT_FILTERS][ETH_ALEN];
88319d7e847355ec7e03d3c865917b2b0e2e592fb8Roopa Prabhu	u8 uc_addr[ENIC_UNICAST_PERFECT_FILTERS][ETH_ALEN];
899959a18556c73ebf2936b8df183ea7b41f38d933Scott Feldman	unsigned int flags;
908749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu	unsigned int priv_flags;
9101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int mc_count;
92319d7e847355ec7e03d3c865917b2b0e2e592fb8Roopa Prabhu	unsigned int uc_count;
9301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	u32 port_mtu;
947c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldman	u32 rx_coalesce_usecs;
957c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldman	u32 tx_coalesce_usecs;
968749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu#ifdef CONFIG_PCI_IOV
97413708bbaf5c85c4c8a264145f7d6c3afcd97f99Dan Carpenter	u16 num_vfs;
988749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhu#endif
993f192795cf1a0098df7bd655f7a72eee26bd63c3Roopa Prabhu	struct enic_port_profile *pp;
10001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
10101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	/* work queue cache line section */
1026ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman	____cacheline_aligned struct vnic_wq wq[ENIC_WQ_MAX];
1036ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman	spinlock_t wq_lock[ENIC_WQ_MAX];
10401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int wq_count;
1051825aca667196f75b193e2d509ea96ffdc8db0caVasanthy Kolluri	u16 loop_enable;
1061825aca667196f75b193e2d509ea96ffdc8db0caVasanthy Kolluri	u16 loop_tag;
10701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
10801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	/* receive queue cache line section */
1096ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman	____cacheline_aligned struct vnic_rq rq[ENIC_RQ_MAX];
11001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int rq_count;
111350991e12ac1ac407850169a0d65f522a7fd029eScott Feldman	u64 rq_truncated_pkts;
112bd9fb1a44a5c52a1c322ebacd08f6b7416a40a86Scott Feldman	u64 rq_bad_fcs;
113717258ba4b3ecca9c7c0ef2b76d7aa5800242badVasanthy Kolluri	struct napi_struct napi[ENIC_RQ_MAX];
11401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
11501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	/* interrupt resource cache line section */
1166ba9cdc09678d6925c205ef0b0bd374e31589ecfScott Feldman	____cacheline_aligned struct vnic_intr intr[ENIC_INTR_MAX];
11701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int intr_count;
11801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	u32 __iomem *legacy_pba;		/* memory-mapped */
11901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
12001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	/* completion queue cache line section */
12101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	____cacheline_aligned struct vnic_cq cq[ENIC_CQ_MAX];
12201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int cq_count;
12301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman};
12401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
125a7a79debcca02fbf908c0abed8d8fb25d0e51b48Vasanthy Kolluristatic inline struct device *enic_get_dev(struct enic *enic)
126a7a79debcca02fbf908c0abed8d8fb25d0e51b48Vasanthy Kolluri{
127a7a79debcca02fbf908c0abed8d8fb25d0e51b48Vasanthy Kolluri	return &(enic->pdev->dev);
128a7a79debcca02fbf908c0abed8d8fb25d0e51b48Vasanthy Kolluri}
129a7a79debcca02fbf908c0abed8d8fb25d0e51b48Vasanthy Kolluri
130b3abfbd2951102f5f5b8fe251a672e5223ac972bRoopa Prabhuvoid enic_reset_addr_lists(struct enic *enic);
1318749b427f213e14303dfef4c1b9770f05f67916dRoopa Prabhuint enic_sriov_enabled(struct enic *enic);
132889d13f53cf9d741398637b6e8e578c65bb792e8Roopa Prabhuint enic_is_valid_vf(struct enic *enic, int vf);
1333f192795cf1a0098df7bd655f7a72eee26bd63c3Roopa Prabhuint enic_is_dynamic(struct enic *enic);
134b3abfbd2951102f5f5b8fe251a672e5223ac972bRoopa Prabhu
13501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#endif /* _ENIC_H_ */
136