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: Vincent Cuissard <cuissard@marvell.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
6f8c53695d
commit
82aff3ea3b
1 changed files with 9 additions and 3 deletions
|
@ -113,9 +113,12 @@ 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);
|
||||||
del_timer_sync(&priv->ndev->cmd_timer);
|
|
||||||
|
|
||||||
del_timer_sync(&priv->fw_dnld.timer);
|
if (timer_pending(&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);
|
||||||
|
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue