summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMingcheng Zhu <mingchen@qca.qualcomm.com>2014-06-04 11:52:11 -0700
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-07-16 21:15:08 -0700
commit3cb85a3b1d99dcb080e3a74ee562db65448df55c (patch)
tree265fc5a1f34d6f25b4481657f7ffa66b67348de7
parentfb1b0c8bd6a305164151a3d5628d840c206b8170 (diff)
QCACLD-NEW: HTC update to support end point ping feature
HTC is updated to allow end point ping to coexist with CLD. CRs-Fixed: 657692 Change-Id: I27cec028de2687981a0b8f244a979deb78caec4a
-rw-r--r--CORE/SERVICES/HTC/htc.c73
-rw-r--r--CORE/SERVICES/HTC/htc_recv.c10
-rw-r--r--CORE/SERVICES/HTC/htc_send.c111
3 files changed, 193 insertions, 1 deletions
diff --git a/CORE/SERVICES/HTC/htc.c b/CORE/SERVICES/HTC/htc.c
index 60389f4a8f55..d432d37be6d8 100644
--- a/CORE/SERVICES/HTC/htc.c
+++ b/CORE/SERVICES/HTC/htc.c
@@ -31,6 +31,8 @@
#include <adf_nbuf.h> /* adf_nbuf_t */
#include <adf_os_types.h> /* adf_os_print */
#include <hif_msg_based.h> /* HIFFlushSurpriseRemove */
+#include <vos_getBin.h>
+#include "epping_main.h"
#ifdef DEBUG
static ATH_DEBUG_MASK_DESCRIPTION g_HTCDebugDescription[] = {
@@ -308,7 +310,7 @@ A_STATUS HTCSetupTargetBufferAssignments(HTC_TARGET *target)
#if defined(HIF_USB)
target->avail_tx_credits = target->TotalTransmitCredits - 1 ;
#endif
-#if !(defined(HIF_PCI) || defined(HIF_SIM) || defined(CONFIG_HL_SUPPORT) || (defined(HIF_USB) && !defined(EPPING_TEST)))
+#if !(defined(HIF_PCI) || defined(HIF_SIM) || defined(CONFIG_HL_SUPPORT) || (defined(HIF_USB)))
status = A_NO_RESOURCE;
#endif
@@ -326,6 +328,70 @@ A_STATUS HTCSetupTargetBufferAssignments(HTC_TARGET *target)
pEntry->ServiceID = WMI_CONTROL_SVC;
pEntry->CreditAllocation = credits;
+ if (WLAN_IS_EPPING_ENABLED(vos_get_conparam())) {
+#if !defined(HIF_USB)
+ pEntry++;
+ pEntry->ServiceID = WMI_DATA_BE_SVC;
+ pEntry->CreditAllocation = credits;
+#endif
+#if defined(HIF_USB)
+ do {
+ pEntry++;
+ pEntry->ServiceID = WMI_DATA_VI_SVC;
+ pEntry->CreditAllocation = credits / 4;
+ if (pEntry->CreditAllocation == 0) {
+ pEntry->CreditAllocation++;
+ }
+ credits -= (int)pEntry->CreditAllocation;
+ if (credits <= 0) {
+ break;
+ }
+ pEntry++;
+ pEntry->ServiceID = WMI_DATA_VO_SVC;
+ pEntry->CreditAllocation = credits / 3;
+ if (pEntry->CreditAllocation == 0) {
+ pEntry->CreditAllocation++;
+ }
+ credits -= (int)pEntry->CreditAllocation;
+ if (credits <= 0) {
+ break;
+ }
+ pEntry++;
+ pEntry->ServiceID = WMI_DATA_BK_SVC;
+ pEntry->CreditAllocation = credits / 2;
+ credits -= (int)pEntry->CreditAllocation;
+ if (credits <= 0) {
+ break;
+ }
+ /*
+ * HTT_DATA_MSG_SVG is unidirectional from target -> host,
+ * so no target buffers are needed.
+ */
+ pEntry++;
+ pEntry->ServiceID = WMI_DATA_BE_SVC;
+ pEntry->CreditAllocation = credits / 2;
+ credits -= (int)pEntry->CreditAllocation;
+ if (credits <= 0) {
+ break;
+ }
+ /* leftovers go to best effort */
+ pEntry++;
+ pEntry->ServiceID = WMI_CONTROL_SVC;
+ pEntry->CreditAllocation = (A_UINT8)credits;
+ status = A_OK;
+ } while (FALSE);
+ #endif
+ #if defined(HIF_PCI)
+ //pEntry++;
+ pEntry->ServiceID = WMI_DATA_BE_SVC;
+ pEntry->CreditAllocation = (credits >> 1);
+
+ pEntry++;
+ pEntry->ServiceID = WMI_DATA_BK_SVC;
+ pEntry->CreditAllocation = (credits >> 1);
+ #endif
+ }
+
#else
do {
@@ -521,6 +587,11 @@ A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle)
} while (FALSE);
+#if defined(HIF_USB)
+ if (WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
+ HIFStart_INPipe(target->hif_dev);
+#endif
+
AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Exit (%d)\n",status));
AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("-HWT\n"));
return status;
diff --git a/CORE/SERVICES/HTC/htc_recv.c b/CORE/SERVICES/HTC/htc_recv.c
index 1438d45f283c..dad95853b168 100644
--- a/CORE/SERVICES/HTC/htc_recv.c
+++ b/CORE/SERVICES/HTC/htc_recv.c
@@ -29,6 +29,8 @@
#include "htc_internal.h"
#include "vos_api.h"
#include <adf_nbuf.h> /* adf_nbuf_t */
+#include <vos_getBin.h>
+#include "epping_main.h"
#ifdef DEBUG
void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription)
@@ -422,6 +424,10 @@ A_STATUS HTCRxCompletionHandler(
netbuf = NULL;
break;
}
+#if defined(HIF_USB)
+ if (WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
+ goto _eppingout;
+#endif
/* the current message based HIF architecture allocates net bufs for recv packets
* since this layer bridges that HIF to upper layers , which expects HTC packets,
@@ -451,6 +457,10 @@ A_STATUS HTCRxCompletionHandler(
#ifdef RX_SG_SUPPORT
_out:
#endif
+
+#if defined(HIF_USB)
+_eppingout:
+#endif
if (netbuf != NULL) {
adf_nbuf_free(netbuf);
}
diff --git a/CORE/SERVICES/HTC/htc_send.c b/CORE/SERVICES/HTC/htc_send.c
index f87fc6d4eed0..bde183eec6f8 100644
--- a/CORE/SERVICES/HTC/htc_send.c
+++ b/CORE/SERVICES/HTC/htc_send.c
@@ -30,6 +30,8 @@
#include "htc_internal.h"
#include <adf_nbuf.h> /* adf_nbuf_t */
#include <adf_os_mem.h> /* adf_os_mem_alloc */
+#include <vos_getBin.h>
+#include "epping_main.h"
//#define USB_HIF_SINGLE_PIPE_DATA_SCHED
//#ifdef USB_HIF_SINGLE_PIPE_DATA_SCHED
@@ -135,12 +137,41 @@ static void DoSendCompletion(HTC_ENDPOINT *pEndpoint,
}
+#if defined(HIF_USB)
+extern unsigned int txCompleteCounter;
+extern unsigned int txCounter;
+extern NDIS_EVENT TXcompleteEvent;
+extern unsigned int checkTXcompleteEvent;
+#endif
static void SendPacketCompletion(HTC_TARGET *target, HTC_PACKET *pPacket)
{
HTC_ENDPOINT *pEndpoint = &target->EndPoint[pPacket->Endpoint];
HTC_PACKET_QUEUE container;
+#if defined(HIF_USB)
+ EPPING_HEADER *pktHeader;
+ adf_nbuf_t nbuf;
+#endif
+
RestoreTxPacket(target, pPacket);
INIT_HTC_PACKET_QUEUE_AND_ADD(&container,pPacket);
+
+#if defined(HIF_USB)
+ if (WLAN_IS_EPPING_ENABLED(vos_get_conparam())) {
+ pktHeader = (EPPING_HEADER *)(pPacket->pBuffer);
+ if (IS_EPPING_PACKET(pktHeader))
+ {
+ txCompleteCounter++;
+ if ((txCounter == txCompleteCounter) && (checkTXcompleteEvent)) {
+ checkTXcompleteEvent = 0;
+ }
+ }
+ nbuf = GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket);
+ if (nbuf != NULL) {
+ adf_nbuf_free(nbuf);
+ }
+ A_FREE(pPacket);
+ }
+#endif
/* do completion */
DoSendCompletion(pEndpoint,&container);
}
@@ -379,8 +410,85 @@ static A_STATUS HTCIssuePackets(HTC_TARGET *target,
AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCIssuePackets: Queue: %p, Pkts %d \n",
pPktQueue, HTC_PACKET_QUEUE_DEPTH(pPktQueue)));
+#if defined(HIF_USB)
+ if (htc_bundle_send &&
+ (WLAN_IS_EPPING_ENABLED(vos_get_conparam()) ||
+ pEndpoint->UL_PipeID != 0)) {
+ adf_nbuf_t msg_bundle[HTC_MAX_MSG_PER_BUNDLE];
+ unsigned int msg_length[HTC_MAX_MSG_PER_BUNDLE];
+ int msgs_to_bundle = 0;
+
+ while ((!HTC_QUEUE_EMPTY(pPktQueue)) &&
+ (msgs_to_bundle < HTC_MAX_MSG_PER_BUNDLE)) {
+ pPacket = HTC_PACKET_DEQUEUE(pPktQueue);
+ if(NULL == pPacket){
+ break;
+ }
+ netbuf = GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket);
+ AR_DEBUG_ASSERT(netbuf);
+ /* Non-credit enabled endpoints have been mapped
+ * and setup by now, so no need to revisit
+ * the HTC headers */
+#if AR6004_HW
+ pPacket->PktInfo.AsTx.SendFlags |= HTC_FLAGS_SEND_BUNDLE;
+#endif
+ if (IS_TX_CREDIT_FLOW_ENABLED(pEndpoint)) {
+ payloadLen = pPacket->ActualLength;
+ /* setup HTC frame header */
+
+ pHtcHdr =
+ (HTC_FRAME_HDR *) adf_nbuf_get_frag_vaddr(netbuf, 0);
+ AR_DEBUG_ASSERT(pHtcHdr);
+
+ HTC_WRITE32(pHtcHdr, SM(payloadLen,
+ HTC_FRAME_HDR_PAYLOADLEN) |
+ SM(pPacket->PktInfo.AsTx.SendFlags,
+ HTC_FRAME_HDR_FLAGS) |
+ SM(pPacket->Endpoint, HTC_FRAME_HDR_ENDPOINTID));
+ HTC_WRITE32(((A_UINT32 *)pHtcHdr) + 1,
+ SM(pPacket->PktInfo.AsTx.SeqNo,
+ HTC_FRAME_HDR_CONTROLBYTES1));
+ /*
+ * Now that the HTC frame header has been added,
+ * the netbuf can be mapped. This only applies to
+ * non-data frames, since data frames were already
+ * mapped as they entered into the driver.
+ * Check the "FIXUP_NETBUF" flag to see
+ * whether this is a data netbuf that is already mapped,
+ * or a non-data netbuf that needs to be mapped.
+ */
+ if ((pPacket->PktInfo.AsTx.Flags &
+ HTC_TX_PACKET_FLAG_FIXUP_NETBUF)) {
+ adf_nbuf_map(
+ target->osdev,
+ GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket),
+ ADF_OS_DMA_TO_DEVICE);
+ }
+ }
+ LOCK_HTC_TX(target);
+ /* store in look up queue to match completions */
+ HTC_PACKET_ENQUEUE(&pEndpoint->TxLookupQueue,pPacket);
+ INC_HTC_EP_STAT(pEndpoint,TxIssued,1);
+ sdio_bundling_stats.TxIssued += 1;
+ pEndpoint->ul_outstanding_cnt++;
+ UNLOCK_HTC_TX(target);
+ /* pPktQueue is less than HTC_MAX_MSG_PER_BUNDLE */
+ msg_bundle[msgs_to_bundle] = netbuf;
+ msg_length[msgs_to_bundle] = HTC_HDR_LENGTH +
+ pPacket->ActualLength;
+ msgs_to_bundle++;
+ }
+ sdio_bundling_stats.TxPacketsBundled += msgs_to_bundle;
+ sdio_bundling_stats.TxBundles += 1;
+ HIFSendMultiple_head(target->hif_dev,
+ pEndpoint->UL_PipeID, pEndpoint->Id,
+ msg_bundle,
+ msg_length,
+ msgs_to_bundle);
+ } else {
+#endif
while (TRUE) {
#if ENABLE_BUNDLE_TX
if(IS_TX_CREDIT_FLOW_ENABLED(pEndpoint) &&
@@ -472,6 +580,9 @@ static A_STATUS HTCIssuePackets(HTC_TARGET *target,
}
}
+#if defined(HIF_USB)
+ }
+#endif
if (adf_os_unlikely(A_FAILED(status))) {
#if defined(HIF_USB)