SUNRPC: rpc_pipefs cleanup
[safe/jmp/linux-2.6] / drivers / net / tehuti.c
index 21230c9..3c2679c 100644 (file)
@@ -63,7 +63,6 @@
  */
 
 #include "tehuti.h"
-#include "tehuti_fw.h"
 
 static struct pci_device_id __devinitdata bdx_pci_tbl[] = {
        {0x1FC9, 0x3009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
@@ -251,7 +250,7 @@ static void bdx_isr_extra(struct bdx_priv *priv, u32 isr)
 static irqreturn_t bdx_isr_napi(int irq, void *dev)
 {
        struct net_device *ndev = dev;
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
        u32 isr;
 
        ENTER;
@@ -265,8 +264,8 @@ static irqreturn_t bdx_isr_napi(int irq, void *dev)
                bdx_isr_extra(priv, isr);
 
        if (isr & (IR_RX_DESC_0 | IR_TX_FREE_0)) {
-               if (likely(netif_rx_schedule_prep(ndev, &priv->napi))) {
-                       __netif_rx_schedule(ndev, &priv->napi);
+               if (likely(napi_schedule_prep(&priv->napi))) {
+                       __napi_schedule(&priv->napi);
                        RET(IRQ_HANDLED);
                } else {
                        /* NOTE: we get here if intr has slipped into window
@@ -289,7 +288,6 @@ static irqreturn_t bdx_isr_napi(int irq, void *dev)
 static int bdx_poll(struct napi_struct *napi, int budget)
 {
        struct bdx_priv *priv = container_of(napi, struct bdx_priv, napi);
-       struct net_device *dev = priv->ndev;
        int work_done;
 
        ENTER;
@@ -303,7 +301,7 @@ static int bdx_poll(struct napi_struct *napi, int budget)
                 * device lock and allow waiting tasks (eg rmmod) to advance) */
                priv->napi_stop = 0;
 
-               netif_rx_complete(dev, napi);
+               napi_complete(napi);
                bdx_enable_interrupts(priv);
        }
        return work_done;
@@ -319,28 +317,41 @@ static int bdx_poll(struct napi_struct *napi, int budget)
 
 static int bdx_fw_load(struct bdx_priv *priv)
 {
+       const struct firmware *fw = NULL;
        int master, i;
+       int rc;
 
        ENTER;
        master = READ_REG(priv, regINIT_SEMAPHORE);
        if (!READ_REG(priv, regINIT_STATUS) && master) {
-               bdx_tx_push_desc_safe(priv, s_firmLoad, sizeof(s_firmLoad));
+               rc = request_firmware(&fw, "tehuti/firmware.bin", &priv->pdev->dev);
+               if (rc)
+                       goto out;
+               bdx_tx_push_desc_safe(priv, (char *)fw->data, fw->size);
                mdelay(100);
        }
        for (i = 0; i < 200; i++) {
-               if (READ_REG(priv, regINIT_STATUS))
-                       break;
+               if (READ_REG(priv, regINIT_STATUS)) {
+                       rc = 0;
+                       goto out;
+               }
                mdelay(2);
        }
+       rc = -EIO;
+out:
        if (master)
                WRITE_REG(priv, regINIT_SEMAPHORE, 1);
+       if (fw)
+               release_firmware(fw);
 
-       if (i == 200) {
+       if (rc) {
                ERR("%s: firmware loading failed\n", priv->ndev->name);
-               DBG("VPC = 0x%x VIC = 0x%x INIT_STATUS = 0x%x i=%d\n",
-                   READ_REG(priv, regVPC),
-                   READ_REG(priv, regVIC), READ_REG(priv, regINIT_STATUS), i);
-               RET(-EIO);
+               if (rc == -EIO)
+                       DBG("VPC = 0x%x VIC = 0x%x INIT_STATUS = 0x%x i=%d\n",
+                           READ_REG(priv, regVPC),
+                           READ_REG(priv, regVIC),
+                           READ_REG(priv, regINIT_STATUS), i);
+               RET(rc);
        } else {
                DBG("%s: firmware loading success\n", priv->ndev->name);
                RET(0);
@@ -559,7 +570,7 @@ static int bdx_close(struct net_device *ndev)
        struct bdx_priv *priv = NULL;
 
        ENTER;
-       priv = ndev->priv;
+       priv = netdev_priv(ndev);
 
        napi_disable(&priv->napi);
 
@@ -588,7 +599,7 @@ static int bdx_open(struct net_device *ndev)
        int rc;
 
        ENTER;
-       priv = ndev->priv;
+       priv = netdev_priv(ndev);
        bdx_reset(priv);
        if (netif_running(ndev))
                netif_stop_queue(priv->ndev);
@@ -618,16 +629,15 @@ err:
        RET(rc);
 }
 
-static void __init bdx_firmware_endianess(void)
+static int bdx_range_check(struct bdx_priv *priv, u32 offset)
 {
-       int i;
-       for (i = 0; i < sizeof(s_firmLoad) / sizeof(u32); i++)
-               s_firmLoad[i] = CPU_CHIP_SWAP32(s_firmLoad[i]);
+       return (offset > (u32) (BDX_REGS_SIZE / priv->nic->port_num)) ?
+               -EINVAL : 0;
 }
 
 static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
        u32 data[3];
        int error;
 
@@ -643,9 +653,15 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd)
                DBG("%d 0x%x 0x%x\n", data[0], data[1], data[2]);
        }
 
+       if (!capable(CAP_SYS_RAWIO))
+               return -EPERM;
+
        switch (data[0]) {
 
        case BDX_OP_READ:
+               error = bdx_range_check(priv, data[1]);
+               if (error < 0)
+                       return error;
                data[2] = READ_REG(priv, data[1]);
                DBG("read_reg(0x%x)=0x%x (dec %d)\n", data[1], data[2],
                    data[2]);
@@ -655,6 +671,9 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd)
                break;
 
        case BDX_OP_WRITE:
+               error = bdx_range_check(priv, data[1]);
+               if (error < 0)
+                       return error;
                WRITE_REG(priv, data[1], data[2]);
                DBG("write_reg(0x%x, 0x%x)\n", data[1], data[2]);
                break;
@@ -683,7 +702,7 @@ static int bdx_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
  */
 static void __bdx_vlan_rx_vid(struct net_device *ndev, uint16_t vid, int enable)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
        u32 reg, bit, val;
 
        ENTER;
@@ -733,7 +752,7 @@ static void bdx_vlan_rx_kill_vid(struct net_device *ndev, unsigned short vid)
 static void
 bdx_vlan_rx_register(struct net_device *ndev, struct vlan_group *grp)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
 
        ENTER;
        DBG("device='%s', group='%p'\n", ndev->name, grp);
@@ -772,7 +791,7 @@ static int bdx_change_mtu(struct net_device *ndev, int new_mtu)
 
 static void bdx_setmulti(struct net_device *ndev)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
 
        u32 rxf_val =
            GMAC_RX_FILTER_AM | GMAC_RX_FILTER_AB | GMAC_RX_FILTER_OSEN;
@@ -832,7 +851,7 @@ static void bdx_setmulti(struct net_device *ndev)
 
 static int bdx_set_mac(struct net_device *ndev, void *p)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
        struct sockaddr *addr = p;
 
        ENTER;
@@ -914,7 +933,7 @@ static void bdx_update_stats(struct bdx_priv *priv)
 
 static struct net_device_stats *bdx_get_stats(struct net_device *ndev)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
        struct net_device_stats *net_stat = &priv->net_stats;
        return net_stat;
 }
@@ -929,8 +948,7 @@ static void print_rxfd(struct rxf_desc *rxfd);
 
 static void bdx_rxdb_destroy(struct rxdb *db)
 {
-       if (db)
-               vfree(db);
+       vfree(db);
 }
 
 static struct rxdb *bdx_rxdb_create(int nelem)
@@ -990,7 +1008,7 @@ static inline void bdx_rxdb_free_elem(struct rxdb *db, int n)
  * skb for rx. It assumes that Rx is desabled in HW
  * funcs are grouped for better cache usage
  *
- * RxD fifo is smaller then RxF fifo by design. Upon high load, RxD will be
+ * RxD fifo is smaller than RxF fifo by design. Upon high load, RxD will be
  * filled and packets will be dropped by nic without getting into host or
  * cousing interrupt. Anyway, in that condition, host has no chance to proccess
  * all packets, but dropping in nic is cheaper, since it takes 0 cpu cycles
@@ -1150,7 +1168,7 @@ NETIF_RX_MUX(struct bdx_priv *priv, u32 rxd_val1, u16 rxd_vlan,
                                          GET_RXD_VLAN_ID(rxd_vlan))->name);
                /* NAPI variant of receive functions */
                vlan_hwaccel_receive_skb(skb, priv->vlgrp,
-                                        GET_RXD_VLAN_ID(rxd_vlan));
+                                        GET_RXD_VLAN_TCI(rxd_vlan));
        } else {
                netif_receive_skb(skb);
        }
@@ -1222,7 +1240,6 @@ static int bdx_rx_receive(struct bdx_priv *priv, struct rxd_fifo *f, int budget)
        ENTER;
        max_done = budget;
 
-       priv->ndev->last_rx = jiffies;
        f->m.wptr = READ_REG(priv, f->m.reg_WPTR) & TXF_WPTR_WR_PTR;
 
        size = f->m.wptr - f->m.rptr;
@@ -1464,10 +1481,8 @@ static void bdx_tx_db_close(struct txdb *d)
 {
        BDX_ASSERT(d == NULL);
 
-       if (d->start) {
-               vfree(d->start);
-               d->start = NULL;
-       }
+       vfree(d->start);
+       d->start = NULL;
 }
 
 /*************************************************************************
@@ -1609,7 +1624,7 @@ static inline int bdx_tx_space(struct bdx_priv *priv)
  */
 static int bdx_tx_transmit(struct sk_buff *skb, struct net_device *ndev)
 {
-       struct bdx_priv *priv = ndev->priv;
+       struct bdx_priv *priv = netdev_priv(ndev);
        struct txd_fifo *f = &priv->txd_fifo0;
        int txd_checksum = 7;   /* full checksum */
        int txd_lgsnd = 0;
@@ -1700,8 +1715,9 @@ static int bdx_tx_transmit(struct sk_buff *skb, struct net_device *ndev)
        WRITE_REG(priv, f->m.reg_WPTR, f->m.wptr & TXF_WPTR_WR_PTR);
 
 #endif
-       ndev->trans_start = jiffies;
-
+#ifdef BDX_LLTX
+       ndev->trans_start = jiffies; /* NETIF_F_LLTX driver :( */
+#endif
        priv->net_stats.tx_packets++;
        priv->net_stats.tx_bytes += skb->len;
 
@@ -1813,7 +1829,7 @@ static void bdx_tx_free(struct bdx_priv *priv)
  *
  * Pushes desc to TxD fifo and overlaps it if needed.
  * NOTE: this func does not check for available space. this is responsibility
- *    of the caller. Neither does it check that data size is smaller then
+ *    of the caller. Neither does it check that data size is smaller than
  *    fifo size.
  */
 static void bdx_tx_push_desc(struct bdx_priv *priv, void *data, int size)
@@ -1871,6 +1887,21 @@ static void bdx_tx_push_desc_safe(struct bdx_priv *priv, void *data, int size)
        RET();
 }
 
+static const struct net_device_ops bdx_netdev_ops = {
+       .ndo_open               = bdx_open,
+       .ndo_stop               = bdx_close,
+       .ndo_start_xmit         = bdx_tx_transmit,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_do_ioctl           = bdx_ioctl,
+       .ndo_set_multicast_list = bdx_setmulti,
+       .ndo_get_stats          = bdx_get_stats,
+       .ndo_change_mtu         = bdx_change_mtu,
+       .ndo_set_mac_address    = bdx_set_mac,
+       .ndo_vlan_rx_register   = bdx_vlan_rx_register,
+       .ndo_vlan_rx_add_vid    = bdx_vlan_rx_add_vid,
+       .ndo_vlan_rx_kill_vid   = bdx_vlan_rx_kill_vid,
+};
+
 /**
  * bdx_probe - Device Initialization Routine
  * @pdev: PCI device information struct
@@ -1908,12 +1939,12 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if ((err = pci_enable_device(pdev)))    /* it trigers interrupt, dunno why. */
                goto err_pci;                   /* it's not a problem though */
 
-       if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) &&
-           !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) {
+       if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) &&
+           !(err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))) {
                pci_using_dac = 1;
        } else {
-               if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) ||
-                   (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) {
+               if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) ||
+                   (err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                        printk(KERN_ERR "tehuti: No usable DMA configuration"
                                        ", aborting\n");
                        goto err_dma;
@@ -1980,18 +2011,8 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        goto err_out_iomap;
                }
 
