static unsigned int net_debug = NET_DEBUG;
struct etherh_priv {
- struct ei_device eidev;
void *ioc_fast;
void *memc;
unsigned int id;
void *ctrl_port;
- unsigned int ctrl;
+ unsigned char ctrl;
};
struct etherh_data {
/* ------------------------------------------------------------------------ */
-static inline void etherh_set_ctrl(struct etherh_priv *eh, unsigned int mask)
+#define etherh_priv(dev) \
+ ((struct etherh_priv *)(((char *)netdev_priv(dev)) + sizeof(struct ei_device)))
+
+static inline void etherh_set_ctrl(struct etherh_priv *eh, unsigned char mask)
{
- eh->ctrl |= mask;
- writeb(eh->ctrl, eh->ctrl_port);
+ unsigned char ctrl = eh->ctrl | mask;
+ eh->ctrl = ctrl;
+ writeb(ctrl, eh->ctrl_port);
}
-static inline void etherh_clr_ctrl(struct etherh_priv *eh, unsigned int mask)
+static inline void etherh_clr_ctrl(struct etherh_priv *eh, unsigned char mask)
{
- eh->ctrl &= ~mask;
- writeb(eh->ctrl, eh->ctrl_port);
+ unsigned char ctrl = eh->ctrl & ~mask;
+ eh->ctrl = ctrl;
+ writeb(ctrl, eh->ctrl_port);
}
static inline unsigned int etherh_get_stat(struct etherh_priv *eh)
static void
etherh_setif(struct net_device *dev)
{
- struct etherh_priv *eh = netdev_priv(dev);
- struct ei_device *ei_local = &eh->eidev;
+ struct ei_device *ei_local = netdev_priv(dev);
unsigned long addr, flags;
local_irq_save(flags);
/* set the interface type */
- switch (eh->id) {
+ switch (etherh_priv(dev)->id) {
case PROD_I3_ETHERLAN600:
case PROD_I3_ETHERLAN600A:
addr = dev->base_addr + EN0_RCNTHI;
case PROD_I3_ETHERLAN500:
switch (dev->if_port) {
case IF_PORT_10BASE2:
- etherh_clr_ctrl(eh, ETHERH_CP_IF);
+ etherh_clr_ctrl(etherh_priv(dev), ETHERH_CP_IF);
break;
case IF_PORT_10BASET:
- etherh_set_ctrl(eh, ETHERH_CP_IF);
+ etherh_set_ctrl(etherh_priv(dev), ETHERH_CP_IF);
break;
}
break;
static int
etherh_getifstat(struct net_device *dev)
{
- struct etherh_priv *eh = netdev_priv(dev);
- struct ei_device *ei_local = &eh->eidev;
+ struct ei_device *ei_local = netdev_priv(dev);
int stat = 0;
- switch (eh->id) {
+ switch (etherh_priv(dev)->id) {
case PROD_I3_ETHERLAN600:
case PROD_I3_ETHERLAN600A:
switch (dev->if_port) {
stat = 1;
break;
case IF_PORT_10BASET:
- stat = etherh_get_stat(eh) & ETHERH_CP_HEARTBEAT;
+ stat = etherh_get_stat(etherh_priv(dev)) & ETHERH_CP_HEARTBEAT;
break;
}
break;
goto release;
}
- eh = netdev_priv(dev);
-
- spin_lock_init(&eh->eidev.page_lock);
-
SET_MODULE_OWNER(dev);
SET_NETDEV_DEV(dev, &ec->dev);
dev->if_port = data->if_port;
dev->flags |= data->flags;
+ eh = etherh_priv(dev);
eh->ctrl = 0;
eh->id = ec->cid.product;
eh->memc = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC), PAGE_SIZE);
etherh_set_ctrl(eh, ETHERH_CP_IE);
}
- ei_local = &eh->eidev;
+ ei_local = netdev_priv(dev);
+ spin_lock_init(&ei_local->page_lock);
+
if (ec->cid.product == PROD_ANT_ETHERM) {
etherm_addr(dev->dev_addr);
ei_local->reg_offset = etherm_regoffsets;
static void __devexit etherh_remove(struct expansion_card *ec)
{
struct net_device *dev = ecard_get_drvdata(ec);
- struct etherh_priv *eh = netdev_priv(dev);
+ struct etherh_priv *eh = etherh_priv(dev);
ecard_set_drvdata(ec, NULL);
unregister_netdev(dev);
+ ec->ops = NULL;
+
if (eh->ioc_fast)
iounmap(eh->ioc_fast);
iounmap(eh->memc);
+
free_netdev(dev);
- ec->ops = NULL;
- kfree(ec->irq_data);
ecard_release_resources(ec);
}