Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / net / ethernet / brocade / bna / bna_tx_rx.c
1 /*
2  * Linux network driver for QLogic BR-series Converged Network Adapter.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License (GPL) Version 2 as
6  * published by the Free Software Foundation
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12   */
13 /*
14  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
15  * Copyright (c) 2014-2015 QLogic Corporation
16  * All rights reserved
17  * www.qlogic.com
18  */
19 #include "bna.h"
20 #include "bfi.h"
21
22 /* IB */
23 static void
24 bna_ib_coalescing_timeo_set(struct bna_ib *ib, u8 coalescing_timeo)
25 {
26         ib->coalescing_timeo = coalescing_timeo;
27         ib->door_bell.doorbell_ack = BNA_DOORBELL_IB_INT_ACK(
28                                 (u32)ib->coalescing_timeo, 0);
29 }
30
31 /* RXF */
32
33 #define bna_rxf_vlan_cfg_soft_reset(rxf)                                \
34 do {                                                                    \
35         (rxf)->vlan_pending_bitmask = (u8)BFI_VLAN_BMASK_ALL;           \
36         (rxf)->vlan_strip_pending = true;                               \
37 } while (0)
38
39 #define bna_rxf_rss_cfg_soft_reset(rxf)                                 \
40 do {                                                                    \
41         if ((rxf)->rss_status == BNA_STATUS_T_ENABLED)                  \
42                 (rxf)->rss_pending = (BNA_RSS_F_RIT_PENDING |           \
43                                 BNA_RSS_F_CFG_PENDING |                 \
44                                 BNA_RSS_F_STATUS_PENDING);              \
45 } while (0)
46
47 static int bna_rxf_cfg_apply(struct bna_rxf *rxf);
48 static void bna_rxf_cfg_reset(struct bna_rxf *rxf);
49 static int bna_rxf_fltr_clear(struct bna_rxf *rxf);
50 static int bna_rxf_ucast_cfg_apply(struct bna_rxf *rxf);
51 static int bna_rxf_promisc_cfg_apply(struct bna_rxf *rxf);
52 static int bna_rxf_allmulti_cfg_apply(struct bna_rxf *rxf);
53 static int bna_rxf_vlan_strip_cfg_apply(struct bna_rxf *rxf);
54 static int bna_rxf_ucast_cfg_reset(struct bna_rxf *rxf,
55                                         enum bna_cleanup_type cleanup);
56 static int bna_rxf_promisc_cfg_reset(struct bna_rxf *rxf,
57                                         enum bna_cleanup_type cleanup);
58 static int bna_rxf_allmulti_cfg_reset(struct bna_rxf *rxf,
59                                         enum bna_cleanup_type cleanup);
60
61 bfa_fsm_state_decl(bna_rxf, stopped, struct bna_rxf,
62                         enum bna_rxf_event);
63 bfa_fsm_state_decl(bna_rxf, paused, struct bna_rxf,
64                         enum bna_rxf_event);
65 bfa_fsm_state_decl(bna_rxf, cfg_wait, struct bna_rxf,
66                         enum bna_rxf_event);
67 bfa_fsm_state_decl(bna_rxf, started, struct bna_rxf,
68                         enum bna_rxf_event);
69 bfa_fsm_state_decl(bna_rxf, fltr_clr_wait, struct bna_rxf,
70                         enum bna_rxf_event);
71 bfa_fsm_state_decl(bna_rxf, last_resp_wait, struct bna_rxf,
72                         enum bna_rxf_event);
73
74 static void
75 bna_rxf_sm_stopped_entry(struct bna_rxf *rxf)
76 {
77         call_rxf_stop_cbfn(rxf);
78 }
79
80 static void
81 bna_rxf_sm_stopped(struct bna_rxf *rxf, enum bna_rxf_event event)
82 {
83         switch (event) {
84         case RXF_E_START:
85                 if (rxf->flags & BNA_RXF_F_PAUSED) {
86                         bfa_fsm_set_state(rxf, bna_rxf_sm_paused);
87                         call_rxf_start_cbfn(rxf);
88                 } else
89                         bfa_fsm_set_state(rxf, bna_rxf_sm_cfg_wait);
90                 break;
91
92         case RXF_E_STOP:
93                 call_rxf_stop_cbfn(rxf);
94                 break;
95
96         case RXF_E_FAIL:
97                 /* No-op */
98                 break;
99
100         case RXF_E_CONFIG:
101                 call_rxf_cam_fltr_cbfn(rxf);
102                 break;
103
104         case RXF_E_PAUSE:
105                 rxf->flags |= BNA_RXF_F_PAUSED;
106                 call_rxf_pause_cbfn(rxf);
107                 break;
108
109         case RXF_E_RESUME:
110                 rxf->flags &= ~BNA_RXF_F_PAUSED;
111                 call_rxf_resume_cbfn(rxf);
112                 break;
113
114         default:
115                 bfa_sm_fault(event);
116         }
117 }
118
119 static void
120 bna_rxf_sm_paused_entry(struct bna_rxf *rxf)
121 {
122         call_rxf_pause_cbfn(rxf);
123 }
124
125 static void
126 bna_rxf_sm_paused(struct bna_rxf *rxf, enum bna_rxf_event event)
127 {
128         switch (event) {
129         case RXF_E_STOP:
130         case RXF_E_FAIL:
131                 bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
132                 break;
133
134         case RXF_E_CONFIG:
135                 call_rxf_cam_fltr_cbfn(rxf);
136                 break;
137
138         case RXF_E_RESUME:
139                 rxf->flags &= ~BNA_RXF_F_PAUSED;
140                 bfa_fsm_set_state(rxf, bna_rxf_sm_cfg_wait);
141                 break;
142
143         default:
144                 bfa_sm_fault(event);
145         }
146 }
147
148 static void
149 bna_rxf_sm_cfg_wait_entry(struct bna_rxf *rxf)
150 {
151         if (!bna_rxf_cfg_apply(rxf)) {
152                 /* No more pending config updates */
153                 bfa_fsm_set_state(rxf, bna_rxf_sm_started);
154         }
155 }
156
157 static void
158 bna_rxf_sm_cfg_wait(struct bna_rxf *rxf, enum bna_rxf_event event)
159 {
160         switch (event) {
161         case RXF_E_STOP:
162                 bfa_fsm_set_state(rxf, bna_rxf_sm_last_resp_wait);
163                 break;
164
165         case RXF_E_FAIL:
166                 bna_rxf_cfg_reset(rxf);
167                 call_rxf_start_cbfn(rxf);
168                 call_rxf_cam_fltr_cbfn(rxf);
169                 call_rxf_resume_cbfn(rxf);
170                 bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
171                 break;
172
173         case RXF_E_CONFIG:
174                 /* No-op */
175                 break;
176
177         case RXF_E_PAUSE:
178                 rxf->flags |= BNA_RXF_F_PAUSED;
179                 call_rxf_start_cbfn(rxf);
180                 bfa_fsm_set_state(rxf, bna_rxf_sm_fltr_clr_wait);
181                 break;
182
183         case RXF_E_FW_RESP:
184                 if (!bna_rxf_cfg_apply(rxf)) {
185                         /* No more pending config updates */
186                         bfa_fsm_set_state(rxf, bna_rxf_sm_started);
187                 }
188                 break;
189
190         default:
191                 bfa_sm_fault(event);
192         }
193 }
194
195 static void
196 bna_rxf_sm_started_entry(struct bna_rxf *rxf)
197 {
198         call_rxf_start_cbfn(rxf);
199         call_rxf_cam_fltr_cbfn(rxf);
200         call_rxf_resume_cbfn(rxf);
201 }
202
203 static void
204 bna_rxf_sm_started(struct bna_rxf *rxf, enum bna_rxf_event event)
205 {
206         switch (event) {
207         case RXF_E_STOP:
208         case RXF_E_FAIL:
209                 bna_rxf_cfg_reset(rxf);
210                 bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
211                 break;
212
213         case RXF_E_CONFIG:
214                 bfa_fsm_set_state(rxf, bna_rxf_sm_cfg_wait);
215                 break;
216
217         case RXF_E_PAUSE:
218                 rxf->flags |= BNA_RXF_F_PAUSED;
219                 if (!bna_rxf_fltr_clear(rxf))
220                         bfa_fsm_set_state(rxf, bna_rxf_sm_paused);
221                 else
222                         bfa_fsm_set_state(rxf, bna_rxf_sm_fltr_clr_wait);
223                 break;
224
225         default:
226                 bfa_sm_fault(event);
227         }
228 }
229
230 static void
231 bna_rxf_sm_fltr_clr_wait_entry(struct bna_rxf *rxf)
232 {
233 }
234
235 static void
236 bna_rxf_sm_fltr_clr_wait(struct bna_rxf *rxf, enum bna_rxf_event event)
237 {
238         switch (event) {
239         case RXF_E_FAIL:
240                 bna_rxf_cfg_reset(rxf);
241                 call_rxf_pause_cbfn(rxf);
242                 bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
243                 break;
244
245         case RXF_E_FW_RESP:
246                 if (!bna_rxf_fltr_clear(rxf)) {
247                         /* No more pending CAM entries to clear */
248                         bfa_fsm_set_state(rxf, bna_rxf_sm_paused);
249                 }
250                 break;
251
252         default:
253                 bfa_sm_fault(event);
254         }
255 }
256
257 static void
258 bna_rxf_sm_last_resp_wait_entry(struct bna_rxf *rxf)
259 {
260 }
261
262 static void
263 bna_rxf_sm_last_resp_wait(struct bna_rxf *rxf, enum bna_rxf_event event)
264 {
265         switch (event) {
266         case RXF_E_FAIL:
267         case RXF_E_FW_RESP:
268                 bna_rxf_cfg_reset(rxf);
269                 bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
270                 break;
271
272         default:
273                 bfa_sm_fault(event);
274         }
275 }
276
277 static void
278 bna_bfi_ucast_req(struct bna_rxf *rxf, struct bna_mac *mac,
279                 enum bfi_enet_h2i_msgs req_type)
280 {
281         struct bfi_enet_ucast_req *req = &rxf->bfi_enet_cmd.ucast_req;
282
283         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET, req_type, 0, rxf->rx->rid);
284         req->mh.num_entries = htons(
285         bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_ucast_req)));
286         memcpy(&req->mac_addr, &mac->addr, sizeof(mac_t));
287         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
288                 sizeof(struct bfi_enet_ucast_req), &req->mh);
289         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
290 }
291
292 static void
293 bna_bfi_mcast_add_req(struct bna_rxf *rxf, struct bna_mac *mac)
294 {
295         struct bfi_enet_mcast_add_req *req =
296                 &rxf->bfi_enet_cmd.mcast_add_req;
297
298         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET, BFI_ENET_H2I_MAC_MCAST_ADD_REQ,
299                 0, rxf->rx->rid);
300         req->mh.num_entries = htons(
301         bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_mcast_add_req)));
302         memcpy(&req->mac_addr, &mac->addr, sizeof(mac_t));
303         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
304                 sizeof(struct bfi_enet_mcast_add_req), &req->mh);
305         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
306 }
307
308 static void
309 bna_bfi_mcast_del_req(struct bna_rxf *rxf, u16 handle)
310 {
311         struct bfi_enet_mcast_del_req *req =
312                 &rxf->bfi_enet_cmd.mcast_del_req;
313
314         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET, BFI_ENET_H2I_MAC_MCAST_DEL_REQ,
315                 0, rxf->rx->rid);
316         req->mh.num_entries = htons(
317         bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_mcast_del_req)));
318         req->handle = htons(handle);
319         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
320                 sizeof(struct bfi_enet_mcast_del_req), &req->mh);
321         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
322 }
323
324 static void
325 bna_bfi_mcast_filter_req(struct bna_rxf *rxf, enum bna_status status)
326 {
327         struct bfi_enet_enable_req *req = &rxf->bfi_enet_cmd.req;
328
329         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
330                 BFI_ENET_H2I_MAC_MCAST_FILTER_REQ, 0, rxf->rx->rid);
331         req->mh.num_entries = htons(
332                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_enable_req)));
333         req->enable = status;
334         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
335                 sizeof(struct bfi_enet_enable_req), &req->mh);
336         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
337 }
338
339 static void
340 bna_bfi_rx_promisc_req(struct bna_rxf *rxf, enum bna_status status)
341 {
342         struct bfi_enet_enable_req *req = &rxf->bfi_enet_cmd.req;
343
344         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
345                 BFI_ENET_H2I_RX_PROMISCUOUS_REQ, 0, rxf->rx->rid);
346         req->mh.num_entries = htons(
347                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_enable_req)));
348         req->enable = status;
349         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
350                 sizeof(struct bfi_enet_enable_req), &req->mh);
351         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
352 }
353
354 static void
355 bna_bfi_rx_vlan_filter_set(struct bna_rxf *rxf, u8 block_idx)
356 {
357         struct bfi_enet_rx_vlan_req *req = &rxf->bfi_enet_cmd.vlan_req;
358         int i;
359         int j;
360
361         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
362                 BFI_ENET_H2I_RX_VLAN_SET_REQ, 0, rxf->rx->rid);
363         req->mh.num_entries = htons(
364                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_rx_vlan_req)));
365         req->block_idx = block_idx;
366         for (i = 0; i < (BFI_ENET_VLAN_BLOCK_SIZE / 32); i++) {
367                 j = (block_idx * (BFI_ENET_VLAN_BLOCK_SIZE / 32)) + i;
368                 if (rxf->vlan_filter_status == BNA_STATUS_T_ENABLED)
369                         req->bit_mask[i] =
370                                 htonl(rxf->vlan_filter_table[j]);
371                 else
372                         req->bit_mask[i] = 0xFFFFFFFF;
373         }
374         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
375                 sizeof(struct bfi_enet_rx_vlan_req), &req->mh);
376         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
377 }
378
379 static void
380 bna_bfi_vlan_strip_enable(struct bna_rxf *rxf)
381 {
382         struct bfi_enet_enable_req *req = &rxf->bfi_enet_cmd.req;
383
384         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
385                 BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ, 0, rxf->rx->rid);
386         req->mh.num_entries = htons(
387                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_enable_req)));
388         req->enable = rxf->vlan_strip_status;
389         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
390                 sizeof(struct bfi_enet_enable_req), &req->mh);
391         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
392 }
393
394 static void
395 bna_bfi_rit_cfg(struct bna_rxf *rxf)
396 {
397         struct bfi_enet_rit_req *req = &rxf->bfi_enet_cmd.rit_req;
398
399         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
400                 BFI_ENET_H2I_RIT_CFG_REQ, 0, rxf->rx->rid);
401         req->mh.num_entries = htons(
402                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_rit_req)));
403         req->size = htons(rxf->rit_size);
404         memcpy(&req->table[0], rxf->rit, rxf->rit_size);
405         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
406                 sizeof(struct bfi_enet_rit_req), &req->mh);
407         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
408 }
409
410 static void
411 bna_bfi_rss_cfg(struct bna_rxf *rxf)
412 {
413         struct bfi_enet_rss_cfg_req *req = &rxf->bfi_enet_cmd.rss_req;
414         int i;
415
416         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
417                 BFI_ENET_H2I_RSS_CFG_REQ, 0, rxf->rx->rid);
418         req->mh.num_entries = htons(
419                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_rss_cfg_req)));
420         req->cfg.type = rxf->rss_cfg.hash_type;
421         req->cfg.mask = rxf->rss_cfg.hash_mask;
422         for (i = 0; i < BFI_ENET_RSS_KEY_LEN; i++)
423                 req->cfg.key[i] =
424                         htonl(rxf->rss_cfg.toeplitz_hash_key[i]);
425         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
426                 sizeof(struct bfi_enet_rss_cfg_req), &req->mh);
427         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
428 }
429
430 static void
431 bna_bfi_rss_enable(struct bna_rxf *rxf)
432 {
433         struct bfi_enet_enable_req *req = &rxf->bfi_enet_cmd.req;
434
435         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
436                 BFI_ENET_H2I_RSS_ENABLE_REQ, 0, rxf->rx->rid);
437         req->mh.num_entries = htons(
438                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_enable_req)));
439         req->enable = rxf->rss_status;
440         bfa_msgq_cmd_set(&rxf->msgq_cmd, NULL, NULL,
441                 sizeof(struct bfi_enet_enable_req), &req->mh);
442         bfa_msgq_cmd_post(&rxf->rx->bna->msgq, &rxf->msgq_cmd);
443 }
444
445 /* This function gets the multicast MAC that has already been added to CAM */
446 static struct bna_mac *
447 bna_rxf_mcmac_get(struct bna_rxf *rxf, u8 *mac_addr)
448 {
449         struct bna_mac *mac;
450         struct list_head *qe;
451
452         list_for_each(qe, &rxf->mcast_active_q) {
453                 mac = (struct bna_mac *)qe;
454                 if (BNA_MAC_IS_EQUAL(&mac->addr, mac_addr))
455                         return mac;
456         }
457
458         list_for_each(qe, &rxf->mcast_pending_del_q) {
459                 mac = (struct bna_mac *)qe;
460                 if (BNA_MAC_IS_EQUAL(&mac->addr, mac_addr))
461                         return mac;
462         }
463
464         return NULL;
465 }
466
467 static struct bna_mcam_handle *
468 bna_rxf_mchandle_get(struct bna_rxf *rxf, int handle)
469 {
470         struct bna_mcam_handle *mchandle;
471         struct list_head *qe;
472
473         list_for_each(qe, &rxf->mcast_handle_q) {
474                 mchandle = (struct bna_mcam_handle *)qe;
475                 if (mchandle->handle == handle)
476                         return mchandle;
477         }
478
479         return NULL;
480 }
481
482 static void
483 bna_rxf_mchandle_attach(struct bna_rxf *rxf, u8 *mac_addr, int handle)
484 {
485         struct bna_mac *mcmac;
486         struct bna_mcam_handle *mchandle;
487
488         mcmac = bna_rxf_mcmac_get(rxf, mac_addr);
489         mchandle = bna_rxf_mchandle_get(rxf, handle);
490         if (mchandle == NULL) {
491                 mchandle = bna_mcam_mod_handle_get(&rxf->rx->bna->mcam_mod);
492                 mchandle->handle = handle;
493                 mchandle->refcnt = 0;
494                 list_add_tail(&mchandle->qe, &rxf->mcast_handle_q);
495         }
496         mchandle->refcnt++;
497         mcmac->handle = mchandle;
498 }
499
500 static int
501 bna_rxf_mcast_del(struct bna_rxf *rxf, struct bna_mac *mac,
502                 enum bna_cleanup_type cleanup)
503 {
504         struct bna_mcam_handle *mchandle;
505         int ret = 0;
506
507         mchandle = mac->handle;
508         if (mchandle == NULL)
509                 return ret;
510
511         mchandle->refcnt--;
512         if (mchandle->refcnt == 0) {
513                 if (cleanup == BNA_HARD_CLEANUP) {
514                         bna_bfi_mcast_del_req(rxf, mchandle->handle);
515                         ret = 1;
516                 }
517                 list_del(&mchandle->qe);
518                 bfa_q_qe_init(&mchandle->qe);
519                 bna_mcam_mod_handle_put(&rxf->rx->bna->mcam_mod, mchandle);
520         }
521         mac->handle = NULL;
522
523         return ret;
524 }
525
526 static int
527 bna_rxf_mcast_cfg_apply(struct bna_rxf *rxf)
528 {
529         struct bna_mac *mac = NULL;
530         struct list_head *qe;
531         int ret;
532
533         /* First delete multicast entries to maintain the count */
534         while (!list_empty(&rxf->mcast_pending_del_q)) {
535                 bfa_q_deq(&rxf->mcast_pending_del_q, &qe);
536                 bfa_q_qe_init(qe);
537                 mac = (struct bna_mac *)qe;
538                 ret = bna_rxf_mcast_del(rxf, mac, BNA_HARD_CLEANUP);
539                 bna_cam_mod_mac_put(bna_mcam_mod_del_q(rxf->rx->bna), mac);
540                 if (ret)
541                         return ret;
542         }
543
544         /* Add multicast entries */
545         if (!list_empty(&rxf->mcast_pending_add_q)) {
546                 bfa_q_deq(&rxf->mcast_pending_add_q, &qe);
547                 bfa_q_qe_init(qe);
548                 mac = (struct bna_mac *)qe;
549                 list_add_tail(&mac->qe, &rxf->mcast_active_q);
550                 bna_bfi_mcast_add_req(rxf, mac);
551                 return 1;
552         }
553
554         return 0;
555 }
556
557 static int
558 bna_rxf_vlan_cfg_apply(struct bna_rxf *rxf)
559 {
560         u8 vlan_pending_bitmask;
561         int block_idx = 0;
562
563         if (rxf->vlan_pending_bitmask) {
564                 vlan_pending_bitmask = rxf->vlan_pending_bitmask;
565                 while (!(vlan_pending_bitmask & 0x1)) {
566                         block_idx++;
567                         vlan_pending_bitmask >>= 1;
568                 }
569                 rxf->vlan_pending_bitmask &= ~(1 << block_idx);
570                 bna_bfi_rx_vlan_filter_set(rxf, block_idx);
571                 return 1;
572         }
573
574         return 0;
575 }
576
577 static int
578 bna_rxf_mcast_cfg_reset(struct bna_rxf *rxf, enum bna_cleanup_type cleanup)
579 {
580         struct list_head *qe;
581         struct bna_mac *mac;
582         int ret;
583
584         /* Throw away delete pending mcast entries */
585         while (!list_empty(&rxf->mcast_pending_del_q)) {
586                 bfa_q_deq(&rxf->mcast_pending_del_q, &qe);
587                 bfa_q_qe_init(qe);
588                 mac = (struct bna_mac *)qe;
589                 ret = bna_rxf_mcast_del(rxf, mac, cleanup);
590                 bna_cam_mod_mac_put(bna_mcam_mod_del_q(rxf->rx->bna), mac);
591                 if (ret)
592                         return ret;
593         }
594
595         /* Move active mcast entries to pending_add_q */
596         while (!list_empty(&rxf->mcast_active_q)) {
597                 bfa_q_deq(&rxf->mcast_active_q, &qe);
598                 bfa_q_qe_init(qe);
599                 list_add_tail(qe, &rxf->mcast_pending_add_q);
600                 mac = (struct bna_mac *)qe;
601                 if (bna_rxf_mcast_del(rxf, mac, cleanup))
602                         return 1;
603         }
604
605         return 0;
606 }
607
608 static int
609 bna_rxf_rss_cfg_apply(struct bna_rxf *rxf)
610 {
611         if (rxf->rss_pending) {
612                 if (rxf->rss_pending & BNA_RSS_F_RIT_PENDING) {
613                         rxf->rss_pending &= ~BNA_RSS_F_RIT_PENDING;
614                         bna_bfi_rit_cfg(rxf);
615                         return 1;
616                 }
617
618                 if (rxf->rss_pending & BNA_RSS_F_CFG_PENDING) {
619                         rxf->rss_pending &= ~BNA_RSS_F_CFG_PENDING;
620                         bna_bfi_rss_cfg(rxf);
621                         return 1;
622                 }
623
624                 if (rxf->rss_pending & BNA_RSS_F_STATUS_PENDING) {
625                         rxf->rss_pending &= ~BNA_RSS_F_STATUS_PENDING;
626                         bna_bfi_rss_enable(rxf);
627                         return 1;
628                 }
629         }
630
631         return 0;
632 }
633
634 static int
635 bna_rxf_cfg_apply(struct bna_rxf *rxf)
636 {
637         if (bna_rxf_ucast_cfg_apply(rxf))
638                 return 1;
639
640         if (bna_rxf_mcast_cfg_apply(rxf))
641                 return 1;
642
643         if (bna_rxf_promisc_cfg_apply(rxf))
644                 return 1;
645
646         if (bna_rxf_allmulti_cfg_apply(rxf))
647                 return 1;
648
649         if (bna_rxf_vlan_cfg_apply(rxf))
650                 return 1;
651
652         if (bna_rxf_vlan_strip_cfg_apply(rxf))
653                 return 1;
654
655         if (bna_rxf_rss_cfg_apply(rxf))
656                 return 1;
657
658         return 0;
659 }
660
661 /* Only software reset */
662 static int
663 bna_rxf_fltr_clear(struct bna_rxf *rxf)
664 {
665         if (bna_rxf_ucast_cfg_reset(rxf, BNA_HARD_CLEANUP))
666                 return 1;
667
668         if (bna_rxf_mcast_cfg_reset(rxf, BNA_HARD_CLEANUP))
669                 return 1;
670
671         if (bna_rxf_promisc_cfg_reset(rxf, BNA_HARD_CLEANUP))
672                 return 1;
673
674         if (bna_rxf_allmulti_cfg_reset(rxf, BNA_HARD_CLEANUP))
675                 return 1;
676
677         return 0;
678 }
679
680 static void
681 bna_rxf_cfg_reset(struct bna_rxf *rxf)
682 {
683         bna_rxf_ucast_cfg_reset(rxf, BNA_SOFT_CLEANUP);
684         bna_rxf_mcast_cfg_reset(rxf, BNA_SOFT_CLEANUP);
685         bna_rxf_promisc_cfg_reset(rxf, BNA_SOFT_CLEANUP);
686         bna_rxf_allmulti_cfg_reset(rxf, BNA_SOFT_CLEANUP);
687         bna_rxf_vlan_cfg_soft_reset(rxf);
688         bna_rxf_rss_cfg_soft_reset(rxf);
689 }
690
691 static void
692 bna_rit_init(struct bna_rxf *rxf, int rit_size)
693 {
694         struct bna_rx *rx = rxf->rx;
695         struct bna_rxp *rxp;
696         struct list_head *qe;
697         int offset = 0;
698
699         rxf->rit_size = rit_size;
700         list_for_each(qe, &rx->rxp_q) {
701                 rxp = (struct bna_rxp *)qe;
702                 rxf->rit[offset] = rxp->cq.ccb->id;
703                 offset++;
704         }
705
706 }
707
708 void
709 bna_bfi_rxf_cfg_rsp(struct bna_rxf *rxf, struct bfi_msgq_mhdr *msghdr)
710 {
711         bfa_fsm_send_event(rxf, RXF_E_FW_RESP);
712 }
713
714 void
715 bna_bfi_rxf_ucast_set_rsp(struct bna_rxf *rxf,
716                         struct bfi_msgq_mhdr *msghdr)
717 {
718         struct bfi_enet_rsp *rsp =
719                 container_of(msghdr, struct bfi_enet_rsp, mh);
720
721         if (rsp->error) {
722                 /* Clear ucast from cache */
723                 rxf->ucast_active_set = 0;
724         }
725
726         bfa_fsm_send_event(rxf, RXF_E_FW_RESP);
727 }
728
729 void
730 bna_bfi_rxf_mcast_add_rsp(struct bna_rxf *rxf,
731                         struct bfi_msgq_mhdr *msghdr)
732 {
733         struct bfi_enet_mcast_add_req *req =
734                 &rxf->bfi_enet_cmd.mcast_add_req;
735         struct bfi_enet_mcast_add_rsp *rsp =
736                 container_of(msghdr, struct bfi_enet_mcast_add_rsp, mh);
737
738         bna_rxf_mchandle_attach(rxf, (u8 *)&req->mac_addr,
739                 ntohs(rsp->handle));
740         bfa_fsm_send_event(rxf, RXF_E_FW_RESP);
741 }
742
743 static void
744 bna_rxf_init(struct bna_rxf *rxf,
745                 struct bna_rx *rx,
746                 struct bna_rx_config *q_config,
747                 struct bna_res_info *res_info)
748 {
749         rxf->rx = rx;
750
751         INIT_LIST_HEAD(&rxf->ucast_pending_add_q);
752         INIT_LIST_HEAD(&rxf->ucast_pending_del_q);
753         rxf->ucast_pending_set = 0;
754         rxf->ucast_active_set = 0;
755         INIT_LIST_HEAD(&rxf->ucast_active_q);
756         rxf->ucast_pending_mac = NULL;
757
758         INIT_LIST_HEAD(&rxf->mcast_pending_add_q);
759         INIT_LIST_HEAD(&rxf->mcast_pending_del_q);
760         INIT_LIST_HEAD(&rxf->mcast_active_q);
761         INIT_LIST_HEAD(&rxf->mcast_handle_q);
762
763         if (q_config->paused)
764                 rxf->flags |= BNA_RXF_F_PAUSED;
765
766         rxf->rit = (u8 *)
767                 res_info[BNA_RX_RES_MEM_T_RIT].res_u.mem_info.mdl[0].kva;
768         bna_rit_init(rxf, q_config->num_paths);
769
770         rxf->rss_status = q_config->rss_status;
771         if (rxf->rss_status == BNA_STATUS_T_ENABLED) {
772                 rxf->rss_cfg = q_config->rss_config;
773                 rxf->rss_pending |= BNA_RSS_F_CFG_PENDING;
774                 rxf->rss_pending |= BNA_RSS_F_RIT_PENDING;
775                 rxf->rss_pending |= BNA_RSS_F_STATUS_PENDING;
776         }
777
778         rxf->vlan_filter_status = BNA_STATUS_T_DISABLED;
779         memset(rxf->vlan_filter_table, 0,
780                         (sizeof(u32) * (BFI_ENET_VLAN_ID_MAX / 32)));
781         rxf->vlan_filter_table[0] |= 1; /* for pure priority tagged frames */
782         rxf->vlan_pending_bitmask = (u8)BFI_VLAN_BMASK_ALL;
783
784         rxf->vlan_strip_status = q_config->vlan_strip_status;
785
786         bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
787 }
788
789 static void
790 bna_rxf_uninit(struct bna_rxf *rxf)
791 {
792         struct bna_mac *mac;
793
794         rxf->ucast_pending_set = 0;
795         rxf->ucast_active_set = 0;
796
797         while (!list_empty(&rxf->ucast_pending_add_q)) {
798                 bfa_q_deq(&rxf->ucast_pending_add_q, &mac);
799                 bfa_q_qe_init(&mac->qe);
800                 bna_cam_mod_mac_put(bna_ucam_mod_free_q(rxf->rx->bna), mac);
801         }
802
803         if (rxf->ucast_pending_mac) {
804                 bfa_q_qe_init(&rxf->ucast_pending_mac->qe);
805                 bna_cam_mod_mac_put(bna_ucam_mod_free_q(rxf->rx->bna),
806                                     rxf->ucast_pending_mac);
807                 rxf->ucast_pending_mac = NULL;
808         }
809
810         while (!list_empty(&rxf->mcast_pending_add_q)) {
811                 bfa_q_deq(&rxf->mcast_pending_add_q, &mac);
812                 bfa_q_qe_init(&mac->qe);
813                 bna_cam_mod_mac_put(bna_mcam_mod_free_q(rxf->rx->bna), mac);
814         }
815
816         rxf->rxmode_pending = 0;
817         rxf->rxmode_pending_bitmask = 0;
818         if (rxf->rx->bna->promisc_rid == rxf->rx->rid)
819                 rxf->rx->bna->promisc_rid = BFI_INVALID_RID;
820         if (rxf->rx->bna->default_mode_rid == rxf->rx->rid)
821                 rxf->rx->bna->default_mode_rid = BFI_INVALID_RID;
822
823         rxf->rss_pending = 0;
824         rxf->vlan_strip_pending = false;
825
826         rxf->flags = 0;
827
828         rxf->rx = NULL;
829 }
830
831 static void
832 bna_rx_cb_rxf_started(struct bna_rx *rx)
833 {
834         bfa_fsm_send_event(rx, RX_E_RXF_STARTED);
835 }
836
837 static void
838 bna_rxf_start(struct bna_rxf *rxf)
839 {
840         rxf->start_cbfn = bna_rx_cb_rxf_started;
841         rxf->start_cbarg = rxf->rx;
842         bfa_fsm_send_event(rxf, RXF_E_START);
843 }
844
845 static void
846 bna_rx_cb_rxf_stopped(struct bna_rx *rx)
847 {
848         bfa_fsm_send_event(rx, RX_E_RXF_STOPPED);
849 }
850
851 static void
852 bna_rxf_stop(struct bna_rxf *rxf)
853 {
854         rxf->stop_cbfn = bna_rx_cb_rxf_stopped;
855         rxf->stop_cbarg = rxf->rx;
856         bfa_fsm_send_event(rxf, RXF_E_STOP);
857 }
858
859 static void
860 bna_rxf_fail(struct bna_rxf *rxf)
861 {
862         bfa_fsm_send_event(rxf, RXF_E_FAIL);
863 }
864
865 enum bna_cb_status
866 bna_rx_ucast_set(struct bna_rx *rx, u8 *ucmac,
867                  void (*cbfn)(struct bnad *, struct bna_rx *))
868 {
869         struct bna_rxf *rxf = &rx->rxf;
870
871         if (rxf->ucast_pending_mac == NULL) {
872                 rxf->ucast_pending_mac =
873                         bna_cam_mod_mac_get(bna_ucam_mod_free_q(rxf->rx->bna));
874                 if (rxf->ucast_pending_mac == NULL)
875                         return BNA_CB_UCAST_CAM_FULL;
876                 bfa_q_qe_init(&rxf->ucast_pending_mac->qe);
877         }
878
879         memcpy(rxf->ucast_pending_mac->addr, ucmac, ETH_ALEN);
880         rxf->ucast_pending_set = 1;
881         rxf->cam_fltr_cbfn = cbfn;
882         rxf->cam_fltr_cbarg = rx->bna->bnad;
883
884         bfa_fsm_send_event(rxf, RXF_E_CONFIG);
885
886         return BNA_CB_SUCCESS;
887 }
888
889 enum bna_cb_status
890 bna_rx_mcast_add(struct bna_rx *rx, u8 *addr,
891                  void (*cbfn)(struct bnad *, struct bna_rx *))
892 {
893         struct bna_rxf *rxf = &rx->rxf;
894         struct bna_mac *mac;
895
896         /* Check if already added or pending addition */
897         if (bna_mac_find(&rxf->mcast_active_q, addr) ||
898                 bna_mac_find(&rxf->mcast_pending_add_q, addr)) {
899                 if (cbfn)
900                         cbfn(rx->bna->bnad, rx);
901                 return BNA_CB_SUCCESS;
902         }
903
904         mac = bna_cam_mod_mac_get(bna_mcam_mod_free_q(rxf->rx->bna));
905         if (mac == NULL)
906                 return BNA_CB_MCAST_LIST_FULL;
907         bfa_q_qe_init(&mac->qe);
908         memcpy(mac->addr, addr, ETH_ALEN);
909         list_add_tail(&mac->qe, &rxf->mcast_pending_add_q);
910
911         rxf->cam_fltr_cbfn = cbfn;
912         rxf->cam_fltr_cbarg = rx->bna->bnad;
913
914         bfa_fsm_send_event(rxf, RXF_E_CONFIG);
915
916         return BNA_CB_SUCCESS;
917 }
918
919 enum bna_cb_status
920 bna_rx_ucast_listset(struct bna_rx *rx, int count, u8 *uclist,
921                      void (*cbfn)(struct bnad *, struct bna_rx *))
922 {
923         struct bna_ucam_mod *ucam_mod = &rx->bna->ucam_mod;
924         struct bna_rxf *rxf = &rx->rxf;
925         struct list_head list_head;
926         struct list_head *qe;
927         u8 *mcaddr;
928         struct bna_mac *mac, *del_mac;
929         int i;
930
931         /* Purge the pending_add_q */
932         while (!list_empty(&rxf->ucast_pending_add_q)) {
933                 bfa_q_deq(&rxf->ucast_pending_add_q, &qe);
934                 bfa_q_qe_init(qe);
935                 mac = (struct bna_mac *)qe;
936                 bna_cam_mod_mac_put(&ucam_mod->free_q, mac);
937         }
938
939         /* Schedule active_q entries for deletion */
940         while (!list_empty(&rxf->ucast_active_q)) {
941                 bfa_q_deq(&rxf->ucast_active_q, &qe);
942                 mac = (struct bna_mac *)qe;
943                 bfa_q_qe_init(&mac->qe);
944
945                 del_mac = bna_cam_mod_mac_get(&ucam_mod->del_q);
946                 memcpy(del_mac, mac, sizeof(*del_mac));
947                 list_add_tail(&del_mac->qe, &rxf->ucast_pending_del_q);
948                 bna_cam_mod_mac_put(&ucam_mod->free_q, mac);
949         }
950
951         /* Allocate nodes */
952         INIT_LIST_HEAD(&list_head);
953         for (i = 0, mcaddr = uclist; i < count; i++) {
954                 mac = bna_cam_mod_mac_get(&ucam_mod->free_q);
955                 if (mac == NULL)
956                         goto err_return;
957                 bfa_q_qe_init(&mac->qe);
958                 memcpy(mac->addr, mcaddr, ETH_ALEN);
959                 list_add_tail(&mac->qe, &list_head);
960                 mcaddr += ETH_ALEN;
961         }
962
963         /* Add the new entries */
964         while (!list_empty(&list_head)) {
965                 bfa_q_deq(&list_head, &qe);
966                 mac = (struct bna_mac *)qe;
967                 bfa_q_qe_init(&mac->qe);
968                 list_add_tail(&mac->qe, &rxf->ucast_pending_add_q);
969         }
970
971         rxf->cam_fltr_cbfn = cbfn;
972         rxf->cam_fltr_cbarg = rx->bna->bnad;
973         bfa_fsm_send_event(rxf, RXF_E_CONFIG);
974
975         return BNA_CB_SUCCESS;
976
977 err_return:
978         while (!list_empty(&list_head)) {
979                 bfa_q_deq(&list_head, &qe);
980                 mac = (struct bna_mac *)qe;
981                 bfa_q_qe_init(&mac->qe);
982                 bna_cam_mod_mac_put(&ucam_mod->free_q, mac);
983         }
984
985         return BNA_CB_UCAST_CAM_FULL;
986 }
987
988 enum bna_cb_status
989 bna_rx_mcast_listset(struct bna_rx *rx, int count, u8 *mclist,
990                      void (*cbfn)(struct bnad *, struct bna_rx *))
991 {
992         struct bna_mcam_mod *mcam_mod = &rx->bna->mcam_mod;
993         struct bna_rxf *rxf = &rx->rxf;
994         struct list_head list_head;
995         struct list_head *qe;
996         u8 *mcaddr;
997         struct bna_mac *mac, *del_mac;
998         int i;
999
1000         /* Purge the pending_add_q */
1001         while (!list_empty(&rxf->mcast_pending_add_q)) {
1002                 bfa_q_deq(&rxf->mcast_pending_add_q, &qe);
1003                 bfa_q_qe_init(qe);
1004                 mac = (struct bna_mac *)qe;
1005                 bna_cam_mod_mac_put(&mcam_mod->free_q, mac);
1006         }
1007
1008         /* Schedule active_q entries for deletion */
1009         while (!list_empty(&rxf->mcast_active_q)) {
1010                 bfa_q_deq(&rxf->mcast_active_q, &qe);
1011                 mac = (struct bna_mac *)qe;
1012                 bfa_q_qe_init(&mac->qe);
1013
1014                 del_mac = bna_cam_mod_mac_get(&mcam_mod->del_q);
1015
1016                 memcpy(del_mac, mac, sizeof(*del_mac));
1017                 list_add_tail(&del_mac->qe, &rxf->mcast_pending_del_q);
1018                 mac->handle = NULL;
1019                 bna_cam_mod_mac_put(&mcam_mod->free_q, mac);
1020         }
1021
1022         /* Allocate nodes */
1023         INIT_LIST_HEAD(&list_head);
1024         for (i = 0, mcaddr = mclist; i < count; i++) {
1025                 mac = bna_cam_mod_mac_get(&mcam_mod->free_q);
1026                 if (mac == NULL)
1027                         goto err_return;
1028                 bfa_q_qe_init(&mac->qe);
1029                 memcpy(mac->addr, mcaddr, ETH_ALEN);
1030                 list_add_tail(&mac->qe, &list_head);
1031
1032                 mcaddr += ETH_ALEN;
1033         }
1034
1035         /* Add the new entries */
1036         while (!list_empty(&list_head)) {
1037                 bfa_q_deq(&list_head, &qe);
1038                 mac = (struct bna_mac *)qe;
1039                 bfa_q_qe_init(&mac->qe);
1040                 list_add_tail(&mac->qe, &rxf->mcast_pending_add_q);
1041         }
1042
1043         rxf->cam_fltr_cbfn = cbfn;
1044         rxf->cam_fltr_cbarg = rx->bna->bnad;
1045         bfa_fsm_send_event(rxf, RXF_E_CONFIG);
1046
1047         return BNA_CB_SUCCESS;
1048
1049 err_return:
1050         while (!list_empty(&list_head)) {
1051                 bfa_q_deq(&list_head, &qe);
1052                 mac = (struct bna_mac *)qe;
1053                 bfa_q_qe_init(&mac->qe);
1054                 bna_cam_mod_mac_put(&mcam_mod->free_q, mac);
1055         }
1056
1057         return BNA_CB_MCAST_LIST_FULL;
1058 }
1059
1060 void
1061 bna_rx_mcast_delall(struct bna_rx *rx,
1062                     void (*cbfn)(struct bnad *, struct bna_rx *))
1063 {
1064         struct bna_rxf *rxf = &rx->rxf;
1065         struct list_head *qe;
1066         struct bna_mac *mac, *del_mac;
1067         int need_hw_config = 0;
1068
1069         /* Purge all entries from pending_add_q */
1070         while (!list_empty(&rxf->mcast_pending_add_q)) {
1071                 bfa_q_deq(&rxf->mcast_pending_add_q, &qe);
1072                 mac = (struct bna_mac *)qe;
1073                 bfa_q_qe_init(&mac->qe);
1074                 bna_cam_mod_mac_put(bna_mcam_mod_free_q(rxf->rx->bna), mac);
1075         }
1076
1077         /* Schedule all entries in active_q for deletion */
1078         while (!list_empty(&rxf->mcast_active_q)) {
1079                 bfa_q_deq(&rxf->mcast_active_q, &qe);
1080                 mac = (struct bna_mac *)qe;
1081                 bfa_q_qe_init(&mac->qe);
1082
1083                 del_mac = bna_cam_mod_mac_get(bna_mcam_mod_del_q(rxf->rx->bna));
1084
1085                 memcpy(del_mac, mac, sizeof(*del_mac));
1086                 list_add_tail(&del_mac->qe, &rxf->mcast_pending_del_q);
1087                 mac->handle = NULL;
1088                 bna_cam_mod_mac_put(bna_mcam_mod_free_q(rxf->rx->bna), mac);
1089                 need_hw_config = 1;
1090         }
1091
1092         if (need_hw_config) {
1093                 rxf->cam_fltr_cbfn = cbfn;
1094                 rxf->cam_fltr_cbarg = rx->bna->bnad;
1095                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
1096                 return;
1097         }
1098
1099         if (cbfn)
1100                 (*cbfn)(rx->bna->bnad, rx);
1101 }
1102
1103 void
1104 bna_rx_vlan_add(struct bna_rx *rx, int vlan_id)
1105 {
1106         struct bna_rxf *rxf = &rx->rxf;
1107         int index = (vlan_id >> BFI_VLAN_WORD_SHIFT);
1108         int bit = (1 << (vlan_id & BFI_VLAN_WORD_MASK));
1109         int group_id = (vlan_id >> BFI_VLAN_BLOCK_SHIFT);
1110
1111         rxf->vlan_filter_table[index] |= bit;
1112         if (rxf->vlan_filter_status == BNA_STATUS_T_ENABLED) {
1113                 rxf->vlan_pending_bitmask |= (1 << group_id);
1114                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
1115         }
1116 }
1117
1118 void
1119 bna_rx_vlan_del(struct bna_rx *rx, int vlan_id)
1120 {
1121         struct bna_rxf *rxf = &rx->rxf;
1122         int index = (vlan_id >> BFI_VLAN_WORD_SHIFT);
1123         int bit = (1 << (vlan_id & BFI_VLAN_WORD_MASK));
1124         int group_id = (vlan_id >> BFI_VLAN_BLOCK_SHIFT);
1125
1126         rxf->vlan_filter_table[index] &= ~bit;
1127         if (rxf->vlan_filter_status == BNA_STATUS_T_ENABLED) {
1128                 rxf->vlan_pending_bitmask |= (1 << group_id);
1129                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
1130         }
1131 }
1132
1133 static int
1134 bna_rxf_ucast_cfg_apply(struct bna_rxf *rxf)
1135 {
1136         struct bna_mac *mac = NULL;
1137         struct list_head *qe;
1138
1139         /* Delete MAC addresses previousely added */
1140         if (!list_empty(&rxf->ucast_pending_del_q)) {
1141                 bfa_q_deq(&rxf->ucast_pending_del_q, &qe);
1142                 bfa_q_qe_init(qe);
1143                 mac = (struct bna_mac *)qe;
1144                 bna_bfi_ucast_req(rxf, mac, BFI_ENET_H2I_MAC_UCAST_DEL_REQ);
1145                 bna_cam_mod_mac_put(bna_ucam_mod_del_q(rxf->rx->bna), mac);
1146                 return 1;
1147         }
1148
1149         /* Set default unicast MAC */
1150         if (rxf->ucast_pending_set) {
1151                 rxf->ucast_pending_set = 0;
1152                 memcpy(rxf->ucast_active_mac.addr,
1153                         rxf->ucast_pending_mac->addr, ETH_ALEN);
1154                 rxf->ucast_active_set = 1;
1155                 bna_bfi_ucast_req(rxf, &rxf->ucast_active_mac,
1156                         BFI_ENET_H2I_MAC_UCAST_SET_REQ);
1157                 return 1;
1158         }
1159
1160         /* Add additional MAC entries */
1161         if (!list_empty(&rxf->ucast_pending_add_q)) {
1162                 bfa_q_deq(&rxf->ucast_pending_add_q, &qe);
1163                 bfa_q_qe_init(qe);
1164                 mac = (struct bna_mac *)qe;
1165                 list_add_tail(&mac->qe, &rxf->ucast_active_q);
1166                 bna_bfi_ucast_req(rxf, mac, BFI_ENET_H2I_MAC_UCAST_ADD_REQ);
1167                 return 1;
1168         }
1169
1170         return 0;
1171 }
1172
1173 static int
1174 bna_rxf_ucast_cfg_reset(struct bna_rxf *rxf, enum bna_cleanup_type cleanup)
1175 {
1176         struct list_head *qe;
1177         struct bna_mac *mac;
1178
1179         /* Throw away delete pending ucast entries */
1180         while (!list_empty(&rxf->ucast_pending_del_q)) {
1181                 bfa_q_deq(&rxf->ucast_pending_del_q, &qe);
1182                 bfa_q_qe_init(qe);
1183                 mac = (struct bna_mac *)qe;
1184                 if (cleanup == BNA_SOFT_CLEANUP)
1185                         bna_cam_mod_mac_put(bna_ucam_mod_del_q(rxf->rx->bna),
1186                                             mac);
1187                 else {
1188                         bna_bfi_ucast_req(rxf, mac,
1189                                 BFI_ENET_H2I_MAC_UCAST_DEL_REQ);
1190                         bna_cam_mod_mac_put(bna_ucam_mod_del_q(rxf->rx->bna),
1191                                             mac);
1192                         return 1;
1193                 }
1194         }
1195
1196         /* Move active ucast entries to pending_add_q */
1197         while (!list_empty(&rxf->ucast_active_q)) {
1198                 bfa_q_deq(&rxf->ucast_active_q, &qe);
1199                 bfa_q_qe_init(qe);
1200                 list_add_tail(qe, &rxf->ucast_pending_add_q);
1201                 if (cleanup == BNA_HARD_CLEANUP) {
1202                         mac = (struct bna_mac *)qe;
1203                         bna_bfi_ucast_req(rxf, mac,
1204                                 BFI_ENET_H2I_MAC_UCAST_DEL_REQ);
1205                         return 1;
1206                 }
1207         }
1208
1209         if (rxf->ucast_active_set) {
1210                 rxf->ucast_pending_set = 1;
1211                 rxf->ucast_active_set = 0;
1212                 if (cleanup == BNA_HARD_CLEANUP) {
1213                         bna_bfi_ucast_req(rxf, &rxf->ucast_active_mac,
1214                                 BFI_ENET_H2I_MAC_UCAST_CLR_REQ);
1215                         return 1;
1216                 }
1217         }
1218
1219         return 0;
1220 }
1221
1222 static int
1223 bna_rxf_promisc_cfg_apply(struct bna_rxf *rxf)
1224 {
1225         struct bna *bna = rxf->rx->bna;
1226
1227         /* Enable/disable promiscuous mode */
1228         if (is_promisc_enable(rxf->rxmode_pending,
1229                                 rxf->rxmode_pending_bitmask)) {
1230                 /* move promisc configuration from pending -> active */
1231                 promisc_inactive(rxf->rxmode_pending,
1232                                 rxf->rxmode_pending_bitmask);
1233                 rxf->rxmode_active |= BNA_RXMODE_PROMISC;
1234                 bna_bfi_rx_promisc_req(rxf, BNA_STATUS_T_ENABLED);
1235                 return 1;
1236         } else if (is_promisc_disable(rxf->rxmode_pending,
1237                                 rxf->rxmode_pending_bitmask)) {
1238                 /* move promisc configuration from pending -> active */
1239                 promisc_inactive(rxf->rxmode_pending,
1240                                 rxf->rxmode_pending_bitmask);
1241                 rxf->rxmode_active &= ~BNA_RXMODE_PROMISC;
1242                 bna->promisc_rid = BFI_INVALID_RID;
1243                 bna_bfi_rx_promisc_req(rxf, BNA_STATUS_T_DISABLED);
1244                 return 1;
1245         }
1246
1247         return 0;
1248 }
1249
1250 static int
1251 bna_rxf_promisc_cfg_reset(struct bna_rxf *rxf, enum bna_cleanup_type cleanup)
1252 {
1253         struct bna *bna = rxf->rx->bna;
1254
1255         /* Clear pending promisc mode disable */
1256         if (is_promisc_disable(rxf->rxmode_pending,
1257                                 rxf->rxmode_pending_bitmask)) {
1258                 promisc_inactive(rxf->rxmode_pending,
1259                                 rxf->rxmode_pending_bitmask);
1260                 rxf->rxmode_active &= ~BNA_RXMODE_PROMISC;
1261                 bna->promisc_rid = BFI_INVALID_RID;
1262                 if (cleanup == BNA_HARD_CLEANUP) {
1263                         bna_bfi_rx_promisc_req(rxf, BNA_STATUS_T_DISABLED);
1264                         return 1;
1265                 }
1266         }
1267
1268         /* Move promisc mode config from active -> pending */
1269         if (rxf->rxmode_active & BNA_RXMODE_PROMISC) {
1270                 promisc_enable(rxf->rxmode_pending,
1271                                 rxf->rxmode_pending_bitmask);
1272                 rxf->rxmode_active &= ~BNA_RXMODE_PROMISC;
1273                 if (cleanup == BNA_HARD_CLEANUP) {
1274                         bna_bfi_rx_promisc_req(rxf, BNA_STATUS_T_DISABLED);
1275                         return 1;
1276                 }
1277         }
1278
1279         return 0;
1280 }
1281
1282 static int
1283 bna_rxf_allmulti_cfg_apply(struct bna_rxf *rxf)
1284 {
1285         /* Enable/disable allmulti mode */
1286         if (is_allmulti_enable(rxf->rxmode_pending,
1287                                 rxf->rxmode_pending_bitmask)) {
1288                 /* move allmulti configuration from pending -> active */
1289                 allmulti_inactive(rxf->rxmode_pending,
1290                                 rxf->rxmode_pending_bitmask);
1291                 rxf->rxmode_active |= BNA_RXMODE_ALLMULTI;
1292                 bna_bfi_mcast_filter_req(rxf, BNA_STATUS_T_DISABLED);
1293                 return 1;
1294         } else if (is_allmulti_disable(rxf->rxmode_pending,
1295                                         rxf->rxmode_pending_bitmask)) {
1296                 /* move allmulti configuration from pending -> active */
1297                 allmulti_inactive(rxf->rxmode_pending,
1298                                 rxf->rxmode_pending_bitmask);
1299                 rxf->rxmode_active &= ~BNA_RXMODE_ALLMULTI;
1300                 bna_bfi_mcast_filter_req(rxf, BNA_STATUS_T_ENABLED);
1301                 return 1;
1302         }
1303
1304         return 0;
1305 }
1306
1307 static int
1308 bna_rxf_allmulti_cfg_reset(struct bna_rxf *rxf, enum bna_cleanup_type cleanup)
1309 {
1310         /* Clear pending allmulti mode disable */
1311         if (is_allmulti_disable(rxf->rxmode_pending,
1312                                 rxf->rxmode_pending_bitmask)) {
1313                 allmulti_inactive(rxf->rxmode_pending,
1314                                 rxf->rxmode_pending_bitmask);
1315                 rxf->rxmode_active &= ~BNA_RXMODE_ALLMULTI;
1316                 if (cleanup == BNA_HARD_CLEANUP) {
1317                         bna_bfi_mcast_filter_req(rxf, BNA_STATUS_T_ENABLED);
1318                         return 1;
1319                 }
1320         }
1321
1322         /* Move allmulti mode config from active -> pending */
1323         if (rxf->rxmode_active & BNA_RXMODE_ALLMULTI) {
1324                 allmulti_enable(rxf->rxmode_pending,
1325                                 rxf->rxmode_pending_bitmask);
1326                 rxf->rxmode_active &= ~BNA_RXMODE_ALLMULTI;
1327                 if (cleanup == BNA_HARD_CLEANUP) {
1328                         bna_bfi_mcast_filter_req(rxf, BNA_STATUS_T_ENABLED);
1329                         return 1;
1330                 }
1331         }
1332
1333         return 0;
1334 }
1335
1336 static int
1337 bna_rxf_promisc_enable(struct bna_rxf *rxf)
1338 {
1339         struct bna *bna = rxf->rx->bna;
1340         int ret = 0;
1341
1342         if (is_promisc_enable(rxf->rxmode_pending,
1343                                 rxf->rxmode_pending_bitmask) ||
1344                 (rxf->rxmode_active & BNA_RXMODE_PROMISC)) {
1345                 /* Do nothing if pending enable or already enabled */
1346         } else if (is_promisc_disable(rxf->rxmode_pending,
1347                                         rxf->rxmode_pending_bitmask)) {
1348                 /* Turn off pending disable command */
1349                 promisc_inactive(rxf->rxmode_pending,
1350                         rxf->rxmode_pending_bitmask);
1351         } else {
1352                 /* Schedule enable */
1353                 promisc_enable(rxf->rxmode_pending,
1354                                 rxf->rxmode_pending_bitmask);
1355                 bna->promisc_rid = rxf->rx->rid;
1356                 ret = 1;
1357         }
1358
1359         return ret;
1360 }
1361
1362 static int
1363 bna_rxf_promisc_disable(struct bna_rxf *rxf)
1364 {
1365         struct bna *bna = rxf->rx->bna;
1366         int ret = 0;
1367
1368         if (is_promisc_disable(rxf->rxmode_pending,
1369                                 rxf->rxmode_pending_bitmask) ||
1370                 (!(rxf->rxmode_active & BNA_RXMODE_PROMISC))) {
1371                 /* Do nothing if pending disable or already disabled */
1372         } else if (is_promisc_enable(rxf->rxmode_pending,
1373                                         rxf->rxmode_pending_bitmask)) {
1374                 /* Turn off pending enable command */
1375                 promisc_inactive(rxf->rxmode_pending,
1376                                 rxf->rxmode_pending_bitmask);
1377                 bna->promisc_rid = BFI_INVALID_RID;
1378         } else if (rxf->rxmode_active & BNA_RXMODE_PROMISC) {
1379                 /* Schedule disable */
1380                 promisc_disable(rxf->rxmode_pending,
1381                                 rxf->rxmode_pending_bitmask);
1382                 ret = 1;
1383         }
1384
1385         return ret;
1386 }
1387
1388 static int
1389 bna_rxf_allmulti_enable(struct bna_rxf *rxf)
1390 {
1391         int ret = 0;
1392
1393         if (is_allmulti_enable(rxf->rxmode_pending,
1394                         rxf->rxmode_pending_bitmask) ||
1395                         (rxf->rxmode_active & BNA_RXMODE_ALLMULTI)) {
1396                 /* Do nothing if pending enable or already enabled */
1397         } else if (is_allmulti_disable(rxf->rxmode_pending,
1398                                         rxf->rxmode_pending_bitmask)) {
1399                 /* Turn off pending disable command */
1400                 allmulti_inactive(rxf->rxmode_pending,
1401                         rxf->rxmode_pending_bitmask);
1402         } else {
1403                 /* Schedule enable */
1404                 allmulti_enable(rxf->rxmode_pending,
1405                                 rxf->rxmode_pending_bitmask);
1406                 ret = 1;
1407         }
1408
1409         return ret;
1410 }
1411
1412 static int
1413 bna_rxf_allmulti_disable(struct bna_rxf *rxf)
1414 {
1415         int ret = 0;
1416
1417         if (is_allmulti_disable(rxf->rxmode_pending,
1418                                 rxf->rxmode_pending_bitmask) ||
1419                 (!(rxf->rxmode_active & BNA_RXMODE_ALLMULTI))) {
1420                 /* Do nothing if pending disable or already disabled */
1421         } else if (is_allmulti_enable(rxf->rxmode_pending,
1422                                         rxf->rxmode_pending_bitmask)) {
1423                 /* Turn off pending enable command */
1424                 allmulti_inactive(rxf->rxmode_pending,
1425                                 rxf->rxmode_pending_bitmask);
1426         } else if (rxf->rxmode_active & BNA_RXMODE_ALLMULTI) {
1427                 /* Schedule disable */
1428                 allmulti_disable(rxf->rxmode_pending,
1429                                 rxf->rxmode_pending_bitmask);
1430                 ret = 1;
1431         }
1432
1433         return ret;
1434 }
1435
1436 static int
1437 bna_rxf_vlan_strip_cfg_apply(struct bna_rxf *rxf)
1438 {
1439         if (rxf->vlan_strip_pending) {
1440                         rxf->vlan_strip_pending = false;
1441                         bna_bfi_vlan_strip_enable(rxf);
1442                         return 1;
1443         }
1444
1445         return 0;
1446 }
1447
1448 /* RX */
1449
1450 #define BNA_GET_RXQS(qcfg)      (((qcfg)->rxp_type == BNA_RXP_SINGLE) ? \
1451         (qcfg)->num_paths : ((qcfg)->num_paths * 2))
1452
1453 #define SIZE_TO_PAGES(size)     (((size) >> PAGE_SHIFT) + ((((size) &\
1454         (PAGE_SIZE - 1)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
1455
1456 #define call_rx_stop_cbfn(rx)                                           \
1457 do {                                                                \
1458         if ((rx)->stop_cbfn) {                                          \
1459                 void (*cbfn)(void *, struct bna_rx *);    \
1460                 void *cbarg;                                        \
1461                 cbfn = (rx)->stop_cbfn;                          \
1462                 cbarg = (rx)->stop_cbarg;                              \
1463                 (rx)->stop_cbfn = NULL;                                 \
1464                 (rx)->stop_cbarg = NULL;                                \
1465                 cbfn(cbarg, rx);                                        \
1466         }                                                              \
1467 } while (0)
1468
1469 #define call_rx_stall_cbfn(rx)                                          \
1470 do {                                                                    \
1471         if ((rx)->rx_stall_cbfn)                                        \
1472                 (rx)->rx_stall_cbfn((rx)->bna->bnad, (rx));             \
1473 } while (0)
1474
1475 #define bfi_enet_datapath_q_init(bfi_q, bna_qpt)                        \
1476 do {                                                                    \
1477         struct bna_dma_addr cur_q_addr =                                \
1478                 *((struct bna_dma_addr *)((bna_qpt)->kv_qpt_ptr));      \
1479         (bfi_q)->pg_tbl.a32.addr_lo = (bna_qpt)->hw_qpt_ptr.lsb;        \
1480         (bfi_q)->pg_tbl.a32.addr_hi = (bna_qpt)->hw_qpt_ptr.msb;        \
1481         (bfi_q)->first_entry.a32.addr_lo = cur_q_addr.lsb;              \
1482         (bfi_q)->first_entry.a32.addr_hi = cur_q_addr.msb;              \
1483         (bfi_q)->pages = htons((u16)(bna_qpt)->page_count);     \
1484         (bfi_q)->page_sz = htons((u16)(bna_qpt)->page_size);\
1485 } while (0)
1486
1487 static void bna_bfi_rx_enet_start(struct bna_rx *rx);
1488 static void bna_rx_enet_stop(struct bna_rx *rx);
1489 static void bna_rx_mod_cb_rx_stopped(void *arg, struct bna_rx *rx);
1490
1491 bfa_fsm_state_decl(bna_rx, stopped,
1492         struct bna_rx, enum bna_rx_event);
1493 bfa_fsm_state_decl(bna_rx, start_wait,
1494         struct bna_rx, enum bna_rx_event);
1495 bfa_fsm_state_decl(bna_rx, start_stop_wait,
1496         struct bna_rx, enum bna_rx_event);
1497 bfa_fsm_state_decl(bna_rx, rxf_start_wait,
1498         struct bna_rx, enum bna_rx_event);
1499 bfa_fsm_state_decl(bna_rx, started,
1500         struct bna_rx, enum bna_rx_event);
1501 bfa_fsm_state_decl(bna_rx, rxf_stop_wait,
1502         struct bna_rx, enum bna_rx_event);
1503 bfa_fsm_state_decl(bna_rx, stop_wait,
1504         struct bna_rx, enum bna_rx_event);
1505 bfa_fsm_state_decl(bna_rx, cleanup_wait,
1506         struct bna_rx, enum bna_rx_event);
1507 bfa_fsm_state_decl(bna_rx, failed,
1508         struct bna_rx, enum bna_rx_event);
1509 bfa_fsm_state_decl(bna_rx, quiesce_wait,
1510         struct bna_rx, enum bna_rx_event);
1511
1512 static void bna_rx_sm_stopped_entry(struct bna_rx *rx)
1513 {
1514         call_rx_stop_cbfn(rx);
1515 }
1516
1517 static void bna_rx_sm_stopped(struct bna_rx *rx,
1518                                 enum bna_rx_event event)
1519 {
1520         switch (event) {
1521         case RX_E_START:
1522                 bfa_fsm_set_state(rx, bna_rx_sm_start_wait);
1523                 break;
1524
1525         case RX_E_STOP:
1526                 call_rx_stop_cbfn(rx);
1527                 break;
1528
1529         case RX_E_FAIL:
1530                 /* no-op */
1531                 break;
1532
1533         default:
1534                 bfa_sm_fault(event);
1535                 break;
1536         }
1537 }
1538
1539 static void bna_rx_sm_start_wait_entry(struct bna_rx *rx)
1540 {
1541         bna_bfi_rx_enet_start(rx);
1542 }
1543
1544 static void
1545 bna_rx_sm_stop_wait_entry(struct bna_rx *rx)
1546 {
1547 }
1548
1549 static void
1550 bna_rx_sm_stop_wait(struct bna_rx *rx, enum bna_rx_event event)
1551 {
1552         switch (event) {
1553         case RX_E_FAIL:
1554         case RX_E_STOPPED:
1555                 bfa_fsm_set_state(rx, bna_rx_sm_cleanup_wait);
1556                 rx->rx_cleanup_cbfn(rx->bna->bnad, rx);
1557                 break;
1558
1559         case RX_E_STARTED:
1560                 bna_rx_enet_stop(rx);
1561                 break;
1562
1563         default:
1564                 bfa_sm_fault(event);
1565                 break;
1566         }
1567 }
1568
1569 static void bna_rx_sm_start_wait(struct bna_rx *rx,
1570                                 enum bna_rx_event event)
1571 {
1572         switch (event) {
1573         case RX_E_STOP:
1574                 bfa_fsm_set_state(rx, bna_rx_sm_start_stop_wait);
1575                 break;
1576
1577         case RX_E_FAIL:
1578                 bfa_fsm_set_state(rx, bna_rx_sm_stopped);
1579                 break;
1580
1581         case RX_E_STARTED:
1582                 bfa_fsm_set_state(rx, bna_rx_sm_rxf_start_wait);
1583                 break;
1584
1585         default:
1586                 bfa_sm_fault(event);
1587                 break;
1588         }
1589 }
1590
1591 static void bna_rx_sm_rxf_start_wait_entry(struct bna_rx *rx)
1592 {
1593         rx->rx_post_cbfn(rx->bna->bnad, rx);
1594         bna_rxf_start(&rx->rxf);
1595 }
1596
1597 static void
1598 bna_rx_sm_rxf_stop_wait_entry(struct bna_rx *rx)
1599 {
1600 }
1601
1602 static void
1603 bna_rx_sm_rxf_stop_wait(struct bna_rx *rx, enum bna_rx_event event)
1604 {
1605         switch (event) {
1606         case RX_E_FAIL:
1607                 bfa_fsm_set_state(rx, bna_rx_sm_cleanup_wait);
1608                 bna_rxf_fail(&rx->rxf);
1609                 call_rx_stall_cbfn(rx);
1610                 rx->rx_cleanup_cbfn(rx->bna->bnad, rx);
1611                 break;
1612
1613         case RX_E_RXF_STARTED:
1614                 bna_rxf_stop(&rx->rxf);
1615                 break;
1616
1617         case RX_E_RXF_STOPPED:
1618                 bfa_fsm_set_state(rx, bna_rx_sm_stop_wait);
1619                 call_rx_stall_cbfn(rx);
1620                 bna_rx_enet_stop(rx);
1621                 break;
1622
1623         default:
1624                 bfa_sm_fault(event);
1625                 break;
1626         }
1627
1628 }
1629
1630 static void
1631 bna_rx_sm_start_stop_wait_entry(struct bna_rx *rx)
1632 {
1633 }
1634
1635 static void
1636 bna_rx_sm_start_stop_wait(struct bna_rx *rx, enum bna_rx_event event)
1637 {
1638         switch (event) {
1639         case RX_E_FAIL:
1640         case RX_E_STOPPED:
1641                 bfa_fsm_set_state(rx, bna_rx_sm_stopped);
1642                 break;
1643
1644         case RX_E_STARTED:
1645                 bna_rx_enet_stop(rx);
1646                 break;
1647
1648         default:
1649                 bfa_sm_fault(event);
1650         }
1651 }
1652
1653 static void
1654 bna_rx_sm_started_entry(struct bna_rx *rx)
1655 {
1656         struct bna_rxp *rxp;
1657         struct list_head *qe_rxp;
1658         int is_regular = (rx->type == BNA_RX_T_REGULAR);
1659
1660         /* Start IB */
1661         list_for_each(qe_rxp, &rx->rxp_q) {
1662                 rxp = (struct bna_rxp *)qe_rxp;
1663                 bna_ib_start(rx->bna, &rxp->cq.ib, is_regular);
1664         }
1665
1666         bna_ethport_cb_rx_started(&rx->bna->ethport);
1667 }
1668
1669 static void
1670 bna_rx_sm_started(struct bna_rx *rx, enum bna_rx_event event)
1671 {
1672         switch (event) {
1673         case RX_E_STOP:
1674                 bfa_fsm_set_state(rx, bna_rx_sm_rxf_stop_wait);
1675                 bna_ethport_cb_rx_stopped(&rx->bna->ethport);
1676                 bna_rxf_stop(&rx->rxf);
1677                 break;
1678
1679         case RX_E_FAIL:
1680                 bfa_fsm_set_state(rx, bna_rx_sm_failed);
1681                 bna_ethport_cb_rx_stopped(&rx->bna->ethport);
1682                 bna_rxf_fail(&rx->rxf);
1683                 call_rx_stall_cbfn(rx);
1684                 rx->rx_cleanup_cbfn(rx->bna->bnad, rx);
1685                 break;
1686
1687         default:
1688                 bfa_sm_fault(event);
1689                 break;
1690         }
1691 }
1692
1693 static void bna_rx_sm_rxf_start_wait(struct bna_rx *rx,
1694                                 enum bna_rx_event event)
1695 {
1696         switch (event) {
1697         case RX_E_STOP:
1698                 bfa_fsm_set_state(rx, bna_rx_sm_rxf_stop_wait);
1699                 break;
1700
1701         case RX_E_FAIL:
1702                 bfa_fsm_set_state(rx, bna_rx_sm_failed);
1703                 bna_rxf_fail(&rx->rxf);
1704                 call_rx_stall_cbfn(rx);
1705                 rx->rx_cleanup_cbfn(rx->bna->bnad, rx);
1706                 break;
1707
1708         case RX_E_RXF_STARTED:
1709                 bfa_fsm_set_state(rx, bna_rx_sm_started);
1710                 break;
1711
1712         default:
1713                 bfa_sm_fault(event);
1714                 break;
1715         }
1716 }
1717
1718 static void
1719 bna_rx_sm_cleanup_wait_entry(struct bna_rx *rx)
1720 {
1721 }
1722
1723 static void
1724 bna_rx_sm_cleanup_wait(struct bna_rx *rx, enum bna_rx_event event)
1725 {
1726         switch (event) {
1727         case RX_E_FAIL:
1728         case RX_E_RXF_STOPPED:
1729                 /* No-op */
1730                 break;
1731
1732         case RX_E_CLEANUP_DONE:
1733                 bfa_fsm_set_state(rx, bna_rx_sm_stopped);
1734                 break;
1735
1736         default:
1737                 bfa_sm_fault(event);
1738                 break;
1739         }
1740 }
1741
1742 static void
1743 bna_rx_sm_failed_entry(struct bna_rx *rx)
1744 {
1745 }
1746
1747 static void
1748 bna_rx_sm_failed(struct bna_rx *rx, enum bna_rx_event event)
1749 {
1750         switch (event) {
1751         case RX_E_START:
1752                 bfa_fsm_set_state(rx, bna_rx_sm_quiesce_wait);
1753                 break;
1754
1755         case RX_E_STOP:
1756                 bfa_fsm_set_state(rx, bna_rx_sm_cleanup_wait);
1757                 break;
1758
1759         case RX_E_FAIL:
1760         case RX_E_RXF_STARTED:
1761         case RX_E_RXF_STOPPED:
1762                 /* No-op */
1763                 break;
1764
1765         case RX_E_CLEANUP_DONE:
1766                 bfa_fsm_set_state(rx, bna_rx_sm_stopped);
1767                 break;
1768
1769         default:
1770                 bfa_sm_fault(event);
1771                 break;
1772 }       }
1773
1774 static void
1775 bna_rx_sm_quiesce_wait_entry(struct bna_rx *rx)
1776 {
1777 }
1778
1779 static void
1780 bna_rx_sm_quiesce_wait(struct bna_rx *rx, enum bna_rx_event event)
1781 {
1782         switch (event) {
1783         case RX_E_STOP:
1784                 bfa_fsm_set_state(rx, bna_rx_sm_cleanup_wait);
1785                 break;
1786
1787         case RX_E_FAIL:
1788                 bfa_fsm_set_state(rx, bna_rx_sm_failed);
1789                 break;
1790
1791         case RX_E_CLEANUP_DONE:
1792                 bfa_fsm_set_state(rx, bna_rx_sm_start_wait);
1793                 break;
1794
1795         default:
1796                 bfa_sm_fault(event);
1797                 break;
1798         }
1799 }
1800
1801 static void
1802 bna_bfi_rx_enet_start(struct bna_rx *rx)
1803 {
1804         struct bfi_enet_rx_cfg_req *cfg_req = &rx->bfi_enet_cmd.cfg_req;
1805         struct bna_rxp *rxp = NULL;
1806         struct bna_rxq *q0 = NULL, *q1 = NULL;
1807         struct list_head *rxp_qe;
1808         int i;
1809
1810         bfi_msgq_mhdr_set(cfg_req->mh, BFI_MC_ENET,
1811                 BFI_ENET_H2I_RX_CFG_SET_REQ, 0, rx->rid);
1812         cfg_req->mh.num_entries = htons(
1813                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_rx_cfg_req)));
1814
1815         cfg_req->rx_cfg.frame_size = bna_enet_mtu_get(&rx->bna->enet);
1816         cfg_req->num_queue_sets = rx->num_paths;
1817         for (i = 0, rxp_qe = bfa_q_first(&rx->rxp_q);
1818                 i < rx->num_paths;
1819                 i++, rxp_qe = bfa_q_next(rxp_qe)) {
1820                 rxp = (struct bna_rxp *)rxp_qe;
1821
1822                 GET_RXQS(rxp, q0, q1);
1823                 switch (rxp->type) {
1824                 case BNA_RXP_SLR:
1825                 case BNA_RXP_HDS:
1826                         /* Small RxQ */
1827                         bfi_enet_datapath_q_init(&cfg_req->q_cfg[i].qs.q,
1828                                                 &q1->qpt);
1829                         cfg_req->q_cfg[i].qs.rx_buffer_size =
1830                                 htons((u16)q1->buffer_size);
1831                         /* Fall through */
1832
1833                 case BNA_RXP_SINGLE:
1834                         /* Large/Single RxQ */
1835                         bfi_enet_datapath_q_init(&cfg_req->q_cfg[i].ql.q,
1836                                                 &q0->qpt);
1837                         if (q0->multi_buffer)
1838                                 /* multi-buffer is enabled by allocating
1839                                  * a new rx with new set of resources.
1840                                  * q0->buffer_size should be initialized to
1841                                  * fragment size.
1842                                  */
1843                                 cfg_req->rx_cfg.multi_buffer =
1844                                         BNA_STATUS_T_ENABLED;
1845                         else
1846                                 q0->buffer_size =
1847                                         bna_enet_mtu_get(&rx->bna->enet);
1848                         cfg_req->q_cfg[i].ql.rx_buffer_size =
1849                                 htons((u16)q0->buffer_size);
1850                         break;
1851
1852                 default:
1853                         BUG_ON(1);
1854                 }
1855
1856                 bfi_enet_datapath_q_init(&cfg_req->q_cfg[i].cq.q,
1857                                         &rxp->cq.qpt);
1858
1859                 cfg_req->q_cfg[i].ib.index_addr.a32.addr_lo =
1860                         rxp->cq.ib.ib_seg_host_addr.lsb;
1861                 cfg_req->q_cfg[i].ib.index_addr.a32.addr_hi =
1862                         rxp->cq.ib.ib_seg_host_addr.msb;
1863                 cfg_req->q_cfg[i].ib.intr.msix_index =
1864                         htons((u16)rxp->cq.ib.intr_vector);
1865         }
1866
1867         cfg_req->ib_cfg.int_pkt_dma = BNA_STATUS_T_DISABLED;
1868         cfg_req->ib_cfg.int_enabled = BNA_STATUS_T_ENABLED;
1869         cfg_req->ib_cfg.int_pkt_enabled = BNA_STATUS_T_DISABLED;
1870         cfg_req->ib_cfg.continuous_coalescing = BNA_STATUS_T_DISABLED;
1871         cfg_req->ib_cfg.msix = (rxp->cq.ib.intr_type == BNA_INTR_T_MSIX)
1872                                 ? BNA_STATUS_T_ENABLED :
1873                                 BNA_STATUS_T_DISABLED;
1874         cfg_req->ib_cfg.coalescing_timeout =
1875                         htonl((u32)rxp->cq.ib.coalescing_timeo);
1876         cfg_req->ib_cfg.inter_pkt_timeout =
1877                         htonl((u32)rxp->cq.ib.interpkt_timeo);
1878         cfg_req->ib_cfg.inter_pkt_count = (u8)rxp->cq.ib.interpkt_count;
1879
1880         switch (rxp->type) {
1881         case BNA_RXP_SLR:
1882                 cfg_req->rx_cfg.rxq_type = BFI_ENET_RXQ_LARGE_SMALL;
1883                 break;
1884
1885         case BNA_RXP_HDS:
1886                 cfg_req->rx_cfg.rxq_type = BFI_ENET_RXQ_HDS;
1887                 cfg_req->rx_cfg.hds.type = rx->hds_cfg.hdr_type;
1888                 cfg_req->rx_cfg.hds.force_offset = rx->hds_cfg.forced_offset;
1889                 cfg_req->rx_cfg.hds.max_header_size = rx->hds_cfg.forced_offset;
1890                 break;
1891
1892         case BNA_RXP_SINGLE:
1893                 cfg_req->rx_cfg.rxq_type = BFI_ENET_RXQ_SINGLE;
1894                 break;
1895
1896         default:
1897                 BUG_ON(1);
1898         }
1899         cfg_req->rx_cfg.strip_vlan = rx->rxf.vlan_strip_status;
1900
1901         bfa_msgq_cmd_set(&rx->msgq_cmd, NULL, NULL,
1902                 sizeof(struct bfi_enet_rx_cfg_req), &cfg_req->mh);
1903         bfa_msgq_cmd_post(&rx->bna->msgq, &rx->msgq_cmd);
1904 }
1905
1906 static void
1907 bna_bfi_rx_enet_stop(struct bna_rx *rx)
1908 {
1909         struct bfi_enet_req *req = &rx->bfi_enet_cmd.req;
1910
1911         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
1912                 BFI_ENET_H2I_RX_CFG_CLR_REQ, 0, rx->rid);
1913         req->mh.num_entries = htons(
1914                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_req)));
1915         bfa_msgq_cmd_set(&rx->msgq_cmd, NULL, NULL, sizeof(struct bfi_enet_req),
1916                 &req->mh);
1917         bfa_msgq_cmd_post(&rx->bna->msgq, &rx->msgq_cmd);
1918 }
1919
1920 static void
1921 bna_rx_enet_stop(struct bna_rx *rx)
1922 {
1923         struct bna_rxp *rxp;
1924         struct list_head                 *qe_rxp;
1925
1926         /* Stop IB */
1927         list_for_each(qe_rxp, &rx->rxp_q) {
1928                 rxp = (struct bna_rxp *)qe_rxp;
1929                 bna_ib_stop(rx->bna, &rxp->cq.ib);
1930         }
1931
1932         bna_bfi_rx_enet_stop(rx);
1933 }
1934
1935 static int
1936 bna_rx_res_check(struct bna_rx_mod *rx_mod, struct bna_rx_config *rx_cfg)
1937 {
1938         if ((rx_mod->rx_free_count == 0) ||
1939                 (rx_mod->rxp_free_count == 0) ||
1940                 (rx_mod->rxq_free_count == 0))
1941                 return 0;
1942
1943         if (rx_cfg->rxp_type == BNA_RXP_SINGLE) {
1944                 if ((rx_mod->rxp_free_count < rx_cfg->num_paths) ||
1945                         (rx_mod->rxq_free_count < rx_cfg->num_paths))
1946                                 return 0;
1947         } else {
1948                 if ((rx_mod->rxp_free_count < rx_cfg->num_paths) ||
1949                         (rx_mod->rxq_free_count < (2 * rx_cfg->num_paths)))
1950                         return 0;
1951         }
1952
1953         return 1;
1954 }
1955
1956 static struct bna_rxq *
1957 bna_rxq_get(struct bna_rx_mod *rx_mod)
1958 {
1959         struct bna_rxq *rxq = NULL;
1960         struct list_head        *qe = NULL;
1961
1962         bfa_q_deq(&rx_mod->rxq_free_q, &qe);
1963         rx_mod->rxq_free_count--;
1964         rxq = (struct bna_rxq *)qe;
1965         bfa_q_qe_init(&rxq->qe);
1966
1967         return rxq;
1968 }
1969
1970 static void
1971 bna_rxq_put(struct bna_rx_mod *rx_mod, struct bna_rxq *rxq)
1972 {
1973         bfa_q_qe_init(&rxq->qe);
1974         list_add_tail(&rxq->qe, &rx_mod->rxq_free_q);
1975         rx_mod->rxq_free_count++;
1976 }
1977
1978 static struct bna_rxp *
1979 bna_rxp_get(struct bna_rx_mod *rx_mod)
1980 {
1981         struct list_head        *qe = NULL;
1982         struct bna_rxp *rxp = NULL;
1983
1984         bfa_q_deq(&rx_mod->rxp_free_q, &qe);
1985         rx_mod->rxp_free_count--;
1986         rxp = (struct bna_rxp *)qe;
1987         bfa_q_qe_init(&rxp->qe);
1988
1989         return rxp;
1990 }
1991
1992 static void
1993 bna_rxp_put(struct bna_rx_mod *rx_mod, struct bna_rxp *rxp)
1994 {
1995         bfa_q_qe_init(&rxp->qe);
1996         list_add_tail(&rxp->qe, &rx_mod->rxp_free_q);
1997         rx_mod->rxp_free_count++;
1998 }
1999
2000 static struct bna_rx *
2001 bna_rx_get(struct bna_rx_mod *rx_mod, enum bna_rx_type type)
2002 {
2003         struct list_head        *qe = NULL;
2004         struct bna_rx *rx = NULL;
2005
2006         if (type == BNA_RX_T_REGULAR) {
2007                 bfa_q_deq(&rx_mod->rx_free_q, &qe);
2008         } else
2009                 bfa_q_deq_tail(&rx_mod->rx_free_q, &qe);
2010
2011         rx_mod->rx_free_count--;
2012         rx = (struct bna_rx *)qe;
2013         bfa_q_qe_init(&rx->qe);
2014         list_add_tail(&rx->qe, &rx_mod->rx_active_q);
2015         rx->type = type;
2016
2017         return rx;
2018 }
2019
2020 static void
2021 bna_rx_put(struct bna_rx_mod *rx_mod, struct bna_rx *rx)
2022 {
2023         struct list_head *prev_qe = NULL;
2024         struct list_head *qe;
2025
2026         bfa_q_qe_init(&rx->qe);
2027
2028         list_for_each(qe, &rx_mod->rx_free_q) {
2029                 if (((struct bna_rx *)qe)->rid < rx->rid)
2030                         prev_qe = qe;
2031                 else
2032                         break;
2033         }
2034
2035         if (prev_qe == NULL) {
2036                 /* This is the first entry */
2037                 bfa_q_enq_head(&rx_mod->rx_free_q, &rx->qe);
2038         } else if (bfa_q_next(prev_qe) == &rx_mod->rx_free_q) {
2039                 /* This is the last entry */
2040                 list_add_tail(&rx->qe, &rx_mod->rx_free_q);
2041         } else {
2042                 /* Somewhere in the middle */
2043                 bfa_q_next(&rx->qe) = bfa_q_next(prev_qe);
2044                 bfa_q_prev(&rx->qe) = prev_qe;
2045                 bfa_q_next(prev_qe) = &rx->qe;
2046                 bfa_q_prev(bfa_q_next(&rx->qe)) = &rx->qe;
2047         }
2048
2049         rx_mod->rx_free_count++;
2050 }
2051
2052 static void
2053 bna_rxp_add_rxqs(struct bna_rxp *rxp, struct bna_rxq *q0,
2054                 struct bna_rxq *q1)
2055 {
2056         switch (rxp->type) {
2057         case BNA_RXP_SINGLE:
2058                 rxp->rxq.single.only = q0;
2059                 rxp->rxq.single.reserved = NULL;
2060                 break;
2061         case BNA_RXP_SLR:
2062                 rxp->rxq.slr.large = q0;
2063                 rxp->rxq.slr.small = q1;
2064                 break;
2065         case BNA_RXP_HDS:
2066                 rxp->rxq.hds.data = q0;
2067                 rxp->rxq.hds.hdr = q1;
2068                 break;
2069         default:
2070                 break;
2071         }
2072 }
2073
2074 static void
2075 bna_rxq_qpt_setup(struct bna_rxq *rxq,
2076                 struct bna_rxp *rxp,
2077                 u32 page_count,
2078                 u32 page_size,
2079                 struct bna_mem_descr *qpt_mem,
2080                 struct bna_mem_descr *swqpt_mem,
2081                 struct bna_mem_descr *page_mem)
2082 {
2083         u8 *kva;
2084         u64 dma;
2085         struct bna_dma_addr bna_dma;
2086         int     i;
2087
2088         rxq->qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb;
2089         rxq->qpt.hw_qpt_ptr.msb = qpt_mem->dma.msb;
2090         rxq->qpt.kv_qpt_ptr = qpt_mem->kva;
2091         rxq->qpt.page_count = page_count;
2092         rxq->qpt.page_size = page_size;
2093
2094         rxq->rcb->sw_qpt = (void **) swqpt_mem->kva;
2095         rxq->rcb->sw_q = page_mem->kva;
2096
2097         kva = page_mem->kva;
2098         BNA_GET_DMA_ADDR(&page_mem->dma, dma);
2099
2100         for (i = 0; i < rxq->qpt.page_count; i++) {
2101                 rxq->rcb->sw_qpt[i] = kva;
2102                 kva += PAGE_SIZE;
2103
2104                 BNA_SET_DMA_ADDR(dma, &bna_dma);
2105                 ((struct bna_dma_addr *)rxq->qpt.kv_qpt_ptr)[i].lsb =
2106                         bna_dma.lsb;
2107                 ((struct bna_dma_addr *)rxq->qpt.kv_qpt_ptr)[i].msb =
2108                         bna_dma.msb;
2109                 dma += PAGE_SIZE;
2110         }
2111 }
2112
2113 static void
2114 bna_rxp_cqpt_setup(struct bna_rxp *rxp,
2115                 u32 page_count,
2116                 u32 page_size,
2117                 struct bna_mem_descr *qpt_mem,
2118                 struct bna_mem_descr *swqpt_mem,
2119                 struct bna_mem_descr *page_mem)
2120 {
2121         u8 *kva;
2122         u64 dma;
2123         struct bna_dma_addr bna_dma;
2124         int     i;
2125
2126         rxp->cq.qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb;
2127         rxp->cq.qpt.hw_qpt_ptr.msb = qpt_mem->dma.msb;
2128         rxp->cq.qpt.kv_qpt_ptr = qpt_mem->kva;
2129         rxp->cq.qpt.page_count = page_count;
2130         rxp->cq.qpt.page_size = page_size;
2131
2132         rxp->cq.ccb->sw_qpt = (void **) swqpt_mem->kva;
2133         rxp->cq.ccb->sw_q = page_mem->kva;
2134
2135         kva = page_mem->kva;
2136         BNA_GET_DMA_ADDR(&page_mem->dma, dma);
2137
2138         for (i = 0; i < rxp->cq.qpt.page_count; i++) {
2139                 rxp->cq.ccb->sw_qpt[i] = kva;
2140                 kva += PAGE_SIZE;
2141
2142                 BNA_SET_DMA_ADDR(dma, &bna_dma);
2143                 ((struct bna_dma_addr *)rxp->cq.qpt.kv_qpt_ptr)[i].lsb =
2144                         bna_dma.lsb;
2145                 ((struct bna_dma_addr *)rxp->cq.qpt.kv_qpt_ptr)[i].msb =
2146                         bna_dma.msb;
2147                 dma += PAGE_SIZE;
2148         }
2149 }
2150
2151 static void
2152 bna_rx_mod_cb_rx_stopped(void *arg, struct bna_rx *rx)
2153 {
2154         struct bna_rx_mod *rx_mod = (struct bna_rx_mod *)arg;
2155
2156         bfa_wc_down(&rx_mod->rx_stop_wc);
2157 }
2158
2159 static void
2160 bna_rx_mod_cb_rx_stopped_all(void *arg)
2161 {
2162         struct bna_rx_mod *rx_mod = (struct bna_rx_mod *)arg;
2163
2164         if (rx_mod->stop_cbfn)
2165                 rx_mod->stop_cbfn(&rx_mod->bna->enet);
2166         rx_mod->stop_cbfn = NULL;
2167 }
2168
2169 static void
2170 bna_rx_start(struct bna_rx *rx)
2171 {
2172         rx->rx_flags |= BNA_RX_F_ENET_STARTED;
2173         if (rx->rx_flags & BNA_RX_F_ENABLED)
2174                 bfa_fsm_send_event(rx, RX_E_START);
2175 }
2176
2177 static void
2178 bna_rx_stop(struct bna_rx *rx)
2179 {
2180         rx->rx_flags &= ~BNA_RX_F_ENET_STARTED;
2181         if (rx->fsm == (bfa_fsm_t) bna_rx_sm_stopped)
2182                 bna_rx_mod_cb_rx_stopped(&rx->bna->rx_mod, rx);
2183         else {
2184                 rx->stop_cbfn = bna_rx_mod_cb_rx_stopped;
2185                 rx->stop_cbarg = &rx->bna->rx_mod;
2186                 bfa_fsm_send_event(rx, RX_E_STOP);
2187         }
2188 }
2189
2190 static void
2191 bna_rx_fail(struct bna_rx *rx)
2192 {
2193         /* Indicate Enet is not enabled, and failed */
2194         rx->rx_flags &= ~BNA_RX_F_ENET_STARTED;
2195         bfa_fsm_send_event(rx, RX_E_FAIL);
2196 }
2197
2198 void
2199 bna_rx_mod_start(struct bna_rx_mod *rx_mod, enum bna_rx_type type)
2200 {
2201         struct bna_rx *rx;
2202         struct list_head *qe;
2203
2204         rx_mod->flags |= BNA_RX_MOD_F_ENET_STARTED;
2205         if (type == BNA_RX_T_LOOPBACK)
2206                 rx_mod->flags |= BNA_RX_MOD_F_ENET_LOOPBACK;
2207
2208         list_for_each(qe, &rx_mod->rx_active_q) {
2209                 rx = (struct bna_rx *)qe;
2210                 if (rx->type == type)
2211                         bna_rx_start(rx);
2212         }
2213 }
2214
2215 void
2216 bna_rx_mod_stop(struct bna_rx_mod *rx_mod, enum bna_rx_type type)
2217 {
2218         struct bna_rx *rx;
2219         struct list_head *qe;
2220
2221         rx_mod->flags &= ~BNA_RX_MOD_F_ENET_STARTED;
2222         rx_mod->flags &= ~BNA_RX_MOD_F_ENET_LOOPBACK;
2223
2224         rx_mod->stop_cbfn = bna_enet_cb_rx_stopped;
2225
2226         bfa_wc_init(&rx_mod->rx_stop_wc, bna_rx_mod_cb_rx_stopped_all, rx_mod);
2227
2228         list_for_each(qe, &rx_mod->rx_active_q) {
2229                 rx = (struct bna_rx *)qe;
2230                 if (rx->type == type) {
2231                         bfa_wc_up(&rx_mod->rx_stop_wc);
2232                         bna_rx_stop(rx);
2233                 }
2234         }
2235
2236         bfa_wc_wait(&rx_mod->rx_stop_wc);
2237 }
2238
2239 void
2240 bna_rx_mod_fail(struct bna_rx_mod *rx_mod)
2241 {
2242         struct bna_rx *rx;
2243         struct list_head *qe;
2244
2245         rx_mod->flags &= ~BNA_RX_MOD_F_ENET_STARTED;
2246         rx_mod->flags &= ~BNA_RX_MOD_F_ENET_LOOPBACK;
2247
2248         list_for_each(qe, &rx_mod->rx_active_q) {
2249                 rx = (struct bna_rx *)qe;
2250                 bna_rx_fail(rx);
2251         }
2252 }
2253
2254 void bna_rx_mod_init(struct bna_rx_mod *rx_mod, struct bna *bna,
2255                         struct bna_res_info *res_info)
2256 {
2257         int     index;
2258         struct bna_rx *rx_ptr;
2259         struct bna_rxp *rxp_ptr;
2260         struct bna_rxq *rxq_ptr;
2261
2262         rx_mod->bna = bna;
2263         rx_mod->flags = 0;
2264
2265         rx_mod->rx = (struct bna_rx *)
2266                 res_info[BNA_MOD_RES_MEM_T_RX_ARRAY].res_u.mem_info.mdl[0].kva;
2267         rx_mod->rxp = (struct bna_rxp *)
2268                 res_info[BNA_MOD_RES_MEM_T_RXP_ARRAY].res_u.mem_info.mdl[0].kva;
2269         rx_mod->rxq = (struct bna_rxq *)
2270                 res_info[BNA_MOD_RES_MEM_T_RXQ_ARRAY].res_u.mem_info.mdl[0].kva;
2271
2272         /* Initialize the queues */
2273         INIT_LIST_HEAD(&rx_mod->rx_free_q);
2274         rx_mod->rx_free_count = 0;
2275         INIT_LIST_HEAD(&rx_mod->rxq_free_q);
2276         rx_mod->rxq_free_count = 0;
2277         INIT_LIST_HEAD(&rx_mod->rxp_free_q);
2278         rx_mod->rxp_free_count = 0;
2279         INIT_LIST_HEAD(&rx_mod->rx_active_q);
2280
2281         /* Build RX queues */
2282         for (index = 0; index < bna->ioceth.attr.num_rxp; index++) {
2283                 rx_ptr = &rx_mod->rx[index];
2284
2285                 bfa_q_qe_init(&rx_ptr->qe);
2286                 INIT_LIST_HEAD(&rx_ptr->rxp_q);
2287                 rx_ptr->bna = NULL;
2288                 rx_ptr->rid = index;
2289                 rx_ptr->stop_cbfn = NULL;
2290                 rx_ptr->stop_cbarg = NULL;
2291
2292                 list_add_tail(&rx_ptr->qe, &rx_mod->rx_free_q);
2293                 rx_mod->rx_free_count++;
2294         }
2295
2296         /* build RX-path queue */
2297         for (index = 0; index < bna->ioceth.attr.num_rxp; index++) {
2298                 rxp_ptr = &rx_mod->rxp[index];
2299                 bfa_q_qe_init(&rxp_ptr->qe);
2300                 list_add_tail(&rxp_ptr->qe, &rx_mod->rxp_free_q);
2301                 rx_mod->rxp_free_count++;
2302         }
2303
2304         /* build RXQ queue */
2305         for (index = 0; index < (bna->ioceth.attr.num_rxp * 2); index++) {
2306                 rxq_ptr = &rx_mod->rxq[index];
2307                 bfa_q_qe_init(&rxq_ptr->qe);
2308                 list_add_tail(&rxq_ptr->qe, &rx_mod->rxq_free_q);
2309                 rx_mod->rxq_free_count++;
2310         }
2311 }
2312
2313 void
2314 bna_rx_mod_uninit(struct bna_rx_mod *rx_mod)
2315 {
2316         struct list_head                *qe;
2317         int i;
2318
2319         i = 0;
2320         list_for_each(qe, &rx_mod->rx_free_q)
2321                 i++;
2322
2323         i = 0;
2324         list_for_each(qe, &rx_mod->rxp_free_q)
2325                 i++;
2326
2327         i = 0;
2328         list_for_each(qe, &rx_mod->rxq_free_q)
2329                 i++;
2330
2331         rx_mod->bna = NULL;
2332 }
2333
2334 void
2335 bna_bfi_rx_enet_start_rsp(struct bna_rx *rx, struct bfi_msgq_mhdr *msghdr)
2336 {
2337         struct bfi_enet_rx_cfg_rsp *cfg_rsp = &rx->bfi_enet_cmd.cfg_rsp;
2338         struct bna_rxp *rxp = NULL;
2339         struct bna_rxq *q0 = NULL, *q1 = NULL;
2340         struct list_head *rxp_qe;
2341         int i;
2342
2343         bfa_msgq_rsp_copy(&rx->bna->msgq, (u8 *)cfg_rsp,
2344                 sizeof(struct bfi_enet_rx_cfg_rsp));
2345
2346         rx->hw_id = cfg_rsp->hw_id;
2347
2348         for (i = 0, rxp_qe = bfa_q_first(&rx->rxp_q);
2349                 i < rx->num_paths;
2350                 i++, rxp_qe = bfa_q_next(rxp_qe)) {
2351                 rxp = (struct bna_rxp *)rxp_qe;
2352                 GET_RXQS(rxp, q0, q1);
2353
2354                 /* Setup doorbells */
2355                 rxp->cq.ccb->i_dbell->doorbell_addr =
2356                         rx->bna->pcidev.pci_bar_kva
2357                         + ntohl(cfg_rsp->q_handles[i].i_dbell);
2358                 rxp->hw_id = cfg_rsp->q_handles[i].hw_cqid;
2359                 q0->rcb->q_dbell =
2360                         rx->bna->pcidev.pci_bar_kva
2361                         + ntohl(cfg_rsp->q_handles[i].ql_dbell);
2362                 q0->hw_id = cfg_rsp->q_handles[i].hw_lqid;
2363                 if (q1) {
2364                         q1->rcb->q_dbell =
2365                         rx->bna->pcidev.pci_bar_kva
2366                         + ntohl(cfg_rsp->q_handles[i].qs_dbell);
2367                         q1->hw_id = cfg_rsp->q_handles[i].hw_sqid;
2368                 }
2369
2370                 /* Initialize producer/consumer indexes */
2371                 (*rxp->cq.ccb->hw_producer_index) = 0;
2372                 rxp->cq.ccb->producer_index = 0;
2373                 q0->rcb->producer_index = q0->rcb->consumer_index = 0;
2374                 if (q1)
2375                         q1->rcb->producer_index = q1->rcb->consumer_index = 0;
2376         }
2377
2378         bfa_fsm_send_event(rx, RX_E_STARTED);
2379 }
2380
2381 void
2382 bna_bfi_rx_enet_stop_rsp(struct bna_rx *rx, struct bfi_msgq_mhdr *msghdr)
2383 {
2384         bfa_fsm_send_event(rx, RX_E_STOPPED);
2385 }
2386
2387 void
2388 bna_rx_res_req(struct bna_rx_config *q_cfg, struct bna_res_info *res_info)
2389 {
2390         u32 cq_size, hq_size, dq_size;
2391         u32 cpage_count, hpage_count, dpage_count;
2392         struct bna_mem_info *mem_info;
2393         u32 cq_depth;
2394         u32 hq_depth;
2395         u32 dq_depth;
2396
2397         dq_depth = q_cfg->q0_depth;
2398         hq_depth = ((q_cfg->rxp_type == BNA_RXP_SINGLE) ? 0 : q_cfg->q1_depth);
2399         cq_depth = dq_depth + hq_depth;
2400
2401         BNA_TO_POWER_OF_2_HIGH(cq_depth);
2402         cq_size = cq_depth * BFI_CQ_WI_SIZE;
2403         cq_size = ALIGN(cq_size, PAGE_SIZE);
2404         cpage_count = SIZE_TO_PAGES(cq_size);
2405
2406         BNA_TO_POWER_OF_2_HIGH(dq_depth);
2407         dq_size = dq_depth * BFI_RXQ_WI_SIZE;
2408         dq_size = ALIGN(dq_size, PAGE_SIZE);
2409         dpage_count = SIZE_TO_PAGES(dq_size);
2410
2411         if (BNA_RXP_SINGLE != q_cfg->rxp_type) {
2412                 BNA_TO_POWER_OF_2_HIGH(hq_depth);
2413                 hq_size = hq_depth * BFI_RXQ_WI_SIZE;
2414                 hq_size = ALIGN(hq_size, PAGE_SIZE);
2415                 hpage_count = SIZE_TO_PAGES(hq_size);
2416         } else
2417                 hpage_count = 0;
2418
2419         res_info[BNA_RX_RES_MEM_T_CCB].res_type = BNA_RES_T_MEM;
2420         mem_info = &res_info[BNA_RX_RES_MEM_T_CCB].res_u.mem_info;
2421         mem_info->mem_type = BNA_MEM_T_KVA;
2422         mem_info->len = sizeof(struct bna_ccb);
2423         mem_info->num = q_cfg->num_paths;
2424
2425         res_info[BNA_RX_RES_MEM_T_RCB].res_type = BNA_RES_T_MEM;
2426         mem_info = &res_info[BNA_RX_RES_MEM_T_RCB].res_u.mem_info;
2427         mem_info->mem_type = BNA_MEM_T_KVA;
2428         mem_info->len = sizeof(struct bna_rcb);
2429         mem_info->num = BNA_GET_RXQS(q_cfg);
2430
2431         res_info[BNA_RX_RES_MEM_T_CQPT].res_type = BNA_RES_T_MEM;
2432         mem_info = &res_info[BNA_RX_RES_MEM_T_CQPT].res_u.mem_info;
2433         mem_info->mem_type = BNA_MEM_T_DMA;
2434         mem_info->len = cpage_count * sizeof(struct bna_dma_addr);
2435         mem_info->num = q_cfg->num_paths;
2436
2437         res_info[BNA_RX_RES_MEM_T_CSWQPT].res_type = BNA_RES_T_MEM;
2438         mem_info = &res_info[BNA_RX_RES_MEM_T_CSWQPT].res_u.mem_info;
2439         mem_info->mem_type = BNA_MEM_T_KVA;
2440         mem_info->len = cpage_count * sizeof(void *);
2441         mem_info->num = q_cfg->num_paths;
2442
2443         res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_type = BNA_RES_T_MEM;
2444         mem_info = &res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info;
2445         mem_info->mem_type = BNA_MEM_T_DMA;
2446         mem_info->len = PAGE_SIZE * cpage_count;
2447         mem_info->num = q_cfg->num_paths;
2448
2449         res_info[BNA_RX_RES_MEM_T_DQPT].res_type = BNA_RES_T_MEM;
2450         mem_info = &res_info[BNA_RX_RES_MEM_T_DQPT].res_u.mem_info;
2451         mem_info->mem_type = BNA_MEM_T_DMA;
2452         mem_info->len = dpage_count * sizeof(struct bna_dma_addr);
2453         mem_info->num = q_cfg->num_paths;
2454
2455         res_info[BNA_RX_RES_MEM_T_DSWQPT].res_type = BNA_RES_T_MEM;
2456         mem_info = &res_info[BNA_RX_RES_MEM_T_DSWQPT].res_u.mem_info;
2457         mem_info->mem_type = BNA_MEM_T_KVA;
2458         mem_info->len = dpage_count * sizeof(void *);
2459         mem_info->num = q_cfg->num_paths;
2460
2461         res_info[BNA_RX_RES_MEM_T_DPAGE].res_type = BNA_RES_T_MEM;
2462         mem_info = &res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info;
2463         mem_info->mem_type = BNA_MEM_T_DMA;
2464         mem_info->len = PAGE_SIZE * dpage_count;
2465         mem_info->num = q_cfg->num_paths;
2466
2467         res_info[BNA_RX_RES_MEM_T_HQPT].res_type = BNA_RES_T_MEM;
2468         mem_info = &res_info[BNA_RX_RES_MEM_T_HQPT].res_u.mem_info;
2469         mem_info->mem_type = BNA_MEM_T_DMA;
2470         mem_info->len = hpage_count * sizeof(struct bna_dma_addr);
2471         mem_info->num = (hpage_count ? q_cfg->num_paths : 0);
2472
2473         res_info[BNA_RX_RES_MEM_T_HSWQPT].res_type = BNA_RES_T_MEM;
2474         mem_info = &res_info[BNA_RX_RES_MEM_T_HSWQPT].res_u.mem_info;
2475         mem_info->mem_type = BNA_MEM_T_KVA;
2476         mem_info->len = hpage_count * sizeof(void *);
2477         mem_info->num = (hpage_count ? q_cfg->num_paths : 0);
2478
2479         res_info[BNA_RX_RES_MEM_T_HPAGE].res_type = BNA_RES_T_MEM;
2480         mem_info = &res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info;
2481         mem_info->mem_type = BNA_MEM_T_DMA;
2482         mem_info->len = PAGE_SIZE * hpage_count;
2483         mem_info->num = (hpage_count ? q_cfg->num_paths : 0);
2484
2485         res_info[BNA_RX_RES_MEM_T_IBIDX].res_type = BNA_RES_T_MEM;
2486         mem_info = &res_info[BNA_RX_RES_MEM_T_IBIDX].res_u.mem_info;
2487         mem_info->mem_type = BNA_MEM_T_DMA;
2488         mem_info->len = BFI_IBIDX_SIZE;
2489         mem_info->num = q_cfg->num_paths;
2490
2491         res_info[BNA_RX_RES_MEM_T_RIT].res_type = BNA_RES_T_MEM;
2492         mem_info = &res_info[BNA_RX_RES_MEM_T_RIT].res_u.mem_info;
2493         mem_info->mem_type = BNA_MEM_T_KVA;
2494         mem_info->len = BFI_ENET_RSS_RIT_MAX;
2495         mem_info->num = 1;
2496
2497         res_info[BNA_RX_RES_T_INTR].res_type = BNA_RES_T_INTR;
2498         res_info[BNA_RX_RES_T_INTR].res_u.intr_info.intr_type = BNA_INTR_T_MSIX;
2499         res_info[BNA_RX_RES_T_INTR].res_u.intr_info.num = q_cfg->num_paths;
2500 }
2501
2502 struct bna_rx *
2503 bna_rx_create(struct bna *bna, struct bnad *bnad,
2504                 struct bna_rx_config *rx_cfg,
2505                 const struct bna_rx_event_cbfn *rx_cbfn,
2506                 struct bna_res_info *res_info,
2507                 void *priv)
2508 {
2509         struct bna_rx_mod *rx_mod = &bna->rx_mod;
2510         struct bna_rx *rx;
2511         struct bna_rxp *rxp;
2512         struct bna_rxq *q0;
2513         struct bna_rxq *q1;
2514         struct bna_intr_info *intr_info;
2515         struct bna_mem_descr *hqunmap_mem;
2516         struct bna_mem_descr *dqunmap_mem;
2517         struct bna_mem_descr *ccb_mem;
2518         struct bna_mem_descr *rcb_mem;
2519         struct bna_mem_descr *cqpt_mem;
2520         struct bna_mem_descr *cswqpt_mem;
2521         struct bna_mem_descr *cpage_mem;
2522         struct bna_mem_descr *hqpt_mem;
2523         struct bna_mem_descr *dqpt_mem;
2524         struct bna_mem_descr *hsqpt_mem;
2525         struct bna_mem_descr *dsqpt_mem;
2526         struct bna_mem_descr *hpage_mem;
2527         struct bna_mem_descr *dpage_mem;
2528         u32 dpage_count, hpage_count;
2529         u32 hq_idx, dq_idx, rcb_idx;
2530         u32 cq_depth, i;
2531         u32 page_count;
2532
2533         if (!bna_rx_res_check(rx_mod, rx_cfg))
2534                 return NULL;
2535
2536         intr_info = &res_info[BNA_RX_RES_T_INTR].res_u.intr_info;
2537         ccb_mem = &res_info[BNA_RX_RES_MEM_T_CCB].res_u.mem_info.mdl[0];
2538         rcb_mem = &res_info[BNA_RX_RES_MEM_T_RCB].res_u.mem_info.mdl[0];
2539         dqunmap_mem = &res_info[BNA_RX_RES_MEM_T_UNMAPDQ].res_u.mem_info.mdl[0];
2540         hqunmap_mem = &res_info[BNA_RX_RES_MEM_T_UNMAPHQ].res_u.mem_info.mdl[0];
2541         cqpt_mem = &res_info[BNA_RX_RES_MEM_T_CQPT].res_u.mem_info.mdl[0];
2542         cswqpt_mem = &res_info[BNA_RX_RES_MEM_T_CSWQPT].res_u.mem_info.mdl[0];
2543         cpage_mem = &res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info.mdl[0];
2544         hqpt_mem = &res_info[BNA_RX_RES_MEM_T_HQPT].res_u.mem_info.mdl[0];
2545         dqpt_mem = &res_info[BNA_RX_RES_MEM_T_DQPT].res_u.mem_info.mdl[0];
2546         hsqpt_mem = &res_info[BNA_RX_RES_MEM_T_HSWQPT].res_u.mem_info.mdl[0];
2547         dsqpt_mem = &res_info[BNA_RX_RES_MEM_T_DSWQPT].res_u.mem_info.mdl[0];
2548         hpage_mem = &res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info.mdl[0];
2549         dpage_mem = &res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info.mdl[0];
2550
2551         page_count = res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info.len /
2552                         PAGE_SIZE;
2553
2554         dpage_count = res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info.len /
2555                         PAGE_SIZE;
2556
2557         hpage_count = res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info.len /
2558                         PAGE_SIZE;
2559
2560         rx = bna_rx_get(rx_mod, rx_cfg->rx_type);
2561         rx->bna = bna;
2562         rx->rx_flags = 0;
2563         INIT_LIST_HEAD(&rx->rxp_q);
2564         rx->stop_cbfn = NULL;
2565         rx->stop_cbarg = NULL;
2566         rx->priv = priv;
2567
2568         rx->rcb_setup_cbfn = rx_cbfn->rcb_setup_cbfn;
2569         rx->rcb_destroy_cbfn = rx_cbfn->rcb_destroy_cbfn;
2570         rx->ccb_setup_cbfn = rx_cbfn->ccb_setup_cbfn;
2571         rx->ccb_destroy_cbfn = rx_cbfn->ccb_destroy_cbfn;
2572         rx->rx_stall_cbfn = rx_cbfn->rx_stall_cbfn;
2573         /* Following callbacks are mandatory */
2574         rx->rx_cleanup_cbfn = rx_cbfn->rx_cleanup_cbfn;
2575         rx->rx_post_cbfn = rx_cbfn->rx_post_cbfn;
2576
2577         if (rx->bna->rx_mod.flags & BNA_RX_MOD_F_ENET_STARTED) {
2578                 switch (rx->type) {
2579                 case BNA_RX_T_REGULAR:
2580                         if (!(rx->bna->rx_mod.flags &
2581                                 BNA_RX_MOD_F_ENET_LOOPBACK))
2582                                 rx->rx_flags |= BNA_RX_F_ENET_STARTED;
2583                         break;
2584                 case BNA_RX_T_LOOPBACK:
2585                         if (rx->bna->rx_mod.flags & BNA_RX_MOD_F_ENET_LOOPBACK)
2586                                 rx->rx_flags |= BNA_RX_F_ENET_STARTED;
2587                         break;
2588                 }
2589         }
2590
2591         rx->num_paths = rx_cfg->num_paths;
2592         for (i = 0, hq_idx = 0, dq_idx = 0, rcb_idx = 0;
2593                         i < rx->num_paths; i++) {
2594                 rxp = bna_rxp_get(rx_mod);
2595                 list_add_tail(&rxp->qe, &rx->rxp_q);
2596                 rxp->type = rx_cfg->rxp_type;
2597                 rxp->rx = rx;
2598                 rxp->cq.rx = rx;
2599
2600                 q0 = bna_rxq_get(rx_mod);
2601                 if (BNA_RXP_SINGLE == rx_cfg->rxp_type)
2602                         q1 = NULL;
2603                 else
2604                         q1 = bna_rxq_get(rx_mod);
2605
2606                 if (1 == intr_info->num)
2607                         rxp->vector = intr_info->idl[0].vector;
2608                 else
2609                         rxp->vector = intr_info->idl[i].vector;
2610
2611                 /* Setup IB */
2612
2613                 rxp->cq.ib.ib_seg_host_addr.lsb =
2614                 res_info[BNA_RX_RES_MEM_T_IBIDX].res_u.mem_info.mdl[i].dma.lsb;
2615                 rxp->cq.ib.ib_seg_host_addr.msb =
2616                 res_info[BNA_RX_RES_MEM_T_IBIDX].res_u.mem_info.mdl[i].dma.msb;
2617                 rxp->cq.ib.ib_seg_host_addr_kva =
2618                 res_info[BNA_RX_RES_MEM_T_IBIDX].res_u.mem_info.mdl[i].kva;
2619                 rxp->cq.ib.intr_type = intr_info->intr_type;
2620                 if (intr_info->intr_type == BNA_INTR_T_MSIX)
2621                         rxp->cq.ib.intr_vector = rxp->vector;
2622                 else
2623                         rxp->cq.ib.intr_vector = (1 << rxp->vector);
2624                 rxp->cq.ib.coalescing_timeo = rx_cfg->coalescing_timeo;
2625                 rxp->cq.ib.interpkt_count = BFI_RX_INTERPKT_COUNT;
2626                 rxp->cq.ib.interpkt_timeo = BFI_RX_INTERPKT_TIMEO;
2627
2628                 bna_rxp_add_rxqs(rxp, q0, q1);
2629
2630                 /* Setup large Q */
2631
2632                 q0->rx = rx;
2633                 q0->rxp = rxp;
2634
2635                 q0->rcb = (struct bna_rcb *) rcb_mem[rcb_idx].kva;
2636                 q0->rcb->unmap_q = (void *)dqunmap_mem[dq_idx].kva;
2637                 rcb_idx++; dq_idx++;
2638                 q0->rcb->q_depth = rx_cfg->q0_depth;
2639                 q0->q_depth = rx_cfg->q0_depth;
2640                 q0->multi_buffer = rx_cfg->q0_multi_buf;
2641                 q0->buffer_size = rx_cfg->q0_buf_size;
2642                 q0->num_vecs = rx_cfg->q0_num_vecs;
2643                 q0->rcb->rxq = q0;
2644                 q0->rcb->bnad = bna->bnad;
2645                 q0->rcb->id = 0;
2646                 q0->rx_packets = q0->rx_bytes = 0;
2647                 q0->rx_packets_with_error = q0->rxbuf_alloc_failed = 0;
2648
2649                 bna_rxq_qpt_setup(q0, rxp, dpage_count, PAGE_SIZE,
2650                         &dqpt_mem[i], &dsqpt_mem[i], &dpage_mem[i]);
2651
2652                 if (rx->rcb_setup_cbfn)
2653                         rx->rcb_setup_cbfn(bnad, q0->rcb);
2654
2655                 /* Setup small Q */
2656
2657                 if (q1) {
2658                         q1->rx = rx;
2659                         q1->rxp = rxp;
2660
2661                         q1->rcb = (struct bna_rcb *) rcb_mem[rcb_idx].kva;
2662                         q1->rcb->unmap_q = (void *)hqunmap_mem[hq_idx].kva;
2663                         rcb_idx++; hq_idx++;
2664                         q1->rcb->q_depth = rx_cfg->q1_depth;
2665                         q1->q_depth = rx_cfg->q1_depth;
2666                         q1->multi_buffer = BNA_STATUS_T_DISABLED;
2667                         q1->num_vecs = 1;
2668                         q1->rcb->rxq = q1;
2669                         q1->rcb->bnad = bna->bnad;
2670                         q1->rcb->id = 1;
2671                         q1->buffer_size = (rx_cfg->rxp_type == BNA_RXP_HDS) ?
2672                                         rx_cfg->hds_config.forced_offset
2673                                         : rx_cfg->q1_buf_size;
2674                         q1->rx_packets = q1->rx_bytes = 0;
2675                         q1->rx_packets_with_error = q1->rxbuf_alloc_failed = 0;
2676
2677                         bna_rxq_qpt_setup(q1, rxp, hpage_count, PAGE_SIZE,
2678                                 &hqpt_mem[i], &hsqpt_mem[i],
2679                                 &hpage_mem[i]);
2680
2681                         if (rx->rcb_setup_cbfn)
2682                                 rx->rcb_setup_cbfn(bnad, q1->rcb);
2683                 }
2684
2685                 /* Setup CQ */
2686
2687                 rxp->cq.ccb = (struct bna_ccb *) ccb_mem[i].kva;
2688                 cq_depth = rx_cfg->q0_depth +
2689                         ((rx_cfg->rxp_type == BNA_RXP_SINGLE) ?
2690                          0 : rx_cfg->q1_depth);
2691                 /* if multi-buffer is enabled sum of q0_depth
2692                  * and q1_depth need not be a power of 2
2693                  */
2694                 BNA_TO_POWER_OF_2_HIGH(cq_depth);
2695                 rxp->cq.ccb->q_depth = cq_depth;
2696                 rxp->cq.ccb->cq = &rxp->cq;
2697                 rxp->cq.ccb->rcb[0] = q0->rcb;
2698                 q0->rcb->ccb = rxp->cq.ccb;
2699                 if (q1) {
2700                         rxp->cq.ccb->rcb[1] = q1->rcb;
2701                         q1->rcb->ccb = rxp->cq.ccb;
2702                 }
2703                 rxp->cq.ccb->hw_producer_index =
2704                         (u32 *)rxp->cq.ib.ib_seg_host_addr_kva;
2705                 rxp->cq.ccb->i_dbell = &rxp->cq.ib.door_bell;
2706                 rxp->cq.ccb->intr_type = rxp->cq.ib.intr_type;
2707                 rxp->cq.ccb->intr_vector = rxp->cq.ib.intr_vector;
2708                 rxp->cq.ccb->rx_coalescing_timeo =
2709                         rxp->cq.ib.coalescing_timeo;
2710                 rxp->cq.ccb->pkt_rate.small_pkt_cnt = 0;
2711                 rxp->cq.ccb->pkt_rate.large_pkt_cnt = 0;
2712                 rxp->cq.ccb->bnad = bna->bnad;
2713                 rxp->cq.ccb->id = i;
2714
2715                 bna_rxp_cqpt_setup(rxp, page_count, PAGE_SIZE,
2716                         &cqpt_mem[i], &cswqpt_mem[i], &cpage_mem[i]);
2717
2718                 if (rx->ccb_setup_cbfn)
2719                         rx->ccb_setup_cbfn(bnad, rxp->cq.ccb);
2720         }
2721
2722         rx->hds_cfg = rx_cfg->hds_config;
2723
2724         bna_rxf_init(&rx->rxf, rx, rx_cfg, res_info);
2725
2726         bfa_fsm_set_state(rx, bna_rx_sm_stopped);
2727
2728         rx_mod->rid_mask |= (1 << rx->rid);
2729
2730         return rx;
2731 }
2732
2733 void
2734 bna_rx_destroy(struct bna_rx *rx)
2735 {
2736         struct bna_rx_mod *rx_mod = &rx->bna->rx_mod;
2737         struct bna_rxq *q0 = NULL;
2738         struct bna_rxq *q1 = NULL;
2739         struct bna_rxp *rxp;
2740         struct list_head *qe;
2741
2742         bna_rxf_uninit(&rx->rxf);
2743
2744         while (!list_empty(&rx->rxp_q)) {
2745                 bfa_q_deq(&rx->rxp_q, &rxp);
2746                 GET_RXQS(rxp, q0, q1);
2747                 if (rx->rcb_destroy_cbfn)
2748                         rx->rcb_destroy_cbfn(rx->bna->bnad, q0->rcb);
2749                 q0->rcb = NULL;
2750                 q0->rxp = NULL;
2751                 q0->rx = NULL;
2752                 bna_rxq_put(rx_mod, q0);
2753
2754                 if (q1) {
2755                         if (rx->rcb_destroy_cbfn)
2756                                 rx->rcb_destroy_cbfn(rx->bna->bnad, q1->rcb);
2757                         q1->rcb = NULL;
2758                         q1->rxp = NULL;
2759                         q1->rx = NULL;
2760                         bna_rxq_put(rx_mod, q1);
2761                 }
2762                 rxp->rxq.slr.large = NULL;
2763                 rxp->rxq.slr.small = NULL;
2764
2765                 if (rx->ccb_destroy_cbfn)
2766                         rx->ccb_destroy_cbfn(rx->bna->bnad, rxp->cq.ccb);
2767                 rxp->cq.ccb = NULL;
2768                 rxp->rx = NULL;
2769                 bna_rxp_put(rx_mod, rxp);
2770         }
2771
2772         list_for_each(qe, &rx_mod->rx_active_q) {
2773                 if (qe == &rx->qe) {
2774                         list_del(&rx->qe);
2775                         bfa_q_qe_init(&rx->qe);
2776                         break;
2777                 }
2778         }
2779
2780         rx_mod->rid_mask &= ~(1 << rx->rid);
2781
2782         rx->bna = NULL;
2783         rx->priv = NULL;
2784         bna_rx_put(rx_mod, rx);
2785 }
2786
2787 void
2788 bna_rx_enable(struct bna_rx *rx)
2789 {
2790         if (rx->fsm != (bfa_sm_t)bna_rx_sm_stopped)
2791                 return;
2792
2793         rx->rx_flags |= BNA_RX_F_ENABLED;
2794         if (rx->rx_flags & BNA_RX_F_ENET_STARTED)
2795                 bfa_fsm_send_event(rx, RX_E_START);
2796 }
2797
2798 void
2799 bna_rx_disable(struct bna_rx *rx, enum bna_cleanup_type type,
2800                 void (*cbfn)(void *, struct bna_rx *))
2801 {
2802         if (type == BNA_SOFT_CLEANUP) {
2803                 /* h/w should not be accessed. Treat we're stopped */
2804                 (*cbfn)(rx->bna->bnad, rx);
2805         } else {
2806                 rx->stop_cbfn = cbfn;
2807                 rx->stop_cbarg = rx->bna->bnad;
2808
2809                 rx->rx_flags &= ~BNA_RX_F_ENABLED;
2810
2811                 bfa_fsm_send_event(rx, RX_E_STOP);
2812         }
2813 }
2814
2815 void
2816 bna_rx_cleanup_complete(struct bna_rx *rx)
2817 {
2818         bfa_fsm_send_event(rx, RX_E_CLEANUP_DONE);
2819 }
2820
2821 void
2822 bna_rx_vlan_strip_enable(struct bna_rx *rx)
2823 {
2824         struct bna_rxf *rxf = &rx->rxf;
2825
2826         if (rxf->vlan_strip_status == BNA_STATUS_T_DISABLED) {
2827                 rxf->vlan_strip_status = BNA_STATUS_T_ENABLED;
2828                 rxf->vlan_strip_pending = true;
2829                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
2830         }
2831 }
2832
2833 void
2834 bna_rx_vlan_strip_disable(struct bna_rx *rx)
2835 {
2836         struct bna_rxf *rxf = &rx->rxf;
2837
2838         if (rxf->vlan_strip_status != BNA_STATUS_T_DISABLED) {
2839                 rxf->vlan_strip_status = BNA_STATUS_T_DISABLED;
2840                 rxf->vlan_strip_pending = true;
2841                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
2842         }
2843 }
2844
2845 enum bna_cb_status
2846 bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode new_mode,
2847                 enum bna_rxmode bitmask,
2848                 void (*cbfn)(struct bnad *, struct bna_rx *))
2849 {
2850         struct bna_rxf *rxf = &rx->rxf;
2851         int need_hw_config = 0;
2852
2853         /* Error checks */
2854
2855         if (is_promisc_enable(new_mode, bitmask)) {
2856                 /* If promisc mode is already enabled elsewhere in the system */
2857                 if ((rx->bna->promisc_rid != BFI_INVALID_RID) &&
2858                         (rx->bna->promisc_rid != rxf->rx->rid))
2859                         goto err_return;
2860
2861                 /* If default mode is already enabled in the system */
2862                 if (rx->bna->default_mode_rid != BFI_INVALID_RID)
2863                         goto err_return;
2864
2865                 /* Trying to enable promiscuous and default mode together */
2866                 if (is_default_enable(new_mode, bitmask))
2867                         goto err_return;
2868         }
2869
2870         if (is_default_enable(new_mode, bitmask)) {
2871                 /* If default mode is already enabled elsewhere in the system */
2872                 if ((rx->bna->default_mode_rid != BFI_INVALID_RID) &&
2873                         (rx->bna->default_mode_rid != rxf->rx->rid)) {
2874                                 goto err_return;
2875                 }
2876
2877                 /* If promiscuous mode is already enabled in the system */
2878                 if (rx->bna->promisc_rid != BFI_INVALID_RID)
2879                         goto err_return;
2880         }
2881
2882         /* Process the commands */
2883
2884         if (is_promisc_enable(new_mode, bitmask)) {
2885                 if (bna_rxf_promisc_enable(rxf))
2886                         need_hw_config = 1;
2887         } else if (is_promisc_disable(new_mode, bitmask)) {
2888                 if (bna_rxf_promisc_disable(rxf))
2889                         need_hw_config = 1;
2890         }
2891
2892         if (is_allmulti_enable(new_mode, bitmask)) {
2893                 if (bna_rxf_allmulti_enable(rxf))
2894                         need_hw_config = 1;
2895         } else if (is_allmulti_disable(new_mode, bitmask)) {
2896                 if (bna_rxf_allmulti_disable(rxf))
2897                         need_hw_config = 1;
2898         }
2899
2900         /* Trigger h/w if needed */
2901
2902         if (need_hw_config) {
2903                 rxf->cam_fltr_cbfn = cbfn;
2904                 rxf->cam_fltr_cbarg = rx->bna->bnad;
2905                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
2906         } else if (cbfn)
2907                 (*cbfn)(rx->bna->bnad, rx);
2908
2909         return BNA_CB_SUCCESS;
2910
2911 err_return:
2912         return BNA_CB_FAIL;
2913 }
2914
2915 void
2916 bna_rx_vlanfilter_enable(struct bna_rx *rx)
2917 {
2918         struct bna_rxf *rxf = &rx->rxf;
2919
2920         if (rxf->vlan_filter_status == BNA_STATUS_T_DISABLED) {
2921                 rxf->vlan_filter_status = BNA_STATUS_T_ENABLED;
2922                 rxf->vlan_pending_bitmask = (u8)BFI_VLAN_BMASK_ALL;
2923                 bfa_fsm_send_event(rxf, RXF_E_CONFIG);
2924         }
2925 }
2926
2927 void
2928 bna_rx_coalescing_timeo_set(struct bna_rx *rx, int coalescing_timeo)
2929 {
2930         struct bna_rxp *rxp;
2931         struct list_head *qe;
2932
2933         list_for_each(qe, &rx->rxp_q) {
2934                 rxp = (struct bna_rxp *)qe;
2935                 rxp->cq.ccb->rx_coalescing_timeo = coalescing_timeo;
2936                 bna_ib_coalescing_timeo_set(&rxp->cq.ib, coalescing_timeo);
2937         }
2938 }
2939
2940 void
2941 bna_rx_dim_reconfig(struct bna *bna, const u32 vector[][BNA_BIAS_T_MAX])
2942 {
2943         int i, j;
2944
2945         for (i = 0; i < BNA_LOAD_T_MAX; i++)
2946                 for (j = 0; j < BNA_BIAS_T_MAX; j++)
2947                         bna->rx_mod.dim_vector[i][j] = vector[i][j];
2948 }
2949
2950 void
2951 bna_rx_dim_update(struct bna_ccb *ccb)
2952 {
2953         struct bna *bna = ccb->cq->rx->bna;
2954         u32 load, bias;
2955         u32 pkt_rt, small_rt, large_rt;
2956         u8 coalescing_timeo;
2957
2958         if ((ccb->pkt_rate.small_pkt_cnt == 0) &&
2959                 (ccb->pkt_rate.large_pkt_cnt == 0))
2960                 return;
2961
2962         /* Arrive at preconfigured coalescing timeo value based on pkt rate */
2963
2964         small_rt = ccb->pkt_rate.small_pkt_cnt;
2965         large_rt = ccb->pkt_rate.large_pkt_cnt;
2966
2967         pkt_rt = small_rt + large_rt;
2968
2969         if (pkt_rt < BNA_PKT_RATE_10K)
2970                 load = BNA_LOAD_T_LOW_4;
2971         else if (pkt_rt < BNA_PKT_RATE_20K)
2972                 load = BNA_LOAD_T_LOW_3;
2973         else if (pkt_rt < BNA_PKT_RATE_30K)
2974                 load = BNA_LOAD_T_LOW_2;
2975         else if (pkt_rt < BNA_PKT_RATE_40K)
2976                 load = BNA_LOAD_T_LOW_1;
2977         else if (pkt_rt < BNA_PKT_RATE_50K)
2978                 load = BNA_LOAD_T_HIGH_1;
2979         else if (pkt_rt < BNA_PKT_RATE_60K)
2980                 load = BNA_LOAD_T_HIGH_2;
2981         else if (pkt_rt < BNA_PKT_RATE_80K)
2982                 load = BNA_LOAD_T_HIGH_3;
2983         else
2984                 load = BNA_LOAD_T_HIGH_4;
2985
2986         if (small_rt > (large_rt << 1))
2987                 bias = 0;
2988         else
2989                 bias = 1;
2990
2991         ccb->pkt_rate.small_pkt_cnt = 0;
2992         ccb->pkt_rate.large_pkt_cnt = 0;
2993
2994         coalescing_timeo = bna->rx_mod.dim_vector[load][bias];
2995         ccb->rx_coalescing_timeo = coalescing_timeo;
2996
2997         /* Set it to IB */
2998         bna_ib_coalescing_timeo_set(&ccb->cq->ib, coalescing_timeo);
2999 }
3000
3001 const u32 bna_napi_dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX] = {
3002         {12, 12},
3003         {6, 10},
3004         {5, 10},
3005         {4, 8},
3006         {3, 6},
3007         {3, 6},
3008         {2, 4},
3009         {1, 2},
3010 };
3011
3012 /* TX */
3013
3014 #define call_tx_stop_cbfn(tx)                                           \
3015 do {                                                                    \
3016         if ((tx)->stop_cbfn) {                                          \
3017                 void (*cbfn)(void *, struct bna_tx *);          \
3018                 void *cbarg;                                            \
3019                 cbfn = (tx)->stop_cbfn;                                 \
3020                 cbarg = (tx)->stop_cbarg;                               \
3021                 (tx)->stop_cbfn = NULL;                                 \
3022                 (tx)->stop_cbarg = NULL;                                \
3023                 cbfn(cbarg, (tx));                                      \
3024         }                                                               \
3025 } while (0)
3026
3027 #define call_tx_prio_change_cbfn(tx)                                    \
3028 do {                                                                    \
3029         if ((tx)->prio_change_cbfn) {                                   \
3030                 void (*cbfn)(struct bnad *, struct bna_tx *);   \
3031                 cbfn = (tx)->prio_change_cbfn;                          \
3032                 (tx)->prio_change_cbfn = NULL;                          \
3033                 cbfn((tx)->bna->bnad, (tx));                            \
3034         }                                                               \
3035 } while (0)
3036
3037 static void bna_tx_mod_cb_tx_stopped(void *tx_mod, struct bna_tx *tx);
3038 static void bna_bfi_tx_enet_start(struct bna_tx *tx);
3039 static void bna_tx_enet_stop(struct bna_tx *tx);
3040
3041 enum bna_tx_event {
3042         TX_E_START                      = 1,
3043         TX_E_STOP                       = 2,
3044         TX_E_FAIL                       = 3,
3045         TX_E_STARTED                    = 4,
3046         TX_E_STOPPED                    = 5,
3047         TX_E_PRIO_CHANGE                = 6,
3048         TX_E_CLEANUP_DONE               = 7,
3049         TX_E_BW_UPDATE                  = 8,
3050 };
3051
3052 bfa_fsm_state_decl(bna_tx, stopped, struct bna_tx, enum bna_tx_event);
3053 bfa_fsm_state_decl(bna_tx, start_wait, struct bna_tx, enum bna_tx_event);
3054 bfa_fsm_state_decl(bna_tx, started, struct bna_tx, enum bna_tx_event);
3055 bfa_fsm_state_decl(bna_tx, stop_wait, struct bna_tx, enum bna_tx_event);
3056 bfa_fsm_state_decl(bna_tx, cleanup_wait, struct bna_tx,
3057                         enum bna_tx_event);
3058 bfa_fsm_state_decl(bna_tx, prio_stop_wait, struct bna_tx,
3059                         enum bna_tx_event);
3060 bfa_fsm_state_decl(bna_tx, prio_cleanup_wait, struct bna_tx,
3061                         enum bna_tx_event);
3062 bfa_fsm_state_decl(bna_tx, failed, struct bna_tx, enum bna_tx_event);
3063 bfa_fsm_state_decl(bna_tx, quiesce_wait, struct bna_tx,
3064                         enum bna_tx_event);
3065
3066 static void
3067 bna_tx_sm_stopped_entry(struct bna_tx *tx)
3068 {
3069         call_tx_stop_cbfn(tx);
3070 }
3071
3072 static void
3073 bna_tx_sm_stopped(struct bna_tx *tx, enum bna_tx_event event)
3074 {
3075         switch (event) {
3076         case TX_E_START:
3077                 bfa_fsm_set_state(tx, bna_tx_sm_start_wait);
3078                 break;
3079
3080         case TX_E_STOP:
3081                 call_tx_stop_cbfn(tx);
3082                 break;
3083
3084         case TX_E_FAIL:
3085                 /* No-op */
3086                 break;
3087
3088         case TX_E_PRIO_CHANGE:
3089                 call_tx_prio_change_cbfn(tx);
3090                 break;
3091
3092         case TX_E_BW_UPDATE:
3093                 /* No-op */
3094                 break;
3095
3096         default:
3097                 bfa_sm_fault(event);
3098         }
3099 }
3100
3101 static void
3102 bna_tx_sm_start_wait_entry(struct bna_tx *tx)
3103 {
3104         bna_bfi_tx_enet_start(tx);
3105 }
3106
3107 static void
3108 bna_tx_sm_start_wait(struct bna_tx *tx, enum bna_tx_event event)
3109 {
3110         switch (event) {
3111         case TX_E_STOP:
3112                 tx->flags &= ~(BNA_TX_F_PRIO_CHANGED | BNA_TX_F_BW_UPDATED);
3113                 bfa_fsm_set_state(tx, bna_tx_sm_stop_wait);
3114                 break;
3115
3116         case TX_E_FAIL:
3117                 tx->flags &= ~(BNA_TX_F_PRIO_CHANGED | BNA_TX_F_BW_UPDATED);
3118                 bfa_fsm_set_state(tx, bna_tx_sm_stopped);
3119                 break;
3120
3121         case TX_E_STARTED:
3122                 if (tx->flags & (BNA_TX_F_PRIO_CHANGED | BNA_TX_F_BW_UPDATED)) {
3123                         tx->flags &= ~(BNA_TX_F_PRIO_CHANGED |
3124                                 BNA_TX_F_BW_UPDATED);
3125                         bfa_fsm_set_state(tx, bna_tx_sm_prio_stop_wait);
3126                 } else
3127                         bfa_fsm_set_state(tx, bna_tx_sm_started);
3128                 break;
3129
3130         case TX_E_PRIO_CHANGE:
3131                 tx->flags |=  BNA_TX_F_PRIO_CHANGED;
3132                 break;
3133
3134         case TX_E_BW_UPDATE:
3135                 tx->flags |= BNA_TX_F_BW_UPDATED;
3136                 break;
3137
3138         default:
3139                 bfa_sm_fault(event);
3140         }
3141 }
3142
3143 static void
3144 bna_tx_sm_started_entry(struct bna_tx *tx)
3145 {
3146         struct bna_txq *txq;
3147         struct list_head                 *qe;
3148         int is_regular = (tx->type == BNA_TX_T_REGULAR);
3149
3150         list_for_each(qe, &tx->txq_q) {
3151                 txq = (struct bna_txq *)qe;
3152                 txq->tcb->priority = txq->priority;
3153                 /* Start IB */
3154                 bna_ib_start(tx->bna, &txq->ib, is_regular);
3155         }
3156         tx->tx_resume_cbfn(tx->bna->bnad, tx);
3157 }
3158
3159 static void
3160 bna_tx_sm_started(struct bna_tx *tx, enum bna_tx_event event)
3161 {
3162         switch (event) {
3163         case TX_E_STOP:
3164                 bfa_fsm_set_state(tx, bna_tx_sm_stop_wait);
3165                 tx->tx_stall_cbfn(tx->bna->bnad, tx);
3166                 bna_tx_enet_stop(tx);
3167                 break;
3168
3169         case TX_E_FAIL:
3170                 bfa_fsm_set_state(tx, bna_tx_sm_failed);
3171                 tx->tx_stall_cbfn(tx->bna->bnad, tx);
3172                 tx->tx_cleanup_cbfn(tx->bna->bnad, tx);
3173                 break;
3174
3175         case TX_E_PRIO_CHANGE:
3176         case TX_E_BW_UPDATE:
3177                 bfa_fsm_set_state(tx, bna_tx_sm_prio_stop_wait);
3178                 break;
3179
3180         default:
3181                 bfa_sm_fault(event);
3182         }
3183 }
3184
3185 static void
3186 bna_tx_sm_stop_wait_entry(struct bna_tx *tx)
3187 {
3188 }
3189
3190 static void
3191 bna_tx_sm_stop_wait(struct bna_tx *tx, enum bna_tx_event event)
3192 {
3193         switch (event) {
3194         case TX_E_FAIL:
3195         case TX_E_STOPPED:
3196                 bfa_fsm_set_state(tx, bna_tx_sm_cleanup_wait);
3197                 tx->tx_cleanup_cbfn(tx->bna->bnad, tx);
3198                 break;
3199
3200         case TX_E_STARTED:
3201                 /**
3202                  * We are here due to start_wait -> stop_wait transition on
3203                  * TX_E_STOP event
3204                  */
3205                 bna_tx_enet_stop(tx);
3206                 break;
3207
3208         case TX_E_PRIO_CHANGE:
3209         case TX_E_BW_UPDATE:
3210                 /* No-op */
3211                 break;
3212
3213         default:
3214                 bfa_sm_fault(event);
3215         }
3216 }
3217
3218 static void
3219 bna_tx_sm_cleanup_wait_entry(struct bna_tx *tx)
3220 {
3221 }
3222
3223 static void
3224 bna_tx_sm_cleanup_wait(struct bna_tx *tx, enum bna_tx_event event)
3225 {
3226         switch (event) {
3227         case TX_E_FAIL:
3228         case TX_E_PRIO_CHANGE:
3229         case TX_E_BW_UPDATE:
3230                 /* No-op */
3231                 break;
3232
3233         case TX_E_CLEANUP_DONE:
3234                 bfa_fsm_set_state(tx, bna_tx_sm_stopped);
3235                 break;
3236
3237         default:
3238                 bfa_sm_fault(event);
3239         }
3240 }
3241
3242 static void
3243 bna_tx_sm_prio_stop_wait_entry(struct bna_tx *tx)
3244 {
3245         tx->tx_stall_cbfn(tx->bna->bnad, tx);
3246         bna_tx_enet_stop(tx);
3247 }
3248
3249 static void
3250 bna_tx_sm_prio_stop_wait(struct bna_tx *tx, enum bna_tx_event event)
3251 {
3252         switch (event) {
3253         case TX_E_STOP:
3254                 bfa_fsm_set_state(tx, bna_tx_sm_stop_wait);
3255                 break;
3256
3257         case TX_E_FAIL:
3258                 bfa_fsm_set_state(tx, bna_tx_sm_failed);
3259                 call_tx_prio_change_cbfn(tx);
3260                 tx->tx_cleanup_cbfn(tx->bna->bnad, tx);
3261                 break;
3262
3263         case TX_E_STOPPED:
3264                 bfa_fsm_set_state(tx, bna_tx_sm_prio_cleanup_wait);
3265                 break;
3266
3267         case TX_E_PRIO_CHANGE:
3268         case TX_E_BW_UPDATE:
3269                 /* No-op */
3270                 break;
3271
3272         default:
3273                 bfa_sm_fault(event);
3274         }
3275 }
3276
3277 static void
3278 bna_tx_sm_prio_cleanup_wait_entry(struct bna_tx *tx)
3279 {
3280         call_tx_prio_change_cbfn(tx);
3281         tx->tx_cleanup_cbfn(tx->bna->bnad, tx);
3282 }
3283
3284 static void
3285 bna_tx_sm_prio_cleanup_wait(struct bna_tx *tx, enum bna_tx_event event)
3286 {
3287         switch (event) {
3288         case TX_E_STOP:
3289                 bfa_fsm_set_state(tx, bna_tx_sm_cleanup_wait);
3290                 break;
3291
3292         case TX_E_FAIL:
3293                 bfa_fsm_set_state(tx, bna_tx_sm_failed);
3294                 break;
3295
3296         case TX_E_PRIO_CHANGE:
3297         case TX_E_BW_UPDATE:
3298                 /* No-op */
3299                 break;
3300
3301         case TX_E_CLEANUP_DONE:
3302                 bfa_fsm_set_state(tx, bna_tx_sm_start_wait);
3303                 break;
3304
3305         default:
3306                 bfa_sm_fault(event);
3307         }
3308 }
3309
3310 static void
3311 bna_tx_sm_failed_entry(struct bna_tx *tx)
3312 {
3313 }
3314
3315 static void
3316 bna_tx_sm_failed(struct bna_tx *tx, enum bna_tx_event event)
3317 {
3318         switch (event) {
3319         case TX_E_START:
3320                 bfa_fsm_set_state(tx, bna_tx_sm_quiesce_wait);
3321                 break;
3322
3323         case TX_E_STOP:
3324                 bfa_fsm_set_state(tx, bna_tx_sm_cleanup_wait);
3325                 break;
3326
3327         case TX_E_FAIL:
3328                 /* No-op */
3329                 break;
3330
3331         case TX_E_CLEANUP_DONE:
3332                 bfa_fsm_set_state(tx, bna_tx_sm_stopped);
3333                 break;
3334
3335         default:
3336                 bfa_sm_fault(event);
3337         }
3338 }
3339
3340 static void
3341 bna_tx_sm_quiesce_wait_entry(struct bna_tx *tx)
3342 {
3343 }
3344
3345 static void
3346 bna_tx_sm_quiesce_wait(struct bna_tx *tx, enum bna_tx_event event)
3347 {
3348         switch (event) {
3349         case TX_E_STOP:
3350                 bfa_fsm_set_state(tx, bna_tx_sm_cleanup_wait);
3351                 break;
3352
3353         case TX_E_FAIL:
3354                 bfa_fsm_set_state(tx, bna_tx_sm_failed);
3355                 break;
3356
3357         case TX_E_CLEANUP_DONE:
3358                 bfa_fsm_set_state(tx, bna_tx_sm_start_wait);
3359                 break;
3360
3361         case TX_E_BW_UPDATE:
3362                 /* No-op */
3363                 break;
3364
3365         default:
3366                 bfa_sm_fault(event);
3367         }
3368 }
3369
3370 static void
3371 bna_bfi_tx_enet_start(struct bna_tx *tx)
3372 {
3373         struct bfi_enet_tx_cfg_req *cfg_req = &tx->bfi_enet_cmd.cfg_req;
3374         struct bna_txq *txq = NULL;
3375         struct list_head *qe;
3376         int i;
3377
3378         bfi_msgq_mhdr_set(cfg_req->mh, BFI_MC_ENET,
3379                 BFI_ENET_H2I_TX_CFG_SET_REQ, 0, tx->rid);
3380         cfg_req->mh.num_entries = htons(
3381                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_tx_cfg_req)));
3382
3383         cfg_req->num_queues = tx->num_txq;
3384         for (i = 0, qe = bfa_q_first(&tx->txq_q);
3385                 i < tx->num_txq;
3386                 i++, qe = bfa_q_next(qe)) {
3387                 txq = (struct bna_txq *)qe;
3388
3389                 bfi_enet_datapath_q_init(&cfg_req->q_cfg[i].q.q, &txq->qpt);
3390                 cfg_req->q_cfg[i].q.priority = txq->priority;
3391
3392                 cfg_req->q_cfg[i].ib.index_addr.a32.addr_lo =
3393                         txq->ib.ib_seg_host_addr.lsb;
3394                 cfg_req->q_cfg[i].ib.index_addr.a32.addr_hi =
3395                         txq->ib.ib_seg_host_addr.msb;
3396                 cfg_req->q_cfg[i].ib.intr.msix_index =
3397                         htons((u16)txq->ib.intr_vector);
3398         }
3399
3400         cfg_req->ib_cfg.int_pkt_dma = BNA_STATUS_T_ENABLED;
3401         cfg_req->ib_cfg.int_enabled = BNA_STATUS_T_ENABLED;
3402         cfg_req->ib_cfg.int_pkt_enabled = BNA_STATUS_T_DISABLED;
3403         cfg_req->ib_cfg.continuous_coalescing = BNA_STATUS_T_ENABLED;
3404         cfg_req->ib_cfg.msix = (txq->ib.intr_type == BNA_INTR_T_MSIX)
3405                                 ? BNA_STATUS_T_ENABLED : BNA_STATUS_T_DISABLED;
3406         cfg_req->ib_cfg.coalescing_timeout =
3407                         htonl((u32)txq->ib.coalescing_timeo);
3408         cfg_req->ib_cfg.inter_pkt_timeout =
3409                         htonl((u32)txq->ib.interpkt_timeo);
3410         cfg_req->ib_cfg.inter_pkt_count = (u8)txq->ib.interpkt_count;
3411
3412         cfg_req->tx_cfg.vlan_mode = BFI_ENET_TX_VLAN_WI;
3413         cfg_req->tx_cfg.vlan_id = htons((u16)tx->txf_vlan_id);
3414         cfg_req->tx_cfg.admit_tagged_frame = BNA_STATUS_T_ENABLED;
3415         cfg_req->tx_cfg.apply_vlan_filter = BNA_STATUS_T_DISABLED;
3416
3417         bfa_msgq_cmd_set(&tx->msgq_cmd, NULL, NULL,
3418                 sizeof(struct bfi_enet_tx_cfg_req), &cfg_req->mh);
3419         bfa_msgq_cmd_post(&tx->bna->msgq, &tx->msgq_cmd);
3420 }
3421
3422 static void
3423 bna_bfi_tx_enet_stop(struct bna_tx *tx)
3424 {
3425         struct bfi_enet_req *req = &tx->bfi_enet_cmd.req;
3426
3427         bfi_msgq_mhdr_set(req->mh, BFI_MC_ENET,
3428                 BFI_ENET_H2I_TX_CFG_CLR_REQ, 0, tx->rid);
3429         req->mh.num_entries = htons(
3430                 bfi_msgq_num_cmd_entries(sizeof(struct bfi_enet_req)));
3431         bfa_msgq_cmd_set(&tx->msgq_cmd, NULL, NULL, sizeof(struct bfi_enet_req),
3432                 &req->mh);
3433         bfa_msgq_cmd_post(&tx->bna->msgq, &tx->msgq_cmd);
3434 }
3435
3436 static void
3437 bna_tx_enet_stop(struct bna_tx *tx)
3438 {
3439         struct bna_txq *txq;
3440         struct list_head                 *qe;
3441
3442         /* Stop IB */
3443         list_for_each(qe, &tx->txq_q) {
3444                 txq = (struct bna_txq *)qe;
3445                 bna_ib_stop(tx->bna, &txq->ib);
3446         }
3447
3448         bna_bfi_tx_enet_stop(tx);
3449 }
3450
3451 static void
3452 bna_txq_qpt_setup(struct bna_txq *txq, int page_count, int page_size,
3453                 struct bna_mem_descr *qpt_mem,
3454                 struct bna_mem_descr *swqpt_mem,
3455                 struct bna_mem_descr *page_mem)
3456 {
3457         u8 *kva;
3458         u64 dma;
3459         struct bna_dma_addr bna_dma;
3460         int i;
3461
3462         txq->qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb;
3463         txq->qpt.hw_qpt_ptr.msb = qpt_mem->dma.msb;
3464         txq->qpt.kv_qpt_ptr = qpt_mem->kva;
3465         txq->qpt.page_count = page_count;
3466         txq->qpt.page_size = page_size;
3467
3468         txq->tcb->sw_qpt = (void **) swqpt_mem->kva;
3469         txq->tcb->sw_q = page_mem->kva;
3470
3471         kva = page_mem->kva;
3472         BNA_GET_DMA_ADDR(&page_mem->dma, dma);
3473
3474         for (i = 0; i < page_count; i++) {
3475                 txq->tcb->sw_qpt[i] = kva;
3476                 kva += PAGE_SIZE;
3477
3478                 BNA_SET_DMA_ADDR(dma, &bna_dma);
3479                 ((struct bna_dma_addr *)txq->qpt.kv_qpt_ptr)[i].lsb =
3480                         bna_dma.lsb;
3481                 ((struct bna_dma_addr *)txq->qpt.kv_qpt_ptr)[i].msb =
3482                         bna_dma.msb;
3483                 dma += PAGE_SIZE;
3484         }
3485 }
3486
3487 static struct bna_tx *
3488 bna_tx_get(struct bna_tx_mod *tx_mod, enum bna_tx_type type)
3489 {
3490         struct list_head        *qe = NULL;
3491         struct bna_tx *tx = NULL;
3492
3493         if (list_empty(&tx_mod->tx_free_q))
3494                 return NULL;
3495         if (type == BNA_TX_T_REGULAR) {
3496                 bfa_q_deq(&tx_mod->tx_free_q, &qe);
3497         } else {
3498                 bfa_q_deq_tail(&tx_mod->tx_free_q, &qe);
3499         }
3500         tx = (struct bna_tx *)qe;
3501         bfa_q_qe_init(&tx->qe);
3502         tx->type = type;
3503
3504         return tx;
3505 }
3506
3507 static void
3508 bna_tx_free(struct bna_tx *tx)
3509 {
3510         struct bna_tx_mod *tx_mod = &tx->bna->tx_mod;
3511         struct bna_txq *txq;
3512         struct list_head *prev_qe;
3513         struct list_head *qe;
3514
3515         while (!list_empty(&tx->txq_q)) {
3516                 bfa_q_deq(&tx->txq_q, &txq);
3517                 bfa_q_qe_init(&txq->qe);
3518                 txq->tcb = NULL;
3519                 txq->tx = NULL;
3520                 list_add_tail(&txq->qe, &tx_mod->txq_free_q);
3521         }
3522
3523         list_for_each(qe, &tx_mod->tx_active_q) {
3524                 if (qe == &tx->qe) {
3525                         list_del(&tx->qe);
3526                         bfa_q_qe_init(&tx->qe);
3527                         break;
3528                 }
3529         }
3530
3531         tx->bna = NULL;
3532         tx->priv = NULL;
3533
3534         prev_qe = NULL;
3535         list_for_each(qe, &tx_mod->tx_free_q) {
3536                 if (((struct bna_tx *)qe)->rid < tx->rid)
3537                         prev_qe = qe;
3538                 else {
3539                         break;
3540                 }
3541         }
3542
3543         if (prev_qe == NULL) {
3544                 /* This is the first entry */
3545                 bfa_q_enq_head(&tx_mod->tx_free_q, &tx->qe);
3546         } else if (bfa_q_next(prev_qe) == &tx_mod->tx_free_q) {
3547                 /* This is the last entry */
3548                 list_add_tail(&tx->qe, &tx_mod->tx_free_q);
3549         } else {
3550                 /* Somewhere in the middle */
3551                 bfa_q_next(&tx->qe) = bfa_q_next(prev_qe);
3552                 bfa_q_prev(&tx->qe) = prev_qe;
3553                 bfa_q_next(prev_qe) = &tx->qe;
3554                 bfa_q_prev(bfa_q_next(&tx->qe)) = &tx->qe;
3555         }
3556 }
3557
3558 static void
3559 bna_tx_start(struct bna_tx *tx)
3560 {
3561         tx->flags |= BNA_TX_F_ENET_STARTED;
3562         if (tx->flags & BNA_TX_F_ENABLED)
3563                 bfa_fsm_send_event(tx, TX_E_START);
3564 }
3565
3566 static void
3567 bna_tx_stop(struct bna_tx *tx)
3568 {
3569         tx->stop_cbfn = bna_tx_mod_cb_tx_stopped;
3570         tx->stop_cbarg = &tx->bna->tx_mod;
3571
3572         tx->flags &= ~BNA_TX_F_ENET_STARTED;
3573         bfa_fsm_send_event(tx, TX_E_STOP);
3574 }
3575
3576 static void
3577 bna_tx_fail(struct bna_tx *tx)
3578 {
3579         tx->flags &= ~BNA_TX_F_ENET_STARTED;
3580         bfa_fsm_send_event(tx, TX_E_FAIL);
3581 }
3582
3583 void
3584 bna_bfi_tx_enet_start_rsp(struct bna_tx *tx, struct bfi_msgq_mhdr *msghdr)
3585 {
3586         struct bfi_enet_tx_cfg_rsp *cfg_rsp = &tx->bfi_enet_cmd.cfg_rsp;
3587         struct bna_txq *txq = NULL;
3588         struct list_head *qe;
3589         int i;
3590
3591         bfa_msgq_rsp_copy(&tx->bna->msgq, (u8 *)cfg_rsp,
3592                 sizeof(struct bfi_enet_tx_cfg_rsp));
3593
3594         tx->hw_id = cfg_rsp->hw_id;
3595
3596         for (i = 0, qe = bfa_q_first(&tx->txq_q);
3597                 i < tx->num_txq; i++, qe = bfa_q_next(qe)) {
3598                 txq = (struct bna_txq *)qe;
3599
3600                 /* Setup doorbells */
3601                 txq->tcb->i_dbell->doorbell_addr =
3602                         tx->bna->pcidev.pci_bar_kva
3603                         + ntohl(cfg_rsp->q_handles[i].i_dbell);
3604                 txq->tcb->q_dbell =
3605                         tx->bna->pcidev.pci_bar_kva
3606                         + ntohl(cfg_rsp->q_handles[i].q_dbell);
3607                 txq->hw_id = cfg_rsp->q_handles[i].hw_qid;
3608
3609                 /* Initialize producer/consumer indexes */
3610                 (*txq->tcb->hw_consumer_index) = 0;
3611                 txq->tcb->producer_index = txq->tcb->consumer_index = 0;
3612         }
3613
3614         bfa_fsm_send_event(tx, TX_E_STARTED);
3615 }
3616
3617 void
3618 bna_bfi_tx_enet_stop_rsp(struct bna_tx *tx, struct bfi_msgq_mhdr *msghdr)
3619 {
3620         bfa_fsm_send_event(tx, TX_E_STOPPED);
3621 }
3622
3623 void
3624 bna_bfi_bw_update_aen(struct bna_tx_mod *tx_mod)
3625 {
3626         struct bna_tx *tx;
3627         struct list_head                *qe;
3628
3629         list_for_each(qe, &tx_mod->tx_active_q) {
3630                 tx = (struct bna_tx *)qe;
3631                 bfa_fsm_send_event(tx, TX_E_BW_UPDATE);
3632         }
3633 }
3634
3635 void
3636 bna_tx_res_req(int num_txq, int txq_depth, struct bna_res_info *res_info)
3637 {
3638         u32 q_size;
3639         u32 page_count;
3640         struct bna_mem_info *mem_info;
3641
3642         res_info[BNA_TX_RES_MEM_T_TCB].res_type = BNA_RES_T_MEM;
3643         mem_info = &res_info[BNA_TX_RES_MEM_T_TCB].res_u.mem_info;
3644         mem_info->mem_type = BNA_MEM_T_KVA;
3645         mem_info->len = sizeof(struct bna_tcb);
3646         mem_info->num = num_txq;
3647
3648         q_size = txq_depth * BFI_TXQ_WI_SIZE;
3649         q_size = ALIGN(q_size, PAGE_SIZE);
3650         page_count = q_size >> PAGE_SHIFT;
3651
3652         res_info[BNA_TX_RES_MEM_T_QPT].res_type = BNA_RES_T_MEM;
3653         mem_info = &res_info[BNA_TX_RES_MEM_T_QPT].res_u.mem_info;
3654         mem_info->mem_type = BNA_MEM_T_DMA;
3655         mem_info->len = page_count * sizeof(struct bna_dma_addr);
3656         mem_info->num = num_txq;
3657
3658         res_info[BNA_TX_RES_MEM_T_SWQPT].res_type = BNA_RES_T_MEM;
3659         mem_info = &res_info[BNA_TX_RES_MEM_T_SWQPT].res_u.mem_info;
3660         mem_info->mem_type = BNA_MEM_T_KVA;
3661         mem_info->len = page_count * sizeof(void *);
3662         mem_info->num = num_txq;
3663
3664         res_info[BNA_TX_RES_MEM_T_PAGE].res_type = BNA_RES_T_MEM;
3665         mem_info = &res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info;
3666         mem_info->mem_type = BNA_MEM_T_DMA;
3667         mem_info->len = PAGE_SIZE * page_count;
3668         mem_info->num = num_txq;
3669
3670         res_info[BNA_TX_RES_MEM_T_IBIDX].res_type = BNA_RES_T_MEM;
3671         mem_info = &res_info[BNA_TX_RES_MEM_T_IBIDX].res_u.mem_info;
3672         mem_info->mem_type = BNA_MEM_T_DMA;
3673         mem_info->len = BFI_IBIDX_SIZE;
3674         mem_info->num = num_txq;
3675
3676         res_info[BNA_TX_RES_INTR_T_TXCMPL].res_type = BNA_RES_T_INTR;
3677         res_info[BNA_TX_RES_INTR_T_TXCMPL].res_u.intr_info.intr_type =
3678                         BNA_INTR_T_MSIX;
3679         res_info[BNA_TX_RES_INTR_T_TXCMPL].res_u.intr_info.num = num_txq;
3680 }
3681
3682 struct bna_tx *
3683 bna_tx_create(struct bna *bna, struct bnad *bnad,
3684                 struct bna_tx_config *tx_cfg,
3685                 const struct bna_tx_event_cbfn *tx_cbfn,
3686                 struct bna_res_info *res_info, void *priv)
3687 {
3688         struct bna_intr_info *intr_info;
3689         struct bna_tx_mod *tx_mod = &bna->tx_mod;
3690         struct bna_tx *tx;
3691         struct bna_txq *txq;
3692         struct list_head *qe;
3693         int page_count;
3694         int i;
3695
3696         intr_info = &res_info[BNA_TX_RES_INTR_T_TXCMPL].res_u.intr_info;
3697         page_count = (res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info.len) /
3698                                         PAGE_SIZE;
3699
3700         /**
3701          * Get resources
3702          */
3703
3704         if ((intr_info->num != 1) && (intr_info->num != tx_cfg->num_txq))
3705                 return NULL;
3706
3707         /* Tx */
3708
3709         tx = bna_tx_get(tx_mod, tx_cfg->tx_type);
3710         if (!tx)
3711                 return NULL;
3712         tx->bna = bna;
3713         tx->priv = priv;
3714
3715         /* TxQs */
3716
3717         INIT_LIST_HEAD(&tx->txq_q);
3718         for (i = 0; i < tx_cfg->num_txq; i++) {
3719                 if (list_empty(&tx_mod->txq_free_q))
3720                         goto err_return;
3721
3722                 bfa_q_deq(&tx_mod->txq_free_q, &txq);
3723                 bfa_q_qe_init(&txq->qe);
3724                 list_add_tail(&txq->qe, &tx->txq_q);
3725                 txq->tx = tx;
3726         }
3727
3728         /*
3729          * Initialize
3730          */
3731
3732         /* Tx */
3733
3734         tx->tcb_setup_cbfn = tx_cbfn->tcb_setup_cbfn;
3735         tx->tcb_destroy_cbfn = tx_cbfn->tcb_destroy_cbfn;
3736         /* Following callbacks are mandatory */
3737         tx->tx_stall_cbfn = tx_cbfn->tx_stall_cbfn;
3738         tx->tx_resume_cbfn = tx_cbfn->tx_resume_cbfn;
3739         tx->tx_cleanup_cbfn = tx_cbfn->tx_cleanup_cbfn;
3740
3741         list_add_tail(&tx->qe, &tx_mod->tx_active_q);
3742
3743         tx->num_txq = tx_cfg->num_txq;
3744
3745         tx->flags = 0;
3746         if (tx->bna->tx_mod.flags & BNA_TX_MOD_F_ENET_STARTED) {
3747                 switch (tx->type) {
3748                 case BNA_TX_T_REGULAR:
3749                         if (!(tx->bna->tx_mod.flags &
3750                                 BNA_TX_MOD_F_ENET_LOOPBACK))
3751                                 tx->flags |= BNA_TX_F_ENET_STARTED;
3752                         break;
3753                 case BNA_TX_T_LOOPBACK:
3754                         if (tx->bna->tx_mod.flags & BNA_TX_MOD_F_ENET_LOOPBACK)
3755                                 tx->flags |= BNA_TX_F_ENET_STARTED;
3756                         break;
3757                 }
3758         }
3759
3760         /* TxQ */
3761
3762         i = 0;
3763         list_for_each(qe, &tx->txq_q) {
3764                 txq = (struct bna_txq *)qe;
3765                 txq->tcb = (struct bna_tcb *)
3766                 res_info[BNA_TX_RES_MEM_T_TCB].res_u.mem_info.mdl[i].kva;
3767                 txq->tx_packets = 0;
3768                 txq->tx_bytes = 0;
3769
3770                 /* IB */
3771                 txq->ib.ib_seg_host_addr.lsb =
3772                 res_info[BNA_TX_RES_MEM_T_IBIDX].res_u.mem_info.mdl[i].dma.lsb;
3773                 txq->ib.ib_seg_host_addr.msb =
3774                 res_info[BNA_TX_RES_MEM_T_IBIDX].res_u.mem_info.mdl[i].dma.msb;
3775                 txq->ib.ib_seg_host_addr_kva =
3776                 res_info[BNA_TX_RES_MEM_T_IBIDX].res_u.mem_info.mdl[i].kva;
3777                 txq->ib.intr_type = intr_info->intr_type;
3778                 txq->ib.intr_vector = (intr_info->num == 1) ?
3779                                         intr_info->idl[0].vector :
3780                                         intr_info->idl[i].vector;
3781                 if (intr_info->intr_type == BNA_INTR_T_INTX)
3782                         txq->ib.intr_vector = (1 <<  txq->ib.intr_vector);
3783                 txq->ib.coalescing_timeo = tx_cfg->coalescing_timeo;
3784                 txq->ib.interpkt_timeo = BFI_TX_INTERPKT_TIMEO;
3785                 txq->ib.interpkt_count = BFI_TX_INTERPKT_COUNT;
3786
3787                 /* TCB */
3788
3789                 txq->tcb->q_depth = tx_cfg->txq_depth;
3790                 txq->tcb->unmap_q = (void *)
3791                 res_info[BNA_TX_RES_MEM_T_UNMAPQ].res_u.mem_info.mdl[i].kva;
3792                 txq->tcb->hw_consumer_index =
3793                         (u32 *)txq->ib.ib_seg_host_addr_kva;
3794                 txq->tcb->i_dbell = &txq->ib.door_bell;
3795                 txq->tcb->intr_type = txq->ib.intr_type;
3796                 txq->tcb->intr_vector = txq->ib.intr_vector;
3797                 txq->tcb->txq = txq;
3798                 txq->tcb->bnad = bnad;
3799                 txq->tcb->id = i;
3800
3801                 /* QPT, SWQPT, Pages */
3802                 bna_txq_qpt_setup(txq, page_count, PAGE_SIZE,
3803                         &res_info[BNA_TX_RES_MEM_T_QPT].res_u.mem_info.mdl[i],
3804                         &res_info[BNA_TX_RES_MEM_T_SWQPT].res_u.mem_info.mdl[i],
3805                         &res_info[BNA_TX_RES_MEM_T_PAGE].
3806                                   res_u.mem_info.mdl[i]);
3807
3808                 /* Callback to bnad for setting up TCB */
3809                 if (tx->tcb_setup_cbfn)
3810                         (tx->tcb_setup_cbfn)(bna->bnad, txq->tcb);
3811
3812                 if (tx_cfg->num_txq == BFI_TX_MAX_PRIO)
3813                         txq->priority = txq->tcb->id;
3814                 else
3815                         txq->priority = tx_mod->default_prio;
3816
3817                 i++;
3818         }
3819
3820         tx->txf_vlan_id = 0;
3821
3822         bfa_fsm_set_state(tx, bna_tx_sm_stopped);
3823
3824         tx_mod->rid_mask |= (1 << tx->rid);
3825
3826         return tx;
3827
3828 err_return:
3829         bna_tx_free(tx);
3830         return NULL;
3831 }
3832
3833 void
3834 bna_tx_destroy(struct bna_tx *tx)
3835 {
3836         struct bna_txq *txq;
3837         struct list_head *qe;
3838
3839         list_for_each(qe, &tx->txq_q) {
3840                 txq = (struct bna_txq *)qe;
3841                 if (tx->tcb_destroy_cbfn)
3842                         (tx->tcb_destroy_cbfn)(tx->bna->bnad, txq->tcb);
3843         }
3844
3845         tx->bna->tx_mod.rid_mask &= ~(1 << tx->rid);
3846         bna_tx_free(tx);
3847 }
3848
3849 void
3850 bna_tx_enable(struct bna_tx *tx)
3851 {
3852         if (tx->fsm != (bfa_sm_t)bna_tx_sm_stopped)
3853                 return;
3854
3855         tx->flags |= BNA_TX_F_ENABLED;
3856
3857         if (tx->flags & BNA_TX_F_ENET_STARTED)
3858                 bfa_fsm_send_event(tx, TX_E_START);
3859 }
3860
3861 void
3862 bna_tx_disable(struct bna_tx *tx, enum bna_cleanup_type type,
3863                 void (*cbfn)(void *, struct bna_tx *))
3864 {
3865         if (type == BNA_SOFT_CLEANUP) {
3866                 (*cbfn)(tx->bna->bnad, tx);
3867                 return;
3868         }
3869
3870         tx->stop_cbfn = cbfn;
3871         tx->stop_cbarg = tx->bna->bnad;
3872
3873         tx->flags &= ~BNA_TX_F_ENABLED;
3874
3875         bfa_fsm_send_event(tx, TX_E_STOP);
3876 }
3877
3878 void
3879 bna_tx_cleanup_complete(struct bna_tx *tx)
3880 {
3881         bfa_fsm_send_event(tx, TX_E_CLEANUP_DONE);
3882 }
3883
3884 static void
3885 bna_tx_mod_cb_tx_stopped(void *arg, struct bna_tx *tx)
3886 {
3887         struct bna_tx_mod *tx_mod = (struct bna_tx_mod *)arg;
3888
3889         bfa_wc_down(&tx_mod->tx_stop_wc);
3890 }
3891
3892 static void
3893 bna_tx_mod_cb_tx_stopped_all(void *arg)
3894 {
3895         struct bna_tx_mod *tx_mod = (struct bna_tx_mod *)arg;
3896
3897         if (tx_mod->stop_cbfn)
3898                 tx_mod->stop_cbfn(&tx_mod->bna->enet);
3899         tx_mod->stop_cbfn = NULL;
3900 }
3901
3902 void
3903 bna_tx_mod_init(struct bna_tx_mod *tx_mod, struct bna *bna,
3904                 struct bna_res_info *res_info)
3905 {
3906         int i;
3907
3908         tx_mod->bna = bna;
3909         tx_mod->flags = 0;
3910
3911         tx_mod->tx = (struct bna_tx *)
3912                 res_info[BNA_MOD_RES_MEM_T_TX_ARRAY].res_u.mem_info.mdl[0].kva;
3913         tx_mod->txq = (struct bna_txq *)
3914                 res_info[BNA_MOD_RES_MEM_T_TXQ_ARRAY].res_u.mem_info.mdl[0].kva;
3915
3916         INIT_LIST_HEAD(&tx_mod->tx_free_q);
3917         INIT_LIST_HEAD(&tx_mod->tx_active_q);
3918
3919         INIT_LIST_HEAD(&tx_mod->txq_free_q);
3920
3921         for (i = 0; i < bna->ioceth.attr.num_txq; i++) {
3922                 tx_mod->tx[i].rid = i;
3923                 bfa_q_qe_init(&tx_mod->tx[i].qe);
3924                 list_add_tail(&tx_mod->tx[i].qe, &tx_mod->tx_free_q);
3925                 bfa_q_qe_init(&tx_mod->txq[i].qe);
3926                 list_add_tail(&tx_mod->txq[i].qe, &tx_mod->txq_free_q);
3927         }
3928
3929         tx_mod->prio_map = BFI_TX_PRIO_MAP_ALL;
3930         tx_mod->default_prio = 0;
3931         tx_mod->iscsi_over_cee = BNA_STATUS_T_DISABLED;
3932         tx_mod->iscsi_prio = -1;
3933 }
3934
3935 void
3936 bna_tx_mod_uninit(struct bna_tx_mod *tx_mod)
3937 {
3938         struct list_head                *qe;
3939         int i;
3940
3941         i = 0;
3942         list_for_each(qe, &tx_mod->tx_free_q)
3943                 i++;
3944
3945         i = 0;
3946         list_for_each(qe, &tx_mod->txq_free_q)
3947                 i++;
3948
3949         tx_mod->bna = NULL;
3950 }
3951
3952 void
3953 bna_tx_mod_start(struct bna_tx_mod *tx_mod, enum bna_tx_type type)
3954 {
3955         struct bna_tx *tx;
3956         struct list_head                *qe;
3957
3958         tx_mod->flags |= BNA_TX_MOD_F_ENET_STARTED;
3959         if (type == BNA_TX_T_LOOPBACK)
3960                 tx_mod->flags |= BNA_TX_MOD_F_ENET_LOOPBACK;
3961
3962         list_for_each(qe, &tx_mod->tx_active_q) {
3963                 tx = (struct bna_tx *)qe;
3964                 if (tx->type == type)
3965                         bna_tx_start(tx);
3966         }
3967 }
3968
3969 void
3970 bna_tx_mod_stop(struct bna_tx_mod *tx_mod, enum bna_tx_type type)
3971 {
3972         struct bna_tx *tx;
3973         struct list_head                *qe;
3974
3975         tx_mod->flags &= ~BNA_TX_MOD_F_ENET_STARTED;
3976         tx_mod->flags &= ~BNA_TX_MOD_F_ENET_LOOPBACK;
3977
3978         tx_mod->stop_cbfn = bna_enet_cb_tx_stopped;
3979
3980         bfa_wc_init(&tx_mod->tx_stop_wc, bna_tx_mod_cb_tx_stopped_all, tx_mod);
3981
3982         list_for_each(qe, &tx_mod->tx_active_q) {
3983                 tx = (struct bna_tx *)qe;
3984                 if (tx->type == type) {
3985                         bfa_wc_up(&tx_mod->tx_stop_wc);
3986                         bna_tx_stop(tx);
3987                 }
3988         }
3989
3990         bfa_wc_wait(&tx_mod->tx_stop_wc);
3991 }
3992
3993 void
3994 bna_tx_mod_fail(struct bna_tx_mod *tx_mod)
3995 {
3996         struct bna_tx *tx;
3997         struct list_head                *qe;
3998
3999         tx_mod->flags &= ~BNA_TX_MOD_F_ENET_STARTED;
4000         tx_mod->flags &= ~BNA_TX_MOD_F_ENET_LOOPBACK;
4001
4002         list_for_each(qe, &tx_mod->tx_active_q) {
4003                 tx = (struct bna_tx *)qe;
4004                 bna_tx_fail(tx);
4005         }
4006 }
4007
4008 void
4009 bna_tx_coalescing_timeo_set(struct bna_tx *tx, int coalescing_timeo)
4010 {
4011         struct bna_txq *txq;
4012         struct list_head *qe;
4013
4014         list_for_each(qe, &tx->txq_q) {
4015                 txq = (struct bna_txq *)qe;
4016                 bna_ib_coalescing_timeo_set(&txq->ib, coalescing_timeo);
4017         }
4018 }