ixgbe: Refactor common code between 82598 & 82599 to accommodate new hardware
[safe/jmp/linux-2.6] / drivers / net / ks8851_mll.c
index 0be14d7..2e2c69b 100644 (file)
@@ -21,6 +21,8 @@
  * KS8851 16bit MLL chip from Micrel Inc.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
@@ -31,6 +33,7 @@
 #include <linux/mii.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
+#include <linux/slab.h>
 
 #define        DRV_NAME        "ks8851_mll"
 
@@ -360,7 +363,6 @@ static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
 
 #define MAX_MCAST_LST                  32
 #define HW_MCAST_SIZE                  8
-#define MAC_ADDR_LEN                   6
 
 /**
  * union ks_tx_hdr - tx header data
@@ -448,7 +450,7 @@ struct ks_net {
        u16                     promiscuous;
        u16                     all_mcast;
        u16                     mcast_lst_size;
-       u8                      mcast_lst[MAX_MCAST_LST][MAC_ADDR_LEN];
+       u8                      mcast_lst[MAX_MCAST_LST][ETH_ALEN];
        u8                      mcast_bits[HW_MCAST_SIZE];
        u8                      mac_addr[6];
        u8                      fid;
@@ -458,11 +460,6 @@ struct ks_net {
 
 static int msg_enable;
 
-#define ks_info(_ks, _msg...) dev_info(&(_ks)->pdev->dev, _msg)
-#define ks_warn(_ks, _msg...) dev_warn(&(_ks)->pdev->dev, _msg)
-#define ks_dbg(_ks, _msg...) dev_dbg(&(_ks)->pdev->dev, _msg)
-#define ks_err(_ks, _msg...) dev_err(&(_ks)->pdev->dev, _msg)
-
 #define BE3             0x8000      /* Byte Enable 3 */
 #define BE2             0x4000      /* Byte Enable 2 */
 #define BE1             0x2000      /* Byte Enable 1 */
@@ -568,6 +565,16 @@ static inline void ks_outblk(struct ks_net *ks, u16 *wptr, u32 len)
                iowrite16(*wptr++, ks->hw_addr);
 }
 
+static void ks_disable_int(struct ks_net *ks)
+{
+       ks_wrreg16(ks, KS_IER, 0x0000);
+}  /* ks_disable_int */
+
+static void ks_enable_int(struct ks_net *ks)
+{
+       ks_wrreg16(ks, KS_IER, ks->rc_ier);
+}  /* ks_enable_int */
+
 /**
  * ks_tx_fifo_space - return the available hardware buffer size.
  * @ks: The chip information
@@ -614,8 +621,7 @@ static void ks_set_powermode(struct ks_net *ks, unsigned pwrmode)
 {
        unsigned pmecr;
 
-       if (netif_msg_hw(ks))
-               ks_dbg(ks, "setting power mode %d\n", pwrmode);
+       netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
 
        ks_rdreg16(ks, KS_GRR);
        pmecr = ks_rdreg16(ks, KS_PMECR);
@@ -681,6 +687,47 @@ static void ks_soft_reset(struct ks_net *ks, unsigned op)
 }
 
 
+void ks_enable_qmu(struct ks_net *ks)
+{
+       u16 w;
+
+       w = ks_rdreg16(ks, KS_TXCR);
+       /* Enables QMU Transmit (TXCR). */
+       ks_wrreg16(ks, KS_TXCR, w | TXCR_TXE);
+
+       /*
+        * RX Frame Count Threshold Enable and Auto-Dequeue RXQ Frame
+        * Enable
+        */
+
+       w = ks_rdreg16(ks, KS_RXQCR);
+       ks_wrreg16(ks, KS_RXQCR, w | RXQCR_RXFCTE);
+
+       /* Enables QMU Receive (RXCR1). */
+       w = ks_rdreg16(ks, KS_RXCR1);
+       ks_wrreg16(ks, KS_RXCR1, w | RXCR1_RXE);
+       ks->enabled = true;
+}  /* ks_enable_qmu */
+
+static void ks_disable_qmu(struct ks_net *ks)
+{
+       u16     w;
+
+       w = ks_rdreg16(ks, KS_TXCR);
+
+       /* Disables QMU Transmit (TXCR). */
+       w  &= ~TXCR_TXE;
+       ks_wrreg16(ks, KS_TXCR, w);
+
+       /* Disables QMU Receive (RXCR1). */
+       w = ks_rdreg16(ks, KS_RXCR1);
+       w &= ~RXCR1_RXE ;
+       ks_wrreg16(ks, KS_RXCR1, w);
+
+       ks->enabled = false;
+
+}  /* ks_disable_qmu */
+
 /**
  * ks_read_qmu - read 1 pkt data from the QMU.
  * @ks: The chip information
@@ -752,13 +799,12 @@ static void ks_rcv(struct ks_net *ks, struct net_device *netdev)
                        (frame_hdr->len < RX_BUF_SIZE) && frame_hdr->len)) {
                        skb_reserve(skb, 2);
                        /* read data block including CRC 4 bytes */
