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

Commit 8a3e1237 authored by Chandana Kishori Chiluveru's avatar Chandana Kishori Chiluveru
Browse files

serial: msm_geni_serial: Improve IPC logging in UART driver



Adding extra debugging logs in uart driver to get the exact sequence
from IPC logs so that it will help to debug the issues faster.
Also added error fatal during  dma map fails.

Change-Id: I22555bf6e6a734b768d6d51d1033a1644f493f29
Signed-off-by: default avatarChandana Kishori Chiluveru <cchiluve@codeaurora.org>
parent d331359f
Loading
Loading
Loading
Loading
+82 −29
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@
#define WAIT_XFER_MIN_TIMEOUT_US	(9000)
#define IPC_LOG_PWR_PAGES	(6)
#define IPC_LOG_MISC_PAGES	(10)
#define IPC_LOG_TX_RX_PAGES	(8)
#define IPC_LOG_TX_RX_PAGES	(10)
#define DATA_BYTES_PER_LINE	(32)

#define IPC_LOG_MSG(ctx, x...) do { \
@@ -903,6 +903,8 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport)
	struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport);
	struct circ_buf *xmit = &uport->state->xmit;
	unsigned int xmit_size;
	u32 geni_status;
	bool done = false;
	int ret = 0;

	xmit_size = uart_circ_chars_pending(xmit);
@@ -922,25 +924,39 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport)
			&xmit->buf[xmit->tail], xmit_size, &msm_port->tx_dma);
	if (!ret) {
		msm_port->xmit_size = xmit_size;
	} else {
		return ret;
	}

	IPC_LOG_MSG(msm_port->ipc_log_misc,
		    "%s: TX DMA map Fail %d\n", __func__, ret);
	geni_write_reg_nolog(0, uport->membase,
				SE_UART_TX_TRANS_LEN);
	geni_cancel_m_cmd(uport->membase);
	if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
					M_CMD_CANCEL_EN, true)) {
		geni_status = geni_read_reg_nolog(uport->membase,
						  SE_GENI_STATUS);
		IPC_LOG_MSG(msm_port->ipc_log_misc,
			    "%s: TX Cancel Fail 0x%x\n",
			    __func__, geni_status);
		geni_abort_m_cmd(uport->membase);
			msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
							M_CMD_ABORT_EN, true);
		done = msm_geni_serial_poll_bit(uport,
			SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true);
		if (!done) {
			geni_status =
				geni_read_reg_nolog(uport->membase,
						    SE_GENI_STATUS);
			IPC_LOG_MSG(msm_port->ipc_log_misc,
				    "%s: TX Abort fail 0x%x\n",
				    __func__, geni_status);
		}
		geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase,
						SE_GENI_M_IRQ_CLEAR);
	}
	geni_write_reg_nolog(M_CMD_CANCEL_EN, uport->membase,
						SE_GENI_M_IRQ_CLEAR);
		IPC_LOG_MSG(msm_port->ipc_log_tx, "%s: DMA map failure %d\n",
								__func__, ret);
	msm_port->tx_dma = (dma_addr_t)NULL;
	msm_port->xmit_size = 0;
	}
	return ret;
}

@@ -1027,6 +1043,7 @@ static void stop_tx_sequencer(struct uart_port *uport)
	unsigned int geni_m_irq_en;
	unsigned int geni_status;
	struct msm_geni_serial_port *port = GET_DEV_PORT(uport);
	bool done = false;

	geni_m_irq_en = geni_read_reg_nolog(uport->membase, SE_GENI_M_IRQ_EN);
	geni_m_irq_en &= ~M_CMD_DONE_EN;
@@ -1050,12 +1067,26 @@ static void stop_tx_sequencer(struct uart_port *uport)
	if (!(geni_status & M_GENI_CMD_ACTIVE))
		return;

	IPC_LOG_MSG(port->ipc_log_misc,
		    "%s: Start GENI: 0x%x\n", __func__, geni_status);

	geni_cancel_m_cmd(uport->membase);
	if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
						M_CMD_CANCEL_EN, true)) {
		geni_status = geni_read_reg_nolog(uport->membase,
						  SE_GENI_STATUS);
		IPC_LOG_MSG(port->ipc_log_misc,
			    "%s: TX Cancel Fail 0x%x\n", __func__, geni_status);
		geni_abort_m_cmd(uport->membase);
		msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
		done = msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
					       M_CMD_ABORT_EN, true);
		if (!done) {
			geni_status = geni_read_reg_nolog(uport->membase,
							  SE_GENI_STATUS);
			IPC_LOG_MSG(port->ipc_log_misc,
				    "%s TX Abort fail 0x%x\n",
				    __func__, geni_status);
		}
		geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase,
							SE_GENI_M_IRQ_CLEAR);
	}
@@ -1072,7 +1103,9 @@ static void stop_tx_sequencer(struct uart_port *uport)
		IPC_LOG_MSG(port->ipc_log_misc, "%s:Removing vote\n", __func__);
		msm_geni_serial_power_off(uport);
	}
	IPC_LOG_MSG(port->ipc_log_misc, "%s:\n", __func__);
	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	IPC_LOG_MSG(port->ipc_log_misc, "%s: End GENI:0x%x\n",
		    __func__, geni_status);
}

static void msm_geni_serial_stop_tx(struct uart_port *uport)
@@ -1100,6 +1133,9 @@ static void start_rx_sequencer(struct uart_port *uport)
		return;

	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	IPC_LOG_MSG(port->ipc_log_misc, "%s: 0x%x\n",
		    __func__, geni_status);

	if (geni_status & S_GENI_CMD_ACTIVE) {
		if (port->xfer_mode == SE_DMA) {
			IPC_LOG_MSG(port->ipc_log_misc,
@@ -1193,14 +1229,14 @@ static void msm_geni_serial_set_manual_flow(bool enable,
		 * doing a stop_rx.
		 */
		mb();
		IPC_LOG_MSG(port->ipc_log_pwr,
		IPC_LOG_MSG(port->ipc_log_misc,
			"%s: Manual Flow Enabled, HW Flow OFF\n", __func__);
	} else {
		geni_write_reg_nolog(0, port->uport.membase,
						SE_UART_MANUAL_RFR);
		/* Ensure that the manual flow off writes go through */
		mb();
		IPC_LOG_MSG(port->ipc_log_pwr,
		IPC_LOG_MSG(port->ipc_log_misc,
			"%s: Manual Flow Disabled, HW Flow ON\n", __func__);
	}
}
@@ -1214,7 +1250,6 @@ static void stop_rx_sequencer(struct uart_port *uport)
	u32 irq_clear = S_CMD_CANCEL_EN;
	bool done;

	IPC_LOG_MSG(port->ipc_log_misc, "%s\n", __func__);
	if (port->xfer_mode == FIFO_MODE) {
		geni_s_irq_en = geni_read_reg_nolog(uport->membase,
							SE_GENI_S_IRQ_EN);
@@ -1234,6 +1269,8 @@ static void stop_rx_sequencer(struct uart_port *uport)
	if (!(geni_status & S_GENI_CMD_ACTIVE))
		goto exit_rx_seq;

	IPC_LOG_MSG(port->ipc_log_misc, "%s: Start 0x%x\n",
		    __func__, geni_status);
	geni_cancel_s_cmd(uport->membase);
	/*
	 * Ensure that the cancel goes through before polling for the
@@ -1265,7 +1302,8 @@ static void stop_rx_sequencer(struct uart_port *uport)
		msm_geni_serial_rx_fsm_rst(uport);

	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	IPC_LOG_MSG(port->ipc_log_misc, "%s: 0x%x\n", __func__, geni_status);
	IPC_LOG_MSG(port->ipc_log_misc, "%s: End 0x%x\n",
		    __func__, geni_status);
}

static void msm_geni_serial_stop_rx(struct uart_port *uport)
@@ -1450,8 +1488,11 @@ static int msm_geni_serial_handle_dma_rx(struct uart_port *uport, bool drop_rx)

	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	/* Possible stop rx is called */
	if (!(geni_status & S_GENI_CMD_ACTIVE))
	if (!(geni_status & S_GENI_CMD_ACTIVE)) {
		IPC_LOG_MSG(msm_port->ipc_log_misc,
			    "%s: GENI: 0x%x\n", __func__, geni_status);
		return 0;
	}

	if (unlikely(!msm_port->rx_buf)) {
		IPC_LOG_MSG(msm_port->ipc_log_rx, "%s: NULL Rx_buf\n",
@@ -1721,6 +1762,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport)
	unsigned long flags;
	int ret;

	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__);
	/* Stop the console before stopping the current tx */
	if (uart_console(uport)) {
		console_stop(uport->cons);
@@ -1761,7 +1803,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport)
			free_irq(msm_port->wakeup_irq, uport);
		}
	}
	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s\n", __func__);
	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: End\n", __func__);
}

static int msm_geni_serial_port_setup(struct uart_port *uport)
@@ -1855,6 +1897,7 @@ static int msm_geni_serial_startup(struct uart_port *uport)
	int ret = 0;
	struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport);

	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__);
	scnprintf(msm_port->name, sizeof(msm_port->name), "msm_serial_geni%d",
				uport->line);

@@ -1871,9 +1914,14 @@ static int msm_geni_serial_startup(struct uart_port *uport)

	get_tx_fifo_size(msm_port);
	if (!msm_port->port_setup) {
		if (msm_geni_serial_port_setup(uport))
		ret = msm_geni_serial_port_setup(uport);
		if (ret) {
			IPC_LOG_MSG(msm_port->ipc_log_misc,
				    "%s: port_setup Fail ret:%d\n",
				    __func__, ret);
			goto exit_startup;
		}
	}

	/*
	 * Ensure that all the port configuration writes complete
@@ -1905,11 +1953,11 @@ static int msm_geni_serial_startup(struct uart_port *uport)
			goto exit_startup;
		}
	}
	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s\n", __func__);
exit_startup:
	if (likely(!uart_console(uport)))
		msm_geni_serial_power_off(&msm_port->uport);
	msm_port->startup_in_progress = false;
	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: ret:%d\n", __func__, ret);

	return ret;
}
@@ -2841,9 +2889,14 @@ static int msm_geni_serial_probe(struct platform_device *pdev)
	ret = msm_geni_serial_get_ver_info(uport);
	if (ret)
		goto exit_geni_serial_probe;

	IPC_LOG_MSG(dev_port->ipc_log_misc, "%s: port:%s irq:%d\n", __func__,
		    uport->name, uport->irq);
	return uart_add_one_port(drv, uport);

exit_geni_serial_probe:
	IPC_LOG_MSG(dev_port->ipc_log_misc, "%s: fail port:%s ret:%d\n",
		    __func__, uport->name, ret);
	return ret;
}