aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2014-05-30 03:31:09 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-02 19:01:31 -0400
commit39eb7e0e8c88dee58f83df8aa9f7a58559fa45ee (patch)
treed1f73e2464988933d01bcd3b2c703104eda192c0 /drivers/net/usb
parent871578c90a9de5b785a815596dc7f8f0c147be19 (diff)
net: cdc_ncm: allow tuning min_tx_pkt
The min_tx_pkt variable decides the cutoff point where the driver will stop padding out NTBs to maximum size. The padding is a tradeoff where we use some USB bus bandwidth to allow the device to receive fixed size buffers. Different devices will have different optimal settings, spanning from no padding at all to padding every NTB. There is no way to automatically figure out which setting is best for a specific device. The default value is a reasonable tradeoff, calculated based on the USB packet size and out NTB max size. This may have to be changed along with any tx_max changes. Signed-off-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r--drivers/net/usb/cdc_ncm.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index 98c3adb5aea3..80a844e0ae03 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -185,6 +185,14 @@ static u32 cdc_ncm_check_tx_max(struct usbnet *dev, u32 new_tx)
185 return val; 185 return val;
186} 186}
187 187
188static ssize_t cdc_ncm_show_min_tx_pkt(struct device *d, struct device_attribute *attr, char *buf)
189{
190 struct usbnet *dev = netdev_priv(to_net_dev(d));
191 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
192
193 return sprintf(buf, "%u\n", ctx->min_tx_pkt);
194}
195
188static ssize_t cdc_ncm_show_rx_max(struct device *d, struct device_attribute *attr, char *buf) 196static ssize_t cdc_ncm_show_rx_max(struct device *d, struct device_attribute *attr, char *buf)
189{ 197{
190 struct usbnet *dev = netdev_priv(to_net_dev(d)); 198 struct usbnet *dev = netdev_priv(to_net_dev(d));
@@ -209,6 +217,20 @@ static ssize_t cdc_ncm_show_tx_timer_usecs(struct device *d, struct device_attri
209 return sprintf(buf, "%u\n", ctx->timer_interval / (u32)NSEC_PER_USEC); 217 return sprintf(buf, "%u\n", ctx->timer_interval / (u32)NSEC_PER_USEC);
210} 218}
211 219
220static ssize_t cdc_ncm_store_min_tx_pkt(struct device *d, struct device_attribute *attr, const char *buf, size_t len)
221{
222 struct usbnet *dev = netdev_priv(to_net_dev(d));
223 struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
224 unsigned long val;
225
226 /* no need to restrict values - anything from 0 to infinity is OK */
227 if (kstrtoul(buf, 0, &val))
228 return -EINVAL;
229
230 ctx->min_tx_pkt = val;
231 return len;
232}
233
212static ssize_t cdc_ncm_store_rx_max(struct device *d, struct device_attribute *attr, const char *buf, size_t len) 234static ssize_t cdc_ncm_store_rx_max(struct device *d, struct device_attribute *attr, const char *buf, size_t len)
213{ 235{
214 struct usbnet *dev = netdev_priv(to_net_dev(d)); 236 struct usbnet *dev = netdev_priv(to_net_dev(d));
@@ -256,6 +278,7 @@ static ssize_t cdc_ncm_store_tx_timer_usecs(struct device *d, struct device_att
256 return len; 278 return len;
257} 279}
258 280
281static DEVICE_ATTR(min_tx_pkt, S_IRUGO | S_IWUSR, cdc_ncm_show_min_tx_pkt, cdc_ncm_store_min_tx_pkt);
259static DEVICE_ATTR(rx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_rx_max, cdc_ncm_store_rx_max); 282static DEVICE_ATTR(rx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_rx_max, cdc_ncm_store_rx_max);
260static DEVICE_ATTR(tx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_max, cdc_ncm_store_tx_max); 283static DEVICE_ATTR(tx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_max, cdc_ncm_store_tx_max);
261static DEVICE_ATTR(tx_timer_usecs, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_timer_usecs, cdc_ncm_store_tx_timer_usecs); 284static DEVICE_ATTR(tx_timer_usecs, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_timer_usecs, cdc_ncm_store_tx_timer_usecs);
@@ -281,6 +304,7 @@ NCM_PARM_ATTR(wNdpOutAlignment, "%u", le16_to_cpu);
281NCM_PARM_ATTR(wNtbOutMaxDatagrams, "%u", le16_to_cpu); 304NCM_PARM_ATTR(wNtbOutMaxDatagrams, "%u", le16_to_cpu);
282 305
283static struct attribute *cdc_ncm_sysfs_attrs[] = { 306static struct attribute *cdc_ncm_sysfs_attrs[] = {
307 &dev_attr_min_tx_pkt.attr,
284 &dev_attr_rx_max.attr, 308 &dev_attr_rx_max.attr,
285 &dev_attr_tx_max.attr, 309 &dev_attr_tx_max.attr,
286 &dev_attr_tx_timer_usecs.attr, 310 &dev_attr_tx_timer_usecs.attr,