ARM: 6124/1: ep93xx: SPI driver platform support code
[safe/jmp/linux-2.6] / drivers / net / sky2.c
index 1f0180f..d8ec4c1 100644 (file)
@@ -22,6 +22,8 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/crc32.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -50,8 +52,7 @@
 #include "sky2.h"
 
 #define DRV_NAME               "sky2"
-#define DRV_VERSION            "1.26"
-#define PFX                    DRV_NAME " "
+#define DRV_VERSION            "1.27"
 
 /*
  * The Yukon II chipset takes 64 bit command blocks (called list elements)
@@ -1212,8 +1213,7 @@ static void sky2_rx_stop(struct sky2_port *sky2)
                    == sky2_read8(hw, RB_ADDR(rxq, Q_RL)))
                        goto stopped;
 
-       printk(KERN_WARNING PFX "%s: receiver stop failed\n",
-              sky2->netdev->name);
+       netdev_warn(sky2->netdev, "receiver stop failed\n");
 stopped:
        sky2_write32(hw, Q_ADDR(rxq, Q_CSR), BMU_RST_SET | BMU_FIFO_RST);
 
@@ -1555,7 +1555,7 @@ static void sky2_hw_up(struct sky2_port *sky2)
        if (ramsize > 0) {
                u32 rxspace;
 
-               pr_debug(PFX "%s: ram buffer %dK\n", sky2->netdev->name, ramsize);
+               netdev_dbg(sky2->netdev, "ram buffer %dK\n", ramsize);
                if (ramsize < 16)
                        rxspace = ramsize / 2;
                else
@@ -1613,8 +1613,7 @@ static int sky2_up(struct net_device *dev)
        sky2_write32(hw, B0_IMSK, imask);
        sky2_read32(hw, B0_IMSK);
 
-       if (netif_msg_ifup(sky2))
-               printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
+       netif_info(sky2, ifup, dev, "enabling interface\n");
 
        return 0;
 
@@ -1697,9 +1696,8 @@ static netdev_tx_t sky2_xmit_frame(struct sk_buff *skb,
                goto mapping_error;
 
        slot = sky2->tx_prod;
-       if (unlikely(netif_msg_tx_queued(sky2)))
-               printk(KERN_DEBUG "%s: tx queued, slot %u, len %d\n",
-                      dev->name, slot, skb->len);
+       netif_printk(sky2, tx_queued, KERN_DEBUG, dev,
+                    "tx queued, slot %u, len %d\n", slot, skb->len);
 
        /* Send high bits if needed */
        upper = upper_32_bits(mapping);
@@ -1864,9 +1862,8 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
                sky2_tx_unmap(sky2->hw->pdev, re);
 
                if (skb) {
-                       if (unlikely(netif_msg_tx_done(sky2)))
-                               printk(KERN_DEBUG "%s: tx done %u\n",
-                                      dev->name, idx);
+                       netif_printk(sky2, tx_done, KERN_DEBUG, dev,
+                                    "tx done %u\n", idx);
 
                        dev->stats.tx_packets++;
                        dev->stats.tx_bytes += skb->len;
@@ -1880,10 +1877,6 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
 
        sky2->tx_cons = idx;
        smp_mb();
-
-       /* Wake unless it's detached, and called e.g. from sky2_down() */
-       if (tx_avail(sky2) > MAX_SKB_TX_LE + 4 && netif_device_present(dev))
-               netif_wake_queue(dev);
 }
 
 static void sky2_tx_reset(struct sky2_hw *hw, unsigned port)
@@ -1908,21 +1901,11 @@ static void sky2_tx_reset(struct sky2_hw *hw, unsigned port)
        sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
 }
 
