/* An arbitrary search limit for the software hash table */
 #define EFX_EF10_FILTER_SEARCH_LIMIT 200
 
-static void efx_ef10_rx_push_indir_table(struct efx_nic *efx);
+static void efx_ef10_rx_push_rss_config(struct efx_nic *efx);
 static void efx_ef10_rx_free_indir_table(struct efx_nic *efx);
 static void efx_ef10_filter_table_remove(struct efx_nic *efx);
 
                nic_data->must_restore_piobufs = false;
        }
 
-       efx_ef10_rx_push_indir_table(efx);
+       efx_ef10_rx_push_rss_config(efx);
        return 0;
 }
 
        nic_data->rx_rss_context = EFX_EF10_RSS_CONTEXT_INVALID;
 }
 
-static void efx_ef10_rx_push_indir_table(struct efx_nic *efx)
+static void efx_ef10_rx_push_rss_config(struct efx_nic *efx)
 {
        struct efx_ef10_nic_data *nic_data = efx->nic_data;
        int rc;
 
-       netif_dbg(efx, drv, efx->net_dev, "pushing RX indirection table\n");
+       netif_dbg(efx, drv, efx->net_dev, "pushing RSS config\n");
 
        if (nic_data->rx_rss_context == EFX_EF10_RSS_CONTEXT_INVALID) {
                rc = efx_ef10_alloc_rss_context(efx, &nic_data->rx_rss_context);
        .tx_init = efx_ef10_tx_init,
        .tx_remove = efx_ef10_tx_remove,
        .tx_write = efx_ef10_tx_write,
-       .rx_push_indir_table = efx_ef10_rx_push_indir_table,
+       .rx_push_rss_config = efx_ef10_rx_push_rss_config,
        .rx_probe = efx_ef10_rx_probe,
        .rx_init = efx_ef10_rx_init,
        .rx_remove = efx_ef10_rx_remove,
 
        struct efx_nic *efx = netdev_priv(net_dev);
 
        memcpy(efx->rx_indir_table, indir, sizeof(efx->rx_indir_table));
-       efx_nic_push_rx_indir_table(efx);
+       efx->type->rx_push_rss_config(efx);
        return 0;
 }
 
 
                efx_schedule_channel_irq(efx_get_channel(efx, 1));
        return IRQ_HANDLED;
 }
+/**************************************************************************
+ *
+ * RSS
+ *
+ **************************************************************************
+ */
+
+static void falcon_b0_rx_push_rss_config(struct efx_nic *efx)
+{
+       efx_oword_t temp;
+
+       /* Set hash key for IPv4 */
+       memcpy(&temp, efx->rx_hash_key, sizeof(temp));
+       efx_writeo(efx, &temp, FR_BZ_RX_RSS_TKEY);
+
+       efx_farch_rx_push_indir_table(efx);
+}
+
 /**************************************************************************
  *
  * EEPROM/flash
        falcon_init_rx_cfg(efx);
 
        if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) {
-               /* Set hash key for IPv4 */
-               memcpy(&temp, efx->rx_hash_key, sizeof(temp));
-               efx_writeo(efx, &temp, FR_BZ_RX_RSS_TKEY);
+               falcon_b0_rx_push_rss_config(efx);
 
                /* Set destination of both TX and RX Flush events */
                EFX_POPULATE_OWORD_1(temp, FRF_BZ_FLS_EVQ_ID, 0);
        .tx_init = efx_farch_tx_init,
        .tx_remove = efx_farch_tx_remove,
        .tx_write = efx_farch_tx_write,
-       .rx_push_indir_table = efx_farch_rx_push_indir_table,
+       .rx_push_rss_config = efx_port_dummy_op_void,
        .rx_probe = efx_farch_rx_probe,
        .rx_init = efx_farch_rx_init,
        .rx_remove = efx_farch_rx_remove,
        .tx_init = efx_farch_tx_init,
        .tx_remove = efx_farch_tx_remove,
        .tx_write = efx_farch_tx_write,
-       .rx_push_indir_table = efx_farch_rx_push_indir_table,
+       .rx_push_rss_config = falcon_b0_rx_push_rss_config,
        .rx_probe = efx_farch_rx_probe,
        .rx_init = efx_farch_rx_init,
        .rx_remove = efx_farch_rx_remove,
 
        size_t i = 0;
        efx_dword_t dword;
 
-       if (efx_nic_rev(efx) < EFX_REV_FALCON_B0)
-               return;
+       BUG_ON(efx_nic_rev(efx) < EFX_REV_FALCON_B0);
 
        BUILD_BUG_ON(ARRAY_SIZE(efx->rx_indir_table) !=
                     FR_BZ_RX_INDIRECTION_TBL_ROWS);
        EFX_INVERT_OWORD(temp);
        efx_writeo(efx, &temp, FR_AZ_FATAL_INTR_KER);
 
-       efx_farch_rx_push_indir_table(efx);
-
        /* Disable the ugly timer-based TX DMA backoff and allow TX DMA to be
         * controlled by the RX FIFO fill level. Set arbitration to one pkt/Q.
         */
 
  * @tx_init: Initialise TX queue on the NIC
  * @tx_remove: Free resources for TX queue
  * @tx_write: Write TX descriptors and doorbell
