NFC: trf7970a: Ensure no more RX data before completing receive
authorMark A. Greer <mgreer@animalcreek.com>
Tue, 2 Sep 2014 22:12:32 +0000 (15:12 -0700)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 7 Sep 2014 21:13:44 +0000 (23:13 +0200)
Depending on the interrupt status value given by the
trf7970a, the driver may not know when a receive operation
is complete.  To handle this, the driver waits for a period
of time in case the trf7970a interrupts it again indicating
there are more RX data in the FIFO.  It is possible that the
timeout will occur when there are RX data in the FIFO but
before the trf7970a has generated an interrupt to tell the
driver about it.  Handle this by calling trf7970a_drain_fifo()
(instead of trf7970a_send_upstream() which just passes up the
data gathered to far) to check if there are more data in the
FIFO.  If so, gather that data into the receive buffer.  If
not, pass the data collected so far upstream as before.

Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/trf7970a.c

index 8c00827893f159a8fb8da270e4778951a167d3c1..2b1573fb6e9f0f48e9438c9676997c8eca1847a5 100644 (file)
@@ -800,7 +800,7 @@ static void trf7970a_timeout_work_handler(struct work_struct *work)
        if (trf->ignore_timeout)
                trf->ignore_timeout = false;
        else if (trf->state == TRF7970A_ST_WAIT_FOR_RX_DATA_CONT)
-               trf7970a_send_upstream(trf); /* No more rx data so send up */
+               trf7970a_drain_fifo(trf, TRF7970A_IRQ_STATUS_SRX);
        else if (trf->state == TRF7970A_ST_WAIT_TO_ISSUE_EOF)
                trf7970a_issue_eof(trf);
        else