|
@@ -1660,6 +1660,28 @@ static void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter,
|
|
|
reg_idx);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ixgbevf_init_rss_key - Initialize adapter RSS key
|
|
|
+ * @adapter: device handle
|
|
|
+ *
|
|
|
+ * Allocates and initializes the RSS key if it is not allocated.
|
|
|
+ **/
|
|
|
+static inline int ixgbevf_init_rss_key(struct ixgbevf_adapter *adapter)
|
|
|
+{
|
|
|
+ u32 *rss_key;
|
|
|
+
|
|
|
+ if (!adapter->rss_key) {
|
|
|
+ rss_key = kzalloc(IXGBEVF_RSS_HASH_KEY_SIZE, GFP_KERNEL);
|
|
|
+ if (unlikely(!rss_key))
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ netdev_rss_key_fill(rss_key, IXGBEVF_RSS_HASH_KEY_SIZE);
|
|
|
+ adapter->rss_key = rss_key;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void ixgbevf_setup_vfmrqc(struct ixgbevf_adapter *adapter)
|
|
|
{
|
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
@@ -1668,9 +1690,8 @@ static void ixgbevf_setup_vfmrqc(struct ixgbevf_adapter *adapter)
|
|
|
u8 i, j;
|
|
|
|
|
|
/* Fill out hash function seeds */
|
|
|
- netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
|
|
|
for (i = 0; i < IXGBEVF_VFRSSRK_REGS; i++)
|
|
|
- IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), adapter->rss_key[i]);
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), *(adapter->rss_key + i));
|
|
|
|
|
|
for (i = 0, j = 0; i < IXGBEVF_X550_VFRETA_SIZE; i++, j++) {
|
|
|
if (j == rss_i)
|
|
@@ -2611,6 +2632,12 @@ static int ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
|
|
|
|
|
|
hw->mbx.ops.init_params(hw);
|
|
|
|
|
|
+ if (hw->mac.type >= ixgbe_mac_X550_vf) {
|
|
|
+ err = ixgbevf_init_rss_key(adapter);
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
/* assume legacy case in which PF would only give VF 2 queues */
|
|
|
hw->mac.max_tx_queues = 2;
|
|
|
hw->mac.max_rx_queues = 2;
|
|
@@ -4127,6 +4154,7 @@ err_register:
|
|
|
err_sw_init:
|
|
|
ixgbevf_reset_interrupt_capability(adapter);
|
|
|
iounmap(adapter->io_addr);
|
|
|
+ kfree(adapter->rss_key);
|
|
|
err_ioremap:
|
|
|
disable_dev = !test_and_set_bit(__IXGBEVF_DISABLED, &adapter->state);
|
|
|
free_netdev(netdev);
|
|
@@ -4173,6 +4201,7 @@ static void ixgbevf_remove(struct pci_dev *pdev)
|
|
|
|
|
|
hw_dbg(&adapter->hw, "Remove complete\n");
|
|
|
|
|
|
+ kfree(adapter->rss_key);
|
|
|
disable_dev = !test_and_set_bit(__IXGBEVF_DISABLED, &adapter->state);
|
|
|
free_netdev(netdev);
|
|
|
|