0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 #include <linux/interrupt.h>
0118 #include <linux/module.h>
0119 #include <linux/kmod.h>
0120 #include <linux/mdio.h>
0121 #include <linux/phy.h>
0122 #include <linux/of.h>
0123 #include <linux/bitops.h>
0124 #include <linux/jiffies.h>
0125
0126 #include "xgbe.h"
0127 #include "xgbe-common.h"
0128
0129 static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata,
0130 struct ethtool_eeprom *eeprom, u8 *data)
0131 {
0132 if (!pdata->phy_if.phy_impl.module_eeprom)
0133 return -ENXIO;
0134
0135 return pdata->phy_if.phy_impl.module_eeprom(pdata, eeprom, data);
0136 }
0137
0138 static int xgbe_phy_module_info(struct xgbe_prv_data *pdata,
0139 struct ethtool_modinfo *modinfo)
0140 {
0141 if (!pdata->phy_if.phy_impl.module_info)
0142 return -ENXIO;
0143
0144 return pdata->phy_if.phy_impl.module_info(pdata, modinfo);
0145 }
0146
0147 static void xgbe_an37_clear_interrupts(struct xgbe_prv_data *pdata)
0148 {
0149 int reg;
0150
0151 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT);
0152 reg &= ~XGBE_AN_CL37_INT_MASK;
0153 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT, reg);
0154 }
0155
0156 static void xgbe_an37_disable_interrupts(struct xgbe_prv_data *pdata)
0157 {
0158 int reg;
0159
0160 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL);
0161 reg &= ~XGBE_AN_CL37_INT_MASK;
0162 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL, reg);
0163
0164 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL);
0165 reg &= ~XGBE_PCS_CL37_BP;
0166 XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL, reg);
0167 }
0168
0169 static void xgbe_an37_enable_interrupts(struct xgbe_prv_data *pdata)
0170 {
0171 int reg;
0172
0173 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL);
0174 reg |= XGBE_PCS_CL37_BP;
0175 XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_PCS_DIG_CTRL, reg);
0176
0177 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL);
0178 reg |= XGBE_AN_CL37_INT_MASK;
0179 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL, reg);
0180 }
0181
0182 static void xgbe_an73_clear_interrupts(struct xgbe_prv_data *pdata)
0183 {
0184 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, 0);
0185 }
0186
0187 static void xgbe_an73_disable_interrupts(struct xgbe_prv_data *pdata)
0188 {
0189 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, 0);
0190 }
0191
0192 static void xgbe_an73_enable_interrupts(struct xgbe_prv_data *pdata)
0193 {
0194 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INTMASK, XGBE_AN_CL73_INT_MASK);
0195 }
0196
0197 static void xgbe_an_enable_interrupts(struct xgbe_prv_data *pdata)
0198 {
0199 switch (pdata->an_mode) {
0200 case XGBE_AN_MODE_CL73:
0201 case XGBE_AN_MODE_CL73_REDRV:
0202 xgbe_an73_enable_interrupts(pdata);
0203 break;
0204 case XGBE_AN_MODE_CL37:
0205 case XGBE_AN_MODE_CL37_SGMII:
0206 xgbe_an37_enable_interrupts(pdata);
0207 break;
0208 default:
0209 break;
0210 }
0211 }
0212
0213 static void xgbe_an_clear_interrupts_all(struct xgbe_prv_data *pdata)
0214 {
0215 xgbe_an73_clear_interrupts(pdata);
0216 xgbe_an37_clear_interrupts(pdata);
0217 }
0218
0219 static void xgbe_kr_mode(struct xgbe_prv_data *pdata)
0220 {
0221
0222 pdata->hw_if.set_speed(pdata, SPEED_10000);
0223
0224
0225 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_KR);
0226 }
0227
0228 static void xgbe_kx_2500_mode(struct xgbe_prv_data *pdata)
0229 {
0230
0231 pdata->hw_if.set_speed(pdata, SPEED_2500);
0232
0233
0234 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_KX_2500);
0235 }
0236
0237 static void xgbe_kx_1000_mode(struct xgbe_prv_data *pdata)
0238 {
0239
0240 pdata->hw_if.set_speed(pdata, SPEED_1000);
0241
0242
0243 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_KX_1000);
0244 }
0245
0246 static void xgbe_sfi_mode(struct xgbe_prv_data *pdata)
0247 {
0248
0249 if (pdata->kr_redrv)
0250 return xgbe_kr_mode(pdata);
0251
0252
0253 pdata->hw_if.set_speed(pdata, SPEED_10000);
0254
0255
0256 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SFI);
0257 }
0258
0259 static void xgbe_x_mode(struct xgbe_prv_data *pdata)
0260 {
0261
0262 pdata->hw_if.set_speed(pdata, SPEED_1000);
0263
0264
0265 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_X);
0266 }
0267
0268 static void xgbe_sgmii_1000_mode(struct xgbe_prv_data *pdata)
0269 {
0270
0271 pdata->hw_if.set_speed(pdata, SPEED_1000);
0272
0273
0274 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_1000);
0275 }
0276
0277 static void xgbe_sgmii_100_mode(struct xgbe_prv_data *pdata)
0278 {
0279
0280 pdata->hw_if.set_speed(pdata, SPEED_1000);
0281
0282
0283 pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_100);
0284 }
0285
0286 static enum xgbe_mode xgbe_cur_mode(struct xgbe_prv_data *pdata)
0287 {
0288 return pdata->phy_if.phy_impl.cur_mode(pdata);
0289 }
0290
0291 static bool xgbe_in_kr_mode(struct xgbe_prv_data *pdata)
0292 {
0293 return (xgbe_cur_mode(pdata) == XGBE_MODE_KR);
0294 }
0295
0296 static void xgbe_change_mode(struct xgbe_prv_data *pdata,
0297 enum xgbe_mode mode)
0298 {
0299 switch (mode) {
0300 case XGBE_MODE_KX_1000:
0301 xgbe_kx_1000_mode(pdata);
0302 break;
0303 case XGBE_MODE_KX_2500:
0304 xgbe_kx_2500_mode(pdata);
0305 break;
0306 case XGBE_MODE_KR:
0307 xgbe_kr_mode(pdata);
0308 break;
0309 case XGBE_MODE_SGMII_100:
0310 xgbe_sgmii_100_mode(pdata);
0311 break;
0312 case XGBE_MODE_SGMII_1000:
0313 xgbe_sgmii_1000_mode(pdata);
0314 break;
0315 case XGBE_MODE_X:
0316 xgbe_x_mode(pdata);
0317 break;
0318 case XGBE_MODE_SFI:
0319 xgbe_sfi_mode(pdata);
0320 break;
0321 case XGBE_MODE_UNKNOWN:
0322 break;
0323 default:
0324 netif_dbg(pdata, link, pdata->netdev,
0325 "invalid operation mode requested (%u)\n", mode);
0326 }
0327 }
0328
0329 static void xgbe_switch_mode(struct xgbe_prv_data *pdata)
0330 {
0331 xgbe_change_mode(pdata, pdata->phy_if.phy_impl.switch_mode(pdata));
0332 }
0333
0334 static bool xgbe_set_mode(struct xgbe_prv_data *pdata,
0335 enum xgbe_mode mode)
0336 {
0337 if (mode == xgbe_cur_mode(pdata))
0338 return false;
0339
0340 xgbe_change_mode(pdata, mode);
0341
0342 return true;
0343 }
0344
0345 static bool xgbe_use_mode(struct xgbe_prv_data *pdata,
0346 enum xgbe_mode mode)
0347 {
0348 return pdata->phy_if.phy_impl.use_mode(pdata, mode);
0349 }
0350
0351 static void xgbe_an37_set(struct xgbe_prv_data *pdata, bool enable,
0352 bool restart)
0353 {
0354 unsigned int reg;
0355
0356 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_CTRL1);
0357 reg &= ~MDIO_VEND2_CTRL1_AN_ENABLE;
0358
0359 if (enable)
0360 reg |= MDIO_VEND2_CTRL1_AN_ENABLE;
0361
0362 if (restart)
0363 reg |= MDIO_VEND2_CTRL1_AN_RESTART;
0364
0365 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_CTRL1, reg);
0366 }
0367
0368 static void xgbe_an37_restart(struct xgbe_prv_data *pdata)
0369 {
0370 xgbe_an37_enable_interrupts(pdata);
0371 xgbe_an37_set(pdata, true, true);
0372
0373 netif_dbg(pdata, link, pdata->netdev, "CL37 AN enabled/restarted\n");
0374 }
0375
0376 static void xgbe_an37_disable(struct xgbe_prv_data *pdata)
0377 {
0378 xgbe_an37_set(pdata, false, false);
0379 xgbe_an37_disable_interrupts(pdata);
0380
0381 netif_dbg(pdata, link, pdata->netdev, "CL37 AN disabled\n");
0382 }
0383
0384 static void xgbe_an73_set(struct xgbe_prv_data *pdata, bool enable,
0385 bool restart)
0386 {
0387 unsigned int reg;
0388
0389
0390 reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
0391 reg &= ~XGBE_KR_TRAINING_ENABLE;
0392 XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
0393
0394
0395 reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1);
0396 reg &= ~MDIO_AN_CTRL1_ENABLE;
0397
0398 if (enable)
0399 reg |= MDIO_AN_CTRL1_ENABLE;
0400
0401 if (restart)
0402 reg |= MDIO_AN_CTRL1_RESTART;
0403
0404 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_CTRL1, reg);
0405 }
0406
0407 static void xgbe_an73_restart(struct xgbe_prv_data *pdata)
0408 {
0409 xgbe_an73_enable_interrupts(pdata);
0410 xgbe_an73_set(pdata, true, true);
0411
0412 netif_dbg(pdata, link, pdata->netdev, "CL73 AN enabled/restarted\n");
0413 }
0414
0415 static void xgbe_an73_disable(struct xgbe_prv_data *pdata)
0416 {
0417 xgbe_an73_set(pdata, false, false);
0418 xgbe_an73_disable_interrupts(pdata);
0419
0420 pdata->an_start = 0;
0421
0422 netif_dbg(pdata, link, pdata->netdev, "CL73 AN disabled\n");
0423 }
0424
0425 static void xgbe_an_restart(struct xgbe_prv_data *pdata)
0426 {
0427 if (pdata->phy_if.phy_impl.an_pre)
0428 pdata->phy_if.phy_impl.an_pre(pdata);
0429
0430 switch (pdata->an_mode) {
0431 case XGBE_AN_MODE_CL73:
0432 case XGBE_AN_MODE_CL73_REDRV:
0433 xgbe_an73_restart(pdata);
0434 break;
0435 case XGBE_AN_MODE_CL37:
0436 case XGBE_AN_MODE_CL37_SGMII:
0437 xgbe_an37_restart(pdata);
0438 break;
0439 default:
0440 break;
0441 }
0442 }
0443
0444 static void xgbe_an_disable(struct xgbe_prv_data *pdata)
0445 {
0446 if (pdata->phy_if.phy_impl.an_post)
0447 pdata->phy_if.phy_impl.an_post(pdata);
0448
0449 switch (pdata->an_mode) {
0450 case XGBE_AN_MODE_CL73:
0451 case XGBE_AN_MODE_CL73_REDRV:
0452 xgbe_an73_disable(pdata);
0453 break;
0454 case XGBE_AN_MODE_CL37:
0455 case XGBE_AN_MODE_CL37_SGMII:
0456 xgbe_an37_disable(pdata);
0457 break;
0458 default:
0459 break;
0460 }
0461 }
0462
0463 static void xgbe_an_disable_all(struct xgbe_prv_data *pdata)
0464 {
0465 xgbe_an73_disable(pdata);
0466 xgbe_an37_disable(pdata);
0467 }
0468
0469 static enum xgbe_an xgbe_an73_tx_training(struct xgbe_prv_data *pdata,
0470 enum xgbe_rx *state)
0471 {
0472 unsigned int ad_reg, lp_reg, reg;
0473
0474 *state = XGBE_RX_COMPLETE;
0475
0476
0477 if (!xgbe_in_kr_mode(pdata))
0478 return XGBE_AN_PAGE_RECEIVED;
0479
0480
0481 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
0482 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
0483
0484 reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL);
0485 reg &= ~(MDIO_PMA_10GBR_FECABLE_ABLE | MDIO_PMA_10GBR_FECABLE_ERRABLE);
0486 if ((ad_reg & 0xc000) && (lp_reg & 0xc000))
0487 reg |= pdata->fec_ability;
0488
0489 XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL, reg);
0490
0491
0492 if (pdata->phy_if.phy_impl.kr_training_pre)
0493 pdata->phy_if.phy_impl.kr_training_pre(pdata);
0494
0495 reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
0496 reg |= XGBE_KR_TRAINING_ENABLE;
0497 reg |= XGBE_KR_TRAINING_START;
0498 XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
0499
0500 netif_dbg(pdata, link, pdata->netdev,
0501 "KR training initiated\n");
0502
0503 if (pdata->phy_if.phy_impl.kr_training_post)
0504 pdata->phy_if.phy_impl.kr_training_post(pdata);
0505
0506 return XGBE_AN_PAGE_RECEIVED;
0507 }
0508
0509 static enum xgbe_an xgbe_an73_tx_xnp(struct xgbe_prv_data *pdata,
0510 enum xgbe_rx *state)
0511 {
0512 u16 msg;
0513
0514 *state = XGBE_RX_XNP;
0515
0516 msg = XGBE_XNP_MCF_NULL_MESSAGE;
0517 msg |= XGBE_XNP_MP_FORMATTED;
0518
0519 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP + 2, 0);
0520 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP + 1, 0);
0521 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_XNP, msg);
0522
0523 return XGBE_AN_PAGE_RECEIVED;
0524 }
0525
0526 static enum xgbe_an xgbe_an73_rx_bpa(struct xgbe_prv_data *pdata,
0527 enum xgbe_rx *state)
0528 {
0529 unsigned int link_support;
0530 unsigned int reg, ad_reg, lp_reg;
0531
0532
0533 reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
0534
0535
0536 link_support = xgbe_in_kr_mode(pdata) ? 0x80 : 0x20;
0537 if (!(reg & link_support))
0538 return XGBE_AN_INCOMPAT_LINK;
0539
0540
0541 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
0542 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
0543
0544 return ((ad_reg & XGBE_XNP_NP_EXCHANGE) ||
0545 (lp_reg & XGBE_XNP_NP_EXCHANGE))
0546 ? xgbe_an73_tx_xnp(pdata, state)
0547 : xgbe_an73_tx_training(pdata, state);
0548 }
0549
0550 static enum xgbe_an xgbe_an73_rx_xnp(struct xgbe_prv_data *pdata,
0551 enum xgbe_rx *state)
0552 {
0553 unsigned int ad_reg, lp_reg;
0554
0555
0556 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_XNP);
0557 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPX);
0558
0559 return ((ad_reg & XGBE_XNP_NP_EXCHANGE) ||
0560 (lp_reg & XGBE_XNP_NP_EXCHANGE))
0561 ? xgbe_an73_tx_xnp(pdata, state)
0562 : xgbe_an73_tx_training(pdata, state);
0563 }
0564
0565 static enum xgbe_an xgbe_an73_page_received(struct xgbe_prv_data *pdata)
0566 {
0567 enum xgbe_rx *state;
0568 unsigned long an_timeout;
0569 enum xgbe_an ret;
0570
0571 if (!pdata->an_start) {
0572 pdata->an_start = jiffies;
0573 } else {
0574 an_timeout = pdata->an_start +
0575 msecs_to_jiffies(XGBE_AN_MS_TIMEOUT);
0576 if (time_after(jiffies, an_timeout)) {
0577
0578 pdata->kr_state = XGBE_RX_BPA;
0579 pdata->kx_state = XGBE_RX_BPA;
0580
0581 pdata->an_start = jiffies;
0582
0583 netif_dbg(pdata, link, pdata->netdev,
0584 "CL73 AN timed out, resetting state\n");
0585 }
0586 }
0587
0588 state = xgbe_in_kr_mode(pdata) ? &pdata->kr_state
0589 : &pdata->kx_state;
0590
0591 switch (*state) {
0592 case XGBE_RX_BPA:
0593 ret = xgbe_an73_rx_bpa(pdata, state);
0594 break;
0595
0596 case XGBE_RX_XNP:
0597 ret = xgbe_an73_rx_xnp(pdata, state);
0598 break;
0599
0600 default:
0601 ret = XGBE_AN_ERROR;
0602 }
0603
0604 return ret;
0605 }
0606
0607 static enum xgbe_an xgbe_an73_incompat_link(struct xgbe_prv_data *pdata)
0608 {
0609 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
0610
0611
0612 if (xgbe_in_kr_mode(pdata)) {
0613 pdata->kr_state = XGBE_RX_ERROR;
0614
0615 if (!XGBE_ADV(lks, 1000baseKX_Full) &&
0616 !XGBE_ADV(lks, 2500baseX_Full))
0617 return XGBE_AN_NO_LINK;
0618
0619 if (pdata->kx_state != XGBE_RX_BPA)
0620 return XGBE_AN_NO_LINK;
0621 } else {
0622 pdata->kx_state = XGBE_RX_ERROR;
0623
0624 if (!XGBE_ADV(lks, 10000baseKR_Full))
0625 return XGBE_AN_NO_LINK;
0626
0627 if (pdata->kr_state != XGBE_RX_BPA)
0628 return XGBE_AN_NO_LINK;
0629 }
0630
0631 xgbe_an_disable(pdata);
0632
0633 xgbe_switch_mode(pdata);
0634
0635 xgbe_an_restart(pdata);
0636
0637 return XGBE_AN_INCOMPAT_LINK;
0638 }
0639
0640 static void xgbe_an37_isr(struct xgbe_prv_data *pdata)
0641 {
0642 unsigned int reg;
0643
0644
0645 xgbe_an37_disable_interrupts(pdata);
0646
0647
0648 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT);
0649 pdata->an_int = reg & XGBE_AN_CL37_INT_MASK;
0650 pdata->an_status = reg & ~XGBE_AN_CL37_INT_MASK;
0651
0652 if (pdata->an_int) {
0653
0654 reg &= ~XGBE_AN_CL37_INT_MASK;
0655 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_STAT, reg);
0656
0657 queue_work(pdata->an_workqueue, &pdata->an_irq_work);
0658 } else {
0659
0660 xgbe_an37_enable_interrupts(pdata);
0661
0662
0663 if (pdata->vdata->irq_reissue_support)
0664 XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 3);
0665 }
0666 }
0667
0668 static void xgbe_an73_isr(struct xgbe_prv_data *pdata)
0669 {
0670
0671 xgbe_an73_disable_interrupts(pdata);
0672
0673
0674 pdata->an_int = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_INT);
0675
0676 if (pdata->an_int) {
0677
0678 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, ~pdata->an_int);
0679
0680 queue_work(pdata->an_workqueue, &pdata->an_irq_work);
0681 } else {
0682
0683 xgbe_an73_enable_interrupts(pdata);
0684
0685
0686 if (pdata->vdata->irq_reissue_support)
0687 XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 3);
0688 }
0689 }
0690
0691 static void xgbe_an_isr_task(struct tasklet_struct *t)
0692 {
0693 struct xgbe_prv_data *pdata = from_tasklet(pdata, t, tasklet_an);
0694
0695 netif_dbg(pdata, intr, pdata->netdev, "AN interrupt received\n");
0696
0697 switch (pdata->an_mode) {
0698 case XGBE_AN_MODE_CL73:
0699 case XGBE_AN_MODE_CL73_REDRV:
0700 xgbe_an73_isr(pdata);
0701 break;
0702 case XGBE_AN_MODE_CL37:
0703 case XGBE_AN_MODE_CL37_SGMII:
0704 xgbe_an37_isr(pdata);
0705 break;
0706 default:
0707 break;
0708 }
0709 }
0710
0711 static irqreturn_t xgbe_an_isr(int irq, void *data)
0712 {
0713 struct xgbe_prv_data *pdata = (struct xgbe_prv_data *)data;
0714
0715 if (pdata->isr_as_tasklet)
0716 tasklet_schedule(&pdata->tasklet_an);
0717 else
0718 xgbe_an_isr_task(&pdata->tasklet_an);
0719
0720 return IRQ_HANDLED;
0721 }
0722
0723 static irqreturn_t xgbe_an_combined_isr(struct xgbe_prv_data *pdata)
0724 {
0725 xgbe_an_isr_task(&pdata->tasklet_an);
0726
0727 return IRQ_HANDLED;
0728 }
0729
0730 static void xgbe_an_irq_work(struct work_struct *work)
0731 {
0732 struct xgbe_prv_data *pdata = container_of(work,
0733 struct xgbe_prv_data,
0734 an_irq_work);
0735
0736
0737
0738
0739 flush_work(&pdata->an_work);
0740 queue_work(pdata->an_workqueue, &pdata->an_work);
0741 }
0742
0743 static const char *xgbe_state_as_string(enum xgbe_an state)
0744 {
0745 switch (state) {
0746 case XGBE_AN_READY:
0747 return "Ready";
0748 case XGBE_AN_PAGE_RECEIVED:
0749 return "Page-Received";
0750 case XGBE_AN_INCOMPAT_LINK:
0751 return "Incompatible-Link";
0752 case XGBE_AN_COMPLETE:
0753 return "Complete";
0754 case XGBE_AN_NO_LINK:
0755 return "No-Link";
0756 case XGBE_AN_ERROR:
0757 return "Error";
0758 default:
0759 return "Undefined";
0760 }
0761 }
0762
0763 static void xgbe_an37_state_machine(struct xgbe_prv_data *pdata)
0764 {
0765 enum xgbe_an cur_state = pdata->an_state;
0766
0767 if (!pdata->an_int)
0768 return;
0769
0770 if (pdata->an_int & XGBE_AN_CL37_INT_CMPLT) {
0771 pdata->an_state = XGBE_AN_COMPLETE;
0772 pdata->an_int &= ~XGBE_AN_CL37_INT_CMPLT;
0773
0774
0775 if ((pdata->an_mode == XGBE_AN_MODE_CL37_SGMII) &&
0776 !(pdata->an_status & XGBE_SGMII_AN_LINK_STATUS))
0777 pdata->an_state = XGBE_AN_NO_LINK;
0778 }
0779
0780 netif_dbg(pdata, link, pdata->netdev, "CL37 AN %s\n",
0781 xgbe_state_as_string(pdata->an_state));
0782
0783 cur_state = pdata->an_state;
0784
0785 switch (pdata->an_state) {
0786 case XGBE_AN_READY:
0787 break;
0788
0789 case XGBE_AN_COMPLETE:
0790 netif_dbg(pdata, link, pdata->netdev,
0791 "Auto negotiation successful\n");
0792 break;
0793
0794 case XGBE_AN_NO_LINK:
0795 break;
0796
0797 default:
0798 pdata->an_state = XGBE_AN_ERROR;
0799 }
0800
0801 if (pdata->an_state == XGBE_AN_ERROR) {
0802 netdev_err(pdata->netdev,
0803 "error during auto-negotiation, state=%u\n",
0804 cur_state);
0805
0806 pdata->an_int = 0;
0807 xgbe_an37_clear_interrupts(pdata);
0808 }
0809
0810 if (pdata->an_state >= XGBE_AN_COMPLETE) {
0811 pdata->an_result = pdata->an_state;
0812 pdata->an_state = XGBE_AN_READY;
0813
0814 if (pdata->phy_if.phy_impl.an_post)
0815 pdata->phy_if.phy_impl.an_post(pdata);
0816
0817 netif_dbg(pdata, link, pdata->netdev, "CL37 AN result: %s\n",
0818 xgbe_state_as_string(pdata->an_result));
0819 }
0820
0821 xgbe_an37_enable_interrupts(pdata);
0822 }
0823
0824 static void xgbe_an73_state_machine(struct xgbe_prv_data *pdata)
0825 {
0826 enum xgbe_an cur_state = pdata->an_state;
0827
0828 if (!pdata->an_int)
0829 return;
0830
0831 next_int:
0832 if (pdata->an_int & XGBE_AN_CL73_PG_RCV) {
0833 pdata->an_state = XGBE_AN_PAGE_RECEIVED;
0834 pdata->an_int &= ~XGBE_AN_CL73_PG_RCV;
0835 } else if (pdata->an_int & XGBE_AN_CL73_INC_LINK) {
0836 pdata->an_state = XGBE_AN_INCOMPAT_LINK;
0837 pdata->an_int &= ~XGBE_AN_CL73_INC_LINK;
0838 } else if (pdata->an_int & XGBE_AN_CL73_INT_CMPLT) {
0839 pdata->an_state = XGBE_AN_COMPLETE;
0840 pdata->an_int &= ~XGBE_AN_CL73_INT_CMPLT;
0841 } else {
0842 pdata->an_state = XGBE_AN_ERROR;
0843 }
0844
0845 again:
0846 netif_dbg(pdata, link, pdata->netdev, "CL73 AN %s\n",
0847 xgbe_state_as_string(pdata->an_state));
0848
0849 cur_state = pdata->an_state;
0850
0851 switch (pdata->an_state) {
0852 case XGBE_AN_READY:
0853 pdata->an_supported = 0;
0854 break;
0855
0856 case XGBE_AN_PAGE_RECEIVED:
0857 pdata->an_state = xgbe_an73_page_received(pdata);
0858 pdata->an_supported++;
0859 break;
0860
0861 case XGBE_AN_INCOMPAT_LINK:
0862 pdata->an_supported = 0;
0863 pdata->parallel_detect = 0;
0864 pdata->an_state = xgbe_an73_incompat_link(pdata);
0865 break;
0866
0867 case XGBE_AN_COMPLETE:
0868 pdata->parallel_detect = pdata->an_supported ? 0 : 1;
0869 netif_dbg(pdata, link, pdata->netdev, "%s successful\n",
0870 pdata->an_supported ? "Auto negotiation"
0871 : "Parallel detection");
0872 break;
0873
0874 case XGBE_AN_NO_LINK:
0875 break;
0876
0877 default:
0878 pdata->an_state = XGBE_AN_ERROR;
0879 }
0880
0881 if (pdata->an_state == XGBE_AN_NO_LINK) {
0882 pdata->an_int = 0;
0883 xgbe_an73_clear_interrupts(pdata);
0884 } else if (pdata->an_state == XGBE_AN_ERROR) {
0885 netdev_err(pdata->netdev,
0886 "error during auto-negotiation, state=%u\n",
0887 cur_state);
0888
0889 pdata->an_int = 0;
0890 xgbe_an73_clear_interrupts(pdata);
0891 }
0892
0893 if (pdata->an_state >= XGBE_AN_COMPLETE) {
0894 pdata->an_result = pdata->an_state;
0895 pdata->an_state = XGBE_AN_READY;
0896 pdata->kr_state = XGBE_RX_BPA;
0897 pdata->kx_state = XGBE_RX_BPA;
0898 pdata->an_start = 0;
0899
0900 if (pdata->phy_if.phy_impl.an_post)
0901 pdata->phy_if.phy_impl.an_post(pdata);
0902
0903 netif_dbg(pdata, link, pdata->netdev, "CL73 AN result: %s\n",
0904 xgbe_state_as_string(pdata->an_result));
0905 }
0906
0907 if (cur_state != pdata->an_state)
0908 goto again;
0909
0910 if (pdata->an_int)
0911 goto next_int;
0912
0913 xgbe_an73_enable_interrupts(pdata);
0914 }
0915
0916 static void xgbe_an_state_machine(struct work_struct *work)
0917 {
0918 struct xgbe_prv_data *pdata = container_of(work,
0919 struct xgbe_prv_data,
0920 an_work);
0921
0922 mutex_lock(&pdata->an_mutex);
0923
0924 switch (pdata->an_mode) {
0925 case XGBE_AN_MODE_CL73:
0926 case XGBE_AN_MODE_CL73_REDRV:
0927 xgbe_an73_state_machine(pdata);
0928 break;
0929 case XGBE_AN_MODE_CL37:
0930 case XGBE_AN_MODE_CL37_SGMII:
0931 xgbe_an37_state_machine(pdata);
0932 break;
0933 default:
0934 break;
0935 }
0936
0937
0938 if (pdata->vdata->irq_reissue_support)
0939 XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 3);
0940
0941 mutex_unlock(&pdata->an_mutex);
0942 }
0943
0944 static void xgbe_an37_init(struct xgbe_prv_data *pdata)
0945 {
0946 struct ethtool_link_ksettings lks;
0947 unsigned int reg;
0948
0949 pdata->phy_if.phy_impl.an_advertising(pdata, &lks);
0950
0951
0952 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
0953 if (XGBE_ADV(&lks, Pause))
0954 reg |= 0x100;
0955 else
0956 reg &= ~0x100;
0957
0958 if (XGBE_ADV(&lks, Asym_Pause))
0959 reg |= 0x80;
0960 else
0961 reg &= ~0x80;
0962
0963
0964 reg |= XGBE_AN_CL37_FD_MASK;
0965 reg &= ~XGBE_AN_CL37_HD_MASK;
0966
0967 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE, reg);
0968
0969
0970 reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL);
0971 reg &= ~XGBE_AN_CL37_TX_CONFIG_MASK;
0972 reg &= ~XGBE_AN_CL37_PCS_MODE_MASK;
0973
0974 switch (pdata->an_mode) {
0975 case XGBE_AN_MODE_CL37:
0976 reg |= XGBE_AN_CL37_PCS_MODE_BASEX;
0977 break;
0978 case XGBE_AN_MODE_CL37_SGMII:
0979 reg |= XGBE_AN_CL37_PCS_MODE_SGMII;
0980 break;
0981 default:
0982 break;
0983 }
0984
0985 reg |= XGBE_AN_CL37_MII_CTRL_8BIT;
0986
0987 XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_CTRL, reg);
0988
0989 netif_dbg(pdata, link, pdata->netdev, "CL37 AN (%s) initialized\n",
0990 (pdata->an_mode == XGBE_AN_MODE_CL37) ? "BaseX" : "SGMII");
0991 }
0992
0993 static void xgbe_an73_init(struct xgbe_prv_data *pdata)
0994 {
0995 struct ethtool_link_ksettings lks;
0996 unsigned int reg;
0997
0998 pdata->phy_if.phy_impl.an_advertising(pdata, &lks);
0999
1000
1001 reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1002 if (XGBE_ADV(&lks, 10000baseR_FEC))
1003 reg |= 0xc000;
1004 else
1005 reg &= ~0xc000;
1006
1007 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2, reg);
1008
1009
1010 reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1011 if (XGBE_ADV(&lks, 10000baseKR_Full))
1012 reg |= 0x80;
1013 else
1014 reg &= ~0x80;
1015
1016 if (XGBE_ADV(&lks, 1000baseKX_Full) ||
1017 XGBE_ADV(&lks, 2500baseX_Full))
1018 reg |= 0x20;
1019 else
1020 reg &= ~0x20;
1021
1022 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1, reg);
1023
1024
1025 reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1026 if (XGBE_ADV(&lks, Pause))
1027 reg |= 0x400;
1028 else
1029 reg &= ~0x400;
1030
1031 if (XGBE_ADV(&lks, Asym_Pause))
1032 reg |= 0x800;
1033 else
1034 reg &= ~0x800;
1035
1036
1037 reg &= ~XGBE_XNP_NP_EXCHANGE;
1038
1039 XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE, reg);
1040
1041 netif_dbg(pdata, link, pdata->netdev, "CL73 AN initialized\n");
1042 }
1043
1044 static void xgbe_an_init(struct xgbe_prv_data *pdata)
1045 {
1046
1047 pdata->an_mode = pdata->phy_if.phy_impl.an_mode(pdata);
1048 switch (pdata->an_mode) {
1049 case XGBE_AN_MODE_CL73:
1050 case XGBE_AN_MODE_CL73_REDRV:
1051 xgbe_an73_init(pdata);
1052 break;
1053 case XGBE_AN_MODE_CL37:
1054 case XGBE_AN_MODE_CL37_SGMII:
1055 xgbe_an37_init(pdata);
1056 break;
1057 default:
1058 break;
1059 }
1060 }
1061
1062 static const char *xgbe_phy_fc_string(struct xgbe_prv_data *pdata)
1063 {
1064 if (pdata->tx_pause && pdata->rx_pause)
1065 return "rx/tx";
1066 else if (pdata->rx_pause)
1067 return "rx";
1068 else if (pdata->tx_pause)
1069 return "tx";
1070 else
1071 return "off";
1072 }
1073
1074 static const char *xgbe_phy_speed_string(int speed)
1075 {
1076 switch (speed) {
1077 case SPEED_100:
1078 return "100Mbps";
1079 case SPEED_1000:
1080 return "1Gbps";
1081 case SPEED_2500:
1082 return "2.5Gbps";
1083 case SPEED_10000:
1084 return "10Gbps";
1085 case SPEED_UNKNOWN:
1086 return "Unknown";
1087 default:
1088 return "Unsupported";
1089 }
1090 }
1091
1092 static void xgbe_phy_print_status(struct xgbe_prv_data *pdata)
1093 {
1094 if (pdata->phy.link)
1095 netdev_info(pdata->netdev,
1096 "Link is Up - %s/%s - flow control %s\n",
1097 xgbe_phy_speed_string(pdata->phy.speed),
1098 pdata->phy.duplex == DUPLEX_FULL ? "Full" : "Half",
1099 xgbe_phy_fc_string(pdata));
1100 else
1101 netdev_info(pdata->netdev, "Link is Down\n");
1102 }
1103
1104 static void xgbe_phy_adjust_link(struct xgbe_prv_data *pdata)
1105 {
1106 int new_state = 0;
1107
1108 if (pdata->phy.link) {
1109
1110 pdata->pause_autoneg = pdata->phy.pause_autoneg;
1111
1112 if (pdata->tx_pause != pdata->phy.tx_pause) {
1113 new_state = 1;
1114 pdata->tx_pause = pdata->phy.tx_pause;
1115 pdata->hw_if.config_tx_flow_control(pdata);
1116 }
1117
1118 if (pdata->rx_pause != pdata->phy.rx_pause) {
1119 new_state = 1;
1120 pdata->rx_pause = pdata->phy.rx_pause;
1121 pdata->hw_if.config_rx_flow_control(pdata);
1122 }
1123
1124
1125 if (pdata->phy_speed != pdata->phy.speed) {
1126 new_state = 1;
1127 pdata->phy_speed = pdata->phy.speed;
1128 }
1129
1130 if (pdata->phy_link != pdata->phy.link) {
1131 new_state = 1;
1132 pdata->phy_link = pdata->phy.link;
1133 }
1134 } else if (pdata->phy_link) {
1135 new_state = 1;
1136 pdata->phy_link = 0;
1137 pdata->phy_speed = SPEED_UNKNOWN;
1138 }
1139
1140 if (new_state && netif_msg_link(pdata))
1141 xgbe_phy_print_status(pdata);
1142 }
1143
1144 static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
1145 {
1146 return pdata->phy_if.phy_impl.valid_speed(pdata, speed);
1147 }
1148
1149 static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata)
1150 {
1151 enum xgbe_mode mode;
1152
1153 netif_dbg(pdata, link, pdata->netdev, "fixed PHY configuration\n");
1154
1155
1156 xgbe_an_disable(pdata);
1157
1158
1159 mode = pdata->phy_if.phy_impl.get_mode(pdata, pdata->phy.speed);
1160 switch (mode) {
1161 case XGBE_MODE_KX_1000:
1162 case XGBE_MODE_KX_2500:
1163 case XGBE_MODE_KR:
1164 case XGBE_MODE_SGMII_100:
1165 case XGBE_MODE_SGMII_1000:
1166 case XGBE_MODE_X:
1167 case XGBE_MODE_SFI:
1168 break;
1169 case XGBE_MODE_UNKNOWN:
1170 default:
1171 return -EINVAL;
1172 }
1173
1174
1175 if (pdata->phy.duplex != DUPLEX_FULL)
1176 return -EINVAL;
1177
1178 xgbe_set_mode(pdata, mode);
1179
1180 return 0;
1181 }
1182
1183 static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode)
1184 {
1185 int ret;
1186
1187 mutex_lock(&pdata->an_mutex);
1188
1189 set_bit(XGBE_LINK_INIT, &pdata->dev_state);
1190 pdata->link_check = jiffies;
1191
1192 ret = pdata->phy_if.phy_impl.an_config(pdata);
1193 if (ret)
1194 goto out;
1195
1196 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1197 ret = xgbe_phy_config_fixed(pdata);
1198 if (ret || !pdata->kr_redrv)
1199 goto out;
1200
1201 netif_dbg(pdata, link, pdata->netdev, "AN redriver support\n");
1202 } else {
1203 netif_dbg(pdata, link, pdata->netdev, "AN PHY configuration\n");
1204 }
1205
1206
1207 disable_irq(pdata->an_irq);
1208
1209 if (set_mode) {
1210
1211 if (xgbe_use_mode(pdata, XGBE_MODE_KR)) {
1212 xgbe_set_mode(pdata, XGBE_MODE_KR);
1213 } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_2500)) {
1214 xgbe_set_mode(pdata, XGBE_MODE_KX_2500);
1215 } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_1000)) {
1216 xgbe_set_mode(pdata, XGBE_MODE_KX_1000);
1217 } else if (xgbe_use_mode(pdata, XGBE_MODE_SFI)) {
1218 xgbe_set_mode(pdata, XGBE_MODE_SFI);
1219 } else if (xgbe_use_mode(pdata, XGBE_MODE_X)) {
1220 xgbe_set_mode(pdata, XGBE_MODE_X);
1221 } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_1000)) {
1222 xgbe_set_mode(pdata, XGBE_MODE_SGMII_1000);
1223 } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) {
1224 xgbe_set_mode(pdata, XGBE_MODE_SGMII_100);
1225 } else {
1226 enable_irq(pdata->an_irq);
1227 ret = -EINVAL;
1228 goto out;
1229 }
1230 }
1231
1232
1233 xgbe_an_disable_all(pdata);
1234
1235
1236 xgbe_an_clear_interrupts_all(pdata);
1237
1238 pdata->an_result = XGBE_AN_READY;
1239 pdata->an_state = XGBE_AN_READY;
1240 pdata->kr_state = XGBE_RX_BPA;
1241 pdata->kx_state = XGBE_RX_BPA;
1242
1243
1244 enable_irq(pdata->an_irq);
1245
1246 xgbe_an_init(pdata);
1247 xgbe_an_restart(pdata);
1248
1249 out:
1250 if (ret)
1251 set_bit(XGBE_LINK_ERR, &pdata->dev_state);
1252 else
1253 clear_bit(XGBE_LINK_ERR, &pdata->dev_state);
1254
1255 mutex_unlock(&pdata->an_mutex);
1256
1257 return ret;
1258 }
1259
1260 static int xgbe_phy_config_aneg(struct xgbe_prv_data *pdata)
1261 {
1262 return __xgbe_phy_config_aneg(pdata, true);
1263 }
1264
1265 static int xgbe_phy_reconfig_aneg(struct xgbe_prv_data *pdata)
1266 {
1267 return __xgbe_phy_config_aneg(pdata, false);
1268 }
1269
1270 static bool xgbe_phy_aneg_done(struct xgbe_prv_data *pdata)
1271 {
1272 return (pdata->an_result == XGBE_AN_COMPLETE);
1273 }
1274
1275 static void xgbe_check_link_timeout(struct xgbe_prv_data *pdata)
1276 {
1277 unsigned long link_timeout;
1278
1279 link_timeout = pdata->link_check + (XGBE_LINK_TIMEOUT * HZ);
1280 if (time_after(jiffies, link_timeout)) {
1281 netif_dbg(pdata, link, pdata->netdev, "AN link timeout\n");
1282 xgbe_phy_config_aneg(pdata);
1283 }
1284 }
1285
1286 static enum xgbe_mode xgbe_phy_status_aneg(struct xgbe_prv_data *pdata)
1287 {
1288 return pdata->phy_if.phy_impl.an_outcome(pdata);
1289 }
1290
1291 static void xgbe_phy_status_result(struct xgbe_prv_data *pdata)
1292 {
1293 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1294 enum xgbe_mode mode;
1295
1296 XGBE_ZERO_LP_ADV(lks);
1297
1298 if ((pdata->phy.autoneg != AUTONEG_ENABLE) || pdata->parallel_detect)
1299 mode = xgbe_cur_mode(pdata);
1300 else
1301 mode = xgbe_phy_status_aneg(pdata);
1302
1303 switch (mode) {
1304 case XGBE_MODE_SGMII_100:
1305 pdata->phy.speed = SPEED_100;
1306 break;
1307 case XGBE_MODE_X:
1308 case XGBE_MODE_KX_1000:
1309 case XGBE_MODE_SGMII_1000:
1310 pdata->phy.speed = SPEED_1000;
1311 break;
1312 case XGBE_MODE_KX_2500:
1313 pdata->phy.speed = SPEED_2500;
1314 break;
1315 case XGBE_MODE_KR:
1316 case XGBE_MODE_SFI:
1317 pdata->phy.speed = SPEED_10000;
1318 break;
1319 case XGBE_MODE_UNKNOWN:
1320 default:
1321 pdata->phy.speed = SPEED_UNKNOWN;
1322 }
1323
1324 pdata->phy.duplex = DUPLEX_FULL;
1325
1326 if (xgbe_set_mode(pdata, mode) && pdata->an_again)
1327 xgbe_phy_reconfig_aneg(pdata);
1328 }
1329
1330 static void xgbe_phy_status(struct xgbe_prv_data *pdata)
1331 {
1332 unsigned int link_aneg;
1333 int an_restart;
1334
1335 if (test_bit(XGBE_LINK_ERR, &pdata->dev_state)) {
1336 netif_carrier_off(pdata->netdev);
1337
1338 pdata->phy.link = 0;
1339 goto adjust_link;
1340 }
1341
1342 link_aneg = (pdata->phy.autoneg == AUTONEG_ENABLE);
1343
1344 pdata->phy.link = pdata->phy_if.phy_impl.link_status(pdata,
1345 &an_restart);
1346 if (an_restart) {
1347 xgbe_phy_config_aneg(pdata);
1348 goto adjust_link;
1349 }
1350
1351 if (pdata->phy.link) {
1352 if (link_aneg && !xgbe_phy_aneg_done(pdata)) {
1353 xgbe_check_link_timeout(pdata);
1354 return;
1355 }
1356
1357 xgbe_phy_status_result(pdata);
1358
1359 if (test_bit(XGBE_LINK_INIT, &pdata->dev_state))
1360 clear_bit(XGBE_LINK_INIT, &pdata->dev_state);
1361
1362 netif_carrier_on(pdata->netdev);
1363 } else {
1364 if (test_bit(XGBE_LINK_INIT, &pdata->dev_state)) {
1365 xgbe_check_link_timeout(pdata);
1366
1367 if (link_aneg)
1368 return;
1369 }
1370
1371 xgbe_phy_status_result(pdata);
1372
1373 netif_carrier_off(pdata->netdev);
1374 }
1375
1376 adjust_link:
1377 xgbe_phy_adjust_link(pdata);
1378 }
1379
1380 static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
1381 {
1382 netif_dbg(pdata, link, pdata->netdev, "stopping PHY\n");
1383
1384 if (!pdata->phy_started)
1385 return;
1386
1387
1388 pdata->phy_started = 0;
1389
1390
1391 xgbe_an_disable_all(pdata);
1392
1393 if (pdata->dev_irq != pdata->an_irq)
1394 devm_free_irq(pdata->dev, pdata->an_irq, pdata);
1395
1396 pdata->phy_if.phy_impl.stop(pdata);
1397
1398 pdata->phy.link = 0;
1399
1400 xgbe_phy_adjust_link(pdata);
1401 }
1402
1403 static int xgbe_phy_start(struct xgbe_prv_data *pdata)
1404 {
1405 struct net_device *netdev = pdata->netdev;
1406 int ret;
1407
1408 netif_dbg(pdata, link, pdata->netdev, "starting PHY\n");
1409
1410 ret = pdata->phy_if.phy_impl.start(pdata);
1411 if (ret)
1412 return ret;
1413
1414
1415 if (pdata->dev_irq != pdata->an_irq) {
1416 tasklet_setup(&pdata->tasklet_an, xgbe_an_isr_task);
1417
1418 ret = devm_request_irq(pdata->dev, pdata->an_irq,
1419 xgbe_an_isr, 0, pdata->an_name,
1420 pdata);
1421 if (ret) {
1422 netdev_err(netdev, "phy irq request failed\n");
1423 goto err_stop;
1424 }
1425 }
1426
1427
1428
1429
1430 if (xgbe_use_mode(pdata, XGBE_MODE_KR)) {
1431 xgbe_kr_mode(pdata);
1432 } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_2500)) {
1433 xgbe_kx_2500_mode(pdata);
1434 } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_1000)) {
1435 xgbe_kx_1000_mode(pdata);
1436 } else if (xgbe_use_mode(pdata, XGBE_MODE_SFI)) {
1437 xgbe_sfi_mode(pdata);
1438 } else if (xgbe_use_mode(pdata, XGBE_MODE_X)) {
1439 xgbe_x_mode(pdata);
1440 } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_1000)) {
1441 xgbe_sgmii_1000_mode(pdata);
1442 } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) {
1443 xgbe_sgmii_100_mode(pdata);
1444 } else {
1445 ret = -EINVAL;
1446 goto err_irq;
1447 }
1448
1449
1450 pdata->phy_started = 1;
1451
1452 xgbe_an_init(pdata);
1453 xgbe_an_enable_interrupts(pdata);
1454
1455 return xgbe_phy_config_aneg(pdata);
1456
1457 err_irq:
1458 if (pdata->dev_irq != pdata->an_irq)
1459 devm_free_irq(pdata->dev, pdata->an_irq, pdata);
1460
1461 err_stop:
1462 pdata->phy_if.phy_impl.stop(pdata);
1463
1464 return ret;
1465 }
1466
1467 static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
1468 {
1469 int ret;
1470
1471 ret = pdata->phy_if.phy_impl.reset(pdata);
1472 if (ret)
1473 return ret;
1474
1475
1476 xgbe_an_disable_all(pdata);
1477
1478
1479 xgbe_an_clear_interrupts_all(pdata);
1480
1481 return 0;
1482 }
1483
1484 static void xgbe_dump_phy_registers(struct xgbe_prv_data *pdata)
1485 {
1486 struct device *dev = pdata->dev;
1487
1488 dev_dbg(dev, "\n************* PHY Reg dump **********************\n");
1489
1490 dev_dbg(dev, "PCS Control Reg (%#06x) = %#06x\n", MDIO_CTRL1,
1491 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1));
1492 dev_dbg(dev, "PCS Status Reg (%#06x) = %#06x\n", MDIO_STAT1,
1493 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1));
1494 dev_dbg(dev, "Phy Id (PHYS ID 1 %#06x)= %#06x\n", MDIO_DEVID1,
1495 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID1));
1496 dev_dbg(dev, "Phy Id (PHYS ID 2 %#06x)= %#06x\n", MDIO_DEVID2,
1497 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID2));
1498 dev_dbg(dev, "Devices in Package (%#06x)= %#06x\n", MDIO_DEVS1,
1499 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS1));
1500 dev_dbg(dev, "Devices in Package (%#06x)= %#06x\n", MDIO_DEVS2,
1501 XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS2));
1502
1503 dev_dbg(dev, "Auto-Neg Control Reg (%#06x) = %#06x\n", MDIO_CTRL1,
1504 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1));
1505 dev_dbg(dev, "Auto-Neg Status Reg (%#06x) = %#06x\n", MDIO_STAT1,
1506 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_STAT1));
1507 dev_dbg(dev, "Auto-Neg Ad Reg 1 (%#06x) = %#06x\n",
1508 MDIO_AN_ADVERTISE,
1509 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE));
1510 dev_dbg(dev, "Auto-Neg Ad Reg 2 (%#06x) = %#06x\n",
1511 MDIO_AN_ADVERTISE + 1,
1512 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1));
1513 dev_dbg(dev, "Auto-Neg Ad Reg 3 (%#06x) = %#06x\n",
1514 MDIO_AN_ADVERTISE + 2,
1515 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2));
1516 dev_dbg(dev, "Auto-Neg Completion Reg (%#06x) = %#06x\n",
1517 MDIO_AN_COMP_STAT,
1518 XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_COMP_STAT));
1519
1520 dev_dbg(dev, "\n*************************************************\n");
1521 }
1522
1523 static int xgbe_phy_best_advertised_speed(struct xgbe_prv_data *pdata)
1524 {
1525 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1526
1527 if (XGBE_ADV(lks, 10000baseKR_Full))
1528 return SPEED_10000;
1529 else if (XGBE_ADV(lks, 10000baseT_Full))
1530 return SPEED_10000;
1531 else if (XGBE_ADV(lks, 2500baseX_Full))
1532 return SPEED_2500;
1533 else if (XGBE_ADV(lks, 2500baseT_Full))
1534 return SPEED_2500;
1535 else if (XGBE_ADV(lks, 1000baseKX_Full))
1536 return SPEED_1000;
1537 else if (XGBE_ADV(lks, 1000baseT_Full))
1538 return SPEED_1000;
1539 else if (XGBE_ADV(lks, 100baseT_Full))
1540 return SPEED_100;
1541
1542 return SPEED_UNKNOWN;
1543 }
1544
1545 static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
1546 {
1547 pdata->phy_if.phy_impl.exit(pdata);
1548 }
1549
1550 static int xgbe_phy_init(struct xgbe_prv_data *pdata)
1551 {
1552 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
1553 int ret;
1554
1555 mutex_init(&pdata->an_mutex);
1556 INIT_WORK(&pdata->an_irq_work, xgbe_an_irq_work);
1557 INIT_WORK(&pdata->an_work, xgbe_an_state_machine);
1558 pdata->mdio_mmd = MDIO_MMD_PCS;
1559
1560
1561 pdata->fec_ability = XMDIO_READ(pdata, MDIO_MMD_PMAPMD,
1562 MDIO_PMA_10GBR_FECABLE);
1563 pdata->fec_ability &= (MDIO_PMA_10GBR_FECABLE_ABLE |
1564 MDIO_PMA_10GBR_FECABLE_ERRABLE);
1565
1566
1567 ret = pdata->phy_if.phy_impl.init(pdata);
1568 if (ret)
1569 return ret;
1570
1571
1572 XGBE_LM_COPY(lks, advertising, lks, supported);
1573
1574 pdata->phy.address = 0;
1575
1576 if (XGBE_ADV(lks, Autoneg)) {
1577 pdata->phy.autoneg = AUTONEG_ENABLE;
1578 pdata->phy.speed = SPEED_UNKNOWN;
1579 pdata->phy.duplex = DUPLEX_UNKNOWN;
1580 } else {
1581 pdata->phy.autoneg = AUTONEG_DISABLE;
1582 pdata->phy.speed = xgbe_phy_best_advertised_speed(pdata);
1583 pdata->phy.duplex = DUPLEX_FULL;
1584 }
1585
1586 pdata->phy.link = 0;
1587
1588 pdata->phy.pause_autoneg = pdata->pause_autoneg;
1589 pdata->phy.tx_pause = pdata->tx_pause;
1590 pdata->phy.rx_pause = pdata->rx_pause;
1591
1592
1593 XGBE_CLR_ADV(lks, Pause);
1594 XGBE_CLR_ADV(lks, Asym_Pause);
1595
1596 if (pdata->rx_pause) {
1597 XGBE_SET_ADV(lks, Pause);
1598 XGBE_SET_ADV(lks, Asym_Pause);
1599 }
1600
1601 if (pdata->tx_pause) {
1602
1603 if (XGBE_ADV(lks, Asym_Pause))
1604 XGBE_CLR_ADV(lks, Asym_Pause);
1605 else
1606 XGBE_SET_ADV(lks, Asym_Pause);
1607 }
1608
1609 if (netif_msg_drv(pdata))
1610 xgbe_dump_phy_registers(pdata);
1611
1612 return 0;
1613 }
1614
1615 void xgbe_init_function_ptrs_phy(struct xgbe_phy_if *phy_if)
1616 {
1617 phy_if->phy_init = xgbe_phy_init;
1618 phy_if->phy_exit = xgbe_phy_exit;
1619
1620 phy_if->phy_reset = xgbe_phy_reset;
1621 phy_if->phy_start = xgbe_phy_start;
1622 phy_if->phy_stop = xgbe_phy_stop;
1623
1624 phy_if->phy_status = xgbe_phy_status;
1625 phy_if->phy_config_aneg = xgbe_phy_config_aneg;
1626
1627 phy_if->phy_valid_speed = xgbe_phy_valid_speed;
1628
1629 phy_if->an_isr = xgbe_an_combined_isr;
1630
1631 phy_if->module_info = xgbe_phy_module_info;
1632 phy_if->module_eeprom = xgbe_phy_module_eeprom;
1633 }