diff options
Diffstat (limited to 'drivers/net/mv643xx_eth.c')
-rw-r--r-- | drivers/net/mv643xx_eth.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index b62e61d4ca3e..8613a52ddf17 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -54,8 +54,8 @@ | |||
54 | #include <linux/io.h> | 54 | #include <linux/io.h> |
55 | #include <linux/types.h> | 55 | #include <linux/types.h> |
56 | #include <linux/inet_lro.h> | 56 | #include <linux/inet_lro.h> |
57 | #include <linux/slab.h> | ||
57 | #include <asm/system.h> | 58 | #include <asm/system.h> |
58 | #include <linux/list.h> | ||
59 | 59 | ||
60 | static char mv643xx_eth_driver_name[] = "mv643xx_eth"; | 60 | static char mv643xx_eth_driver_name[] = "mv643xx_eth"; |
61 | static char mv643xx_eth_driver_version[] = "1.4"; | 61 | static char mv643xx_eth_driver_version[] = "1.4"; |
@@ -656,6 +656,7 @@ static int rxq_refill(struct rx_queue *rxq, int budget) | |||
656 | struct sk_buff *skb; | 656 | struct sk_buff *skb; |
657 | int rx; | 657 | int rx; |
658 | struct rx_desc *rx_desc; | 658 | struct rx_desc *rx_desc; |
659 | int size; | ||
659 | 660 | ||
660 | skb = __skb_dequeue(&mp->rx_recycle); | 661 | skb = __skb_dequeue(&mp->rx_recycle); |
661 | if (skb == NULL) | 662 | if (skb == NULL) |
@@ -678,10 +679,11 @@ static int rxq_refill(struct rx_queue *rxq, int budget) | |||
678 | 679 | ||
679 | rx_desc = rxq->rx_desc_area + rx; | 680 | rx_desc = rxq->rx_desc_area + rx; |
680 | 681 | ||
682 | size = skb->end - skb->data; | ||
681 | rx_desc->buf_ptr = dma_map_single(mp->dev->dev.parent, | 683 | rx_desc->buf_ptr = dma_map_single(mp->dev->dev.parent, |
682 | skb->data, mp->skb_size, | 684 | skb->data, size, |
683 | DMA_FROM_DEVICE); | 685 | DMA_FROM_DEVICE); |
684 | rx_desc->buf_size = mp->skb_size; | 686 | rx_desc->buf_size = size; |
685 | rxq->rx_skb[rx] = skb; | 687 | rxq->rx_skb[rx] = skb; |
686 | wmb(); | 688 | wmb(); |
687 | rx_desc->cmd_sts = BUFFER_OWNED_BY_DMA | RX_ENABLE_INTERRUPT; | 689 | rx_desc->cmd_sts = BUFFER_OWNED_BY_DMA | RX_ENABLE_INTERRUPT; |
@@ -849,7 +851,7 @@ no_csum: | |||
849 | return 0; | 851 | return 0; |
850 | } | 852 | } |
851 | 853 | ||
852 | static int mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev) | 854 | static netdev_tx_t mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev) |
853 | { | 855 | { |
854 | struct mv643xx_eth_private *mp = netdev_priv(dev); | 856 | struct mv643xx_eth_private *mp = netdev_priv(dev); |
855 | int queue; | 857 | int queue; |
@@ -1695,7 +1697,7 @@ static u32 uc_addr_filter_mask(struct net_device *dev) | |||
1695 | return 0; | 1697 | return 0; |
1696 | 1698 | ||
1697 | nibbles = 1 << (dev->dev_addr[5] & 0x0f); | 1699 | nibbles = 1 << (dev->dev_addr[5] & 0x0f); |
1698 | list_for_each_entry(ha, &dev->uc.list, list) { | 1700 | netdev_for_each_uc_addr(ha, dev) { |
1699 | if (memcmp(dev->dev_addr, ha->addr, 5)) | 1701 | if (memcmp(dev->dev_addr, ha->addr, 5)) |
1700 | return 0; | 1702 | return 0; |
1701 | if ((dev->dev_addr[5] ^ ha->addr[5]) & 0xf0) | 1703 | if ((dev->dev_addr[5] ^ ha->addr[5]) & 0xf0) |
@@ -1793,7 +1795,7 @@ oom: | |||
1793 | memset(mc_spec, 0, 0x100); | 1795 | memset(mc_spec, 0, 0x100); |
1794 | memset(mc_other, 0, 0x100); | 1796 | memset(mc_other, 0, 0x100); |
1795 | 1797 | ||
1796 | for (addr = dev->mc_list; addr != NULL; addr = addr->next) { | 1798 | netdev_for_each_mc_addr(addr, dev) { |
1797 | u8 *a = addr->da_addr; | 1799 | u8 *a = addr->da_addr; |
1798 | u32 *table; | 1800 | u32 *table; |
1799 | int entry; | 1801 | int entry; |
@@ -1827,6 +1829,9 @@ static int mv643xx_eth_set_mac_address(struct net_device *dev, void *addr) | |||
1827 | { | 1829 | { |
1828 | struct sockaddr *sa = addr; | 1830 | struct sockaddr *sa = addr; |
1829 | 1831 | ||
1832 | if (!is_valid_ether_addr(sa->sa_data)) | ||
1833 | return -EINVAL; | ||
1834 | |||
1830 | memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN); | 1835 | memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN); |
1831 | 1836 | ||
1832 | netif_addr_lock_bh(dev); | 1837 | netif_addr_lock_bh(dev); |
@@ -2842,6 +2847,7 @@ static const struct net_device_ops mv643xx_eth_netdev_ops = { | |||
2842 | .ndo_start_xmit = mv643xx_eth_xmit, | 2847 | .ndo_start_xmit = mv643xx_eth_xmit, |
2843 | .ndo_set_rx_mode = mv643xx_eth_set_rx_mode, | 2848 | .ndo_set_rx_mode = mv643xx_eth_set_rx_mode, |
2844 | .ndo_set_mac_address = mv643xx_eth_set_mac_address, | 2849 | .ndo_set_mac_address = mv643xx_eth_set_mac_address, |
2850 | .ndo_validate_addr = eth_validate_addr, | ||
2845 | .ndo_do_ioctl = mv643xx_eth_ioctl, | 2851 | .ndo_do_ioctl = mv643xx_eth_ioctl, |
2846 | .ndo_change_mtu = mv643xx_eth_change_mtu, | 2852 | .ndo_change_mtu = mv643xx_eth_change_mtu, |
2847 | .ndo_tx_timeout = mv643xx_eth_tx_timeout, | 2853 | .ndo_tx_timeout = mv643xx_eth_tx_timeout, |