Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: sfp: add more extended compliance codes

SFF-8024 is used to define various constants re-used in several SFF
SFP-related specifications. Split these constants from the enum, and
rename them to indicate that they're defined by SFF-8024.

Add and use updated SFF-8024 extended compliance code definitions for
10GBASE-T, 5GBASE-T and 2.5GBASE-T modules.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Russell King and committed by
David S. Miller
0fbd26a9 a4516c70

+93 -53
+36 -24
drivers/net/phy/sfp-bus.c
··· 124 124 125 125 /* port is the physical connector, set this from the connector field. */ 126 126 switch (id->base.connector) { 127 - case SFP_CONNECTOR_SC: 128 - case SFP_CONNECTOR_FIBERJACK: 129 - case SFP_CONNECTOR_LC: 130 - case SFP_CONNECTOR_MT_RJ: 131 - case SFP_CONNECTOR_MU: 132 - case SFP_CONNECTOR_OPTICAL_PIGTAIL: 127 + case SFF8024_CONNECTOR_SC: 128 + case SFF8024_CONNECTOR_FIBERJACK: 129 + case SFF8024_CONNECTOR_LC: 130 + case SFF8024_CONNECTOR_MT_RJ: 131 + case SFF8024_CONNECTOR_MU: 132 + case SFF8024_CONNECTOR_OPTICAL_PIGTAIL: 133 + case SFF8024_CONNECTOR_MPO_1X12: 134 + case SFF8024_CONNECTOR_MPO_2X16: 133 135 port = PORT_FIBRE; 134 136 break; 135 137 136 - case SFP_CONNECTOR_RJ45: 138 + case SFF8024_CONNECTOR_RJ45: 137 139 port = PORT_TP; 138 140 break; 139 141 140 - case SFP_CONNECTOR_COPPER_PIGTAIL: 142 + case SFF8024_CONNECTOR_COPPER_PIGTAIL: 141 143 port = PORT_DA; 142 144 break; 143 145 144 - case SFP_CONNECTOR_UNSPEC: 146 + case SFF8024_CONNECTOR_UNSPEC: 145 147 if (id->base.e1000_base_t) { 146 148 port = PORT_TP; 147 149 break; 148 150 } 149 151 /* fallthrough */ 150 - case SFP_CONNECTOR_SG: /* guess */ 151 - case SFP_CONNECTOR_MPO_1X12: 152 - case SFP_CONNECTOR_MPO_2X16: 153 - case SFP_CONNECTOR_HSSDC_II: 154 - case SFP_CONNECTOR_NOSEPARATE: 155 - case SFP_CONNECTOR_MXC_2X16: 152 + case SFF8024_CONNECTOR_SG: /* guess */ 153 + case SFF8024_CONNECTOR_HSSDC_II: 154 + case SFF8024_CONNECTOR_NOSEPARATE: 155 + case SFF8024_CONNECTOR_MXC_2X16: 156 156 port = PORT_OTHER; 157 157 break; 158 158 default: ··· 261 261 } 262 262 263 263 switch (id->base.extended_cc) { 264 - case 0x00: /* Unspecified */ 264 + case SFF8024_ECC_UNSPEC: 265 265 break; 266 - case 0x02: /* 100Gbase-SR4 or 25Gbase-SR */ 266 + case SFF8024_ECC_100GBASE_SR4_25GBASE_SR: 267 267 phylink_set(modes, 100000baseSR4_Full); 268 268 phylink_set(modes, 25000baseSR_Full); 269 269 break; 270 - case 0x03: /* 100Gbase-LR4 or 25Gbase-LR */ 271 - case 0x04: /* 100Gbase-ER4 or 25Gbase-ER */ 270 + case SFF8024_ECC_100GBASE_LR4_25GBASE_LR: 271 + case SFF8024_ECC_100GBASE_ER4_25GBASE_ER: 272 272 phylink_set(modes, 100000baseLR4_ER4_Full); 273 273 break; 274 - case 0x0b: /* 100Gbase-CR4 or 25Gbase-CR CA-L */ 275 - case 0x0c: /* 25Gbase-CR CA-S */ 276 - case 0x0d: /* 25Gbase-CR CA-N */ 274 + case SFF8024_ECC_100GBASE_CR4: 277 275 phylink_set(modes, 100000baseCR4_Full); 276 + /* fallthrough */ 277 + case SFF8024_ECC_25GBASE_CR_S: 278 + case SFF8024_ECC_25GBASE_CR_N: 278 279 phylink_set(modes, 25000baseCR_Full); 280 + break; 281 + case SFF8024_ECC_10GBASE_T_SFI: 282 + case SFF8024_ECC_10GBASE_T_SR: 283 + phylink_set(modes, 10000baseT_Full); 284 + break; 285 + case SFF8024_ECC_5GBASE_T: 286 + phylink_set(modes, 5000baseT_Full); 287 + break; 288 + case SFF8024_ECC_2_5GBASE_T: 289 + phylink_set(modes, 2500baseT_Full); 279 290 break; 280 291 default: 281 292 dev_warn(bus->sfp_dev, ··· 312 301 */ 313 302 if (bitmap_empty(modes, __ETHTOOL_LINK_MODE_MASK_NBITS)) { 314 303 /* If the encoding and bit rate allows 1000baseX */ 315 - if (id->base.encoding == SFP_ENCODING_8B10B && br_nom && 304 + if (id->base.encoding == SFF8024_ENCODING_8B10B && br_nom && 316 305 br_min <= 1300 && br_max >= 1200) 317 306 phylink_set(modes, 1000baseX_Full); 318 307 } ··· 343 332 phylink_test(link_modes, 10000baseSR_Full) || 344 333 phylink_test(link_modes, 10000baseLR_Full) || 345 334 phylink_test(link_modes, 10000baseLRM_Full) || 346 - phylink_test(link_modes, 10000baseER_Full)) 335 + phylink_test(link_modes, 10000baseER_Full) || 336 + phylink_test(link_modes, 10000baseT_Full)) 347 337 return PHY_INTERFACE_MODE_10GKR; 348 338 349 339 if (phylink_test(link_modes, 2500baseX_Full))
+2 -2
drivers/net/phy/sfp.c
··· 242 242 243 243 static bool sff_module_supported(const struct sfp_eeprom_id *id) 244 244 { 245 - return id->base.phys_id == SFP_PHYS_ID_SFF && 245 + return id->base.phys_id == SFF8024_ID_SFF_8472 && 246 246 id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 247 247 } 248 248 ··· 253 253 254 254 static bool sfp_module_supported(const struct sfp_eeprom_id *id) 255 255 { 256 - return id->base.phys_id == SFP_PHYS_ID_SFP && 256 + return id->base.phys_id == SFF8024_ID_SFP && 257 257 id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 258 258 } 259 259
+55 -27
include/linux/sfp.h
··· 275 275 __be16 cal_v_offset; 276 276 } __packed; 277 277 278 + /* SFF8024 defined constants */ 279 + enum { 280 + SFF8024_ID_UNK = 0x00, 281 + SFF8024_ID_SFF_8472 = 0x02, 282 + SFF8024_ID_SFP = 0x03, 283 + SFF8024_ID_DWDM_SFP = 0x0b, 284 + SFF8024_ID_QSFP_8438 = 0x0c, 285 + SFF8024_ID_QSFP_8436_8636 = 0x0d, 286 + SFF8024_ID_QSFP28_8636 = 0x11, 287 + 288 + SFF8024_ENCODING_UNSPEC = 0x00, 289 + SFF8024_ENCODING_8B10B = 0x01, 290 + SFF8024_ENCODING_4B5B = 0x02, 291 + SFF8024_ENCODING_NRZ = 0x03, 292 + SFF8024_ENCODING_8472_MANCHESTER= 0x04, 293 + SFF8024_ENCODING_8472_SONET = 0x05, 294 + SFF8024_ENCODING_8472_64B66B = 0x06, 295 + SFF8024_ENCODING_8436_MANCHESTER= 0x06, 296 + SFF8024_ENCODING_8436_SONET = 0x04, 297 + SFF8024_ENCODING_8436_64B66B = 0x05, 298 + SFF8024_ENCODING_256B257B = 0x07, 299 + SFF8024_ENCODING_PAM4 = 0x08, 300 + 301 + SFF8024_CONNECTOR_UNSPEC = 0x00, 302 + /* codes 01-05 not supportable on SFP, but some modules have single SC */ 303 + SFF8024_CONNECTOR_SC = 0x01, 304 + SFF8024_CONNECTOR_FIBERJACK = 0x06, 305 + SFF8024_CONNECTOR_LC = 0x07, 306 + SFF8024_CONNECTOR_MT_RJ = 0x08, 307 + SFF8024_CONNECTOR_MU = 0x09, 308 + SFF8024_CONNECTOR_SG = 0x0a, 309 + SFF8024_CONNECTOR_OPTICAL_PIGTAIL= 0x0b, 310 + SFF8024_CONNECTOR_MPO_1X12 = 0x0c, 311 + SFF8024_CONNECTOR_MPO_2X16 = 0x0d, 312 + SFF8024_CONNECTOR_HSSDC_II = 0x20, 313 + SFF8024_CONNECTOR_COPPER_PIGTAIL= 0x21, 314 + SFF8024_CONNECTOR_RJ45 = 0x22, 315 + SFF8024_CONNECTOR_NOSEPARATE = 0x23, 316 + SFF8024_CONNECTOR_MXC_2X16 = 0x24, 317 + 318 + SFF8024_ECC_UNSPEC = 0x00, 319 + SFF8024_ECC_100G_25GAUI_C2M_AOC = 0x01, 320 + SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 0x02, 321 + SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 0x03, 322 + SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 0x04, 323 + SFF8024_ECC_100GBASE_SR10 = 0x05, 324 + SFF8024_ECC_100GBASE_CR4 = 0x0b, 325 + SFF8024_ECC_25GBASE_CR_S = 0x0c, 326 + SFF8024_ECC_25GBASE_CR_N = 0x0d, 327 + SFF8024_ECC_10GBASE_T_SFI = 0x16, 328 + SFF8024_ECC_10GBASE_T_SR = 0x1c, 329 + SFF8024_ECC_5GBASE_T = 0x1d, 330 + SFF8024_ECC_2_5GBASE_T = 0x1e, 331 + }; 332 + 278 333 /* SFP EEPROM registers */ 279 334 enum { 280 335 SFP_PHYS_ID = 0x00, ··· 364 309 SFP_SFF8472_COMPLIANCE = 0x5e, 365 310 SFP_CC_EXT = 0x5f, 366 311 367 - SFP_PHYS_ID_SFF = 0x02, 368 - SFP_PHYS_ID_SFP = 0x03, 369 312 SFP_PHYS_EXT_ID_SFP = 0x04, 370 - SFP_CONNECTOR_UNSPEC = 0x00, 371 - /* codes 01-05 not supportable on SFP, but some modules have single SC */ 372 - SFP_CONNECTOR_SC = 0x01, 373 - SFP_CONNECTOR_FIBERJACK = 0x06, 374 - SFP_CONNECTOR_LC = 0x07, 375 - SFP_CONNECTOR_MT_RJ = 0x08, 376 - SFP_CONNECTOR_MU = 0x09, 377 - SFP_CONNECTOR_SG = 0x0a, 378 - SFP_CONNECTOR_OPTICAL_PIGTAIL = 0x0b, 379 - SFP_CONNECTOR_MPO_1X12 = 0x0c, 380 - SFP_CONNECTOR_MPO_2X16 = 0x0d, 381 - SFP_CONNECTOR_HSSDC_II = 0x20, 382 - SFP_CONNECTOR_COPPER_PIGTAIL = 0x21, 383 - SFP_CONNECTOR_RJ45 = 0x22, 384 - SFP_CONNECTOR_NOSEPARATE = 0x23, 385 - SFP_CONNECTOR_MXC_2X16 = 0x24, 386 - SFP_ENCODING_UNSPEC = 0x00, 387 - SFP_ENCODING_8B10B = 0x01, 388 - SFP_ENCODING_4B5B = 0x02, 389 - SFP_ENCODING_NRZ = 0x03, 390 - SFP_ENCODING_8472_MANCHESTER = 0x04, 391 - SFP_ENCODING_8472_SONET = 0x05, 392 - SFP_ENCODING_8472_64B66B = 0x06, 393 - SFP_ENCODING_256B257B = 0x07, 394 - SFP_ENCODING_PAM4 = 0x08, 395 313 SFP_OPTIONS_HIGH_POWER_LEVEL = BIT(13), 396 314 SFP_OPTIONS_PAGING_A2 = BIT(12), 397 315 SFP_OPTIONS_RETIMER = BIT(11),