fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / net / rrunner.c
index a6d09dd..d81536f 100644 (file)
@@ -28,7 +28,6 @@
 #define RX_DMA_SKBUFF 1
 #define PKT_COPY_THRESHOLD 512
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/errno.h>
@@ -62,7 +61,7 @@ MODULE_AUTHOR("Jes Sorensen <jes@wildopensource.com>");
 MODULE_DESCRIPTION("Essential RoadRunner HIPPI driver");
 MODULE_LICENSE("GPL");
 
-static char version[] __initdata = "rrunner.c: v0.50 11/11/2002  Jes Sorensen (jes@wildopensource.com)\n";
+static char version[] __devinitdata = "rrunner.c: v0.50 11/11/2002  Jes Sorensen (jes@wildopensource.com)\n";
 
 /*
  * Implementation notes:
@@ -157,7 +156,7 @@ static int __devinit rr_init_one(struct pci_dev *pdev,
         * Remap the regs into kernel space.
         */
 
-       rrpriv->regs = (struct rr_regs *)ioremap(dev->base_addr, 0x1000);
+       rrpriv->regs = ioremap(dev->base_addr, 0x1000);
 
        if (!rrpriv->regs){
                printk(KERN_ERR "%s:  Unable to map I/O register, "
@@ -197,7 +196,8 @@ static int __devinit rr_init_one(struct pci_dev *pdev,
         * Don't access any register before this point!
         */
 #ifdef __BIG_ENDIAN
-       writel(readl(&regs->HostCtrl) | NO_SWAP, &regs->HostCtrl);
+       writel(readl(&rrpriv->regs->HostCtrl) | NO_SWAP,
+               &rrpriv->regs->HostCtrl);
 #endif
        /*
         * Need to add a case for little-endian 64-bit hosts here.
@@ -214,13 +214,13 @@ static int __devinit rr_init_one(struct pci_dev *pdev,
 
  out:
        if (rrpriv->rx_ring)
-               pci_free_consistent(pdev, RX_TOTAL_SIZE, rrpriv->rx_ring, 
+               pci_free_consistent(pdev, RX_TOTAL_SIZE, rrpriv->rx_ring,
                                    rrpriv->rx_ring_dma);
        if (rrpriv->tx_ring)
                pci_free_consistent(pdev, TX_TOTAL_SIZE, rrpriv->tx_ring,
                                    rrpriv->tx_ring_dma);
        if (rrpriv->regs)
-               iounmap(rrpriv->regs);  
+               iounmap(rrpriv->regs);
        if (pdev) {
                pci_release_regions(pdev);
                pci_set_drvdata(pdev, NULL);
@@ -266,7 +266,7 @@ static void __devexit rr_remove_one (struct pci_dev *pdev)
  */
 static void rr_issue_cmd(struct rr_private *rrpriv, struct cmd *cmd)
 {
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        u32 idx;
 
        regs = rrpriv->regs;
@@ -303,7 +303,7 @@ static void rr_issue_cmd(struct rr_private *rrpriv, struct cmd *cmd)
 static int rr_reset(struct net_device *dev)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        struct eeprom *hw = NULL;
        u32 start_pc;
        int i;
@@ -417,7 +417,7 @@ static unsigned int rr_read_eeprom(struct rr_private *rrpriv,
                                unsigned char *buf,
                                unsigned long length)
 {
-       struct rr_regs *regs = rrpriv->regs;
+       struct rr_regs __iomem *regs = rrpriv->regs;
        u32 misc, io, host, i;
 
        io = readl(&regs->ExtIo);
@@ -469,7 +469,7 @@ static unsigned int write_eeprom(struct rr_private *rrpriv,
                                 unsigned char *buf,
                                 unsigned long length)
 {
-       struct rr_regs *regs = rrpriv->regs;
+       struct rr_regs __iomem *regs = rrpriv->regs;
        u32 misc, io, data, i, j, ready, error = 0;
 
        io = readl(&regs->ExtIo);
@@ -519,7 +519,7 @@ static unsigned int write_eeprom(struct rr_private *rrpriv,
 static int __init rr_init(struct net_device *dev)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        struct eeprom *hw = NULL;
        u32 sram_size, rev;
        int i;
@@ -559,7 +559,7 @@ static int __init rr_init(struct net_device *dev)
          htons(rr_read_eeprom_word(rrpriv, &hw->manf.BoardULA));
        *(u32 *)(dev->dev_addr+2) =
          htonl(rr_read_eeprom_word(rrpriv, &hw->manf.BoardULA[4]));
-       
+
        printk("  MAC: ");
 
        for (i = 0; i < 5; i++)
@@ -588,7 +588,7 @@ static int __init rr_init(struct net_device *dev)
 static int rr_init1(struct net_device *dev)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        unsigned long myjif, flags;
        struct cmd cmd;
        u32 hostctrl;
@@ -633,7 +633,7 @@ static int rr_init1(struct net_device *dev)
        for (i = 0; i < TX_RING_ENTRIES; i++) {
                rrpriv->tx_ring[i].size = 0;
                set_rraddr(&rrpriv->tx_ring[i].addr, 0);
-               rrpriv->tx_skbuff[i] = 0;
+               rrpriv->tx_skbuff[i] = NULL;
        }
        rrpriv->info->tx_ctrl.entry_size = sizeof(struct tx_desc);
        rrpriv->info->tx_ctrl.entries = TX_RING_ENTRIES;
@@ -736,14 +736,14 @@ static int rr_init1(struct net_device *dev)
                struct sk_buff *skb = rrpriv->rx_skbuff[i];
 
                if (skb) {
-                       pci_unmap_single(rrpriv->pci_dev, 
-                                        rrpriv->rx_ring[i].addr.addrlo, 
+                       pci_unmap_single(rrpriv->pci_dev,
+                                        rrpriv->rx_ring[i].addr.addrlo,
                                         dev->mtu + HIPPI_HLEN,
                                         PCI_DMA_FROMDEVICE);
                        rrpriv->rx_ring[i].size = 0;
                        set_rraddr(&rrpriv->rx_ring[i].addr, 0);
                        dev_kfree_skb(skb);
-                       rrpriv->rx_skbuff[i] = 0;
+                       rrpriv->rx_skbuff[i] = NULL;
                }
        }
        return ecode;
@@ -758,7 +758,7 @@ static int rr_init1(struct net_device *dev)
 static u32 rr_handle_event(struct net_device *dev, u32 prodidx, u32 eidx)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        u32 tmp;
 
        rrpriv = netdev_priv(dev);
@@ -792,14 +792,14 @@ static u32 rr_handle_event(struct net_device *dev, u32 prodidx, u32 eidx)
                case E_INTERN_ERR:
                        printk(KERN_ERR "%s: HIPPI Internal NIC error\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
                case E_HOST_ERR:
                        printk(KERN_ERR "%s: Host software error\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
@@ -823,7 +823,7 @@ static u32 rr_handle_event(struct net_device *dev, u32 prodidx, u32 eidx)
                case E_INT_PRTY:
                        printk(KERN_ERR "%s: HIPPI Internal Parity error\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
@@ -835,28 +835,28 @@ static u32 rr_handle_event(struct net_device *dev, u32 prodidx, u32 eidx)
                        printk(KERN_WARNING "%s: Link lost during transmit\n",
                               dev->name);
                        rrpriv->stats.tx_aborted_errors++;
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
                case E_TX_INV_RNG:
                        printk(KERN_ERR "%s: Invalid send ring block\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
                case E_TX_INV_BUF:
                        printk(KERN_ERR "%s: Invalid send buffer address\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
                case E_TX_INV_DSC:
                        printk(KERN_ERR "%s: Invalid descriptor address\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
@@ -910,21 +910,21 @@ static u32 rr_handle_event(struct net_device *dev, u32 prodidx, u32 eidx)
                case E_RX_INV_BUF:
                        printk(KERN_ERR "%s: Invalid receive buffer "
                               "address\n", dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
                case E_RX_INV_DSC:
                        printk(KERN_ERR "%s: Invalid receive descriptor "
                               "address\n", dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
                case E_RNG_BLK:
                        printk(KERN_ERR "%s: Invalid ring block\n",
                               dev->name);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        wmb();
                        break;
@@ -961,7 +961,7 @@ static u32 rr_handle_event(struct net_device *dev, u32 prodidx, u32 eidx)
 static void rx_int(struct net_device *dev, u32 rxlimit, u32 index)
 {
        struct rr_private *rrpriv = netdev_priv(dev);
-       struct rr_regs *regs = rrpriv->regs;
+       struct rr_regs __iomem *regs = rrpriv->regs;
 
        do {
                struct rx_desc *desc;
@@ -1011,15 +1011,15 @@ static void rx_int(struct net_device *dev, u32 rxlimit, u32 index)
                                if (newskb){
                                        dma_addr_t addr;
 
-                                       pci_unmap_single(rrpriv->pci_dev, 
-                                               desc->addr.addrlo, dev->mtu + 
+                                       pci_unmap_single(rrpriv->pci_dev,
+                                               desc->addr.addrlo, dev->mtu +
                                                HIPPI_HLEN, PCI_DMA_FROMDEVICE);
                                        skb = rx_skb;
                                        skb_put(skb, pkt_len);
                                        rrpriv->rx_skbuff[index] = newskb;
-                                       addr = pci_map_single(rrpriv->pci_dev, 
-                                               newskb->data, 
-                                               dev->mtu + HIPPI_HLEN, 
+                                       addr = pci_map_single(rrpriv->pci_dev,
+                                               newskb->data,
+                                               dev->mtu + HIPPI_HLEN,
                                                PCI_DMA_FROMDEVICE);
                                        set_rraddr(&desc->addr, addr);
                                } else {
@@ -1053,10 +1053,10 @@ static void rx_int(struct net_device *dev, u32 rxlimit, u32 index)
 }
 
 
-static irqreturn_t rr_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
+static irqreturn_t rr_interrupt(int irq, void *dev_id)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        struct net_device *dev = (struct net_device *)dev_id;
        u32 prodidx, rxindex, eidx, txcsmr, rxlimit, txcon;
 
@@ -1138,11 +1138,54 @@ static irqreturn_t rr_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
        return IRQ_HANDLED;
 }
 
+static inline void rr_raz_tx(struct rr_private *rrpriv,
+                            struct net_device *dev)
+{
+       int i;
+
+       for (i = 0; i < TX_RING_ENTRIES; i++) {
+               struct sk_buff *skb = rrpriv->tx_skbuff[i];
+
+               if (skb) {
+                       struct tx_desc *desc = &(rrpriv->tx_ring[i]);
+
+                       pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo,
+                               skb->len, PCI_DMA_TODEVICE);
+                       desc->size = 0;
+                       set_rraddr(&desc->addr, 0);
+                       dev_kfree_skb(skb);
+                       rrpriv->tx_skbuff[i] = NULL;
+               }
+       }
+}
+
+
+static inline void rr_raz_rx(struct rr_private *rrpriv,
+                            struct net_device *dev)
+{
+       int i;
+
+       for (i = 0; i < RX_RING_ENTRIES; i++) {
+               struct sk_buff *skb = rrpriv->rx_skbuff[i];
+
+               if (skb) {
+                       struct rx_desc *desc = &(rrpriv->rx_ring[i]);
+
+                       pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo,
+                               dev->mtu + HIPPI_HLEN, PCI_DMA_FROMDEVICE);
+                       desc->size = 0;
+                       set_rraddr(&desc->addr, 0);
+                       dev_kfree_skb(skb);
+                       rrpriv->rx_skbuff[i] = NULL;
+               }
+       }
+}
+
 static void rr_timer(unsigned long data)
 {
        struct net_device *dev = (struct net_device *)data;
        struct rr_private *rrpriv = netdev_priv(dev);
-       struct rr_regs *regs = rrpriv->regs;
+       struct rr_regs __iomem *regs = rrpriv->regs;
        unsigned long flags;
 
        if (readl(&regs->HostCtrl) & NIC_HALTED){
@@ -1156,7 +1199,7 @@ static void rr_timer(unsigned long data)
 
                if (rr_init1(dev)) {
                        spin_lock_irqsave(&rrpriv->lock, flags);
-                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, 
+                       writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT,
                               &regs->HostCtrl);
                        spin_unlock_irqrestore(&rrpriv->lock, flags);
                }
@@ -1170,7 +1213,7 @@ static int rr_open(struct net_device *dev)
 {
        struct rr_private *rrpriv = netdev_priv(dev);
        struct pci_dev *pdev = rrpriv->pci_dev;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        int ecode = 0;
        unsigned long flags;
        dma_addr_t dma_addr;
@@ -1209,7 +1252,7 @@ static int rr_open(struct net_device *dev)
        readl(&regs->HostCtrl);
        spin_unlock_irqrestore(&rrpriv->lock, flags);
 
-       if (request_irq(dev->irq, rr_interrupt, SA_SHIRQ, dev->name, dev)) {
+       if (request_irq(dev->irq, rr_interrupt, IRQF_SHARED, dev->name, dev)) {
                printk(KERN_WARNING "%s: Requested IRQ %d is busy\n",
                       dev->name, dev->irq);
                ecode = -EAGAIN;
@@ -1248,58 +1291,15 @@ static int rr_open(struct net_device *dev)
        }
 
        netif_stop_queue(dev);
-       
-       return ecode;
-}
-
-
-static inline void rr_raz_tx(struct rr_private *rrpriv, 
-                            struct net_device *dev)
-{
-       int i;
 
-       for (i = 0; i < TX_RING_ENTRIES; i++) {
-               struct sk_buff *skb = rrpriv->tx_skbuff[i];
-
-               if (skb) {
-                       struct tx_desc *desc = &(rrpriv->tx_ring[i]);
-
-                       pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo, 
-                               skb->len, PCI_DMA_TODEVICE);
-                       desc->size = 0;
-                       set_rraddr(&desc->addr, 0);
-                       dev_kfree_skb(skb);
-                       rrpriv->tx_skbuff[i] = NULL;
-               }
-       }
+       return ecode;
 }
 
 
-static inline void rr_raz_rx(struct rr_private *rrpriv, 
-                            struct net_device *dev)
-{
-       int i;
-
-       for (i = 0; i < RX_RING_ENTRIES; i++) {
-               struct sk_buff *skb = rrpriv->rx_skbuff[i];
-
-               if (skb) {
-                       struct rx_desc *desc = &(rrpriv->rx_ring[i]);
-
-                       pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo, 
-                               dev->mtu + HIPPI_HLEN, PCI_DMA_FROMDEVICE);
-                       desc->size = 0;
-                       set_rraddr(&desc->addr, 0);
-                       dev_kfree_skb(skb);
-                       rrpriv->rx_skbuff[i] = NULL;
-               }
-       }
-}
-
 static void rr_dump(struct net_device *dev)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        u32 index, cons;
        short i;
        int len;
@@ -1335,10 +1335,10 @@ static void rr_dump(struct net_device *dev)
        if (rrpriv->tx_skbuff[cons]){
                len = min_t(int, 0x80, rrpriv->tx_skbuff[cons]->len);
                printk("skbuff for cons %i is valid - dumping data (0x%x bytes - skbuff len 0x%x)\n", cons, len, rrpriv->tx_skbuff[cons]->len);
-               printk("mode 0x%x, size 0x%x,\n phys %08x, skbuff-addr %08lx, truesize 0x%x\n",
+               printk("mode 0x%x, size 0x%x,\n phys %08Lx, skbuff-addr %08lx, truesize 0x%x\n",
                       rrpriv->tx_ring[cons].mode,
                       rrpriv->tx_ring[cons].size,
-                      rrpriv->tx_ring[cons].addr.addrlo,
+                      (unsigned long long) rrpriv->tx_ring[cons].addr.addrlo,
                       (unsigned long)rrpriv->tx_skbuff[cons]->data,
                       (unsigned int)rrpriv->tx_skbuff[cons]->truesize);
                for (i = 0; i < len; i++){
@@ -1351,10 +1351,10 @@ static void rr_dump(struct net_device *dev)
 
        printk("dumping TX ring info:\n");
        for (i = 0; i < TX_RING_ENTRIES; i++)
-               printk("mode 0x%x, size 0x%x, phys-addr %08x\n",
+               printk("mode 0x%x, size 0x%x, phys-addr %08Lx\n",
                       rrpriv->tx_ring[i].mode,
                       rrpriv->tx_ring[i].size,
-                      rrpriv->tx_ring[i].addr.addrlo);
+                      (unsigned long long) rrpriv->tx_ring[i].addr.addrlo);
 
 }
 
@@ -1362,7 +1362,7 @@ static void rr_dump(struct net_device *dev)
 static int rr_close(struct net_device *dev)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        unsigned long flags;
        u32 tmp;
        short i;
@@ -1427,7 +1427,8 @@ static int rr_close(struct net_device *dev)
 static int rr_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct rr_private *rrpriv = netdev_priv(dev);
-       struct rr_regs *regs = rrpriv->regs;
+       struct rr_regs __iomem *regs = rrpriv->regs;
+       struct hippi_cb *hcb = (struct hippi_cb *) skb->cb;
        struct ring_ctrl *txctrl;
        unsigned long flags;
        u32 index, len = skb->len;
@@ -1459,7 +1460,7 @@ static int rr_start_xmit(struct sk_buff *skb, struct net_device *dev)
        ifield = (u32 *)skb_push(skb, 8);
 
        ifield[0] = 0;
-       ifield[1] = skb->private.ifield;
+       ifield[1] = hcb->ifield;
 
        /*
         * We don't need the lock before we are actually going to start
@@ -1512,7 +1513,7 @@ static struct net_device_stats *rr_get_stats(struct net_device *dev)
 static int rr_load_firmware(struct net_device *dev)
 {
        struct rr_private *rrpriv;
-       struct rr_regs *regs;
+       struct rr_regs __iomem *regs;
        unsigned long eptr, segptr;
        int i, j;
        u32 localctrl, sptr, len, tmp;
@@ -1526,7 +1527,7 @@ static int rr_load_firmware(struct net_device *dev)
                return -EBUSY;
 
        if (!(readl(&regs->HostCtrl) & NIC_HALTED)){
-               printk("%s: Trying to load firmware to a running NIC.\n", 
+               printk("%s: Trying to load firmware to a running NIC.\n",
                       dev->name);
                return -EBUSY;
        }
@@ -1659,7 +1660,7 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
        gf_out:
                kfree(image);
                return error;
-               
+
        case SIOCRRPFW:
                if (!capable(CAP_SYS_RAWIO)){
                        return -EPERM;
@@ -1708,14 +1709,12 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        error = -EFAULT;
                }
        wf_out:
-               if (oldimage)
-                       kfree(oldimage);
-               if (image)
-                       kfree(image);
+               kfree(oldimage);
+               kfree(image);
                return error;
-               
+
        case SIOCRRID:
-               return put_user(0x52523032, (int *)(&rq->ifr_data[0]));
+               return put_user(0x52523032, (int __user *)rq->ifr_data);
        default:
                return error;
        }
@@ -1737,7 +1736,7 @@ static struct pci_driver rr_driver = {
 
 static int __init rr_init_module(void)
 {
-       return pci_module_init(&rr_driver);
+       return pci_register_driver(&rr_driver);
 }
 
 static void __exit rr_cleanup_module(void)