|
@@ -434,6 +434,7 @@ static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
|
|
|
#endif /* CONFIG_FCOE */
|
|
|
switch (adapter->vfinfo[vf].vf_api) {
|
|
|
case ixgbe_mbox_api_11:
|
|
|
+ case ixgbe_mbox_api_12:
|
|
|
/*
|
|
|
* Version 1.1 supports jumbo frames on VFs if PF has
|
|
|
* jumbo frames enabled which means legacy VFs are
|
|
@@ -901,6 +902,7 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter,
|
|
|
switch (api) {
|
|
|
case ixgbe_mbox_api_10:
|
|
|
case ixgbe_mbox_api_11:
|
|
|
+ case ixgbe_mbox_api_12:
|
|
|
adapter->vfinfo[vf].vf_api = api;
|
|
|
return 0;
|
|
|
default:
|
|
@@ -924,6 +926,7 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
|
|
|
switch (adapter->vfinfo[vf].vf_api) {
|
|
|
case ixgbe_mbox_api_20:
|
|
|
case ixgbe_mbox_api_11:
|
|
|
+ case ixgbe_mbox_api_12:
|
|
|
break;
|
|
|
default:
|
|
|
return -1;
|
|
@@ -951,6 +954,35 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
|
|
|
+{
|
|
|
+ u32 i, j;
|
|
|
+ u32 *out_buf = &msgbuf[1];
|
|
|
+ const u8 *reta = adapter->rss_indir_tbl;
|
|
|
+ u32 reta_size = ixgbe_rss_indir_tbl_entries(adapter);
|
|
|
+
|
|
|
+ /* Check if operation is permitted */
|
|
|
+ if (!adapter->vfinfo[vf].rss_query_enabled)
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
+ /* verify the PF is supporting the correct API */
|
|
|
+ if (adapter->vfinfo[vf].vf_api != ixgbe_mbox_api_12)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ /* This mailbox command is supported (required) only for 82599 and x540
|
|
|
+ * VFs which support up to 4 RSS queues. Therefore we will compress the
|
|
|
+ * RETA by saving only 2 bits from each entry. This way we will be able
|
|
|
+ * to transfer the whole RETA in a single mailbox operation.
|
|
|
+ */
|
|
|
+ for (i = 0; i < reta_size / 16; i++) {
|
|
|
+ out_buf[i] = 0;
|
|
|
+ for (j = 0; j < 16; j++)
|
|
|
+ out_buf[i] |= (u32)(reta[16 * i + j] & 0x3) << (2 * j);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
|
{
|
|
|
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
|
|
@@ -1007,6 +1039,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
|
|
case IXGBE_VF_GET_QUEUES:
|
|
|
retval = ixgbe_get_vf_queues(adapter, msgbuf, vf);
|
|
|
break;
|
|
|
+ case IXGBE_VF_GET_RETA:
|
|
|
+ retval = ixgbe_get_vf_reta(adapter, msgbuf, vf);
|
|
|
+ break;
|
|
|
default:
|
|
|
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
|
|
|
retval = IXGBE_ERR_MBX;
|