Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddd4293c authored by xerox_lin's avatar xerox_lin Committed by Sivasri Kumar Vanka
Browse files

USB: gadget: rndis: Add module parameter for DL max packets per xfer

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/usb_f_rndis/parameters/rndis_dl_max_pkt_per_xfer

To disable DL aggregation during runtime,

echo 1 > /sys/module/usb_f_rndis/parameters/rndis_dl_max_pkt_per_xfer.

Change-Id: I3a1d0bc97358e2b6f233df7ae8725fb507de50db
Git-Commit: cdffcb845ee56ce6d0b55200f7909ab954e92ec4
Git-repo: https://source.codeaurora.org/quic/la/kernel/msm-4.9


Signed-off-by: default avatarXerox Lin <xerox_lin@htc.com>
Signed-off-by: default avatarVijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: default avatarSivasri Kumar Vanka <sivasri@codeaurora.org>
parent aeacf540
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -70,10 +70,10 @@
 *   - MS-Windows drivers sometimes emit undocumented requests.
 */

static bool rndis_multipacket_dl_disable;
module_param(rndis_multipacket_dl_disable, bool, 0644);
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, 0644);
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, 0644);
@@ -484,7 +484,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);
@@ -1074,6 +1074,7 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
	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";
	/* descriptors are per-instance copies */
+4 −2
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ struct eth_dev {

	unsigned		header_len;
	unsigned int		ul_max_pkts_per_xfer;
	unsigned int		dl_max_pkts_per_xfer;
	struct sk_buff		*(*wrap)(struct gether *, struct sk_buff *skb);
	int			(*unwrap)(struct gether *,
						struct sk_buff *skb,
@@ -637,7 +638,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 */
@@ -756,7 +757,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);
@@ -1473,6 +1474,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;
+1 −2
Original line number Diff line number Diff line
@@ -74,8 +74,7 @@ struct gether {
	u32				fixed_out_len;
	u32				fixed_in_len;
	unsigned int			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 int			dl_max_pkts_per_xfer;
	bool				multi_pkt_xfer;
	bool				supports_multi_frame;
	struct sk_buff			*(*wrap)(struct gether *port,