Lines Matching +full:eth +full:- +full:mac
1 // SPDX-License-Identifier: GPL-2.0-only
17 struct ethhdr eth; member
57 mtk_flow_set_ipv4_addr(struct mtk_eth *eth, struct mtk_foe_entry *foe, in mtk_flow_set_ipv4_addr() argument
60 return mtk_foe_entry_set_ipv4_tuple(eth, foe, egress, in mtk_flow_set_ipv4_addr()
61 data->v4.src_addr, data->src_port, in mtk_flow_set_ipv4_addr()
62 data->v4.dst_addr, data->dst_port); in mtk_flow_set_ipv4_addr()
66 mtk_flow_set_ipv6_addr(struct mtk_eth *eth, struct mtk_foe_entry *foe, in mtk_flow_set_ipv6_addr() argument
69 return mtk_foe_entry_set_ipv6_tuple(eth, foe, in mtk_flow_set_ipv6_addr()
70 data->v6.src_addr.s6_addr32, data->src_port, in mtk_flow_set_ipv6_addr()
71 data->v6.dst_addr.s6_addr32, data->dst_port); in mtk_flow_set_ipv6_addr()
75 mtk_flow_offload_mangle_eth(const struct flow_action_entry *act, void *eth) in mtk_flow_offload_mangle_eth() argument
77 void *dest = eth + act->mangle.offset; in mtk_flow_offload_mangle_eth()
78 const void *src = &act->mangle.val; in mtk_flow_offload_mangle_eth()
80 if (act->mangle.offset > 8) in mtk_flow_offload_mangle_eth()
83 if (act->mangle.mask == 0xffff) { in mtk_flow_offload_mangle_eth()
88 memcpy(dest, src, act->mangle.mask ? 2 : 4); in mtk_flow_offload_mangle_eth()
99 return -ENODEV; in mtk_flow_get_wdma_info()
102 return -1; in mtk_flow_get_wdma_info()
108 path = &stack.path[stack.num_paths - 1]; in mtk_flow_get_wdma_info()
109 if (path->type != DEV_PATH_MTK_WDMA) in mtk_flow_get_wdma_info()
110 return -1; in mtk_flow_get_wdma_info()
112 info->wdma_idx = path->mtk_wdma.wdma_idx; in mtk_flow_get_wdma_info()
113 info->queue = path->mtk_wdma.queue; in mtk_flow_get_wdma_info()
114 info->bss = path->mtk_wdma.bss; in mtk_flow_get_wdma_info()
115 info->wcid = path->mtk_wdma.wcid; in mtk_flow_get_wdma_info()
116 info->amsdu = path->mtk_wdma.amsdu; in mtk_flow_get_wdma_info()
126 u32 val = ntohl(act->mangle.val); in mtk_flow_mangle_ports()
128 switch (act->mangle.offset) { in mtk_flow_mangle_ports()
130 if (act->mangle.mask == ~htonl(0xffff)) in mtk_flow_mangle_ports()
131 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
133 data->src_port = cpu_to_be16(val >> 16); in mtk_flow_mangle_ports()
136 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
139 return -EINVAL; in mtk_flow_mangle_ports()
151 switch (act->mangle.offset) { in mtk_flow_mangle_ipv4()
153 dest = &data->v4.src_addr; in mtk_flow_mangle_ipv4()
156 dest = &data->v4.dst_addr; in mtk_flow_mangle_ipv4()
159 return -EINVAL; in mtk_flow_mangle_ipv4()
162 memcpy(dest, &act->mangle.val, sizeof(u32)); in mtk_flow_mangle_ipv4()
175 return -ENODEV; in mtk_flow_get_dsa_port()
177 if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK) in mtk_flow_get_dsa_port()
178 return -ENODEV; in mtk_flow_get_dsa_port()
182 return dp->index; in mtk_flow_get_dsa_port()
184 return -ENODEV; in mtk_flow_get_dsa_port()
189 mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe, in mtk_flow_set_output_device() argument
197 mtk_foe_entry_set_wdma(eth, foe, info.wdma_idx, info.queue, in mtk_flow_set_output_device()
199 if (mtk_is_netsys_v2_or_greater(eth)) { in mtk_flow_set_output_device()
211 return -EINVAL; in mtk_flow_set_output_device()
222 if (dev == eth->netdev[0]) in mtk_flow_set_output_device()
224 else if (dev == eth->netdev[1]) in mtk_flow_set_output_device()
226 else if (dev == eth->netdev[2]) in mtk_flow_set_output_device()
229 return -EOPNOTSUPP; in mtk_flow_set_output_device()
232 mtk_foe_entry_set_dsa(eth, foe, dsa_port); in mtk_flow_set_output_device()
235 queue = pse_port - 1; in mtk_flow_set_output_device()
237 mtk_foe_entry_set_queue(eth, foe, queue); in mtk_flow_set_output_device()
240 mtk_foe_entry_set_pse_port(eth, foe, pse_port); in mtk_flow_set_output_device()
246 mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, in mtk_flow_offload_replace() argument
256 int wed_index = -1; in mtk_flow_offload_replace()
262 if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) in mtk_flow_offload_replace()
263 return -EEXIST; in mtk_flow_offload_replace()
269 if (mtk_is_netsys_v2_or_greater(eth)) { in mtk_flow_offload_replace()
270 idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex); in mtk_flow_offload_replace()
271 if (idev && idev->netdev_ops == eth->netdev[0]->netdev_ops) { in mtk_flow_offload_replace()
272 struct mtk_mac *mac = netdev_priv(idev); in mtk_flow_offload_replace() local
274 if (WARN_ON(mac->ppe_idx >= eth->soc->ppe_num)) in mtk_flow_offload_replace()
275 return -EINVAL; in mtk_flow_offload_replace()
277 ppe_index = mac->ppe_idx; in mtk_flow_offload_replace()
281 return -EOPNOTSUPP; in mtk_flow_offload_replace()
288 addr_type = match.key->addr_type; in mtk_flow_offload_replace()
290 if (flow_rule_has_control_flags(match.mask->flags, in mtk_flow_offload_replace()
291 f->common.extack)) in mtk_flow_offload_replace()
292 return -EOPNOTSUPP; in mtk_flow_offload_replace()
294 return -EOPNOTSUPP; in mtk_flow_offload_replace()
301 l4proto = match.key->ip_proto; in mtk_flow_offload_replace()
303 return -EOPNOTSUPP; in mtk_flow_offload_replace()
313 memcpy(data.eth.h_dest, match.key->dst, ETH_ALEN); in mtk_flow_offload_replace()
314 memcpy(data.eth.h_source, match.key->src, ETH_ALEN); in mtk_flow_offload_replace()
316 return -EOPNOTSUPP; in mtk_flow_offload_replace()
324 if (match.key->vlan_tpid != cpu_to_be16(ETH_P_8021Q)) in mtk_flow_offload_replace()
325 return -EOPNOTSUPP; in mtk_flow_offload_replace()
327 data.vlan_in = match.key->vlan_id; in mtk_flow_offload_replace()
337 return -EOPNOTSUPP; in mtk_flow_offload_replace()
340 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
341 switch (act->id) { in mtk_flow_offload_replace()
344 return -EOPNOTSUPP; in mtk_flow_offload_replace()
345 if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) in mtk_flow_offload_replace()
346 mtk_flow_offload_mangle_eth(act, &data.eth); in mtk_flow_offload_replace()
349 odev = act->dev; in mtk_flow_offload_replace()
355 act->vlan.proto != htons(ETH_P_8021Q)) in mtk_flow_offload_replace()
356 return -EOPNOTSUPP; in mtk_flow_offload_replace()
358 data.vlan.vlans[data.vlan.num].id = act->vlan.vid; in mtk_flow_offload_replace()
359 data.vlan.vlans[data.vlan.num].proto = act->vlan.proto; in mtk_flow_offload_replace()
367 return -EOPNOTSUPP; in mtk_flow_offload_replace()
369 data.pppoe.sid = act->pppoe.sid; in mtk_flow_offload_replace()
373 return -EOPNOTSUPP; in mtk_flow_offload_replace()
377 if (!is_valid_ether_addr(data.eth.h_source) || in mtk_flow_offload_replace()
378 !is_valid_ether_addr(data.eth.h_dest)) in mtk_flow_offload_replace()
379 return -EINVAL; in mtk_flow_offload_replace()
381 err = mtk_foe_entry_prepare(eth, &foe, offload_type, l4proto, 0, in mtk_flow_offload_replace()
382 data.eth.h_source, data.eth.h_dest); in mtk_flow_offload_replace()
390 return -EOPNOTSUPP; in mtk_flow_offload_replace()
393 data.src_port = ports.key->src; in mtk_flow_offload_replace()
394 data.dst_port = ports.key->dst; in mtk_flow_offload_replace()
396 return -EOPNOTSUPP; in mtk_flow_offload_replace()
404 data.v4.src_addr = addrs.key->src; in mtk_flow_offload_replace()
405 data.v4.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
407 mtk_flow_set_ipv4_addr(eth, &foe, &data, false); in mtk_flow_offload_replace()
415 data.v6.src_addr = addrs.key->src; in mtk_flow_offload_replace()
416 data.v6.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
418 mtk_flow_set_ipv6_addr(eth, &foe, &data); in mtk_flow_offload_replace()
421 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
422 if (act->id != FLOW_ACTION_MANGLE) in mtk_flow_offload_replace()
426 return -EOPNOTSUPP; in mtk_flow_offload_replace()
428 switch (act->mangle.htype) { in mtk_flow_offload_replace()
440 return -EOPNOTSUPP; in mtk_flow_offload_replace()
448 err = mtk_flow_set_ipv4_addr(eth, &foe, &data, true); in mtk_flow_offload_replace()
457 mtk_foe_entry_set_vlan(eth, &foe, data.vlan.vlans[i].id); in mtk_flow_offload_replace()
460 mtk_foe_entry_set_pppoe(eth, &foe, data.pppoe.sid); in mtk_flow_offload_replace()
462 err = mtk_flow_set_output_device(eth, &foe, odev, data.eth.h_dest, in mtk_flow_offload_replace()
472 return -ENOMEM; in mtk_flow_offload_replace()
474 entry->cookie = f->cookie; in mtk_flow_offload_replace()
475 memcpy(&entry->data, &foe, sizeof(entry->data)); in mtk_flow_offload_replace()
476 entry->wed_index = wed_index; in mtk_flow_offload_replace()
477 entry->ppe_index = ppe_index; in mtk_flow_offload_replace()
479 err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
483 err = rhashtable_insert_fast(ð->flow_table, &entry->node, in mtk_flow_offload_replace()
491 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
500 mtk_flow_offload_destroy(struct mtk_eth *eth, struct flow_cls_offload *f) in mtk_flow_offload_destroy() argument
504 entry = rhashtable_lookup(ð->flow_table, &f->cookie, in mtk_flow_offload_destroy()
507 return -ENOENT; in mtk_flow_offload_destroy()
509 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_destroy()
510 rhashtable_remove_fast(ð->flow_table, &entry->node, in mtk_flow_offload_destroy()
512 if (entry->wed_index >= 0) in mtk_flow_offload_destroy()
513 mtk_wed_flow_remove(entry->wed_index); in mtk_flow_offload_destroy()
520 mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) in mtk_flow_offload_stats() argument
526 entry = rhashtable_lookup(ð->flow_table, &f->cookie, in mtk_flow_offload_stats()
529 return -ENOENT; in mtk_flow_offload_stats()
531 idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_stats()
532 f->stats.lastused = jiffies - idle * HZ; in mtk_flow_offload_stats()
534 if (entry->hash != 0xFFFF && in mtk_flow_offload_stats()
535 mtk_foe_entry_get_mib(eth->ppe[entry->ppe_index], entry->hash, in mtk_flow_offload_stats()
537 f->stats.pkts += diff.packets; in mtk_flow_offload_stats()
538 f->stats.bytes += diff.bytes; in mtk_flow_offload_stats()
546 int mtk_flow_offload_cmd(struct mtk_eth *eth, struct flow_cls_offload *cls, in mtk_flow_offload_cmd() argument
552 switch (cls->command) { in mtk_flow_offload_cmd()
554 err = mtk_flow_offload_replace(eth, cls, ppe_index); in mtk_flow_offload_cmd()
557 err = mtk_flow_offload_destroy(eth, cls); in mtk_flow_offload_cmd()
560 err = mtk_flow_offload_stats(eth, cls); in mtk_flow_offload_cmd()
563 err = -EOPNOTSUPP; in mtk_flow_offload_cmd()
576 struct mtk_mac *mac; in mtk_eth_setup_tc_block_cb() local
577 struct mtk_eth *eth; in mtk_eth_setup_tc_block_cb() local
579 mac = netdev_priv(dev); in mtk_eth_setup_tc_block_cb()
580 eth = mac->hw; in mtk_eth_setup_tc_block_cb()
583 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
586 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
588 return mtk_flow_offload_cmd(eth, cls, 0); in mtk_eth_setup_tc_block_cb()
594 struct mtk_mac *mac = netdev_priv(dev); in mtk_eth_setup_tc_block() local
595 struct mtk_eth *eth = mac->hw; in mtk_eth_setup_tc_block() local
600 if (!eth->soc->offload_version) in mtk_eth_setup_tc_block()
601 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
603 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in mtk_eth_setup_tc_block()
604 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
607 f->driver_block_list = &block_cb_list; in mtk_eth_setup_tc_block()
609 switch (f->command) { in mtk_eth_setup_tc_block()
611 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
622 list_add_tail(&block_cb->driver_list, &block_cb_list); in mtk_eth_setup_tc_block()
625 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
627 return -ENOENT; in mtk_eth_setup_tc_block()
631 list_del(&block_cb->driver_list); in mtk_eth_setup_tc_block()
635 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
647 return -EOPNOTSUPP; in mtk_eth_setup_tc()
651 int mtk_eth_offload_init(struct mtk_eth *eth, u8 id) in mtk_eth_offload_init() argument
653 if (!eth->ppe[id] || !eth->ppe[id]->foe_table) in mtk_eth_offload_init()
655 return rhashtable_init(ð->flow_table, &mtk_flow_ht_params); in mtk_eth_offload_init()