static int fm10k_set_reta(struct net_device *netdev, const u32 *indir) { struct fm10k_intfc *interface = netdev_priv(netdev); struct fm10k_hw *hw = &interface->hw; int i; u16 rss_i; if (!indir) return 0; /* Verify user input. */ rss_i = interface->ring_feature[RING_F_RSS].indices; for (i = fm10k_get_reta_size(netdev); i--;) { if (indir[i] < rss_i) continue; return -EINVAL; } /* record entries to reta table */ for (i = 0; i < FM10K_RETA_SIZE; i++, indir += 4) { u32 reta = indir[0] | (indir[1] << 8) | (indir[2] << 16) | (indir[3] << 24); if (interface->reta[i] == reta) continue; interface->reta[i] = reta; fm10k_write_reg(hw, FM10K_RETA(0, i), reta); } return 0; }
void fm10k_write_reta(struct fm10k_intfc *interface, const u32 *indir) { u16 rss_i = interface->ring_feature[RING_F_RSS].indices; struct fm10k_hw *hw = &interface->hw; u32 table[4]; int i, j; /* record entries to reta table */ for (i = 0; i < FM10K_RETA_SIZE; i++) { u32 reta, n; /* generate a new table if we weren't given one */ for (j = 0; j < 4; j++) { if (indir) n = indir[i + j]; else n = ethtool_rxfh_indir_default(i + j, rss_i); table[j] = n; } reta = table[0] | (table[1] << 8) | (table[2] << 16) | (table[3] << 24); if (interface->reta[i] == reta) continue; interface->reta[i] = reta; fm10k_write_reg(hw, FM10K_RETA(0, i), reta); } }
static void fm10k_get_reg_vsi(struct fm10k_hw *hw, u32 *buff, int i) { int idx = 0, j; buff[idx++] = fm10k_read_reg(hw, FM10K_MRQC(i)); for (j = 0; j < 10; j++) buff[idx++] = fm10k_read_reg(hw, FM10K_RSSRK(i, j)); for (j = 0; j < 32; j++) buff[idx++] = fm10k_read_reg(hw, FM10K_RETA(i, j)); BUG_ON(idx != FM10K_REGS_LEN_VSI); }