Commit 7ef0a7ee authored by Bryan Wu's avatar Bryan Wu Committed by Jeff Garzik

Blackfin EMAC Driver: code cleanup

 - replace specific "bf537" function or data structure name to "bfin_mac"
 - cleanup bfin_mac_probe with error checking
 - punt set_pin_mux function, call peripheral request/free list functions directly
Signed-off-by: default avatarBryan Wu <cooloney@kernel.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 4e5b864e
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
#define DRV_NAME "bfin_mac" #define DRV_NAME "bfin_mac"
#define DRV_VERSION "1.1" #define DRV_VERSION "1.1"
#define DRV_AUTHOR "Bryan Wu, Luke Yang" #define DRV_AUTHOR "Bryan Wu, Luke Yang"
#define DRV_DESC "Blackfin BF53[67] BF527 on-chip Ethernet MAC driver" #define DRV_DESC "Blackfin on-chip Ethernet MAC driver"
MODULE_AUTHOR(DRV_AUTHOR); MODULE_AUTHOR(DRV_AUTHOR);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -73,8 +73,14 @@ static struct net_dma_desc_tx *current_tx_ptr; ...@@ -73,8 +73,14 @@ static struct net_dma_desc_tx *current_tx_ptr;
static struct net_dma_desc_tx *tx_desc; static struct net_dma_desc_tx *tx_desc;
static struct net_dma_desc_rx *rx_desc; static struct net_dma_desc_rx *rx_desc;
static void bf537mac_disable(void); #if defined(CONFIG_BFIN_MAC_RMII)
static void bf537mac_enable(void); static u16 pin_req[] = P_RMII0;
#else
static u16 pin_req[] = P_MII0;
#endif
static void bfin_mac_disable(void);
static void bfin_mac_enable(void);
static void desc_list_free(void) static void desc_list_free(void)
{ {
...@@ -243,27 +249,6 @@ init_error: ...@@ -243,27 +249,6 @@ init_error:
/*---PHY CONTROL AND CONFIGURATION-----------------------------------------*/ /*---PHY CONTROL AND CONFIGURATION-----------------------------------------*/
/* Set FER regs to MUX in Ethernet pins */
static int setup_pin_mux(int action)
{
#if defined(CONFIG_BFIN_MAC_RMII)
u16 pin_req[] = P_RMII0;
#else
u16 pin_req[] = P_MII0;
#endif
if (action) {
if (peripheral_request_list(pin_req, DRV_NAME)) {
printk(KERN_ERR DRV_NAME
": Requesting Peripherals failed\n");
return -EFAULT;
}
} else
peripheral_free_list(pin_req);
return 0;
}
/* /*
* MII operations * MII operations
*/ */
...@@ -322,9 +307,9 @@ static int mdiobus_reset(struct mii_bus *bus) ...@@ -322,9 +307,9 @@ static int mdiobus_reset(struct mii_bus *bus)
return 0; return 0;
} }
static void bf537_adjust_link(struct net_device *dev) static void bfin_mac_adjust_link(struct net_device *dev)
{ {
struct bf537mac_local *lp = netdev_priv(dev); struct bfin_mac_local *lp = netdev_priv(dev);
struct phy_device *phydev = lp->phydev; struct phy_device *phydev = lp->phydev;
unsigned long flags; unsigned long flags;
int new_state = 0; int new_state = 0;
...@@ -395,7 +380,7 @@ static void bf537_adjust_link(struct net_device *dev) ...@@ -395,7 +380,7 @@ static void bf537_adjust_link(struct net_device *dev)
static int mii_probe(struct net_device *dev) static int mii_probe(struct net_device *dev)
{ {
struct bf537mac_local *lp = netdev_priv(dev); struct bfin_mac_local *lp = netdev_priv(dev);
struct phy_device *phydev = NULL; struct phy_device *phydev = NULL;
unsigned short sysctl; unsigned short sysctl;
int i; int i;
...@@ -431,10 +416,10 @@ static int mii_probe(struct net_device *dev) ...@@ -431,10 +416,10 @@ static int mii_probe(struct net_device *dev)
} }
#if defined(CONFIG_BFIN_MAC_RMII) #if defined(CONFIG_BFIN_MAC_RMII)
phydev = phy_connect(dev, phydev->dev.bus_id, &bf537_adjust_link, 0, phydev = phy_connect(dev, phydev->dev.bus_id, &bfin_mac_adjust_link, 0,
PHY_INTERFACE_MODE_RMII); PHY_INTERFACE_MODE_RMII);
#else #else
phydev = phy_connect(dev, phydev->dev.bus_id, &bf537_adjust_link, 0, phydev = phy_connect(dev, phydev->dev.bus_id, &bfin_mac_adjust_link, 0,
PHY_INTERFACE_MODE_MII); PHY_INTERFACE_MODE_MII);
#endif #endif
...@@ -511,7 +496,7 @@ static void setup_mac_addr(u8 *mac_addr) ...@@ -511,7 +496,7 @@ static void setup_mac_addr(u8 *mac_addr)
bfin_write_EMAC_ADDRHI(addr_hi); bfin_write_EMAC_ADDRHI(addr_hi);
} }
static int bf537mac_set_mac_address(struct net_device *dev, void *p) static int bfin_mac_set_mac_address(struct net_device *dev, void *p)
{ {
struct sockaddr *addr = p; struct sockaddr *addr = p;
if (netif_running(dev)) if (netif_running(dev))
...@@ -573,7 +558,7 @@ adjust_head: ...@@ -573,7 +558,7 @@ adjust_head:
} }
static int bf537mac_hard_start_xmit(struct sk_buff *skb, static int bfin_mac_hard_start_xmit(struct sk_buff *skb,
struct net_device *dev) struct net_device *dev)
{ {
unsigned int data; unsigned int data;
...@@ -631,7 +616,7 @@ out: ...@@ -631,7 +616,7 @@ out:
return 0; return 0;
} }
static void bf537mac_rx(struct net_device *dev) static void bfin_mac_rx(struct net_device *dev)
{ {
struct sk_buff *skb, *new_skb; struct sk_buff *skb, *new_skb;
unsigned short len; unsigned short len;
...@@ -680,7 +665,7 @@ out: ...@@ -680,7 +665,7 @@ out:
} }
/* interrupt routine to handle rx and error signal */ /* interrupt routine to handle rx and error signal */
static irqreturn_t bf537mac_interrupt(int irq, void *dev_id) static irqreturn_t bfin_mac_interrupt(int irq, void *dev_id)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
int number = 0; int number = 0;
...@@ -700,21 +685,21 @@ get_one_packet: ...@@ -700,21 +685,21 @@ get_one_packet:
} }
real_rx: real_rx:
bf537mac_rx(dev); bfin_mac_rx(dev);
number++; number++;
goto get_one_packet; goto get_one_packet;
} }
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
static void bf537mac_poll(struct net_device *dev) static void bfin_mac_poll(struct net_device *dev)
{ {
disable_irq(IRQ_MAC_RX); disable_irq(IRQ_MAC_RX);
bf537mac_interrupt(IRQ_MAC_RX, dev); bfin_mac_interrupt(IRQ_MAC_RX, dev);
enable_irq(IRQ_MAC_RX); enable_irq(IRQ_MAC_RX);
} }
#endif /* CONFIG_NET_POLL_CONTROLLER */ #endif /* CONFIG_NET_POLL_CONTROLLER */
static void bf537mac_disable(void) static void bfin_mac_disable(void)
{ {
unsigned int opmode; unsigned int opmode;
...@@ -728,7 +713,7 @@ static void bf537mac_disable(void) ...@@ -728,7 +713,7 @@ static void bf537mac_disable(void)
/* /*
* Enable Interrupts, Receive, and Transmit * Enable Interrupts, Receive, and Transmit
*/ */
static void bf537mac_enable(void) static void bfin_mac_enable(void)
{ {
u32 opmode; u32 opmode;
...@@ -766,23 +751,23 @@ static void bf537mac_enable(void) ...@@ -766,23 +751,23 @@ static void bf537mac_enable(void)
} }
/* Our watchdog timed out. Called by the networking layer */ /* Our watchdog timed out. Called by the networking layer */
static void bf537mac_timeout(struct net_device *dev) static void bfin_mac_timeout(struct net_device *dev)
{ {
pr_debug("%s: %s\n", dev->name, __FUNCTION__); pr_debug("%s: %s\n", dev->name, __FUNCTION__);
bf537mac_disable(); bfin_mac_disable();
/* reset tx queue */ /* reset tx queue */
tx_list_tail = tx_list_head->next; tx_list_tail = tx_list_head->next;
bf537mac_enable(); bfin_mac_enable();
/* We can accept TX packets again */ /* We can accept TX packets again */
dev->trans_start = jiffies; dev->trans_start = jiffies;
netif_wake_queue(dev); netif_wake_queue(dev);
} }
static void bf537mac_multicast_hash(struct net_device *dev) static void bfin_mac_multicast_hash(struct net_device *dev)
{ {
u32 emac_hashhi, emac_hashlo; u32 emac_hashhi, emac_hashlo;
struct dev_mc_list *dmi = dev->mc_list; struct dev_mc_list *dmi = dev->mc_list;
...@@ -821,7 +806,7 @@ static void bf537mac_multicast_hash(struct net_device *dev) ...@@ -821,7 +806,7 @@ static void bf537mac_multicast_hash(struct net_device *dev)
* promiscuous mode (for TCPDUMP and cousins) or accept * promiscuous mode (for TCPDUMP and cousins) or accept
* a select set of multicast packets * a select set of multicast packets
*/ */
static void bf537mac_set_multicast_list(struct net_device *dev) static void bfin_mac_set_multicast_list(struct net_device *dev)
{ {
u32 sysctl; u32 sysctl;
...@@ -840,7 +825,7 @@ static void bf537mac_set_multicast_list(struct net_device *dev) ...@@ -840,7 +825,7 @@ static void bf537mac_set_multicast_list(struct net_device *dev)
sysctl = bfin_read_EMAC_OPMODE(); sysctl = bfin_read_EMAC_OPMODE();
sysctl |= HM; sysctl |= HM;
bfin_write_EMAC_OPMODE(sysctl); bfin_write_EMAC_OPMODE(sysctl);
bf537mac_multicast_hash(dev); bfin_mac_multicast_hash(dev);
} else { } else {
/* clear promisc or multicast mode */ /* clear promisc or multicast mode */
sysctl = bfin_read_EMAC_OPMODE(); sysctl = bfin_read_EMAC_OPMODE();
...@@ -852,7 +837,7 @@ static void bf537mac_set_multicast_list(struct net_device *dev) ...@@ -852,7 +837,7 @@ static void bf537mac_set_multicast_list(struct net_device *dev)
/* /*
* this puts the device in an inactive state * this puts the device in an inactive state
*/ */
static void bf537mac_shutdown(struct net_device *dev) static void bfin_mac_shutdown(struct net_device *dev)
{ {
/* Turn off the EMAC */ /* Turn off the EMAC */
bfin_write_EMAC_OPMODE(0x00000000); bfin_write_EMAC_OPMODE(0x00000000);
...@@ -866,9 +851,9 @@ static void bf537mac_shutdown(struct net_device *dev) ...@@ -866,9 +851,9 @@ static void bf537mac_shutdown(struct net_device *dev)
* *
* Set up everything, reset the card, etc.. * Set up everything, reset the card, etc..
*/ */
static int bf537mac_open(struct net_device *dev) static int bfin_mac_open(struct net_device *dev)
{ {
struct bf537mac_local *lp = netdev_priv(dev); struct bfin_mac_local *lp = netdev_priv(dev);
int retval; int retval;
pr_debug("%s: %s\n", dev->name, __FUNCTION__); pr_debug("%s: %s\n", dev->name, __FUNCTION__);
...@@ -891,8 +876,8 @@ static int bf537mac_open(struct net_device *dev) ...@@ -891,8 +876,8 @@ static int bf537mac_open(struct net_device *dev)
phy_start(lp->phydev); phy_start(lp->phydev);
phy_write(lp->phydev, MII_BMCR, BMCR_RESET); phy_write(lp->phydev, MII_BMCR, BMCR_RESET);
setup_system_regs(dev); setup_system_regs(dev);
bf537mac_disable(); bfin_mac_disable();
bf537mac_enable(); bfin_mac_enable();
pr_debug("hardware init finished\n"); pr_debug("hardware init finished\n");
netif_start_queue(dev); netif_start_queue(dev);
netif_carrier_on(dev); netif_carrier_on(dev);
...@@ -906,9 +891,9 @@ static int bf537mac_open(struct net_device *dev) ...@@ -906,9 +891,9 @@ static int bf537mac_open(struct net_device *dev)
* and not talk to the outside world. Caused by * and not talk to the outside world. Caused by
* an 'ifconfig ethX down' * an 'ifconfig ethX down'
*/ */
static int bf537mac_close(struct net_device *dev) static int bfin_mac_close(struct net_device *dev)
{ {
struct bf537mac_local *lp = netdev_priv(dev); struct bfin_mac_local *lp = netdev_priv(dev);
pr_debug("%s: %s\n", dev->name, __FUNCTION__); pr_debug("%s: %s\n", dev->name, __FUNCTION__);
netif_stop_queue(dev); netif_stop_queue(dev);
...@@ -918,7 +903,7 @@ static int bf537mac_close(struct net_device *dev) ...@@ -918,7 +903,7 @@ static int bf537mac_close(struct net_device *dev)
phy_write(lp->phydev, MII_BMCR, BMCR_PDOWN); phy_write(lp->phydev, MII_BMCR, BMCR_PDOWN);
/* clear everything */ /* clear everything */
bf537mac_shutdown(dev); bfin_mac_shutdown(dev);
/* free the rx/tx buffers */ /* free the rx/tx buffers */
desc_list_free(); desc_list_free();
...@@ -926,46 +911,59 @@ static int bf537mac_close(struct net_device *dev) ...@@ -926,46 +911,59 @@ static int bf537mac_close(struct net_device *dev)
return 0; return 0;
} }
static int __init bf537mac_probe(struct net_device *dev) static int __init bfin_mac_probe(struct platform_device *pdev)
{ {
struct bf537mac_local *lp = netdev_priv(dev); struct net_device *ndev;
int retval; struct bfin_mac_local *lp;
int i; int rc, i;
ndev = alloc_etherdev(sizeof(struct bfin_mac_local));
if (!ndev) {
dev_err(&pdev->dev, "Cannot allocate net device!\n");
return -ENOMEM;
}
SET_NETDEV_DEV(ndev, &pdev->dev);
platform_set_drvdata(pdev, ndev);
lp = netdev_priv(ndev);
/* Grab the MAC address in the MAC */ /* Grab the MAC address in the MAC */
*(__le32 *) (&(dev->dev_addr[0])) = cpu_to_le32(bfin_read_EMAC_ADDRLO()); *(__le32 *) (&(ndev->dev_addr[0])) = cpu_to_le32(bfin_read_EMAC_ADDRLO());
*(__le16 *) (&(dev->dev_addr[4])) = cpu_to_le16((u16) bfin_read_EMAC_ADDRHI()); *(__le16 *) (&(ndev->dev_addr[4])) = cpu_to_le16((u16) bfin_read_EMAC_ADDRHI());
/* probe mac */ /* probe mac */
/*todo: how to proble? which is revision_register */ /*todo: how to proble? which is revision_register */
bfin_write_EMAC_ADDRLO(0x12345678); bfin_write_EMAC_ADDRLO(0x12345678);
if (bfin_read_EMAC_ADDRLO() != 0x12345678) { if (bfin_read_EMAC_ADDRLO() != 0x12345678) {
pr_debug("can't detect bf537 mac!\n"); dev_err(&pdev->dev, "Cannot detect Blackfin on-chip ethernet MAC controller!\n");
retval = -ENODEV; rc = -ENODEV;
goto err_out; goto out_err_probe_mac;
} }
/* set the GPIO pins to Ethernet mode */ /* set the GPIO pins to Ethernet mode */
retval = setup_pin_mux(1); rc = peripheral_request_list(pin_req, DRV_NAME);
if (retval) if (rc) {
return retval; dev_err(&pdev->dev, "Requesting peripherals failed!\n");
rc = -EFAULT;
/*Is it valid? (Did bootloader initialize it?) */ goto out_err_setup_pin_mux;
if (!is_valid_ether_addr(dev->dev_addr)) {
/* Grab the MAC from the board somehow - this is done in the
arch/blackfin/mach-bf537/boards/eth_mac.c */
bfin_get_ether_addr(dev->dev_addr);
} }
/*
* Is it valid? (Did bootloader initialize it?)
* Grab the MAC from the board somehow
* this is done in the arch/blackfin/mach-bfxxx/boards/eth_mac.c
*/
if (!is_valid_ether_addr(ndev->dev_addr))
bfin_get_ether_addr(ndev->dev_addr);
/* If still not valid, get a random one */ /* If still not valid, get a random one */
if (!is_valid_ether_addr(dev->dev_addr)) { if (!is_valid_ether_addr(ndev->dev_addr))
random_ether_addr(dev->dev_addr); random_ether_addr(ndev->dev_addr);
}
setup_mac_addr(dev->dev_addr); setup_mac_addr(ndev->dev_addr);
/* MDIO bus initial */ /* MDIO bus initial */
lp->mii_bus.priv = dev; lp->mii_bus.priv = ndev;
lp->mii_bus.read = mdiobus_read; lp->mii_bus.read = mdiobus_read;
lp->mii_bus.write = mdiobus_write; lp->mii_bus.write = mdiobus_write;
lp->mii_bus.reset = mdiobus_reset; lp->mii_bus.reset = mdiobus_reset;
...@@ -975,86 +973,85 @@ static int __init bf537mac_probe(struct net_device *dev) ...@@ -975,86 +973,85 @@ static int __init bf537mac_probe(struct net_device *dev)
for (i = 0; i < PHY_MAX_ADDR; ++i) for (i = 0; i < PHY_MAX_ADDR; ++i)
lp->mii_bus.irq[i] = PHY_POLL; lp->mii_bus.irq[i] = PHY_POLL;
mdiobus_register(&lp->mii_bus); rc = mdiobus_register(&lp->mii_bus);
if (rc) {
dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
goto out_err_mdiobus_register;
}
retval = mii_probe(dev); rc = mii_probe(ndev);
if (retval) if (rc) {
return retval; dev_err(&pdev->dev, "MII Probe failed!\n");
goto out_err_mii_probe;
}
/* Fill in the fields of the device structure with ethernet values. */ /* Fill in the fields of the device structure with ethernet values. */
ether_setup(dev); ether_setup(ndev);
dev->open = bf537mac_open; ndev->open = bfin_mac_open;
dev->stop = bf537mac_close; ndev->stop = bfin_mac_close;
dev->hard_start_xmit = bf537mac_hard_start_xmit; ndev->hard_start_xmit = bfin_mac_hard_start_xmit;
dev->set_mac_address = bf537mac_set_mac_address; ndev->set_mac_address = bfin_mac_set_mac_address;
dev->tx_timeout = bf537mac_timeout; ndev->tx_timeout = bfin_mac_timeout;
dev->set_multicast_list = bf537mac_set_multicast_list; ndev->set_multicast_list = bfin_mac_set_multicast_list;
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = bf537mac_poll; ndev->poll_controller = bfin_mac_poll;
#endif #endif
spin_lock_init(&lp->lock); spin_lock_init(&lp->lock);
/* now, enable interrupts */ /* now, enable interrupts */
/* register irq handler */ /* register irq handler */
if (request_irq rc = request_irq(IRQ_MAC_RX, bfin_mac_interrupt,
(IRQ_MAC_RX, bf537mac_interrupt, IRQF_DISABLED | IRQF_SHARED, IRQF_DISABLED | IRQF_SHARED, "EMAC_RX", ndev);
"EMAC_RX", dev)) { if (rc) {
printk(KERN_WARNING DRV_NAME dev_err(&pdev->dev, "Cannot request Blackfin MAC RX IRQ!\n");
": Unable to attach BlackFin MAC RX interrupt\n"); rc = -EBUSY;
return -EBUSY; goto out_err_request_irq;
}
retval = register_netdev(dev);
if (retval == 0) {
/* now, print out the card info, in a short format.. */
printk(KERN_INFO "%s: Version %s, %s\n",
DRV_NAME, DRV_VERSION, DRV_DESC);
} }
err_out: rc = register_netdev(ndev);
return retval; if (rc) {
} dev_err(&pdev->dev, "Cannot register net device!\n");
goto out_err_reg_ndev;
static int bfin_mac_probe(struct platform_device *pdev)
{
struct net_device *ndev;
ndev = alloc_etherdev(sizeof(struct bf537mac_local));
if (!ndev) {
printk(KERN_WARNING DRV_NAME ": could not allocate device\n");
return -ENOMEM;
} }
SET_NETDEV_DEV(ndev, &pdev->dev); /* now, print out the card info, in a short format.. */
dev_info(&pdev->dev, "%s, Version %s\n", DRV_DESC, DRV_VERSION);
platform_set_drvdata(pdev, ndev); return 0;
if (bf537mac_probe(ndev) != 0) { out_err_reg_ndev:
free_irq(IRQ_MAC_RX, ndev);
out_err_request_irq:
out_err_mii_probe:
mdiobus_unregister(&lp->mii_bus);
out_err_mdiobus_register:
peripheral_free_list(pin_req);
out_err_setup_pin_mux:
out_err_probe_mac:
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
free_netdev(ndev); free_netdev(ndev);
printk(KERN_WARNING DRV_NAME ": not found\n");
return -ENODEV;
}
return 0; return rc;
} }
static int bfin_mac_remove(struct platform_device *pdev) static int bfin_mac_remove(struct platform_device *pdev)
{ {
struct net_device *ndev = platform_get_drvdata(pdev); struct net_device *ndev = platform_get_drvdata(pdev);
struct bfin_mac_local *lp = netdev_priv(ndev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
mdiobus_unregister(&lp->mii_bus);
unregister_netdev(ndev); unregister_netdev(ndev);
free_irq(IRQ_MAC_RX, ndev); free_irq(IRQ_MAC_RX, ndev);
free_netdev(ndev); free_netdev(ndev);
setup_pin_mux(0); peripheral_free_list(pin_req);
return 0; return 0;
} }
...@@ -1065,7 +1062,7 @@ static int bfin_mac_suspend(struct platform_device *pdev, pm_message_t mesg) ...@@ -1065,7 +1062,7 @@ static int bfin_mac_suspend(struct platform_device *pdev, pm_message_t mesg)
struct net_device *net_dev = platform_get_drvdata(pdev); struct net_device *net_dev = platform_get_drvdata(pdev);
if (netif_running(net_dev)) if (netif_running(net_dev))
bf537mac_close(net_dev); bfin_mac_close(net_dev);
return 0; return 0;
} }
...@@ -1075,7 +1072,7 @@ static int bfin_mac_resume(struct platform_device *pdev) ...@@ -1075,7 +1072,7 @@ static int bfin_mac_resume(struct platform_device *pdev)
struct net_device *net_dev = platform_get_drvdata(pdev); struct net_device *net_dev = platform_get_drvdata(pdev);
if (netif_running(net_dev)) if (netif_running(net_dev))
bf537mac_open(net_dev); bfin_mac_open(net_dev);
return 0; return 0;
} }
......
...@@ -49,7 +49,7 @@ struct net_dma_desc_tx { ...@@ -49,7 +49,7 @@ struct net_dma_desc_tx {
struct status_area_tx status; struct status_area_tx status;
}; };
struct bf537mac_local { struct bfin_mac_local {
/* /*
* these are things that the kernel wants me to keep, so users * these are things that the kernel wants me to keep, so users
* can find out semi-useless statistics of how well the card is * can find out semi-useless statistics of how well the card is
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment