net: ena: allow setting the hash function without changing the key
Current code does not allow setting the hash function without changing the key. This commit enables it. To achieve this we separate ena_com_get_hash_function() to 2 functions: ena_com_get_hash_function() - which gets only the hash function, and ena_com_get_hash_key() - which gets only the hash key. Also return 0 instead of rc at the end of ena_get_rxfh() since all previous operations succeeded. Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com> Signed-off-by: Sameeh Jubran <sameehj@amazon.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e9a1de378d
commit
f66c2ea3b1
|
@ -2338,13 +2338,10 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
|
|||
}
|
||||
|
||||
int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
|
||||
enum ena_admin_hash_functions *func,
|
||||
u8 *key)
|
||||
enum ena_admin_hash_functions *func)
|
||||
{
|
||||
struct ena_rss *rss = &ena_dev->rss;
|
||||
struct ena_admin_get_feat_resp get_resp;
|
||||
struct ena_admin_feature_rss_flow_hash_control *hash_key =
|
||||
rss->hash_key;
|
||||
int rc;
|
||||
|
||||
if (unlikely(!func))
|
||||
|
@ -2364,6 +2361,14 @@ int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
|
|||
|
||||
*func = rss->hash_func;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ena_com_get_hash_key(struct ena_com_dev *ena_dev, u8 *key)
|
||||
{
|
||||
struct ena_admin_feature_rss_flow_hash_control *hash_key =
|
||||
ena_dev->rss.hash_key;
|
||||
|
||||
if (key)
|
||||
memcpy(key, hash_key->key, (size_t)(hash_key->keys_num) << 2);
|
||||
|
||||
|
|
|
@ -695,13 +695,11 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
|
|||
*/
|
||||
int ena_com_set_hash_function(struct ena_com_dev *ena_dev);
|
||||
|
||||
/* ena_com_get_hash_function - Retrieve the hash function and the hash key
|
||||
* from the device.
|
||||
/* ena_com_get_hash_function - Retrieve the hash function from the device.
|
||||
* @ena_dev: ENA communication layer struct
|
||||
* @func: hash function
|
||||
* @key: hash key
|
||||
*
|
||||
* Retrieve the hash function and the hash key from the device.
|
||||
* Retrieve the hash function from the device.
|
||||
*
|
||||
* @note: If the caller called ena_com_fill_hash_function but didn't flash
|
||||
* it to the device, the new configuration will be lost.
|
||||
|
@ -709,9 +707,20 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev);
|
|||
* @return: 0 on Success and negative value otherwise.
|
||||
*/
|
||||
int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
|
||||
enum ena_admin_hash_functions *func,
|
||||
u8 *key);
|
||||
enum ena_admin_hash_functions *func);
|
||||
|
||||
/* ena_com_get_hash_key - Retrieve the hash key
|
||||
* @ena_dev: ENA communication layer struct
|
||||
* @key: hash key
|
||||
*
|
||||
* Retrieve the hash key.
|
||||
*
|
||||
* @note: If the caller called ena_com_fill_hash_key but didn't flash
|
||||
* it to the device, the new configuration will be lost.
|
||||
*
|
||||
* @return: 0 on Success and negative value otherwise.
|
||||
*/
|
||||
int ena_com_get_hash_key(struct ena_com_dev *ena_dev, u8 *key);
|
||||
/* ena_com_fill_hash_ctrl - Fill RSS hash control
|
||||
* @ena_dev: ENA communication layer struct.
|
||||
* @proto: The protocol to configure.
|
||||
|
|
|
@ -672,7 +672,7 @@ static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
|
|||
/* We call this function in order to check if the device
|
||||
* supports getting/setting the hash function.
|
||||
*/
|
||||
rc = ena_com_get_hash_function(adapter->ena_dev, &ena_func, key);
|
||||
rc = ena_com_get_hash_function(adapter->ena_dev, &ena_func);
|
||||
if (rc) {
|
||||
if (rc == -EOPNOTSUPP) {
|
||||
key = NULL;
|
||||
|
@ -683,6 +683,10 @@ static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
|
|||
return rc;
|
||||
}
|
||||
|
||||
rc = ena_com_get_hash_key(adapter->ena_dev, key);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
switch (ena_func) {
|
||||
case ENA_ADMIN_TOEPLITZ:
|
||||
func = ETH_RSS_HASH_TOP;
|
||||
|
@ -699,7 +703,7 @@ static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
|
|||
if (hfunc)
|
||||
*hfunc = func;
|
||||
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ena_set_rxfh(struct net_device *netdev, const u32 *indir,
|
||||
|
@ -707,7 +711,7 @@ static int ena_set_rxfh(struct net_device *netdev, const u32 *indir,
|
|||
{
|
||||
struct ena_adapter *adapter = netdev_priv(netdev);
|
||||
struct ena_com_dev *ena_dev = adapter->ena_dev;
|
||||
enum ena_admin_hash_functions func;
|
||||
enum ena_admin_hash_functions func = 0;
|
||||
int rc, i;
|
||||
|
||||
if (indir) {
|
||||
|
@ -746,7 +750,7 @@ static int ena_set_rxfh(struct net_device *netdev, const u32 *indir,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (key) {
|
||||
if (key || func) {
|
||||
rc = ena_com_fill_hash_function(ena_dev, func, key,
|
||||
ENA_HASH_KEY_SIZE,
|
||||
0xFFFFFFFF);
|
||||
|
|
Loading…
Reference in New Issue