qcacmn: Add support for asynchronous Host to Target connection

Add support for asynchronous Host to Target connection connection in
whcih packets can be queued in both interrrupt and process context.

Change-Id: I52f0f972b938a558e4ef3c13cf4d76aa3a63d58f
CRs-Fixed: 1092518
This commit is contained in:
Venkateswara Swamy Bandaru
2016-11-21 15:06:24 +05:30
committed by qcabuildsw
szülő 1dd971bf7f
commit ae41b9e0ae
4 fájl változott, egészen pontosan 43 új sor hozzáadva és 11 régi sor törölve

Fájl megtekintése

@@ -770,4 +770,18 @@ int htc_pm_runtime_put(HTC_HANDLE htc_handle);
static inline int htc_pm_runtime_get(HTC_HANDLE htc_handle) { return 0; }
static inline int htc_pm_runtime_put(HTC_HANDLE htc_handle) { return 0; }
#endif
/**
* htc_set_async_ep() - set async HTC end point
* user should call this function after htc_connect_service before
* queing any packets to end point
* @HTCHandle: htc handle
* @HTC_ENDPOINT_ID: end point id
* @value: true or false
*
* Return: None
*/
void htc_set_async_ep(HTC_HANDLE HTCHandle,
HTC_ENDPOINT_ID htc_ep_id, bool value);
#endif /* _HTC_API_H_ */

Fájl megtekintése

@@ -135,6 +135,7 @@ typedef struct _HTC_ENDPOINT {
HTC_ENDPOINT_STATS endpoint_stats; /* endpoint statistics */
#endif
bool TxCreditFlowEnabled;
bool async_update; /* packets can be queued asynchronously */
} HTC_ENDPOINT;
#ifdef HTC_EP_STAT_PROFILING

Fájl megtekintése

@@ -616,14 +616,14 @@ static A_STATUS htc_issue_packets(HTC_TARGET *target,
}
}
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
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);
pEndpoint->ul_outstanding_cnt++;
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
UNLOCK_HTC_TX(target);
hif_send_complete_check(target->hif_dev,
pEndpoint->UL_PipeID, false);
@@ -651,7 +651,7 @@ static A_STATUS htc_issue_packets(HTC_TARGET *target,
("hif_send Failed status:%d \n",
status));
}
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
LOCK_HTC_TX(target);
}
target->ce_send_cnt--;
@@ -662,7 +662,7 @@ static A_STATUS htc_issue_packets(HTC_TARGET *target,
pPacket->PktInfo.AsTx.CreditsUsed;
/* put it back into the callers queue */
HTC_PACKET_ENQUEUE_TO_HEAD(pPktQueue, pPacket);
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
UNLOCK_HTC_TX(target);
}
break;
@@ -1156,9 +1156,12 @@ static HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
* transmit resources */
while (true) {
if ((HTC_PACKET_QUEUE_DEPTH(&pEndpoint->TxQueue) == 0) ||
((!tx_resources) &&
(pEndpoint->service_id == WMI_CONTROL_SVC))) {
if (HTC_PACKET_QUEUE_DEPTH(&pEndpoint->TxQueue) == 0)
break;
if (pEndpoint->async_update &&
(!IS_TX_CREDIT_FLOW_ENABLED(pEndpoint)) &&
(!tx_resources)) {
break;
}
@@ -1211,7 +1214,7 @@ static HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
break;
}
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
UNLOCK_HTC_TX(target);
}
@@ -1229,7 +1232,7 @@ static HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
HTC_PACKET_QUEUE_TRANSFER_TO_HEAD(&pEndpoint->TxQueue,
&sendQueue);
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
LOCK_HTC_TX(target);
}
break;
@@ -1241,7 +1244,7 @@ static HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
pEndpoint->UL_PipeID);
}
if (pEndpoint->service_id != WMI_CONTROL_SVC) {
if (!pEndpoint->async_update) {
LOCK_HTC_TX(target);
}
@@ -1920,7 +1923,7 @@ QDF_STATUS htc_tx_completion_handler(void *Context,
* when credits flow back from the target.
* in the non-TX credit case, we recheck after the packet completes */
if ((qdf_atomic_read(&pEndpoint->TxProcessCount) == 0) ||
(pEndpoint->service_id != WMI_CONTROL_SVC)) {
(!pEndpoint->async_update)) {
htc_try_send(target, pEndpoint, NULL);
}
}

Fájl megtekintése

@@ -357,6 +357,7 @@ A_STATUS htc_connect_service(HTC_HANDLE HTCHandle,
/* copy all the callbacks */
pEndpoint->EpCallBacks = pConnectReq->EpCallbacks;
pEndpoint->async_update = 0;
status = hif_map_service_to_pipe(target->hif_dev,
pEndpoint->service_id,
@@ -424,3 +425,16 @@ void htc_fw_event_handler(void *context, QDF_STATUS status)
initInfo->TargetFailure(initInfo->pContext, status);
}
}
void htc_set_async_ep(HTC_HANDLE HTCHandle,
HTC_ENDPOINT_ID htc_ep_id, bool value)
{
HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
HTC_ENDPOINT *pEndpoint = &target->endpoint[htc_ep_id];
pEndpoint->async_update = value;
qdf_print("%s: htc_handle %p, ep %d, value %d\n", __func__,
HTCHandle, htc_ep_id, value);
}