Loading drivers/net/wireless/ath/ath10k/ce.c +8 −8 Original line number Diff line number Diff line Loading @@ -266,7 +266,7 @@ static inline void ath10k_ce_engine_int_status_clear(struct ath10k *ar, * ath10k_ce_sendlist_send. * The caller takes responsibility for any needed locking. */ static int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, void *per_transfer_context, u32 buffer, unsigned int nbytes, Loading Loading @@ -1067,9 +1067,9 @@ struct ath10k_ce_pipe *ath10k_ce_init(struct ath10k *ar, * * For the lack of a better place do the check here. */ BUILD_BUG_ON(TARGET_NUM_MSDU_DESC > BUILD_BUG_ON(2*TARGET_NUM_MSDU_DESC > (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); BUILD_BUG_ON(TARGET_10X_NUM_MSDU_DESC > BUILD_BUG_ON(2*TARGET_10X_NUM_MSDU_DESC > (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); ret = ath10k_pci_wake(ar); Loading drivers/net/wireless/ath/ath10k/ce.h +8 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ /* Maximum number of Copy Engine's supported */ #define CE_COUNT_MAX 8 #define CE_HTT_H2T_MSG_SRC_NENTRIES 2048 #define CE_HTT_H2T_MSG_SRC_NENTRIES 4096 /* Descriptor rings must be aligned to this boundary */ #define CE_DESC_RING_ALIGN 8 Loading Loading @@ -152,6 +152,13 @@ int ath10k_ce_send(struct ath10k_ce_pipe *ce_state, unsigned int transfer_id, unsigned int flags); int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, void *per_transfer_context, u32 buffer, unsigned int nbytes, unsigned int transfer_id, unsigned int flags); void ath10k_ce_send_cb_register(struct ath10k_ce_pipe *ce_state, void (*send_cb)(struct ath10k_ce_pipe *), int disable_interrupts); Loading drivers/net/wireless/ath/ath10k/core.h +3 −31 Original line number Diff line number Diff line Loading @@ -62,16 +62,13 @@ struct ath10k; struct ath10k_skb_cb { dma_addr_t paddr; bool is_mapped; bool is_aborted; u8 vdev_id; struct { u8 tid; bool is_offchan; u8 frag_len; u8 pad_len; struct ath10k_htt_txbuf *txbuf; u32 txbuf_paddr; } __packed htt; struct { Loading @@ -87,32 +84,6 @@ static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb) return (struct ath10k_skb_cb *)&IEEE80211_SKB_CB(skb)->driver_data; } static inline int ath10k_skb_map(struct device *dev, struct sk_buff *skb) { if (ATH10K_SKB_CB(skb)->is_mapped) return -EINVAL; ATH10K_SKB_CB(skb)->paddr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE); if (unlikely(dma_mapping_error(dev, ATH10K_SKB_CB(skb)->paddr))) return -EIO; ATH10K_SKB_CB(skb)->is_mapped = true; return 0; } static inline int ath10k_skb_unmap(struct device *dev, struct sk_buff *skb) { if (!ATH10K_SKB_CB(skb)->is_mapped) return -EINVAL; dma_unmap_single(dev, ATH10K_SKB_CB(skb)->paddr, skb->len, DMA_TO_DEVICE); ATH10K_SKB_CB(skb)->is_mapped = false; return 0; } static inline u32 host_interest_item_address(u32 item_offset) { return QCA988X_HOST_INTEREST_ADDRESS + item_offset; Loading Loading @@ -288,6 +259,7 @@ struct ath10k_vif { u8 fixed_rate; u8 fixed_nss; u8 force_sgi; }; struct ath10k_vif_iter { Loading drivers/net/wireless/ath/ath10k/hif.h +15 −10 Original line number Diff line number Diff line Loading @@ -21,6 +21,14 @@ #include <linux/kernel.h> #include "core.h" struct ath10k_hif_sg_item { u16 transfer_id; void *transfer_context; /* NULL = tx completion callback not called */ void *vaddr; /* for debugging mostly */ u32 paddr; u16 len; }; struct ath10k_hif_cb { int (*tx_completion)(struct ath10k *ar, struct sk_buff *wbuf, Loading @@ -31,11 +39,9 @@ struct ath10k_hif_cb { }; struct ath10k_hif_ops { /* Send the head of a buffer to HIF for transmission to the target. */ int (*send_head)(struct ath10k *ar, u8 pipe_id, unsigned int transfer_id, unsigned int nbytes, struct sk_buff *buf); /* send a scatter-gather list to the target */ int (*tx_sg)(struct ath10k *ar, u8 pipe_id, struct ath10k_hif_sg_item *items, int n_items); /* * API to handle HIF-specific BMI message exchanges, this API is Loading Loading @@ -86,12 +92,11 @@ struct ath10k_hif_ops { }; static inline int ath10k_hif_send_head(struct ath10k *ar, u8 pipe_id, unsigned int transfer_id, unsigned int nbytes, struct sk_buff *buf) static inline int ath10k_hif_tx_sg(struct ath10k *ar, u8 pipe_id, struct ath10k_hif_sg_item *items, int n_items) { return ar->hif.ops->send_head(ar, pipe_id, transfer_id, nbytes, buf); return ar->hif.ops->tx_sg(ar, pipe_id, items, n_items); } static inline int ath10k_hif_exchange_bmi_msg(struct ath10k *ar, Loading drivers/net/wireless/ath/ath10k/htc.c +17 −8 Original line number Diff line number Diff line Loading @@ -63,7 +63,9 @@ static struct sk_buff *ath10k_htc_build_tx_ctrl_skb(void *ar) static inline void ath10k_htc_restore_tx_skb(struct ath10k_htc *htc, struct sk_buff *skb) { ath10k_skb_unmap(htc->ar->dev, skb); struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE); skb_pull(skb, sizeof(struct ath10k_htc_hdr)); } Loading Loading @@ -122,6 +124,9 @@ int ath10k_htc_send(struct ath10k_htc *htc, struct sk_buff *skb) { struct ath10k_htc_ep *ep = &htc->endpoint[eid]; struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); struct ath10k_hif_sg_item sg_item; struct device *dev = htc->ar->dev; int credits = 0; int ret; Loading Loading @@ -157,19 +162,25 @@ int ath10k_htc_send(struct ath10k_htc *htc, ath10k_htc_prepare_tx_skb(ep, skb); ret = ath10k_skb_map(htc->ar->dev, skb); skb_cb->paddr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE); ret = dma_mapping_error(dev, skb_cb->paddr); if (ret) goto err_credits; ret = ath10k_hif_send_head(htc->ar, ep->ul_pipe_id, ep->eid, skb->len, skb); sg_item.transfer_id = ep->eid; sg_item.transfer_context = skb; sg_item.vaddr = skb->data; sg_item.paddr = skb_cb->paddr; sg_item.len = skb->len; ret = ath10k_hif_tx_sg(htc->ar, ep->ul_pipe_id, &sg_item, 1); if (ret) goto err_unmap; return 0; err_unmap: ath10k_skb_unmap(htc->ar->dev, skb); dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE); err_credits: if (ep->tx_credit_flow_enabled) { spin_lock_bh(&htc->tx_lock); Loading @@ -191,10 +202,8 @@ static int ath10k_htc_tx_completion_handler(struct ath10k *ar, struct ath10k_htc *htc = &ar->htc; struct ath10k_htc_ep *ep = &htc->endpoint[eid]; if (!skb) { ath10k_warn("invalid sk_buff completion - NULL pointer. firmware crashed?\n"); if (WARN_ON_ONCE(!skb)) return 0; } ath10k_htc_notify_tx_completion(ep, skb); /* the skb now belongs to the completion handler */ Loading Loading
drivers/net/wireless/ath/ath10k/ce.c +8 −8 Original line number Diff line number Diff line Loading @@ -266,7 +266,7 @@ static inline void ath10k_ce_engine_int_status_clear(struct ath10k *ar, * ath10k_ce_sendlist_send. * The caller takes responsibility for any needed locking. */ static int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, void *per_transfer_context, u32 buffer, unsigned int nbytes, Loading Loading @@ -1067,9 +1067,9 @@ struct ath10k_ce_pipe *ath10k_ce_init(struct ath10k *ar, * * For the lack of a better place do the check here. */ BUILD_BUG_ON(TARGET_NUM_MSDU_DESC > BUILD_BUG_ON(2*TARGET_NUM_MSDU_DESC > (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); BUILD_BUG_ON(TARGET_10X_NUM_MSDU_DESC > BUILD_BUG_ON(2*TARGET_10X_NUM_MSDU_DESC > (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); ret = ath10k_pci_wake(ar); Loading
drivers/net/wireless/ath/ath10k/ce.h +8 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ /* Maximum number of Copy Engine's supported */ #define CE_COUNT_MAX 8 #define CE_HTT_H2T_MSG_SRC_NENTRIES 2048 #define CE_HTT_H2T_MSG_SRC_NENTRIES 4096 /* Descriptor rings must be aligned to this boundary */ #define CE_DESC_RING_ALIGN 8 Loading Loading @@ -152,6 +152,13 @@ int ath10k_ce_send(struct ath10k_ce_pipe *ce_state, unsigned int transfer_id, unsigned int flags); int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, void *per_transfer_context, u32 buffer, unsigned int nbytes, unsigned int transfer_id, unsigned int flags); void ath10k_ce_send_cb_register(struct ath10k_ce_pipe *ce_state, void (*send_cb)(struct ath10k_ce_pipe *), int disable_interrupts); Loading
drivers/net/wireless/ath/ath10k/core.h +3 −31 Original line number Diff line number Diff line Loading @@ -62,16 +62,13 @@ struct ath10k; struct ath10k_skb_cb { dma_addr_t paddr; bool is_mapped; bool is_aborted; u8 vdev_id; struct { u8 tid; bool is_offchan; u8 frag_len; u8 pad_len; struct ath10k_htt_txbuf *txbuf; u32 txbuf_paddr; } __packed htt; struct { Loading @@ -87,32 +84,6 @@ static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb) return (struct ath10k_skb_cb *)&IEEE80211_SKB_CB(skb)->driver_data; } static inline int ath10k_skb_map(struct device *dev, struct sk_buff *skb) { if (ATH10K_SKB_CB(skb)->is_mapped) return -EINVAL; ATH10K_SKB_CB(skb)->paddr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE); if (unlikely(dma_mapping_error(dev, ATH10K_SKB_CB(skb)->paddr))) return -EIO; ATH10K_SKB_CB(skb)->is_mapped = true; return 0; } static inline int ath10k_skb_unmap(struct device *dev, struct sk_buff *skb) { if (!ATH10K_SKB_CB(skb)->is_mapped) return -EINVAL; dma_unmap_single(dev, ATH10K_SKB_CB(skb)->paddr, skb->len, DMA_TO_DEVICE); ATH10K_SKB_CB(skb)->is_mapped = false; return 0; } static inline u32 host_interest_item_address(u32 item_offset) { return QCA988X_HOST_INTEREST_ADDRESS + item_offset; Loading Loading @@ -288,6 +259,7 @@ struct ath10k_vif { u8 fixed_rate; u8 fixed_nss; u8 force_sgi; }; struct ath10k_vif_iter { Loading
drivers/net/wireless/ath/ath10k/hif.h +15 −10 Original line number Diff line number Diff line Loading @@ -21,6 +21,14 @@ #include <linux/kernel.h> #include "core.h" struct ath10k_hif_sg_item { u16 transfer_id; void *transfer_context; /* NULL = tx completion callback not called */ void *vaddr; /* for debugging mostly */ u32 paddr; u16 len; }; struct ath10k_hif_cb { int (*tx_completion)(struct ath10k *ar, struct sk_buff *wbuf, Loading @@ -31,11 +39,9 @@ struct ath10k_hif_cb { }; struct ath10k_hif_ops { /* Send the head of a buffer to HIF for transmission to the target. */ int (*send_head)(struct ath10k *ar, u8 pipe_id, unsigned int transfer_id, unsigned int nbytes, struct sk_buff *buf); /* send a scatter-gather list to the target */ int (*tx_sg)(struct ath10k *ar, u8 pipe_id, struct ath10k_hif_sg_item *items, int n_items); /* * API to handle HIF-specific BMI message exchanges, this API is Loading Loading @@ -86,12 +92,11 @@ struct ath10k_hif_ops { }; static inline int ath10k_hif_send_head(struct ath10k *ar, u8 pipe_id, unsigned int transfer_id, unsigned int nbytes, struct sk_buff *buf) static inline int ath10k_hif_tx_sg(struct ath10k *ar, u8 pipe_id, struct ath10k_hif_sg_item *items, int n_items) { return ar->hif.ops->send_head(ar, pipe_id, transfer_id, nbytes, buf); return ar->hif.ops->tx_sg(ar, pipe_id, items, n_items); } static inline int ath10k_hif_exchange_bmi_msg(struct ath10k *ar, Loading
drivers/net/wireless/ath/ath10k/htc.c +17 −8 Original line number Diff line number Diff line Loading @@ -63,7 +63,9 @@ static struct sk_buff *ath10k_htc_build_tx_ctrl_skb(void *ar) static inline void ath10k_htc_restore_tx_skb(struct ath10k_htc *htc, struct sk_buff *skb) { ath10k_skb_unmap(htc->ar->dev, skb); struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE); skb_pull(skb, sizeof(struct ath10k_htc_hdr)); } Loading Loading @@ -122,6 +124,9 @@ int ath10k_htc_send(struct ath10k_htc *htc, struct sk_buff *skb) { struct ath10k_htc_ep *ep = &htc->endpoint[eid]; struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); struct ath10k_hif_sg_item sg_item; struct device *dev = htc->ar->dev; int credits = 0; int ret; Loading Loading @@ -157,19 +162,25 @@ int ath10k_htc_send(struct ath10k_htc *htc, ath10k_htc_prepare_tx_skb(ep, skb); ret = ath10k_skb_map(htc->ar->dev, skb); skb_cb->paddr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE); ret = dma_mapping_error(dev, skb_cb->paddr); if (ret) goto err_credits; ret = ath10k_hif_send_head(htc->ar, ep->ul_pipe_id, ep->eid, skb->len, skb); sg_item.transfer_id = ep->eid; sg_item.transfer_context = skb; sg_item.vaddr = skb->data; sg_item.paddr = skb_cb->paddr; sg_item.len = skb->len; ret = ath10k_hif_tx_sg(htc->ar, ep->ul_pipe_id, &sg_item, 1); if (ret) goto err_unmap; return 0; err_unmap: ath10k_skb_unmap(htc->ar->dev, skb); dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE); err_credits: if (ep->tx_credit_flow_enabled) { spin_lock_bh(&htc->tx_lock); Loading @@ -191,10 +202,8 @@ static int ath10k_htc_tx_completion_handler(struct ath10k *ar, struct ath10k_htc *htc = &ar->htc; struct ath10k_htc_ep *ep = &htc->endpoint[eid]; if (!skb) { ath10k_warn("invalid sk_buff completion - NULL pointer. firmware crashed?\n"); if (WARN_ON_ONCE(!skb)) return 0; } ath10k_htc_notify_tx_completion(ep, skb); /* the skb now belongs to the completion handler */ Loading