USB: gadget: rndis: Add module parameter for DL max packets per xfer
authorxerox_lin <xerox_lin@htc.com>
Thu, 4 Sep 2014 08:01:59 +0000 (16:01 +0800)
committerBadhri Jagan Sridharan <Badhri@google.com>
Thu, 25 Sep 2014 02:08:37 +0000 (19:08 -0700)
Currently DL aggregation is supported in RNDIS driver and is set to
3 by default. And there is no support to change downlink maximum
packets per transfer at runtime through module parameter. Hence add
module parameter for DL maximum packets per transfer to change it at
runtime.

echo 6 > /sys/module/g_android/parameters/rndis_dl_max_pkt_per_xfer

To disable DL aggregation during runtime,

echo 1 > /sys/module/g_android/parameters/rndis_dl_max_pkt_per_xfer

Change-Id: I3a1d0bc97358e2b6f233df7ae8725fb507de50db
Signed-off-by: Xerox Lin <xerox_lin@htc.com>
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
drivers/usb/gadget/f_rndis.c
drivers/usb/gadget/u_ether.c
drivers/usb/gadget/u_ether.h

index a0240195b46ace7c28a6db72ed9ad3eda81d5ac9..1870148856871a82de930e061587a14847abf5c2 100644 (file)
  *   - MS-Windows drivers sometimes emit undocumented requests.
  */
 
-static bool rndis_multipacket_dl_disable;
-module_param(rndis_multipacket_dl_disable, bool, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(rndis_multipacket_dl_disable,
-       "Disable RNDIS Multi-packet support in DownLink");
+static unsigned int rndis_dl_max_pkt_per_xfer = 3;
+module_param(rndis_dl_max_pkt_per_xfer, uint, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(rndis_dl_max_pkt_per_xfer,
+       "Maximum packets per transfer for DL aggregation");
 
 static unsigned int rndis_ul_max_pkt_per_xfer = 3;
 module_param(rndis_ul_max_pkt_per_xfer, uint, S_IRUGO | S_IWUSR);
@@ -477,7 +477,7 @@ static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
                                __func__, buf->MaxTransferSize,
                                rndis->port.multi_pkt_xfer ? "enabled" :
                                                            "disabled");
-               if (rndis_multipacket_dl_disable)
+               if (rndis_dl_max_pkt_per_xfer <= 1)
                        rndis->port.multi_pkt_xfer = 0;
        }
 //     spin_unlock(&dev->lock);
@@ -881,6 +881,7 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
        rndis->port.wrap = rndis_add_header;
        rndis->port.unwrap = rndis_rm_hdr;
        rndis->port.ul_max_pkts_per_xfer = rndis_ul_max_pkt_per_xfer;
+       rndis->port.dl_max_pkts_per_xfer = rndis_dl_max_pkt_per_xfer;
 
        rndis->port.func.name = "rndis";
        rndis->port.func.strings = rndis_strings;
index ff26f5c2d38e1d689c6e231c04974143dfbc510f..14f587efc0f6eb66c97fbfd924c86a9d17adac18 100644 (file)
@@ -72,6 +72,7 @@ struct eth_dev {
 
        unsigned                header_len;
        unsigned                ul_max_pkts_per_xfer;
+       unsigned                dl_max_pkts_per_xfer;
        struct sk_buff          *(*wrap)(struct gether *, struct sk_buff *skb);
        int                     (*unwrap)(struct gether *,
                                                struct sk_buff *skb,
@@ -578,7 +579,7 @@ static void alloc_tx_buffer(struct eth_dev *dev)
        struct list_head        *act;
        struct usb_request      *req;
 
-       dev->tx_req_bufsize = (TX_SKB_HOLD_THRESHOLD *
+       dev->tx_req_bufsize = (dev->dl_max_pkts_per_xfer *
                                (dev->net->mtu
                                + sizeof(struct ethhdr)
                                /* size of rndis_packet_msg_type */
@@ -690,7 +691,7 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
                dev_kfree_skb_any(skb);
 
                spin_lock_irqsave(&dev->req_lock, flags);
-               if (dev->tx_skb_hold_count < TX_SKB_HOLD_THRESHOLD) {
+               if (dev->tx_skb_hold_count < dev->dl_max_pkts_per_xfer) {
                        if (dev->no_tx_req_used > TX_REQ_THRESHOLD) {
                                list_add(&req->list, &dev->tx_reqs);
                                spin_unlock_irqrestore(&dev->req_lock, flags);
@@ -1054,6 +1055,7 @@ struct net_device *gether_connect(struct gether *link)
                dev->unwrap = link->unwrap;
                dev->wrap = link->wrap;
                dev->ul_max_pkts_per_xfer = link->ul_max_pkts_per_xfer;
+               dev->dl_max_pkts_per_xfer = link->dl_max_pkts_per_xfer;
 
                spin_lock(&dev->lock);
                dev->tx_skb_hold_count = 0;
index ce803d415887c30d3d8a3bd50d95621a2bc020dc..67eda50ae995354cefe5be57bbea2054824a065c 100644 (file)
@@ -55,8 +55,7 @@ struct gether {
        u32                             fixed_out_len;
        u32                             fixed_in_len;
        unsigned                ul_max_pkts_per_xfer;
-/* Max number of SKB packets to be used to create Multi Packet RNDIS */
-#define TX_SKB_HOLD_THRESHOLD          3
+       unsigned                dl_max_pkts_per_xfer;
        bool                            multi_pkt_xfer;
        struct sk_buff                  *(*wrap)(struct gether *port,
                                                struct sk_buff *skb);