-               ndev->open = bdx_open;
-               ndev->stop = bdx_close;
-               ndev->hard_start_xmit = bdx_tx_transmit;
-               ndev->do_ioctl = bdx_ioctl;
-               ndev->set_multicast_list = bdx_setmulti;
-               ndev->get_stats = bdx_get_stats;
-               ndev->change_mtu = bdx_change_mtu;
-               ndev->set_mac_address = bdx_set_mac;
+               ndev->netdev_ops = &bdx_netdev_ops;
                ndev->tx_queue_len = BDX_NDEV_TXQ_LEN;
-               ndev->vlan_rx_register = bdx_vlan_rx_register;
-               ndev->vlan_rx_add_vid = bdx_vlan_rx_add_vid;
-               ndev->vlan_rx_kill_vid = bdx_vlan_rx_kill_vid;
 
                bdx_ethtool_ops(ndev);  /* ethtool interface */
 
@@ -2012,7 +2033,7 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        ndev->features |= NETIF_F_HIGHDMA;
 
        /************** priv ****************/
-               priv = nic->priv[port] = ndev->priv;
+               priv = nic->priv[port] = netdev_priv(ndev);
 
                memset(priv, 0, sizeof(struct bdx_priv));
                priv->pBdxRegs = nic->regs + port * 0x8000;
