Merge commit 'origin/master'
Benjamin Herrenschmidt [Tue, 22 Jul 2008 07:12:37 +0000 (17:12 +1000)]
Manually fixed up:

drivers/net/fs_enet/fs_enet-main.c

1  2 
Documentation/powerpc/booting-without-of.txt
drivers/net/fs_enet/fs_enet-main.c
drivers/net/gianfar.c
drivers/net/gianfar.h

@@@ -41,12 -41,24 +41,24 @@@ Table of Content
    VI - System-on-a-chip devices and nodes
      1) Defining child nodes of an SOC
      2) Representing devices without a current OF specification
-       a) PHY nodes
-       b) Interrupt controllers
-       c) CFI or JEDEC memory-mapped NOR flash
-       d) 4xx/Axon EMAC ethernet nodes
-       e) Xilinx IP cores
-       f) USB EHCI controllers
+       a) MDIO IO device
+       b) Gianfar-compatible ethernet nodes
+       c) PHY nodes
+       d) Interrupt controllers
+       e) I2C
+       f) Freescale SOC USB controllers
+       g) Freescale SOC SEC Security Engines
+       h) Board Control and Status (BCSR)
+       i) Freescale QUICC Engine module (QE)
+       j) CFI or JEDEC memory-mapped NOR flash
+       k) Global Utilities Block
+       l) Freescale Communications Processor Module
+       m) Chipselect/Local Bus
+       n) 4xx/Axon EMAC ethernet nodes
+       o) Xilinx IP cores
+       p) Freescale Synchronous Serial Interface
+         q) USB EHCI controllers
+       r) MDIO on GPIOs
  
    VII - Marvell Discovery mv64[345]6x System Controller chips
      1) The /system-controller node
      3) OpenPIC Interrupt Controllers
      4) ISA Interrupt Controllers
  
 -  VIII - Specifying GPIO information for devices
 +  IX - Specifying GPIO information for devices
      1) gpios property
      2) gpio-controller nodes
  
 +  X - Specifying device power management information (sleep property)
 +
    Appendix A - Sample SOC node for MPC8540
  
  
@@@ -1817,6 -1827,60 +1829,60 @@@ platforms are moved over to use the fla
                   big-endian;
           };
  
+     r) Freescale Display Interface Unit
+     The Freescale DIU is a LCD controller, with proper hardware, it can also
+     drive DVI monitors.
+     Required properties:
+     - compatible : should be "fsl-diu".
+     - reg : should contain at least address and length of the DIU register
+       set.
+     - Interrupts : one DIU interrupt should be describe here.
+     Example (MPC8610HPCD)
+       display@2c000 {
+               compatible = "fsl,diu";
+               reg = <0x2c000 100>;
+               interrupts = <72 2>;
+               interrupt-parent = <&mpic>;
+       };
+     s) Freescale on board FPGA
+     This is the memory-mapped registers for on board FPGA.
+     Required properities:
+     - compatible : should be "fsl,fpga-pixis".
+     - reg : should contain the address and the lenght of the FPPGA register
+       set.
+     Example (MPC8610HPCD)
+       board-control@e8000000 {
+               compatible = "fsl,fpga-pixis";
+               reg = <0xe8000000 32>;
+       };
+    r) MDIO on GPIOs
+    Currently defined compatibles:
+    - virtual,gpio-mdio
+    MDC and MDIO lines connected to GPIO controllers are listed in the
+    gpios property as described in section VIII.1 in the following order:
+    MDC, MDIO.
+    Example:
+       mdio {
+               compatible = "virtual,mdio-gpio";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               gpios = <&qe_pio_a 11
+                        &qe_pio_c 6>;
+       };
  VII - Marvell Discovery mv64[345]6x System Controller chips
  ===========================================================
  
@@@ -2424,8 -2488,8 +2490,8 @@@ encodings listed below
        2 =  high to low edge sensitive type enabled
        3 =  low to high edge sensitive type enabled
  
 -VIII - Specifying GPIO information for devices
 -==============================================
 +IX - Specifying GPIO information for devices
 +============================================
  
  1) gpios property
  -----------------
