xref: /linux/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c (revision f2ee442115c9b6219083c019939a9cc0c9abb2f8)
1 /* bnx2x_sp.c: Broadcom Everest network driver.
2  *
3  * Copyright 2011 Broadcom Corporation
4  *
5  * Unless you and Broadcom execute a separate written software license
6  * agreement governing use of this software, this software is licensed to you
7  * under the terms of the GNU General Public License version 2, available
8  * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL").
9  *
10  * Notwithstanding the above, under no circumstances may you combine this
11  * software in any way with any other Broadcom software provided under a
12  * license other than the GPL, without Broadcom's express prior written
13  * consent.
14  *
15  * Maintained by: Eilon Greenstein <eilong@broadcom.com>
16  * Written by: Vladislav Zolotarov
17  *
18  */
19 
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 
22 #include <linux/module.h>
23 #include <linux/crc32.h>
24 #include <linux/netdevice.h>
25 #include <linux/etherdevice.h>
26 #include <linux/crc32c.h>
27 #include "bnx2x.h"
28 #include "bnx2x_cmn.h"
29 #include "bnx2x_sp.h"
30 
31 #define BNX2X_MAX_EMUL_MULTI		16
32 
33 /**** Exe Queue interfaces ****/
34 
35 /**
36  * bnx2x_exe_queue_init - init the Exe Queue object
37  *
38  * @o:		poiter to the object
39  * @exe_len:	length
40  * @owner:	poiter to the owner
41  * @validate:	validate function pointer
42  * @optimize:	optimize function pointer
43  * @exec:	execute function pointer
44  * @get:	get function pointer
45  */
46 static inline void bnx2x_exe_queue_init(struct bnx2x *bp,
47 					struct bnx2x_exe_queue_obj *o,
48 					int exe_len,
49 					union bnx2x_qable_obj *owner,
50 					exe_q_validate validate,
51 					exe_q_optimize optimize,
52 					exe_q_execute exec,
53 					exe_q_get get)
54 {
55 	memset(o, 0, sizeof(*o));
56 
57 	INIT_LIST_HEAD(&o->exe_queue);
58 	INIT_LIST_HEAD(&o->pending_comp);
59 
60 	spin_lock_init(&o->lock);
61 
62 	o->exe_chunk_len = exe_len;
63 	o->owner         = owner;
64 
65 	/* Owner specific callbacks */
66 	o->validate      = validate;
67 	o->optimize      = optimize;
68 	o->execute       = exec;
69 	o->get           = get;
70 
71 	DP(BNX2X_MSG_SP, "Setup the execution queue with the chunk "
72 			 "length of %d\n", exe_len);
73 }
74 
75 static inline void bnx2x_exe_queue_free_elem(struct bnx2x *bp,
76 					     struct bnx2x_exeq_elem *elem)
77 {
78 	DP(BNX2X_MSG_SP, "Deleting an exe_queue element\n");
79 	kfree(elem);
80 }
81 
82 static inline int bnx2x_exe_queue_length(struct bnx2x_exe_queue_obj *o)
83 {
84 	struct bnx2x_exeq_elem *elem;
85 	int cnt = 0;
86 
87 	spin_lock_bh(&o->lock);
88 
89 	list_for_each_entry(elem, &o->exe_queue, link)
90 		cnt++;
91 
92 	spin_unlock_bh(&o->lock);
93 
94 	return cnt;
95 }
96 
97 /**
98  * bnx2x_exe_queue_add - add a new element to the execution queue
99  *
100  * @bp:		driver handle
101  * @o:		queue
102  * @cmd:	new command to add
103  * @restore:	true - do not optimize the command
104  *
105  * If the element is optimized or is illegal, frees it.
106  */
107 static inline int bnx2x_exe_queue_add(struct bnx2x *bp,
108 				      struct bnx2x_exe_queue_obj *o,
109 				      struct bnx2x_exeq_elem *elem,
110 				      bool restore)
111 {
112 	int rc;
113 
114 	spin_lock_bh(&o->lock);
115 
116 	if (!restore) {
117 		/* Try to cancel this element queue */
118 		rc = o->optimize(bp, o->owner, elem);
119 		if (rc)
120 			goto free_and_exit;
121 
122 		/* Check if this request is ok */
123 		rc = o->validate(bp, o->owner, elem);
124 		if (rc) {
125 			BNX2X_ERR("Preamble failed: %d\n", rc);
126 			goto free_and_exit;
127 		}
128 	}
129 
130 	/* If so, add it to the execution queue */
131 	list_add_tail(&elem->link, &o->exe_queue);
132 
133 	spin_unlock_bh(&o->lock);
134 
135 	return 0;
136 
137 free_and_exit:
138 	bnx2x_exe_queue_free_elem(bp, elem);
139 
140 	spin_unlock_bh(&o->lock);
141 
142 	return rc;
143 
144 }
145 
146 static inline void __bnx2x_exe_queue_reset_pending(
147 	struct bnx2x *bp,
148 	struct bnx2x_exe_queue_obj *o)
149 {
150 	struct bnx2x_exeq_elem *elem;
151 
152 	while (!list_empty(&o->pending_comp)) {
153 		elem = list_first_entry(&o->pending_comp,
154 					struct bnx2x_exeq_elem, link);
155 
156 		list_del(&elem->link);
157 		bnx2x_exe_queue_free_elem(bp, elem);
158 	}
159 }
160 
161 static inline void bnx2x_exe_queue_reset_pending(struct bnx2x *bp,
162 						 struct bnx2x_exe_queue_obj *o)
163 {
164 
165 	spin_lock_bh(&o->lock);
166 
167 	__bnx2x_exe_queue_reset_pending(bp, o);
168 
169 	spin_unlock_bh(&o->lock);
170 
171 }
172 
173 /**
174  * bnx2x_exe_queue_step - execute one execution chunk atomically
175  *
176  * @bp:			driver handle
177  * @o:			queue
178  * @ramrod_flags:	flags
179  *
180  * (Atomicy is ensured using the exe_queue->lock).
181  */
182 static inline int bnx2x_exe_queue_step(struct bnx2x *bp,
183 				       struct bnx2x_exe_queue_obj *o,
184 				       unsigned long *ramrod_flags)
185 {
186 	struct bnx2x_exeq_elem *elem, spacer;
187 	int cur_len = 0, rc;
188 
189 	memset(&spacer, 0, sizeof(spacer));
190 
191 	spin_lock_bh(&o->lock);
192 
193 	/*
194 	 * Next step should not be performed until the current is finished,
195 	 * unless a DRV_CLEAR_ONLY bit is set. In this case we just want to
196 	 * properly clear object internals without sending any command to the FW
197 	 * which also implies there won't be any completion to clear the
198 	 * 'pending' list.
199 	 */
200 	if (!list_empty(&o->pending_comp)) {
201 		if (test_bit(RAMROD_DRV_CLR_ONLY, ramrod_flags)) {
202 			DP(BNX2X_MSG_SP, "RAMROD_DRV_CLR_ONLY requested: "
203 					 "resetting pending_comp\n");
204 			__bnx2x_exe_queue_reset_pending(bp, o);
205 		} else {
206 			spin_unlock_bh(&o->lock);
207 			return 1;
208 		}
209 	}
210 
211 	/*
212 	 * Run through the pending commands list and create a next
213 	 * execution chunk.
214 	 */
215 	while (!list_empty(&o->exe_queue)) {
216 		elem = list_first_entry(&o->exe_queue, struct bnx2x_exeq_elem,
217 					link);
218 		WARN_ON(!elem->cmd_len);
219 
220 		if (cur_len + elem->cmd_len <= o->exe_chunk_len) {
221 			cur_len += elem->cmd_len;
222 			/*
223 			 * Prevent from both lists being empty when moving an
224 			 * element. This will allow the call of
225 			 * bnx2x_exe_queue_empty() without locking.
226 			 */
227 			list_add_tail(&spacer.link, &o->pending_comp);
228 			mb();
229 			list_del(&elem->link);
230 			list_add_tail(&elem->link, &o->pending_comp);
231 			list_del(&spacer.link);
232 		} else
233 			break;
234 	}
235 
236 	/* Sanity check */
237 	if (!cur_len) {
238 		spin_unlock_bh(&o->lock);
239 		return 0;
240 	}
241 
242 	rc = o->execute(bp, o->owner, &o->pending_comp, ramrod_flags);
243 	if (rc < 0)
244 		/*
245 		 *  In case of an error return the commands back to the queue
246 		 *  and reset the pending_comp.
247 		 */
248 		list_splice_init(&o->pending_comp, &o->exe_queue);
249 	else if (!rc)
250 		/*
251 		 * If zero is returned, means there are no outstanding pending
252 		 * completions and we may dismiss the pending list.
253 		 */
254 		__bnx2x_exe_queue_reset_pending(bp, o);
255 
256 	spin_unlock_bh(&o->lock);
257 	return rc;
258 }
259 
260 static inline bool bnx2x_exe_queue_empty(struct bnx2x_exe_queue_obj *o)
261 {
262 	bool empty = list_empty(&o->exe_queue);
263 
264 	/* Don't reorder!!! */
265 	mb();
266 
267 	return empty && list_empty(&o->pending_comp);
268 }
269 
270 static inline struct bnx2x_exeq_elem *bnx2x_exe_queue_alloc_elem(
271 	struct bnx2x *bp)
272 {
273 	DP(BNX2X_MSG_SP, "Allocating a new exe_queue element\n");
274 	return kzalloc(sizeof(struct bnx2x_exeq_elem), GFP_ATOMIC);
275 }
276 
277 /************************ raw_obj functions ***********************************/
278 static bool bnx2x_raw_check_pending(struct bnx2x_raw_obj *o)
279 {
280 	return !!test_bit(o->state, o->pstate);
281 }
282 
283 static void bnx2x_raw_clear_pending(struct bnx2x_raw_obj *o)
284 {
285 	smp_mb__before_clear_bit();
286 	clear_bit(o->state, o->pstate);
287 	smp_mb__after_clear_bit();
288 }
289 
290 static void bnx2x_raw_set_pending(struct bnx2x_raw_obj *o)
291 {
292 	smp_mb__before_clear_bit();
293 	set_bit(o->state, o->pstate);
294 	smp_mb__after_clear_bit();
295 }
296 
297 /**
298  * bnx2x_state_wait - wait until the given bit(state) is cleared
299  *
300  * @bp:		device handle
301  * @state:	state which is to be cleared
302  * @state_p:	state buffer
303  *
304  */
305 static inline int bnx2x_state_wait(struct bnx2x *bp, int state,
306 				   unsigned long *pstate)
307 {
308 	/* can take a while if any port is running */
309 	int cnt = 5000;
310 
311 
312 	if (CHIP_REV_IS_EMUL(bp))
313 		cnt *= 20;
314 
315 	DP(BNX2X_MSG_SP, "waiting for state to become %d\n", state);
316 
317 	might_sleep();
318 	while (cnt--) {
319 		if (!test_bit(state, pstate)) {
320 #ifdef BNX2X_STOP_ON_ERROR
321 			DP(BNX2X_MSG_SP, "exit  (cnt %d)\n", 5000 - cnt);
322 #endif
323 			return 0;
324 		}
325 
326 		usleep_range(1000, 1000);
327 
328 		if (bp->panic)
329 			return -EIO;
330 	}
331 
332 	/* timeout! */
333 	BNX2X_ERR("timeout waiting for state %d\n", state);
334 #ifdef BNX2X_STOP_ON_ERROR
335 	bnx2x_panic();
336 #endif
337 
338 	return -EBUSY;
339 }
340 
341 static int bnx2x_raw_wait(struct bnx2x *bp, struct bnx2x_raw_obj *raw)
342 {
343 	return bnx2x_state_wait(bp, raw->state, raw->pstate);
344 }
345 
346 /***************** Classification verbs: Set/Del MAC/VLAN/VLAN-MAC ************/
347 /* credit handling callbacks */
348 static bool bnx2x_get_cam_offset_mac(struct bnx2x_vlan_mac_obj *o, int *offset)
349 {
350 	struct bnx2x_credit_pool_obj *mp = o->macs_pool;
351 
352 	WARN_ON(!mp);
353 
354 	return mp->get_entry(mp, offset);
355 }
356 
357 static bool bnx2x_get_credit_mac(struct bnx2x_vlan_mac_obj *o)
358 {
359 	struct bnx2x_credit_pool_obj *mp = o->macs_pool;
360 
361 	WARN_ON(!mp);
362 
363 	return mp->get(mp, 1);
364 }
365 
366 static bool bnx2x_get_cam_offset_vlan(struct bnx2x_vlan_mac_obj *o, int *offset)
367 {
368 	struct bnx2x_credit_pool_obj *vp = o->vlans_pool;
369 
370 	WARN_ON(!vp);
371 
372 	return vp->get_entry(vp, offset);
373 }
374 
375 static bool bnx2x_get_credit_vlan(struct bnx2x_vlan_mac_obj *o)
376 {
377 	struct bnx2x_credit_pool_obj *vp = o->vlans_pool;
378 
379 	WARN_ON(!vp);
380 
381 	return vp->get(vp, 1);
382 }
383 
384 static bool bnx2x_get_credit_vlan_mac(struct bnx2x_vlan_mac_obj *o)
385 {
386 	struct bnx2x_credit_pool_obj *mp = o->macs_pool;
387 	struct bnx2x_credit_pool_obj *vp = o->vlans_pool;
388 
389 	if (!mp->get(mp, 1))
390 		return false;
391 
392 	if (!vp->get(vp, 1)) {
393 		mp->put(mp, 1);
394 		return false;
395 	}
396 
397 	return true;
398 }
399 
400 static bool bnx2x_put_cam_offset_mac(struct bnx2x_vlan_mac_obj *o, int offset)
401 {
402 	struct bnx2x_credit_pool_obj *mp = o->macs_pool;
403 
404 	return mp->put_entry(mp, offset);
405 }
406 
407 static bool bnx2x_put_credit_mac(struct bnx2x_vlan_mac_obj *o)
408 {
409 	struct bnx2x_credit_pool_obj *mp = o->macs_pool;
410 
411 	return mp->put(mp, 1);
412 }
413 
414 static bool bnx2x_put_cam_offset_vlan(struct bnx2x_vlan_mac_obj *o, int offset)
415 {
416 	struct bnx2x_credit_pool_obj *vp = o->vlans_pool;
417 
418 	return vp->put_entry(vp, offset);
419 }
420 
421 static bool bnx2x_put_credit_vlan(struct bnx2x_vlan_mac_obj *o)
422 {
423 	struct bnx2x_credit_pool_obj *vp = o->vlans_pool;
424 
425 	return vp->put(vp, 1);
426 }
427 
428 static bool bnx2x_put_credit_vlan_mac(struct bnx2x_vlan_mac_obj *o)
429 {
430 	struct bnx2x_credit_pool_obj *mp = o->macs_pool;
431 	struct bnx2x_credit_pool_obj *vp = o->vlans_pool;
432 
433 	if (!mp->put(mp, 1))
434 		return false;
435 
436 	if (!vp->put(vp, 1)) {
437 		mp->get(mp, 1);
438 		return false;
439 	}
440 
441 	return true;
442 }
443 
444 /* check_add() callbacks */
445 static int bnx2x_check_mac_add(struct bnx2x_vlan_mac_obj *o,
446 			       union bnx2x_classification_ramrod_data *data)
447 {
448 	struct bnx2x_vlan_mac_registry_elem *pos;
449 
450 	if (!is_valid_ether_addr(data->mac.mac))
451 		return -EINVAL;
452 
453 	/* Check if a requested MAC already exists */
454 	list_for_each_entry(pos, &o->head, link)
455 		if (!memcmp(data->mac.mac, pos->u.mac.mac, ETH_ALEN))
456 			return -EEXIST;
457 
458 	return 0;
459 }
460 
461 static int bnx2x_check_vlan_add(struct bnx2x_vlan_mac_obj *o,
462 				union bnx2x_classification_ramrod_data *data)
463 {
464 	struct bnx2x_vlan_mac_registry_elem *pos;
465 
466 	list_for_each_entry(pos, &o->head, link)
467 		if (data->vlan.vlan == pos->u.vlan.vlan)
468 			return -EEXIST;
469 
470 	return 0;
471 }
472 
473 static int bnx2x_check_vlan_mac_add(struct bnx2x_vlan_mac_obj *o,
474 				   union bnx2x_classification_ramrod_data *data)
475 {
476 	struct bnx2x_vlan_mac_registry_elem *pos;
477 
478 	list_for_each_entry(pos, &o->head, link)
479 		if ((data->vlan_mac.vlan == pos->u.vlan_mac.vlan) &&
480 		    (!memcmp(data->vlan_mac.mac, pos->u.vlan_mac.mac,
481 			     ETH_ALEN)))
482 			return -EEXIST;
483 
484 	return 0;
485 }
486 
487 
488 /* check_del() callbacks */
489 static struct bnx2x_vlan_mac_registry_elem *
490 	bnx2x_check_mac_del(struct bnx2x_vlan_mac_obj *o,
491 			    union bnx2x_classification_ramrod_data *data)
492 {
493 	struct bnx2x_vlan_mac_registry_elem *pos;
494 
495 	list_for_each_entry(pos, &o->head, link)
496 		if (!memcmp(data->mac.mac, pos->u.mac.mac, ETH_ALEN))
497 			return pos;
498 
499 	return NULL;
500 }
501 
502 static struct bnx2x_vlan_mac_registry_elem *
503 	bnx2x_check_vlan_del(struct bnx2x_vlan_mac_obj *o,
504 			     union bnx2x_classification_ramrod_data *data)
505 {
506 	struct bnx2x_vlan_mac_registry_elem *pos;
507 
508 	list_for_each_entry(pos, &o->head, link)
509 		if (data->vlan.vlan == pos->u.vlan.vlan)
510 			return pos;
511 
512 	return NULL;
513 }
514 
515 static struct bnx2x_vlan_mac_registry_elem *
516 	bnx2x_check_vlan_mac_del(struct bnx2x_vlan_mac_obj *o,
517 				 union bnx2x_classification_ramrod_data *data)
518 {
519 	struct bnx2x_vlan_mac_registry_elem *pos;
520 
521 	list_for_each_entry(pos, &o->head, link)
522 		if ((data->vlan_mac.vlan == pos->u.vlan_mac.vlan) &&
523 		    (!memcmp(data->vlan_mac.mac, pos->u.vlan_mac.mac,
524 			     ETH_ALEN)))
525 			return pos;
526 
527 	return NULL;
528 }
529 
530 /* check_move() callback */
531 static bool bnx2x_check_move(struct bnx2x_vlan_mac_obj *src_o,
532 			     struct bnx2x_vlan_mac_obj *dst_o,
533 			     union bnx2x_classification_ramrod_data *data)
534 {
535 	struct bnx2x_vlan_mac_registry_elem *pos;
536 	int rc;
537 
538 	/* Check if we can delete the requested configuration from the first
539 	 * object.
540 	 */
541 	pos = src_o->check_del(src_o, data);
542 
543 	/*  check if configuration can be added */
544 	rc = dst_o->check_add(dst_o, data);
545 
546 	/* If this classification can not be added (is already set)
547 	 * or can't be deleted - return an error.
548 	 */
549 	if (rc || !pos)
550 		return false;
551 
552 	return true;
553 }
554 
555 static bool bnx2x_check_move_always_err(
556 	struct bnx2x_vlan_mac_obj *src_o,
557 	struct bnx2x_vlan_mac_obj *dst_o,
558 	union bnx2x_classification_ramrod_data *data)
559 {
560 	return false;
561 }
562 
563 
564 static inline u8 bnx2x_vlan_mac_get_rx_tx_flag(struct bnx2x_vlan_mac_obj *o)
565 {
566 	struct bnx2x_raw_obj *raw = &o->raw;
567 	u8 rx_tx_flag = 0;
568 
569 	if ((raw->obj_type == BNX2X_OBJ_TYPE_TX) ||
570 	    (raw->obj_type == BNX2X_OBJ_TYPE_RX_TX))
571 		rx_tx_flag |= ETH_CLASSIFY_CMD_HEADER_TX_CMD;
572 
573 	if ((raw->obj_type == BNX2X_OBJ_TYPE_RX) ||
574 	    (raw->obj_type == BNX2X_OBJ_TYPE_RX_TX))
575 		rx_tx_flag |= ETH_CLASSIFY_CMD_HEADER_RX_CMD;
576 
577 	return rx_tx_flag;
578 }
579 
580 /* LLH CAM line allocations */
581 enum {
582 	LLH_CAM_ISCSI_ETH_LINE = 0,
583 	LLH_CAM_ETH_LINE,
584 	LLH_CAM_MAX_PF_LINE = NIG_REG_LLH1_FUNC_MEM_SIZE / 2
585 };
586 
587 static inline void bnx2x_set_mac_in_nig(struct bnx2x *bp,
588 				 bool add, unsigned char *dev_addr, int index)
589 {
590 	u32 wb_data[2];
591 	u32 reg_offset = BP_PORT(bp) ? NIG_REG_LLH1_FUNC_MEM :
592 			 NIG_REG_LLH0_FUNC_MEM;
593 
594 	if (!IS_MF_SI(bp) || index > LLH_CAM_MAX_PF_LINE)
595 		return;
596 
597 	DP(BNX2X_MSG_SP, "Going to %s LLH configuration at entry %d\n",
598 			 (add ? "ADD" : "DELETE"), index);
599 
600 	if (add) {
601 		/* LLH_FUNC_MEM is a u64 WB register */
602 		reg_offset += 8*index;
603 
604 		wb_data[0] = ((dev_addr[2] << 24) | (dev_addr[3] << 16) |
605 			      (dev_addr[4] <<  8) |  dev_addr[5]);
606 		wb_data[1] = ((dev_addr[0] <<  8) |  dev_addr[1]);
607 
608 		REG_WR_DMAE(bp, reg_offset, wb_data, 2);
609 	}
610 
611 	REG_WR(bp, (BP_PORT(bp) ? NIG_REG_LLH1_FUNC_MEM_ENABLE :
612 				  NIG_REG_LLH0_FUNC_MEM_ENABLE) + 4*index, add);
613 }
614 
615 /**
616  * bnx2x_vlan_mac_set_cmd_hdr_e2 - set a header in a single classify ramrod
617  *
618  * @bp:		device handle
619  * @o:		queue for which we want to configure this rule
620  * @add:	if true the command is an ADD command, DEL otherwise
621  * @opcode:	CLASSIFY_RULE_OPCODE_XXX
622  * @hdr:	pointer to a header to setup
623  *
624  */
625 static inline void bnx2x_vlan_mac_set_cmd_hdr_e2(struct bnx2x *bp,
626 	struct bnx2x_vlan_mac_obj *o, bool add, int opcode,
627 	struct eth_classify_cmd_header *hdr)
628 {
629 	struct bnx2x_raw_obj *raw = &o->raw;
630 
631 	hdr->client_id = raw->cl_id;
632 	hdr->func_id = raw->func_id;
633 
634 	/* Rx or/and Tx (internal switching) configuration ? */
635 	hdr->cmd_general_data |=
636 		bnx2x_vlan_mac_get_rx_tx_flag(o);
637 
638 	if (add)
639 		hdr->cmd_general_data |= ETH_CLASSIFY_CMD_HEADER_IS_ADD;
640 
641 	hdr->cmd_general_data |=
642 		(opcode << ETH_CLASSIFY_CMD_HEADER_OPCODE_SHIFT);
643 }
644 
645 /**
646  * bnx2x_vlan_mac_set_rdata_hdr_e2 - set the classify ramrod data header
647  *
648  * @cid:	connection id
649  * @type:	BNX2X_FILTER_XXX_PENDING
650  * @hdr:	poiter to header to setup
651  * @rule_cnt:
652  *
653  * currently we always configure one rule and echo field to contain a CID and an
654  * opcode type.
655  */
656 static inline void bnx2x_vlan_mac_set_rdata_hdr_e2(u32 cid, int type,
657 				struct eth_classify_header *hdr, int rule_cnt)
658 {
659 	hdr->echo = (cid & BNX2X_SWCID_MASK) | (type << BNX2X_SWCID_SHIFT);
660 	hdr->rule_cnt = (u8)rule_cnt;
661 }
662 
663 
664 /* hw_config() callbacks */
665 static void bnx2x_set_one_mac_e2(struct bnx2x *bp,
666 				 struct bnx2x_vlan_mac_obj *o,
667 				 struct bnx2x_exeq_elem *elem, int rule_idx,
668 				 int cam_offset)
669 {
670 	struct bnx2x_raw_obj *raw = &o->raw;
671 	struct eth_classify_rules_ramrod_data *data =
672 		(struct eth_classify_rules_ramrod_data *)(raw->rdata);
673 	int rule_cnt = rule_idx + 1, cmd = elem->cmd_data.vlan_mac.cmd;
674 	union eth_classify_rule_cmd *rule_entry = &data->rules[rule_idx];
675 	bool add = (cmd == BNX2X_VLAN_MAC_ADD) ? true : false;
676 	unsigned long *vlan_mac_flags = &elem->cmd_data.vlan_mac.vlan_mac_flags;
677 	u8 *mac = elem->cmd_data.vlan_mac.u.mac.mac;
678 
679 	/*
680 	 * Set LLH CAM entry: currently only iSCSI and ETH macs are
681 	 * relevant. In addition, current implementation is tuned for a
682 	 * single ETH MAC.
683 	 *
684 	 * When multiple unicast ETH MACs PF configuration in switch
685 	 * independent mode is required (NetQ, multiple netdev MACs,
686 	 * etc.), consider better utilisation of 8 per function MAC
687 	 * entries in the LLH register. There is also
688 	 * NIG_REG_P[01]_LLH_FUNC_MEM2 registers that complete the
689 	 * total number of CAM entries to 16.
690 	 *
691 	 * Currently we won't configure NIG for MACs other than a primary ETH
692 	 * MAC and iSCSI L2 MAC.
693 	 *
694 	 * If this MAC is moving from one Queue to another, no need to change
695 	 * NIG configuration.
696 	 */
697 	if (cmd != BNX2X_VLAN_MAC_MOVE) {
698 		if (test_bit(BNX2X_ISCSI_ETH_MAC, vlan_mac_flags))
699 			bnx2x_set_mac_in_nig(bp, add, mac,
700 					     LLH_CAM_ISCSI_ETH_LINE);
701 		else if (test_bit(BNX2X_ETH_MAC, vlan_mac_flags))
702 			bnx2x_set_mac_in_nig(bp, add, mac, LLH_CAM_ETH_LINE);
703 	}
704 
705 	/* Reset the ramrod data buffer for the first rule */
706 	if (rule_idx == 0)
707 		memset(data, 0, sizeof(*data));
708 
709 	/* Setup a command header */
710 	bnx2x_vlan_mac_set_cmd_hdr_e2(bp, o, add, CLASSIFY_RULE_OPCODE_MAC,
711 				      &rule_entry->mac.header);
712 
713 	DP(BNX2X_MSG_SP, "About to %s MAC %pM for Queue %d\n",
714 			 add ? "add" : "delete", mac, raw->cl_id);
715 
716 	/* Set a MAC itself */
717 	bnx2x_set_fw_mac_addr(&rule_entry->mac.mac_msb,
718 			      &rule_entry->mac.mac_mid,
719 			      &rule_entry->mac.mac_lsb, mac);
720 
721 	/* MOVE: Add a rule that will add this MAC to the target Queue */
722 	if (cmd == BNX2X_VLAN_MAC_MOVE) {
723 		rule_entry++;
724 		rule_cnt++;
725 
726 		/* Setup ramrod data */
727 		bnx2x_vlan_mac_set_cmd_hdr_e2(bp,
728 					elem->cmd_data.vlan_mac.target_obj,
729 					      true, CLASSIFY_RULE_OPCODE_MAC,
730 					      &rule_entry->mac.header);
731 
732 		/* Set a MAC itself */
733 		bnx2x_set_fw_mac_addr(&rule_entry->mac.mac_msb,
734 				      &rule_entry->mac.mac_mid,
735 				      &rule_entry->mac.mac_lsb, mac);
736 	}
737 
738 	/* Set the ramrod data header */
739 	/* TODO: take this to the higher level in order to prevent multiple
740 		 writing */
741 	bnx2x_vlan_mac_set_rdata_hdr_e2(raw->cid, raw->state, &data->header,
742 					rule_cnt);
743 }
744 
745 /**
746  * bnx2x_vlan_mac_set_rdata_hdr_e1x - set a header in a single classify ramrod
747  *
748  * @bp:		device handle
749  * @o:		queue
750  * @type:
751  * @cam_offset:	offset in cam memory
752  * @hdr:	pointer to a header to setup
753  *
754  * E1/E1H
755  */
756 static inline void bnx2x_vlan_mac_set_rdata_hdr_e1x(struct bnx2x *bp,
757 	struct bnx2x_vlan_mac_obj *o, int type, int cam_offset,
758 	struct mac_configuration_hdr *hdr)
759 {
760 	struct bnx2x_raw_obj *r = &o->raw;
761 
762 	hdr->length = 1;
763 	hdr->offset = (u8)cam_offset;
764 	hdr->client_id = 0xff;
765 	hdr->echo = ((r->cid & BNX2X_SWCID_MASK) | (type << BNX2X_SWCID_SHIFT));
766 }
767 
768 static inline void bnx2x_vlan_mac_set_cfg_entry_e1x(struct bnx2x *bp,
769 	struct bnx2x_vlan_mac_obj *o, bool add, int opcode, u8 *mac,
770 	u16 vlan_id, struct mac_configuration_entry *cfg_entry)
771 {
772 	struct bnx2x_raw_obj *r = &o->raw;
773 	u32 cl_bit_vec = (1 << r->cl_id);
774 
775 	cfg_entry->clients_bit_vector = cpu_to_le32(cl_bit_vec);
776 	cfg_entry->pf_id = r->func_id;
777 	cfg_entry->vlan_id = cpu_to_le16(vlan_id);
778 
779 	if (add) {
780 		SET_FLAG(cfg_entry->flags, MAC_CONFIGURATION_ENTRY_ACTION_TYPE,
781 			 T_ETH_MAC_COMMAND_SET);
782 		SET_FLAG(cfg_entry->flags,
783 			 MAC_CONFIGURATION_ENTRY_VLAN_FILTERING_MODE, opcode);
784 
785 		/* Set a MAC in a ramrod data */
786 		bnx2x_set_fw_mac_addr(&cfg_entry->msb_mac_addr,
787 				      &cfg_entry->middle_mac_addr,
788 				      &cfg_entry->lsb_mac_addr, mac);
789 	} else
790 		SET_FLAG(cfg_entry->flags, MAC_CONFIGURATION_ENTRY_ACTION_TYPE,
791 			 T_ETH_MAC_COMMAND_INVALIDATE);
792 }
793 
794 static inline void bnx2x_vlan_mac_set_rdata_e1x(struct bnx2x *bp,
795 	struct bnx2x_vlan_mac_obj *o, int type, int cam_offset, bool add,
796 	u8 *mac, u16 vlan_id, int opcode, struct mac_configuration_cmd *config)
797 {
798 	struct mac_configuration_entry *cfg_entry = &config->config_table[0];
799 	struct bnx2x_raw_obj *raw = &o->raw;
800 
801 	bnx2x_vlan_mac_set_rdata_hdr_e1x(bp, o, type, cam_offset,
802 					 &config->hdr);
803 	bnx2x_vlan_mac_set_cfg_entry_e1x(bp, o, add, opcode, mac, vlan_id,
804 					 cfg_entry);
805 
806 	DP(BNX2X_MSG_SP, "%s MAC %pM CLID %d CAM offset %d\n",
807 			 add ? "setting" : "clearing",
808 			 mac, raw->cl_id, cam_offset);
809 }
810 
811 /**
812  * bnx2x_set_one_mac_e1x - fill a single MAC rule ramrod data
813  *
814  * @bp:		device handle
815  * @o:		bnx2x_vlan_mac_obj
816  * @elem:	bnx2x_exeq_elem
817  * @rule_idx:	rule_idx
818  * @cam_offset: cam_offset
819  */
820 static void bnx2x_set_one_mac_e1x(struct bnx2x *bp,
821 				  struct bnx2x_vlan_mac_obj *o,
822 				  struct bnx2x_exeq_elem *elem, int rule_idx,
823 				  int cam_offset)
824 {
825 	struct bnx2x_raw_obj *raw = &o->raw;
826 	struct mac_configuration_cmd *config =
827 		(struct mac_configuration_cmd *)(raw->rdata);
828 	/*
829 	 * 57710 and 57711 do not support MOVE command,
830 	 * so it's either ADD or DEL
831 	 */
832 	bool add = (elem->cmd_data.vlan_mac.cmd == BNX2X_VLAN_MAC_ADD) ?
833 		true : false;
834 
835 	/* Reset the ramrod data buffer */
836 	memset(config, 0, sizeof(*config));
837 
838 	bnx2x_vlan_mac_set_rdata_e1x(bp, o, BNX2X_FILTER_MAC_PENDING,
839 				     cam_offset, add,
840 				     elem->cmd_data.vlan_mac.u.mac.mac, 0,
841 				     ETH_VLAN_FILTER_ANY_VLAN, config);
842 }
843 
844 static void bnx2x_set_one_vlan_e2(struct bnx2x *bp,
845 				  struct bnx2x_vlan_mac_obj *o,
846 				  struct bnx2x_exeq_elem *elem, int rule_idx,
847 				  int cam_offset)
848 {
849 	struct bnx2x_raw_obj *raw = &o->raw;
850 	struct eth_classify_rules_ramrod_data *data =
851 		(struct eth_classify_rules_ramrod_data *)(raw->rdata);
852 	int rule_cnt = rule_idx + 1;
853 	union eth_classify_rule_cmd *rule_entry = &data->rules[rule_idx];
854 	int cmd = elem->cmd_data.vlan_mac.cmd;
855 	bool add = (cmd == BNX2X_VLAN_MAC_ADD) ? true : false;
856 	u16 vlan = elem->cmd_data.vlan_mac.u.vlan.vlan;
857 
858 	/* Reset the ramrod data buffer for the first rule */
859 	if (rule_idx == 0)
860 		memset(data, 0, sizeof(*data));
861 
862 	/* Set a rule header */
863 	bnx2x_vlan_mac_set_cmd_hdr_e2(bp, o, add, CLASSIFY_RULE_OPCODE_VLAN,
864 				      &rule_entry->vlan.header);
865 
866 	DP(BNX2X_MSG_SP, "About to %s VLAN %d\n", (add ? "add" : "delete"),
867 			 vlan);
868 
869 	/* Set a VLAN itself */
870 	rule_entry->vlan.vlan = cpu_to_le16(vlan);
871 
872 	/* MOVE: Add a rule that will add this MAC to the target Queue */
873 	if (cmd == BNX2X_VLAN_MAC_MOVE) {
874 		rule_entry++;
875 		rule_cnt++;
876 
877 		/* Setup ramrod data */
878 		bnx2x_vlan_mac_set_cmd_hdr_e2(bp,
879 					elem->cmd_data.vlan_mac.target_obj,
880 					      true, CLASSIFY_RULE_OPCODE_VLAN,
881 					      &rule_entry->vlan.header);
882 
883 		/* Set a VLAN itself */
884 		rule_entry->vlan.vlan = cpu_to_le16(vlan);
885 	}
886 
887 	/* Set the ramrod data header */
888 	/* TODO: take this to the higher level in order to prevent multiple
889 		 writing */
890 	bnx2x_vlan_mac_set_rdata_hdr_e2(raw->cid, raw->state, &data->header,
891 					rule_cnt);
892 }
893 
894 static void bnx2x_set_one_vlan_mac_e2(struct bnx2x *bp,
895 				      struct bnx2x_vlan_mac_obj *o,
896 				      struct bnx2x_exeq_elem *elem,
897 				      int rule_idx, int cam_offset)
898 {
899 	struct bnx2x_raw_obj *raw = &o->raw;
900 	struct eth_classify_rules_ramrod_data *data =
901 		(struct eth_classify_rules_ramrod_data *)(raw->rdata);
902 	int rule_cnt = rule_idx + 1;
903 	union eth_classify_rule_cmd *rule_entry = &data->rules[rule_idx];
904 	int cmd = elem->cmd_data.vlan_mac.cmd;
905 	bool add = (cmd == BNX2X_VLAN_MAC_ADD) ? true : false;
906 	u16 vlan = elem->cmd_data.vlan_mac.u.vlan_mac.vlan;
907 	u8 *mac = elem->cmd_data.vlan_mac.u.vlan_mac.mac;
908 
909 
910 	/* Reset the ramrod data buffer for the first rule */
911 	if (rule_idx == 0)
912 		memset(data, 0, sizeof(*data));
913 
914 	/* Set a rule header */
915 	bnx2x_vlan_mac_set_cmd_hdr_e2(bp, o, add, CLASSIFY_RULE_OPCODE_PAIR,
916 				      &rule_entry->pair.header);
917 
918 	/* Set VLAN and MAC themselvs */
919 	rule_entry->pair.vlan = cpu_to_le16(vlan);
920 	bnx2x_set_fw_mac_addr(&rule_entry->pair.mac_msb,
921 			      &rule_entry->pair.mac_mid,
922 			      &rule_entry->pair.mac_lsb, mac);
923 
924 	/* MOVE: Add a rule that will add this MAC to the target Queue */
925 	if (cmd == BNX2X_VLAN_MAC_MOVE) {
926 		rule_entry++;
927 		rule_cnt++;
928 
929 		/* Setup ramrod data */
930 		bnx2x_vlan_mac_set_cmd_hdr_e2(bp,
931 					elem->cmd_data.vlan_mac.target_obj,
932 					      true, CLASSIFY_RULE_OPCODE_PAIR,
933 					      &rule_entry->pair.header);
934 
935 		/* Set a VLAN itself */
936 		rule_entry->pair.vlan = cpu_to_le16(vlan);
937 		bnx2x_set_fw_mac_addr(&rule_entry->pair.mac_msb,
938 				      &rule_entry->pair.mac_mid,
939 				      &rule_entry->pair.mac_lsb, mac);
940 	}
941 
942 	/* Set the ramrod data header */
943 	/* TODO: take this to the higher level in order to prevent multiple
944 		 writing */
945 	bnx2x_vlan_mac_set_rdata_hdr_e2(raw->cid, raw->state, &data->header,
946 					rule_cnt);
947 }
948 
949 /**
950  * bnx2x_set_one_vlan_mac_e1h -
951  *
952  * @bp:		device handle
953  * @o:		bnx2x_vlan_mac_obj
954  * @elem:	bnx2x_exeq_elem
955  * @rule_idx:	rule_idx
956  * @cam_offset:	cam_offset
957  */
958 static void bnx2x_set_one_vlan_mac_e1h(struct bnx2x *bp,
959 				       struct bnx2x_vlan_mac_obj *o,
960 				       struct bnx2x_exeq_elem *elem,
961 				       int rule_idx, int cam_offset)
962 {
963 	struct bnx2x_raw_obj *raw = &o->raw;
964 	struct mac_configuration_cmd *config =
965 		(struct mac_configuration_cmd *)(raw->rdata);
966 	/*
967 	 * 57710 and 57711 do not support MOVE command,
968 	 * so it's either ADD or DEL
969 	 */
970 	bool add = (elem->cmd_data.vlan_mac.cmd == BNX2X_VLAN_MAC_ADD) ?
971 		true : false;
972 
973 	/* Reset the ramrod data buffer */
974 	memset(config, 0, sizeof(*config));
975 
976 	bnx2x_vlan_mac_set_rdata_e1x(bp, o, BNX2X_FILTER_VLAN_MAC_PENDING,
977 				     cam_offset, add,
978 				     elem->cmd_data.vlan_mac.u.vlan_mac.mac,
979 				     elem->cmd_data.vlan_mac.u.vlan_mac.vlan,
980 				     ETH_VLAN_FILTER_CLASSIFY, config);
981 }
982 
983 #define list_next_entry(pos, member) \
984 	list_entry((pos)->member.next, typeof(*(pos)), member)
985 
986 /**
987  * bnx2x_vlan_mac_restore - reconfigure next MAC/VLAN/VLAN-MAC element
988  *
989  * @bp:		device handle
990  * @p:		command parameters
991  * @ppos:	pointer to the cooky
992  *
993  * reconfigure next MAC/VLAN/VLAN-MAC element from the
994  * previously configured elements list.
995  *
996  * from command parameters only RAMROD_COMP_WAIT bit in ramrod_flags is	taken
997  * into an account
998  *
999  * pointer to the cooky  - that should be given back in the next call to make
1000  * function handle the next element. If *ppos is set to NULL it will restart the
1001  * iterator. If returned *ppos == NULL this means that the last element has been
1002  * handled.
1003  *
1004  */
1005 static int bnx2x_vlan_mac_restore(struct bnx2x *bp,
1006 			   struct bnx2x_vlan_mac_ramrod_params *p,
1007 			   struct bnx2x_vlan_mac_registry_elem **ppos)
1008 {
1009 	struct bnx2x_vlan_mac_registry_elem *pos;
1010 	struct bnx2x_vlan_mac_obj *o = p->vlan_mac_obj;
1011 
1012 	/* If list is empty - there is nothing to do here */
1013 	if (list_empty(&o->head)) {
1014 		*ppos = NULL;
1015 		return 0;
1016 	}
1017 
1018 	/* make a step... */
1019 	if (*ppos == NULL)
1020 		*ppos = list_first_entry(&o->head,
1021 					 struct bnx2x_vlan_mac_registry_elem,
1022 					 link);
1023 	else
1024 		*ppos = list_next_entry(*ppos, link);
1025 
1026 	pos = *ppos;
1027 
1028 	/* If it's the last step - return NULL */
1029 	if (list_is_last(&pos->link, &o->head))
1030 		*ppos = NULL;
1031 
1032 	/* Prepare a 'user_req' */
1033 	memcpy(&p->user_req.u, &pos->u, sizeof(pos->u));
1034 
1035 	/* Set the command */
1036 	p->user_req.cmd = BNX2X_VLAN_MAC_ADD;
1037 
1038 	/* Set vlan_mac_flags */
1039 	p->user_req.vlan_mac_flags = pos->vlan_mac_flags;
1040 
1041 	/* Set a restore bit */
1042 	__set_bit(RAMROD_RESTORE, &p->ramrod_flags);
1043 
1044 	return bnx2x_config_vlan_mac(bp, p);
1045 }
1046 
1047 /*
1048  * bnx2x_exeq_get_mac/bnx2x_exeq_get_vlan/bnx2x_exeq_get_vlan_mac return a
1049  * pointer to an element with a specific criteria and NULL if such an element
1050  * hasn't been found.
1051  */
1052 static struct bnx2x_exeq_elem *bnx2x_exeq_get_mac(
1053 	struct bnx2x_exe_queue_obj *o,
1054 	struct bnx2x_exeq_elem *elem)
1055 {
1056 	struct bnx2x_exeq_elem *pos;
1057 	struct bnx2x_mac_ramrod_data *data = &elem->cmd_data.vlan_mac.u.mac;
1058 
1059 	/* Check pending for execution commands */
1060 	list_for_each_entry(pos, &o->exe_queue, link)
1061 		if (!memcmp(&pos->cmd_data.vlan_mac.u.mac, data,
1062 			      sizeof(*data)) &&
1063 		    (pos->cmd_data.vlan_mac.cmd == elem->cmd_data.vlan_mac.cmd))
1064 			return pos;
1065 
1066 	return NULL;
1067 }
1068 
1069 static struct bnx2x_exeq_elem *bnx2x_exeq_get_vlan(
1070 	struct bnx2x_exe_queue_obj *o,
1071 	struct bnx2x_exeq_elem *elem)
1072 {
1073 	struct bnx2x_exeq_elem *pos;
1074 	struct bnx2x_vlan_ramrod_data *data = &elem->cmd_data.vlan_mac.u.vlan;
1075 
1076 	/* Check pending for execution commands */
1077 	list_for_each_entry(pos, &o->exe_queue, link)
1078 		if (!memcmp(&pos->cmd_data.vlan_mac.u.vlan, data,
1079 			      sizeof(*data)) &&
1080 		    (pos->cmd_data.vlan_mac.cmd == elem->cmd_data.vlan_mac.cmd))
1081 			return pos;
1082 
1083 	return NULL;
1084 }
1085 
1086 static struct bnx2x_exeq_elem *bnx2x_exeq_get_vlan_mac(
1087 	struct bnx2x_exe_queue_obj *o,
1088 	struct bnx2x_exeq_elem *elem)
1089 {
1090 	struct bnx2x_exeq_elem *pos;
1091 	struct bnx2x_vlan_mac_ramrod_data *data =
1092 		&elem->cmd_data.vlan_mac.u.vlan_mac;
1093 
1094 	/* Check pending for execution commands */
1095 	list_for_each_entry(pos, &o->exe_queue, link)
1096 		if (!memcmp(&pos->cmd_data.vlan_mac.u.vlan_mac, data,
1097 			      sizeof(*data)) &&
1098 		    (pos->cmd_data.vlan_mac.cmd == elem->cmd_data.vlan_mac.cmd))
1099 			return pos;
1100 
1101 	return NULL;
1102 }
1103 
1104 /**
1105  * bnx2x_validate_vlan_mac_add - check if an ADD command can be executed
1106  *
1107  * @bp:		device handle
1108  * @qo:		bnx2x_qable_obj
1109  * @elem:	bnx2x_exeq_elem
1110  *
1111  * Checks that the requested configuration can be added. If yes and if
1112  * requested, consume CAM credit.
1113  *
1114  * The 'validate' is run after the 'optimize'.
1115  *
1116  */
1117 static inline int bnx2x_validate_vlan_mac_add(struct bnx2x *bp,
1118 					      union bnx2x_qable_obj *qo,
1119 					      struct bnx2x_exeq_elem *elem)
1120 {
1121 	struct bnx2x_vlan_mac_obj *o = &qo->vlan_mac;
1122 	struct bnx2x_exe_queue_obj *exeq = &o->exe_queue;
1123 	int rc;
1124 
1125 	/* Check the registry */
1126 	rc = o->check_add(o, &elem->cmd_data.vlan_mac.u);
1127 	if (rc) {
1128 		DP(BNX2X_MSG_SP, "ADD command is not allowed considering "
1129 				 "current registry state\n");
1130 		return rc;
1131 	}
1132 
1133 	/*
1134 	 * Check if there is a pending ADD command for this
1135 	 * MAC/VLAN/VLAN-MAC. Return an error if there is.
1136 	 */
1137 	if (exeq->get(exeq, elem)) {
1138 		DP(BNX2X_MSG_SP, "There is a pending ADD command already\n");
1139 		return -EEXIST;
1140 	}
1141 
1142 	/*
1143 	 * TODO: Check the pending MOVE from other objects where this
1144 	 * object is a destination object.
1145 	 */
1146 
1147 	/* Consume the credit if not requested not to */
1148 	if (!(test_bit(BNX2X_DONT_CONSUME_CAM_CREDIT,
1149 		       &elem->cmd_data.vlan_mac.vlan_mac_flags) ||
1150 	    o->get_credit(o)))
1151 		return -EINVAL;
1152 
1153 	return 0;
1154 }
1155 
1156 /**
1157  * bnx2x_validate_vlan_mac_del - check if the DEL command can be executed
1158  *
1159  * @bp:		device handle
1160  * @qo:		quable object to check
1161  * @elem:	element that needs to be deleted
1162  *
1163  * Checks that the requested configuration can be deleted. If yes and if
1164  * requested, returns a CAM credit.
1165  *
1166  * The 'validate' is run after the 'optimize'.
1167  */
1168 static inline int bnx2x_validate_vlan_mac_del(struct bnx2x *bp,
1169 					      union bnx2x_qable_obj *qo,
1170 					      struct bnx2x_exeq_elem *elem)
1171 {
1172 	struct bnx2x_vlan_mac_obj *o = &qo->vlan_mac;
1173 	struct bnx2x_vlan_mac_registry_elem *pos;
1174 	struct bnx2x_exe_queue_obj *exeq = &o->exe_queue;
1175 	struct bnx2x_exeq_elem query_elem;
1176 
1177 	/* If this classification can not be deleted (doesn't exist)
1178 	 * - return a BNX2X_EXIST.
1179 	 */
1180 	pos = o->check_del(o, &elem->cmd_data.vlan_mac.u);
1181 	if (!pos) {
1182 		DP(BNX2X_MSG_SP, "DEL command is not allowed considering "
1183 				 "current registry state\n");
1184 		return -EEXIST;
1185 	}
1186 
1187 	/*
1188 	 * Check if there are pending DEL or MOVE commands for this
1189 	 * MAC/VLAN/VLAN-MAC. Return an error if so.
1190 	 */
1191 	memcpy(&query_elem, elem, sizeof(query_elem));
1192 
1193 	/* Check for MOVE commands */
1194 	query_elem.cmd_data.vlan_mac.cmd = BNX2X_VLAN_MAC_MOVE;
1195 	if (exeq->get(exeq, &query_elem)) {
1196 		BNX2X_ERR("There is a pending MOVE command already\n");
1197 		return -EINVAL;
1198 	}
1199 
1200 	/* Check for DEL commands */
1201 	if (exeq->get(exeq, elem)) {
1202 		DP(BNX2X_MSG_SP, "There is a pending DEL command already\n");
1203 		return -EEXIST;
1204 	}
1205 
1206 	/* Return the credit to the credit pool if not requested not to */
1207 	if (!(test_bit(BNX2X_DONT_CONSUME_CAM_CREDIT,
1208 		       &elem->cmd_data.vlan_mac.vlan_mac_flags) ||
1209 	    o->put_credit(o))) {
1210 		BNX2X_ERR("Failed to return a credit\n");
1211 		return -EINVAL;
1212 	}
1213 
1214 	return 0;
1215 }
1216 
1217 /**
1218  * bnx2x_validate_vlan_mac_move - check if the MOVE command can be executed
1219  *
1220  * @bp:		device handle
1221  * @qo:		quable object to check (source)
1222  * @elem:	element that needs to be moved
1223  *
1224  * Checks that the requested configuration can be moved. If yes and if
1225  * requested, returns a CAM credit.
1226  *
1227  * The 'validate' is run after the 'optimize'.
1228  */
1229 static inline int bnx2x_validate_vlan_mac_move(struct bnx2x *bp,
1230 					       union bnx2x_qable_obj *qo,
1231 					       struct bnx2x_exeq_elem *elem)
1232 {
1233 	struct bnx2x_vlan_mac_obj *src_o = &qo->vlan_mac;
1234 	struct bnx2x_vlan_mac_obj *dest_o = elem->cmd_data.vlan_mac.target_obj;
1235 	struct bnx2x_exeq_elem query_elem;
1236 	struct bnx2x_exe_queue_obj *src_exeq = &src_o->exe_queue;
1237 	struct bnx2x_exe_queue_obj *dest_exeq = &dest_o->exe_queue;
1238 
1239 	/*
1240 	 * Check if we can perform this operation based on the current registry
1241 	 * state.
1242 	 */
1243 	if (!src_o->check_move(src_o, dest_o, &elem->cmd_data.vlan_mac.u)) {
1244 		DP(BNX2X_MSG_SP, "MOVE command is not allowed considering "
1245 				 "current registry state\n");
1246 		return -EINVAL;
1247 	}
1248 
1249 	/*
1250 	 * Check if there is an already pending DEL or MOVE command for the
1251 	 * source object or ADD command for a destination object. Return an
1252 	 * error if so.
1253 	 */
1254 	memcpy(&query_elem, elem, sizeof(query_elem));
1255 
1256 	/* Check DEL on source */
1257 	query_elem.cmd_data.vlan_mac.cmd = BNX2X_VLAN_MAC_DEL;
1258 	if (src_exeq->get(src_exeq, &query_elem)) {
1259 		BNX2X_ERR("There is a pending DEL command on the source "
1260 			  "queue already\n");
1261 		return -EINVAL;
1262 	}
1263 
1264 	/* Check MOVE on source */
1265 	if (src_exeq->get(src_exeq, elem)) {
1266 		DP(BNX2X_MSG_SP, "There is a pending MOVE command already\n");
1267 		return -EEXIST;
1268 	}
1269 
1270 	/* Check ADD on destination */
1271 	query_elem.cmd_data.vlan_mac.cmd = BNX2X_VLAN_MAC_ADD;
1272 	if (dest_exeq->get(dest_exeq, &query_elem)) {
1273 		BNX2X_ERR("There is a pending ADD command on the "
1274 			  "destination queue already\n");
1275 		return -EINVAL;
1276 	}
1277 
1278 	/* Consume the credit if not requested not to */
1279 	if (!(test_bit(BNX2X_DONT_CONSUME_CAM_CREDIT_DEST,
1280 		       &elem->cmd_data.vlan_mac.vlan_mac_flags) ||
1281 	    dest_o->get_credit(dest_o)))
1282 		return -EINVAL;
1283 
1284 	if (!(test_bit(BNX2X_DONT_CONSUME_CAM_CREDIT,
1285 		       &elem->cmd_data.vlan_mac.vlan_mac_flags) ||
1286 	    src_o->put_credit(src_o))) {
1287 		/* return the credit taken from dest... */
1288 		dest_o->put_credit(dest_o);
1289 		return -EINVAL;
1290 	}
1291 
1292 	return 0;
1293 }
1294 
1295 static int bnx2x_validate_vlan_mac(struct bnx2x *bp,
1296 				   union bnx2x_qable_obj *qo,
1297 				   struct bnx2x_exeq_elem *elem)
1298 {
1299 	switch (elem->cmd_data.vlan_mac.cmd) {
1300 	case BNX2X_VLAN_MAC_ADD:
1301 		return bnx2x_validate_vlan_mac_add(bp, qo, elem);
1302 	case BNX2X_VLAN_MAC_DEL:
1303 		return bnx2x_validate_vlan_mac_del(bp, qo, elem);
1304 	case BNX2X_VLAN_MAC_MOVE:
1305 		return bnx2x_validate_vlan_mac_move(bp, qo, elem);
1306 	default:
1307 		return -EINVAL;
1308 	}
1309 }
1310 
1311 /**
1312  * bnx2x_wait_vlan_mac - passivly wait for 5 seconds until all work completes.
1313  *
1314  * @bp:		device handle
1315  * @o:		bnx2x_vlan_mac_obj
1316  *
1317  */
1318 static int bnx2x_wait_vlan_mac(struct bnx2x *bp,
1319 			       struct bnx2x_vlan_mac_obj *o)
1320 {
1321 	int cnt = 5000, rc;
1322 	struct bnx2x_exe_queue_obj *exeq = &o->exe_queue;
1323 	struct bnx2x_raw_obj *raw = &o->raw;
1324 
1325 	while (cnt--) {
1326 		/* Wait for the current command to complete */
1327 		rc = raw->wait_comp(bp, raw);
1328 		if (rc)
1329 			return rc;
1330 
1331 		/* Wait until there are no pending commands */
1332 		if (!bnx2x_exe_queue_empty(exeq))
1333 			usleep_range(1000, 1000);
1334 		else
1335 			return 0;
1336 	}
1337 
1338 	return -EBUSY;
1339 }
1340 
1341 /**
1342  * bnx2x_complete_vlan_mac - complete one VLAN-MAC ramrod
1343  *
1344  * @bp:		device handle
1345  * @o:		bnx2x_vlan_mac_obj
1346  * @cqe:
1347  * @cont:	if true schedule next execution chunk
1348  *
1349  */
1350 static int bnx2x_complete_vlan_mac(struct bnx2x *bp,
1351 				   struct bnx2x_vlan_mac_obj *o,
1352 				   union event_ring_elem *cqe,
1353 				   unsigned long *ramrod_flags)
1354 {
1355 	struct bnx2x_raw_obj *r = &o->raw;
1356 	int rc;
1357 
1358 	/* Reset pending list */
1359 	bnx2x_exe_queue_reset_pending(bp, &o->exe_queue);
1360 
1361 	/* Clear pending */
1362 	r->clear_pending(r);
1363 
1364 	/* If ramrod failed this is most likely a SW bug */
1365 	if (cqe->message.error)
1366 		return -EINVAL;
1367 
1368 	/* Run the next bulk of pending commands if requeted */
1369 	if (test_bit(RAMROD_CONT, ramrod_flags)) {
1370 		rc = bnx2x_exe_queue_step(bp, &o->exe_queue, ramrod_flags);
1371 		if (rc < 0)
1372 			return rc;
1373 	}
1374 
1375 	/* If there is more work to do return PENDING */
1376 	if (!bnx2x_exe_queue_empty(&o->exe_queue))
1377 		return 1;
1378 
1379 	return 0;
1380 }
1381 
1382 /**
1383  * bnx2x_optimize_vlan_mac - optimize ADD and DEL commands.
1384  *
1385  * @bp:		device handle
1386  * @o:		bnx2x_qable_obj
1387  * @elem:	bnx2x_exeq_elem
1388  */
1389 static int bnx2x_optimize_vlan_mac(struct bnx2x *bp,
1390 				   union bnx2x_qable_obj *qo,
1391 				   struct bnx2x_exeq_elem *elem)
1392 {
1393 	struct bnx2x_exeq_elem query, *pos;
1394 	struct bnx2x_vlan_mac_obj *o = &qo->vlan_mac;
1395 	struct bnx2x_exe_queue_obj *exeq = &o->exe_queue;
1396 
1397 	memcpy(&query, elem, sizeof(query));
1398 
1399 	switch (elem->cmd_data.vlan_mac.cmd) {
1400 	case BNX2X_VLAN_MAC_ADD:
1401 		query.cmd_data.vlan_mac.cmd = BNX2X_VLAN_MAC_DEL;
1402 		break;
1403 	case BNX2X_VLAN_MAC_DEL:
1404 		query.cmd_data.vlan_mac.cmd = BNX2X_VLAN_MAC_ADD;
1405 		break;
1406 	default:
1407 		/* Don't handle anything other than ADD or DEL */
1408 		return 0;
1409 	}
1410 
1411 	/* If we found the appropriate element - delete it */
1412 	pos = exeq->get(exeq, &query);
1413 	if (pos) {
1414 
1415 		/* Return the credit of the optimized command */
1416 		if (!test_bit(BNX2X_DONT_CONSUME_CAM_CREDIT,
1417 			      &pos->cmd_data.vlan_mac.vlan_mac_flags)) {
1418 			if ((query.cmd_data.vlan_mac.cmd ==
1419 			     BNX2X_VLAN_MAC_ADD) && !o->put_credit(o)) {
1420 				BNX2X_ERR("Failed to return the credit for the "
1421 					  "optimized ADD command\n");
1422 				return -EINVAL;
1423 			} else if (!o->get_credit(o)) { /* VLAN_MAC_DEL */
1424 				BNX2X_ERR("Failed to recover the credit from "
1425 					  "the optimized DEL command\n");
1426 				return -EINVAL;
1427 			}
1428 		}
1429 
1430 		DP(BNX2X_MSG_SP, "Optimizing %s command\n",
1431 			   (elem->cmd_data.vlan_mac.cmd == BNX2X_VLAN_MAC_ADD) ?
1432 			   "ADD" : "DEL");
1433 
1434 		list_del(&pos->link);
1435 		bnx2x_exe_queue_free_elem(bp, pos);
1436 		return 1;
1437 	}
1438 
1439 	return 0;
1440 }
1441 
1442 /**
1443  * bnx2x_vlan_mac_get_registry_elem - prepare a registry element
1444  *
1445  * @bp:	  device handle
1446  * @o:
1447  * @elem:
1448  * @restore:
1449  * @re:
1450  *
1451  * prepare a registry element according to the current command request.
1452  */
1453 static inline int bnx2x_vlan_mac_get_registry_elem(
1454 	struct bnx2x *bp,
1455 	struct bnx2x_vlan_mac_obj *o,
1456 	struct bnx2x_exeq_elem *elem,
1457 	bool restore,
1458 	struct bnx2x_vlan_mac_registry_elem **re)
1459 {
1460 	int cmd = elem->cmd_data.vlan_mac.cmd;
1461 	struct bnx2x_vlan_mac_registry_elem *reg_elem;
1462 
1463 	/* Allocate a new registry element if needed. */
1464 	if (!restore &&
1465 	    ((cmd == BNX2X_VLAN_MAC_ADD) || (cmd == BNX2X_VLAN_MAC_MOVE))) {
1466 		reg_elem = kzalloc(sizeof(*reg_elem), GFP_ATOMIC);
1467 		if (!reg_elem)
1468 			return -ENOMEM;
1469 
1470 		/* Get a new CAM offset */
1471 		if (!o->get_cam_offset(o, &reg_elem->cam_offset)) {
1472 			/*
1473 			 * This shell never happen, because we have checked the
1474 			 * CAM availiability in the 'validate'.
1475 			 */
1476 			WARN_ON(1);
1477 			kfree(reg_elem);
1478 			return -EINVAL;
1479 		}
1480 
1481 		DP(BNX2X_MSG_SP, "Got cam offset %d\n", reg_elem->cam_offset);
1482 
1483 		/* Set a VLAN-MAC data */
1484 		memcpy(&reg_elem->u, &elem->cmd_data.vlan_mac.u,
1485 			  sizeof(reg_elem->u));
1486 
1487 		/* Copy the flags (needed for DEL and RESTORE flows) */
1488 		reg_elem->vlan_mac_flags =
1489 			elem->cmd_data.vlan_mac.vlan_mac_flags;
1490 	} else /* DEL, RESTORE */
1491 		reg_elem = o->check_del(o, &elem->cmd_data.vlan_mac.u);
1492 
1493 	*re = reg_elem;
1494 	return 0;
1495 }
1496 
1497 /**
1498  * bnx2x_execute_vlan_mac - execute vlan mac command
1499  *
1500  * @bp:			device handle
1501  * @qo:
1502  * @exe_chunk:
1503  * @ramrod_flags:
1504  *
1505  * go and send a ramrod!
1506  */
1507 static int bnx2x_execute_vlan_mac(struct bnx2x *bp,
1508 				  union bnx2x_qable_obj *qo,
1509 				  struct list_head *exe_chunk,
1510 				  unsigned long *ramrod_flags)
1511 {
1512 	struct bnx2x_exeq_elem *elem;
1513 	struct bnx2x_vlan_mac_obj *o = &qo->vlan_mac, *cam_obj;
1514 	struct bnx2x_raw_obj *r = &o->raw;
1515 	int rc, idx = 0;
1516 	bool restore = test_bit(RAMROD_RESTORE, ramrod_flags);
1517 	bool drv_only = test_bit(RAMROD_DRV_CLR_ONLY, ramrod_flags);
1518 	struct bnx2x_vlan_mac_registry_elem *reg_elem;
1519 	int cmd;
1520 
1521 	/*
1522 	 * If DRIVER_ONLY execution is requested, cleanup a registry
1523 	 * and exit. Otherwise send a ramrod to FW.
1524 	 */
1525 	if (!drv_only) {
1526 		WARN_ON(r->check_pending(r));
1527 
1528 		/* Set pending */
1529 		r->set_pending(r);
1530 
1531 		/* Fill tha ramrod data */
1532 		list_for_each_entry(elem, exe_chunk, link) {
1533 			cmd = elem->cmd_data.vlan_mac.cmd;
1534 			/*
1535 			 * We will add to the target object in MOVE command, so
1536 			 * change the object for a CAM search.
1537 			 */
1538 			if (cmd == BNX2X_VLAN_MAC_MOVE)
1539 				cam_obj = elem->cmd_data.vlan_mac.target_obj;
1540 			else
1541 				cam_obj = o;
1542 
1543 			rc = bnx2x_vlan_mac_get_registry_elem(bp, cam_obj,
1544 							      elem, restore,
1545 							      &reg_elem);
1546 			if (rc)
1547 				goto error_exit;
1548 
1549 			WARN_ON(!reg_elem);
1550 
1551 			/* Push a new entry into the registry */
1552 			if (!restore &&
1553 			    ((cmd == BNX2X_VLAN_MAC_ADD) ||
1554 			    (cmd == BNX2X_VLAN_MAC_MOVE)))
1555 				list_add(&reg_elem->link, &cam_obj->head);
1556 
1557 			/* Configure a single command in a ramrod data buffer */
1558 			o->set_one_rule(bp, o, elem, idx,
1559 					reg_elem->cam_offset);
1560 
1561 			/* MOVE command consumes 2 entries in the ramrod data */
1562 			if (cmd == BNX2X_VLAN_MAC_MOVE)
1563 				idx += 2;
1564 			else
1565 				idx++;
1566 		}
1567 
1568 		/*
1569 		 *  No need for an explicit memory barrier here as long we would
1570 		 *  need to ensure the ordering of writing to the SPQ element
1571 		 *  and updating of the SPQ producer which involves a memory
1572 		 *  read and we will have to put a full memory barrier there
1573 		 *  (inside bnx2x_sp_post()).
1574 		 */
1575 
1576 		rc = bnx2x_sp_post(bp, o->ramrod_cmd, r->cid,
1577 				   U64_HI(r->rdata_mapping),
1578 				   U64_LO(r->rdata_mapping),
1579 				   ETH_CONNECTION_TYPE);
1580 		if (rc)
1581 			goto error_exit;
1582 	}
1583 
1584 	/* Now, when we are done with the ramrod - clean up the registry */
1585 	list_for_each_entry(elem, exe_chunk, link) {
1586 		cmd = elem->cmd_data.vlan_mac.cmd;
1587 		if ((cmd == BNX2X_VLAN_MAC_DEL) ||
1588 		    (cmd == BNX2X_VLAN_MAC_MOVE)) {
1589 			reg_elem = o->check_del(o, &elem->cmd_data.vlan_mac.u);
1590 
1591 			WARN_ON(!reg_elem);
1592 
1593 			o->put_cam_offset(o, reg_elem->cam_offset);
1594 			list_del(&reg_elem->link);
1595 			kfree(reg_elem);
1596 		}
1597 	}
1598 
1599 	if (!drv_only)
1600 		return 1;
1601 	else
1602 		return 0;
1603 
1604 error_exit:
1605 	r->clear_pending(r);
1606 
1607 	/* Cleanup a registry in case of a failure */
1608 	list_for_each_entry(elem, exe_chunk, link) {
1609 		cmd = elem->cmd_data.vlan_mac.cmd;
1610 
1611 		if (cmd == BNX2X_VLAN_MAC_MOVE)
1612 			cam_obj = elem->cmd_data.vlan_mac.target_obj;
1613 		else
1614 			cam_obj = o;
1615 
1616 		/* Delete all newly added above entries */
1617 		if (!restore &&
1618 		    ((cmd == BNX2X_VLAN_MAC_ADD) ||
1619 		    (cmd == BNX2X_VLAN_MAC_MOVE))) {
1620 			reg_elem = o->check_del(cam_obj,
1621 						&elem->cmd_data.vlan_mac.u);
1622 			if (reg_elem) {
1623 				list_del(&reg_elem->link);
1624 				kfree(reg_elem);
1625 			}
1626 		}
1627 	}
1628 
1629 	return rc;
1630 }
1631 
1632 static inline int bnx2x_vlan_mac_push_new_cmd(
1633 	struct bnx2x *bp,
1634 	struct bnx2x_vlan_mac_ramrod_params *p)
1635 {
1636 	struct bnx2x_exeq_elem *elem;
1637 	struct bnx2x_vlan_mac_obj *o = p->vlan_mac_obj;
1638 	bool restore = test_bit(RAMROD_RESTORE, &p->ramrod_flags);
1639 
1640 	/* Allocate the execution queue element */
1641 	elem = bnx2x_exe_queue_alloc_elem(bp);
1642 	if (!elem)
1643 		return -ENOMEM;
1644 
1645 	/* Set the command 'length' */
1646 	switch (p->user_req.cmd) {
1647 	case BNX2X_VLAN_MAC_MOVE:
1648 		elem->cmd_len = 2;
1649 		break;
1650 	default:
1651 		elem->cmd_len = 1;
1652 	}
1653 
1654 	/* Fill the object specific info */
1655 	memcpy(&elem->cmd_data.vlan_mac, &p->user_req, sizeof(p->user_req));
1656 
1657 	/* Try to add a new command to the pending list */
1658 	return bnx2x_exe_queue_add(bp, &o->exe_queue, elem, restore);
1659 }
1660 
1661 /**
1662  * bnx2x_config_vlan_mac - configure VLAN/MAC/VLAN_MAC filtering rules.
1663  *
1664  * @bp:	  device handle
1665  * @p:
1666  *
1667  */
1668 int bnx2x_config_vlan_mac(
1669 	struct bnx2x *bp,
1670 	struct bnx2x_vlan_mac_ramrod_params *p)
1671 {
1672 	int rc = 0;
1673 	struct bnx2x_vlan_mac_obj *o = p->vlan_mac_obj;
1674 	unsigned long *ramrod_flags = &p->ramrod_flags;
1675 	bool cont = test_bit(RAMROD_CONT, ramrod_flags);
1676 	struct bnx2x_raw_obj *raw = &o->raw;
1677 
1678 	/*
1679 	 * Add new elements to the execution list for commands that require it.
1680 	 */
1681 	if (!cont) {
1682 		rc = bnx2x_vlan_mac_push_new_cmd(bp, p);
1683 		if (rc)
1684 			return rc;
1685 	}
1686 
1687 	/*
1688 	 * If nothing will be executed further in this iteration we want to
1689 	 * return PENDING if there are pending commands
1690 	 */
1691 	if (!bnx2x_exe_queue_empty(&o->exe_queue))
1692 		rc = 1;
1693 
1694 	if (test_bit(RAMROD_DRV_CLR_ONLY, ramrod_flags))  {
1695 		DP(BNX2X_MSG_SP, "RAMROD_DRV_CLR_ONLY requested: "
1696 				 "clearing a pending bit.\n");
1697 		raw->clear_pending(raw);
1698 	}
1699 
1700 	/* Execute commands if required */
1701 	if (cont || test_bit(RAMROD_EXEC, ramrod_flags) ||
1702 	    test_bit(RAMROD_COMP_WAIT, ramrod_flags)) {
1703 		rc = bnx2x_exe_queue_step(bp, &o->exe_queue, ramrod_flags);
1704 		if (rc < 0)
1705 			return rc;
1706 	}
1707 
1708 	/*
1709 	 * RAMROD_COMP_WAIT is a superset of RAMROD_EXEC. If it was set
1710 	 * then user want to wait until the last command is done.
1711 	 */
1712 	if (test_bit(RAMROD_COMP_WAIT, &p->ramrod_flags)) {
1713 		/*
1714 		 * Wait maximum for the current exe_queue length iterations plus
1715 		 * one (for the current pending command).
1716 		 */
1717 		int max_iterations = bnx2x_exe_queue_length(&o->exe_queue) + 1;
1718 
1719 		while (!bnx2x_exe_queue_empty(&o->exe_queue) &&
1720 		       max_iterations--) {
1721 
1722 			/* Wait for the current command to complete */
1723 			rc = raw->wait_comp(bp, raw);
1724 			if (rc)
1725 				return rc;
1726 
1727 			/* Make a next step */
1728 			rc = bnx2x_exe_queue_step(bp, &o->exe_queue,
1729 						  ramrod_flags);
1730 			if (rc < 0)
1731 				return rc;
1732 		}
1733 
1734 		return 0;
1735 	}
1736 
1737 	return rc;
1738 }
1739 
1740 
1741 
1742 /**
1743  * bnx2x_vlan_mac_del_all - delete elements with given vlan_mac_flags spec
1744  *
1745  * @bp:			device handle
1746  * @o:
1747  * @vlan_mac_flags:
1748  * @ramrod_flags:	execution flags to be used for this deletion
1749  *
1750  * if the last operation has completed successfully and there are no
1751  * moreelements left, positive value if the last operation has completed
1752  * successfully and there are more previously configured elements, negative
1753  * value is current operation has failed.
1754  */
1755 static int bnx2x_vlan_mac_del_all(struct bnx2x *bp,
1756 				  struct bnx2x_vlan_mac_obj *o,
1757 				  unsigned long *vlan_mac_flags,
1758 				  unsigned long *ramrod_flags)
1759 {
1760 	struct bnx2x_vlan_mac_registry_elem *pos = NULL;
1761 	int rc = 0;
1762 	struct bnx2x_vlan_mac_ramrod_params p;
1763 	struct bnx2x_exe_queue_obj *exeq = &o->exe_queue;
1764 	struct bnx2x_exeq_elem *exeq_pos, *exeq_pos_n;
1765 
1766 	/* Clear pending commands first */
1767 
1768 	spin_lock_bh(&exeq->lock);
1769 
1770 	list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) {
1771 		if (exeq_pos->cmd_data.vlan_mac.vlan_mac_flags ==
1772 		    *vlan_mac_flags)
1773 			list_del(&exeq_pos->link);
1774 	}
1775 
1776 	spin_unlock_bh(&exeq->lock);
1777 
1778 	/* Prepare a command request */
1779 	memset(&p, 0, sizeof(p));
1780 	p.vlan_mac_obj = o;
1781 	p.ramrod_flags = *ramrod_flags;
1782 	p.user_req.cmd = BNX2X_VLAN_MAC_DEL;
1783 
1784 	/*
1785 	 * Add all but the last VLAN-MAC to the execution queue without actually
1786 	 * execution anything.
1787 	 */
1788 	__clear_bit(RAMROD_COMP_WAIT, &p.ramrod_flags);
1789 	__clear_bit(RAMROD_EXEC, &p.ramrod_flags);
1790 	__clear_bit(RAMROD_CONT, &p.ramrod_flags);
1791 
1792 	list_for_each_entry(pos, &o->head, link) {
1793 		if (pos->vlan_mac_flags == *vlan_mac_flags) {
1794 			p.user_req.vlan_mac_flags = pos->vlan_mac_flags;
1795 			memcpy(&p.user_req.u, &pos->u, sizeof(pos->u));
1796 			rc = bnx2x_config_vlan_mac(bp, &p);
1797 			if (rc < 0) {
1798 				BNX2X_ERR("Failed to add a new DEL command\n");
1799 				return rc;
1800 			}
1801 		}
1802 	}
1803 
1804 	p.ramrod_flags = *ramrod_flags;
1805 	__set_bit(RAMROD_CONT, &p.ramrod_flags);
1806 
1807 	return bnx2x_config_vlan_mac(bp, &p);
1808 }
1809 
1810 static inline void bnx2x_init_raw_obj(struct bnx2x_raw_obj *raw, u8 cl_id,
1811 	u32 cid, u8 func_id, void *rdata, dma_addr_t rdata_mapping, int state,
1812 	unsigned long *pstate, bnx2x_obj_type type)
1813 {
1814 	raw->func_id = func_id;
1815 	raw->cid = cid;
1816 	raw->cl_id = cl_id;
1817 	raw->rdata = rdata;
1818 	raw->rdata_mapping = rdata_mapping;
1819 	raw->state = state;
1820 	raw->pstate = pstate;
1821 	raw->obj_type = type;
1822 	raw->check_pending = bnx2x_raw_check_pending;
1823 	raw->clear_pending = bnx2x_raw_clear_pending;
1824 	raw->set_pending = bnx2x_raw_set_pending;
1825 	raw->wait_comp = bnx2x_raw_wait;
1826 }
1827 
1828 static inline void bnx2x_init_vlan_mac_common(struct bnx2x_vlan_mac_obj *o,
1829 	u8 cl_id, u32 cid, u8 func_id, void *rdata, dma_addr_t rdata_mapping,
1830 	int state, unsigned long *pstate, bnx2x_obj_type type,
1831 	struct bnx2x_credit_pool_obj *macs_pool,
1832 	struct bnx2x_credit_pool_obj *vlans_pool)
1833 {
1834 	INIT_LIST_HEAD(&o->head);
1835 
1836 	o->macs_pool = macs_pool;
1837 	o->vlans_pool = vlans_pool;
1838 
1839 	o->delete_all = bnx2x_vlan_mac_del_all;
1840 	o->restore = bnx2x_vlan_mac_restore;
1841 	o->complete = bnx2x_complete_vlan_mac;
1842 	o->wait = bnx2x_wait_vlan_mac;
1843 
1844 	bnx2x_init_raw_obj(&o->raw, cl_id, cid, func_id, rdata, rdata_mapping,
1845 			   state, pstate, type);
1846 }
1847 
1848 
1849 void bnx2x_init_mac_obj(struct bnx2x *bp,
1850 			struct bnx2x_vlan_mac_obj *mac_obj,
1851 			u8 cl_id, u32 cid, u8 func_id, void *rdata,
1852 			dma_addr_t rdata_mapping, int state,
1853 			unsigned long *pstate, bnx2x_obj_type type,
1854 			struct bnx2x_credit_pool_obj *macs_pool)
1855 {
1856 	union bnx2x_qable_obj *qable_obj = (union bnx2x_qable_obj *)mac_obj;
1857 
1858 	bnx2x_init_vlan_mac_common(mac_obj, cl_id, cid, func_id, rdata,
1859 				   rdata_mapping, state, pstate, type,
1860 				   macs_pool, NULL);
1861 
1862 	/* CAM credit pool handling */
1863 	mac_obj->get_credit = bnx2x_get_credit_mac;
1864 	mac_obj->put_credit = bnx2x_put_credit_mac;
1865 	mac_obj->get_cam_offset = bnx2x_get_cam_offset_mac;
1866 	mac_obj->put_cam_offset = bnx2x_put_cam_offset_mac;
1867 
1868 	if (CHIP_IS_E1x(bp)) {
1869 		mac_obj->set_one_rule      = bnx2x_set_one_mac_e1x;
1870 		mac_obj->check_del         = bnx2x_check_mac_del;
1871 		mac_obj->check_add         = bnx2x_check_mac_add;
1872 		mac_obj->check_move        = bnx2x_check_move_always_err;
1873 		mac_obj->ramrod_cmd        = RAMROD_CMD_ID_ETH_SET_MAC;
1874 
1875 		/* Exe Queue */
1876 		bnx2x_exe_queue_init(bp,
1877 				     &mac_obj->exe_queue, 1, qable_obj,
1878 				     bnx2x_validate_vlan_mac,
1879 				     bnx2x_optimize_vlan_mac,
1880 				     bnx2x_execute_vlan_mac,
1881 				     bnx2x_exeq_get_mac);
1882 	} else {
1883 		mac_obj->set_one_rule      = bnx2x_set_one_mac_e2;
1884 		mac_obj->check_del         = bnx2x_check_mac_del;
1885 		mac_obj->check_add         = bnx2x_check_mac_add;
1886 		mac_obj->check_move        = bnx2x_check_move;
1887 		mac_obj->ramrod_cmd        =
1888 			RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES;
1889 
1890 		/* Exe Queue */
1891 		bnx2x_exe_queue_init(bp,
1892 				     &mac_obj->exe_queue, CLASSIFY_RULES_COUNT,
1893 				     qable_obj, bnx2x_validate_vlan_mac,
1894 				     bnx2x_optimize_vlan_mac,
1895 				     bnx2x_execute_vlan_mac,
1896 				     bnx2x_exeq_get_mac);
1897 	}
1898 }
1899 
1900 void bnx2x_init_vlan_obj(struct bnx2x *bp,
1901 			 struct bnx2x_vlan_mac_obj *vlan_obj,
1902 			 u8 cl_id, u32 cid, u8 func_id, void *rdata,
1903 			 dma_addr_t rdata_mapping, int state,
1904 			 unsigned long *pstate, bnx2x_obj_type type,
1905 			 struct bnx2x_credit_pool_obj *vlans_pool)
1906 {
1907 	union bnx2x_qable_obj *qable_obj = (union bnx2x_qable_obj *)vlan_obj;
1908 
1909 	bnx2x_init_vlan_mac_common(vlan_obj, cl_id, cid, func_id, rdata,
1910 				   rdata_mapping, state, pstate, type, NULL,
1911 				   vlans_pool);
1912 
1913 	vlan_obj->get_credit = bnx2x_get_credit_vlan;
1914 	vlan_obj->put_credit = bnx2x_put_credit_vlan;
1915 	vlan_obj->get_cam_offset = bnx2x_get_cam_offset_vlan;
1916 	vlan_obj->put_cam_offset = bnx2x_put_cam_offset_vlan;
1917 
1918 	if (CHIP_IS_E1x(bp)) {
1919 		BNX2X_ERR("Do not support chips others than E2 and newer\n");
1920 		BUG();
1921 	} else {
1922 		vlan_obj->set_one_rule      = bnx2x_set_one_vlan_e2;
1923 		vlan_obj->check_del         = bnx2x_check_vlan_del;
1924 		vlan_obj->check_add         = bnx2x_check_vlan_add;
1925 		vlan_obj->check_move        = bnx2x_check_move;
1926 		vlan_obj->ramrod_cmd        =
1927 			RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES;
1928 
1929 		/* Exe Queue */
1930 		bnx2x_exe_queue_init(bp,
1931 				     &vlan_obj->exe_queue, CLASSIFY_RULES_COUNT,
1932 				     qable_obj, bnx2x_validate_vlan_mac,
1933 				     bnx2x_optimize_vlan_mac,
1934 				     bnx2x_execute_vlan_mac,
1935 				     bnx2x_exeq_get_vlan);
1936 	}
1937 }
1938 
1939 void bnx2x_init_vlan_mac_obj(struct bnx2x *bp,
1940 			     struct bnx2x_vlan_mac_obj *vlan_mac_obj,
1941 			     u8 cl_id, u32 cid, u8 func_id, void *rdata,
1942 			     dma_addr_t rdata_mapping, int state,
1943 			     unsigned long *pstate, bnx2x_obj_type type,
1944 			     struct bnx2x_credit_pool_obj *macs_pool,
1945 			     struct bnx2x_credit_pool_obj *vlans_pool)
1946 {
1947 	union bnx2x_qable_obj *qable_obj =
1948 		(union bnx2x_qable_obj *)vlan_mac_obj;
1949 
1950 	bnx2x_init_vlan_mac_common(vlan_mac_obj, cl_id, cid, func_id, rdata,
1951 				   rdata_mapping, state, pstate, type,
1952 				   macs_pool, vlans_pool);
1953 
1954 	/* CAM pool handling */
1955 	vlan_mac_obj->get_credit = bnx2x_get_credit_vlan_mac;
1956 	vlan_mac_obj->put_credit = bnx2x_put_credit_vlan_mac;
1957 	/*
1958 	 * CAM offset is relevant for 57710 and 57711 chips only which have a
1959 	 * single CAM for both MACs and VLAN-MAC pairs. So the offset
1960 	 * will be taken from MACs' pool object only.
1961 	 */
1962 	vlan_mac_obj->get_cam_offset = bnx2x_get_cam_offset_mac;
1963 	vlan_mac_obj->put_cam_offset = bnx2x_put_cam_offset_mac;
1964 
1965 	if (CHIP_IS_E1(bp)) {
1966 		BNX2X_ERR("Do not support chips others than E2\n");
1967 		BUG();
1968 	} else if (CHIP_IS_E1H(bp)) {
1969 		vlan_mac_obj->set_one_rule      = bnx2x_set_one_vlan_mac_e1h;
1970 		vlan_mac_obj->check_del         = bnx2x_check_vlan_mac_del;
1971 		vlan_mac_obj->check_add         = bnx2x_check_vlan_mac_add;
1972 		vlan_mac_obj->check_move        = bnx2x_check_move_always_err;
1973 		vlan_mac_obj->ramrod_cmd        = RAMROD_CMD_ID_ETH_SET_MAC;
1974 
1975 		/* Exe Queue */
1976 		bnx2x_exe_queue_init(bp,
1977 				     &vlan_mac_obj->exe_queue, 1, qable_obj,
1978 				     bnx2x_validate_vlan_mac,
1979 				     bnx2x_optimize_vlan_mac,
1980 				     bnx2x_execute_vlan_mac,
1981 				     bnx2x_exeq_get_vlan_mac);
1982 	} else {
1983 		vlan_mac_obj->set_one_rule      = bnx2x_set_one_vlan_mac_e2;
1984 		vlan_mac_obj->check_del         = bnx2x_check_vlan_mac_del;
1985 		vlan_mac_obj->check_add         = bnx2x_check_vlan_mac_add;
1986 		vlan_mac_obj->check_move        = bnx2x_check_move;
1987 		vlan_mac_obj->ramrod_cmd        =
1988 			RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES;
1989 
1990 		/* Exe Queue */
1991 		bnx2x_exe_queue_init(bp,
1992 				     &vlan_mac_obj->exe_queue,
1993 				     CLASSIFY_RULES_COUNT,
1994 				     qable_obj, bnx2x_validate_vlan_mac,
1995 				     bnx2x_optimize_vlan_mac,
1996 				     bnx2x_execute_vlan_mac,
1997 				     bnx2x_exeq_get_vlan_mac);
1998 	}
1999 
2000 }
2001 
2002 /* RX_MODE verbs: DROP_ALL/ACCEPT_ALL/ACCEPT_ALL_MULTI/ACCEPT_ALL_VLAN/NORMAL */
2003 static inline void __storm_memset_mac_filters(struct bnx2x *bp,
2004 			struct tstorm_eth_mac_filter_config *mac_filters,
2005 			u16 pf_id)
2006 {
2007 	size_t size = sizeof(struct tstorm_eth_mac_filter_config);
2008 
2009 	u32 addr = BAR_TSTRORM_INTMEM +
2010 			TSTORM_MAC_FILTER_CONFIG_OFFSET(pf_id);
2011 
2012 	__storm_memset_struct(bp, addr, size, (u32 *)mac_filters);
2013 }
2014 
2015 static int bnx2x_set_rx_mode_e1x(struct bnx2x *bp,
2016 				 struct bnx2x_rx_mode_ramrod_params *p)
2017 {
2018 	/* update the bp MAC filter structure  */
2019 	u32 mask = (1 << p->cl_id);
2020 
2021 	struct tstorm_eth_mac_filter_config *mac_filters =
2022 		(struct tstorm_eth_mac_filter_config *)p->rdata;
2023 
2024 	/* initial seeting is drop-all */
2025 	u8 drop_all_ucast = 1, drop_all_mcast = 1;
2026 	u8 accp_all_ucast = 0, accp_all_bcast = 0, accp_all_mcast = 0;
2027 	u8 unmatched_unicast = 0;
2028 
2029     /* In e1x there we only take into account rx acceot flag since tx switching
2030      * isn't enabled. */
2031 	if (test_bit(BNX2X_ACCEPT_UNICAST, &p->rx_accept_flags))
2032 		/* accept matched ucast */
2033 		drop_all_ucast = 0;
2034 
2035 	if (test_bit(BNX2X_ACCEPT_MULTICAST, &p->rx_accept_flags))
2036 		/* accept matched mcast */
2037 		drop_all_mcast = 0;
2038 
2039 	if (test_bit(BNX2X_ACCEPT_ALL_UNICAST, &p->rx_accept_flags)) {
2040 		/* accept all mcast */
2041 		drop_all_ucast = 0;
2042 		accp_all_ucast = 1;
2043 	}
2044 	if (test_bit(BNX2X_ACCEPT_ALL_MULTICAST, &p->rx_accept_flags)) {
2045 		/* accept all mcast */
2046 		drop_all_mcast = 0;
2047 		accp_all_mcast = 1;
2048 	}
2049 	if (test_bit(BNX2X_ACCEPT_BROADCAST, &p->rx_accept_flags))
2050 		/* accept (all) bcast */
2051 		accp_all_bcast = 1;
2052 	if (test_bit(BNX2X_ACCEPT_UNMATCHED, &p->rx_accept_flags))
2053 		/* accept unmatched unicasts */
2054 		unmatched_unicast = 1;
2055 
2056 	mac_filters->ucast_drop_all = drop_all_ucast ?
2057 		mac_filters->ucast_drop_all | mask :
2058 		mac_filters->ucast_drop_all & ~mask;
2059 
2060 	mac_filters->mcast_drop_all = drop_all_mcast ?
2061 		mac_filters->mcast_drop_all | mask :
2062 		mac_filters->mcast_drop_all & ~mask;
2063 
2064 	mac_filters->ucast_accept_all = accp_all_ucast ?
2065 		mac_filters->ucast_accept_all | mask :
2066 		mac_filters->ucast_accept_all & ~mask;
2067 
2068 	mac_filters->mcast_accept_all = accp_all_mcast ?
2069 		mac_filters->mcast_accept_all | mask :
2070 		mac_filters->mcast_accept_all & ~mask;
2071 
2072 	mac_filters->bcast_accept_all = accp_all_bcast ?
2073 		mac_filters->bcast_accept_all | mask :
2074 		mac_filters->bcast_accept_all & ~mask;
2075 
2076 	mac_filters->unmatched_unicast = unmatched_unicast ?
2077 		mac_filters->unmatched_unicast | mask :
2078 		mac_filters->unmatched_unicast & ~mask;
2079 
2080 	DP(BNX2X_MSG_SP, "drop_ucast 0x%x\ndrop_mcast 0x%x\n accp_ucast 0x%x\n"
2081 			 "accp_mcast 0x%x\naccp_bcast 0x%x\n",
2082 			 mac_filters->ucast_drop_all,
2083 			 mac_filters->mcast_drop_all,
2084 			 mac_filters->ucast_accept_all,
2085 			 mac_filters->mcast_accept_all,
2086 			 mac_filters->bcast_accept_all);
2087 
2088 	/* write the MAC filter structure*/
2089 	__storm_memset_mac_filters(bp, mac_filters, p->func_id);
2090 
2091 	/* The operation is completed */
2092 	clear_bit(p->state, p->pstate);
2093 	smp_mb__after_clear_bit();
2094 
2095 	return 0;
2096 }
2097 
2098 /* Setup ramrod data */
2099 static inline void bnx2x_rx_mode_set_rdata_hdr_e2(u32 cid,
2100 				struct eth_classify_header *hdr,
2101 				u8 rule_cnt)
2102 {
2103 	hdr->echo = cid;
2104 	hdr->rule_cnt = rule_cnt;
2105 }
2106 
2107 static inline void bnx2x_rx_mode_set_cmd_state_e2(struct bnx2x *bp,
2108 				unsigned long accept_flags,
2109 				struct eth_filter_rules_cmd *cmd,
2110 				bool clear_accept_all)
2111 {
2112 	u16 state;
2113 
2114 	/* start with 'drop-all' */
2115 	state = ETH_FILTER_RULES_CMD_UCAST_DROP_ALL |
2116 		ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
2117 
2118 	if (accept_flags) {
2119 		if (test_bit(BNX2X_ACCEPT_UNICAST, &accept_flags))
2120 			state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
2121 
2122 		if (test_bit(BNX2X_ACCEPT_MULTICAST, &accept_flags))
2123 			state &= ~ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
2124 
2125 		if (test_bit(BNX2X_ACCEPT_ALL_UNICAST, &accept_flags)) {
2126 			state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
2127 			state |= ETH_FILTER_RULES_CMD_UCAST_ACCEPT_ALL;
2128 		}
2129 
2130 		if (test_bit(BNX2X_ACCEPT_ALL_MULTICAST, &accept_flags)) {
2131 			state |= ETH_FILTER_RULES_CMD_MCAST_ACCEPT_ALL;
2132 			state &= ~ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
2133 		}
2134 		if (test_bit(BNX2X_ACCEPT_BROADCAST, &accept_flags))
2135 			state |= ETH_FILTER_RULES_CMD_BCAST_ACCEPT_ALL;
2136 
2137 		if (test_bit(BNX2X_ACCEPT_UNMATCHED, &accept_flags)) {
2138 			state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
2139 			state |= ETH_FILTER_RULES_CMD_UCAST_ACCEPT_UNMATCHED;
2140 		}
2141 		if (test_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags))
2142 			state |= ETH_FILTER_RULES_CMD_ACCEPT_ANY_VLAN;
2143 	}
2144 
2145 	/* Clear ACCEPT_ALL_XXX flags for FCoE L2 Queue */
2146 	if (clear_accept_all) {
2147 		state &= ~ETH_FILTER_RULES_CMD_MCAST_ACCEPT_ALL;
2148 		state &= ~ETH_FILTER_RULES_CMD_BCAST_ACCEPT_ALL;
2149 		state &= ~ETH_FILTER_RULES_CMD_UCAST_ACCEPT_ALL;
2150 		state &= ~ETH_FILTER_RULES_CMD_UCAST_ACCEPT_UNMATCHED;
2151 	}
2152 
2153 	cmd->state = cpu_to_le16(state);
2154 
2155 }
2156 
2157 static int bnx2x_set_rx_mode_e2(struct bnx2x *bp,
2158 				struct bnx2x_rx_mode_ramrod_params *p)
2159 {
2160 	struct eth_filter_rules_ramrod_data *data = p->rdata;
2161 	int rc;
2162 	u8 rule_idx = 0;
2163 
2164 	/* Reset the ramrod data buffer */
2165 	memset(data, 0, sizeof(*data));
2166 
2167 	/* Setup ramrod data */
2168 
2169 	/* Tx (internal switching) */
2170 	if (test_bit(RAMROD_TX, &p->ramrod_flags)) {
2171 		data->rules[rule_idx].client_id = p->cl_id;
2172 		data->rules[rule_idx].func_id = p->func_id;
2173 
2174 		data->rules[rule_idx].cmd_general_data =
2175 			ETH_FILTER_RULES_CMD_TX_CMD;
2176 
2177 		bnx2x_rx_mode_set_cmd_state_e2(bp, p->tx_accept_flags,
2178 			&(data->rules[rule_idx++]), false);
2179 	}
2180 
2181 	/* Rx */
2182 	if (test_bit(RAMROD_RX, &p->ramrod_flags)) {
2183 		data->rules[rule_idx].client_id = p->cl_id;
2184 		data->rules[rule_idx].func_id = p->func_id;
2185 
2186 		data->rules[rule_idx].cmd_general_data =
2187 			ETH_FILTER_RULES_CMD_RX_CMD;
2188 
2189 		bnx2x_rx_mode_set_cmd_state_e2(bp, p->rx_accept_flags,
2190 			&(data->rules[rule_idx++]), false);
2191 	}
2192 
2193 
2194 	/*
2195 	 * If FCoE Queue configuration has been requested configure the Rx and
2196 	 * internal switching modes for this queue in separate rules.
2197 	 *
2198 	 * FCoE queue shell never be set to ACCEPT_ALL packets of any sort:
2199 	 * MCAST_ALL, UCAST_ALL, BCAST_ALL and UNMATCHED.
2200 	 */
2201 	if (test_bit(BNX2X_RX_MODE_FCOE_ETH, &p->rx_mode_flags)) {
2202 		/*  Tx (internal switching) */
2203 		if (test_bit(RAMROD_TX, &p->ramrod_flags)) {
2204 			data->rules[rule_idx].client_id = bnx2x_fcoe(bp, cl_id);
2205 			data->rules[rule_idx].func_id = p->func_id;
2206 
2207 			data->rules[rule_idx].cmd_general_data =
2208 						ETH_FILTER_RULES_CMD_TX_CMD;
2209 
2210 			bnx2x_rx_mode_set_cmd_state_e2(bp, p->tx_accept_flags,
2211 						     &(data->rules[rule_idx++]),
2212 						       true);
2213 		}
2214 
2215 		/* Rx */
2216 		if (test_bit(RAMROD_RX, &p->ramrod_flags)) {
2217 			data->rules[rule_idx].client_id = bnx2x_fcoe(bp, cl_id);
2218 			data->rules[rule_idx].func_id = p->func_id;
2219 
2220 			data->rules[rule_idx].cmd_general_data =
2221 						ETH_FILTER_RULES_CMD_RX_CMD;
2222 
2223 			bnx2x_rx_mode_set_cmd_state_e2(bp, p->rx_accept_flags,
2224 						     &(data->rules[rule_idx++]),
2225 						       true);
2226 		}
2227 	}
2228 
2229 	/*
2230 	 * Set the ramrod header (most importantly - number of rules to
2231 	 * configure).
2232 	 */
2233 	bnx2x_rx_mode_set_rdata_hdr_e2(p->cid, &data->header, rule_idx);
2234 
2235 	DP(BNX2X_MSG_SP, "About to configure %d rules, rx_accept_flags 0x%lx, "
2236 			 "tx_accept_flags 0x%lx\n",
2237 			 data->header.rule_cnt, p->rx_accept_flags,
2238 			 p->tx_accept_flags);
2239 
2240 	/*
2241 	 *  No need for an explicit memory barrier here as long we would
2242 	 *  need to ensure the ordering of writing to the SPQ element
2243 	 *  and updating of the SPQ producer which involves a memory
2244 	 *  read and we will have to put a full memory barrier there
2245 	 *  (inside bnx2x_sp_post()).
2246 	 */
2247 
2248 	/* Send a ramrod */
2249 	rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_FILTER_RULES, p->cid,
2250 			   U64_HI(p->rdata_mapping),
2251 			   U64_LO(p->rdata_mapping),
2252 			   ETH_CONNECTION_TYPE);
2253 	if (rc)
2254 		return rc;
2255 
2256 	/* Ramrod completion is pending */
2257 	return 1;
2258 }
2259 
2260 static int bnx2x_wait_rx_mode_comp_e2(struct bnx2x *bp,
2261 				      struct bnx2x_rx_mode_ramrod_params *p)
2262 {
2263 	return bnx2x_state_wait(bp, p->state, p->pstate);
2264 }
2265 
2266 static int bnx2x_empty_rx_mode_wait(struct bnx2x *bp,
2267 				    struct bnx2x_rx_mode_ramrod_params *p)
2268 {
2269 	/* Do nothing */
2270 	return 0;
2271 }
2272 
2273 int bnx2x_config_rx_mode(struct bnx2x *bp,
2274 			 struct bnx2x_rx_mode_ramrod_params *p)
2275 {
2276 	int rc;
2277 
2278 	/* Configure the new classification in the chip */
2279 	rc = p->rx_mode_obj->config_rx_mode(bp, p);
2280 	if (rc < 0)
2281 		return rc;
2282 
2283 	/* Wait for a ramrod completion if was requested */
2284 	if (test_bit(RAMROD_COMP_WAIT, &p->ramrod_flags)) {
2285 		rc = p->rx_mode_obj->wait_comp(bp, p);
2286 		if (rc)
2287 			return rc;
2288 	}
2289 
2290 	return rc;
2291 }
2292 
2293 void bnx2x_init_rx_mode_obj(struct bnx2x *bp,
2294 			    struct bnx2x_rx_mode_obj *o)
2295 {
2296 	if (CHIP_IS_E1x(bp)) {
2297 		o->wait_comp      = bnx2x_empty_rx_mode_wait;
2298 		o->config_rx_mode = bnx2x_set_rx_mode_e1x;
2299 	} else {
2300 		o->wait_comp      = bnx2x_wait_rx_mode_comp_e2;
2301 		o->config_rx_mode = bnx2x_set_rx_mode_e2;
2302 	}
2303 }
2304 
2305 /********************* Multicast verbs: SET, CLEAR ****************************/
2306 static inline u8 bnx2x_mcast_bin_from_mac(u8 *mac)
2307 {
2308 	return (crc32c_le(0, mac, ETH_ALEN) >> 24) & 0xff;
2309 }
2310 
2311 struct bnx2x_mcast_mac_elem {
2312 	struct list_head link;
2313 	u8 mac[ETH_ALEN];
2314 	u8 pad[2]; /* For a natural alignment of the following buffer */
2315 };
2316 
2317 struct bnx2x_pending_mcast_cmd {
2318 	struct list_head link;
2319 	int type; /* BNX2X_MCAST_CMD_X */
2320 	union {
2321 		struct list_head macs_head;
2322 		u32 macs_num; /* Needed for DEL command */
2323 		int next_bin; /* Needed for RESTORE flow with aprox match */
2324 	} data;
2325 
2326 	bool done; /* set to true, when the command has been handled,
2327 		    * practically used in 57712 handling only, where one pending
2328 		    * command may be handled in a few operations. As long as for
2329 		    * other chips every operation handling is completed in a
2330 		    * single ramrod, there is no need to utilize this field.
2331 		    */
2332 };
2333 
2334 static int bnx2x_mcast_wait(struct bnx2x *bp,
2335 			    struct bnx2x_mcast_obj *o)
2336 {
2337 	if (bnx2x_state_wait(bp, o->sched_state, o->raw.pstate) ||
2338 			o->raw.wait_comp(bp, &o->raw))
2339 		return -EBUSY;
2340 
2341 	return 0;
2342 }
2343 
2344 static int bnx2x_mcast_enqueue_cmd(struct bnx2x *bp,
2345 				   struct bnx2x_mcast_obj *o,
2346 				   struct bnx2x_mcast_ramrod_params *p,
2347 				   int cmd)
2348 {
2349 	int total_sz;
2350 	struct bnx2x_pending_mcast_cmd *new_cmd;
2351 	struct bnx2x_mcast_mac_elem *cur_mac = NULL;
2352 	struct bnx2x_mcast_list_elem *pos;
2353 	int macs_list_len = ((cmd == BNX2X_MCAST_CMD_ADD) ?
2354 			     p->mcast_list_len : 0);
2355 
2356 	/* If the command is empty ("handle pending commands only"), break */
2357 	if (!p->mcast_list_len)
2358 		return 0;
2359 
2360 	total_sz = sizeof(*new_cmd) +
2361 		macs_list_len * sizeof(struct bnx2x_mcast_mac_elem);
2362 
2363 	/* Add mcast is called under spin_lock, thus calling with GFP_ATOMIC */
2364 	new_cmd = kzalloc(total_sz, GFP_ATOMIC);
2365 
2366 	if (!new_cmd)
2367 		return -ENOMEM;
2368 
2369 	DP(BNX2X_MSG_SP, "About to enqueue a new %d command. "
2370 			 "macs_list_len=%d\n", cmd, macs_list_len);
2371 
2372 	INIT_LIST_HEAD(&new_cmd->data.macs_head);
2373 
2374 	new_cmd->type = cmd;
2375 	new_cmd->done = false;
2376 
2377 	switch (cmd) {
2378 	case BNX2X_MCAST_CMD_ADD:
2379 		cur_mac = (struct bnx2x_mcast_mac_elem *)
2380 			  ((u8 *)new_cmd + sizeof(*new_cmd));
2381 
2382 		/* Push the MACs of the current command into the pendig command
2383 		 * MACs list: FIFO
2384 		 */
2385 		list_for_each_entry(pos, &p->mcast_list, link) {
2386 			memcpy(cur_mac->mac, pos->mac, ETH_ALEN);
2387 			list_add_tail(&cur_mac->link, &new_cmd->data.macs_head);
2388 			cur_mac++;
2389 		}
2390 
2391 		break;
2392 
2393 	case BNX2X_MCAST_CMD_DEL:
2394 		new_cmd->data.macs_num = p->mcast_list_len;
2395 		break;
2396 
2397 	case BNX2X_MCAST_CMD_RESTORE:
2398 		new_cmd->data.next_bin = 0;
2399 		break;
2400 
2401 	default:
2402 		BNX2X_ERR("Unknown command: %d\n", cmd);
2403 		return -EINVAL;
2404 	}
2405 
2406 	/* Push the new pending command to the tail of the pending list: FIFO */
2407 	list_add_tail(&new_cmd->link, &o->pending_cmds_head);
2408 
2409 	o->set_sched(o);
2410 
2411 	return 1;
2412 }
2413 
2414 /**
2415  * bnx2x_mcast_get_next_bin - get the next set bin (index)
2416  *
2417  * @o:
2418  * @last:	index to start looking from (including)
2419  *
2420  * returns the next found (set) bin or a negative value if none is found.
2421  */
2422 static inline int bnx2x_mcast_get_next_bin(struct bnx2x_mcast_obj *o, int last)
2423 {
2424 	int i, j, inner_start = last % BIT_VEC64_ELEM_SZ;
2425 
2426 	for (i = last / BIT_VEC64_ELEM_SZ; i < BNX2X_MCAST_VEC_SZ; i++) {
2427 		if (o->registry.aprox_match.vec[i])
2428 			for (j = inner_start; j < BIT_VEC64_ELEM_SZ; j++) {
2429 				int cur_bit = j + BIT_VEC64_ELEM_SZ * i;
2430 				if (BIT_VEC64_TEST_BIT(o->registry.aprox_match.
2431 						       vec, cur_bit)) {
2432 					return cur_bit;
2433 				}
2434 			}
2435 		inner_start = 0;
2436 	}
2437 
2438 	/* None found */
2439 	return -1;
2440 }
2441 
2442 /**
2443  * bnx2x_mcast_clear_first_bin - find the first set bin and clear it
2444  *
2445  * @o:
2446  *
2447  * returns the index of the found bin or -1 if none is found
2448  */
2449 static inline int bnx2x_mcast_clear_first_bin(struct bnx2x_mcast_obj *o)
2450 {
2451 	int cur_bit = bnx2x_mcast_get_next_bin(o, 0);
2452 
2453 	if (cur_bit >= 0)
2454 		BIT_VEC64_CLEAR_BIT(o->registry.aprox_match.vec, cur_bit);
2455 
2456 	return cur_bit;
2457 }
2458 
2459 static inline u8 bnx2x_mcast_get_rx_tx_flag(struct bnx2x_mcast_obj *o)
2460 {
2461 	struct bnx2x_raw_obj *raw = &o->raw;
2462 	u8 rx_tx_flag = 0;
2463 
2464 	if ((raw->obj_type == BNX2X_OBJ_TYPE_TX) ||
2465 	    (raw->obj_type == BNX2X_OBJ_TYPE_RX_TX))
2466 		rx_tx_flag |= ETH_MULTICAST_RULES_CMD_TX_CMD;
2467 
2468 	if ((raw->obj_type == BNX2X_OBJ_TYPE_RX) ||
2469 	    (raw->obj_type == BNX2X_OBJ_TYPE_RX_TX))
2470 		rx_tx_flag |= ETH_MULTICAST_RULES_CMD_RX_CMD;
2471 
2472 	return rx_tx_flag;
2473 }
2474 
2475 static void bnx2x_mcast_set_one_rule_e2(struct bnx2x *bp,
2476 					struct bnx2x_mcast_obj *o, int idx,
2477 					union bnx2x_mcast_config_data *cfg_data,
2478 					int cmd)
2479 {
2480 	struct bnx2x_raw_obj *r = &o->raw;
2481 	struct eth_multicast_rules_ramrod_data *data =
2482 		(struct eth_multicast_rules_ramrod_data *)(r->rdata);
2483 	u8 func_id = r->func_id;
2484 	u8 rx_tx_add_flag = bnx2x_mcast_get_rx_tx_flag(o);
2485 	int bin;
2486 
2487 	if ((cmd == BNX2X_MCAST_CMD_ADD) || (cmd == BNX2X_MCAST_CMD_RESTORE))
2488 		rx_tx_add_flag |= ETH_MULTICAST_RULES_CMD_IS_ADD;
2489 
2490 	data->rules[idx].cmd_general_data |= rx_tx_add_flag;
2491 
2492 	/* Get a bin and update a bins' vector */
2493 	switch (cmd) {
2494 	case BNX2X_MCAST_CMD_ADD:
2495 		bin = bnx2x_mcast_bin_from_mac(cfg_data->mac);
2496 		BIT_VEC64_SET_BIT(o->registry.aprox_match.vec, bin);
2497 		break;
2498 
2499 	case BNX2X_MCAST_CMD_DEL:
2500 		/* If there were no more bins to clear
2501 		 * (bnx2x_mcast_clear_first_bin() returns -1) then we would
2502 		 * clear any (0xff) bin.
2503 		 * See bnx2x_mcast_validate_e2() for explanation when it may
2504 		 * happen.
2505 		 */
2506 		bin = bnx2x_mcast_clear_first_bin(o);
2507 		break;
2508 
2509 	case BNX2X_MCAST_CMD_RESTORE:
2510 		bin = cfg_data->bin;
2511 		break;
2512 
2513 	default:
2514 		BNX2X_ERR("Unknown command: %d\n", cmd);
2515 		return;
2516 	}
2517 
2518 	DP(BNX2X_MSG_SP, "%s bin %d\n",
2519 			 ((rx_tx_add_flag & ETH_MULTICAST_RULES_CMD_IS_ADD) ?
2520 			 "Setting"  : "Clearing"), bin);
2521 
2522 	data->rules[idx].bin_id    = (u8)bin;
2523 	data->rules[idx].func_id   = func_id;
2524 	data->rules[idx].engine_id = o->engine_id;
2525 }
2526 
2527 /**
2528  * bnx2x_mcast_handle_restore_cmd_e2 - restore configuration from the registry
2529  *
2530  * @bp:		device handle
2531  * @o:
2532  * @start_bin:	index in the registry to start from (including)
2533  * @rdata_idx:	index in the ramrod data to start from
2534  *
2535  * returns last handled bin index or -1 if all bins have been handled
2536  */
2537 static inline int bnx2x_mcast_handle_restore_cmd_e2(
2538 	struct bnx2x *bp, struct bnx2x_mcast_obj *o , int start_bin,
2539 	int *rdata_idx)
2540 {
2541 	int cur_bin, cnt = *rdata_idx;
2542 	union bnx2x_mcast_config_data cfg_data = {0};
2543 
2544 	/* go through the registry and configure the bins from it */
2545 	for (cur_bin = bnx2x_mcast_get_next_bin(o, start_bin); cur_bin >= 0;
2546 	    cur_bin = bnx2x_mcast_get_next_bin(o, cur_bin + 1)) {
2547 
2548 		cfg_data.bin = (u8)cur_bin;
2549 		o->set_one_rule(bp, o, cnt, &cfg_data,
2550 				BNX2X_MCAST_CMD_RESTORE);
2551 
2552 		cnt++;
2553 
2554 		DP(BNX2X_MSG_SP, "About to configure a bin %d\n", cur_bin);
2555 
2556 		/* Break if we reached the maximum number
2557 		 * of rules.
2558 		 */
2559 		if (cnt >= o->max_cmd_len)
2560 			break;
2561 	}
2562 
2563 	*rdata_idx = cnt;
2564 
2565 	return cur_bin;
2566 }
2567 
2568 static inline void bnx2x_mcast_hdl_pending_add_e2(struct bnx2x *bp,
2569 	struct bnx2x_mcast_obj *o, struct bnx2x_pending_mcast_cmd *cmd_pos,
2570 	int *line_idx)
2571 {
2572 	struct bnx2x_mcast_mac_elem *pmac_pos, *pmac_pos_n;
2573 	int cnt = *line_idx;
2574 	union bnx2x_mcast_config_data cfg_data = {0};
2575 
2576 	list_for_each_entry_safe(pmac_pos, pmac_pos_n, &cmd_pos->data.macs_head,
2577 				 link) {
2578 
2579 		cfg_data.mac = &pmac_pos->mac[0];
2580 		o->set_one_rule(bp, o, cnt, &cfg_data, cmd_pos->type);
2581 
2582 		cnt++;
2583 
2584 		DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
2585 				 pmac_pos->mac);
2586 
2587 		list_del(&pmac_pos->link);
2588 
2589 		/* Break if we reached the maximum number
2590 		 * of rules.
2591 		 */
2592 		if (cnt >= o->max_cmd_len)
2593 			break;
2594 	}
2595 
2596 	*line_idx = cnt;
2597 
2598 	/* if no more MACs to configure - we are done */
2599 	if (list_empty(&cmd_pos->data.macs_head))
2600 		cmd_pos->done = true;
2601 }
2602 
2603 static inline void bnx2x_mcast_hdl_pending_del_e2(struct bnx2x *bp,
2604 	struct bnx2x_mcast_obj *o, struct bnx2x_pending_mcast_cmd *cmd_pos,
2605 	int *line_idx)
2606 {
2607 	int cnt = *line_idx;
2608 
2609 	while (cmd_pos->data.macs_num) {
2610 		o->set_one_rule(bp, o, cnt, NULL, cmd_pos->type);
2611 
2612 		cnt++;
2613 
2614 		cmd_pos->data.macs_num--;
2615 
2616 		  DP(BNX2X_MSG_SP, "Deleting MAC. %d left,cnt is %d\n",
2617 				   cmd_pos->data.macs_num, cnt);
2618 
2619 		/* Break if we reached the maximum
2620 		 * number of rules.
2621 		 */
2622 		if (cnt >= o->max_cmd_len)
2623 			break;
2624 	}
2625 
2626 	*line_idx = cnt;
2627 
2628 	/* If we cleared all bins - we are done */
2629 	if (!cmd_pos->data.macs_num)
2630 		cmd_pos->done = true;
2631 }
2632 
2633 static inline void bnx2x_mcast_hdl_pending_restore_e2(struct bnx2x *bp,
2634 	struct bnx2x_mcast_obj *o, struct bnx2x_pending_mcast_cmd *cmd_pos,
2635 	int *line_idx)
2636 {
2637 	cmd_pos->data.next_bin = o->hdl_restore(bp, o, cmd_pos->data.next_bin,
2638 						line_idx);
2639 
2640 	if (cmd_pos->data.next_bin < 0)
2641 		/* If o->set_restore returned -1 we are done */
2642 		cmd_pos->done = true;
2643 	else
2644 		/* Start from the next bin next time */
2645 		cmd_pos->data.next_bin++;
2646 }
2647 
2648 static inline int bnx2x_mcast_handle_pending_cmds_e2(struct bnx2x *bp,
2649 				struct bnx2x_mcast_ramrod_params *p)
2650 {
2651 	struct bnx2x_pending_mcast_cmd *cmd_pos, *cmd_pos_n;
2652 	int cnt = 0;
2653 	struct bnx2x_mcast_obj *o = p->mcast_obj;
2654 
2655 	list_for_each_entry_safe(cmd_pos, cmd_pos_n, &o->pending_cmds_head,
2656 				 link) {
2657 		switch (cmd_pos->type) {
2658 		case BNX2X_MCAST_CMD_ADD:
2659 			bnx2x_mcast_hdl_pending_add_e2(bp, o, cmd_pos, &cnt);
2660 			break;
2661 
2662 		case BNX2X_MCAST_CMD_DEL:
2663 			bnx2x_mcast_hdl_pending_del_e2(bp, o, cmd_pos, &cnt);
2664 			break;
2665 
2666 		case BNX2X_MCAST_CMD_RESTORE:
2667 			bnx2x_mcast_hdl_pending_restore_e2(bp, o, cmd_pos,
2668 							   &cnt);
2669 			break;
2670 
2671 		default:
2672 			BNX2X_ERR("Unknown command: %d\n", cmd_pos->type);
2673 			return -EINVAL;
2674 		}
2675 
2676 		/* If the command has been completed - remove it from the list
2677 		 * and free the memory
2678 		 */
2679 		if (cmd_pos->done) {
2680 			list_del(&cmd_pos->link);
2681 			kfree(cmd_pos);
2682 		}
2683 
2684 		/* Break if we reached the maximum number of rules */
2685 		if (cnt >= o->max_cmd_len)
2686 			break;
2687 	}
2688 
2689 	return cnt;
2690 }
2691 
2692 static inline void bnx2x_mcast_hdl_add(struct bnx2x *bp,
2693 	struct bnx2x_mcast_obj *o, struct bnx2x_mcast_ramrod_params *p,
2694 	int *line_idx)
2695 {
2696 	struct bnx2x_mcast_list_elem *mlist_pos;
2697 	union bnx2x_mcast_config_data cfg_data = {0};
2698 	int cnt = *line_idx;
2699 
2700 	list_for_each_entry(mlist_pos, &p->mcast_list, link) {
2701 		cfg_data.mac = mlist_pos->mac;
2702 		o->set_one_rule(bp, o, cnt, &cfg_data, BNX2X_MCAST_CMD_ADD);
2703 
2704 		cnt++;
2705 
2706 		DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
2707 				 mlist_pos->mac);
2708 	}
2709 
2710 	*line_idx = cnt;
2711 }
2712 
2713 static inline void bnx2x_mcast_hdl_del(struct bnx2x *bp,
2714 	struct bnx2x_mcast_obj *o, struct bnx2x_mcast_ramrod_params *p,
2715 	int *line_idx)
2716 {
2717 	int cnt = *line_idx, i;
2718 
2719 	for (i = 0; i < p->mcast_list_len; i++) {
2720 		o->set_one_rule(bp, o, cnt, NULL, BNX2X_MCAST_CMD_DEL);
2721 
2722 		cnt++;
2723 
2724 		DP(BNX2X_MSG_SP, "Deleting MAC. %d left\n",
2725 				 p->mcast_list_len - i - 1);
2726 	}
2727 
2728 	*line_idx = cnt;
2729 }
2730 
2731 /**
2732  * bnx2x_mcast_handle_current_cmd -
2733  *
2734  * @bp:		device handle
2735  * @p:
2736  * @cmd:
2737  * @start_cnt:	first line in the ramrod data that may be used
2738  *
2739  * This function is called iff there is enough place for the current command in
2740  * the ramrod data.
2741  * Returns number of lines filled in the ramrod data in total.
2742  */
2743 static inline int bnx2x_mcast_handle_current_cmd(struct bnx2x *bp,
2744 			struct bnx2x_mcast_ramrod_params *p, int cmd,
2745 			int start_cnt)
2746 {
2747 	struct bnx2x_mcast_obj *o = p->mcast_obj;
2748 	int cnt = start_cnt;
2749 
2750 	DP(BNX2X_MSG_SP, "p->mcast_list_len=%d\n", p->mcast_list_len);
2751 
2752 	switch (cmd) {
2753 	case BNX2X_MCAST_CMD_ADD:
2754 		bnx2x_mcast_hdl_add(bp, o, p, &cnt);
2755 		break;
2756 
2757 	case BNX2X_MCAST_CMD_DEL:
2758 		bnx2x_mcast_hdl_del(bp, o, p, &cnt);
2759 		break;
2760 
2761 	case BNX2X_MCAST_CMD_RESTORE:
2762 		o->hdl_restore(bp, o, 0, &cnt);
2763 		break;
2764 
2765 	default:
2766 		BNX2X_ERR("Unknown command: %d\n", cmd);
2767 		return -EINVAL;
2768 	}
2769 
2770 	/* The current command has been handled */
2771 	p->mcast_list_len = 0;
2772 
2773 	return cnt;
2774 }
2775 
2776 static int bnx2x_mcast_validate_e2(struct bnx2x *bp,
2777 				   struct bnx2x_mcast_ramrod_params *p,
2778 				   int cmd)
2779 {
2780 	struct bnx2x_mcast_obj *o = p->mcast_obj;
2781 	int reg_sz = o->get_registry_size(o);
2782 
2783 	switch (cmd) {
2784 	/* DEL command deletes all currently configured MACs */
2785 	case BNX2X_MCAST_CMD_DEL:
2786 		o->set_registry_size(o, 0);
2787 		/* Don't break */
2788 
2789 	/* RESTORE command will restore the entire multicast configuration */
2790 	case BNX2X_MCAST_CMD_RESTORE:
2791 		/* Here we set the approximate amount of work to do, which in
2792 		 * fact may be only less as some MACs in postponed ADD
2793 		 * command(s) scheduled before this command may fall into
2794 		 * the same bin and the actual number of bins set in the
2795 		 * registry would be less than we estimated here. See
2796 		 * bnx2x_mcast_set_one_rule_e2() for further details.
2797 		 */
2798 		p->mcast_list_len = reg_sz;
2799 		break;
2800 
2801 	case BNX2X_MCAST_CMD_ADD:
2802 	case BNX2X_MCAST_CMD_CONT:
2803 		/* Here we assume that all new MACs will fall into new bins.
2804 		 * However we will correct the real registry size after we
2805 		 * handle all pending commands.
2806 		 */
2807 		o->set_registry_size(o, reg_sz + p->mcast_list_len);
2808 		break;
2809 
2810 	default:
2811 		BNX2X_ERR("Unknown command: %d\n", cmd);
2812 		return -EINVAL;
2813 
2814 	}
2815 
2816 	/* Increase the total number of MACs pending to be configured */
2817 	o->total_pending_num += p->mcast_list_len;
2818 
2819 	return 0;
2820 }
2821 
2822 static void bnx2x_mcast_revert_e2(struct bnx2x *bp,
2823 				      struct bnx2x_mcast_ramrod_params *p,
2824 				      int old_num_bins)
2825 {
2826 	struct bnx2x_mcast_obj *o = p->mcast_obj;
2827 
2828 	o->set_registry_size(o, old_num_bins);
2829 	o->total_pending_num -= p->mcast_list_len;
2830 }
2831 
2832 /**
2833  * bnx2x_mcast_set_rdata_hdr_e2 - sets a header values
2834  *
2835  * @bp:		device handle
2836  * @p:
2837  * @len:	number of rules to handle
2838  */
2839 static inline void bnx2x_mcast_set_rdata_hdr_e2(struct bnx2x *bp,
2840 					struct bnx2x_mcast_ramrod_params *p,
2841 					u8 len)
2842 {
2843 	struct bnx2x_raw_obj *r = &p->mcast_obj->raw;
2844 	struct eth_multicast_rules_ramrod_data *data =
2845 		(struct eth_multicast_rules_ramrod_data *)(r->rdata);
2846 
2847 	data->header.echo = ((r->cid & BNX2X_SWCID_MASK) |
2848 			  (BNX2X_FILTER_MCAST_PENDING << BNX2X_SWCID_SHIFT));
2849 	data->header.rule_cnt = len;
2850 }
2851 
2852 /**
2853  * bnx2x_mcast_refresh_registry_e2 - recalculate the actual number of set bins
2854  *
2855  * @bp:		device handle
2856  * @o:
2857  *
2858  * Recalculate the actual number of set bins in the registry using Brian
2859  * Kernighan's algorithm: it's execution complexity is as a number of set bins.
2860  *
2861  * returns 0 for the compliance with bnx2x_mcast_refresh_registry_e1().
2862  */
2863 static inline int bnx2x_mcast_refresh_registry_e2(struct bnx2x *bp,
2864 						  struct bnx2x_mcast_obj *o)
2865 {
2866 	int i, cnt = 0;
2867 	u64 elem;
2868 
2869 	for (i = 0; i < BNX2X_MCAST_VEC_SZ; i++) {
2870 		elem = o->registry.aprox_match.vec[i];
2871 		for (; elem; cnt++)
2872 			elem &= elem - 1;
2873 	}
2874 
2875 	o->set_registry_size(o, cnt);
2876 
2877 	return 0;
2878 }
2879 
2880 static int bnx2x_mcast_setup_e2(struct bnx2x *bp,
2881 				struct bnx2x_mcast_ramrod_params *p,
2882 				int cmd)
2883 {
2884 	struct bnx2x_raw_obj *raw = &p->mcast_obj->raw;
2885 	struct bnx2x_mcast_obj *o = p->mcast_obj;
2886 	struct eth_multicast_rules_ramrod_data *data =
2887 		(struct eth_multicast_rules_ramrod_data *)(raw->rdata);
2888 	int cnt = 0, rc;
2889 
2890 	/* Reset the ramrod data buffer */
2891 	memset(data, 0, sizeof(*data));
2892 
2893 	cnt = bnx2x_mcast_handle_pending_cmds_e2(bp, p);
2894 
2895 	/* If there are no more pending commands - clear SCHEDULED state */
2896 	if (list_empty(&o->pending_cmds_head))
2897 		o->clear_sched(o);
2898 
2899 	/* The below may be true iff there was enough room in ramrod
2900 	 * data for all pending commands and for the current
2901 	 * command. Otherwise the current command would have been added
2902 	 * to the pending commands and p->mcast_list_len would have been
2903 	 * zeroed.
2904 	 */
2905 	if (p->mcast_list_len > 0)
2906 		cnt = bnx2x_mcast_handle_current_cmd(bp, p, cmd, cnt);
2907 
2908 	/* We've pulled out some MACs - update the total number of
2909 	 * outstanding.
2910 	 */
2911 	o->total_pending_num -= cnt;
2912 
2913 	/* send a ramrod */
2914 	WARN_ON(o->total_pending_num < 0);
2915 	WARN_ON(cnt > o->max_cmd_len);
2916 
2917 	bnx2x_mcast_set_rdata_hdr_e2(bp, p, (u8)cnt);
2918 
2919 	/* Update a registry size if there are no more pending operations.
2920 	 *
2921 	 * We don't want to change the value of the registry size if there are
2922 	 * pending operations because we want it to always be equal to the
2923 	 * exact or the approximate number (see bnx2x_mcast_validate_e2()) of
2924 	 * set bins after the last requested operation in order to properly
2925 	 * evaluate the size of the next DEL/RESTORE operation.
2926 	 *
2927 	 * Note that we update the registry itself during command(s) handling
2928 	 * - see bnx2x_mcast_set_one_rule_e2(). That's because for 57712 we
2929 	 * aggregate multiple commands (ADD/DEL/RESTORE) into one ramrod but
2930 	 * with a limited amount of update commands (per MAC/bin) and we don't
2931 	 * know in this scope what the actual state of bins configuration is
2932 	 * going to be after this ramrod.
2933 	 */
2934 	if (!o->total_pending_num)
2935 		bnx2x_mcast_refresh_registry_e2(bp, o);
2936 
2937 	/*
2938 	 * If CLEAR_ONLY was requested - don't send a ramrod and clear
2939 	 * RAMROD_PENDING status immediately.
2940 	 */
2941 	if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) {
2942 		raw->clear_pending(raw);
2943 		return 0;
2944 	} else {
2945 		/*
2946 		 *  No need for an explicit memory barrier here as long we would
2947 		 *  need to ensure the ordering of writing to the SPQ element
2948 		 *  and updating of the SPQ producer which involves a memory
2949 		 *  read and we will have to put a full memory barrier there
2950 		 *  (inside bnx2x_sp_post()).
2951 		 */
2952 
2953 		/* Send a ramrod */
2954 		rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_MULTICAST_RULES,
2955 				   raw->cid, U64_HI(raw->rdata_mapping),
2956 				   U64_LO(raw->rdata_mapping),
2957 				   ETH_CONNECTION_TYPE);
2958 		if (rc)
2959 			return rc;
2960 
2961 		/* Ramrod completion is pending */
2962 		return 1;
2963 	}
2964 }
2965 
2966 static int bnx2x_mcast_validate_e1h(struct bnx2x *bp,
2967 				    struct bnx2x_mcast_ramrod_params *p,
2968 				    int cmd)
2969 {
2970 	/* Mark, that there is a work to do */
2971 	if ((cmd == BNX2X_MCAST_CMD_DEL) || (cmd == BNX2X_MCAST_CMD_RESTORE))
2972 		p->mcast_list_len = 1;
2973 
2974 	return 0;
2975 }
2976 
2977 static void bnx2x_mcast_revert_e1h(struct bnx2x *bp,
2978 				       struct bnx2x_mcast_ramrod_params *p,
2979 				       int old_num_bins)
2980 {
2981 	/* Do nothing */
2982 }
2983 
2984 #define BNX2X_57711_SET_MC_FILTER(filter, bit) \
2985 do { \
2986 	(filter)[(bit) >> 5] |= (1 << ((bit) & 0x1f)); \
2987 } while (0)
2988 
2989 static inline void bnx2x_mcast_hdl_add_e1h(struct bnx2x *bp,
2990 					   struct bnx2x_mcast_obj *o,
2991 					   struct bnx2x_mcast_ramrod_params *p,
2992 					   u32 *mc_filter)
2993 {
2994 	struct bnx2x_mcast_list_elem *mlist_pos;
2995 	int bit;
2996 
2997 	list_for_each_entry(mlist_pos, &p->mcast_list, link) {
2998 		bit = bnx2x_mcast_bin_from_mac(mlist_pos->mac);
2999 		BNX2X_57711_SET_MC_FILTER(mc_filter, bit);
3000 
3001 		DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC, bin %d\n",
3002 				 mlist_pos->mac, bit);
3003 
3004 		/* bookkeeping... */
3005 		BIT_VEC64_SET_BIT(o->registry.aprox_match.vec,
3006 				  bit);
3007 	}
3008 }
3009 
3010 static inline void bnx2x_mcast_hdl_restore_e1h(struct bnx2x *bp,
3011 	struct bnx2x_mcast_obj *o, struct bnx2x_mcast_ramrod_params *p,
3012 	u32 *mc_filter)
3013 {
3014 	int bit;
3015 
3016 	for (bit = bnx2x_mcast_get_next_bin(o, 0);
3017 	     bit >= 0;
3018 	     bit = bnx2x_mcast_get_next_bin(o, bit + 1)) {
3019 		BNX2X_57711_SET_MC_FILTER(mc_filter, bit);
3020 		DP(BNX2X_MSG_SP, "About to set bin %d\n", bit);
3021 	}
3022 }
3023 
3024 /* On 57711 we write the multicast MACs' aproximate match
3025  * table by directly into the TSTORM's internal RAM. So we don't
3026  * really need to handle any tricks to make it work.
3027  */
3028 static int bnx2x_mcast_setup_e1h(struct bnx2x *bp,
3029 				 struct bnx2x_mcast_ramrod_params *p,
3030 				 int cmd)
3031 {
3032 	int i;
3033 	struct bnx2x_mcast_obj *o = p->mcast_obj;
3034 	struct bnx2x_raw_obj *r = &o->raw;
3035 
3036 	/* If CLEAR_ONLY has been requested - clear the registry
3037 	 * and clear a pending bit.
3038 	 */
3039 	if (!test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) {
3040 		u32 mc_filter[MC_HASH_SIZE] = {0};
3041 
3042 		/* Set the multicast filter bits before writing it into
3043 		 * the internal memory.
3044 		 */
3045 		switch (cmd) {
3046 		case BNX2X_MCAST_CMD_ADD:
3047 			bnx2x_mcast_hdl_add_e1h(bp, o, p, mc_filter);
3048 			break;
3049 
3050 		case BNX2X_MCAST_CMD_DEL:
3051 			DP(BNX2X_MSG_SP,
3052 			   "Invalidating multicast MACs configuration\n");
3053 
3054 			/* clear the registry */
3055 			memset(o->registry.aprox_match.vec, 0,
3056 			       sizeof(o->registry.aprox_match.vec));
3057 			break;
3058 
3059 		case BNX2X_MCAST_CMD_RESTORE:
3060 			bnx2x_mcast_hdl_restore_e1h(bp, o, p, mc_filter);
3061 			break;
3062 
3063 		default:
3064 			BNX2X_ERR("Unknown command: %d\n", cmd);
3065 			return -EINVAL;
3066 		}
3067 
3068 		/* Set the mcast filter in the internal memory */
3069 		for (i = 0; i < MC_HASH_SIZE; i++)
3070 			REG_WR(bp, MC_HASH_OFFSET(bp, i), mc_filter[i]);
3071 	} else
3072 		/* clear the registry */
3073 		memset(o->registry.aprox_match.vec, 0,
3074 		       sizeof(o->registry.aprox_match.vec));
3075 
3076 	/* We are done */
3077 	r->clear_pending(r);
3078 
3079 	return 0;
3080 }
3081 
3082 static int bnx2x_mcast_validate_e1(struct bnx2x *bp,
3083 				   struct bnx2x_mcast_ramrod_params *p,
3084 				   int cmd)
3085 {
3086 	struct bnx2x_mcast_obj *o = p->mcast_obj;
3087 	int reg_sz = o->get_registry_size(o);
3088 
3089 	switch (cmd) {
3090 	/* DEL command deletes all currently configured MACs */
3091 	case BNX2X_MCAST_CMD_DEL:
3092 		o->set_registry_size(o, 0);
3093 		/* Don't break */
3094 
3095 	/* RESTORE command will restore the entire multicast configuration */
3096 	case BNX2X_MCAST_CMD_RESTORE:
3097 		p->mcast_list_len = reg_sz;
3098 		  DP(BNX2X_MSG_SP, "Command %d, p->mcast_list_len=%d\n",
3099 				   cmd, p->mcast_list_len);
3100 		break;
3101 
3102 	case BNX2X_MCAST_CMD_ADD:
3103 	case BNX2X_MCAST_CMD_CONT:
3104 		/* Multicast MACs on 57710 are configured as unicast MACs and
3105 		 * there is only a limited number of CAM entries for that
3106 		 * matter.
3107 		 */
3108 		if (p->mcast_list_len > o->max_cmd_len) {
3109 			BNX2X_ERR("Can't configure more than %d multicast MACs"
3110 				   "on 57710\n", o->max_cmd_len);
3111 			return -EINVAL;
3112 		}
3113 		/* Every configured MAC should be cleared if DEL command is
3114 		 * called. Only the last ADD command is relevant as long as
3115 		 * every ADD commands overrides the previous configuration.
3116 		 */
3117 		DP(BNX2X_MSG_SP, "p->mcast_list_len=%d\n", p->mcast_list_len);
3118 		if (p->mcast_list_len > 0)
3119 			o->set_registry_size(o, p->mcast_list_len);
3120 
3121 		break;
3122 
3123 	default:
3124 		BNX2X_ERR("Unknown command: %d\n", cmd);
3125 		return -EINVAL;
3126 
3127 	}
3128 
3129 	/* We want to ensure that commands are executed one by one for 57710.
3130 	 * Therefore each none-empty command will consume o->max_cmd_len.
3131 	 */
3132 	if (p->mcast_list_len)
3133 		o->total_pending_num += o->max_cmd_len;
3134 
3135 	return 0;
3136 }
3137 
3138 static void bnx2x_mcast_revert_e1(struct bnx2x *bp,
3139 				      struct bnx2x_mcast_ramrod_params *p,
3140 				      int old_num_macs)
3141 {
3142 	struct bnx2x_mcast_obj *o = p->mcast_obj;
3143 
3144 	o->set_registry_size(o, old_num_macs);
3145 
3146 	/* If current command hasn't been handled yet and we are
3147 	 * here means that it's meant to be dropped and we have to
3148 	 * update the number of outstandling MACs accordingly.
3149 	 */
3150 	if (p->mcast_list_len)
3151 		o->total_pending_num -= o->max_cmd_len;
3152 }
3153 
3154 static void bnx2x_mcast_set_one_rule_e1(struct bnx2x *bp,
3155 					struct bnx2x_mcast_obj *o, int idx,
3156 					union bnx2x_mcast_config_data *cfg_data,
3157 					int cmd)
3158 {
3159 	struct bnx2x_raw_obj *r = &o->raw;
3160 	struct mac_configuration_cmd *data =
3161 		(struct mac_configuration_cmd *)(r->rdata);
3162 
3163 	/* copy mac */
3164 	if ((cmd == BNX2X_MCAST_CMD_ADD) || (cmd == BNX2X_MCAST_CMD_RESTORE)) {
3165 		bnx2x_set_fw_mac_addr(&data->config_table[idx].msb_mac_addr,
3166 				      &data->config_table[idx].middle_mac_addr,
3167 				      &data->config_table[idx].lsb_mac_addr,
3168 				      cfg_data->mac);
3169 
3170 		data->config_table[idx].vlan_id = 0;
3171 		data->config_table[idx].pf_id = r->func_id;
3172 		data->config_table[idx].clients_bit_vector =
3173 			cpu_to_le32(1 << r->cl_id);
3174 
3175 		SET_FLAG(data->config_table[idx].flags,
3176 			 MAC_CONFIGURATION_ENTRY_ACTION_TYPE,
3177 			 T_ETH_MAC_COMMAND_SET);
3178 	}
3179 }
3180 
3181 /**
3182  * bnx2x_mcast_set_rdata_hdr_e1  - set header values in mac_configuration_cmd
3183  *
3184  * @bp:		device handle
3185  * @p:
3186  * @len:	number of rules to handle
3187  */
3188 static inline void bnx2x_mcast_set_rdata_hdr_e1(struct bnx2x *bp,
3189 					struct bnx2x_mcast_ramrod_params *p,
3190 					u8 len)
3191 {
3192 	struct bnx2x_raw_obj *r = &p->mcast_obj->raw;
3193 	struct mac_configuration_cmd *data =
3194 		(struct mac_configuration_cmd *)(r->rdata);
3195 
3196 	u8 offset = (CHIP_REV_IS_SLOW(bp) ?
3197 		     BNX2X_MAX_EMUL_MULTI*(1 + r->func_id) :
3198 		     BNX2X_MAX_MULTICAST*(1 + r->func_id));
3199 
3200 	data->hdr.offset = offset;
3201 	data->hdr.client_id = 0xff;
3202 	data->hdr.echo = ((r->cid & BNX2X_SWCID_MASK) |
3203 			  (BNX2X_FILTER_MCAST_PENDING << BNX2X_SWCID_SHIFT));
3204 	data->hdr.length = len;
3205 }
3206 
3207 /**
3208  * bnx2x_mcast_handle_restore_cmd_e1 - restore command for 57710
3209  *
3210  * @bp:		device handle
3211  * @o:
3212  * @start_idx:	index in the registry to start from
3213  * @rdata_idx:	index in the ramrod data to start from
3214  *
3215  * restore command for 57710 is like all other commands - always a stand alone
3216  * command - start_idx and rdata_idx will always be 0. This function will always
3217  * succeed.
3218  * returns -1 to comply with 57712 variant.
3219  */
3220 static inline int bnx2x_mcast_handle_restore_cmd_e1(
3221 	struct bnx2x *bp, struct bnx2x_mcast_obj *o , int start_idx,
3222 	int *rdata_idx)
3223 {
3224 	struct bnx2x_mcast_mac_elem *elem;
3225 	int i = 0;
3226 	union bnx2x_mcast_config_data cfg_data = {0};
3227 
3228 	/* go through the registry and configure the MACs from it. */
3229 	list_for_each_entry(elem, &o->registry.exact_match.macs, link) {
3230 		cfg_data.mac = &elem->mac[0];
3231 		o->set_one_rule(bp, o, i, &cfg_data, BNX2X_MCAST_CMD_RESTORE);
3232 
3233 		i++;
3234 
3235 		  DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
3236 				   cfg_data.mac);
3237 	}
3238 
3239 	*rdata_idx = i;
3240 
3241 	return -1;
3242 }
3243 
3244 
3245 static inline int bnx2x_mcast_handle_pending_cmds_e1(
3246 	struct bnx2x *bp, struct bnx2x_mcast_ramrod_params *p)
3247 {
3248 	struct bnx2x_pending_mcast_cmd *cmd_pos;
3249 	struct bnx2x_mcast_mac_elem *pmac_pos;
3250 	struct bnx2x_mcast_obj *o = p->mcast_obj;
3251 	union bnx2x_mcast_config_data cfg_data = {0};
3252 	int cnt = 0;
3253 
3254 
3255 	/* If nothing to be done - return */
3256 	if (list_empty(&o->pending_cmds_head))
3257 		return 0;
3258 
3259 	/* Handle the first command */
3260 	cmd_pos = list_first_entry(&o->pending_cmds_head,
3261 				   struct bnx2x_pending_mcast_cmd, link);
3262 
3263 	switch (cmd_pos->type) {
3264 	case BNX2X_MCAST_CMD_ADD:
3265 		list_for_each_entry(pmac_pos, &cmd_pos->data.macs_head, link) {
3266 			cfg_data.mac = &pmac_pos->mac[0];
3267 			o->set_one_rule(bp, o, cnt, &cfg_data, cmd_pos->type);
3268 
3269 			cnt++;
3270 
3271 			DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
3272 					 pmac_pos->mac);
3273 		}
3274 		break;
3275 
3276 	case BNX2X_MCAST_CMD_DEL:
3277 		cnt = cmd_pos->data.macs_num;
3278 		DP(BNX2X_MSG_SP, "About to delete %d multicast MACs\n", cnt);
3279 		break;
3280 
3281 	case BNX2X_MCAST_CMD_RESTORE:
3282 		o->hdl_restore(bp, o, 0, &cnt);
3283 		break;
3284 
3285 	default:
3286 		BNX2X_ERR("Unknown command: %d\n", cmd_pos->type);
3287 		return -EINVAL;
3288 	}
3289 
3290 	list_del(&cmd_pos->link);
3291 	kfree(cmd_pos);
3292 
3293 	return cnt;
3294 }
3295 
3296 /**
3297  * bnx2x_get_fw_mac_addr - revert the bnx2x_set_fw_mac_addr().
3298  *
3299  * @fw_hi:
3300  * @fw_mid:
3301  * @fw_lo:
3302  * @mac:
3303  */
3304 static inline void bnx2x_get_fw_mac_addr(__le16 *fw_hi, __le16 *fw_mid,
3305 					 __le16 *fw_lo, u8 *mac)
3306 {
3307 	mac[1] = ((u8 *)fw_hi)[0];
3308 	mac[0] = ((u8 *)fw_hi)[1];
3309 	mac[3] = ((u8 *)fw_mid)[0];
3310 	mac[2] = ((u8 *)fw_mid)[1];
3311 	mac[5] = ((u8 *)fw_lo)[0];
3312 	mac[4] = ((u8 *)fw_lo)[1];
3313 }
3314 
3315 /**
3316  * bnx2x_mcast_refresh_registry_e1 -
3317  *
3318  * @bp:		device handle
3319  * @cnt:
3320  *
3321  * Check the ramrod data first entry flag to see if it's a DELETE or ADD command
3322  * and update the registry correspondingly: if ADD - allocate a memory and add
3323  * the entries to the registry (list), if DELETE - clear the registry and free
3324  * the memory.
3325  */
3326 static inline int bnx2x_mcast_refresh_registry_e1(struct bnx2x *bp,
3327 						  struct bnx2x_mcast_obj *o)
3328 {
3329 	struct bnx2x_raw_obj *raw = &o->raw;
3330 	struct bnx2x_mcast_mac_elem *elem;
3331 	struct mac_configuration_cmd *data =
3332 			(struct mac_configuration_cmd *)(raw->rdata);
3333 
3334 	/* If first entry contains a SET bit - the command was ADD,
3335 	 * otherwise - DEL_ALL
3336 	 */
3337 	if (GET_FLAG(data->config_table[0].flags,
3338 			MAC_CONFIGURATION_ENTRY_ACTION_TYPE)) {
3339 		int i, len = data->hdr.length;
3340 
3341 		/* Break if it was a RESTORE command */
3342 		if (!list_empty(&o->registry.exact_match.macs))
3343 			return 0;
3344 
3345 		elem = kzalloc(sizeof(*elem)*len, GFP_ATOMIC);
3346 		if (!elem) {
3347 			BNX2X_ERR("Failed to allocate registry memory\n");
3348 			return -ENOMEM;
3349 		}
3350 
3351 		for (i = 0; i < len; i++, elem++) {
3352 			bnx2x_get_fw_mac_addr(
3353 				&data->config_table[i].msb_mac_addr,
3354 				&data->config_table[i].middle_mac_addr,
3355 				&data->config_table[i].lsb_mac_addr,
3356 				elem->mac);
3357 			DP(BNX2X_MSG_SP, "Adding registry entry for [%pM]\n",
3358 					 elem->mac);
3359 			list_add_tail(&elem->link,
3360 				      &o->registry.exact_match.macs);
3361 		}
3362 	} else {
3363 		elem = list_first_entry(&o->registry.exact_match.macs,
3364 					struct bnx2x_mcast_mac_elem, link);
3365 		DP(BNX2X_MSG_SP, "Deleting a registry\n");
3366 		kfree(elem);
3367 		INIT_LIST_HEAD(&o->registry.exact_match.macs);
3368 	}
3369 
3370 	return 0;
3371 }
3372 
3373 static int bnx2x_mcast_setup_e1(struct bnx2x *bp,
3374 				struct bnx2x_mcast_ramrod_params *p,
3375 				int cmd)
3376 {
3377 	struct bnx2x_mcast_obj *o = p->mcast_obj;
3378 	struct bnx2x_raw_obj *raw = &o->raw;
3379 	struct mac_configuration_cmd *data =
3380 		(struct mac_configuration_cmd *)(raw->rdata);
3381 	int cnt = 0, i, rc;
3382 
3383 	/* Reset the ramrod data buffer */
3384 	memset(data, 0, sizeof(*data));
3385 
3386 	/* First set all entries as invalid */
3387 	for (i = 0; i < o->max_cmd_len ; i++)
3388 		SET_FLAG(data->config_table[i].flags,
3389 			 MAC_CONFIGURATION_ENTRY_ACTION_TYPE,
3390 			 T_ETH_MAC_COMMAND_INVALIDATE);
3391 
3392 	/* Handle pending commands first */
3393 	cnt = bnx2x_mcast_handle_pending_cmds_e1(bp, p);
3394 
3395 	/* If there are no more pending commands - clear SCHEDULED state */
3396 	if (list_empty(&o->pending_cmds_head))
3397 		o->clear_sched(o);
3398 
3399 	/* The below may be true iff there were no pending commands */
3400 	if (!cnt)
3401 		cnt = bnx2x_mcast_handle_current_cmd(bp, p, cmd, 0);
3402 
3403 	/* For 57710 every command has o->max_cmd_len length to ensure that
3404 	 * commands are done one at a time.
3405 	 */
3406 	o->total_pending_num -= o->max_cmd_len;
3407 
3408 	/* send a ramrod */
3409 
3410 	WARN_ON(cnt > o->max_cmd_len);
3411 
3412 	/* Set ramrod header (in particular, a number of entries to update) */
3413 	bnx2x_mcast_set_rdata_hdr_e1(bp, p, (u8)cnt);
3414 
3415 	/* update a registry: we need the registry contents to be always up
3416 	 * to date in order to be able to execute a RESTORE opcode. Here
3417 	 * we use the fact that for 57710 we sent one command at a time
3418 	 * hence we may take the registry update out of the command handling
3419 	 * and do it in a simpler way here.
3420 	 */
3421 	rc = bnx2x_mcast_refresh_registry_e1(bp, o);
3422 	if (rc)
3423 		return rc;
3424 
3425 	/*
3426 	 * If CLEAR_ONLY was requested - don't send a ramrod and clear
3427 	 * RAMROD_PENDING status immediately.
3428 	 */
3429 	if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) {
3430 		raw->clear_pending(raw);
3431 		return 0;
3432 	} else {
3433 		/*
3434 		 *  No need for an explicit memory barrier here as long we would
3435 		 *  need to ensure the ordering of writing to the SPQ element
3436 		 *  and updating of the SPQ producer which involves a memory
3437 		 *  read and we will have to put a full memory barrier there
3438 		 *  (inside bnx2x_sp_post()).
3439 		 */
3440 
3441 		/* Send a ramrod */
3442 		rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, raw->cid,
3443 				   U64_HI(raw->rdata_mapping),
3444 				   U64_LO(raw->rdata_mapping),
3445 				   ETH_CONNECTION_TYPE);
3446 		if (rc)
3447 			return rc;
3448 
3449 		/* Ramrod completion is pending */
3450 		return 1;
3451 	}
3452 
3453 }
3454 
3455 static int bnx2x_mcast_get_registry_size_exact(struct bnx2x_mcast_obj *o)
3456 {
3457 	return o->registry.exact_match.num_macs_set;
3458 }
3459 
3460 static int bnx2x_mcast_get_registry_size_aprox(struct bnx2x_mcast_obj *o)
3461 {
3462 	return o->registry.aprox_match.num_bins_set;
3463 }
3464 
3465 static void bnx2x_mcast_set_registry_size_exact(struct bnx2x_mcast_obj *o,
3466 						int n)
3467 {
3468 	o->registry.exact_match.num_macs_set = n;
3469 }
3470 
3471 static void bnx2x_mcast_set_registry_size_aprox(struct bnx2x_mcast_obj *o,
3472 						int n)
3473 {
3474 	o->registry.aprox_match.num_bins_set = n;
3475 }
3476 
3477 int bnx2x_config_mcast(struct bnx2x *bp,
3478 		       struct bnx2x_mcast_ramrod_params *p,
3479 		       int cmd)
3480 {
3481 	struct bnx2x_mcast_obj *o = p->mcast_obj;
3482 	struct bnx2x_raw_obj *r = &o->raw;
3483 	int rc = 0, old_reg_size;
3484 
3485 	/* This is needed to recover number of currently configured mcast macs
3486 	 * in case of failure.
3487 	 */
3488 	old_reg_size = o->get_registry_size(o);
3489 
3490 	/* Do some calculations and checks */
3491 	rc = o->validate(bp, p, cmd);
3492 	if (rc)
3493 		return rc;
3494 
3495 	/* Return if there is no work to do */
3496 	if ((!p->mcast_list_len) && (!o->check_sched(o)))
3497 		return 0;
3498 
3499 	DP(BNX2X_MSG_SP, "o->total_pending_num=%d p->mcast_list_len=%d "
3500 			 "o->max_cmd_len=%d\n", o->total_pending_num,
3501 			 p->mcast_list_len, o->max_cmd_len);
3502 
3503 	/* Enqueue the current command to the pending list if we can't complete
3504 	 * it in the current iteration
3505 	 */
3506 	if (r->check_pending(r) ||
3507 	    ((o->max_cmd_len > 0) && (o->total_pending_num > o->max_cmd_len))) {
3508 		rc = o->enqueue_cmd(bp, p->mcast_obj, p, cmd);
3509 		if (rc < 0)
3510 			goto error_exit1;
3511 
3512 		/* As long as the current command is in a command list we
3513 		 * don't need to handle it separately.
3514 		 */
3515 		p->mcast_list_len = 0;
3516 	}
3517 
3518 	if (!r->check_pending(r)) {
3519 
3520 		/* Set 'pending' state */
3521 		r->set_pending(r);
3522 
3523 		/* Configure the new classification in the chip */
3524 		rc = o->config_mcast(bp, p, cmd);
3525 		if (rc < 0)
3526 			goto error_exit2;
3527 
3528 		/* Wait for a ramrod completion if was requested */
3529 		if (test_bit(RAMROD_COMP_WAIT, &p->ramrod_flags))
3530 			rc = o->wait_comp(bp, o);
3531 	}
3532 
3533 	return rc;
3534 
3535 error_exit2:
3536 	r->clear_pending(r);
3537 
3538 error_exit1:
3539 	o->revert(bp, p, old_reg_size);
3540 
3541 	return rc;
3542 }
3543 
3544 static void bnx2x_mcast_clear_sched(struct bnx2x_mcast_obj *o)
3545 {
3546 	smp_mb__before_clear_bit();
3547 	clear_bit(o->sched_state, o->raw.pstate);
3548 	smp_mb__after_clear_bit();
3549 }
3550 
3551 static void bnx2x_mcast_set_sched(struct bnx2x_mcast_obj *o)
3552 {
3553 	smp_mb__before_clear_bit();
3554 	set_bit(o->sched_state, o->raw.pstate);
3555 	smp_mb__after_clear_bit();
3556 }
3557 
3558 static bool bnx2x_mcast_check_sched(struct bnx2x_mcast_obj *o)
3559 {
3560 	return !!test_bit(o->sched_state, o->raw.pstate);
3561 }
3562 
3563 static bool bnx2x_mcast_check_pending(struct bnx2x_mcast_obj *o)
3564 {
3565 	return o->raw.check_pending(&o->raw) || o->check_sched(o);
3566 }
3567 
3568 void bnx2x_init_mcast_obj(struct bnx2x *bp,
3569 			  struct bnx2x_mcast_obj *mcast_obj,
3570 			  u8 mcast_cl_id, u32 mcast_cid, u8 func_id,
3571 			  u8 engine_id, void *rdata, dma_addr_t rdata_mapping,
3572 			  int state, unsigned long *pstate, bnx2x_obj_type type)
3573 {
3574 	memset(mcast_obj, 0, sizeof(*mcast_obj));
3575 
3576 	bnx2x_init_raw_obj(&mcast_obj->raw, mcast_cl_id, mcast_cid, func_id,
3577 			   rdata, rdata_mapping, state, pstate, type);
3578 
3579 	mcast_obj->engine_id = engine_id;
3580 
3581 	INIT_LIST_HEAD(&mcast_obj->pending_cmds_head);
3582 
3583 	mcast_obj->sched_state = BNX2X_FILTER_MCAST_SCHED;
3584 	mcast_obj->check_sched = bnx2x_mcast_check_sched;
3585 	mcast_obj->set_sched = bnx2x_mcast_set_sched;
3586 	mcast_obj->clear_sched = bnx2x_mcast_clear_sched;
3587 
3588 	if (CHIP_IS_E1(bp)) {
3589 		mcast_obj->config_mcast      = bnx2x_mcast_setup_e1;
3590 		mcast_obj->enqueue_cmd       = bnx2x_mcast_enqueue_cmd;
3591 		mcast_obj->hdl_restore       =
3592 			bnx2x_mcast_handle_restore_cmd_e1;
3593 		mcast_obj->check_pending     = bnx2x_mcast_check_pending;
3594 
3595 		if (CHIP_REV_IS_SLOW(bp))
3596 			mcast_obj->max_cmd_len = BNX2X_MAX_EMUL_MULTI;
3597 		else
3598 			mcast_obj->max_cmd_len = BNX2X_MAX_MULTICAST;
3599 
3600 		mcast_obj->wait_comp         = bnx2x_mcast_wait;
3601 		mcast_obj->set_one_rule      = bnx2x_mcast_set_one_rule_e1;
3602 		mcast_obj->validate          = bnx2x_mcast_validate_e1;
3603 		mcast_obj->revert            = bnx2x_mcast_revert_e1;
3604 		mcast_obj->get_registry_size =
3605 			bnx2x_mcast_get_registry_size_exact;
3606 		mcast_obj->set_registry_size =
3607 			bnx2x_mcast_set_registry_size_exact;
3608 
3609 		/* 57710 is the only chip that uses the exact match for mcast
3610 		 * at the moment.
3611 		 */
3612 		INIT_LIST_HEAD(&mcast_obj->registry.exact_match.macs);
3613 
3614 	} else if (CHIP_IS_E1H(bp)) {
3615 		mcast_obj->config_mcast  = bnx2x_mcast_setup_e1h;
3616 		mcast_obj->enqueue_cmd   = NULL;
3617 		mcast_obj->hdl_restore   = NULL;
3618 		mcast_obj->check_pending = bnx2x_mcast_check_pending;
3619 
3620 		/* 57711 doesn't send a ramrod, so it has unlimited credit
3621 		 * for one command.
3622 		 */
3623 		mcast_obj->max_cmd_len       = -1;
3624 		mcast_obj->wait_comp         = bnx2x_mcast_wait;
3625 		mcast_obj->set_one_rule      = NULL;
3626 		mcast_obj->validate          = bnx2x_mcast_validate_e1h;
3627 		mcast_obj->revert            = bnx2x_mcast_revert_e1h;
3628 		mcast_obj->get_registry_size =
3629 			bnx2x_mcast_get_registry_size_aprox;
3630 		mcast_obj->set_registry_size =
3631 			bnx2x_mcast_set_registry_size_aprox;
3632 	} else {
3633 		mcast_obj->config_mcast      = bnx2x_mcast_setup_e2;
3634 		mcast_obj->enqueue_cmd       = bnx2x_mcast_enqueue_cmd;
3635 		mcast_obj->hdl_restore       =
3636 			bnx2x_mcast_handle_restore_cmd_e2;
3637 		mcast_obj->check_pending     = bnx2x_mcast_check_pending;
3638 		/* TODO: There should be a proper HSI define for this number!!!
3639 		 */
3640 		mcast_obj->max_cmd_len       = 16;
3641 		mcast_obj->wait_comp         = bnx2x_mcast_wait;
3642 		mcast_obj->set_one_rule      = bnx2x_mcast_set_one_rule_e2;
3643 		mcast_obj->validate          = bnx2x_mcast_validate_e2;
3644 		mcast_obj->revert            = bnx2x_mcast_revert_e2;
3645 		mcast_obj->get_registry_size =
3646 			bnx2x_mcast_get_registry_size_aprox;
3647 		mcast_obj->set_registry_size =
3648 			bnx2x_mcast_set_registry_size_aprox;
3649 	}
3650 }
3651 
3652 /*************************** Credit handling **********************************/
3653 
3654 /**
3655  * atomic_add_ifless - add if the result is less than a given value.
3656  *
3657  * @v:	pointer of type atomic_t
3658  * @a:	the amount to add to v...
3659  * @u:	...if (v + a) is less than u.
3660  *
3661  * returns true if (v + a) was less than u, and false otherwise.
3662  *
3663  */
3664 static inline bool __atomic_add_ifless(atomic_t *v, int a, int u)
3665 {
3666 	int c, old;
3667 
3668 	c = atomic_read(v);
3669 	for (;;) {
3670 		if (unlikely(c + a >= u))
3671 			return false;
3672 
3673 		old = atomic_cmpxchg((v), c, c + a);
3674 		if (likely(old == c))
3675 			break;
3676 		c = old;
3677 	}
3678 
3679 	return true;
3680 }
3681 
3682 /**
3683  * atomic_dec_ifmoe - dec if the result is more or equal than a given value.
3684  *
3685  * @v:	pointer of type atomic_t
3686  * @a:	the amount to dec from v...
3687  * @u:	...if (v - a) is more or equal than u.
3688  *
3689  * returns true if (v - a) was more or equal than u, and false
3690  * otherwise.
3691  */
3692 static inline bool __atomic_dec_ifmoe(atomic_t *v, int a, int u)
3693 {
3694 	int c, old;
3695 
3696 	c = atomic_read(v);
3697 	for (;;) {
3698 		if (unlikely(c - a < u))
3699 			return false;
3700 
3701 		old = atomic_cmpxchg((v), c, c - a);
3702 		if (likely(old == c))
3703 			break;
3704 		c = old;
3705 	}
3706 
3707 	return true;
3708 }
3709 
3710 static bool bnx2x_credit_pool_get(struct bnx2x_credit_pool_obj *o, int cnt)
3711 {
3712 	bool rc;
3713 
3714 	smp_mb();
3715 	rc = __atomic_dec_ifmoe(&o->credit, cnt, 0);
3716 	smp_mb();
3717 
3718 	return rc;
3719 }
3720 
3721 static bool bnx2x_credit_pool_put(struct bnx2x_credit_pool_obj *o, int cnt)
3722 {
3723 	bool rc;
3724 
3725 	smp_mb();
3726 
3727 	/* Don't let to refill if credit + cnt > pool_sz */
3728 	rc = __atomic_add_ifless(&o->credit, cnt, o->pool_sz + 1);
3729 
3730 	smp_mb();
3731 
3732 	return rc;
3733 }
3734 
3735 static int bnx2x_credit_pool_check(struct bnx2x_credit_pool_obj *o)
3736 {
3737 	int cur_credit;
3738 
3739 	smp_mb();
3740 	cur_credit = atomic_read(&o->credit);
3741 
3742 	return cur_credit;
3743 }
3744 
3745 static bool bnx2x_credit_pool_always_true(struct bnx2x_credit_pool_obj *o,
3746 					  int cnt)
3747 {
3748 	return true;
3749 }
3750 
3751 
3752 static bool bnx2x_credit_pool_get_entry(
3753 	struct bnx2x_credit_pool_obj *o,
3754 	int *offset)
3755 {
3756 	int idx, vec, i;
3757 
3758 	*offset = -1;
3759 
3760 	/* Find "internal cam-offset" then add to base for this object... */
3761 	for (vec = 0; vec < BNX2X_POOL_VEC_SIZE; vec++) {
3762 
3763 		/* Skip the current vector if there are no free entries in it */
3764 		if (!o->pool_mirror[vec])
3765 			continue;
3766 
3767 		/* If we've got here we are going to find a free entry */
3768 		for (idx = vec * BNX2X_POOL_VEC_SIZE, i = 0;
3769 		      i < BIT_VEC64_ELEM_SZ; idx++, i++)
3770 
3771 			if (BIT_VEC64_TEST_BIT(o->pool_mirror, idx)) {
3772 				/* Got one!! */
3773 				BIT_VEC64_CLEAR_BIT(o->pool_mirror, idx);
3774 				*offset = o->base_pool_offset + idx;
3775 				return true;
3776 			}
3777 	}
3778 
3779 	return false;
3780 }
3781 
3782 static bool bnx2x_credit_pool_put_entry(
3783 	struct bnx2x_credit_pool_obj *o,
3784 	int offset)
3785 {
3786 	if (offset < o->base_pool_offset)
3787 		return false;
3788 
3789 	offset -= o->base_pool_offset;
3790 
3791 	if (offset >= o->pool_sz)
3792 		return false;
3793 
3794 	/* Return the entry to the pool */
3795 	BIT_VEC64_SET_BIT(o->pool_mirror, offset);
3796 
3797 	return true;
3798 }
3799 
3800 static bool bnx2x_credit_pool_put_entry_always_true(
3801 	struct bnx2x_credit_pool_obj *o,
3802 	int offset)
3803 {
3804 	return true;
3805 }
3806 
3807 static bool bnx2x_credit_pool_get_entry_always_true(
3808 	struct bnx2x_credit_pool_obj *o,
3809 	int *offset)
3810 {
3811 	*offset = -1;
3812 	return true;
3813 }
3814 /**
3815  * bnx2x_init_credit_pool - initialize credit pool internals.
3816  *
3817  * @p:
3818  * @base:	Base entry in the CAM to use.
3819  * @credit:	pool size.
3820  *
3821  * If base is negative no CAM entries handling will be performed.
3822  * If credit is negative pool operations will always succeed (unlimited pool).
3823  *
3824  */
3825 static inline void bnx2x_init_credit_pool(struct bnx2x_credit_pool_obj *p,
3826 					  int base, int credit)
3827 {
3828 	/* Zero the object first */
3829 	memset(p, 0, sizeof(*p));
3830 
3831 	/* Set the table to all 1s */
3832 	memset(&p->pool_mirror, 0xff, sizeof(p->pool_mirror));
3833 
3834 	/* Init a pool as full */
3835 	atomic_set(&p->credit, credit);
3836 
3837 	/* The total poll size */
3838 	p->pool_sz = credit;
3839 
3840 	p->base_pool_offset = base;
3841 
3842 	/* Commit the change */
3843 	smp_mb();
3844 
3845 	p->check = bnx2x_credit_pool_check;
3846 
3847 	/* if pool credit is negative - disable the checks */
3848 	if (credit >= 0) {
3849 		p->put      = bnx2x_credit_pool_put;
3850 		p->get      = bnx2x_credit_pool_get;
3851 		p->put_entry = bnx2x_credit_pool_put_entry;
3852 		p->get_entry = bnx2x_credit_pool_get_entry;
3853 	} else {
3854 		p->put      = bnx2x_credit_pool_always_true;
3855 		p->get      = bnx2x_credit_pool_always_true;
3856 		p->put_entry = bnx2x_credit_pool_put_entry_always_true;
3857 		p->get_entry = bnx2x_credit_pool_get_entry_always_true;
3858 	}
3859 
3860 	/* If base is negative - disable entries handling */
3861 	if (base < 0) {
3862 		p->put_entry = bnx2x_credit_pool_put_entry_always_true;
3863 		p->get_entry = bnx2x_credit_pool_get_entry_always_true;
3864 	}
3865 }
3866 
3867 void bnx2x_init_mac_credit_pool(struct bnx2x *bp,
3868 				struct bnx2x_credit_pool_obj *p, u8 func_id,
3869 				u8 func_num)
3870 {
3871 /* TODO: this will be defined in consts as well... */
3872 #define BNX2X_CAM_SIZE_EMUL 5
3873 
3874 	int cam_sz;
3875 
3876 	if (CHIP_IS_E1(bp)) {
3877 		/* In E1, Multicast is saved in cam... */
3878 		if (!CHIP_REV_IS_SLOW(bp))
3879 			cam_sz = (MAX_MAC_CREDIT_E1 / 2) - BNX2X_MAX_MULTICAST;
3880 		else
3881 			cam_sz = BNX2X_CAM_SIZE_EMUL - BNX2X_MAX_EMUL_MULTI;
3882 
3883 		bnx2x_init_credit_pool(p, func_id * cam_sz, cam_sz);
3884 
3885 	} else if (CHIP_IS_E1H(bp)) {
3886 		/* CAM credit is equaly divided between all active functions
3887 		 * on the PORT!.
3888 		 */
3889 		if ((func_num > 0)) {
3890 			if (!CHIP_REV_IS_SLOW(bp))
3891 				cam_sz = (MAX_MAC_CREDIT_E1H / (2*func_num));
3892 			else
3893 				cam_sz = BNX2X_CAM_SIZE_EMUL;
3894 			bnx2x_init_credit_pool(p, func_id * cam_sz, cam_sz);
3895 		} else {
3896 			/* this should never happen! Block MAC operations. */
3897 			bnx2x_init_credit_pool(p, 0, 0);
3898 		}
3899 
3900 	} else {
3901 
3902 		/*
3903 		 * CAM credit is equaly divided between all active functions
3904 		 * on the PATH.
3905 		 */
3906 		if ((func_num > 0)) {
3907 			if (!CHIP_REV_IS_SLOW(bp))
3908 				cam_sz = (MAX_MAC_CREDIT_E2 / func_num);
3909 			else
3910 				cam_sz = BNX2X_CAM_SIZE_EMUL;
3911 
3912 			/*
3913 			 * No need for CAM entries handling for 57712 and
3914 			 * newer.
3915 			 */
3916 			bnx2x_init_credit_pool(p, -1, cam_sz);
3917 		} else {
3918 			/* this should never happen! Block MAC operations. */
3919 			bnx2x_init_credit_pool(p, 0, 0);
3920 		}
3921 
3922 	}
3923 }
3924 
3925 void bnx2x_init_vlan_credit_pool(struct bnx2x *bp,
3926 				 struct bnx2x_credit_pool_obj *p,
3927 				 u8 func_id,
3928 				 u8 func_num)
3929 {
3930 	if (CHIP_IS_E1x(bp)) {
3931 		/*
3932 		 * There is no VLAN credit in HW on 57710 and 57711 only
3933 		 * MAC / MAC-VLAN can be set
3934 		 */
3935 		bnx2x_init_credit_pool(p, 0, -1);
3936 	} else {
3937 		/*
3938 		 * CAM credit is equaly divided between all active functions
3939 		 * on the PATH.
3940 		 */
3941 		if (func_num > 0) {
3942 			int credit = MAX_VLAN_CREDIT_E2 / func_num;
3943 			bnx2x_init_credit_pool(p, func_id * credit, credit);
3944 		} else
3945 			/* this should never happen! Block VLAN operations. */
3946 			bnx2x_init_credit_pool(p, 0, 0);
3947 	}
3948 }
3949 
3950 /****************** RSS Configuration ******************/
3951 /**
3952  * bnx2x_debug_print_ind_table - prints the indirection table configuration.
3953  *
3954  * @bp:		driver hanlde
3955  * @p:		pointer to rss configuration
3956  *
3957  * Prints it when NETIF_MSG_IFUP debug level is configured.
3958  */
3959 static inline void bnx2x_debug_print_ind_table(struct bnx2x *bp,
3960 					struct bnx2x_config_rss_params *p)
3961 {
3962 	int i;
3963 
3964 	DP(BNX2X_MSG_SP, "Setting indirection table to:\n");
3965 	DP(BNX2X_MSG_SP, "0x0000: ");
3966 	for (i = 0; i < T_ETH_INDIRECTION_TABLE_SIZE; i++) {
3967 		DP_CONT(BNX2X_MSG_SP, "0x%02x ", p->ind_table[i]);
3968 
3969 		/* Print 4 bytes in a line */
3970 		if ((i + 1 < T_ETH_INDIRECTION_TABLE_SIZE) &&
3971 		    (((i + 1) & 0x3) == 0)) {
3972 			DP_CONT(BNX2X_MSG_SP, "\n");
3973 			DP(BNX2X_MSG_SP, "0x%04x: ", i + 1);
3974 		}
3975 	}
3976 
3977 	DP_CONT(BNX2X_MSG_SP, "\n");
3978 }
3979 
3980 /**
3981  * bnx2x_setup_rss - configure RSS
3982  *
3983  * @bp:		device handle
3984  * @p:		rss configuration
3985  *
3986  * sends on UPDATE ramrod for that matter.
3987  */
3988 static int bnx2x_setup_rss(struct bnx2x *bp,
3989 			   struct bnx2x_config_rss_params *p)
3990 {
3991 	struct bnx2x_rss_config_obj *o = p->rss_obj;
3992 	struct bnx2x_raw_obj *r = &o->raw;
3993 	struct eth_rss_update_ramrod_data *data =
3994 		(struct eth_rss_update_ramrod_data *)(r->rdata);
3995 	u8 rss_mode = 0;
3996 	int rc;
3997 
3998 	memset(data, 0, sizeof(*data));
3999 
4000 	DP(BNX2X_MSG_SP, "Configuring RSS\n");
4001 
4002 	/* Set an echo field */
4003 	data->echo = (r->cid & BNX2X_SWCID_MASK) |
4004 		     (r->state << BNX2X_SWCID_SHIFT);
4005 
4006 	/* RSS mode */
4007 	if (test_bit(BNX2X_RSS_MODE_DISABLED, &p->rss_flags))
4008 		rss_mode = ETH_RSS_MODE_DISABLED;
4009 	else if (test_bit(BNX2X_RSS_MODE_REGULAR, &p->rss_flags))
4010 		rss_mode = ETH_RSS_MODE_REGULAR;
4011 	else if (test_bit(BNX2X_RSS_MODE_VLAN_PRI, &p->rss_flags))
4012 		rss_mode = ETH_RSS_MODE_VLAN_PRI;
4013 	else if (test_bit(BNX2X_RSS_MODE_E1HOV_PRI, &p->rss_flags))
4014 		rss_mode = ETH_RSS_MODE_E1HOV_PRI;
4015 	else if (test_bit(BNX2X_RSS_MODE_IP_DSCP, &p->rss_flags))
4016 		rss_mode = ETH_RSS_MODE_IP_DSCP;
4017 
4018 	data->rss_mode = rss_mode;
4019 
4020 	DP(BNX2X_MSG_SP, "rss_mode=%d\n", rss_mode);
4021 
4022 	/* RSS capabilities */
4023 	if (test_bit(BNX2X_RSS_IPV4, &p->rss_flags))
4024 		data->capabilities |=
4025 			ETH_RSS_UPDATE_RAMROD_DATA_IPV4_CAPABILITY;
4026 
4027 	if (test_bit(BNX2X_RSS_IPV4_TCP, &p->rss_flags))
4028 		data->capabilities |=
4029 			ETH_RSS_UPDATE_RAMROD_DATA_IPV4_TCP_CAPABILITY;
4030 
4031 	if (test_bit(BNX2X_RSS_IPV6, &p->rss_flags))
4032 		data->capabilities |=
4033 			ETH_RSS_UPDATE_RAMROD_DATA_IPV6_CAPABILITY;
4034 
4035 	if (test_bit(BNX2X_RSS_IPV6_TCP, &p->rss_flags))
4036 		data->capabilities |=
4037 			ETH_RSS_UPDATE_RAMROD_DATA_IPV6_TCP_CAPABILITY;
4038 
4039 	/* Hashing mask */
4040 	data->rss_result_mask = p->rss_result_mask;
4041 
4042 	/* RSS engine ID */
4043 	data->rss_engine_id = o->engine_id;
4044 
4045 	DP(BNX2X_MSG_SP, "rss_engine_id=%d\n", data->rss_engine_id);
4046 
4047 	/* Indirection table */
4048 	memcpy(data->indirection_table, p->ind_table,
4049 		  T_ETH_INDIRECTION_TABLE_SIZE);
4050 
4051 	/* Remember the last configuration */
4052 	memcpy(o->ind_table, p->ind_table, T_ETH_INDIRECTION_TABLE_SIZE);
4053 
4054 	/* Print the indirection table */
4055 	if (netif_msg_ifup(bp))
4056 		bnx2x_debug_print_ind_table(bp, p);
4057 
4058 	/* RSS keys */
4059 	if (test_bit(BNX2X_RSS_SET_SRCH, &p->rss_flags)) {
4060 		memcpy(&data->rss_key[0], &p->rss_key[0],
4061 		       sizeof(data->rss_key));
4062 		data->capabilities |= ETH_RSS_UPDATE_RAMROD_DATA_UPDATE_RSS_KEY;
4063 	}
4064 
4065 	/*
4066 	 *  No need for an explicit memory barrier here as long we would
4067 	 *  need to ensure the ordering of writing to the SPQ element
4068 	 *  and updating of the SPQ producer which involves a memory
4069 	 *  read and we will have to put a full memory barrier there
4070 	 *  (inside bnx2x_sp_post()).
4071 	 */
4072 
4073 	/* Send a ramrod */
4074 	rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_RSS_UPDATE, r->cid,
4075 			   U64_HI(r->rdata_mapping),
4076 			   U64_LO(r->rdata_mapping),
4077 			   ETH_CONNECTION_TYPE);
4078 
4079 	if (rc < 0)
4080 		return rc;
4081 
4082 	return 1;
4083 }
4084 
4085 void bnx2x_get_rss_ind_table(struct bnx2x_rss_config_obj *rss_obj,
4086 			     u8 *ind_table)
4087 {
4088 	memcpy(ind_table, rss_obj->ind_table, sizeof(rss_obj->ind_table));
4089 }
4090 
4091 int bnx2x_config_rss(struct bnx2x *bp,
4092 		     struct bnx2x_config_rss_params *p)
4093 {
4094 	int rc;
4095 	struct bnx2x_rss_config_obj *o = p->rss_obj;
4096 	struct bnx2x_raw_obj *r = &o->raw;
4097 
4098 	/* Do nothing if only driver cleanup was requested */
4099 	if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags))
4100 		return 0;
4101 
4102 	r->set_pending(r);
4103 
4104 	rc = o->config_rss(bp, p);
4105 	if (rc < 0) {
4106 		r->clear_pending(r);
4107 		return rc;
4108 	}
4109 
4110 	if (test_bit(RAMROD_COMP_WAIT, &p->ramrod_flags))
4111 		rc = r->wait_comp(bp, r);
4112 
4113 	return rc;
4114 }
4115 
4116 
4117 void bnx2x_init_rss_config_obj(struct bnx2x *bp,
4118 			       struct bnx2x_rss_config_obj *rss_obj,
4119 			       u8 cl_id, u32 cid, u8 func_id, u8 engine_id,
4120 			       void *rdata, dma_addr_t rdata_mapping,
4121 			       int state, unsigned long *pstate,
4122 			       bnx2x_obj_type type)
4123 {
4124 	bnx2x_init_raw_obj(&rss_obj->raw, cl_id, cid, func_id, rdata,
4125 			   rdata_mapping, state, pstate, type);
4126 
4127 	rss_obj->engine_id  = engine_id;
4128 	rss_obj->config_rss = bnx2x_setup_rss;
4129 }
4130 
4131 /********************** Queue state object ***********************************/
4132 
4133 /**
4134  * bnx2x_queue_state_change - perform Queue state change transition
4135  *
4136  * @bp:		device handle
4137  * @params:	parameters to perform the transition
4138  *
4139  * returns 0 in case of successfully completed transition, negative error
4140  * code in case of failure, positive (EBUSY) value if there is a completion
4141  * to that is still pending (possible only if RAMROD_COMP_WAIT is
4142  * not set in params->ramrod_flags for asynchronous commands).
4143  *
4144  */
4145 int bnx2x_queue_state_change(struct bnx2x *bp,
4146 			     struct bnx2x_queue_state_params *params)
4147 {
4148 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4149 	int rc, pending_bit;
4150 	unsigned long *pending = &o->pending;
4151 
4152 	/* Check that the requested transition is legal */
4153 	if (o->check_transition(bp, o, params))
4154 		return -EINVAL;
4155 
4156 	/* Set "pending" bit */
4157 	pending_bit = o->set_pending(o, params);
4158 
4159 	/* Don't send a command if only driver cleanup was requested */
4160 	if (test_bit(RAMROD_DRV_CLR_ONLY, &params->ramrod_flags))
4161 		o->complete_cmd(bp, o, pending_bit);
4162 	else {
4163 		/* Send a ramrod */
4164 		rc = o->send_cmd(bp, params);
4165 		if (rc) {
4166 			o->next_state = BNX2X_Q_STATE_MAX;
4167 			clear_bit(pending_bit, pending);
4168 			smp_mb__after_clear_bit();
4169 			return rc;
4170 		}
4171 
4172 		if (test_bit(RAMROD_COMP_WAIT, &params->ramrod_flags)) {
4173 			rc = o->wait_comp(bp, o, pending_bit);
4174 			if (rc)
4175 				return rc;
4176 
4177 			return 0;
4178 		}
4179 	}
4180 
4181 	return !!test_bit(pending_bit, pending);
4182 }
4183 
4184 
4185 static int bnx2x_queue_set_pending(struct bnx2x_queue_sp_obj *obj,
4186 				   struct bnx2x_queue_state_params *params)
4187 {
4188 	enum bnx2x_queue_cmd cmd = params->cmd, bit;
4189 
4190 	/* ACTIVATE and DEACTIVATE commands are implemented on top of
4191 	 * UPDATE command.
4192 	 */
4193 	if ((cmd == BNX2X_Q_CMD_ACTIVATE) ||
4194 	    (cmd == BNX2X_Q_CMD_DEACTIVATE))
4195 		bit = BNX2X_Q_CMD_UPDATE;
4196 	else
4197 		bit = cmd;
4198 
4199 	set_bit(bit, &obj->pending);
4200 	return bit;
4201 }
4202 
4203 static int bnx2x_queue_wait_comp(struct bnx2x *bp,
4204 				 struct bnx2x_queue_sp_obj *o,
4205 				 enum bnx2x_queue_cmd cmd)
4206 {
4207 	return bnx2x_state_wait(bp, cmd, &o->pending);
4208 }
4209 
4210 /**
4211  * bnx2x_queue_comp_cmd - complete the state change command.
4212  *
4213  * @bp:		device handle
4214  * @o:
4215  * @cmd:
4216  *
4217  * Checks that the arrived completion is expected.
4218  */
4219 static int bnx2x_queue_comp_cmd(struct bnx2x *bp,
4220 				struct bnx2x_queue_sp_obj *o,
4221 				enum bnx2x_queue_cmd cmd)
4222 {
4223 	unsigned long cur_pending = o->pending;
4224 
4225 	if (!test_and_clear_bit(cmd, &cur_pending)) {
4226 		BNX2X_ERR("Bad MC reply %d for queue %d in state %d "
4227 			  "pending 0x%lx, next_state %d\n", cmd,
4228 			  o->cids[BNX2X_PRIMARY_CID_INDEX],
4229 			  o->state, cur_pending, o->next_state);
4230 		return -EINVAL;
4231 	}
4232 
4233 	if (o->next_tx_only >= o->max_cos)
4234 		/* >= becuase tx only must always be smaller than cos since the
4235 		 * primary connection suports COS 0
4236 		 */
4237 		BNX2X_ERR("illegal value for next tx_only: %d. max cos was %d",
4238 			   o->next_tx_only, o->max_cos);
4239 
4240 	DP(BNX2X_MSG_SP, "Completing command %d for queue %d, "
4241 			 "setting state to %d\n", cmd,
4242 			 o->cids[BNX2X_PRIMARY_CID_INDEX], o->next_state);
4243 
4244 	if (o->next_tx_only)  /* print num tx-only if any exist */
4245 		DP(BNX2X_MSG_SP, "primary cid %d: num tx-only cons %d\n",
4246 			   o->cids[BNX2X_PRIMARY_CID_INDEX], o->next_tx_only);
4247 
4248 	o->state = o->next_state;
4249 	o->num_tx_only = o->next_tx_only;
4250 	o->next_state = BNX2X_Q_STATE_MAX;
4251 
4252 	/* It's important that o->state and o->next_state are
4253 	 * updated before o->pending.
4254 	 */
4255 	wmb();
4256 
4257 	clear_bit(cmd, &o->pending);
4258 	smp_mb__after_clear_bit();
4259 
4260 	return 0;
4261 }
4262 
4263 static void bnx2x_q_fill_setup_data_e2(struct bnx2x *bp,
4264 				struct bnx2x_queue_state_params *cmd_params,
4265 				struct client_init_ramrod_data *data)
4266 {
4267 	struct bnx2x_queue_setup_params *params = &cmd_params->params.setup;
4268 
4269 	/* Rx data */
4270 
4271 	/* IPv6 TPA supported for E2 and above only */
4272 	data->rx.tpa_en |= test_bit(BNX2X_Q_FLG_TPA_IPV6, &params->flags) *
4273 				CLIENT_INIT_RX_DATA_TPA_EN_IPV6;
4274 }
4275 
4276 static void bnx2x_q_fill_init_general_data(struct bnx2x *bp,
4277 				struct bnx2x_queue_sp_obj *o,
4278 				struct bnx2x_general_setup_params *params,
4279 				struct client_init_general_data *gen_data,
4280 				unsigned long *flags)
4281 {
4282 	gen_data->client_id = o->cl_id;
4283 
4284 	if (test_bit(BNX2X_Q_FLG_STATS, flags)) {
4285 		gen_data->statistics_counter_id =
4286 					params->stat_id;
4287 		gen_data->statistics_en_flg = 1;
4288 		gen_data->statistics_zero_flg =
4289 			test_bit(BNX2X_Q_FLG_ZERO_STATS, flags);
4290 	} else
4291 		gen_data->statistics_counter_id =
4292 					DISABLE_STATISTIC_COUNTER_ID_VALUE;
4293 
4294 	gen_data->is_fcoe_flg = test_bit(BNX2X_Q_FLG_FCOE, flags);
4295 	gen_data->activate_flg = test_bit(BNX2X_Q_FLG_ACTIVE, flags);
4296 	gen_data->sp_client_id = params->spcl_id;
4297 	gen_data->mtu = cpu_to_le16(params->mtu);
4298 	gen_data->func_id = o->func_id;
4299 
4300 
4301 	gen_data->cos = params->cos;
4302 
4303 	gen_data->traffic_type =
4304 		test_bit(BNX2X_Q_FLG_FCOE, flags) ?
4305 		LLFC_TRAFFIC_TYPE_FCOE : LLFC_TRAFFIC_TYPE_NW;
4306 
4307 	DP(BNX2X_MSG_SP, "flags: active %d, cos %d, stats en %d\n",
4308 	   gen_data->activate_flg, gen_data->cos, gen_data->statistics_en_flg);
4309 }
4310 
4311 static void bnx2x_q_fill_init_tx_data(struct bnx2x_queue_sp_obj *o,
4312 				struct bnx2x_txq_setup_params *params,
4313 				struct client_init_tx_data *tx_data,
4314 				unsigned long *flags)
4315 {
4316 	tx_data->enforce_security_flg =
4317 		test_bit(BNX2X_Q_FLG_TX_SEC, flags);
4318 	tx_data->default_vlan =
4319 		cpu_to_le16(params->default_vlan);
4320 	tx_data->default_vlan_flg =
4321 		test_bit(BNX2X_Q_FLG_DEF_VLAN, flags);
4322 	tx_data->tx_switching_flg =
4323 		test_bit(BNX2X_Q_FLG_TX_SWITCH, flags);
4324 	tx_data->anti_spoofing_flg =
4325 		test_bit(BNX2X_Q_FLG_ANTI_SPOOF, flags);
4326 	tx_data->tx_status_block_id = params->fw_sb_id;
4327 	tx_data->tx_sb_index_number = params->sb_cq_index;
4328 	tx_data->tss_leading_client_id = params->tss_leading_cl_id;
4329 
4330 	tx_data->tx_bd_page_base.lo =
4331 		cpu_to_le32(U64_LO(params->dscr_map));
4332 	tx_data->tx_bd_page_base.hi =
4333 		cpu_to_le32(U64_HI(params->dscr_map));
4334 
4335 	/* Don't configure any Tx switching mode during queue SETUP */
4336 	tx_data->state = 0;
4337 }
4338 
4339 static void bnx2x_q_fill_init_pause_data(struct bnx2x_queue_sp_obj *o,
4340 				struct rxq_pause_params *params,
4341 				struct client_init_rx_data *rx_data)
4342 {
4343 	/* flow control data */
4344 	rx_data->cqe_pause_thr_low = cpu_to_le16(params->rcq_th_lo);
4345 	rx_data->cqe_pause_thr_high = cpu_to_le16(params->rcq_th_hi);
4346 	rx_data->bd_pause_thr_low = cpu_to_le16(params->bd_th_lo);
4347 	rx_data->bd_pause_thr_high = cpu_to_le16(params->bd_th_hi);
4348 	rx_data->sge_pause_thr_low = cpu_to_le16(params->sge_th_lo);
4349 	rx_data->sge_pause_thr_high = cpu_to_le16(params->sge_th_hi);
4350 	rx_data->rx_cos_mask = cpu_to_le16(params->pri_map);
4351 }
4352 
4353 static void bnx2x_q_fill_init_rx_data(struct bnx2x_queue_sp_obj *o,
4354 				struct bnx2x_rxq_setup_params *params,
4355 				struct client_init_rx_data *rx_data,
4356 				unsigned long *flags)
4357 {
4358 		/* Rx data */
4359 	rx_data->tpa_en = test_bit(BNX2X_Q_FLG_TPA, flags) *
4360 				CLIENT_INIT_RX_DATA_TPA_EN_IPV4;
4361 	rx_data->vmqueue_mode_en_flg = 0;
4362 
4363 	rx_data->cache_line_alignment_log_size =
4364 		params->cache_line_log;
4365 	rx_data->enable_dynamic_hc =
4366 		test_bit(BNX2X_Q_FLG_DHC, flags);
4367 	rx_data->max_sges_for_packet = params->max_sges_pkt;
4368 	rx_data->client_qzone_id = params->cl_qzone_id;
4369 	rx_data->max_agg_size = cpu_to_le16(params->tpa_agg_sz);
4370 
4371 	/* Always start in DROP_ALL mode */
4372 	rx_data->state = cpu_to_le16(CLIENT_INIT_RX_DATA_UCAST_DROP_ALL |
4373 				     CLIENT_INIT_RX_DATA_MCAST_DROP_ALL);
4374 
4375 	/* We don't set drop flags */
4376 	rx_data->drop_ip_cs_err_flg = 0;
4377 	rx_data->drop_tcp_cs_err_flg = 0;
4378 	rx_data->drop_ttl0_flg = 0;
4379 	rx_data->drop_udp_cs_err_flg = 0;
4380 	rx_data->inner_vlan_removal_enable_flg =
4381 		test_bit(BNX2X_Q_FLG_VLAN, flags);
4382 	rx_data->outer_vlan_removal_enable_flg =
4383 		test_bit(BNX2X_Q_FLG_OV, flags);
4384 	rx_data->status_block_id = params->fw_sb_id;
4385 	rx_data->rx_sb_index_number = params->sb_cq_index;
4386 	rx_data->max_tpa_queues = params->max_tpa_queues;
4387 	rx_data->max_bytes_on_bd = cpu_to_le16(params->buf_sz);
4388 	rx_data->sge_buff_size = cpu_to_le16(params->sge_buf_sz);
4389 	rx_data->bd_page_base.lo =
4390 		cpu_to_le32(U64_LO(params->dscr_map));
4391 	rx_data->bd_page_base.hi =
4392 		cpu_to_le32(U64_HI(params->dscr_map));
4393 	rx_data->sge_page_base.lo =
4394 		cpu_to_le32(U64_LO(params->sge_map));
4395 	rx_data->sge_page_base.hi =
4396 		cpu_to_le32(U64_HI(params->sge_map));
4397 	rx_data->cqe_page_base.lo =
4398 		cpu_to_le32(U64_LO(params->rcq_map));
4399 	rx_data->cqe_page_base.hi =
4400 		cpu_to_le32(U64_HI(params->rcq_map));
4401 	rx_data->is_leading_rss = test_bit(BNX2X_Q_FLG_LEADING_RSS, flags);
4402 
4403 	if (test_bit(BNX2X_Q_FLG_MCAST, flags)) {
4404 		rx_data->approx_mcast_engine_id = o->func_id;
4405 		rx_data->is_approx_mcast = 1;
4406 	}
4407 
4408 	rx_data->rss_engine_id = params->rss_engine_id;
4409 
4410 	/* silent vlan removal */
4411 	rx_data->silent_vlan_removal_flg =
4412 		test_bit(BNX2X_Q_FLG_SILENT_VLAN_REM, flags);
4413 	rx_data->silent_vlan_value =
4414 		cpu_to_le16(params->silent_removal_value);
4415 	rx_data->silent_vlan_mask =
4416 		cpu_to_le16(params->silent_removal_mask);
4417 
4418 }
4419 
4420 /* initialize the general, tx and rx parts of a queue object */
4421 static void bnx2x_q_fill_setup_data_cmn(struct bnx2x *bp,
4422 				struct bnx2x_queue_state_params *cmd_params,
4423 				struct client_init_ramrod_data *data)
4424 {
4425 	bnx2x_q_fill_init_general_data(bp, cmd_params->q_obj,
4426 				       &cmd_params->params.setup.gen_params,
4427 				       &data->general,
4428 				       &cmd_params->params.setup.flags);
4429 
4430 	bnx2x_q_fill_init_tx_data(cmd_params->q_obj,
4431 				  &cmd_params->params.setup.txq_params,
4432 				  &data->tx,
4433 				  &cmd_params->params.setup.flags);
4434 
4435 	bnx2x_q_fill_init_rx_data(cmd_params->q_obj,
4436 				  &cmd_params->params.setup.rxq_params,
4437 				  &data->rx,
4438 				  &cmd_params->params.setup.flags);
4439 
4440 	bnx2x_q_fill_init_pause_data(cmd_params->q_obj,
4441 				     &cmd_params->params.setup.pause_params,
4442 				     &data->rx);
4443 }
4444 
4445 /* initialize the general and tx parts of a tx-only queue object */
4446 static void bnx2x_q_fill_setup_tx_only(struct bnx2x *bp,
4447 				struct bnx2x_queue_state_params *cmd_params,
4448 				struct tx_queue_init_ramrod_data *data)
4449 {
4450 	bnx2x_q_fill_init_general_data(bp, cmd_params->q_obj,
4451 				       &cmd_params->params.tx_only.gen_params,
4452 				       &data->general,
4453 				       &cmd_params->params.tx_only.flags);
4454 
4455 	bnx2x_q_fill_init_tx_data(cmd_params->q_obj,
4456 				  &cmd_params->params.tx_only.txq_params,
4457 				  &data->tx,
4458 				  &cmd_params->params.tx_only.flags);
4459 
4460 	DP(BNX2X_MSG_SP, "cid %d, tx bd page lo %x hi %x\n",cmd_params->q_obj->cids[0],
4461 	   data->tx.tx_bd_page_base.lo, data->tx.tx_bd_page_base.hi);
4462 }
4463 
4464 /**
4465  * bnx2x_q_init - init HW/FW queue
4466  *
4467  * @bp:		device handle
4468  * @params:
4469  *
4470  * HW/FW initial Queue configuration:
4471  *      - HC: Rx and Tx
4472  *      - CDU context validation
4473  *
4474  */
4475 static inline int bnx2x_q_init(struct bnx2x *bp,
4476 			       struct bnx2x_queue_state_params *params)
4477 {
4478 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4479 	struct bnx2x_queue_init_params *init = &params->params.init;
4480 	u16 hc_usec;
4481 	u8 cos;
4482 
4483 	/* Tx HC configuration */
4484 	if (test_bit(BNX2X_Q_TYPE_HAS_TX, &o->type) &&
4485 	    test_bit(BNX2X_Q_FLG_HC, &init->tx.flags)) {
4486 		hc_usec = init->tx.hc_rate ? 1000000 / init->tx.hc_rate : 0;
4487 
4488 		bnx2x_update_coalesce_sb_index(bp, init->tx.fw_sb_id,
4489 			init->tx.sb_cq_index,
4490 			!test_bit(BNX2X_Q_FLG_HC_EN, &init->tx.flags),
4491 			hc_usec);
4492 	}
4493 
4494 	/* Rx HC configuration */
4495 	if (test_bit(BNX2X_Q_TYPE_HAS_RX, &o->type) &&
4496 	    test_bit(BNX2X_Q_FLG_HC, &init->rx.flags)) {
4497 		hc_usec = init->rx.hc_rate ? 1000000 / init->rx.hc_rate : 0;
4498 
4499 		bnx2x_update_coalesce_sb_index(bp, init->rx.fw_sb_id,
4500 			init->rx.sb_cq_index,
4501 			!test_bit(BNX2X_Q_FLG_HC_EN, &init->rx.flags),
4502 			hc_usec);
4503 	}
4504 
4505 	/* Set CDU context validation values */
4506 	for (cos = 0; cos < o->max_cos; cos++) {
4507 		DP(BNX2X_MSG_SP, "setting context validation. cid %d, cos %d\n",
4508 				 o->cids[cos], cos);
4509 		DP(BNX2X_MSG_SP, "context pointer %p\n", init->cxts[cos]);
4510 		bnx2x_set_ctx_validation(bp, init->cxts[cos], o->cids[cos]);
4511 	}
4512 
4513 	/* As no ramrod is sent, complete the command immediately  */
4514 	o->complete_cmd(bp, o, BNX2X_Q_CMD_INIT);
4515 
4516 	mmiowb();
4517 	smp_mb();
4518 
4519 	return 0;
4520 }
4521 
4522 static inline int bnx2x_q_send_setup_e1x(struct bnx2x *bp,
4523 					struct bnx2x_queue_state_params *params)
4524 {
4525 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4526 	struct client_init_ramrod_data *rdata =
4527 		(struct client_init_ramrod_data *)o->rdata;
4528 	dma_addr_t data_mapping = o->rdata_mapping;
4529 	int ramrod = RAMROD_CMD_ID_ETH_CLIENT_SETUP;
4530 
4531 	/* Clear the ramrod data */
4532 	memset(rdata, 0, sizeof(*rdata));
4533 
4534 	/* Fill the ramrod data */
4535 	bnx2x_q_fill_setup_data_cmn(bp, params, rdata);
4536 
4537 	/*
4538 	 *  No need for an explicit memory barrier here as long we would
4539 	 *  need to ensure the ordering of writing to the SPQ element
4540 	 *  and updating of the SPQ producer which involves a memory
4541 	 *  read and we will have to put a full memory barrier there
4542 	 *  (inside bnx2x_sp_post()).
4543 	 */
4544 
4545 	return bnx2x_sp_post(bp, ramrod, o->cids[BNX2X_PRIMARY_CID_INDEX],
4546 			     U64_HI(data_mapping),
4547 			     U64_LO(data_mapping), ETH_CONNECTION_TYPE);
4548 }
4549 
4550 static inline int bnx2x_q_send_setup_e2(struct bnx2x *bp,
4551 					struct bnx2x_queue_state_params *params)
4552 {
4553 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4554 	struct client_init_ramrod_data *rdata =
4555 		(struct client_init_ramrod_data *)o->rdata;
4556 	dma_addr_t data_mapping = o->rdata_mapping;
4557 	int ramrod = RAMROD_CMD_ID_ETH_CLIENT_SETUP;
4558 
4559 	/* Clear the ramrod data */
4560 	memset(rdata, 0, sizeof(*rdata));
4561 
4562 	/* Fill the ramrod data */
4563 	bnx2x_q_fill_setup_data_cmn(bp, params, rdata);
4564 	bnx2x_q_fill_setup_data_e2(bp, params, rdata);
4565 
4566 	/*
4567 	 *  No need for an explicit memory barrier here as long we would
4568 	 *  need to ensure the ordering of writing to the SPQ element
4569 	 *  and updating of the SPQ producer which involves a memory
4570 	 *  read and we will have to put a full memory barrier there
4571 	 *  (inside bnx2x_sp_post()).
4572 	 */
4573 
4574 	return bnx2x_sp_post(bp, ramrod, o->cids[BNX2X_PRIMARY_CID_INDEX],
4575 			     U64_HI(data_mapping),
4576 			     U64_LO(data_mapping), ETH_CONNECTION_TYPE);
4577 }
4578 
4579 static inline int bnx2x_q_send_setup_tx_only(struct bnx2x *bp,
4580 				  struct bnx2x_queue_state_params *params)
4581 {
4582 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4583 	struct tx_queue_init_ramrod_data *rdata =
4584 		(struct tx_queue_init_ramrod_data *)o->rdata;
4585 	dma_addr_t data_mapping = o->rdata_mapping;
4586 	int ramrod = RAMROD_CMD_ID_ETH_TX_QUEUE_SETUP;
4587 	struct bnx2x_queue_setup_tx_only_params *tx_only_params =
4588 		&params->params.tx_only;
4589 	u8 cid_index = tx_only_params->cid_index;
4590 
4591 
4592 	if (cid_index >= o->max_cos) {
4593 		BNX2X_ERR("queue[%d]: cid_index (%d) is out of range\n",
4594 			  o->cl_id, cid_index);
4595 		return -EINVAL;
4596 	}
4597 
4598 	DP(BNX2X_MSG_SP, "parameters received: cos: %d sp-id: %d\n",
4599 			 tx_only_params->gen_params.cos,
4600 			 tx_only_params->gen_params.spcl_id);
4601 
4602 	/* Clear the ramrod data */
4603 	memset(rdata, 0, sizeof(*rdata));
4604 
4605 	/* Fill the ramrod data */
4606 	bnx2x_q_fill_setup_tx_only(bp, params, rdata);
4607 
4608 	DP(BNX2X_MSG_SP, "sending tx-only ramrod: cid %d, client-id %d,"
4609 			 "sp-client id %d, cos %d\n",
4610 			 o->cids[cid_index],
4611 			 rdata->general.client_id,
4612 			 rdata->general.sp_client_id, rdata->general.cos);
4613 
4614 	/*
4615 	 *  No need for an explicit memory barrier here as long we would
4616 	 *  need to ensure the ordering of writing to the SPQ element
4617 	 *  and updating of the SPQ producer which involves a memory
4618 	 *  read and we will have to put a full memory barrier there
4619 	 *  (inside bnx2x_sp_post()).
4620 	 */
4621 
4622 	return bnx2x_sp_post(bp, ramrod, o->cids[cid_index],
4623 			     U64_HI(data_mapping),
4624 			     U64_LO(data_mapping), ETH_CONNECTION_TYPE);
4625 }
4626 
4627 static void bnx2x_q_fill_update_data(struct bnx2x *bp,
4628 				     struct bnx2x_queue_sp_obj *obj,
4629 				     struct bnx2x_queue_update_params *params,
4630 				     struct client_update_ramrod_data *data)
4631 {
4632 	/* Client ID of the client to update */
4633 	data->client_id = obj->cl_id;
4634 
4635 	/* Function ID of the client to update */
4636 	data->func_id = obj->func_id;
4637 
4638 	/* Default VLAN value */
4639 	data->default_vlan = cpu_to_le16(params->def_vlan);
4640 
4641 	/* Inner VLAN stripping */
4642 	data->inner_vlan_removal_enable_flg =
4643 		test_bit(BNX2X_Q_UPDATE_IN_VLAN_REM, &params->update_flags);
4644 	data->inner_vlan_removal_change_flg =
4645 		test_bit(BNX2X_Q_UPDATE_IN_VLAN_REM_CHNG,
4646 			 &params->update_flags);
4647 
4648 	/* Outer VLAN sripping */
4649 	data->outer_vlan_removal_enable_flg =
4650 		test_bit(BNX2X_Q_UPDATE_OUT_VLAN_REM, &params->update_flags);
4651 	data->outer_vlan_removal_change_flg =
4652 		test_bit(BNX2X_Q_UPDATE_OUT_VLAN_REM_CHNG,
4653 			 &params->update_flags);
4654 
4655 	/* Drop packets that have source MAC that doesn't belong to this
4656 	 * Queue.
4657 	 */
4658 	data->anti_spoofing_enable_flg =
4659 		test_bit(BNX2X_Q_UPDATE_ANTI_SPOOF, &params->update_flags);
4660 	data->anti_spoofing_change_flg =
4661 		test_bit(BNX2X_Q_UPDATE_ANTI_SPOOF_CHNG, &params->update_flags);
4662 
4663 	/* Activate/Deactivate */
4664 	data->activate_flg =
4665 		test_bit(BNX2X_Q_UPDATE_ACTIVATE, &params->update_flags);
4666 	data->activate_change_flg =
4667 		test_bit(BNX2X_Q_UPDATE_ACTIVATE_CHNG, &params->update_flags);
4668 
4669 	/* Enable default VLAN */
4670 	data->default_vlan_enable_flg =
4671 		test_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, &params->update_flags);
4672 	data->default_vlan_change_flg =
4673 		test_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG,
4674 			 &params->update_flags);
4675 
4676 	/* silent vlan removal */
4677 	data->silent_vlan_change_flg =
4678 		test_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG,
4679 			 &params->update_flags);
4680 	data->silent_vlan_removal_flg =
4681 		test_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, &params->update_flags);
4682 	data->silent_vlan_value = cpu_to_le16(params->silent_removal_value);
4683 	data->silent_vlan_mask = cpu_to_le16(params->silent_removal_mask);
4684 }
4685 
4686 static inline int bnx2x_q_send_update(struct bnx2x *bp,
4687 				      struct bnx2x_queue_state_params *params)
4688 {
4689 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4690 	struct client_update_ramrod_data *rdata =
4691 		(struct client_update_ramrod_data *)o->rdata;
4692 	dma_addr_t data_mapping = o->rdata_mapping;
4693 	struct bnx2x_queue_update_params *update_params =
4694 		&params->params.update;
4695 	u8 cid_index = update_params->cid_index;
4696 
4697 	if (cid_index >= o->max_cos) {
4698 		BNX2X_ERR("queue[%d]: cid_index (%d) is out of range\n",
4699 			  o->cl_id, cid_index);
4700 		return -EINVAL;
4701 	}
4702 
4703 
4704 	/* Clear the ramrod data */
4705 	memset(rdata, 0, sizeof(*rdata));
4706 
4707 	/* Fill the ramrod data */
4708 	bnx2x_q_fill_update_data(bp, o, update_params, rdata);
4709 
4710 	/*
4711 	 *  No need for an explicit memory barrier here as long we would
4712 	 *  need to ensure the ordering of writing to the SPQ element
4713 	 *  and updating of the SPQ producer which involves a memory
4714 	 *  read and we will have to put a full memory barrier there
4715 	 *  (inside bnx2x_sp_post()).
4716 	 */
4717 
4718 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_CLIENT_UPDATE,
4719 			     o->cids[cid_index], U64_HI(data_mapping),
4720 			     U64_LO(data_mapping), ETH_CONNECTION_TYPE);
4721 }
4722 
4723 /**
4724  * bnx2x_q_send_deactivate - send DEACTIVATE command
4725  *
4726  * @bp:		device handle
4727  * @params:
4728  *
4729  * implemented using the UPDATE command.
4730  */
4731 static inline int bnx2x_q_send_deactivate(struct bnx2x *bp,
4732 					struct bnx2x_queue_state_params *params)
4733 {
4734 	struct bnx2x_queue_update_params *update = &params->params.update;
4735 
4736 	memset(update, 0, sizeof(*update));
4737 
4738 	__set_bit(BNX2X_Q_UPDATE_ACTIVATE_CHNG, &update->update_flags);
4739 
4740 	return bnx2x_q_send_update(bp, params);
4741 }
4742 
4743 /**
4744  * bnx2x_q_send_activate - send ACTIVATE command
4745  *
4746  * @bp:		device handle
4747  * @params:
4748  *
4749  * implemented using the UPDATE command.
4750  */
4751 static inline int bnx2x_q_send_activate(struct bnx2x *bp,
4752 					struct bnx2x_queue_state_params *params)
4753 {
4754 	struct bnx2x_queue_update_params *update = &params->params.update;
4755 
4756 	memset(update, 0, sizeof(*update));
4757 
4758 	__set_bit(BNX2X_Q_UPDATE_ACTIVATE, &update->update_flags);
4759 	__set_bit(BNX2X_Q_UPDATE_ACTIVATE_CHNG, &update->update_flags);
4760 
4761 	return bnx2x_q_send_update(bp, params);
4762 }
4763 
4764 static inline int bnx2x_q_send_update_tpa(struct bnx2x *bp,
4765 					struct bnx2x_queue_state_params *params)
4766 {
4767 	/* TODO: Not implemented yet. */
4768 	return -1;
4769 }
4770 
4771 static inline int bnx2x_q_send_halt(struct bnx2x *bp,
4772 				    struct bnx2x_queue_state_params *params)
4773 {
4774 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4775 
4776 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_HALT,
4777 			     o->cids[BNX2X_PRIMARY_CID_INDEX], 0, o->cl_id,
4778 			     ETH_CONNECTION_TYPE);
4779 }
4780 
4781 static inline int bnx2x_q_send_cfc_del(struct bnx2x *bp,
4782 				       struct bnx2x_queue_state_params *params)
4783 {
4784 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4785 	u8 cid_idx = params->params.cfc_del.cid_index;
4786 
4787 	if (cid_idx >= o->max_cos) {
4788 		BNX2X_ERR("queue[%d]: cid_index (%d) is out of range\n",
4789 			  o->cl_id, cid_idx);
4790 		return -EINVAL;
4791 	}
4792 
4793 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_CFC_DEL,
4794 			     o->cids[cid_idx], 0, 0, NONE_CONNECTION_TYPE);
4795 }
4796 
4797 static inline int bnx2x_q_send_terminate(struct bnx2x *bp,
4798 					struct bnx2x_queue_state_params *params)
4799 {
4800 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4801 	u8 cid_index = params->params.terminate.cid_index;
4802 
4803 	if (cid_index >= o->max_cos) {
4804 		BNX2X_ERR("queue[%d]: cid_index (%d) is out of range\n",
4805 			  o->cl_id, cid_index);
4806 		return -EINVAL;
4807 	}
4808 
4809 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_TERMINATE,
4810 			     o->cids[cid_index], 0, 0, ETH_CONNECTION_TYPE);
4811 }
4812 
4813 static inline int bnx2x_q_send_empty(struct bnx2x *bp,
4814 				     struct bnx2x_queue_state_params *params)
4815 {
4816 	struct bnx2x_queue_sp_obj *o = params->q_obj;
4817 
4818 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_EMPTY,
4819 			     o->cids[BNX2X_PRIMARY_CID_INDEX], 0, 0,
4820 			     ETH_CONNECTION_TYPE);
4821 }
4822 
4823 static inline int bnx2x_queue_send_cmd_cmn(struct bnx2x *bp,
4824 					struct bnx2x_queue_state_params *params)
4825 {
4826 	switch (params->cmd) {
4827 	case BNX2X_Q_CMD_INIT:
4828 		return bnx2x_q_init(bp, params);
4829 	case BNX2X_Q_CMD_SETUP_TX_ONLY:
4830 		return bnx2x_q_send_setup_tx_only(bp, params);
4831 	case BNX2X_Q_CMD_DEACTIVATE:
4832 		return bnx2x_q_send_deactivate(bp, params);
4833 	case BNX2X_Q_CMD_ACTIVATE:
4834 		return bnx2x_q_send_activate(bp, params);
4835 	case BNX2X_Q_CMD_UPDATE:
4836 		return bnx2x_q_send_update(bp, params);
4837 	case BNX2X_Q_CMD_UPDATE_TPA:
4838 		return bnx2x_q_send_update_tpa(bp, params);
4839 	case BNX2X_Q_CMD_HALT:
4840 		return bnx2x_q_send_halt(bp, params);
4841 	case BNX2X_Q_CMD_CFC_DEL:
4842 		return bnx2x_q_send_cfc_del(bp, params);
4843 	case BNX2X_Q_CMD_TERMINATE:
4844 		return bnx2x_q_send_terminate(bp, params);
4845 	case BNX2X_Q_CMD_EMPTY:
4846 		return bnx2x_q_send_empty(bp, params);
4847 	default:
4848 		BNX2X_ERR("Unknown command: %d\n", params->cmd);
4849 		return -EINVAL;
4850 	}
4851 }
4852 
4853 static int bnx2x_queue_send_cmd_e1x(struct bnx2x *bp,
4854 				    struct bnx2x_queue_state_params *params)
4855 {
4856 	switch (params->cmd) {
4857 	case BNX2X_Q_CMD_SETUP:
4858 		return bnx2x_q_send_setup_e1x(bp, params);
4859 	case BNX2X_Q_CMD_INIT:
4860 	case BNX2X_Q_CMD_SETUP_TX_ONLY:
4861 	case BNX2X_Q_CMD_DEACTIVATE:
4862 	case BNX2X_Q_CMD_ACTIVATE:
4863 	case BNX2X_Q_CMD_UPDATE:
4864 	case BNX2X_Q_CMD_UPDATE_TPA:
4865 	case BNX2X_Q_CMD_HALT:
4866 	case BNX2X_Q_CMD_CFC_DEL:
4867 	case BNX2X_Q_CMD_TERMINATE:
4868 	case BNX2X_Q_CMD_EMPTY:
4869 		return bnx2x_queue_send_cmd_cmn(bp, params);
4870 	default:
4871 		BNX2X_ERR("Unknown command: %d\n", params->cmd);
4872 		return -EINVAL;
4873 	}
4874 }
4875 
4876 static int bnx2x_queue_send_cmd_e2(struct bnx2x *bp,
4877 				   struct bnx2x_queue_state_params *params)
4878 {
4879 	switch (params->cmd) {
4880 	case BNX2X_Q_CMD_SETUP:
4881 		return bnx2x_q_send_setup_e2(bp, params);
4882 	case BNX2X_Q_CMD_INIT:
4883 	case BNX2X_Q_CMD_SETUP_TX_ONLY:
4884 	case BNX2X_Q_CMD_DEACTIVATE:
4885 	case BNX2X_Q_CMD_ACTIVATE:
4886 	case BNX2X_Q_CMD_UPDATE:
4887 	case BNX2X_Q_CMD_UPDATE_TPA:
4888 	case BNX2X_Q_CMD_HALT:
4889 	case BNX2X_Q_CMD_CFC_DEL:
4890 	case BNX2X_Q_CMD_TERMINATE:
4891 	case BNX2X_Q_CMD_EMPTY:
4892 		return bnx2x_queue_send_cmd_cmn(bp, params);
4893 	default:
4894 		BNX2X_ERR("Unknown command: %d\n", params->cmd);
4895 		return -EINVAL;
4896 	}
4897 }
4898 
4899 /**
4900  * bnx2x_queue_chk_transition - check state machine of a regular Queue
4901  *
4902  * @bp:		device handle
4903  * @o:
4904  * @params:
4905  *
4906  * (not Forwarding)
4907  * It both checks if the requested command is legal in a current
4908  * state and, if it's legal, sets a `next_state' in the object
4909  * that will be used in the completion flow to set the `state'
4910  * of the object.
4911  *
4912  * returns 0 if a requested command is a legal transition,
4913  *         -EINVAL otherwise.
4914  */
4915 static int bnx2x_queue_chk_transition(struct bnx2x *bp,
4916 				      struct bnx2x_queue_sp_obj *o,
4917 				      struct bnx2x_queue_state_params *params)
4918 {
4919 	enum bnx2x_q_state state = o->state, next_state = BNX2X_Q_STATE_MAX;
4920 	enum bnx2x_queue_cmd cmd = params->cmd;
4921 	struct bnx2x_queue_update_params *update_params =
4922 		 &params->params.update;
4923 	u8 next_tx_only = o->num_tx_only;
4924 
4925 	/*
4926 	 * Forget all pending for completion commands if a driver only state
4927 	 * transition has been requested.
4928 	 */
4929 	if (test_bit(RAMROD_DRV_CLR_ONLY, &params->ramrod_flags)) {
4930 		o->pending = 0;
4931 		o->next_state = BNX2X_Q_STATE_MAX;
4932 	}
4933 
4934 	/*
4935 	 * Don't allow a next state transition if we are in the middle of
4936 	 * the previous one.
4937 	 */
4938 	if (o->pending)
4939 		return -EBUSY;
4940 
4941 	switch (state) {
4942 	case BNX2X_Q_STATE_RESET:
4943 		if (cmd == BNX2X_Q_CMD_INIT)
4944 			next_state = BNX2X_Q_STATE_INITIALIZED;
4945 
4946 		break;
4947 	case BNX2X_Q_STATE_INITIALIZED:
4948 		if (cmd == BNX2X_Q_CMD_SETUP) {
4949 			if (test_bit(BNX2X_Q_FLG_ACTIVE,
4950 				     &params->params.setup.flags))
4951 				next_state = BNX2X_Q_STATE_ACTIVE;
4952 			else
4953 				next_state = BNX2X_Q_STATE_INACTIVE;
4954 		}
4955 
4956 		break;
4957 	case BNX2X_Q_STATE_ACTIVE:
4958 		if (cmd == BNX2X_Q_CMD_DEACTIVATE)
4959 			next_state = BNX2X_Q_STATE_INACTIVE;
4960 
4961 		else if ((cmd == BNX2X_Q_CMD_EMPTY) ||
4962 			 (cmd == BNX2X_Q_CMD_UPDATE_TPA))
4963 			next_state = BNX2X_Q_STATE_ACTIVE;
4964 
4965 		else if (cmd == BNX2X_Q_CMD_SETUP_TX_ONLY) {
4966 			next_state = BNX2X_Q_STATE_MULTI_COS;
4967 			next_tx_only = 1;
4968 		}
4969 
4970 		else if (cmd == BNX2X_Q_CMD_HALT)
4971 			next_state = BNX2X_Q_STATE_STOPPED;
4972 
4973 		else if (cmd == BNX2X_Q_CMD_UPDATE) {
4974 			/* If "active" state change is requested, update the
4975 			 *  state accordingly.
4976 			 */
4977 			if (test_bit(BNX2X_Q_UPDATE_ACTIVATE_CHNG,
4978 				     &update_params->update_flags) &&
4979 			    !test_bit(BNX2X_Q_UPDATE_ACTIVATE,
4980 				      &update_params->update_flags))
4981 				next_state = BNX2X_Q_STATE_INACTIVE;
4982 			else
4983 				next_state = BNX2X_Q_STATE_ACTIVE;
4984 		}
4985 
4986 		break;
4987 	case BNX2X_Q_STATE_MULTI_COS:
4988 		if (cmd == BNX2X_Q_CMD_TERMINATE)
4989 			next_state = BNX2X_Q_STATE_MCOS_TERMINATED;
4990 
4991 		else if (cmd == BNX2X_Q_CMD_SETUP_TX_ONLY) {
4992 			next_state = BNX2X_Q_STATE_MULTI_COS;
4993 			next_tx_only = o->num_tx_only + 1;
4994 		}
4995 
4996 		else if ((cmd == BNX2X_Q_CMD_EMPTY) ||
4997 			 (cmd == BNX2X_Q_CMD_UPDATE_TPA))
4998 			next_state = BNX2X_Q_STATE_MULTI_COS;
4999 
5000 		else if (cmd == BNX2X_Q_CMD_UPDATE) {
5001 			/* If "active" state change is requested, update the
5002 			 *  state accordingly.
5003 			 */
5004 			if (test_bit(BNX2X_Q_UPDATE_ACTIVATE_CHNG,
5005 				     &update_params->update_flags) &&
5006 			    !test_bit(BNX2X_Q_UPDATE_ACTIVATE,
5007 				      &update_params->update_flags))
5008 				next_state = BNX2X_Q_STATE_INACTIVE;
5009 			else
5010 				next_state = BNX2X_Q_STATE_MULTI_COS;
5011 		}
5012 
5013 		break;
5014 	case BNX2X_Q_STATE_MCOS_TERMINATED:
5015 		if (cmd == BNX2X_Q_CMD_CFC_DEL) {
5016 			next_tx_only = o->num_tx_only - 1;
5017 			if (next_tx_only == 0)
5018 				next_state = BNX2X_Q_STATE_ACTIVE;
5019 			else
5020 				next_state = BNX2X_Q_STATE_MULTI_COS;
5021 		}
5022 
5023 		break;
5024 	case BNX2X_Q_STATE_INACTIVE:
5025 		if (cmd == BNX2X_Q_CMD_ACTIVATE)
5026 			next_state = BNX2X_Q_STATE_ACTIVE;
5027 
5028 		else if ((cmd == BNX2X_Q_CMD_EMPTY) ||
5029 			 (cmd == BNX2X_Q_CMD_UPDATE_TPA))
5030 			next_state = BNX2X_Q_STATE_INACTIVE;
5031 
5032 		else if (cmd == BNX2X_Q_CMD_HALT)
5033 			next_state = BNX2X_Q_STATE_STOPPED;
5034 
5035 		else if (cmd == BNX2X_Q_CMD_UPDATE) {
5036 			/* If "active" state change is requested, update the
5037 			 * state accordingly.
5038 			 */
5039 			if (test_bit(BNX2X_Q_UPDATE_ACTIVATE_CHNG,
5040 				     &update_params->update_flags) &&
5041 			    test_bit(BNX2X_Q_UPDATE_ACTIVATE,
5042 				     &update_params->update_flags)){
5043 				if (o->num_tx_only == 0)
5044 					next_state = BNX2X_Q_STATE_ACTIVE;
5045 				else /* tx only queues exist for this queue */
5046 					next_state = BNX2X_Q_STATE_MULTI_COS;
5047 			} else
5048 				next_state = BNX2X_Q_STATE_INACTIVE;
5049 		}
5050 
5051 		break;
5052 	case BNX2X_Q_STATE_STOPPED:
5053 		if (cmd == BNX2X_Q_CMD_TERMINATE)
5054 			next_state = BNX2X_Q_STATE_TERMINATED;
5055 
5056 		break;
5057 	case BNX2X_Q_STATE_TERMINATED:
5058 		if (cmd == BNX2X_Q_CMD_CFC_DEL)
5059 			next_state = BNX2X_Q_STATE_RESET;
5060 
5061 		break;
5062 	default:
5063 		BNX2X_ERR("Illegal state: %d\n", state);
5064 	}
5065 
5066 	/* Transition is assured */
5067 	if (next_state != BNX2X_Q_STATE_MAX) {
5068 		DP(BNX2X_MSG_SP, "Good state transition: %d(%d)->%d\n",
5069 				 state, cmd, next_state);
5070 		o->next_state = next_state;
5071 		o->next_tx_only = next_tx_only;
5072 		return 0;
5073 	}
5074 
5075 	DP(BNX2X_MSG_SP, "Bad state transition request: %d %d\n", state, cmd);
5076 
5077 	return -EINVAL;
5078 }
5079 
5080 void bnx2x_init_queue_obj(struct bnx2x *bp,
5081 			  struct bnx2x_queue_sp_obj *obj,
5082 			  u8 cl_id, u32 *cids, u8 cid_cnt, u8 func_id,
5083 			  void *rdata,
5084 			  dma_addr_t rdata_mapping, unsigned long type)
5085 {
5086 	memset(obj, 0, sizeof(*obj));
5087 
5088 	/* We support only BNX2X_MULTI_TX_COS Tx CoS at the moment */
5089 	BUG_ON(BNX2X_MULTI_TX_COS < cid_cnt);
5090 
5091 	memcpy(obj->cids, cids, sizeof(obj->cids[0]) * cid_cnt);
5092 	obj->max_cos = cid_cnt;
5093 	obj->cl_id = cl_id;
5094 	obj->func_id = func_id;
5095 	obj->rdata = rdata;
5096 	obj->rdata_mapping = rdata_mapping;
5097 	obj->type = type;
5098 	obj->next_state = BNX2X_Q_STATE_MAX;
5099 
5100 	if (CHIP_IS_E1x(bp))
5101 		obj->send_cmd = bnx2x_queue_send_cmd_e1x;
5102 	else
5103 		obj->send_cmd = bnx2x_queue_send_cmd_e2;
5104 
5105 	obj->check_transition = bnx2x_queue_chk_transition;
5106 
5107 	obj->complete_cmd = bnx2x_queue_comp_cmd;
5108 	obj->wait_comp = bnx2x_queue_wait_comp;
5109 	obj->set_pending = bnx2x_queue_set_pending;
5110 }
5111 
5112 void bnx2x_queue_set_cos_cid(struct bnx2x *bp,
5113 			     struct bnx2x_queue_sp_obj *obj,
5114 			     u32 cid, u8 index)
5115 {
5116 	obj->cids[index] = cid;
5117 }
5118 
5119 /********************** Function state object *********************************/
5120 enum bnx2x_func_state bnx2x_func_get_state(struct bnx2x *bp,
5121 					   struct bnx2x_func_sp_obj *o)
5122 {
5123 	/* in the middle of transaction - return INVALID state */
5124 	if (o->pending)
5125 		return BNX2X_F_STATE_MAX;
5126 
5127 	/*
5128 	 * unsure the order of reading of o->pending and o->state
5129 	 * o->pending should be read first
5130 	 */
5131 	rmb();
5132 
5133 	return o->state;
5134 }
5135 
5136 static int bnx2x_func_wait_comp(struct bnx2x *bp,
5137 				struct bnx2x_func_sp_obj *o,
5138 				enum bnx2x_func_cmd cmd)
5139 {
5140 	return bnx2x_state_wait(bp, cmd, &o->pending);
5141 }
5142 
5143 /**
5144  * bnx2x_func_state_change_comp - complete the state machine transition
5145  *
5146  * @bp:		device handle
5147  * @o:
5148  * @cmd:
5149  *
5150  * Called on state change transition. Completes the state
5151  * machine transition only - no HW interaction.
5152  */
5153 static inline int bnx2x_func_state_change_comp(struct bnx2x *bp,
5154 					       struct bnx2x_func_sp_obj *o,
5155 					       enum bnx2x_func_cmd cmd)
5156 {
5157 	unsigned long cur_pending = o->pending;
5158 
5159 	if (!test_and_clear_bit(cmd, &cur_pending)) {
5160 		BNX2X_ERR("Bad MC reply %d for func %d in state %d "
5161 			  "pending 0x%lx, next_state %d\n", cmd, BP_FUNC(bp),
5162 			  o->state, cur_pending, o->next_state);
5163 		return -EINVAL;
5164 	}
5165 
5166 	DP(BNX2X_MSG_SP,
5167 	   "Completing command %d for func %d, setting state to %d\n",
5168 	   cmd, BP_FUNC(bp), o->next_state);
5169 
5170 	o->state = o->next_state;
5171 	o->next_state = BNX2X_F_STATE_MAX;
5172 
5173 	/* It's important that o->state and o->next_state are
5174 	 * updated before o->pending.
5175 	 */
5176 	wmb();
5177 
5178 	clear_bit(cmd, &o->pending);
5179 	smp_mb__after_clear_bit();
5180 
5181 	return 0;
5182 }
5183 
5184 /**
5185  * bnx2x_func_comp_cmd - complete the state change command
5186  *
5187  * @bp:		device handle
5188  * @o:
5189  * @cmd:
5190  *
5191  * Checks that the arrived completion is expected.
5192  */
5193 static int bnx2x_func_comp_cmd(struct bnx2x *bp,
5194 			       struct bnx2x_func_sp_obj *o,
5195 			       enum bnx2x_func_cmd cmd)
5196 {
5197 	/* Complete the state machine part first, check if it's a
5198 	 * legal completion.
5199 	 */
5200 	int rc = bnx2x_func_state_change_comp(bp, o, cmd);
5201 	return rc;
5202 }
5203 
5204 /**
5205  * bnx2x_func_chk_transition - perform function state machine transition
5206  *
5207  * @bp:		device handle
5208  * @o:
5209  * @params:
5210  *
5211  * It both checks if the requested command is legal in a current
5212  * state and, if it's legal, sets a `next_state' in the object
5213  * that will be used in the completion flow to set the `state'
5214  * of the object.
5215  *
5216  * returns 0 if a requested command is a legal transition,
5217  *         -EINVAL otherwise.
5218  */
5219 static int bnx2x_func_chk_transition(struct bnx2x *bp,
5220 				     struct bnx2x_func_sp_obj *o,
5221 				     struct bnx2x_func_state_params *params)
5222 {
5223 	enum bnx2x_func_state state = o->state, next_state = BNX2X_F_STATE_MAX;
5224 	enum bnx2x_func_cmd cmd = params->cmd;
5225 
5226 	/*
5227 	 * Forget all pending for completion commands if a driver only state
5228 	 * transition has been requested.
5229 	 */
5230 	if (test_bit(RAMROD_DRV_CLR_ONLY, &params->ramrod_flags)) {
5231 		o->pending = 0;
5232 		o->next_state = BNX2X_F_STATE_MAX;
5233 	}
5234 
5235 	/*
5236 	 * Don't allow a next state transition if we are in the middle of
5237 	 * the previous one.
5238 	 */
5239 	if (o->pending)
5240 		return -EBUSY;
5241 
5242 	switch (state) {
5243 	case BNX2X_F_STATE_RESET:
5244 		if (cmd == BNX2X_F_CMD_HW_INIT)
5245 			next_state = BNX2X_F_STATE_INITIALIZED;
5246 
5247 		break;
5248 	case BNX2X_F_STATE_INITIALIZED:
5249 		if (cmd == BNX2X_F_CMD_START)
5250 			next_state = BNX2X_F_STATE_STARTED;
5251 
5252 		else if (cmd == BNX2X_F_CMD_HW_RESET)
5253 			next_state = BNX2X_F_STATE_RESET;
5254 
5255 		break;
5256 	case BNX2X_F_STATE_STARTED:
5257 		if (cmd == BNX2X_F_CMD_STOP)
5258 			next_state = BNX2X_F_STATE_INITIALIZED;
5259 		else if (cmd == BNX2X_F_CMD_TX_STOP)
5260 			next_state = BNX2X_F_STATE_TX_STOPPED;
5261 
5262 		break;
5263 	case BNX2X_F_STATE_TX_STOPPED:
5264 		if (cmd == BNX2X_F_CMD_TX_START)
5265 			next_state = BNX2X_F_STATE_STARTED;
5266 
5267 		break;
5268 	default:
5269 		BNX2X_ERR("Unknown state: %d\n", state);
5270 	}
5271 
5272 	/* Transition is assured */
5273 	if (next_state != BNX2X_F_STATE_MAX) {
5274 		DP(BNX2X_MSG_SP, "Good function state transition: %d(%d)->%d\n",
5275 				 state, cmd, next_state);
5276 		o->next_state = next_state;
5277 		return 0;
5278 	}
5279 
5280 	DP(BNX2X_MSG_SP, "Bad function state transition request: %d %d\n",
5281 			 state, cmd);
5282 
5283 	return -EINVAL;
5284 }
5285 
5286 /**
5287  * bnx2x_func_init_func - performs HW init at function stage
5288  *
5289  * @bp:		device handle
5290  * @drv:
5291  *
5292  * Init HW when the current phase is
5293  * FW_MSG_CODE_DRV_LOAD_FUNCTION: initialize only FUNCTION-only
5294  * HW blocks.
5295  */
5296 static inline int bnx2x_func_init_func(struct bnx2x *bp,
5297 				       const struct bnx2x_func_sp_drv_ops *drv)
5298 {
5299 	return drv->init_hw_func(bp);
5300 }
5301 
5302 /**
5303  * bnx2x_func_init_port - performs HW init at port stage
5304  *
5305  * @bp:		device handle
5306  * @drv:
5307  *
5308  * Init HW when the current phase is
5309  * FW_MSG_CODE_DRV_LOAD_PORT: initialize PORT-only and
5310  * FUNCTION-only HW blocks.
5311  *
5312  */
5313 static inline int bnx2x_func_init_port(struct bnx2x *bp,
5314 				       const struct bnx2x_func_sp_drv_ops *drv)
5315 {
5316 	int rc = drv->init_hw_port(bp);
5317 	if (rc)
5318 		return rc;
5319 
5320 	return bnx2x_func_init_func(bp, drv);
5321 }
5322 
5323 /**
5324  * bnx2x_func_init_cmn_chip - performs HW init at chip-common stage
5325  *
5326  * @bp:		device handle
5327  * @drv:
5328  *
5329  * Init HW when the current phase is
5330  * FW_MSG_CODE_DRV_LOAD_COMMON_CHIP: initialize COMMON_CHIP,
5331  * PORT-only and FUNCTION-only HW blocks.
5332  */
5333 static inline int bnx2x_func_init_cmn_chip(struct bnx2x *bp,
5334 					const struct bnx2x_func_sp_drv_ops *drv)
5335 {
5336 	int rc = drv->init_hw_cmn_chip(bp);
5337 	if (rc)
5338 		return rc;
5339 
5340 	return bnx2x_func_init_port(bp, drv);
5341 }
5342 
5343 /**
5344  * bnx2x_func_init_cmn - performs HW init at common stage
5345  *
5346  * @bp:		device handle
5347  * @drv:
5348  *
5349  * Init HW when the current phase is
5350  * FW_MSG_CODE_DRV_LOAD_COMMON_CHIP: initialize COMMON,
5351  * PORT-only and FUNCTION-only HW blocks.
5352  */
5353 static inline int bnx2x_func_init_cmn(struct bnx2x *bp,
5354 				      const struct bnx2x_func_sp_drv_ops *drv)
5355 {
5356 	int rc = drv->init_hw_cmn(bp);
5357 	if (rc)
5358 		return rc;
5359 
5360 	return bnx2x_func_init_port(bp, drv);
5361 }
5362 
5363 static int bnx2x_func_hw_init(struct bnx2x *bp,
5364 			      struct bnx2x_func_state_params *params)
5365 {
5366 	u32 load_code = params->params.hw_init.load_phase;
5367 	struct bnx2x_func_sp_obj *o = params->f_obj;
5368 	const struct bnx2x_func_sp_drv_ops *drv = o->drv;
5369 	int rc = 0;
5370 
5371 	DP(BNX2X_MSG_SP, "function %d  load_code %x\n",
5372 			 BP_ABS_FUNC(bp), load_code);
5373 
5374 	/* Prepare buffers for unzipping the FW */
5375 	rc = drv->gunzip_init(bp);
5376 	if (rc)
5377 		return rc;
5378 
5379 	/* Prepare FW */
5380 	rc = drv->init_fw(bp);
5381 	if (rc) {
5382 		BNX2X_ERR("Error loading firmware\n");
5383 		goto fw_init_err;
5384 	}
5385 
5386 	/* Handle the beginning of COMMON_XXX pases separatelly... */
5387 	switch (load_code) {
5388 	case FW_MSG_CODE_DRV_LOAD_COMMON_CHIP:
5389 		rc = bnx2x_func_init_cmn_chip(bp, drv);
5390 		if (rc)
5391 			goto init_hw_err;
5392 
5393 		break;
5394 	case FW_MSG_CODE_DRV_LOAD_COMMON:
5395 		rc = bnx2x_func_init_cmn(bp, drv);
5396 		if (rc)
5397 			goto init_hw_err;
5398 
5399 		break;
5400 	case FW_MSG_CODE_DRV_LOAD_PORT:
5401 		rc = bnx2x_func_init_port(bp, drv);
5402 		if (rc)
5403 			goto init_hw_err;
5404 
5405 		break;
5406 	case FW_MSG_CODE_DRV_LOAD_FUNCTION:
5407 		rc = bnx2x_func_init_func(bp, drv);
5408 		if (rc)
5409 			goto init_hw_err;
5410 
5411 		break;
5412 	default:
5413 		BNX2X_ERR("Unknown load_code (0x%x) from MCP\n", load_code);
5414 		rc = -EINVAL;
5415 	}
5416 
5417 init_hw_err:
5418 	drv->release_fw(bp);
5419 
5420 fw_init_err:
5421 	drv->gunzip_end(bp);
5422 
5423 	/* In case of success, complete the comand immediatelly: no ramrods
5424 	 * have been sent.
5425 	 */
5426 	if (!rc)
5427 		o->complete_cmd(bp, o, BNX2X_F_CMD_HW_INIT);
5428 
5429 	return rc;
5430 }
5431 
5432 /**
5433  * bnx2x_func_reset_func - reset HW at function stage
5434  *
5435  * @bp:		device handle
5436  * @drv:
5437  *
5438  * Reset HW at FW_MSG_CODE_DRV_UNLOAD_FUNCTION stage: reset only
5439  * FUNCTION-only HW blocks.
5440  */
5441 static inline void bnx2x_func_reset_func(struct bnx2x *bp,
5442 					const struct bnx2x_func_sp_drv_ops *drv)
5443 {
5444 	drv->reset_hw_func(bp);
5445 }
5446 
5447 /**
5448  * bnx2x_func_reset_port - reser HW at port stage
5449  *
5450  * @bp:		device handle
5451  * @drv:
5452  *
5453  * Reset HW at FW_MSG_CODE_DRV_UNLOAD_PORT stage: reset
5454  * FUNCTION-only and PORT-only HW blocks.
5455  *
5456  *                 !!!IMPORTANT!!!
5457  *
5458  * It's important to call reset_port before reset_func() as the last thing
5459  * reset_func does is pf_disable() thus disabling PGLUE_B, which
5460  * makes impossible any DMAE transactions.
5461  */
5462 static inline void bnx2x_func_reset_port(struct bnx2x *bp,
5463 					const struct bnx2x_func_sp_drv_ops *drv)
5464 {
5465 	drv->reset_hw_port(bp);
5466 	bnx2x_func_reset_func(bp, drv);
5467 }
5468 
5469 /**
5470  * bnx2x_func_reset_cmn - reser HW at common stage
5471  *
5472  * @bp:		device handle
5473  * @drv:
5474  *
5475  * Reset HW at FW_MSG_CODE_DRV_UNLOAD_COMMON and
5476  * FW_MSG_CODE_DRV_UNLOAD_COMMON_CHIP stages: reset COMMON,
5477  * COMMON_CHIP, FUNCTION-only and PORT-only HW blocks.
5478  */
5479 static inline void bnx2x_func_reset_cmn(struct bnx2x *bp,
5480 					const struct bnx2x_func_sp_drv_ops *drv)
5481 {
5482 	bnx2x_func_reset_port(bp, drv);
5483 	drv->reset_hw_cmn(bp);
5484 }
5485 
5486 
5487 static inline int bnx2x_func_hw_reset(struct bnx2x *bp,
5488 				      struct bnx2x_func_state_params *params)
5489 {
5490 	u32 reset_phase = params->params.hw_reset.reset_phase;
5491 	struct bnx2x_func_sp_obj *o = params->f_obj;
5492 	const struct bnx2x_func_sp_drv_ops *drv = o->drv;
5493 
5494 	DP(BNX2X_MSG_SP, "function %d  reset_phase %x\n", BP_ABS_FUNC(bp),
5495 			 reset_phase);
5496 
5497 	switch (reset_phase) {
5498 	case FW_MSG_CODE_DRV_UNLOAD_COMMON:
5499 		bnx2x_func_reset_cmn(bp, drv);
5500 		break;
5501 	case FW_MSG_CODE_DRV_UNLOAD_PORT:
5502 		bnx2x_func_reset_port(bp, drv);
5503 		break;
5504 	case FW_MSG_CODE_DRV_UNLOAD_FUNCTION:
5505 		bnx2x_func_reset_func(bp, drv);
5506 		break;
5507 	default:
5508 		BNX2X_ERR("Unknown reset_phase (0x%x) from MCP\n",
5509 			   reset_phase);
5510 		break;
5511 	}
5512 
5513 	/* Complete the comand immediatelly: no ramrods have been sent. */
5514 	o->complete_cmd(bp, o, BNX2X_F_CMD_HW_RESET);
5515 
5516 	return 0;
5517 }
5518 
5519 static inline int bnx2x_func_send_start(struct bnx2x *bp,
5520 					struct bnx2x_func_state_params *params)
5521 {
5522 	struct bnx2x_func_sp_obj *o = params->f_obj;
5523 	struct function_start_data *rdata =
5524 		(struct function_start_data *)o->rdata;
5525 	dma_addr_t data_mapping = o->rdata_mapping;
5526 	struct bnx2x_func_start_params *start_params = &params->params.start;
5527 
5528 	memset(rdata, 0, sizeof(*rdata));
5529 
5530 	/* Fill the ramrod data with provided parameters */
5531 	rdata->function_mode = cpu_to_le16(start_params->mf_mode);
5532 	rdata->sd_vlan_tag   = start_params->sd_vlan_tag;
5533 	rdata->path_id       = BP_PATH(bp);
5534 	rdata->network_cos_mode = start_params->network_cos_mode;
5535 
5536 	/*
5537 	 *  No need for an explicit memory barrier here as long we would
5538 	 *  need to ensure the ordering of writing to the SPQ element
5539 	 *  and updating of the SPQ producer which involves a memory
5540 	 *  read and we will have to put a full memory barrier there
5541 	 *  (inside bnx2x_sp_post()).
5542 	 */
5543 
5544 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_FUNCTION_START, 0,
5545 			     U64_HI(data_mapping),
5546 			     U64_LO(data_mapping), NONE_CONNECTION_TYPE);
5547 }
5548 
5549 static inline int bnx2x_func_send_stop(struct bnx2x *bp,
5550 				       struct bnx2x_func_state_params *params)
5551 {
5552 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_FUNCTION_STOP, 0, 0, 0,
5553 			     NONE_CONNECTION_TYPE);
5554 }
5555 
5556 static inline int bnx2x_func_send_tx_stop(struct bnx2x *bp,
5557 				       struct bnx2x_func_state_params *params)
5558 {
5559 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_STOP_TRAFFIC, 0, 0, 0,
5560 			     NONE_CONNECTION_TYPE);
5561 }
5562 static inline int bnx2x_func_send_tx_start(struct bnx2x *bp,
5563 				       struct bnx2x_func_state_params *params)
5564 {
5565 	struct bnx2x_func_sp_obj *o = params->f_obj;
5566 	struct flow_control_configuration *rdata =
5567 		(struct flow_control_configuration *)o->rdata;
5568 	dma_addr_t data_mapping = o->rdata_mapping;
5569 	struct bnx2x_func_tx_start_params *tx_start_params =
5570 		&params->params.tx_start;
5571 	int i;
5572 
5573 	memset(rdata, 0, sizeof(*rdata));
5574 
5575 	rdata->dcb_enabled = tx_start_params->dcb_enabled;
5576 	rdata->dcb_version = tx_start_params->dcb_version;
5577 	rdata->dont_add_pri_0_en = tx_start_params->dont_add_pri_0_en;
5578 
5579 	for (i = 0; i < ARRAY_SIZE(rdata->traffic_type_to_priority_cos); i++)
5580 		rdata->traffic_type_to_priority_cos[i] =
5581 			tx_start_params->traffic_type_to_priority_cos[i];
5582 
5583 	return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_START_TRAFFIC, 0,
5584 			     U64_HI(data_mapping),
5585 			     U64_LO(data_mapping), NONE_CONNECTION_TYPE);
5586 }
5587 
5588 static int bnx2x_func_send_cmd(struct bnx2x *bp,
5589 			       struct bnx2x_func_state_params *params)
5590 {
5591 	switch (params->cmd) {
5592 	case BNX2X_F_CMD_HW_INIT:
5593 		return bnx2x_func_hw_init(bp, params);
5594 	case BNX2X_F_CMD_START:
5595 		return bnx2x_func_send_start(bp, params);
5596 	case BNX2X_F_CMD_STOP:
5597 		return bnx2x_func_send_stop(bp, params);
5598 	case BNX2X_F_CMD_HW_RESET:
5599 		return bnx2x_func_hw_reset(bp, params);
5600 	case BNX2X_F_CMD_TX_STOP:
5601 		return bnx2x_func_send_tx_stop(bp, params);
5602 	case BNX2X_F_CMD_TX_START:
5603 		return bnx2x_func_send_tx_start(bp, params);
5604 	default:
5605 		BNX2X_ERR("Unknown command: %d\n", params->cmd);
5606 		return -EINVAL;
5607 	}
5608 }
5609 
5610 void bnx2x_init_func_obj(struct bnx2x *bp,
5611 			 struct bnx2x_func_sp_obj *obj,
5612 			 void *rdata, dma_addr_t rdata_mapping,
5613 			 struct bnx2x_func_sp_drv_ops *drv_iface)
5614 {
5615 	memset(obj, 0, sizeof(*obj));
5616 
5617 	mutex_init(&obj->one_pending_mutex);
5618 
5619 	obj->rdata = rdata;
5620 	obj->rdata_mapping = rdata_mapping;
5621 
5622 	obj->send_cmd = bnx2x_func_send_cmd;
5623 	obj->check_transition = bnx2x_func_chk_transition;
5624 	obj->complete_cmd = bnx2x_func_comp_cmd;
5625 	obj->wait_comp = bnx2x_func_wait_comp;
5626 
5627 	obj->drv = drv_iface;
5628 }
5629 
5630 /**
5631  * bnx2x_func_state_change - perform Function state change transition
5632  *
5633  * @bp:		device handle
5634  * @params:	parameters to perform the transaction
5635  *
5636  * returns 0 in case of successfully completed transition,
5637  *         negative error code in case of failure, positive
5638  *         (EBUSY) value if there is a completion to that is
5639  *         still pending (possible only if RAMROD_COMP_WAIT is
5640  *         not set in params->ramrod_flags for asynchronous
5641  *         commands).
5642  */
5643 int bnx2x_func_state_change(struct bnx2x *bp,
5644 			    struct bnx2x_func_state_params *params)
5645 {
5646 	struct bnx2x_func_sp_obj *o = params->f_obj;
5647 	int rc;
5648 	enum bnx2x_func_cmd cmd = params->cmd;
5649 	unsigned long *pending = &o->pending;
5650 
5651 	mutex_lock(&o->one_pending_mutex);
5652 
5653 	/* Check that the requested transition is legal */
5654 	if (o->check_transition(bp, o, params)) {
5655 		mutex_unlock(&o->one_pending_mutex);
5656 		return -EINVAL;
5657 	}
5658 
5659 	/* Set "pending" bit */
5660 	set_bit(cmd, pending);
5661 
5662 	/* Don't send a command if only driver cleanup was requested */
5663 	if (test_bit(RAMROD_DRV_CLR_ONLY, &params->ramrod_flags)) {
5664 		bnx2x_func_state_change_comp(bp, o, cmd);
5665 		mutex_unlock(&o->one_pending_mutex);
5666 	} else {
5667 		/* Send a ramrod */
5668 		rc = o->send_cmd(bp, params);
5669 
5670 		mutex_unlock(&o->one_pending_mutex);
5671 
5672 		if (rc) {
5673 			o->next_state = BNX2X_F_STATE_MAX;
5674 			clear_bit(cmd, pending);
5675 			smp_mb__after_clear_bit();
5676 			return rc;
5677 		}
5678 
5679 		if (test_bit(RAMROD_COMP_WAIT, &params->ramrod_flags)) {
5680 			rc = o->wait_comp(bp, o, cmd);
5681 			if (rc)
5682 				return rc;
5683 
5684 			return 0;
5685 		}
5686 	}
5687 
5688 	return !!test_bit(cmd, pending);
5689 }
5690