IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
 }
 
+/**
+ * ixgbe_init_rss_key - Initialize adapter RSS key
+ * @adapter: device handle
+ *
+ * Allocates and initializes the RSS key if it is not allocated.
+ **/
+static inline int ixgbe_init_rss_key(struct ixgbe_adapter *adapter)
+{
+       u32 *rss_key;
+
+       if (!adapter->rss_key) {
+               rss_key = kzalloc(IXGBE_RSS_KEY_SIZE, GFP_KERNEL);
+               if (unlikely(!rss_key))
+                       return -ENOMEM;
+
+               netdev_rss_key_fill(rss_key, IXGBE_RSS_KEY_SIZE);
+               adapter->rss_key = rss_key;
+       }
+
+       return 0;
+}
+
 /**
  * ixgbe_store_reta - Write the RETA table to HW
  * @adapter: device handle
        /* Fill out hash function seeds */
        for (i = 0; i < 10; i++)
                IXGBE_WRITE_REG(hw, IXGBE_PFVFRSSRK(i, pf_pool),
-                               adapter->rss_key[i]);
+                               *(adapter->rss_key + i));
 
        /* Fill out the redirection table */
        for (i = 0, j = 0; i < 64; i++, j++) {
        if (adapter->flags2 & IXGBE_FLAG2_RSS_FIELD_IPV6_UDP)
                rss_field |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
 
-       netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
        if ((hw->mac.type >= ixgbe_mac_X550) &&
            (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) {
                unsigned int pf_pool = adapter->num_vfs;
        if (!adapter->mac_table)
                return -ENOMEM;
 
+       if (ixgbe_init_rss_key(adapter))
+               return -ENOMEM;
+
        /* Set MAC specific capability flags and exceptions */
        switch (hw->mac.type) {
        case ixgbe_mac_82598EB:
        iounmap(adapter->io_addr);
        kfree(adapter->jump_tables[0]);
        kfree(adapter->mac_table);
+       kfree(adapter->rss_key);
 err_ioremap:
        disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
        free_netdev(netdev);
        }
 
        kfree(adapter->mac_table);
+       kfree(adapter->rss_key);
        disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
        free_netdev(netdev);