Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * QLogic qlcnic NIC Driver
0004  * Copyright (c) 2009-2013 QLogic Corporation
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     /* Lock for manipulating list */
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     /* It synchronizes commands sent from VF */
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; /* Lock for VLAN list */
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; /* async_cmd_list 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