Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da94ab0a authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: gsi: gsi channel mode switch spinlock correction"

parents 8bb09c18 8109d4a7
Loading
Loading
Loading
Loading
+3 −15
Original line number Diff line number Diff line
@@ -432,12 +432,8 @@ static void gsi_process_chan(struct gsi_xfer_compl_evt *evt,
	notify->bytes_xfered = evt->len;
	if (callback) {
		if (atomic_read(&ch_ctx->poll_mode)) {
			/*
			 * This is not expected, HW triggers an interrupt
			 * while interrupts are masked.
			 */
			GSIERR("Calling client callback in polling mode\n");
			BUG();
			WARN_ON(1);
		}
		ch_ctx->props.xfer_cb(notify);
	}
@@ -3074,29 +3070,21 @@ int gsi_config_channel_mode(unsigned long chan_hdl, enum gsi_chan_mode mode)
				curr, chan_hdl);
		return -GSI_STATUS_UNSUPPORTED_OP;
	}

	spin_lock_irqsave(&gsi_ctx->slock, flags);
	if (curr == GSI_CHAN_MODE_CALLBACK &&
			mode == GSI_CHAN_MODE_POLL) {
		spin_lock_irqsave(&gsi_ctx->slock, flags);
		__gsi_config_ieob_irq(gsi_ctx->per.ee, 1 << ctx->evtr->id, 0);
		spin_unlock_irqrestore(&gsi_ctx->slock, flags);
		spin_lock_irqsave(&ctx->ring.slock, flags);
		atomic_set(&ctx->poll_mode, mode);
		spin_unlock_irqrestore(&ctx->ring.slock, flags);
		ctx->stats.callback_to_poll++;
	}

	if (curr == GSI_CHAN_MODE_POLL &&
			mode == GSI_CHAN_MODE_CALLBACK) {
		spin_lock_irqsave(&ctx->ring.slock, flags);
		atomic_set(&ctx->poll_mode, mode);
		spin_unlock_irqrestore(&ctx->ring.slock, flags);
		spin_lock_irqsave(&gsi_ctx->slock, flags);
		__gsi_config_ieob_irq(gsi_ctx->per.ee, 1 << ctx->evtr->id, ~0);
		spin_unlock_irqrestore(&gsi_ctx->slock, flags);
		ctx->stats.poll_to_callback++;
	}

	spin_unlock_irqrestore(&gsi_ctx->slock, flags);
	return GSI_STATUS_SUCCESS;
}
EXPORT_SYMBOL(gsi_config_channel_mode);