@@ -2135,7 +2156,7 @@ static int bdx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
 {
        u32 rdintcm;
        u32 tdintcm;
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
 
        rdintcm = priv->rdintcm;
        tdintcm = priv->tdintcm;
@@ -2166,7 +2187,7 @@ static int bdx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
 static void
 bdx_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
 {
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
 
        strlcat(drvinfo->driver, BDX_DRV_NAME, sizeof(drvinfo->driver));
        strlcat(drvinfo->version, BDX_DRV_VERSION, sizeof(drvinfo->version));
@@ -2174,8 +2195,7 @@ bdx_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
        strlcat(drvinfo->bus_info, pci_name(priv->pdev),
                sizeof(drvinfo->bus_info));
 
-       drvinfo->n_stats = ((priv->stats_flag) ?
-                           (sizeof(bdx_stat_names) / ETH_GSTRING_LEN) : 0);
+       drvinfo->n_stats = ((priv->stats_flag) ? ARRAY_SIZE(bdx_stat_names) : 0);
        drvinfo->testinfo_len = 0;
        drvinfo->regdump_len = 0;
        drvinfo->eedump_len = 0;
@@ -2209,7 +2229,7 @@ bdx_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecoal)
 {
        u32 rdintcm;
        u32 tdintcm;
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
 
        rdintcm = priv->rdintcm;
        tdintcm = priv->tdintcm;
@@ -2238,7 +2258,7 @@ bdx_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecoal)
 {
        u32 rdintcm;
        u32 tdintcm;
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
        int rx_coal;
        int tx_coal;
        int rx_max_coal;
@@ -2296,7 +2316,7 @@ static inline int bdx_tx_fifo_size_to_packets(int tx_size)
 static void
 bdx_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
 {
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
 
        /*max_pending - the maximum-sized FIFO we allow */
        ring->rx_max_pending = bdx_rx_fifo_size_to_packets(3);
@@ -2313,7 +2333,7 @@ bdx_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
 static int
 bdx_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
 {
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
        int rx_size = 0;
        int tx_size = 0;
 
@@ -2374,11 +2394,10 @@ static void bdx_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
  */
 static int bdx_get_stats_count(struct net_device *netdev)
 {
-       struct bdx_priv *priv = netdev->priv;
-       BDX_ASSERT(sizeof(bdx_stat_names) / ETH_GSTRING_LEN
+       struct bdx_priv *priv = netdev_priv(netdev);
+       BDX_ASSERT(ARRAY_SIZE(bdx_stat_names)
                   != sizeof(struct bdx_stats) / sizeof(u64));
-       return ((priv->stats_flag) ? (sizeof(bdx_stat_names) / ETH_GSTRING_LEN)
-               : 0);
+       return ((priv->stats_flag) ? ARRAY_SIZE(bdx_stat_names) : 0);
 }
 
 /*
@@ -2390,7 +2409,7 @@ static int bdx_get_stats_count(struct net_device *netdev)
 static void bdx_get_ethtool_stats(struct net_device *netdev,
                                  struct ethtool_stats *stats, u64 *data)
 {
-       struct bdx_priv *priv = netdev->priv;
+       struct bdx_priv *priv = netdev_priv(netdev);
 
        if (priv->stats_flag) {
 
@@ -2485,7 +2504,6 @@ static void __init print_driver_id(void)
 static int __init bdx_module_init(void)
 {
        ENTER;
-       bdx_firmware_endianess();
        init_txd_sizes();
        print_driver_id();
        RET(pci_register_driver(&bdx_pci_driver));
@@ -2505,3 +2523,4 @@ module_exit(bdx_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(BDX_DRV_DESC);
+MODULE_FIRMWARE("tehuti/firmware.bin");