Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -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);
}

/*
+1 −1
Original line number Diff line number Diff line
@@ -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);
+8 −10
Original line number Diff line number Diff line
@@ -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));

		mc_filter |= 1ULL << (bit_nr & 0x3f);
	}

	MACvWriteMultiAddr(pDevice, mc_filter);

        pDevice->byRxMode &= ~(RCR_UNICAST);
        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
    }