move skb mapping before configuring txwi
Subsystems (2)
Lorenzo Bianconi
maintainerv2 cover move skb mapping before configuring txwi
Move skb dma mapping before configuring txwi since new chipsets (e.g. mt7615) will need dma addresses to properly configure txwi. Introduce temporary tx_aligned4_skbs variable in order to tell mt76 layer if it is necessary to align the 802.11 header (it will be removed as soon as mac80211 will take care of it)
Changes since v1:
- move queue depth check after tx_prepare_skb pointer
- make mt76_inser_hdr_pad() return void
Lorenzo Bianconi (4):
mt76: move mt76x02_insert_hdr_pad in mt76-core module
mt76: mmio: move mt76_insert_hdr_pad in mt76_dma_tx_queue_skb
mt76: move skb dma mapping before running tx_prepare_skb
mt76: introduce mt76_tx_info data structure
drivers/net/wireless/mediatek/mt76/dma.c | 59 ++++++++++--------- drivers/net/wireless/mediatek/mt76/mt76.h | 24 +++++++- .../net/wireless/mediatek/mt76/mt7603/mac.c | 2 +- .../wireless/mediatek/mt76/mt7603/mt7603.h | 2 +- .../net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + drivers/net/wireless/mediatek/mt76/mt76x02.h | 3 +- .../net/wireless/mediatek/mt76/mt76x02_txrx.c | 21 +++---- .../net/wireless/mediatek/mt76/mt76x02_usb.h | 2 +- .../wireless/mediatek/mt76/mt76x02_usb_core.c | 4 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 16 ----- .../net/wireless/mediatek/mt76/mt76x2/pci.c | 1 + 11 files changed, 70 insertions(+), 65 deletions(-)
Signature · 1 line
2.20.1
Lorenzo Bianconi
maintainerPATCH v2 1/4 mt76: move mt76x02_insert_hdr_pad in mt76-core module
Move mt76x02_insert_hdr_pad in m76-core and rename it in mt76_insert_hdr_pad in order to be used in mt76_dma_tx_queue_skb. This is a preliminary patch in order to properly support tx dma mapping for new chipsets (e.g. mt7615)
--- drivers/net/wireless/mediatek/mt76/mt76.h | 14 ++++++++++++++ drivers/net/wireless/mediatek/mt76/mt76x02.h | 1 - .../net/wireless/mediatek/mt76/mt76x02_txrx.c | 5 +---- .../wireless/mediatek/mt76/mt76x02_usb_core.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 16 ---------------- 5 files changed, 16 insertions(+), 22 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +14 -0
@@ -653,6 +653,20 @@ static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb)return ((void *)IEEE80211_SKB_CB (skb)->status.status_driver_data); } +static inline void mt76_insert_hdr_pad (struct sk_buff *skb) +{ +int len =ieee80211_get_hdrlen_from_skb (skb); + +if (len %4 ==0 ) +return ; + +skb_push (skb,2 ); +memmove (skb->data, skb->data +2 , len); + + skb->data[len] =0 ; + skb->data[len +1 ] =0 ; +} +void mt76_rx (struct mt76_dev *dev,enum mt76_rxq_id q,struct sk_buff *skb);void mt76_tx (struct mt76_dev *dev,struct ieee80211_sta *sta,struct mt76_wcid *wcid,struct sk_buff *skb);
drivers/net/wireless/mediatek/mt76/mt76x02.h +0 -1
@@ -163,7 +163,6 @@ void mt76x02_set_tx_ackto(struct mt76x02_dev *dev);void mt76x02_set_coverage_class (struct ieee80211_hw *hw,s16 coverage_class);int mt76x02_set_rts_threshold (struct ieee80211_hw *hw,u32 val); -int mt76x02_insert_hdr_pad (struct sk_buff *skb);void mt76x02_remove_hdr_pad (struct sk_buff *skb,int len);bool mt76x02_tx_status_data (struct mt76_dev *mdev,u8 *update); void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c +1 -4
@@ -155,7 +155,6 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,struct mt76x02_txwi *txwi = txwi_ptr;int qsel =MT_QSEL_EDCA ;int pid; -int ret;if (qid ==MT_TXQ_PSD && wcid && wcid->idx <128 )mt76x02_mac_wcid_set_drop (dev, wcid->idx, false);
@@ -165,9 +164,7 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, pid =mt76_tx_status_skb_add (mdev, wcid, skb); txwi->pktid = pid; - ret =mt76x02_insert_hdr_pad (skb); -if (ret <0 ) -return ret; +mt76_insert_hdr_pad (skb);if (pid >=MT_PACKET_ID_FIRST ) qsel =MT_QSEL_MGMT ;
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +1 -1
@@ -82,7 +82,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,enum mt76_qsel qsel;u32 flags; -mt76x02_insert_hdr_pad (skb); +mt76_insert_hdr_pad (skb); txwi = (struct mt76x02_txwi *)(skb->data -sizeof (struct mt76x02_txwi ));mt76x02_mac_write_txwi (dev, txwi, skb, wcid, sta, len);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +0 -16
@@ -566,22 +566,6 @@ void mt76x02_sta_rate_tbl_update(struct ieee80211_hw *hw, }EXPORT_SYMBOL_GPL (mt76x02_sta_rate_tbl_update); -int mt76x02_insert_hdr_pad (struct sk_buff *skb) -{ -int len =ieee80211_get_hdrlen_from_skb (skb); - -if (len %4 ==0 ) -return 0 ; - -skb_push (skb,2 ); -memmove (skb->data, skb->data +2 , len); - - skb->data[len] =0 ; - skb->data[len +1 ] =0 ; -return 2 ; -} -EXPORT_SYMBOL_GPL (mt76x02_insert_hdr_pad); -void mt76x02_remove_hdr_pad (struct sk_buff *skb,int len) {int hdrlen;
Signature · 1 line
2.20.1
Felix Fietkau
maintainerRe: [PATCH v2 1/4] mt76: move mt76x02_insert_hdr_pad in mt76-core module
Quoted 6 lines · Lorenzo Bianconi
Move
mt76x02_insert_hdr_padin m76-core and rename it inmt76_insert_hdr_padin order to be used inmt76_dma_tx_queue_skb. This is a preliminary patch in order to properly support tx dma mapping for new chipsets (e.g. mt7615)Signed-off-by Lorenzo Bianconi <[email protected]>
Series applied, thanks.
- Felix
Lorenzo Bianconi
maintainerPATCH v2 2/4 mt76: mmio: move mt76_insert_hdr_pad in mt76_dma_tx_queue_skb
In reply to Lorenzo BianconiIntroduce tx_aligned4_skbs in mt76_driver_ops and move mt76_insert_hdr_pad in mt76_dma_tx_queue_skb. This is a preliminary patch in order to unify tx dma mapping for mt76x02 and new chipsets
--- drivers/net/wireless/mediatek/mt76/dma.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt76.h | 1 + drivers/net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c | 10 +++++----- drivers/net/wireless/mediatek/mt76/mt76x2/pci.c | 1 + 5 files changed, 11 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +3 -0
@@ -300,6 +300,9 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid, } skb->prev = skb->next =NULL ; +if (dev->drv->tx_aligned4_skbs) +mt76_insert_hdr_pad (skb); +dma_sync_single_for_cpu (dev->dev, t->dma_addr,sizeof (t->txwi),DMA_TO_DEVICE ); ret = dev->drv->tx_prepare_skb(dev, &t->txwi, skb, qid, wcid, sta,
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -288,6 +288,7 @@ struct mt76_hw_cap { };struct mt76_driver_ops { +bool tx_aligned4_skbs;u16 txwi_size;void (*update_survey)(struct mt76_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +1 -0
@@ -164,6 +164,7 @@ mt76x0e_probe(struct pci_dev *pdev, const struct pci_device_id *id) {static const struct mt76_driver_ops drv_ops = { .txwi_size =sizeof (struct mt76x02_txwi ), + .tx_aligned4_skbs = true, .update_survey = mt76x02_update_channel, .tx_prepare_skb = mt76x02_tx_prepare_skb, .tx_complete_skb = mt76x02_tx_complete_skb,
drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c +5 -5
@@ -152,20 +152,20 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, u32 *tx_info) { struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76); +struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;struct mt76x02_txwi *txwi = txwi_ptr; -int qsel =MT_QSEL_EDCA ; -int pid; +int hdrlen, len, pid, qsel =MT_QSEL_EDCA ;if (qid ==MT_TXQ_PSD && wcid && wcid->idx <128 )mt76x02_mac_wcid_set_drop (dev, wcid->idx, false); -mt76x02_mac_write_txwi (dev, txwi, skb, wcid, sta, skb->len); + hdrlen =ieee80211_hdrlen (hdr->frame_control); + len = skb->len - (hdrlen &2 ); +mt76x02_mac_write_txwi (dev, txwi, skb, wcid, sta, len); pid =mt76_tx_status_skb_add (mdev, wcid, skb); txwi->pktid = pid; -mt76_insert_hdr_pad (skb); -if (pid >=MT_PACKET_ID_FIRST ) qsel =MT_QSEL_MGMT ;
drivers/net/wireless/mediatek/mt76/mt76x2/pci.c +1 -0
@@ -32,6 +32,7 @@ mt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) {static const struct mt76_driver_ops drv_ops = { .txwi_size =sizeof (struct mt76x02_txwi ), + .tx_aligned4_skbs = true, .update_survey = mt76x02_update_channel, .tx_prepare_skb = mt76x02_tx_prepare_skb, .tx_complete_skb = mt76x02_tx_complete_skb,
Signature · 1 line
2.20.1
Lorenzo Bianconi
maintainerPATCH v2 3/4 mt76: move skb dma mapping before running tx_prepare_skb
In reply to Lorenzo BianconiMove skb dma mapping before configuring txwi since new chipsets (mt7615) will need skb dma addresses in order to properly configure txwi
--- drivers/net/wireless/mediatek/mt76/dma.c | 33 +++++++++++------------- 1 file changed, 15 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +15 -18
@@ -287,11 +287,10 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,struct mt76_queue_entry e;struct mt76_txwi_cache *t;struct mt76_queue_buf buf[32 ]; +int len, n =0 , ret = -ENOMEM ;struct sk_buff *iter;dma_addr_t addr; -int len;u32 tx_info =0 ; -int n, ret; t =mt76_get_txwi (dev);if (!t) {
@@ -303,23 +302,11 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,if (dev->drv->tx_aligned4_skbs)mt76_insert_hdr_pad (skb); -dma_sync_single_for_cpu (dev->dev, t->dma_addr,sizeof (t->txwi), -DMA_TO_DEVICE ); - ret = dev->drv->tx_prepare_skb (dev, &t->txwi, skb, qid, wcid, sta, - &tx_info); -dma_sync_single_for_device (dev->dev, t->dma_addr,sizeof (t->txwi), -DMA_TO_DEVICE ); -if (ret <0 ) - goto free; - - len = skb->len - skb->data_len; + len =skb_headlen (skb); addr =dma_map_single (dev->dev, skb->data, len,DMA_TO_DEVICE ); -if (dma_mapping_error (dev->dev, addr)) { - ret = -ENOMEM ; +if (dma_mapping_error (dev->dev, addr)) goto free; - } - n =0 ; buf[n].addr = t->dma_addr; buf[n++].len = dev->drv->txwi_size; buf[n].addr = addr;
@@ -338,13 +325,23 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid, buf[n++].len = iter->len; } -if (q->queued + (n +1 ) /2 >= q->ndesc -1 ) +dma_sync_single_for_cpu (dev->dev, t->dma_addr,sizeof (t->txwi), +DMA_TO_DEVICE ); + ret = dev->drv->tx_prepare_skb (dev, &t->txwi, skb, qid, wcid, sta, + &tx_info); +dma_sync_single_for_device (dev->dev, t->dma_addr,sizeof (t->txwi), +DMA_TO_DEVICE ); +if (ret <0 ) goto unmap; +if (q->queued + (n +1 ) /2 >= q->ndesc -1 ) { + ret = -ENOMEM ; + goto unmap; + } +return mt76_dma_add_buf (dev, q, buf, n, tx_info, skb, t); unmap: - ret = -ENOMEM ;for (n--; n >0 ; n--)dma_unmap_single (dev->dev, buf[n].addr, buf[n].len,DMA_TO_DEVICE );
Signature · 1 line
2.20.1
Lorenzo Bianconi
maintainerPATCH v2 4/4 mt76: introduce mt76_tx_info data structure
In reply to Lorenzo BianconiAdd mt76_tx_info as auxiliary data structure to pass values to tx_prepare_skb pointer. This is a preliminary patch to add support for new chipsets (e.g. mt7615)
--- drivers/net/wireless/mediatek/mt76/dma.c | 29 ++++++++++--------- drivers/net/wireless/mediatek/mt76/mt76.h | 9 +++++- .../net/wireless/mediatek/mt76/mt7603/mac.c | 2 +- .../wireless/mediatek/mt76/mt7603/mt7603.h | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 +- .../net/wireless/mediatek/mt76/mt76x02_txrx.c | 8 ++--- .../net/wireless/mediatek/mt76/mt76x02_usb.h | 2 +- .../wireless/mediatek/mt76/mt76x02_usb_core.c | 2 +- 8 files changed, 32 insertions(+), 24 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +15 -14
@@ -284,13 +284,12 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid, struct ieee80211_sta *sta) {struct mt76_queue *q = dev->q_tx[qid].q; +struct mt76_tx_info tx_info = {}; +int len, n =0 , ret = -ENOMEM ;struct mt76_queue_entry e;struct mt76_txwi_cache *t; -struct mt76_queue_buf buf[32 ]; -int len, n =0 , ret = -ENOMEM ;struct sk_buff *iter;dma_addr_t addr; -u32 tx_info =0 ; t =mt76_get_txwi (dev);if (!t) {
@@ -307,13 +306,13 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,if (dma_mapping_error (dev->dev, addr)) goto free; - buf[n].addr = t->dma_addr; - buf[n++].len = dev->drv->txwi_size; - buf[n].addr = addr; - buf[n++].len = len; + tx_info.buf[n].addr = t->dma_addr; + tx_info.buf[n++].len = dev->drv->txwi_size; + tx_info.buf[n].addr = addr; + tx_info.buf[n++].len = len; skb_walk_frags(skb, iter) { -if (n ==ARRAY_SIZE (buf)) +if (n ==ARRAY_SIZE (tx_info.buf)) goto unmap; addr = dma_map_single(dev->dev, iter->data, iter->len,
@@ -321,9 +320,10 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,if (dma_mapping_error (dev->dev, addr)) goto unmap; - buf[n].addr = addr; - buf[n++].len = iter->len; + tx_info.buf[n].addr = addr; + tx_info.buf[n++].len = iter->len; } + tx_info.nbuf = n;dma_sync_single_for_cpu (dev->dev, t->dma_addr,sizeof (t->txwi),DMA_TO_DEVICE );
@@ -334,17 +334,18 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,if (ret <0 ) goto unmap; -if (q->queued + (n +1 ) /2 >= q->ndesc -1 ) { +if (q->queued + (tx_info.nbuf +1 ) /2 >= q->ndesc -1 ) { ret = -ENOMEM ; goto unmap; } -return mt76_dma_add_buf (dev, q, buf, n, tx_info, skb, t); +return mt76_dma_add_buf (dev, q, tx_info.buf, tx_info.nbuf, + tx_info.info, skb, t); unmap:for (n--; n >0 ; n--) -dma_unmap_single (dev->dev, buf[n].addr, buf[n].len, -DMA_TO_DEVICE ); +dma_unmap_single (dev->dev, tx_info.buf[n].addr, + tx_info.buf[n].len,DMA_TO_DEVICE ); free: e.skb = skb;
drivers/net/wireless/mediatek/mt76/mt76.h +8 -1
@@ -83,6 +83,12 @@ struct mt76_queue_buf {int len; }; +struct mt76_tx_info { +struct mt76_queue_buf buf[32 ]; +int nbuf; +u32 info; +}; +struct mt76u_buf {struct mt76_dev *dev;struct urb *urb;
@@ -296,7 +302,8 @@ struct mt76_driver_ops {int (*tx_prepare_skb)(struct mt76_dev *dev,void *txwi_ptr,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid, -struct ieee80211_sta *sta,u32 *tx_info); +struct ieee80211_sta *sta, +struct mt76_tx_info *tx_info);void (*tx_complete_skb)(struct mt76_dev *dev,enum mt76_txq_id qid,struct mt76_queue_entry *e);
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +1 -1
@@ -939,7 +939,7 @@ mt7603_mac_write_txwi(struct mt7603_dev *dev, __le32 *txwi,int mt7603_tx_prepare_skb (struct mt76_dev *mdev,void *txwi_ptr,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid,struct ieee80211_sta *sta, -u32 *tx_info) +struct mt76_tx_info *tx_info) { struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); struct mt7603_sta *msta = container_of(wcid, struct mt7603_sta, wcid);
drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h +1 -1
@@ -225,7 +225,7 @@ void mt7603_filter_tx(struct mt7603_dev *dev, int idx, bool abort);int mt7603_tx_prepare_skb (struct mt76_dev *mdev,void *txwi_ptr,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid,struct ieee80211_sta *sta, -u32 *tx_info); +struct mt76_tx_info *tx_info);void mt7603_tx_complete_skb (struct mt76_dev *mdev,enum mt76_txq_id qid,struct mt76_queue_entry *e);
drivers/net/wireless/mediatek/mt76/mt76x02.h +1 -1
@@ -174,7 +174,7 @@ void mt76x02_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,int mt76x02_tx_prepare_skb (struct mt76_dev *mdev,void *txwi,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid,struct ieee80211_sta *sta, -u32 *tx_info); +struct mt76_tx_info *tx_info);void mt76x02_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif,const u8 *mac); void mt76x02_sw_scan_complete(struct ieee80211_hw *hw,
drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c +4 -4
@@ -149,7 +149,7 @@ EXPORT_SYMBOL_GPL(mt76x02_tx_status_data);int mt76x02_tx_prepare_skb (struct mt76_dev *mdev,void *txwi_ptr,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid,struct ieee80211_sta *sta, -u32 *tx_info) +struct mt76_tx_info *tx_info) { struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -169,11 +169,11 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,if (pid >=MT_PACKET_ID_FIRST ) qsel =MT_QSEL_MGMT ; - *tx_info =FIELD_PREP (MT_TXD_INFO_QSEL , qsel) | -MT_TXD_INFO_80211 ; + tx_info->info =FIELD_PREP (MT_TXD_INFO_QSEL , qsel) | +MT_TXD_INFO_80211 ;if (!wcid || wcid->hw_key_idx ==0xff || wcid->sw_iv) - *tx_info |=MT_TXD_INFO_WIV ; + tx_info->info |=MT_TXD_INFO_WIV ;return 0 ; }
drivers/net/wireless/mediatek/mt76/mt76x02_usb.h +1 -1
@@ -28,7 +28,7 @@ int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags);int mt76x02u_tx_prepare_skb (struct mt76_dev *mdev,void *data,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid,struct ieee80211_sta *sta, -u32 *tx_info); +struct mt76_tx_info *tx_info);void mt76x02u_tx_complete_skb (struct mt76_dev *mdev,enum mt76_txq_id qid,struct mt76_queue_entry *e);#endif /* __MT76x02_USB_H */
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +1 -1
@@ -74,7 +74,7 @@ int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags)int mt76x02u_tx_prepare_skb (struct mt76_dev *mdev,void *data,struct sk_buff *skb,enum mt76_txq_id qid,struct mt76_wcid *wcid,struct ieee80211_sta *sta, -u32 *tx_info) +struct mt76_tx_info *tx_info) { struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);int pid, len = skb->len, ep =q2ep (mdev->q_tx[qid].q->hw_idx);
Signature · 1 line
2.20.1