Преглед на файлове

msm: ipa: Fix TX NAPI handling

Make changes to ensure NAPI is scheduled only once.
Make changes to use right register
GSI_EE_n_CNTXT_SRC_IEOB_IRQ_CLR_k for clearing interrupt.

Change-Id: I8de97f584ac4915d59b6716e7dff0c181a48cd1e
Signed-off-by: Chaitanya Pratapa <[email protected]>
Chaitanya Pratapa преди 4 години
родител
ревизия
407bf99e8f
променени са 2 файла, в които са добавени 3 реда и са изтрити 13 реда
  1. 2 2
      drivers/platform/msm/gsi/gsi.c
  2. 1 11
      drivers/platform/msm/ipa/ipa_v3/ipa_dp.c

+ 2 - 2
drivers/platform/msm/gsi/gsi.c

@@ -4064,12 +4064,12 @@ int gsi_poll_n_channel(unsigned long chan_hdl,
 		if (rp == ctx->evtr->ring.rp_local) {
 			/* event ring is empty */
 			if (gsi_ctx->per.ver >= GSI_VER_3_0) {
-				gsihal_write_reg_nk(GSI_EE_n_CNTXT_SRC_IEOB_IRQ_k,
+				gsihal_write_reg_nk(GSI_EE_n_CNTXT_SRC_IEOB_IRQ_CLR_k,
 					ee, gsihal_get_ch_reg_idx(ctx->evtr->id),
 				gsihal_get_ch_reg_mask(ctx->evtr->id));
 			}
 			else {
-				gsihal_write_reg_n(GSI_EE_n_CNTXT_SRC_IEOB_IRQ,
+				gsihal_write_reg_n(GSI_EE_n_CNTXT_SRC_IEOB_IRQ_CLR,
 					ee, 1 << ctx->evtr->id);
 			}
 			/* do another read to close a small window */

+ 1 - 11
drivers/platform/msm/ipa/ipa_v3/ipa_dp.c

@@ -304,10 +304,9 @@ static int ipa3_aux_napi_poll_tx_complete(struct napi_struct *napi_tx,
 		ret = ipa3_tx_switch_to_intr_mode(sys);
 
 		/* if we got an EOT while we marked NAPI as complete */
-		if (ret == -GSI_STATUS_PENDING_IRQ) {
+		if (ret == -GSI_STATUS_PENDING_IRQ && napi_reschedule(napi_tx)) {
 			/* rescheduale will perform poll again, don't dec vote twice*/
 			napi_rescheduled = true;
-			napi_reschedule(napi_tx);
 		}
 
 		if(!napi_rescheduled)
@@ -978,15 +977,6 @@ static int ipa3_tx_switch_to_intr_mode(struct ipa3_sys_context *sys) {
 				sys->curr_polling_state, sys->ep->gsi_chan_hdl);
 		}
 	}
-
-	/* in case we miss an interrupt after NAPI complete */
-	if(gsi_is_event_pending(sys->ep->gsi_chan_hdl)) {
-		atomic_set(&sys->curr_polling_state, 1);
-		__ipa3_update_curr_poll_state(sys->ep->client, 1);
-		gsi_config_channel_mode(sys->ep->gsi_chan_hdl,
-					GSI_CHAN_MODE_POLL);
-		ret = -GSI_STATUS_PENDING_IRQ;
-	}
 	return ret;
 }