@@ -2039,12 +2039,13 @@ static void ucc_geth_memclean(struct ucc_geth_private *ugeth)
skb_queue_purge(&ugeth->rx_recycle);
}
-static void ucc_geth_set_multi(struct net_device *dev)
+static void ucc_geth_set_rx_mode(struct net_device *dev)
{
struct ucc_geth_private *ugeth;
struct netdev_hw_addr *ha;
struct ucc_fast __iomem *uf_regs;
struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt;
+ int i;
ugeth = netdev_priv(dev);
@@ -2059,6 +2060,22 @@ static void ucc_geth_set_multi(struct net_device *dev)
(struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth->
p_rx_glbl_pram->addressfiltering;
+ /* Clear filter and add the addresses in the list.
+ */
+ out_be32(&p_82xx_addr_filt->iaddr_h, 0x0);
+ out_be32(&p_82xx_addr_filt->iaddr_l, 0x0);
+ i = 0;
+ netdev_for_each_uc_addr(ha, dev) {
+ if ( i < NUM_OF_PADDRS )
+ set_mac_addr(&p_82xx_addr_filt->paddr[i].h, ha->addr);
+ else
+ hw_add_addr_in_hash(ugeth, ha->addr);
+ i++;
+ }
+ /* Pad remaining entries with station address */
+ for(; i < NUM_OF_PADDRS; i++)
+ set_mac_addr(&p_82xx_addr_filt->paddr[i].h, dev->dev_addr);
+
if (dev->flags & IFF_ALLMULTI) {
/* Catch all multicast addresses, so set the
* filter to all 1's.
@@ -3807,7 +3824,7 @@ static const struct net_device_ops ucc_geth_netdev_ops = {
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = ucc_geth_set_mac_addr,
.ndo_change_mtu = eth_change_mtu,
- .ndo_set_rx_mode = ucc_geth_set_multi,
+ .ndo_set_rx_mode = ucc_geth_set_rx_mode,
.ndo_tx_timeout = ucc_geth_timeout,
.ndo_do_ioctl = ucc_geth_ioctl,
#ifdef CONFIG_NET_POLL_CONTROLLER
@@ -4017,6 +4034,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
ugeth->msg_enable = netif_msg_init(debug.msg_enable, UGETH_MSG_DEFAULT);
ugeth->phy_interface = phy_interface;
ugeth->max_speed = max_speed;
+ dev->priv_flags |= IFF_UNICAST_FLT;
err = register_netdev(dev);
if (err) {