diff options
Diffstat (limited to 'drivers/net/ks8851.c')
-rw-r--r-- | drivers/net/ks8851.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/net/ks8851.c b/drivers/net/ks8851.c index a23f739d222f..9e9f9b349766 100644 --- a/drivers/net/ks8851.c +++ b/drivers/net/ks8851.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* drivers/net/ks8651.c | 1 | /* drivers/net/ks8851.c |
2 | * | 2 | * |
3 | * Copyright 2009 Simtec Electronics | 3 | * Copyright 2009 Simtec Electronics |
4 | * http://www.simtec.co.uk/ | 4 | * http://www.simtec.co.uk/ |
@@ -407,7 +407,7 @@ static irqreturn_t ks8851_irq(int irq, void *pw) | |||
407 | * @buff: The buffer address | 407 | * @buff: The buffer address |
408 | * @len: The length of the data to read | 408 | * @len: The length of the data to read |
409 | * | 409 | * |
410 | * Issue an RXQ FIFO read command and read the @len ammount of data from | 410 | * Issue an RXQ FIFO read command and read the @len amount of data from |
411 | * the FIFO into the buffer specified by @buff. | 411 | * the FIFO into the buffer specified by @buff. |
412 | */ | 412 | */ |
413 | static void ks8851_rdfifo(struct ks8851_net *ks, u8 *buff, unsigned len) | 413 | static void ks8851_rdfifo(struct ks8851_net *ks, u8 *buff, unsigned len) |
@@ -714,7 +714,7 @@ static void ks8851_tx_work(struct work_struct *work) | |||
714 | { | 714 | { |
715 | struct ks8851_net *ks = container_of(work, struct ks8851_net, tx_work); | 715 | struct ks8851_net *ks = container_of(work, struct ks8851_net, tx_work); |
716 | struct sk_buff *txb; | 716 | struct sk_buff *txb; |
717 | bool last = false; | 717 | bool last = skb_queue_empty(&ks->txq); |
718 | 718 | ||
719 | mutex_lock(&ks->lock); | 719 | mutex_lock(&ks->lock); |
720 | 720 | ||
@@ -722,12 +722,14 @@ static void ks8851_tx_work(struct work_struct *work) | |||
722 | txb = skb_dequeue(&ks->txq); | 722 | txb = skb_dequeue(&ks->txq); |
723 | last = skb_queue_empty(&ks->txq); | 723 | last = skb_queue_empty(&ks->txq); |
724 | 724 | ||
725 | ks8851_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA); | 725 | if (txb != NULL) { |
726 | ks8851_wrpkt(ks, txb, last); | 726 | ks8851_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA); |
727 | ks8851_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); | 727 | ks8851_wrpkt(ks, txb, last); |
728 | ks8851_wrreg16(ks, KS_TXQCR, TXQCR_METFE); | 728 | ks8851_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); |
729 | ks8851_wrreg16(ks, KS_TXQCR, TXQCR_METFE); | ||
729 | 730 | ||
730 | ks8851_done_tx(ks, txb); | 731 | ks8851_done_tx(ks, txb); |
732 | } | ||
731 | } | 733 | } |
732 | 734 | ||
733 | mutex_unlock(&ks->lock); | 735 | mutex_unlock(&ks->lock); |
@@ -965,19 +967,17 @@ static void ks8851_set_rx_mode(struct net_device *dev) | |||
965 | 967 | ||
966 | rxctrl.rxcr1 = (RXCR1_RXME | RXCR1_RXAE | | 968 | rxctrl.rxcr1 = (RXCR1_RXME | RXCR1_RXAE | |
967 | RXCR1_RXPAFMA | RXCR1_RXMAFMA); | 969 | RXCR1_RXPAFMA | RXCR1_RXMAFMA); |
968 | } else if (dev->flags & IFF_MULTICAST && dev->mc_count > 0) { | 970 | } else if (dev->flags & IFF_MULTICAST && !netdev_mc_empty(dev)) { |
969 | struct dev_mc_list *mcptr = dev->mc_list; | 971 | struct dev_mc_list *mcptr; |
970 | u32 crc; | 972 | u32 crc; |
971 | int i; | ||
972 | 973 | ||
973 | /* accept some multicast */ | 974 | /* accept some multicast */ |
974 | 975 | ||
975 | for (i = dev->mc_count; i > 0; i--) { | 976 | netdev_for_each_mc_addr(mcptr, dev) { |
976 | crc = ether_crc(ETH_ALEN, mcptr->dmi_addr); | 977 | crc = ether_crc(ETH_ALEN, mcptr->dmi_addr); |
977 | crc >>= (32 - 6); /* get top six bits */ | 978 | crc >>= (32 - 6); /* get top six bits */ |
978 | 979 | ||
979 | rxctrl.mchash[crc >> 4] |= (1 << (crc & 0xf)); | 980 | rxctrl.mchash[crc >> 4] |= (1 << (crc & 0xf)); |
980 | mcptr = mcptr->next; | ||
981 | } | 981 | } |
982 | 982 | ||
983 | rxctrl.rxcr1 = RXCR1_RXME | RXCR1_RXPAFMA; | 983 | rxctrl.rxcr1 = RXCR1_RXME | RXCR1_RXPAFMA; |