brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · 80d853b Raw
210 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Marvell RVU Ethernet driver3 *4 * Copyright (C) 2021 Marvell.5 *6 */7 8#include "otx2_common.h"9 10static int otx2_dmacflt_do_add(struct otx2_nic *pf, const u8 *mac,11			       u32 *dmac_index)12{13	struct cgx_mac_addr_add_req *req;14	struct cgx_mac_addr_add_rsp *rsp;15	int err;16 17	mutex_lock(&pf->mbox.lock);18 19	req = otx2_mbox_alloc_msg_cgx_mac_addr_add(&pf->mbox);20	if (!req) {21		mutex_unlock(&pf->mbox.lock);22		return -ENOMEM;23	}24 25	ether_addr_copy(req->mac_addr, mac);26	err = otx2_sync_mbox_msg(&pf->mbox);27 28	if (!err) {29		rsp = (struct cgx_mac_addr_add_rsp *)30			 otx2_mbox_get_rsp(&pf->mbox.mbox, 0, &req->hdr);31		*dmac_index = rsp->index;32	}33 34	mutex_unlock(&pf->mbox.lock);35	return err;36}37 38static int otx2_dmacflt_add_pfmac(struct otx2_nic *pf, u32 *dmac_index)39{40	struct cgx_mac_addr_set_or_get *req;41	struct cgx_mac_addr_set_or_get *rsp;42	int err;43 44	mutex_lock(&pf->mbox.lock);45 46	req = otx2_mbox_alloc_msg_cgx_mac_addr_set(&pf->mbox);47	if (!req) {48		mutex_unlock(&pf->mbox.lock);49		return -ENOMEM;50	}51 52	req->index = *dmac_index;53 54	ether_addr_copy(req->mac_addr, pf->netdev->dev_addr);55	err = otx2_sync_mbox_msg(&pf->mbox);56 57	if (err)58		goto out;59 60	rsp = (struct cgx_mac_addr_set_or_get *)61		otx2_mbox_get_rsp(&pf->mbox.mbox, 0, &req->hdr);62 63	if (IS_ERR_OR_NULL(rsp)) {64		err = -EINVAL;65		goto out;66	}67 68	*dmac_index = rsp->index;69out:70	mutex_unlock(&pf->mbox.lock);71	return err;72}73 74int otx2_dmacflt_add(struct otx2_nic *pf, const u8 *mac, u32 bit_pos)75{76	u32 *dmacindex;77 78	/* Store dmacindex returned by CGX/RPM driver which will79	 * be used for macaddr update/remove80	 */81	dmacindex = &pf->flow_cfg->bmap_to_dmacindex[bit_pos];82 83	if (ether_addr_equal(mac, pf->netdev->dev_addr))84		return otx2_dmacflt_add_pfmac(pf, dmacindex);85	else86		return otx2_dmacflt_do_add(pf, mac, dmacindex);87}88 89static int otx2_dmacflt_do_remove(struct otx2_nic *pfvf, const u8 *mac,90				  u32 dmac_index)91{92	struct cgx_mac_addr_del_req *req;93	int err;94 95	mutex_lock(&pfvf->mbox.lock);96	req = otx2_mbox_alloc_msg_cgx_mac_addr_del(&pfvf->mbox);97	if (!req) {98		mutex_unlock(&pfvf->mbox.lock);99		return -ENOMEM;100	}101 102	req->index = dmac_index;103 104	err = otx2_sync_mbox_msg(&pfvf->mbox);105	mutex_unlock(&pfvf->mbox.lock);106 107	return err;108}109 110static int otx2_dmacflt_remove_pfmac(struct otx2_nic *pf, u32 dmac_index)111{112	struct cgx_mac_addr_reset_req *req;113	int err;114 115	mutex_lock(&pf->mbox.lock);116	req = otx2_mbox_alloc_msg_cgx_mac_addr_reset(&pf->mbox);117	if (!req) {118		mutex_unlock(&pf->mbox.lock);119		return -ENOMEM;120	}121	req->index = dmac_index;122 123	err = otx2_sync_mbox_msg(&pf->mbox);124 125	mutex_unlock(&pf->mbox.lock);126	return err;127}128 129int otx2_dmacflt_remove(struct otx2_nic *pf, const u8 *mac,130			u32 bit_pos)131{132	u32 dmacindex = pf->flow_cfg->bmap_to_dmacindex[bit_pos];133 134	if (ether_addr_equal(mac, pf->netdev->dev_addr))135		return otx2_dmacflt_remove_pfmac(pf, dmacindex);136	else137		return otx2_dmacflt_do_remove(pf, mac, dmacindex);138}139 140/* CGX/RPM blocks support max unicast entries of 32.141 * on typical configuration MAC block associated142 * with 4 lmacs, each lmac will have 8 dmac entries143 */144int otx2_dmacflt_get_max_cnt(struct otx2_nic *pf)145{146	struct cgx_max_dmac_entries_get_rsp *rsp;147	struct msg_req *msg;148	int err;149 150	mutex_lock(&pf->mbox.lock);151	msg = otx2_mbox_alloc_msg_cgx_mac_max_entries_get(&pf->mbox);152 153	if (!msg) {154		mutex_unlock(&pf->mbox.lock);155		return -ENOMEM;156	}157 158	err = otx2_sync_mbox_msg(&pf->mbox);159	if (err)160		goto out;161 162	rsp = (struct cgx_max_dmac_entries_get_rsp *)163		     otx2_mbox_get_rsp(&pf->mbox.mbox, 0, &msg->hdr);164 165	if (IS_ERR_OR_NULL(rsp)) {166		err = -EINVAL;167		goto out;168	}169 170	pf->flow_cfg->dmacflt_max_flows = rsp->max_dmac_filters;171 172out:173	mutex_unlock(&pf->mbox.lock);174	return err;175}176 177int otx2_dmacflt_update(struct otx2_nic *pf, u8 *mac, u32 bit_pos)178{179	struct cgx_mac_addr_update_req *req;180	struct cgx_mac_addr_update_rsp *rsp;181	int rc;182 183	mutex_lock(&pf->mbox.lock);184 185	req = otx2_mbox_alloc_msg_cgx_mac_addr_update(&pf->mbox);186 187	if (!req) {188		mutex_unlock(&pf->mbox.lock);189		return -ENOMEM;190	}191 192	ether_addr_copy(req->mac_addr, mac);193	req->index = pf->flow_cfg->bmap_to_dmacindex[bit_pos];194 195	/* check the response and change index */196 197	rc = otx2_sync_mbox_msg(&pf->mbox);198	if (rc)199		goto out;200 201	rsp = (struct cgx_mac_addr_update_rsp *)202		otx2_mbox_get_rsp(&pf->mbox.mbox, 0, &req->hdr);203 204	pf->flow_cfg->bmap_to_dmacindex[bit_pos] = rsp->index;205 206out:207	mutex_unlock(&pf->mbox.lock);208	return rc;209}210