ixlv.h revision 270631
138494Sobrien/******************************************************************************
2174294Sobrien
338494Sobrien  Copyright (c) 2013-2014, Intel Corporation
438494Sobrien  All rights reserved.
538494Sobrien
638494Sobrien  Redistribution and use in source and binary forms, with or without
738494Sobrien  modification, are permitted provided that the following conditions are met:
838494Sobrien
938494Sobrien   1. Redistributions of source code must retain the above copyright notice,
1038494Sobrien      this list of conditions and the following disclaimer.
1138494Sobrien
1238494Sobrien   2. Redistributions in binary form must reproduce the above copyright
1338494Sobrien      notice, this list of conditions and the following disclaimer in the
1438494Sobrien      documentation and/or other materials provided with the distribution.
1538494Sobrien
1638494Sobrien   3. Neither the name of the Intel Corporation nor the names of its
1738494Sobrien      contributors may be used to endorse or promote products derived from
1838494Sobrien      this software without specific prior written permission.
1938494Sobrien
2042629Sobrien  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2138494Sobrien  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2238494Sobrien  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2338494Sobrien  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2438494Sobrien  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2538494Sobrien  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2638494Sobrien  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2738494Sobrien  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2838494Sobrien  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2938494Sobrien  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3038494Sobrien  POSSIBILITY OF SUCH DAMAGE.
3138494Sobrien
3238494Sobrien******************************************************************************/
3338494Sobrien/*$FreeBSD: stable/10/sys/dev/ixl/ixlv.h 270631 2014-08-25 22:04:29Z jfv $*/
3438494Sobrien
3538494Sobrien
3638494Sobrien#ifndef _IXLV_H_
3738494Sobrien#define _IXLV_H_
3838494Sobrien
3938494Sobrien#define IXLV_AQ_MAX_ERR	100
40174294Sobrien#define IXLV_MAX_FILTERS	128
4138494Sobrien#define IXLV_MAX_QUEUES	16
4238494Sobrien#define IXLV_AQ_TIMEOUT	(1 * hz)
4338494Sobrien#define IXLV_CALLOUT_TIMO	(hz / 50)	// 20 msec
4438494Sobrien
4538494Sobrien#define IXLV_FLAG_AQ_ENABLE_QUEUES            (u32)(1)
4638494Sobrien#define IXLV_FLAG_AQ_DISABLE_QUEUES           (u32)(1 << 1)
4738494Sobrien#define IXLV_FLAG_AQ_ADD_MAC_FILTER           (u32)(1 << 2)
4838494Sobrien#define IXLV_FLAG_AQ_ADD_VLAN_FILTER          (u32)(1 << 3)
4938494Sobrien#define IXLV_FLAG_AQ_DEL_MAC_FILTER           (u32)(1 << 4)
5038494Sobrien#define IXLV_FLAG_AQ_DEL_VLAN_FILTER          (u32)(1 << 5)
5138494Sobrien#define IXLV_FLAG_AQ_CONFIGURE_QUEUES         (u32)(1 << 6)
5238494Sobrien#define IXLV_FLAG_AQ_MAP_VECTORS              (u32)(1 << 7)
5338494Sobrien#define IXLV_FLAG_AQ_HANDLE_RESET             (u32)(1 << 8)
5438494Sobrien#define IXLV_FLAG_AQ_CONFIGURE_PROMISC	(u32)(1 << 9)
5538494Sobrien#define IXLV_FLAG_AQ_GET_STATS		(u32)(1 << 10)
5638494Sobrien
5738494Sobrien/* printf %b arg */
5838494Sobrien#define IXLV_FLAGS \
5938494Sobrien    "\20\1ENABLE_QUEUES\2DISABLE_QUEUES\3ADD_MAC_FILTER" \
6038494Sobrien    "\4ADD_VLAN_FILTER\5DEL_MAC_FILTER\6DEL_VLAN_FILTER" \
6138494Sobrien    "\7CONFIGURE_QUEUES\10MAP_VECTORS\11HANDLE_RESET" \
6238494Sobrien    "\12CONFIGURE_PROMISC\13GET_STATS"
6338494Sobrien
6438494Sobrien/* Driver state */
6538494Sobrienenum ixlv_state_t {
6638494Sobrien	IXLV_START,
6738494Sobrien	IXLV_FAILED,
6838494Sobrien	IXLV_RESET_REQUIRED,
6938494Sobrien	IXLV_RESET_PENDING,
7038494Sobrien	IXLV_VERSION_CHECK,
7138494Sobrien	IXLV_GET_RESOURCES,
7238494Sobrien	IXLV_INIT_READY,
7338494Sobrien	IXLV_INIT_START,
7438494Sobrien	IXLV_INIT_CONFIG,
7538494Sobrien	IXLV_INIT_MAPPING,
7638494Sobrien	IXLV_INIT_ENABLE,
7738494Sobrien	IXLV_INIT_COMPLETE,
78174294Sobrien	IXLV_RUNNING,
7938494Sobrien};
80174294Sobrien
8138494Sobrienstruct ixlv_mac_filter {
8238494Sobrien	SLIST_ENTRY(ixlv_mac_filter)  next;
8338494Sobrien	u8      macaddr[ETHER_ADDR_LEN];
84174294Sobrien	u16     flags;
8538494Sobrien};
8638494SobrienSLIST_HEAD(mac_list, ixlv_mac_filter);
87174294Sobrien
88174294Sobrienstruct ixlv_vlan_filter {
89174294Sobrien	SLIST_ENTRY(ixlv_vlan_filter)  next;
9052894Sobrien	u16     vlan;
9138494Sobrien	u16     flags;
9238494Sobrien};
9338494SobrienSLIST_HEAD(vlan_list, ixlv_vlan_filter);
9438494Sobrien
9538494Sobrien/* Software controller structure */
9638494Sobrienstruct ixlv_sc {
9738494Sobrien	struct i40e_hw		hw;
98174294Sobrien	struct i40e_osdep	osdep;
9938494Sobrien	struct device		*dev;
100174294Sobrien
10138494Sobrien	struct resource		*pci_mem;
10238494Sobrien	struct resource		*msix_mem;
103174294Sobrien
10438494Sobrien	enum ixlv_state_t	init_state;
105174294Sobrien
10638494Sobrien	/*
10738494Sobrien	 * Interrupt resources
10838494Sobrien	 */
10938494Sobrien	void			*tag;
110174294Sobrien	struct resource 	*res; /* For the AQ */
111174294Sobrien
112131702Smbr	struct ifmedia		media;
11382794Sobrien	struct callout		timer;
11438494Sobrien	struct callout		aq_task;
115174294Sobrien	int			msix;
116174294Sobrien	int			if_flags;
117174294Sobrien
11838494Sobrien	struct mtx		mtx;
119174294Sobrien	struct mtx		aq_task_mtx;
120174294Sobrien
121174294Sobrien	u32			qbase;
12282794Sobrien	u32 			admvec;
12338494Sobrien	struct timeout_task	timeout;
12438494Sobrien	struct task     	aq_irq;
125174294Sobrien	struct task     	aq_sched;
12638494Sobrien	struct taskqueue	*tq;
12738494Sobrien
12838494Sobrien	struct ixl_vsi		vsi;
12938494Sobrien
13038494Sobrien	/* Mac Filter List */
13138494Sobrien	struct mac_list		*mac_filters;
13238494Sobrien
13382794Sobrien	/* Vlan Filter List */
13438494Sobrien	struct vlan_list	*vlan_filters;
135174294Sobrien
13638494Sobrien	/* Promiscuous mode */
137174294Sobrien	u32			promiscuous_flags;
13852894Sobrien
13938494Sobrien	/* Admin queue task flags */
140174294Sobrien	u32			aq_wait_count;
14138494Sobrien	u32			aq_required;
14238494Sobrien	u32			aq_pending;
14338494Sobrien
144174294Sobrien	/* Virtual comm channel */
14538494Sobrien	enum i40e_virtchnl_ops	current_op;
14638494Sobrien	struct i40e_virtchnl_vf_resource *vf_res;
14738494Sobrien	struct i40e_virtchnl_vsi_resource *vsi_res;
14838494Sobrien
14938494Sobrien	/* Misc stats maintained by the driver */
150174294Sobrien	u64			watchdog_events;
15138494Sobrien	u64			admin_irq;
15238494Sobrien
15338494Sobrien	/* Signaling channels */
15438494Sobrien	u8			init_done;
15538494Sobrien	u8			config_queues_done;
156174294Sobrien	u8			map_vectors_done;
157174294Sobrien	u8			enable_queues_done;
15838494Sobrien	u8			disable_queues_done;
15938494Sobrien	u8			add_ether_done;
160174294Sobrien	u8			del_ether_done;
16138494Sobrien};
162174294Sobrien
16338494Sobrien/*
16438494Sobrien** This checks for a zero mac addr, something that will be likely
16538494Sobrien** unless the Admin on the Host has created one.
166174294Sobrien*/
16738494Sobrienstatic inline bool
16838494Sobrienixlv_check_ether_addr(u8 *addr)
169174294Sobrien{
170174294Sobrien	bool status = TRUE;
171174294Sobrien
17238494Sobrien	if ((addr[0] == 0 && addr[1]== 0 && addr[2] == 0 &&
17352894Sobrien	    addr[3] == 0 && addr[4]== 0 && addr[5] == 0))
17438494Sobrien		status = FALSE;
17538494Sobrien	return (status);
17638494Sobrien}
17738494Sobrien
17838494Sobrien/*
17938494Sobrien** VF Common function prototypes
180174294Sobrien*/
18138494Sobrienint	ixlv_send_api_ver(struct ixlv_sc *);
182174294Sobrienint	ixlv_verify_api_ver(struct ixlv_sc *);
18338494Sobrienint	ixlv_send_vf_config_msg(struct ixlv_sc *);
18438494Sobrienint	ixlv_get_vf_config(struct ixlv_sc *);
185174294Sobrienvoid	ixlv_init(void *);
18638494Sobrienint	ixlv_reinit_locked(struct ixlv_sc *);
187174294Sobrienvoid	ixlv_configure_queues(struct ixlv_sc *);
18838494Sobrienvoid	ixlv_enable_queues(struct ixlv_sc *);
18938494Sobrienvoid	ixlv_disable_queues(struct ixlv_sc *);
19038494Sobrienvoid	ixlv_map_queues(struct ixlv_sc *);
19138494Sobrienvoid	ixlv_enable_intr(struct ixl_vsi *);
192174294Sobrienvoid	ixlv_disable_intr(struct ixl_vsi *);
193174294Sobrienvoid	ixlv_add_ether_filters(struct ixlv_sc *);
194131702Smbrvoid	ixlv_del_ether_filters(struct ixlv_sc *);
19582794Sobrienvoid	ixlv_request_stats(struct ixlv_sc *);
19638494Sobrienvoid	ixlv_request_reset(struct ixlv_sc *);
197174294Sobrienvoid	ixlv_vc_completion(struct ixlv_sc *,
198174294Sobrien	enum i40e_virtchnl_ops, i40e_status, u8 *, u16);
199174294Sobrienvoid	ixlv_add_ether_filter(struct ixlv_sc *);
20038494Sobrienvoid	ixlv_add_vlans(struct ixlv_sc *);
201174294Sobrienvoid	ixlv_del_vlans(struct ixlv_sc *);
202174294Sobrienvoid	ixlv_update_stats_counters(struct ixlv_sc *,
203174294Sobrien		    struct i40e_eth_stats *);
20482794Sobrien
20538494Sobrien#endif /* _IXLV_H_ */
20638494Sobrien