2 * QLogic qlcnic NIC Driver
3 * Copyright (c) 2009-2013 QLogic Corporation
5 * See LICENSE.qlcnic for copyright and licensing details.
8 #ifndef _QLCNIC_83XX_SRIOV_H_
9 #define _QLCNIC_83XX_SRIOV_H_
12 #include <linux/types.h>
13 #include <linux/pci.h>
15 extern const u32 qlcnic_83xx_reg_tbl
[];
16 extern const u32 qlcnic_83xx_ext_reg_tbl
[];
18 struct qlcnic_bc_payload
{
22 struct qlcnic_bc_hdr
{
23 #if defined(__LITTLE_ENDIAN)
34 #elif defined(__BIG_ENDIAN)
48 enum qlcnic_bc_commands
{
49 QLCNIC_BC_CMD_CHANNEL_INIT
= 0x0,
50 QLCNIC_BC_CMD_CHANNEL_TERM
= 0x1,
55 struct qlcnic_trans_list
{
56 /* Lock for manipulating list */
58 struct list_head wait_list
;
62 enum qlcnic_trans_state
{
64 QLC_WAIT_FOR_CHANNEL_FREE
,
70 struct qlcnic_bc_trans
{
79 enum qlcnic_trans_state trans_state
;
80 struct list_head list
;
81 struct qlcnic_bc_hdr
*req_hdr
;
82 struct qlcnic_bc_hdr
*rsp_hdr
;
83 struct qlcnic_bc_payload
*req_pay
;
84 struct qlcnic_bc_payload
*rsp_pay
;
85 struct completion resp_cmpl
;
86 struct qlcnic_vf_info
*vf
;
89 enum qlcnic_vf_state
{
96 struct qlcnic_resources
{
97 u16 num_tx_mac_filters
;
98 u16 num_rx_ucast_mac_filters
;
99 u16 num_rx_mcast_mac_filters
;
106 u16 num_rx_buf_rings
;
107 u16 num_rx_status_rings
;
110 u32 num_lro_flows_supported
;
111 u16 max_local_ipv6_addrs
;
112 u16 max_remote_ipv6_addrs
;
115 struct qlcnic_vport
{
120 struct qlcnic_vf_info
{
125 struct completion ch_free_cmpl
;
126 struct work_struct trans_work
;
127 /* It synchronizes commands sent from VF */
128 struct mutex send_cmd_lock
;
129 struct qlcnic_bc_trans
*send_cmd
;
130 struct qlcnic_trans_list rcv_act
;
131 struct qlcnic_trans_list rcv_pend
;
132 struct qlcnic_adapter
*adapter
;
133 struct qlcnic_vport
*vp
;
136 struct qlcnic_back_channel
{
138 struct workqueue_struct
*bc_trans_wq
;
141 struct qlcnic_sriov
{
144 struct qlcnic_resources ff_max
;
145 struct qlcnic_back_channel bc
;
146 struct qlcnic_vf_info
*vf_info
;
149 int qlcnic_sriov_init(struct qlcnic_adapter
*, int);
150 void qlcnic_sriov_cleanup(struct qlcnic_adapter
*);
151 void __qlcnic_sriov_cleanup(struct qlcnic_adapter
*);
152 void qlcnic_sriov_vf_register_map(struct qlcnic_hardware_context
*);
153 int qlcnic_sriov_vf_init(struct qlcnic_adapter
*, int);
154 void qlcnic_sriov_vf_set_ops(struct qlcnic_adapter
*);
155 int qlcnic_sriov_func_to_index(struct qlcnic_adapter
*, u8
);
156 int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter
*, u8
);
157 void qlcnic_sriov_handle_bc_event(struct qlcnic_adapter
*, u32
);
158 int qlcnic_sriov_cfg_bc_intr(struct qlcnic_adapter
*, u8
);
160 static inline bool qlcnic_sriov_enable_check(struct qlcnic_adapter
*adapter
)
162 return test_bit(__QLCNIC_SRIOV_ENABLE
, &adapter
->state
) ? true : false;
165 #ifdef CONFIG_QLCNIC_SRIOV
166 void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter
*,
167 struct qlcnic_bc_trans
*,
168 struct qlcnic_cmd_args
*);
169 void qlcnic_sriov_pf_disable(struct qlcnic_adapter
*);
170 void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter
*);
171 int qlcnic_pci_sriov_configure(struct pci_dev
*, int);
172 void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter
*, u32
*);
173 void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter
*, u32
*);
174 void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter
*, u32
*);
175 void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter
*, u32
*);
176 void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter
*, u32
*);
177 void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter
*, u32
*);
178 void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter
*, u32
*);
180 static inline void qlcnic_sriov_pf_disable(struct qlcnic_adapter
*adapter
) {}
181 static inline void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter
*adapter
) {}
183 qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter
*adapter
,
186 qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter
*adapter
,
189 qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter
*adapter
,
192 qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter
*adapter
,
195 qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter
*adapter
, u32
*int_id
)
198 qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter
*adapter
, u32
*int_id
)
201 qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter
*adapter
, u32
*int_id
)