Commit 0ca3e288 authored by Malcolm Priestley's avatar Malcolm Priestley Committed by Greg Kroah-Hartman

staging: vt6656: device_set_multi: covert mc_filter to u64

Convert mc_filter to u64, preform netdev_for_each_mc_addr
mask filtering.

In MACvWriteMultiAddr endian correct mc_filter and write
the entire multicast once.
Reported-by: default avatarJoe Perches <joe@perches.com>
Signed-off-by: default avatarMalcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bacb6de6
...@@ -47,25 +47,19 @@ static int msglevel =MSG_LEVEL_INFO; ...@@ -47,25 +47,19 @@ static int msglevel =MSG_LEVEL_INFO;
* *
* Parameters: * Parameters:
* In: * In:
* uByteidx - Index of Mask * mc_filter (mac filter)
* byData - Mask Value to write
* Out: * Out:
* none * none
* *
* Return Value: none * Return Value: none
* *
*/ */
void MACvWriteMultiAddr(struct vnt_private *pDevice, u32 uByteIdx, u8 byData) void MACvWriteMultiAddr(struct vnt_private *pDevice, u64 mc_filter)
{ {
u8 byData1; __le64 le_mc = cpu_to_le64(mc_filter);
byData1 = byData; CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, MAC_REG_MAR0,
CONTROLnsRequestOut(pDevice, MESSAGE_REQUEST_MACREG, sizeof(le_mc), (u8 *)&le_mc);
MESSAGE_TYPE_WRITE,
(u16) (MAC_REG_MAR0 + uByteIdx),
MESSAGE_REQUEST_MACREG,
1,
&byData1);
} }
/* /*
......
...@@ -403,7 +403,7 @@ ...@@ -403,7 +403,7 @@
#define MAC_REVISION_A0 0x00 #define MAC_REVISION_A0 0x00
#define MAC_REVISION_A1 0x01 #define MAC_REVISION_A1 0x01
void MACvWriteMultiAddr(struct vnt_private *, u32, u8); void MACvWriteMultiAddr(struct vnt_private *, u64);
void MACbShutdown(struct vnt_private *); void MACbShutdown(struct vnt_private *);
void MACvSetBBType(struct vnt_private *, u8); void MACvSetBBType(struct vnt_private *, u8);
void MACvDisableKeyEntry(struct vnt_private *, u32); void MACvDisableKeyEntry(struct vnt_private *, u32);
......
...@@ -1353,8 +1353,7 @@ static void device_set_multi(struct net_device *dev) ...@@ -1353,8 +1353,7 @@ static void device_set_multi(struct net_device *dev)
struct vnt_private *pDevice = netdev_priv(dev); struct vnt_private *pDevice = netdev_priv(dev);
struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
struct netdev_hw_addr *ha; struct netdev_hw_addr *ha;
u32 mc_filter[2]; u64 mc_filter = 0;
int ii;
u8 pbyData[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; u8 pbyData[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
u8 byTmpMode = 0; u8 byTmpMode = 0;
int rc; int rc;
...@@ -1388,15 +1387,14 @@ static void device_set_multi(struct net_device *dev) ...@@ -1388,15 +1387,14 @@ static void device_set_multi(struct net_device *dev)
pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST); pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
} }
else { else {
memset(mc_filter, 0, sizeof(mc_filter));
netdev_for_each_mc_addr(ha, dev) { netdev_for_each_mc_addr(ha, dev) {
int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26; int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
} mc_filter |= 1ULL << (bit_nr & 0x3f);
for (ii = 0; ii < 4; ii++) {
MACvWriteMultiAddr(pDevice, ii, *((u8 *)&mc_filter[0] + ii));
MACvWriteMultiAddr(pDevice, ii+ 4, *((u8 *)&mc_filter[1] + ii));
} }
MACvWriteMultiAddr(pDevice, mc_filter);
pDevice->byRxMode &= ~(RCR_UNICAST); pDevice->byRxMode &= ~(RCR_UNICAST);
pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST); pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment