Commit d927ebb9 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau
Browse files

mt76: mt7615: refactor usb/sdio rate code



Since wtbl workqueue is used only for rate handling, refactor code to
make it more clear

Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent d8d59f66
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -915,22 +915,20 @@ mt7615_mac_queue_rate_update(struct mt7615_phy *phy, struct mt7615_sta *sta,
			     struct ieee80211_tx_rate *rates)
{
	struct mt7615_dev *dev = phy->dev;
	struct mt7615_wtbl_desc *wd;
	struct mt7615_wtbl_rate_desc *wrd;

	if (work_pending(&dev->wtbl_work))
	if (work_pending(&dev->rate_work))
		return -EBUSY;

	wd = kzalloc(sizeof(*wd), GFP_ATOMIC);
	if (!wd)
	wrd = kzalloc(sizeof(*wrd), GFP_ATOMIC);
	if (!wrd)
		return -ENOMEM;

	wd->type = MT7615_WTBL_RATE_DESC;
	wd->sta = sta;

	wrd->sta = sta;
	mt7615_mac_update_rate_desc(phy, sta, probe_rate, rates,
				    &wd->rate);
	list_add_tail(&wd->node, &dev->wd_head);
	queue_work(dev->mt76.wq, &dev->wtbl_work);
				    &wrd->rate);
	list_add_tail(&wrd->node, &dev->wrd_head);
	queue_work(dev->mt76.wq, &dev->rate_work);

	return 0;
}
+4 −13
Original line number Diff line number Diff line
@@ -106,19 +106,11 @@ struct mt7615_rate_desc {
	u8 bw;
};

enum mt7615_wtbl_desc_type {
	MT7615_WTBL_RATE_DESC,
};

struct mt7615_wtbl_desc {
struct mt7615_wtbl_rate_desc {
	struct list_head node;

	enum mt7615_wtbl_desc_type type;
	struct mt7615_sta *sta;

	union {
	struct mt7615_rate_desc rate;
	};
	struct mt7615_sta *sta;
};

struct mt7615_sta {
@@ -281,8 +273,8 @@ struct mt7615_dev {

	u8 fw_ver;

	struct work_struct wtbl_work;
	struct list_head wd_head;
	struct work_struct rate_work;
	struct list_head wrd_head;

	u32 debugfs_rf_wf;
	u32 debugfs_rf_reg;
@@ -649,7 +641,6 @@ int mt7663_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
bool mt7663_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update);
void mt7663_usb_sdio_tx_complete_skb(struct mt76_dev *mdev,
				     struct mt76_queue_entry *e);
void mt7663_usb_sdio_wtbl_work(struct work_struct *work);
int mt7663_usb_sdio_register_device(struct mt7615_dev *dev);
int mt7663u_mcu_init(struct mt7615_dev *dev);

+16 −24
Original line number Diff line number Diff line
@@ -61,12 +61,11 @@ mt7663_usb_sdio_write_txwi(struct mt7615_dev *dev, struct mt76_wcid *wcid,
	skb_push(skb, MT_USB_TXD_SIZE);
}

static int
mt7663_usb_sdio_set_rates(struct mt7615_dev *dev,
			  struct mt7615_wtbl_desc *wd)
static int mt7663_usb_sdio_set_rates(struct mt7615_dev *dev,
				     struct mt7615_wtbl_rate_desc *wrd)
{
	struct mt7615_rate_desc *rate = &wd->rate;
	struct mt7615_sta *sta = wd->sta;
	struct mt7615_rate_desc *rate = &wrd->rate;
	struct mt7615_sta *sta = wrd->sta;
	u32 w5, w27, addr, val;

	lockdep_assert_held(&dev->mt76.mutex);
@@ -132,37 +131,30 @@ mt7663_usb_sdio_set_rates(struct mt7615_dev *dev,
	return 0;
}

void mt7663_usb_sdio_wtbl_work(struct work_struct *work)
static void mt7663_usb_sdio_rate_work(struct work_struct *work)
{
	struct mt7615_wtbl_desc *wd, *wd_next;
	struct list_head wd_list;
	struct mt7615_wtbl_rate_desc *wrd, *wrd_next;
	struct list_head wrd_list;
	struct mt7615_dev *dev;

	dev = (struct mt7615_dev *)container_of(work, struct mt7615_dev,
						wtbl_work);
						rate_work);

	INIT_LIST_HEAD(&wd_list);
	INIT_LIST_HEAD(&wrd_list);
	spin_lock_bh(&dev->mt76.lock);
	list_splice_init(&dev->wd_head, &wd_list);
	list_splice_init(&dev->wrd_head, &wrd_list);
	spin_unlock_bh(&dev->mt76.lock);

	list_for_each_entry_safe(wd, wd_next, &wd_list, node) {
		list_del(&wd->node);
	list_for_each_entry_safe(wrd, wrd_next, &wrd_list, node) {
		list_del(&wrd->node);

		mt7615_mutex_acquire(dev);

		switch (wd->type) {
		case MT7615_WTBL_RATE_DESC:
			mt7663_usb_sdio_set_rates(dev, wd);
			break;
		}

		mt7663_usb_sdio_set_rates(dev, wrd);
		mt7615_mutex_release(dev);

		kfree(wd);
		kfree(wrd);
	}
}
EXPORT_SYMBOL_GPL(mt7663_usb_sdio_wtbl_work);

bool mt7663_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update)
{
@@ -308,8 +300,8 @@ int mt7663_usb_sdio_register_device(struct mt7615_dev *dev)
	struct ieee80211_hw *hw = mt76_hw(dev);
	int err;

	INIT_WORK(&dev->wtbl_work, mt7663_usb_sdio_wtbl_work);
	INIT_LIST_HEAD(&dev->wd_head);
	INIT_WORK(&dev->rate_work, mt7663_usb_sdio_rate_work);
	INIT_LIST_HEAD(&dev->wrd_head);
	mt7615_init_device(dev);

	err = mt7663_usb_sdio_init_hardware(dev);