 d6a9a92e32
			
		
	
	d6a9a92e32
	
	
	
		
			
			Seemingly unneeded based on new upstream code so manually deleted: layerscape: 820-usb-0007-usb-dwc3-gadget-increase-timeout-value-for-send-ep-c.patch Manually merged: generic-hack: 251-sound_kconfig.patch All other modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711 Run-tested: ipq806x/R7800, lantiq/Easybox 904 xDSL No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [add lantiq test report, minor commit message clarification] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
		
			
				
	
	
		
			143 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From ef0cc7d01f3eeca37c6bf864903af1c0cf0a792d Mon Sep 17 00:00:00 2001
 | |
| From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
 | |
| Date: Fri, 5 May 2017 18:11:08 +0300
 | |
| Subject: [PATCH] dpaa2-eth: Add Tx shaping support
 | |
| 
 | |
| Add support in sysfs for controlling DPNI Tx shaping
 | |
| parameters: rate limit (in Mbps) and max burst size (in bytes).
 | |
| The settings are per port.
 | |
| 
 | |
| TODO: See how to integrate Tx shaping support using
 | |
| standard Linux tools (ethtool)
 | |
| 
 | |
| Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
 | |
| Signed-off-by: Bogdan Purcareata <bogdan.purcareata@nxp.com>
 | |
| ---
 | |
|  drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 80 ++++++++++++++++++++++++
 | |
|  drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h |  4 ++
 | |
|  2 files changed, 84 insertions(+)
 | |
| 
 | |
| --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
 | |
| +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
 | |
| @@ -3778,6 +3778,83 @@ const struct dcbnl_rtnl_ops dpaa2_eth_dc
 | |
|  };
 | |
|  #endif
 | |
|  
 | |
| +/* SysFS support */
 | |
| +static ssize_t dpaa2_eth_show_tx_shaping(struct device *dev,
 | |
| +					 struct device_attribute *attr,
 | |
| +					 char *buf)
 | |
| +{
 | |
| +	struct dpaa2_eth_priv *priv = netdev_priv(to_net_dev(dev));
 | |
| +	/* No MC API for getting the shaping config. We're stateful. */
 | |
| +	struct dpni_tx_shaping_cfg *scfg = &priv->shaping_cfg;
 | |
| +
 | |
| +	return sprintf(buf, "%u %hu\n", scfg->rate_limit, scfg->max_burst_size);
 | |
| +}
 | |
| +
 | |
| +static ssize_t dpaa2_eth_write_tx_shaping(struct device *dev,
 | |
| +					  struct device_attribute *attr,
 | |
| +					  const char *buf,
 | |
| +					  size_t count)
 | |
| +{
 | |
| +	int err, items;
 | |
| +	struct dpaa2_eth_priv *priv = netdev_priv(to_net_dev(dev));
 | |
| +	struct dpni_tx_shaping_cfg scfg;
 | |
| +
 | |
| +	items = sscanf(buf, "%u %hu", &scfg.rate_limit, &scfg.max_burst_size);
 | |
| +	if (items != 2) {
 | |
| +		pr_err("Expected format: \"rate_limit(Mbps) max_burst_size(bytes)\"\n");
 | |
| +		return -EINVAL;
 | |
| +	}
 | |
| +	/* Size restriction as per MC API documentation */
 | |
| +	if (scfg.max_burst_size > DPAA2_ETH_MAX_BURST_SIZE) {
 | |
| +		pr_err("max_burst_size must be <= %d\n",
 | |
| +		       DPAA2_ETH_MAX_BURST_SIZE);
 | |
| +		return -EINVAL;
 | |
| +	}
 | |
| +
 | |
| +	err = dpni_set_tx_shaping(priv->mc_io, 0, priv->mc_token, &scfg);
 | |
| +	if (err) {
 | |
| +		dev_err(dev, "dpni_set_tx_shaping() failed\n");
 | |
| +		return -EPERM;
 | |
| +	}
 | |
| +	/* If successful, save the current configuration for future inquiries */
 | |
| +	priv->shaping_cfg = scfg;
 | |
| +
 | |
| +	return count;
 | |
| +}
 | |
