From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Daniel Mack <daniel@zonque.org>
Cc: linux-wireless@vger.kernel.org, wcn36xx@lists.infradead.org,
rfried@codeaurora.org, kvalo@codeaurora.org
Subject: Re: [PATCH] wcn36xx: dequeue all pending indicator messages
Date: Sun, 18 Mar 2018 15:49:29 -0700 [thread overview]
Message-ID: <20180318224929.GN5626@tuxbook-pro> (raw)
In-Reply-To: <20180315223725.28283-1-daniel@zonque.org>
On Thu 15 Mar 15:37 PDT 2018, Daniel Mack wrote:
> In case wcn36xx_smd_rsp_process() is called more than once before
> hal_ind_work was dispatched, the messages will end up in hal_ind_queue,
> but wcn36xx_ind_smd_work() will only look at the first message in that
> list.
>
> Fix this by dequeing the messages from the list in a loop, and only stop
> when it's empty.
>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Thanks for fixing this, I thought I already had done that.
Regards,
Bjorn
> Signed-off-by: Daniel Mack <daniel@zonque.org>
> ---
> drivers/net/wireless/ath/wcn36xx/smd.c | 95 +++++++++++++++++++---------------
> 1 file changed, 52 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
> index 7cc29285e052..a6b5352f59e9 100644
> --- a/drivers/net/wireless/ath/wcn36xx/smd.c
> +++ b/drivers/net/wireless/ath/wcn36xx/smd.c
> @@ -2409,54 +2409,63 @@ static void wcn36xx_ind_smd_work(struct work_struct *work)
> {
> struct wcn36xx *wcn =
> container_of(work, struct wcn36xx, hal_ind_work);
> - struct wcn36xx_hal_msg_header *msg_header;
> - struct wcn36xx_hal_ind_msg *hal_ind_msg;
> - unsigned long flags;
>
> - spin_lock_irqsave(&wcn->hal_ind_lock, flags);
> + for (;;) {
> + struct wcn36xx_hal_msg_header *msg_header;
> + struct wcn36xx_hal_ind_msg *hal_ind_msg;
> + unsigned long flags;
>
> - hal_ind_msg = list_first_entry(&wcn->hal_ind_queue,
> - struct wcn36xx_hal_ind_msg,
> - list);
> - list_del(wcn->hal_ind_queue.next);
> - spin_unlock_irqrestore(&wcn->hal_ind_lock, flags);
> + spin_lock_irqsave(&wcn->hal_ind_lock, flags);
>
> - msg_header = (struct wcn36xx_hal_msg_header *)hal_ind_msg->msg;
> + if (list_empty(&wcn->hal_ind_queue)) {
> + spin_unlock_irqrestore(&wcn->hal_ind_lock, flags);
> + return;
> + }
>
> - switch (msg_header->msg_type) {
> - case WCN36XX_HAL_COEX_IND:
> - case WCN36XX_HAL_DEL_BA_IND:
> - case WCN36XX_HAL_AVOID_FREQ_RANGE_IND:
> - break;
> - case WCN36XX_HAL_OTA_TX_COMPL_IND:
> - wcn36xx_smd_tx_compl_ind(wcn,
> - hal_ind_msg->msg,
> - hal_ind_msg->msg_len);
> - break;
> - case WCN36XX_HAL_MISSED_BEACON_IND:
> - wcn36xx_smd_missed_beacon_ind(wcn,
> - hal_ind_msg->msg,
> - hal_ind_msg->msg_len);
> - break;
> - case WCN36XX_HAL_DELETE_STA_CONTEXT_IND:
> - wcn36xx_smd_delete_sta_context_ind(wcn,
> - hal_ind_msg->msg,
> - hal_ind_msg->msg_len);
> - break;
> - case WCN36XX_HAL_PRINT_REG_INFO_IND:
> - wcn36xx_smd_print_reg_info_ind(wcn,
> - hal_ind_msg->msg,
> - hal_ind_msg->msg_len);
> - break;
> - case WCN36XX_HAL_SCAN_OFFLOAD_IND:
> - wcn36xx_smd_hw_scan_ind(wcn, hal_ind_msg->msg,
> - hal_ind_msg->msg_len);
> - break;
> - default:
> - wcn36xx_err("SMD_EVENT (%d) not supported\n",
> - msg_header->msg_type);
> + hal_ind_msg = list_first_entry(&wcn->hal_ind_queue,
> + struct wcn36xx_hal_ind_msg,
> + list);
> + list_del(&hal_ind_msg->list);
> + spin_unlock_irqrestore(&wcn->hal_ind_lock, flags);
> +
> + msg_header = (struct wcn36xx_hal_msg_header *)hal_ind_msg->msg;
> +
> + switch (msg_header->msg_type) {
> + case WCN36XX_HAL_COEX_IND:
> + case WCN36XX_HAL_DEL_BA_IND:
> + case WCN36XX_HAL_AVOID_FREQ_RANGE_IND:
> + break;
> + case WCN36XX_HAL_OTA_TX_COMPL_IND:
> + wcn36xx_smd_tx_compl_ind(wcn,
> + hal_ind_msg->msg,
> + hal_ind_msg->msg_len);
> + break;
> + case WCN36XX_HAL_MISSED_BEACON_IND:
> + wcn36xx_smd_missed_beacon_ind(wcn,
> + hal_ind_msg->msg,
> + hal_ind_msg->msg_len);
> + break;
> + case WCN36XX_HAL_DELETE_STA_CONTEXT_IND:
> + wcn36xx_smd_delete_sta_context_ind(wcn,
> + hal_ind_msg->msg,
> + hal_ind_msg->msg_len);
> + break;
> + case WCN36XX_HAL_PRINT_REG_INFO_IND:
> + wcn36xx_smd_print_reg_info_ind(wcn,
> + hal_ind_msg->msg,
> + hal_ind_msg->msg_len);
> + break;
> + case WCN36XX_HAL_SCAN_OFFLOAD_IND:
> + wcn36xx_smd_hw_scan_ind(wcn, hal_ind_msg->msg,
> + hal_ind_msg->msg_len);
> + break;
> + default:
> + wcn36xx_err("SMD_EVENT (%d) not supported\n",
> + msg_header->msg_type);
> + }
> +
> + kfree(hal_ind_msg);
> }
> - kfree(hal_ind_msg);
> }
> int wcn36xx_smd_open(struct wcn36xx *wcn)
> {
> --
> 2.14.3
>
>
> _______________________________________________
> wcn36xx mailing list
> wcn36xx@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/wcn36xx
prev parent reply other threads:[~2018-03-18 22:49 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-15 22:37 [PATCH] wcn36xx: dequeue all pending indicator messages Daniel Mack
2018-03-16 9:09 ` Ramon Fried
2018-03-16 9:28 ` Daniel Mack
2018-03-16 10:22 ` Kalle Valo
2018-03-16 11:38 ` Daniel Mack
2018-03-18 22:49 ` Bjorn Andersson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180318224929.GN5626@tuxbook-pro \
--to=bjorn.andersson@linaro.org \
--cc=daniel@zonque.org \
--cc=kvalo@codeaurora.org \
--cc=linux-wireless@vger.kernel.org \
--cc=rfried@codeaurora.org \
--cc=wcn36xx@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox