From: Colin Cross Date: Tue, 22 Mar 2011 18:43:45 +0000 (-0700) Subject: Merge branch 'android-tegra-2.6.36' into android-tegra-moto-2.6.36 X-Git-Tag: firefly_0821_release~9834^2~35 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=dd58180b764dd92bddc952c0bdac39397f3ae4aa;p=firefly-linux-kernel-4.4.55.git Merge branch 'android-tegra-2.6.36' into android-tegra-moto-2.6.36 Conflicts: drivers/serial/tegra_hsuart.c Change-Id: I535bef9c6645e5ec86f374a8f4d1fb3569274e53 --- dd58180b764dd92bddc952c0bdac39397f3ae4aa diff --cc drivers/serial/tegra_hsuart.c index 37fe89a8a94c,b3b8eeaf8cf6..61d38bfcaa59 --- a/drivers/serial/tegra_hsuart.c +++ b/drivers/serial/tegra_hsuart.c @@@ -309,24 -288,36 +298,41 @@@ static void tegra_rx_dma_complete_req(s if (req->status == -TEGRA_DMA_REQ_ERROR_ABORTED) return; - spin_unlock(&u->lock); tty_flip_buffer_push(u->state->port.tty); + - spin_lock(&u->lock); + if (t->rx_done_cb) + t->rx_done_cb(u); } + static void tegra_rx_dma_complete_callback(struct tegra_dma_req *req) + { + struct tegra_uart_port *t = req->dev; + unsigned long flags; + + /* + * should never get called, dma should be dequeued during threshold + * callback + */ + + dev_warn(t->uport.dev, "possible rx overflow\n"); + + spin_lock_irqsave(&t->uport.lock, flags); + tegra_rx_dma_complete_req(t, req); + spin_unlock_irqrestore(&t->uport.lock, flags); + } + /* Lock already taken */ static void do_handle_rx_dma(struct tegra_uart_port *t) { struct uart_port *u = &t->uport; if (t->rts_active) set_rts(t, false); - tegra_dma_dequeue(t->rx_dma); + if (!tegra_dma_dequeue_req(t->rx_dma, &t->rx_dma_req)) + tegra_rx_dma_complete_req(t, &t->rx_dma_req); + tty_flip_buffer_push(u->state->port.tty); + if (t->rx_done_cb) + t->rx_done_cb(u); /* enqueue the request again */ tegra_start_dma_rx(t); if (t->rts_active) @@@ -606,12 -606,14 +623,16 @@@ static void tegra_stop_rx(struct uart_p t->ier_shadow = ier; uart_writeb(t, ier, UART_IER); t->rx_in_progress = 0; - } - if (t->use_rx_dma && t->rx_dma) { - tegra_dma_dequeue(t->rx_dma); + + if (t->use_rx_dma && t->rx_dma) { + if (!tegra_dma_dequeue_req(t->rx_dma, &t->rx_dma_req)) + tegra_rx_dma_complete_req(t, &t->rx_dma_req); + } else { + do_handle_rx_pio(t); + } tty_flip_buffer_push(u->state->port.tty); + if (t->rx_done_cb) + t->rx_done_cb(u); } return;