From 3372eeeee0ce01e06a2bdbeb784c464fae1c778a Mon Sep 17 00:00:00 2001 From: Dilip Kota Date: Wed, 26 Mar 2014 18:06:03 +0530 Subject: msm_serial_hs: Handle Tx request while Clock OFF If client initiates a Tx operation when UART clocks are Off, the driver should not attempt to send data, as this would result in interacting with unclocked hardware. Add support to detect this condition and avoid writing to an unclocked device. Add a null check after memory allocation. CRs-Fixed: 629870 Change-Id: I001516e731e73881a29d768d9fb1bf759f3419b9 Signed-off-by: Dilip Kota Signed-off-by: Dilip Kota --- drivers/tty/serial/msm_serial_hs.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'drivers/tty') diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c index cc7ff5d898b7..c046a5671f98 100644 --- a/drivers/tty/serial/msm_serial_hs.c +++ b/drivers/tty/serial/msm_serial_hs.c @@ -1542,7 +1542,8 @@ static void msm_hs_start_tx_locked(struct uart_port *uport ) struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport); if (msm_uport->clk_state != MSM_HS_CLK_ON) { - MSM_HS_INFO("%s: Failed.Clocks are OFF\n", __func__); + MSM_HS_WARN("%s: Failed.Clocks are OFF\n", __func__); + return; } if ((msm_uport->tx.tx_ready_int_en == 0) && (msm_uport->tx.dma_in_flight == 0)) @@ -2140,6 +2141,8 @@ void msm_hs_request_clock_on(struct uart_port *uport) case MSM_HS_CLK_ON: break; case MSM_HS_CLK_PORT_OFF: + MSM_HS_ERR("%s:Clock ON failed;UART Port is Closed\n", + __func__); break; } MSM_HS_INFO("%s:Clock ON Successful\n", __func__); @@ -2915,6 +2918,11 @@ static int msm_hs_probe(struct platform_device *pdev) msm_uport = devm_kzalloc(&pdev->dev, sizeof(struct msm_hs_port), GFP_KERNEL); + if (!msm_uport) { + MSM_HS_ERR("Memory allocation failed\n"); + return -ENOMEM; + } + msm_uport->uport.type = PORT_UNKNOWN; uport = &msm_uport->uport; uport->dev = &pdev->dev; @@ -3082,15 +3090,16 @@ static int msm_hs_probe(struct platform_device *pdev) msm_hs_write(uport, UART_DM_MR2, data); mb(); - msm_uport->clk_state = MSM_HS_CLK_PORT_OFF; hrtimer_init(&msm_uport->clk_off_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); msm_uport->clk_off_timer.function = msm_hs_clk_off_retry; msm_uport->clk_off_delay = ktime_set(0, 1000000); /* 1ms */ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_clock.attr); - if (unlikely(ret)) + if (unlikely(ret)) { + MSM_HS_ERR("Probe Failed as sysfs failed\n"); goto err_clock; + } msm_serial_debugfs_init(msm_uport, pdev->id); @@ -3100,6 +3109,7 @@ static int msm_hs_probe(struct platform_device *pdev) ret = uart_add_one_port(&msm_hs_driver, uport); if (!ret) { msm_hs_clock_unvote(msm_uport); + msm_uport->clk_state = MSM_HS_CLK_PORT_OFF; return ret; } -- cgit v1.2.3