|
@@ -736,6 +736,7 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
|
|
|
int (*update_ep_padding_credit)(void *, int);
|
|
|
void *ctx = NULL;
|
|
|
bool rt_put_in_resp;
|
|
|
+ int32_t sys_state = HIF_SYSTEM_PM_STATE_ON;
|
|
|
|
|
|
update_ep_padding_credit =
|
|
|
pEndpoint->EpCallBacks.ep_padding_credit_update;
|
|
@@ -851,6 +852,11 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
|
|
|
pEndpoint->UL_PipeID, false);
|
|
|
}
|
|
|
|
|
|
+ if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_SYSTEM_SUSPEND) {
|
|
|
+ sys_state = hif_system_pm_get_state(target->hif_dev);
|
|
|
+ hif_system_pm_set_state_suspending(target->hif_dev);
|
|
|
+ }
|
|
|
+
|
|
|
htc_packet_set_magic_cookie(pPacket, HTC_PACKET_MAGIC_COOKIE);
|
|
|
/*
|
|
|
* For HTT messages without a response from fw,
|
|
@@ -885,6 +891,12 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
|
|
|
if (status != QDF_STATUS_SUCCESS) {
|
|
|
if (rt_put_in_resp)
|
|
|
htc_dec_return_runtime_cnt((void *)target);
|
|
|
+
|
|
|
+ if (pPacket->PktInfo.AsTx.Tag ==
|
|
|
+ HTC_TX_PACKET_SYSTEM_SUSPEND)
|
|
|
+ __hif_system_pm_set_state(target->hif_dev,
|
|
|
+ sys_state);
|
|
|
+
|
|
|
if (pEndpoint->EpCallBacks.ep_padding_credit_update) {
|
|
|
if (used_extra_tx_credit) {
|
|
|
ctx = pEndpoint->EpCallBacks.pContext;
|
|
@@ -1057,6 +1069,41 @@ htc_send_pkts_rtpm_dbgid_get(HTC_SERVICE_ID service_id)
|
|
|
return rtpm_dbgid;
|
|
|
}
|
|
|
|
|
|
+#ifdef SYSTEM_PM_CHECK
|
|
|
+/**
|
|
|
+ * extract_htc_system_resume_pkts(): Move system pm resume packets from endpoint
|
|
|
+ * into queue
|
|
|
+ * @endpoint: which enpoint to extract packets from
|
|
|
+ * @queue: a queue to store extracted packets in.
|
|
|
+ *
|
|
|
+ * Remove pm packets from the endpoint's tx queue and enqueue
|
|
|
+ * them into a queue
|
|
|
+ */
|
|
|
+static void extract_htc_system_resume_pkts(HTC_ENDPOINT *endpoint,
|
|
|
+ HTC_PACKET_QUEUE *queue)
|
|
|
+{
|
|
|
+ HTC_PACKET *packet;
|
|
|
+
|
|
|
+ /* only WMI endpoint has power management packets */
|
|
|
+ if (endpoint->service_id != WMI_CONTROL_SVC)
|
|
|
+ return;
|
|
|
+
|
|
|
+ ITERATE_OVER_LIST_ALLOW_REMOVE(&endpoint->TxQueue.QueueHead, packet,
|
|
|
+ HTC_PACKET, ListLink) {
|
|
|
+ if (packet->PktInfo.AsTx.Tag == HTC_TX_PACKET_SYSTEM_RESUME) {
|
|
|
+ HTC_PACKET_REMOVE(&endpoint->TxQueue, packet);
|
|
|
+ HTC_PACKET_ENQUEUE(queue, packet);
|
|
|
+ }
|
|
|
+ } ITERATE_END
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline
|
|
|
+void extract_htc_system_resume_pkts(HTC_ENDPOINT *endpoint,
|
|
|
+ HTC_PACKET_QUEUE *queue)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* get_htc_send_packets_credit_based() - get packets based on available credits
|
|
|
* @target: HTC target on which packets need to be sent
|
|
@@ -1082,6 +1129,8 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
|
|
|
bool do_pm_get = false;
|
|
|
wlan_rtpm_dbgid rtpm_dbgid = 0;
|
|
|
int ret;
|
|
|
+ HTC_PACKET_QUEUE sys_pm_queue;
|
|
|
+ bool sys_pm_check = false;
|
|
|
|
|
|
/*** NOTE : the TX lock is held when this function is called ***/
|
|
|
AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
|
|
@@ -1090,8 +1139,16 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
|
|
|
INIT_HTC_PACKET_QUEUE(&pm_queue);
|
|
|
extract_htc_pm_packets(pEndpoint, &pm_queue);
|
|
|
if (HTC_QUEUE_EMPTY(&pm_queue)) {
|
|
|
- tx_queue = &pEndpoint->TxQueue;
|
|
|
do_pm_get = true;
|
|
|
+
|
|
|
+ INIT_HTC_PACKET_QUEUE(&sys_pm_queue);
|
|
|
+ extract_htc_system_resume_pkts(pEndpoint, &sys_pm_queue);
|
|
|
+ if (HTC_QUEUE_EMPTY(&sys_pm_queue)) {
|
|
|
+ tx_queue = &pEndpoint->TxQueue;
|
|
|
+ sys_pm_check = true;
|
|
|
+ } else {
|
|
|
+ tx_queue = &sys_pm_queue;
|
|
|
+ }
|
|
|
} else {
|
|
|
tx_queue = &pm_queue;
|
|
|
}
|
|
@@ -1127,6 +1184,13 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ if (sys_pm_check &&
|
|
|
+ hif_system_pm_state_check(target->hif_dev)) {
|
|
|
+ if (do_pm_get)
|
|
|
+ hif_pm_runtime_put(target->hif_dev, rtpm_dbgid);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
|
|
|
(" Got head packet:%pK , Queue Depth: %d\n",
|
|
|
pPacket,
|
|
@@ -1275,6 +1339,11 @@ static void get_htc_send_packets(HTC_TARGET *target,
|
|
|
hif_pm_runtime_put(target->hif_dev, rtpm_dbgid);
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ ret = hif_system_pm_state_check(target->hif_dev);
|
|
|
+ if (ret)
|
|
|
+ break;
|
|
|
+
|
|
|
AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
|
|
|
(" Got packet:%pK , New Queue Depth: %d\n",
|
|
|
pPacket,
|
|
@@ -2722,3 +2791,24 @@ struct ol_ath_htc_stats *ieee80211_ioctl_get_htc_stats(HTC_HANDLE HTCHandle)
|
|
|
|
|
|
return &(target->htc_pkt_stats);
|
|
|
}
|
|
|
+
|
|
|
+#ifdef SYSTEM_PM_CHECK
|
|
|
+void htc_system_resume(HTC_HANDLE htc)
|
|
|
+{
|
|
|
+ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc);
|
|
|
+ HTC_ENDPOINT *endpoint = NULL;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (!target)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for (i = 0; i < ENDPOINT_MAX; i++) {
|
|
|
+ endpoint = &target->endpoint[i];
|
|
|
+
|
|
|
+ if (endpoint->service_id == 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ htc_try_send(target, endpoint, NULL);
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|