-                       ks_read_qmu(ks, (u16 *)skb->data, frame_hdr->len + 4);
+                       ks_read_qmu(ks, (u16 *)skb->data, frame_hdr->len);
                        skb_put(skb, frame_hdr->len);
-                       skb->dev = netdev;
                        skb->protocol = eth_type_trans(skb, netdev);
                        netif_rx(skb);
                } else {
-                       printk(KERN_ERR "%s: err:skb alloc\n", __func__);
+                       pr_err("%s: err:skb alloc\n", __func__);
                        ks_wrreg16(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_RRXEF));
                        if (skb)
                                dev_kfree_skb_irq(skb);
@@ -785,9 +831,8 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks)
                netif_carrier_off(netdev);
                link_up_status = false;
        }
-       if (netif_msg_link(ks))
-               ks_dbg(ks, "%s: %s\n",
-                       __func__, link_up_status ? "UP" : "DOWN");
+       netif_dbg(ks, link, ks->netdev,
+                 "%s: %s\n", __func__, link_up_status ? "UP" : "DOWN");
 }
 
 /**
@@ -803,8 +848,8 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks)
 
 static irqreturn_t ks_irq(int irq, void *pw)
 {
-       struct ks_net *ks = pw;
-       struct net_device *netdev = ks->netdev;
+       struct net_device *netdev = pw;
+       struct ks_net *ks = netdev_priv(netdev);
        u16 status;
 
        /*this should be the first in IRQ handler */
@@ -857,20 +902,26 @@ static int ks_net_open(struct net_device *netdev)
         * else at the moment.
         */
 
-       if (netif_msg_ifup(ks))
-               ks_dbg(ks, "%s - entry\n", __func__);
+       netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__);
 
        /* reset the HW */
-       err = request_irq(ks->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, ks);
+       err = request_irq(ks->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev);
 
        if (err) {
-               printk(KERN_ERR "Failed to request IRQ: %d: %d\n",
-                       ks->irq, err);
+               pr_err("Failed to request IRQ: %d: %d\n", ks->irq, err);
                return err;
        }
 
-       if (netif_msg_ifup(ks))
-               ks_dbg(ks, "network device %s up\n", netdev->name);
+       /* wake up powermode to normal mode */
+       ks_set_powermode(ks, PMECR_PM_NORMAL);
+       mdelay(1);      /* wait for normal mode to take effect */
+
+       ks_wrreg16(ks, KS_ISR, 0xffff);
+       ks_enable_int(ks);
+       ks_enable_qmu(ks);
+       netif_start_queue(ks->netdev);
+
+       netif_dbg(ks, ifup, ks->netdev, "network device up\n");
 
        return 0;
 }
@@ -887,24 +938,18 @@ static int ks_net_stop(struct net_device *netdev)
 {
        struct ks_net *ks = netdev_priv(netdev);
 
-       if (netif_msg_ifdown(ks))
-               ks_info(ks, "%s: shutting down\n", netdev->name);
+       netif_info(ks, ifdown, netdev, "shutting down\n");
 
        netif_stop_queue(netdev);
 
-       kfree(ks->frame_head_info);
-
        mutex_lock(&ks->lock);
 
        /* turn off the IRQs and ack any outstanding */
        ks_wrreg16(ks, KS_IER, 0x0000);
        ks_wrreg16(ks, KS_ISR, 0xffff);
 
-       /* shutdown RX process */
-       ks_wrreg16(ks, KS_RXCR1, 0x0000);
-
-       /* shutdown TX process */
-       ks_wrreg16(ks, KS_TXCR, 0x0000);
+       /* shutdown RX/TX QMU */
+       ks_disable_qmu(ks);
 
        /* set powermode to soft power down to save power */
        ks_set_powermode(ks, PMECR_PM_SOFTDOWN);
@@ -929,17 +974,8 @@ static int ks_net_stop(struct net_device *netdev)
  */
 static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len)
 {
-       unsigned fid = ks->fid;
-
-       fid = ks->fid;
-       ks->fid = (ks->fid + 1) & TXFR_TXFID_MASK;
-
-       /* reduce the tx interrupt occurrances. */
-       if (!fid)
-               fid |= TXFR_TXIC;       /* irq on completion */
-
        /* start header at txb[0] to align txw entries */
-       ks->txh.txw[0] = cpu_to_le16(fid);
+       ks->txh.txw[0] = 0;
        ks->txh.txw[1] = cpu_to_le16(len);
 
        /* 1. set sudo-DMA mode */
@@ -957,16 +993,6 @@ static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len)
                ;
 }
 
