diff options
Diffstat (limited to 'drivers/net/netdevsim/dev.c')
| -rw-r--r-- | drivers/net/netdevsim/dev.c | 66 | 
1 files changed, 56 insertions, 10 deletions
diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 3e0b61202f0c..2672d071b325 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -314,6 +314,8 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)  			    &nsim_dev->fw_update_status);  	debugfs_create_u32("fw_update_overwrite_mask", 0600, nsim_dev->ddir,  			    &nsim_dev->fw_update_overwrite_mask); +	debugfs_create_u32("fw_update_flash_chunk_time_ms", 0600, nsim_dev->ddir, +			   &nsim_dev->fw_update_flash_chunk_time_ms);  	debugfs_create_u32("max_macs", 0600, nsim_dev->ddir,  			   &nsim_dev->max_macs);  	debugfs_create_bool("test1", 0600, nsim_dev->ddir, @@ -388,6 +390,17 @@ static const struct file_operations nsim_dev_rate_parent_fops = {  	.owner = THIS_MODULE,  }; +static void nsim_dev_tc_bw_debugfs_init(struct dentry *ddir, u32 *tc_bw) +{ +	int i; + +	for (i = 0; i < DEVLINK_RATE_TCS_MAX; i++) { +		char name[16]; + +		snprintf(name, sizeof(name), "tc%d_bw", i); +		debugfs_create_u32(name, 0400, ddir, &tc_bw[i]); +	} +}  static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev,  				      struct nsim_dev_port *nsim_dev_port)  { @@ -415,6 +428,8 @@ static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev,  								 nsim_dev_port->ddir,  								 &nsim_dev_port->parent_name,  								 &nsim_dev_rate_parent_fops); +		nsim_dev_tc_bw_debugfs_init(nsim_dev_port->ddir, +					    nsim_dev_port->tc_bw);  	}  	debugfs_create_symlink("dev", nsim_dev_port->ddir, dev_link_name); @@ -576,7 +591,7 @@ static void nsim_dev_dummy_region_exit(struct nsim_dev *nsim_dev)  static int  __nsim_dev_port_add(struct nsim_dev *nsim_dev, enum nsim_dev_port_type type, -		    unsigned int port_index); +		    unsigned int port_index, u8 perm_addr[ETH_ALEN]);  static void __nsim_dev_port_del(struct nsim_dev_port *nsim_dev_port);  static int nsim_esw_legacy_enable(struct nsim_dev *nsim_dev, @@ -600,7 +615,7 @@ static int nsim_esw_switchdev_enable(struct nsim_dev *nsim_dev,  	int i, err;  	for (i = 0; i < nsim_dev_get_vfs(nsim_dev); i++) { -		err = __nsim_dev_port_add(nsim_dev, NSIM_DEV_PORT_TYPE_VF, i); +		err = __nsim_dev_port_add(nsim_dev, NSIM_DEV_PORT_TYPE_VF, i, NULL);  		if (err) {  			NL_SET_ERR_MSG_MOD(extack, "Failed to initialize VFs' netdevsim ports");  			pr_err("Failed to initialize VF id=%d. %d.\n", i, err); @@ -1002,9 +1017,9 @@ static int nsim_dev_info_get(struct devlink *devlink,  						    DEVLINK_INFO_VERSION_TYPE_COMPONENT);  } -#define NSIM_DEV_FLASH_SIZE 500000 +#define NSIM_DEV_FLASH_SIZE 50000  #define NSIM_DEV_FLASH_CHUNK_SIZE 1000 -#define NSIM_DEV_FLASH_CHUNK_TIME_MS 10 +#define NSIM_DEV_FLASH_CHUNK_TIME_MS_DEFAULT 100  static int nsim_dev_flash_update(struct devlink *devlink,  				 struct devlink_flash_update_params *params, @@ -1028,7 +1043,7 @@ static int nsim_dev_flash_update(struct devlink *devlink,  							   params->component,  							   i * NSIM_DEV_FLASH_CHUNK_SIZE,  							   NSIM_DEV_FLASH_SIZE); -		msleep(NSIM_DEV_FLASH_CHUNK_TIME_MS); +		msleep(nsim_dev->fw_update_flash_chunk_time_ms ?: 1);  	}  	if (nsim_dev->fw_update_status) { @@ -1172,6 +1187,19 @@ static int nsim_rate_bytes_to_units(char *name, u64 *rate, struct netlink_ext_ac  	return 0;  } +static int nsim_leaf_tc_bw_set(struct devlink_rate *devlink_rate, +			       void *priv, u32 *tc_bw, +			       struct netlink_ext_ack *extack) +{ +	struct nsim_dev_port *nsim_dev_port = priv; +	int i; + +	for (i = 0; i < DEVLINK_RATE_TCS_MAX; i++) +		nsim_dev_port->tc_bw[i] = tc_bw[i]; + +	return 0; +} +  static int nsim_leaf_tx_share_set(struct devlink_rate *devlink_rate, void *priv,  				  u64 tx_share, struct netlink_ext_ack *extack)  { @@ -1210,8 +1238,21 @@ struct nsim_rate_node {  	char *parent_name;  	u16 tx_share;  	u16 tx_max; +	u32 tc_bw[DEVLINK_RATE_TCS_MAX];  }; +static int nsim_node_tc_bw_set(struct devlink_rate *devlink_rate, void *priv, +			       u32 *tc_bw, struct netlink_ext_ack *extack) +{ +	struct nsim_rate_node *nsim_node = priv; +	int i; + +	for (i = 0; i < DEVLINK_RATE_TCS_MAX; i++) +		nsim_node->tc_bw[i] = tc_bw[i]; + +	return 0; +} +  static int nsim_node_tx_share_set(struct devlink_rate *devlink_rate, void *priv,  				  u64 tx_share, struct netlink_ext_ack *extack)  { @@ -1264,6 +1305,8 @@ static int nsim_rate_node_new(struct devlink_rate *node, void **priv,  						     &nsim_node->parent_name,  						     &nsim_dev_rate_parent_fops); +	nsim_dev_tc_bw_debugfs_init(nsim_node->ddir, nsim_node->tc_bw); +  	*priv = nsim_node;  	return 0;  } @@ -1340,8 +1383,10 @@ static const struct devlink_ops nsim_dev_devlink_ops = {  	.trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get,  	.rate_leaf_tx_share_set = nsim_leaf_tx_share_set,  	.rate_leaf_tx_max_set = nsim_leaf_tx_max_set, +	.rate_leaf_tc_bw_set = nsim_leaf_tc_bw_set,  	.rate_node_tx_share_set = nsim_node_tx_share_set,  	.rate_node_tx_max_set = nsim_node_tx_max_set, +	.rate_node_tc_bw_set = nsim_node_tc_bw_set,  	.rate_node_new = nsim_rate_node_new,  	.rate_node_del = nsim_rate_node_del,  	.rate_leaf_parent_set = nsim_rate_leaf_parent_set, @@ -1353,7 +1398,7 @@ static const struct devlink_ops nsim_dev_devlink_ops = {  #define NSIM_DEV_TEST1_DEFAULT true  static int __nsim_dev_port_add(struct nsim_dev *nsim_dev, enum nsim_dev_port_type type, -			       unsigned int port_index) +			       unsigned int port_index, u8 perm_addr[ETH_ALEN])  {  	struct devlink_port_attrs attrs = {};  	struct nsim_dev_port *nsim_dev_port; @@ -1390,7 +1435,7 @@ static int __nsim_dev_port_add(struct nsim_dev *nsim_dev, enum nsim_dev_port_typ  	if (err)  		goto err_dl_port_unregister; -	nsim_dev_port->ns = nsim_create(nsim_dev, nsim_dev_port); +	nsim_dev_port->ns = nsim_create(nsim_dev, nsim_dev_port, perm_addr);  	if (IS_ERR(nsim_dev_port->ns)) {  		err = PTR_ERR(nsim_dev_port->ns);  		goto err_port_debugfs_exit; @@ -1446,7 +1491,7 @@ static int nsim_dev_port_add_all(struct nsim_dev *nsim_dev,  	int i, err;  	for (i = 0; i < port_count; i++) { -		err = __nsim_dev_port_add(nsim_dev, NSIM_DEV_PORT_TYPE_PF, i); +		err = __nsim_dev_port_add(nsim_dev, NSIM_DEV_PORT_TYPE_PF, i, NULL);  		if (err)  			goto err_port_del_all;  	} @@ -1542,6 +1587,7 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)  	INIT_LIST_HEAD(&nsim_dev->port_list);  	nsim_dev->fw_update_status = true;  	nsim_dev->fw_update_overwrite_mask = 0; +	nsim_dev->fw_update_flash_chunk_time_ms = NSIM_DEV_FLASH_CHUNK_TIME_MS_DEFAULT;  	nsim_dev->max_macs = NSIM_DEV_MAX_MACS_DEFAULT;  	nsim_dev->test1 = NSIM_DEV_TEST1_DEFAULT;  	spin_lock_init(&nsim_dev->fa_cookie_lock); @@ -1702,7 +1748,7 @@ __nsim_dev_port_lookup(struct nsim_dev *nsim_dev, enum nsim_dev_port_type type,  }  int nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev, enum nsim_dev_port_type type, -		      unsigned int port_index) +		      unsigned int port_index, u8 perm_addr[ETH_ALEN])  {  	struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);  	int err; @@ -1711,7 +1757,7 @@ int nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev, enum nsim_dev_port_type  	if (__nsim_dev_port_lookup(nsim_dev, type, port_index))  		err = -EEXIST;  	else -		err = __nsim_dev_port_add(nsim_dev, type, port_index); +		err = __nsim_dev_port_add(nsim_dev, type, port_index, perm_addr);  	devl_unlock(priv_to_devlink(nsim_dev));  	return err;  }  | 
