diff options
-rw-r--r-- | drivers/nfc/trf7970a.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/nfc/trf7970a.c b/drivers/nfc/trf7970a.c index 00fb2cee6790..8b109e15687f 100644 --- a/drivers/nfc/trf7970a.c +++ b/drivers/nfc/trf7970a.c | |||
@@ -132,6 +132,7 @@ | |||
132 | /* TX length is 3 nibbles long ==> 4KB - 1 bytes max */ | 132 | /* TX length is 3 nibbles long ==> 4KB - 1 bytes max */ |
133 | #define TRF7970A_TX_MAX (4096 - 1) | 133 | #define TRF7970A_TX_MAX (4096 - 1) |
134 | 134 | ||
135 | #define TRF7970A_WAIT_FOR_TX_IRQ 20 | ||
135 | #define TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT 20 | 136 | #define TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT 20 |
136 | #define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 20 | 137 | #define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 20 |
137 | #define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 40 | 138 | #define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 40 |
@@ -555,7 +556,11 @@ static int trf7970a_transmit(struct trf7970a *trf, struct sk_buff *skb, | |||
555 | timeout = TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF; | 556 | timeout = TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF; |
556 | } else { | 557 | } else { |
557 | trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA; | 558 | trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA; |
558 | timeout = trf->timeout; | 559 | |
560 | if (!trf->timeout) | ||
561 | timeout = TRF7970A_WAIT_FOR_TX_IRQ; | ||
562 | else | ||
563 | timeout = trf->timeout; | ||
559 | } | 564 | } |
560 | } | 565 | } |
561 | 566 | ||
@@ -754,6 +759,14 @@ static irqreturn_t trf7970a_irq(int irq, void *dev_id) | |||
754 | trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET); | 759 | trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET); |
755 | } else if (status == TRF7970A_IRQ_STATUS_TX) { | 760 | } else if (status == TRF7970A_IRQ_STATUS_TX) { |
756 | trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET); | 761 | trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET); |
762 | |||
763 | if (!trf->timeout) { | ||
764 | trf->ignore_timeout = !cancel_delayed_work( | ||
765 | &trf->timeout_work); | ||
766 | trf->rx_skb = ERR_PTR(0); | ||
767 | trf7970a_send_upstream(trf); | ||
768 | break; | ||
769 | } | ||
757 | } else { | 770 | } else { |
758 | trf7970a_send_err_upstream(trf, -EIO); | 771 | trf7970a_send_err_upstream(trf, -EIO); |
759 | } | 772 | } |
@@ -1253,12 +1266,14 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev, | |||
1253 | goto out_err; | 1266 | goto out_err; |
1254 | } | 1267 | } |
1255 | 1268 | ||
1256 | trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE, | 1269 | if (timeout) { |
1257 | GFP_KERNEL); | 1270 | trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE, |
1258 | if (!trf->rx_skb) { | 1271 | GFP_KERNEL); |
1259 | dev_dbg(trf->dev, "Can't alloc rx_skb\n"); | 1272 | if (!trf->rx_skb) { |
1260 | ret = -ENOMEM; | 1273 | dev_dbg(trf->dev, "Can't alloc rx_skb\n"); |
1261 | goto out_err; | 1274 | ret = -ENOMEM; |
1275 | goto out_err; | ||
1276 | } | ||
1262 | } | 1277 | } |
1263 | 1278 | ||
1264 | if (trf->state == TRF7970A_ST_IDLE_RX_BLOCKED) { | 1279 | if (trf->state == TRF7970A_ST_IDLE_RX_BLOCKED) { |