0001
0002
0003
0004
0005
0006
0007 #ifndef _QLCNIC_83XX_SRIOV_H_
0008 #define _QLCNIC_83XX_SRIOV_H_
0009
0010 #include <linux/types.h>
0011 #include <linux/pci.h>
0012
0013 #include "qlcnic.h"
0014
0015 extern const u32 qlcnic_83xx_reg_tbl[];
0016 extern const u32 qlcnic_83xx_ext_reg_tbl[];
0017
0018 struct qlcnic_bc_payload {
0019 u64 payload[126];
0020 };
0021
0022 struct qlcnic_bc_hdr {
0023 #if defined(__LITTLE_ENDIAN)
0024 u8 version;
0025 u8 msg_type:4;
0026 u8 rsvd1:3;
0027 u8 op_type:1;
0028 u8 num_cmds;
0029 u8 num_frags;
0030 u8 frag_num;
0031 u8 cmd_op;
0032 u16 seq_id;
0033 u64 rsvd3;
0034 #elif defined(__BIG_ENDIAN)
0035 u8 num_frags;
0036 u8 num_cmds;
0037 u8 op_type:1;
0038 u8 rsvd1:3;
0039 u8 msg_type:4;
0040 u8 version;
0041 u16 seq_id;
0042 u8 cmd_op;
0043 u8 frag_num;
0044 u64 rsvd3;
0045 #endif
0046 };
0047
0048 enum qlcnic_bc_commands {
0049 QLCNIC_BC_CMD_CHANNEL_INIT = 0x0,
0050 QLCNIC_BC_CMD_CHANNEL_TERM = 0x1,
0051 QLCNIC_BC_CMD_GET_ACL = 0x2,
0052 QLCNIC_BC_CMD_CFG_GUEST_VLAN = 0x3,
0053 };
0054
0055 #define QLCNIC_83XX_SRIOV_VF_MAX_MAC 2
0056 #define QLC_BC_CMD 1
0057
0058 struct qlcnic_trans_list {
0059
0060 spinlock_t lock;
0061 struct list_head wait_list;
0062 int count;
0063 };
0064
0065 enum qlcnic_trans_state {
0066 QLC_INIT = 0,
0067 QLC_WAIT_FOR_CHANNEL_FREE,
0068 QLC_WAIT_FOR_RESP,
0069 QLC_ABORT,
0070 QLC_END,
0071 };
0072
0073 struct qlcnic_bc_trans {
0074 u8 func_id;
0075 u8 active;
0076 u8 curr_rsp_frag;
0077 u8 curr_req_frag;
0078 u16 cmd_id;
0079 u16 req_pay_size;
0080 u16 rsp_pay_size;
0081 u32 trans_id;
0082 enum qlcnic_trans_state trans_state;
0083 struct list_head list;
0084 struct qlcnic_bc_hdr *req_hdr;
0085 struct qlcnic_bc_hdr *rsp_hdr;
0086 struct qlcnic_bc_payload *req_pay;
0087 struct qlcnic_bc_payload *rsp_pay;
0088 struct completion resp_cmpl;
0089 struct qlcnic_vf_info *vf;
0090 };
0091
0092 enum qlcnic_vf_state {
0093 QLC_BC_VF_SEND = 0,
0094 QLC_BC_VF_RECV,
0095 QLC_BC_VF_CHANNEL,
0096 QLC_BC_VF_STATE,
0097 QLC_BC_VF_FLR,
0098 QLC_BC_VF_SOFT_FLR,
0099 };
0100
0101 enum qlcnic_vlan_mode {
0102 QLC_NO_VLAN_MODE = 0,
0103 QLC_PVID_MODE,
0104 QLC_GUEST_VLAN_MODE,
0105 };
0106
0107 struct qlcnic_resources {
0108 u16 num_tx_mac_filters;
0109 u16 num_rx_ucast_mac_filters;
0110 u16 num_rx_mcast_mac_filters;
0111
0112 u16 num_txvlan_keys;
0113
0114 u16 num_rx_queues;
0115 u16 num_tx_queues;
0116
0117 u16 num_rx_buf_rings;
0118 u16 num_rx_status_rings;
0119
0120 u16 num_destip;
0121 u32 num_lro_flows_supported;
0122 u16 max_local_ipv6_addrs;
0123 u16 max_remote_ipv6_addrs;
0124 };
0125
0126 struct qlcnic_vport {
0127 u16 handle;
0128 u16 max_tx_bw;
0129 u16 min_tx_bw;
0130 u16 pvid;
0131 u8 vlan_mode;
0132 u8 qos;
0133 bool spoofchk;
0134 u8 mac[6];
0135 };
0136
0137 struct qlcnic_vf_info {
0138 u8 pci_func;
0139 u16 rx_ctx_id;
0140 u16 tx_ctx_id;
0141 u16 *sriov_vlans;
0142 int num_vlan;
0143 unsigned long state;
0144 struct completion ch_free_cmpl;
0145 struct work_struct trans_work;
0146 struct work_struct flr_work;
0147
0148 struct mutex send_cmd_lock;
0149 struct qlcnic_bc_trans *send_cmd;
0150 struct qlcnic_bc_trans *flr_trans;
0151 struct qlcnic_trans_list rcv_act;
0152 struct qlcnic_trans_list rcv_pend;
0153 struct qlcnic_adapter *adapter;
0154 struct qlcnic_vport *vp;
0155 spinlock_t vlan_list_lock;
0156 };
0157
0158 struct qlcnic_async_cmd {
0159 struct list_head list;
0160 struct qlcnic_cmd_args *cmd;
0161 };
0162
0163 struct qlcnic_back_channel {
0164 u16 trans_counter;
0165 struct workqueue_struct *bc_trans_wq;
0166 struct workqueue_struct *bc_async_wq;
0167 struct workqueue_struct *bc_flr_wq;
0168 struct qlcnic_adapter *adapter;
0169 struct list_head async_cmd_list;
0170 struct work_struct vf_async_work;
0171 spinlock_t queue_lock;
0172 };
0173
0174 struct qlcnic_sriov {
0175 u16 vp_handle;
0176 u8 num_vfs;
0177 u8 any_vlan;
0178 u8 vlan_mode;
0179 u16 num_allowed_vlans;
0180 u16 *allowed_vlans;
0181 u16 vlan;
0182 struct qlcnic_resources ff_max;
0183 struct qlcnic_back_channel bc;
0184 struct qlcnic_vf_info *vf_info;
0185 };
0186
0187 int qlcnic_sriov_init(struct qlcnic_adapter *, int);
0188 void qlcnic_sriov_cleanup(struct qlcnic_adapter *);
0189 void __qlcnic_sriov_cleanup(struct qlcnic_adapter *);
0190 void qlcnic_sriov_vf_register_map(struct qlcnic_hardware_context *);
0191 int qlcnic_sriov_vf_init(struct qlcnic_adapter *);
0192 void qlcnic_sriov_vf_set_ops(struct qlcnic_adapter *);
0193 int qlcnic_sriov_func_to_index(struct qlcnic_adapter *, u8);
0194 void qlcnic_sriov_handle_bc_event(struct qlcnic_adapter *, u32);
0195 int qlcnic_sriov_cfg_bc_intr(struct qlcnic_adapter *, u8);
0196 void qlcnic_sriov_cleanup_async_list(struct qlcnic_back_channel *);
0197 void qlcnic_sriov_cleanup_list(struct qlcnic_trans_list *);
0198 int __qlcnic_sriov_add_act_list(struct qlcnic_sriov *, struct qlcnic_vf_info *,
0199 struct qlcnic_bc_trans *);
0200 int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *,
0201 struct qlcnic_info *, u16);
0202 int qlcnic_sriov_cfg_vf_guest_vlan(struct qlcnic_adapter *, u16, u8);
0203 void qlcnic_sriov_free_vlans(struct qlcnic_adapter *);
0204 int qlcnic_sriov_alloc_vlans(struct qlcnic_adapter *);
0205 bool qlcnic_sriov_check_any_vlan(struct qlcnic_vf_info *);
0206 void qlcnic_sriov_del_vlan_id(struct qlcnic_sriov *,
0207 struct qlcnic_vf_info *, u16);
0208 void qlcnic_sriov_add_vlan_id(struct qlcnic_sriov *,
0209 struct qlcnic_vf_info *, u16);
0210
0211 static inline bool qlcnic_sriov_enable_check(struct qlcnic_adapter *adapter)
0212 {
0213 return test_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state) ? true : false;
0214 }
0215
0216 #ifdef CONFIG_QLCNIC_SRIOV
0217 void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter *,
0218 struct qlcnic_bc_trans *,
0219 struct qlcnic_cmd_args *);
0220 void qlcnic_sriov_pf_disable(struct qlcnic_adapter *);
0221 void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *);
0222 int qlcnic_pci_sriov_configure(struct pci_dev *, int);
0223 void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *, u32 *);
0224 void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *, u32 *);
0225 void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *, u32 *);
0226 void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *, u32 *);
0227 void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *, u32 *);
0228 void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *, u32 *);
0229 void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *, u32 *);
0230 void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *, struct qlcnic_vf_info *);
0231 bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter *,
0232 struct qlcnic_bc_trans *,
0233 struct qlcnic_vf_info *);
0234 void qlcnic_sriov_pf_reset(struct qlcnic_adapter *);
0235 int qlcnic_sriov_pf_reinit(struct qlcnic_adapter *);
0236 int qlcnic_sriov_set_vf_mac(struct net_device *, int, u8 *);
0237 int qlcnic_sriov_set_vf_tx_rate(struct net_device *, int, int, int);
0238 int qlcnic_sriov_get_vf_config(struct net_device *, int ,
0239 struct ifla_vf_info *);
0240 int qlcnic_sriov_set_vf_vlan(struct net_device *, int, u16, u8, __be16);
0241 int qlcnic_sriov_set_vf_spoofchk(struct net_device *, int, bool);
0242 #else
0243 static inline void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter) {}
0244 static inline void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter) {}
0245 static inline void
0246 qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *adapter,
0247 u32 *int_id) {}
0248 static inline void
0249 qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *adapter,
0250 u32 *int_id) {}
0251 static inline void
0252 qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *adapter,
0253 u32 *int_id) {}
0254 static inline void
0255 qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *adapter,
0256 u32 *int_id) {}
0257 static inline void
0258 qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *adapter, u32 *int_id)
0259 {}
0260 static inline void
0261 qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *adapter, u32 *int_id)
0262 {}
0263 static inline void
0264 qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *adapter, u32 *int_id)
0265 {}
0266 static inline void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
0267 struct qlcnic_vf_info *vf) {}
0268 static inline bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter *adapter,
0269 struct qlcnic_bc_trans *trans,
0270 struct qlcnic_vf_info *vf)
0271 { return false; }
0272 static inline void qlcnic_sriov_pf_reset(struct qlcnic_adapter *adapter) {}
0273 static inline int qlcnic_sriov_pf_reinit(struct qlcnic_adapter *adapter)
0274 { return 0; }
0275 #endif
0276
0277 #endif