kernel: copy kernel 4.19 code to 5.4
[oweals/openwrt.git] / target / linux / generic / pending-5.4 / 742-net-sfp-add-more-extended-compliance-codes.patch
1 From c66a4e76c8554c84e64b9315314576ac403c6641 Mon Sep 17 00:00:00 2001
2 From: Russell King <rmk+kernel@armlinux.org.uk>
3 Date: Thu, 26 Sep 2019 15:14:18 +0100
4 Subject: [PATCH 645/660] net: sfp: add more extended compliance codes
5
6 SFF-8024 is used to define various constants re-used in several SFF
7 SFP-related specifications.  Split these constants from the enum, and
8 rename them to indicate that they're defined by SFF-8024.
9
10 Add and use updated SFF-8024 extended compliance code definitions for
11 10GBASE-T, 5GBASE-T and 2.5GBASE-T modules.
12
13 Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
14 ---
15  drivers/net/phy/sfp-bus.c | 60 ++++++++++++++++------------
16  drivers/net/phy/sfp.c     |  4 +-
17  include/linux/sfp.h       | 82 ++++++++++++++++++++++++++-------------
18  3 files changed, 93 insertions(+), 53 deletions(-)
19
20 --- a/drivers/net/phy/sfp-bus.c
21 +++ b/drivers/net/phy/sfp-bus.c
22 @@ -123,35 +123,35 @@ int sfp_parse_port(struct sfp_bus *bus,
23  
24         /* port is the physical connector, set this from the connector field. */
25         switch (id->base.connector) {
26 -       case SFP_CONNECTOR_SC:
27 -       case SFP_CONNECTOR_FIBERJACK:
28 -       case SFP_CONNECTOR_LC:
29 -       case SFP_CONNECTOR_MT_RJ:
30 -       case SFP_CONNECTOR_MU:
31 -       case SFP_CONNECTOR_OPTICAL_PIGTAIL:
32 +       case SFF8024_CONNECTOR_SC:
33 +       case SFF8024_CONNECTOR_FIBERJACK:
34 +       case SFF8024_CONNECTOR_LC:
35 +       case SFF8024_CONNECTOR_MT_RJ:
36 +       case SFF8024_CONNECTOR_MU:
37 +       case SFF8024_CONNECTOR_OPTICAL_PIGTAIL:
38 +       case SFF8024_CONNECTOR_MPO_1X12:
39 +       case SFF8024_CONNECTOR_MPO_2X16:
40                 port = PORT_FIBRE;
41                 break;
42  
43 -       case SFP_CONNECTOR_RJ45:
44 +       case SFF8024_CONNECTOR_RJ45:
45                 port = PORT_TP;
46                 break;
47  
48 -       case SFP_CONNECTOR_COPPER_PIGTAIL:
49 +       case SFF8024_CONNECTOR_COPPER_PIGTAIL:
50                 port = PORT_DA;
51                 break;
52  
53 -       case SFP_CONNECTOR_UNSPEC:
54 +       case SFF8024_CONNECTOR_UNSPEC:
55                 if (id->base.e1000_base_t) {
56                         port = PORT_TP;
57                         break;
58                 }
59                 /* fallthrough */
60 -       case SFP_CONNECTOR_SG: /* guess */
61 -       case SFP_CONNECTOR_MPO_1X12:
62 -       case SFP_CONNECTOR_MPO_2X16:
63 -       case SFP_CONNECTOR_HSSDC_II:
64 -       case SFP_CONNECTOR_NOSEPARATE:
65 -       case SFP_CONNECTOR_MXC_2X16:
66 +       case SFF8024_CONNECTOR_SG: /* guess */
67 +       case SFF8024_CONNECTOR_HSSDC_II:
68 +       case SFF8024_CONNECTOR_NOSEPARATE:
69 +       case SFF8024_CONNECTOR_MXC_2X16:
70                 port = PORT_OTHER;
71                 break;
72         default:
73 @@ -260,22 +260,33 @@ void sfp_parse_support(struct sfp_bus *b
74         }
75  
76         switch (id->base.extended_cc) {
77 -       case 0x00: /* Unspecified */
78 +       case SFF8024_ECC_UNSPEC:
79                 break;
80 -       case 0x02: /* 100Gbase-SR4 or 25Gbase-SR */
81 +       case SFF8024_ECC_100GBASE_SR4_25GBASE_SR:
82                 phylink_set(modes, 100000baseSR4_Full);
83                 phylink_set(modes, 25000baseSR_Full);
84                 break;
85 -       case 0x03: /* 100Gbase-LR4 or 25Gbase-LR */
86 -       case 0x04: /* 100Gbase-ER4 or 25Gbase-ER */
87 +       case SFF8024_ECC_100GBASE_LR4_25GBASE_LR:
88 +       case SFF8024_ECC_100GBASE_ER4_25GBASE_ER:
89                 phylink_set(modes, 100000baseLR4_ER4_Full);
90                 break;
91 -       case 0x0b: /* 100Gbase-CR4 or 25Gbase-CR CA-L */
92 -       case 0x0c: /* 25Gbase-CR CA-S */
93 -       case 0x0d: /* 25Gbase-CR CA-N */
94 +       case SFF8024_ECC_100GBASE_CR4:
95                 phylink_set(modes, 100000baseCR4_Full);
96 +               /* fallthrough */
97 +       case SFF8024_ECC_25GBASE_CR_S:
98 +       case SFF8024_ECC_25GBASE_CR_N:
99                 phylink_set(modes, 25000baseCR_Full);
100                 break;
101 +       case SFF8024_ECC_10GBASE_T_SFI:
102 +       case SFF8024_ECC_10GBASE_T_SR:
103 +               phylink_set(modes, 10000baseT_Full);
104 +               break;
105 +       case SFF8024_ECC_5GBASE_T:
106 +               phylink_set(modes, 5000baseT_Full);
107 +               break;
108 +       case SFF8024_ECC_2_5GBASE_T:
109 +               phylink_set(modes, 2500baseT_Full);
110 +               break;
111         default:
112                 dev_warn(bus->sfp_dev,
113                          "Unknown/unsupported extended compliance code: 0x%02x\n",
114 @@ -300,7 +311,7 @@ void sfp_parse_support(struct sfp_bus *b
115          */
116         if (bitmap_empty(modes, __ETHTOOL_LINK_MODE_MASK_NBITS)) {
117                 /* If the encoding and bit rate allows 1000baseX */
118 -               if (id->base.encoding == SFP_ENCODING_8B10B && br_nom &&
119 +               if (id->base.encoding == SFF8024_ENCODING_8B10B && br_nom &&
120                     br_min <= 1300 && br_max >= 1200)
121                         phylink_set(modes, 1000baseX_Full);
122         }
123 @@ -331,7 +342,8 @@ phy_interface_t sfp_select_interface(str
124             phylink_test(link_modes, 10000baseSR_Full) ||
125             phylink_test(link_modes, 10000baseLR_Full) ||
126             phylink_test(link_modes, 10000baseLRM_Full) ||
127 -           phylink_test(link_modes, 10000baseER_Full))
128 +           phylink_test(link_modes, 10000baseER_Full) ||
129 +           phylink_test(link_modes, 10000baseT_Full))
130                 return PHY_INTERFACE_MODE_10GKR;
131  
132         if (phylink_test(link_modes, 2500baseX_Full))
133 --- a/drivers/net/phy/sfp.c
134 +++ b/drivers/net/phy/sfp.c
135 @@ -240,7 +240,7 @@ struct sfp {
136  
137  static bool sff_module_supported(const struct sfp_eeprom_id *id)
138  {
139 -       return id->base.phys_id == SFP_PHYS_ID_SFF &&
140 +       return id->base.phys_id == SFF8024_ID_SFF_8472 &&
141                id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP;
142  }
143  
144 @@ -251,7 +251,7 @@ static const struct sff_data sff_data =
145  
146  static bool sfp_module_supported(const struct sfp_eeprom_id *id)
147  {
148 -       return id->base.phys_id == SFP_PHYS_ID_SFP &&
149 +       return id->base.phys_id == SFF8024_ID_SFP &&
150                id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP;
151  }
152  
153 --- a/include/linux/sfp.h
154 +++ b/include/linux/sfp.h
155 @@ -275,6 +275,61 @@ struct sfp_diag {
156         __be16 cal_v_offset;
157  } __packed;
158  
159 +/* SFF8024 defined constants */
160 +enum {
161 +       SFF8024_ID_UNK                  = 0x00,
162 +       SFF8024_ID_SFF_8472             = 0x02,
163 +       SFF8024_ID_SFP                  = 0x03,
164 +       SFF8024_ID_DWDM_SFP             = 0x0b,
165 +       SFF8024_ID_QSFP_8438            = 0x0c,
166 +       SFF8024_ID_QSFP_8436_8636       = 0x0d,
167 +       SFF8024_ID_QSFP28_8636          = 0x11,
168 +
169 +       SFF8024_ENCODING_UNSPEC         = 0x00,
170 +       SFF8024_ENCODING_8B10B          = 0x01,
171 +       SFF8024_ENCODING_4B5B           = 0x02,
172 +       SFF8024_ENCODING_NRZ            = 0x03,
173 +       SFF8024_ENCODING_8472_MANCHESTER= 0x04,
174 +       SFF8024_ENCODING_8472_SONET     = 0x05,
175 +       SFF8024_ENCODING_8472_64B66B    = 0x06,
176 +       SFF8024_ENCODING_8436_MANCHESTER= 0x06,
177 +       SFF8024_ENCODING_8436_SONET     = 0x04,
178 +       SFF8024_ENCODING_8436_64B66B    = 0x05,
179 +       SFF8024_ENCODING_256B257B       = 0x07,
180 +       SFF8024_ENCODING_PAM4           = 0x08,
181 +
182 +       SFF8024_CONNECTOR_UNSPEC        = 0x00,
183 +       /* codes 01-05 not supportable on SFP, but some modules have single SC */
184 +       SFF8024_CONNECTOR_SC            = 0x01,
185 +       SFF8024_CONNECTOR_FIBERJACK     = 0x06,
186 +       SFF8024_CONNECTOR_LC            = 0x07,
187 +       SFF8024_CONNECTOR_MT_RJ         = 0x08,
188 +       SFF8024_CONNECTOR_MU            = 0x09,
189 +       SFF8024_CONNECTOR_SG            = 0x0a,
190 +       SFF8024_CONNECTOR_OPTICAL_PIGTAIL= 0x0b,
191 +       SFF8024_CONNECTOR_MPO_1X12      = 0x0c,
192 +       SFF8024_CONNECTOR_MPO_2X16      = 0x0d,
193 +       SFF8024_CONNECTOR_HSSDC_II      = 0x20,
194 +       SFF8024_CONNECTOR_COPPER_PIGTAIL= 0x21,
195 +       SFF8024_CONNECTOR_RJ45          = 0x22,
196 +       SFF8024_CONNECTOR_NOSEPARATE    = 0x23,
197 +       SFF8024_CONNECTOR_MXC_2X16      = 0x24,
198 +
199 +       SFF8024_ECC_UNSPEC              = 0x00,
200 +       SFF8024_ECC_100G_25GAUI_C2M_AOC = 0x01,
201 +       SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 0x02,
202 +       SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 0x03,
203 +       SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 0x04,
204 +       SFF8024_ECC_100GBASE_SR10       = 0x05,
205 +       SFF8024_ECC_100GBASE_CR4        = 0x0b,
206 +       SFF8024_ECC_25GBASE_CR_S        = 0x0c,
207 +       SFF8024_ECC_25GBASE_CR_N        = 0x0d,
208 +       SFF8024_ECC_10GBASE_T_SFI       = 0x16,
209 +       SFF8024_ECC_10GBASE_T_SR        = 0x1c,
210 +       SFF8024_ECC_5GBASE_T            = 0x1d,
211 +       SFF8024_ECC_2_5GBASE_T          = 0x1e,
212 +};
213 +
214  /* SFP EEPROM registers */
215  enum {
216         SFP_PHYS_ID                     = 0x00,
217 @@ -309,34 +364,7 @@ enum {
218         SFP_SFF8472_COMPLIANCE          = 0x5e,
219         SFP_CC_EXT                      = 0x5f,
220  
221 -       SFP_PHYS_ID_SFF                 = 0x02,
222 -       SFP_PHYS_ID_SFP                 = 0x03,
223         SFP_PHYS_EXT_ID_SFP             = 0x04,
224 -       SFP_CONNECTOR_UNSPEC            = 0x00,
225 -       /* codes 01-05 not supportable on SFP, but some modules have single SC */
226 -       SFP_CONNECTOR_SC                = 0x01,
227 -       SFP_CONNECTOR_FIBERJACK         = 0x06,
228 -       SFP_CONNECTOR_LC                = 0x07,
229 -       SFP_CONNECTOR_MT_RJ             = 0x08,
230 -       SFP_CONNECTOR_MU                = 0x09,
231 -       SFP_CONNECTOR_SG                = 0x0a,
232 -       SFP_CONNECTOR_OPTICAL_PIGTAIL   = 0x0b,
233 -       SFP_CONNECTOR_MPO_1X12          = 0x0c,
234 -       SFP_CONNECTOR_MPO_2X16          = 0x0d,
235 -       SFP_CONNECTOR_HSSDC_II          = 0x20,
236 -       SFP_CONNECTOR_COPPER_PIGTAIL    = 0x21,
237 -       SFP_CONNECTOR_RJ45              = 0x22,
238 -       SFP_CONNECTOR_NOSEPARATE        = 0x23,
239 -       SFP_CONNECTOR_MXC_2X16          = 0x24,
240 -       SFP_ENCODING_UNSPEC             = 0x00,
241 -       SFP_ENCODING_8B10B              = 0x01,
242 -       SFP_ENCODING_4B5B               = 0x02,
243 -       SFP_ENCODING_NRZ                = 0x03,
244 -       SFP_ENCODING_8472_MANCHESTER    = 0x04,
245 -       SFP_ENCODING_8472_SONET         = 0x05,
246 -       SFP_ENCODING_8472_64B66B        = 0x06,
247 -       SFP_ENCODING_256B257B           = 0x07,
248 -       SFP_ENCODING_PAM4               = 0x08,
249         SFP_OPTIONS_HIGH_POWER_LEVEL    = BIT(13),
250         SFP_OPTIONS_PAGING_A2           = BIT(12),
251         SFP_OPTIONS_RETIMER             = BIT(11),