MCPcopy Create free account
hub / github.com/F-Stack/f-stack / ngbe_vlan_tpid_set

Function ngbe_vlan_tpid_set

dpdk/drivers/net/ngbe/ngbe_ethdev.c:608–669  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

606}
607
608static int
609ngbe_vlan_tpid_set(struct rte_eth_dev *dev,
610 enum rte_vlan_type vlan_type,
611 uint16_t tpid)
612{
613 struct ngbe_hw *hw = ngbe_dev_hw(dev);
614 int ret = 0;
615 uint32_t portctrl, vlan_ext, qinq;
616
617 portctrl = rd32(hw, NGBE_PORTCTL);
618
619 vlan_ext = (portctrl & NGBE_PORTCTL_VLANEXT);
620 qinq = vlan_ext && (portctrl & NGBE_PORTCTL_QINQ);
621 switch (vlan_type) {
622 case RTE_ETH_VLAN_TYPE_INNER:
623 if (vlan_ext) {
624 wr32m(hw, NGBE_VLANCTL,
625 NGBE_VLANCTL_TPID_MASK,
626 NGBE_VLANCTL_TPID(tpid));
627 wr32m(hw, NGBE_DMATXCTRL,
628 NGBE_DMATXCTRL_TPID_MASK,
629 NGBE_DMATXCTRL_TPID(tpid));
630 } else {
631 ret = -ENOTSUP;
632 PMD_DRV_LOG(ERR,
633 "Inner type is not supported by single VLAN");
634 }
635
636 if (qinq) {
637 wr32m(hw, NGBE_TAGTPID(0),
638 NGBE_TAGTPID_LSB_MASK,
639 NGBE_TAGTPID_LSB(tpid));
640 }
641 break;
642 case RTE_ETH_VLAN_TYPE_OUTER:
643 if (vlan_ext) {
644 /* Only the high 16-bits is valid */
645 wr32m(hw, NGBE_EXTAG,
646 NGBE_EXTAG_VLAN_MASK,
647 NGBE_EXTAG_VLAN(tpid));
648 } else {
649 wr32m(hw, NGBE_VLANCTL,
650 NGBE_VLANCTL_TPID_MASK,
651 NGBE_VLANCTL_TPID(tpid));
652 wr32m(hw, NGBE_DMATXCTRL,
653 NGBE_DMATXCTRL_TPID_MASK,
654 NGBE_DMATXCTRL_TPID(tpid));
655 }
656
657 if (qinq) {
658 wr32m(hw, NGBE_TAGTPID(0),
659 NGBE_TAGTPID_MSB_MASK,
660 NGBE_TAGTPID_MSB(tpid));
661 }
662 break;
663 default:
664 PMD_DRV_LOG(ERR, "Unsupported VLAN type %d", vlan_type);
665 return -EINVAL;

Callers

nothing calls this directly

Calls 3

ngbe_dev_hwFunction · 0.85
rd32Function · 0.50
wr32mFunction · 0.50

Tested by

no test coverage detected