> +static void fill_vf_station_mac_addr(struct adapter *adap)
> +{
> +     unsigned int i;
> +     u8 hw_addr[ETH_ALEN], macaddr[ETH_ALEN];
> +     int err;
> +     u8 *na;
> +     u16 a, b;
> +
> +     err = t4_get_raw_vpd_params(adap, &adap->params.vpd);
> +     if (!err) {
> +             na = adap->params.vpd.na;
> +             for (i = 0; i < ETH_ALEN; i++)
> +                     hw_addr[i] = (hex2val(na[2 * i + 0]) * 16 +
> +                                   hex2val(na[2 * i + 1]));
> +             a = (hw_addr[0] << 8) | hw_addr[1];
> +             b = (hw_addr[1] << 8) | hw_addr[2];
> +             a ^= b;
> +             a |= 0x0200;    /* locally assigned Ethernet MAC address */
> +             a &= ~0x0100;   /* not a multicast Ethernet MAC address */
> +             macaddr[0] = a >> 8;
> +             macaddr[1] = a & 0xff;
> +
> +             for (i = 2; i < 5; i++)
> +                     macaddr[i] = hw_addr[i + 1];
> +
> +             for (i = 0; i < adap->num_vfs; i++) {
> +                     macaddr[5] = adap->pf * 16 + i;
> +                     ether_addr_copy(adap->vfinfo[i].vf_mac_addr,
> macaddr);
> +             }
> +     }
> +}

That's some... magical magic? :-)
But I couldn't see anywhere in the patch where this MAC is propagated
to the VF, only to the new NDO(). Care to explain how does the VF learn it?
        

Reply via email to