Merge "usb: gadget: Add support to RNDIS PacketAlignmentFactor setting" into msm-3.4
diff --git a/drivers/usb/gadget/f_qc_rndis.c b/drivers/usb/gadget/f_qc_rndis.c
index dcf307d..a740d95 100644
--- a/drivers/usb/gadget/f_qc_rndis.c
+++ b/drivers/usb/gadget/f_qc_rndis.c
@@ -882,6 +882,11 @@
rndis_set_max_pkt_xfer(rndis->config, rndis->max_pkt_per_xfer);
+ /* In case of aggregated packets QC device will request
+ * aliment to 4 (2^2).
+ */
+ rndis_set_pkt_alignment_factor(rndis->config, 2);
+
/* NOTE: all that is done without knowing or caring about
* the network link ... which is unavailable to this code
* until we're activated via set_alt().
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
index 087c928..801d24d 100644
--- a/drivers/usb/gadget/rndis.c
+++ b/drivers/usb/gadget/rndis.c
@@ -586,12 +586,13 @@
resp->DeviceFlags = cpu_to_le32(RNDIS_DF_CONNECTIONLESS);
resp->Medium = cpu_to_le32(RNDIS_MEDIUM_802_3);
resp->MaxPacketsPerTransfer = cpu_to_le32(params->max_pkt_per_xfer);
- resp->MaxTransferSize = cpu_to_le32(
- params->dev->mtu
+ resp->MaxTransferSize = cpu_to_le32(params->max_pkt_per_xfer *
+ (params->dev->mtu
+ sizeof(struct ethhdr)
+ sizeof(struct rndis_packet_msg_type)
- + 22);
- resp->PacketAlignmentFactor = cpu_to_le32(0);
+
+ + 22));
+ resp->PacketAlignmentFactor = cpu_to_le32(params->pkt_alignment_factor);
resp->AFListOffset = cpu_to_le32(0);
resp->AFListSize = cpu_to_le32(0);
@@ -903,6 +904,7 @@
rndis_per_dev_params[i].resp_avail = resp_avail;
rndis_per_dev_params[i].v = v;
rndis_per_dev_params[i].max_pkt_per_xfer = 1;
+ rndis_per_dev_params[i].pkt_alignment_factor = 0;
pr_debug("%s: configNr = %d\n", __func__, i);
return i;
}
@@ -963,6 +965,14 @@
rndis_per_dev_params[configNr].max_pkt_per_xfer = max_pkt_per_xfer;
}
+void rndis_set_pkt_alignment_factor(u8 configNr, u8 pkt_alignment_factor)
+{
+ pr_debug("%s:\n", __func__);
+
+ rndis_per_dev_params[configNr].pkt_alignment_factor =
+ pkt_alignment_factor;
+}
+
void rndis_add_hdr(struct sk_buff *skb)
{
struct rndis_packet_msg_type *header;
diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h
index 1f06c42..8a6a630 100644
--- a/drivers/usb/gadget/rndis.h
+++ b/drivers/usb/gadget/rndis.h
@@ -236,6 +236,7 @@
u32 vendorID;
u8 max_pkt_per_xfer;
+ u8 pkt_alignment_factor;
const char *vendorDescr;
void (*resp_avail)(void *v);
void *v;