#include "base/t4_tcb.h"
#include "base/t4_regs.h"
#include "cxgbe_filter.h"
+#include "mps_tcam.h"
#include "clip_tbl.h"
#include "l2t.h"
#include "smt.h"
*/
static void clear_filter(struct filter_entry *f)
{
+ struct port_info *pi = ethdev2pinfo(f->dev);
+
if (f->clipt)
cxgbe_clip_release(f->dev, f->clipt);
if (f->l2t)
cxgbe_l2t_release(f->l2t);
+ if (f->fs.mask.macidx)
+ cxgbe_mpstcam_remove(pi, f->fs.val.macidx);
+
/* The zeroing of the filter rule below clears the filter valid,
* pending, locked flags etc. so it's all we need for
* this operation.
f->dev = dev;
f->fs.iq = iq;
+ /* Allocate MPS TCAM entry to match Destination MAC. */
+ if (f->fs.mask.macidx) {
+ int idx;
+
+ idx = cxgbe_mpstcam_alloc(pi, f->fs.val.dmac, f->fs.mask.dmac);
+ if (idx <= 0) {
+ ret = -ENOMEM;
+ goto out_err;
+ }
+
+ f->fs.val.macidx = idx;
+ }
+
/*
* If the new filter requires loopback Destination MAC and/or VLAN
* rewriting then we need to allocate a Layer 2 Table (L2T) entry for
f->fs.iq = iq;
f->dev = dev;
+ /* Allocate MPS TCAM entry to match Destination MAC. */
+ if (f->fs.mask.macidx) {
+ int idx;
+
+ idx = cxgbe_mpstcam_alloc(pi, f->fs.val.dmac, f->fs.mask.dmac);
+ if (idx <= 0) {
+ ret = -ENOMEM;
+ goto free_tid;
+ }
+
+ f->fs.val.macidx = idx;
+ }
+
/* Allocate a clip table entry only if we have non-zero IPv6 address. */
if (chip_ver > CHELSIO_T5 && f->fs.type &&
memcmp(f->fs.val.lip, bitoff, sizeof(bitoff))) {
"src mac filtering not supported");
if (!rte_is_zero_ether_addr(&mask->dst)) {
- const u8 *addr = (const u8 *)&spec->dst.addr_bytes[0];
- const u8 *m = (const u8 *)&mask->dst.addr_bytes[0];
- struct rte_flow *flow = (struct rte_flow *)fs->private;
- struct port_info *pi = (struct port_info *)
- (flow->dev->data->dev_private);
- int idx;
-
- idx = cxgbe_mpstcam_alloc(pi, addr, m);
- if (idx <= 0)
- return rte_flow_error_set(e, idx,
- RTE_FLOW_ERROR_TYPE_ITEM,
- NULL, "unable to allocate mac"
- " entry in h/w");
- CXGBE_FILL_FS(idx, 0x1ff, macidx);
+ CXGBE_FILL_FS(0, 0x1ff, macidx);
+ CXGBE_FILL_FS_MEMCPY(spec->dst.addr_bytes, mask->dst.addr_bytes,
+ dmac);
}
CXGBE_FILL_FS(be16_to_cpu(spec->type),
return ctx.result;
}
- fs = &flow->fs;
- if (fs->mask.macidx) {
- struct port_info *pi = (struct port_info *)
- (dev->data->dev_private);
- int ret;
-
- ret = cxgbe_mpstcam_remove(pi, fs->val.macidx);
- if (!ret)
- return ret;
- }
-
return 0;
}