114b24e2bSVaishali Kulkarni /*
214b24e2bSVaishali Kulkarni * CDDL HEADER START
314b24e2bSVaishali Kulkarni *
414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the
514b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1,  (the "License").
614b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
714b24e2bSVaishali Kulkarni *
814b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
914b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0.
1014b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions
1114b24e2bSVaishali Kulkarni * and limitations under the License.
1214b24e2bSVaishali Kulkarni *
1314b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each
1414b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1514b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the
1614b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying
1714b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner]
1814b24e2bSVaishali Kulkarni *
1914b24e2bSVaishali Kulkarni * CDDL HEADER END
2014b24e2bSVaishali Kulkarni */
2114b24e2bSVaishali Kulkarni 
2214b24e2bSVaishali Kulkarni /*
2314b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc.
2414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development
2514b24e2bSVaishali Kulkarni * and Distribution License, v.1,  (the "License").
2614b24e2bSVaishali Kulkarni 
2714b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
2814b24e2bSVaishali Kulkarni 
2914b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available
3014b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0
3114b24e2bSVaishali Kulkarni 
3214b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and
3314b24e2bSVaishali Kulkarni * limitations under the License.
3414b24e2bSVaishali Kulkarni */
3514b24e2bSVaishali Kulkarni 
3614b24e2bSVaishali Kulkarni #include "bcm_osal.h"
3714b24e2bSVaishali Kulkarni 
3814b24e2bSVaishali Kulkarni #include "ecore.h"
3914b24e2bSVaishali Kulkarni #include "ecore_status.h"
4014b24e2bSVaishali Kulkarni #include "ecore_hsi_eth.h"
4114b24e2bSVaishali Kulkarni #include "ecore_chain.h"
4214b24e2bSVaishali Kulkarni #include "ecore_spq.h"
4314b24e2bSVaishali Kulkarni #include "ecore_init_fw_funcs.h"
4414b24e2bSVaishali Kulkarni #include "ecore_cxt.h"
4514b24e2bSVaishali Kulkarni #include "ecore_l2.h"
4614b24e2bSVaishali Kulkarni #include "ecore_sp_commands.h"
4714b24e2bSVaishali Kulkarni #include "ecore_gtt_reg_addr.h"
4814b24e2bSVaishali Kulkarni #include "ecore_iro.h"
4914b24e2bSVaishali Kulkarni #include "reg_addr.h"
5014b24e2bSVaishali Kulkarni #include "ecore_int.h"
5114b24e2bSVaishali Kulkarni #include "ecore_hw.h"
5214b24e2bSVaishali Kulkarni #include "ecore_vf.h"
5314b24e2bSVaishali Kulkarni #include "ecore_sriov.h"
5414b24e2bSVaishali Kulkarni #include "ecore_mcp.h"
5514b24e2bSVaishali Kulkarni 
5614b24e2bSVaishali Kulkarni #define ECORE_MAX_SGES_NUM 16
5714b24e2bSVaishali Kulkarni #define CRC32_POLY 0x1edc6f41
5814b24e2bSVaishali Kulkarni 
5914b24e2bSVaishali Kulkarni struct ecore_l2_info {
6014b24e2bSVaishali Kulkarni 	u32 queues;
6114b24e2bSVaishali Kulkarni 	unsigned long **pp_qid_usage;
6214b24e2bSVaishali Kulkarni 
6314b24e2bSVaishali Kulkarni 	/* The lock is meant to synchronize access to the qid usage */
6414b24e2bSVaishali Kulkarni 	osal_mutex_t lock;
6514b24e2bSVaishali Kulkarni };
6614b24e2bSVaishali Kulkarni 
ecore_l2_alloc(struct ecore_hwfn * p_hwfn)6714b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_l2_alloc(struct ecore_hwfn *p_hwfn)
6814b24e2bSVaishali Kulkarni {
6914b24e2bSVaishali Kulkarni 	struct ecore_l2_info *p_l2_info;
7014b24e2bSVaishali Kulkarni 	unsigned long **pp_qids;
7114b24e2bSVaishali Kulkarni 	u32 i;
7214b24e2bSVaishali Kulkarni 
7314b24e2bSVaishali Kulkarni 	if (!ECORE_IS_L2_PERSONALITY(p_hwfn))
7414b24e2bSVaishali Kulkarni 		return ECORE_SUCCESS;
7514b24e2bSVaishali Kulkarni 
7614b24e2bSVaishali Kulkarni 	p_l2_info = OSAL_VZALLOC(p_hwfn->p_dev, sizeof(*p_l2_info));
7714b24e2bSVaishali Kulkarni 	if (!p_l2_info)
7814b24e2bSVaishali Kulkarni 		return ECORE_NOMEM;
7914b24e2bSVaishali Kulkarni 	p_hwfn->p_l2_info = p_l2_info;
8014b24e2bSVaishali Kulkarni 
8114b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev)) {
8214b24e2bSVaishali Kulkarni 		p_l2_info->queues = RESC_NUM(p_hwfn, ECORE_L2_QUEUE);
8314b24e2bSVaishali Kulkarni 	} else {
8414b24e2bSVaishali Kulkarni 		u8 rx = 0, tx = 0;
8514b24e2bSVaishali Kulkarni 
8614b24e2bSVaishali Kulkarni 		ecore_vf_get_num_rxqs(p_hwfn, &rx);
8714b24e2bSVaishali Kulkarni 		ecore_vf_get_num_txqs(p_hwfn, &tx);
8814b24e2bSVaishali Kulkarni 
8914b24e2bSVaishali Kulkarni 		p_l2_info->queues = (u32)OSAL_MAX_T(u8, rx, tx);
9014b24e2bSVaishali Kulkarni 	}
9114b24e2bSVaishali Kulkarni 
9214b24e2bSVaishali Kulkarni 	pp_qids = OSAL_VZALLOC(p_hwfn->p_dev,
9314b24e2bSVaishali Kulkarni 			       sizeof(unsigned long *) *
9414b24e2bSVaishali Kulkarni 			       p_l2_info->queues);
9514b24e2bSVaishali Kulkarni 	if (pp_qids == OSAL_NULL)
9614b24e2bSVaishali Kulkarni 		return ECORE_NOMEM;
9714b24e2bSVaishali Kulkarni 	p_l2_info->pp_qid_usage = pp_qids;
9814b24e2bSVaishali Kulkarni 
9914b24e2bSVaishali Kulkarni 	for (i = 0; i < p_l2_info->queues; i++) {
10014b24e2bSVaishali Kulkarni 		pp_qids[i] = OSAL_VZALLOC(p_hwfn->p_dev,
10114b24e2bSVaishali Kulkarni 					  MAX_QUEUES_PER_QZONE / 8);
10214b24e2bSVaishali Kulkarni 		if (pp_qids[i] == OSAL_NULL)
10314b24e2bSVaishali Kulkarni 			return ECORE_NOMEM;
10414b24e2bSVaishali Kulkarni 	}
10514b24e2bSVaishali Kulkarni 
10614b24e2bSVaishali Kulkarni #ifdef CONFIG_ECORE_LOCK_ALLOC
10714b24e2bSVaishali Kulkarni 	OSAL_MUTEX_ALLOC(p_hwfn, &p_l2_info->lock);
10814b24e2bSVaishali Kulkarni #endif
10914b24e2bSVaishali Kulkarni 
11014b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
11114b24e2bSVaishali Kulkarni }
11214b24e2bSVaishali Kulkarni 
ecore_l2_setup(struct ecore_hwfn * p_hwfn)11314b24e2bSVaishali Kulkarni void ecore_l2_setup(struct ecore_hwfn *p_hwfn)
11414b24e2bSVaishali Kulkarni {
11514b24e2bSVaishali Kulkarni 	if (!ECORE_IS_L2_PERSONALITY(p_hwfn))
11614b24e2bSVaishali Kulkarni 		return;
11714b24e2bSVaishali Kulkarni 
11814b24e2bSVaishali Kulkarni 	OSAL_MUTEX_INIT(&p_hwfn->p_l2_info->lock);
11914b24e2bSVaishali Kulkarni }
12014b24e2bSVaishali Kulkarni 
ecore_l2_free(struct ecore_hwfn * p_hwfn)12114b24e2bSVaishali Kulkarni void ecore_l2_free(struct ecore_hwfn *p_hwfn)
12214b24e2bSVaishali Kulkarni {
12314b24e2bSVaishali Kulkarni 	u32 i;
12414b24e2bSVaishali Kulkarni 
12514b24e2bSVaishali Kulkarni 	if (!ECORE_IS_L2_PERSONALITY(p_hwfn))
12614b24e2bSVaishali Kulkarni 		return;
12714b24e2bSVaishali Kulkarni 
12814b24e2bSVaishali Kulkarni 	if (p_hwfn->p_l2_info == OSAL_NULL)
12914b24e2bSVaishali Kulkarni 		return;
13014b24e2bSVaishali Kulkarni 
13114b24e2bSVaishali Kulkarni 	if (p_hwfn->p_l2_info->pp_qid_usage == OSAL_NULL)
13214b24e2bSVaishali Kulkarni 		goto out_l2_info;
13314b24e2bSVaishali Kulkarni 
13414b24e2bSVaishali Kulkarni 	/* Free until hit first uninitialized entry */
13514b24e2bSVaishali Kulkarni 	for (i = 0; i < p_hwfn->p_l2_info->queues; i++) {
13614b24e2bSVaishali Kulkarni 		if (p_hwfn->p_l2_info->pp_qid_usage[i] == OSAL_NULL)
13714b24e2bSVaishali Kulkarni 			break;
13814b24e2bSVaishali Kulkarni 		OSAL_VFREE(p_hwfn->p_dev,
13914b24e2bSVaishali Kulkarni 			   p_hwfn->p_l2_info->pp_qid_usage[i]);
14014b24e2bSVaishali Kulkarni 	}
14114b24e2bSVaishali Kulkarni 
14214b24e2bSVaishali Kulkarni #ifdef CONFIG_ECORE_LOCK_ALLOC
14314b24e2bSVaishali Kulkarni 	/* Lock is last to initialize, if everything else was */
14414b24e2bSVaishali Kulkarni 	if (i == p_hwfn->p_l2_info->queues)
14514b24e2bSVaishali Kulkarni 		OSAL_MUTEX_DEALLOC(&p_hwfn->p_l2_info->lock);
14614b24e2bSVaishali Kulkarni #endif
14714b24e2bSVaishali Kulkarni 
14814b24e2bSVaishali Kulkarni 	OSAL_VFREE(p_hwfn->p_dev, p_hwfn->p_l2_info->pp_qid_usage);
14914b24e2bSVaishali Kulkarni 
15014b24e2bSVaishali Kulkarni out_l2_info:
15114b24e2bSVaishali Kulkarni 	OSAL_VFREE(p_hwfn->p_dev, p_hwfn->p_l2_info);
15214b24e2bSVaishali Kulkarni 	p_hwfn->p_l2_info = OSAL_NULL;
15314b24e2bSVaishali Kulkarni }
15414b24e2bSVaishali Kulkarni 
15514b24e2bSVaishali Kulkarni /* TODO - we'll need locking around these... */
ecore_eth_queue_qid_usage_add(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid)15614b24e2bSVaishali Kulkarni static bool ecore_eth_queue_qid_usage_add(struct ecore_hwfn *p_hwfn,
15714b24e2bSVaishali Kulkarni 					  struct ecore_queue_cid *p_cid)
15814b24e2bSVaishali Kulkarni {
15914b24e2bSVaishali Kulkarni 	struct ecore_l2_info *p_l2_info = p_hwfn->p_l2_info;
16014b24e2bSVaishali Kulkarni 	u16 queue_id = p_cid->rel.queue_id;
16114b24e2bSVaishali Kulkarni 	bool b_rc = true;
16214b24e2bSVaishali Kulkarni 	u8 first;
16314b24e2bSVaishali Kulkarni 
16414b24e2bSVaishali Kulkarni 	OSAL_MUTEX_ACQUIRE(&p_l2_info->lock);
16514b24e2bSVaishali Kulkarni 
16614b24e2bSVaishali Kulkarni 	if (queue_id > p_l2_info->queues) {
16714b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true,
16814b24e2bSVaishali Kulkarni 			  "Requested to increase usage for qzone %04x out of %08x\n",
16914b24e2bSVaishali Kulkarni 			  queue_id, p_l2_info->queues);
17014b24e2bSVaishali Kulkarni 		b_rc = false;
17114b24e2bSVaishali Kulkarni 		goto out;
17214b24e2bSVaishali Kulkarni 	}
17314b24e2bSVaishali Kulkarni 
17414b24e2bSVaishali Kulkarni 	first = (u8)OSAL_FIND_FIRST_ZERO_BIT(p_l2_info->pp_qid_usage[queue_id],
17514b24e2bSVaishali Kulkarni 					     MAX_QUEUES_PER_QZONE);
17614b24e2bSVaishali Kulkarni 	if (first >= MAX_QUEUES_PER_QZONE) {
17714b24e2bSVaishali Kulkarni 		b_rc = false;
17814b24e2bSVaishali Kulkarni 		goto out;
17914b24e2bSVaishali Kulkarni 	}
18014b24e2bSVaishali Kulkarni 
18114b24e2bSVaishali Kulkarni 	OSAL_SET_BIT(first, p_l2_info->pp_qid_usage[queue_id]);
18214b24e2bSVaishali Kulkarni 	p_cid->qid_usage_idx = first;
18314b24e2bSVaishali Kulkarni 
18414b24e2bSVaishali Kulkarni out:
18514b24e2bSVaishali Kulkarni 	OSAL_MUTEX_RELEASE(&p_l2_info->lock);
18614b24e2bSVaishali Kulkarni 	return b_rc;
18714b24e2bSVaishali Kulkarni }
18814b24e2bSVaishali Kulkarni 
ecore_eth_queue_qid_usage_del(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid)18914b24e2bSVaishali Kulkarni static void ecore_eth_queue_qid_usage_del(struct ecore_hwfn *p_hwfn,
19014b24e2bSVaishali Kulkarni 					  struct ecore_queue_cid *p_cid)
19114b24e2bSVaishali Kulkarni {
19214b24e2bSVaishali Kulkarni 	OSAL_MUTEX_ACQUIRE(&p_hwfn->p_l2_info->lock);
19314b24e2bSVaishali Kulkarni 
19414b24e2bSVaishali Kulkarni 	OSAL_CLEAR_BIT(p_cid->qid_usage_idx,
19514b24e2bSVaishali Kulkarni 		       p_hwfn->p_l2_info->pp_qid_usage[p_cid->rel.queue_id]);
19614b24e2bSVaishali Kulkarni 
19714b24e2bSVaishali Kulkarni 	OSAL_MUTEX_RELEASE(&p_hwfn->p_l2_info->lock);
19814b24e2bSVaishali Kulkarni }
19914b24e2bSVaishali Kulkarni 
ecore_eth_queue_cid_release(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid)20014b24e2bSVaishali Kulkarni void ecore_eth_queue_cid_release(struct ecore_hwfn *p_hwfn,
20114b24e2bSVaishali Kulkarni 				 struct ecore_queue_cid *p_cid)
20214b24e2bSVaishali Kulkarni {
20314b24e2bSVaishali Kulkarni 	bool b_legacy_vf = !!(p_cid->vf_legacy &
20414b24e2bSVaishali Kulkarni 			      ECORE_QCID_LEGACY_VF_CID);
20514b24e2bSVaishali Kulkarni 
20614b24e2bSVaishali Kulkarni 	/* VFs' CIDs are 0-based in PF-view, and uninitialized on VF.
20714b24e2bSVaishali Kulkarni 	 * For legacy vf-queues, the CID doesn't go through here.
20814b24e2bSVaishali Kulkarni 	 */
20914b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev) && !b_legacy_vf)
21014b24e2bSVaishali Kulkarni 		_ecore_cxt_release_cid(p_hwfn, p_cid->cid, p_cid->vfid);
21114b24e2bSVaishali Kulkarni 
21214b24e2bSVaishali Kulkarni 	/* VFs maintain the index inside queue-zone on their own */
21314b24e2bSVaishali Kulkarni 	if (p_cid->vfid == ECORE_QUEUE_CID_PF)
21414b24e2bSVaishali Kulkarni 		ecore_eth_queue_qid_usage_del(p_hwfn, p_cid);
21514b24e2bSVaishali Kulkarni 
21614b24e2bSVaishali Kulkarni 	OSAL_VFREE(p_hwfn->p_dev, p_cid);
21714b24e2bSVaishali Kulkarni }
21814b24e2bSVaishali Kulkarni 
21914b24e2bSVaishali Kulkarni /* The internal is only meant to be directly called by PFs initializeing CIDs
22014b24e2bSVaishali Kulkarni  * for their VFs.
22114b24e2bSVaishali Kulkarni  */
22214b24e2bSVaishali Kulkarni static struct ecore_queue_cid *
_ecore_eth_queue_to_cid(struct ecore_hwfn * p_hwfn,u16 opaque_fid,u32 cid,struct ecore_queue_start_common_params * p_params,struct ecore_queue_cid_vf_params * p_vf_params)22314b24e2bSVaishali Kulkarni _ecore_eth_queue_to_cid(struct ecore_hwfn *p_hwfn,
22414b24e2bSVaishali Kulkarni 			u16 opaque_fid, u32 cid,
22514b24e2bSVaishali Kulkarni 			struct ecore_queue_start_common_params *p_params,
22614b24e2bSVaishali Kulkarni 			struct ecore_queue_cid_vf_params *p_vf_params)
22714b24e2bSVaishali Kulkarni {
22814b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
22914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
23014b24e2bSVaishali Kulkarni 
23114b24e2bSVaishali Kulkarni 	p_cid = OSAL_VZALLOC(p_hwfn->p_dev, sizeof(*p_cid));
23214b24e2bSVaishali Kulkarni 	if (p_cid == OSAL_NULL)
23314b24e2bSVaishali Kulkarni 		return OSAL_NULL;
23414b24e2bSVaishali Kulkarni 
23514b24e2bSVaishali Kulkarni 	p_cid->opaque_fid = opaque_fid;
23614b24e2bSVaishali Kulkarni 	p_cid->cid = cid;
23714b24e2bSVaishali Kulkarni 	p_cid->p_owner = p_hwfn;
23814b24e2bSVaishali Kulkarni 
23914b24e2bSVaishali Kulkarni 	/* Fill in parameters */
24014b24e2bSVaishali Kulkarni 	p_cid->rel.vport_id = p_params->vport_id;
24114b24e2bSVaishali Kulkarni 	p_cid->rel.queue_id = p_params->queue_id;
24214b24e2bSVaishali Kulkarni 	p_cid->rel.stats_id = p_params->stats_id;
24314b24e2bSVaishali Kulkarni 	p_cid->sb_igu_id = p_params->p_sb->igu_sb_id;
24414b24e2bSVaishali Kulkarni 	p_cid->sb_idx = p_params->sb_idx;
24514b24e2bSVaishali Kulkarni 
24614b24e2bSVaishali Kulkarni 	/* Fill-in bits related to VFs' queues if information was provided */
24714b24e2bSVaishali Kulkarni 	if (p_vf_params != OSAL_NULL) {
24814b24e2bSVaishali Kulkarni 		p_cid->vfid = p_vf_params->vfid;
24914b24e2bSVaishali Kulkarni 		p_cid->vf_qid = p_vf_params->vf_qid;
25014b24e2bSVaishali Kulkarni 		p_cid->vf_legacy = p_vf_params->vf_legacy;
25114b24e2bSVaishali Kulkarni 	} else {
25214b24e2bSVaishali Kulkarni 		p_cid->vfid = ECORE_QUEUE_CID_PF;
25314b24e2bSVaishali Kulkarni 	}
25414b24e2bSVaishali Kulkarni 
25514b24e2bSVaishali Kulkarni 	/* Don't try calculating the absolute indices for VFs */
25614b24e2bSVaishali Kulkarni 	if (IS_VF(p_hwfn->p_dev)) {
25714b24e2bSVaishali Kulkarni 		p_cid->abs = p_cid->rel;
25814b24e2bSVaishali Kulkarni 
25914b24e2bSVaishali Kulkarni 		goto out;
26014b24e2bSVaishali Kulkarni 	}
26114b24e2bSVaishali Kulkarni 
26214b24e2bSVaishali Kulkarni 	/* Calculate the engine-absolute indices of the resources.
26314b24e2bSVaishali Kulkarni 	 * The would guarantee they're valid later on.
26414b24e2bSVaishali Kulkarni 	 * In some cases [SBs] we already have the right values.
26514b24e2bSVaishali Kulkarni 	 */
26614b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, p_cid->rel.vport_id, &p_cid->abs.vport_id);
26714b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
26814b24e2bSVaishali Kulkarni 		goto fail;
26914b24e2bSVaishali Kulkarni 
27014b24e2bSVaishali Kulkarni 	rc = ecore_fw_l2_queue(p_hwfn, p_cid->rel.queue_id,
27114b24e2bSVaishali Kulkarni 			       &p_cid->abs.queue_id);
27214b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
27314b24e2bSVaishali Kulkarni 		goto fail;
27414b24e2bSVaishali Kulkarni 
27514b24e2bSVaishali Kulkarni 	/* In case of a PF configuring its VF's queues, the stats-id is already
27614b24e2bSVaishali Kulkarni 	 * absolute [since there's a single index that's suitable per-VF].
27714b24e2bSVaishali Kulkarni 	 */
27814b24e2bSVaishali Kulkarni 	if (p_cid->vfid == ECORE_QUEUE_CID_PF) {
27914b24e2bSVaishali Kulkarni 		rc = ecore_fw_vport(p_hwfn, p_cid->rel.stats_id,
28014b24e2bSVaishali Kulkarni 				    &p_cid->abs.stats_id);
28114b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
28214b24e2bSVaishali Kulkarni 			goto fail;
28314b24e2bSVaishali Kulkarni 	} else {
28414b24e2bSVaishali Kulkarni 		p_cid->abs.stats_id = p_cid->rel.stats_id;
28514b24e2bSVaishali Kulkarni 	}
28614b24e2bSVaishali Kulkarni 
28714b24e2bSVaishali Kulkarni out:
28814b24e2bSVaishali Kulkarni 	/* VF-images have provided the qid_usage_idx on their own.
28914b24e2bSVaishali Kulkarni 	 * Otherwise, we need to allocate a unique one.
29014b24e2bSVaishali Kulkarni 	 */
29114b24e2bSVaishali Kulkarni 	if (!p_vf_params) {
29214b24e2bSVaishali Kulkarni 		if (!ecore_eth_queue_qid_usage_add(p_hwfn, p_cid))
29314b24e2bSVaishali Kulkarni 			goto fail;
29414b24e2bSVaishali Kulkarni 	} else {
29514b24e2bSVaishali Kulkarni 		p_cid->qid_usage_idx = p_vf_params->qid_usage_idx;
29614b24e2bSVaishali Kulkarni 	}
29714b24e2bSVaishali Kulkarni 
29814b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
29914b24e2bSVaishali Kulkarni 		   "opaque_fid: %04x CID %08x vport %02x [%02x] qzone %04x.%02x [%04x] stats %02x [%02x] SB %04x PI %02x\n",
30014b24e2bSVaishali Kulkarni 		   p_cid->opaque_fid, p_cid->cid,
30114b24e2bSVaishali Kulkarni 		   p_cid->rel.vport_id, p_cid->abs.vport_id,
30214b24e2bSVaishali Kulkarni 		   p_cid->rel.queue_id,	p_cid->qid_usage_idx,
30314b24e2bSVaishali Kulkarni 		   p_cid->abs.queue_id,
30414b24e2bSVaishali Kulkarni 		   p_cid->rel.stats_id, p_cid->abs.stats_id,
30514b24e2bSVaishali Kulkarni 		   p_cid->sb_igu_id, p_cid->sb_idx);
30614b24e2bSVaishali Kulkarni 
30714b24e2bSVaishali Kulkarni 	return p_cid;
30814b24e2bSVaishali Kulkarni 
30914b24e2bSVaishali Kulkarni fail:
31014b24e2bSVaishali Kulkarni 	OSAL_VFREE(p_hwfn->p_dev, p_cid);
31114b24e2bSVaishali Kulkarni 	return OSAL_NULL;
31214b24e2bSVaishali Kulkarni }
31314b24e2bSVaishali Kulkarni 
31414b24e2bSVaishali Kulkarni struct ecore_queue_cid *
ecore_eth_queue_to_cid(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_queue_start_common_params * p_params,struct ecore_queue_cid_vf_params * p_vf_params)31514b24e2bSVaishali Kulkarni ecore_eth_queue_to_cid(struct ecore_hwfn *p_hwfn, u16 opaque_fid,
31614b24e2bSVaishali Kulkarni 		       struct ecore_queue_start_common_params *p_params,
31714b24e2bSVaishali Kulkarni 		       struct ecore_queue_cid_vf_params *p_vf_params)
31814b24e2bSVaishali Kulkarni {
31914b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
32014b24e2bSVaishali Kulkarni 	u8 vfid = ECORE_CXT_PF_CID;
32114b24e2bSVaishali Kulkarni 	bool b_legacy_vf = false;
32214b24e2bSVaishali Kulkarni 	u32 cid = 0;
32314b24e2bSVaishali Kulkarni 
32414b24e2bSVaishali Kulkarni 	/* In case of legacy VFs, The CID can be derived from the additional
32514b24e2bSVaishali Kulkarni 	 * VF parameters - the VF assumes queue X uses CID X, so we can simply
32614b24e2bSVaishali Kulkarni 	 * use the vf_qid for this purpose as well.
32714b24e2bSVaishali Kulkarni 	 */
32814b24e2bSVaishali Kulkarni 	if (p_vf_params) {
32914b24e2bSVaishali Kulkarni 		vfid = p_vf_params->vfid;
33014b24e2bSVaishali Kulkarni 
33114b24e2bSVaishali Kulkarni 		if (p_vf_params->vf_legacy &
33214b24e2bSVaishali Kulkarni 		    ECORE_QCID_LEGACY_VF_CID) {
33314b24e2bSVaishali Kulkarni 			b_legacy_vf = true;
33414b24e2bSVaishali Kulkarni 			cid = p_vf_params->vf_qid;
33514b24e2bSVaishali Kulkarni 		}
33614b24e2bSVaishali Kulkarni 	}
33714b24e2bSVaishali Kulkarni 
33814b24e2bSVaishali Kulkarni 	/* Get a unique firmware CID for this queue, in case it's a PF.
33914b24e2bSVaishali Kulkarni 	 * VF's don't need a CID as the queue configuration will be done
34014b24e2bSVaishali Kulkarni 	 * by PF.
34114b24e2bSVaishali Kulkarni 	 */
34214b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev) && !b_legacy_vf) {
34314b24e2bSVaishali Kulkarni 		if (_ecore_cxt_acquire_cid(p_hwfn, PROTOCOLID_ETH,
34414b24e2bSVaishali Kulkarni 					   &cid, vfid) != ECORE_SUCCESS) {
34514b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true, "Failed to acquire cid\n");
34614b24e2bSVaishali Kulkarni 			return OSAL_NULL;
34714b24e2bSVaishali Kulkarni 		}
34814b24e2bSVaishali Kulkarni 	}
34914b24e2bSVaishali Kulkarni 
35014b24e2bSVaishali Kulkarni 	p_cid = _ecore_eth_queue_to_cid(p_hwfn, opaque_fid, cid,
35114b24e2bSVaishali Kulkarni 					p_params, p_vf_params);
35214b24e2bSVaishali Kulkarni 	if ((p_cid == OSAL_NULL) && IS_PF(p_hwfn->p_dev) && !b_legacy_vf)
35314b24e2bSVaishali Kulkarni 		_ecore_cxt_release_cid(p_hwfn, cid, vfid);
35414b24e2bSVaishali Kulkarni 
35514b24e2bSVaishali Kulkarni 	return p_cid;
35614b24e2bSVaishali Kulkarni }
35714b24e2bSVaishali Kulkarni 
35814b24e2bSVaishali Kulkarni static struct ecore_queue_cid *
ecore_eth_queue_to_cid_pf(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_queue_start_common_params * p_params)35914b24e2bSVaishali Kulkarni ecore_eth_queue_to_cid_pf(struct ecore_hwfn *p_hwfn, u16 opaque_fid,
36014b24e2bSVaishali Kulkarni 			  struct ecore_queue_start_common_params *p_params)
36114b24e2bSVaishali Kulkarni {
36214b24e2bSVaishali Kulkarni 	return ecore_eth_queue_to_cid(p_hwfn, opaque_fid, p_params, OSAL_NULL);
36314b24e2bSVaishali Kulkarni }
36414b24e2bSVaishali Kulkarni 
ecore_sp_eth_vport_start(struct ecore_hwfn * p_hwfn,struct ecore_sp_vport_start_params * p_params)36514b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_eth_vport_start(struct ecore_hwfn *p_hwfn,
36614b24e2bSVaishali Kulkarni 					      struct ecore_sp_vport_start_params *p_params)
36714b24e2bSVaishali Kulkarni {
36814b24e2bSVaishali Kulkarni 	struct vport_start_ramrod_data *p_ramrod = OSAL_NULL;
36914b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
37014b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
37114b24e2bSVaishali Kulkarni 	u16 rx_mode = 0, tx_err = 0;
37214b24e2bSVaishali Kulkarni 	u8 abs_vport_id = 0;
37314b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
37414b24e2bSVaishali Kulkarni 
37514b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, p_params->vport_id, &abs_vport_id);
37614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
37714b24e2bSVaishali Kulkarni 		return rc;
37814b24e2bSVaishali Kulkarni 
37914b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
38014b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
38114b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
38214b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_params->opaque_fid;
38314b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
38414b24e2bSVaishali Kulkarni 
38514b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
38614b24e2bSVaishali Kulkarni 				   ETH_RAMROD_VPORT_START,
38714b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
38814b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
38914b24e2bSVaishali Kulkarni 		return rc;
39014b24e2bSVaishali Kulkarni 
39114b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.vport_start;
39214b24e2bSVaishali Kulkarni 	p_ramrod->vport_id = abs_vport_id;
39314b24e2bSVaishali Kulkarni 
39414b24e2bSVaishali Kulkarni 	p_ramrod->mtu = OSAL_CPU_TO_LE16(p_params->mtu);
39514b24e2bSVaishali Kulkarni 	p_ramrod->inner_vlan_removal_en	= p_params->remove_inner_vlan;
39614b24e2bSVaishali Kulkarni 	p_ramrod->handle_ptp_pkts = p_params->handle_ptp_pkts;
39714b24e2bSVaishali Kulkarni 	p_ramrod->drop_ttl0_en	= p_params->drop_ttl0;
39814b24e2bSVaishali Kulkarni 	p_ramrod->untagged = p_params->only_untagged;
39914b24e2bSVaishali Kulkarni 	p_ramrod->zero_placement_offset = p_params->zero_placement_offset;
40014b24e2bSVaishali Kulkarni 
40114b24e2bSVaishali Kulkarni 	SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_UCAST_DROP_ALL, 1);
40214b24e2bSVaishali Kulkarni 	SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_MCAST_DROP_ALL, 1);
40314b24e2bSVaishali Kulkarni 
40414b24e2bSVaishali Kulkarni 	p_ramrod->rx_mode.state	= OSAL_CPU_TO_LE16(rx_mode);
40514b24e2bSVaishali Kulkarni 
40614b24e2bSVaishali Kulkarni 	/* Handle requests for strict behavior on transmission errors */
40714b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_ILLEGAL_VLAN_MODE,
40814b24e2bSVaishali Kulkarni 		  p_params->b_err_illegal_vlan_mode ?
40914b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
41014b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_PACKET_TOO_SMALL,
41114b24e2bSVaishali Kulkarni 		  p_params->b_err_small_pkt ?
41214b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
41314b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_ANTI_SPOOFING_ERR,
41414b24e2bSVaishali Kulkarni 		  p_params->b_err_anti_spoof ?
41514b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
41614b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_ILLEGAL_INBAND_TAGS,
41714b24e2bSVaishali Kulkarni 		  p_params->b_err_illegal_inband_mode ?
41814b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
41914b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_VLAN_INSERTION_W_INBAND_TAG,
42014b24e2bSVaishali Kulkarni 		  p_params->b_err_vlan_insert_with_inband ?
42114b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
42214b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_MTU_VIOLATION,
42314b24e2bSVaishali Kulkarni 		  p_params->b_err_big_pkt ?
42414b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
42514b24e2bSVaishali Kulkarni 	SET_FIELD(tx_err, ETH_TX_ERR_VALS_ILLEGAL_CONTROL_FRAME,
42614b24e2bSVaishali Kulkarni 		  p_params->b_err_ctrl_frame ?
42714b24e2bSVaishali Kulkarni 		  ETH_TX_ERR_ASSERT_MALICIOUS : 0);
42814b24e2bSVaishali Kulkarni 	p_ramrod->tx_err_behav.values = OSAL_CPU_TO_LE16(tx_err);
42914b24e2bSVaishali Kulkarni 
43014b24e2bSVaishali Kulkarni 	/* TPA related fields */
43114b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&p_ramrod->tpa_param, 0,
43214b24e2bSVaishali Kulkarni 		    sizeof(struct eth_vport_tpa_param));
43314b24e2bSVaishali Kulkarni 	p_ramrod->tpa_param.max_buff_num = p_params->max_buffers_per_cqe;
43414b24e2bSVaishali Kulkarni 
43514b24e2bSVaishali Kulkarni 	switch (p_params->tpa_mode) {
43614b24e2bSVaishali Kulkarni 	case ECORE_TPA_MODE_GRO:
43714b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_max_aggs_num = ETH_TPA_MAX_AGGS_NUM;
43814b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_max_size = (u16)-1;
43914b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_min_size_to_cont = p_params->mtu/2;
44014b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_min_size_to_start = p_params->mtu/2;
44114b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_ipv4_en_flg = 1;
44214b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_ipv6_en_flg = 1;
44314b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_ipv4_tunn_en_flg = 1;
44414b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_ipv6_tunn_en_flg = 1;
44514b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_pkt_split_flg = 1;
44614b24e2bSVaishali Kulkarni 		p_ramrod->tpa_param.tpa_gro_consistent_flg = 1;
44714b24e2bSVaishali Kulkarni 		break;
44814b24e2bSVaishali Kulkarni 	default:
44914b24e2bSVaishali Kulkarni 		break;
45014b24e2bSVaishali Kulkarni 	}
45114b24e2bSVaishali Kulkarni 
45214b24e2bSVaishali Kulkarni 	p_ramrod->tx_switching_en = p_params->tx_switching;
45314b24e2bSVaishali Kulkarni #ifndef ASIC_ONLY
45414b24e2bSVaishali Kulkarni 	if (CHIP_REV_IS_SLOW(p_hwfn->p_dev))
45514b24e2bSVaishali Kulkarni 		p_ramrod->tx_switching_en = 0;
45614b24e2bSVaishali Kulkarni #endif
45714b24e2bSVaishali Kulkarni 
45814b24e2bSVaishali Kulkarni 	p_ramrod->ctl_frame_mac_check_en = !!p_params->check_mac;
45914b24e2bSVaishali Kulkarni 	p_ramrod->ctl_frame_ethtype_check_en = !!p_params->check_ethtype;
46014b24e2bSVaishali Kulkarni 
46114b24e2bSVaishali Kulkarni 	/* Software Function ID in hwfn (PFs are 0 - 15, VFs are 16 - 135) */
46214b24e2bSVaishali Kulkarni 	p_ramrod->sw_fid = ecore_concrete_to_sw_fid(p_hwfn->p_dev,
46314b24e2bSVaishali Kulkarni 						    p_params->concrete_fid);
46414b24e2bSVaishali Kulkarni 
46514b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
46614b24e2bSVaishali Kulkarni }
46714b24e2bSVaishali Kulkarni 
ecore_sp_vport_start(struct ecore_hwfn * p_hwfn,struct ecore_sp_vport_start_params * p_params)46814b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_vport_start(struct ecore_hwfn *p_hwfn,
46914b24e2bSVaishali Kulkarni 					  struct ecore_sp_vport_start_params *p_params)
47014b24e2bSVaishali Kulkarni {
47114b24e2bSVaishali Kulkarni 	if (IS_VF(p_hwfn->p_dev))
47214b24e2bSVaishali Kulkarni 		return ecore_vf_pf_vport_start(p_hwfn, p_params->vport_id,
47314b24e2bSVaishali Kulkarni 					       p_params->mtu,
47414b24e2bSVaishali Kulkarni 					       p_params->remove_inner_vlan,
47514b24e2bSVaishali Kulkarni 					       p_params->tpa_mode,
47614b24e2bSVaishali Kulkarni 					       p_params->max_buffers_per_cqe,
47714b24e2bSVaishali Kulkarni 					       p_params->only_untagged);
47814b24e2bSVaishali Kulkarni 
47914b24e2bSVaishali Kulkarni 	return ecore_sp_eth_vport_start(p_hwfn, p_params);
48014b24e2bSVaishali Kulkarni }
48114b24e2bSVaishali Kulkarni 
48214b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_sp_vport_update_rss(struct ecore_hwfn * p_hwfn,struct vport_update_ramrod_data * p_ramrod,struct ecore_rss_params * p_rss)48314b24e2bSVaishali Kulkarni ecore_sp_vport_update_rss(struct ecore_hwfn *p_hwfn,
48414b24e2bSVaishali Kulkarni 			  struct vport_update_ramrod_data *p_ramrod,
48514b24e2bSVaishali Kulkarni 			  struct ecore_rss_params *p_rss)
48614b24e2bSVaishali Kulkarni {
48714b24e2bSVaishali Kulkarni 	struct eth_vport_rss_config *p_config;
48814b24e2bSVaishali Kulkarni 	int i, table_size;
48914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_SUCCESS;
49014b24e2bSVaishali Kulkarni 
49114b24e2bSVaishali Kulkarni 	if (!p_rss) {
49214b24e2bSVaishali Kulkarni 		p_ramrod->common.update_rss_flg = 0;
49314b24e2bSVaishali Kulkarni 		return rc;
49414b24e2bSVaishali Kulkarni 	}
49514b24e2bSVaishali Kulkarni 	p_config = &p_ramrod->rss_config;
49614b24e2bSVaishali Kulkarni 
49714b24e2bSVaishali Kulkarni 	OSAL_BUILD_BUG_ON(ECORE_RSS_IND_TABLE_SIZE !=
49814b24e2bSVaishali Kulkarni 			   ETH_RSS_IND_TABLE_ENTRIES_NUM);
49914b24e2bSVaishali Kulkarni 
50014b24e2bSVaishali Kulkarni 	rc = ecore_fw_rss_eng(p_hwfn, p_rss->rss_eng_id,
50114b24e2bSVaishali Kulkarni 			      &p_config->rss_id);
50214b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
50314b24e2bSVaishali Kulkarni 		return rc;
50414b24e2bSVaishali Kulkarni 
50514b24e2bSVaishali Kulkarni 	p_ramrod->common.update_rss_flg = p_rss->update_rss_config;
50614b24e2bSVaishali Kulkarni 	p_config->update_rss_capabilities = p_rss->update_rss_capabilities;
50714b24e2bSVaishali Kulkarni 	p_config->update_rss_ind_table = p_rss->update_rss_ind_table;
50814b24e2bSVaishali Kulkarni 	p_config->update_rss_key = p_rss->update_rss_key;
50914b24e2bSVaishali Kulkarni 
51014b24e2bSVaishali Kulkarni 	p_config->rss_mode = p_rss->rss_enable ?
51114b24e2bSVaishali Kulkarni 			     ETH_VPORT_RSS_MODE_REGULAR :
51214b24e2bSVaishali Kulkarni 			     ETH_VPORT_RSS_MODE_DISABLED;
51314b24e2bSVaishali Kulkarni 
51414b24e2bSVaishali Kulkarni 	p_config->capabilities = 0;
51514b24e2bSVaishali Kulkarni 
51614b24e2bSVaishali Kulkarni 	SET_FIELD(p_config->capabilities,
51714b24e2bSVaishali Kulkarni 		  ETH_VPORT_RSS_CONFIG_IPV4_CAPABILITY,
51814b24e2bSVaishali Kulkarni 		  !!(p_rss->rss_caps & ECORE_RSS_IPV4));
51914b24e2bSVaishali Kulkarni 	SET_FIELD(p_config->capabilities,
52014b24e2bSVaishali Kulkarni 		  ETH_VPORT_RSS_CONFIG_IPV6_CAPABILITY,
52114b24e2bSVaishali Kulkarni 		  !!(p_rss->rss_caps & ECORE_RSS_IPV6));
52214b24e2bSVaishali Kulkarni 	SET_FIELD(p_config->capabilities,
52314b24e2bSVaishali Kulkarni 		  ETH_VPORT_RSS_CONFIG_IPV4_TCP_CAPABILITY,
52414b24e2bSVaishali Kulkarni 		  !!(p_rss->rss_caps & ECORE_RSS_IPV4_TCP));
52514b24e2bSVaishali Kulkarni 	SET_FIELD(p_config->capabilities,
52614b24e2bSVaishali Kulkarni 		  ETH_VPORT_RSS_CONFIG_IPV6_TCP_CAPABILITY,
52714b24e2bSVaishali Kulkarni 		  !!(p_rss->rss_caps & ECORE_RSS_IPV6_TCP));
52814b24e2bSVaishali Kulkarni 	SET_FIELD(p_config->capabilities,
52914b24e2bSVaishali Kulkarni 		  ETH_VPORT_RSS_CONFIG_IPV4_UDP_CAPABILITY,
53014b24e2bSVaishali Kulkarni 		  !!(p_rss->rss_caps & ECORE_RSS_IPV4_UDP));
53114b24e2bSVaishali Kulkarni 	SET_FIELD(p_config->capabilities,
53214b24e2bSVaishali Kulkarni 		  ETH_VPORT_RSS_CONFIG_IPV6_UDP_CAPABILITY,
53314b24e2bSVaishali Kulkarni 		  !!(p_rss->rss_caps & ECORE_RSS_IPV6_UDP));
53414b24e2bSVaishali Kulkarni 	p_config->tbl_size = p_rss->rss_table_size_log;
53514b24e2bSVaishali Kulkarni 	p_config->capabilities =
53614b24e2bSVaishali Kulkarni 		OSAL_CPU_TO_LE16(p_config->capabilities);
53714b24e2bSVaishali Kulkarni 
53814b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_IFUP,
53914b24e2bSVaishali Kulkarni 		   "update rss flag %d, rss_mode = %d, update_caps = %d, capabilities = %d, update_ind = %d, update_rss_key = %d\n",
54014b24e2bSVaishali Kulkarni 		   p_ramrod->common.update_rss_flg,
54114b24e2bSVaishali Kulkarni 		   p_config->rss_mode,
54214b24e2bSVaishali Kulkarni 		   p_config->update_rss_capabilities,
54314b24e2bSVaishali Kulkarni 		   p_config->capabilities,
54414b24e2bSVaishali Kulkarni 		   p_config->update_rss_ind_table,
54514b24e2bSVaishali Kulkarni 		   p_config->update_rss_key);
54614b24e2bSVaishali Kulkarni 
54714b24e2bSVaishali Kulkarni 	table_size = OSAL_MIN_T(int, ECORE_RSS_IND_TABLE_SIZE,
54814b24e2bSVaishali Kulkarni 				1 << p_config->tbl_size);
54914b24e2bSVaishali Kulkarni 	for (i = 0; i < table_size; i++) {
55014b24e2bSVaishali Kulkarni 		struct ecore_queue_cid *p_queue = p_rss->rss_ind_table[i];
55114b24e2bSVaishali Kulkarni 
55214b24e2bSVaishali Kulkarni 		if (!p_queue)
55314b24e2bSVaishali Kulkarni 			return ECORE_INVAL;
55414b24e2bSVaishali Kulkarni 
55514b24e2bSVaishali Kulkarni 		p_config->indirection_table[i] =
55614b24e2bSVaishali Kulkarni 				OSAL_CPU_TO_LE16(p_queue->abs.queue_id);
55714b24e2bSVaishali Kulkarni 	}
55814b24e2bSVaishali Kulkarni 
55914b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_IFUP,
56014b24e2bSVaishali Kulkarni 		   "Configured RSS indirection table [%d entries]:\n",
56114b24e2bSVaishali Kulkarni 		   table_size);
56214b24e2bSVaishali Kulkarni 	for (i = 0; i < ECORE_RSS_IND_TABLE_SIZE; i += 0x10) {
56314b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_IFUP,
56414b24e2bSVaishali Kulkarni 			   "%04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n",
56514b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i]),
56614b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 1]),
56714b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 2]),
56814b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 3]),
56914b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 4]),
57014b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 5]),
57114b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 6]),
57214b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 7]),
57314b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 8]),
57414b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 9]),
57514b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 10]),
57614b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 11]),
57714b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 12]),
57814b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 13]),
57914b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 14]),
58014b24e2bSVaishali Kulkarni 			   OSAL_LE16_TO_CPU(p_config->indirection_table[i + 15]));
58114b24e2bSVaishali Kulkarni 	}
58214b24e2bSVaishali Kulkarni 
58314b24e2bSVaishali Kulkarni 	for (i = 0; i <  10; i++)
58414b24e2bSVaishali Kulkarni 		p_config->rss_key[i] = OSAL_CPU_TO_LE32(p_rss->rss_key[i]);
58514b24e2bSVaishali Kulkarni 
58614b24e2bSVaishali Kulkarni 	return rc;
58714b24e2bSVaishali Kulkarni }
58814b24e2bSVaishali Kulkarni 
58914b24e2bSVaishali Kulkarni static void
ecore_sp_update_accept_mode(struct ecore_hwfn * p_hwfn,struct vport_update_ramrod_data * p_ramrod,struct ecore_filter_accept_flags accept_flags)59014b24e2bSVaishali Kulkarni ecore_sp_update_accept_mode(struct ecore_hwfn *p_hwfn,
59114b24e2bSVaishali Kulkarni 			    struct vport_update_ramrod_data *p_ramrod,
59214b24e2bSVaishali Kulkarni 			    struct ecore_filter_accept_flags accept_flags)
59314b24e2bSVaishali Kulkarni {
59414b24e2bSVaishali Kulkarni 	p_ramrod->common.update_rx_mode_flg =
59514b24e2bSVaishali Kulkarni 					accept_flags.update_rx_mode_config;
59614b24e2bSVaishali Kulkarni 	p_ramrod->common.update_tx_mode_flg =
59714b24e2bSVaishali Kulkarni 					accept_flags.update_tx_mode_config;
59814b24e2bSVaishali Kulkarni 
59914b24e2bSVaishali Kulkarni #ifndef ASIC_ONLY
60014b24e2bSVaishali Kulkarni 	/* On B0 emulation we cannot enable Tx, since this would cause writes
60114b24e2bSVaishali Kulkarni 	 * to PVFC HW block which isn't implemented in emulation.
60214b24e2bSVaishali Kulkarni 	 */
60314b24e2bSVaishali Kulkarni 	if (CHIP_REV_IS_SLOW(p_hwfn->p_dev)) {
60414b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
60514b24e2bSVaishali Kulkarni 			   "Non-Asic - prevent Tx mode in vport update\n");
60614b24e2bSVaishali Kulkarni 		p_ramrod->common.update_tx_mode_flg = 0;
60714b24e2bSVaishali Kulkarni 	}
60814b24e2bSVaishali Kulkarni #endif
60914b24e2bSVaishali Kulkarni 
61014b24e2bSVaishali Kulkarni 	/* Set Rx mode accept flags */
61114b24e2bSVaishali Kulkarni 	if (p_ramrod->common.update_rx_mode_flg) {
61214b24e2bSVaishali Kulkarni 		u8 accept_filter = accept_flags.rx_accept_filter;
61314b24e2bSVaishali Kulkarni 		u16 state = 0;
61414b24e2bSVaishali Kulkarni 
61514b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_RX_MODE_UCAST_DROP_ALL,
61614b24e2bSVaishali Kulkarni 			  !(!!(accept_filter & ECORE_ACCEPT_UCAST_MATCHED) ||
61714b24e2bSVaishali Kulkarni 			   !!(accept_filter & ECORE_ACCEPT_UCAST_UNMATCHED)));
61814b24e2bSVaishali Kulkarni 
61914b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_RX_MODE_UCAST_ACCEPT_UNMATCHED,
62014b24e2bSVaishali Kulkarni 			  !!(accept_filter & ECORE_ACCEPT_UCAST_UNMATCHED));
62114b24e2bSVaishali Kulkarni 
62214b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_RX_MODE_MCAST_DROP_ALL,
62314b24e2bSVaishali Kulkarni 			  !(!!(accept_filter & ECORE_ACCEPT_MCAST_MATCHED) ||
62414b24e2bSVaishali Kulkarni 			   !!(accept_filter & ECORE_ACCEPT_MCAST_UNMATCHED)));
62514b24e2bSVaishali Kulkarni 
62614b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_RX_MODE_MCAST_ACCEPT_ALL,
62714b24e2bSVaishali Kulkarni 			  (!!(accept_filter & ECORE_ACCEPT_MCAST_MATCHED) &&
62814b24e2bSVaishali Kulkarni 			   !!(accept_filter & ECORE_ACCEPT_MCAST_UNMATCHED)));
62914b24e2bSVaishali Kulkarni 
63014b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_RX_MODE_BCAST_ACCEPT_ALL,
63114b24e2bSVaishali Kulkarni 			  !!(accept_filter & ECORE_ACCEPT_BCAST));
63214b24e2bSVaishali Kulkarni 
63314b24e2bSVaishali Kulkarni 		p_ramrod->rx_mode.state = OSAL_CPU_TO_LE16(state);
63414b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
63514b24e2bSVaishali Kulkarni 			   "vport[%02x] p_ramrod->rx_mode.state = 0x%x\n",
63614b24e2bSVaishali Kulkarni 			   p_ramrod->common.vport_id, state);
63714b24e2bSVaishali Kulkarni 	}
63814b24e2bSVaishali Kulkarni 
63914b24e2bSVaishali Kulkarni 	/* Set Tx mode accept flags */
64014b24e2bSVaishali Kulkarni 	if (p_ramrod->common.update_tx_mode_flg) {
64114b24e2bSVaishali Kulkarni 		u8 accept_filter = accept_flags.tx_accept_filter;
64214b24e2bSVaishali Kulkarni 		u16 state = 0;
64314b24e2bSVaishali Kulkarni 
64414b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_TX_MODE_UCAST_DROP_ALL,
64514b24e2bSVaishali Kulkarni 			  !!(accept_filter & ECORE_ACCEPT_NONE));
64614b24e2bSVaishali Kulkarni 
64714b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_TX_MODE_MCAST_DROP_ALL,
64814b24e2bSVaishali Kulkarni 			  !!(accept_filter & ECORE_ACCEPT_NONE));
64914b24e2bSVaishali Kulkarni 
65014b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_TX_MODE_MCAST_ACCEPT_ALL,
65114b24e2bSVaishali Kulkarni 			  (!!(accept_filter & ECORE_ACCEPT_MCAST_MATCHED) &&
65214b24e2bSVaishali Kulkarni 			   !!(accept_filter & ECORE_ACCEPT_MCAST_UNMATCHED)));
65314b24e2bSVaishali Kulkarni 
65414b24e2bSVaishali Kulkarni 		SET_FIELD(state, ETH_VPORT_TX_MODE_BCAST_ACCEPT_ALL,
65514b24e2bSVaishali Kulkarni 			  !!(accept_filter & ECORE_ACCEPT_BCAST));
65614b24e2bSVaishali Kulkarni 
65714b24e2bSVaishali Kulkarni 		p_ramrod->tx_mode.state = OSAL_CPU_TO_LE16(state);
65814b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
65914b24e2bSVaishali Kulkarni 			   "vport[%02x] p_ramrod->tx_mode.state = 0x%x\n",
66014b24e2bSVaishali Kulkarni 			   p_ramrod->common.vport_id, state);
66114b24e2bSVaishali Kulkarni 	}
66214b24e2bSVaishali Kulkarni }
66314b24e2bSVaishali Kulkarni 
66414b24e2bSVaishali Kulkarni static void
ecore_sp_vport_update_sge_tpa(struct ecore_hwfn * p_hwfn,struct vport_update_ramrod_data * p_ramrod,struct ecore_sge_tpa_params * p_params)66514b24e2bSVaishali Kulkarni ecore_sp_vport_update_sge_tpa(struct ecore_hwfn *p_hwfn,
66614b24e2bSVaishali Kulkarni 			      struct vport_update_ramrod_data *p_ramrod,
66714b24e2bSVaishali Kulkarni 			      struct ecore_sge_tpa_params *p_params)
66814b24e2bSVaishali Kulkarni {
66914b24e2bSVaishali Kulkarni 	struct eth_vport_tpa_param *p_tpa;
67014b24e2bSVaishali Kulkarni 
67114b24e2bSVaishali Kulkarni 	if (!p_params) {
67214b24e2bSVaishali Kulkarni 		p_ramrod->common.update_tpa_param_flg = 0;
67314b24e2bSVaishali Kulkarni 		p_ramrod->common.update_tpa_en_flg = 0;
67414b24e2bSVaishali Kulkarni 		p_ramrod->common.update_tpa_param_flg = 0;
67514b24e2bSVaishali Kulkarni 		return;
67614b24e2bSVaishali Kulkarni 	}
67714b24e2bSVaishali Kulkarni 
67814b24e2bSVaishali Kulkarni 	p_ramrod->common.update_tpa_en_flg = p_params->update_tpa_en_flg;
67914b24e2bSVaishali Kulkarni 	p_tpa = &p_ramrod->tpa_param;
68014b24e2bSVaishali Kulkarni 	p_tpa->tpa_ipv4_en_flg = p_params->tpa_ipv4_en_flg;
68114b24e2bSVaishali Kulkarni 	p_tpa->tpa_ipv6_en_flg = p_params->tpa_ipv6_en_flg;
68214b24e2bSVaishali Kulkarni 	p_tpa->tpa_ipv4_tunn_en_flg = p_params->tpa_ipv4_tunn_en_flg;
68314b24e2bSVaishali Kulkarni 	p_tpa->tpa_ipv6_tunn_en_flg = p_params->tpa_ipv6_tunn_en_flg;
68414b24e2bSVaishali Kulkarni 
68514b24e2bSVaishali Kulkarni 	p_ramrod->common.update_tpa_param_flg = p_params->update_tpa_param_flg;
68614b24e2bSVaishali Kulkarni 	p_tpa->max_buff_num = p_params->max_buffers_per_cqe;
68714b24e2bSVaishali Kulkarni 	p_tpa->tpa_pkt_split_flg = p_params->tpa_pkt_split_flg;
68814b24e2bSVaishali Kulkarni 	p_tpa->tpa_hdr_data_split_flg = p_params->tpa_hdr_data_split_flg;
68914b24e2bSVaishali Kulkarni 	p_tpa->tpa_gro_consistent_flg = p_params->tpa_gro_consistent_flg;
69014b24e2bSVaishali Kulkarni 	p_tpa->tpa_max_aggs_num = p_params->tpa_max_aggs_num;
69114b24e2bSVaishali Kulkarni 	p_tpa->tpa_max_size = p_params->tpa_max_size;
69214b24e2bSVaishali Kulkarni 	p_tpa->tpa_min_size_to_start = p_params->tpa_min_size_to_start;
69314b24e2bSVaishali Kulkarni 	p_tpa->tpa_min_size_to_cont = p_params->tpa_min_size_to_cont;
69414b24e2bSVaishali Kulkarni }
69514b24e2bSVaishali Kulkarni 
69614b24e2bSVaishali Kulkarni static void
ecore_sp_update_mcast_bin(struct ecore_hwfn * p_hwfn,struct vport_update_ramrod_data * p_ramrod,struct ecore_sp_vport_update_params * p_params)69714b24e2bSVaishali Kulkarni ecore_sp_update_mcast_bin(struct ecore_hwfn *p_hwfn,
69814b24e2bSVaishali Kulkarni 			  struct vport_update_ramrod_data *p_ramrod,
69914b24e2bSVaishali Kulkarni 			  struct ecore_sp_vport_update_params *p_params)
70014b24e2bSVaishali Kulkarni {
70114b24e2bSVaishali Kulkarni 	int i;
70214b24e2bSVaishali Kulkarni 
70314b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&p_ramrod->approx_mcast.bins, 0,
70414b24e2bSVaishali Kulkarni 		    sizeof(p_ramrod->approx_mcast.bins));
70514b24e2bSVaishali Kulkarni 
70614b24e2bSVaishali Kulkarni 	if (!p_params->update_approx_mcast_flg)
70714b24e2bSVaishali Kulkarni 		return;
70814b24e2bSVaishali Kulkarni 
70914b24e2bSVaishali Kulkarni 	p_ramrod->common.update_approx_mcast_flg = 1;
71014b24e2bSVaishali Kulkarni 	for (i = 0; i < ETH_MULTICAST_MAC_BINS_IN_REGS; i++) {
71114b24e2bSVaishali Kulkarni 		u32 *p_bins = (u32 *)p_params->bins;
71214b24e2bSVaishali Kulkarni 
71314b24e2bSVaishali Kulkarni 		p_ramrod->approx_mcast.bins[i] = OSAL_CPU_TO_LE32(p_bins[i]);
71414b24e2bSVaishali Kulkarni 	}
71514b24e2bSVaishali Kulkarni }
71614b24e2bSVaishali Kulkarni 
ecore_sp_vport_update(struct ecore_hwfn * p_hwfn,struct ecore_sp_vport_update_params * p_params,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)71714b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_vport_update(struct ecore_hwfn *p_hwfn,
71814b24e2bSVaishali Kulkarni 					   struct ecore_sp_vport_update_params *p_params,
71914b24e2bSVaishali Kulkarni 					   enum spq_mode comp_mode,
72014b24e2bSVaishali Kulkarni 					   struct ecore_spq_comp_cb *p_comp_data)
72114b24e2bSVaishali Kulkarni {
72214b24e2bSVaishali Kulkarni 	struct ecore_rss_params *p_rss_params = p_params->rss_params;
72314b24e2bSVaishali Kulkarni 	struct vport_update_ramrod_data_cmn *p_cmn;
72414b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
72514b24e2bSVaishali Kulkarni 	struct vport_update_ramrod_data *p_ramrod = OSAL_NULL;
72614b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
72714b24e2bSVaishali Kulkarni 	u8 abs_vport_id = 0, val;
72814b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
72914b24e2bSVaishali Kulkarni 
73014b24e2bSVaishali Kulkarni 	if (IS_VF(p_hwfn->p_dev)) {
73114b24e2bSVaishali Kulkarni 		rc = ecore_vf_pf_vport_update(p_hwfn, p_params);
73214b24e2bSVaishali Kulkarni 		return rc;
73314b24e2bSVaishali Kulkarni 	}
73414b24e2bSVaishali Kulkarni 
73514b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, p_params->vport_id, &abs_vport_id);
73614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
73714b24e2bSVaishali Kulkarni 		return rc;
73814b24e2bSVaishali Kulkarni 
73914b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
74014b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
74114b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
74214b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_params->opaque_fid;
74314b24e2bSVaishali Kulkarni 	init_data.comp_mode = comp_mode;
74414b24e2bSVaishali Kulkarni 	init_data.p_comp_data = p_comp_data;
74514b24e2bSVaishali Kulkarni 
74614b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
74714b24e2bSVaishali Kulkarni 				   ETH_RAMROD_VPORT_UPDATE,
74814b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
74914b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
75014b24e2bSVaishali Kulkarni 		return rc;
75114b24e2bSVaishali Kulkarni 
75214b24e2bSVaishali Kulkarni 	/* Copy input params to ramrod according to FW struct */
75314b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.vport_update;
75414b24e2bSVaishali Kulkarni 	p_cmn = &p_ramrod->common;
75514b24e2bSVaishali Kulkarni 
75614b24e2bSVaishali Kulkarni 	p_cmn->vport_id = abs_vport_id;
75714b24e2bSVaishali Kulkarni 
75814b24e2bSVaishali Kulkarni 	p_cmn->rx_active_flg = p_params->vport_active_rx_flg;
75914b24e2bSVaishali Kulkarni 	p_cmn->update_rx_active_flg = p_params->update_vport_active_rx_flg;
76014b24e2bSVaishali Kulkarni 	p_cmn->tx_active_flg = p_params->vport_active_tx_flg;
76114b24e2bSVaishali Kulkarni 	p_cmn->update_tx_active_flg = p_params->update_vport_active_tx_flg;
76214b24e2bSVaishali Kulkarni 
76314b24e2bSVaishali Kulkarni 	p_cmn->accept_any_vlan = p_params->accept_any_vlan;
76414b24e2bSVaishali Kulkarni 	val = p_params->update_accept_any_vlan_flg;
76514b24e2bSVaishali Kulkarni 	p_cmn->update_accept_any_vlan_flg = val;
76614b24e2bSVaishali Kulkarni 
76714b24e2bSVaishali Kulkarni 	p_cmn->inner_vlan_removal_en = p_params->inner_vlan_removal_flg;
76814b24e2bSVaishali Kulkarni 	val = p_params->update_inner_vlan_removal_flg;
76914b24e2bSVaishali Kulkarni 	p_cmn->update_inner_vlan_removal_en_flg = val;
77014b24e2bSVaishali Kulkarni 
77114b24e2bSVaishali Kulkarni 	p_cmn->default_vlan_en = p_params->default_vlan_enable_flg;
77214b24e2bSVaishali Kulkarni 	val = p_params->update_default_vlan_enable_flg;
77314b24e2bSVaishali Kulkarni 	p_cmn->update_default_vlan_en_flg = val;
77414b24e2bSVaishali Kulkarni 
77514b24e2bSVaishali Kulkarni 	p_cmn->default_vlan = OSAL_CPU_TO_LE16(p_params->default_vlan);
77614b24e2bSVaishali Kulkarni 	p_cmn->update_default_vlan_flg = p_params->update_default_vlan_flg;
77714b24e2bSVaishali Kulkarni 
77814b24e2bSVaishali Kulkarni 	p_cmn->silent_vlan_removal_en = p_params->silent_vlan_removal_flg;
77914b24e2bSVaishali Kulkarni 
78014b24e2bSVaishali Kulkarni 	p_ramrod->common.tx_switching_en = p_params->tx_switching_flg;
78114b24e2bSVaishali Kulkarni #ifndef ASIC_ONLY
78214b24e2bSVaishali Kulkarni 	if (CHIP_REV_IS_FPGA(p_hwfn->p_dev))
78314b24e2bSVaishali Kulkarni 		if (p_ramrod->common.tx_switching_en ||
78414b24e2bSVaishali Kulkarni 		    p_ramrod->common.update_tx_switching_en_flg) {
78514b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, false, "FPGA - why are we seeing tx-switching? Overriding it\n");
78614b24e2bSVaishali Kulkarni 			p_ramrod->common.tx_switching_en = 0;
78714b24e2bSVaishali Kulkarni 			p_ramrod->common.update_tx_switching_en_flg = 1;
78814b24e2bSVaishali Kulkarni 		}
78914b24e2bSVaishali Kulkarni #endif
79014b24e2bSVaishali Kulkarni 	p_cmn->update_tx_switching_en_flg = p_params->update_tx_switching_flg;
79114b24e2bSVaishali Kulkarni 
79214b24e2bSVaishali Kulkarni 	p_cmn->anti_spoofing_en = p_params->anti_spoofing_en;
79314b24e2bSVaishali Kulkarni 	val = p_params->update_anti_spoofing_en_flg;
79414b24e2bSVaishali Kulkarni 	p_ramrod->common.update_anti_spoofing_en_flg = val;
79514b24e2bSVaishali Kulkarni 
79614b24e2bSVaishali Kulkarni 	rc = ecore_sp_vport_update_rss(p_hwfn, p_ramrod, p_rss_params);
79714b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS) {
79814b24e2bSVaishali Kulkarni 		/* Return spq entry which is taken in ecore_sp_init_request()*/
79914b24e2bSVaishali Kulkarni 		ecore_spq_return_entry(p_hwfn, p_ent);
80014b24e2bSVaishali Kulkarni 		return rc;
80114b24e2bSVaishali Kulkarni 	}
80214b24e2bSVaishali Kulkarni 
80314b24e2bSVaishali Kulkarni 	/* Update mcast bins for VFs, PF doesn't use this functionality */
80414b24e2bSVaishali Kulkarni 	ecore_sp_update_mcast_bin(p_hwfn, p_ramrod, p_params);
80514b24e2bSVaishali Kulkarni 
80614b24e2bSVaishali Kulkarni 	ecore_sp_update_accept_mode(p_hwfn, p_ramrod, p_params->accept_flags);
80714b24e2bSVaishali Kulkarni 	ecore_sp_vport_update_sge_tpa(p_hwfn, p_ramrod,
80814b24e2bSVaishali Kulkarni 				      p_params->sge_tpa_params);
80914b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
81014b24e2bSVaishali Kulkarni }
81114b24e2bSVaishali Kulkarni 
ecore_sp_vport_stop(struct ecore_hwfn * p_hwfn,u16 opaque_fid,u8 vport_id)81214b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_vport_stop(struct ecore_hwfn *p_hwfn,
81314b24e2bSVaishali Kulkarni 					  u16 opaque_fid,
81414b24e2bSVaishali Kulkarni 					  u8 vport_id)
81514b24e2bSVaishali Kulkarni {
81614b24e2bSVaishali Kulkarni 	struct vport_stop_ramrod_data *p_ramrod;
81714b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
81814b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent;
81914b24e2bSVaishali Kulkarni 	u8 abs_vport_id = 0;
82014b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
82114b24e2bSVaishali Kulkarni 
82214b24e2bSVaishali Kulkarni 	if (IS_VF(p_hwfn->p_dev))
82314b24e2bSVaishali Kulkarni 		return ecore_vf_pf_vport_stop(p_hwfn);
82414b24e2bSVaishali Kulkarni 
82514b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, vport_id, &abs_vport_id);
82614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
82714b24e2bSVaishali Kulkarni 		return rc;
82814b24e2bSVaishali Kulkarni 
82914b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
83014b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
83114b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
83214b24e2bSVaishali Kulkarni 	init_data.opaque_fid = opaque_fid;
83314b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
83414b24e2bSVaishali Kulkarni 
83514b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
83614b24e2bSVaishali Kulkarni 				   ETH_RAMROD_VPORT_STOP,
83714b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
83814b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
83914b24e2bSVaishali Kulkarni 		return rc;
84014b24e2bSVaishali Kulkarni 
84114b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.vport_stop;
84214b24e2bSVaishali Kulkarni 	p_ramrod->vport_id = abs_vport_id;
84314b24e2bSVaishali Kulkarni 
84414b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
84514b24e2bSVaishali Kulkarni }
84614b24e2bSVaishali Kulkarni 
84714b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_vf_pf_accept_flags(struct ecore_hwfn * p_hwfn,struct ecore_filter_accept_flags * p_accept_flags)84814b24e2bSVaishali Kulkarni ecore_vf_pf_accept_flags(struct ecore_hwfn *p_hwfn,
84914b24e2bSVaishali Kulkarni 			 struct ecore_filter_accept_flags *p_accept_flags)
85014b24e2bSVaishali Kulkarni {
85114b24e2bSVaishali Kulkarni 	struct ecore_sp_vport_update_params s_params;
85214b24e2bSVaishali Kulkarni 
85314b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&s_params, 0, sizeof(s_params));
85414b24e2bSVaishali Kulkarni 	OSAL_MEMCPY(&s_params.accept_flags, p_accept_flags,
85514b24e2bSVaishali Kulkarni 		    sizeof(struct ecore_filter_accept_flags));
85614b24e2bSVaishali Kulkarni 
85714b24e2bSVaishali Kulkarni 	return ecore_vf_pf_vport_update(p_hwfn, &s_params);
85814b24e2bSVaishali Kulkarni }
85914b24e2bSVaishali Kulkarni 
ecore_filter_accept_cmd(struct ecore_dev * p_dev,u8 vport,struct ecore_filter_accept_flags accept_flags,u8 update_accept_any_vlan,u8 accept_any_vlan,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)86014b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_filter_accept_cmd(struct ecore_dev *p_dev,
86114b24e2bSVaishali Kulkarni 					     u8 vport,
86214b24e2bSVaishali Kulkarni 					     struct ecore_filter_accept_flags accept_flags,
86314b24e2bSVaishali Kulkarni 					     u8 update_accept_any_vlan,
86414b24e2bSVaishali Kulkarni 					     u8 accept_any_vlan,
86514b24e2bSVaishali Kulkarni 					     enum spq_mode comp_mode,
86614b24e2bSVaishali Kulkarni 					     struct ecore_spq_comp_cb *p_comp_data)
86714b24e2bSVaishali Kulkarni {
86814b24e2bSVaishali Kulkarni 	struct ecore_sp_vport_update_params vport_update_params;
86914b24e2bSVaishali Kulkarni 	int i, rc;
87014b24e2bSVaishali Kulkarni 
87114b24e2bSVaishali Kulkarni 	/* Prepare and send the vport rx_mode change */
87214b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&vport_update_params, 0, sizeof(vport_update_params));
87314b24e2bSVaishali Kulkarni 	vport_update_params.vport_id = vport;
87414b24e2bSVaishali Kulkarni 	vport_update_params.accept_flags = accept_flags;
87514b24e2bSVaishali Kulkarni 	vport_update_params.update_accept_any_vlan_flg = update_accept_any_vlan;
87614b24e2bSVaishali Kulkarni 	vport_update_params.accept_any_vlan = accept_any_vlan;
87714b24e2bSVaishali Kulkarni 
87814b24e2bSVaishali Kulkarni 	for_each_hwfn(p_dev, i) {
87914b24e2bSVaishali Kulkarni 		struct ecore_hwfn *p_hwfn = &p_dev->hwfns[i];
88014b24e2bSVaishali Kulkarni 
88114b24e2bSVaishali Kulkarni 		vport_update_params.opaque_fid = p_hwfn->hw_info.opaque_fid;
88214b24e2bSVaishali Kulkarni 
88314b24e2bSVaishali Kulkarni 		if (IS_VF(p_dev)) {
88414b24e2bSVaishali Kulkarni 			rc = ecore_vf_pf_accept_flags(p_hwfn, &accept_flags);
88514b24e2bSVaishali Kulkarni 			if (rc != ECORE_SUCCESS)
88614b24e2bSVaishali Kulkarni 				return rc;
88714b24e2bSVaishali Kulkarni 			continue;
88814b24e2bSVaishali Kulkarni 		}
88914b24e2bSVaishali Kulkarni 
89014b24e2bSVaishali Kulkarni 		rc = ecore_sp_vport_update(p_hwfn, &vport_update_params,
89114b24e2bSVaishali Kulkarni 					   comp_mode, p_comp_data);
89214b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS) {
89314b24e2bSVaishali Kulkarni 			DP_ERR(p_dev, "Update rx_mode failed %d\n", rc);
89414b24e2bSVaishali Kulkarni 			return rc;
89514b24e2bSVaishali Kulkarni 		}
89614b24e2bSVaishali Kulkarni 
89714b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
89814b24e2bSVaishali Kulkarni 			   "Accept filter configured, flags = [Rx]%x [Tx]%x\n",
89914b24e2bSVaishali Kulkarni 			   accept_flags.rx_accept_filter,
90014b24e2bSVaishali Kulkarni 			   accept_flags.tx_accept_filter);
90114b24e2bSVaishali Kulkarni 
90214b24e2bSVaishali Kulkarni 		if (update_accept_any_vlan)
90314b24e2bSVaishali Kulkarni 			DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
90414b24e2bSVaishali Kulkarni 				   "accept_any_vlan=%d configured\n",
90514b24e2bSVaishali Kulkarni 				   accept_any_vlan);
90614b24e2bSVaishali Kulkarni 	}
90714b24e2bSVaishali Kulkarni 
90814b24e2bSVaishali Kulkarni 	return 0;
90914b24e2bSVaishali Kulkarni }
91014b24e2bSVaishali Kulkarni 
91114b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_eth_rxq_start_ramrod(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid,u16 bd_max_bytes,dma_addr_t bd_chain_phys_addr,dma_addr_t cqe_pbl_addr,u16 cqe_pbl_size)91214b24e2bSVaishali Kulkarni ecore_eth_rxq_start_ramrod(struct ecore_hwfn *p_hwfn,
91314b24e2bSVaishali Kulkarni 			   struct ecore_queue_cid *p_cid,
91414b24e2bSVaishali Kulkarni 			   u16 bd_max_bytes,
91514b24e2bSVaishali Kulkarni 			   dma_addr_t bd_chain_phys_addr,
91614b24e2bSVaishali Kulkarni 			   dma_addr_t cqe_pbl_addr,
91714b24e2bSVaishali Kulkarni 			   u16 cqe_pbl_size)
91814b24e2bSVaishali Kulkarni {
91914b24e2bSVaishali Kulkarni 	struct rx_queue_start_ramrod_data *p_ramrod = OSAL_NULL;
92014b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
92114b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
92214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
92314b24e2bSVaishali Kulkarni 
92414b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SP, "opaque_fid=0x%x, cid=0x%x, rx_qzone=0x%x, vport_id=0x%x, sb_id=0x%x\n",
92514b24e2bSVaishali Kulkarni 		   p_cid->opaque_fid, p_cid->cid, p_cid->abs.queue_id,
92614b24e2bSVaishali Kulkarni 		   p_cid->abs.vport_id, p_cid->sb_igu_id);
92714b24e2bSVaishali Kulkarni 
92814b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
92914b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
93014b24e2bSVaishali Kulkarni 	init_data.cid = p_cid->cid;
93114b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_cid->opaque_fid;
93214b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
93314b24e2bSVaishali Kulkarni 
93414b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
93514b24e2bSVaishali Kulkarni 				   ETH_RAMROD_RX_QUEUE_START,
93614b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
93714b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
93814b24e2bSVaishali Kulkarni 		return rc;
93914b24e2bSVaishali Kulkarni 
94014b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.rx_queue_start;
94114b24e2bSVaishali Kulkarni 
94214b24e2bSVaishali Kulkarni 	p_ramrod->sb_id = OSAL_CPU_TO_LE16(p_cid->sb_igu_id);
94314b24e2bSVaishali Kulkarni 	p_ramrod->sb_index = p_cid->sb_idx;
94414b24e2bSVaishali Kulkarni 	p_ramrod->vport_id = p_cid->abs.vport_id;
94514b24e2bSVaishali Kulkarni 	p_ramrod->stats_counter_id = p_cid->abs.stats_id;
94614b24e2bSVaishali Kulkarni 	p_ramrod->rx_queue_id = OSAL_CPU_TO_LE16(p_cid->abs.queue_id);
94714b24e2bSVaishali Kulkarni 	p_ramrod->complete_cqe_flg = 0;
94814b24e2bSVaishali Kulkarni 	p_ramrod->complete_event_flg = 1;
94914b24e2bSVaishali Kulkarni 
95014b24e2bSVaishali Kulkarni 	p_ramrod->bd_max_bytes = OSAL_CPU_TO_LE16(bd_max_bytes);
95114b24e2bSVaishali Kulkarni 	DMA_REGPAIR_LE(p_ramrod->bd_base, bd_chain_phys_addr);
95214b24e2bSVaishali Kulkarni 
95314b24e2bSVaishali Kulkarni 	p_ramrod->num_of_pbl_pages = OSAL_CPU_TO_LE16(cqe_pbl_size);
95414b24e2bSVaishali Kulkarni 	DMA_REGPAIR_LE(p_ramrod->cqe_pbl_addr, cqe_pbl_addr);
95514b24e2bSVaishali Kulkarni 
95614b24e2bSVaishali Kulkarni 	if (p_cid->vfid != ECORE_QUEUE_CID_PF) {
95714b24e2bSVaishali Kulkarni 		bool b_legacy_vf = !!(p_cid->vf_legacy &
95814b24e2bSVaishali Kulkarni 				      ECORE_QCID_LEGACY_VF_RX_PROD);
95914b24e2bSVaishali Kulkarni 
96014b24e2bSVaishali Kulkarni 		p_ramrod->vf_rx_prod_index = p_cid->vf_qid;
96114b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP, "Queue%s is meant for VF rxq[%02x]\n",
96214b24e2bSVaishali Kulkarni 			   b_legacy_vf ? " [legacy]" : "",
96314b24e2bSVaishali Kulkarni 			   p_cid->vf_qid);
96414b24e2bSVaishali Kulkarni 		p_ramrod->vf_rx_prod_use_zone_a = b_legacy_vf;
96514b24e2bSVaishali Kulkarni 	}
96614b24e2bSVaishali Kulkarni 
96714b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
96814b24e2bSVaishali Kulkarni }
96914b24e2bSVaishali Kulkarni 
97014b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_eth_pf_rx_queue_start(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid,u16 bd_max_bytes,dma_addr_t bd_chain_phys_addr,dma_addr_t cqe_pbl_addr,u16 cqe_pbl_size,void OSAL_IOMEM ** pp_prod)97114b24e2bSVaishali Kulkarni ecore_eth_pf_rx_queue_start(struct ecore_hwfn *p_hwfn,
97214b24e2bSVaishali Kulkarni 			    struct ecore_queue_cid *p_cid,
97314b24e2bSVaishali Kulkarni 			    u16 bd_max_bytes,
97414b24e2bSVaishali Kulkarni 			    dma_addr_t bd_chain_phys_addr,
97514b24e2bSVaishali Kulkarni 			    dma_addr_t cqe_pbl_addr,
97614b24e2bSVaishali Kulkarni 			    u16 cqe_pbl_size,
97714b24e2bSVaishali Kulkarni 			    void OSAL_IOMEM **pp_prod)
97814b24e2bSVaishali Kulkarni {
97914b24e2bSVaishali Kulkarni 	u32 init_prod_val = 0;
98014b24e2bSVaishali Kulkarni 
98114b24e2bSVaishali Kulkarni 	*pp_prod = (u8 OSAL_IOMEM*)
98214b24e2bSVaishali Kulkarni 		    p_hwfn->regview +
98314b24e2bSVaishali Kulkarni 		    GTT_BAR0_MAP_REG_MSDM_RAM +
98414b24e2bSVaishali Kulkarni 		    MSTORM_ETH_PF_PRODS_OFFSET(p_cid->abs.queue_id);
98514b24e2bSVaishali Kulkarni 
98614b24e2bSVaishali Kulkarni 	/* Init the rcq, rx bd and rx sge (if valid) producers to 0 */
98714b24e2bSVaishali Kulkarni 	__internal_ram_wr(p_hwfn, *pp_prod, sizeof(u32),
98814b24e2bSVaishali Kulkarni 			  (u32 *)(&init_prod_val));
98914b24e2bSVaishali Kulkarni 
99014b24e2bSVaishali Kulkarni 	return ecore_eth_rxq_start_ramrod(p_hwfn, p_cid,
99114b24e2bSVaishali Kulkarni 					  bd_max_bytes,
99214b24e2bSVaishali Kulkarni 					  bd_chain_phys_addr,
99314b24e2bSVaishali Kulkarni 					  cqe_pbl_addr, cqe_pbl_size);
99414b24e2bSVaishali Kulkarni }
99514b24e2bSVaishali Kulkarni 
99614b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_eth_rx_queue_start(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_queue_start_common_params * p_params,u16 bd_max_bytes,dma_addr_t bd_chain_phys_addr,dma_addr_t cqe_pbl_addr,u16 cqe_pbl_size,struct ecore_rxq_start_ret_params * p_ret_params)99714b24e2bSVaishali Kulkarni ecore_eth_rx_queue_start(struct ecore_hwfn *p_hwfn,
99814b24e2bSVaishali Kulkarni 			 u16 opaque_fid,
99914b24e2bSVaishali Kulkarni 			 struct ecore_queue_start_common_params *p_params,
100014b24e2bSVaishali Kulkarni 			 u16 bd_max_bytes,
100114b24e2bSVaishali Kulkarni 			 dma_addr_t bd_chain_phys_addr,
100214b24e2bSVaishali Kulkarni 			 dma_addr_t cqe_pbl_addr,
100314b24e2bSVaishali Kulkarni 			 u16 cqe_pbl_size,
100414b24e2bSVaishali Kulkarni 			 struct ecore_rxq_start_ret_params *p_ret_params)
100514b24e2bSVaishali Kulkarni {
100614b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
100714b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
100814b24e2bSVaishali Kulkarni 
100914b24e2bSVaishali Kulkarni 	/* Allocate a CID for the queue */
101014b24e2bSVaishali Kulkarni 	p_cid = ecore_eth_queue_to_cid_pf(p_hwfn, opaque_fid, p_params);
101114b24e2bSVaishali Kulkarni 	if (p_cid == OSAL_NULL)
101214b24e2bSVaishali Kulkarni 		return ECORE_NOMEM;
101314b24e2bSVaishali Kulkarni 
101414b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev))
101514b24e2bSVaishali Kulkarni 		rc = ecore_eth_pf_rx_queue_start(p_hwfn, p_cid,
101614b24e2bSVaishali Kulkarni 						 bd_max_bytes,
101714b24e2bSVaishali Kulkarni 						 bd_chain_phys_addr,
101814b24e2bSVaishali Kulkarni 						 cqe_pbl_addr, cqe_pbl_size,
101914b24e2bSVaishali Kulkarni 						 &p_ret_params->p_prod);
102014b24e2bSVaishali Kulkarni 	else
102114b24e2bSVaishali Kulkarni 		rc = ecore_vf_pf_rxq_start(p_hwfn, p_cid,
102214b24e2bSVaishali Kulkarni 					   bd_max_bytes,
102314b24e2bSVaishali Kulkarni 					   bd_chain_phys_addr,
102414b24e2bSVaishali Kulkarni 					   cqe_pbl_addr,
102514b24e2bSVaishali Kulkarni 					   cqe_pbl_size,
102614b24e2bSVaishali Kulkarni 					   &p_ret_params->p_prod);
102714b24e2bSVaishali Kulkarni 
102814b24e2bSVaishali Kulkarni 	/* Provide the caller with a reference to as handler */
102914b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
103014b24e2bSVaishali Kulkarni 		ecore_eth_queue_cid_release(p_hwfn, p_cid);
103114b24e2bSVaishali Kulkarni 	else
103214b24e2bSVaishali Kulkarni 		p_ret_params->p_handle = (void *)p_cid;
103314b24e2bSVaishali Kulkarni 
103414b24e2bSVaishali Kulkarni 	return rc;
103514b24e2bSVaishali Kulkarni }
103614b24e2bSVaishali Kulkarni 
ecore_sp_eth_rx_queues_update(struct ecore_hwfn * p_hwfn,void ** pp_rxq_handles,u8 num_rxqs,u8 complete_cqe_flg,u8 complete_event_flg,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)103714b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_eth_rx_queues_update(struct ecore_hwfn *p_hwfn,
103814b24e2bSVaishali Kulkarni 						   void **pp_rxq_handles,
103914b24e2bSVaishali Kulkarni 						   u8 num_rxqs,
104014b24e2bSVaishali Kulkarni 						   u8 complete_cqe_flg,
104114b24e2bSVaishali Kulkarni 						   u8 complete_event_flg,
104214b24e2bSVaishali Kulkarni 						   enum spq_mode comp_mode,
104314b24e2bSVaishali Kulkarni 						   struct ecore_spq_comp_cb *p_comp_data)
104414b24e2bSVaishali Kulkarni {
104514b24e2bSVaishali Kulkarni 	struct rx_queue_update_ramrod_data *p_ramrod = OSAL_NULL;
104614b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
104714b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
104814b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
104914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
105014b24e2bSVaishali Kulkarni 	u8 i;
105114b24e2bSVaishali Kulkarni 
105214b24e2bSVaishali Kulkarni #ifndef LINUX_REMOVE
105314b24e2bSVaishali Kulkarni 	if (IS_VF(p_hwfn->p_dev))
105414b24e2bSVaishali Kulkarni 		return ecore_vf_pf_rxqs_update(p_hwfn,
105514b24e2bSVaishali Kulkarni 					       (struct ecore_queue_cid **)
105614b24e2bSVaishali Kulkarni 					       pp_rxq_handles,
105714b24e2bSVaishali Kulkarni 					       num_rxqs,
105814b24e2bSVaishali Kulkarni 					       complete_cqe_flg,
105914b24e2bSVaishali Kulkarni 					       complete_event_flg);
106014b24e2bSVaishali Kulkarni #endif
106114b24e2bSVaishali Kulkarni 
106214b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
106314b24e2bSVaishali Kulkarni 	init_data.comp_mode = comp_mode;
106414b24e2bSVaishali Kulkarni 	init_data.p_comp_data = p_comp_data;
106514b24e2bSVaishali Kulkarni 
106614b24e2bSVaishali Kulkarni 	for (i = 0; i < num_rxqs; i++) {
106714b24e2bSVaishali Kulkarni 		p_cid = ((struct ecore_queue_cid **)pp_rxq_handles)[i];
106814b24e2bSVaishali Kulkarni 
106914b24e2bSVaishali Kulkarni 		/* Get SPQ entry */
107014b24e2bSVaishali Kulkarni 		init_data.cid = p_cid->cid;
107114b24e2bSVaishali Kulkarni 		init_data.opaque_fid = p_cid->opaque_fid;
107214b24e2bSVaishali Kulkarni 
107314b24e2bSVaishali Kulkarni 		rc = ecore_sp_init_request(p_hwfn, &p_ent,
107414b24e2bSVaishali Kulkarni 					   ETH_RAMROD_RX_QUEUE_UPDATE,
107514b24e2bSVaishali Kulkarni 					   PROTOCOLID_ETH, &init_data);
107614b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
107714b24e2bSVaishali Kulkarni 			return rc;
107814b24e2bSVaishali Kulkarni 
107914b24e2bSVaishali Kulkarni 		p_ramrod = &p_ent->ramrod.rx_queue_update;
108014b24e2bSVaishali Kulkarni 		p_ramrod->vport_id = p_cid->abs.vport_id;
108114b24e2bSVaishali Kulkarni 
108214b24e2bSVaishali Kulkarni 		p_ramrod->rx_queue_id = OSAL_CPU_TO_LE16(p_cid->abs.queue_id);
108314b24e2bSVaishali Kulkarni 		p_ramrod->complete_cqe_flg = complete_cqe_flg;
108414b24e2bSVaishali Kulkarni 		p_ramrod->complete_event_flg = complete_event_flg;
108514b24e2bSVaishali Kulkarni 
108614b24e2bSVaishali Kulkarni 		rc = ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
108714b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
108814b24e2bSVaishali Kulkarni 			return rc;
108914b24e2bSVaishali Kulkarni 	}
109014b24e2bSVaishali Kulkarni 
109114b24e2bSVaishali Kulkarni 	return rc;
109214b24e2bSVaishali Kulkarni }
109314b24e2bSVaishali Kulkarni 
109414b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_eth_pf_rx_queue_stop(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid,bool b_eq_completion_only,bool b_cqe_completion)109514b24e2bSVaishali Kulkarni ecore_eth_pf_rx_queue_stop(struct ecore_hwfn *p_hwfn,
109614b24e2bSVaishali Kulkarni 			   struct ecore_queue_cid *p_cid,
109714b24e2bSVaishali Kulkarni 			   bool b_eq_completion_only,
109814b24e2bSVaishali Kulkarni 			   bool b_cqe_completion)
109914b24e2bSVaishali Kulkarni {
110014b24e2bSVaishali Kulkarni 	struct rx_queue_stop_ramrod_data *p_ramrod = OSAL_NULL;
110114b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
110214b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
110314b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
110414b24e2bSVaishali Kulkarni 
110514b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
110614b24e2bSVaishali Kulkarni 	init_data.cid = p_cid->cid;
110714b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_cid->opaque_fid;
110814b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
110914b24e2bSVaishali Kulkarni 
111014b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
111114b24e2bSVaishali Kulkarni 				   ETH_RAMROD_RX_QUEUE_STOP,
111214b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
111314b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
111414b24e2bSVaishali Kulkarni 		return rc;
111514b24e2bSVaishali Kulkarni 
111614b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.rx_queue_stop;
111714b24e2bSVaishali Kulkarni 	p_ramrod->vport_id = p_cid->abs.vport_id;
111814b24e2bSVaishali Kulkarni 	p_ramrod->rx_queue_id = OSAL_CPU_TO_LE16(p_cid->abs.queue_id);
111914b24e2bSVaishali Kulkarni 
112014b24e2bSVaishali Kulkarni 	/* Cleaning the queue requires the completion to arrive there.
112114b24e2bSVaishali Kulkarni 	 * In addition, VFs require the answer to come as eqe to PF.
112214b24e2bSVaishali Kulkarni 	 */
112314b24e2bSVaishali Kulkarni 	p_ramrod->complete_cqe_flg = ((p_cid->vfid == ECORE_QUEUE_CID_PF) &&
112414b24e2bSVaishali Kulkarni 				      !b_eq_completion_only) ||
112514b24e2bSVaishali Kulkarni 				     b_cqe_completion;
112614b24e2bSVaishali Kulkarni 	p_ramrod->complete_event_flg = (p_cid->vfid != ECORE_QUEUE_CID_PF) ||
112714b24e2bSVaishali Kulkarni 				       b_eq_completion_only;
112814b24e2bSVaishali Kulkarni 
112914b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
113014b24e2bSVaishali Kulkarni }
113114b24e2bSVaishali Kulkarni 
ecore_eth_rx_queue_stop(struct ecore_hwfn * p_hwfn,void * p_rxq,bool eq_completion_only,bool cqe_completion)113214b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_eth_rx_queue_stop(struct ecore_hwfn *p_hwfn,
113314b24e2bSVaishali Kulkarni 					     void *p_rxq,
113414b24e2bSVaishali Kulkarni 					     bool eq_completion_only,
113514b24e2bSVaishali Kulkarni 					     bool cqe_completion)
113614b24e2bSVaishali Kulkarni {
113714b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid = (struct ecore_queue_cid *)p_rxq;
113814b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
113914b24e2bSVaishali Kulkarni 
114014b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev))
114114b24e2bSVaishali Kulkarni 		rc = ecore_eth_pf_rx_queue_stop(p_hwfn, p_cid,
114214b24e2bSVaishali Kulkarni 						eq_completion_only,
114314b24e2bSVaishali Kulkarni 						cqe_completion);
114414b24e2bSVaishali Kulkarni 	else
114514b24e2bSVaishali Kulkarni 		rc = ecore_vf_pf_rxq_stop(p_hwfn, p_cid, cqe_completion);
114614b24e2bSVaishali Kulkarni 
114714b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
114814b24e2bSVaishali Kulkarni 		ecore_eth_queue_cid_release(p_hwfn, p_cid);
114914b24e2bSVaishali Kulkarni 	return rc;
115014b24e2bSVaishali Kulkarni }
115114b24e2bSVaishali Kulkarni 
115214b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_eth_txq_start_ramrod(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid,dma_addr_t pbl_addr,u16 pbl_size,u16 pq_id)115314b24e2bSVaishali Kulkarni ecore_eth_txq_start_ramrod(struct ecore_hwfn *p_hwfn,
115414b24e2bSVaishali Kulkarni 			   struct ecore_queue_cid *p_cid,
115514b24e2bSVaishali Kulkarni 			   dma_addr_t pbl_addr, u16 pbl_size,
115614b24e2bSVaishali Kulkarni 			   u16 pq_id)
115714b24e2bSVaishali Kulkarni {
115814b24e2bSVaishali Kulkarni 	struct tx_queue_start_ramrod_data *p_ramrod = OSAL_NULL;
115914b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
116014b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
116114b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
116214b24e2bSVaishali Kulkarni 
116314b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
116414b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
116514b24e2bSVaishali Kulkarni 	init_data.cid = p_cid->cid;
116614b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_cid->opaque_fid;
116714b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
116814b24e2bSVaishali Kulkarni 
116914b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
117014b24e2bSVaishali Kulkarni 				   ETH_RAMROD_TX_QUEUE_START,
117114b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
117214b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
117314b24e2bSVaishali Kulkarni 		return rc;
117414b24e2bSVaishali Kulkarni 
117514b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.tx_queue_start;
117614b24e2bSVaishali Kulkarni 	p_ramrod->vport_id = p_cid->abs.vport_id;
117714b24e2bSVaishali Kulkarni 
117814b24e2bSVaishali Kulkarni 	p_ramrod->sb_id = OSAL_CPU_TO_LE16(p_cid->sb_igu_id);
117914b24e2bSVaishali Kulkarni 	p_ramrod->sb_index = p_cid->sb_idx;
118014b24e2bSVaishali Kulkarni 	p_ramrod->stats_counter_id = p_cid->abs.stats_id;
118114b24e2bSVaishali Kulkarni 
118214b24e2bSVaishali Kulkarni 	p_ramrod->queue_zone_id = OSAL_CPU_TO_LE16(p_cid->abs.queue_id);
118314b24e2bSVaishali Kulkarni 	p_ramrod->same_as_last_id = OSAL_CPU_TO_LE16(p_cid->abs.queue_id);
118414b24e2bSVaishali Kulkarni 
118514b24e2bSVaishali Kulkarni 	p_ramrod->pbl_size = OSAL_CPU_TO_LE16(pbl_size);
118614b24e2bSVaishali Kulkarni 	DMA_REGPAIR_LE(p_ramrod->pbl_base_addr, pbl_addr);
118714b24e2bSVaishali Kulkarni 
118814b24e2bSVaishali Kulkarni 	p_ramrod->qm_pq_id = OSAL_CPU_TO_LE16(pq_id);
118914b24e2bSVaishali Kulkarni 
119014b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
119114b24e2bSVaishali Kulkarni }
119214b24e2bSVaishali Kulkarni 
119314b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_eth_pf_tx_queue_start(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid,u8 tc,dma_addr_t pbl_addr,u16 pbl_size,void OSAL_IOMEM ** pp_doorbell)119414b24e2bSVaishali Kulkarni ecore_eth_pf_tx_queue_start(struct ecore_hwfn *p_hwfn,
119514b24e2bSVaishali Kulkarni 			    struct ecore_queue_cid *p_cid,
119614b24e2bSVaishali Kulkarni 			    u8 tc,
119714b24e2bSVaishali Kulkarni 			    dma_addr_t pbl_addr, u16 pbl_size,
119814b24e2bSVaishali Kulkarni 			    void OSAL_IOMEM **pp_doorbell)
119914b24e2bSVaishali Kulkarni {
120014b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
120114b24e2bSVaishali Kulkarni 
120214b24e2bSVaishali Kulkarni 	/* TODO - set tc in the pq_params for multi-cos */
120314b24e2bSVaishali Kulkarni 	rc = ecore_eth_txq_start_ramrod(p_hwfn, p_cid,
120414b24e2bSVaishali Kulkarni 					pbl_addr, pbl_size,
120514b24e2bSVaishali Kulkarni 					ecore_get_cm_pq_idx_mcos(p_hwfn, tc));
120614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
120714b24e2bSVaishali Kulkarni 		return rc;
120814b24e2bSVaishali Kulkarni 
120914b24e2bSVaishali Kulkarni 	/* Provide the caller with the necessary return values */
121014b24e2bSVaishali Kulkarni 	*pp_doorbell = (u8 OSAL_IOMEM *)
121114b24e2bSVaishali Kulkarni 		       p_hwfn->doorbells +
121214b24e2bSVaishali Kulkarni 		       DB_ADDR(p_cid->cid, DQ_DEMS_LEGACY);
121314b24e2bSVaishali Kulkarni 
121414b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
121514b24e2bSVaishali Kulkarni }
121614b24e2bSVaishali Kulkarni 
121714b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_eth_tx_queue_start(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_queue_start_common_params * p_params,u8 tc,dma_addr_t pbl_addr,u16 pbl_size,struct ecore_txq_start_ret_params * p_ret_params)121814b24e2bSVaishali Kulkarni ecore_eth_tx_queue_start(struct ecore_hwfn *p_hwfn, u16 opaque_fid,
121914b24e2bSVaishali Kulkarni 			 struct ecore_queue_start_common_params *p_params,
122014b24e2bSVaishali Kulkarni 			 u8 tc,
122114b24e2bSVaishali Kulkarni 			 dma_addr_t pbl_addr, u16 pbl_size,
122214b24e2bSVaishali Kulkarni 			 struct ecore_txq_start_ret_params *p_ret_params)
122314b24e2bSVaishali Kulkarni {
122414b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
122514b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
122614b24e2bSVaishali Kulkarni 
122714b24e2bSVaishali Kulkarni 	p_cid = ecore_eth_queue_to_cid_pf(p_hwfn, opaque_fid, p_params);
122814b24e2bSVaishali Kulkarni 	if (p_cid == OSAL_NULL)
122914b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
123014b24e2bSVaishali Kulkarni 
123114b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev))
123214b24e2bSVaishali Kulkarni 		rc = ecore_eth_pf_tx_queue_start(p_hwfn, p_cid, tc,
123314b24e2bSVaishali Kulkarni 						 pbl_addr, pbl_size,
123414b24e2bSVaishali Kulkarni 						 &p_ret_params->p_doorbell);
123514b24e2bSVaishali Kulkarni 	else
123614b24e2bSVaishali Kulkarni 		rc = ecore_vf_pf_txq_start(p_hwfn, p_cid,
123714b24e2bSVaishali Kulkarni 					   pbl_addr, pbl_size,
123814b24e2bSVaishali Kulkarni 					   &p_ret_params->p_doorbell);
123914b24e2bSVaishali Kulkarni 
124014b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
124114b24e2bSVaishali Kulkarni 		ecore_eth_queue_cid_release(p_hwfn, p_cid);
124214b24e2bSVaishali Kulkarni 	else
124314b24e2bSVaishali Kulkarni 		p_ret_params->p_handle = (void *)p_cid;
124414b24e2bSVaishali Kulkarni 
124514b24e2bSVaishali Kulkarni 	return rc;
124614b24e2bSVaishali Kulkarni }
124714b24e2bSVaishali Kulkarni 
124814b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_eth_pf_tx_queue_stop(struct ecore_hwfn * p_hwfn,struct ecore_queue_cid * p_cid)124914b24e2bSVaishali Kulkarni ecore_eth_pf_tx_queue_stop(struct ecore_hwfn *p_hwfn,
125014b24e2bSVaishali Kulkarni 			   struct ecore_queue_cid *p_cid)
125114b24e2bSVaishali Kulkarni {
125214b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
125314b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
125414b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
125514b24e2bSVaishali Kulkarni 
125614b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
125714b24e2bSVaishali Kulkarni 	init_data.cid = p_cid->cid;
125814b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_cid->opaque_fid;
125914b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
126014b24e2bSVaishali Kulkarni 
126114b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
126214b24e2bSVaishali Kulkarni 				   ETH_RAMROD_TX_QUEUE_STOP,
126314b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
126414b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
126514b24e2bSVaishali Kulkarni 		return rc;
126614b24e2bSVaishali Kulkarni 
126714b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
126814b24e2bSVaishali Kulkarni }
126914b24e2bSVaishali Kulkarni 
ecore_eth_tx_queue_stop(struct ecore_hwfn * p_hwfn,void * p_handle)127014b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_eth_tx_queue_stop(struct ecore_hwfn *p_hwfn,
127114b24e2bSVaishali Kulkarni 					     void *p_handle)
127214b24e2bSVaishali Kulkarni {
127314b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid = (struct ecore_queue_cid *)p_handle;
127414b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
127514b24e2bSVaishali Kulkarni 
127614b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev))
127714b24e2bSVaishali Kulkarni 		rc = ecore_eth_pf_tx_queue_stop(p_hwfn, p_cid);
127814b24e2bSVaishali Kulkarni 	else
127914b24e2bSVaishali Kulkarni 		rc = ecore_vf_pf_txq_stop(p_hwfn, p_cid);
128014b24e2bSVaishali Kulkarni 
128114b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
128214b24e2bSVaishali Kulkarni 		ecore_eth_queue_cid_release(p_hwfn, p_cid);
128314b24e2bSVaishali Kulkarni 	return rc;
128414b24e2bSVaishali Kulkarni }
128514b24e2bSVaishali Kulkarni 
ecore_filter_action(enum ecore_filter_opcode opcode)128614b24e2bSVaishali Kulkarni static enum eth_filter_action ecore_filter_action(enum ecore_filter_opcode opcode)
128714b24e2bSVaishali Kulkarni {
128814b24e2bSVaishali Kulkarni 	enum eth_filter_action action = MAX_ETH_FILTER_ACTION;
128914b24e2bSVaishali Kulkarni 
129014b24e2bSVaishali Kulkarni 	switch (opcode) {
129114b24e2bSVaishali Kulkarni 	case ECORE_FILTER_ADD:
129214b24e2bSVaishali Kulkarni 		action = ETH_FILTER_ACTION_ADD;
129314b24e2bSVaishali Kulkarni 		break;
129414b24e2bSVaishali Kulkarni 	case ECORE_FILTER_REMOVE:
129514b24e2bSVaishali Kulkarni 		action = ETH_FILTER_ACTION_REMOVE;
129614b24e2bSVaishali Kulkarni 		break;
129714b24e2bSVaishali Kulkarni 	case ECORE_FILTER_FLUSH:
129814b24e2bSVaishali Kulkarni 		action = ETH_FILTER_ACTION_REMOVE_ALL;
129914b24e2bSVaishali Kulkarni 		break;
130014b24e2bSVaishali Kulkarni 	default:
130114b24e2bSVaishali Kulkarni 		action = MAX_ETH_FILTER_ACTION;
130214b24e2bSVaishali Kulkarni 	}
130314b24e2bSVaishali Kulkarni 
130414b24e2bSVaishali Kulkarni 	return action;
130514b24e2bSVaishali Kulkarni }
130614b24e2bSVaishali Kulkarni 
130714b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_filter_ucast_common(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_filter_ucast * p_filter_cmd,struct vport_filter_update_ramrod_data ** pp_ramrod,struct ecore_spq_entry ** pp_ent,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)130814b24e2bSVaishali Kulkarni ecore_filter_ucast_common(struct ecore_hwfn *p_hwfn,
130914b24e2bSVaishali Kulkarni 			  u16 opaque_fid,
131014b24e2bSVaishali Kulkarni 			  struct ecore_filter_ucast *p_filter_cmd,
131114b24e2bSVaishali Kulkarni 			  struct vport_filter_update_ramrod_data **pp_ramrod,
131214b24e2bSVaishali Kulkarni 			  struct ecore_spq_entry **pp_ent,
131314b24e2bSVaishali Kulkarni 			  enum spq_mode comp_mode,
131414b24e2bSVaishali Kulkarni 			  struct ecore_spq_comp_cb *p_comp_data)
131514b24e2bSVaishali Kulkarni {
131614b24e2bSVaishali Kulkarni 	u8 vport_to_add_to = 0, vport_to_remove_from = 0;
131714b24e2bSVaishali Kulkarni 	struct vport_filter_update_ramrod_data *p_ramrod;
131814b24e2bSVaishali Kulkarni 	struct eth_filter_cmd *p_first_filter;
131914b24e2bSVaishali Kulkarni 	struct eth_filter_cmd *p_second_filter;
132014b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
132114b24e2bSVaishali Kulkarni 	enum eth_filter_action action;
132214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
132314b24e2bSVaishali Kulkarni 
132414b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, p_filter_cmd->vport_to_remove_from,
132514b24e2bSVaishali Kulkarni 			    &vport_to_remove_from);
132614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
132714b24e2bSVaishali Kulkarni 		return rc;
132814b24e2bSVaishali Kulkarni 
132914b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, p_filter_cmd->vport_to_add_to,
133014b24e2bSVaishali Kulkarni 			    &vport_to_add_to);
133114b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
133214b24e2bSVaishali Kulkarni 		return rc;
133314b24e2bSVaishali Kulkarni 
133414b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
133514b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
133614b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
133714b24e2bSVaishali Kulkarni 	init_data.opaque_fid = opaque_fid;
133814b24e2bSVaishali Kulkarni 	init_data.comp_mode = comp_mode;
133914b24e2bSVaishali Kulkarni 	init_data.p_comp_data = p_comp_data;
134014b24e2bSVaishali Kulkarni 
134114b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, pp_ent,
134214b24e2bSVaishali Kulkarni 				   ETH_RAMROD_FILTERS_UPDATE,
134314b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
134414b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
134514b24e2bSVaishali Kulkarni 		return rc;
134614b24e2bSVaishali Kulkarni 
134714b24e2bSVaishali Kulkarni 	*pp_ramrod = &(*pp_ent)->ramrod.vport_filter_update;
134814b24e2bSVaishali Kulkarni 	p_ramrod = *pp_ramrod;
134914b24e2bSVaishali Kulkarni 	p_ramrod->filter_cmd_hdr.rx = p_filter_cmd->is_rx_filter ? 1 : 0;
135014b24e2bSVaishali Kulkarni 	p_ramrod->filter_cmd_hdr.tx = p_filter_cmd->is_tx_filter ? 1 : 0;
135114b24e2bSVaishali Kulkarni 
135214b24e2bSVaishali Kulkarni #ifndef ASIC_ONLY
135314b24e2bSVaishali Kulkarni 	if (CHIP_REV_IS_SLOW(p_hwfn->p_dev)) {
135414b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
135514b24e2bSVaishali Kulkarni 			   "Non-Asic - prevent Tx filters\n");
135614b24e2bSVaishali Kulkarni 		p_ramrod->filter_cmd_hdr.tx = 0;
135714b24e2bSVaishali Kulkarni 	}
135814b24e2bSVaishali Kulkarni 
135914b24e2bSVaishali Kulkarni #endif
136014b24e2bSVaishali Kulkarni 
136114b24e2bSVaishali Kulkarni 	switch (p_filter_cmd->opcode) {
136214b24e2bSVaishali Kulkarni 	case ECORE_FILTER_REPLACE:
136314b24e2bSVaishali Kulkarni 	case ECORE_FILTER_MOVE:
136414b24e2bSVaishali Kulkarni 		p_ramrod->filter_cmd_hdr.cmd_cnt = 2; break;
136514b24e2bSVaishali Kulkarni 	default:
136614b24e2bSVaishali Kulkarni 		p_ramrod->filter_cmd_hdr.cmd_cnt = 1; break;
136714b24e2bSVaishali Kulkarni 	}
136814b24e2bSVaishali Kulkarni 
136914b24e2bSVaishali Kulkarni 	p_first_filter = &p_ramrod->filter_cmds[0];
137014b24e2bSVaishali Kulkarni 	p_second_filter = &p_ramrod->filter_cmds[1];
137114b24e2bSVaishali Kulkarni 
137214b24e2bSVaishali Kulkarni 	switch (p_filter_cmd->type) {
137314b24e2bSVaishali Kulkarni 	case ECORE_FILTER_MAC:
137414b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_MAC; break;
137514b24e2bSVaishali Kulkarni 	case ECORE_FILTER_VLAN:
137614b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_VLAN; break;
137714b24e2bSVaishali Kulkarni 	case ECORE_FILTER_MAC_VLAN:
137814b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_PAIR; break;
137914b24e2bSVaishali Kulkarni 	case ECORE_FILTER_INNER_MAC:
138014b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_INNER_MAC; break;
138114b24e2bSVaishali Kulkarni 	case ECORE_FILTER_INNER_VLAN:
138214b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_INNER_VLAN; break;
138314b24e2bSVaishali Kulkarni 	case ECORE_FILTER_INNER_PAIR:
138414b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_INNER_PAIR; break;
138514b24e2bSVaishali Kulkarni 	case ECORE_FILTER_INNER_MAC_VNI_PAIR:
138614b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_INNER_MAC_VNI_PAIR;
138714b24e2bSVaishali Kulkarni 		break;
138814b24e2bSVaishali Kulkarni 	case ECORE_FILTER_MAC_VNI_PAIR:
138914b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_MAC_VNI_PAIR; break;
139014b24e2bSVaishali Kulkarni 	case ECORE_FILTER_VNI:
139114b24e2bSVaishali Kulkarni 		p_first_filter->type = ETH_FILTER_TYPE_VNI; break;
139214b24e2bSVaishali Kulkarni 	}
139314b24e2bSVaishali Kulkarni 
139414b24e2bSVaishali Kulkarni 	if ((p_first_filter->type == ETH_FILTER_TYPE_MAC) ||
139514b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_PAIR) ||
139614b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_INNER_MAC) ||
139714b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_INNER_PAIR) ||
139814b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_INNER_MAC_VNI_PAIR) ||
139914b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_MAC_VNI_PAIR))
140014b24e2bSVaishali Kulkarni 		ecore_set_fw_mac_addr(&p_first_filter->mac_msb,
140114b24e2bSVaishali Kulkarni 				      &p_first_filter->mac_mid,
140214b24e2bSVaishali Kulkarni 				      &p_first_filter->mac_lsb,
140314b24e2bSVaishali Kulkarni 				      (u8 *)p_filter_cmd->mac);
140414b24e2bSVaishali Kulkarni 
140514b24e2bSVaishali Kulkarni 	if ((p_first_filter->type == ETH_FILTER_TYPE_VLAN) ||
140614b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_PAIR) ||
140714b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_INNER_VLAN) ||
140814b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_INNER_PAIR))
140914b24e2bSVaishali Kulkarni 		p_first_filter->vlan_id = OSAL_CPU_TO_LE16(p_filter_cmd->vlan);
141014b24e2bSVaishali Kulkarni 
141114b24e2bSVaishali Kulkarni 	if ((p_first_filter->type == ETH_FILTER_TYPE_INNER_MAC_VNI_PAIR) ||
141214b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_MAC_VNI_PAIR) ||
141314b24e2bSVaishali Kulkarni 	    (p_first_filter->type == ETH_FILTER_TYPE_VNI))
141414b24e2bSVaishali Kulkarni 		p_first_filter->vni = OSAL_CPU_TO_LE32(p_filter_cmd->vni);
141514b24e2bSVaishali Kulkarni 
141614b24e2bSVaishali Kulkarni 	if (p_filter_cmd->opcode == ECORE_FILTER_MOVE) {
141714b24e2bSVaishali Kulkarni 		p_second_filter->type = p_first_filter->type;
141814b24e2bSVaishali Kulkarni 		p_second_filter->mac_msb = p_first_filter->mac_msb;
141914b24e2bSVaishali Kulkarni 		p_second_filter->mac_mid = p_first_filter->mac_mid;
142014b24e2bSVaishali Kulkarni 		p_second_filter->mac_lsb = p_first_filter->mac_lsb;
142114b24e2bSVaishali Kulkarni 		p_second_filter->vlan_id = p_first_filter->vlan_id;
142214b24e2bSVaishali Kulkarni 		p_second_filter->vni = p_first_filter->vni;
142314b24e2bSVaishali Kulkarni 
142414b24e2bSVaishali Kulkarni 		p_first_filter->action = ETH_FILTER_ACTION_REMOVE;
142514b24e2bSVaishali Kulkarni 
142614b24e2bSVaishali Kulkarni 		p_first_filter->vport_id = vport_to_remove_from;
142714b24e2bSVaishali Kulkarni 
142814b24e2bSVaishali Kulkarni 		p_second_filter->action = ETH_FILTER_ACTION_ADD;
142914b24e2bSVaishali Kulkarni 		p_second_filter->vport_id = vport_to_add_to;
143014b24e2bSVaishali Kulkarni 	} else if (p_filter_cmd->opcode == ECORE_FILTER_REPLACE) {
143114b24e2bSVaishali Kulkarni 		p_first_filter->vport_id = vport_to_add_to;
143214b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(p_second_filter, p_first_filter,
143314b24e2bSVaishali Kulkarni 			    sizeof(*p_second_filter));
143414b24e2bSVaishali Kulkarni 		p_first_filter->action = ETH_FILTER_ACTION_REMOVE_ALL;
143514b24e2bSVaishali Kulkarni 		p_second_filter->action = ETH_FILTER_ACTION_ADD;
143614b24e2bSVaishali Kulkarni 	} else {
143714b24e2bSVaishali Kulkarni 		action = ecore_filter_action(p_filter_cmd->opcode);
143814b24e2bSVaishali Kulkarni 
143914b24e2bSVaishali Kulkarni 		if (action == MAX_ETH_FILTER_ACTION) {
144014b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true,
144114b24e2bSVaishali Kulkarni 				  "%d is not supported yet\n",
144214b24e2bSVaishali Kulkarni 				  p_filter_cmd->opcode);
144314b24e2bSVaishali Kulkarni 			return ECORE_NOTIMPL;
144414b24e2bSVaishali Kulkarni 		}
144514b24e2bSVaishali Kulkarni 
144614b24e2bSVaishali Kulkarni 		p_first_filter->action = action;
144714b24e2bSVaishali Kulkarni 		p_first_filter->vport_id =
144814b24e2bSVaishali Kulkarni 			(p_filter_cmd->opcode == ECORE_FILTER_REMOVE) ?
144914b24e2bSVaishali Kulkarni 			vport_to_remove_from : vport_to_add_to;
145014b24e2bSVaishali Kulkarni 	}
145114b24e2bSVaishali Kulkarni 
145214b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
145314b24e2bSVaishali Kulkarni }
145414b24e2bSVaishali Kulkarni 
ecore_sp_eth_filter_ucast(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_filter_ucast * p_filter_cmd,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)145514b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_eth_filter_ucast(struct ecore_hwfn *p_hwfn,
145614b24e2bSVaishali Kulkarni 					       u16 opaque_fid,
145714b24e2bSVaishali Kulkarni 					       struct ecore_filter_ucast *p_filter_cmd,
145814b24e2bSVaishali Kulkarni 					       enum spq_mode comp_mode,
145914b24e2bSVaishali Kulkarni 					       struct ecore_spq_comp_cb *p_comp_data)
146014b24e2bSVaishali Kulkarni {
146114b24e2bSVaishali Kulkarni 	struct vport_filter_update_ramrod_data *p_ramrod = OSAL_NULL;
146214b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
146314b24e2bSVaishali Kulkarni 	struct eth_filter_cmd_header *p_header;
146414b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
146514b24e2bSVaishali Kulkarni 
146614b24e2bSVaishali Kulkarni 	rc = ecore_filter_ucast_common(p_hwfn, opaque_fid, p_filter_cmd,
146714b24e2bSVaishali Kulkarni 				       &p_ramrod, &p_ent,
146814b24e2bSVaishali Kulkarni 				       comp_mode, p_comp_data);
146914b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS) {
147014b24e2bSVaishali Kulkarni 		DP_ERR(p_hwfn, "Uni. filter command failed %d\n", rc);
147114b24e2bSVaishali Kulkarni 		return rc;
147214b24e2bSVaishali Kulkarni 	}
147314b24e2bSVaishali Kulkarni 	p_header = &p_ramrod->filter_cmd_hdr;
147414b24e2bSVaishali Kulkarni 	p_header->assert_on_error = p_filter_cmd->assert_on_error;
147514b24e2bSVaishali Kulkarni 
147614b24e2bSVaishali Kulkarni 	rc = ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
147714b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS) {
147814b24e2bSVaishali Kulkarni 		DP_ERR(p_hwfn,
147914b24e2bSVaishali Kulkarni 		       "Unicast filter ADD command failed %d\n",
148014b24e2bSVaishali Kulkarni 		       rc);
148114b24e2bSVaishali Kulkarni 		return rc;
148214b24e2bSVaishali Kulkarni 	}
148314b24e2bSVaishali Kulkarni 
148414b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
148514b24e2bSVaishali Kulkarni 		   "Unicast filter configured, opcode = %s, type = %s, cmd_cnt = %d, is_rx_filter = %d, is_tx_filter = %d\n",
148614b24e2bSVaishali Kulkarni 		   (p_filter_cmd->opcode == ECORE_FILTER_ADD) ? "ADD" :
148714b24e2bSVaishali Kulkarni 		    ((p_filter_cmd->opcode == ECORE_FILTER_REMOVE) ?
148814b24e2bSVaishali Kulkarni 		     "REMOVE" :
148914b24e2bSVaishali Kulkarni 		     ((p_filter_cmd->opcode == ECORE_FILTER_MOVE) ?
149014b24e2bSVaishali Kulkarni 		      "MOVE" : "REPLACE")),
149114b24e2bSVaishali Kulkarni 		   (p_filter_cmd->type == ECORE_FILTER_MAC) ? "MAC" :
149214b24e2bSVaishali Kulkarni 		    ((p_filter_cmd->type == ECORE_FILTER_VLAN) ?
149314b24e2bSVaishali Kulkarni 		     "VLAN" : "MAC & VLAN"),
149414b24e2bSVaishali Kulkarni 		   p_ramrod->filter_cmd_hdr.cmd_cnt,
149514b24e2bSVaishali Kulkarni 		   p_filter_cmd->is_rx_filter,
149614b24e2bSVaishali Kulkarni 		   p_filter_cmd->is_tx_filter);
149714b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
149814b24e2bSVaishali Kulkarni 		   "vport_to_add_to = %d, vport_to_remove_from = %d, mac = %2x:%2x:%2x:%2x:%2x:%2x, vlan = %d\n",
149914b24e2bSVaishali Kulkarni 		   p_filter_cmd->vport_to_add_to,
150014b24e2bSVaishali Kulkarni 		   p_filter_cmd->vport_to_remove_from,
150114b24e2bSVaishali Kulkarni 		   p_filter_cmd->mac[0], p_filter_cmd->mac[1],
150214b24e2bSVaishali Kulkarni 		   p_filter_cmd->mac[2], p_filter_cmd->mac[3],
150314b24e2bSVaishali Kulkarni 		   p_filter_cmd->mac[4], p_filter_cmd->mac[5],
150414b24e2bSVaishali Kulkarni 		   p_filter_cmd->vlan);
150514b24e2bSVaishali Kulkarni 
150614b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
150714b24e2bSVaishali Kulkarni }
150814b24e2bSVaishali Kulkarni 
150914b24e2bSVaishali Kulkarni /*******************************************************************************
151014b24e2bSVaishali Kulkarni  * Description:
151114b24e2bSVaishali Kulkarni  *         Calculates crc 32 on a buffer
151214b24e2bSVaishali Kulkarni  *         Note: crc32_length MUST be aligned to 8
151314b24e2bSVaishali Kulkarni  * Return:
151414b24e2bSVaishali Kulkarni  ******************************************************************************/
ecore_calc_crc32c(u8 * crc32_packet,u32 crc32_length,u32 crc32_seed,u8 complement)151514b24e2bSVaishali Kulkarni static u32 ecore_calc_crc32c(u8 *crc32_packet,
151614b24e2bSVaishali Kulkarni 			     u32 crc32_length,
151714b24e2bSVaishali Kulkarni 			     u32 crc32_seed,
151814b24e2bSVaishali Kulkarni 			     u8 complement)
151914b24e2bSVaishali Kulkarni {
152014b24e2bSVaishali Kulkarni 	u32 byte = 0, bit = 0, crc32_result = crc32_seed;
152114b24e2bSVaishali Kulkarni 	u8  msb = 0, current_byte = 0;
152214b24e2bSVaishali Kulkarni 
152314b24e2bSVaishali Kulkarni 	if ((crc32_packet == OSAL_NULL) ||
152414b24e2bSVaishali Kulkarni 	    (crc32_length == 0) ||
152514b24e2bSVaishali Kulkarni 	    ((crc32_length % 8) != 0)) {
152614b24e2bSVaishali Kulkarni 		return crc32_result;
152714b24e2bSVaishali Kulkarni 	}
152814b24e2bSVaishali Kulkarni 
152914b24e2bSVaishali Kulkarni 	for (byte = 0; byte < crc32_length; byte++) {
153014b24e2bSVaishali Kulkarni 		current_byte = crc32_packet[byte];
153114b24e2bSVaishali Kulkarni 		for (bit = 0; bit < 8; bit++) {
153214b24e2bSVaishali Kulkarni 			msb = (u8)(crc32_result >> 31);
153314b24e2bSVaishali Kulkarni 			crc32_result = crc32_result << 1;
153414b24e2bSVaishali Kulkarni 			if (msb != (0x1 & (current_byte >> bit))) {
153514b24e2bSVaishali Kulkarni 				crc32_result = crc32_result ^ CRC32_POLY;
153614b24e2bSVaishali Kulkarni 				crc32_result |= 1; /*crc32_result[0] = 1;*/
153714b24e2bSVaishali Kulkarni 			}
153814b24e2bSVaishali Kulkarni 		}
153914b24e2bSVaishali Kulkarni 	}
154014b24e2bSVaishali Kulkarni 
154114b24e2bSVaishali Kulkarni 	return crc32_result;
154214b24e2bSVaishali Kulkarni }
154314b24e2bSVaishali Kulkarni 
ecore_crc32c_le(u32 seed,u8 * mac,u32 len)154414b24e2bSVaishali Kulkarni static u32 ecore_crc32c_le(u32 seed, u8 *mac, u32 len)
154514b24e2bSVaishali Kulkarni {
154614b24e2bSVaishali Kulkarni 	u32 packet_buf[2] = {0};
154714b24e2bSVaishali Kulkarni 
154814b24e2bSVaishali Kulkarni 	OSAL_MEMCPY((u8 *)(&packet_buf[0]), &mac[0], 6);
154914b24e2bSVaishali Kulkarni 	return ecore_calc_crc32c((u8 *)packet_buf, 8, seed, 0);
155014b24e2bSVaishali Kulkarni }
155114b24e2bSVaishali Kulkarni 
ecore_mcast_bin_from_mac(u8 * mac)155214b24e2bSVaishali Kulkarni u8 ecore_mcast_bin_from_mac(u8 *mac)
155314b24e2bSVaishali Kulkarni {
155414b24e2bSVaishali Kulkarni 	u32 crc = ecore_crc32c_le(ETH_MULTICAST_BIN_FROM_MAC_SEED,
155514b24e2bSVaishali Kulkarni 				  mac, ETH_ALEN);
155614b24e2bSVaishali Kulkarni 
155714b24e2bSVaishali Kulkarni 	return crc & 0xff;
155814b24e2bSVaishali Kulkarni }
155914b24e2bSVaishali Kulkarni 
156014b24e2bSVaishali Kulkarni static enum _ecore_status_t
ecore_sp_eth_filter_mcast(struct ecore_hwfn * p_hwfn,u16 opaque_fid,struct ecore_filter_mcast * p_filter_cmd,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)156114b24e2bSVaishali Kulkarni ecore_sp_eth_filter_mcast(struct ecore_hwfn *p_hwfn,
156214b24e2bSVaishali Kulkarni 			  u16 opaque_fid,
156314b24e2bSVaishali Kulkarni 			  struct ecore_filter_mcast *p_filter_cmd,
156414b24e2bSVaishali Kulkarni 			  enum spq_mode comp_mode,
156514b24e2bSVaishali Kulkarni 			  struct ecore_spq_comp_cb *p_comp_data)
156614b24e2bSVaishali Kulkarni {
156714b24e2bSVaishali Kulkarni 	unsigned long bins[ETH_MULTICAST_MAC_BINS_IN_REGS];
156814b24e2bSVaishali Kulkarni 	struct vport_update_ramrod_data *p_ramrod = OSAL_NULL;
156914b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
157014b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
157114b24e2bSVaishali Kulkarni 	u8 abs_vport_id = 0;
157214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
157314b24e2bSVaishali Kulkarni 	int i;
157414b24e2bSVaishali Kulkarni 
157514b24e2bSVaishali Kulkarni 	if (p_filter_cmd->opcode == ECORE_FILTER_ADD)
157614b24e2bSVaishali Kulkarni 		rc = ecore_fw_vport(p_hwfn, p_filter_cmd->vport_to_add_to,
157714b24e2bSVaishali Kulkarni 				    &abs_vport_id);
157814b24e2bSVaishali Kulkarni 	else
157914b24e2bSVaishali Kulkarni 		rc = ecore_fw_vport(p_hwfn, p_filter_cmd->vport_to_remove_from,
158014b24e2bSVaishali Kulkarni 				    &abs_vport_id);
158114b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
158214b24e2bSVaishali Kulkarni 		return rc;
158314b24e2bSVaishali Kulkarni 
158414b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
158514b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
158614b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
158714b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
158814b24e2bSVaishali Kulkarni 	init_data.comp_mode = comp_mode;
158914b24e2bSVaishali Kulkarni 	init_data.p_comp_data = p_comp_data;
159014b24e2bSVaishali Kulkarni 
159114b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
159214b24e2bSVaishali Kulkarni 				   ETH_RAMROD_VPORT_UPDATE,
159314b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
159414b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS) {
159514b24e2bSVaishali Kulkarni 		DP_ERR(p_hwfn, "Multi-cast command failed %d\n", rc);
159614b24e2bSVaishali Kulkarni 		return rc;
159714b24e2bSVaishali Kulkarni 	}
159814b24e2bSVaishali Kulkarni 
159914b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.vport_update;
160014b24e2bSVaishali Kulkarni 	p_ramrod->common.update_approx_mcast_flg = 1;
160114b24e2bSVaishali Kulkarni 
160214b24e2bSVaishali Kulkarni 	/* explicitly clear out the entire vector */
160314b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&p_ramrod->approx_mcast.bins,
160414b24e2bSVaishali Kulkarni 		    0, sizeof(p_ramrod->approx_mcast.bins));
160514b24e2bSVaishali Kulkarni 	OSAL_MEMSET(bins, 0, sizeof(unsigned long) *
160614b24e2bSVaishali Kulkarni 		    ETH_MULTICAST_MAC_BINS_IN_REGS);
160714b24e2bSVaishali Kulkarni 	/* filter ADD op is explicit set op and it removes
160814b24e2bSVaishali Kulkarni 	*  any existing filters for the vport.
160914b24e2bSVaishali Kulkarni 	*/
161014b24e2bSVaishali Kulkarni 	if (p_filter_cmd->opcode == ECORE_FILTER_ADD) {
161114b24e2bSVaishali Kulkarni 		for (i = 0; i < p_filter_cmd->num_mc_addrs; i++) {
161214b24e2bSVaishali Kulkarni 			u32 bit;
161314b24e2bSVaishali Kulkarni 
161414b24e2bSVaishali Kulkarni 			bit = ecore_mcast_bin_from_mac(p_filter_cmd->mac[i]);
161514b24e2bSVaishali Kulkarni 			OSAL_SET_BIT(bit, bins);
161614b24e2bSVaishali Kulkarni 		}
161714b24e2bSVaishali Kulkarni 
161814b24e2bSVaishali Kulkarni 		/* Convert to correct endianity */
161914b24e2bSVaishali Kulkarni 		for (i = 0; i < ETH_MULTICAST_MAC_BINS_IN_REGS; i++) {
162014b24e2bSVaishali Kulkarni 			struct vport_update_ramrod_mcast *p_ramrod_bins;
162114b24e2bSVaishali Kulkarni 			u32 *p_bins = (u32 *)bins;
162214b24e2bSVaishali Kulkarni 
162314b24e2bSVaishali Kulkarni 			p_ramrod_bins = &p_ramrod->approx_mcast;
162414b24e2bSVaishali Kulkarni 			p_ramrod_bins->bins[i] = OSAL_CPU_TO_LE32(p_bins[i]);
162514b24e2bSVaishali Kulkarni 		}
162614b24e2bSVaishali Kulkarni 	}
162714b24e2bSVaishali Kulkarni 
162814b24e2bSVaishali Kulkarni 	p_ramrod->common.vport_id = abs_vport_id;
162914b24e2bSVaishali Kulkarni 
163014b24e2bSVaishali Kulkarni 	rc = ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
163114b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
163214b24e2bSVaishali Kulkarni 		DP_ERR(p_hwfn, "Multicast filter command failed %d\n", rc);
163314b24e2bSVaishali Kulkarni 
163414b24e2bSVaishali Kulkarni 	return rc;
163514b24e2bSVaishali Kulkarni }
163614b24e2bSVaishali Kulkarni 
ecore_filter_mcast_cmd(struct ecore_dev * p_dev,struct ecore_filter_mcast * p_filter_cmd,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)163714b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_filter_mcast_cmd(struct ecore_dev *p_dev,
163814b24e2bSVaishali Kulkarni 					    struct ecore_filter_mcast *p_filter_cmd,
163914b24e2bSVaishali Kulkarni 					    enum spq_mode comp_mode,
164014b24e2bSVaishali Kulkarni 					    struct ecore_spq_comp_cb *p_comp_data)
164114b24e2bSVaishali Kulkarni {
164214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_SUCCESS;
164314b24e2bSVaishali Kulkarni 	int i;
164414b24e2bSVaishali Kulkarni 
164514b24e2bSVaishali Kulkarni 	/* only ADD and REMOVE operations are supported for multi-cast */
164614b24e2bSVaishali Kulkarni 	if ((p_filter_cmd->opcode != ECORE_FILTER_ADD  &&
164714b24e2bSVaishali Kulkarni 	     (p_filter_cmd->opcode != ECORE_FILTER_REMOVE)) ||
164814b24e2bSVaishali Kulkarni 	     (p_filter_cmd->num_mc_addrs > ECORE_MAX_MC_ADDRS)) {
164914b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
165014b24e2bSVaishali Kulkarni 	}
165114b24e2bSVaishali Kulkarni 
165214b24e2bSVaishali Kulkarni 	for_each_hwfn(p_dev, i) {
165314b24e2bSVaishali Kulkarni 		struct ecore_hwfn *p_hwfn = &p_dev->hwfns[i];
165414b24e2bSVaishali Kulkarni 		u16 opaque_fid;
165514b24e2bSVaishali Kulkarni 
165614b24e2bSVaishali Kulkarni 		if (IS_VF(p_dev)) {
165714b24e2bSVaishali Kulkarni 			ecore_vf_pf_filter_mcast(p_hwfn, p_filter_cmd);
165814b24e2bSVaishali Kulkarni 			continue;
165914b24e2bSVaishali Kulkarni 		}
166014b24e2bSVaishali Kulkarni 
166114b24e2bSVaishali Kulkarni 		opaque_fid = p_hwfn->hw_info.opaque_fid;
166214b24e2bSVaishali Kulkarni 		rc = ecore_sp_eth_filter_mcast(p_hwfn,
166314b24e2bSVaishali Kulkarni 					       opaque_fid,
166414b24e2bSVaishali Kulkarni 					       p_filter_cmd,
166514b24e2bSVaishali Kulkarni 					       comp_mode,
166614b24e2bSVaishali Kulkarni 					       p_comp_data);
166714b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
166814b24e2bSVaishali Kulkarni 			break;
166914b24e2bSVaishali Kulkarni 	}
167014b24e2bSVaishali Kulkarni 
167114b24e2bSVaishali Kulkarni 	return rc;
167214b24e2bSVaishali Kulkarni }
167314b24e2bSVaishali Kulkarni 
ecore_filter_ucast_cmd(struct ecore_dev * p_dev,struct ecore_filter_ucast * p_filter_cmd,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)167414b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_filter_ucast_cmd(struct ecore_dev *p_dev,
167514b24e2bSVaishali Kulkarni 					    struct ecore_filter_ucast *p_filter_cmd,
167614b24e2bSVaishali Kulkarni 					    enum spq_mode comp_mode,
167714b24e2bSVaishali Kulkarni 					    struct ecore_spq_comp_cb *p_comp_data)
167814b24e2bSVaishali Kulkarni {
167914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_SUCCESS;
168014b24e2bSVaishali Kulkarni 	int i;
168114b24e2bSVaishali Kulkarni 
168214b24e2bSVaishali Kulkarni 	for_each_hwfn(p_dev, i) {
168314b24e2bSVaishali Kulkarni 		struct ecore_hwfn *p_hwfn = &p_dev->hwfns[i];
168414b24e2bSVaishali Kulkarni 		u16 opaque_fid;
168514b24e2bSVaishali Kulkarni 
168614b24e2bSVaishali Kulkarni 		if (IS_VF(p_dev)) {
168714b24e2bSVaishali Kulkarni 			rc = ecore_vf_pf_filter_ucast(p_hwfn, p_filter_cmd);
168814b24e2bSVaishali Kulkarni 			continue;
168914b24e2bSVaishali Kulkarni 		}
169014b24e2bSVaishali Kulkarni 
169114b24e2bSVaishali Kulkarni 		opaque_fid = p_hwfn->hw_info.opaque_fid;
169214b24e2bSVaishali Kulkarni 		rc = ecore_sp_eth_filter_ucast(p_hwfn,
169314b24e2bSVaishali Kulkarni 					       opaque_fid,
169414b24e2bSVaishali Kulkarni 					       p_filter_cmd,
169514b24e2bSVaishali Kulkarni 					       comp_mode,
169614b24e2bSVaishali Kulkarni 					       p_comp_data);
169714b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
169814b24e2bSVaishali Kulkarni 			break;
169914b24e2bSVaishali Kulkarni 	}
170014b24e2bSVaishali Kulkarni 
170114b24e2bSVaishali Kulkarni 	return rc;
170214b24e2bSVaishali Kulkarni }
170314b24e2bSVaishali Kulkarni 
170414b24e2bSVaishali Kulkarni /* Statistics related code */
__ecore_get_vport_pstats_addrlen(struct ecore_hwfn * p_hwfn,u32 * p_addr,u32 * p_len,u16 statistics_bin)170514b24e2bSVaishali Kulkarni static void __ecore_get_vport_pstats_addrlen(struct ecore_hwfn *p_hwfn,
170614b24e2bSVaishali Kulkarni 					     u32 *p_addr, u32 *p_len,
170714b24e2bSVaishali Kulkarni 					     u16 statistics_bin)
170814b24e2bSVaishali Kulkarni {
170914b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev)) {
171014b24e2bSVaishali Kulkarni 		*p_addr = BAR0_MAP_REG_PSDM_RAM +
171114b24e2bSVaishali Kulkarni 			  PSTORM_QUEUE_STAT_OFFSET(statistics_bin);
171214b24e2bSVaishali Kulkarni 		*p_len = sizeof(struct eth_pstorm_per_queue_stat);
171314b24e2bSVaishali Kulkarni 	} else {
171414b24e2bSVaishali Kulkarni 		struct ecore_vf_iov *p_iov = p_hwfn->vf_iov_info;
171514b24e2bSVaishali Kulkarni 		struct pfvf_acquire_resp_tlv *p_resp = &p_iov->acquire_resp;
171614b24e2bSVaishali Kulkarni 
171714b24e2bSVaishali Kulkarni 		*p_addr = p_resp->pfdev_info.stats_info.pstats.address;
171814b24e2bSVaishali Kulkarni 		*p_len = p_resp->pfdev_info.stats_info.pstats.len;
171914b24e2bSVaishali Kulkarni 	}
172014b24e2bSVaishali Kulkarni }
172114b24e2bSVaishali Kulkarni 
__ecore_get_vport_pstats(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_eth_stats * p_stats,u16 statistics_bin)172214b24e2bSVaishali Kulkarni static void __ecore_get_vport_pstats(struct ecore_hwfn *p_hwfn,
172314b24e2bSVaishali Kulkarni 				     struct ecore_ptt *p_ptt,
172414b24e2bSVaishali Kulkarni 				     struct ecore_eth_stats *p_stats,
172514b24e2bSVaishali Kulkarni 				     u16 statistics_bin)
172614b24e2bSVaishali Kulkarni {
172714b24e2bSVaishali Kulkarni 	struct eth_pstorm_per_queue_stat pstats;
172814b24e2bSVaishali Kulkarni 	u32 pstats_addr = 0, pstats_len = 0;
172914b24e2bSVaishali Kulkarni 
173014b24e2bSVaishali Kulkarni 	__ecore_get_vport_pstats_addrlen(p_hwfn, &pstats_addr, &pstats_len,
173114b24e2bSVaishali Kulkarni 					 statistics_bin);
173214b24e2bSVaishali Kulkarni 
173314b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&pstats, 0, sizeof(pstats));
173414b24e2bSVaishali Kulkarni 	ecore_memcpy_from(p_hwfn, p_ptt, &pstats,
173514b24e2bSVaishali Kulkarni 			  pstats_addr, pstats_len);
173614b24e2bSVaishali Kulkarni 
173714b24e2bSVaishali Kulkarni 	p_stats->common.tx_ucast_bytes +=
173814b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.sent_ucast_bytes);
173914b24e2bSVaishali Kulkarni 	p_stats->common.tx_mcast_bytes +=
174014b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.sent_mcast_bytes);
174114b24e2bSVaishali Kulkarni 	p_stats->common.tx_bcast_bytes +=
174214b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.sent_bcast_bytes);
174314b24e2bSVaishali Kulkarni 	p_stats->common.tx_ucast_pkts +=
174414b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.sent_ucast_pkts);
174514b24e2bSVaishali Kulkarni 	p_stats->common.tx_mcast_pkts +=
174614b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.sent_mcast_pkts);
174714b24e2bSVaishali Kulkarni 	p_stats->common.tx_bcast_pkts +=
174814b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.sent_bcast_pkts);
174914b24e2bSVaishali Kulkarni 	p_stats->common.tx_err_drop_pkts +=
175014b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(pstats.error_drop_pkts);
175114b24e2bSVaishali Kulkarni }
175214b24e2bSVaishali Kulkarni 
__ecore_get_vport_tstats(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_eth_stats * p_stats,u16 statistics_bin)175314b24e2bSVaishali Kulkarni static void __ecore_get_vport_tstats(struct ecore_hwfn *p_hwfn,
175414b24e2bSVaishali Kulkarni 				     struct ecore_ptt *p_ptt,
175514b24e2bSVaishali Kulkarni 				     struct ecore_eth_stats *p_stats,
175614b24e2bSVaishali Kulkarni 				     u16 statistics_bin)
175714b24e2bSVaishali Kulkarni {
175814b24e2bSVaishali Kulkarni 	struct tstorm_per_port_stat tstats;
175914b24e2bSVaishali Kulkarni 	u32 tstats_addr, tstats_len;
176014b24e2bSVaishali Kulkarni 
176114b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev)) {
176214b24e2bSVaishali Kulkarni 		tstats_addr = BAR0_MAP_REG_TSDM_RAM +
176314b24e2bSVaishali Kulkarni 			      TSTORM_PORT_STAT_OFFSET(MFW_PORT(p_hwfn));
176414b24e2bSVaishali Kulkarni 		tstats_len = sizeof(struct tstorm_per_port_stat);
176514b24e2bSVaishali Kulkarni 	} else {
176614b24e2bSVaishali Kulkarni 		struct ecore_vf_iov *p_iov = p_hwfn->vf_iov_info;
176714b24e2bSVaishali Kulkarni 		struct pfvf_acquire_resp_tlv *p_resp = &p_iov->acquire_resp;
176814b24e2bSVaishali Kulkarni 
176914b24e2bSVaishali Kulkarni 		tstats_addr = p_resp->pfdev_info.stats_info.tstats.address;
177014b24e2bSVaishali Kulkarni 		tstats_len = p_resp->pfdev_info.stats_info.tstats.len;
177114b24e2bSVaishali Kulkarni 	}
177214b24e2bSVaishali Kulkarni 
177314b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&tstats, 0, sizeof(tstats));
177414b24e2bSVaishali Kulkarni 	ecore_memcpy_from(p_hwfn, p_ptt, &tstats,
177514b24e2bSVaishali Kulkarni 			  tstats_addr, tstats_len);
177614b24e2bSVaishali Kulkarni 
177714b24e2bSVaishali Kulkarni 	p_stats->common.mftag_filter_discards +=
177814b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(tstats.mftag_filter_discard);
177914b24e2bSVaishali Kulkarni 	p_stats->common.mac_filter_discards +=
178014b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(tstats.eth_mac_filter_discard);
178114b24e2bSVaishali Kulkarni }
178214b24e2bSVaishali Kulkarni 
__ecore_get_vport_ustats_addrlen(struct ecore_hwfn * p_hwfn,u32 * p_addr,u32 * p_len,u16 statistics_bin)178314b24e2bSVaishali Kulkarni static void __ecore_get_vport_ustats_addrlen(struct ecore_hwfn *p_hwfn,
178414b24e2bSVaishali Kulkarni 					     u32 *p_addr, u32 *p_len,
178514b24e2bSVaishali Kulkarni 					     u16 statistics_bin)
178614b24e2bSVaishali Kulkarni {
178714b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev)) {
178814b24e2bSVaishali Kulkarni 		*p_addr = BAR0_MAP_REG_USDM_RAM +
178914b24e2bSVaishali Kulkarni 			  USTORM_QUEUE_STAT_OFFSET(statistics_bin);
179014b24e2bSVaishali Kulkarni 		*p_len = sizeof(struct eth_ustorm_per_queue_stat);
179114b24e2bSVaishali Kulkarni 	} else {
179214b24e2bSVaishali Kulkarni 		struct ecore_vf_iov *p_iov = p_hwfn->vf_iov_info;
179314b24e2bSVaishali Kulkarni 		struct pfvf_acquire_resp_tlv *p_resp = &p_iov->acquire_resp;
179414b24e2bSVaishali Kulkarni 
179514b24e2bSVaishali Kulkarni 		*p_addr = p_resp->pfdev_info.stats_info.ustats.address;
179614b24e2bSVaishali Kulkarni 		*p_len = p_resp->pfdev_info.stats_info.ustats.len;
179714b24e2bSVaishali Kulkarni 	}
179814b24e2bSVaishali Kulkarni }
179914b24e2bSVaishali Kulkarni 
__ecore_get_vport_ustats(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_eth_stats * p_stats,u16 statistics_bin)180014b24e2bSVaishali Kulkarni static void __ecore_get_vport_ustats(struct ecore_hwfn *p_hwfn,
180114b24e2bSVaishali Kulkarni 				     struct ecore_ptt *p_ptt,
180214b24e2bSVaishali Kulkarni 				     struct ecore_eth_stats *p_stats,
180314b24e2bSVaishali Kulkarni 				     u16 statistics_bin)
180414b24e2bSVaishali Kulkarni {
180514b24e2bSVaishali Kulkarni 	struct eth_ustorm_per_queue_stat ustats;
180614b24e2bSVaishali Kulkarni 	u32 ustats_addr = 0, ustats_len = 0;
180714b24e2bSVaishali Kulkarni 
180814b24e2bSVaishali Kulkarni 	__ecore_get_vport_ustats_addrlen(p_hwfn, &ustats_addr, &ustats_len,
180914b24e2bSVaishali Kulkarni 					 statistics_bin);
181014b24e2bSVaishali Kulkarni 
181114b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&ustats, 0, sizeof(ustats));
181214b24e2bSVaishali Kulkarni 	ecore_memcpy_from(p_hwfn, p_ptt, &ustats,
181314b24e2bSVaishali Kulkarni 			  ustats_addr, ustats_len);
181414b24e2bSVaishali Kulkarni 
181514b24e2bSVaishali Kulkarni 	p_stats->common.rx_ucast_bytes +=
181614b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(ustats.rcv_ucast_bytes);
181714b24e2bSVaishali Kulkarni 	p_stats->common.rx_mcast_bytes +=
181814b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(ustats.rcv_mcast_bytes);
181914b24e2bSVaishali Kulkarni 	p_stats->common.rx_bcast_bytes +=
182014b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(ustats.rcv_bcast_bytes);
182114b24e2bSVaishali Kulkarni 	p_stats->common.rx_ucast_pkts +=
182214b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(ustats.rcv_ucast_pkts);
182314b24e2bSVaishali Kulkarni 	p_stats->common.rx_mcast_pkts +=
182414b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(ustats.rcv_mcast_pkts);
182514b24e2bSVaishali Kulkarni 	p_stats->common.rx_bcast_pkts +=
182614b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(ustats.rcv_bcast_pkts);
182714b24e2bSVaishali Kulkarni }
182814b24e2bSVaishali Kulkarni 
__ecore_get_vport_mstats_addrlen(struct ecore_hwfn * p_hwfn,u32 * p_addr,u32 * p_len,u16 statistics_bin)182914b24e2bSVaishali Kulkarni static void __ecore_get_vport_mstats_addrlen(struct ecore_hwfn *p_hwfn,
183014b24e2bSVaishali Kulkarni 					     u32 *p_addr, u32 *p_len,
183114b24e2bSVaishali Kulkarni 					     u16 statistics_bin)
183214b24e2bSVaishali Kulkarni {
183314b24e2bSVaishali Kulkarni 	if (IS_PF(p_hwfn->p_dev)) {
183414b24e2bSVaishali Kulkarni 		*p_addr = BAR0_MAP_REG_MSDM_RAM +
183514b24e2bSVaishali Kulkarni 			  MSTORM_QUEUE_STAT_OFFSET(statistics_bin);
183614b24e2bSVaishali Kulkarni 		*p_len = sizeof(struct eth_mstorm_per_queue_stat);
183714b24e2bSVaishali Kulkarni 	} else {
183814b24e2bSVaishali Kulkarni 		struct ecore_vf_iov *p_iov = p_hwfn->vf_iov_info;
183914b24e2bSVaishali Kulkarni 		struct pfvf_acquire_resp_tlv *p_resp = &p_iov->acquire_resp;
184014b24e2bSVaishali Kulkarni 
184114b24e2bSVaishali Kulkarni 		*p_addr = p_resp->pfdev_info.stats_info.mstats.address;
184214b24e2bSVaishali Kulkarni 		*p_len = p_resp->pfdev_info.stats_info.mstats.len;
184314b24e2bSVaishali Kulkarni 	}
184414b24e2bSVaishali Kulkarni }
184514b24e2bSVaishali Kulkarni 
__ecore_get_vport_mstats(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_eth_stats * p_stats,u16 statistics_bin)184614b24e2bSVaishali Kulkarni static void __ecore_get_vport_mstats(struct ecore_hwfn *p_hwfn,
184714b24e2bSVaishali Kulkarni 				     struct ecore_ptt *p_ptt,
184814b24e2bSVaishali Kulkarni 				     struct ecore_eth_stats *p_stats,
184914b24e2bSVaishali Kulkarni 				     u16 statistics_bin)
185014b24e2bSVaishali Kulkarni {
185114b24e2bSVaishali Kulkarni 	struct eth_mstorm_per_queue_stat mstats;
185214b24e2bSVaishali Kulkarni 	u32 mstats_addr = 0, mstats_len = 0;
185314b24e2bSVaishali Kulkarni 
185414b24e2bSVaishali Kulkarni 	__ecore_get_vport_mstats_addrlen(p_hwfn, &mstats_addr, &mstats_len,
185514b24e2bSVaishali Kulkarni 					 statistics_bin);
185614b24e2bSVaishali Kulkarni 
185714b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&mstats, 0, sizeof(mstats));
185814b24e2bSVaishali Kulkarni 	ecore_memcpy_from(p_hwfn, p_ptt, &mstats,
185914b24e2bSVaishali Kulkarni 			  mstats_addr, mstats_len);
186014b24e2bSVaishali Kulkarni 
186114b24e2bSVaishali Kulkarni 	p_stats->common.no_buff_discards +=
186214b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.no_buff_discard);
186314b24e2bSVaishali Kulkarni 	p_stats->common.packet_too_big_discard +=
186414b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.packet_too_big_discard);
186514b24e2bSVaishali Kulkarni 	p_stats->common.ttl0_discard +=
186614b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.ttl0_discard);
186714b24e2bSVaishali Kulkarni 	p_stats->common.tpa_coalesced_pkts +=
186814b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.tpa_coalesced_pkts);
186914b24e2bSVaishali Kulkarni 	p_stats->common.tpa_coalesced_events +=
187014b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.tpa_coalesced_events);
187114b24e2bSVaishali Kulkarni 	p_stats->common.tpa_aborts_num +=
187214b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.tpa_aborts_num);
187314b24e2bSVaishali Kulkarni 	p_stats->common.tpa_coalesced_bytes +=
187414b24e2bSVaishali Kulkarni 		HILO_64_REGPAIR(mstats.tpa_coalesced_bytes);
187514b24e2bSVaishali Kulkarni }
187614b24e2bSVaishali Kulkarni 
__ecore_get_vport_port_stats(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_eth_stats * p_stats)187714b24e2bSVaishali Kulkarni static void __ecore_get_vport_port_stats(struct ecore_hwfn *p_hwfn,
187814b24e2bSVaishali Kulkarni 					 struct ecore_ptt *p_ptt,
187914b24e2bSVaishali Kulkarni 					 struct ecore_eth_stats *p_stats)
188014b24e2bSVaishali Kulkarni {
188114b24e2bSVaishali Kulkarni 	struct ecore_eth_stats_common *p_common = &p_stats->common;
188214b24e2bSVaishali Kulkarni 	struct port_stats port_stats;
188314b24e2bSVaishali Kulkarni 	int j;
188414b24e2bSVaishali Kulkarni 
188514b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&port_stats, 0, sizeof(port_stats));
188614b24e2bSVaishali Kulkarni 
188714b24e2bSVaishali Kulkarni 	ecore_memcpy_from(p_hwfn, p_ptt, &port_stats,
188814b24e2bSVaishali Kulkarni 			  p_hwfn->mcp_info->port_addr +
1889*04443fdeSToomas Soome 			  offsetof(struct public_port, stats),
189014b24e2bSVaishali Kulkarni 			  sizeof(port_stats));
189114b24e2bSVaishali Kulkarni 
189214b24e2bSVaishali Kulkarni 	p_common->rx_64_byte_packets += port_stats.eth.r64;
189314b24e2bSVaishali Kulkarni 	p_common->rx_65_to_127_byte_packets += port_stats.eth.r127;
189414b24e2bSVaishali Kulkarni 	p_common->rx_128_to_255_byte_packets += port_stats.eth.r255;
189514b24e2bSVaishali Kulkarni 	p_common->rx_256_to_511_byte_packets += port_stats.eth.r511;
189614b24e2bSVaishali Kulkarni 	p_common->rx_512_to_1023_byte_packets += port_stats.eth.r1023;
189714b24e2bSVaishali Kulkarni 	p_common->rx_1024_to_1518_byte_packets += port_stats.eth.r1518;
189814b24e2bSVaishali Kulkarni 	p_common->rx_crc_errors += port_stats.eth.rfcs;
189914b24e2bSVaishali Kulkarni 	p_common->rx_mac_crtl_frames += port_stats.eth.rxcf;
190014b24e2bSVaishali Kulkarni 	p_common->rx_pause_frames += port_stats.eth.rxpf;
190114b24e2bSVaishali Kulkarni 	p_common->rx_pfc_frames += port_stats.eth.rxpp;
190214b24e2bSVaishali Kulkarni 	p_common->rx_align_errors += port_stats.eth.raln;
190314b24e2bSVaishali Kulkarni 	p_common->rx_carrier_errors += port_stats.eth.rfcr;
190414b24e2bSVaishali Kulkarni 	p_common->rx_oversize_packets += port_stats.eth.rovr;
190514b24e2bSVaishali Kulkarni 	p_common->rx_jabbers += port_stats.eth.rjbr;
190614b24e2bSVaishali Kulkarni 	p_common->rx_undersize_packets += port_stats.eth.rund;
190714b24e2bSVaishali Kulkarni 	p_common->rx_fragments += port_stats.eth.rfrg;
190814b24e2bSVaishali Kulkarni 	p_common->tx_64_byte_packets += port_stats.eth.t64;
190914b24e2bSVaishali Kulkarni 	p_common->tx_65_to_127_byte_packets += port_stats.eth.t127;
191014b24e2bSVaishali Kulkarni 	p_common->tx_128_to_255_byte_packets += port_stats.eth.t255;
191114b24e2bSVaishali Kulkarni 	p_common->tx_256_to_511_byte_packets += port_stats.eth.t511;
191214b24e2bSVaishali Kulkarni 	p_common->tx_512_to_1023_byte_packets += port_stats.eth.t1023;
191314b24e2bSVaishali Kulkarni 	p_common->tx_1024_to_1518_byte_packets += port_stats.eth.t1518;
191414b24e2bSVaishali Kulkarni 	p_common->tx_pause_frames += port_stats.eth.txpf;
191514b24e2bSVaishali Kulkarni 	p_common->tx_pfc_frames += port_stats.eth.txpp;
191614b24e2bSVaishali Kulkarni 	p_common->rx_mac_bytes += port_stats.eth.rbyte;
191714b24e2bSVaishali Kulkarni 	p_common->rx_mac_uc_packets += port_stats.eth.rxuca;
191814b24e2bSVaishali Kulkarni 	p_common->rx_mac_mc_packets += port_stats.eth.rxmca;
191914b24e2bSVaishali Kulkarni 	p_common->rx_mac_bc_packets += port_stats.eth.rxbca;
192014b24e2bSVaishali Kulkarni 	p_common->rx_mac_frames_ok += port_stats.eth.rxpok;
192114b24e2bSVaishali Kulkarni 	p_common->tx_mac_bytes += port_stats.eth.tbyte;
192214b24e2bSVaishali Kulkarni 	p_common->tx_mac_uc_packets += port_stats.eth.txuca;
192314b24e2bSVaishali Kulkarni 	p_common->tx_mac_mc_packets += port_stats.eth.txmca;
192414b24e2bSVaishali Kulkarni 	p_common->tx_mac_bc_packets += port_stats.eth.txbca;
192514b24e2bSVaishali Kulkarni 	p_common->tx_mac_ctrl_frames += port_stats.eth.txcf;
192614b24e2bSVaishali Kulkarni 	for (j = 0; j < 8; j++) {
192714b24e2bSVaishali Kulkarni 		p_common->brb_truncates += port_stats.brb.brb_truncate[j];
192814b24e2bSVaishali Kulkarni 		p_common->brb_discards += port_stats.brb.brb_discard[j];
192914b24e2bSVaishali Kulkarni 	}
193014b24e2bSVaishali Kulkarni 
193114b24e2bSVaishali Kulkarni 	if (ECORE_IS_BB(p_hwfn->p_dev)) {
193214b24e2bSVaishali Kulkarni 		struct ecore_eth_stats_bb *p_bb = &p_stats->bb;
193314b24e2bSVaishali Kulkarni 
193414b24e2bSVaishali Kulkarni 		p_bb->rx_1519_to_1522_byte_packets +=
193514b24e2bSVaishali Kulkarni 			port_stats.eth.u0.bb0.r1522;
193614b24e2bSVaishali Kulkarni 		p_bb->rx_1519_to_2047_byte_packets +=
193714b24e2bSVaishali Kulkarni 			port_stats.eth.u0.bb0.r2047;
193814b24e2bSVaishali Kulkarni 		p_bb->rx_2048_to_4095_byte_packets +=
193914b24e2bSVaishali Kulkarni 			port_stats.eth.u0.bb0.r4095;
194014b24e2bSVaishali Kulkarni 		p_bb->rx_4096_to_9216_byte_packets +=
194114b24e2bSVaishali Kulkarni 			port_stats.eth.u0.bb0.r9216;
194214b24e2bSVaishali Kulkarni 		p_bb->rx_9217_to_16383_byte_packets +=
194314b24e2bSVaishali Kulkarni 			port_stats.eth.u0.bb0.r16383;
194414b24e2bSVaishali Kulkarni 		p_bb->tx_1519_to_2047_byte_packets +=
194514b24e2bSVaishali Kulkarni 			port_stats.eth.u1.bb1.t2047;
194614b24e2bSVaishali Kulkarni 		p_bb->tx_2048_to_4095_byte_packets +=
194714b24e2bSVaishali Kulkarni 			port_stats.eth.u1.bb1.t4095;
194814b24e2bSVaishali Kulkarni 		p_bb->tx_4096_to_9216_byte_packets +=
194914b24e2bSVaishali Kulkarni 			port_stats.eth.u1.bb1.t9216;
195014b24e2bSVaishali Kulkarni 		p_bb->tx_9217_to_16383_byte_packets +=
195114b24e2bSVaishali Kulkarni 			port_stats.eth.u1.bb1.t16383;
195214b24e2bSVaishali Kulkarni 		p_bb->tx_lpi_entry_count += port_stats.eth.u2.bb2.tlpiec;
195314b24e2bSVaishali Kulkarni 		p_bb->tx_total_collisions += port_stats.eth.u2.bb2.tncl;
195414b24e2bSVaishali Kulkarni 	} else {
195514b24e2bSVaishali Kulkarni 		struct ecore_eth_stats_ah *p_ah = &p_stats->ah;
195614b24e2bSVaishali Kulkarni 
195714b24e2bSVaishali Kulkarni 		p_ah->rx_1519_to_max_byte_packets +=
195814b24e2bSVaishali Kulkarni 			port_stats.eth.u0.ah0.r1519_to_max;
195914b24e2bSVaishali Kulkarni 		p_ah->tx_1519_to_max_byte_packets =
196014b24e2bSVaishali Kulkarni 			port_stats.eth.u1.ah1.t1519_to_max;
196114b24e2bSVaishali Kulkarni 	}
196214b24e2bSVaishali Kulkarni }
196314b24e2bSVaishali Kulkarni 
__ecore_get_vport_stats(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_eth_stats * stats,u16 statistics_bin,bool b_get_port_stats)196414b24e2bSVaishali Kulkarni void __ecore_get_vport_stats(struct ecore_hwfn *p_hwfn,
196514b24e2bSVaishali Kulkarni 			     struct ecore_ptt *p_ptt,
196614b24e2bSVaishali Kulkarni 			     struct ecore_eth_stats *stats,
196714b24e2bSVaishali Kulkarni 			     u16 statistics_bin, bool b_get_port_stats)
196814b24e2bSVaishali Kulkarni {
196914b24e2bSVaishali Kulkarni 	__ecore_get_vport_mstats(p_hwfn, p_ptt, stats, statistics_bin);
197014b24e2bSVaishali Kulkarni 	__ecore_get_vport_ustats(p_hwfn, p_ptt, stats, statistics_bin);
197114b24e2bSVaishali Kulkarni 	__ecore_get_vport_tstats(p_hwfn, p_ptt, stats, statistics_bin);
197214b24e2bSVaishali Kulkarni 	__ecore_get_vport_pstats(p_hwfn, p_ptt, stats, statistics_bin);
197314b24e2bSVaishali Kulkarni 
197414b24e2bSVaishali Kulkarni #ifndef ASIC_ONLY
197514b24e2bSVaishali Kulkarni 	/* Avoid getting PORT stats for emulation.*/
197614b24e2bSVaishali Kulkarni 	if (CHIP_REV_IS_EMUL(p_hwfn->p_dev))
197714b24e2bSVaishali Kulkarni 		return;
197814b24e2bSVaishali Kulkarni #endif
197914b24e2bSVaishali Kulkarni 
198014b24e2bSVaishali Kulkarni 	if (b_get_port_stats && p_hwfn->mcp_info)
198114b24e2bSVaishali Kulkarni 		__ecore_get_vport_port_stats(p_hwfn, p_ptt, stats);
198214b24e2bSVaishali Kulkarni }
198314b24e2bSVaishali Kulkarni 
_ecore_get_vport_stats(struct ecore_dev * p_dev,struct ecore_eth_stats * stats)198414b24e2bSVaishali Kulkarni static void _ecore_get_vport_stats(struct ecore_dev *p_dev,
198514b24e2bSVaishali Kulkarni 				   struct ecore_eth_stats *stats)
198614b24e2bSVaishali Kulkarni {
198714b24e2bSVaishali Kulkarni 	u8 fw_vport = 0;
198814b24e2bSVaishali Kulkarni 	int i;
198914b24e2bSVaishali Kulkarni 
199014b24e2bSVaishali Kulkarni 	OSAL_MEMSET(stats, 0, sizeof(*stats));
199114b24e2bSVaishali Kulkarni 
199214b24e2bSVaishali Kulkarni 	for_each_hwfn(p_dev, i) {
199314b24e2bSVaishali Kulkarni 		struct ecore_hwfn *p_hwfn = &p_dev->hwfns[i];
199414b24e2bSVaishali Kulkarni 		struct ecore_ptt *p_ptt = IS_PF(p_dev) ?
199514b24e2bSVaishali Kulkarni 					  ecore_ptt_acquire(p_hwfn) : OSAL_NULL;
199614b24e2bSVaishali Kulkarni 
199714b24e2bSVaishali Kulkarni 		if (IS_PF(p_dev)) {
199814b24e2bSVaishali Kulkarni 			/* The main vport index is relative first */
199914b24e2bSVaishali Kulkarni 			if (ecore_fw_vport(p_hwfn, 0, &fw_vport)) {
200014b24e2bSVaishali Kulkarni 				DP_ERR(p_hwfn, "No vport available!\n");
200114b24e2bSVaishali Kulkarni 				goto out;
200214b24e2bSVaishali Kulkarni 			}
200314b24e2bSVaishali Kulkarni 		}
200414b24e2bSVaishali Kulkarni 
200514b24e2bSVaishali Kulkarni 		if (IS_PF(p_dev) && !p_ptt) {
200614b24e2bSVaishali Kulkarni 			DP_ERR(p_hwfn, "Failed to acquire ptt\n");
200714b24e2bSVaishali Kulkarni 			continue;
200814b24e2bSVaishali Kulkarni 		}
200914b24e2bSVaishali Kulkarni 
201014b24e2bSVaishali Kulkarni 		__ecore_get_vport_stats(p_hwfn, p_ptt, stats, fw_vport,
201114b24e2bSVaishali Kulkarni 					IS_PF(p_dev) ? true : false);
201214b24e2bSVaishali Kulkarni 
201314b24e2bSVaishali Kulkarni out:
201414b24e2bSVaishali Kulkarni 		if (IS_PF(p_dev) && p_ptt)
201514b24e2bSVaishali Kulkarni 			ecore_ptt_release(p_hwfn, p_ptt);
201614b24e2bSVaishali Kulkarni 	}
201714b24e2bSVaishali Kulkarni }
201814b24e2bSVaishali Kulkarni 
ecore_get_vport_stats(struct ecore_dev * p_dev,struct ecore_eth_stats * stats)201914b24e2bSVaishali Kulkarni void ecore_get_vport_stats(struct ecore_dev *p_dev,
202014b24e2bSVaishali Kulkarni 			   struct ecore_eth_stats *stats)
202114b24e2bSVaishali Kulkarni {
202214b24e2bSVaishali Kulkarni 	u32 i;
202314b24e2bSVaishali Kulkarni 
202414b24e2bSVaishali Kulkarni 	if (!p_dev) {
202514b24e2bSVaishali Kulkarni 		OSAL_MEMSET(stats, 0, sizeof(*stats));
202614b24e2bSVaishali Kulkarni 		return;
202714b24e2bSVaishali Kulkarni 	}
202814b24e2bSVaishali Kulkarni 
202914b24e2bSVaishali Kulkarni 	_ecore_get_vport_stats(p_dev, stats);
203014b24e2bSVaishali Kulkarni 
203114b24e2bSVaishali Kulkarni 	if (!p_dev->reset_stats)
203214b24e2bSVaishali Kulkarni 		return;
203314b24e2bSVaishali Kulkarni 
203414b24e2bSVaishali Kulkarni 	/* Reduce the statistics baseline */
203514b24e2bSVaishali Kulkarni 	for (i = 0; i < sizeof(struct ecore_eth_stats) / sizeof(u64); i++)
203614b24e2bSVaishali Kulkarni 		((u64 *)stats)[i] -= ((u64 *)p_dev->reset_stats)[i];
203714b24e2bSVaishali Kulkarni }
203814b24e2bSVaishali Kulkarni 
203914b24e2bSVaishali Kulkarni /* zeroes V-PORT specific portion of stats (Port stats remains untouched) */
ecore_reset_vport_stats(struct ecore_dev * p_dev)204014b24e2bSVaishali Kulkarni void ecore_reset_vport_stats(struct ecore_dev *p_dev)
204114b24e2bSVaishali Kulkarni {
204214b24e2bSVaishali Kulkarni 	int i;
204314b24e2bSVaishali Kulkarni 
204414b24e2bSVaishali Kulkarni 	for_each_hwfn(p_dev, i) {
204514b24e2bSVaishali Kulkarni 		struct ecore_hwfn *p_hwfn = &p_dev->hwfns[i];
204614b24e2bSVaishali Kulkarni 		struct eth_mstorm_per_queue_stat mstats;
204714b24e2bSVaishali Kulkarni 		struct eth_ustorm_per_queue_stat ustats;
204814b24e2bSVaishali Kulkarni 		struct eth_pstorm_per_queue_stat pstats;
204914b24e2bSVaishali Kulkarni 		struct ecore_ptt *p_ptt = IS_PF(p_dev) ?
205014b24e2bSVaishali Kulkarni 					  ecore_ptt_acquire(p_hwfn) : OSAL_NULL;
205114b24e2bSVaishali Kulkarni 		u32 addr = 0, len = 0;
205214b24e2bSVaishali Kulkarni 
205314b24e2bSVaishali Kulkarni 		if (IS_PF(p_dev) && !p_ptt) {
205414b24e2bSVaishali Kulkarni 			DP_ERR(p_hwfn, "Failed to acquire ptt\n");
205514b24e2bSVaishali Kulkarni 			continue;
205614b24e2bSVaishali Kulkarni 		}
205714b24e2bSVaishali Kulkarni 
205814b24e2bSVaishali Kulkarni 		OSAL_MEMSET(&mstats, 0, sizeof(mstats));
205914b24e2bSVaishali Kulkarni 		__ecore_get_vport_mstats_addrlen(p_hwfn, &addr, &len, 0);
206014b24e2bSVaishali Kulkarni 		ecore_memcpy_to(p_hwfn, p_ptt, addr, &mstats, len);
206114b24e2bSVaishali Kulkarni 
206214b24e2bSVaishali Kulkarni 		OSAL_MEMSET(&ustats, 0, sizeof(ustats));
206314b24e2bSVaishali Kulkarni 		__ecore_get_vport_ustats_addrlen(p_hwfn, &addr, &len, 0);
206414b24e2bSVaishali Kulkarni 		ecore_memcpy_to(p_hwfn, p_ptt, addr, &ustats, len);
206514b24e2bSVaishali Kulkarni 
206614b24e2bSVaishali Kulkarni 		OSAL_MEMSET(&pstats, 0, sizeof(pstats));
206714b24e2bSVaishali Kulkarni 		__ecore_get_vport_pstats_addrlen(p_hwfn, &addr, &len, 0);
206814b24e2bSVaishali Kulkarni 		ecore_memcpy_to(p_hwfn, p_ptt, addr, &pstats, len);
206914b24e2bSVaishali Kulkarni 
207014b24e2bSVaishali Kulkarni 		if (IS_PF(p_dev))
207114b24e2bSVaishali Kulkarni 			ecore_ptt_release(p_hwfn, p_ptt);
207214b24e2bSVaishali Kulkarni 	}
207314b24e2bSVaishali Kulkarni 
207414b24e2bSVaishali Kulkarni 	/* PORT statistics are not necessarily reset, so we need to
207514b24e2bSVaishali Kulkarni 	 * read and create a baseline for future statistics.
207614b24e2bSVaishali Kulkarni 	 */
207714b24e2bSVaishali Kulkarni 	if (!p_dev->reset_stats)
207814b24e2bSVaishali Kulkarni 		DP_INFO(p_dev, "Reset stats not allocated\n");
207914b24e2bSVaishali Kulkarni 	else
208014b24e2bSVaishali Kulkarni 		_ecore_get_vport_stats(p_dev, p_dev->reset_stats);
208114b24e2bSVaishali Kulkarni }
208214b24e2bSVaishali Kulkarni 
ecore_arfs_mode_configure(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_arfs_config_params * p_cfg_params)208314b24e2bSVaishali Kulkarni void ecore_arfs_mode_configure(struct ecore_hwfn *p_hwfn,
208414b24e2bSVaishali Kulkarni 			       struct ecore_ptt *p_ptt,
208514b24e2bSVaishali Kulkarni 			       struct ecore_arfs_config_params *p_cfg_params)
208614b24e2bSVaishali Kulkarni {
208714b24e2bSVaishali Kulkarni 	if (p_cfg_params->arfs_enable) {
208814b24e2bSVaishali Kulkarni 		ecore_set_rfs_mode_enable(p_hwfn, p_ptt, p_hwfn->rel_pf_id,
208914b24e2bSVaishali Kulkarni 					  p_cfg_params->tcp,
209014b24e2bSVaishali Kulkarni 					  p_cfg_params->udp,
209114b24e2bSVaishali Kulkarni 					  p_cfg_params->ipv4,
209214b24e2bSVaishali Kulkarni 					  p_cfg_params->ipv6);
209314b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
209414b24e2bSVaishali Kulkarni 			   "tcp = %s, udp = %s, ipv4 = %s, ipv6 =%s\n",
209514b24e2bSVaishali Kulkarni 			   p_cfg_params->tcp ? "Enable" : "Disable",
209614b24e2bSVaishali Kulkarni 			   p_cfg_params->udp ? "Enable" : "Disable",
209714b24e2bSVaishali Kulkarni 			   p_cfg_params->ipv4 ? "Enable" : "Disable",
209814b24e2bSVaishali Kulkarni 			   p_cfg_params->ipv6 ? "Enable" : "Disable");
209914b24e2bSVaishali Kulkarni 	} else {
210014b24e2bSVaishali Kulkarni 		ecore_set_rfs_mode_disable(p_hwfn, p_ptt, p_hwfn->rel_pf_id);
210114b24e2bSVaishali Kulkarni 	}
210214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SP, "Configured ARFS mode : %s\n",
210314b24e2bSVaishali Kulkarni 		   p_cfg_params->arfs_enable ? "Enable" : "Disable");
210414b24e2bSVaishali Kulkarni }
210514b24e2bSVaishali Kulkarni 
210614b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_configure_rfs_ntuple_filter(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_spq_comp_cb * p_cb,dma_addr_t p_addr,u16 length,u16 qid,u8 vport_id,bool b_is_add)210714b24e2bSVaishali Kulkarni ecore_configure_rfs_ntuple_filter(struct ecore_hwfn *p_hwfn,
210814b24e2bSVaishali Kulkarni 				  struct ecore_ptt *p_ptt,
210914b24e2bSVaishali Kulkarni 				  struct ecore_spq_comp_cb *p_cb,
211014b24e2bSVaishali Kulkarni 				  dma_addr_t p_addr, u16 length,
211114b24e2bSVaishali Kulkarni 				  u16 qid, u8 vport_id,
211214b24e2bSVaishali Kulkarni 				  bool b_is_add)
211314b24e2bSVaishali Kulkarni {
211414b24e2bSVaishali Kulkarni 	struct rx_update_gft_filter_data *p_ramrod = OSAL_NULL;
211514b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
211614b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
211714b24e2bSVaishali Kulkarni 	u16 abs_rx_q_id = 0;
211814b24e2bSVaishali Kulkarni 	u8 abs_vport_id = 0;
211914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
212014b24e2bSVaishali Kulkarni 
212114b24e2bSVaishali Kulkarni 	rc = ecore_fw_vport(p_hwfn, vport_id, &abs_vport_id);
212214b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
212314b24e2bSVaishali Kulkarni 		return rc;
212414b24e2bSVaishali Kulkarni 
212514b24e2bSVaishali Kulkarni 	rc = ecore_fw_l2_queue(p_hwfn, qid, &abs_rx_q_id);
212614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
212714b24e2bSVaishali Kulkarni 		return rc;
212814b24e2bSVaishali Kulkarni 
212914b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
213014b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
213114b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
213214b24e2bSVaishali Kulkarni 
213314b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
213414b24e2bSVaishali Kulkarni 
213514b24e2bSVaishali Kulkarni 	if (p_cb) {
213614b24e2bSVaishali Kulkarni 		init_data.comp_mode = ECORE_SPQ_MODE_CB;
213714b24e2bSVaishali Kulkarni 		init_data.p_comp_data = p_cb;
213814b24e2bSVaishali Kulkarni 	} else {
213914b24e2bSVaishali Kulkarni 		init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
214014b24e2bSVaishali Kulkarni 	}
214114b24e2bSVaishali Kulkarni 
214214b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
214314b24e2bSVaishali Kulkarni 				   ETH_RAMROD_GFT_UPDATE_FILTER,
214414b24e2bSVaishali Kulkarni 				   PROTOCOLID_ETH, &init_data);
214514b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
214614b24e2bSVaishali Kulkarni 		return rc;
214714b24e2bSVaishali Kulkarni 
214814b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.rx_update_gft;
214914b24e2bSVaishali Kulkarni 
215014b24e2bSVaishali Kulkarni 	DMA_REGPAIR_LE(p_ramrod->pkt_hdr_addr, p_addr);
215114b24e2bSVaishali Kulkarni 	p_ramrod->pkt_hdr_length = OSAL_CPU_TO_LE16(length);
215214b24e2bSVaishali Kulkarni 	p_ramrod->rx_qid_or_action_icid = OSAL_CPU_TO_LE16(abs_rx_q_id);
215314b24e2bSVaishali Kulkarni 	p_ramrod->vport_id = abs_vport_id;
215414b24e2bSVaishali Kulkarni 	p_ramrod->filter_type = RFS_FILTER_TYPE;
215514b24e2bSVaishali Kulkarni 	p_ramrod->filter_action = b_is_add ? GFT_ADD_FILTER
215614b24e2bSVaishali Kulkarni 					   : GFT_DELETE_FILTER;
215714b24e2bSVaishali Kulkarni 
215814b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
215914b24e2bSVaishali Kulkarni 		   "V[%0x], Q[%04x] - %s filter from 0x%llx [length %04xb]\n",
216014b24e2bSVaishali Kulkarni 		   abs_vport_id, abs_rx_q_id,
216114b24e2bSVaishali Kulkarni 		   b_is_add ? "Adding" : "Removing",
216214b24e2bSVaishali Kulkarni 		   (u64)p_addr, length);
216314b24e2bSVaishali Kulkarni 
216414b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
216514b24e2bSVaishali Kulkarni }
2166