static int fm10k_set_rssh(struct net_device *netdev, const u32 *indir, const u8 *key, const u8 hfunc) { struct fm10k_intfc *interface = netdev_priv(netdev); struct fm10k_hw *hw = &interface->hw; int i, err; /* We do not allow change in unsupported parameters */ if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) return -EOPNOTSUPP; err = fm10k_set_reta(netdev, indir); if (err || !key) return err; for (i = 0; i < FM10K_RSSRK_SIZE; i++, key += 4) { u32 rssrk = le32_to_cpu(*(__le32 *)key); if (interface->rssrk[i] == rssrk) continue; interface->rssrk[i] = rssrk; fm10k_write_reg(hw, FM10K_RSSRK(0, i), rssrk); } return 0; }
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); }
static int fm10k_set_rssh(struct net_device *netdev, const u32 *indir, const u8 *key) { struct fm10k_intfc *interface = netdev_priv(netdev); struct fm10k_hw *hw = &interface->hw; int i, err; err = fm10k_set_reta(netdev, indir); if (err || !key) return err; for (i = 0; i < FM10K_RSSRK_SIZE; i++, key += 4) { u32 rssrk = le32_to_cpu(*(__le32 *)key); if (interface->rssrk[i] == rssrk) continue; interface->rssrk[i] = rssrk; fm10k_write_reg(hw, FM10K_RSSRK(0, i), rssrk); } return 0; }