|
42 | 42 | #define NSP_ETH_STATE_ANEG GENMASK_ULL(25, 23)
|
43 | 43 | #define NSP_ETH_STATE_FEC GENMASK_ULL(27, 26)
|
44 | 44 | #define NSP_ETH_STATE_ACT_FEC GENMASK_ULL(29, 28)
|
| 45 | +#define NSP_ETH_STATE_TX_PAUSE BIT_ULL(31) |
| 46 | +#define NSP_ETH_STATE_RX_PAUSE BIT_ULL(32) |
45 | 47 |
|
46 | 48 | #define NSP_ETH_CTRL_CONFIGURED BIT_ULL(0)
|
47 | 49 | #define NSP_ETH_CTRL_ENABLED BIT_ULL(1)
|
|
52 | 54 | #define NSP_ETH_CTRL_SET_ANEG BIT_ULL(6)
|
53 | 55 | #define NSP_ETH_CTRL_SET_FEC BIT_ULL(7)
|
54 | 56 | #define NSP_ETH_CTRL_SET_IDMODE BIT_ULL(8)
|
| 57 | +#define NSP_ETH_CTRL_SET_TX_PAUSE BIT_ULL(10) |
| 58 | +#define NSP_ETH_CTRL_SET_RX_PAUSE BIT_ULL(11) |
55 | 59 |
|
56 | 60 | enum nfp_eth_raw {
|
57 | 61 | NSP_ETH_RAW_PORT = 0,
|
@@ -180,6 +184,15 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
|
180 | 184 |
|
181 | 185 | dst->act_fec = FIELD_GET(NSP_ETH_STATE_ACT_FEC, state);
|
182 | 186 | dst->supp_aneg = FIELD_GET(NSP_ETH_PORT_SUPP_ANEG, port);
|
| 187 | + |
| 188 | + if (nfp_nsp_get_abi_ver_minor(nsp) < 37) { |
| 189 | + dst->tx_pause = true; |
| 190 | + dst->rx_pause = true; |
| 191 | + return; |
| 192 | + } |
| 193 | + |
| 194 | + dst->tx_pause = FIELD_GET(NSP_ETH_STATE_TX_PAUSE, state); |
| 195 | + dst->rx_pause = FIELD_GET(NSP_ETH_STATE_RX_PAUSE, state); |
183 | 196 | }
|
184 | 197 |
|
185 | 198 | static void
|
@@ -497,7 +510,7 @@ int nfp_eth_set_configured(struct nfp_cpp *cpp, unsigned int idx, bool configed)
|
497 | 510 | static int
|
498 | 511 | nfp_eth_set_bit_config(struct nfp_nsp *nsp, unsigned int raw_idx,
|
499 | 512 | const u64 mask, const unsigned int shift,
|
500 |
| - unsigned int val, const u64 ctrl_bit) |
| 513 | + u64 val, const u64 ctrl_bit) |
501 | 514 | {
|
502 | 515 | union eth_table_entry *entries = nfp_nsp_config_entries(nsp);
|
503 | 516 | unsigned int idx = nfp_nsp_config_idx(nsp);
|
@@ -629,6 +642,81 @@ nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode)
|
629 | 642 | return nfp_eth_config_commit_end(nsp);
|
630 | 643 | }
|
631 | 644 |
|
| 645 | +/** |
| 646 | + * __nfp_eth_set_txpause() - set tx pause control bit |
| 647 | + * @nsp: NFP NSP handle returned from nfp_eth_config_start() |
| 648 | + * @tx_pause: TX pause switch |
| 649 | + * |
| 650 | + * Set TX pause switch. |
| 651 | + * |
| 652 | + * Return: 0 or -ERRNO. |
| 653 | + */ |
| 654 | +static int __nfp_eth_set_txpause(struct nfp_nsp *nsp, unsigned int tx_pause) |
| 655 | +{ |
| 656 | + return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_STATE, NSP_ETH_STATE_TX_PAUSE, |
| 657 | + tx_pause, NSP_ETH_CTRL_SET_TX_PAUSE); |
| 658 | +} |
| 659 | + |
| 660 | +/** |
| 661 | + * __nfp_eth_set_rxpause() - set rx pause control bit |
| 662 | + * @nsp: NFP NSP handle returned from nfp_eth_config_start() |
| 663 | + * @rx_pause: RX pause switch |
| 664 | + * |
| 665 | + * Set RX pause switch. |
| 666 | + * |
| 667 | + * Return: 0 or -ERRNO. |
| 668 | + */ |
| 669 | +static int __nfp_eth_set_rxpause(struct nfp_nsp *nsp, unsigned int rx_pause) |
| 670 | +{ |
| 671 | + return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_STATE, NSP_ETH_STATE_RX_PAUSE, |
| 672 | + rx_pause, NSP_ETH_CTRL_SET_RX_PAUSE); |
| 673 | +} |
| 674 | + |
| 675 | +/** |
| 676 | + * nfp_eth_set_pauseparam() - Set TX/RX pause switch. |
| 677 | + * @cpp: NFP CPP handle |
| 678 | + * @idx: NFP chip-wide port index |
| 679 | + * @tx_pause: TX pause switch |
| 680 | + * @rx_pause: RX pause switch |
| 681 | + * |
| 682 | + * Return: |
| 683 | + * 0 - configuration successful; |
| 684 | + * 1 - no changes were needed; |
| 685 | + * -ERRNO - configuration failed. |
| 686 | + */ |
| 687 | +int |
| 688 | +nfp_eth_set_pauseparam(struct nfp_cpp *cpp, unsigned int idx, |
| 689 | + unsigned int tx_pause, unsigned int rx_pause) |
| 690 | +{ |
| 691 | + struct nfp_nsp *nsp; |
| 692 | + int err; |
| 693 | + |
| 694 | + nsp = nfp_eth_config_start(cpp, idx); |
| 695 | + if (IS_ERR(nsp)) |
| 696 | + return PTR_ERR(nsp); |
| 697 | + |
| 698 | + if (nfp_nsp_get_abi_ver_minor(nsp) < 37) { |
| 699 | + nfp_err(nfp_nsp_cpp(nsp), |
| 700 | + "set pause parameter operation not supported, please update flash\n"); |
| 701 | + nfp_eth_config_cleanup_end(nsp); |
| 702 | + return -EOPNOTSUPP; |
| 703 | + } |
| 704 | + |
| 705 | + err = __nfp_eth_set_txpause(nsp, tx_pause); |
| 706 | + if (err) { |
| 707 | + nfp_eth_config_cleanup_end(nsp); |
| 708 | + return err; |
| 709 | + } |
| 710 | + |
| 711 | + err = __nfp_eth_set_rxpause(nsp, rx_pause); |
| 712 | + if (err) { |
| 713 | + nfp_eth_config_cleanup_end(nsp); |
| 714 | + return err; |
| 715 | + } |
| 716 | + |
| 717 | + return nfp_eth_config_commit_end(nsp); |
| 718 | +} |
| 719 | + |
632 | 720 | /**
|
633 | 721 | * __nfp_eth_set_speed() - set interface speed/rate
|
634 | 722 | * @nsp: NFP NSP handle returned from nfp_eth_config_start()
|
|
0 commit comments