/*********************************************************** * eth_set_multicast_list -- * * Add multicast addresses or set promiscuous mode. * * This function should have been but was not included * * by Marvell. -bbozarth * ***********************************************************/ void mv_eth_set_multicast_list(struct net_device *dev) { mv_eth_priv *priv = MV_ETH_PRIV(dev); int queue = ETH_DEF_RXQ; int i; if (dev->flags & IFF_PROMISC) { mvEthRxFilterModeSet(priv->hal_priv, 1); } else if (dev->flags & IFF_ALLMULTI) { mvEthRxFilterModeSet(priv->hal_priv, 0); mvEthMacAddrSet(priv->hal_priv, dev->dev_addr, queue); mvEthSetSpecialMcastTable(priv->port, queue); mvEthSetOtherMcastTable(priv->port, queue); } else if (!netdev_mc_empty(dev)) { struct netdev_hw_addr *ha; mvEthRxFilterModeSet(priv->hal_priv, 0); mvEthMacAddrSet(priv->hal_priv, dev->dev_addr, queue); netdev_for_each_mc_addr(ha, dev) { mvEthMcastAddrSet(priv->hal_priv, ha->addr, queue); } }
/*********************************************************** * eth_set_mac_addr -- * * stop port activity. set new addr in device and hw. * * restart port activity. * ***********************************************************/ static int mv_eth_set_mac_addr_internals(struct net_device *dev, void *addr ) { mv_eth_priv *priv = MV_ETH_PRIV(dev); u8 *mac = &(((u8*)addr)[2]); /* skip on first 2B (ether HW addr type) */ int i; /* remove previous address table entry */ if( mvEthMacAddrSet( priv->hal_priv, dev->dev_addr, -1) != MV_OK ) { printk( KERN_ERR "%s: ethSetMacAddr failed\n", dev->name ); return -1; } /* set new addr in hw */ if( mvEthMacAddrSet( priv->hal_priv, mac, ETH_DEF_RXQ) != MV_OK ) { printk( KERN_ERR "%s: ethSetMacAddr failed\n", dev->name ); return -1; } /* set addr in the device */ for( i = 0; i < 6; i++ ) dev->dev_addr[i] = mac[i]; printk( KERN_NOTICE "%s: mac address changed\n", dev->name ); return 0; }
/*********************************************************** * eth_set_multicast_list -- * * Add multicast addresses or set promiscuous mode. * * This function should have been but was not included * * by Marvell. -bbozarth * ***********************************************************/ void mv_eth_set_multicast_list(struct net_device *dev) { mv_eth_priv *priv = MV_ETH_PRIV(dev); int queue = ETH_DEF_RXQ; struct dev_mc_list *curr_addr = dev->mc_list; int i; if (dev->flags & IFF_PROMISC) { mvEthRxFilterModeSet(priv->hal_priv, 1); } else if (dev->flags & IFF_ALLMULTI) { mvEthRxFilterModeSet(priv->hal_priv, 0); mvEthMacAddrSet(priv->hal_priv, dev->dev_addr, queue); mvEthSetSpecialMcastTable(priv->port, queue); mvEthSetOtherMcastTable(priv->port, queue); } else if (dev->mc_count) { mvEthRxFilterModeSet(priv->hal_priv, 0); mvEthMacAddrSet(priv->hal_priv, dev->dev_addr, queue); for (i=0; i<dev->mc_count; i++, curr_addr = curr_addr->next) { if (!curr_addr) break; mvEthMcastAddrSet(priv->hal_priv, curr_addr->dmi_addr, queue); } } else /* No Mcast addrs, not promisc or all multi - clear tables */ { mvEthRxFilterModeSet(priv->hal_priv, 0); mvEthMacAddrSet(priv->hal_priv, dev->dev_addr, queue); } }
void ethUcastSet(int port, char* macStr, int queue) { void* pHndl; MV_U8 macAddr[MV_MAC_ADDR_SIZE]; pHndl = mvEthPortHndlGet(port); if(pHndl != NULL) { mvMacStrToHex(macStr, macAddr); mvEthMacAddrSet(pHndl, macAddr, queue); } }
/************************************************************ * mv_eth_open -- Restore MAC address and call to * * mv_eth_start * ************************************************************/ int mv_eth_open( struct net_device *dev ) { mv_eth_priv *priv = MV_ETH_PRIV(dev); int queue = ETH_DEF_RXQ; if( mvEthMacAddrSet( priv->hal_priv, dev->dev_addr, queue) != MV_OK ) { printk( KERN_ERR "%s: ethSetMacAddr failed\n", dev->name ); return -1; } if(mv_eth_start( dev )){ printk( KERN_ERR "%s: start interface failed\n", dev->name ); return -1; } return 0; }