aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Grzeschik <m.grzeschik@pengutronix.de>2015-03-20 10:20:59 -0400
committerMichael Grzeschik <m.grzeschik@pengutronix.de>2015-10-26 04:10:56 -0400
commit27daf6ed5c1fbeca9029c59c7f4f70a5c7e13531 (patch)
tree2f22c4e2a30858e6691b4b7aa86ffdbd6a42635a
parentb82de0e28ccac15e1a0c3b4f6f20dfd230049041 (diff)
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: Michael Grzeschik <m.grzeschik@pengutronix.de>
-rw-r--r--drivers/net/arcnet/com20020.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/drivers/net/arcnet/com20020.c b/drivers/net/arcnet/com20020.c
index c82f323a8c2b..13d9ad4b3f5c 100644
--- a/drivers/net/arcnet/com20020.c
+++ b/drivers/net/arcnet/com20020.c
@@ -118,7 +118,7 @@ int com20020_check(struct net_device *dev)
118 arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND); 118 arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND);
119 } 119 }
120 120
121 lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE; 121 lp->config = (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE;
122 /* set node ID to 0x42 (but transmitter is disabled, so it's okay) */ 122 /* set node ID to 0x42 (but transmitter is disabled, so it's okay) */
123 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG); 123 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
124 arcnet_outb(0x42, ioaddr, COM20020_REG_W_XREG); 124 arcnet_outb(0x42, ioaddr, COM20020_REG_W_XREG);
@@ -131,11 +131,6 @@ int com20020_check(struct net_device *dev)
131 } 131 }
132 arc_printk(D_INIT_REASONS, dev, "status after reset: %X\n", status); 132 arc_printk(D_INIT_REASONS, dev, "status after reset: %X\n", status);
133 133
134 /* Enable TX */
135 lp->config |= TXENcfg;
136 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
137 arcnet_outb(arcnet_inb(ioaddr, 8), ioaddr, COM20020_REG_W_XREG);
138
139 arcnet_outb(CFLAGScmd | RESETclear | CONFIGclear, 134 arcnet_outb(CFLAGScmd | RESETclear | CONFIGclear,
140 ioaddr, COM20020_REG_W_COMMAND); 135 ioaddr, COM20020_REG_W_COMMAND);
141 status = arcnet_inb(ioaddr, COM20020_REG_R_STATUS); 136 status = arcnet_inb(ioaddr, COM20020_REG_R_STATUS);
@@ -169,9 +164,33 @@ static int com20020_set_hwaddr(struct net_device *dev, void *addr)
169 return 0; 164 return 0;
170} 165}
171 166
167static int com20020_netdev_open(struct net_device *dev)
168{
169 int ioaddr = dev->base_addr;
170 struct arcnet_local *lp = netdev_priv(dev);
171
172 lp->config |= TXENcfg;
173 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
174
175 return arcnet_open(dev);
176}
177
178static int com20020_netdev_close(struct net_device *dev)
179{
180 int ioaddr = dev->base_addr;
181 struct arcnet_local *lp = netdev_priv(dev);
182
183 arcnet_close(dev);
184
185 /* disable transmitter */
186 lp->config &= ~TXENcfg;
187 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
188 return 0;
189}
190
172const struct net_device_ops com20020_netdev_ops = { 191const struct net_device_ops com20020_netdev_ops = {
173 .ndo_open = arcnet_open, 192 .ndo_open = com20020_netdev_open,
174 .ndo_stop = arcnet_close, 193 .ndo_stop = com20020_netdev_close,
175 .ndo_start_xmit = arcnet_send_packet, 194 .ndo_start_xmit = arcnet_send_packet,
176 .ndo_tx_timeout = arcnet_timeout, 195 .ndo_tx_timeout = arcnet_timeout,
177 .ndo_set_mac_address = com20020_set_hwaddr, 196 .ndo_set_mac_address = com20020_set_hwaddr,
@@ -215,7 +234,7 @@ int com20020_found(struct net_device *dev, int shared)
215 arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND); 234 arcnet_outb(STARTIOcmd, ioaddr, COM20020_REG_W_COMMAND);
216 } 235 }
217 236
218 lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE; 237 lp->config = (lp->timeout << 3) | (lp->backplane << 2) | SUB_NODE;
219 /* Default 0x38 + register: Node ID */ 238 /* Default 0x38 + register: Node ID */
220 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG); 239 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
221 arcnet_outb(dev->dev_addr[0], ioaddr, COM20020_REG_W_XREG); 240 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 dev->name, arcnet_inb(ioaddr, COM20020_REG_R_STATUS)); 293 dev->name, arcnet_inb(ioaddr, COM20020_REG_R_STATUS));
275 294
276 arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__); 295 arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__);
277 lp->config = TXENcfg | (lp->timeout << 3) | (lp->backplane << 2); 296 lp->config |= (lp->timeout << 3) | (lp->backplane << 2);
278 /* power-up defaults */ 297 /* power-up defaults */
279 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG); 298 arcnet_outb(lp->config, ioaddr, COM20020_REG_W_CONFIG);
280 arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__); 299 arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__);