X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/6c7f40ae71f19e6a15f49e9a4dc45d1a53122d49..a07eab49bf0a258a5d2260ff80b615a491064cf3:/target/linux/ramips/files/drivers/net/ramips.c diff --git a/target/linux/ramips/files/drivers/net/ramips.c b/target/linux/ramips/files/drivers/net/ramips.c index e634453bf..13645e23a 100644 --- a/target/linux/ramips/files/drivers/net/ramips.c +++ b/target/linux/ramips/files/drivers/net/ramips.c @@ -1,8 +1,7 @@ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * the Free Software Foundation; version 2 of the License * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -39,6 +38,8 @@ #include "ramips_esw.c" #endif +#define phys_to_bus(a) (a & 0x1FFFFFFF) + static struct net_device * ramips_dev; static void __iomem *ramips_fe_base = 0; @@ -57,15 +58,14 @@ ramips_fe_rr(unsigned reg) static int ramips_alloc_dma(struct net_device *dev) { -#define phys_to_bus(a) (a & 0x1FFFFFFF) struct raeth_priv *priv = netdev_priv(dev); int i; priv->skb_free_idx = 0; /* setup tx ring */ - priv->tx = pci_alloc_consistent(NULL, - NUM_TX_DESC * sizeof(struct ramips_tx_dma), &priv->phy_tx); + priv->tx = dma_alloc_coherent(NULL, + NUM_TX_DESC * sizeof(struct ramips_tx_dma), &priv->phy_tx, GFP_ATOMIC); for(i = 0; i < NUM_TX_DESC; i++) { memset(&priv->tx[i], 0, sizeof(struct ramips_tx_dma)); @@ -79,8 +79,8 @@ ramips_alloc_dma(struct net_device *dev) ramips_fe_wr(RAMIPS_PST_DTX_IDX0, RAMIPS_PDMA_RST_CFG); /* setup rx ring */ - priv->rx = pci_alloc_consistent(NULL, - NUM_RX_DESC * sizeof(struct ramips_rx_dma), &priv->phy_rx); + priv->rx = dma_alloc_coherent(NULL, + NUM_RX_DESC * sizeof(struct ramips_rx_dma), &priv->phy_rx, GFP_ATOMIC); memset(priv->rx, 0, sizeof(struct ramips_rx_dma) * NUM_RX_DESC); for(i = 0; i < NUM_RX_DESC; i++) { @@ -89,13 +89,10 @@ ramips_alloc_dma(struct net_device *dev) skb_reserve(new_skb, 2); priv->rx[i].rxd1 = dma_map_single(NULL, skb_put(new_skb, 2), MAX_RX_LENGTH + 2, - PCI_DMA_FROMDEVICE); + DMA_FROM_DEVICE); priv->rx[i].rxd2 |= RX_DMA_LSO; priv->rx_skb[i] = new_skb; } - dma_cache_wback_inv((unsigned long)priv->rx, - NUM_RX_DESC * (sizeof(struct ramips_rx_dma))); - ramips_fe_wr(phys_to_bus(priv->phy_rx), RAMIPS_RX_BASE_PTR0); ramips_fe_wr(NUM_RX_DESC, RAMIPS_RX_MAX_CNT0); ramips_fe_wr((NUM_RX_DESC - 1), RAMIPS_RX_CALC_IDX0); @@ -110,7 +107,7 @@ ramips_eth_hard_start_xmit(struct sk_buff* skb, struct net_device *dev) struct raeth_priv *priv = netdev_priv(dev); unsigned long tx; unsigned int tx_next; - + unsigned int mapped_addr; if(priv->plat->min_pkt_len) { if(skb->len < priv->plat->min_pkt_len) @@ -125,7 +122,9 @@ ramips_eth_hard_start_xmit(struct sk_buff* skb, struct net_device *dev) } } dev->trans_start = jiffies; - dma_cache_wback_inv((unsigned long)skb->data, skb->len); + mapped_addr = (unsigned int)dma_map_single(NULL, skb->data, skb->len, + DMA_TO_DEVICE); + dma_sync_single_for_device(NULL, mapped_addr, skb->len, DMA_TO_DEVICE); tx = ramips_fe_rr(RAMIPS_TX_CTX_IDX0); if(tx == NUM_TX_DESC - 1) tx_next = 0; @@ -188,10 +187,8 @@ ramips_eth_rx_hw(unsigned long ptr) skb_reserve(new_skb, 2); priv->rx[rx].rxd1 = dma_map_single(NULL, new_skb->data, MAX_RX_LENGTH + 2, - PCI_DMA_FROMDEVICE); + DMA_FROM_DEVICE); priv->rx[rx].rxd2 &= ~RX_DMA_DONE; - dma_cache_wback_inv((unsigned long)&priv->rx[rx], - sizeof(struct ramips_rx_dma)); ramips_fe_wr(rx, RAMIPS_RX_CALC_IDX0); } if(max_rx == 0) @@ -305,9 +302,9 @@ ramips_eth_stop(struct net_device *dev) netif_stop_queue(dev); tasklet_kill(&priv->tx_housekeeping_tasklet); tasklet_kill(&priv->rx_tasklet); - pci_free_consistent(NULL, NUM_TX_DESC * sizeof(struct ramips_tx_dma), + dma_free_coherent(NULL, NUM_TX_DESC * sizeof(struct ramips_tx_dma), priv->tx, priv->phy_tx); - pci_free_consistent(NULL, NUM_RX_DESC * sizeof(struct ramips_rx_dma), + dma_free_coherent(NULL, NUM_RX_DESC * sizeof(struct ramips_rx_dma), priv->rx, priv->phy_rx); printk(KERN_DEBUG "ramips_eth: stopped\n"); return 0; @@ -341,29 +338,61 @@ ramips_eth_plat_probe(struct platform_device *plat) { struct raeth_priv *priv; struct ramips_eth_platform_data *data = plat->dev.platform_data; - ramips_fe_base = ioremap_nocache(data->base_addr, PAGE_SIZE); + struct resource *res; + int err; + + if (!data) { + dev_err(&plat->dev, "no platform data specified\n"); + return -EINVAL; + } + + res = platform_get_resource(plat, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&plat->dev, "no memory resource found\n"); + return -ENXIO; + } + + ramips_fe_base = ioremap_nocache(res->start, res->end - res->start + 1); if(!ramips_fe_base) return -ENOMEM; + ramips_dev = alloc_etherdev(sizeof(struct raeth_priv)); - if(!ramips_dev) - return -ENOMEM; + if(!ramips_dev) { + dev_err(&plat->dev, "alloc_etherdev failed\n"); + err = -ENOMEM; + goto err_unmap; + } + strcpy(ramips_dev->name, "eth%d"); - ramips_dev->irq = data->irq; + ramips_dev->irq = platform_get_irq(plat, 0); + if (ramips_dev->irq < 0) { + dev_err(&plat->dev, "no IRQ resource found\n"); + err = -ENXIO; + goto err_free_dev; + } ramips_dev->addr_len = ETH_ALEN; ramips_dev->base_addr = (unsigned long)ramips_fe_base; ramips_dev->init = ramips_eth_probe; priv = (struct raeth_priv*)netdev_priv(ramips_dev); priv->plat = data; - if(register_netdev(ramips_dev)) - { - printk(KERN_ERR "ramips_eth: error bringing up device\n"); - return -ENXIO; + + err = register_netdev(ramips_dev); + if (err) { + dev_err(&plat->dev, "error bringing up device\n"); + goto err_free_dev; } + #ifdef CONFIG_RALINK_RT305X rt305x_esw_init(); #endif printk(KERN_DEBUG "ramips_eth: loaded\n"); return 0; + + err_free_dev: + kfree(ramips_dev); + err_unmap: + iounmap(ramips_fe_base); + return err; } static int