| 250 | } |
| 251 | |
| 252 | static int |
| 253 | ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr) |
| 254 | { |
| 255 | struct ionic_admin_ctx ctx = { |
| 256 | .pending_work = true, |
| 257 | .cmd.rx_filter_del = { |
| 258 | .opcode = IONIC_CMD_RX_FILTER_DEL, |
| 259 | }, |
| 260 | }; |
| 261 | struct ionic_rx_filter *f; |
| 262 | int err; |
| 263 | |
| 264 | IONIC_PRINT_CALL(); |
| 265 | |
| 266 | rte_spinlock_lock(&lif->rx_filters.lock); |
| 267 | |
| 268 | f = ionic_rx_filter_by_addr(lif, addr); |
| 269 | if (!f) { |
| 270 | rte_spinlock_unlock(&lif->rx_filters.lock); |
| 271 | return -ENOENT; |
| 272 | } |
| 273 | |
| 274 | ctx.cmd.rx_filter_del.filter_id = rte_cpu_to_le_32(f->filter_id); |
| 275 | ionic_rx_filter_free(f); |
| 276 | |
| 277 | rte_spinlock_unlock(&lif->rx_filters.lock); |
| 278 | |
| 279 | err = ionic_adminq_post_wait(lif, &ctx); |
| 280 | if (err) |
| 281 | return err; |
| 282 | |
| 283 | IONIC_PRINT(INFO, "rx_filter del (id %d)", |
| 284 | rte_le_to_cpu_32(ctx.cmd.rx_filter_del.filter_id)); |
| 285 | |
| 286 | return 0; |
| 287 | } |
| 288 | |
| 289 | int |
| 290 | ionic_dev_add_mac(struct rte_eth_dev *eth_dev, |
no test coverage detected