Lines Matching refs:sparx5
24 static u64 sparx5_mirror_port_get(struct sparx5 *sparx5, u32 idx)
28 val = spx5_rd(sparx5, ANA_AC_PROBE_PORT_CFG(idx));
30 if (is_sparx5(sparx5))
31 val |= (u64)spx5_rd(sparx5, ANA_AC_PROBE_PORT_CFG1(idx)) << 32;
37 static void sparx5_mirror_port_add(struct sparx5 *sparx5, u32 idx, u32 portno)
45 return spx5_rmw(val, val, sparx5, ANA_AC_PROBE_PORT_CFG(idx));
47 return spx5_rmw(val, val, sparx5, ANA_AC_PROBE_PORT_CFG1(idx));
51 static void sparx5_mirror_port_del(struct sparx5 *sparx5, u32 idx, u32 portno)
59 return spx5_rmw(0, val, sparx5, ANA_AC_PROBE_PORT_CFG(idx));
61 return spx5_rmw(0, val, sparx5, ANA_AC_PROBE_PORT_CFG1(idx));
65 static bool sparx5_mirror_contains(struct sparx5 *sparx5, u32 idx, u32 portno)
67 return (sparx5_mirror_port_get(sparx5, idx) & BIT_ULL(portno)) != 0;
71 static bool sparx5_mirror_is_empty(struct sparx5 *sparx5, u32 idx)
73 return sparx5_mirror_port_get(sparx5, idx) == 0;
77 static u32 sparx5_mirror_dir_get(struct sparx5 *sparx5, u32 idx)
79 u32 val = spx5_rd(sparx5, ANA_AC_PROBE_CFG(idx));
85 static void sparx5_mirror_dir_set(struct sparx5 *sparx5, u32 idx, u32 dir)
88 ANA_AC_PROBE_CFG_PROBE_DIRECTION, sparx5,
93 static void sparx5_mirror_monitor_set(struct sparx5 *sparx5, u32 idx,
97 QFWD_FRAME_COPY_CFG_FRMC_PORT_VAL, sparx5,
102 static u32 sparx5_mirror_monitor_get(struct sparx5 *sparx5, u32 idx)
104 u32 val = spx5_rd(sparx5,
111 static bool sparx5_mirror_has_monitor(struct sparx5 *sparx5, u32 idx,
114 return sparx5_mirror_monitor_get(sparx5, idx) == portno;
121 struct sparx5 *sparx5 = sport->sparx5;
126 if (sparx5_mirror_has_monitor(sparx5, i, sport->portno))
133 if (sparx5_mirror_dir_get(sparx5, i) == dir &&
134 sparx5_mirror_has_monitor(sparx5, i, mport->portno)) {
142 if (sparx5_mirror_is_empty(sparx5, i)) {
155 struct sparx5 *sparx5;
162 sparx5 = sport->sparx5;
171 if (sparx5_mirror_contains(sparx5, mirror_idx, sport->portno))
175 sparx5_mirror_port_add(sparx5, mirror_idx, sport->portno);
178 sparx5_mirror_dir_set(sparx5, mirror_idx, dir);
181 sparx5_mirror_monitor_set(sparx5, mirror_idx, mport->portno);
191 struct sparx5 *sparx5 = port->sparx5;
194 sparx5_mirror_port_del(sparx5, mirror_idx, port->portno);
195 if (!sparx5_mirror_is_empty(sparx5, mirror_idx))
198 sparx5_mirror_dir_set(sparx5, mirror_idx, SPX5_MIRROR_DISABLED);
200 sparx5_mirror_monitor_set(sparx5,
202 sparx5->data->consts->n_ports);