diff options
| author | Mingcheng Zhu <mingchen@qca.qualcomm.com> | 2014-06-04 11:52:11 -0700 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-07-16 21:15:08 -0700 |
| commit | 3cb85a3b1d99dcb080e3a74ee562db65448df55c (patch) | |
| tree | 265fc5a1f34d6f25b4481657f7ffa66b67348de7 | |
| parent | fb1b0c8bd6a305164151a3d5628d840c206b8170 (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.c | 73 | ||||
| -rw-r--r-- | CORE/SERVICES/HTC/htc_recv.c | 10 | ||||
| -rw-r--r-- | CORE/SERVICES/HTC/htc_send.c | 111 |
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) |
