Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / net / rrunner.c
index d773145..19c2df9 100644 (file)
@@ -62,7 +62,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 +157,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 +197,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.
@@ -266,7 +267,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 +304,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 +418,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 +470,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 +520,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;
@@ -588,7 +589,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 +634,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;
@@ -743,7 +744,7 @@ static int rr_init1(struct net_device *dev)
                        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 +759,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);
@@ -961,7 +962,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;
@@ -1056,7 +1057,7 @@ 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)
 {
        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 +1139,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){
@@ -1170,7 +1214,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;
@@ -1253,53 +1297,10 @@ static int rr_open(struct net_device *dev)
 }
 
 
-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_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 +1336,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 +1352,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 +1363,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 +1428,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 +1461,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 +1514,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;
@@ -1708,10 +1710,8 @@ 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: