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

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

Merge "serial: msm_geni_serial: Improve IPC logging in UART driver"

parents 2e55a01c eec5584f
Loading
Loading
Loading
Loading
+82 −29
Original line number Original line Diff line number Diff line
@@ -115,7 +115,7 @@
#define WAIT_XFER_MIN_TIMEOUT_US	(9000)
#define WAIT_XFER_MIN_TIMEOUT_US	(9000)
#define IPC_LOG_PWR_PAGES	(6)
#define IPC_LOG_PWR_PAGES	(6)
#define IPC_LOG_MISC_PAGES	(10)
#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 DATA_BYTES_PER_LINE	(32)


#define IPC_LOG_MSG(ctx, x...) do { \
#define IPC_LOG_MSG(ctx, x...) do { \
@@ -895,6 +895,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 msm_geni_serial_port *msm_port = GET_DEV_PORT(uport);
	struct circ_buf *xmit = &uport->state->xmit;
	struct circ_buf *xmit = &uport->state->xmit;
	unsigned int xmit_size;
	unsigned int xmit_size;
	u32 geni_status;
	bool done = false;
	int ret = 0;
	int ret = 0;


	xmit_size = uart_circ_chars_pending(xmit);
	xmit_size = uart_circ_chars_pending(xmit);
@@ -914,25 +916,39 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport)
			&xmit->buf[xmit->tail], xmit_size, &msm_port->tx_dma);
			&xmit->buf[xmit->tail], xmit_size, &msm_port->tx_dma);
	if (!ret) {
	if (!ret) {
		msm_port->xmit_size = xmit_size;
		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,
	geni_write_reg_nolog(0, uport->membase,
				SE_UART_TX_TRANS_LEN);
				SE_UART_TX_TRANS_LEN);
	geni_cancel_m_cmd(uport->membase);
	geni_cancel_m_cmd(uport->membase);
	if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
	if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
					M_CMD_CANCEL_EN, true)) {
					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);
		geni_abort_m_cmd(uport->membase);
			msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
		done = msm_geni_serial_poll_bit(uport,
							M_CMD_ABORT_EN, true);
			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,
		geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase,
						SE_GENI_M_IRQ_CLEAR);
						SE_GENI_M_IRQ_CLEAR);
	}
	}
	geni_write_reg_nolog(M_CMD_CANCEL_EN, uport->membase,
	geni_write_reg_nolog(M_CMD_CANCEL_EN, uport->membase,
						SE_GENI_M_IRQ_CLEAR);
						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->tx_dma = (dma_addr_t)NULL;
	msm_port->xmit_size = 0;
	msm_port->xmit_size = 0;
	}
	return ret;
	return ret;
}
}


@@ -1019,6 +1035,7 @@ static void stop_tx_sequencer(struct uart_port *uport)
	unsigned int geni_m_irq_en;
	unsigned int geni_m_irq_en;
	unsigned int geni_status;
	unsigned int geni_status;
	struct msm_geni_serial_port *port = GET_DEV_PORT(uport);
	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 = geni_read_reg_nolog(uport->membase, SE_GENI_M_IRQ_EN);
	geni_m_irq_en &= ~M_CMD_DONE_EN;
	geni_m_irq_en &= ~M_CMD_DONE_EN;
@@ -1042,12 +1059,26 @@ static void stop_tx_sequencer(struct uart_port *uport)
	if (!(geni_status & M_GENI_CMD_ACTIVE))
	if (!(geni_status & M_GENI_CMD_ACTIVE))
		return;
		return;


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

	geni_cancel_m_cmd(uport->membase);
	geni_cancel_m_cmd(uport->membase);
	if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
	if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS,
						M_CMD_CANCEL_EN, true)) {
						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);
		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);
					       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,
		geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase,
							SE_GENI_M_IRQ_CLEAR);
							SE_GENI_M_IRQ_CLEAR);
	}
	}
@@ -1064,7 +1095,9 @@ static void stop_tx_sequencer(struct uart_port *uport)
		IPC_LOG_MSG(port->ipc_log_misc, "%s:Removing vote\n", __func__);
		IPC_LOG_MSG(port->ipc_log_misc, "%s:Removing vote\n", __func__);
		msm_geni_serial_power_off(uport);
		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)
static void msm_geni_serial_stop_tx(struct uart_port *uport)
@@ -1092,6 +1125,9 @@ static void start_rx_sequencer(struct uart_port *uport)
		return;
		return;


	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	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 (geni_status & S_GENI_CMD_ACTIVE) {
		if (port->xfer_mode == SE_DMA) {
		if (port->xfer_mode == SE_DMA) {
			IPC_LOG_MSG(port->ipc_log_misc,
			IPC_LOG_MSG(port->ipc_log_misc,
@@ -1185,14 +1221,14 @@ static void msm_geni_serial_set_manual_flow(bool enable,
		 * doing a stop_rx.
		 * doing a stop_rx.
		 */
		 */
		mb();
		mb();
		IPC_LOG_MSG(port->ipc_log_pwr,
		IPC_LOG_MSG(port->ipc_log_misc,
			"%s: Manual Flow Enabled, HW Flow OFF\n", __func__);
			"%s: Manual Flow Enabled, HW Flow OFF\n", __func__);
	} else {
	} else {
		geni_write_reg_nolog(0, port->uport.membase,
		geni_write_reg_nolog(0, port->uport.membase,
						SE_UART_MANUAL_RFR);
						SE_UART_MANUAL_RFR);
		/* Ensure that the manual flow off writes go through */
		/* Ensure that the manual flow off writes go through */
		mb();
		mb();
		IPC_LOG_MSG(port->ipc_log_pwr,
		IPC_LOG_MSG(port->ipc_log_misc,
			"%s: Manual Flow Disabled, HW Flow ON\n", __func__);
			"%s: Manual Flow Disabled, HW Flow ON\n", __func__);
	}
	}
}
}
@@ -1208,7 +1244,6 @@ static void stop_rx_sequencer(struct uart_port *uport)
	u32 dma_rx_irq_stat;
	u32 dma_rx_irq_stat;
	u32 DMA_RX_CANCEL_BIT;
	u32 DMA_RX_CANCEL_BIT;


	IPC_LOG_MSG(port->ipc_log_misc, "%s\n", __func__);
	if (port->xfer_mode == FIFO_MODE) {
	if (port->xfer_mode == FIFO_MODE) {
		geni_s_irq_en = geni_read_reg_nolog(uport->membase,
		geni_s_irq_en = geni_read_reg_nolog(uport->membase,
							SE_GENI_S_IRQ_EN);
							SE_GENI_S_IRQ_EN);
@@ -1245,6 +1280,8 @@ static void stop_rx_sequencer(struct uart_port *uport)
				uport->membase, SE_DMA_RX_IRQ_CLR);
				uport->membase, SE_DMA_RX_IRQ_CLR);
	}
	}


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


	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	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)
static void msm_geni_serial_stop_rx(struct uart_port *uport)
@@ -1501,8 +1539,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);
	geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS);
	/* Possible stop rx is called */
	/* 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;
		return 0;
	}


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


	IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__);
	/* Stop the console before stopping the current tx */
	/* Stop the console before stopping the current tx */
	if (uart_console(uport)) {
	if (uart_console(uport)) {
		console_stop(uport->cons);
		console_stop(uport->cons);
@@ -1811,7 +1853,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport)
			free_irq(msm_port->wakeup_irq, 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)
static int msm_geni_serial_port_setup(struct uart_port *uport)
@@ -1905,6 +1947,7 @@ static int msm_geni_serial_startup(struct uart_port *uport)
	int ret = 0;
	int ret = 0;
	struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport);
	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",
	scnprintf(msm_port->name, sizeof(msm_port->name), "msm_serial_geni%d",
				uport->line);
				uport->line);


@@ -1921,9 +1964,14 @@ static int msm_geni_serial_startup(struct uart_port *uport)


	get_tx_fifo_size(msm_port);
	get_tx_fifo_size(msm_port);
	if (!msm_port->port_setup) {
	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;
			goto exit_startup;
		}
		}
	}


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


	return ret;
	return ret;
}
}
@@ -2891,9 +2939,14 @@ static int msm_geni_serial_probe(struct platform_device *pdev)
	ret = msm_geni_serial_get_ver_info(uport);
	ret = msm_geni_serial_get_ver_info(uport);
	if (ret)
	if (ret)
		goto exit_geni_serial_probe;
		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);
	return uart_add_one_port(drv, uport);


exit_geni_serial_probe:
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;
	return ret;
}
}