Commit 27daf6ed authored by Michael Grzeschik's avatar Michael Grzeschik

arcnet: com20020: add enable and disable device on open/close

This patch changes the driver to properly work with the linux netif
interface. The controller gets enabled on open and disabled on close.
Therefor it removes every bogus start of the xceiver. It only gets
enabled on com20020_open and disabled on com20020_close.
Signed-off-by: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
parent b82de0e2
...@@ -118,7 +118,7 @@ int com20020_check(struct net_device *dev) ...@@ -118,7 +118,7 @@ int com20020_check(struct net_device *dev)
arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND); arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND);
} }
lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE; lp->config = (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE;
/* set node ID to 0x42 (but transmitter is disabled, so it's okay) */ /* set node ID to 0x42 (but transmitter is disabled, so it's okay) */
arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG); arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
arcnet_outb(0x42, ioaddr, COM20020_REG_W_XREG); arcnet_outb(0x42, ioaddr, COM20020_REG_W_XREG);
...@@ -131,11 +131,6 @@ int com20020_check(struct net_device *dev) ...@@ -131,11 +131,6 @@ int com20020_check(struct net_device *dev)
} }
arc_printk(D_INIT_REASONS, dev, "status after reset: %X\n", status); arc_printk(D_INIT_REASONS, dev, "status after reset: %X\n", status);
/* Enable TX */
lp->config |= TXENcfg;
arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
arcnet_outb(arcnet_inb(ioaddr, 8), ioaddr, COM20020_REG_W_XREG);
arcnet_outb(CFLAGScmd | RESETclear | CONFIGclear, arcnet_outb(CFLAGScmd | RESETclear | CONFIGclear,
ioaddr, COM20020_REG_W_COMMAND); ioaddr, COM20020_REG_W_COMMAND);
status = arcnet_inb(ioaddr, COM20020_REG_R_STATUS); status = arcnet_inb(ioaddr, COM20020_REG_R_STATUS);
...@@ -169,9 +164,33 @@ static int com20020_set_hwaddr(struct net_device *dev, void *addr) ...@@ -169,9 +164,33 @@ static int com20020_set_hwaddr(struct net_device *dev, void *addr)
return 0; return 0;
} }
static int com20020_netdev_open(struct net_device *dev)
{
int ioaddr = dev->base_addr;
struct arcnet_local *lp = netdev_priv(dev);
lp->config |= TXENcfg;
arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
return arcnet_open(dev);
}
static int com20020_netdev_close(struct net_device *dev)
{
int ioaddr = dev->base_addr;
struct arcnet_local *lp = netdev_priv(dev);
arcnet_close(dev);
/* disable transmitter */
lp->config &= ~TXENcfg;
arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
return 0;
}
const struct net_device_ops com20020_netdev_ops = { const struct net_device_ops com20020_netdev_ops = {
.ndo_open = arcnet_open, .ndo_open = com20020_netdev_open,
.ndo_stop = arcnet_close, .ndo_stop = com20020_netdev_close,
.ndo_start_xmit = arcnet_send_packet, .ndo_start_xmit = arcnet_send_packet,
.ndo_tx_timeout = arcnet_timeout, .ndo_tx_timeout = arcnet_timeout,
.ndo_set_mac_address = com20020_set_hwaddr, .ndo_set_mac_address = com20020_set_hwaddr,
...@@ -215,7 +234,7 @@ int com20020_found(struct net_device *dev, int shared) ...@@ -215,7 +234,7 @@ int com20020_found(struct net_device *dev, int shared)
arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND); arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND);
} }
lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE; lp->config = (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE;
/* Default 0x38 + register: Node ID */ /* Default 0x38 + register: Node ID */
arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG); arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
arcnet_outb(dev->dev_addr[0], ioaddr, COM20020_REG_W_XREG); arcnet_outb(dev->dev_addr[0], ioaddr, COM20020_REG_W_XREG);
...@@ -274,7 +293,7 @@ static int com20020_reset(struct net_device *dev, int really_reset) ...@@ -274,7 +293,7 @@ static int com20020_reset(struct net_device *dev, int really_reset)
dev->name, arcnet_inb(ioaddr, COM20020_REG_R_STATUS)); dev->name, arcnet_inb(ioaddr, COM20020_REG_R_STATUS));
arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__); arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__);
lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2); lp->config |= (lp->timeout << 3) | (lp->backplane << 2);
/* power-up defaults */ /* power-up defaults */
arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG); arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__); arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__);
......
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