-/* Network shutdown */
-static int sky2_down(struct net_device *dev)
+static void sky2_hw_down(struct sky2_port *sky2)
 {
-       struct sky2_port *sky2 = netdev_priv(dev);
        struct sky2_hw *hw = sky2->hw;
        unsigned port = sky2->port;
        u16 ctrl;
-       u32 imask;
-
-       /* Never really got started! */
-       if (!sky2->tx_le)
-               return 0;
-
-       if (netif_msg_ifdown(sky2))
-               printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
 
        /* Force flow control off */
        sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
@@ -1955,15 +1938,6 @@ static int sky2_down(struct net_device *dev)
 
        sky2_rx_stop(sky2);
 
-       /* Disable port IRQ */
-       imask = sky2_read32(hw, B0_IMSK);
-       imask &= ~portirq_msk[port];
-       sky2_write32(hw, B0_IMSK, imask);
-       sky2_read32(hw, B0_IMSK);
-
-       synchronize_irq(hw->pdev->irq);
-       napi_synchronize(&hw->napi);
-
        spin_lock_bh(&sky2->phy_lock);
        sky2_phy_power_down(hw, port);
        spin_unlock_bh(&sky2->phy_lock);
@@ -1972,6 +1946,29 @@ static int sky2_down(struct net_device *dev)
 
        /* Free any pending frames stuck in HW queue */
        sky2_tx_complete(sky2, sky2->tx_prod);
+}
+
+/* Network shutdown */
+static int sky2_down(struct net_device *dev)
+{
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+
+       /* Never really got started! */
+       if (!sky2->tx_le)
+               return 0;
+
+       netif_info(sky2, ifdown, dev, "disabling interface\n");
+
+       /* Disable port IRQ */
+       sky2_write32(hw, B0_IMSK,
+                    sky2_read32(hw, B0_IMSK) & ~portirq_msk[sky2->port]);
+       sky2_read32(hw, B0_IMSK);
+
+       synchronize_irq(hw->pdev->irq);
+       napi_synchronize(&hw->napi);
+
+       sky2_hw_down(sky2);
 
        sky2_free_buffers(sky2);
 
@@ -2027,12 +2024,11 @@ static void sky2_link_up(struct sky2_port *sky2)
        sky2_write8(hw, SK_REG(port, LNK_LED_REG),
                    LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF);
 
-       if (netif_msg_link(sky2))
-               printk(KERN_INFO PFX
-                      "%s: Link is up at %d Mbps, %s duplex, flow control %s\n",
-                      sky2->netdev->name, sky2->speed,
-                      sky2->duplex == DUPLEX_FULL ? "full" : "half",
-                      fc_name[sky2->flow_status]);
+       netif_info(sky2, link, sky2->netdev,
+                  "Link is up at %d Mbps, %s duplex, flow control %s\n",
+                  sky2->speed,
+                  sky2->duplex == DUPLEX_FULL ? "full" : "half",
+                  fc_name[sky2->flow_status]);
 }
 
 static void sky2_link_down(struct sky2_port *sky2)
@@ -2052,8 +2048,7 @@ static void sky2_link_down(struct sky2_port *sky2)
        /* Turn off link LED */
        sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF);
 
-       if (netif_msg_link(sky2))
-               printk(KERN_INFO PFX "%s: Link is down.\n", sky2->netdev->name);
+       netif_info(sky2, link, sky2->netdev, "Link is down\n");
 
        sky2_phy_init(hw, port);
 }
@@ -2075,13 +2070,12 @@ static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux)
        advert = gm_phy_read(hw, port, PHY_MARV_AUNE_ADV);
        lpa = gm_phy_read(hw, port, PHY_MARV_AUNE_LP);
        if (lpa & PHY_M_AN_RF) {
-               printk(KERN_ERR PFX "%s: remote fault", sky2->netdev->name);
+               netdev_err(sky2->netdev, "remote fault\n");
                return -1;
        }
 
        if (!(aux & PHY_M_PS_SPDUP_RES)) {
-               printk(KERN_ERR PFX "%s: speed/duplex mismatch",
-                      sky2->netdev->name);
+               netdev_err(sky2->netdev, "speed/duplex mismatch\n");
                return -1;
        }
 
@@ -2143,9 +2137,8 @@ static void sky2_phy_intr(struct sky2_hw *hw, unsigned port)
        istatus = gm_phy_read(hw, port, PHY_MARV_INT_STAT);
        phystat = gm_phy_read(hw, port, PHY_MARV_PHY_STAT);
 
