mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-04 03:33:58 +08:00
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: Joe Perches <joe@perches.com> Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
bacb6de62c
commit
0ca3e288dd
@ -47,25 +47,19 @@ static int msglevel =MSG_LEVEL_INFO;
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* uByteidx - Index of Mask
|
||||
* byData - Mask Value to write
|
||||
* mc_filter (mac filter)
|
||||
* Out:
|
||||
* 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,
|
||||
(u16) (MAC_REG_MAR0 + uByteIdx),
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
1,
|
||||
&byData1);
|
||||
CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, MAC_REG_MAR0,
|
||||
MESSAGE_REQUEST_MACREG, sizeof(le_mc), (u8 *)&le_mc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -403,7 +403,7 @@
|
||||
#define MAC_REVISION_A0 0x00
|
||||
#define MAC_REVISION_A1 0x01
|
||||
|
||||
void MACvWriteMultiAddr(struct vnt_private *, u32, u8);
|
||||
void MACvWriteMultiAddr(struct vnt_private *, u64);
|
||||
void MACbShutdown(struct vnt_private *);
|
||||
void MACvSetBBType(struct vnt_private *, u8);
|
||||
void MACvDisableKeyEntry(struct vnt_private *, u32);
|
||||
|
@ -1353,8 +1353,7 @@ static void device_set_multi(struct net_device *dev)
|
||||
struct vnt_private *pDevice = netdev_priv(dev);
|
||||
struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
|
||||
struct netdev_hw_addr *ha;
|
||||
u32 mc_filter[2];
|
||||
int ii;
|
||||
u64 mc_filter = 0;
|
||||
u8 pbyData[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
u8 byTmpMode = 0;
|
||||
int rc;
|
||||
@ -1388,15 +1387,14 @@ static void device_set_multi(struct net_device *dev)
|
||||
pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
|
||||
}
|
||||
else {
|
||||
memset(mc_filter, 0, sizeof(mc_filter));
|
||||
netdev_for_each_mc_addr(ha, dev) {
|
||||
int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
|
||||
mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
|
||||
}
|
||||
for (ii = 0; ii < 4; ii++) {
|
||||
MACvWriteMultiAddr(pDevice, ii, *((u8 *)&mc_filter[0] + ii));
|
||||
MACvWriteMultiAddr(pDevice, ii+ 4, *((u8 *)&mc_filter[1] + ii));
|
||||
}
|
||||
int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
|
||||
|
||||
mc_filter |= 1ULL << (bit_nr & 0x3f);
|
||||
}
|
||||
|
||||
MACvWriteMultiAddr(pDevice, mc_filter);
|
||||
|
||||
pDevice->byRxMode &= ~(RCR_UNICAST);
|
||||
pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user