X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/d63beb8f0c1e496ebc2a9c568d13233acdafa82f..5e3ed67a782b5ae7600108ce0568020a807f873a:/target/linux/adm5120/files/drivers/net/adm5120sw.c diff --git a/target/linux/adm5120/files/drivers/net/adm5120sw.c b/target/linux/adm5120/files/drivers/net/adm5120sw.c index 8f3610e90..09cb9097e 100644 --- a/target/linux/adm5120/files/drivers/net/adm5120sw.c +++ b/target/linux/adm5120/files/drivers/net/adm5120sw.c @@ -1,7 +1,7 @@ /* * ADM5120 built-in ethernet switch driver * - * Copyright (C) 2007,2008 Gabor Juhos + * Copyright (C) 2007-2008 Gabor Juhos * * This code was based on a driver for Linux 2.6.xx by Jeroen Vreeken. * Copyright Jeroen Vreeken (pe1rxq@amsat.org), 2005 @@ -24,20 +24,18 @@ #include #include #include +#include +#include #include #include #include -#include -#include - #include -#include -#include -#include -#include +#include +#include +#include #include "adm5120sw.h" @@ -519,7 +517,7 @@ static int adm5120_if_poll(struct napi_struct *napi, int limit) status = sw_int_status() & SWITCH_INTS_POLL; if ((done < limit) && (!status)) { SW_DBG("disable polling mode for %s\n", dev->name); - netif_rx_complete(dev, napi); + napi_complete(napi); sw_int_unmask(SWITCH_INTS_POLL); return 0; } @@ -550,7 +548,7 @@ static irqreturn_t adm5120_switch_irq(int irq, void *dev_id) sw_dump_intr_mask("poll ints", status); SW_DBG("enable polling mode for %s\n", dev->name); sw_int_mask(SWITCH_INTS_POLL); - netif_rx_schedule(dev, &priv->napi); + napi_schedule(&priv->napi); } #else sw_int_ack(status); @@ -810,8 +808,8 @@ static int adm5120_if_open(struct net_device *dev) adm5120_if_napi_enable(dev); - err = request_irq(dev->irq, adm5120_switch_irq, - (IRQF_SHARED | IRQF_DISABLED), dev->name, dev); + err = request_irq(dev->irq, adm5120_switch_irq, IRQF_SHARED, + dev->name, dev); if (err) { SW_ERR("unable to get irq for %s\n", dev->name); goto err; @@ -975,9 +973,12 @@ static void adm5120_if_set_multicast_list(struct net_device *dev) static int adm5120_if_set_mac_address(struct net_device *dev, void *p) { - struct sockaddr *addr = p; + int ret; + + ret = eth_mac_addr(dev, p); + if (ret) + return ret; - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); adm5120_write_mac(dev); return 0; } @@ -1019,6 +1020,18 @@ static int adm5120_if_do_ioctl(struct net_device *dev, struct ifreq *rq, return 0; } +static const struct net_device_ops adm5120sw_netdev_ops = { + .ndo_open = adm5120_if_open, + .ndo_stop = adm5120_if_stop, + .ndo_start_xmit = adm5120_if_hard_start_xmit, + .ndo_set_multicast_list = adm5120_if_set_multicast_list, + .ndo_do_ioctl = adm5120_if_do_ioctl, + .ndo_tx_timeout = adm5120_if_tx_timeout, + .ndo_validate_addr = eth_validate_addr, + .ndo_change_mtu = eth_change_mtu, + .ndo_set_mac_address = adm5120_if_set_mac_address, +}; + static struct net_device *adm5120_if_alloc(void) { struct net_device *dev; @@ -1032,14 +1045,8 @@ static struct net_device *adm5120_if_alloc(void) priv->dev = dev; dev->irq = ADM5120_IRQ_SWITCH; - dev->open = adm5120_if_open; - dev->hard_start_xmit = adm5120_if_hard_start_xmit; - dev->stop = adm5120_if_stop; - dev->set_multicast_list = adm5120_if_set_multicast_list; - dev->do_ioctl = adm5120_if_do_ioctl; - dev->tx_timeout = adm5120_if_tx_timeout; + dev->netdev_ops = &adm5120sw_netdev_ops; dev->watchdog_timeo = TX_TIMEOUT; - dev->set_mac_address = adm5120_if_set_mac_address; #ifdef CONFIG_ADM5120_SWITCH_NAPI netif_napi_add(dev, &priv->napi, adm5120_if_poll, 64); @@ -1200,6 +1207,6 @@ module_init(adm5120_switch_mod_init); module_exit(adm5120_switch_mod_exit); MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Gabor Juhos "); +MODULE_AUTHOR("Gabor Juhos "); MODULE_DESCRIPTION(DRV_DESC); MODULE_VERSION(DRV_VERSION);