]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/forcedeth.c
p54pci: update receive dma buffers before and after processing
[karo-tx-linux.git] / drivers / net / forcedeth.c
index c3a9783b7c4611bd7fd7f54a1ff201a76ee13790..af09296ef0ddc974d2bb60d0c66d7cd8b75fa4cd 100644 (file)
@@ -1136,22 +1136,14 @@ static int mii_rw(struct net_device *dev, int addr, int miireg, int value)
 
        if (reg_delay(dev, NvRegMIIControl, NVREG_MIICTL_INUSE, 0,
                        NV_MIIPHY_DELAY, NV_MIIPHY_DELAYMAX)) {
-               netdev_dbg(dev, "mii_rw of reg %d at PHY %d timed out\n",
-                          miireg, addr);
                retval = -1;
        } else if (value != MII_READ) {
                /* it was a write operation - fewer failures are detectable */
-               netdev_dbg(dev, "mii_rw wrote 0x%x to reg %d at PHY %d\n",
-                          value, miireg, addr);
                retval = 0;
        } else if (readl(base + NvRegMIIStatus) & NVREG_MIISTAT_ERROR) {
-               netdev_dbg(dev, "mii_rw of reg %d at PHY %d failed\n",
-                          miireg, addr);
                retval = -1;
        } else {
                retval = readl(base + NvRegMIIData);
-               netdev_dbg(dev, "mii_rw read from reg %d at PHY %d: 0x%x\n",
-                          miireg, addr, retval);
        }
 
        return retval;
@@ -1181,11 +1173,196 @@ static int phy_reset(struct net_device *dev, u32 bmcr_setup)
        return 0;
 }
 