-       if (netif_msg_intr(sky2))
-               printk(KERN_INFO PFX "%s: phy interrupt status 0x%x 0x%x\n",
-                      sky2->netdev->name, istatus, phystat);
+       netif_info(sky2, intr, sky2->netdev, "phy interrupt status 0x%x 0x%x\n",
+                  istatus, phystat);
 
        if (istatus & PHY_M_IS_AN_COMPL) {
                if (sky2_autoneg_done(sky2, phystat) == 0)
@@ -2199,13 +2192,12 @@ static void sky2_tx_timeout(struct net_device *dev)
        struct sky2_port *sky2 = netdev_priv(dev);
        struct sky2_hw *hw = sky2->hw;
 
-       if (netif_msg_timer(sky2))
-               printk(KERN_ERR PFX "%s: tx timeout\n", dev->name);
+       netif_err(sky2, timer, dev, "tx timeout\n");
 
-       printk(KERN_DEBUG PFX "%s: transmit ring %u .. %u report=%u done=%u\n",
-              dev->name, sky2->tx_cons, sky2->tx_prod,
-              sky2_read16(hw, sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX),
-              sky2_read16(hw, Q_ADDR(txqaddr[sky2->port], Q_DONE)));
+       netdev_printk(KERN_DEBUG, dev, "transmit ring %u .. %u report=%u done=%u\n",
+                     sky2->tx_cons, sky2->tx_prod,
+                     sky2_read16(hw, sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX),
+                     sky2_read16(hw, Q_ADDR(txqaddr[sky2->port], Q_DONE)));
 
        /* can't restart safely under softirq */
        schedule_work(&hw->restart_work);
@@ -2395,9 +2387,9 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
                count -= VLAN_HLEN;
 #endif
 
-       if (unlikely(netif_msg_rx_status(sky2)))
-               printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n",
-                      dev->name, sky2->rx_next, status, length);
+       netif_printk(sky2, rx_status, KERN_DEBUG, dev,
+                    "rx slot %u status 0x%x len %d\n",
+                    sky2->rx_next, status, length);
 
        sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending;
        prefetch(sky2->rx_ring + sky2->rx_next);
@@ -2438,9 +2430,10 @@ len_error:
        /* Truncation of overlength packets
           causes PHY length to not match MAC length */
        ++dev->stats.rx_length_errors;
-       if (netif_msg_rx_err(sky2) && net_ratelimit())
-               pr_info(PFX "%s: rx length error: status %#x length %d\n",
-                       dev->name, status, length);
+       if (net_ratelimit())
+               netif_info(sky2, rx_err, dev,
+                          "rx length error: status %#x length %d\n",
+                          status, length);
        goto resubmit;
 
 error:
@@ -2450,9 +2443,9 @@ error:
                goto resubmit;
        }
 
-       if (netif_msg_rx_err(sky2) && net_ratelimit())
-               printk(KERN_INFO PFX "%s: rx error, status 0x%x length %d\n",
-                      dev->name, status, length);
+       if (net_ratelimit())
+               netif_info(sky2, rx_err, dev,
+                          "rx error, status 0x%x length %d\n", status, length);
 
        if (status & (GMR_FS_LONG_ERR | GMR_FS_UN_SIZE))
                dev->stats.rx_length_errors++;
@@ -2469,8 +2462,13 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last)
 {
        struct sky2_port *sky2 = netdev_priv(dev);
 
-       if (netif_running(dev))
+       if (netif_running(dev)) {
                sky2_tx_complete(sky2, last);
+
+               /* Wake unless it's detached, and called e.g. from sky2_down() */
+               if (tx_avail(sky2) > MAX_SKB_TX_LE + 4)
+                       netif_wake_queue(dev);
+       }
 }
 
 static inline void sky2_skb_rx(const struct sky2_port *sky2,
@@ -2615,8 +2613,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
 
                default:
                        if (net_ratelimit())
-                               printk(KERN_WARNING PFX
-                                      "unknown status opcode 0x%x\n", opcode);
+                               pr_warning("unknown status opcode 0x%x\n", opcode);
                }
        } while (hw->st_idx != idx);
 
@@ -2635,41 +2632,37 @@ static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
        struct net_device *dev = hw->dev[port];
 
        if (net_ratelimit())
-               printk(KERN_INFO PFX "%s: hw error interrupt status 0x%x\n",
-                      dev->name, status);
+               netdev_info(dev, "hw error interrupt status 0x%x\n", status);
 
        if (status & Y2_IS_PAR_RD1) {
                if (net_ratelimit())
-                       printk(KERN_ERR PFX "%s: ram data read parity error\n",
-                              dev->name);
+                       netdev_err(dev, "ram data read parity error\n");
                /* Clear IRQ */
                sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_RD_PERR);
        }
 
        if (status & Y2_IS_PAR_WR1) {
                if (net_ratelimit())
-                       printk(KERN_ERR PFX "%s: ram data write parity error\n",
-                              dev->name);
+                       netdev_err(dev, "ram data write parity error\n");
 
                sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_WR_PERR);
        }
 
        if (status & Y2_IS_PAR_MAC1) {
                if (net_ratelimit())
-                       printk(KERN_ERR PFX "%s: MAC parity error\n", dev->name);
+                       netdev_err(dev, "MAC parity error\n");
                sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_PE);
        }
 
        if (status & Y2_IS_PAR_RX1) {
                if (net_ratelimit())
-                       printk(KERN_ERR PFX "%s: RX parity error\n", dev->name);
+                       netdev_err(dev, "RX parity error\n");
                sky2_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), BMU_CLR_IRQ_PAR);
        }
 
        if (status & Y2_IS_TCP_TXA1) {
                if (net_ratelimit())
-                       printk(KERN_ERR PFX "%s: TCP segmentation error\n",
-                              dev->name);
+                       netdev_err(dev, "TCP segmentation error\n");
                sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_CLR_IRQ_TCP);
        }
 }
