Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[cascardo/linux.git] / drivers / net / ethernet / qlogic / qed / qed_l2.h
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         bool check_mac;
106         bool check_ethtype;
107 };
108
109 int qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn,
110                            struct qed_sp_vport_start_params *p_params);
111
112 struct qed_rss_params {
113         u8      update_rss_config;
114         u8      rss_enable;
115         u8      rss_eng_id;
116         u8      update_rss_capabilities;
117         u8      update_rss_ind_table;
118         u8      update_rss_key;
119         u8      rss_caps;
120         u8      rss_table_size_log;
121         u16     rss_ind_table[QED_RSS_IND_TABLE_SIZE];
122         u32     rss_key[QED_RSS_KEY_SIZE];
123 };
124
125 struct qed_filter_accept_flags {
126         u8      update_rx_mode_config;
127         u8      update_tx_mode_config;
128         u8      rx_accept_filter;
129         u8      tx_accept_filter;
130 #define QED_ACCEPT_NONE         0x01
131 #define QED_ACCEPT_UCAST_MATCHED        0x02
132 #define QED_ACCEPT_UCAST_UNMATCHED      0x04
133 #define QED_ACCEPT_MCAST_MATCHED        0x08
134 #define QED_ACCEPT_MCAST_UNMATCHED      0x10
135 #define QED_ACCEPT_BCAST                0x20
136 };
137
138 struct qed_sp_vport_update_params {
139         u16                             opaque_fid;
140         u8                              vport_id;
141         u8                              update_vport_active_rx_flg;
142         u8                              vport_active_rx_flg;
143         u8                              update_vport_active_tx_flg;
144         u8                              vport_active_tx_flg;
145         u8                              update_inner_vlan_removal_flg;
146         u8                              inner_vlan_removal_flg;
147         u8                              silent_vlan_removal_flg;
148         u8                              update_default_vlan_enable_flg;
149         u8                              default_vlan_enable_flg;
150         u8                              update_default_vlan_flg;
151         u16                             default_vlan;
152         u8                              update_tx_switching_flg;
153         u8                              tx_switching_flg;
154         u8                              update_approx_mcast_flg;
155         u8                              update_anti_spoofing_en_flg;
156         u8                              anti_spoofing_en;
157         u8                              update_accept_any_vlan_flg;
158         u8                              accept_any_vlan;
159         unsigned long                   bins[8];
160         struct qed_rss_params           *rss_params;
161         struct qed_filter_accept_flags  accept_flags;
162         struct qed_sge_tpa_params       *sge_tpa_params;
163 };
164
165 int qed_sp_vport_update(struct qed_hwfn *p_hwfn,
166                         struct qed_sp_vport_update_params *p_params,
167                         enum spq_mode comp_mode,
168                         struct qed_spq_comp_cb *p_comp_data);
169
170 /**
171  * @brief qed_sp_vport_stop -
172  *
173  * This ramrod closes a VPort after all its RX and TX queues are terminated.
174  * An Assert is generated if any queues are left open.
175  *
176  * @param p_hwfn
177  * @param opaque_fid
178  * @param vport_id VPort ID
179  *
180  * @return int
181  */
182 int qed_sp_vport_stop(struct qed_hwfn *p_hwfn, u16 opaque_fid, u8 vport_id);
183
184 int qed_sp_eth_filter_ucast(struct qed_hwfn *p_hwfn,
185                             u16 opaque_fid,
186                             struct qed_filter_ucast *p_filter_cmd,
187                             enum spq_mode comp_mode,
188                             struct qed_spq_comp_cb *p_comp_data);
189
190 /**
191  * @brief qed_sp_rx_eth_queues_update -
192  *
193  * This ramrod updates an RX queue. It is used for setting the active state
194  * of the queue and updating the TPA and SGE parameters.
195  *
196  * @note At the moment - only used by non-linux VFs.
197  *
198  * @param p_hwfn
199  * @param rx_queue_id           RX Queue ID
200  * @param num_rxqs              Allow to update multiple rx
201  *                              queues, from rx_queue_id to
202  *                              (rx_queue_id + num_rxqs)
203  * @param complete_cqe_flg      Post completion to the CQE Ring if set
204  * @param complete_event_flg    Post completion to the Event Ring if set
205  *
206  * @return int
207  */
208
209 int
210 qed_sp_eth_rx_queues_update(struct qed_hwfn *p_hwfn,
211                             u16 rx_queue_id,
212                             u8 num_rxqs,
213                             u8 complete_cqe_flg,
214                             u8 complete_event_flg,
215                             enum spq_mode comp_mode,
216                             struct qed_spq_comp_cb *p_comp_data);
217
218 void qed_get_vport_stats(struct qed_dev *cdev, struct qed_eth_stats *stats);
219
220 int qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn,
221                            struct qed_sp_vport_start_params *p_params);
222
223 int qed_sp_eth_rxq_start_ramrod(struct qed_hwfn *p_hwfn,
224                                 u16 opaque_fid,
225                                 u32 cid,
226                                 struct qed_queue_start_common_params *params,
227                                 u8 stats_id,
228                                 u16 bd_max_bytes,
229                                 dma_addr_t bd_chain_phys_addr,
230                                 dma_addr_t cqe_pbl_addr,
231                                 u16 cqe_pbl_size, bool b_use_zone_a_prod);
232
233 int qed_sp_eth_txq_start_ramrod(struct qed_hwfn  *p_hwfn,
234                                 u16  opaque_fid,
235                                 u32  cid,
236                                 struct qed_queue_start_common_params *p_params,
237                                 u8  stats_id,
238                                 dma_addr_t pbl_addr,
239                                 u16 pbl_size,
240                                 union qed_qm_pq_params *p_pq_params);
241
242 u8 qed_mcast_bin_from_mac(u8 *mac);
243
244 #endif /* _QED_L2_H */