+static int init_realtek_8211b(struct net_device *dev, struct fe_priv *np)
+{
+       static const struct {
+               int reg;
+               int init;
+       } ri[] = {
+               { PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1 },
+               { PHY_REALTEK_INIT_REG2, PHY_REALTEK_INIT2 },
+               { PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT3 },
+               { PHY_REALTEK_INIT_REG3, PHY_REALTEK_INIT4 },
+               { PHY_REALTEK_INIT_REG4, PHY_REALTEK_INIT5 },
+               { PHY_REALTEK_INIT_REG5, PHY_REALTEK_INIT6 },
+               { PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1 },
+       };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ri); i++) {
+               if (mii_rw(dev, np->phyaddr, ri[i].reg, ri[i].init))
+                       return PHY_ERROR;
+       }
+
+       return 0;
+}
+
+static int init_realtek_8211c(struct net_device *dev, struct fe_priv *np)
+{
+       u32 reg;
+       u8 __iomem *base = get_hwbase(dev);
+       u32 powerstate = readl(base + NvRegPowerState2);
+
+       /* need to perform hw phy reset */
+       powerstate |= NVREG_POWERSTATE2_PHY_RESET;
+       writel(powerstate, base + NvRegPowerState2);
+       msleep(25);
+
+       powerstate &= ~NVREG_POWERSTATE2_PHY_RESET;
+       writel(powerstate, base + NvRegPowerState2);
+       msleep(25);
+
+       reg = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, MII_READ);
+       reg |= PHY_REALTEK_INIT9;
+       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, reg))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT10))
+               return PHY_ERROR;
+       reg = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG7, MII_READ);
+       if (!(reg & PHY_REALTEK_INIT11)) {
+               reg |= PHY_REALTEK_INIT11;
+               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG7, reg))
+                       return PHY_ERROR;
+       }
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1))
+               return PHY_ERROR;
+
+       return 0;
+}
+
+static int init_realtek_8201(struct net_device *dev, struct fe_priv *np)
+{
+       u32 phy_reserved;
+
+       if (np->driver_data & DEV_NEED_PHY_INIT_FIX) {
+               phy_reserved = mii_rw(dev, np->phyaddr,
+                                     PHY_REALTEK_INIT_REG6, MII_READ);
+               phy_reserved |= PHY_REALTEK_INIT7;
+               if (mii_rw(dev, np->phyaddr,
+                          PHY_REALTEK_INIT_REG6, phy_reserved))
+                       return PHY_ERROR;
+       }
+
+       return 0;
+}
+
+static int init_realtek_8201_cross(struct net_device *dev, struct fe_priv *np)
+{
+       u32 phy_reserved;
+
+       if (phy_cross == NV_CROSSOVER_DETECTION_DISABLED) {
+               if (mii_rw(dev, np->phyaddr,
+                          PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT3))
+                       return PHY_ERROR;
+               phy_reserved = mii_rw(dev, np->phyaddr,
+                                     PHY_REALTEK_INIT_REG2, MII_READ);
+               phy_reserved &= ~PHY_REALTEK_INIT_MSK1;
+               phy_reserved |= PHY_REALTEK_INIT3;
+               if (mii_rw(dev, np->phyaddr,
+                          PHY_REALTEK_INIT_REG2, phy_reserved))
+                       return PHY_ERROR;
+               if (mii_rw(dev, np->phyaddr,
+                          PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1))
+                       return PHY_ERROR;
+       }
+
+       return 0;
+}
+
+static int init_cicada(struct net_device *dev, struct fe_priv *np,
+                      u32 phyinterface)
+{
+       u32 phy_reserved;
+
+       if (phyinterface & PHY_RGMII) {
+               phy_reserved = mii_rw(dev, np->phyaddr, MII_RESV1, MII_READ);
+               phy_reserved &= ~(PHY_CICADA_INIT1 | PHY_CICADA_INIT2);
+               phy_reserved |= (PHY_CICADA_INIT3 | PHY_CICADA_INIT4);
+               if (mii_rw(dev, np->phyaddr, MII_RESV1, phy_reserved))
+                       return PHY_ERROR;
+               phy_reserved = mii_rw(dev, np->phyaddr, MII_NCONFIG, MII_READ);
+               phy_reserved |= PHY_CICADA_INIT5;
+               if (mii_rw(dev, np->phyaddr, MII_NCONFIG, phy_reserved))
+                       return PHY_ERROR;
+       }
+       phy_reserved = mii_rw(dev, np->phyaddr, MII_SREVISION, MII_READ);
+       phy_reserved |= PHY_CICADA_INIT6;
+       if (mii_rw(dev, np->phyaddr, MII_SREVISION, phy_reserved))
+               return PHY_ERROR;
+
+       return 0;
+}
+
+static int init_vitesse(struct net_device *dev, struct fe_priv *np)
+{
+       u32 phy_reserved;
+
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG1, PHY_VITESSE_INIT1))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT2))
+               return PHY_ERROR;
+       phy_reserved = mii_rw(dev, np->phyaddr,
+                             PHY_VITESSE_INIT_REG4, MII_READ);
+       if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, phy_reserved))
+               return PHY_ERROR;
+       phy_reserved = mii_rw(dev, np->phyaddr,
+                             PHY_VITESSE_INIT_REG3, MII_READ);
+       phy_reserved &= ~PHY_VITESSE_INIT_MSK1;
+       phy_reserved |= PHY_VITESSE_INIT3;
+       if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, phy_reserved))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT4))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT5))
+               return PHY_ERROR;
+       phy_reserved = mii_rw(dev, np->phyaddr,
+                             PHY_VITESSE_INIT_REG4, MII_READ);
+       phy_reserved &= ~PHY_VITESSE_INIT_MSK1;
+       phy_reserved |= PHY_VITESSE_INIT3;
+       if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, phy_reserved))
+               return PHY_ERROR;
+       phy_reserved = mii_rw(dev, np->phyaddr,
+                             PHY_VITESSE_INIT_REG3, MII_READ);
+       if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, phy_reserved))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT6))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT7))
+               return PHY_ERROR;
+       phy_reserved = mii_rw(dev, np->phyaddr,
+                             PHY_VITESSE_INIT_REG4, MII_READ);
+       if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, phy_reserved))
+               return PHY_ERROR;
+       phy_reserved = mii_rw(dev, np->phyaddr,
+                             PHY_VITESSE_INIT_REG3, MII_READ);
+       phy_reserved &= ~PHY_VITESSE_INIT_MSK2;
+       phy_reserved |= PHY_VITESSE_INIT8;
+       if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, phy_reserved))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT9))
+               return PHY_ERROR;
+       if (mii_rw(dev, np->phyaddr,
+                  PHY_VITESSE_INIT_REG1, PHY_VITESSE_INIT10))
+               return PHY_ERROR;
+
+       return 0;
+}
+
 static int phy_init(struct net_device *dev)
 {
        struct fe_priv *np = get_nvpriv(dev);
        u8 __iomem *base = get_hwbase(dev);
-       u32 phyinterface, phy_reserved, mii_status, mii_control, mii_control_1000, reg;
+       u32 phyinterface;
+       u32 mii_status, mii_control, mii_control_1000, reg;
 
        /* phy errata for E3016 phy */
        if (np->phy_model == PHY_MODEL_MARVELL_E3016) {
@@ -1200,98 +1377,32 @@ static int phy_init(struct net_device *dev)
        if (np->phy_oui == PHY_OUI_REALTEK) {
                if (np->phy_model == PHY_MODEL_REALTEK_8211 &&
                    np->phy_rev == PHY_REV_REALTEK_8211B) {
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG2, PHY_REALTEK_INIT2)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT3)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG3, PHY_REALTEK_INIT4)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG4, PHY_REALTEK_INIT5)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG5, PHY_REALTEK_INIT6)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-               }
-               if (np->phy_model == PHY_MODEL_REALTEK_8211 &&
-                   np->phy_rev == PHY_REV_REALTEK_8211C) {
-                       u32 powerstate = readl(base + NvRegPowerState2);
-
-                       /* need to perform hw phy reset */
-                       powerstate |= NVREG_POWERSTATE2_PHY_RESET;
-                       writel(powerstate, base + NvRegPowerState2);
-                       msleep(25);
-
-                       powerstate &= ~NVREG_POWERSTATE2_PHY_RESET;
-                       writel(powerstate, base + NvRegPowerState2);
-                       msleep(25);
-
-                       reg = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, MII_READ);
-                       reg |= PHY_REALTEK_INIT9;
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, reg)) {
+                       if (init_realtek_8211b(dev, np)) {
                                netdev_info(dev, "%s: phy init failed\n",
                                            pci_name(np->pci_dev));
                                return PHY_ERROR;
                        }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT10)) {
+               } else if (np->phy_model == PHY_MODEL_REALTEK_8211 &&
+                          np->phy_rev == PHY_REV_REALTEK_8211C) {
+                       if (init_realtek_8211c(dev, np)) {
                                netdev_info(dev, "%s: phy init failed\n",
                                            pci_name(np->pci_dev));
                                return PHY_ERROR;
                        }
-                       reg = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG7, MII_READ);
-                       if (!(reg & PHY_REALTEK_INIT11)) {
-                               reg |= PHY_REALTEK_INIT11;
-                               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG7, reg)) {
-                                       netdev_info(dev, "%s: phy init failed\n",
-                                                   pci_name(np->pci_dev));
-                                       return PHY_ERROR;
-                               }
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
+               } else if (np->phy_model == PHY_MODEL_REALTEK_8201) {
+                       if (init_realtek_8201(dev, np)) {
                                netdev_info(dev, "%s: phy init failed\n",
                                            pci_name(np->pci_dev));
                                return PHY_ERROR;
                        }
                }
-               if (np->phy_model == PHY_MODEL_REALTEK_8201) {
-                       if (np->driver_data & DEV_NEED_PHY_INIT_FIX) {
-                               phy_reserved = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, MII_READ);
-                               phy_reserved |= PHY_REALTEK_INIT7;
-                               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, phy_reserved)) {
-                                       netdev_info(dev, "%s: phy init failed\n",
-                                                   pci_name(np->pci_dev));
-                                       return PHY_ERROR;
-                               }
-                       }
-               }
        }
 
        /* set advertise register */
        reg = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
-       reg |= (ADVERTISE_10HALF|ADVERTISE_10FULL|ADVERTISE_100HALF|ADVERTISE_100FULL|ADVERTISE_PAUSE_ASYM|ADVERTISE_PAUSE_CAP);
+       reg |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
+               ADVERTISE_100HALF | ADVERTISE_100FULL |
+               ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP);
        if (mii_rw(dev, np->phyaddr, MII_ADVERTISE, reg)) {
                netdev_info(dev, "%s: phy write to advertise failed\n",
                            pci_name(np->pci_dev));
@@ -1305,7 +1416,8 @@ static int phy_init(struct net_device *dev)
        mii_status = mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ);
        if (mii_status & PHY_GIGABIT) {
                np->gigabit = PHY_GIGABIT;
-               mii_control_1000 = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ);
+               mii_control_1000 = mii_rw(dev, np->phyaddr,
+                                         MII_CTRL1000, MII_READ);
                mii_control_1000 &= ~ADVERTISE_1000HALF;
                if (phyinterface & PHY_RGMII)
                        mii_control_1000 |= ADVERTISE_1000FULL;
