X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fnet%2Frrunner.c;h=d81536f90df62e10aefd98e83f597f663e5d925c;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=a6d09dd831479544e45837e8e3515b2ea0c1fce8;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/net/rrunner.c b/drivers/net/rrunner.c index a6d09dd83..d81536f90 100644 --- a/drivers/net/rrunner.c +++ b/drivers/net/rrunner.c @@ -28,7 +28,6 @@ #define RX_DMA_SKBUFF 1 #define PKT_COPY_THRESHOLD 512 -#include #include #include #include @@ -62,7 +61,7 @@ MODULE_AUTHOR("Jes Sorensen "); 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(®s->HostCtrl) | NO_SWAP, ®s->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(®s->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(®s->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(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->HostCtrl); wmb(); break; case E_HOST_ERR: printk(KERN_ERR "%s: Host software error\n", dev->name); - writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->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(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->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(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->HostCtrl); wmb(); break; case E_TX_INV_RNG: printk(KERN_ERR "%s: Invalid send ring block\n", dev->name); - writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->HostCtrl); wmb(); break; case E_TX_INV_BUF: printk(KERN_ERR "%s: Invalid send buffer address\n", dev->name); - writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->HostCtrl); wmb(); break; case E_TX_INV_DSC: printk(KERN_ERR "%s: Invalid descriptor address\n", dev->name); - writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->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(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->HostCtrl); wmb(); break; case E_RX_INV_DSC: printk(KERN_ERR "%s: Invalid receive descriptor " "address\n", dev->name); - writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->HostCtrl); wmb(); break; case E_RNG_BLK: printk(KERN_ERR "%s: Invalid ring block\n", dev->name); - writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->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(®s->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(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, + writel(readl(®s->HostCtrl)|HALT_NIC|RR_CLEAR_INT, ®s->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(®s->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(®s->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)