|
@@ -8,6 +8,7 @@
|
|
|
* published by the Free Software Foundation.
|
|
|
*/
|
|
|
|
|
|
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
#include <linux/clk.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/moduleparam.h>
|
|
@@ -19,12 +20,10 @@
|
|
|
#include <linux/netdevice.h>
|
|
|
#include <linux/etherdevice.h>
|
|
|
#include <linux/dma-mapping.h>
|
|
|
+#include <linux/platform_data/macb.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
#include <linux/phy.h>
|
|
|
|
|
|
-#include <mach/board.h>
|
|
|
-#include <mach/cpu.h>
|
|
|
-
|
|
|
#include "macb.h"
|
|
|
|
|
|
#define RX_BUFFER_SIZE 128
|
|
@@ -84,7 +83,7 @@ static void __init macb_get_hwaddr(struct macb *bp)
|
|
|
if (is_valid_ether_addr(addr)) {
|
|
|
memcpy(bp->dev->dev_addr, addr, sizeof(addr));
|
|
|
} else {
|
|
|
- dev_info(&bp->pdev->dev, "invalid hw address, using random\n");
|
|
|
+ netdev_info(bp->dev, "invalid hw address, using random\n");
|
|
|
random_ether_addr(bp->dev->dev_addr);
|
|
|
}
|
|
|
}
|
|
@@ -178,11 +177,12 @@ static void macb_handle_link_change(struct net_device *dev)
|
|
|
|
|
|
if (status_change) {
|
|
|
if (phydev->link)
|
|
|
- printk(KERN_INFO "%s: link up (%d/%s)\n",
|
|
|
- dev->name, phydev->speed,
|
|
|
- DUPLEX_FULL == phydev->duplex ? "Full":"Half");
|
|
|
+ netdev_info(dev, "link up (%d/%s)\n",
|
|
|
+ phydev->speed,
|
|
|
+ phydev->duplex == DUPLEX_FULL ?
|
|
|
+ "Full" : "Half");
|
|
|
else
|
|
|
- printk(KERN_INFO "%s: link down\n", dev->name);
|
|
|
+ netdev_info(dev, "link down\n");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -191,12 +191,12 @@ static int macb_mii_probe(struct net_device *dev)
|
|
|
{
|
|
|
struct macb *bp = netdev_priv(dev);
|
|
|
struct phy_device *phydev;
|
|
|
- struct eth_platform_data *pdata;
|
|
|
+ struct macb_platform_data *pdata;
|
|
|
int ret;
|
|
|
|
|
|
phydev = phy_find_first(bp->mii_bus);
|
|
|
if (!phydev) {
|
|
|
- printk (KERN_ERR "%s: no PHY found\n", dev->name);
|
|
|
+ netdev_err(dev, "no PHY found\n");
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -209,7 +209,7 @@ static int macb_mii_probe(struct net_device *dev)
|
|
|
PHY_INTERFACE_MODE_RMII :
|
|
|
PHY_INTERFACE_MODE_MII);
|
|
|
if (ret) {
|
|
|
- printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
|
|
|
+ netdev_err(dev, "Could not attach to PHY\n");
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -228,7 +228,7 @@ static int macb_mii_probe(struct net_device *dev)
|
|
|
|
|
|
static int macb_mii_init(struct macb *bp)
|
|
|
{
|
|
|
- struct eth_platform_data *pdata;
|
|
|
+ struct macb_platform_data *pdata;
|
|
|
int err = -ENXIO, i;
|
|
|
|
|
|
/* Enable management port */
|
|
@@ -303,14 +303,13 @@ static void macb_tx(struct macb *bp)
|
|
|
status = macb_readl(bp, TSR);
|
|
|
macb_writel(bp, TSR, status);
|
|
|
|
|
|
- dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n",
|
|
|
- (unsigned long)status);
|
|
|
+ netdev_dbg(bp->dev, "macb_tx status = %02lx\n", (unsigned long)status);
|
|
|
|
|
|
if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {
|
|
|
int i;
|
|
|
- printk(KERN_ERR "%s: TX %s, resetting buffers\n",
|
|
|
- bp->dev->name, status & MACB_BIT(UND) ?
|
|
|
- "underrun" : "retry limit exceeded");
|
|
|
+ netdev_err(bp->dev, "TX %s, resetting buffers\n",
|
|
|
+ status & MACB_BIT(UND) ?
|
|
|
+ "underrun" : "retry limit exceeded");
|
|
|
|
|
|
/* Transfer ongoing, disable transmitter, to avoid confusion */
|
|
|
if (status & MACB_BIT(TGO))
|
|
@@ -369,8 +368,8 @@ static void macb_tx(struct macb *bp)
|
|
|
if (!(bufstat & MACB_BIT(TX_USED)))
|
|
|
break;
|
|
|
|
|
|
- dev_dbg(&bp->pdev->dev, "skb %u (data %p) TX complete\n",
|
|
|
- tail, skb->data);
|
|
|
+ netdev_dbg(bp->dev, "skb %u (data %p) TX complete\n",
|
|
|
+ tail, skb->data);
|
|
|
dma_unmap_single(&bp->pdev->dev, rp->mapping, skb->len,
|
|
|
DMA_TO_DEVICE);
|
|
|
bp->stats.tx_packets++;
|
|
@@ -395,8 +394,8 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
|
|
|
|
|
|
len = MACB_BFEXT(RX_FRMLEN, bp->rx_ring[last_frag].ctrl);
|
|
|
|
|
|
- dev_dbg(&bp->pdev->dev, "macb_rx_frame frags %u - %u (len %u)\n",
|
|
|
- first_frag, last_frag, len);
|
|
|
+ netdev_dbg(bp->dev, "macb_rx_frame frags %u - %u (len %u)\n",
|
|
|
+ first_frag, last_frag, len);
|
|
|
|
|
|
skb = dev_alloc_skb(len + RX_OFFSET);
|
|
|
if (!skb) {
|
|
@@ -437,8 +436,8 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
|
|
|
|
|
|
bp->stats.rx_packets++;
|
|
|
bp->stats.rx_bytes += len;
|
|
|
- dev_dbg(&bp->pdev->dev, "received skb of length %u, csum: %08x\n",
|
|
|
- skb->len, skb->csum);
|
|
|
+ netdev_dbg(bp->dev, "received skb of length %u, csum: %08x\n",
|
|
|
+ skb->len, skb->csum);
|
|
|
netif_receive_skb(skb);
|
|
|
|
|
|
return 0;
|
|
@@ -515,8 +514,8 @@ static int macb_poll(struct napi_struct *napi, int budget)
|
|
|
|
|
|
work_done = 0;
|
|
|
|
|
|
- dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n",
|
|
|
- (unsigned long)status, budget);
|
|
|
+ netdev_dbg(bp->dev, "poll: status = %08lx, budget = %d\n",
|
|
|
+ (unsigned long)status, budget);
|
|
|
|
|
|
work_done = macb_rx(bp, budget);
|
|
|
if (work_done < budget) {
|
|
@@ -565,8 +564,7 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
|
|
|
macb_writel(bp, IDR, MACB_RX_INT_FLAGS);
|
|
|
|
|
|
if (napi_schedule_prep(&bp->napi)) {
|
|
|
- dev_dbg(&bp->pdev->dev,
|
|
|
- "scheduling RX softirq\n");
|
|
|
+ netdev_dbg(bp->dev, "scheduling RX softirq\n");
|
|
|
__napi_schedule(&bp->napi);
|
|
|
}
|
|
|
}
|
|
@@ -587,11 +585,11 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
|
|
|
|
|
|
if (status & MACB_BIT(HRESP)) {
|
|
|
/*
|
|
|
- * TODO: Reset the hardware, and maybe move the printk
|
|
|
- * to a lower-priority context as well (work queue?)
|
|
|
+ * TODO: Reset the hardware, and maybe move the
|
|
|
+ * netdev_err to a lower-priority context as well
|
|
|
+ * (work queue?)
|
|
|
*/
|
|
|
- printk(KERN_ERR "%s: DMA bus error: HRESP not OK\n",
|
|
|
- dev->name);
|
|
|
+ netdev_err(dev, "DMA bus error: HRESP not OK\n");
|
|
|
}
|
|
|
|
|
|
status = macb_readl(bp, ISR);
|
|
@@ -626,16 +624,12 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
unsigned long flags;
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
- int i;
|
|
|
- dev_dbg(&bp->pdev->dev,
|
|
|
- "start_xmit: len %u head %p data %p tail %p end %p\n",
|
|
|
- skb->len, skb->head, skb->data,
|
|
|
- skb_tail_pointer(skb), skb_end_pointer(skb));
|
|
|
- dev_dbg(&bp->pdev->dev,
|
|
|
- "data:");
|
|
|
- for (i = 0; i < 16; i++)
|
|
|
- printk(" %02x", (unsigned int)skb->data[i]);
|
|
|
- printk("\n");
|
|
|
+ netdev_dbg(bp->dev,
|
|
|
+ "start_xmit: len %u head %p data %p tail %p end %p\n",
|
|
|
+ skb->len, skb->head, skb->data,
|
|
|
+ skb_tail_pointer(skb), skb_end_pointer(skb));
|
|
|
+ print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_OFFSET, 16, 1,
|
|
|
+ skb->data, 16, true);
|
|
|
#endif
|
|
|
|
|
|
len = skb->len;
|
|
@@ -645,21 +639,20 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
if (TX_BUFFS_AVAIL(bp) < 1) {
|
|
|
netif_stop_queue(dev);
|
|
|
spin_unlock_irqrestore(&bp->lock, flags);
|
|
|
- dev_err(&bp->pdev->dev,
|
|
|
- "BUG! Tx Ring full when queue awake!\n");
|
|
|
- dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n",
|
|
|
- bp->tx_head, bp->tx_tail);
|
|
|
+ netdev_err(bp->dev, "BUG! Tx Ring full when queue awake!\n");
|
|
|
+ netdev_dbg(bp->dev, "tx_head = %u, tx_tail = %u\n",
|
|
|
+ bp->tx_head, bp->tx_tail);
|
|
|
return NETDEV_TX_BUSY;
|
|
|
}
|
|
|
|
|
|
entry = bp->tx_head;
|
|
|
- dev_dbg(&bp->pdev->dev, "Allocated ring entry %u\n", entry);
|
|
|
+ netdev_dbg(bp->dev, "Allocated ring entry %u\n", entry);
|
|
|
mapping = dma_map_single(&bp->pdev->dev, skb->data,
|
|
|
len, DMA_TO_DEVICE);
|
|
|
bp->tx_skb[entry].skb = skb;
|
|
|
bp->tx_skb[entry].mapping = mapping;
|
|
|
- dev_dbg(&bp->pdev->dev, "Mapped skb data %p to DMA addr %08lx\n",
|
|
|
- skb->data, (unsigned long)mapping);
|
|
|
+ netdev_dbg(bp->dev, "Mapped skb data %p to DMA addr %08lx\n",
|
|
|
+ skb->data, (unsigned long)mapping);
|
|
|
|
|
|
ctrl = MACB_BF(TX_FRMLEN, len);
|
|
|
ctrl |= MACB_BIT(TX_LAST);
|
|
@@ -723,27 +716,27 @@ static int macb_alloc_consistent(struct macb *bp)
|
|
|
&bp->rx_ring_dma, GFP_KERNEL);
|
|
|
if (!bp->rx_ring)
|
|
|
goto out_err;
|
|
|
- dev_dbg(&bp->pdev->dev,
|
|
|
- "Allocated RX ring of %d bytes at %08lx (mapped %p)\n",
|
|
|
- size, (unsigned long)bp->rx_ring_dma, bp->rx_ring);
|
|
|
+ netdev_dbg(bp->dev,
|
|
|
+ "Allocated RX ring of %d bytes at %08lx (mapped %p)\n",
|
|
|
+ size, (unsigned long)bp->rx_ring_dma, bp->rx_ring);
|
|
|
|
|
|
size = TX_RING_BYTES;
|
|
|
bp->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size,
|
|
|
&bp->tx_ring_dma, GFP_KERNEL);
|
|
|
if (!bp->tx_ring)
|
|
|
goto out_err;
|
|
|
- dev_dbg(&bp->pdev->dev,
|
|
|
- "Allocated TX ring of %d bytes at %08lx (mapped %p)\n",
|
|
|
- size, (unsigned long)bp->tx_ring_dma, bp->tx_ring);
|
|
|
+ netdev_dbg(bp->dev,
|
|
|
+ "Allocated TX ring of %d bytes at %08lx (mapped %p)\n",
|
|
|
+ size, (unsigned long)bp->tx_ring_dma, bp->tx_ring);
|
|
|
|
|
|
size = RX_RING_SIZE * RX_BUFFER_SIZE;
|
|
|
bp->rx_buffers = dma_alloc_coherent(&bp->pdev->dev, size,
|
|
|
&bp->rx_buffers_dma, GFP_KERNEL);
|
|
|
if (!bp->rx_buffers)
|
|
|
goto out_err;
|
|
|
- dev_dbg(&bp->pdev->dev,
|
|
|
- "Allocated RX buffers of %d bytes at %08lx (mapped %p)\n",
|
|
|
- size, (unsigned long)bp->rx_buffers_dma, bp->rx_buffers);
|
|
|
+ netdev_dbg(bp->dev,
|
|
|
+ "Allocated RX buffers of %d bytes at %08lx (mapped %p)\n",
|
|
|
+ size, (unsigned long)bp->rx_buffers_dma, bp->rx_buffers);
|
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -954,7 +947,7 @@ static int macb_open(struct net_device *dev)
|
|
|
struct macb *bp = netdev_priv(dev);
|
|
|
int err;
|
|
|
|
|
|
- dev_dbg(&bp->pdev->dev, "open\n");
|
|
|
+ netdev_dbg(bp->dev, "open\n");
|
|
|
|
|
|
/* if the phy is not yet register, retry later*/
|
|
|
if (!bp->phy_dev)
|
|
@@ -965,9 +958,8 @@ static int macb_open(struct net_device *dev)
|
|
|
|
|
|
err = macb_alloc_consistent(bp);
|
|
|
if (err) {
|
|
|
- printk(KERN_ERR
|
|
|
- "%s: Unable to allocate DMA memory (error %d)\n",
|
|
|
- dev->name, err);
|
|
|
+ netdev_err(dev, "Unable to allocate DMA memory (error %d)\n",
|
|
|
+ err);
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -1119,7 +1111,7 @@ static const struct net_device_ops macb_netdev_ops = {
|
|
|
|
|
|
static int __init macb_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
- struct eth_platform_data *pdata;
|
|
|
+ struct macb_platform_data *pdata;
|
|
|
struct resource *regs;
|
|
|
struct net_device *dev;
|
|
|
struct macb *bp;
|
|
@@ -1152,28 +1144,19 @@ static int __init macb_probe(struct platform_device *pdev)
|
|
|
|
|
|
spin_lock_init(&bp->lock);
|
|
|
|
|
|
-#if defined(CONFIG_ARCH_AT91)
|
|
|
- bp->pclk = clk_get(&pdev->dev, "macb_clk");
|
|
|
+ bp->pclk = clk_get(&pdev->dev, "pclk");
|
|
|
if (IS_ERR(bp->pclk)) {
|
|
|
dev_err(&pdev->dev, "failed to get macb_clk\n");
|
|
|
goto err_out_free_dev;
|
|
|
}
|
|
|
clk_enable(bp->pclk);
|
|
|
-#else
|
|
|
- bp->pclk = clk_get(&pdev->dev, "pclk");
|
|
|
- if (IS_ERR(bp->pclk)) {
|
|
|
- dev_err(&pdev->dev, "failed to get pclk\n");
|
|
|
- goto err_out_free_dev;
|
|
|
- }
|
|
|
+
|
|
|
bp->hclk = clk_get(&pdev->dev, "hclk");
|
|
|
if (IS_ERR(bp->hclk)) {
|
|
|
dev_err(&pdev->dev, "failed to get hclk\n");
|
|
|
goto err_out_put_pclk;
|
|
|
}
|
|
|
-
|
|
|
- clk_enable(bp->pclk);
|
|
|
clk_enable(bp->hclk);
|
|
|
-#endif
|
|
|
|
|
|
bp->regs = ioremap(regs->start, resource_size(regs));
|
|
|
if (!bp->regs) {
|
|
@@ -1185,9 +1168,8 @@ static int __init macb_probe(struct platform_device *pdev)
|
|
|
dev->irq = platform_get_irq(pdev, 0);
|
|
|
err = request_irq(dev->irq, macb_interrupt, 0, dev->name, dev);
|
|
|
if (err) {
|
|
|
- printk(KERN_ERR
|
|
|
- "%s: Unable to request IRQ %d (error %d)\n",
|
|
|
- dev->name, dev->irq, err);
|
|
|
+ dev_err(&pdev->dev, "Unable to request IRQ %d (error %d)\n",
|
|
|
+ dev->irq, err);
|
|
|
goto err_out_iounmap;
|
|
|
}
|
|
|
|
|
@@ -1239,13 +1221,12 @@ static int __init macb_probe(struct platform_device *pdev)
|
|
|
|
|
|
platform_set_drvdata(pdev, dev);
|
|
|
|
|
|
- printk(KERN_INFO "%s: Atmel MACB at 0x%08lx irq %d (%pM)\n",
|
|
|
- dev->name, dev->base_addr, dev->irq, dev->dev_addr);
|
|
|
+ netdev_info(dev, "Atmel MACB at 0x%08lx irq %d (%pM)\n",
|
|
|
+ dev->base_addr, dev->irq, dev->dev_addr);
|
|
|
|
|
|
phydev = bp->phy_dev;
|
|
|
- printk(KERN_INFO "%s: attached PHY driver [%s] "
|
|
|
- "(mii_bus:phy_addr=%s, irq=%d)\n", dev->name,
|
|
|
- phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
|
|
|
+ netdev_info(dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
|
|
|
+ phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
|
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -1256,14 +1237,10 @@ err_out_free_irq:
|
|
|
err_out_iounmap:
|
|
|
iounmap(bp->regs);
|
|
|
err_out_disable_clocks:
|
|
|
-#ifndef CONFIG_ARCH_AT91
|
|
|
clk_disable(bp->hclk);
|
|
|
clk_put(bp->hclk);
|
|
|
-#endif
|
|
|
clk_disable(bp->pclk);
|
|
|
-#ifndef CONFIG_ARCH_AT91
|
|
|
err_out_put_pclk:
|
|
|
-#endif
|
|
|
clk_put(bp->pclk);
|
|
|
err_out_free_dev:
|
|
|
free_netdev(dev);
|
|
@@ -1289,10 +1266,8 @@ static int __exit macb_remove(struct platform_device *pdev)
|
|
|
unregister_netdev(dev);
|
|
|
free_irq(dev->irq, dev);
|
|
|
iounmap(bp->regs);
|
|
|
-#ifndef CONFIG_ARCH_AT91
|
|
|
clk_disable(bp->hclk);
|
|
|
clk_put(bp->hclk);
|
|
|
-#endif
|
|
|
clk_disable(bp->pclk);
|
|
|
clk_put(bp->pclk);
|
|
|
free_netdev(dev);
|
|
@@ -1310,9 +1285,7 @@ static int macb_suspend(struct platform_device *pdev, pm_message_t state)
|
|
|
|
|
|
netif_device_detach(netdev);
|
|
|
|
|
|
-#ifndef CONFIG_ARCH_AT91
|
|
|
clk_disable(bp->hclk);
|
|
|
-#endif
|
|
|
clk_disable(bp->pclk);
|
|
|
|
|
|
return 0;
|
|
@@ -1324,9 +1297,7 @@ static int macb_resume(struct platform_device *pdev)
|
|
|
struct macb *bp = netdev_priv(netdev);
|
|
|
|
|
|
clk_enable(bp->pclk);
|
|
|
-#ifndef CONFIG_ARCH_AT91
|
|
|
clk_enable(bp->hclk);
|
|
|
-#endif
|
|
|
|
|
|
netif_device_attach(netdev);
|
|
|
|