@@ -1345,186 +1457,34 @@ static int phy_init(struct net_device *dev)
        }
 
        /* phy vendor specific configuration */
-       if ((np->phy_oui == PHY_OUI_CICADA) && (phyinterface & PHY_RGMII)) {
-               phy_reserved = mii_rw(dev, np->phyaddr, MII_RESV1, MII_READ);
-               phy_reserved &= ~(PHY_CICADA_INIT1 | PHY_CICADA_INIT2);
-               phy_reserved |= (PHY_CICADA_INIT3 | PHY_CICADA_INIT4);
-               if (mii_rw(dev, np->phyaddr, MII_RESV1, phy_reserved)) {
+       if ((np->phy_oui == PHY_OUI_CICADA)) {
+               if (init_cicada(dev, np, phyinterface)) {
                        netdev_info(dev, "%s: phy init failed\n",
                                    pci_name(np->pci_dev));
                        return PHY_ERROR;
                }
-               phy_reserved = mii_rw(dev, np->phyaddr, MII_NCONFIG, MII_READ);
-               phy_reserved |= PHY_CICADA_INIT5;
-               if (mii_rw(dev, np->phyaddr, MII_NCONFIG, phy_reserved)) {
+       } else if (np->phy_oui == PHY_OUI_VITESSE) {
+               if (init_vitesse(dev, np)) {
                        netdev_info(dev, "%s: phy init failed\n",
                                    pci_name(np->pci_dev));
                        return PHY_ERROR;
                }
-       }
-       if (np->phy_oui == PHY_OUI_CICADA) {
-               phy_reserved = mii_rw(dev, np->phyaddr, MII_SREVISION, MII_READ);
-               phy_reserved |= PHY_CICADA_INIT6;
-               if (mii_rw(dev, np->phyaddr, MII_SREVISION, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-       }
-       if (np->phy_oui == PHY_OUI_VITESSE) {
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG1, PHY_VITESSE_INIT1)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT2)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               phy_reserved = mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, MII_READ);
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               phy_reserved = mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, MII_READ);
-               phy_reserved &= ~PHY_VITESSE_INIT_MSK1;
-               phy_reserved |= PHY_VITESSE_INIT3;
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT4)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT5)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               phy_reserved = mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, MII_READ);
-               phy_reserved &= ~PHY_VITESSE_INIT_MSK1;
-               phy_reserved |= PHY_VITESSE_INIT3;
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               phy_reserved = mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, MII_READ);
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT6)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT7)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               phy_reserved = mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, MII_READ);
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG4, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               phy_reserved = mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, MII_READ);
-               phy_reserved &= ~PHY_VITESSE_INIT_MSK2;
-               phy_reserved |= PHY_VITESSE_INIT8;
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG3, phy_reserved)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG2, PHY_VITESSE_INIT9)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-               if (mii_rw(dev, np->phyaddr, PHY_VITESSE_INIT_REG1, PHY_VITESSE_INIT10)) {
-                       netdev_info(dev, "%s: phy init failed\n",
-                                   pci_name(np->pci_dev));
-                       return PHY_ERROR;
-               }
-       }
-       if (np->phy_oui == PHY_OUI_REALTEK) {
+       } else if (np->phy_oui == PHY_OUI_REALTEK) {
                if (np->phy_model == PHY_MODEL_REALTEK_8211 &&
                    np->phy_rev == PHY_REV_REALTEK_8211B) {
                        /* reset could have cleared these out, set them back */
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG2, PHY_REALTEK_INIT2)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT3)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG3, PHY_REALTEK_INIT4)) {
+                       if (init_realtek_8211b(dev, np)) {
                                netdev_info(dev, "%s: phy init failed\n",
                                            pci_name(np->pci_dev));
                                return PHY_ERROR;
                        }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG4, PHY_REALTEK_INIT5)) {
+               } else if (np->phy_model == PHY_MODEL_REALTEK_8201) {
+                       if (init_realtek_8201(dev, np) ||
+                           init_realtek_8201_cross(dev, np)) {
                                netdev_info(dev, "%s: phy init failed\n",
                                            pci_name(np->pci_dev));
                                return PHY_ERROR;
                        }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG5, PHY_REALTEK_INIT6)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-                       if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
-                               netdev_info(dev, "%s: phy init failed\n",
-                                           pci_name(np->pci_dev));
-                               return PHY_ERROR;
-                       }
-               }
-               if (np->phy_model == PHY_MODEL_REALTEK_8201) {
-                       if (np->driver_data & DEV_NEED_PHY_INIT_FIX) {
-                               phy_reserved = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, MII_READ);
-                               phy_reserved |= PHY_REALTEK_INIT7;
-                               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG6, phy_reserved)) {
-                                       netdev_info(dev, "%s: phy init failed\n",
-                                                   pci_name(np->pci_dev));
-                                       return PHY_ERROR;
-                               }
-                       }
-                       if (phy_cross == NV_CROSSOVER_DETECTION_DISABLED) {
-                               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT3)) {
-                                       netdev_info(dev, "%s: phy init failed\n",
-                                                   pci_name(np->pci_dev));
-                                       return PHY_ERROR;
-                               }
-                               phy_reserved = mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG2, MII_READ);
-                               phy_reserved &= ~PHY_REALTEK_INIT_MSK1;
-                               phy_reserved |= PHY_REALTEK_INIT3;
-                               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG2, phy_reserved)) {
-                                       netdev_info(dev, "%s: phy init failed\n",
-                                                   pci_name(np->pci_dev));
-                                       return PHY_ERROR;
-                               }
-                               if (mii_rw(dev, np->phyaddr, PHY_REALTEK_INIT_REG1, PHY_REALTEK_INIT1)) {
-                                       netdev_info(dev, "%s: phy init failed\n",
-                                                   pci_name(np->pci_dev));
-                                       return PHY_ERROR;
-                               }
-                       }
                }
        }
 