@@ -2727,9 +2720,7 @@ static void sky2_mac_intr(struct sky2_hw *hw, unsigned port)
        struct sky2_port *sky2 = netdev_priv(dev);
        u8 status = sky2_read8(hw, SK_REG(port, GMAC_IRQ_SRC));
 
-       if (netif_msg_intr(sky2))
-               printk(KERN_INFO PFX "%s: mac interrupt status 0x%x\n",
-                      dev->name, status);
+       netif_info(sky2, intr, dev, "mac interrupt status 0x%x\n", status);
 
        if (status & GM_IS_RX_CO_OV)
                gma_read16(hw, port, GM_RX_IRQ_SRC);
@@ -2754,8 +2745,7 @@ static void sky2_le_error(struct sky2_hw *hw, unsigned port, u16 q)
        struct net_device *dev = hw->dev[port];
        u16 idx = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX));
 
-       dev_err(&hw->pdev->dev, PFX
-               "%s: descriptor error q=%#x get=%u put=%u\n",
+       dev_err(&hw->pdev->dev, "%s: descriptor error q=%#x get=%u put=%u\n",
                dev->name, (unsigned) q, (unsigned) idx,
                (unsigned) sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX)));
 
@@ -2780,9 +2770,10 @@ static int sky2_rx_hung(struct net_device *dev)
             /* Check if the PCI RX hang */
             (fifo_rp == sky2->check.fifo_rp &&
              fifo_lev != 0 && fifo_lev >= sky2->check.fifo_lev))) {
-               printk(KERN_DEBUG PFX "%s: hung mac %d:%d fifo %d (%d:%d)\n",
-                      dev->name, mac_lev, mac_rp, fifo_lev, fifo_rp,
-                      sky2_read8(hw, Q_ADDR(rxq, Q_WP)));
+               netdev_printk(KERN_DEBUG, dev,
+                             "hung mac %d:%d fifo %d (%d:%d)\n",
+                             mac_lev, mac_rp, fifo_lev,
+                             fifo_rp, sky2_read8(hw, Q_ADDR(rxq, Q_WP)));
                return 1;
        } else {
                sky2->check.last = dev->last_rx;
@@ -2813,8 +2804,7 @@ static void sky2_watchdog(unsigned long arg)
                        /* For chips with Rx FIFO, check if stuck */
                        if ((hw->flags & SKY2_HW_RAM_BUFFER) &&
                             sky2_rx_hung(dev)) {
-                               pr_info(PFX "%s: receiver hang detected\n",
-                                       dev->name);
+                               netdev_info(dev, "receiver hang detected\n");
                                schedule_work(&hw->restart_work);
                                return;
                        }
@@ -3256,8 +3246,7 @@ static int sky2_reattach(struct net_device *dev)
        if (netif_running(dev)) {
                err = sky2_up(dev);
                if (err) {
-                       printk(KERN_INFO PFX "%s: could not restart %d\n",
-                              dev->name, err);
+                       netdev_info(dev, "could not restart %d\n", err);
                        dev_close(dev);
                } else {
                        netif_device_attach(dev);
@@ -3271,20 +3260,46 @@ static int sky2_reattach(struct net_device *dev)
 static void sky2_restart(struct work_struct *work)
 {
        struct sky2_hw *hw = container_of(work, struct sky2_hw, restart_work);
+       u32 imask;
        int i;
 
        rtnl_lock();
-       for (i = 0; i < hw->ports; i++)
-               sky2_detach(hw->dev[i]);
 
        napi_disable(&hw->napi);
+       synchronize_irq(hw->pdev->irq);
+       imask = sky2_read32(hw, B0_IMSK);
        sky2_write32(hw, B0_IMSK, 0);
+
+       for (i = 0; i < hw->ports; i++) {
+               struct net_device *dev = hw->dev[i];
+               struct sky2_port *sky2 = netdev_priv(dev);
+
+               if (!netif_running(dev))
+                       continue;
+
+               netif_carrier_off(dev);
+               netif_tx_disable(dev);
+               sky2_hw_down(sky2);
+       }
+
        sky2_reset(hw);
-       sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
-       napi_enable(&hw->napi);
 
-       for (i = 0; i < hw->ports; i++)
-               sky2_reattach(hw->dev[i]);
+       for (i = 0; i < hw->ports; i++) {
+               struct net_device *dev = hw->dev[i];
+               struct sky2_port *sky2 = netdev_priv(dev);
+
+               if (!netif_running(dev))
+                       continue;
+
+               sky2_hw_up(sky2);
+               netif_wake_queue(dev);
+       }
+
+       sky2_write32(hw, B0_IMSK, imask);
+       sky2_read32(hw, B0_IMSK);
+
+       sky2_read32(hw, B0_Y2_SP_LISR);
+       napi_enable(&hw->napi);
 
        rtnl_unlock();
 }
@@ -3606,7 +3621,7 @@ static void sky2_set_multicast(struct net_device *dev)
        struct sky2_port *sky2 = netdev_priv(dev);
        struct sky2_hw *hw = sky2->hw;
        unsigned port = sky2->port;
-       struct dev_mc_list *list = dev->mc_list;
+       struct dev_mc_list *list;
        u16 reg;
        u8 filter[8];
        int rx_pause;
@@ -3625,13 +3640,12 @@ static void sky2_set_multicast(struct net_device *dev)
        else if (netdev_mc_empty(dev) && !rx_pause)
                reg &= ~GM_RXCR_MCF_ENA;
        else {
-               int i;
                reg |= GM_RXCR_MCF_ENA;
 
                if (rx_pause)
                        sky2_add_filter(filter, pause_mc_addr);
 
-               for (i = 0; list && i < netdev_mc_count(dev); i++, list = list->next)
+               netdev_for_each_mc_addr(list, dev)
                        sky2_add_filter(filter, list->dmi_addr);
        }
 
@@ -4009,7 +4023,7 @@ static int sky2_vpd_wait(const struct sky2_hw *hw, int cap, u16 busy)
        while ( (sky2_pci_read16(hw, cap + PCI_VPD_ADDR) & PCI_VPD_ADDR_F) == busy) {
                /* Can take up to 10.6 ms for write */
                if (time_after(jiffies, start + HZ/4)) {
-                       dev_err(&hw->pdev->dev, PFX "VPD cycle timed out");
+                       dev_err(&hw->pdev->dev, "VPD cycle timed out\n");
                        return -ETIMEDOUT;
                }
                mdelay(1);
@@ -4343,8 +4357,7 @@ static int sky2_device_event(struct notifier_block *unused,
 
        case NETDEV_GOING_DOWN:
                if (sky2->debugfs) {
-                       printk(KERN_DEBUG PFX "%s: remove debugfs\n",
-                              dev->name);
+                       netdev_printk(KERN_DEBUG, dev, "remove debugfs\n");
                        debugfs_remove(sky2->debugfs);
                        sky2->debugfs = NULL;
                }
@@ -4497,9 +4510,7 @@ static void __devinit sky2_show_addr(struct net_device *dev)
 {
        const struct sky2_port *sky2 = netdev_priv(dev);
 
-       if (netif_msg_probe(sky2))
-               printk(KERN_INFO PFX "%s: addr %pM\n",
-                      dev->name, dev->dev_addr);
+       netif_info(sky2, probe, dev, "addr %pM\n", dev->dev_addr);
 }
 
 /* Handle software interrupt used during MSI test */
@@ -4852,6 +4863,7 @@ static int sky2_resume(struct pci_dev *pdev)
        if (!hw)
                return 0;
 
+       rtnl_lock();
        err = pci_set_power_state(pdev, PCI_D0);
        if (err)
                goto out;
@@ -4873,7 +4885,6 @@ static int sky2_resume(struct pci_dev *pdev)
        sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
        napi_enable(&hw->napi);
 
-       rtnl_lock();
        for (i = 0; i < hw->ports; i++) {
                err = sky2_reattach(hw->dev[i]);
                if (err)
@@ -4910,7 +4921,7 @@ static struct pci_driver sky2_driver = {
 
 static int __init sky2_init_module(void)
 {
-       pr_info(PFX "driver version " DRV_VERSION "\n");
+       pr_info("driver version " DRV_VERSION "\n");
 
        sky2_debug_init();
        return pci_register_driver(&sky2_driver);