Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -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)
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);