|
@@ -116,6 +116,12 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
|
|
|
* we want to disable the querying by default.
|
|
|
*/
|
|
|
adapter->vfinfo[i].rss_query_enabled = 0;
|
|
|
+
|
|
|
+ /* Untrust all VFs */
|
|
|
+ adapter->vfinfo[i].trusted = false;
|
|
|
+
|
|
|
+ /* set the default xcast mode */
|
|
|
+ adapter->vfinfo[i].xcast_mode = IXGBEVF_XCAST_MODE_NONE;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -1001,6 +1007,59 @@ static int ixgbe_get_vf_rss_key(struct ixgbe_adapter *adapter,
|
|
|
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)
|
|
|
{
|
|
|
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
|
|
@@ -1063,6 +1122,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
|
case IXGBE_VF_GET_RSS_KEY:
|
|
|
retval = ixgbe_get_vf_rss_key(adapter, msgbuf, vf);
|
|
|
break;
|
|
|
+ case IXGBE_VF_UPDATE_XCAST_MODE:
|
|
|
+ retval = ixgbe_update_vf_xcast_mode(adapter, msgbuf, vf);
|
|
|
+ break;
|
|
|
default:
|
|
|
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
|
|
|
retval = IXGBE_ERR_MBX;
|
|
@@ -1124,6 +1186,17 @@ void ixgbe_disable_tx_rx(struct ixgbe_adapter *adapter)
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_VFRE(1), 0);
|
|
|
}
|
|
|
|
|
|
+static inline void ixgbe_ping_vf(struct ixgbe_adapter *adapter, int vf)
|
|
|
+{
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
+ u32 ping;
|
|
|
+
|
|
|
+ ping = IXGBE_PF_CONTROL_MSG;
|
|
|
+ if (adapter->vfinfo[vf].clear_to_send)
|
|
|
+ ping |= IXGBE_VT_MSGTYPE_CTS;
|
|
|
+ ixgbe_write_mbx(hw, &ping, 1, vf);
|
|
|
+}
|
|
|
+
|
|
|
void ixgbe_ping_all_vfs(struct ixgbe_adapter *adapter)
|
|
|
{
|
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
@@ -1416,6 +1489,28 @@ int ixgbe_ndo_set_vf_rss_query_en(struct net_device *netdev, int vf,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int ixgbe_ndo_set_vf_trust(struct net_device *netdev, int vf, bool setting)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ if (vf >= adapter->num_vfs)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* nothing to do */
|
|
|
+ if (adapter->vfinfo[vf].trusted == setting)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ adapter->vfinfo[vf].trusted = setting;
|
|
|
+
|
|
|
+ /* reset VF to reconfigure features */
|
|
|
+ adapter->vfinfo[vf].clear_to_send = false;
|
|
|
+ ixgbe_ping_vf(adapter, vf);
|
|
|
+
|
|
|
+ e_info(drv, "VF %u is %strusted\n", vf, setting ? "" : "not ");
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int ixgbe_ndo_get_vf_config(struct net_device *netdev,
|
|
|
int vf, struct ifla_vf_info *ivi)
|
|
|
{
|
|
@@ -1430,5 +1525,6 @@ int ixgbe_ndo_get_vf_config(struct net_device *netdev,
|
|
|
ivi->qos = adapter->vfinfo[vf].pf_qos;
|
|
|
ivi->spoofchk = adapter->vfinfo[vf].spoofchk_enabled;
|
|
|
ivi->rss_query_en = adapter->vfinfo[vf].rss_query_enabled;
|
|
|
+ ivi->trusted = adapter->vfinfo[vf].trusted;
|
|
|
return 0;
|
|
|
}
|