diff options
Diffstat (limited to 'drivers/net/hippi')
-rw-r--r-- | drivers/net/hippi/Kconfig | 6 | ||||
-rw-r--r-- | drivers/net/hippi/rrunner.c | 137 | ||||
-rw-r--r-- | drivers/net/hippi/rrunner.h | 3 |
3 files changed, 80 insertions, 66 deletions
diff --git a/drivers/net/hippi/Kconfig b/drivers/net/hippi/Kconfig index de78504a5798..46b911bb8493 100644 --- a/drivers/net/hippi/Kconfig +++ b/drivers/net/hippi/Kconfig @@ -6,7 +6,7 @@ config HIPPI bool "HIPPI driver support" depends on INET && PCI - ---help--- + help HIgh Performance Parallel Interface (HIPPI) is a 800Mbit/sec and 1600Mbit/sec dual-simplex switched or point-to-point network. HIPPI can run over copper (25m) or fiber (300m on multi-mode or 10km on @@ -21,7 +21,7 @@ if HIPPI config ROADRUNNER tristate "Essential RoadRunner HIPPI PCI adapter support" depends on PCI - ---help--- + help Say Y here if this is your PCI HIPPI network card. To compile this driver as a module, choose M here: the module @@ -30,7 +30,7 @@ config ROADRUNNER config ROADRUNNER_LARGE_RINGS bool "Use large TX/RX rings" depends on ROADRUNNER - ---help--- + help If you say Y here, the RoadRunner driver will preallocate up to 2 MB of additional memory to allow for fastest operation, both for transmitting and receiving. This memory cannot be used by any other diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c index 2a6ec5394966..aa8f828a0ae7 100644 --- a/drivers/net/hippi/rrunner.c +++ b/drivers/net/hippi/rrunner.c @@ -63,7 +63,7 @@ static const char version[] = static const struct net_device_ops rr_netdev_ops = { .ndo_open = rr_open, .ndo_stop = rr_close, - .ndo_do_ioctl = rr_ioctl, + .ndo_siocdevprivate = rr_siocdevprivate, .ndo_start_xmit = rr_start_xmit, .ndo_set_mac_address = hippi_mac_addr, }; @@ -151,7 +151,8 @@ static int rr_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) goto out; } - tmpptr = pci_alloc_consistent(pdev, TX_TOTAL_SIZE, &ring_dma); + tmpptr = dma_alloc_coherent(&pdev->dev, TX_TOTAL_SIZE, &ring_dma, + GFP_KERNEL); rrpriv->tx_ring = tmpptr; rrpriv->tx_ring_dma = ring_dma; @@ -160,7 +161,8 @@ static int rr_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) goto out; } - tmpptr = pci_alloc_consistent(pdev, RX_TOTAL_SIZE, &ring_dma); + tmpptr = dma_alloc_coherent(&pdev->dev, RX_TOTAL_SIZE, &ring_dma, + GFP_KERNEL); rrpriv->rx_ring = tmpptr; rrpriv->rx_ring_dma = ring_dma; @@ -169,7 +171,8 @@ static int rr_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) goto out; } - tmpptr = pci_alloc_consistent(pdev, EVT_RING_SIZE, &ring_dma); + tmpptr = dma_alloc_coherent(&pdev->dev, EVT_RING_SIZE, &ring_dma, + GFP_KERNEL); rrpriv->evt_ring = tmpptr; rrpriv->evt_ring_dma = ring_dma; @@ -198,18 +201,19 @@ static int rr_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) out: if (rrpriv->evt_ring) - pci_free_consistent(pdev, EVT_RING_SIZE, rrpriv->evt_ring, - rrpriv->evt_ring_dma); + dma_free_coherent(&pdev->dev, EVT_RING_SIZE, rrpriv->evt_ring, + rrpriv->evt_ring_dma); if (rrpriv->rx_ring) - pci_free_consistent(pdev, RX_TOTAL_SIZE, rrpriv->rx_ring, - rrpriv->rx_ring_dma); + dma_free_coherent(&pdev->dev, 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); + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, rrpriv->tx_ring, + rrpriv->tx_ring_dma); if (rrpriv->regs) pci_iounmap(pdev, rrpriv->regs); if (pdev) pci_release_regions(pdev); + pci_disable_device(pdev); out2: free_netdev(dev); out3: @@ -228,12 +232,12 @@ static void rr_remove_one(struct pci_dev *pdev) } unregister_netdev(dev); - pci_free_consistent(pdev, EVT_RING_SIZE, rr->evt_ring, - rr->evt_ring_dma); - pci_free_consistent(pdev, RX_TOTAL_SIZE, rr->rx_ring, - rr->rx_ring_dma); - pci_free_consistent(pdev, TX_TOTAL_SIZE, rr->tx_ring, - rr->tx_ring_dma); + dma_free_coherent(&pdev->dev, EVT_RING_SIZE, rr->evt_ring, + rr->evt_ring_dma); + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, rr->rx_ring, + rr->rx_ring_dma); + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, rr->tx_ring, + rr->tx_ring_dma); pci_iounmap(pdev, rr->regs); pci_release_regions(pdev); pci_disable_device(pdev); @@ -499,6 +503,7 @@ static unsigned int write_eeprom(struct rr_private *rrpriv, static int rr_init(struct net_device *dev) { + u8 addr[HIPPI_ALEN] __aligned(4); struct rr_private *rrpriv; struct rr_regs __iomem *regs; u32 sram_size, rev; @@ -534,10 +539,11 @@ static int rr_init(struct net_device *dev) * other method I've seen. -VAL */ - *(__be16 *)(dev->dev_addr) = + *(__be16 *)(addr) = htons(rr_read_eeprom_word(rrpriv, offsetof(struct eeprom, manf.BoardULA))); - *(__be32 *)(dev->dev_addr+2) = + *(__be32 *)(addr+2) = htonl(rr_read_eeprom_word(rrpriv, offsetof(struct eeprom, manf.BoardULA[4]))); + dev_addr_set(dev, addr); printk(" MAC: %pM\n", dev->dev_addr); @@ -648,8 +654,8 @@ static int rr_init1(struct net_device *dev) goto error; } rrpriv->rx_skbuff[i] = skb; - addr = pci_map_single(rrpriv->pci_dev, skb->data, - dev->mtu + HIPPI_HLEN, PCI_DMA_FROMDEVICE); + addr = dma_map_single(&rrpriv->pci_dev->dev, skb->data, + dev->mtu + HIPPI_HLEN, DMA_FROM_DEVICE); /* * Sanity test to see if we conflict with the DMA * limitations of the Roadrunner. @@ -699,10 +705,10 @@ static int rr_init1(struct net_device *dev) struct sk_buff *skb = rrpriv->rx_skbuff[i]; if (skb) { - pci_unmap_single(rrpriv->pci_dev, + dma_unmap_single(&rrpriv->pci_dev->dev, rrpriv->rx_ring[i].addr.addrlo, dev->mtu + HIPPI_HLEN, - PCI_DMA_FROMDEVICE); + DMA_FROM_DEVICE); rrpriv->rx_ring[i].size = 0; set_rraddr(&rrpriv->rx_ring[i].addr, 0); dev_kfree_skb(skb); @@ -953,18 +959,18 @@ static void rx_int(struct net_device *dev, u32 rxlimit, u32 index) dev->stats.rx_dropped++; goto defer; } else { - pci_dma_sync_single_for_cpu(rrpriv->pci_dev, - desc->addr.addrlo, - pkt_len, - PCI_DMA_FROMDEVICE); + dma_sync_single_for_cpu(&rrpriv->pci_dev->dev, + desc->addr.addrlo, + pkt_len, + DMA_FROM_DEVICE); skb_put_data(skb, rx_skb->data, pkt_len); - pci_dma_sync_single_for_device(rrpriv->pci_dev, - desc->addr.addrlo, - pkt_len, - PCI_DMA_FROMDEVICE); + dma_sync_single_for_device(&rrpriv->pci_dev->dev, + desc->addr.addrlo, + pkt_len, + DMA_FROM_DEVICE); } }else{ struct sk_buff *newskb; @@ -974,16 +980,17 @@ 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 + - HIPPI_HLEN, PCI_DMA_FROMDEVICE); + dma_unmap_single(&rrpriv->pci_dev->dev, + desc->addr.addrlo, + dev->mtu + HIPPI_HLEN, + DMA_FROM_DEVICE); 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, - PCI_DMA_FROMDEVICE); + addr = dma_map_single(&rrpriv->pci_dev->dev, + newskb->data, + dev->mtu + HIPPI_HLEN, + DMA_FROM_DEVICE); set_rraddr(&desc->addr, addr); } else { printk("%s: Out of memory, deferring " @@ -1068,9 +1075,9 @@ static irqreturn_t rr_interrupt(int irq, void *dev_id) dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; - pci_unmap_single(rrpriv->pci_dev, + dma_unmap_single(&rrpriv->pci_dev->dev, desc->addr.addrlo, skb->len, - PCI_DMA_TODEVICE); + DMA_TO_DEVICE); dev_kfree_skb_irq(skb); rrpriv->tx_skbuff[txcon] = NULL; @@ -1110,8 +1117,9 @@ static inline void rr_raz_tx(struct rr_private *rrpriv, if (skb) { struct tx_desc *desc = &(rrpriv->tx_ring[i]); - pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo, - skb->len, PCI_DMA_TODEVICE); + dma_unmap_single(&rrpriv->pci_dev->dev, + desc->addr.addrlo, skb->len, + DMA_TO_DEVICE); desc->size = 0; set_rraddr(&desc->addr, 0); dev_kfree_skb(skb); @@ -1132,8 +1140,10 @@ static inline void rr_raz_rx(struct rr_private *rrpriv, 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); + dma_unmap_single(&rrpriv->pci_dev->dev, + desc->addr.addrlo, + dev->mtu + HIPPI_HLEN, + DMA_FROM_DEVICE); desc->size = 0; set_rraddr(&desc->addr, 0); dev_kfree_skb(skb); @@ -1188,17 +1198,17 @@ static int rr_open(struct net_device *dev) goto error; } - rrpriv->rx_ctrl = pci_alloc_consistent(pdev, - 256 * sizeof(struct ring_ctrl), - &dma_addr); + rrpriv->rx_ctrl = dma_alloc_coherent(&pdev->dev, + 256 * sizeof(struct ring_ctrl), + &dma_addr, GFP_KERNEL); if (!rrpriv->rx_ctrl) { ecode = -ENOMEM; goto error; } rrpriv->rx_ctrl_dma = dma_addr; - rrpriv->info = pci_alloc_consistent(pdev, sizeof(struct rr_info), - &dma_addr); + rrpriv->info = dma_alloc_coherent(&pdev->dev, sizeof(struct rr_info), + &dma_addr, GFP_KERNEL); if (!rrpriv->info) { ecode = -ENOMEM; goto error; @@ -1237,13 +1247,13 @@ static int rr_open(struct net_device *dev) spin_unlock_irqrestore(&rrpriv->lock, flags); if (rrpriv->info) { - pci_free_consistent(pdev, sizeof(struct rr_info), rrpriv->info, - rrpriv->info_dma); + dma_free_coherent(&pdev->dev, sizeof(struct rr_info), + rrpriv->info, rrpriv->info_dma); rrpriv->info = NULL; } if (rrpriv->rx_ctrl) { - pci_free_consistent(pdev, sizeof(struct ring_ctrl), - rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); + dma_free_coherent(&pdev->dev, 256 * sizeof(struct ring_ctrl), + rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); rrpriv->rx_ctrl = NULL; } @@ -1346,7 +1356,9 @@ static int rr_close(struct net_device *dev) rrpriv->fw_running = 0; + spin_unlock_irqrestore(&rrpriv->lock, flags); del_timer_sync(&rrpriv->timer); + spin_lock_irqsave(&rrpriv->lock, flags); writel(0, ®s->TxPi); writel(0, ®s->IpRxPi); @@ -1365,12 +1377,12 @@ static int rr_close(struct net_device *dev) rr_raz_tx(rrpriv, dev); rr_raz_rx(rrpriv, dev); - pci_free_consistent(pdev, 256 * sizeof(struct ring_ctrl), - rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); + dma_free_coherent(&pdev->dev, 256 * sizeof(struct ring_ctrl), + rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); rrpriv->rx_ctrl = NULL; - pci_free_consistent(pdev, sizeof(struct rr_info), rrpriv->info, - rrpriv->info_dma); + dma_free_coherent(&pdev->dev, sizeof(struct rr_info), rrpriv->info, + rrpriv->info_dma); rrpriv->info = NULL; spin_unlock_irqrestore(&rrpriv->lock, flags); @@ -1430,8 +1442,8 @@ static netdev_tx_t rr_start_xmit(struct sk_buff *skb, index = txctrl->pi; rrpriv->tx_skbuff[index] = skb; - set_rraddr(&rrpriv->tx_ring[index].addr, pci_map_single( - rrpriv->pci_dev, skb->data, len + 8, PCI_DMA_TODEVICE)); + set_rraddr(&rrpriv->tx_ring[index].addr, + dma_map_single(&rrpriv->pci_dev->dev, skb->data, len + 8, DMA_TO_DEVICE)); rrpriv->tx_ring[index].size = len + 8; /* include IFIELD */ rrpriv->tx_ring[index].mode = PACKET_START | PACKET_END; txctrl->pi = (index + 1) % TX_RING_ENTRIES; @@ -1561,7 +1573,8 @@ out: } -static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static int rr_siocdevprivate(struct net_device *dev, struct ifreq *rq, + void __user *data, int cmd) { struct rr_private *rrpriv; unsigned char *image, *oldimage; @@ -1596,7 +1609,7 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) error = -EFAULT; goto gf_out; } - error = copy_to_user(rq->ifr_data, image, EEPROM_BYTES); + error = copy_to_user(data, image, EEPROM_BYTES); if (error) error = -EFAULT; gf_out: @@ -1608,7 +1621,7 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return -EPERM; } - image = memdup_user(rq->ifr_data, EEPROM_BYTES); + image = memdup_user(data, EEPROM_BYTES); if (IS_ERR(image)) return PTR_ERR(image); @@ -1651,7 +1664,7 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return error; case SIOCRRID: - return put_user(0x52523032, (int __user *)rq->ifr_data); + return put_user(0x52523032, (int __user *)data); default: return error; } diff --git a/drivers/net/hippi/rrunner.h b/drivers/net/hippi/rrunner.h index 87533784604f..55377614e752 100644 --- a/drivers/net/hippi/rrunner.h +++ b/drivers/net/hippi/rrunner.h @@ -835,7 +835,8 @@ static int rr_open(struct net_device *dev); static netdev_tx_t rr_start_xmit(struct sk_buff *skb, struct net_device *dev); static int rr_close(struct net_device *dev); -static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static int rr_siocdevprivate(struct net_device *dev, struct ifreq *rq, + void __user *data, int cmd); static unsigned int rr_read_eeprom(struct rr_private *rrpriv, unsigned long offset, unsigned char *buf, |