@@ -1548,7 +1508,6 @@ static void nv_start_rx(struct net_device *dev)
        u8 __iomem *base = get_hwbase(dev);
        u32 rx_ctrl = readl(base + NvRegReceiverControl);
 
-       netdev_dbg(dev, "%s\n", __func__);
        /* Already running? Stop it. */
        if ((readl(base + NvRegReceiverControl) & NVREG_RCVCTL_START) && !np->mac_in_use) {
                rx_ctrl &= ~NVREG_RCVCTL_START;
@@ -1561,8 +1520,6 @@ static void nv_start_rx(struct net_device *dev)
        if (np->mac_in_use)
                rx_ctrl &= ~NVREG_RCVCTL_RX_PATH_EN;
        writel(rx_ctrl, base + NvRegReceiverControl);
-       netdev_dbg(dev, "%s: duplex %d, speed 0x%08x\n",
-                  __func__, np->duplex, np->linkspeed);
        pci_push(base);
 }
 
@@ -1572,7 +1529,6 @@ static void nv_stop_rx(struct net_device *dev)
        u8 __iomem *base = get_hwbase(dev);
        u32 rx_ctrl = readl(base + NvRegReceiverControl);
 
-       netdev_dbg(dev, "%s\n", __func__);
        if (!np->mac_in_use)
                rx_ctrl &= ~NVREG_RCVCTL_START;
        else
@@ -1594,7 +1550,6 @@ static void nv_start_tx(struct net_device *dev)
        u8 __iomem *base = get_hwbase(dev);
        u32 tx_ctrl = readl(base + NvRegTransmitterControl);
 
-       netdev_dbg(dev, "%s\n", __func__);
        tx_ctrl |= NVREG_XMITCTL_START;
        if (np->mac_in_use)
                tx_ctrl &= ~NVREG_XMITCTL_TX_PATH_EN;
@@ -1608,7 +1563,6 @@ static void nv_stop_tx(struct net_device *dev)
        u8 __iomem *base = get_hwbase(dev);
        u32 tx_ctrl = readl(base + NvRegTransmitterControl);
 
-       netdev_dbg(dev, "%s\n", __func__);
        if (!np->mac_in_use)
                tx_ctrl &= ~NVREG_XMITCTL_START;
        else
@@ -1642,7 +1596,6 @@ static void nv_txrx_reset(struct net_device *dev)
        struct fe_priv *np = netdev_priv(dev);
        u8 __iomem *base = get_hwbase(dev);
 
-       netdev_dbg(dev, "%s\n", __func__);
        writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET | np->txrxctl_bits, base + NvRegTxRxControl);
        pci_push(base);
        udelay(NV_TXRX_RESET_DELAY);
@@ -1656,8 +1609,6 @@ static void nv_mac_reset(struct net_device *dev)
        u8 __iomem *base = get_hwbase(dev);
        u32 temp1, temp2, temp3;
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET | np->txrxctl_bits, base + NvRegTxRxControl);
        pci_push(base);
 
@@ -2234,13 +2185,6 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        spin_unlock_irqrestore(&np->lock, flags);
 
-       netdev_dbg(dev, "%s: entries %d queued for transmission. tx_flags_extra: %x\n",
-                  __func__, entries, tx_flags_extra);
-#ifdef DEBUG
-       print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1,
-                      skb->data, 64, true);
-#endif
-
        writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
        return NETDEV_TX_OK;
 }
@@ -2380,13 +2324,6 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
 
        spin_unlock_irqrestore(&np->lock, flags);
 
-       netdev_dbg(dev, "%s: entries %d queued for transmission. tx_flags_extra: %x\n",
-                  __func__, entries, tx_flags_extra);
-#ifdef DEBUG
-       print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1,
-                      skb->data, 64, true);
-#endif
-
        writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
        return NETDEV_TX_OK;
 }
@@ -2425,8 +2362,6 @@ static int nv_tx_done(struct net_device *dev, int limit)
               !((flags = le32_to_cpu(np->get_tx.orig->flaglen)) & NV_TX_VALID) &&
               (tx_work < limit)) {
 
-               netdev_dbg(dev, "%s: flags 0x%x\n", __func__, flags);
-
                nv_unmap_txskb(np, np->get_tx_ctx);
 
                if (np->desc_ver == DESC_VER_1) {
@@ -2489,8 +2424,6 @@ static int nv_tx_done_optimized(struct net_device *dev, int limit)
               !((flags = le32_to_cpu(np->get_tx.ex->flaglen)) & NV_TX2_VALID) &&
               (tx_work < limit)) {
 
-               netdev_dbg(dev, "%s: flags 0x%x\n", __func__, flags);
-
                nv_unmap_txskb(np, np->get_tx_ctx);
 
                if (flags & NV_TX2_LASTPACKET) {
@@ -2639,8 +2572,6 @@ static int nv_getlen(struct net_device *dev, void *packet, int datalen)
                protolen = ntohs(((struct ethhdr *)packet)->h_proto);
                hdrlen = ETH_HLEN;
        }
-       netdev_dbg(dev, "%s: datalen %d, protolen %d, hdrlen %d\n",
-                  __func__, datalen, protolen, hdrlen);
        if (protolen > ETH_DATA_LEN)
                return datalen; /* Value in proto field not a len, no checks possible */
 
@@ -2651,25 +2582,18 @@ static int nv_getlen(struct net_device *dev, void *packet, int datalen)
                        /* more data on wire than in 802 header, trim of
                         * additional data.
                         */
-                       netdev_dbg(dev, "%s: accepting %d bytes\n",
-                                  __func__, protolen);
                        return protolen;
                } else {
                        /* less data on wire than mentioned in header.
                         * Discard the packet.
                         */
-                       netdev_dbg(dev, "%s: discarding long packet\n",
-                                  __func__);
                        return -1;
                }
        } else {
                /* short packet. Accept only if 802 values are also short */
                if (protolen > ETH_ZLEN) {
-                       netdev_dbg(dev, "%s: discarding short packet\n",
-                                  __func__);
                        return -1;
                }
-               netdev_dbg(dev, "%s: accepting %d bytes\n", __func__, datalen);
                return datalen;
        }
 }
