diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/wmi.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/wmi.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c index 65c8894c5f81..ca533b4321bd 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.c +++ b/drivers/net/wireless/ath/ath9k/wmi.c @@ -61,6 +61,8 @@ static const char *wmi_cmd_to_name(enum wmi_cmd_id wmi_cmd)  		return "WMI_REG_READ_CMDID";  	case WMI_REG_WRITE_CMDID:  		return "WMI_REG_WRITE_CMDID"; +	case WMI_REG_RMW_CMDID: +		return "WMI_REG_RMW_CMDID";  	case WMI_RC_STATE_CHANGE_CMDID:  		return "WMI_RC_STATE_CHANGE_CMDID";  	case WMI_RC_RATE_UPDATE_CMDID: @@ -101,6 +103,7 @@ struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv)  	spin_lock_init(&wmi->event_lock);  	mutex_init(&wmi->op_mutex);  	mutex_init(&wmi->multi_write_mutex); +	mutex_init(&wmi->multi_rmw_mutex);  	init_completion(&wmi->cmd_wait);  	INIT_LIST_HEAD(&wmi->pending_tx_events);  	tasklet_init(&wmi->wmi_event_tasklet, ath9k_wmi_event_tasklet, @@ -224,7 +227,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,  	/* Check if there has been a timeout. */  	spin_lock(&wmi->wmi_lock); -	if (cmd_id != wmi->last_cmd_id) { +	if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {  		spin_unlock(&wmi->wmi_lock);  		goto free_skb;  	} @@ -272,11 +275,16 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,  			       enum wmi_cmd_id cmd, u16 len)  {  	struct wmi_cmd_hdr *hdr; +	unsigned long flags;  	hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr));  	hdr->command_id = cpu_to_be16(cmd);  	hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); +	spin_lock_irqsave(&wmi->wmi_lock, flags); +	wmi->last_seq_id = wmi->tx_seq_id; +	spin_unlock_irqrestore(&wmi->wmi_lock, flags); +  	return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);  } @@ -292,7 +300,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,  	struct sk_buff *skb;  	u8 *data;  	int time_left, ret = 0; -	unsigned long flags;  	if (ah->ah_flags & AH_UNPLUGGED)  		return 0; @@ -320,10 +327,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,  	wmi->cmd_rsp_buf = rsp_buf;  	wmi->cmd_rsp_len = rsp_len; -	spin_lock_irqsave(&wmi->wmi_lock, flags); -	wmi->last_cmd_id = cmd_id; -	spin_unlock_irqrestore(&wmi->wmi_lock, flags); -  	ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);  	if (ret)  		goto out;  |