1 /* 2 * (C) Copyright 2009 Ilya Yanok, Emcraft Systems Ltd <yanok@emcraft.com> 3 * (C) Copyright 2008,2009 Eric Jarrige <eric.jarrige@armadeus.org> 4 * (C) Copyright 2008 Armadeus Systems nc 5 * (C) Copyright 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de> 6 * (C) Copyright 2007 Pengutronix, Juergen Beisert <j.beisert@pengutronix.de> 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation; either version 2 of 11 * the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21 * MA 02111-1307 USA 22 */ 23 24 #include <common.h> 25 #include <malloc.h> 26 #include <net.h> 27 #include <miiphy.h> 28 #include "fec_mxc.h" 29 30 #include <asm/arch/clock.h> 31 #include <asm/arch/imx-regs.h> 32 #include <asm/io.h> 33 #include <asm/errno.h> 34 35 DECLARE_GLOBAL_DATA_PTR; 36 37 #ifndef CONFIG_MII 38 #error "CONFIG_MII has to be defined!" 39 #endif 40 41 #ifndef CONFIG_FEC_XCV_TYPE 42 #define CONFIG_FEC_XCV_TYPE MII100 43 #endif 44 45 /* 46 * The i.MX28 operates with packets in big endian. We need to swap them before 47 * sending and after receiving. 48 */ 49 #ifdef CONFIG_MX28 50 #define CONFIG_FEC_MXC_SWAP_PACKET 51 #endif 52 53 #define RXDESC_PER_CACHELINE (ARCH_DMA_MINALIGN/sizeof(struct fec_bd)) 54 55 /* Check various alignment issues at compile time */ 56 #if ((ARCH_DMA_MINALIGN < 16) || (ARCH_DMA_MINALIGN % 16 != 0)) 57 #error "ARCH_DMA_MINALIGN must be multiple of 16!" 58 #endif 59 60 #if ((PKTALIGN < ARCH_DMA_MINALIGN) || \ 61 (PKTALIGN % ARCH_DMA_MINALIGN != 0)) 62 #error "PKTALIGN must be multiple of ARCH_DMA_MINALIGN!" 63 #endif 64 65 #undef DEBUG 66 67 struct nbuf { 68 uint8_t data[1500]; /**< actual data */ 69 int length; /**< actual length */ 70 int used; /**< buffer in use or not */ 71 uint8_t head[16]; /**< MAC header(6 + 6 + 2) + 2(aligned) */ 72 }; 73 74 #ifdef CONFIG_FEC_MXC_SWAP_PACKET 75 static void swap_packet(uint32_t *packet, int length) 76 { 77 int i; 78 79 for (i = 0; i < DIV_ROUND_UP(length, 4); i++) 80 packet[i] = __swab32(packet[i]); 81 } 82 #endif 83 84 /* 85 * MII-interface related functions 86 */ 87 static int fec_mdio_read(struct ethernet_regs *eth, uint8_t phyAddr, 88 uint8_t regAddr) 89 { 90 uint32_t reg; /* convenient holder for the PHY register */ 91 uint32_t phy; /* convenient holder for the PHY */ 92 uint32_t start; 93 int val; 94 95 /* 96 * reading from any PHY's register is done by properly 97 * programming the FEC's MII data register. 98 */ 99 writel(FEC_IEVENT_MII, ð->ievent); 100 reg = regAddr << FEC_MII_DATA_RA_SHIFT; 101 phy = phyAddr << FEC_MII_DATA_PA_SHIFT; 102 103 writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | 104 phy | reg, ð->mii_data); 105 106 /* 107 * wait for the related interrupt 108 */ 109 start = get_timer(0); 110 while (!(readl(ð->ievent) & FEC_IEVENT_MII)) { 111 if (get_timer(start) > (CONFIG_SYS_HZ / 1000)) { 112 printf("Read MDIO failed...\n"); 113 return -1; 114 } 115 } 116 117 /* 118 * clear mii interrupt bit 119 */ 120 writel(FEC_IEVENT_MII, ð->ievent); 121 122 /* 123 * it's now safe to read the PHY's register 124 */ 125 val = (unsigned short)readl(ð->mii_data); 126 debug("%s: phy: %02x reg:%02x val:%#x\n", __func__, phyAddr, 127 regAddr, val); 128 return val; 129 } 130 131 static void fec_mii_setspeed(struct fec_priv *fec) 132 { 133 /* 134 * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock 135 * and do not drop the Preamble. 136 */ 137 writel((((imx_get_fecclk() / 1000000) + 2) / 5) << 1, 138 &fec->eth->mii_speed); 139 debug("%s: mii_speed %08x\n", __func__, readl(&fec->eth->mii_speed)); 140 } 141 142 static int fec_mdio_write(struct ethernet_regs *eth, uint8_t phyAddr, 143 uint8_t regAddr, uint16_t data) 144 { 145 uint32_t reg; /* convenient holder for the PHY register */ 146 uint32_t phy; /* convenient holder for the PHY */ 147 uint32_t start; 148 149 reg = regAddr << FEC_MII_DATA_RA_SHIFT; 150 phy = phyAddr << FEC_MII_DATA_PA_SHIFT; 151 152 writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR | 153 FEC_MII_DATA_TA | phy | reg | data, ð->mii_data); 154 155 /* 156 * wait for the MII interrupt 157 */ 158 start = get_timer(0); 159 while (!(readl(ð->ievent) & FEC_IEVENT_MII)) { 160 if (get_timer(start) > (CONFIG_SYS_HZ / 1000)) { 161 printf("Write MDIO failed...\n"); 162 return -1; 163 } 164 } 165 166 /* 167 * clear MII interrupt bit 168 */ 169 writel(FEC_IEVENT_MII, ð->ievent); 170 debug("%s: phy: %02x reg:%02x val:%#x\n", __func__, phyAddr, 171 regAddr, data); 172 173 return 0; 174 } 175 176 int fec_phy_read(struct mii_dev *bus, int phyAddr, int dev_addr, int regAddr) 177 { 178 return fec_mdio_read(bus->priv, phyAddr, regAddr); 179 } 180 181 int fec_phy_write(struct mii_dev *bus, int phyAddr, int dev_addr, int regAddr, 182 u16 data) 183 { 184 return fec_mdio_write(bus->priv, phyAddr, regAddr, data); 185 } 186 187 #ifndef CONFIG_PHYLIB 188 static int miiphy_restart_aneg(struct eth_device *dev) 189 { 190 struct fec_priv *fec = (struct fec_priv *)dev->priv; 191 struct ethernet_regs *eth = fec->bus->priv; 192 int ret = 0; 193 194 /* 195 * Wake up from sleep if necessary 196 * Reset PHY, then delay 300ns 197 */ 198 #ifdef CONFIG_MX27 199 fec_mdio_write(eth, fec->phy_id, MII_DCOUNTER, 0x00FF); 200 #endif 201 fec_mdio_write(eth, fec->phy_id, MII_BMCR, BMCR_RESET); 202 udelay(1000); 203 204 /* 205 * Set the auto-negotiation advertisement register bits 206 */ 207 fec_mdio_write(eth, fec->phy_id, MII_ADVERTISE, 208 LPA_100FULL | LPA_100HALF | LPA_10FULL | 209 LPA_10HALF | PHY_ANLPAR_PSB_802_3); 210 fec_mdio_write(eth, fec->phy_id, MII_BMCR, 211 BMCR_ANENABLE | BMCR_ANRESTART); 212 213 if (fec->mii_postcall) 214 ret = fec->mii_postcall(fec->phy_id); 215 216 return ret; 217 } 218 219 static int miiphy_wait_aneg(struct eth_device *dev) 220 { 221 uint32_t start; 222 int status; 223 struct fec_priv *fec = (struct fec_priv *)dev->priv; 224 struct ethernet_regs *eth = fec->bus->priv; 225 226 /* 227 * Wait for AN completion 228 */ 229 start = get_timer(0); 230 do { 231 if (get_timer(start) > (CONFIG_SYS_HZ * 5)) { 232 printf("%s: Autonegotiation timeout\n", dev->name); 233 return -1; 234 } 235 236 status = fec_mdio_read(eth, fec->phy_id, MII_BMSR); 237 if (status < 0) { 238 printf("%s: Autonegotiation failed. status: %d\n", 239 dev->name, status); 240 return -1; 241 } 242 } while (!(status & BMSR_LSTATUS)); 243 244 return 0; 245 } 246 #endif 247 248 static int fec_rx_task_enable(struct fec_priv *fec) 249 { 250 writel(1 << 24, &fec->eth->r_des_active); 251 return 0; 252 } 253 254 static int fec_rx_task_disable(struct fec_priv *fec) 255 { 256 return 0; 257 } 258 259 static int fec_tx_task_enable(struct fec_priv *fec) 260 { 261 writel(1 << 24, &fec->eth->x_des_active); 262 return 0; 263 } 264 265 static int fec_tx_task_disable(struct fec_priv *fec) 266 { 267 return 0; 268 } 269 270 /** 271 * Initialize receive task's buffer descriptors 272 * @param[in] fec all we know about the device yet 273 * @param[in] count receive buffer count to be allocated 274 * @param[in] dsize desired size of each receive buffer 275 * @return 0 on success 276 * 277 * For this task we need additional memory for the data buffers. And each 278 * data buffer requires some alignment. Thy must be aligned to a specific 279 * boundary each. 280 */ 281 static int fec_rbd_init(struct fec_priv *fec, int count, int dsize) 282 { 283 uint32_t size; 284 int i; 285 286 /* 287 * Allocate memory for the buffers. This allocation respects the 288 * alignment 289 */ 290 size = roundup(dsize, ARCH_DMA_MINALIGN); 291 for (i = 0; i < count; i++) { 292 uint32_t data_ptr = readl(&fec->rbd_base[i].data_pointer); 293 if (data_ptr == 0) { 294 uint8_t *data = memalign(ARCH_DMA_MINALIGN, 295 size); 296 if (!data) { 297 printf("%s: error allocating rxbuf %d\n", 298 __func__, i); 299 goto err; 300 } 301 writel((uint32_t)data, &fec->rbd_base[i].data_pointer); 302 } /* needs allocation */ 303 writew(FEC_RBD_EMPTY, &fec->rbd_base[i].status); 304 writew(0, &fec->rbd_base[i].data_length); 305 } 306 307 /* Mark the last RBD to close the ring. */ 308 writew(FEC_RBD_WRAP | FEC_RBD_EMPTY, &fec->rbd_base[i - 1].status); 309 fec->rbd_index = 0; 310 311 return 0; 312 313 err: 314 for (; i >= 0; i--) { 315 uint32_t data_ptr = readl(&fec->rbd_base[i].data_pointer); 316 free((void *)data_ptr); 317 } 318 319 return -ENOMEM; 320 } 321 322 /** 323 * Initialize transmit task's buffer descriptors 324 * @param[in] fec all we know about the device yet 325 * 326 * Transmit buffers are created externally. We only have to init the BDs here.\n 327 * Note: There is a race condition in the hardware. When only one BD is in 328 * use it must be marked with the WRAP bit to use it for every transmitt. 329 * This bit in combination with the READY bit results into double transmit 330 * of each data buffer. It seems the state machine checks READY earlier then 331 * resetting it after the first transfer. 332 * Using two BDs solves this issue. 333 */ 334 static void fec_tbd_init(struct fec_priv *fec) 335 { 336 unsigned addr = (unsigned)fec->tbd_base; 337 unsigned size = roundup(2 * sizeof(struct fec_bd), 338 ARCH_DMA_MINALIGN); 339 writew(0x0000, &fec->tbd_base[0].status); 340 writew(FEC_TBD_WRAP, &fec->tbd_base[1].status); 341 fec->tbd_index = 0; 342 flush_dcache_range(addr, addr+size); 343 } 344 345 /** 346 * Mark the given read buffer descriptor as free 347 * @param[in] last 1 if this is the last buffer descriptor in the chain, else 0 348 * @param[in] pRbd buffer descriptor to mark free again 349 */ 350 static void fec_rbd_clean(int last, struct fec_bd *pRbd) 351 { 352 unsigned short flags = FEC_RBD_EMPTY; 353 if (last) 354 flags |= FEC_RBD_WRAP; 355 writew(flags, &pRbd->status); 356 writew(0, &pRbd->data_length); 357 } 358 359 static int fec_get_hwaddr(struct eth_device *dev, int dev_id, 360 unsigned char *mac) 361 { 362 imx_get_mac_from_fuse(dev_id, mac); 363 return !is_valid_ether_addr(mac); 364 } 365 366 static int fec_set_hwaddr(struct eth_device *dev) 367 { 368 uchar *mac = dev->enetaddr; 369 struct fec_priv *fec = (struct fec_priv *)dev->priv; 370 371 writel(0, &fec->eth->iaddr1); 372 writel(0, &fec->eth->iaddr2); 373 writel(0, &fec->eth->gaddr1); 374 writel(0, &fec->eth->gaddr2); 375 376 /* 377 * Set physical address 378 */ 379 writel((mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3], 380 &fec->eth->paddr1); 381 writel((mac[4] << 24) + (mac[5] << 16) + 0x8808, &fec->eth->paddr2); 382 383 return 0; 384 } 385 386 static void fec_eth_phy_config(struct eth_device *dev) 387 { 388 #ifdef CONFIG_PHYLIB 389 struct fec_priv *fec = (struct fec_priv *)dev->priv; 390 struct phy_device *phydev; 391 392 phydev = phy_connect(fec->bus, fec->phy_id, dev, 393 PHY_INTERFACE_MODE_RGMII); 394 if (phydev) { 395 fec->phydev = phydev; 396 phy_config(phydev); 397 } 398 #endif 399 } 400 401 /** 402 * Start the FEC engine 403 * @param[in] dev Our device to handle 404 */ 405 static int fec_open(struct eth_device *edev) 406 { 407 struct fec_priv *fec = (struct fec_priv *)edev->priv; 408 int speed; 409 uint32_t addr, size; 410 int i; 411 412 debug("fec_open: fec_open(dev)\n"); 413 /* full-duplex, heartbeat disabled */ 414 writel(1 << 2, &fec->eth->x_cntrl); 415 fec->rbd_index = 0; 416 417 /* Invalidate all descriptors */ 418 for (i = 0; i < FEC_RBD_NUM - 1; i++) 419 fec_rbd_clean(0, &fec->rbd_base[i]); 420 fec_rbd_clean(1, &fec->rbd_base[i]); 421 422 /* Flush the descriptors into RAM */ 423 size = roundup(FEC_RBD_NUM * sizeof(struct fec_bd), 424 ARCH_DMA_MINALIGN); 425 addr = (uint32_t)fec->rbd_base; 426 flush_dcache_range(addr, addr + size); 427 428 #ifdef FEC_QUIRK_ENET_MAC 429 /* Enable ENET HW endian SWAP */ 430 writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_DBSWAP, 431 &fec->eth->ecntrl); 432 /* Enable ENET store and forward mode */ 433 writel(readl(&fec->eth->x_wmrk) | FEC_X_WMRK_STRFWD, 434 &fec->eth->x_wmrk); 435 #endif 436 /* 437 * Enable FEC-Lite controller 438 */ 439 writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_ETHER_EN, 440 &fec->eth->ecntrl); 441 #if defined(CONFIG_MX25) || defined(CONFIG_MX53) 442 udelay(100); 443 /* 444 * setup the MII gasket for RMII mode 445 */ 446 447 /* disable the gasket */ 448 writew(0, &fec->eth->miigsk_enr); 449 450 /* wait for the gasket to be disabled */ 451 while (readw(&fec->eth->miigsk_enr) & MIIGSK_ENR_READY) 452 udelay(2); 453 454 /* configure gasket for RMII, 50 MHz, no loopback, and no echo */ 455 writew(MIIGSK_CFGR_IF_MODE_RMII, &fec->eth->miigsk_cfgr); 456 457 /* re-enable the gasket */ 458 writew(MIIGSK_ENR_EN, &fec->eth->miigsk_enr); 459 460 /* wait until MII gasket is ready */ 461 int max_loops = 10; 462 while ((readw(&fec->eth->miigsk_enr) & MIIGSK_ENR_READY) == 0) { 463 if (--max_loops <= 0) { 464 printf("WAIT for MII Gasket ready timed out\n"); 465 break; 466 } 467 } 468 #endif 469 470 #ifdef CONFIG_PHYLIB 471 if (!fec->phydev) 472 fec_eth_phy_config(edev); 473 if (fec->phydev) { 474 /* Start up the PHY */ 475 phy_startup(fec->phydev); 476 speed = fec->phydev->speed; 477 } else { 478 speed = _100BASET; 479 } 480 #else 481 miiphy_wait_aneg(edev); 482 speed = miiphy_speed(edev->name, fec->phy_id); 483 miiphy_duplex(edev->name, fec->phy_id); 484 #endif 485 486 #ifdef FEC_QUIRK_ENET_MAC 487 { 488 u32 ecr = readl(&fec->eth->ecntrl) & ~FEC_ECNTRL_SPEED; 489 u32 rcr = (readl(&fec->eth->r_cntrl) & 490 ~(FEC_RCNTRL_RMII | FEC_RCNTRL_RMII_10T)) | 491 FEC_RCNTRL_RGMII | FEC_RCNTRL_MII_MODE; 492 if (speed == _1000BASET) 493 ecr |= FEC_ECNTRL_SPEED; 494 else if (speed != _100BASET) 495 rcr |= FEC_RCNTRL_RMII_10T; 496 writel(ecr, &fec->eth->ecntrl); 497 writel(rcr, &fec->eth->r_cntrl); 498 } 499 #endif 500 debug("%s:Speed=%i\n", __func__, speed); 501 502 /* 503 * Enable SmartDMA receive task 504 */ 505 fec_rx_task_enable(fec); 506 507 udelay(100000); 508 return 0; 509 } 510 511 static int fec_init(struct eth_device *dev, bd_t* bd) 512 { 513 struct fec_priv *fec = (struct fec_priv *)dev->priv; 514 uint32_t mib_ptr = (uint32_t)&fec->eth->rmon_t_drop; 515 uint32_t rcntrl; 516 uint32_t size; 517 int i, ret; 518 519 /* Initialize MAC address */ 520 fec_set_hwaddr(dev); 521 522 /* 523 * Allocate transmit descriptors, there are two in total. This 524 * allocation respects cache alignment. 525 */ 526 if (!fec->tbd_base) { 527 size = roundup(2 * sizeof(struct fec_bd), 528 ARCH_DMA_MINALIGN); 529 fec->tbd_base = memalign(ARCH_DMA_MINALIGN, size); 530 if (!fec->tbd_base) { 531 ret = -ENOMEM; 532 goto err1; 533 } 534 memset(fec->tbd_base, 0, size); 535 fec_tbd_init(fec); 536 flush_dcache_range((unsigned)fec->tbd_base, size); 537 } 538 539 /* 540 * Allocate receive descriptors. This allocation respects cache 541 * alignment. 542 */ 543 if (!fec->rbd_base) { 544 size = roundup(FEC_RBD_NUM * sizeof(struct fec_bd), 545 ARCH_DMA_MINALIGN); 546 fec->rbd_base = memalign(ARCH_DMA_MINALIGN, size); 547 if (!fec->rbd_base) { 548 ret = -ENOMEM; 549 goto err2; 550 } 551 memset(fec->rbd_base, 0, size); 552 /* 553 * Initialize RxBD ring 554 */ 555 if (fec_rbd_init(fec, FEC_RBD_NUM, FEC_MAX_PKT_SIZE) < 0) { 556 ret = -ENOMEM; 557 goto err3; 558 } 559 flush_dcache_range((unsigned)fec->rbd_base, 560 (unsigned)fec->rbd_base + size); 561 } 562 563 /* 564 * Set interrupt mask register 565 */ 566 writel(0x00000000, &fec->eth->imask); 567 568 /* 569 * Clear FEC-Lite interrupt event register(IEVENT) 570 */ 571 writel(0xffffffff, &fec->eth->ievent); 572 573 574 /* 575 * Set FEC-Lite receive control register(R_CNTRL): 576 */ 577 578 /* Start with frame length = 1518, common for all modes. */ 579 rcntrl = PKTSIZE << FEC_RCNTRL_MAX_FL_SHIFT; 580 if (fec->xcv_type == SEVENWIRE) 581 rcntrl |= FEC_RCNTRL_FCE; 582 else if (fec->xcv_type == RGMII) 583 rcntrl |= FEC_RCNTRL_RGMII; 584 else if (fec->xcv_type == RMII) 585 rcntrl |= FEC_RCNTRL_RMII; 586 else /* MII mode */ 587 rcntrl |= FEC_RCNTRL_FCE | FEC_RCNTRL_MII_MODE; 588 589 writel(rcntrl, &fec->eth->r_cntrl); 590 591 if (fec->xcv_type == MII10 || fec->xcv_type == MII100) 592 fec_mii_setspeed(fec); 593 594 /* 595 * Set Opcode/Pause Duration Register 596 */ 597 writel(0x00010020, &fec->eth->op_pause); /* FIXME 0xffff0020; */ 598 writel(0x2, &fec->eth->x_wmrk); 599 /* 600 * Set multicast address filter 601 */ 602 writel(0x00000000, &fec->eth->gaddr1); 603 writel(0x00000000, &fec->eth->gaddr2); 604 605 606 /* clear MIB RAM */ 607 for (i = mib_ptr; i <= mib_ptr + 0xfc; i += 4) 608 writel(0, i); 609 610 /* FIFO receive start register */ 611 writel(0x520, &fec->eth->r_fstart); 612 613 /* size and address of each buffer */ 614 writel(FEC_MAX_PKT_SIZE, &fec->eth->emrbr); 615 writel((uint32_t)fec->tbd_base, &fec->eth->etdsr); 616 writel((uint32_t)fec->rbd_base, &fec->eth->erdsr); 617 618 #ifndef CONFIG_PHYLIB 619 if (fec->xcv_type != SEVENWIRE) 620 miiphy_restart_aneg(dev); 621 #endif 622 fec_open(dev); 623 return 0; 624 625 err3: 626 free(fec->rbd_base); 627 err2: 628 free(fec->tbd_base); 629 err1: 630 return ret; 631 } 632 633 /** 634 * Halt the FEC engine 635 * @param[in] dev Our device to handle 636 */ 637 static void fec_halt(struct eth_device *dev) 638 { 639 struct fec_priv *fec = (struct fec_priv *)dev->priv; 640 int counter = 0xffff; 641 642 /* 643 * issue graceful stop command to the FEC transmitter if necessary 644 */ 645 writel(FEC_TCNTRL_GTS | readl(&fec->eth->x_cntrl), 646 &fec->eth->x_cntrl); 647 648 debug("eth_halt: wait for stop regs\n"); 649 /* 650 * wait for graceful stop to register 651 */ 652 while ((counter--) && (!(readl(&fec->eth->ievent) & FEC_IEVENT_GRA))) 653 udelay(1); 654 655 /* 656 * Disable SmartDMA tasks 657 */ 658 fec_tx_task_disable(fec); 659 fec_rx_task_disable(fec); 660 661 /* 662 * Disable the Ethernet Controller 663 * Note: this will also reset the BD index counter! 664 */ 665 writel(readl(&fec->eth->ecntrl) & ~FEC_ECNTRL_ETHER_EN, 666 &fec->eth->ecntrl); 667 fec->rbd_index = 0; 668 fec->tbd_index = 0; 669 debug("eth_halt: done\n"); 670 } 671 672 /** 673 * Transmit one frame 674 * @param[in] dev Our ethernet device to handle 675 * @param[in] packet Pointer to the data to be transmitted 676 * @param[in] length Data count in bytes 677 * @return 0 on success 678 */ 679 static int fec_send(struct eth_device *dev, volatile void *packet, int length) 680 { 681 unsigned int status; 682 uint32_t size; 683 uint32_t addr; 684 685 /* 686 * This routine transmits one frame. This routine only accepts 687 * 6-byte Ethernet addresses. 688 */ 689 struct fec_priv *fec = (struct fec_priv *)dev->priv; 690 691 /* 692 * Check for valid length of data. 693 */ 694 if ((length > 1500) || (length <= 0)) { 695 printf("Payload (%d) too large\n", length); 696 return -1; 697 } 698 699 /* 700 * Setup the transmit buffer. We are always using the first buffer for 701 * transmission, the second will be empty and only used to stop the DMA 702 * engine. We also flush the packet to RAM here to avoid cache trouble. 703 */ 704 #ifdef CONFIG_FEC_MXC_SWAP_PACKET 705 swap_packet((uint32_t *)packet, length); 706 #endif 707 708 addr = (uint32_t)packet; 709 size = roundup(length, ARCH_DMA_MINALIGN); 710 flush_dcache_range(addr, addr + size); 711 712 writew(length, &fec->tbd_base[fec->tbd_index].data_length); 713 writel(addr, &fec->tbd_base[fec->tbd_index].data_pointer); 714 715 /* 716 * update BD's status now 717 * This block: 718 * - is always the last in a chain (means no chain) 719 * - should transmitt the CRC 720 * - might be the last BD in the list, so the address counter should 721 * wrap (-> keep the WRAP flag) 722 */ 723 status = readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_WRAP; 724 status |= FEC_TBD_LAST | FEC_TBD_TC | FEC_TBD_READY; 725 writew(status, &fec->tbd_base[fec->tbd_index].status); 726 727 /* 728 * Flush data cache. This code flushes both TX descriptors to RAM. 729 * After this code, the descriptors will be safely in RAM and we 730 * can start DMA. 731 */ 732 size = roundup(2 * sizeof(struct fec_bd), ARCH_DMA_MINALIGN); 733 addr = (uint32_t)fec->tbd_base; 734 flush_dcache_range(addr, addr + size); 735 736 /* 737 * Enable SmartDMA transmit task 738 */ 739 fec_tx_task_enable(fec); 740 741 /* 742 * Wait until frame is sent. On each turn of the wait cycle, we must 743 * invalidate data cache to see what's really in RAM. Also, we need 744 * barrier here. 745 */ 746 invalidate_dcache_range(addr, addr + size); 747 while (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY) { 748 udelay(1); 749 invalidate_dcache_range(addr, addr + size); 750 } 751 752 debug("fec_send: status 0x%x index %d\n", 753 readw(&fec->tbd_base[fec->tbd_index].status), 754 fec->tbd_index); 755 /* for next transmission use the other buffer */ 756 if (fec->tbd_index) 757 fec->tbd_index = 0; 758 else 759 fec->tbd_index = 1; 760 761 return 0; 762 } 763 764 /** 765 * Pull one frame from the card 766 * @param[in] dev Our ethernet device to handle 767 * @return Length of packet read 768 */ 769 static int fec_recv(struct eth_device *dev) 770 { 771 struct fec_priv *fec = (struct fec_priv *)dev->priv; 772 struct fec_bd *rbd = &fec->rbd_base[fec->rbd_index]; 773 unsigned long ievent; 774 int frame_length, len = 0; 775 struct nbuf *frame; 776 uint16_t bd_status; 777 uint32_t addr, size; 778 int i; 779 uchar buff[FEC_MAX_PKT_SIZE]; 780 781 /* 782 * Check if any critical events have happened 783 */ 784 ievent = readl(&fec->eth->ievent); 785 writel(ievent, &fec->eth->ievent); 786 debug("fec_recv: ievent 0x%lx\n", ievent); 787 if (ievent & FEC_IEVENT_BABR) { 788 fec_halt(dev); 789 fec_init(dev, fec->bd); 790 printf("some error: 0x%08lx\n", ievent); 791 return 0; 792 } 793 if (ievent & FEC_IEVENT_HBERR) { 794 /* Heartbeat error */ 795 writel(0x00000001 | readl(&fec->eth->x_cntrl), 796 &fec->eth->x_cntrl); 797 } 798 if (ievent & FEC_IEVENT_GRA) { 799 /* Graceful stop complete */ 800 if (readl(&fec->eth->x_cntrl) & 0x00000001) { 801 fec_halt(dev); 802 writel(~0x00000001 & readl(&fec->eth->x_cntrl), 803 &fec->eth->x_cntrl); 804 fec_init(dev, fec->bd); 805 } 806 } 807 808 /* 809 * Read the buffer status. Before the status can be read, the data cache 810 * must be invalidated, because the data in RAM might have been changed 811 * by DMA. The descriptors are properly aligned to cachelines so there's 812 * no need to worry they'd overlap. 813 * 814 * WARNING: By invalidating the descriptor here, we also invalidate 815 * the descriptors surrounding this one. Therefore we can NOT change the 816 * contents of this descriptor nor the surrounding ones. The problem is 817 * that in order to mark the descriptor as processed, we need to change 818 * the descriptor. The solution is to mark the whole cache line when all 819 * descriptors in the cache line are processed. 820 */ 821 addr = (uint32_t)rbd; 822 addr &= ~(ARCH_DMA_MINALIGN - 1); 823 size = roundup(sizeof(struct fec_bd), ARCH_DMA_MINALIGN); 824 invalidate_dcache_range(addr, addr + size); 825 826 bd_status = readw(&rbd->status); 827 debug("fec_recv: status 0x%x\n", bd_status); 828 829 if (!(bd_status & FEC_RBD_EMPTY)) { 830 if ((bd_status & FEC_RBD_LAST) && !(bd_status & FEC_RBD_ERR) && 831 ((readw(&rbd->data_length) - 4) > 14)) { 832 /* 833 * Get buffer address and size 834 */ 835 frame = (struct nbuf *)readl(&rbd->data_pointer); 836 frame_length = readw(&rbd->data_length) - 4; 837 /* 838 * Invalidate data cache over the buffer 839 */ 840 addr = (uint32_t)frame; 841 size = roundup(frame_length, ARCH_DMA_MINALIGN); 842 invalidate_dcache_range(addr, addr + size); 843 844 /* 845 * Fill the buffer and pass it to upper layers 846 */ 847 #ifdef CONFIG_FEC_MXC_SWAP_PACKET 848 swap_packet((uint32_t *)frame->data, frame_length); 849 #endif 850 memcpy(buff, frame->data, frame_length); 851 NetReceive(buff, frame_length); 852 len = frame_length; 853 } else { 854 if (bd_status & FEC_RBD_ERR) 855 printf("error frame: 0x%08lx 0x%08x\n", 856 (ulong)rbd->data_pointer, 857 bd_status); 858 } 859 860 /* 861 * Free the current buffer, restart the engine and move forward 862 * to the next buffer. Here we check if the whole cacheline of 863 * descriptors was already processed and if so, we mark it free 864 * as whole. 865 */ 866 size = RXDESC_PER_CACHELINE - 1; 867 if ((fec->rbd_index & size) == size) { 868 i = fec->rbd_index - size; 869 addr = (uint32_t)&fec->rbd_base[i]; 870 for (; i <= fec->rbd_index ; i++) { 871 fec_rbd_clean(i == (FEC_RBD_NUM - 1), 872 &fec->rbd_base[i]); 873 } 874 flush_dcache_range(addr, 875 addr + ARCH_DMA_MINALIGN); 876 } 877 878 fec_rx_task_enable(fec); 879 fec->rbd_index = (fec->rbd_index + 1) % FEC_RBD_NUM; 880 } 881 debug("fec_recv: stop\n"); 882 883 return len; 884 } 885 886 static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr) 887 { 888 struct eth_device *edev; 889 struct fec_priv *fec; 890 struct mii_dev *bus; 891 unsigned char ethaddr[6]; 892 uint32_t start; 893 int ret = 0; 894 895 /* create and fill edev struct */ 896 edev = (struct eth_device *)malloc(sizeof(struct eth_device)); 897 if (!edev) { 898 puts("fec_mxc: not enough malloc memory for eth_device\n"); 899 ret = -ENOMEM; 900 goto err1; 901 } 902 903 fec = (struct fec_priv *)malloc(sizeof(struct fec_priv)); 904 if (!fec) { 905 puts("fec_mxc: not enough malloc memory for fec_priv\n"); 906 ret = -ENOMEM; 907 goto err2; 908 } 909 910 memset(edev, 0, sizeof(*edev)); 911 memset(fec, 0, sizeof(*fec)); 912 913 edev->priv = fec; 914 edev->init = fec_init; 915 edev->send = fec_send; 916 edev->recv = fec_recv; 917 edev->halt = fec_halt; 918 edev->write_hwaddr = fec_set_hwaddr; 919 920 fec->eth = (struct ethernet_regs *)base_addr; 921 fec->bd = bd; 922 923 fec->xcv_type = CONFIG_FEC_XCV_TYPE; 924 925 /* Reset chip. */ 926 writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_RESET, &fec->eth->ecntrl); 927 start = get_timer(0); 928 while (readl(&fec->eth->ecntrl) & FEC_ECNTRL_RESET) { 929 if (get_timer(start) > (CONFIG_SYS_HZ * 5)) { 930 printf("FEC MXC: Timeout reseting chip\n"); 931 goto err3; 932 } 933 udelay(10); 934 } 935 936 /* 937 * Set interrupt mask register 938 */ 939 writel(0x00000000, &fec->eth->imask); 940 941 /* 942 * Clear FEC-Lite interrupt event register(IEVENT) 943 */ 944 writel(0xffffffff, &fec->eth->ievent); 945 946 /* 947 * Set FEC-Lite receive control register(R_CNTRL): 948 */ 949 /* 950 * Frame length=1518; MII mode; 951 */ 952 writel((PKTSIZE << FEC_RCNTRL_MAX_FL_SHIFT) | FEC_RCNTRL_FCE | 953 FEC_RCNTRL_MII_MODE, &fec->eth->r_cntrl); 954 fec_mii_setspeed(fec); 955 956 if (dev_id == -1) { 957 sprintf(edev->name, "FEC"); 958 fec->dev_id = 0; 959 } else { 960 sprintf(edev->name, "FEC%i", dev_id); 961 fec->dev_id = dev_id; 962 } 963 fec->phy_id = phy_id; 964 965 bus = mdio_alloc(); 966 if (!bus) { 967 printf("mdio_alloc failed\n"); 968 ret = -ENOMEM; 969 goto err3; 970 } 971 bus->read = fec_phy_read; 972 bus->write = fec_phy_write; 973 sprintf(bus->name, edev->name); 974 #ifdef CONFIG_MX28 975 /* 976 * The i.MX28 has two ethernet interfaces, but they are not equal. 977 * Only the first one can access the MDIO bus. 978 */ 979 bus->priv = (struct ethernet_regs *)MXS_ENET0_BASE; 980 #else 981 bus->priv = fec->eth; 982 #endif 983 ret = mdio_register(bus); 984 if (ret) { 985 printf("mdio_register failed\n"); 986 free(bus); 987 ret = -ENOMEM; 988 goto err3; 989 } 990 fec->bus = bus; 991 eth_register(edev); 992 993 if (fec_get_hwaddr(edev, dev_id, ethaddr) == 0) { 994 debug("got MAC%d address from fuse: %pM\n", dev_id, ethaddr); 995 memcpy(edev->enetaddr, ethaddr, 6); 996 } 997 /* Configure phy */ 998 fec_eth_phy_config(edev); 999 return ret; 1000 1001 err3: 1002 free(fec); 1003 err2: 1004 free(edev); 1005 err1: 1006 return ret; 1007 } 1008 1009 #ifndef CONFIG_FEC_MXC_MULTI 1010 int fecmxc_initialize(bd_t *bd) 1011 { 1012 int lout = 1; 1013 1014 debug("eth_init: fec_probe(bd)\n"); 1015 lout = fec_probe(bd, -1, CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE); 1016 1017 return lout; 1018 } 1019 #endif 1020 1021 int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr) 1022 { 1023 int lout = 1; 1024 1025 debug("eth_init: fec_probe(bd, %i, %i) @ %08x\n", dev_id, phy_id, addr); 1026 lout = fec_probe(bd, dev_id, phy_id, addr); 1027 1028 return lout; 1029 } 1030 1031 #ifndef CONFIG_PHYLIB 1032 int fecmxc_register_mii_postcall(struct eth_device *dev, int (*cb)(int)) 1033 { 1034 struct fec_priv *fec = (struct fec_priv *)dev->priv; 1035 fec->mii_postcall = cb; 1036 return 0; 1037 } 1038 #endif 1039