|
@@ -119,6 +119,9 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
|
|
|
|
|
|
/* Untrust all VFs */
|
|
/* Untrust all VFs */
|
|
adapter->vfinfo[i].trusted = false;
|
|
adapter->vfinfo[i].trusted = false;
|
|
|
|
+
|
|
|
|
+ /* set the default xcast mode */
|
|
|
|
+ adapter->vfinfo[i].xcast_mode = IXGBEVF_XCAST_MODE_NONE;
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -1004,6 +1007,59 @@ static int ixgbe_get_vf_rss_key(struct ixgbe_adapter *adapter,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int ixgbe_update_vf_xcast_mode(struct ixgbe_adapter *adapter,
|
|
|
|
+ u32 *msgbuf, u32 vf)
|
|
|
|
+{
|
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
|
+ int xcast_mode = msgbuf[1];
|
|
|
|
+ u32 vmolr, disable, enable;
|
|
|
|
+
|
|
|
|
+ /* verify the PF is supporting the correct APIs */
|
|
|
|
+ switch (adapter->vfinfo[vf].vf_api) {
|
|
|
|
+ case ixgbe_mbox_api_12:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (xcast_mode > IXGBEVF_XCAST_MODE_MULTI &&
|
|
|
|
+ !adapter->vfinfo[vf].trusted) {
|
|
|
|
+ xcast_mode = IXGBEVF_XCAST_MODE_MULTI;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (adapter->vfinfo[vf].xcast_mode == xcast_mode)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
|
|
+ switch (xcast_mode) {
|
|
|
|
+ case IXGBEVF_XCAST_MODE_NONE:
|
|
|
|
+ disable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_MPE;
|
|
|
|
+ enable = 0;
|
|
|
|
+ break;
|
|
|
|
+ case IXGBEVF_XCAST_MODE_MULTI:
|
|
|
|
+ disable = IXGBE_VMOLR_MPE;
|
|
|
|
+ enable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE;
|
|
|
|
+ break;
|
|
|
|
+ case IXGBEVF_XCAST_MODE_ALLMULTI:
|
|
|
|
+ disable = 0;
|
|
|
|
+ enable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_MPE;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf));
|
|
|
|
+ vmolr &= ~disable;
|
|
|
|
+ vmolr |= enable;
|
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
|
|
|
|
+
|
|
|
|
+ adapter->vfinfo[vf].xcast_mode = xcast_mode;
|
|
|
|
+
|
|
|
|
+out:
|
|
|
|
+ msgbuf[1] = xcast_mode;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
{
|
|
{
|
|
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
|
|
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
|
|
@@ -1066,6 +1122,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
case IXGBE_VF_GET_RSS_KEY:
|
|
case IXGBE_VF_GET_RSS_KEY:
|
|
retval = ixgbe_get_vf_rss_key(adapter, msgbuf, vf);
|
|
retval = ixgbe_get_vf_rss_key(adapter, msgbuf, vf);
|
|
break;
|
|
break;
|
|
|
|
+ case IXGBE_VF_UPDATE_XCAST_MODE:
|
|
|
|
+ retval = ixgbe_update_vf_xcast_mode(adapter, msgbuf, vf);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
|
|
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
|
|
retval = IXGBE_ERR_MBX;
|
|
retval = IXGBE_ERR_MBX;
|