@@ -618,6 +618,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb)
618618 case WMI_TLV_TDLS_PEER_EVENTID :
619619 ath10k_wmi_event_tdls_peer (ar , skb );
620620 break ;
621+ case WMI_TLV_MGMT_TX_COMPLETION_EVENTID :
622+ ath10k_wmi_event_mgmt_tx_compl (ar , skb );
623+ break ;
621624 default :
622625 ath10k_warn (ar , "Unknown eventid: %d\n" , id );
623626 break ;
@@ -659,6 +662,31 @@ static int ath10k_wmi_tlv_op_pull_scan_ev(struct ath10k *ar,
659662 return 0 ;
660663}
661664
665+ static int
666+ ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev (struct ath10k * ar , struct sk_buff * skb ,
667+ struct wmi_tlv_mgmt_tx_compl_ev_arg * arg )
668+ {
669+ const void * * tb ;
670+ const struct wmi_tlv_mgmt_tx_compl_ev * ev ;
671+ int ret ;
672+
673+ tb = ath10k_wmi_tlv_parse_alloc (ar , skb -> data , skb -> len , GFP_ATOMIC );
674+ if (IS_ERR (tb )) {
675+ ret = PTR_ERR (tb );
676+ ath10k_warn (ar , "failed to parse tlv: %d\n" , ret );
677+ return ret ;
678+ }
679+
680+ ev = tb [WMI_TLV_TAG_STRUCT_MGMT_TX_COMPL_EVENT ];
681+
682+ arg -> desc_id = ev -> desc_id ;
683+ arg -> status = ev -> status ;
684+ arg -> pdev_id = ev -> pdev_id ;
685+
686+ kfree (tb );
687+ return 0 ;
688+ }
689+
662690static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev (struct ath10k * ar ,
663691 struct sk_buff * skb ,
664692 struct wmi_mgmt_rx_ev_arg * arg )
@@ -2612,6 +2640,30 @@ ath10k_wmi_tlv_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
26122640 return skb ;
26132641}
26142642
2643+ static int
2644+ ath10k_wmi_mgmt_tx_alloc_msdu_id (struct ath10k * ar , struct sk_buff * skb ,
2645+ dma_addr_t paddr )
2646+ {
2647+ struct ath10k_wmi * wmi = & ar -> wmi ;
2648+ struct ath10k_mgmt_tx_pkt_addr * pkt_addr ;
2649+ int ret ;
2650+
2651+ pkt_addr = kmalloc (sizeof (* pkt_addr ), GFP_ATOMIC );
2652+ if (!pkt_addr )
2653+ return - ENOMEM ;
2654+
2655+ pkt_addr -> vaddr = skb ;
2656+ pkt_addr -> paddr = paddr ;
2657+
2658+ spin_lock_bh (& ar -> data_lock );
2659+ ret = idr_alloc (& wmi -> mgmt_pending_tx , pkt_addr , 0 ,
2660+ wmi -> mgmt_max_num_pending_tx , GFP_ATOMIC );
2661+ spin_unlock_bh (& ar -> data_lock );
2662+
2663+ ath10k_dbg (ar , ATH10K_DBG_WMI , "wmi mgmt tx alloc msdu_id ret %d\n" , ret );
2664+ return ret ;
2665+ }
2666+
26152667static struct sk_buff *
26162668ath10k_wmi_tlv_op_gen_mgmt_tx_send (struct ath10k * ar , struct sk_buff * msdu ,
26172669 dma_addr_t paddr )
@@ -2623,9 +2675,9 @@ ath10k_wmi_tlv_op_gen_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu,
26232675 u32 buf_len = msdu -> len ;
26242676 struct wmi_tlv * tlv ;
26252677 struct sk_buff * skb ;
2678+ int len , desc_id ;
26262679 u32 vdev_id ;
26272680 void * ptr ;
2628- int len ;
26292681
26302682 if (!cb -> vif )
26312683 return ERR_PTR (- EINVAL );
@@ -2656,13 +2708,17 @@ ath10k_wmi_tlv_op_gen_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu,
26562708 if (!skb )
26572709 return ERR_PTR (- ENOMEM );
26582710
2711+ desc_id = ath10k_wmi_mgmt_tx_alloc_msdu_id (ar , msdu , paddr );
2712+ if (desc_id < 0 )
2713+ goto err_free_skb ;
2714+
26592715 ptr = (void * )skb -> data ;
26602716 tlv = ptr ;
26612717 tlv -> tag = __cpu_to_le16 (WMI_TLV_TAG_STRUCT_MGMT_TX_CMD );
26622718 tlv -> len = __cpu_to_le16 (sizeof (* cmd ));
26632719 cmd = (void * )tlv -> value ;
26642720 cmd -> vdev_id = __cpu_to_le32 (vdev_id );
2665- cmd -> desc_id = 0 ;
2721+ cmd -> desc_id = __cpu_to_le32 ( desc_id ) ;
26662722 cmd -> chanfreq = 0 ;
26672723 cmd -> buf_len = __cpu_to_le32 (buf_len );
26682724 cmd -> frame_len = __cpu_to_le32 (msdu -> len );
@@ -2679,6 +2735,10 @@ ath10k_wmi_tlv_op_gen_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu,
26792735 memcpy (ptr , msdu -> data , buf_len );
26802736
26812737 return skb ;
2738+
2739+ err_free_skb :
2740+ dev_kfree_skb (skb );
2741+ return ERR_PTR (desc_id );
26822742}
26832743
26842744static struct sk_buff *
@@ -3843,6 +3903,7 @@ static const struct wmi_ops wmi_tlv_ops = {
38433903
38443904 .pull_scan = ath10k_wmi_tlv_op_pull_scan_ev ,
38453905 .pull_mgmt_rx = ath10k_wmi_tlv_op_pull_mgmt_rx_ev ,
3906+ .pull_mgmt_tx_compl = ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev ,
38463907 .pull_ch_info = ath10k_wmi_tlv_op_pull_ch_info_ev ,
38473908 .pull_vdev_start = ath10k_wmi_tlv_op_pull_vdev_start_ev ,
38483909 .pull_peer_kick = ath10k_wmi_tlv_op_pull_peer_kick_ev ,
0 commit comments