1 /* 2 * Copyright (C) 2005 Freescale Semiconductor, Inc. 3 * 4 * Author: Shlomi Gridish 5 * 6 * Description: UCC GETH Driver -- PHY handling 7 * Driver for UEC on QE 8 * Based on 8260_io/fcc_enet.c 9 * 10 * This program is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU General Public License as published by the 12 * Free Software Foundation; either version 2 of the License, or (at your 13 * option) any later version. 14 * 15 */ 16 17 #include "common.h" 18 #include "net.h" 19 #include "malloc.h" 20 #include "asm/errno.h" 21 #include "asm/immap_qe.h" 22 #include "asm/io.h" 23 #include "qe.h" 24 #include "uccf.h" 25 #include "uec.h" 26 #include "uec_phy.h" 27 #include "miiphy.h" 28 29 #if defined(CONFIG_QE) 30 31 #define UEC_VERBOSE_DEBUG 32 #define ugphy_printk(format, arg...) \ 33 printf(format "\n", ## arg) 34 35 #define ugphy_dbg(format, arg...) \ 36 ugphy_printk(format , ## arg) 37 #define ugphy_err(format, arg...) \ 38 ugphy_printk(format , ## arg) 39 #define ugphy_info(format, arg...) \ 40 ugphy_printk(format , ## arg) 41 #define ugphy_warn(format, arg...) \ 42 ugphy_printk(format , ## arg) 43 44 #ifdef UEC_VERBOSE_DEBUG 45 #define ugphy_vdbg ugphy_dbg 46 #else 47 #define ugphy_vdbg(ugeth, fmt, args...) do { } while (0) 48 #endif /* UEC_VERBOSE_DEBUG */ 49 50 static void config_genmii_advert (struct uec_mii_info *mii_info); 51 static void genmii_setup_forced (struct uec_mii_info *mii_info); 52 static void genmii_restart_aneg (struct uec_mii_info *mii_info); 53 static int gbit_config_aneg (struct uec_mii_info *mii_info); 54 static int genmii_config_aneg (struct uec_mii_info *mii_info); 55 static int genmii_update_link (struct uec_mii_info *mii_info); 56 static int genmii_read_status (struct uec_mii_info *mii_info); 57 u16 phy_read (struct uec_mii_info *mii_info, u16 regnum); 58 void phy_write (struct uec_mii_info *mii_info, u16 regnum, u16 val); 59 60 /* Write value to the PHY for this device to the register at regnum, */ 61 /* waiting until the write is done before it returns. All PHY */ 62 /* configuration has to be done through the TSEC1 MIIM regs */ 63 void uec_write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int value) 64 { 65 uec_private_t *ugeth = (uec_private_t *) dev->priv; 66 uec_mii_t *ug_regs; 67 enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum; 68 u32 tmp_reg; 69 70 ug_regs = ugeth->uec_mii_regs; 71 72 /* Stop the MII management read cycle */ 73 out_be32 (&ug_regs->miimcom, 0); 74 /* Setting up the MII Mangement Address Register */ 75 tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg; 76 out_be32 (&ug_regs->miimadd, tmp_reg); 77 78 /* Setting up the MII Mangement Control Register with the value */ 79 out_be32 (&ug_regs->miimcon, (u32) value); 80 sync(); 81 82 /* Wait till MII management write is complete */ 83 while ((in_be32 (&ug_regs->miimind)) & MIIMIND_BUSY); 84 } 85 86 /* Reads from register regnum in the PHY for device dev, */ 87 /* returning the value. Clears miimcom first. All PHY */ 88 /* configuration has to be done through the TSEC1 MIIM regs */ 89 int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum) 90 { 91 uec_private_t *ugeth = (uec_private_t *) dev->priv; 92 uec_mii_t *ug_regs; 93 enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum; 94 u32 tmp_reg; 95 u16 value; 96 97 ug_regs = ugeth->uec_mii_regs; 98 99 /* Setting up the MII Mangement Address Register */ 100 tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg; 101 out_be32 (&ug_regs->miimadd, tmp_reg); 102 103 /* clear MII management command cycle */ 104 out_be32 (&ug_regs->miimcom, 0); 105 sync(); 106 107 /* Perform an MII management read cycle */ 108 out_be32 (&ug_regs->miimcom, MIIMCOM_READ_CYCLE); 109 110 /* Wait till MII management write is complete */ 111 while ((in_be32 (&ug_regs->miimind)) & 112 (MIIMIND_NOT_VALID | MIIMIND_BUSY)); 113 114 /* Read MII management status */ 115 value = (u16) in_be32 (&ug_regs->miimstat); 116 if (value == 0xffff) 117 ugphy_warn 118 ("read wrong value : mii_id %d,mii_reg %d, base %08x", 119 mii_id, mii_reg, (u32) & (ug_regs->miimcfg)); 120 121 return (value); 122 } 123 124 void mii_clear_phy_interrupt (struct uec_mii_info *mii_info) 125 { 126 if (mii_info->phyinfo->ack_interrupt) 127 mii_info->phyinfo->ack_interrupt (mii_info); 128 } 129 130 void mii_configure_phy_interrupt (struct uec_mii_info *mii_info, 131 u32 interrupts) 132 { 133 mii_info->interrupts = interrupts; 134 if (mii_info->phyinfo->config_intr) 135 mii_info->phyinfo->config_intr (mii_info); 136 } 137 138 /* Writes MII_ADVERTISE with the appropriate values, after 139 * sanitizing advertise to make sure only supported features 140 * are advertised 141 */ 142 static void config_genmii_advert (struct uec_mii_info *mii_info) 143 { 144 u32 advertise; 145 u16 adv; 146 147 /* Only allow advertising what this PHY supports */ 148 mii_info->advertising &= mii_info->phyinfo->features; 149 advertise = mii_info->advertising; 150 151 /* Setup standard advertisement */ 152 adv = phy_read (mii_info, PHY_ANAR); 153 adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); 154 if (advertise & ADVERTISED_10baseT_Half) 155 adv |= ADVERTISE_10HALF; 156 if (advertise & ADVERTISED_10baseT_Full) 157 adv |= ADVERTISE_10FULL; 158 if (advertise & ADVERTISED_100baseT_Half) 159 adv |= ADVERTISE_100HALF; 160 if (advertise & ADVERTISED_100baseT_Full) 161 adv |= ADVERTISE_100FULL; 162 phy_write (mii_info, PHY_ANAR, adv); 163 } 164 165 static void genmii_setup_forced (struct uec_mii_info *mii_info) 166 { 167 u16 ctrl; 168 u32 features = mii_info->phyinfo->features; 169 170 ctrl = phy_read (mii_info, PHY_BMCR); 171 172 ctrl &= ~(PHY_BMCR_DPLX | PHY_BMCR_100_MBPS | 173 PHY_BMCR_1000_MBPS | PHY_BMCR_AUTON); 174 ctrl |= PHY_BMCR_RESET; 175 176 switch (mii_info->speed) { 177 case SPEED_1000: 178 if (features & (SUPPORTED_1000baseT_Half 179 | SUPPORTED_1000baseT_Full)) { 180 ctrl |= PHY_BMCR_1000_MBPS; 181 break; 182 } 183 mii_info->speed = SPEED_100; 184 case SPEED_100: 185 if (features & (SUPPORTED_100baseT_Half 186 | SUPPORTED_100baseT_Full)) { 187 ctrl |= PHY_BMCR_100_MBPS; 188 break; 189 } 190 mii_info->speed = SPEED_10; 191 case SPEED_10: 192 if (features & (SUPPORTED_10baseT_Half 193 | SUPPORTED_10baseT_Full)) 194 break; 195 default: /* Unsupported speed! */ 196 ugphy_err ("%s: Bad speed!", mii_info->dev->name); 197 break; 198 } 199 200 phy_write (mii_info, PHY_BMCR, ctrl); 201 } 202 203 /* Enable and Restart Autonegotiation */ 204 static void genmii_restart_aneg (struct uec_mii_info *mii_info) 205 { 206 u16 ctl; 207 208 ctl = phy_read (mii_info, PHY_BMCR); 209 ctl |= (PHY_BMCR_AUTON | PHY_BMCR_RST_NEG); 210 phy_write (mii_info, PHY_BMCR, ctl); 211 } 212 213 static int gbit_config_aneg (struct uec_mii_info *mii_info) 214 { 215 u16 adv; 216 u32 advertise; 217 218 if (mii_info->autoneg) { 219 /* Configure the ADVERTISE register */ 220 config_genmii_advert (mii_info); 221 advertise = mii_info->advertising; 222 223 adv = phy_read (mii_info, MII_1000BASETCONTROL); 224 adv &= ~(MII_1000BASETCONTROL_FULLDUPLEXCAP | 225 MII_1000BASETCONTROL_HALFDUPLEXCAP); 226 if (advertise & SUPPORTED_1000baseT_Half) 227 adv |= MII_1000BASETCONTROL_HALFDUPLEXCAP; 228 if (advertise & SUPPORTED_1000baseT_Full) 229 adv |= MII_1000BASETCONTROL_FULLDUPLEXCAP; 230 phy_write (mii_info, MII_1000BASETCONTROL, adv); 231 232 /* Start/Restart aneg */ 233 genmii_restart_aneg (mii_info); 234 } else 235 genmii_setup_forced (mii_info); 236 237 return 0; 238 } 239 240 static int marvell_config_aneg (struct uec_mii_info *mii_info) 241 { 242 /* The Marvell PHY has an errata which requires 243 * that certain registers get written in order 244 * to restart autonegotiation */ 245 phy_write (mii_info, PHY_BMCR, PHY_BMCR_RESET); 246 247 phy_write (mii_info, 0x1d, 0x1f); 248 phy_write (mii_info, 0x1e, 0x200c); 249 phy_write (mii_info, 0x1d, 0x5); 250 phy_write (mii_info, 0x1e, 0); 251 phy_write (mii_info, 0x1e, 0x100); 252 253 gbit_config_aneg (mii_info); 254 255 return 0; 256 } 257 258 static int genmii_config_aneg (struct uec_mii_info *mii_info) 259 { 260 if (mii_info->autoneg) { 261 config_genmii_advert (mii_info); 262 genmii_restart_aneg (mii_info); 263 } else 264 genmii_setup_forced (mii_info); 265 266 return 0; 267 } 268 269 static int genmii_update_link (struct uec_mii_info *mii_info) 270 { 271 u16 status; 272 273 /* Status is read once to clear old link state */ 274 phy_read (mii_info, PHY_BMSR); 275 276 /* 277 * Wait if the link is up, and autonegotiation is in progress 278 * (ie - we're capable and it's not done) 279 */ 280 status = phy_read(mii_info, PHY_BMSR); 281 if ((status & PHY_BMSR_LS) && (status & PHY_BMSR_AUTN_ABLE) 282 && !(status & PHY_BMSR_AUTN_COMP)) { 283 int i = 0; 284 285 while (!(status & PHY_BMSR_AUTN_COMP)) { 286 /* 287 * Timeout reached ? 288 */ 289 if (i > UGETH_AN_TIMEOUT) { 290 mii_info->link = 0; 291 return 0; 292 } 293 294 udelay(1000); /* 1 ms */ 295 status = phy_read(mii_info, PHY_BMSR); 296 } 297 mii_info->link = 1; 298 udelay(500000); /* another 500 ms (results in faster booting) */ 299 } else { 300 if (status & PHY_BMSR_LS) 301 mii_info->link = 1; 302 else 303 mii_info->link = 0; 304 } 305 306 return 0; 307 } 308 309 static int genmii_read_status (struct uec_mii_info *mii_info) 310 { 311 u16 status; 312 int err; 313 314 /* Update the link, but return if there 315 * was an error */ 316 err = genmii_update_link (mii_info); 317 if (err) 318 return err; 319 320 if (mii_info->autoneg) { 321 status = phy_read (mii_info, PHY_ANLPAR); 322 323 if (status & (PHY_ANLPAR_10FD | PHY_ANLPAR_TXFD)) 324 mii_info->duplex = DUPLEX_FULL; 325 else 326 mii_info->duplex = DUPLEX_HALF; 327 if (status & (PHY_ANLPAR_TXFD | PHY_ANLPAR_TX)) 328 mii_info->speed = SPEED_100; 329 else 330 mii_info->speed = SPEED_10; 331 mii_info->pause = 0; 332 } 333 /* On non-aneg, we assume what we put in BMCR is the speed, 334 * though magic-aneg shouldn't prevent this case from occurring 335 */ 336 337 return 0; 338 } 339 340 static int marvell_read_status (struct uec_mii_info *mii_info) 341 { 342 u16 status; 343 int err; 344 345 /* Update the link, but return if there 346 * was an error */ 347 err = genmii_update_link (mii_info); 348 if (err) 349 return err; 350 351 /* If the link is up, read the speed and duplex */ 352 /* If we aren't autonegotiating, assume speeds 353 * are as set */ 354 if (mii_info->autoneg && mii_info->link) { 355 int speed; 356 357 status = phy_read (mii_info, MII_M1011_PHY_SPEC_STATUS); 358 359 /* Get the duplexity */ 360 if (status & MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX) 361 mii_info->duplex = DUPLEX_FULL; 362 else 363 mii_info->duplex = DUPLEX_HALF; 364 365 /* Get the speed */ 366 speed = status & MII_M1011_PHY_SPEC_STATUS_SPD_MASK; 367 switch (speed) { 368 case MII_M1011_PHY_SPEC_STATUS_1000: 369 mii_info->speed = SPEED_1000; 370 break; 371 case MII_M1011_PHY_SPEC_STATUS_100: 372 mii_info->speed = SPEED_100; 373 break; 374 default: 375 mii_info->speed = SPEED_10; 376 break; 377 } 378 mii_info->pause = 0; 379 } 380 381 return 0; 382 } 383 384 static int marvell_ack_interrupt (struct uec_mii_info *mii_info) 385 { 386 /* Clear the interrupts by reading the reg */ 387 phy_read (mii_info, MII_M1011_IEVENT); 388 389 return 0; 390 } 391 392 static int marvell_config_intr (struct uec_mii_info *mii_info) 393 { 394 if (mii_info->interrupts == MII_INTERRUPT_ENABLED) 395 phy_write (mii_info, MII_M1011_IMASK, MII_M1011_IMASK_INIT); 396 else 397 phy_write (mii_info, MII_M1011_IMASK, MII_M1011_IMASK_CLEAR); 398 399 return 0; 400 } 401 402 static int dm9161_init (struct uec_mii_info *mii_info) 403 { 404 /* Reset the PHY */ 405 phy_write (mii_info, PHY_BMCR, phy_read (mii_info, PHY_BMCR) | 406 PHY_BMCR_RESET); 407 /* PHY and MAC connect */ 408 phy_write (mii_info, PHY_BMCR, phy_read (mii_info, PHY_BMCR) & 409 ~PHY_BMCR_ISO); 410 411 phy_write (mii_info, MII_DM9161_SCR, MII_DM9161_SCR_INIT); 412 413 config_genmii_advert (mii_info); 414 /* Start/restart aneg */ 415 genmii_config_aneg (mii_info); 416 417 return 0; 418 } 419 420 static int dm9161_config_aneg (struct uec_mii_info *mii_info) 421 { 422 return 0; 423 } 424 425 static int dm9161_read_status (struct uec_mii_info *mii_info) 426 { 427 u16 status; 428 int err; 429 430 /* Update the link, but return if there was an error */ 431 err = genmii_update_link (mii_info); 432 if (err) 433 return err; 434 /* If the link is up, read the speed and duplex 435 If we aren't autonegotiating assume speeds are as set */ 436 if (mii_info->autoneg && mii_info->link) { 437 status = phy_read (mii_info, MII_DM9161_SCSR); 438 if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_100H)) 439 mii_info->speed = SPEED_100; 440 else 441 mii_info->speed = SPEED_10; 442 443 if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_10F)) 444 mii_info->duplex = DUPLEX_FULL; 445 else 446 mii_info->duplex = DUPLEX_HALF; 447 } 448 449 return 0; 450 } 451 452 static int dm9161_ack_interrupt (struct uec_mii_info *mii_info) 453 { 454 /* Clear the interrupt by reading the reg */ 455 phy_read (mii_info, MII_DM9161_INTR); 456 457 return 0; 458 } 459 460 static int dm9161_config_intr (struct uec_mii_info *mii_info) 461 { 462 if (mii_info->interrupts == MII_INTERRUPT_ENABLED) 463 phy_write (mii_info, MII_DM9161_INTR, MII_DM9161_INTR_INIT); 464 else 465 phy_write (mii_info, MII_DM9161_INTR, MII_DM9161_INTR_STOP); 466 467 return 0; 468 } 469 470 static void dm9161_close (struct uec_mii_info *mii_info) 471 { 472 } 473 474 static struct phy_info phy_info_dm9161 = { 475 .phy_id = 0x0181b880, 476 .phy_id_mask = 0x0ffffff0, 477 .name = "Davicom DM9161E", 478 .init = dm9161_init, 479 .config_aneg = dm9161_config_aneg, 480 .read_status = dm9161_read_status, 481 .close = dm9161_close, 482 }; 483 484 static struct phy_info phy_info_dm9161a = { 485 .phy_id = 0x0181b8a0, 486 .phy_id_mask = 0x0ffffff0, 487 .name = "Davicom DM9161A", 488 .features = MII_BASIC_FEATURES, 489 .init = dm9161_init, 490 .config_aneg = dm9161_config_aneg, 491 .read_status = dm9161_read_status, 492 .ack_interrupt = dm9161_ack_interrupt, 493 .config_intr = dm9161_config_intr, 494 .close = dm9161_close, 495 }; 496 497 static struct phy_info phy_info_marvell = { 498 .phy_id = 0x01410c00, 499 .phy_id_mask = 0xffffff00, 500 .name = "Marvell 88E11x1", 501 .features = MII_GBIT_FEATURES, 502 .config_aneg = &marvell_config_aneg, 503 .read_status = &marvell_read_status, 504 .ack_interrupt = &marvell_ack_interrupt, 505 .config_intr = &marvell_config_intr, 506 }; 507 508 static struct phy_info phy_info_genmii = { 509 .phy_id = 0x00000000, 510 .phy_id_mask = 0x00000000, 511 .name = "Generic MII", 512 .features = MII_BASIC_FEATURES, 513 .config_aneg = genmii_config_aneg, 514 .read_status = genmii_read_status, 515 }; 516 517 static struct phy_info *phy_info[] = { 518 &phy_info_dm9161, 519 &phy_info_dm9161a, 520 &phy_info_marvell, 521 &phy_info_genmii, 522 NULL 523 }; 524 525 u16 phy_read (struct uec_mii_info *mii_info, u16 regnum) 526 { 527 return mii_info->mdio_read (mii_info->dev, mii_info->mii_id, regnum); 528 } 529 530 void phy_write (struct uec_mii_info *mii_info, u16 regnum, u16 val) 531 { 532 mii_info->mdio_write (mii_info->dev, mii_info->mii_id, regnum, val); 533 } 534 535 /* Use the PHY ID registers to determine what type of PHY is attached 536 * to device dev. return a struct phy_info structure describing that PHY 537 */ 538 struct phy_info *uec_get_phy_info (struct uec_mii_info *mii_info) 539 { 540 u16 phy_reg; 541 u32 phy_ID; 542 int i; 543 struct phy_info *theInfo = NULL; 544 545 /* Grab the bits from PHYIR1, and put them in the upper half */ 546 phy_reg = phy_read (mii_info, PHY_PHYIDR1); 547 phy_ID = (phy_reg & 0xffff) << 16; 548 549 /* Grab the bits from PHYIR2, and put them in the lower half */ 550 phy_reg = phy_read (mii_info, PHY_PHYIDR2); 551 phy_ID |= (phy_reg & 0xffff); 552 553 /* loop through all the known PHY types, and find one that */ 554 /* matches the ID we read from the PHY. */ 555 for (i = 0; phy_info[i]; i++) 556 if (phy_info[i]->phy_id == 557 (phy_ID & phy_info[i]->phy_id_mask)) { 558 theInfo = phy_info[i]; 559 break; 560 } 561 562 /* This shouldn't happen, as we have generic PHY support */ 563 if (theInfo == NULL) { 564 ugphy_info ("UEC: PHY id %x is not supported!", phy_ID); 565 return NULL; 566 } else { 567 ugphy_info ("UEC: PHY is %s (%x)", theInfo->name, phy_ID); 568 } 569 570 return theInfo; 571 } 572 573 void marvell_phy_interface_mode (struct eth_device *dev, 574 enet_interface_e mode) 575 { 576 uec_private_t *uec = (uec_private_t *) dev->priv; 577 struct uec_mii_info *mii_info; 578 579 if (!uec->mii_info) { 580 printf ("%s: the PHY not intialized\n", __FUNCTION__); 581 return; 582 } 583 mii_info = uec->mii_info; 584 585 if (mode == ENET_100_RGMII) { 586 phy_write (mii_info, 0x00, 0x9140); 587 phy_write (mii_info, 0x1d, 0x001f); 588 phy_write (mii_info, 0x1e, 0x200c); 589 phy_write (mii_info, 0x1d, 0x0005); 590 phy_write (mii_info, 0x1e, 0x0000); 591 phy_write (mii_info, 0x1e, 0x0100); 592 phy_write (mii_info, 0x09, 0x0e00); 593 phy_write (mii_info, 0x04, 0x01e1); 594 phy_write (mii_info, 0x00, 0x9140); 595 phy_write (mii_info, 0x00, 0x1000); 596 udelay (100000); 597 phy_write (mii_info, 0x00, 0x2900); 598 phy_write (mii_info, 0x14, 0x0cd2); 599 phy_write (mii_info, 0x00, 0xa100); 600 phy_write (mii_info, 0x09, 0x0000); 601 phy_write (mii_info, 0x1b, 0x800b); 602 phy_write (mii_info, 0x04, 0x05e1); 603 phy_write (mii_info, 0x00, 0xa100); 604 phy_write (mii_info, 0x00, 0x2100); 605 udelay (1000000); 606 } else if (mode == ENET_10_RGMII) { 607 phy_write (mii_info, 0x14, 0x8e40); 608 phy_write (mii_info, 0x1b, 0x800b); 609 phy_write (mii_info, 0x14, 0x0c82); 610 phy_write (mii_info, 0x00, 0x8100); 611 udelay (1000000); 612 } 613 } 614 615 void change_phy_interface_mode (struct eth_device *dev, enet_interface_e mode) 616 { 617 #ifdef CONFIG_PHY_MODE_NEED_CHANGE 618 marvell_phy_interface_mode (dev, mode); 619 #endif 620 } 621 #endif /* CONFIG_QE */ 622