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: Bryan Wu <cooloney@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
4e5b864e7c
commit
7ef0a7ee2f
@ -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;
|
|||||||
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:
|
|||||||
|
|
||||||
/*---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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#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)
|
|||||||
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:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
|||||||
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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = register_netdev(ndev);
|
||||||
retval = register_netdev(dev);
|
if (rc) {
|
||||||
if (retval == 0) {
|
dev_err(&pdev->dev, "Cannot register net device!\n");
|
||||||
/* now, print out the card info, in a short format.. */
|
goto out_err_reg_ndev;
|
||||||
printk(KERN_INFO "%s: Version %s, %s\n",
|
|
||||||
DRV_NAME, DRV_VERSION, DRV_DESC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err_out:
|
/* now, print out the card info, in a short format.. */
|
||||||
return retval;
|
dev_info(&pdev->dev, "%s, Version %s\n", DRV_DESC, DRV_VERSION);
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
platform_set_drvdata(pdev, ndev);
|
|
||||||
|
|
||||||
if (bf537mac_probe(ndev) != 0) {
|
|
||||||
platform_set_drvdata(pdev, NULL);
|
|
||||||
free_netdev(ndev);
|
|
||||||
printk(KERN_WARNING DRV_NAME ": not found\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 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);
|
||||||
|
free_netdev(ndev);
|
||||||
|
|
||||||
|
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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user