-static void ks_disable_int(struct ks_net *ks)
-{
-       ks_wrreg16(ks, KS_IER, 0x0000);
-}  /* ks_disable_int */
-
-static void ks_enable_int(struct ks_net *ks)
-{
-       ks_wrreg16(ks, KS_IER, ks->rc_ier);
-}  /* ks_enable_int */
-
 /**
  * ks_start_xmit - transmit packet
  * @skb                : The buffer to transmit
@@ -1144,7 +1170,7 @@ static void ks_set_mcast(struct ks_net *ks, u16 mcast)
 static void ks_set_rx_mode(struct net_device *netdev)
 {
        struct ks_net *ks = netdev_priv(netdev);
-       struct dev_mc_list *ptr;
+       struct netdev_hw_addr *ha;
 
        /* Turn on/off promiscuous mode. */
        if ((netdev->flags & IFF_PROMISC) == IFF_PROMISC)
@@ -1157,16 +1183,16 @@ static void ks_set_rx_mode(struct net_device *netdev)
        else
                ks_set_promis(ks, false);
 
-       if ((netdev->flags & IFF_MULTICAST) && netdev->mc_count) {
-               if (netdev->mc_count <= MAX_MCAST_LST) {
+       if ((netdev->flags & IFF_MULTICAST) && netdev_mc_count(netdev)) {
+               if (netdev_mc_count(netdev) <= MAX_MCAST_LST) {
                        int i = 0;
-                       for (ptr = netdev->mc_list; ptr; ptr = ptr->next) {
-                               if (!(*ptr->dmi_addr & 1))
+
+                       netdev_for_each_mc_addr(ha, netdev) {
+                               if (!(*ha->addr & 1))
                                        continue;
                                if (i >= MAX_MCAST_LST)
                                        break;
-                               memcpy(ks->mcast_lst[i++], ptr->dmi_addr,
-                               MAC_ADDR_LEN);
+                               memcpy(ks->mcast_lst[i++], ha->addr, ETH_ALEN);
                        }
                        ks->mcast_lst_size = (u8)i;
                        ks_set_grpaddr(ks);
@@ -1392,43 +1418,24 @@ static int ks_read_selftest(struct ks_net *ks)
        rd = ks_rdreg16(ks, KS_MBIR);
 
        if ((rd & both_done) != both_done) {
-               ks_warn(ks, "Memory selftest not finished\n");
+               netdev_warn(ks->netdev, "Memory selftest not finished\n");
                return 0;
        }
 
        if (rd & MBIR_TXMBFA) {
-               ks_err(ks, "TX memory selftest fails\n");
+               netdev_err(ks->netdev, "TX memory selftest fails\n");
                ret |= 1;
        }
 
        if (rd & MBIR_RXMBFA) {
-               ks_err(ks, "RX memory selftest fails\n");
+               netdev_err(ks->netdev, "RX memory selftest fails\n");
                ret |= 2;
        }
 
-       ks_info(ks, "the selftest passes\n");
+       netdev_info(ks->netdev, "the selftest passes\n");
        return ret;
 }
 
-static void ks_disable(struct ks_net *ks)
-{
-       u16     w;
-
-       w = ks_rdreg16(ks, KS_TXCR);
-
-       /* Disables QMU Transmit (TXCR). */
-       w  &= ~TXCR_TXE;
-       ks_wrreg16(ks, KS_TXCR, w);
-
-       /* Disables QMU Receive (RXCR1). */
-       w = ks_rdreg16(ks, KS_RXCR1);
-       w &= ~RXCR1_RXE ;
-       ks_wrreg16(ks, KS_RXCR1, w);
-
-       ks->enabled = false;
-
-}  /* ks_disable */
-
 static void ks_setup(struct ks_net *ks)
 {
        u16     w;
@@ -1463,7 +1470,7 @@ static void ks_setup(struct ks_net *ks)
        w = TXCR_TXFCE | TXCR_TXPE | TXCR_TXCRC | TXCR_TCGIP;
        ks_wrreg16(ks, KS_TXCR, w);
 
-       w = RXCR1_RXFCE | RXCR1_RXBE | RXCR1_RXUE;
+       w = RXCR1_RXFCE | RXCR1_RXBE | RXCR1_RXUE | RXCR1_RXME | RXCR1_RXIPFCC;
 
        if (ks->promiscuous)         /* bPromiscuous */
                w |= (RXCR1_RXAE | RXCR1_RXINVF);
@@ -1486,28 +1493,6 @@ static void ks_setup_int(struct ks_net *ks)
        ks->rc_ier = (IRQ_LCI | IRQ_TXI | IRQ_RXI);
 }  /* ks_setup_int */
 
-void ks_enable(struct ks_net *ks)
-{
-       u16 w;
-
-       w = ks_rdreg16(ks, KS_TXCR);
-       /* Enables QMU Transmit (TXCR). */
-       ks_wrreg16(ks, KS_TXCR, w | TXCR_TXE);
-
-       /*
-        * RX Frame Count Threshold Enable and Auto-Dequeue RXQ Frame
-        * Enable
-        */
-
-       w = ks_rdreg16(ks, KS_RXQCR);
-       ks_wrreg16(ks, KS_RXQCR, w | RXQCR_RXFCTE);
-
-       /* Enables QMU Receive (RXCR1). */
-       w = ks_rdreg16(ks, KS_RXCR1);
-       ks_wrreg16(ks, KS_RXCR1, w | RXCR1_RXE);
-       ks->enabled = true;
-}  /* ks_enable */
-
 static int ks_hw_init(struct ks_net *ks)
 {
 #define        MHEADER_SIZE    (sizeof(struct type_frame_head) * MAX_RECV_FRAMES)
@@ -1518,7 +1503,7 @@ static int ks_hw_init(struct ks_net *ks)
        ks->frame_head_info = (struct type_frame_head *) \
                kmalloc(MHEADER_SIZE, GFP_KERNEL);
        if (!ks->frame_head_info) {
-               printk(KERN_ERR "Error: Fail to allocate frame memory\n");
+               pr_err("Error: Fail to allocate frame memory\n");
                return false;
        }
 
@@ -1584,7 +1569,7 @@ static int __devinit ks8851_probe(struct platform_device *pdev)
        ks->mii.mdio_read       = ks_phy_read;
        ks->mii.mdio_write      = ks_phy_write;
 
-       ks_info(ks, "message enable is %d\n", msg_enable);
+       netdev_info(netdev, "message enable is %d\n", msg_enable);
        /* set the default message enable */
        ks->msg_enable = netif_msg_init(msg_enable, (NETIF_MSG_DRV |
                                                     NETIF_MSG_PROBE |
@@ -1593,13 +1578,13 @@ static int __devinit ks8851_probe(struct platform_device *pdev)
 
        /* simple check for a valid chip being connected to the bus */
        if ((ks_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) {
-               ks_err(ks, "failed to read device ID\n");
+               netdev_err(netdev, "failed to read device ID\n");
                err = -ENODEV;
                goto err_register;
        }
 
        if (ks_read_selftest(ks)) {
-               ks_err(ks, "failed to read device ID\n");
+               netdev_err(netdev, "failed to read device ID\n");
                err = -ENODEV;
                goto err_register;
        }
@@ -1612,11 +1597,9 @@ static int __devinit ks8851_probe(struct platform_device *pdev)
 
        ks_soft_reset(ks, GRR_GSR);
        ks_hw_init(ks);
-       ks_disable(ks);
+       ks_disable_qmu(ks);
        ks_setup(ks);
        ks_setup_int(ks);
-       ks_enable_int(ks);
-       ks_enable(ks);
        memcpy(netdev->dev_addr, ks->mac_addr, 6);
 
        data = ks_rdreg16(ks, KS_OBCR);
@@ -1632,9 +1615,8 @@ static int __devinit ks8851_probe(struct platform_device *pdev)
 
        id = ks_rdreg16(ks, KS_CIDER);
 
-       printk(KERN_INFO DRV_NAME
-               " Found chip, family: 0x%x, id: 0x%x, rev: 0x%x\n",
-               (id >> 8) & 0xff, (id >> 4) & 0xf, (id >> 1) & 0x7);
+       netdev_info(netdev, "Found chip, family: 0x%x, id: 0x%x, rev: 0x%x\n",
+                   (id >> 8) & 0xff, (id >> 4) & 0xf, (id >> 1) & 0x7);
        return 0;
 
 err_register:
@@ -1658,6 +1640,7 @@ static int __devexit ks8851_remove(struct platform_device *pdev)
        struct ks_net *ks = netdev_priv(netdev);
        struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
+       kfree(ks->frame_head_info);
        unregister_netdev(netdev);
        iounmap(ks->hw_addr);
        free_netdev(netdev);