| 606 | } |
| 607 | |
| 608 | static int |
| 609 | ngbe_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; |
nothing calls this directly
no test coverage detected