@@@ -2473,151 -2537,116 +2539,151 @@@ Example of two SOC GPIO banks defined a
                gpio-controller;
        };
  
 +X - Specifying Device Power Management Information (sleep property)
 +===================================================================
 +
 +Devices on SOCs often have mechanisms for placing devices into low-power
 +states that are decoupled from the devices' own register blocks.  Sometimes,
 +this information is more complicated than a cell-index property can
 +reasonably describe.  Thus, each device controlled in such a manner
 +may contain a "sleep" property which describes these connections.
 +
 +The sleep property consists of one or more sleep resources, each of
 +which consists of a phandle to a sleep controller, followed by a
 +controller-specific sleep specifier of zero or more cells.
 +
 +The semantics of what type of low power modes are possible are defined
 +by the sleep controller.  Some examples of the types of low power modes
 +that may be supported are:
 +
 + - Dynamic: The device may be disabled or enabled at any time.
 + - System Suspend: The device may request to be disabled or remain
 +   awake during system suspend, but will not be disabled until then.
 + - Permanent: The device is disabled permanently (until the next hard
 +   reset).
 +
 +Some devices may share a clock domain with each other, such that they should
 +only be suspended when none of the devices are in use.  Where reasonable,
 +such nodes should be placed on a virtual bus, where the bus has the sleep
 +property.  If the clock domain is shared among devices that cannot be
 +reasonably grouped in this manner, then create a virtual sleep controller
 +(similar to an interrupt nexus, except that defining a standardized
 +sleep-map should wait until its necessity is demonstrated).
 +
  Appendix A - Sample SOC node for MPC8540
  ========================================
  
 -Note that the #address-cells and #size-cells for the SoC node
 -in this example have been explicitly listed; these are likely
 -not necessary as they are usually the same as the root node.
 -
 -      soc8540@e0000000 {
 +      soc@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
 -              #interrupt-cells = <2>;
 +              compatible = "fsl,mpc8540-ccsr", "simple-bus";
                device_type = "soc";
 -              ranges = <00000000 e0000000 00100000>
 -              reg = <e0000000 00003000>;
 +              ranges = <0x00000000 0xe0000000 0x00100000>
                bus-frequency = <0>;
 -
 -              mdio@24520 {
 -                      reg = <24520 20>;
 -                      device_type = "mdio";
 -                      compatible = "gianfar";
 -
 -                      ethernet-phy@0 {
 -                              linux,phandle = <2452000>
 -                              interrupt-parent = <40000>;
 -                              interrupts = <35 1>;
 -                              reg = <0>;
 -                              device_type = "ethernet-phy";
 -                      };
 -
 -                      ethernet-phy@1 {
 -                              linux,phandle = <2452001>
 -                              interrupt-parent = <40000>;
 -                              interrupts = <35 1>;
 -                              reg = <1>;
 -                              device_type = "ethernet-phy";
 -                      };
 -
 -                      ethernet-phy@3 {
 -                              linux,phandle = <2452002>
 -                              interrupt-parent = <40000>;
 -                              interrupts = <35 1>;
 -                              reg = <3>;
 -                              device_type = "ethernet-phy";
 -                      };
 -
 -              };
 +              interrupt-parent = <&pic>;
  
                ethernet@24000 {
 -                      #size-cells = <0>;
 +                      #address-cells = <1>;
 +                      #size-cells = <1>;
                        device_type = "network";
                        model = "TSEC";
 -                      compatible = "gianfar";
 -                      reg = <24000 1000>;
 -                      mac-address = [ 00 E0 0C 00 73 00 ];
 -                      interrupts = <d 3 e 3 12 3>;
 -                      interrupt-parent = <40000>;
 -                      phy-handle = <2452000>;
 +                      compatible = "gianfar", "simple-bus";
 +                      reg = <0x24000 0x1000>;
 +                      local-mac-address = [ 00 E0 0C 00 73 00 ];
 +                      interrupts = <29 2 30 2 34 2>;
 +                      phy-handle = <&phy0>;
 +                      sleep = <&pmc 00000080>;
 +                      ranges;
 +
 +                      mdio@24520 {
 +                              reg = <0x24520 0x20>;
 +                              compatible = "fsl,gianfar-mdio";
 +
 +                              phy0: ethernet-phy@0 {
 +                                      interrupts = <5 1>;
 +                                      reg = <0>;
 +                                      device_type = "ethernet-phy";
 +                              };
 +
 +                              phy1: ethernet-phy@1 {
 +                                      interrupts = <5 1>;
 +                                      reg = <1>;
 +                                      device_type = "ethernet-phy";
 +                              };
 +
 +                              phy3: ethernet-phy@3 {
 +                                      interrupts = <7 1>;
 +                                      reg = <3>;
 +                                      device_type = "ethernet-phy";
 +                              };
 +                      };
                };
  
                ethernet@25000 {
                        device_type = "network";
                        model = "TSEC";
                        compatible = "gianfar";
 -                      reg = <25000 1000>;
 -                      mac-address = [ 00 E0 0C 00 73 01 ];
 -                      interrupts = <13 3 14 3 18 3>;
 -                      interrupt-parent = <40000>;
 -                      phy-handle = <2452001>;
 +                      reg = <0x25000 0x1000>;
 +                      local-mac-address = [ 00 E0 0C 00 73 01 ];
 +                      interrupts = <13 2 14 2 18 2>;
 +                      phy-handle = <&phy1>;
 +                      sleep = <&pmc 00000040>;
                };
  
                ethernet@26000 {
                        device_type = "network";
                        model = "FEC";
                        compatible = "gianfar";
 -                      reg = <26000 1000>;
 -                      mac-address = [ 00 E0 0C 00 73 02 ];
 -                      interrupts = <19 3>;
 -                      interrupt-parent = <40000>;
 -                      phy-handle = <2452002>;
 +                      reg = <0x26000 0x1000>;
 +                      local-mac-address = [ 00 E0 0C 00 73 02 ];
 +                      interrupts = <41 2>;
 +                      phy-handle = <&phy3>;
 +                      sleep = <&pmc 00000020>;
                };
  
                serial@4500 {
 -                      device_type = "serial";
 -                      compatible = "ns16550";
 -                      reg = <4500 100>;
 -                      clock-frequency = <0>;
 -                      interrupts = <1a 3>;
 -                      interrupt-parent = <40000>;
 +                      #address-cells = <1>;
 +                      #size-cells = <1>;
 +                      compatible = "fsl,mpc8540-duart", "simple-bus";
 +                      sleep = <&pmc 00000002>;
 +                      ranges;
 +
 +                      serial@4500 {
 +                              device_type = "serial";
 +                              compatible = "ns16550";
 +                              reg = <0x4500 0x100>;
 +                              clock-frequency = <0>;
 +                              interrupts = <42 2>;
 +                      };
 +
 +                      serial@4600 {
 +                              device_type = "serial";
 +                              compatible = "ns16550";
 +                              reg = <0x4600 0x100>;
 +                              clock-frequency = <0>;
 +                              interrupts = <42 2>;
 +                      };
                };
  
 -              pic@40000 {
 -                      linux,phandle = <40000>;
 +              pic: pic@40000 {
                        interrupt-controller;
                        #address-cells = <0>;
 -                      reg = <40000 40000>;
 +                      #interrupt-cells = <2>;
 +                      reg = <0x40000 0x40000>;
                        compatible = "chrp,open-pic";
                        device_type = "open-pic";
                };
  
                i2c@3000 {
 -                      interrupt-parent = <40000>;
 -                      interrupts = <1b 3>;
 -                      reg = <3000 18>;
 -                      device_type = "i2c";
 +                      interrupts = <43 2>;
 +                      reg = <0x3000 0x100>;
                        compatible  = "fsl-i2c";
                        dfsrr;
 +                      sleep = <&pmc 00000004>;
                };
  
 +              pmc: power@e0070 {
 +                      compatible = "fsl,mpc8540-pmc", "fsl,mpc8548-pmc";
 +                      reg = <0xe0070 0x20>;
 +              };
        };
  #include <linux/fs.h>
  #include <linux/platform_device.h>
  #include <linux/phy.h>
 +#include <linux/of_platform.h>
++#include <linux/of_gpio.h>
  
  #include <linux/vmalloc.h>
  #include <asm/pgtable.h>
  #include <asm/irq.h>
  #include <asm/uaccess.h>
  
 -#ifdef CONFIG_PPC_CPM_NEW_BINDING
 -#include <linux/of_gpio.h>
 -#include <linux/of_platform.h>
 -#endif
 -
  #include "fs_enet.h"
  
  /*************************************************/
  
 -#ifndef CONFIG_PPC_CPM_NEW_BINDING
 -static char version[] __devinitdata =
 -    DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")" "\n";
 -#endif
 -
  MODULE_AUTHOR("Pantelis Antoniou <panto@intracom.gr>");
  MODULE_DESCRIPTION("Freescale Ethernet Driver");
  MODULE_LICENSE("GPL");
@@@ -729,7 -738,7 +730,7 @@@ static void generic_adjust_link(struc
                if (!fep->oldlink) {
                        new_state = 1;
                        fep->oldlink = 1;
-                       netif_schedule(dev);
+                       netif_tx_schedule_all(dev);
                        netif_carrier_on(dev);
                        netif_start_queue(dev);
                }
@@@ -949,6 -958,190 +950,6 @@@ static int fs_ioctl(struct net_device *
  extern int fs_mii_connect(struct net_device *dev);
  extern void fs_mii_disconnect(struct net_device *dev);
  
 -#ifndef CONFIG_PPC_CPM_NEW_BINDING
 -static struct net_device *fs_init_instance(struct device *dev,
 -              struct fs_platform_info *fpi)
 -{
 -      struct net_device *ndev = NULL;
 -      struct fs_enet_private *fep = NULL;
 -      int privsize, i, r, err = 0, registered = 0;
 -
 -      fpi->fs_no = fs_get_id(fpi);
 -      /* guard */
 -      if ((unsigned int)fpi->fs_no >= FS_MAX_INDEX)
 -              return ERR_PTR(-EINVAL);
 -
 -      privsize = sizeof(*fep) + (sizeof(struct sk_buff **) *
 -                          (fpi->rx_ring + fpi->tx_ring));
 -
 -      ndev = alloc_etherdev(privsize);
 -      if (!ndev) {
 -              err = -ENOMEM;
 -              goto err;
 -      }
 -
 -      fep = netdev_priv(ndev);
 -
 -      fep->dev = dev;
 -      dev_set_drvdata(dev, ndev);
 -      fep->fpi = fpi;
 -      if (fpi->init_ioports)
 -              fpi->init_ioports((struct fs_platform_info *)fpi);
 -
 -#ifdef CONFIG_FS_ENET_HAS_FEC
 -      if (fs_get_fec_index(fpi->fs_no) >= 0)
 -              fep->ops = &fs_fec_ops;
 -#endif
 -
 -#ifdef CONFIG_FS_ENET_HAS_SCC
 -      if (fs_get_scc_index(fpi->fs_no) >=0)
 -              fep->ops = &fs_scc_ops;
 -#endif
 -
 -#ifdef CONFIG_FS_ENET_HAS_FCC
 -      if (fs_get_fcc_index(fpi->fs_no) >= 0)
 -              fep->ops = &fs_fcc_ops;
 -#endif
 -
 -      if (fep->ops == NULL) {
 -              printk(KERN_ERR DRV_MODULE_NAME
 -                     ": %s No matching ops found (%d).\n",
 -                     ndev->name, fpi->fs_no);
 -              err = -EINVAL;
 -              goto err;
 -      }
 -
 -      r = (*fep->ops->setup_data)(ndev);
 -      if (r != 0) {
 -              printk(KERN_ERR DRV_MODULE_NAME
 -                     ": %s setup_data failed\n",
 -                      ndev->name);
 -              err = r;
 -              goto err;
 -      }
 -
 -      /* point rx_skbuff, tx_skbuff */
 -      fep->rx_skbuff = (struct sk_buff **)&fep[1];
 -      fep->tx_skbuff = fep->rx_skbuff + fpi->rx_ring;
 -
 -      /* init locks */
 -      spin_lock_init(&fep->lock);
 -      spin_lock_init(&fep->tx_lock);
 -
 -      /*
 -       * Set the Ethernet address.
 -       */
 -      for (i = 0; i < 6; i++)
 -              ndev->dev_addr[i] = fpi->macaddr[i];
 -
 -      r = (*fep->ops->allocate_bd)(ndev);
 -
 -      if (fep->ring_base == NULL) {
 -              printk(KERN_ERR DRV_MODULE_NAME
 -                     ": %s buffer descriptor alloc failed (%d).\n", ndev->name, r);
 -              err = r;
 -              goto err;
 -      }
 -
 -      /*
 -       * Set receive and transmit descriptor base.
 -       */
 -      fep->rx_bd_base = fep->ring_base;
 -      fep->tx_bd_base = fep->rx_bd_base + fpi->rx_ring;
 -
 -      /* initialize ring size variables */
 -      fep->tx_ring = fpi->tx_ring;
 -      fep->rx_ring = fpi->rx_ring;
 -
 -      /*
 -       * The FEC Ethernet specific entries in the device structure.
 -       */
 -      ndev->open = fs_enet_open;
 -      ndev->hard_start_xmit = fs_enet_start_xmit;
 -      ndev->tx_timeout = fs_timeout;
 -      ndev->watchdog_timeo = 2 * HZ;
 -      ndev->stop = fs_enet_close;
 -      ndev->get_stats = fs_enet_get_stats;
 -      ndev->set_multicast_list = fs_set_multicast_list;
 -
 -#ifdef CONFIG_NET_POLL_CONTROLLER
 -      ndev->poll_controller = fs_enet_netpoll;
 -#endif
 -
 -      netif_napi_add(ndev, &fep->napi,
 -                     fs_enet_rx_napi, fpi->napi_weight);
 -
 -      ndev->ethtool_ops = &fs_ethtool_ops;
 -      ndev->do_ioctl = fs_ioctl;
 -
 -      init_timer(&fep->phy_timer_list);
 -
 -      netif_carrier_off(ndev);
 -
 -      err = register_netdev(ndev);
 -      if (err != 0) {
 -              printk(KERN_ERR DRV_MODULE_NAME
 -                     ": %s register_netdev failed.\n", ndev->name);
 -              goto err;
 -      }
 -      registered = 1;
 -
 -
 -      return ndev;
 -
 -err:
 -      if (ndev != NULL) {
 -              if (registered)
 -                      unregister_netdev(ndev);
 -
 -              if (fep && fep->ops) {
 -                      (*fep->ops->free_bd)(ndev);
 -                      (*fep->ops->cleanup_data)(ndev);
 -              }
 -
 -              free_netdev(ndev);
 -      }
 -
 -      dev_set_drvdata(dev, NULL);
 -
 -      return ERR_PTR(err);
 -}
 -
 -static int fs_cleanup_instance(struct net_device *ndev)
 -{
 -      struct fs_enet_private *fep;
 -      const struct fs_platform_info *fpi;
 -      struct device *dev;
 -
 -      if (ndev == NULL)
 -              return -EINVAL;
 -
 -      fep = netdev_priv(ndev);
 -      if (fep == NULL)
 -              return -EINVAL;
 -
 -      fpi = fep->fpi;
 -
 -      unregister_netdev(ndev);
 -
 -      dma_free_coherent(fep->dev, (fpi->tx_ring + fpi->rx_ring) * sizeof(cbd_t),
 -                        (void __force *)fep->ring_base, fep->ring_mem_addr);
 -
 -      /* reset it */
 -      (*fep->ops->cleanup_data)(ndev);
 -
 -      dev = fep->dev;
 -      if (dev != NULL) {
 -              dev_set_drvdata(dev, NULL);
 -              fep->dev = NULL;
 -      }
 -
 -      free_netdev(ndev);
 -
 -      return 0;
 -}
 -#endif
 -
  /**************************************************************************************/
  
  /* handy pointer to the immap */
@@@ -975,12 -1168,12 +976,11 @@@ static void cleanup_immap(void
  
  /**************************************************************************************/
  
 -#ifdef CONFIG_PPC_CPM_NEW_BINDING
  static int __devinit find_phy(struct device_node *np,
                                struct fs_platform_info *fpi)
  {
        struct device_node *phynode, *mdionode;
-       struct resource res;
-       int ret = 0, len;
+       int ret = 0, len, bus_id;
        const u32 *data;
  
        data  = of_get_property(np, "fixed-link", NULL);
        if (!phynode)
                return -EINVAL;
  
-       mdionode = of_get_parent(phynode);
-       if (!mdionode)
+       data = of_get_property(phynode, "reg", &len);
+       if (!data || len != 4) {
+               ret = -EINVAL;
                goto out_put_phy;
+       }
  
-       ret = of_address_to_resource(mdionode, 0, &res);
-       if (ret)
-               goto out_put_mdio;
+       mdionode = of_get_parent(phynode);
+       if (!mdionode) {
+               ret = -EINVAL;
+               goto out_put_phy;
+       }
  
-       data = of_get_property(phynode, "reg", &len);
-       if (!data || len != 4)
-               goto out_put_mdio;
+       bus_id = of_get_gpio(mdionode, 0);
+       if (bus_id < 0) {
+               struct resource res;
+               ret = of_address_to_resource(mdionode, 0, &res);
+               if (ret)
+                       goto out_put_mdio;
+               bus_id = res.start;
+       }
  
-       snprintf(fpi->bus_id, 16, "%x:%02x", res.start, *data);
+       snprintf(fpi->bus_id, 16, "%x:%02x", bus_id, *data);
  
  out_put_mdio:
        of_node_put(mdionode);
@@@ -1206,6 -1408,121 +1215,6 @@@ static void __exit fs_cleanup(void
        of_unregister_platform_driver(&fs_enet_driver);
        cleanup_immap();
  }
 -#else
 -static int __devinit fs_enet_probe(struct device *dev)
 -{
 -      struct net_device *ndev;
 -
 -      /* no fixup - no device */
 -      if (dev->platform_data == NULL) {
 -              printk(KERN_INFO "fs_enet: "
 -                              "probe called with no platform data; "
 -                              "remove unused devices\n");
 -              return -ENODEV;
 -      }
 -
 -      ndev = fs_init_instance(dev, dev->platform_data);
 -      if (IS_ERR(ndev))
 -              return PTR_ERR(ndev);
 -      return 0;
 -}
 -
 -static int fs_enet_remove(struct device *dev)
 -{
 -      return fs_cleanup_instance(dev_get_drvdata(dev));
 -}
 -
 -static struct device_driver fs_enet_fec_driver = {
 -      .name           = "fsl-cpm-fec",
 -      .bus            = &platform_bus_type,
 -      .probe          = fs_enet_probe,
 -      .remove         = fs_enet_remove,
 -#ifdef CONFIG_PM
 -/*    .suspend        = fs_enet_suspend,      TODO */
 -/*    .resume         = fs_enet_resume,       TODO */
 -#endif
 -};
 -
 -static struct device_driver fs_enet_scc_driver = {
 -      .name           = "fsl-cpm-scc",
 -      .bus            = &platform_bus_type,
 -      .probe          = fs_enet_probe,
 -      .remove         = fs_enet_remove,
 -#ifdef CONFIG_PM
 -/*    .suspend        = fs_enet_suspend,      TODO */
 -/*    .resume         = fs_enet_resume,       TODO */
 -#endif
 -};
 -
 -static struct device_driver fs_enet_fcc_driver = {
 -      .name           = "fsl-cpm-fcc",
 -      .bus            = &platform_bus_type,
 -      .probe          = fs_enet_probe,
 -      .remove         = fs_enet_remove,
 -#ifdef CONFIG_PM
 -/*    .suspend        = fs_enet_suspend,      TODO */
 -/*    .resume         = fs_enet_resume,       TODO */
 -#endif
 -};
 -
 -static int __init fs_init(void)
 -{
 -      int r;
 -
 -      printk(KERN_INFO
 -                      "%s", version);
 -
 -      r = setup_immap();
 -      if (r != 0)
 -              return r;
 -
 -#ifdef CONFIG_FS_ENET_HAS_FCC
 -      /* let's insert mii stuff */
 -      r = fs_enet_mdio_bb_init();
 -
 -      if (r != 0) {
 -              printk(KERN_ERR DRV_MODULE_NAME
 -                      "BB PHY init failed.\n");
 -              return r;
 -      }
 -      r = driver_register(&fs_enet_fcc_driver);
 -      if (r != 0)
 -              goto err;
 -#endif
 -
 -#ifdef CONFIG_FS_ENET_HAS_FEC
 -      r =  fs_enet_mdio_fec_init();
 -      if (r != 0) {
 -              printk(KERN_ERR DRV_MODULE_NAME
 -                      "FEC PHY init failed.\n");
 -              return r;
 -      }
 -
 -      r = driver_register(&fs_enet_fec_driver);
 -      if (r != 0)
 -              goto err;
 -#endif
 -
 -#ifdef CONFIG_FS_ENET_HAS_SCC
 -      r = driver_register(&fs_enet_scc_driver);
 -      if (r != 0)
 -              goto err;
 -#endif
 -
 -      return 0;
 -err:
 -      cleanup_immap();
 -      return r;
 -}
 -
 -static void __exit fs_cleanup(void)
 -{
 -      driver_unregister(&fs_enet_fec_driver);
 -      driver_unregister(&fs_enet_fcc_driver);
 -      driver_unregister(&fs_enet_scc_driver);
 -      cleanup_immap();
 -}
 -#endif
  
  #ifdef CONFIG_NET_POLL_CONTROLLER
  static void fs_enet_netpoll(struct net_device *dev)
diff --combined drivers/net/gianfar.c
@@@ -44,8 -44,7 +44,7 @@@
   *  happen immediately, but will wait until either a set number
   *  of frames or amount of time have passed).  In NAPI, the
   *  interrupt handler will signal there is work to be done, and
-  *  exit.  Without NAPI, the packet(s) will be handled
-  *  immediately.  Both methods will start at the last known empty
+  *  exit. This method will start at the last known empty
   *  descriptor, and process every subsequent descriptor until there
   *  are none left with data (NAPI will stop after a set number of
   *  packets to give time to other tasks, but will eventually
  #undef BRIEF_GFAR_ERRORS
  #undef VERBOSE_GFAR_ERRORS
  
- #ifdef CONFIG_GFAR_NAPI
- #define RECEIVE(x) netif_receive_skb(x)
- #else
- #define RECEIVE(x) netif_rx(x)
- #endif
  const char gfar_driver_name[] = "Gianfar Ethernet";
  const char gfar_driver_version[] = "1.3";
  
@@@ -131,9 -124,7 +124,7 @@@ static void free_skb_resources(struct g
  static void gfar_set_multi(struct net_device *dev);
  static void gfar_set_hash_for_addr(struct net_device *dev, u8 *addr);
  static void gfar_configure_serdes(struct net_device *dev);
- #ifdef CONFIG_GFAR_NAPI
  static int gfar_poll(struct napi_struct *napi, int budget);
- #endif
  #ifdef CONFIG_NET_POLL_CONTROLLER
  static void gfar_netpoll(struct net_device *dev);
  #endif
@@@ -143,9 -134,6 +134,9 @@@ static int gfar_process_frame(struct ne
  static void gfar_vlan_rx_register(struct net_device *netdev,
                                struct vlan_group *grp);
  void gfar_halt(struct net_device *dev);
 +#ifdef CONFIG_PM
 +static void gfar_halt_nodisable(struct net_device *dev);
 +#endif
  void gfar_start(struct net_device *dev);
  static void gfar_clear_exact_match(struct net_device *dev);
  static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr);
@@@ -219,7 -207,6 +210,7 @@@ static int gfar_probe(struct platform_d
  
        spin_lock_init(&priv->txlock);
        spin_lock_init(&priv->rxlock);
 +      spin_lock_init(&priv->bflock);
  
        platform_set_drvdata(pdev, dev);
  
        dev->hard_start_xmit = gfar_start_xmit;
        dev->tx_timeout = gfar_timeout;
        dev->watchdog_timeo = TX_TIMEOUT;
- #ifdef CONFIG_GFAR_NAPI
        netif_napi_add(dev, &priv->napi, gfar_poll, GFAR_DEV_WEIGHT);
- #endif
  #ifdef CONFIG_NET_POLL_CONTROLLER
        dev->poll_controller = gfar_netpoll;
  #endif
  
        /* Even more device info helps when determining which kernel */
        /* provided which set of benchmarks. */
- #ifdef CONFIG_GFAR_NAPI
        printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name);
- #else
-       printk(KERN_INFO "%s: Running with NAPI disabled\n", dev->name);
- #endif
        printk(KERN_INFO "%s: %d/%d RX/TX BD ring size\n",
               dev->name, priv->rx_ring_size, priv->tx_ring_size);
  
@@@ -397,103 -378,6 +382,103 @@@ static int gfar_remove(struct platform_
        return 0;
  }
  
 +#ifdef CONFIG_PM
 +static int gfar_suspend(struct platform_device *pdev, pm_message_t state)
 +{
 +      struct net_device *dev = platform_get_drvdata(pdev);
 +      struct gfar_private *priv = netdev_priv(dev);
 +      unsigned long flags;
 +      u32 tempval;
 +
 +      int magic_packet = priv->wol_en &&
 +              (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
 +
 +      netif_device_detach(dev);
 +
 +      if (netif_running(dev)) {
 +              spin_lock_irqsave(&priv->txlock, flags);
 +              spin_lock(&priv->rxlock);
 +
 +              gfar_halt_nodisable(dev);
 +
 +              /* Disable Tx, and Rx if wake-on-LAN is disabled. */
 +              tempval = gfar_read(&priv->regs->maccfg1);
 +
 +              tempval &= ~MACCFG1_TX_EN;
 +
 +              if (!magic_packet)
 +                      tempval &= ~MACCFG1_RX_EN;
 +
 +              gfar_write(&priv->regs->maccfg1, tempval);
 +
 +              spin_unlock(&priv->rxlock);
 +              spin_unlock_irqrestore(&priv->txlock, flags);
 +
 +#ifdef CONFIG_GFAR_NAPI
 +              napi_disable(&priv->napi);
 +#endif
 +
 +              if (magic_packet) {
 +                      /* Enable interrupt on Magic Packet */
 +                      gfar_write(&priv->regs->imask, IMASK_MAG);
 +
 +                      /* Enable Magic Packet mode */
 +                      tempval = gfar_read(&priv->regs->maccfg2);
 +                      tempval |= MACCFG2_MPEN;
 +                      gfar_write(&priv->regs->maccfg2, tempval);
 +              } else {
 +                      phy_stop(priv->phydev);
 +              }
 +      }
 +
 +      return 0;
 +}
 +
 +static int gfar_resume(struct platform_device *pdev)
 +{
 +      struct net_device *dev = platform_get_drvdata(pdev);
 +      struct gfar_private *priv = netdev_priv(dev);
 +      unsigned long flags;
 +      u32 tempval;
 +      int magic_packet = priv->wol_en &&
 +              (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
 +
 +      if (!netif_running(dev)) {
 +              netif_device_attach(dev);
 +              return 0;
 +      }
 +
 +      if (!magic_packet && priv->phydev)
 +              phy_start(priv->phydev);
 +
 +      /* Disable Magic Packet mode, in case something
 +       * else woke us up.
 +       */
 +
 +      spin_lock_irqsave(&priv->txlock, flags);
 +      spin_lock(&priv->rxlock);
 +
 +      tempval = gfar_read(&priv->regs->maccfg2);
 +      tempval &= ~MACCFG2_MPEN;
 +      gfar_write(&priv->regs->maccfg2, tempval);
 +
 +      gfar_start(dev);
 +
 +      spin_unlock(&priv->rxlock);
 +      spin_unlock_irqrestore(&priv->txlock, flags);
 +
 +      netif_device_attach(dev);
 +
 +#ifdef CONFIG_GFAR_NAPI
 +      napi_enable(&priv->napi);
 +#endif
 +
 +      return 0;
 +}
 +#else
 +#define gfar_suspend NULL
 +#define gfar_resume NULL
 +#endif
  
  /* Reads the controller's registers to determine what interface
   * connects it to the PHY.
@@@ -650,9 -534,8 +635,9 @@@ static void init_registers(struct net_d
  }
  
  
 +#ifdef CONFIG_PM
  /* Halt the receive and transmit queues */
 -void gfar_halt(struct net_device *dev)
 +static void gfar_halt_nodisable(struct net_device *dev)
  {
        struct gfar_private *priv = netdev_priv(dev);
        struct gfar __iomem *regs = priv->regs;
                         (IEVENT_GRSC | IEVENT_GTSC)))
                        cpu_relax();
        }
 +}
 +#endif
 +
 +/* Halt the receive and transmit queues */
 +void gfar_halt(struct net_device *dev)
 +{
 +      struct gfar_private *priv = netdev_priv(dev);
 +      struct gfar __iomem *regs = priv->regs;
 +      u32 tempval;
  
        /* Disable Rx and Tx */
        tempval = gfar_read(&regs->maccfg1);
@@@ -1039,7 -913,7 +1024,7 @@@ rx_irq_fail
  tx_irq_fail:
        free_irq(priv->interruptError, dev);
  err_irq_fail:
- err_rxalloc_fail:     
+ err_rxalloc_fail:
  rx_skb_fail:
        free_skb_resources(priv);
  tx_skb_fail:
  /* Returns 0 for success. */
  static int gfar_enet_open(struct net_device *dev)
  {
- #ifdef CONFIG_GFAR_NAPI
        struct gfar_private *priv = netdev_priv(dev);
- #endif
        int err;
  
- #ifdef CONFIG_GFAR_NAPI
        napi_enable(&priv->napi);
- #endif
  
        /* Initialize a bunch of registers */
        init_registers(dev);
        err = init_phy(dev);
  
        if(err) {
- #ifdef CONFIG_GFAR_NAPI
                napi_disable(&priv->napi);
- #endif
                return err;
        }
  
        err = startup_gfar(dev);
        if (err) {
- #ifdef CONFIG_GFAR_NAPI
                napi_disable(&priv->napi);
- #endif
                return err;
        }
  
@@@ -1239,9 -1105,7 +1216,7 @@@ static int gfar_close(struct net_devic
  {
        struct gfar_private *priv = netdev_priv(dev);
  
- #ifdef CONFIG_GFAR_NAPI
        napi_disable(&priv->napi);
- #endif
  
        stop_gfar(dev);
  
@@@ -1370,7 -1234,7 +1345,7 @@@ static void gfar_timeout(struct net_dev
                startup_gfar(dev);
        }
  
-       netif_schedule(dev);
+       netif_tx_schedule_all(dev);
  }
  
  /* Interrupt Handler for Transmit complete */
@@@ -1538,14 -1402,9 +1513,9 @@@ irqreturn_t gfar_receive(int irq, void 
  {
        struct net_device *dev = (struct net_device *) dev_id;
        struct gfar_private *priv = netdev_priv(dev);
- #ifdef CONFIG_GFAR_NAPI
        u32 tempval;
- #else
-       unsigned long flags;
- #endif
  
        /* support NAPI */
- #ifdef CONFIG_GFAR_NAPI
        /* Clear IEVENT, so interrupts aren't called again
         * because of the packets that have already arrived */
        gfar_write(&priv->regs->ievent, IEVENT_RTX_MASK);
                                dev->name, gfar_read(&priv->regs->ievent),
                                gfar_read(&priv->regs->imask));
        }
- #else
-       /* Clear IEVENT, so rx interrupt isn't called again
-        * because of this interrupt */
-       gfar_write(&priv->regs->ievent, IEVENT_RX_MASK);
-       spin_lock_irqsave(&priv->rxlock, flags);
-       gfar_clean_rx_ring(dev, priv->rx_ring_size);
-       /* If we are coalescing interrupts, update the timer */
-       /* Otherwise, clear it */
-       if (likely(priv->rxcoalescing)) {
-               gfar_write(&priv->regs->rxic, 0);
-               gfar_write(&priv->regs->rxic,
-                          mk_ic_value(priv->rxcount, priv->rxtime));
-       }
-       spin_unlock_irqrestore(&priv->rxlock, flags);
- #endif
  
        return IRQ_HANDLED;
  }
  
- static inline int gfar_rx_vlan(struct sk_buff *skb,
-               struct vlan_group *vlgrp, unsigned short vlctl)
- {
- #ifdef CONFIG_GFAR_NAPI
-       return vlan_hwaccel_receive_skb(skb, vlgrp, vlctl);
- #else
-       return vlan_hwaccel_rx(skb, vlgrp, vlctl);
- #endif
- }
  static inline void gfar_rx_checksum(struct sk_buff *skb, struct rxfcb *fcb)
  {
        /* If valid headers were found, and valid sums
@@@ -1650,10 -1481,11 +1592,11 @@@ static int gfar_process_frame(struct ne
                skb->protocol = eth_type_trans(skb, dev);
  
                /* Send the packet up the stack */
-               if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN)))
-                       ret = gfar_rx_vlan(skb, priv->vlgrp, fcb->vlctl);
-               else
-                       ret = RECEIVE(skb);
+               if (unlikely(priv->vlgrp && (fcb->flags & RXFCB_VLN))) {
+                       ret = vlan_hwaccel_receive_skb(skb, priv->vlgrp,
+                                                      fcb->vlctl);
+               } else
+                       ret = netif_receive_skb(skb);
  
                if (NET_RX_DROP == ret)
                        priv->extra_stats.kernel_dropped++;
@@@ -1740,7 -1572,6 +1683,6 @@@ int gfar_clean_rx_ring(struct net_devic
        return howmany;
  }
  
- #ifdef CONFIG_GFAR_NAPI
  static int gfar_poll(struct napi_struct *napi, int budget)
  {
        struct gfar_private *priv = container_of(napi, struct gfar_private, napi);
  
        return howmany;
  }
- #endif
  
  #ifdef CONFIG_NET_POLL_CONTROLLER
  /*
@@@ -1895,7 -1725,6 +1836,6 @@@ static void adjust_link(struct net_devi
                if (!priv->oldlink) {
                        new_state = 1;
                        priv->oldlink = 1;
-                       netif_schedule(dev);
                }
        } else if (priv->oldlink) {
                new_state = 1;
@@@ -2080,12 -1909,7 +2020,12 @@@ static irqreturn_t gfar_error(int irq, 
        u32 events = gfar_read(&priv->regs->ievent);
  
        /* Clear IEVENT */
 -      gfar_write(&priv->regs->ievent, IEVENT_ERR_MASK);
 +      gfar_write(&priv->regs->ievent, events & IEVENT_ERR_MASK);
 +
 +      /* Magic Packet is not an error. */
 +      if ((priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET) &&
 +          (events & IEVENT_MAG))
 +              events &= ~IEVENT_MAG;
  
        /* Hmm... */
        if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv))
  
                gfar_receive(irq, dev_id);
  
- #ifndef CONFIG_GFAR_NAPI
-               /* Clear the halt bit in RSTAT */
-               gfar_write(&priv->regs->rstat, RSTAT_CLEAR_RHALT);
- #endif
                if (netif_msg_rx_err(priv))
                        printk(KERN_DEBUG "%s: busy error (rstat: %x)\n",
                               dev->name, gfar_read(&priv->regs->rstat));
@@@ -2158,8 -1977,6 +2093,8 @@@ MODULE_ALIAS("platform:fsl-gianfar")
  static struct platform_driver gfar_driver = {
        .probe = gfar_probe,
        .remove = gfar_remove,
 +      .suspend = gfar_suspend,
 +      .resume = gfar_resume,
        .driver = {
                .name = "fsl-gianfar",
                .owner = THIS_MODULE,
diff --combined drivers/net/gianfar.h
@@@ -77,13 -77,8 +77,8 @@@ extern const char gfar_driver_name[]
  extern const char gfar_driver_version[];
  
  /* These need to be powers of 2 for this driver */
- #ifdef CONFIG_GFAR_NAPI
  #define DEFAULT_TX_RING_SIZE  256
  #define DEFAULT_RX_RING_SIZE  256
- #else
- #define DEFAULT_TX_RING_SIZE    64
- #define DEFAULT_RX_RING_SIZE    64
- #endif
  
  #define GFAR_RX_MAX_RING_SIZE   256
  #define GFAR_TX_MAX_RING_SIZE   256
  
  #define DEFAULT_RXTIME        21
  
- /* Non NAPI Case */
- #ifndef CONFIG_GFAR_NAPI
- #define DEFAULT_RX_COALESCE 1
- #define DEFAULT_RXCOUNT       16
- #else
  #define DEFAULT_RX_COALESCE 0
  #define DEFAULT_RXCOUNT       0
- #endif /* CONFIG_GFAR_NAPI */
  
  #define MIIMCFG_INIT_VALUE    0x00000007
  #define MIIMCFG_RESET           0x80000000
  #define MACCFG2_GMII            0x00000200
  #define MACCFG2_HUGEFRAME     0x00000020
  #define MACCFG2_LENGTHCHECK   0x00000010
 +#define MACCFG2_MPEN          0x00000008
  
  #define ECNTRL_INIT_SETTINGS  0x00001000
  #define ECNTRL_TBI_MODE         0x00000020
  #define IEVENT_CRL            0x00020000
  #define IEVENT_XFUN           0x00010000
  #define IEVENT_RXB0           0x00008000
 +#define IEVENT_MAG            0x00000800
  #define IEVENT_GRSC           0x00000100
  #define IEVENT_RXF0           0x00000080
  #define IEVENT_FIR            0x00000008
  #define IEVENT_ERR_MASK         \
  (IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \
   IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \
 - | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR)
 + | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \
 + | IEVENT_MAG)
  
  #define IMASK_INIT_CLEAR      0x00000000
  #define IMASK_BABR              0x80000000
  #define IMASK_CRL             0x00020000
  #define IMASK_XFUN            0x00010000
  #define IMASK_RXB0              0x00008000
 +#define IMASK_MAG             0x00000800
  #define IMASK_GTSC              0x00000100
  #define IMASK_RXFEN0          0x00000080
  #define IMASK_FIR             0x00000008
@@@ -741,14 -726,10 +730,14 @@@ struct gfar_private 
        unsigned int fifo_starve;
        unsigned int fifo_starve_off;
  
 +      /* Bitfield update lock */
 +      spinlock_t bflock;
 +
        unsigned char vlan_enable:1,
                rx_csum_enable:1,
                extended_hash:1,
 -              bd_stash_en:1;
 +              bd_stash_en:1,
 +              wol_en:1; /* Wake-on-LAN enabled */
        unsigned short padding;
  
        unsigned int interruptTransmit;