@@ -2686,8 +2610,6 @@ static int nv_rx_process(struct net_device *dev, int limit)
              !((flags = le32_to_cpu(np->get_rx.orig->flaglen)) & NV_RX_AVAIL) &&
                (rx_work < limit)) {
 
-               netdev_dbg(dev, "%s: flags 0x%x\n", __func__, flags);
-
                /*
                 * the packet is for us - immediately tear down the pci mapping.
                 * TODO: check if a prefetch of the first cacheline improves
@@ -2699,11 +2621,6 @@ static int nv_rx_process(struct net_device *dev, int limit)
                skb = np->get_rx_ctx->skb;
                np->get_rx_ctx->skb = NULL;
 
-                       netdev_dbg(dev, "Dumping packet (flags 0x%x)\n", flags);
-#ifdef DEBUG
-                       print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET,
-                                      16, 1, skb->data, 64, true);
-#endif
                /* look at what we actually got: */
                if (np->desc_ver == DESC_VER_1) {
                        if (likely(flags & NV_RX_DESCRIPTORVALID)) {
@@ -2778,8 +2695,6 @@ static int nv_rx_process(struct net_device *dev, int limit)
                /* got a valid packet - forward it to the network core */
                skb_put(skb, len);
                skb->protocol = eth_type_trans(skb, dev);
-               netdev_dbg(dev, "%s: %d bytes, proto %d accepted\n",
-                          __func__, len, skb->protocol);
                napi_gro_receive(&np->napi, skb);
                dev->stats.rx_packets++;
                dev->stats.rx_bytes += len;
@@ -2808,8 +2723,6 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit)
              !((flags = le32_to_cpu(np->get_rx.ex->flaglen)) & NV_RX2_AVAIL) &&
              (rx_work < limit)) {
 
-               netdev_dbg(dev, "%s: flags 0x%x\n", __func__, flags);
-
                /*
                 * the packet is for us - immediately tear down the pci mapping.
                 * TODO: check if a prefetch of the first cacheline improves
@@ -2821,11 +2734,6 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit)
                skb = np->get_rx_ctx->skb;
                np->get_rx_ctx->skb = NULL;
 
-               netdev_dbg(dev, "Dumping packet (flags 0x%x)\n", flags);
-#ifdef DEBUG
-               print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1,
-                              skb->data, 64, true);
-#endif
                /* look at what we actually got: */
                if (likely(flags & NV_RX2_DESCRIPTORVALID)) {
                        len = flags & LEN_MASK_V2;
@@ -2858,9 +2766,6 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit)
                        skb->protocol = eth_type_trans(skb, dev);
                        prefetch(skb->data);
 
-                       netdev_dbg(dev, "%s: %d bytes, proto %d accepted\n",
-                                  __func__, len, skb->protocol);
-
                        if (likely(!np->vlangrp)) {
                                napi_gro_receive(&np->napi, skb);
                        } else {
@@ -3076,7 +2981,6 @@ static void nv_set_multicast(struct net_device *dev)
        writel(mask[0], base + NvRegMulticastMaskA);
        writel(mask[1], base + NvRegMulticastMaskB);
        writel(pff, base + NvRegPacketFilterFlags);
-       netdev_dbg(dev, "reconfiguration for multicast lists\n");
        nv_start_rx(dev);
        spin_unlock_irq(&np->lock);
 }
@@ -3151,8 +3055,6 @@ static int nv_update_linkspeed(struct net_device *dev)
        mii_status = mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ);
 
        if (!(mii_status & BMSR_LSTATUS)) {
-               netdev_dbg(dev,
-                          "no link detected by phy - falling back to 10HD\n");
                newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
                newdup = 0;
                retval = 0;
@@ -3160,8 +3062,6 @@ static int nv_update_linkspeed(struct net_device *dev)
        }
 
        if (np->autoneg == 0) {
-               netdev_dbg(dev, "%s: autoneg off, PHY set to 0x%04x\n",
-                          __func__, np->fixed_mode);
                if (np->fixed_mode & LPA_100FULL) {
                        newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100;
                        newdup = 1;
@@ -3184,15 +3084,11 @@ static int nv_update_linkspeed(struct net_device *dev)
                newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
                newdup = 0;
                retval = 0;
-               netdev_dbg(dev,
-                          "autoneg not completed - falling back to 10HD\n");
                goto set_speed;
        }
 
        adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
        lpa = mii_rw(dev, np->phyaddr, MII_LPA, MII_READ);
-       netdev_dbg(dev, "%s: PHY advertises 0x%04x, lpa 0x%04x\n",
-                  __func__, adv, lpa);
 
        retval = 1;
        if (np->gigabit == PHY_GIGABIT) {
@@ -3201,8 +3097,6 @@ static int nv_update_linkspeed(struct net_device *dev)
 
                if ((control_1000 & ADVERTISE_1000FULL) &&
                        (status_1000 & LPA_1000FULL)) {
-                       netdev_dbg(dev, "%s: GBit ethernet detected\n",
-                                  __func__);
                        newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_1000;
                        newdup = 1;
                        goto set_speed;
@@ -3224,8 +3118,6 @@ static int nv_update_linkspeed(struct net_device *dev)
                newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
                newdup = 0;
        } else {
-               netdev_dbg(dev, "bad ability %04x - falling back to 10HD\n",
-                          adv_lpa);
                newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
                newdup = 0;
        }
@@ -3234,9 +3126,6 @@ set_speed:
        if (np->duplex == newdup && np->linkspeed == newls)
                return retval;
 
-       netdev_dbg(dev, "changing link setting from %d/%d to %d/%d\n",
-                  np->linkspeed, np->duplex, newls, newdup);
-
        np->duplex = newdup;
        np->linkspeed = newls;
 
@@ -3378,11 +3267,9 @@ static void nv_link_irq(struct net_device *dev)
 
        miistat = readl(base + NvRegMIIStatus);
        writel(NVREG_MIISTAT_LINKCHANGE, base + NvRegMIIStatus);
-       netdev_dbg(dev, "link change irq, status 0x%x\n", miistat);
 
        if (miistat & (NVREG_MIISTAT_LINKCHANGE))
                nv_linkchange(dev);
-       netdev_dbg(dev, "link change notification done\n");
 }
 
 static void nv_msi_workaround(struct fe_priv *np)
@@ -3433,8 +3320,6 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
        struct fe_priv *np = netdev_priv(dev);
        u8 __iomem *base = get_hwbase(dev);
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
                np->events = readl(base + NvRegIrqStatus);
                writel(np->events, base + NvRegIrqStatus);
@@ -3442,7 +3327,6 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
                np->events = readl(base + NvRegMSIXIrqStatus);
                writel(np->events, base + NvRegMSIXIrqStatus);
        }
-       netdev_dbg(dev, "irq: %08x\n", np->events);
        if (!(np->events & np->irqmask))
                return IRQ_NONE;
 
@@ -3456,8 +3340,6 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
                __napi_schedule(&np->napi);
        }
 