| +
 | |
| +static struct device_attribute dpaa2_eth_attrs[] = {
 | |
| +	__ATTR(tx_shaping,
 | |
| +	       0600,
 | |
| +	       dpaa2_eth_show_tx_shaping,
 | |
| +	       dpaa2_eth_write_tx_shaping),
 | |
| +};
 | |
| +
 | |
| +static void dpaa2_eth_sysfs_init(struct device *dev)
 | |
| +{
 | |
| +	int i, err;
 | |
| +
 | |
| +	for (i = 0; i < ARRAY_SIZE(dpaa2_eth_attrs); i++) {
 | |
| +		err = device_create_file(dev, &dpaa2_eth_attrs[i]);
 | |
| +		if (err) {
 | |
| +			dev_err(dev, "ERROR creating sysfs file\n");
 | |
| +			goto undo;
 | |
| +		}
 | |
| +	}
 | |
| +	return;
 | |
| +
 | |
| +undo:
 | |
| +	while (i > 0)
 | |
| +		device_remove_file(dev, &dpaa2_eth_attrs[--i]);
 | |
| +}
 | |
| +
 | |
| +static void dpaa2_eth_sysfs_remove(struct device *dev)
 | |
| +{
 | |
| +	int i;
 | |
| +
 | |
| +	for (i = 0; i < ARRAY_SIZE(dpaa2_eth_attrs); i++)
 | |
| +		device_remove_file(dev, &dpaa2_eth_attrs[i]);
 | |
| +}
 | |
| +
 | |
|  static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
 | |
|  {
 | |
|  	struct device *dev;
 | |
| @@ -3897,6 +3974,7 @@ static int dpaa2_eth_probe(struct fsl_mc
 | |
|  #ifdef CONFIG_DEBUG_FS
 | |
|  	dpaa2_dbg_add(priv);
 | |
|  #endif
 | |
| +	dpaa2_eth_sysfs_init(&net_dev->dev);
 | |
|  
 | |
|  	dev_info(dev, "Probed interface %s\n", net_dev->name);
 | |
|  	return 0;
 | |
| @@ -3944,6 +4022,8 @@ static int dpaa2_eth_remove(struct fsl_m
 | |
|  #ifdef CONFIG_DEBUG_FS
 | |
|  	dpaa2_dbg_remove(priv);
 | |
|  #endif
 | |
| +	dpaa2_eth_sysfs_remove(&net_dev->dev);
 | |
| +
 | |
|  	unregister_netdev(net_dev);
 | |
|  
 | |
|  	if (priv->do_link_poll)
 | |
| --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
 | |
| +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
 | |
| @@ -42,6 +42,9 @@
 | |
|   */
 | |
|  #define DPAA2_ETH_FQ_TAILDROP_THRESH	(1024 * 1024)
 | |
|  
 | |
| +/* Maximum burst size value for Tx shaping */
 | |
| +#define DPAA2_ETH_MAX_BURST_SIZE	0xF7FF
 | |
| +
 | |
|  /* Maximum number of Tx confirmation frames to be processed
 | |
|   * in a single NAPI call
 | |
|   */
 | |
| @@ -445,6 +448,7 @@ struct dpaa2_eth_priv {
 | |
|  #ifdef CONFIG_DEBUG_FS
 | |
|  	struct dpaa2_debugfs dbg;
 | |
|  #endif
 | |
| +	struct dpni_tx_shaping_cfg shaping_cfg;
 | |
|  };
 | |
|  
 | |
|  #define DPAA2_RXH_SUPPORTED	(RXH_L2DA | RXH_VLAN | RXH_L3_PROTO \
 |