|
@@ -216,6 +216,39 @@ static s32 ixgbevf_get_mac_addr_vf(struct ixgbe_hw *hw, u8 *mac_addr)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr)
|
|
|
|
+{
|
|
|
|
+ struct ixgbe_mbx_info *mbx = &hw->mbx;
|
|
|
|
+ u32 msgbuf[3];
|
|
|
|
+ u8 *msg_addr = (u8 *)(&msgbuf[1]);
|
|
|
|
+ s32 ret_val;
|
|
|
|
+
|
|
|
|
+ memset(msgbuf, 0, sizeof(msgbuf));
|
|
|
|
+ /*
|
|
|
|
+ * If index is one then this is the start of a new list and needs
|
|
|
|
+ * indication to the PF so it can do it's own list management.
|
|
|
|
+ * If it is zero then that tells the PF to just clear all of
|
|
|
|
+ * this VF's macvlans and there is no new list.
|
|
|
|
+ */
|
|
|
|
+ msgbuf[0] |= index << IXGBE_VT_MSGINFO_SHIFT;
|
|
|
|
+ msgbuf[0] |= IXGBE_VF_SET_MACVLAN;
|
|
|
|
+ if (addr)
|
|
|
|
+ memcpy(msg_addr, addr, 6);
|
|
|
|
+ ret_val = mbx->ops.write_posted(hw, msgbuf, 3);
|
|
|
|
+
|
|
|
|
+ if (!ret_val)
|
|
|
|
+ ret_val = mbx->ops.read_posted(hw, msgbuf, 3);
|
|
|
|
+
|
|
|
|
+ msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
|
|
|
|
+
|
|
|
|
+ if (!ret_val)
|
|
|
|
+ if (msgbuf[0] ==
|
|
|
|
+ (IXGBE_VF_SET_MACVLAN | IXGBE_VT_MSGTYPE_NACK))
|
|
|
|
+ ret_val = -ENOMEM;
|
|
|
|
+
|
|
|
|
+ return ret_val;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* ixgbevf_set_rar_vf - set device MAC address
|
|
* ixgbevf_set_rar_vf - set device MAC address
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
@@ -378,6 +411,7 @@ static struct ixgbe_mac_operations ixgbevf_mac_ops = {
|
|
.check_link = ixgbevf_check_mac_link_vf,
|
|
.check_link = ixgbevf_check_mac_link_vf,
|
|
.set_rar = ixgbevf_set_rar_vf,
|
|
.set_rar = ixgbevf_set_rar_vf,
|
|
.update_mc_addr_list = ixgbevf_update_mc_addr_list_vf,
|
|
.update_mc_addr_list = ixgbevf_update_mc_addr_list_vf,
|
|
|
|
+ .set_uc_addr = ixgbevf_set_uc_addr_vf,
|
|
.set_vfta = ixgbevf_set_vfta_vf,
|
|
.set_vfta = ixgbevf_set_vfta_vf,
|
|
};
|
|
};
|
|
|
|
|