-       netdev_dbg(dev, "%s: completed\n", __func__);
-
        return IRQ_HANDLED;
 }
 
@@ -3472,8 +3354,6 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
        struct fe_priv *np = netdev_priv(dev);
        u8 __iomem *base = get_hwbase(dev);
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
                np->events = readl(base + NvRegIrqStatus);
                writel(np->events, base + NvRegIrqStatus);
@@ -3481,7 +3361,6 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
                np->events = readl(base + NvRegMSIXIrqStatus);
                writel(np->events, base + NvRegMSIXIrqStatus);
        }
-       netdev_dbg(dev, "irq: %08x\n", np->events);
        if (!(np->events & np->irqmask))
                return IRQ_NONE;
 
@@ -3494,7 +3373,6 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
                writel(0, base + NvRegIrqMask);
                __napi_schedule(&np->napi);
        }
-       netdev_dbg(dev, "%s: completed\n", __func__);
 
        return IRQ_HANDLED;
 }
@@ -3508,12 +3386,9 @@ static irqreturn_t nv_nic_irq_tx(int foo, void *data)
        int i;
        unsigned long flags;
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        for (i = 0;; i++) {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_TX_ALL;
                writel(NVREG_IRQ_TX_ALL, base + NvRegMSIXIrqStatus);
-               netdev_dbg(dev, "tx irq: %08x\n", events);
                if (!(events & np->irqmask))
                        break;
 
@@ -3532,12 +3407,12 @@ static irqreturn_t nv_nic_irq_tx(int foo, void *data)
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
                        spin_unlock_irqrestore(&np->lock, flags);
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_tx.\n", dev->name, i);
+                       netdev_dbg(dev, "%s: too many iterations (%d)\n",
+                                  __func__, i);
                        break;
                }
 
        }
-       netdev_dbg(dev, "%s: completed\n", __func__);
 
        return IRQ_RETVAL(i);
 }
@@ -3622,12 +3497,9 @@ static irqreturn_t nv_nic_irq_rx(int foo, void *data)
        int i;
        unsigned long flags;
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        for (i = 0;; i++) {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_RX_ALL;
                writel(NVREG_IRQ_RX_ALL, base + NvRegMSIXIrqStatus);
-               netdev_dbg(dev, "rx irq: %08x\n", events);
                if (!(events & np->irqmask))
                        break;
 
@@ -3651,11 +3523,11 @@ static irqreturn_t nv_nic_irq_rx(int foo, void *data)
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
                        spin_unlock_irqrestore(&np->lock, flags);
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_rx.\n", dev->name, i);
+                       netdev_dbg(dev, "%s: too many iterations (%d)\n",
+                                  __func__, i);
                        break;
                }
        }
-       netdev_dbg(dev, "%s: completed\n", __func__);
 
        return IRQ_RETVAL(i);
 }
@@ -3669,12 +3541,9 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data)
        int i;
        unsigned long flags;
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        for (i = 0;; i++) {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_OTHER;
                writel(NVREG_IRQ_OTHER, base + NvRegMSIXIrqStatus);
-               netdev_dbg(dev, "irq: %08x\n", events);
                if (!(events & np->irqmask))
                        break;
 
@@ -3719,12 +3588,12 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data)
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
                        spin_unlock_irqrestore(&np->lock, flags);
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_other.\n", dev->name, i);
+                       netdev_dbg(dev, "%s: too many iterations (%d)\n",
+                                  __func__, i);
                        break;
                }
 
        }
-       netdev_dbg(dev, "%s: completed\n", __func__);
 
        return IRQ_RETVAL(i);
 }
@@ -3736,8 +3605,6 @@ static irqreturn_t nv_nic_irq_test(int foo, void *data)
        u8 __iomem *base = get_hwbase(dev);
        u32 events;
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
                events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
                writel(NVREG_IRQ_TIMER, base + NvRegIrqStatus);
@@ -3746,7 +3613,6 @@ static irqreturn_t nv_nic_irq_test(int foo, void *data)
                writel(NVREG_IRQ_TIMER, base + NvRegMSIXIrqStatus);
        }
        pci_push(base);
-       netdev_dbg(dev, "irq: %08x\n", events);
        if (!(events & NVREG_IRQ_TIMER))
                return IRQ_RETVAL(0);
 
@@ -3756,8 +3622,6 @@ static irqreturn_t nv_nic_irq_test(int foo, void *data)
        np->intr_test = 1;
        spin_unlock(&np->lock);
 
-       netdev_dbg(dev, "%s: completed\n", __func__);
-
        return IRQ_RETVAL(1);
 }
 
@@ -4085,6 +3949,7 @@ static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo)
                writel(flags, base + NvRegWakeUpFlags);
                spin_unlock_irq(&np->lock);
        }
+       device_set_wakeup_enable(&np->pci_dev->dev, np->wolenabled);
        return 0;
 }
 
@@ -4900,21 +4765,15 @@ static int nv_loopback_test(struct net_device *dev)
        if (ret) {
                if (len != pkt_len) {
                        ret = 0;
-                       netdev_dbg(dev, "loopback len mismatch %d vs %d\n",
-                                  len, pkt_len);
                } else {
                        rx_skb = np->rx_skb[0].skb;
                        for (i = 0; i < pkt_len; i++) {
                                if (rx_skb->data[i] != (u8)(i & 0xff)) {
                                        ret = 0;
-                                       netdev_dbg(dev, "loopback pattern check failed on byte %d\n",
-                                                  i);
                                        break;
                                }
                        }
                }
-       } else {
-               netdev_dbg(dev, "loopback - did not receive test packet\n");
        }
 
        pci_unmap_single(np->pci_dev, test_dma_addr,
@@ -5164,8 +5023,6 @@ static int nv_open(struct net_device *dev)
        int oom, i;
        u32 low;
 
-       netdev_dbg(dev, "%s\n", __func__);
-
        /* power up phy */
        mii_rw(dev, np->phyaddr, MII_BMCR,
               mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ) & ~BMCR_PDOWN);
