gianfar: Remove legacy PM callbacks
[safe/jmp/linux-2.6] / drivers / net / ixp2000 / enp2611.c
index 2542e3b..34a6cfd 100644 (file)
@@ -9,14 +9,13 @@
  * (at your option) any later version.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/moduleparam.h>
-#include <asm/arch/uengine.h>
+#include <asm/hardware/uengine.h>
 #include <asm/mach-types.h>
 #include <asm/io.h>
 #include "ixpdev.h"
@@ -120,24 +119,9 @@ static struct ixp2400_msf_parameters enp2611_msf_parameters =
        }
 };
 
-struct enp2611_ixpdev_priv
-{
-       struct ixpdev_priv              ixpdev_priv;
-       struct net_device_stats         stats;
-};
-
 static struct net_device *nds[3];
 static struct timer_list link_check_timer;
 
-static struct net_device_stats *enp2611_get_stats(struct net_device *dev)
-{
-       struct enp2611_ixpdev_priv *ip = netdev_priv(dev);
-
-       pm3386_get_stats(ip->ixpdev_priv.channel, &(ip->stats));
-
-       return &(ip->stats);
-}
-
 /* @@@ Poll the SFP moddef0 line too.  */
 /* @@@ Try to use the pm3386 DOOL interrupt as well.  */
 static void enp2611_check_link_status(unsigned long __dummy)
@@ -149,6 +133,8 @@ static void enp2611_check_link_status(unsigned long __dummy)
                int status;
 
                dev = nds[i];
+               if (dev == NULL)
+                       continue;
 
                status = pm3386_is_link_up(i);
                if (status && !netif_carrier_ok(dev)) {
@@ -175,10 +161,15 @@ static void enp2611_set_port_admin_status(int port, int up)
 {
        if (up) {
                caleb_enable_rx(port);
+
+               pm3386_set_carrier(port, 1);
                pm3386_enable_rx(port);
        } else {
                caleb_disable_tx(port);
                pm3386_disable_tx(port);
+               /* @@@ Flush out pending packets.  */
+               pm3386_set_carrier(port, 0);
+
                pm3386_disable_rx(port);
                caleb_disable_rx(port);
        }
@@ -186,6 +177,7 @@ static void enp2611_set_port_admin_status(int port, int up)
 
 static int __init enp2611_init_module(void)
 { 
+       int ports;
        int i;
 
        if (!machine_is_enp2611())
@@ -194,25 +186,25 @@ static int __init enp2611_init_module(void)
        caleb_reset();
        pm3386_reset();
 
-       for (i = 0; i < 3; i++) {
-               nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv));
+       ports = pm3386_port_count();
+       for (i = 0; i < ports; i++) {
+               nds[i] = ixpdev_alloc(i, sizeof(struct ixpdev_priv));
                if (nds[i] == NULL) {
                        while (--i >= 0)
                                free_netdev(nds[i]);
                        return -ENOMEM;
                }
 
-               SET_MODULE_OWNER(nds[i]);
-               nds[i]->get_stats = enp2611_get_stats;
                pm3386_init_port(i);
                pm3386_get_mac(i, nds[i]->dev_addr);
        }
 
        ixp2400_msf_init(&enp2611_msf_parameters);
 
-       if (ixpdev_init(3, nds, enp2611_set_port_admin_status)) {
-               for (i = 0; i < 3; i++)
-                       free_netdev(nds[i]);
+       if (ixpdev_init(ports, nds, enp2611_set_port_admin_status)) {
+               for (i = 0; i < ports; i++)
+                       if (nds[i])
+                               free_netdev(nds[i]);
                return -EINVAL;
        }