Skip to content

Commit b471232

Browse files
Dirk van der Merwedavem330
authored andcommitted
nfp: add helpers for FEC support
Implement helpers to determine and modify FEC modes via the NSP. The NSP advertises FEC capabilities on a per port basis and provides support for: * Auto mode selection * Reed Solomon * BaseR * None/Off Signed-off-by: Dirk van der Merwe <[email protected]> Signed-off-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a564d30 commit b471232

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ enum nfp_eth_aneg {
7979
NFP_ANEG_DISABLED,
8080
};
8181

82+
enum nfp_eth_fec {
83+
NFP_FEC_AUTO_BIT = 0,
84+
NFP_FEC_BASER_BIT,
85+
NFP_FEC_REED_SOLOMON_BIT,
86+
NFP_FEC_DISABLED_BIT,
87+
};
88+
89+
#define NFP_FEC_AUTO BIT(NFP_FEC_AUTO_BIT)
90+
#define NFP_FEC_BASER BIT(NFP_FEC_BASER_BIT)
91+
#define NFP_FEC_REED_SOLOMON BIT(NFP_FEC_REED_SOLOMON_BIT)
92+
#define NFP_FEC_DISABLED BIT(NFP_FEC_DISABLED_BIT)
93+
8294
/**
8395
* struct nfp_eth_table - ETH table information
8496
* @count: number of table entries
@@ -93,6 +105,7 @@ enum nfp_eth_aneg {
93105
* @speed: interface speed (in Mbps)
94106
* @interface: interface (module) plugged in
95107
* @media: media type of the @interface
108+
* @fec: forward error correction mode
96109
* @aneg: auto negotiation mode
97110
* @mac_addr: interface MAC address
98111
* @label_port: port id
@@ -105,6 +118,7 @@ enum nfp_eth_aneg {
105118
* @port_type: one of %PORT_* defines for ethtool
106119
* @port_lanes: total number of lanes on the port (sum of lanes of all subports)
107120
* @is_split: is interface part of a split port
121+
* @fec_modes_supported: bitmap of FEC modes supported
108122
*/
109123
struct nfp_eth_table {
110124
unsigned int count;
@@ -120,6 +134,7 @@ struct nfp_eth_table {
120134
unsigned int interface;
121135
enum nfp_eth_media media;
122136

137+
enum nfp_eth_fec fec;
123138
enum nfp_eth_aneg aneg;
124139

125140
u8 mac_addr[ETH_ALEN];
@@ -139,6 +154,8 @@ struct nfp_eth_table {
139154
unsigned int port_lanes;
140155

141156
bool is_split;
157+
158+
unsigned int fec_modes_supported;
142159
} ports[0];
143160
};
144161

@@ -149,6 +166,19 @@ __nfp_eth_read_ports(struct nfp_cpp *cpp, struct nfp_nsp *nsp);
149166
int nfp_eth_set_mod_enable(struct nfp_cpp *cpp, unsigned int idx, bool enable);
150167
int nfp_eth_set_configured(struct nfp_cpp *cpp, unsigned int idx,
151168
bool configed);
169+
int
170+
nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode);
171+
172+
static inline bool nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port)
173+
{
174+
return !!eth_port->fec_modes_supported;
175+
}
176+
177+
static inline unsigned int
178+
nfp_eth_supported_fec_modes(struct nfp_eth_table_port *eth_port)
179+
{
180+
return eth_port->fec_modes_supported;
181+
}
152182

153183
struct nfp_nsp *nfp_eth_config_start(struct nfp_cpp *cpp, unsigned int idx);
154184
int nfp_eth_config_commit_end(struct nfp_nsp *nsp);

drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
#define NSP_ETH_PORT_INDEX GENMASK_ULL(15, 8)
5656
#define NSP_ETH_PORT_LABEL GENMASK_ULL(53, 48)
5757
#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)
5860

5961
#define NSP_ETH_PORT_LANES_MASK cpu_to_le64(NSP_ETH_PORT_LANES)
6062

@@ -67,6 +69,7 @@
6769
#define NSP_ETH_STATE_MEDIA GENMASK_ULL(21, 20)
6870
#define NSP_ETH_STATE_OVRD_CHNG BIT_ULL(22)
6971
#define NSP_ETH_STATE_ANEG GENMASK_ULL(25, 23)
72+
#define NSP_ETH_STATE_FEC GENMASK_ULL(27, 26)
7073

7174
#define NSP_ETH_CTRL_CONFIGURED BIT_ULL(0)
7275
#define NSP_ETH_CTRL_ENABLED BIT_ULL(1)
@@ -75,6 +78,7 @@
7578
#define NSP_ETH_CTRL_SET_RATE BIT_ULL(4)
7679
#define NSP_ETH_CTRL_SET_LANES BIT_ULL(5)
7780
#define NSP_ETH_CTRL_SET_ANEG BIT_ULL(6)
81+
#define NSP_ETH_CTRL_SET_FEC BIT_ULL(7)
7882

7983
enum nfp_eth_raw {
8084
NSP_ETH_RAW_PORT = 0,
@@ -152,6 +156,7 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
152156
unsigned int index, struct nfp_eth_table_port *dst)
153157
{
154158
unsigned int rate;
159+
unsigned int fec;
155160
u64 port, state;
156161

157162
port = le64_to_cpu(src->port);
@@ -183,6 +188,18 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const union eth_table_entry *src,
183188

184189
dst->override_changed = FIELD_GET(NSP_ETH_STATE_OVRD_CHNG, state);
185190
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);
186203
}
187204

188205
static void
@@ -527,6 +544,53 @@ int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode)
527544
NSP_ETH_CTRL_SET_ANEG);
528545
}
529546

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+
530594
/**
531595
* __nfp_eth_set_speed() - set interface speed/rate
532596
* @nsp: NFP NSP handle returned from nfp_eth_config_start()

0 commit comments

Comments
 (0)