@@ -5293,7 +5150,6 @@ static int nv_open(struct net_device *dev)
                u32 miistat;
                miistat = readl(base + NvRegMIIStatus);
                writel(NVREG_MIISTAT_MASK_ALL, base + NvRegMIIStatus);
-               netdev_dbg(dev, "startup: got 0x%08x\n", miistat);
        }
        /* set linkspeed to invalid value, thus force nv_update_linkspeed
         * to init hw */
@@ -5349,7 +5205,6 @@ static int nv_close(struct net_device *dev)
        base = get_hwbase(dev);
        nv_disable_hw_interrupts(dev, np->irqmask);
        pci_push(base);
-       netdev_dbg(dev, "Irqmask is zero again\n");
 
        spin_unlock_irq(&np->lock);
 
@@ -5462,11 +5317,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
        err = -EINVAL;
        addr = 0;
        for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-               netdev_dbg(dev, "%s: resource %d start %p len %lld flags 0x%08lx\n",
-                          pci_name(pci_dev), i,
-                          (void *)(unsigned long)pci_resource_start(pci_dev, i),
-                          (long long)pci_resource_len(pci_dev, i),
-                          pci_resource_flags(pci_dev, i));
                if (pci_resource_flags(pci_dev, i) & IORESOURCE_MEM &&
                                pci_resource_len(pci_dev, i) >= np->register_size) {
                        addr = pci_resource_start(pci_dev, i);
@@ -5474,8 +5324,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                }
        }
        if (i == DEVICE_COUNT_RESOURCE) {
-               dev_printk(KERN_INFO, &pci_dev->dev,
-                          "Couldn't find register window\n");
+               dev_info(&pci_dev->dev, "Couldn't find register window\n");
                goto out_relreg;
        }
 
@@ -5491,13 +5340,13 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                np->txrxctl_bits = NVREG_TXRXCTL_DESC_3;
                if (dma_64bit) {
                        if (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(39)))
-                               dev_printk(KERN_INFO, &pci_dev->dev,
-                                       "64-bit DMA failed, using 32-bit addressing\n");
+                               dev_info(&pci_dev->dev,
+                                        "64-bit DMA failed, using 32-bit addressing\n");
                        else
                                dev->features |= NETIF_F_HIGHDMA;
                        if (pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(39))) {
-                               dev_printk(KERN_INFO, &pci_dev->dev,
-                                       "64-bit DMA (consistent) failed, using 32-bit ring buffers\n");
+                               dev_info(&pci_dev->dev,
+                                        "64-bit DMA (consistent) failed, using 32-bit ring buffers\n");
                        }
                }
        } else if (id->driver_data & DEV_HAS_LARGEDESC) {
@@ -5618,7 +5467,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                dev->dev_addr[4] = (np->orig_mac[0] >>  8) & 0xff;
                dev->dev_addr[5] = (np->orig_mac[0] >>  0) & 0xff;
                writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll);
-               printk(KERN_DEBUG "nv_probe: set workaround bit for reversed mac addr\n");
+               dev_dbg(&pci_dev->dev,
+                       "%s: set workaround bit for reversed mac addr\n",
+                       __func__);
        }
        memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
@@ -5627,28 +5478,21 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                 * Bad mac address. At least one bios sets the mac address
                 * to 01:23:45:67:89:ab
                 */
-               dev_printk(KERN_ERR, &pci_dev->dev,
-                       "Invalid Mac address detected: %pM\n",
+               dev_err(&pci_dev->dev,
+                       "Invalid MAC address detected: %pM - Please complain to your hardware vendor.\n",
                        dev->dev_addr);
-               dev_printk(KERN_ERR, &pci_dev->dev,
-                       "Please complain to your hardware vendor. Switching to a random MAC.\n");
                random_ether_addr(dev->dev_addr);
+               dev_err(&pci_dev->dev,
+                       "Using random MAC address: %pM\n", dev->dev_addr);
        }
 
-       netdev_dbg(dev, "%s: MAC Address %pM\n",
-                  pci_name(pci_dev), dev->dev_addr);
-
        /* set mac address */
        nv_copy_mac_to_hw(dev);
 
-       /* Workaround current PCI init glitch:  wakeup bits aren't
-        * being set from PCI PM capability.
-        */
-       device_init_wakeup(&pci_dev->dev, 1);
-
        /* disable WOL */
        writel(0, base + NvRegWakeUpFlags);
        np->wolenabled = 0;
+       device_set_wakeup_enable(&pci_dev->dev, false);
 
        if (id->driver_data & DEV_HAS_POWER_CNTRL) {
 
@@ -5699,11 +5543,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
        if (id->driver_data & DEV_NEED_TIMERIRQ)
                np->irqmask |= NVREG_IRQ_TIMER;
        if (id->driver_data & DEV_NEED_LINKTIMER) {
-               netdev_dbg(dev, "%s: link timer on\n", pci_name(pci_dev));
                np->need_linktimer = 1;
                np->link_timeout = jiffies + LINK_TIMEOUT;
        } else {
-               netdev_dbg(dev, "%s: link timer off\n", pci_name(pci_dev));
                np->need_linktimer = 0;
        }
 
@@ -5734,16 +5576,12 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                        np->mac_in_use = 1;
                        if (np->mgmt_version > 0)
                                np->mac_in_use = readl(base + NvRegMgmtUnitControl) & NVREG_MGMTUNITCONTROL_INUSE;
-                       netdev_dbg(dev, "%s: mgmt unit is running. mac in use %x\n",
-                                  pci_name(pci_dev), np->mac_in_use);
                        /* management unit setup the phy already? */
                        if (np->mac_in_use &&
                            ((readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_SYNC_MASK) ==
                             NVREG_XMITCTL_SYNC_PHY_INIT)) {
                                /* phy is inited by mgmt unit */
                                phyinitialized = 1;
-                               netdev_dbg(dev, "%s: Phy already initialized by mgmt unit\n",
-                                          pci_name(pci_dev));
                        } else {
                                /* we need to init the phy */
                        }
@@ -5769,8 +5607,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                np->phy_model = id2 & PHYID2_MODEL_MASK;
                id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT;
                id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT;
-               netdev_dbg(dev, "%s: %s: Found PHY %04x:%04x at address %d\n",
-                          pci_name(pci_dev), __func__, id1, id2, phyaddr);
                np->phyaddr = phyaddr;
                np->phy_oui = id1 | id2;
 
@@ -5784,8 +5620,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                break;
        }
        if (i == 33) {
-               dev_printk(KERN_INFO, &pci_dev->dev,
-                       "open: Could not find a valid PHY.\n");
+               dev_info(&pci_dev->dev, "open: Could not find a valid PHY\n");
                goto out_error;
        }
 
