|
55 | 55 | #define NSP_ETH_PORT_INDEX GENMASK_ULL(15, 8)
|
56 | 56 | #define NSP_ETH_PORT_LABEL GENMASK_ULL(53, 48)
|
57 | 57 | #define NSP_ETH_PORT_PHYLABEL GENMASK_ULL(59, 54)
|
| 58 | +#define NSP_ETH_PORT_FEC_SUPP_BASER BIT_ULL(60) |
| 59 | +#define NSP_ETH_PORT_FEC_SUPP_RS BIT_ULL(61) |
58 | 60 |
|
59 | 61 | #define NSP_ETH_PORT_LANES_MASK cpu_to_le64(NSP_ETH_PORT_LANES)
|
60 | 62 |
|
|
67 | 69 | #define NSP_ETH_STATE_MEDIA GENMASK_ULL(21, 20)
|
68 | 70 | #define NSP_ETH_STATE_OVRD_CHNG BIT_ULL(22)
|
69 | 71 | #define NSP_ETH_STATE_ANEG GENMASK_ULL(25, 23)
|
| 72 | +#define NSP_ETH_STATE_FEC GENMASK_ULL(27, 26) |
70 | 73 |
|
71 | 74 | #define NSP_ETH_CTRL_CONFIGURED BIT_ULL(0)
|
72 | 75 | #define NSP_ETH_CTRL_ENABLED BIT_ULL(1)
|
|
75 | 78 | #define NSP_ETH_CTRL_SET_RATE BIT_ULL(4)
|
76 | 79 | #define NSP_ETH_CTRL_SET_LANES BIT_ULL(5)
|
77 | 80 | #define NSP_ETH_CTRL_SET_ANEG BIT_ULL(6)
|
| 81 | +#define NSP_ETH_CTRL_SET_FEC BIT_ULL(7) |
78 | 82 |
|
79 | 83 | enum nfp_eth_raw {
|
80 | 84 | NSP_ETH_RAW_PORT = 0,
|
@@ -152,6 +156,7 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
|
152 | 156 | unsigned int index, struct nfp_eth_table_port *dst)
|
153 | 157 | {
|
154 | 158 | unsigned int rate;
|
| 159 | + unsigned int fec; |
155 | 160 | u64 port, state;
|
156 | 161 |
|
157 | 162 | port = le64_to_cpu(src->port);
|
@@ -183,6 +188,18 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
|
183 | 188 |
|
184 | 189 | dst->override_changed = FIELD_GET(NSP_ETH_STATE_OVRD_CHNG, state);
|
185 | 190 | dst->aneg = FIELD_GET(NSP_ETH_STATE_ANEG, state);
|
| 191 | + |
| 192 | + if (nfp_nsp_get_abi_ver_minor(nsp) < 22) |
| 193 | + return; |
| 194 | + |
| 195 | + fec = FIELD_GET(NSP_ETH_PORT_FEC_SUPP_BASER, port); |
| 196 | + dst->fec_modes_supported |= fec << NFP_FEC_BASER_BIT; |
| 197 | + fec = FIELD_GET(NSP_ETH_PORT_FEC_SUPP_RS, port); |
| 198 | + dst->fec_modes_supported |= fec << NFP_FEC_REED_SOLOMON_BIT; |
| 199 | + if (dst->fec_modes_supported) |
| 200 | + dst->fec_modes_supported |= NFP_FEC_AUTO | NFP_FEC_DISABLED; |
| 201 | + |
| 202 | + dst->fec = 1 << FIELD_GET(NSP_ETH_STATE_FEC, state); |
186 | 203 | }
|
187 | 204 |
|
188 | 205 | static void
|
@@ -527,6 +544,53 @@ int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode)
|
527 | 544 | NSP_ETH_CTRL_SET_ANEG);
|
528 | 545 | }
|
529 | 546 |
|
| 547 | +/** |
| 548 | + * __nfp_eth_set_fec() - set PHY forward error correction control bit |
| 549 | + * @nsp: NFP NSP handle returned from nfp_eth_config_start() |
| 550 | + * @mode: Desired fec mode |
| 551 | + * |
| 552 | + * Set the PHY module forward error correction mode. |
| 553 | + * Will write to hwinfo overrides in the flash (persistent config). |
| 554 | + * |
| 555 | + * Return: 0 or -ERRNO. |
| 556 | + */ |
| 557 | +static int __nfp_eth_set_fec(struct nfp_nsp *nsp, enum nfp_eth_fec mode) |
| 558 | +{ |
| 559 | + return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_STATE, |
| 560 | + NSP_ETH_STATE_FEC, mode, |
| 561 | + NSP_ETH_CTRL_SET_FEC); |
| 562 | +} |
| 563 | + |
| 564 | +/** |
| 565 | + * nfp_eth_set_fec() - set PHY forward error correction control mode |
| 566 | + * @cpp: NFP CPP handle |
| 567 | + * @idx: NFP chip-wide port index |
| 568 | + * @mode: Desired fec mode |
| 569 | + * |
| 570 | + * Return: |
| 571 | + * 0 - configuration successful; |
| 572 | + * 1 - no changes were needed; |
| 573 | + * -ERRNO - configuration failed. |
| 574 | + */ |
| 575 | +int |
| 576 | +nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode) |
| 577 | +{ |
| 578 | + struct nfp_nsp *nsp; |
| 579 | + int err; |
| 580 | + |
| 581 | + nsp = nfp_eth_config_start(cpp, idx); |
| 582 | + if (IS_ERR(nsp)) |
| 583 | + return PTR_ERR(nsp); |
| 584 | + |
| 585 | + err = __nfp_eth_set_fec(nsp, mode); |
| 586 | + if (err) { |
| 587 | + nfp_eth_config_cleanup_end(nsp); |
| 588 | + return err; |
| 589 | + } |
| 590 | + |
| 591 | + return nfp_eth_config_commit_end(nsp); |
| 592 | +} |
| 593 | + |
530 | 594 | /**
|
531 | 595 | * __nfp_eth_set_speed() - set interface speed/rate
|
532 | 596 | * @nsp: NFP NSP handle returned from nfp_eth_config_start()
|
|
0 commit comments