mt76: move hw data queues in mt76_phy
Subsystems (3)
Lorenzo Bianconi
maintainerv2 cover mt76: move hw data queues in mt76_phy
Move hw data queues from mt76_dev to mt76_phy since mt7915 devices in dbdc mode export per-phy hw data queues (while mcu hw queues are shared between primary and ext phys). This is a preliminary series to enable dbdc mode for mt7915 driver.
Changes since v1:
- use mt76_dev in mt76_dma_tx_cleanup signature
- rely on on mt76_queue in tx_queue_skb signature
Lorenzo Bianconi (10):
mt76: move mt76_init_tx_queue in common code
mt76: sdio: introduce mt76s_alloc_tx_queue
mt76: sdio: rely on mt76_queue in mt76s_process_tx_queue signature
mt76: mt7663s: rely on mt76_queue in mt7663s_tx_run_queue signature
mt76: dma: rely on mt76_queue in mt76_dma_tx_cleanup signature
mt76: rely on mt76_queue in tx_queue_skb signature
mt76: introduce mt76_init_mcu_queue utility routine
mt76: rely on mt76_queue in tx_queue_skb_raw signature
mt76: move mcu queues to mt76_dev q_mcu array
mt76: move tx hw data queues in mt76_phy
drivers/net/wireless/mediatek/mt76/debugfs.c | 4 +- drivers/net/wireless/mediatek/mt76/dma.c | 26 ++++--- drivers/net/wireless/mediatek/mt76/mac80211.c | 26 +++++-- drivers/net/wireless/mediatek/mt76/mcu.c | 4 +- drivers/net/wireless/mediatek/mt76/mt76.h | 60 ++++++++++++--- .../wireless/mediatek/mt76/mt7603/beacon.c | 26 ++++--- .../net/wireless/mediatek/mt76/mt7603/dma.c | 61 +++++++-------- .../net/wireless/mediatek/mt76/mt7603/mac.c | 9 ++- .../net/wireless/mediatek/mt76/mt7603/main.c | 12 +-- .../net/wireless/mediatek/mt76/mt7603/mcu.c | 2 +- .../wireless/mediatek/mt76/mt7615/debugfs.c | 17 ++--- .../net/wireless/mediatek/mt76/mt7615/dma.c | 53 +++++-------- .../net/wireless/mediatek/mt76/mt7615/init.c | 6 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 9 ++- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 8 +- .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 +- .../wireless/mediatek/mt76/mt7615/sdio_mcu.c | 4 +- .../wireless/mediatek/mt76/mt7615/sdio_txrx.c | 28 ++++--- .../net/wireless/mediatek/mt76/mt76x02_mcu.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 69 ++++++++--------- .../wireless/mediatek/mt76/mt76x02_usb_core.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 4 +- .../wireless/mediatek/mt76/mt7915/debugfs.c | 17 ++--- .../net/wireless/mediatek/mt76/mt7915/dma.c | 54 ++++--------- .../net/wireless/mediatek/mt76/mt7915/mac.c | 12 +-- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 10 +-- drivers/net/wireless/mediatek/mt76/sdio.c | 75 ++++++++++++------- drivers/net/wireless/mediatek/mt76/testmode.c | 6 +- drivers/net/wireless/mediatek/mt76/tx.c | 33 ++++---- drivers/net/wireless/mediatek/mt76/usb.c | 19 ++--- 30 files changed, 345 insertions(+), 315 deletions(-)
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 1/10 mt76: move mt76_init_tx_queue in common code
Move mt76_init_tx_queue in mac80211.c since it is shared by all drivers.
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 21 ++++++++ drivers/net/wireless/mediatek/mt76/mt76.h | 4 ++ .../net/wireless/mediatek/mt76/mt7603/dma.c | 10 +--- .../net/wireless/mediatek/mt76/mt7615/dma.c | 50 +++++++------------ .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 10 +--- .../net/wireless/mediatek/mt76/mt7915/dma.c | 48 +++++------------- 6 files changed, 58 insertions(+), 85 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +21 -0
@@ -1213,3 +1213,24 @@ int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)return 0 ; }EXPORT_SYMBOL_GPL (mt76_get_antenna); + +int mt76_init_tx_queue (struct mt76_dev *dev,int qid,int idx, +int n_desc,int ring_base) +{ +struct mt76_queue *hwq; +int err; + + hwq =devm_kzalloc (dev->dev,sizeof (*hwq),GFP_KERNEL ); +if (!hwq) +return -ENOMEM ; + + err = dev->queue_ops->alloc (dev, hwq, idx, n_desc,0 , ring_base); +if (err <0 ) +return err; + + hwq->qid = qid; + dev->q_tx[qid] = hwq; + +return 0 ; +} +EXPORT_SYMBOL_GPL (mt76_init_tx_queue);
drivers/net/wireless/mediatek/mt76/mt76.h +4 -0
@@ -134,6 +134,7 @@ struct mt76_queue {u8 buf_offset;u8 hw_idx; +u8 qid;dma_addr_t desc_dma;struct sk_buff *rx_head;
@@ -778,6 +779,9 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str,int mt76_eeprom_init (struct mt76_dev *dev,int len);void mt76_eeprom_override (struct mt76_dev *dev); +int mt76_init_tx_queue (struct mt76_dev *dev,int qid,int idx, +int n_desc,int ring_base); +static inline struct mt76_phy *mt76_dev_phy (struct mt76_dev *dev,bool phy_ext) {
drivers/net/wireless/mediatek/mt76/mt7603/dma.c +2 -8
@@ -7,19 +7,13 @@static int mt7603_init_tx_queue (struct mt7603_dev *dev,int qid,int idx,int n_desc) { -struct mt76_queue *hwq;int err; - hwq =devm_kzalloc (dev->mt76.dev,sizeof (*hwq),GFP_KERNEL ); -if (!hwq) -return -ENOMEM ; - - err =mt76_queue_alloc (dev, hwq, idx, n_desc,0 ,MT_TX_RING_BASE ); + err =mt76_init_tx_queue (&dev->mt76, qid, idx, n_desc, +MT_TX_RING_BASE );if (err <0 )return err; - dev->mt76.q_tx[qid] = hwq; -mt7603_irq_enable (dev,MT_INT_TX_DONE (idx));return 0 ;
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +17 -33
87 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +2 -8
@@ -106,19 +106,13 @@ EXPORT_SYMBOL_GPL(mt76x02e_init_beacon_config);static int mt76x02_init_tx_queue (struct mt76x02_dev *dev,int qid,int idx,int n_desc) { -struct mt76_queue *hwq;int err; - hwq =devm_kzalloc (dev->mt76.dev,sizeof (*hwq),GFP_KERNEL ); -if (!hwq) -return -ENOMEM ; - - err =mt76_queue_alloc (dev, hwq, idx, n_desc,0 ,MT_TX_RING_BASE ); + err =mt76_init_tx_queue (&dev->mt76, qid, idx, n_desc, +MT_TX_RING_BASE );if (err <0 )return err; - dev->mt76.q_tx[qid] = hwq; -mt76x02_irq_enable (dev,MT_INT_TX_DONE (idx));return 0 ;
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +12 -36
78 lines not on this page · raw message
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 4/10 mt76: mt7663s: rely on mt76_queue in mt7663s_tx_run_queue signature
In reply to Lorenzo BianconiThis is a preliminary patch to move data queues in mt76_phy and properly support dbdc for mt7915
--- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- .../wireless/mediatek/mt76/mt7615/sdio_txrx.c | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
@@ -458,7 +458,7 @@ struct mt76_sdio {struct work_struct stat_work; -u8 *xmit_buf[MT_TXQ_MCU_WA ]; +u8 *xmit_buf[IEEE80211_NUM_ACS +2 ];struct sdio_func *func;void *intr_data;
drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c +12 -11
@@ -166,14 +166,14 @@ static int mt7663s_rx_handler(struct mt76_dev *dev)return nframes; } -static int mt7663s_tx_pick_quota (struct mt76_sdio *sdio,enum mt76_txq_id qid, -int buf_sz,int *pse_size,int *ple_size) +static int mt7663s_tx_pick_quota (struct mt76_sdio *sdio,bool mcu,int buf_sz, +int *pse_size,int *ple_size) {int pse_sz; pse_sz =DIV_ROUND_UP (buf_sz + sdio->sched.deficit,MT_PSE_PAGE_SZ ); -if (qid ==MT_TXQ_MCU ) { +if (mcu) {if (sdio->sched.pse_mcu_quota < *pse_size + pse_sz)return -EBUSY ; }else {
@@ -188,10 +188,10 @@ static int mt7663s_tx_pick_quota(struct mt76_sdio *sdio, enum mt76_txq_id qid,return 0 ; } -static void mt7663s_tx_update_quota (struct mt76_sdio *sdio,enum mt76_txq_id qid, +static void mt7663s_tx_update_quota (struct mt76_sdio *sdio,bool mcu,int pse_size,int ple_size) { -if (qid ==MT_TXQ_MCU ) { +if (mcu) { sdio->sched.pse_mcu_quota -= pse_size; }else { sdio->sched.pse_data_quota -= pse_size;
@@ -214,12 +214,13 @@ static int __mt7663s_xmit_queue(struct mt76_dev *dev, u8 *data, int len)return err; } -static int mt7663s_tx_run_queue (struct mt76_dev *dev,enum mt76_txq_id qid) +static int mt7663s_tx_run_queue (struct mt76_dev *dev,struct mt76_queue *q) { -int err, nframes =0 , len =0 , pse_sz =0 , ple_sz =0 ; -struct mt76_queue *q = dev->q_tx[qid]; +int qid, err, nframes =0 , len =0 , pse_sz =0 , ple_sz =0 ; +bool mcu = q == dev->q_tx[MT_TXQ_MCU ];struct mt76_sdio *sdio = &dev->sdio; + qid = mcu ?ARRAY_SIZE (sdio->xmit_buf) -1 : q->qid;while (q->first != q->head) {struct mt76_queue_entry *e = &q->entry[q->first];struct sk_buff *iter;
@@ -237,7 +238,7 @@ static int mt7663s_tx_run_queue(struct mt76_dev *dev, enum mt76_txq_id qid)if (len + e->skb->len +4 >MT76S_XMIT_BUF_SZ )break ; -if (mt7663s_tx_pick_quota (sdio, qid, e->buf_sz, &pse_sz, +if (mt7663s_tx_pick_quota (sdio, mcu, e->buf_sz, &pse_sz, &ple_sz))break ;
@@ -263,7 +264,7 @@ static int mt7663s_tx_run_queue(struct mt76_dev *dev, enum mt76_txq_id qid)if (err)return err; } -mt7663s_tx_update_quota (sdio, qid, pse_sz, ple_sz); +mt7663s_tx_update_quota (sdio, mcu, pse_sz, ple_sz);mt76_worker_schedule (&sdio->status_worker);
@@ -286,7 +287,7 @@ void mt7663s_txrx_worker(struct mt76_worker *w)/* tx */ for (i =0 ; i <MT_TXQ_MCU_WA ; i++) { - ret =mt7663s_tx_run_queue (dev, i); + ret =mt7663s_tx_run_queue (dev, dev->q_tx[i]);if (ret >0 ) nframes += ret; }
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 10/10 mt76: move tx hw data queues in mt76_phy
In reply to Lorenzo BianconiMove hw data queues in mt76_phy from mt76_dev since mt7915 supports per phy hw queues in dbdc mode
--- drivers/net/wireless/mediatek/mt76/debugfs.c | 4 ++-- drivers/net/wireless/mediatek/mt76/dma.c | 7 +++++-- drivers/net/wireless/mediatek/mt76/mac80211.c | 7 ++----- drivers/net/wireless/mediatek/mt76/mt76.h | 7 ++++--- .../net/wireless/mediatek/mt76/mt7603/beacon.c | 17 ++++++++--------- drivers/net/wireless/mediatek/mt76/mt7603/dma.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 8 ++++---- .../net/wireless/mediatek/mt76/mt7603/main.c | 6 +++--- .../net/wireless/mediatek/mt76/mt7615/debugfs.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7615/dma.c | 2 +- .../net/wireless/mediatek/mt76/mt7615/init.c | 6 +++++- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 8 ++++---- .../wireless/mediatek/mt76/mt7615/sdio_txrx.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 15 +++++++-------- .../wireless/mediatek/mt76/mt76x02_usb_core.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 4 ++-- .../net/wireless/mediatek/mt76/mt7915/debugfs.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/dma.c | 8 ++++---- drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 11 ++++++----- drivers/net/wireless/mediatek/mt76/sdio.c | 5 +++-- drivers/net/wireless/mediatek/mt76/testmode.c | 3 ++- drivers/net/wireless/mediatek/mt76/tx.c | 13 ++++++------- drivers/net/wireless/mediatek/mt76/usb.c | 12 ++++++------ 23 files changed, 81 insertions(+), 76 deletions(-)
drivers/net/wireless/mediatek/mt76/debugfs.c +2 -2
@@ -30,8 +30,8 @@ int mt76_queues_read(struct seq_file *s, void *data)struct mt76_dev *dev =dev_get_drvdata (s->private);int i; -for (i =0 ; i <ARRAY_SIZE (dev->q_tx); i++) { -struct mt76_queue *q = dev->q_tx[i]; +for (i =0 ; i <ARRAY_SIZE (dev->phy.q_tx); i++) { +struct mt76_queue *q = dev->phy.q_tx[i];if (!q)continue ;
drivers/net/wireless/mediatek/mt76/dma.c +5 -2
@@ -661,8 +661,11 @@ void mt76_dma_cleanup(struct mt76_dev *dev)mt76_worker_disable (&dev->tx_worker);netif_napi_del (&dev->tx_napi); -for (i =0 ; i <ARRAY_SIZE (dev->q_tx); i++) -mt76_dma_tx_cleanup (dev, dev->q_tx[i], true); +for (i =0 ; i <ARRAY_SIZE (dev->phy.q_tx); i++) { +mt76_dma_tx_cleanup (dev, dev->phy.q_tx[i], true); +if (dev->phy2) +mt76_dma_tx_cleanup (dev, dev->phy2->q_tx[i], true); + }for (i =0 ; i <ARRAY_SIZE (dev->q_mcu); i++)mt76_dma_tx_cleanup (dev, dev->q_mcu[i], true);
drivers/net/wireless/mediatek/mt76/mac80211.c +2 -5
@@ -539,14 +539,11 @@ EXPORT_SYMBOL_GPL(mt76_rx);bool mt76_has_tx_pending (struct mt76_phy *phy) { -struct mt76_dev *dev = phy->dev;struct mt76_queue *q; -int i, offset; - - offset = __MT_TXQ_MAX * (phy != &dev->phy); +int i;for (i =0 ; i < __MT_TXQ_MAX; i++) { - q = dev->q_tx[offset + i]; + q = phy->q_tx[i];if (q && q->queued)return true; }
drivers/net/wireless/mediatek/mt76/mt76.h +4 -3
@@ -561,6 +561,8 @@ struct mt76_phy {unsigned long state; +struct mt76_queue *q_tx[__MT_TXQ_MAX]; +struct cfg80211_chan_def chandef;struct ieee80211_channel *main_chan;
@@ -607,7 +609,6 @@ struct mt76_dev {struct sk_buff_head rx_skb[__MT_RXQ_MAX];struct list_head txwi_cache; -struct mt76_queue *q_tx[2 * __MT_TXQ_MAX];struct mt76_queue *q_mcu[__MT_MCUQ_MAX];struct mt76_queue q_rx[__MT_RXQ_MAX];const struct mt76_queue_ops *queue_ops;
@@ -797,7 +798,7 @@ static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx,return PTR_ERR (q); q->qid = qid; - phy->dev->q_tx[qid] = q; + phy->q_tx[qid] = q;return 0 ; }
@@ -938,7 +939,7 @@ void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb);void mt76_tx (struct mt76_phy *dev,struct ieee80211_sta *sta,struct mt76_wcid *wcid,struct sk_buff *skb);void mt76_wake_tx_queue (struct ieee80211_hw *hw,struct ieee80211_txq *txq); -void mt76_stop_tx_queues (struct mt76_dev *dev,struct ieee80211_sta *sta, +void mt76_stop_tx_queues (struct mt76_phy *phy,struct ieee80211_sta *sta,bool send_bar);void mt76_tx_check_agg_ssn (struct ieee80211_sta *sta,struct sk_buff *skb);void mt76_txq_schedule (struct mt76_phy *phy,enum mt76_txq_id qid);
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +8 -9
@@ -24,14 +24,14 @@ mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)if (!skb)return ; -mt76_tx_queue_skb (dev, mdev->q_tx[MT_TXQ_BEACON ], skb, +mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], skb, &mvif->sta.wcid,NULL );spin_lock_bh (&dev->ps_lock);mt76_wr (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY |FIELD_PREP (MT_DMA_FQCR0_TARGET_WCID , mvif->sta.wcid.idx) |FIELD_PREP (MT_DMA_FQCR0_TARGET_QID , - mdev->q_tx[MT_TXQ_CAB ]->hw_idx) | + dev->mphy.q_tx[MT_TXQ_CAB ]->hw_idx) |FIELD_PREP (MT_DMA_FQCR0_DEST_PORT_ID ,3 ) |FIELD_PREP (MT_DMA_FQCR0_DEST_QUEUE_ID ,8 ));
@@ -81,7 +81,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) data.dev = dev;__skb_queue_head_init (&data.q); - q = mdev->q_tx[MT_TXQ_BEACON ]; + q = dev->mphy.q_tx[MT_TXQ_BEACON ];spin_lock_bh (&q->lock); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev), IEEE80211_IFACE_ITER_RESUME_ALL,
@@ -92,13 +92,13 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)/* Flush all previous CAB queue packets */ mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); -mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_CAB ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_CAB ], false);mt76_csa_check (mdev);if (mdev->csa_complete) goto out; - q = mdev->q_tx[MT_TXQ_CAB ]; + q = dev->mphy.q_tx[MT_TXQ_CAB ]; do { nframes = skb_queue_len(&data.q); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
@@ -123,8 +123,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)struct ieee80211_vif *vif = info->control.vif;struct mt7603_vif *mvif = (struct mt7603_vif *)vif->drv_priv; -mt76_tx_queue_skb (dev, mdev->q_tx[MT_TXQ_CAB ], skb, - &mvif->sta.wcid,NULL ); +mt76_tx_queue_skb (dev, q, skb, &mvif->sta.wcid,NULL ); }mt76_queue_kick (dev, q);spin_unlock_bh (&q->lock);
@@ -139,8 +138,8 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) ((1 << (MT7603_MAX_INTERFACES - 1)) - 1))); out: -mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_BEACON ], false); -if (mdev->q_tx[MT_TXQ_BEACON ]->queued >hweight8 (mdev->beacon_mask)) +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], false); +if (dev->mphy.q_tx[MT_TXQ_BEACON ]->queued >hweight8 (mdev->beacon_mask)) dev->beacon_check++; }
drivers/net/wireless/mediatek/mt76/mt7603/dma.c +2 -2
@@ -133,14 +133,14 @@ static int mt7603_poll_tx(struct napi_struct *napi, int budget)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false);for (i =MT_TXQ_PSD ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], false);if (napi_complete_done (napi,0 ))mt7603_irq_enable (dev,MT_INT_TX_DONE_ALL );mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false);for (i =MT_TXQ_PSD ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], false);mt7603_mac_sta_poll (dev);
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +4 -4
@@ -445,7 +445,7 @@ void mt7603_mac_sta_poll(struct mt7603_dev *dev) sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);for (i =0 ; i <4 ; i++) { -struct mt76_queue *q = dev->mt76.q_tx[i]; +struct mt76_queue *q = dev->mphy.q_tx[i];u8 qidx = q->hw_idx;u8 tid = ac_to_tid[i];u32 txtime = airtime[qidx];
@@ -896,7 +896,7 @@ mt7603_mac_write_txwi(struct mt7603_dev *dev, __le32 *txwi,struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data;struct ieee80211_vif *vif = info->control.vif; -struct mt76_queue *q = dev->mt76.q_tx[qid]; +struct mt76_queue *q = dev->mphy.q_tx[qid];struct mt7603_vif *mvif;int wlan_idx;int hdr_len =ieee80211_get_hdrlen_from_skb (skb);
@@ -1436,7 +1436,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], true);for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
@@ -1515,7 +1515,7 @@ static bool mt7603_tx_hang(struct mt7603_dev *dev)int i;for (i =0 ; i <4 ; i++) { - q = dev->mt76.q_tx[i]; + q = dev->mphy.q_tx[i];if (!q->queued)continue ;
drivers/net/wireless/mediatek/mt76/mt7603/main.c +3 -3
@@ -383,7 +383,7 @@ mt7603_ps_tx_list(struct mt7603_dev *dev, struct sk_buff_head *list)while ((skb =__skb_dequeue (list)) !=NULL ) {int qid =skb_get_queue_mapping (skb); -mt76_tx_queue_skb_raw (dev, dev->mt76.q_tx[qid], skb,0 ); +mt76_tx_queue_skb_raw (dev, dev->mphy.q_tx[qid], skb,0 ); } }
@@ -394,7 +394,7 @@ mt7603_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps)struct mt7603_sta *msta = (struct mt7603_sta *)sta->drv_priv;struct sk_buff_head list; -mt76_stop_tx_queues (&dev->mt76, sta, true); +mt76_stop_tx_queues (&dev->mphy, sta, true);mt7603_wtbl_set_ps (dev, msta, ps);if (ps)return ;
@@ -514,7 +514,7 @@ mt7603_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,u16 cw_max = (1 <<10 ) -1 ;u32 val; - queue = dev->mt76.q_tx[queue]->hw_idx; + queue = dev->mphy.q_tx[queue]->hw_idx;if (params->cw_min) cw_min = params->cw_min;
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c +2 -2
@@ -187,7 +187,7 @@ mt7615_reset_test_set(void *data, u64 val)skb_put (skb,1 );mt7615_mutex_acquire (dev); -mt76_tx_queue_skb_raw (dev, dev->mt76.q_tx[0 ], skb,0 ); +mt76_tx_queue_skb_raw (dev, dev->mphy.q_tx[0 ], skb,0 );mt7615_mutex_release (dev);return 0 ;
@@ -336,7 +336,7 @@ mt7615_queues_read(struct seq_file *s, void *data)struct mt76_queue *q;char *queue; } queue_map[] = { - { dev->mt76.q_tx[MT_TXQ_BE], "PDMA0" }, + { dev->mphy.q_tx[MT_TXQ_BE], "PDMA0" }, { dev->mt76.q_mcu[MT_MCUQ_WM], "MCUQ" }, { dev->mt76.q_mcu[MT_MCUQ_FWDL], "MCUFWQ" }, };
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +1 -1
@@ -60,7 +60,7 @@ mt7615_init_tx_queues(struct mt7615_dev *dev)return ret;for (i =1 ; i <=MT_TXQ_PSD ; i++) - dev->mt76.q_tx[i] = dev->mt76.q_tx[0 ]; + dev->mphy.q_tx[i] = dev->mphy.q_tx[0 ];return mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_WM ,MT7615_TXQ_MCU ,MT7615_TX_MCU_RING_SIZE ,MT_TX_RING_BASE );
drivers/net/wireless/mediatek/mt76/mt7615/init.c +5 -1
@@ -385,7 +385,7 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev) {struct mt7615_phy *phy =mt7615_ext_phy (dev);struct mt76_phy *mphy; -int ret; +int i, ret;if (!is_mt7615 (&dev->mt76))return -EOPNOTSUPP ;
@@ -429,6 +429,10 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev) mphy->sband_2g.sband.n_channels =0 ; mphy->hw->wiphy->bands[NL80211_BAND_2GHZ ] =NULL ; +/* mt7615 second phy shares the same hw queues with the primary one */ +for (i =0 ; i <=MT_TXQ_PSD ; i++) + mphy->q_tx[i] = dev->mphy.q_tx[i]; + ret =mt76_register_phy (mphy);if (ret)ieee80211_free_hw (mphy->hw);
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +4 -4
@@ -1435,12 +1435,12 @@ static void mt7615_mac_tx_free(struct mt7615_dev *dev, struct sk_buff *skb)struct mt7615_tx_free *free = (struct mt7615_tx_free *)skb->data;u8 i, count; -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_PSD ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_PSD ], false);if (is_mt7615 (&dev->mt76)) { -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_BE ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BE ], false); }else {for (i =0 ; i <IEEE80211_NUM_ACS ; i++) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], false); } count =FIELD_GET (MT_TX_FREE_MSDU_ID_CNT ,le16_to_cpu (free->ctrl));
@@ -2046,7 +2046,7 @@ void mt7615_dma_reset(struct mt7615_dev *dev)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], true);for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c +1 -1
@@ -287,7 +287,7 @@ void mt7663s_txrx_worker(struct mt76_worker *w)/* tx */ for (i =0 ; i <=MT_TXQ_PSD ; i++) { - ret =mt7663s_tx_run_queue (dev, dev->q_tx[i]); + ret =mt7663s_tx_run_queue (dev, dev->phy.q_tx[i]);if (ret >0 ) nframes += ret; }
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +7 -8
@@ -15,7 +15,7 @@ static void mt76x02_pre_tbtt_tasklet(struct tasklet_struct *t) {struct mt76x02_dev *dev =from_tasklet (dev, t, mt76.pre_tbtt_tasklet);struct mt76_dev *mdev = &dev->mt76; -struct mt76_queue *q = mdev->q_tx[MT_TXQ_PSD ]; +struct mt76_queue *q = dev->mphy.q_tx[MT_TXQ_PSD ];struct beacon_bc_data data = {};struct sk_buff *skb;int i;
@@ -59,8 +59,7 @@ static void mt76x02_pre_tbtt_tasklet(struct tasklet_struct *t)struct ieee80211_vif *vif = info->control.vif;struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv; -mt76_tx_queue_skb (dev, mdev->q_tx[MT_TXQ_PSD ], skb, - &mvif->group_wcid,NULL ); +mt76_tx_queue_skb (dev, q, skb, &mvif->group_wcid,NULL ); }spin_unlock_bh (&q->lock); }
@@ -151,14 +150,14 @@ static int mt76x02_poll_tx(struct napi_struct *napi, int budget)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false);for (i =MT_TXQ_PSD ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], false);if (napi_complete_done (napi,0 ))mt76x02_irq_enable (dev,MT_INT_TX_DONE_ALL );mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false);for (i =MT_TXQ_PSD ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], false);mt76_worker_schedule (&dev->mt76.tx_worker);
@@ -282,7 +281,7 @@ irqreturn_t mt76x02_irq_handler(int irq, void *dev_instance)if (dev->mt76.csa_complete)mt76_csa_finish (&dev->mt76);else -mt76_queue_kick (dev, dev->mt76.q_tx[MT_TXQ_PSD ]); +mt76_queue_kick (dev, dev->mphy.q_tx[MT_TXQ_PSD ]); }if (intr &MT_INT_TX_STAT )
@@ -347,7 +346,7 @@ static bool mt76x02_tx_hang(struct mt76x02_dev *dev)int i;for (i =0 ; i <4 ; i++) { - q = dev->mt76.q_tx[i]; + q = dev->mphy.q_tx[i];if (!q->queued)continue ;
@@ -467,7 +466,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], true);for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +1 -1
@@ -67,7 +67,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data, struct mt76_tx_info *tx_info) { struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76); -int pid, len = tx_info->skb->len, ep =q2ep (mdev->q_tx[qid]->hw_idx); +int pid, len = tx_info->skb->len, ep =q2ep (dev->mphy.q_tx[qid]->hw_idx);struct mt76x02_txwi *txwi;bool ampdu =IEEE80211_SKB_CB (tx_info->skb)->flags &IEEE80211_TX_CTL_AMPDU ;enum mt76_qsel qsel;
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +2 -2
@@ -488,7 +488,7 @@ int mt76x02_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,u8 cw_min =5 , cw_max =10 , qid;u32 val; - qid = dev->mt76.q_tx[queue]->hw_idx; + qid = dev->mphy.q_tx[queue]->hw_idx;if (params->cw_min) cw_min =fls (params->cw_min);
@@ -622,7 +622,7 @@ void mt76x02_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta,struct mt76x02_sta *msta = (struct mt76x02_sta *)sta->drv_priv;int idx = msta->wcid.idx; -mt76_stop_tx_queues (&dev->mt76, sta, true); +mt76_stop_tx_queues (&dev->mphy, sta, true);if (mt76_is_mmio (mdev))mt76x02_mac_wcid_set_drop (dev, idx, ps); }
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +1 -1
@@ -284,7 +284,7 @@ mt7915_queues_read(struct seq_file *s, void *data)struct mt76_queue *q;char *queue; } queue_map[] = { - { dev->mt76.q_tx[MT_TXQ_BE], "WFDMA0" }, + { dev->mphy.q_tx[MT_TXQ_BE], "WFDMA0" }, { dev->mt76.q_mcu[MT_MCUQ_WM], "MCUWM" }, { dev->mt76.q_mcu[MT_MCUQ_WA], "MCUWA" }, { dev->mt76.q_mcu[MT_MCUQ_FWDL], "MCUFWQ" },
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +4 -4
@@ -6,16 +6,16 @@#include "mac.h" static int -mt7915_init_tx_queues (struct mt7915_dev *dev,int idx,int n_desc) +mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc) {int i, err; - err =mt76_init_tx_queue (&dev->mphy,0 , idx, n_desc,MT_TX_RING_BASE ); + err =mt76_init_tx_queue (phy->mt76,0 , idx, n_desc,MT_TX_RING_BASE );if (err <0 )return err;for (i =0 ; i <=MT_TXQ_PSD ; i++) - dev->mt76.q_tx[i] = dev->mt76.q_tx[0 ]; + phy->mt76->q_tx[i] = phy->mt76->q_tx[0 ];return 0 ; }
@@ -237,7 +237,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)mt76_wr (dev,MT_WFDMA1_PRI_DLY_INT_CFG0 ,0 );/* init tx queue */ - ret =mt7915_init_tx_queues (dev,MT7915_TXQ_BAND0 , + ret =mt7915_init_tx_queues (&dev->phy,MT7915_TXQ_BAND0 ,MT7915_TX_RING_SIZE );if (ret)return ret;
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +6 -5
@@ -1084,8 +1084,8 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)u8 i, count;/* clean DMA queues and unmap buffers first */ -mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_PSD ], false); -mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_BE ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_PSD ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BE ], false);/* * TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE,
@@ -1422,8 +1422,9 @@ mt7915_update_beacons(struct mt7915_dev *dev) }static void -mt7915_dma_reset (struct mt7915_dev *dev) +mt7915_dma_reset (struct mt7915_phy *phy) { +struct mt7915_dev *dev = phy->dev;int i; mt76_clear(dev, MT_WFDMA0_GLO_CFG,
@@ -1434,7 +1435,7 @@ mt7915_dma_reset(struct mt7915_dev *dev)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WA ], true);for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true); +mt76_queue_tx_cleanup (dev, phy->mt76->q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
@@ -1490,7 +1491,7 @@ void mt7915_mac_reset_work(struct work_struct *work)mt76_wr (dev,MT_MCU_INT_EVENT ,MT_MCU_INT_EVENT_DMA_STOPPED );if (mt7915_wait_reset_state (dev,MT_MCU_CMD_RESET_DONE )) { -mt7915_dma_reset (dev); +mt7915_dma_reset (&dev->phy);mt76_wr (dev,MT_MCU_INT_EVENT ,MT_MCU_INT_EVENT_DMA_INIT );mt7915_wait_reset_state (dev,MT_MCU_CMD_RECOVERY_DONE );
drivers/net/wireless/mediatek/mt76/sdio.c +3 -2
@@ -67,7 +67,7 @@ static int mt76s_alloc_tx(struct mt76_dev *dev)return PTR_ERR (q); q->qid = i; - dev->q_tx[i] = q; + dev->phy.q_tx[i] = q; } q =mt76s_alloc_tx_queue (dev);
@@ -206,7 +206,8 @@ static void mt76s_status_worker(struct mt76_worker *w) nframes =mt76s_process_tx_queue (dev, dev->q_mcu[MT_MCUQ_WM ]);for (i =0 ; i <=MT_TXQ_PSD ; i++) - nframes +=mt76s_process_tx_queue (dev, dev->q_tx[i]); + nframes +=mt76s_process_tx_queue (dev, + dev->phy.q_tx[i]);if (dev->drv->tx_status_data && !test_and_set_bit (MT76_READING_STATS , &dev->phy.state))
drivers/net/wireless/mediatek/mt76/testmode.c +2 -1
@@ -23,6 +23,7 @@ void mt76_testmode_tx_pending(struct mt76_dev *dev) {struct mt76_testmode_data *td = &dev->test;struct mt76_wcid *wcid = &dev->global_wcid; +struct mt76_phy *phy = &dev->phy;struct sk_buff *skb = td->tx_skb;struct mt76_queue *q;int qid;
@@ -31,7 +32,7 @@ void mt76_testmode_tx_pending(struct mt76_dev *dev)return ; qid =skb_get_queue_mapping (skb); - q = dev->q_tx[qid]; + q = phy->q_tx[qid];spin_lock_bh (&q->lock);
drivers/net/wireless/mediatek/mt76/tx.c +6 -7
@@ -230,8 +230,8 @@ __mt76_tx_queue_skb(struct mt76_phy *phy, int qid, struct sk_buff *skb, bool *stop) {struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb); +struct mt76_queue *q = phy->q_tx[qid];struct mt76_dev *dev = phy->dev; -struct mt76_queue *q = dev->q_tx[qid];bool non_aql;int pending;int idx;
@@ -286,7 +286,7 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,if (ext_phy) info->hw_queue |=MT_TX_HW_QUEUE_EXT_PHY ; - q = dev->q_tx[qid]; + q = phy->q_tx[qid];spin_lock_bh (&q->lock);__mt76_tx_queue_skb (phy, qid, skb, wcid, sta,NULL );
@@ -345,7 +345,7 @@ mt76_release_buffered_frames(struct ieee80211_hw *hw, struct ieee80211_sta *sta,struct mt76_phy *phy = hw->priv;struct mt76_dev *dev = phy->dev;struct sk_buff *last_skb =NULL ; -struct mt76_queue *hwq = dev->q_tx[MT_TXQ_PSD ]; +struct mt76_queue *hwq = phy->q_tx[MT_TXQ_PSD ];int i;spin_lock_bh (&hwq->lock);
@@ -449,8 +449,7 @@ mt76_txq_send_burst(struct mt76_phy *phy, struct mt76_queue *q,static int mt76_txq_schedule_list (struct mt76_phy *phy,enum mt76_txq_id qid) { -struct mt76_dev *dev = phy->dev; -struct mt76_queue *q = dev->q_tx[qid]; +struct mt76_queue *q = phy->q_tx[qid];struct ieee80211_txq *txq;struct mt76_txq *mtxq;struct mt76_wcid *wcid;
@@ -539,7 +538,7 @@ void mt76_tx_worker(struct mt76_worker *w)#endif } -void mt76_stop_tx_queues (struct mt76_dev *dev,struct ieee80211_sta *sta, +void mt76_stop_tx_queues (struct mt76_phy *phy,struct ieee80211_sta *sta,bool send_bar) {int i;
@@ -552,7 +551,7 @@ void mt76_stop_tx_queues(struct mt76_dev *dev, struct ieee80211_sta *sta,if (!txq)continue ; - hwq = dev->q_tx[mt76_txq_get_qid (txq)]; + hwq = phy->q_tx[mt76_txq_get_qid (txq)]; mtxq = (struct mt76_txq *)txq->drv_priv;spin_lock_bh (&hwq->lock);
drivers/net/wireless/mediatek/mt76/usb.c +6 -6
@@ -815,7 +815,7 @@ static void mt76u_status_worker(struct mt76_worker *w)int i;for (i =0 ; i <IEEE80211_NUM_ACS ; i++) { - q = dev->q_tx[i]; + q = dev->phy.q_tx[i];while (q->queued >0 ) {if (!q->entry[q->tail].done)
@@ -983,7 +983,7 @@ static int mt76u_alloc_tx(struct mt76_dev *dev)for (i =0 ; i <=MT_TXQ_PSD ; i++) {if (i >=IEEE80211_NUM_ACS ) { - dev->q_tx[i] = dev->q_tx[0 ]; + dev->phy.q_tx[i] = dev->phy.q_tx[0 ];continue ; }
@@ -995,7 +995,7 @@ static int mt76u_alloc_tx(struct mt76_dev *dev) q->hw_idx =mt76u_ac_to_hwq (dev, i); q->qid = i; - dev->q_tx[i] = q; + dev->phy.q_tx[i] = q; q->entry = devm_kcalloc(dev->dev, MT_NUM_TX_ENTRIES, sizeof(*q->entry),
@@ -1024,7 +1024,7 @@ static void mt76u_free_tx(struct mt76_dev *dev)struct mt76_queue *q;int j; - q = dev->q_tx[i]; + q = dev->phy.q_tx[i];if (!q)continue ;
@@ -1052,7 +1052,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)dev_err (dev->dev,"timed out waiting for pending tx\n" );for (i =0 ; i <IEEE80211_NUM_ACS ; i++) { - q = dev->q_tx[i]; + q = dev->phy.q_tx[i];if (!q)continue ;
@@ -1064,7 +1064,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)* will fail to submit urb, cleanup those skb's manually. */ for (i =0 ; i <IEEE80211_NUM_ACS ; i++) { - q = dev->q_tx[i]; + q = dev->phy.q_tx[i];if (!q)continue ;
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 7/10 mt76: introduce mt76_init_mcu_queue utility routine
In reply to Lorenzo BianconiIntroduce mt76_init_mcu_queue utility routine in order to allocate dedicate q_mcu pointers for mcu hw queues. This is a preliminary patch to move data queues in mt76_phy and add dbdc support to mt7915 driver
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 16 ++++---- drivers/net/wireless/mediatek/mt76/mt76.h | 39 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7603/dma.c | 2 +- .../net/wireless/mediatek/mt76/mt7615/dma.c | 12 +++--- .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 2 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 8 ++-- 6 files changed, 56 insertions(+), 23 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +7 -9
@@ -1214,23 +1214,21 @@ int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) }EXPORT_SYMBOL_GPL (mt76_get_antenna); -int mt76_init_tx_queue (struct mt76_dev *dev,int qid,int idx, -int n_desc,int ring_base) +struct mt76_queue * +mt76_init_queue (struct mt76_dev *dev,int qid,int idx,int n_desc, +int ring_base) {struct mt76_queue *hwq;int err; hwq =devm_kzalloc (dev->dev,sizeof (*hwq),GFP_KERNEL );if (!hwq) -return -ENOMEM ; +return ERR_PTR (-ENOMEM ); err = dev->queue_ops->alloc (dev, hwq, idx, n_desc,0 , ring_base);if (err <0 ) -return err; - - hwq->qid = qid; - dev->q_tx[qid] = hwq; +return ERR_PTR (err); -return 0 ; +return hwq; } -EXPORT_SYMBOL_GPL (mt76_init_tx_queue); +EXPORT_SYMBOL_GPL (mt76_init_queue);
drivers/net/wireless/mediatek/mt76/mt76.h +37 -2
@@ -72,6 +72,10 @@ enum mt76_txq_id {__MT_TXQ_MAX }; +enum mt76_mcuq_id { + __MT_MCUQ_MAX +}; +enum mt76_rxq_id {MT_RXQ_MAIN ,MT_RXQ_MCU ,
@@ -604,6 +608,7 @@ struct mt76_dev {struct list_head txwi_cache;struct mt76_queue *q_tx[2 * __MT_TXQ_MAX]; +struct mt76_queue *q_mcu[__MT_MCUQ_MAX];struct mt76_queue q_rx[__MT_RXQ_MAX];const struct mt76_queue_ops *queue_ops;int tx_dma_idx[4 ];
@@ -779,8 +784,38 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str,int mt76_eeprom_init (struct mt76_dev *dev,int len);void mt76_eeprom_override (struct mt76_dev *dev); -int mt76_init_tx_queue (struct mt76_dev *dev,int qid,int idx, -int n_desc,int ring_base); +struct mt76_queue * +mt76_init_queue (struct mt76_dev *dev,int qid,int idx,int n_desc, +int ring_base); +static inline int mt76_init_tx_queue (struct mt76_phy *phy,int qid,int idx, +int n_desc,int ring_base) +{ +struct mt76_queue *q; + + q =mt76_init_queue (phy->dev, qid, idx, n_desc, ring_base); +if (IS_ERR (q)) +return PTR_ERR (q); + + q->qid = qid; + phy->dev->q_tx[qid] = q; + +return 0 ; +} + +static inline int mt76_init_mcu_queue (struct mt76_dev *dev,int qid,int idx, +int n_desc,int ring_base) +{ +struct mt76_queue *q; + + q =mt76_init_queue (dev, qid, idx, n_desc, ring_base); +if (IS_ERR (q)) +return PTR_ERR (q); + + q->qid = qid; + dev->q_mcu[qid] = q; + +return 0 ; +}static inline struct mt76_phy *mt76_dev_phy (struct mt76_dev *dev,bool phy_ext)
drivers/net/wireless/mediatek/mt76/mt7603/dma.c +1 -1
@@ -9,7 +9,7 @@ mt7603_init_tx_queue(struct mt7603_dev *dev, int qid, int idx, int n_desc) {int err; - err =mt76_init_tx_queue (&dev->mt76, qid, idx, n_desc, + err =mt76_init_tx_queue (&dev->mphy, qid, idx, n_desc,MT_TX_RING_BASE );if (err <0 )return err;
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +6 -6
@@ -24,20 +24,20 @@ mt7622_init_tx_queues_multi(struct mt7615_dev *dev)int i;for (i =0 ; i <ARRAY_SIZE (wmm_queue_map); i++) { - ret =mt76_init_tx_queue (&dev->mt76, i, wmm_queue_map[i], + ret =mt76_init_tx_queue (&dev->mphy, i, wmm_queue_map[i],MT7615_TX_RING_SIZE /2 ,MT_TX_RING_BASE );if (ret)return ret; } - ret =mt76_init_tx_queue (&dev->mt76,MT_TXQ_PSD ,MT7622_TXQ_MGMT , + ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_PSD ,MT7622_TXQ_MGMT ,MT7615_TX_MGMT_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret; -return mt76_init_tx_queue (&dev->mt76,MT_TXQ_MCU ,MT7622_TXQ_MCU , +return mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU ,MT7622_TXQ_MCU ,MT7615_TX_MCU_RING_SIZE ,MT_TX_RING_BASE ); }
@@ -47,7 +47,7 @@ mt7615_init_tx_queues(struct mt7615_dev *dev) {int ret, i; - ret =mt76_init_tx_queue (&dev->mt76,MT_TXQ_FWDL ,MT7615_TXQ_FWDL , + ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_FWDL ,MT7615_TXQ_FWDL ,MT7615_TX_FWDL_RING_SIZE ,MT_TX_RING_BASE );if (ret)
@@ -56,7 +56,7 @@ mt7615_init_tx_queues(struct mt7615_dev *dev)if (!is_mt7615 (&dev->mt76))return mt7622_init_tx_queues_multi (dev); - ret =mt76_init_tx_queue (&dev->mt76,0 ,0 ,MT7615_TX_RING_SIZE , + ret =mt76_init_tx_queue (&dev->mphy,0 ,0 ,MT7615_TX_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;
@@ -64,7 +64,7 @@ mt7615_init_tx_queues(struct mt7615_dev *dev)for (i =1 ; i <MT_TXQ_MCU ; i++) dev->mt76.q_tx[i] = dev->mt76.q_tx[0 ]; -return mt76_init_tx_queue (&dev->mt76,MT_TXQ_MCU ,MT7615_TXQ_MCU , +return mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU ,MT7615_TXQ_MCU ,MT7615_TX_MCU_RING_SIZE ,MT_TX_RING_BASE ); }
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +1 -1
@@ -109,7 +109,7 @@ mt76x02_init_tx_queue(struct mt76x02_dev *dev, int qid, int idx, int n_desc) {int err; - err =mt76_init_tx_queue (&dev->mt76, qid, idx, n_desc, + err =mt76_init_tx_queue (&dev->mphy, qid, idx, n_desc,MT_TX_RING_BASE );if (err <0 )return err;
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +4 -4
@@ -10,7 +10,7 @@ mt7915_init_tx_queues(struct mt7915_dev *dev, int idx, int n_desc) {int i, err; - err =mt76_init_tx_queue (&dev->mt76,0 , idx, n_desc,MT_TX_RING_BASE ); + err =mt76_init_tx_queue (&dev->mphy,0 , idx, n_desc,MT_TX_RING_BASE );if (err <0 )return err;
@@ -243,19 +243,19 @@ int mt7915_dma_init(struct mt7915_dev *dev)return ret;/* command to WM */ - ret =mt76_init_tx_queue (&dev->mt76,MT_TXQ_MCU ,MT7915_TXQ_MCU_WM , + ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU ,MT7915_TXQ_MCU_WM ,MT7915_TX_MCU_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;/* command to WA */ - ret =mt76_init_tx_queue (&dev->mt76,MT_TXQ_MCU_WA ,MT7915_TXQ_MCU_WA , + ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU_WA ,MT7915_TXQ_MCU_WA ,MT7915_TX_MCU_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;/* firmware download */ - ret =mt76_init_tx_queue (&dev->mt76,MT_TXQ_FWDL ,MT7915_TXQ_FWDL , + ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_FWDL ,MT7915_TXQ_FWDL ,MT7915_TX_FWDL_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 8/10 mt76: rely on mt76_queue in tx_queue_skb_raw signature
In reply to Lorenzo BianconiThis is a preliminary patch to move data queues in mt76_phy and properly support dbdc
--- drivers/net/wireless/mediatek/mt76/dma.c | 3 +-- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- drivers/net/wireless/mediatek/mt76/mt7603/main.c | 8 +++++--- drivers/net/wireless/mediatek/mt76/mt7603/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/sdio.c | 3 +-- 10 files changed, 14 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +1 -2
@@ -313,10 +313,9 @@ mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush, }static int -mt76_dma_tx_queue_skb_raw (struct mt76_dev *dev,enum mt76_txq_id qid, +mt76_dma_tx_queue_skb_raw (struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,u32 tx_info) { -struct mt76_queue *q = dev->q_tx[qid];struct mt76_queue_buf buf;dma_addr_t addr;
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
@@ -175,7 +175,7 @@ struct mt76_queue_ops { struct sk_buff *skb, struct mt76_wcid *wcid, struct ieee80211_sta *sta); -int (*tx_queue_skb_raw)(struct mt76_dev *dev,enum mt76_txq_id qid, +int (*tx_queue_skb_raw)(struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,u32 tx_info); void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
drivers/net/wireless/mediatek/mt76/mt7603/main.c +5 -3
@@ -380,9 +380,11 @@ mt7603_ps_tx_list(struct mt7603_dev *dev, struct sk_buff_head *list) {struct sk_buff *skb; -while ((skb =__skb_dequeue (list)) !=NULL ) -mt76_tx_queue_skb_raw (dev,skb_get_queue_mapping (skb), - skb,0 ); +while ((skb =__skb_dequeue (list)) !=NULL ) { +int qid =skb_get_queue_mapping (skb); + +mt76_tx_queue_skb_raw (dev, dev->mt76.q_tx[qid], skb,0 ); + } }void
drivers/net/wireless/mediatek/mt76/mt7603/mcu.c +1 -1
@@ -73,7 +73,7 @@ mt7603_mcu_skb_send_msg(struct mt76_dev *mdev, struct sk_buff *skb,if (wait_seq) *wait_seq = seq; -return mt76_tx_queue_skb_raw (dev,MT_TXQ_MCU , skb,0 ); +return mt76_tx_queue_skb_raw (dev, mdev->q_tx[MT_TXQ_MCU ], skb,0 ); } static int
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c +1 -1
@@ -187,7 +187,7 @@ mt7615_reset_test_set(void *data, u64 val)skb_put (skb,1 );mt7615_mutex_acquire (dev); -mt76_tx_queue_skb_raw (dev,0 , skb,0 ); +mt76_tx_queue_skb_raw (dev, dev->mt76.q_tx[0 ], skb,0 );mt7615_mutex_release (dev);return 0 ;
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +1 -1
@@ -239,7 +239,7 @@ mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,else qid =MT_TXQ_FWDL ; -return mt76_tx_queue_skb_raw (dev, qid, skb,0 ); +return mt76_tx_queue_skb_raw (dev, dev->mt76.q_tx[qid], skb,0 ); }u32 mt7615_rf_rr (struct mt7615_dev *dev,u32 wf,u32 reg)
drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c +1 -1
@@ -42,7 +42,7 @@ mt7663s_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,int ret;mt7615_mcu_fill_msg (dev, skb, cmd, seq); - ret =mt76_tx_queue_skb_raw (dev,MT_TXQ_MCU , skb,0 ); + ret =mt76_tx_queue_skb_raw (dev, mdev->q_tx[MT_TXQ_MCU ], skb,0 );if (ret)return ret;
drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c +1 -1
@@ -61,7 +61,7 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,FIELD_PREP (MT_MCU_MSG_PORT ,CPU_TX_PORT ) |FIELD_PREP (MT_MCU_MSG_LEN , skb->len); - ret =mt76_tx_queue_skb_raw (dev,MT_TXQ_MCU , skb, tx_info); + ret =mt76_tx_queue_skb_raw (dev, mdev->q_tx[MT_TXQ_MCU ], skb, tx_info);if (ret) goto out;
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +1 -1
@@ -326,7 +326,7 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,if (wait_seq) *wait_seq = seq; -return mt76_tx_queue_skb_raw (dev, txq, skb,0 ); +return mt76_tx_queue_skb_raw (dev, mdev->q_tx[txq], skb,0 ); } static void
drivers/net/wireless/mediatek/mt76/sdio.c +1 -2
@@ -266,10 +266,9 @@ mt76s_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, }static int -mt76s_tx_queue_skb_raw (struct mt76_dev *dev,enum mt76_txq_id qid, +mt76s_tx_queue_skb_raw (struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,u32 tx_info) { -struct mt76_queue *q = dev->q_tx[qid];int ret = -ENOSPC , len = skb->len, pad;if (q->queued == q->ndesc)
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 9/10 mt76: move mcu queues to mt76_dev q_mcu array
In reply to Lorenzo BianconiMove mcu queue to a dedicated array q_mcu in mt76_dev structure. This is a preliminary patch to move data queues in mt76_phy and properly support dbdc
--- drivers/net/wireless/mediatek/mt76/dma.c | 4 ++ drivers/net/wireless/mediatek/mt76/mcu.c | 3 +- drivers/net/wireless/mediatek/mt76/mt76.h | 8 +-- .../net/wireless/mediatek/mt76/mt7603/dma.c | 51 +++++++++---------- .../net/wireless/mediatek/mt76/mt7603/mac.c | 1 + .../net/wireless/mediatek/mt76/mt7603/mcu.c | 2 +- .../wireless/mediatek/mt76/mt7615/debugfs.c | 15 +++--- .../net/wireless/mediatek/mt76/mt7615/dma.c | 19 +++---- .../net/wireless/mediatek/mt76/mt7615/mac.c | 1 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 8 +-- .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 +- .../wireless/mediatek/mt76/mt7615/sdio_mcu.c | 4 +- .../wireless/mediatek/mt76/mt7615/sdio_txrx.c | 7 ++- .../net/wireless/mediatek/mt76/mt76x02_mcu.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 43 ++++++++-------- .../wireless/mediatek/mt76/mt7915/debugfs.c | 17 +++---- .../net/wireless/mediatek/mt76/mt7915/dma.c | 18 +++---- .../net/wireless/mediatek/mt76/mt7915/mac.c | 1 + .../net/wireless/mediatek/mt76/mt7915/mcu.c | 10 ++-- drivers/net/wireless/mediatek/mt76/sdio.c | 11 ++-- 20 files changed, 112 insertions(+), 115 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +4 -0
@@ -660,9 +660,13 @@ void mt76_dma_cleanup(struct mt76_dev *dev)mt76_worker_disable (&dev->tx_worker);netif_napi_del (&dev->tx_napi); +for (i =0 ; i <ARRAY_SIZE (dev->q_tx); i++)mt76_dma_tx_cleanup (dev, dev->q_tx[i], true); +for (i =0 ; i <ARRAY_SIZE (dev->q_mcu); i++) +mt76_dma_tx_cleanup (dev, dev->q_mcu[i], true); +mt76_for_each_q_rx (dev, i) {netif_napi_del (&dev->napi[i]);mt76_dma_rx_cleanup (dev, &dev->q_rx[i]);
drivers/net/wireless/mediatek/mt76/mcu.c +2 -1
@@ -122,7 +122,8 @@ int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, len -= cur_len;if (dev->queue_ops->tx_cleanup) - dev->queue_ops->tx_cleanup (dev, dev->q_tx[MT_TXQ_FWDL ], + dev->queue_ops->tx_cleanup (dev, + dev->q_mcu[MT_MCUQ_FWDL ], false); }
drivers/net/wireless/mediatek/mt76/mt76.h +4 -4
@@ -64,15 +64,15 @@ enum mt76_txq_id {MT_TXQ_BE =IEEE80211_AC_BE ,MT_TXQ_BK =IEEE80211_AC_BK ,MT_TXQ_PSD , -MT_TXQ_MCU , -MT_TXQ_MCU_WA ,MT_TXQ_BEACON ,MT_TXQ_CAB , -MT_TXQ_FWDL , __MT_TXQ_MAX };enum mt76_mcuq_id { +MT_MCUQ_WM , +MT_MCUQ_WA , +MT_MCUQ_FWDL , __MT_MCUQ_MAX };
@@ -811,7 +811,7 @@ static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx,if (IS_ERR (q))return PTR_ERR (q); - q->qid = qid; + q->qid = __MT_TXQ_MAX + qid; dev->q_mcu[qid] = q;return 0 ;
drivers/net/wireless/mediatek/mt76/mt7603/dma.c +24 -27
90 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +1 -0
@@ -1434,6 +1434,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt7603_pse_client_reset (dev); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], true);for (i =0 ; i < __MT_TXQ_MAX; i++)mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);
drivers/net/wireless/mediatek/mt76/mt7603/mcu.c +1 -1
@@ -73,7 +73,7 @@ mt7603_mcu_skb_send_msg(struct mt76_dev *mdev, struct sk_buff *skb,if (wait_seq) *wait_seq = seq; -return mt76_tx_queue_skb_raw (dev, mdev->q_tx[MT_TXQ_MCU ], skb,0 ); +return mt76_tx_queue_skb_raw (dev, mdev->q_mcu[MT_MCUQ_WM ], skb,0 ); } static int
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c +6 -9
@@ -332,21 +332,18 @@ static int mt7615_queues_read(struct seq_file *s, void *data) { struct mt7615_dev *dev = dev_get_drvdata(s->private); -static const struct { +struct { +struct mt76_queue *q;char *queue; -int id; } queue_map[] = { - {"PDMA0" ,MT_TXQ_BE }, - {"MCUQ" ,MT_TXQ_MCU }, - {"MCUFWQ" ,MT_TXQ_FWDL }, + { dev->mt76.q_tx[MT_TXQ_BE ],"PDMA0" }, + { dev->mt76.q_mcu[MT_MCUQ_WM ],"MCUQ" }, + { dev->mt76.q_mcu[MT_MCUQ_FWDL ],"MCUFWQ" }, };int i;for (i =0 ; i <ARRAY_SIZE (queue_map); i++) { -struct mt76_queue *q = dev->mt76.q_tx[queue_map[i].id]; - -if (!q) -continue ; +struct mt76_queue *q = queue_map[i].q; seq_printf(s, "%s: queued=%d head=%d tail=%d\n",
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +8 -11
@@ -37,9 +37,8 @@ mt7622_init_tx_queues_multi(struct mt7615_dev *dev)if (ret)return ret; -return mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU ,MT7622_TXQ_MCU , -MT7615_TX_MCU_RING_SIZE , -MT_TX_RING_BASE ); +return mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_WM ,MT7622_TXQ_MCU , +MT7615_TX_MCU_RING_SIZE ,MT_TX_RING_BASE ); } static int
@@ -47,9 +46,8 @@ mt7615_init_tx_queues(struct mt7615_dev *dev) {int ret, i; - ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_FWDL ,MT7615_TXQ_FWDL , -MT7615_TX_FWDL_RING_SIZE , -MT_TX_RING_BASE ); + ret =mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_FWDL ,MT7615_TXQ_FWDL , +MT7615_TX_FWDL_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;
@@ -61,12 +59,11 @@ mt7615_init_tx_queues(struct mt7615_dev *dev)if (ret)return ret; -for (i =1 ; i <MT_TXQ_MCU ; i++) +for (i =1 ; i <=MT_TXQ_PSD ; i++) dev->mt76.q_tx[i] = dev->mt76.q_tx[0 ]; -return mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU ,MT7615_TXQ_MCU , -MT7615_TX_MCU_RING_SIZE , -MT_TX_RING_BASE ); +return mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_WM ,MT7615_TXQ_MCU , +MT7615_TX_MCU_RING_SIZE ,MT_TX_RING_BASE ); }static int mt7615_poll_tx (struct napi_struct *napi,int budget)
@@ -75,7 +72,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget) dev = container_of(napi, struct mt7615_dev, mt76.tx_napi); -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_MCU ], false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false);if (napi_complete_done (napi,0 ))mt7615_irq_enable (dev,mt7615_tx_mcu_int_mask (dev));
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +1 -0
@@ -2044,6 +2044,7 @@ void mt7615_dma_reset(struct mt7615_dev *dev) MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE);usleep_range (1000 ,2000 ); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], true);for (i =0 ; i < __MT_TXQ_MAX; i++)mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +4 -4
@@ -235,11 +235,11 @@ mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,mt7615_mcu_fill_msg (dev, skb, cmd, seq);if (test_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state)) - qid =MT_TXQ_MCU ; + qid =MT_MCUQ_WM ;else - qid =MT_TXQ_FWDL ; + qid =MT_MCUQ_FWDL ; -return mt76_tx_queue_skb_raw (dev, dev->mt76.q_tx[qid], skb,0 ); +return mt76_tx_queue_skb_raw (dev, dev->mt76.q_mcu[qid], skb,0 ); }u32 mt7615_rf_rr (struct mt7615_dev *dev,u32 wf,u32 reg)
@@ -2464,7 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)if (ret)return ret; -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_FWDL ], false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_FWDL ], false);dev_dbg (dev->mt76.dev,"Firmware init done\n" );set_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state);mt7615_mcu_fw_log_2_host (dev,0 );
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +1 -1
@@ -516,7 +516,7 @@ static inline u8 mt7615_lmac_mapping(struct mt7615_dev *dev, u8 ac)static inline u32 mt7615_tx_mcu_int_mask (struct mt7615_dev *dev) { -return MT_INT_TX_DONE (dev->mt76.q_tx[MT_TXQ_MCU ]->hw_idx); +return MT_INT_TX_DONE (dev->mt76.q_mcu[MT_MCUQ_WM ]->hw_idx); }void mt7615_dma_reset (struct mt7615_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c +2 -2
@@ -42,11 +42,11 @@ mt7663s_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,int ret;mt7615_mcu_fill_msg (dev, skb, cmd, seq); - ret =mt76_tx_queue_skb_raw (dev, mdev->q_tx[MT_TXQ_MCU ], skb,0 ); + ret =mt76_tx_queue_skb_raw (dev, mdev->q_mcu[MT_MCUQ_WM ], skb,0 );if (ret)return ret; -mt76_queue_kick (dev, mdev->q_tx[MT_TXQ_MCU ]); +mt76_queue_kick (dev, mdev->q_mcu[MT_MCUQ_WM ]);return ret; }
drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c +5 -2
@@ -217,7 +217,7 @@ static int __mt7663s_xmit_queue(struct mt76_dev *dev, u8 *data, int len)static int mt7663s_tx_run_queue (struct mt76_dev *dev,struct mt76_queue *q) {int qid, err, nframes =0 , len =0 , pse_sz =0 , ple_sz =0 ; -bool mcu = q == dev->q_tx[MT_TXQ_MCU ]; +bool mcu = q == dev->q_mcu[MT_MCUQ_WM ];struct mt76_sdio *sdio = &dev->sdio; qid = mcu ?ARRAY_SIZE (sdio->xmit_buf) -1 : q->qid;
@@ -286,11 +286,14 @@ void mt7663s_txrx_worker(struct mt76_worker *w) nframes =0 ;/* tx */ -for (i =0 ; i <MT_TXQ_MCU_WA ; i++) { +for (i =0 ; i <=MT_TXQ_PSD ; i++) { ret =mt7663s_tx_run_queue (dev, dev->q_tx[i]);if (ret >0 ) nframes += ret; } + ret =mt7663s_tx_run_queue (dev, dev->q_mcu[MT_MCUQ_WM ]); +if (ret >0 ) + nframes += ret;/* rx */ ret =mt7663s_rx_handler (dev);
drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c +1 -1
@@ -61,7 +61,7 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,FIELD_PREP (MT_MCU_MSG_PORT ,CPU_TX_PORT ) |FIELD_PREP (MT_MCU_MSG_LEN , skb->len); - ret =mt76_tx_queue_skb_raw (dev, mdev->q_tx[MT_TXQ_MCU ], skb, tx_info); + ret =mt76_tx_queue_skb_raw (dev, mdev->q_mcu[MT_MCUQ_WM ], skb, tx_info);if (ret) goto out;
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +20 -23
82 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +7 -10
@@ -280,22 +280,19 @@ static int mt7915_queues_read(struct seq_file *s, void *data) { struct mt7915_dev *dev = dev_get_drvdata(s->private); -static const struct { +struct { +struct mt76_queue *q;char *queue; -int id; } queue_map[] = { - {"WFDMA0" ,MT_TXQ_BE }, - {"MCUWM" ,MT_TXQ_MCU }, - {"MCUWA" ,MT_TXQ_MCU_WA }, - {"MCUFWQ" ,MT_TXQ_FWDL }, + { dev->mt76.q_tx[MT_TXQ_BE ],"WFDMA0" }, + { dev->mt76.q_mcu[MT_MCUQ_WM ],"MCUWM" }, + { dev->mt76.q_mcu[MT_MCUQ_WA ],"MCUWA" }, + { dev->mt76.q_mcu[MT_MCUQ_FWDL ],"MCUFWQ" }, };int i;for (i =0 ; i <ARRAY_SIZE (queue_map); i++) { -struct mt76_queue *q = dev->mt76.q_tx[queue_map[i].id]; - -if (!q) -continue ; +struct mt76_queue *q = queue_map[i].q; seq_printf(s, "%s: queued=%d head=%d tail=%d\n",
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +9 -9
@@ -14,7 +14,7 @@ mt7915_init_tx_queues(struct mt7915_dev *dev, int idx, int n_desc)if (err <0 )return err; -for (i =0 ; i <MT_TXQ_MCU ; i++) +for (i =0 ; i <=MT_TXQ_PSD ; i++) dev->mt76.q_tx[i] = dev->mt76.q_tx[0 ];return 0 ;
@@ -56,8 +56,8 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,static void mt7915_tx_cleanup (struct mt7915_dev *dev) { -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_MCU ], false); -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_MCU_WA ], false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WA ], false); }static int mt7915_poll_tx (struct napi_struct *napi,int budget)
@@ -243,20 +243,20 @@ int mt7915_dma_init(struct mt7915_dev *dev)return ret;/* command to WM */ - ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU ,MT7915_TXQ_MCU_WM , -MT7915_TX_MCU_RING_SIZE ,MT_TX_RING_BASE ); + ret =mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_WM ,MT7915_TXQ_MCU_WM , +MT7915_TX_MCU_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;/* command to WA */ - ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_MCU_WA ,MT7915_TXQ_MCU_WA , -MT7915_TX_MCU_RING_SIZE ,MT_TX_RING_BASE ); + ret =mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_WA ,MT7915_TXQ_MCU_WA , +MT7915_TX_MCU_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;/* firmware download */ - ret =mt76_init_tx_queue (&dev->mphy,MT_TXQ_FWDL ,MT7915_TXQ_FWDL , -MT7915_TX_FWDL_RING_SIZE ,MT_TX_RING_BASE ); + ret =mt76_init_mcu_queue (&dev->mt76,MT_MCUQ_FWDL ,MT7915_TXQ_FWDL , +MT7915_TX_FWDL_RING_SIZE ,MT_TX_RING_BASE );if (ret)return ret;
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +1 -0
@@ -1432,6 +1432,7 @@ mt7915_dma_reset(struct mt7915_dev *dev) MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN);usleep_range (1000 ,2000 ); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WA ], true);for (i =0 ; i < __MT_TXQ_MAX; i++)mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +5 -5
@@ -268,18 +268,18 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, seq = ++dev->mt76.mcu.msg_seq &0xf ;if (cmd == -MCU_CMD_FW_SCATTER ) { - txq =MT_TXQ_FWDL ; + txq =MT_MCUQ_FWDL ; goto exit; } mcu_txd = (struct mt7915_mcu_txd *)skb_push (skb,sizeof (*mcu_txd));if (test_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state)) { - txq =MT_TXQ_MCU_WA ; + txq =MT_MCUQ_WA ; qidx =MT_TX_MCU_PORT_RX_Q0 ; pkt_fmt =MT_TX_TYPE_CMD ; }else { - txq =MT_TXQ_MCU ; + txq =MT_MCUQ_WM ; qidx =MT_TX_MCU_PORT_RX_Q0 ; pkt_fmt =MT_TX_TYPE_CMD ; }
@@ -326,7 +326,7 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,if (wait_seq) *wait_seq = seq; -return mt76_tx_queue_skb_raw (dev, mdev->q_tx[txq], skb,0 ); +return mt76_tx_queue_skb_raw (dev, mdev->q_mcu[txq], skb,0 ); } static void
@@ -2799,7 +2799,7 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)return -EIO ; } -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_FWDL ], false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_FWDL ], false);dev_dbg (dev->mt76.dev,"Firmware init done\n" );
drivers/net/wireless/mediatek/mt76/sdio.c +6 -5
@@ -74,8 +74,8 @@ static int mt76s_alloc_tx(struct mt76_dev *dev)if (IS_ERR (q))return PTR_ERR (q); - q->qid =MT_TXQ_MCU ; - dev->q_tx[MT_TXQ_MCU ] = q; + q->qid =MT_MCUQ_WM ; + dev->q_mcu[MT_MCUQ_WM ] = q;return 0 ; }
@@ -157,7 +157,7 @@ static void mt76s_net_worker(struct mt76_worker *w)static int mt76s_process_tx_queue (struct mt76_dev *dev,struct mt76_queue *q) { -bool wake, mcu = q == dev->q_tx[MT_TXQ_MCU ]; +bool wake, mcu = q == dev->q_mcu[MT_MCUQ_WM ];struct mt76_queue_entry entry;int nframes =0 ;
@@ -203,8 +203,9 @@ static void mt76s_status_worker(struct mt76_worker *w)int i, nframes; do { - nframes = 0; - for (i = 0; i < MT_TXQ_MCU_WA; i++) + nframes = mt76s_process_tx_queue(dev, dev->q_mcu[MT_MCUQ_WM]); + + for (i = 0; i <= MT_TXQ_PSD; i++) nframes += mt76s_process_tx_queue(dev, dev->q_tx[i]); if (dev->drv->tx_status_data &&
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 6/10 mt76: rely on mt76_queue in tx_queue_skb signature
In reply to Lorenzo BianconiRely on mt76_queue instead of qid in tx_queue_skb signature. This is a preliminary patch to move data queues in mt76_phy and add dbdc support to mt7915 driver
--- drivers/net/wireless/mediatek/mt76/dma.c | 5 ++-- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- .../wireless/mediatek/mt76/mt7603/beacon.c | 27 ++++++++++--------- .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 11 ++++---- drivers/net/wireless/mediatek/mt76/sdio.c | 5 ++-- drivers/net/wireless/mediatek/mt76/testmode.c | 3 ++- drivers/net/wireless/mediatek/mt76/tx.c | 22 +++++++-------- drivers/net/wireless/mediatek/mt76/usb.c | 7 ++--- 8 files changed, 43 insertions(+), 39 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +2 -3
@@ -344,11 +344,10 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, enum mt76_txq_id qid, }static int -mt76_dma_tx_queue_skb (struct mt76_dev *dev,enum mt76_txq_id qid, +mt76_dma_tx_queue_skb (struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,struct mt76_wcid *wcid,struct ieee80211_sta *sta) { -struct mt76_queue *q = dev->q_tx[qid];struct mt76_tx_info tx_info = { .skb = skb, };
@@ -398,7 +397,7 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,dma_sync_single_for_cpu (dev->dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE ); - ret = dev->drv->tx_prepare_skb (dev, txwi, qid, wcid, sta, &tx_info); + ret = dev->drv->tx_prepare_skb (dev, txwi, q->qid, wcid, sta, &tx_info);dma_sync_single_for_device (dev->dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE );if (ret <0 )
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
@@ -167,7 +167,7 @@ struct mt76_queue_ops { int idx, int n_desc, int bufsize, u32 ring_base); -int (*tx_queue_skb)(struct mt76_dev *dev,enum mt76_txq_id qid, +int (*tx_queue_skb)(struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,struct mt76_wcid *wcid,struct ieee80211_sta *sta);
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +15 -12
@@ -13,23 +13,25 @@ static void mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) {struct mt7603_dev *dev = (struct mt7603_dev *)priv; +struct mt76_dev *mdev = &dev->mt76;struct mt7603_vif *mvif = (struct mt7603_vif *)vif->drv_priv;struct sk_buff *skb =NULL ; -if (!(dev->mt76.beacon_mask &BIT (mvif->idx))) +if (!(mdev->beacon_mask &BIT (mvif->idx)))return ; skb =ieee80211_beacon_get (mt76_hw (dev), vif);if (!skb)return ; -mt76_tx_queue_skb (dev,MT_TXQ_BEACON , skb, &mvif->sta.wcid,NULL ); +mt76_tx_queue_skb (dev, mdev->q_tx[MT_TXQ_BEACON ], skb, + &mvif->sta.wcid,NULL );spin_lock_bh (&dev->ps_lock);mt76_wr (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY |FIELD_PREP (MT_DMA_FQCR0_TARGET_WCID , mvif->sta.wcid.idx) |FIELD_PREP (MT_DMA_FQCR0_TARGET_QID , - dev->mt76.q_tx[MT_TXQ_CAB ]->hw_idx) | + mdev->q_tx[MT_TXQ_CAB ]->hw_idx) |FIELD_PREP (MT_DMA_FQCR0_DEST_PORT_ID ,3 ) |FIELD_PREP (MT_DMA_FQCR0_DEST_QUEUE_ID ,8 ));
@@ -67,6 +69,7 @@ mt7603_add_buffered_bc(void *priv, u8 *mac, struct ieee80211_vif *vif)void mt7603_pre_tbtt_tasklet (struct tasklet_struct *t) {struct mt7603_dev *dev =from_tasklet (dev, t, mt76.pre_tbtt_tasklet); +struct mt76_dev *mdev = &dev->mt76;struct mt76_queue *q;struct beacon_bc_data data = {};struct sk_buff *skb;
@@ -78,7 +81,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) data.dev = dev;__skb_queue_head_init (&data.q); - q = dev->mt76.q_tx[MT_TXQ_BEACON ]; + q = mdev->q_tx[MT_TXQ_BEACON ];spin_lock_bh (&q->lock); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev), IEEE80211_IFACE_ITER_RESUME_ALL,
@@ -89,13 +92,13 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)/* Flush all previous CAB queue packets */ mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_CAB ], false); +mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_CAB ], false); -mt76_csa_check (&dev->mt76); -if (dev->mt76.csa_complete) +mt76_csa_check (mdev); +if (mdev->csa_complete) goto out; - q = dev->mt76.q_tx[MT_TXQ_CAB ]; + q = mdev->q_tx[MT_TXQ_CAB ]; do { nframes = skb_queue_len(&data.q); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
@@ -120,7 +123,8 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)struct ieee80211_vif *vif = info->control.vif;struct mt7603_vif *mvif = (struct mt7603_vif *)vif->drv_priv; -mt76_tx_queue_skb (dev,MT_TXQ_CAB , skb, &mvif->sta.wcid,NULL ); +mt76_tx_queue_skb (dev, mdev->q_tx[MT_TXQ_CAB ], skb, + &mvif->sta.wcid,NULL ); }mt76_queue_kick (dev, q);spin_unlock_bh (&q->lock);
@@ -135,9 +139,8 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) ((1 << (MT7603_MAX_INTERFACES - 1)) - 1))); out: -mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_BEACON ], false); -if (dev->mt76.q_tx[MT_TXQ_BEACON ]->queued > -hweight8 (dev->mt76.beacon_mask)) +mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_BEACON ], false); +if (mdev->q_tx[MT_TXQ_BEACON ]->queued >hweight8 (mdev->beacon_mask)) dev->beacon_check++; }
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +6 -5
@@ -14,7 +14,8 @@static void mt76x02_pre_tbtt_tasklet (struct tasklet_struct *t) {struct mt76x02_dev *dev =from_tasklet (dev, t, mt76.pre_tbtt_tasklet); -struct mt76_queue *q = dev->mt76.q_tx[MT_TXQ_PSD ]; +struct mt76_dev *mdev = &dev->mt76; +struct mt76_queue *q = mdev->q_tx[MT_TXQ_PSD ];struct beacon_bc_data data = {};struct sk_buff *skb;int i;
@@ -35,9 +36,9 @@ static void mt76x02_pre_tbtt_tasklet(struct tasklet_struct *t)mt76_wr (dev,MT_BCN_BYPASS_MASK ,0xff00 | ~(0xff00 >> dev->beacon_data_count)); -mt76_csa_check (&dev->mt76); +mt76_csa_check (mdev); -if (dev->mt76.csa_complete) +if (mdev->csa_complete)return ;mt76x02_enqueue_buffered_bc (dev, &data,8 );
@@ -58,8 +59,8 @@ static void mt76x02_pre_tbtt_tasklet(struct tasklet_struct *t)struct ieee80211_vif *vif = info->control.vif;struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv; -mt76_tx_queue_skb (dev,MT_TXQ_PSD , skb, &mvif->group_wcid, -NULL ); +mt76_tx_queue_skb (dev, mdev->q_tx[MT_TXQ_PSD ], skb, + &mvif->group_wcid,NULL ); }spin_unlock_bh (&q->lock); }
drivers/net/wireless/mediatek/mt76/sdio.c +2 -3
@@ -239,11 +239,10 @@ static void mt76s_tx_status_data(struct work_struct *work) }static int -mt76s_tx_queue_skb (struct mt76_dev *dev,enum mt76_txq_id qid, +mt76s_tx_queue_skb (struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,struct mt76_wcid *wcid,struct ieee80211_sta *sta) { -struct mt76_queue *q = dev->q_tx[qid];struct mt76_tx_info tx_info = { .skb = skb, };
@@ -254,7 +253,7 @@ mt76s_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,return -ENOSPC ; skb->prev = skb->next =NULL ; - err = dev->drv->tx_prepare_skb (dev,NULL , qid, wcid, sta, &tx_info); + err = dev->drv->tx_prepare_skb (dev,NULL , q->qid, wcid, sta, &tx_info);if (err <0 )return err;
drivers/net/wireless/mediatek/mt76/testmode.c +2 -1
@@ -39,7 +39,8 @@ void mt76_testmode_tx_pending(struct mt76_dev *dev) q->queued < q->ndesc / 2) {int ret; - ret = dev->queue_ops->tx_queue_skb (dev, qid,skb_get (skb), wcid,NULL ); + ret = dev->queue_ops->tx_queue_skb (dev, q,skb_get (skb), wcid, +NULL );if (ret <0 )break ;
drivers/net/wireless/mediatek/mt76/tx.c +11 -11
@@ -225,23 +225,23 @@ void mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *skEXPORT_SYMBOL_GPL (mt76_tx_complete_skb);static int -__mt76_tx_queue_skb (struct mt76_dev *dev,int qid,struct sk_buff *skb, +__mt76_tx_queue_skb (struct mt76_phy *phy,int qid,struct sk_buff *skb,struct mt76_wcid *wcid,struct ieee80211_sta *sta,bool *stop) {struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb); -struct mt76_queue *q; +struct mt76_dev *dev = phy->dev; +struct mt76_queue *q = dev->q_tx[qid];bool non_aql;int pending;int idx; non_aql = !info->tx_time_est; - idx = dev->queue_ops->tx_queue_skb (dev, qid, skb, wcid, sta); + idx = dev->queue_ops->tx_queue_skb (dev, q, skb, wcid, sta);if (idx <0 || !sta || !non_aql)return idx; wcid = (struct mt76_wcid *)sta->drv_priv; - q = dev->q_tx[qid]; q->entry[idx].wcid = wcid->idx; pending =atomic_inc_return (&wcid->non_aql_packets);if (stop && pending >=MT_MAX_NON_AQL_PKT )
@@ -289,7 +289,7 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta, q = dev->q_tx[qid];spin_lock_bh (&q->lock); -__mt76_tx_queue_skb (dev, qid, skb, wcid, sta,NULL ); +__mt76_tx_queue_skb (phy, qid, skb, wcid, sta,NULL ); dev->queue_ops->kick (dev, q);if (q->queued > q->ndesc -8 && !q->stopped) {
@@ -321,7 +321,7 @@ mt76_txq_dequeue(struct mt76_phy *phy, struct mt76_txq *mtxq) }static void -mt76_queue_ps_skb (struct mt76_dev *dev,struct ieee80211_sta *sta, +mt76_queue_ps_skb (struct mt76_phy *phy,struct ieee80211_sta *sta,struct sk_buff *skb,bool last) {struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
@@ -333,7 +333,7 @@ mt76_queue_ps_skb(struct mt76_dev *dev, struct ieee80211_sta *sta,IEEE80211_TX_CTL_REQ_TX_STATUS ;mt76_skb_set_moredata (skb, !last); -__mt76_tx_queue_skb (dev,MT_TXQ_PSD , skb, wcid, sta,NULL ); +__mt76_tx_queue_skb (phy,MT_TXQ_PSD , skb, wcid, sta,NULL ); }void
@@ -364,14 +364,14 @@ mt76_release_buffered_frames(struct ieee80211_hw *hw, struct ieee80211_sta *sta, nframes--;if (last_skb) -mt76_queue_ps_skb (dev, sta, last_skb, false); +mt76_queue_ps_skb (phy, sta, last_skb, false); last_skb = skb; }while (nframes); }if (last_skb) { -mt76_queue_ps_skb (dev, sta, last_skb, true); +mt76_queue_ps_skb (phy, sta, last_skb, true); dev->queue_ops->kick (dev, hwq); }else {ieee80211_sta_eosp (sta);
@@ -410,7 +410,7 @@ mt76_txq_send_burst(struct mt76_phy *phy, struct mt76_queue *q,ieee80211_get_tx_rates (txq->vif, txq->sta, skb, info->control.rates,1 ); - idx =__mt76_tx_queue_skb (dev, qid, skb, wcid, txq->sta, &stop); + idx =__mt76_tx_queue_skb (phy, qid, skb, wcid, txq->sta, &stop);if (idx <0 )return idx;
@@ -434,7 +434,7 @@ mt76_txq_send_burst(struct mt76_phy *phy, struct mt76_queue *q,ieee80211_get_tx_rates (txq->vif, txq->sta, skb, info->control.rates,1 ); - idx =__mt76_tx_queue_skb (dev, qid, skb, wcid, txq->sta, &stop); + idx =__mt76_tx_queue_skb (phy, qid, skb, wcid, txq->sta, &stop);if (idx <0 )break ;
drivers/net/wireless/mediatek/mt76/usb.c +4 -3
@@ -901,11 +901,10 @@ mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb, }static int -mt76u_tx_queue_skb (struct mt76_dev *dev,enum mt76_txq_id qid, +mt76u_tx_queue_skb (struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,struct mt76_wcid *wcid,struct ieee80211_sta *sta) { -struct mt76_queue *q = dev->q_tx[qid];struct mt76_tx_info tx_info = { .skb = skb, };
@@ -916,7 +915,7 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,return -ENOSPC ; skb->prev = skb->next =NULL ; - err = dev->drv->tx_prepare_skb (dev,NULL , qid, wcid, sta, &tx_info); + err = dev->drv->tx_prepare_skb (dev,NULL , q->qid, wcid, sta, &tx_info);if (err <0 )return err;
@@ -994,6 +993,8 @@ static int mt76u_alloc_tx(struct mt76_dev *dev)spin_lock_init (&q->lock); q->hw_idx =mt76u_ac_to_hwq (dev, i); + q->qid = i; + dev->q_tx[i] = q; q->entry = devm_kcalloc(dev->dev,
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 5/10 mt76: dma: rely on mt76_queue in mt76_dma_tx_cleanup signature
In reply to Lorenzo BianconiThis is a preliminary patch to move data queues in mt76_phy and properly support dbdc
--- drivers/net/wireless/mediatek/mt76/dma.c | 9 ++++----- drivers/net/wireless/mediatek/mt76/mcu.c | 3 ++- drivers/net/wireless/mediatek/mt76/mt76.h | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/beacon.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/dma.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/dma.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 8 ++++---- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt7915/dma.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +4 -5
@@ -217,9 +217,8 @@ mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q) }static void -mt76_dma_tx_cleanup (struct mt76_dev *dev,enum mt76_txq_id qid,bool flush) +mt76_dma_tx_cleanup (struct mt76_dev *dev,struct mt76_queue *q,bool flush) { -struct mt76_queue *q = dev->q_tx[qid];struct mt76_queue_entry entry;bool wake = false;int last;
@@ -255,7 +254,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush) } wake = wake && q->stopped && - qid <IEEE80211_NUM_ACS && q->queued < q->ndesc -8 ; + q->qid <IEEE80211_NUM_ACS && q->queued < q->ndesc -8 ;if (wake) q->stopped = false;
@@ -263,7 +262,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush)wake_up (&dev->tx_wait);if (wake) -ieee80211_wake_queue (dev->hw, qid); +ieee80211_wake_queue (dev->hw, q->qid); } static void *
@@ -664,7 +663,7 @@ void mt76_dma_cleanup(struct mt76_dev *dev)mt76_worker_disable (&dev->tx_worker);netif_napi_del (&dev->tx_napi);for (i =0 ; i <ARRAY_SIZE (dev->q_tx); i++) -mt76_dma_tx_cleanup (dev, i, true); +mt76_dma_tx_cleanup (dev, dev->q_tx[i], true);mt76_for_each_q_rx (dev, i) {netif_napi_del (&dev->napi[i]);
drivers/net/wireless/mediatek/mt76/mcu.c +2 -1
@@ -122,7 +122,8 @@ int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, len -= cur_len;if (dev->queue_ops->tx_cleanup) - dev->queue_ops->tx_cleanup (dev,MT_TXQ_FWDL , false); + dev->queue_ops->tx_cleanup (dev, dev->q_tx[MT_TXQ_FWDL ], + false); }return 0 ;
drivers/net/wireless/mediatek/mt76/mt76.h +2 -2
@@ -179,7 +179,7 @@ struct mt76_queue_ops {void (*rx_reset)(struct mt76_dev *dev,enum mt76_rxq_id qid); -void (*tx_cleanup)(struct mt76_dev *dev,enum mt76_txq_id qid, +void (*tx_cleanup)(struct mt76_dev *dev,struct mt76_queue *q,bool flush);void (*kick)(struct mt76_dev *dev,struct mt76_queue *q);
@@ -751,7 +751,7 @@ static inline u16 mt76_rev(struct mt76_dev *dev)#define mt76_tx_queue_skb_raw (dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__)#define mt76_tx_queue_skb (dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__)#define mt76_queue_rx_reset (dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) -#define mt76_queue_tx_cleanup (dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_tx_cleanup (dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)#define mt76_queue_kick (dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__)#define mt76_for_each_q_rx (dev, i) \
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +2 -2
@@ -89,7 +89,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)/* Flush all previous CAB queue packets */ mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); -mt76_queue_tx_cleanup (dev,MT_TXQ_CAB , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_CAB ], false);mt76_csa_check (&dev->mt76);if (dev->mt76.csa_complete)
@@ -135,7 +135,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) ((1 << (MT7603_MAX_INTERFACES - 1)) - 1))); out: -mt76_queue_tx_cleanup (dev,MT_TXQ_BEACON , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_BEACON ], false);if (dev->mt76.q_tx[MT_TXQ_BEACON ]->queued >hweight8 (dev->mt76.beacon_mask)) dev->beacon_check++;
drivers/net/wireless/mediatek/mt76/mt7603/dma.c +2 -2
@@ -147,13 +147,13 @@ static int mt7603_poll_tx(struct napi_struct *napi, int budget) dev->tx_dma_check =0 ;for (i =MT_TXQ_MCU ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, i, false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false);if (napi_complete_done (napi,0 ))mt7603_irq_enable (dev,MT_INT_TX_DONE_ALL );for (i =MT_TXQ_MCU ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, i, false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false);mt7603_mac_sta_poll (dev);
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +1 -1
@@ -1435,7 +1435,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt7603_pse_client_reset (dev);for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, i, true); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +1 -1
@@ -75,7 +75,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget) dev = container_of(napi, struct mt7615_dev, mt76.tx_napi); -mt76_queue_tx_cleanup (dev,MT_TXQ_MCU , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_MCU ], false);if (napi_complete_done (napi,0 ))mt7615_irq_enable (dev,mt7615_tx_mcu_int_mask (dev));
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +4 -4
@@ -1435,12 +1435,12 @@ static void mt7615_mac_tx_free(struct mt7615_dev *dev, struct sk_buff *skb)struct mt7615_tx_free *free = (struct mt7615_tx_free *)skb->data;u8 i, count; -mt76_queue_tx_cleanup (dev,MT_TXQ_PSD , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_PSD ], false);if (is_mt7615 (&dev->mt76)) { -mt76_queue_tx_cleanup (dev,MT_TXQ_BE , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_BE ], false); }else {for (i =0 ; i <IEEE80211_NUM_ACS ; i++) -mt76_queue_tx_cleanup (dev, i, false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false); } count =FIELD_GET (MT_TX_FREE_MSDU_ID_CNT ,le16_to_cpu (free->ctrl));
@@ -2045,7 +2045,7 @@ void mt7615_dma_reset(struct mt7615_dev *dev)usleep_range (1000 ,2000 );for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, i, true); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +1 -1
@@ -2464,7 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)if (ret)return ret; -mt76_queue_tx_cleanup (dev,MT_TXQ_FWDL , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_FWDL ], false);dev_dbg (dev->mt76.dev,"Firmware init done\n" );set_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state);mt7615_mcu_fw_log_2_host (dev,0 );
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +3 -3
@@ -164,13 +164,13 @@ static int mt76x02_poll_tx(struct napi_struct *napi, int budget)mt76x02_mac_poll_tx_status (dev, false);for (i =MT_TXQ_MCU ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, i, false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false);if (napi_complete_done (napi,0 ))mt76x02_irq_enable (dev,MT_INT_TX_DONE_ALL );for (i =MT_TXQ_MCU ; i >=0 ; i--) -mt76_queue_tx_cleanup (dev, i, false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], false);mt76_worker_schedule (&dev->mt76.tx_worker);
@@ -469,7 +469,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)mt76_mcu_restart (dev);for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, i, true); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +2 -2
@@ -56,8 +56,8 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,static void mt7915_tx_cleanup (struct mt7915_dev *dev) { -mt76_queue_tx_cleanup (dev,MT_TXQ_MCU , false); -mt76_queue_tx_cleanup (dev,MT_TXQ_MCU_WA , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_MCU ], false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_MCU_WA ], false); }static int mt7915_poll_tx (struct napi_struct *napi,int budget)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +3 -3
@@ -1084,8 +1084,8 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)u8 i, count;/* clean DMA queues and unmap buffers first */ -mt76_queue_tx_cleanup (dev,MT_TXQ_PSD , false); -mt76_queue_tx_cleanup (dev,MT_TXQ_BE , false); +mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_PSD ], false); +mt76_queue_tx_cleanup (dev, mdev->q_tx[MT_TXQ_BE ], false);/* * TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE,
@@ -1433,7 +1433,7 @@ mt7915_dma_reset(struct mt7915_dev *dev)usleep_range (1000 ,2000 );for (i =0 ; i < __MT_TXQ_MAX; i++) -mt76_queue_tx_cleanup (dev, i, true); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[i], true);mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +1 -1
@@ -2799,7 +2799,7 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)return -EIO ; } -mt76_queue_tx_cleanup (dev,MT_TXQ_FWDL , false); +mt76_queue_tx_cleanup (dev, dev->mt76.q_tx[MT_TXQ_FWDL ], false);dev_dbg (dev->mt76.dev,"Firmware init done\n" );
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 2/10 mt76: sdio: introduce mt76s_alloc_tx_queue
In reply to Lorenzo BianconiThis is a preliminary patch to move hw data queues in mt76_phy for mt7915 dbdc support
--- drivers/net/wireless/mediatek/mt76/sdio.c | 44 ++++++++++++++++------- 1 file changed, 31 insertions(+), 13 deletions(-)
drivers/net/wireless/mediatek/mt76/sdio.c +31 -13
@@ -36,28 +36,46 @@ mt76s_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid)return 0 ; } +static struct mt76_queue *mt76s_alloc_tx_queue (struct mt76_dev *dev) +{ +struct mt76_queue *q; + + q =devm_kzalloc (dev->dev,sizeof (*q),GFP_KERNEL ); +if (!q) +return ERR_PTR (-ENOMEM ); + +spin_lock_init (&q->lock); + q->entry =devm_kcalloc (dev->dev, +MT_NUM_TX_ENTRIES ,sizeof (*q->entry), +GFP_KERNEL ); +if (!q->entry) +return ERR_PTR (-ENOMEM ); + + q->ndesc =MT_NUM_TX_ENTRIES ; + +return q; +} +static int mt76s_alloc_tx (struct mt76_dev *dev) {struct mt76_queue *q;int i; -for (i =0 ; i <MT_TXQ_MCU_WA ; i++) { - q =devm_kzalloc (dev->dev,sizeof (*q),GFP_KERNEL ); -if (!q) -return -ENOMEM ; +for (i =0 ; i <=MT_TXQ_PSD ; i++) { + q =mt76s_alloc_tx_queue (dev); +if (IS_ERR (q)) +return PTR_ERR (q); -spin_lock_init (&q->lock); - q->hw_idx = i; + q->qid = i; dev->q_tx[i] = q; + } - q->entry =devm_kcalloc (dev->dev, -MT_NUM_TX_ENTRIES ,sizeof (*q->entry), -GFP_KERNEL ); -if (!q->entry) -return -ENOMEM ; + q =mt76s_alloc_tx_queue (dev); +if (IS_ERR (q)) +return PTR_ERR (q); - q->ndesc =MT_NUM_TX_ENTRIES ; - } + q->qid =MT_TXQ_MCU ; + dev->q_tx[MT_TXQ_MCU ] = q;return 0 ; }
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 3/10 mt76: sdio: rely on mt76_queue in mt76s_process_tx_queue signature
In reply to Lorenzo BianconiThis is a preliminary patch to move data queues in mt76_phy and properly support dbdc for mt7915
--- drivers/net/wireless/mediatek/mt76/sdio.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/sdio.c +7 -8
@@ -155,12 +155,11 @@ static void mt76s_net_worker(struct mt76_worker *w) }while (nframes >0 ); } -static int mt76s_process_tx_queue (struct mt76_dev *dev,enum mt76_txq_id qid) +static int mt76s_process_tx_queue (struct mt76_dev *dev,struct mt76_queue *q) { -struct mt76_queue *q = dev->q_tx[qid]; +bool wake, mcu = q == dev->q_tx[MT_TXQ_MCU ];struct mt76_queue_entry entry;int nframes =0 ; -bool wake;while (q->queued >0 ) {if (!q->entry[q->tail].done)
@@ -169,7 +168,7 @@ static int mt76s_process_tx_queue(struct mt76_dev *dev, enum mt76_txq_id qid) entry = q->entry[q->tail]; q->entry[q->tail].done = false; -if (qid ==MT_TXQ_MCU ) { +if (mcu) {dev_kfree_skb (entry.skb); entry.skb =NULL ; }
@@ -185,13 +184,13 @@ static int mt76s_process_tx_queue(struct mt76_dev *dev, enum mt76_txq_id qid)if (!q->queued)wake_up (&dev->tx_wait); -if (qid ==MT_TXQ_MCU ) +if (mcu) goto out; -mt76_txq_schedule (&dev->phy, qid); +mt76_txq_schedule (&dev->phy, q->qid);if (wake) -ieee80211_wake_queue (dev->hw, qid); +ieee80211_wake_queue (dev->hw, q->qid); out:return nframes; }
@@ -206,7 +205,7 @@ static void mt76s_status_worker(struct mt76_worker *w) do { nframes = 0; for (i = 0; i < MT_TXQ_MCU_WA; i++) - nframes += mt76s_process_tx_queue(dev, i); + nframes += mt76s_process_tx_queue(dev, dev->q_tx[i]); if (dev->drv->tx_status_data && !test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
Signature · 1 line
2.26.2