@@ -5806,37 +5641,27 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
 
        err = register_netdev(dev);
        if (err) {
-               dev_printk(KERN_INFO, &pci_dev->dev,
-                          "unable to register netdev: %d\n", err);
+               dev_info(&pci_dev->dev, "unable to register netdev: %d\n", err);
                goto out_error;
        }
 
-       dev_printk(KERN_INFO, &pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, "
-                  "addr %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
-                  dev->name,
-                  np->phy_oui,
-                  np->phyaddr,
-                  dev->dev_addr[0],
-                  dev->dev_addr[1],
-                  dev->dev_addr[2],
-                  dev->dev_addr[3],
-                  dev->dev_addr[4],
-                  dev->dev_addr[5]);
-
-       dev_printk(KERN_INFO, &pci_dev->dev, "%s%s%s%s%s%s%s%s%s%sdesc-v%u\n",
-               dev->features & NETIF_F_HIGHDMA ? "highdma " : "",
-               dev->features & (NETIF_F_IP_CSUM | NETIF_F_SG) ?
+       dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n",
+                dev->name, np->phy_oui, np->phyaddr, dev->dev_addr);
+
+       dev_info(&pci_dev->dev, "%s%s%s%s%s%s%s%s%s%sdesc-v%u\n",
+                dev->features & NETIF_F_HIGHDMA ? "highdma " : "",
+                dev->features & (NETIF_F_IP_CSUM | NETIF_F_SG) ?
                        "csum " : "",
-               dev->features & (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX) ?
+                dev->features & (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX) ?
                        "vlan " : "",
-               id->driver_data & DEV_HAS_POWER_CNTRL ? "pwrctl " : "",
-               id->driver_data & DEV_HAS_MGMT_UNIT ? "mgmt " : "",
-               id->driver_data & DEV_NEED_TIMERIRQ ? "timirq " : "",
-               np->gigabit == PHY_GIGABIT ? "gbit " : "",
-               np->need_linktimer ? "lnktim " : "",
-               np->msi_flags & NV_MSI_CAPABLE ? "msi " : "",
-               np->msi_flags & NV_MSI_X_CAPABLE ? "msi-x " : "",
-               np->desc_ver);
+                id->driver_data & DEV_HAS_POWER_CNTRL ? "pwrctl " : "",
+                id->driver_data & DEV_HAS_MGMT_UNIT ? "mgmt " : "",
+                id->driver_data & DEV_NEED_TIMERIRQ ? "timirq " : "",
+                np->gigabit == PHY_GIGABIT ? "gbit " : "",
+                np->need_linktimer ? "lnktim " : "",
+                np->msi_flags & NV_MSI_CAPABLE ? "msi " : "",
+                np->msi_flags & NV_MSI_X_CAPABLE ? "msi-x " : "",
+                np->desc_ver);
 
        return 0;
 
@@ -5918,8 +5743,9 @@ static void __devexit nv_remove(struct pci_dev *pci_dev)
 }
 
 #ifdef CONFIG_PM
-static int nv_suspend(struct pci_dev *pdev, pm_message_t state)
+static int nv_suspend(struct device *device)
 {
+       struct pci_dev *pdev = to_pci_dev(device);
        struct net_device *dev = pci_get_drvdata(pdev);
        struct fe_priv *np = netdev_priv(dev);
        u8 __iomem *base = get_hwbase(dev);
@@ -5935,25 +5761,17 @@ static int nv_suspend(struct pci_dev *pdev, pm_message_t state)
        for (i = 0; i <= np->register_size/sizeof(u32); i++)
                np->saved_config_space[i] = readl(base + i*sizeof(u32));
 
-       pci_save_state(pdev);
-       pci_enable_wake(pdev, pci_choose_state(pdev, state), np->wolenabled);
-       pci_disable_device(pdev);
-       pci_set_power_state(pdev, pci_choose_state(pdev, state));
        return 0;
 }
 
-static int nv_resume(struct pci_dev *pdev)
+static int nv_resume(struct device *device)
 {
+       struct pci_dev *pdev = to_pci_dev(device);
        struct net_device *dev = pci_get_drvdata(pdev);
        struct fe_priv *np = netdev_priv(dev);
        u8 __iomem *base = get_hwbase(dev);
        int i, rc = 0;
 
-       pci_set_power_state(pdev, PCI_D0);
-       pci_restore_state(pdev);
-       /* ack any pending wake events, disable PME */
-       pci_enable_wake(pdev, PCI_D0, 0);
-
        /* restore non-pci configuration space */
        for (i = 0; i <= np->register_size/sizeof(u32); i++)
                writel(np->saved_config_space[i], base+i*sizeof(u32));
@@ -5972,6 +5790,9 @@ static int nv_resume(struct pci_dev *pdev)
        return rc;
 }
 
+static SIMPLE_DEV_PM_OPS(nv_pm_ops, nv_suspend, nv_resume);
+#define NV_PM_OPS (&nv_pm_ops)
+
 static void nv_shutdown(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
@@ -5994,15 +5815,13 @@ static void nv_shutdown(struct pci_dev *pdev)
         * only put the device into D3 if we really go for poweroff.
         */
        if (system_state == SYSTEM_POWER_OFF) {
-               if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled))
-                       pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
+               pci_wake_from_d3(pdev, np->wolenabled);
                pci_set_power_state(pdev, PCI_D3hot);
        }
 }
 #else
-#define nv_suspend NULL
+#define NV_PM_OPS NULL
 #define nv_shutdown NULL
-#define nv_resume NULL
 #endif /* CONFIG_PM */
 
 static DEFINE_PCI_DEVICE_TABLE(pci_tbl) = {
@@ -6174,9 +5993,8 @@ static struct pci_driver driver = {
        .id_table       = pci_tbl,
        .probe          = nv_probe,
        .remove         = __devexit_p(nv_remove),
-       .suspend        = nv_suspend,
-       .resume         = nv_resume,
        .shutdown       = nv_shutdown,
+       .driver.pm      = NV_PM_OPS,
 };
 
 static int __init init_nic(void)