- * @rx_push_indir_table: Write RSS indirection table to the NIC
+ * @rx_push_rss_config: Write RSS hash key and indirection table to the NIC
  * @rx_probe: Allocate resources for RX queue
  * @rx_init: Initialise RX queue on the NIC
  * @rx_remove: Free resources for RX queue
        void (*tx_init)(struct efx_tx_queue *tx_queue);
        void (*tx_remove)(struct efx_tx_queue *tx_queue);
        void (*tx_write)(struct efx_tx_queue *tx_queue);
-       void (*rx_push_indir_table)(struct efx_nic *efx);
+       void (*rx_push_rss_config)(struct efx_nic *efx);
        int (*rx_probe)(struct efx_rx_queue *rx_queue);
        void (*rx_init)(struct efx_rx_queue *rx_queue);
        void (*rx_remove)(struct efx_rx_queue *rx_queue);
 
 void efx_farch_dimension_resources(struct efx_nic *efx, unsigned sram_lim_qw);
 void efx_farch_init_common(struct efx_nic *efx);
 void efx_ef10_handle_drain_event(struct efx_nic *efx);
-static inline void efx_nic_push_rx_indir_table(struct efx_nic *efx)
-{
-       efx->type->rx_push_indir_table(efx);
-}
 void efx_farch_rx_push_indir_table(struct efx_nic *efx);
 
 int efx_nic_alloc_buffer(struct efx_nic *efx, struct efx_buffer *buffer,
 
        return rc;
 }
 
+static void siena_rx_push_rss_config(struct efx_nic *efx)
+{
+       efx_oword_t temp;
+
+       /* Set hash key for IPv4 */
+       memcpy(&temp, efx->rx_hash_key, sizeof(temp));
+       efx_writeo(efx, &temp, FR_BZ_RX_RSS_TKEY);
+
+       /* Enable IPv6 RSS */
+       BUILD_BUG_ON(sizeof(efx->rx_hash_key) <
+                    2 * sizeof(temp) + FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH / 8 ||
+                    FRF_CZ_RX_RSS_IPV6_TKEY_HI_LBN != 0);
+       memcpy(&temp, efx->rx_hash_key, sizeof(temp));
+       efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG1);
+       memcpy(&temp, efx->rx_hash_key + sizeof(temp), sizeof(temp));
+       efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG2);
+       EFX_POPULATE_OWORD_2(temp, FRF_CZ_RX_RSS_IPV6_THASH_ENABLE, 1,
+                            FRF_CZ_RX_RSS_IPV6_IP_THASH_ENABLE, 1);
+       memcpy(&temp, efx->rx_hash_key + 2 * sizeof(temp),
+              FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH / 8);
+       efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG3);
+
+       efx_farch_rx_push_indir_table(efx);
+}
+
 /* This call performs hardware-specific global initialisation, such as
  * defining the descriptor cache sizes and number of RSS channels.
  * It does not set up any buffers, descriptor rings or event queues.
                            EFX_RX_USR_BUF_SIZE >> 5);
        efx_writeo(efx, &temp, FR_AZ_RX_CFG);
 
-       /* Set hash key for IPv4 */
-       memcpy(&temp, efx->rx_hash_key, sizeof(temp));
-       efx_writeo(efx, &temp, FR_BZ_RX_RSS_TKEY);
-
-       /* Enable IPv6 RSS */
-       BUILD_BUG_ON(sizeof(efx->rx_hash_key) <
-                    2 * sizeof(temp) + FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH / 8 ||
-                    FRF_CZ_RX_RSS_IPV6_TKEY_HI_LBN != 0);
-       memcpy(&temp, efx->rx_hash_key, sizeof(temp));
-       efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG1);
-       memcpy(&temp, efx->rx_hash_key + sizeof(temp), sizeof(temp));
-       efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG2);
-       EFX_POPULATE_OWORD_2(temp, FRF_CZ_RX_RSS_IPV6_THASH_ENABLE, 1,
-                            FRF_CZ_RX_RSS_IPV6_IP_THASH_ENABLE, 1);
-       memcpy(&temp, efx->rx_hash_key + 2 * sizeof(temp),
-              FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH / 8);
-       efx_writeo(efx, &temp, FR_CZ_RX_RSS_IPV6_REG3);
+       siena_rx_push_rss_config(efx);
 
        /* Enable event logging */
        rc = efx_mcdi_log_ctrl(efx, true, false, 0);
        .tx_init = efx_farch_tx_init,
        .tx_remove = efx_farch_tx_remove,
        .tx_write = efx_farch_tx_write,
-       .rx_push_indir_table = efx_farch_rx_push_indir_table,
+       .rx_push_rss_config = siena_rx_push_rss_config,
        .rx_probe = efx_farch_rx_probe,
        .rx_init = efx_farch_rx_init,
        .rx_remove = efx_farch_rx_remove,