Commit 82aff3ea authored by Vincent Cuissard's avatar Vincent Cuissard Committed by Samuel Ortiz

NFC: nfcmrvl: avoid being stuck on FW dnld timeout

FW Download procedure can block on del_timer_sync because the
timer is not running. This patch check that timer is scheduled
before cancelling it.
Signed-off-by: default avatarVincent Cuissard <cuissard@marvell.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 6f8c5369
...@@ -113,8 +113,11 @@ static void fw_dnld_over(struct nfcmrvl_private *priv, u32 error) ...@@ -113,8 +113,11 @@ static void fw_dnld_over(struct nfcmrvl_private *priv, u32 error)
} }
atomic_set(&priv->ndev->cmd_cnt, 0); atomic_set(&priv->ndev->cmd_cnt, 0);
if (timer_pending(&priv->ndev->cmd_timer))
del_timer_sync(&priv->ndev->cmd_timer); del_timer_sync(&priv->ndev->cmd_timer);
if (timer_pending(&priv->fw_dnld.timer))
del_timer_sync(&priv->fw_dnld.timer); del_timer_sync(&priv->fw_dnld.timer);
nfc_info(priv->dev, "FW loading over (%d)]\n", error); nfc_info(priv->dev, "FW loading over (%d)]\n", error);
...@@ -472,9 +475,12 @@ void nfcmrvl_fw_dnld_deinit(struct nfcmrvl_private *priv) ...@@ -472,9 +475,12 @@ void nfcmrvl_fw_dnld_deinit(struct nfcmrvl_private *priv)
void nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv, void nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
/* Discard command timer */
if (timer_pending(&priv->ndev->cmd_timer))
del_timer_sync(&priv->ndev->cmd_timer);
/* Allow next command */ /* Allow next command */
atomic_set(&priv->ndev->cmd_cnt, 1); atomic_set(&priv->ndev->cmd_cnt, 1);
del_timer_sync(&priv->ndev->cmd_timer);
/* Queue and trigger rx work */ /* Queue and trigger rx work */
skb_queue_tail(&priv->fw_dnld.rx_q, skb); skb_queue_tail(&priv->fw_dnld.rx_q, skb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment