1 /* QLogic qed NIC Driver 2 * Copyright (c) 2015 QLogic Corporation 3 * 4 * This software is available under the terms of the GNU General Public License 5 * (GPL) Version 2, available from the file COPYING in the main directory of 6 * this source tree. 7 */ 8 #ifndef _QED_L2_H 9 #define _QED_L2_H 10 #include <linux/types.h> 11 #include <linux/io.h> 12 #include <linux/kernel.h> 13 #include <linux/slab.h> 14 #include <linux/qed/qed_eth_if.h> 15 #include "qed.h" 16 #include "qed_hw.h" 17 #include "qed_sp.h" 18 19 struct qed_sge_tpa_params { 20 u8 max_buffers_per_cqe; 21 22 u8 update_tpa_en_flg; 23 u8 tpa_ipv4_en_flg; 24 u8 tpa_ipv6_en_flg; 25 u8 tpa_ipv4_tunn_en_flg; 26 u8 tpa_ipv6_tunn_en_flg; 27 28 u8 update_tpa_param_flg; 29 u8 tpa_pkt_split_flg; 30 u8 tpa_hdr_data_split_flg; 31 u8 tpa_gro_consistent_flg; 32 u8 tpa_max_aggs_num; 33 u16 tpa_max_size; 34 u16 tpa_min_size_to_start; 35 u16 tpa_min_size_to_cont; 36 }; 37 38 enum qed_filter_opcode { 39 QED_FILTER_ADD, 40 QED_FILTER_REMOVE, 41 QED_FILTER_MOVE, 42 QED_FILTER_REPLACE, /* Delete all MACs and add new one instead */ 43 QED_FILTER_FLUSH, /* Removes all filters */ 44 }; 45 46 enum qed_filter_ucast_type { 47 QED_FILTER_MAC, 48 QED_FILTER_VLAN, 49 QED_FILTER_MAC_VLAN, 50 QED_FILTER_INNER_MAC, 51 QED_FILTER_INNER_VLAN, 52 QED_FILTER_INNER_PAIR, 53 QED_FILTER_INNER_MAC_VNI_PAIR, 54 QED_FILTER_MAC_VNI_PAIR, 55 QED_FILTER_VNI, 56 }; 57 58 struct qed_filter_ucast { 59 enum qed_filter_opcode opcode; 60 enum qed_filter_ucast_type type; 61 u8 is_rx_filter; 62 u8 is_tx_filter; 63 u8 vport_to_add_to; 64 u8 vport_to_remove_from; 65 unsigned char mac[ETH_ALEN]; 66 u8 assert_on_error; 67 u16 vlan; 68 u32 vni; 69 }; 70 71 struct qed_filter_mcast { 72 /* MOVE is not supported for multicast */ 73 enum qed_filter_opcode opcode; 74 u8 vport_to_add_to; 75 u8 vport_to_remove_from; 76 u8 num_mc_addrs; 77 #define QED_MAX_MC_ADDRS 64 78 unsigned char mac[QED_MAX_MC_ADDRS][ETH_ALEN]; 79 }; 80 81 int qed_sp_eth_rx_queue_stop(struct qed_hwfn *p_hwfn, 82 u16 rx_queue_id, 83 bool eq_completion_only, bool cqe_completion); 84 85 int qed_sp_eth_tx_queue_stop(struct qed_hwfn *p_hwfn, u16 tx_queue_id); 86 87 enum qed_tpa_mode { 88 QED_TPA_MODE_NONE, 89 QED_TPA_MODE_UNUSED, 90 QED_TPA_MODE_GRO, 91 QED_TPA_MODE_MAX 92 }; 93 94 struct qed_sp_vport_start_params { 95 enum qed_tpa_mode tpa_mode; 96 bool remove_inner_vlan; 97 bool tx_switching; 98 bool only_untagged; 99 bool drop_ttl0; 100 u8 max_buffers_per_cqe; 101 u32 concrete_fid; 102 u16 opaque_fid; 103 u8 vport_id; 104 u16 mtu; 105 }; 106 107 int qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn, 108 struct qed_sp_vport_start_params *p_params); 109 110 struct qed_rss_params { 111 u8 update_rss_config; 112 u8 rss_enable; 113 u8 rss_eng_id; 114 u8 update_rss_capabilities; 115 u8 update_rss_ind_table; 116 u8 update_rss_key; 117 u8 rss_caps; 118 u8 rss_table_size_log; 119 u16 rss_ind_table[QED_RSS_IND_TABLE_SIZE]; 120 u32 rss_key[QED_RSS_KEY_SIZE]; 121 }; 122 123 struct qed_filter_accept_flags { 124 u8 update_rx_mode_config; 125 u8 update_tx_mode_config; 126 u8 rx_accept_filter; 127 u8 tx_accept_filter; 128 #define QED_ACCEPT_NONE 0x01 129 #define QED_ACCEPT_UCAST_MATCHED 0x02 130 #define QED_ACCEPT_UCAST_UNMATCHED 0x04 131 #define QED_ACCEPT_MCAST_MATCHED 0x08 132 #define QED_ACCEPT_MCAST_UNMATCHED 0x10 133 #define QED_ACCEPT_BCAST 0x20 134 }; 135 136 struct qed_sp_vport_update_params { 137 u16 opaque_fid; 138 u8 vport_id; 139 u8 update_vport_active_rx_flg; 140 u8 vport_active_rx_flg; 141 u8 update_vport_active_tx_flg; 142 u8 vport_active_tx_flg; 143 u8 update_inner_vlan_removal_flg; 144 u8 inner_vlan_removal_flg; 145 u8 silent_vlan_removal_flg; 146 u8 update_default_vlan_enable_flg; 147 u8 default_vlan_enable_flg; 148 u8 update_default_vlan_flg; 149 u16 default_vlan; 150 u8 update_tx_switching_flg; 151 u8 tx_switching_flg; 152 u8 update_approx_mcast_flg; 153 u8 update_anti_spoofing_en_flg; 154 u8 anti_spoofing_en; 155 u8 update_accept_any_vlan_flg; 156 u8 accept_any_vlan; 157 unsigned long bins[8]; 158 struct qed_rss_params *rss_params; 159 struct qed_filter_accept_flags accept_flags; 160 struct qed_sge_tpa_params *sge_tpa_params; 161 }; 162 163 int qed_sp_vport_update(struct qed_hwfn *p_hwfn, 164 struct qed_sp_vport_update_params *p_params, 165 enum spq_mode comp_mode, 166 struct qed_spq_comp_cb *p_comp_data); 167 168 /** 169 * @brief qed_sp_vport_stop - 170 * 171 * This ramrod closes a VPort after all its RX and TX queues are terminated. 172 * An Assert is generated if any queues are left open. 173 * 174 * @param p_hwfn 175 * @param opaque_fid 176 * @param vport_id VPort ID 177 * 178 * @return int 179 */ 180 int qed_sp_vport_stop(struct qed_hwfn *p_hwfn, u16 opaque_fid, u8 vport_id); 181 182 int qed_sp_eth_filter_ucast(struct qed_hwfn *p_hwfn, 183 u16 opaque_fid, 184 struct qed_filter_ucast *p_filter_cmd, 185 enum spq_mode comp_mode, 186 struct qed_spq_comp_cb *p_comp_data); 187 188 /** 189 * @brief qed_sp_rx_eth_queues_update - 190 * 191 * This ramrod updates an RX queue. It is used for setting the active state 192 * of the queue and updating the TPA and SGE parameters. 193 * 194 * @note At the moment - only used by non-linux VFs. 195 * 196 * @param p_hwfn 197 * @param rx_queue_id RX Queue ID 198 * @param num_rxqs Allow to update multiple rx 199 * queues, from rx_queue_id to 200 * (rx_queue_id + num_rxqs) 201 * @param complete_cqe_flg Post completion to the CQE Ring if set 202 * @param complete_event_flg Post completion to the Event Ring if set 203 * 204 * @return int 205 */ 206 207 int 208 qed_sp_eth_rx_queues_update(struct qed_hwfn *p_hwfn, 209 u16 rx_queue_id, 210 u8 num_rxqs, 211 u8 complete_cqe_flg, 212 u8 complete_event_flg, 213 enum spq_mode comp_mode, 214 struct qed_spq_comp_cb *p_comp_data); 215 216 int qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn, 217 struct qed_sp_vport_start_params *p_params); 218 219 int qed_sp_eth_rxq_start_ramrod(struct qed_hwfn *p_hwfn, 220 u16 opaque_fid, 221 u32 cid, 222 struct qed_queue_start_common_params *params, 223 u8 stats_id, 224 u16 bd_max_bytes, 225 dma_addr_t bd_chain_phys_addr, 226 dma_addr_t cqe_pbl_addr, u16 cqe_pbl_size); 227 228 int qed_sp_eth_txq_start_ramrod(struct qed_hwfn *p_hwfn, 229 u16 opaque_fid, 230 u32 cid, 231 struct qed_queue_start_common_params *p_params, 232 u8 stats_id, 233 dma_addr_t pbl_addr, 234 u16 pbl_size, 235 union qed_qm_pq_params *p_pq_params); 236 237 u8 qed_mcast_bin_from_mac(u8 *mac); 238 239 #endif /* _QED_L2_H */ 240