@@ -86,104 +86,6 @@ static int mv2222_soft_reset(struct phy_device *phydev)
86
86
5000 , 1000000 , true);
87
87
}
88
88
89
- /* Returns negative on error, 0 if link is down, 1 if link is up */
90
- static int mv2222_read_status_10g (struct phy_device * phydev )
91
- {
92
- int val , link = 0 ;
93
-
94
- val = phy_read_mmd (phydev , MDIO_MMD_PCS , MDIO_STAT1 );
95
- if (val < 0 )
96
- return val ;
97
-
98
- if (val & MDIO_STAT1_LSTATUS ) {
99
- link = 1 ;
100
-
101
- /* 10GBASE-R do not support auto-negotiation */
102
- phydev -> autoneg = AUTONEG_DISABLE ;
103
- phydev -> speed = SPEED_10000 ;
104
- phydev -> duplex = DUPLEX_FULL ;
105
- }
106
-
107
- return link ;
108
- }
109
-
110
- /* Returns negative on error, 0 if link is down, 1 if link is up */
111
- static int mv2222_read_status_1g (struct phy_device * phydev )
112
- {
113
- int val , link = 0 ;
114
-
115
- val = phy_read_mmd (phydev , MDIO_MMD_PCS , MV_1GBX_STAT );
116
- if (val < 0 )
117
- return val ;
118
-
119
- if (!(val & BMSR_LSTATUS ) ||
120
- (phydev -> autoneg == AUTONEG_ENABLE &&
121
- !(val & BMSR_ANEGCOMPLETE )))
122
- return 0 ;
123
-
124
- link = 1 ;
125
-
126
- val = phy_read_mmd (phydev , MDIO_MMD_PCS , MV_1GBX_PHY_STAT );
127
- if (val < 0 )
128
- return val ;
129
-
130
- if (val & MV_1GBX_PHY_STAT_AN_RESOLVED ) {
131
- if (val & MV_1GBX_PHY_STAT_DUPLEX )
132
- phydev -> duplex = DUPLEX_FULL ;
133
- else
134
- phydev -> duplex = DUPLEX_HALF ;
135
-
136
- if (val & MV_1GBX_PHY_STAT_SPEED1000 )
137
- phydev -> speed = SPEED_1000 ;
138
- else if (val & MV_1GBX_PHY_STAT_SPEED100 )
139
- phydev -> speed = SPEED_100 ;
140
- else
141
- phydev -> speed = SPEED_10 ;
142
- }
143
-
144
- return link ;
145
- }
146
-
147
- static bool mv2222_link_is_operational (struct phy_device * phydev )
148
- {
149
- struct mv2222_data * priv = phydev -> priv ;
150
- int val ;
151
-
152
- val = phy_read_mmd (phydev , MDIO_MMD_PMAPMD , MV_RX_SIGNAL_DETECT );
153
- if (val < 0 || !(val & MV_RX_SIGNAL_DETECT_GLOBAL ))
154
- return false;
155
-
156
- if (phydev -> sfp_bus && !priv -> sfp_link )
157
- return false;
158
-
159
- return true;
160
- }
161
-
162
- static int mv2222_read_status (struct phy_device * phydev )
163
- {
164
- struct mv2222_data * priv = phydev -> priv ;
165
- int link ;
166
-
167
- phydev -> link = 0 ;
168
- phydev -> speed = SPEED_UNKNOWN ;
169
- phydev -> duplex = DUPLEX_UNKNOWN ;
170
-
171
- if (!mv2222_link_is_operational (phydev ))
172
- return 0 ;
173
-
174
- if (priv -> line_interface == PHY_INTERFACE_MODE_10GBASER )
175
- link = mv2222_read_status_10g (phydev );
176
- else
177
- link = mv2222_read_status_1g (phydev );
178
-
179
- if (link < 0 )
180
- return link ;
181
-
182
- phydev -> link = link ;
183
-
184
- return 0 ;
185
- }
186
-
187
89
static int mv2222_disable_aneg (struct phy_device * phydev )
188
90
{
189
91
int ret = phy_clear_bits_mmd (phydev , MDIO_MMD_PCS , MV_1GBX_CTRL ,
@@ -386,6 +288,104 @@ static int mv2222_aneg_done(struct phy_device *phydev)
386
288
return (ret & BMSR_ANEGCOMPLETE );
387
289
}
388
290
291
+ /* Returns negative on error, 0 if link is down, 1 if link is up */
292
+ static int mv2222_read_status_10g (struct phy_device * phydev )
293
+ {
294
+ int val , link = 0 ;
295
+
296
+ val = phy_read_mmd (phydev , MDIO_MMD_PCS , MDIO_STAT1 );
297
+ if (val < 0 )
298
+ return val ;
299
+
300
+ if (val & MDIO_STAT1_LSTATUS ) {
301
+ link = 1 ;
302
+
303
+ /* 10GBASE-R do not support auto-negotiation */
304
+ phydev -> autoneg = AUTONEG_DISABLE ;
305
+ phydev -> speed = SPEED_10000 ;
306
+ phydev -> duplex = DUPLEX_FULL ;
307
+ }
308
+
309
+ return link ;
310
+ }
311
+
312
+ /* Returns negative on error, 0 if link is down, 1 if link is up */
313
+ static int mv2222_read_status_1g (struct phy_device * phydev )
314
+ {
315
+ int val , link = 0 ;
316
+
317
+ val = phy_read_mmd (phydev , MDIO_MMD_PCS , MV_1GBX_STAT );
318
+ if (val < 0 )
319
+ return val ;
320
+
321
+ if (!(val & BMSR_LSTATUS ) ||
322
+ (phydev -> autoneg == AUTONEG_ENABLE &&
323
+ !(val & BMSR_ANEGCOMPLETE )))
324
+ return 0 ;
325
+
326
+ link = 1 ;
327
+
328
+ val = phy_read_mmd (phydev , MDIO_MMD_PCS , MV_1GBX_PHY_STAT );
329
+ if (val < 0 )
330
+ return val ;
331
+
332
+ if (val & MV_1GBX_PHY_STAT_AN_RESOLVED ) {
333
+ if (val & MV_1GBX_PHY_STAT_DUPLEX )
334
+ phydev -> duplex = DUPLEX_FULL ;
335
+ else
336
+ phydev -> duplex = DUPLEX_HALF ;
337
+
338
+ if (val & MV_1GBX_PHY_STAT_SPEED1000 )
339
+ phydev -> speed = SPEED_1000 ;
340
+ else if (val & MV_1GBX_PHY_STAT_SPEED100 )
341
+ phydev -> speed = SPEED_100 ;
342
+ else
343
+ phydev -> speed = SPEED_10 ;
344
+ }
345
+
346
+ return link ;
347
+ }
348
+
349
+ static bool mv2222_link_is_operational (struct phy_device * phydev )
350
+ {
351
+ struct mv2222_data * priv = phydev -> priv ;
352
+ int val ;
353
+
354
+ val = phy_read_mmd (phydev , MDIO_MMD_PMAPMD , MV_RX_SIGNAL_DETECT );
355
+ if (val < 0 || !(val & MV_RX_SIGNAL_DETECT_GLOBAL ))
356
+ return false;
357
+
358
+ if (phydev -> sfp_bus && !priv -> sfp_link )
359
+ return false;
360
+
361
+ return true;
362
+ }
363
+
364
+ static int mv2222_read_status (struct phy_device * phydev )
365
+ {
366
+ struct mv2222_data * priv = phydev -> priv ;
367
+ int link ;
368
+
369
+ phydev -> link = 0 ;
370
+ phydev -> speed = SPEED_UNKNOWN ;
371
+ phydev -> duplex = DUPLEX_UNKNOWN ;
372
+
373
+ if (!mv2222_link_is_operational (phydev ))
374
+ return 0 ;
375
+
376
+ if (priv -> line_interface == PHY_INTERFACE_MODE_10GBASER )
377
+ link = mv2222_read_status_10g (phydev );
378
+ else
379
+ link = mv2222_read_status_1g (phydev );
380
+
381
+ if (link < 0 )
382
+ return link ;
383
+
384
+ phydev -> link = link ;
385
+
386
+ return 0 ;
387
+ }
388
+
389
389
static int mv2222_resume (struct phy_device * phydev )
390
390
{
391
391
return mv2222_tx_enable (phydev );
0 commit comments