net: cdc_ncm: export NCM Transfer Block (NTB) parameters
authorBjørn Mork <bjorn@mork.no>
Fri, 30 May 2014 07:31:08 +0000 (09:31 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Jun 2014 23:01:31 +0000 (16:01 -0700)
The mandatory GetNtbParameters control request is an important part of
the host <-> device protocol negotiation in CDC NCM (and CDC MBIM). It
gives device limits which the host must obey when configuring the
protocol aggregation variables. The driver will enforce this by
rejecting attempts to set any of the tunable variables to a value
which is not supported by the device.  Exporting the parameter block
helps userspace decide which values are allowed without resorting
to trial and error.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/cdc_ncm.c

index aaa440d..98c3adb 100644 (file)
@@ -260,10 +260,40 @@ static DEVICE_ATTR(rx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_rx_max, cdc_ncm_store
 static DEVICE_ATTR(tx_max, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_max, cdc_ncm_store_tx_max);
 static DEVICE_ATTR(tx_timer_usecs, S_IRUGO | S_IWUSR, cdc_ncm_show_tx_timer_usecs, cdc_ncm_store_tx_timer_usecs);
 
+#define NCM_PARM_ATTR(name, format, tocpu)                             \
+static ssize_t cdc_ncm_show_##name(struct device *d, struct device_attribute *attr, char *buf) \
+{ \
+       struct usbnet *dev = netdev_priv(to_net_dev(d)); \
+       struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; \
+       return sprintf(buf, format "\n", tocpu(ctx->ncm_parm.name));    \
+} \
+static DEVICE_ATTR(name, S_IRUGO, cdc_ncm_show_##name, NULL)
+
+NCM_PARM_ATTR(bmNtbFormatsSupported, "0x%04x", le16_to_cpu);
+NCM_PARM_ATTR(dwNtbInMaxSize, "%u", le32_to_cpu);
+NCM_PARM_ATTR(wNdpInDivisor, "%u", le16_to_cpu);
+NCM_PARM_ATTR(wNdpInPayloadRemainder, "%u", le16_to_cpu);
+NCM_PARM_ATTR(wNdpInAlignment, "%u", le16_to_cpu);
+NCM_PARM_ATTR(dwNtbOutMaxSize, "%u", le32_to_cpu);
+NCM_PARM_ATTR(wNdpOutDivisor, "%u", le16_to_cpu);
+NCM_PARM_ATTR(wNdpOutPayloadRemainder, "%u", le16_to_cpu);
+NCM_PARM_ATTR(wNdpOutAlignment, "%u", le16_to_cpu);
+NCM_PARM_ATTR(wNtbOutMaxDatagrams, "%u", le16_to_cpu);
+
 static struct attribute *cdc_ncm_sysfs_attrs[] = {
        &dev_attr_rx_max.attr,
        &dev_attr_tx_max.attr,
        &dev_attr_tx_timer_usecs.attr,
+       &dev_attr_bmNtbFormatsSupported.attr,
+       &dev_attr_dwNtbInMaxSize.attr,
+       &dev_attr_wNdpInDivisor.attr,
+       &dev_attr_wNdpInPayloadRemainder.attr,
+       &dev_attr_wNdpInAlignment.attr,
+       &dev_attr_dwNtbOutMaxSize.attr,
+       &dev_attr_wNdpOutDivisor.attr,
+       &dev_attr_wNdpOutPayloadRemainder.attr,
+       &dev_attr_wNdpOutAlignment.attr,
+       &dev_attr_wNtbOutMaxDatagrams.attr,
        NULL,
 };