Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.24 1527 lines 34 kB view raw
1/* 2 * Combined Ethernet driver for Motorola MPC8xx and MPC82xx. 3 * 4 * Copyright (c) 2003 Intracom S.A. 5 * by Pantelis Antoniou <panto@intracom.gr> 6 * 7 * 2005 (c) MontaVista Software, Inc. 8 * Vitaly Bordug <vbordug@ru.mvista.com> 9 * 10 * Heavily based on original FEC driver by Dan Malek <dan@embeddededge.com> 11 * and modifications by Joakim Tjernlund <joakim.tjernlund@lumentis.se> 12 * 13 * This file is licensed under the terms of the GNU General Public License 14 * version 2. This program is licensed "as is" without any warranty of any 15 * kind, whether express or implied. 16 */ 17 18#include <linux/module.h> 19#include <linux/kernel.h> 20#include <linux/types.h> 21#include <linux/string.h> 22#include <linux/ptrace.h> 23#include <linux/errno.h> 24#include <linux/ioport.h> 25#include <linux/slab.h> 26#include <linux/interrupt.h> 27#include <linux/init.h> 28#include <linux/delay.h> 29#include <linux/netdevice.h> 30#include <linux/etherdevice.h> 31#include <linux/skbuff.h> 32#include <linux/spinlock.h> 33#include <linux/mii.h> 34#include <linux/ethtool.h> 35#include <linux/bitops.h> 36#include <linux/fs.h> 37#include <linux/platform_device.h> 38#include <linux/phy.h> 39 40#include <linux/vmalloc.h> 41#include <asm/pgtable.h> 42#include <asm/irq.h> 43#include <asm/uaccess.h> 44 45#ifdef CONFIG_PPC_CPM_NEW_BINDING 46#include <asm/of_platform.h> 47#endif 48 49#include "fs_enet.h" 50 51/*************************************************/ 52 53#ifndef CONFIG_PPC_CPM_NEW_BINDING 54static char version[] __devinitdata = 55 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")" "\n"; 56#endif 57 58MODULE_AUTHOR("Pantelis Antoniou <panto@intracom.gr>"); 59MODULE_DESCRIPTION("Freescale Ethernet Driver"); 60MODULE_LICENSE("GPL"); 61MODULE_VERSION(DRV_MODULE_VERSION); 62 63static int fs_enet_debug = -1; /* -1 == use FS_ENET_DEF_MSG_ENABLE as value */ 64module_param(fs_enet_debug, int, 0); 65MODULE_PARM_DESC(fs_enet_debug, 66 "Freescale bitmapped debugging message enable value"); 67 68#ifdef CONFIG_NET_POLL_CONTROLLER 69static void fs_enet_netpoll(struct net_device *dev); 70#endif 71 72static void fs_set_multicast_list(struct net_device *dev) 73{ 74 struct fs_enet_private *fep = netdev_priv(dev); 75 76 (*fep->ops->set_multicast_list)(dev); 77} 78 79static void skb_align(struct sk_buff *skb, int align) 80{ 81 int off = ((unsigned long)skb->data) & (align - 1); 82 83 if (off) 84 skb_reserve(skb, align - off); 85} 86 87/* NAPI receive function */ 88static int fs_enet_rx_napi(struct napi_struct *napi, int budget) 89{ 90 struct fs_enet_private *fep = container_of(napi, struct fs_enet_private, napi); 91 struct net_device *dev = fep->ndev; 92 const struct fs_platform_info *fpi = fep->fpi; 93 cbd_t __iomem *bdp; 94 struct sk_buff *skb, *skbn, *skbt; 95 int received = 0; 96 u16 pkt_len, sc; 97 int curidx; 98 99 /* 100 * First, grab all of the stats for the incoming packet. 101 * These get messed up if we get called due to a busy condition. 102 */ 103 bdp = fep->cur_rx; 104 105 /* clear RX status bits for napi*/ 106 (*fep->ops->napi_clear_rx_event)(dev); 107 108 while (((sc = CBDR_SC(bdp)) & BD_ENET_RX_EMPTY) == 0) { 109 curidx = bdp - fep->rx_bd_base; 110 111 /* 112 * Since we have allocated space to hold a complete frame, 113 * the last indicator should be set. 114 */ 115 if ((sc & BD_ENET_RX_LAST) == 0) 116 printk(KERN_WARNING DRV_MODULE_NAME 117 ": %s rcv is not +last\n", 118 dev->name); 119 120 /* 121 * Check for errors. 122 */ 123 if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_CL | 124 BD_ENET_RX_NO | BD_ENET_RX_CR | BD_ENET_RX_OV)) { 125 fep->stats.rx_errors++; 126 /* Frame too long or too short. */ 127 if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH)) 128 fep->stats.rx_length_errors++; 129 /* Frame alignment */ 130 if (sc & (BD_ENET_RX_NO | BD_ENET_RX_CL)) 131 fep->stats.rx_frame_errors++; 132 /* CRC Error */ 133 if (sc & BD_ENET_RX_CR) 134 fep->stats.rx_crc_errors++; 135 /* FIFO overrun */ 136 if (sc & BD_ENET_RX_OV) 137 fep->stats.rx_crc_errors++; 138 139 skb = fep->rx_skbuff[curidx]; 140 141 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 142 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 143 DMA_FROM_DEVICE); 144 145 skbn = skb; 146 147 } else { 148 skb = fep->rx_skbuff[curidx]; 149 150 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 151 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 152 DMA_FROM_DEVICE); 153 154 /* 155 * Process the incoming frame. 156 */ 157 fep->stats.rx_packets++; 158 pkt_len = CBDR_DATLEN(bdp) - 4; /* remove CRC */ 159 fep->stats.rx_bytes += pkt_len + 4; 160 161 if (pkt_len <= fpi->rx_copybreak) { 162 /* +2 to make IP header L1 cache aligned */ 163 skbn = dev_alloc_skb(pkt_len + 2); 164 if (skbn != NULL) { 165 skb_reserve(skbn, 2); /* align IP header */ 166 skb_copy_from_linear_data(skb, 167 skbn->data, pkt_len); 168 /* swap */ 169 skbt = skb; 170 skb = skbn; 171 skbn = skbt; 172 } 173 } else { 174 skbn = dev_alloc_skb(ENET_RX_FRSIZE); 175 176 if (skbn) 177 skb_align(skbn, ENET_RX_ALIGN); 178 } 179 180 if (skbn != NULL) { 181 skb_put(skb, pkt_len); /* Make room */ 182 skb->protocol = eth_type_trans(skb, dev); 183 received++; 184 netif_receive_skb(skb); 185 } else { 186 printk(KERN_WARNING DRV_MODULE_NAME 187 ": %s Memory squeeze, dropping packet.\n", 188 dev->name); 189 fep->stats.rx_dropped++; 190 skbn = skb; 191 } 192 } 193 194 fep->rx_skbuff[curidx] = skbn; 195 CBDW_BUFADDR(bdp, dma_map_single(fep->dev, skbn->data, 196 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 197 DMA_FROM_DEVICE)); 198 CBDW_DATLEN(bdp, 0); 199 CBDW_SC(bdp, (sc & ~BD_ENET_RX_STATS) | BD_ENET_RX_EMPTY); 200 201 /* 202 * Update BD pointer to next entry. 203 */ 204 if ((sc & BD_ENET_RX_WRAP) == 0) 205 bdp++; 206 else 207 bdp = fep->rx_bd_base; 208 209 (*fep->ops->rx_bd_done)(dev); 210 211 if (received >= budget) 212 break; 213 } 214 215 fep->cur_rx = bdp; 216 217 if (received < budget) { 218 /* done */ 219 netif_rx_complete(dev, napi); 220 (*fep->ops->napi_enable_rx)(dev); 221 } 222 return received; 223} 224 225/* non NAPI receive function */ 226static int fs_enet_rx_non_napi(struct net_device *dev) 227{ 228 struct fs_enet_private *fep = netdev_priv(dev); 229 const struct fs_platform_info *fpi = fep->fpi; 230 cbd_t __iomem *bdp; 231 struct sk_buff *skb, *skbn, *skbt; 232 int received = 0; 233 u16 pkt_len, sc; 234 int curidx; 235 /* 236 * First, grab all of the stats for the incoming packet. 237 * These get messed up if we get called due to a busy condition. 238 */ 239 bdp = fep->cur_rx; 240 241 while (((sc = CBDR_SC(bdp)) & BD_ENET_RX_EMPTY) == 0) { 242 243 curidx = bdp - fep->rx_bd_base; 244 245 /* 246 * Since we have allocated space to hold a complete frame, 247 * the last indicator should be set. 248 */ 249 if ((sc & BD_ENET_RX_LAST) == 0) 250 printk(KERN_WARNING DRV_MODULE_NAME 251 ": %s rcv is not +last\n", 252 dev->name); 253 254 /* 255 * Check for errors. 256 */ 257 if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_CL | 258 BD_ENET_RX_NO | BD_ENET_RX_CR | BD_ENET_RX_OV)) { 259 fep->stats.rx_errors++; 260 /* Frame too long or too short. */ 261 if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH)) 262 fep->stats.rx_length_errors++; 263 /* Frame alignment */ 264 if (sc & (BD_ENET_RX_NO | BD_ENET_RX_CL)) 265 fep->stats.rx_frame_errors++; 266 /* CRC Error */ 267 if (sc & BD_ENET_RX_CR) 268 fep->stats.rx_crc_errors++; 269 /* FIFO overrun */ 270 if (sc & BD_ENET_RX_OV) 271 fep->stats.rx_crc_errors++; 272 273 skb = fep->rx_skbuff[curidx]; 274 275 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 276 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 277 DMA_FROM_DEVICE); 278 279 skbn = skb; 280 281 } else { 282 283 skb = fep->rx_skbuff[curidx]; 284 285 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 286 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 287 DMA_FROM_DEVICE); 288 289 /* 290 * Process the incoming frame. 291 */ 292 fep->stats.rx_packets++; 293 pkt_len = CBDR_DATLEN(bdp) - 4; /* remove CRC */ 294 fep->stats.rx_bytes += pkt_len + 4; 295 296 if (pkt_len <= fpi->rx_copybreak) { 297 /* +2 to make IP header L1 cache aligned */ 298 skbn = dev_alloc_skb(pkt_len + 2); 299 if (skbn != NULL) { 300 skb_reserve(skbn, 2); /* align IP header */ 301 skb_copy_from_linear_data(skb, 302 skbn->data, pkt_len); 303 /* swap */ 304 skbt = skb; 305 skb = skbn; 306 skbn = skbt; 307 } 308 } else { 309 skbn = dev_alloc_skb(ENET_RX_FRSIZE); 310 311 if (skbn) 312 skb_align(skbn, ENET_RX_ALIGN); 313 } 314 315 if (skbn != NULL) { 316 skb_put(skb, pkt_len); /* Make room */ 317 skb->protocol = eth_type_trans(skb, dev); 318 received++; 319 netif_rx(skb); 320 } else { 321 printk(KERN_WARNING DRV_MODULE_NAME 322 ": %s Memory squeeze, dropping packet.\n", 323 dev->name); 324 fep->stats.rx_dropped++; 325 skbn = skb; 326 } 327 } 328 329 fep->rx_skbuff[curidx] = skbn; 330 CBDW_BUFADDR(bdp, dma_map_single(fep->dev, skbn->data, 331 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 332 DMA_FROM_DEVICE)); 333 CBDW_DATLEN(bdp, 0); 334 CBDW_SC(bdp, (sc & ~BD_ENET_RX_STATS) | BD_ENET_RX_EMPTY); 335 336 /* 337 * Update BD pointer to next entry. 338 */ 339 if ((sc & BD_ENET_RX_WRAP) == 0) 340 bdp++; 341 else 342 bdp = fep->rx_bd_base; 343 344 (*fep->ops->rx_bd_done)(dev); 345 } 346 347 fep->cur_rx = bdp; 348 349 return 0; 350} 351 352static void fs_enet_tx(struct net_device *dev) 353{ 354 struct fs_enet_private *fep = netdev_priv(dev); 355 cbd_t __iomem *bdp; 356 struct sk_buff *skb; 357 int dirtyidx, do_wake, do_restart; 358 u16 sc; 359 360 spin_lock(&fep->tx_lock); 361 bdp = fep->dirty_tx; 362 363 do_wake = do_restart = 0; 364 while (((sc = CBDR_SC(bdp)) & BD_ENET_TX_READY) == 0) { 365 dirtyidx = bdp - fep->tx_bd_base; 366 367 if (fep->tx_free == fep->tx_ring) 368 break; 369 370 skb = fep->tx_skbuff[dirtyidx]; 371 372 /* 373 * Check for errors. 374 */ 375 if (sc & (BD_ENET_TX_HB | BD_ENET_TX_LC | 376 BD_ENET_TX_RL | BD_ENET_TX_UN | BD_ENET_TX_CSL)) { 377 378 if (sc & BD_ENET_TX_HB) /* No heartbeat */ 379 fep->stats.tx_heartbeat_errors++; 380 if (sc & BD_ENET_TX_LC) /* Late collision */ 381 fep->stats.tx_window_errors++; 382 if (sc & BD_ENET_TX_RL) /* Retrans limit */ 383 fep->stats.tx_aborted_errors++; 384 if (sc & BD_ENET_TX_UN) /* Underrun */ 385 fep->stats.tx_fifo_errors++; 386 if (sc & BD_ENET_TX_CSL) /* Carrier lost */ 387 fep->stats.tx_carrier_errors++; 388 389 if (sc & (BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN)) { 390 fep->stats.tx_errors++; 391 do_restart = 1; 392 } 393 } else 394 fep->stats.tx_packets++; 395 396 if (sc & BD_ENET_TX_READY) 397 printk(KERN_WARNING DRV_MODULE_NAME 398 ": %s HEY! Enet xmit interrupt and TX_READY.\n", 399 dev->name); 400 401 /* 402 * Deferred means some collisions occurred during transmit, 403 * but we eventually sent the packet OK. 404 */ 405 if (sc & BD_ENET_TX_DEF) 406 fep->stats.collisions++; 407 408 /* unmap */ 409 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 410 skb->len, DMA_TO_DEVICE); 411 412 /* 413 * Free the sk buffer associated with this last transmit. 414 */ 415 dev_kfree_skb_irq(skb); 416 fep->tx_skbuff[dirtyidx] = NULL; 417 418 /* 419 * Update pointer to next buffer descriptor to be transmitted. 420 */ 421 if ((sc & BD_ENET_TX_WRAP) == 0) 422 bdp++; 423 else 424 bdp = fep->tx_bd_base; 425 426 /* 427 * Since we have freed up a buffer, the ring is no longer 428 * full. 429 */ 430 if (!fep->tx_free++) 431 do_wake = 1; 432 } 433 434 fep->dirty_tx = bdp; 435 436 if (do_restart) 437 (*fep->ops->tx_restart)(dev); 438 439 spin_unlock(&fep->tx_lock); 440 441 if (do_wake) 442 netif_wake_queue(dev); 443} 444 445/* 446 * The interrupt handler. 447 * This is called from the MPC core interrupt. 448 */ 449static irqreturn_t 450fs_enet_interrupt(int irq, void *dev_id) 451{ 452 struct net_device *dev = dev_id; 453 struct fs_enet_private *fep; 454 const struct fs_platform_info *fpi; 455 u32 int_events; 456 u32 int_clr_events; 457 int nr, napi_ok; 458 int handled; 459 460 fep = netdev_priv(dev); 461 fpi = fep->fpi; 462 463 nr = 0; 464 while ((int_events = (*fep->ops->get_int_events)(dev)) != 0) { 465 nr++; 466 467 int_clr_events = int_events; 468 if (fpi->use_napi) 469 int_clr_events &= ~fep->ev_napi_rx; 470 471 (*fep->ops->clear_int_events)(dev, int_clr_events); 472 473 if (int_events & fep->ev_err) 474 (*fep->ops->ev_error)(dev, int_events); 475 476 if (int_events & fep->ev_rx) { 477 if (!fpi->use_napi) 478 fs_enet_rx_non_napi(dev); 479 else { 480 napi_ok = napi_schedule_prep(&fep->napi); 481 482 (*fep->ops->napi_disable_rx)(dev); 483 (*fep->ops->clear_int_events)(dev, fep->ev_napi_rx); 484 485 /* NOTE: it is possible for FCCs in NAPI mode */ 486 /* to submit a spurious interrupt while in poll */ 487 if (napi_ok) 488 __netif_rx_schedule(dev, &fep->napi); 489 } 490 } 491 492 if (int_events & fep->ev_tx) 493 fs_enet_tx(dev); 494 } 495 496 handled = nr > 0; 497 return IRQ_RETVAL(handled); 498} 499 500void fs_init_bds(struct net_device *dev) 501{ 502 struct fs_enet_private *fep = netdev_priv(dev); 503 cbd_t __iomem *bdp; 504 struct sk_buff *skb; 505 int i; 506 507 fs_cleanup_bds(dev); 508 509 fep->dirty_tx = fep->cur_tx = fep->tx_bd_base; 510 fep->tx_free = fep->tx_ring; 511 fep->cur_rx = fep->rx_bd_base; 512 513 /* 514 * Initialize the receive buffer descriptors. 515 */ 516 for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) { 517 skb = dev_alloc_skb(ENET_RX_FRSIZE); 518 if (skb == NULL) { 519 printk(KERN_WARNING DRV_MODULE_NAME 520 ": %s Memory squeeze, unable to allocate skb\n", 521 dev->name); 522 break; 523 } 524 skb_align(skb, ENET_RX_ALIGN); 525 fep->rx_skbuff[i] = skb; 526 CBDW_BUFADDR(bdp, 527 dma_map_single(fep->dev, skb->data, 528 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 529 DMA_FROM_DEVICE)); 530 CBDW_DATLEN(bdp, 0); /* zero */ 531 CBDW_SC(bdp, BD_ENET_RX_EMPTY | 532 ((i < fep->rx_ring - 1) ? 0 : BD_SC_WRAP)); 533 } 534 /* 535 * if we failed, fillup remainder 536 */ 537 for (; i < fep->rx_ring; i++, bdp++) { 538 fep->rx_skbuff[i] = NULL; 539 CBDW_SC(bdp, (i < fep->rx_ring - 1) ? 0 : BD_SC_WRAP); 540 } 541 542 /* 543 * ...and the same for transmit. 544 */ 545 for (i = 0, bdp = fep->tx_bd_base; i < fep->tx_ring; i++, bdp++) { 546 fep->tx_skbuff[i] = NULL; 547 CBDW_BUFADDR(bdp, 0); 548 CBDW_DATLEN(bdp, 0); 549 CBDW_SC(bdp, (i < fep->tx_ring - 1) ? 0 : BD_SC_WRAP); 550 } 551} 552 553void fs_cleanup_bds(struct net_device *dev) 554{ 555 struct fs_enet_private *fep = netdev_priv(dev); 556 struct sk_buff *skb; 557 cbd_t __iomem *bdp; 558 int i; 559 560 /* 561 * Reset SKB transmit buffers. 562 */ 563 for (i = 0, bdp = fep->tx_bd_base; i < fep->tx_ring; i++, bdp++) { 564 if ((skb = fep->tx_skbuff[i]) == NULL) 565 continue; 566 567 /* unmap */ 568 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 569 skb->len, DMA_TO_DEVICE); 570 571 fep->tx_skbuff[i] = NULL; 572 dev_kfree_skb(skb); 573 } 574 575 /* 576 * Reset SKB receive buffers 577 */ 578 for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) { 579 if ((skb = fep->rx_skbuff[i]) == NULL) 580 continue; 581 582 /* unmap */ 583 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp), 584 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE), 585 DMA_FROM_DEVICE); 586 587 fep->rx_skbuff[i] = NULL; 588 589 dev_kfree_skb(skb); 590 } 591} 592 593/**********************************************************************************/ 594 595static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) 596{ 597 struct fs_enet_private *fep = netdev_priv(dev); 598 cbd_t __iomem *bdp; 599 int curidx; 600 u16 sc; 601 unsigned long flags; 602 603 spin_lock_irqsave(&fep->tx_lock, flags); 604 605 /* 606 * Fill in a Tx ring entry 607 */ 608 bdp = fep->cur_tx; 609 610 if (!fep->tx_free || (CBDR_SC(bdp) & BD_ENET_TX_READY)) { 611 netif_stop_queue(dev); 612 spin_unlock_irqrestore(&fep->tx_lock, flags); 613 614 /* 615 * Ooops. All transmit buffers are full. Bail out. 616 * This should not happen, since the tx queue should be stopped. 617 */ 618 printk(KERN_WARNING DRV_MODULE_NAME 619 ": %s tx queue full!.\n", dev->name); 620 return NETDEV_TX_BUSY; 621 } 622 623 curidx = bdp - fep->tx_bd_base; 624 /* 625 * Clear all of the status flags. 626 */ 627 CBDC_SC(bdp, BD_ENET_TX_STATS); 628 629 /* 630 * Save skb pointer. 631 */ 632 fep->tx_skbuff[curidx] = skb; 633 634 fep->stats.tx_bytes += skb->len; 635 636 /* 637 * Push the data cache so the CPM does not get stale memory data. 638 */ 639 CBDW_BUFADDR(bdp, dma_map_single(fep->dev, 640 skb->data, skb->len, DMA_TO_DEVICE)); 641 CBDW_DATLEN(bdp, skb->len); 642 643 dev->trans_start = jiffies; 644 645 /* 646 * If this was the last BD in the ring, start at the beginning again. 647 */ 648 if ((CBDR_SC(bdp) & BD_ENET_TX_WRAP) == 0) 649 fep->cur_tx++; 650 else 651 fep->cur_tx = fep->tx_bd_base; 652 653 if (!--fep->tx_free) 654 netif_stop_queue(dev); 655 656 /* Trigger transmission start */ 657 sc = BD_ENET_TX_READY | BD_ENET_TX_INTR | 658 BD_ENET_TX_LAST | BD_ENET_TX_TC; 659 660 /* note that while FEC does not have this bit 661 * it marks it as available for software use 662 * yay for hw reuse :) */ 663 if (skb->len <= 60) 664 sc |= BD_ENET_TX_PAD; 665 CBDS_SC(bdp, sc); 666 667 (*fep->ops->tx_kickstart)(dev); 668 669 spin_unlock_irqrestore(&fep->tx_lock, flags); 670 671 return NETDEV_TX_OK; 672} 673 674static int fs_request_irq(struct net_device *dev, int irq, const char *name, 675 irq_handler_t irqf) 676{ 677 struct fs_enet_private *fep = netdev_priv(dev); 678 679 (*fep->ops->pre_request_irq)(dev, irq); 680 return request_irq(irq, irqf, IRQF_SHARED, name, dev); 681} 682 683static void fs_free_irq(struct net_device *dev, int irq) 684{ 685 struct fs_enet_private *fep = netdev_priv(dev); 686 687 free_irq(irq, dev); 688 (*fep->ops->post_free_irq)(dev, irq); 689} 690 691static void fs_timeout(struct net_device *dev) 692{ 693 struct fs_enet_private *fep = netdev_priv(dev); 694 unsigned long flags; 695 int wake = 0; 696 697 fep->stats.tx_errors++; 698 699 spin_lock_irqsave(&fep->lock, flags); 700 701 if (dev->flags & IFF_UP) { 702 phy_stop(fep->phydev); 703 (*fep->ops->stop)(dev); 704 (*fep->ops->restart)(dev); 705 phy_start(fep->phydev); 706 } 707 708 phy_start(fep->phydev); 709 wake = fep->tx_free && !(CBDR_SC(fep->cur_tx) & BD_ENET_TX_READY); 710 spin_unlock_irqrestore(&fep->lock, flags); 711 712 if (wake) 713 netif_wake_queue(dev); 714} 715 716/*----------------------------------------------------------------------------- 717 * generic link-change handler - should be sufficient for most cases 718 *-----------------------------------------------------------------------------*/ 719static void generic_adjust_link(struct net_device *dev) 720{ 721 struct fs_enet_private *fep = netdev_priv(dev); 722 struct phy_device *phydev = fep->phydev; 723 int new_state = 0; 724 725 if (phydev->link) { 726 /* adjust to duplex mode */ 727 if (phydev->duplex != fep->oldduplex) { 728 new_state = 1; 729 fep->oldduplex = phydev->duplex; 730 } 731 732 if (phydev->speed != fep->oldspeed) { 733 new_state = 1; 734 fep->oldspeed = phydev->speed; 735 } 736 737 if (!fep->oldlink) { 738 new_state = 1; 739 fep->oldlink = 1; 740 netif_schedule(dev); 741 netif_carrier_on(dev); 742 netif_start_queue(dev); 743 } 744 745 if (new_state) 746 fep->ops->restart(dev); 747 } else if (fep->oldlink) { 748 new_state = 1; 749 fep->oldlink = 0; 750 fep->oldspeed = 0; 751 fep->oldduplex = -1; 752 netif_carrier_off(dev); 753 netif_stop_queue(dev); 754 } 755 756 if (new_state && netif_msg_link(fep)) 757 phy_print_status(phydev); 758} 759 760 761static void fs_adjust_link(struct net_device *dev) 762{ 763 struct fs_enet_private *fep = netdev_priv(dev); 764 unsigned long flags; 765 766 spin_lock_irqsave(&fep->lock, flags); 767 768 if(fep->ops->adjust_link) 769 fep->ops->adjust_link(dev); 770 else 771 generic_adjust_link(dev); 772 773 spin_unlock_irqrestore(&fep->lock, flags); 774} 775 776static int fs_init_phy(struct net_device *dev) 777{ 778 struct fs_enet_private *fep = netdev_priv(dev); 779 struct phy_device *phydev; 780 781 fep->oldlink = 0; 782 fep->oldspeed = 0; 783 fep->oldduplex = -1; 784 if(fep->fpi->bus_id) 785 phydev = phy_connect(dev, fep->fpi->bus_id, &fs_adjust_link, 0, 786 PHY_INTERFACE_MODE_MII); 787 else { 788 printk("No phy bus ID specified in BSP code\n"); 789 return -EINVAL; 790 } 791 if (IS_ERR(phydev)) { 792 printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); 793 return PTR_ERR(phydev); 794 } 795 796 fep->phydev = phydev; 797 798 return 0; 799} 800 801static int fs_enet_open(struct net_device *dev) 802{ 803 struct fs_enet_private *fep = netdev_priv(dev); 804 int r; 805 int err; 806 807 if (fep->fpi->use_napi) 808 napi_enable(&fep->napi); 809 810 /* Install our interrupt handler. */ 811 r = fs_request_irq(dev, fep->interrupt, "fs_enet-mac", fs_enet_interrupt); 812 if (r != 0) { 813 printk(KERN_ERR DRV_MODULE_NAME 814 ": %s Could not allocate FS_ENET IRQ!", dev->name); 815 if (fep->fpi->use_napi) 816 napi_disable(&fep->napi); 817 return -EINVAL; 818 } 819 820 err = fs_init_phy(dev); 821 if (err) { 822 if (fep->fpi->use_napi) 823 napi_disable(&fep->napi); 824 return err; 825 } 826 phy_start(fep->phydev); 827 828 return 0; 829} 830 831static int fs_enet_close(struct net_device *dev) 832{ 833 struct fs_enet_private *fep = netdev_priv(dev); 834 unsigned long flags; 835 836 netif_stop_queue(dev); 837 netif_carrier_off(dev); 838 napi_disable(&fep->napi); 839 phy_stop(fep->phydev); 840 841 spin_lock_irqsave(&fep->lock, flags); 842 spin_lock(&fep->tx_lock); 843 (*fep->ops->stop)(dev); 844 spin_unlock(&fep->tx_lock); 845 spin_unlock_irqrestore(&fep->lock, flags); 846 847 /* release any irqs */ 848 phy_disconnect(fep->phydev); 849 fep->phydev = NULL; 850 fs_free_irq(dev, fep->interrupt); 851 852 return 0; 853} 854 855static struct net_device_stats *fs_enet_get_stats(struct net_device *dev) 856{ 857 struct fs_enet_private *fep = netdev_priv(dev); 858 return &fep->stats; 859} 860 861/*************************************************************************/ 862 863static void fs_get_drvinfo(struct net_device *dev, 864 struct ethtool_drvinfo *info) 865{ 866 strcpy(info->driver, DRV_MODULE_NAME); 867 strcpy(info->version, DRV_MODULE_VERSION); 868} 869 870static int fs_get_regs_len(struct net_device *dev) 871{ 872 struct fs_enet_private *fep = netdev_priv(dev); 873 874 return (*fep->ops->get_regs_len)(dev); 875} 876 877static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs, 878 void *p) 879{ 880 struct fs_enet_private *fep = netdev_priv(dev); 881 unsigned long flags; 882 int r, len; 883 884 len = regs->len; 885 886 spin_lock_irqsave(&fep->lock, flags); 887 r = (*fep->ops->get_regs)(dev, p, &len); 888 spin_unlock_irqrestore(&fep->lock, flags); 889 890 if (r == 0) 891 regs->version = 0; 892} 893 894static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 895{ 896 struct fs_enet_private *fep = netdev_priv(dev); 897 898 if (!fep->phydev) 899 return -ENODEV; 900 901 return phy_ethtool_gset(fep->phydev, cmd); 902} 903 904static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 905{ 906 struct fs_enet_private *fep = netdev_priv(dev); 907 908 if (!fep->phydev) 909 return -ENODEV; 910 911 return phy_ethtool_sset(fep->phydev, cmd); 912} 913 914static int fs_nway_reset(struct net_device *dev) 915{ 916 return 0; 917} 918 919static u32 fs_get_msglevel(struct net_device *dev) 920{ 921 struct fs_enet_private *fep = netdev_priv(dev); 922 return fep->msg_enable; 923} 924 925static void fs_set_msglevel(struct net_device *dev, u32 value) 926{ 927 struct fs_enet_private *fep = netdev_priv(dev); 928 fep->msg_enable = value; 929} 930 931static const struct ethtool_ops fs_ethtool_ops = { 932 .get_drvinfo = fs_get_drvinfo, 933 .get_regs_len = fs_get_regs_len, 934 .get_settings = fs_get_settings, 935 .set_settings = fs_set_settings, 936 .nway_reset = fs_nway_reset, 937 .get_link = ethtool_op_get_link, 938 .get_msglevel = fs_get_msglevel, 939 .set_msglevel = fs_set_msglevel, 940 .set_tx_csum = ethtool_op_set_tx_csum, /* local! */ 941 .set_sg = ethtool_op_set_sg, 942 .get_regs = fs_get_regs, 943}; 944 945static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 946{ 947 struct fs_enet_private *fep = netdev_priv(dev); 948 struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&rq->ifr_data; 949 unsigned long flags; 950 int rc; 951 952 if (!netif_running(dev)) 953 return -EINVAL; 954 955 spin_lock_irqsave(&fep->lock, flags); 956 rc = phy_mii_ioctl(fep->phydev, mii, cmd); 957 spin_unlock_irqrestore(&fep->lock, flags); 958 return rc; 959} 960 961extern int fs_mii_connect(struct net_device *dev); 962extern void fs_mii_disconnect(struct net_device *dev); 963 964#ifndef CONFIG_PPC_CPM_NEW_BINDING 965static struct net_device *fs_init_instance(struct device *dev, 966 struct fs_platform_info *fpi) 967{ 968 struct net_device *ndev = NULL; 969 struct fs_enet_private *fep = NULL; 970 int privsize, i, r, err = 0, registered = 0; 971 972 fpi->fs_no = fs_get_id(fpi); 973 /* guard */ 974 if ((unsigned int)fpi->fs_no >= FS_MAX_INDEX) 975 return ERR_PTR(-EINVAL); 976 977 privsize = sizeof(*fep) + (sizeof(struct sk_buff **) * 978 (fpi->rx_ring + fpi->tx_ring)); 979 980 ndev = alloc_etherdev(privsize); 981 if (!ndev) { 982 err = -ENOMEM; 983 goto err; 984 } 985 986 fep = netdev_priv(ndev); 987 988 fep->dev = dev; 989 dev_set_drvdata(dev, ndev); 990 fep->fpi = fpi; 991 if (fpi->init_ioports) 992 fpi->init_ioports((struct fs_platform_info *)fpi); 993 994#ifdef CONFIG_FS_ENET_HAS_FEC 995 if (fs_get_fec_index(fpi->fs_no) >= 0) 996 fep->ops = &fs_fec_ops; 997#endif 998 999#ifdef CONFIG_FS_ENET_HAS_SCC 1000 if (fs_get_scc_index(fpi->fs_no) >=0) 1001 fep->ops = &fs_scc_ops; 1002#endif 1003 1004#ifdef CONFIG_FS_ENET_HAS_FCC 1005 if (fs_get_fcc_index(fpi->fs_no) >= 0) 1006 fep->ops = &fs_fcc_ops; 1007#endif 1008 1009 if (fep->ops == NULL) { 1010 printk(KERN_ERR DRV_MODULE_NAME 1011 ": %s No matching ops found (%d).\n", 1012 ndev->name, fpi->fs_no); 1013 err = -EINVAL; 1014 goto err; 1015 } 1016 1017 r = (*fep->ops->setup_data)(ndev); 1018 if (r != 0) { 1019 printk(KERN_ERR DRV_MODULE_NAME 1020 ": %s setup_data failed\n", 1021 ndev->name); 1022 err = r; 1023 goto err; 1024 } 1025 1026 /* point rx_skbuff, tx_skbuff */ 1027 fep->rx_skbuff = (struct sk_buff **)&fep[1]; 1028 fep->tx_skbuff = fep->rx_skbuff + fpi->rx_ring; 1029 1030 /* init locks */ 1031 spin_lock_init(&fep->lock); 1032 spin_lock_init(&fep->tx_lock); 1033 1034 /* 1035 * Set the Ethernet address. 1036 */ 1037 for (i = 0; i < 6; i++) 1038 ndev->dev_addr[i] = fpi->macaddr[i]; 1039 1040 r = (*fep->ops->allocate_bd)(ndev); 1041 1042 if (fep->ring_base == NULL) { 1043 printk(KERN_ERR DRV_MODULE_NAME 1044 ": %s buffer descriptor alloc failed (%d).\n", ndev->name, r); 1045 err = r; 1046 goto err; 1047 } 1048 1049 /* 1050 * Set receive and transmit descriptor base. 1051 */ 1052 fep->rx_bd_base = fep->ring_base; 1053 fep->tx_bd_base = fep->rx_bd_base + fpi->rx_ring; 1054 1055 /* initialize ring size variables */ 1056 fep->tx_ring = fpi->tx_ring; 1057 fep->rx_ring = fpi->rx_ring; 1058 1059 /* 1060 * The FEC Ethernet specific entries in the device structure. 1061 */ 1062 ndev->open = fs_enet_open; 1063 ndev->hard_start_xmit = fs_enet_start_xmit; 1064 ndev->tx_timeout = fs_timeout; 1065 ndev->watchdog_timeo = 2 * HZ; 1066 ndev->stop = fs_enet_close; 1067 ndev->get_stats = fs_enet_get_stats; 1068 ndev->set_multicast_list = fs_set_multicast_list; 1069 1070#ifdef CONFIG_NET_POLL_CONTROLLER 1071 ndev->poll_controller = fs_enet_netpoll; 1072#endif 1073 1074 netif_napi_add(ndev, &fep->napi, 1075 fs_enet_rx_napi, fpi->napi_weight); 1076 1077 ndev->ethtool_ops = &fs_ethtool_ops; 1078 ndev->do_ioctl = fs_ioctl; 1079 1080 init_timer(&fep->phy_timer_list); 1081 1082 netif_carrier_off(ndev); 1083 1084 err = register_netdev(ndev); 1085 if (err != 0) { 1086 printk(KERN_ERR DRV_MODULE_NAME 1087 ": %s register_netdev failed.\n", ndev->name); 1088 goto err; 1089 } 1090 registered = 1; 1091 1092 1093 return ndev; 1094 1095err: 1096 if (ndev != NULL) { 1097 if (registered) 1098 unregister_netdev(ndev); 1099 1100 if (fep != NULL) { 1101 (*fep->ops->free_bd)(ndev); 1102 (*fep->ops->cleanup_data)(ndev); 1103 } 1104 1105 free_netdev(ndev); 1106 } 1107 1108 dev_set_drvdata(dev, NULL); 1109 1110 return ERR_PTR(err); 1111} 1112 1113static int fs_cleanup_instance(struct net_device *ndev) 1114{ 1115 struct fs_enet_private *fep; 1116 const struct fs_platform_info *fpi; 1117 struct device *dev; 1118 1119 if (ndev == NULL) 1120 return -EINVAL; 1121 1122 fep = netdev_priv(ndev); 1123 if (fep == NULL) 1124 return -EINVAL; 1125 1126 fpi = fep->fpi; 1127 1128 unregister_netdev(ndev); 1129 1130 dma_free_coherent(fep->dev, (fpi->tx_ring + fpi->rx_ring) * sizeof(cbd_t), 1131 (void __force *)fep->ring_base, fep->ring_mem_addr); 1132 1133 /* reset it */ 1134 (*fep->ops->cleanup_data)(ndev); 1135 1136 dev = fep->dev; 1137 if (dev != NULL) { 1138 dev_set_drvdata(dev, NULL); 1139 fep->dev = NULL; 1140 } 1141 1142 free_netdev(ndev); 1143 1144 return 0; 1145} 1146#endif 1147 1148/**************************************************************************************/ 1149 1150/* handy pointer to the immap */ 1151void __iomem *fs_enet_immap = NULL; 1152 1153static int setup_immap(void) 1154{ 1155#ifdef CONFIG_CPM1 1156 fs_enet_immap = ioremap(IMAP_ADDR, 0x4000); 1157 WARN_ON(!fs_enet_immap); 1158#elif defined(CONFIG_CPM2) 1159 fs_enet_immap = cpm2_immr; 1160#endif 1161 1162 return 0; 1163} 1164 1165static void cleanup_immap(void) 1166{ 1167#if defined(CONFIG_CPM1) 1168 iounmap(fs_enet_immap); 1169#endif 1170} 1171 1172/**************************************************************************************/ 1173 1174#ifdef CONFIG_PPC_CPM_NEW_BINDING 1175static int __devinit find_phy(struct device_node *np, 1176 struct fs_platform_info *fpi) 1177{ 1178 struct device_node *phynode, *mdionode; 1179 struct resource res; 1180 int ret = 0, len; 1181 1182 const u32 *data = of_get_property(np, "phy-handle", &len); 1183 if (!data || len != 4) 1184 return -EINVAL; 1185 1186 phynode = of_find_node_by_phandle(*data); 1187 if (!phynode) 1188 return -EINVAL; 1189 1190 mdionode = of_get_parent(phynode); 1191 if (!mdionode) 1192 goto out_put_phy; 1193 1194 ret = of_address_to_resource(mdionode, 0, &res); 1195 if (ret) 1196 goto out_put_mdio; 1197 1198 data = of_get_property(phynode, "reg", &len); 1199 if (!data || len != 4) 1200 goto out_put_mdio; 1201 1202 snprintf(fpi->bus_id, 16, PHY_ID_FMT, res.start, *data); 1203 1204out_put_mdio: 1205 of_node_put(mdionode); 1206out_put_phy: 1207 of_node_put(phynode); 1208 return ret; 1209} 1210 1211#ifdef CONFIG_FS_ENET_HAS_FEC 1212#define IS_FEC(match) ((match)->data == &fs_fec_ops) 1213#else 1214#define IS_FEC(match) 0 1215#endif 1216 1217static int __devinit fs_enet_probe(struct of_device *ofdev, 1218 const struct of_device_id *match) 1219{ 1220 struct net_device *ndev; 1221 struct fs_enet_private *fep; 1222 struct fs_platform_info *fpi; 1223 const u32 *data; 1224 const u8 *mac_addr; 1225 int privsize, len, ret = -ENODEV; 1226 1227 fpi = kzalloc(sizeof(*fpi), GFP_KERNEL); 1228 if (!fpi) 1229 return -ENOMEM; 1230 1231 if (!IS_FEC(match)) { 1232 data = of_get_property(ofdev->node, "fsl,cpm-command", &len); 1233 if (!data || len != 4) 1234 goto out_free_fpi; 1235 1236 fpi->cp_command = *data; 1237 } 1238 1239 fpi->rx_ring = 32; 1240 fpi->tx_ring = 32; 1241 fpi->rx_copybreak = 240; 1242 fpi->use_napi = 1; 1243 fpi->napi_weight = 17; 1244 1245 ret = find_phy(ofdev->node, fpi); 1246 if (ret) 1247 goto out_free_fpi; 1248 1249 privsize = sizeof(*fep) + 1250 sizeof(struct sk_buff **) * 1251 (fpi->rx_ring + fpi->tx_ring); 1252 1253 ndev = alloc_etherdev(privsize); 1254 if (!ndev) { 1255 ret = -ENOMEM; 1256 goto out_free_fpi; 1257 } 1258 1259 dev_set_drvdata(&ofdev->dev, ndev); 1260 1261 fep = netdev_priv(ndev); 1262 fep->dev = &ofdev->dev; 1263 fep->ndev = ndev; 1264 fep->fpi = fpi; 1265 fep->ops = match->data; 1266 1267 ret = fep->ops->setup_data(ndev); 1268 if (ret) 1269 goto out_free_dev; 1270 1271 fep->rx_skbuff = (struct sk_buff **)&fep[1]; 1272 fep->tx_skbuff = fep->rx_skbuff + fpi->rx_ring; 1273 1274 spin_lock_init(&fep->lock); 1275 spin_lock_init(&fep->tx_lock); 1276 1277 mac_addr = of_get_mac_address(ofdev->node); 1278 if (mac_addr) 1279 memcpy(ndev->dev_addr, mac_addr, 6); 1280 1281 ret = fep->ops->allocate_bd(ndev); 1282 if (ret) 1283 goto out_cleanup_data; 1284 1285 fep->rx_bd_base = fep->ring_base; 1286 fep->tx_bd_base = fep->rx_bd_base + fpi->rx_ring; 1287 1288 fep->tx_ring = fpi->tx_ring; 1289 fep->rx_ring = fpi->rx_ring; 1290 1291 ndev->open = fs_enet_open; 1292 ndev->hard_start_xmit = fs_enet_start_xmit; 1293 ndev->tx_timeout = fs_timeout; 1294 ndev->watchdog_timeo = 2 * HZ; 1295 ndev->stop = fs_enet_close; 1296 ndev->get_stats = fs_enet_get_stats; 1297 ndev->set_multicast_list = fs_set_multicast_list; 1298 1299 if (fpi->use_napi) 1300 netif_napi_add(ndev, &fep->napi, fs_enet_rx_napi, 1301 fpi->napi_weight); 1302 1303 ndev->ethtool_ops = &fs_ethtool_ops; 1304 ndev->do_ioctl = fs_ioctl; 1305 1306 init_timer(&fep->phy_timer_list); 1307 1308 netif_carrier_off(ndev); 1309 1310 ret = register_netdev(ndev); 1311 if (ret) 1312 goto out_free_bd; 1313 1314 printk(KERN_INFO "%s: fs_enet: %02x:%02x:%02x:%02x:%02x:%02x\n", 1315 ndev->name, 1316 ndev->dev_addr[0], ndev->dev_addr[1], ndev->dev_addr[2], 1317 ndev->dev_addr[3], ndev->dev_addr[4], ndev->dev_addr[5]); 1318 1319 return 0; 1320 1321out_free_bd: 1322 fep->ops->free_bd(ndev); 1323out_cleanup_data: 1324 fep->ops->cleanup_data(ndev); 1325out_free_dev: 1326 free_netdev(ndev); 1327 dev_set_drvdata(&ofdev->dev, NULL); 1328out_free_fpi: 1329 kfree(fpi); 1330 return ret; 1331} 1332 1333static int fs_enet_remove(struct of_device *ofdev) 1334{ 1335 struct net_device *ndev = dev_get_drvdata(&ofdev->dev); 1336 struct fs_enet_private *fep = netdev_priv(ndev); 1337 1338 unregister_netdev(ndev); 1339 1340 fep->ops->free_bd(ndev); 1341 fep->ops->cleanup_data(ndev); 1342 dev_set_drvdata(fep->dev, NULL); 1343 1344 free_netdev(ndev); 1345 return 0; 1346} 1347 1348static struct of_device_id fs_enet_match[] = { 1349#ifdef CONFIG_FS_ENET_HAS_SCC 1350 { 1351 .compatible = "fsl,cpm1-scc-enet", 1352 .data = (void *)&fs_scc_ops, 1353 }, 1354#endif 1355#ifdef CONFIG_FS_ENET_HAS_FCC 1356 { 1357 .compatible = "fsl,cpm2-fcc-enet", 1358 .data = (void *)&fs_fcc_ops, 1359 }, 1360#endif 1361#ifdef CONFIG_FS_ENET_HAS_FEC 1362 { 1363 .compatible = "fsl,pq1-fec-enet", 1364 .data = (void *)&fs_fec_ops, 1365 }, 1366#endif 1367 {} 1368}; 1369 1370static struct of_platform_driver fs_enet_driver = { 1371 .name = "fs_enet", 1372 .match_table = fs_enet_match, 1373 .probe = fs_enet_probe, 1374 .remove = fs_enet_remove, 1375}; 1376 1377static int __init fs_init(void) 1378{ 1379 int r = setup_immap(); 1380 if (r != 0) 1381 return r; 1382 1383 r = of_register_platform_driver(&fs_enet_driver); 1384 if (r != 0) 1385 goto out; 1386 1387 return 0; 1388 1389out: 1390 cleanup_immap(); 1391 return r; 1392} 1393 1394static void __exit fs_cleanup(void) 1395{ 1396 of_unregister_platform_driver(&fs_enet_driver); 1397 cleanup_immap(); 1398} 1399#else 1400static int __devinit fs_enet_probe(struct device *dev) 1401{ 1402 struct net_device *ndev; 1403 1404 /* no fixup - no device */ 1405 if (dev->platform_data == NULL) { 1406 printk(KERN_INFO "fs_enet: " 1407 "probe called with no platform data; " 1408 "remove unused devices\n"); 1409 return -ENODEV; 1410 } 1411 1412 ndev = fs_init_instance(dev, dev->platform_data); 1413 if (IS_ERR(ndev)) 1414 return PTR_ERR(ndev); 1415 return 0; 1416} 1417 1418static int fs_enet_remove(struct device *dev) 1419{ 1420 return fs_cleanup_instance(dev_get_drvdata(dev)); 1421} 1422 1423static struct device_driver fs_enet_fec_driver = { 1424 .name = "fsl-cpm-fec", 1425 .bus = &platform_bus_type, 1426 .probe = fs_enet_probe, 1427 .remove = fs_enet_remove, 1428#ifdef CONFIG_PM 1429/* .suspend = fs_enet_suspend, TODO */ 1430/* .resume = fs_enet_resume, TODO */ 1431#endif 1432}; 1433 1434static struct device_driver fs_enet_scc_driver = { 1435 .name = "fsl-cpm-scc", 1436 .bus = &platform_bus_type, 1437 .probe = fs_enet_probe, 1438 .remove = fs_enet_remove, 1439#ifdef CONFIG_PM 1440/* .suspend = fs_enet_suspend, TODO */ 1441/* .resume = fs_enet_resume, TODO */ 1442#endif 1443}; 1444 1445static struct device_driver fs_enet_fcc_driver = { 1446 .name = "fsl-cpm-fcc", 1447 .bus = &platform_bus_type, 1448 .probe = fs_enet_probe, 1449 .remove = fs_enet_remove, 1450#ifdef CONFIG_PM 1451/* .suspend = fs_enet_suspend, TODO */ 1452/* .resume = fs_enet_resume, TODO */ 1453#endif 1454}; 1455 1456static int __init fs_init(void) 1457{ 1458 int r; 1459 1460 printk(KERN_INFO 1461 "%s", version); 1462 1463 r = setup_immap(); 1464 if (r != 0) 1465 return r; 1466 1467#ifdef CONFIG_FS_ENET_HAS_FCC 1468 /* let's insert mii stuff */ 1469 r = fs_enet_mdio_bb_init(); 1470 1471 if (r != 0) { 1472 printk(KERN_ERR DRV_MODULE_NAME 1473 "BB PHY init failed.\n"); 1474 return r; 1475 } 1476 r = driver_register(&fs_enet_fcc_driver); 1477 if (r != 0) 1478 goto err; 1479#endif 1480 1481#ifdef CONFIG_FS_ENET_HAS_FEC 1482 r = fs_enet_mdio_fec_init(); 1483 if (r != 0) { 1484 printk(KERN_ERR DRV_MODULE_NAME 1485 "FEC PHY init failed.\n"); 1486 return r; 1487 } 1488 1489 r = driver_register(&fs_enet_fec_driver); 1490 if (r != 0) 1491 goto err; 1492#endif 1493 1494#ifdef CONFIG_FS_ENET_HAS_SCC 1495 r = driver_register(&fs_enet_scc_driver); 1496 if (r != 0) 1497 goto err; 1498#endif 1499 1500 return 0; 1501err: 1502 cleanup_immap(); 1503 return r; 1504} 1505 1506static void __exit fs_cleanup(void) 1507{ 1508 driver_unregister(&fs_enet_fec_driver); 1509 driver_unregister(&fs_enet_fcc_driver); 1510 driver_unregister(&fs_enet_scc_driver); 1511 cleanup_immap(); 1512} 1513#endif 1514 1515#ifdef CONFIG_NET_POLL_CONTROLLER 1516static void fs_enet_netpoll(struct net_device *dev) 1517{ 1518 disable_irq(dev->irq); 1519 fs_enet_interrupt(dev->irq, dev, NULL); 1520 enable_irq(dev->irq); 1521} 1522#endif 1523 1524/**************************************************************************************/ 1525 1526module_init(fs_init); 1527module_exit(fs_cleanup);