/* Protected by dev->xmit_lock. */ static void tsi108_set_rx_mode(net_device * dev) { tsi108_prv_data *data = netdev_priv(dev); u32 rxcfg = TSI108_ETH_READ_REG(TSI108_EC_RXCFG); if (dev->flags & IFF_PROMISC) { rxcfg &= ~(TSI108_EC_RXCFG_UC_HASH | TSI108_EC_RXCFG_MC_HASH); rxcfg |= TSI108_EC_RXCFG_UFE | TSI108_EC_RXCFG_MFE; goto out; } rxcfg &= ~(TSI108_EC_RXCFG_UFE | TSI108_EC_RXCFG_MFE); if (dev->mc_count) { int i; struct dev_mc_list *mc = dev->mc_list; rxcfg |= TSI108_EC_RXCFG_MFE | TSI108_EC_RXCFG_MC_HASH; memset(data->mc_hash, 0, sizeof(data->mc_hash)); while (mc) { u32 hash, crc; if (mc->dmi_addrlen == 6) { crc = ether_crc(6, mc->dmi_addr); hash = crc >> 23; __set_bit(hash, &data->mc_hash[0]); } else {
static void bfin_mac_multicast_hash(struct net_device *dev) { u32 emac_hashhi, emac_hashlo; struct dev_mc_list *dmi = dev->mc_list; char *addrs; int i; u32 crc; emac_hashhi = emac_hashlo = 0; for (i = 0; i < dev->mc_count; i++) { addrs = dmi->dmi_addr; dmi = dmi->next; /* skip non-multicast addresses */ if (!(*addrs & 1)) continue; crc = ether_crc(ETH_ALEN, addrs); crc >>= 26; if (crc & 0x20) emac_hashhi |= 1 << (crc & 0x1f); else emac_hashlo |= 1 << (crc & 0x1f); } bfin_write_EMAC_HASHHI(emac_hashhi); bfin_write_EMAC_HASHLO(emac_hashlo); return; }
void SetupDeviceForMulticast(struct et131x_adapter *pAdapter) { struct _RXMAC_t __iomem *rxmac = &pAdapter->CSRAddress->rxmac; uint32_t nIndex; uint32_t result; uint32_t hash1 = 0; uint32_t hash2 = 0; uint32_t hash3 = 0; uint32_t hash4 = 0; PM_CSR_t pm_csr; DBG_ENTER(et131x_dbginfo); /* If ET131X_PACKET_TYPE_MULTICAST is specified, then we provision * the multi-cast LIST. If it is NOT specified, (and "ALL" is not * specified) then we should pass NO multi-cast addresses to the * driver. */ if (pAdapter->PacketFilter & ET131X_PACKET_TYPE_MULTICAST) { DBG_VERBOSE(et131x_dbginfo, "MULTICAST flag is set, MCCount: %d\n", pAdapter->MCAddressCount); /* Loop through our multicast array and set up the device */ for (nIndex = 0; nIndex < pAdapter->MCAddressCount; nIndex++) { DBG_VERBOSE(et131x_dbginfo, "MCList[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n", nIndex, pAdapter->MCList[nIndex][0], pAdapter->MCList[nIndex][1], pAdapter->MCList[nIndex][2], pAdapter->MCList[nIndex][3], pAdapter->MCList[nIndex][4], pAdapter->MCList[nIndex][5]); result = ether_crc(6, pAdapter->MCList[nIndex]); result = (result & 0x3F800000) >> 23; if (result < 32) { hash1 |= (1 << result); } else if ((31 < result) && (result < 64)) { result -= 32; hash2 |= (1 << result); } else if ((63 < result) && (result < 96)) { result -= 64; hash3 |= (1 << result); } else { result -= 96; hash4 |= (1 << result); } } }
void SetupDeviceForMulticast(struct et131x_adapter *etdev) { struct _RXMAC_t __iomem *rxmac = &etdev->regs->rxmac; uint32_t nIndex; uint32_t result; uint32_t hash1 = 0; uint32_t hash2 = 0; uint32_t hash3 = 0; uint32_t hash4 = 0; u32 pm_csr; /* If ET131X_PACKET_TYPE_MULTICAST is specified, then we provision * the multi-cast LIST. If it is NOT specified, (and "ALL" is not * specified) then we should pass NO multi-cast addresses to the * driver. */ if (etdev->PacketFilter & ET131X_PACKET_TYPE_MULTICAST) { /* Loop through our multicast array and set up the device */ for (nIndex = 0; nIndex < etdev->MCAddressCount; nIndex++) { result = ether_crc(6, etdev->MCList[nIndex]); result = (result & 0x3F800000) >> 23; if (result < 32) { hash1 |= (1 << result); } else if ((31 < result) && (result < 64)) { result -= 32; hash2 |= (1 << result); } else if ((63 < result) && (result < 96)) { result -= 64; hash3 |= (1 << result); } else { result -= 96; hash4 |= (1 << result); } } } /* Write out the new hash to the device */ pm_csr = readl(&etdev->regs->global.pm_csr); if ((pm_csr & ET_PM_PHY_SW_COMA) == 0) { writel(hash1, &rxmac->multi_hash1); writel(hash2, &rxmac->multi_hash2); writel(hash3, &rxmac->multi_hash3); writel(hash4, &rxmac->multi_hash4); } }
void SetupDeviceForMulticast(struct et131x_adapter *etdev) { struct _RXMAC_t __iomem *rxmac = &etdev->regs->rxmac; uint32_t nIndex; uint32_t result; uint32_t hash1 = 0; uint32_t hash2 = 0; uint32_t hash3 = 0; uint32_t hash4 = 0; u32 pm_csr; if (etdev->PacketFilter & ET131X_PACKET_TYPE_MULTICAST) { for (nIndex = 0; nIndex < etdev->MCAddressCount; nIndex++) { result = ether_crc(6, etdev->MCList[nIndex]); result = (result & 0x3F800000) >> 23; if (result < 32) { hash1 |= (1 << result); } else if ((31 < result) && (result < 64)) { result -= 32; hash2 |= (1 << result); } else if ((63 < result) && (result < 96)) { result -= 64; hash3 |= (1 << result); } else { result -= 96; hash4 |= (1 << result); } } } pm_csr = readl(&etdev->regs->global.pm_csr); if ((pm_csr & ET_PM_PHY_SW_COMA) == 0) { writel(hash1, &rxmac->multi_hash1); writel(hash2, &rxmac->multi_hash2); writel(hash3, &rxmac->multi_hash3); writel(hash4, &rxmac->multi_hash4); } }
static void bfin_mac_multicast_hash(struct net_device *dev) { u32 emac_hashhi, emac_hashlo; struct netdev_hw_addr *ha; char *addrs; u32 crc; emac_hashhi = emac_hashlo = 0; netdev_for_each_mc_addr(ha, dev) { addrs = ha->addr; /* skip non-multicast addresses */ if (!(*addrs & 1)) continue; crc = ether_crc(ETH_ALEN, addrs); crc >>= 26; if (crc & 0x20) emac_hashhi |= 1 << (crc & 0x1f); else emac_hashlo |= 1 << (crc & 0x1f); }
static u32 greth_hash_get_index(__u8 *addr) { return (ether_crc(6, addr)) & 0x3F; }