static void mlx4_addrconf_ifid_eui48(u8 *eui, u16 vlan_id,
struct net_device *dev)
{
+ u16 id = (vlan_id < 0x1000) ? vlan_id : dev->dev_id;
memcpy(eui, dev->dev_addr, 3);
memcpy(eui + 5, dev->dev_addr + 3, 3);
- if (vlan_id < 0x1000) {
- eui[3] = vlan_id >> 8;
- eui[4] = vlan_id & 0xff;
- } else {
+ if (id || vlan_id == 0) {
+ eui[3] = (id >> 8) & 0xff;
+ eui[4] = id & 0xff;
+ } else if (!dev->dev_id) {
eui[3] = 0xff;
eui[4] = 0xfe;
}
- eui[0] ^= 2;
+ if (vlan_id < 0x1000 || !dev->dev_id)
+ eui[0] ^= 2;
}
static void update_gids_task(struct work_struct *work)