Commit 7b8e1ae8 authored by Felix Fietkau's avatar Felix Fietkau

mt76: mt7915: rework hardware/phy initialization

Clean up and fix error paths in mt7915_register_device
Initialize second DBDC tx queue in mt7915_dma_init
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 96c77770
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
#include "../dma.h" #include "../dma.h"
#include "mac.h" #include "mac.h"
int mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base) static int
mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base)
{ {
int i, err; int i, err;
...@@ -323,7 +324,7 @@ static int mt7915_dma_enable(struct mt7915_dev *dev) ...@@ -323,7 +324,7 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
return 0; return 0;
} }
int mt7915_dma_init(struct mt7915_dev *dev) int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
{ {
struct mt76_dev *mdev = &dev->mt76; struct mt76_dev *mdev = &dev->mt76;
u32 hif1_ofs = 0; u32 hif1_ofs = 0;
...@@ -346,6 +347,15 @@ int mt7915_dma_init(struct mt7915_dev *dev) ...@@ -346,6 +347,15 @@ int mt7915_dma_init(struct mt7915_dev *dev)
if (ret) if (ret)
return ret; return ret;
if (phy2) {
ret = mt7915_init_tx_queues(phy2,
MT_TXQ_ID(phy2->band_idx),
MT7915_TX_RING_SIZE,
MT_TXQ_RING_BASE(1));
if (ret)
return ret;
}
/* command to WM */ /* command to WM */
ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM,
MT_MCUQ_ID(MT_MCUQ_WM), MT_MCUQ_ID(MT_MCUQ_WM),
......
...@@ -484,21 +484,18 @@ static int mt7915_txbf_init(struct mt7915_dev *dev) ...@@ -484,21 +484,18 @@ static int mt7915_txbf_init(struct mt7915_dev *dev)
return mt7915_mcu_set_txbf(dev, MT_BF_TYPE_UPDATE); return mt7915_mcu_set_txbf(dev, MT_BF_TYPE_UPDATE);
} }
static int mt7915_register_ext_phy(struct mt7915_dev *dev) static struct mt7915_phy *
mt7915_alloc_ext_phy(struct mt7915_dev *dev)
{ {
struct mt7915_phy *phy = mt7915_ext_phy(dev); struct mt7915_phy *phy;
struct mt76_phy *mphy; struct mt76_phy *mphy;
int ret;
if (!dev->dbdc_support) if (!dev->dbdc_support)
return 0; return NULL;
if (phy)
return 0;
mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7915_ops); mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7915_ops);
if (!mphy) if (!mphy)
return -ENOMEM; return ERR_PTR(-ENOMEM);
phy = mphy->priv; phy = mphy->priv;
phy->dev = dev; phy->dev = dev;
...@@ -507,6 +504,15 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev) ...@@ -507,6 +504,15 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)
/* Bind main phy to band0 and ext_phy to band1 for dbdc case */ /* Bind main phy to band0 and ext_phy to band1 for dbdc case */
phy->band_idx = 1; phy->band_idx = 1;
return phy;
}
static int
mt7915_register_ext_phy(struct mt7915_dev *dev, struct mt7915_phy *phy)
{
struct mt76_phy *mphy = phy->mt76;
int ret;
INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work); INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work);
mt7915_eeprom_parse_hw_cap(dev, phy); mt7915_eeprom_parse_hw_cap(dev, phy);
...@@ -526,29 +532,22 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev) ...@@ -526,29 +532,22 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)
/* init wiphy according to mphy and phy */ /* init wiphy according to mphy and phy */
mt7915_init_wiphy(mphy->hw); mt7915_init_wiphy(mphy->hw);
ret = mt7915_init_tx_queues(phy, MT_TXQ_ID(phy->band_idx),
MT7915_TX_RING_SIZE,
MT_TXQ_RING_BASE(1));
if (ret)
goto error;
ret = mt76_register_phy(mphy, true, mt76_rates, ret = mt76_register_phy(mphy, true, mt76_rates,
ARRAY_SIZE(mt76_rates)); ARRAY_SIZE(mt76_rates));
if (ret) if (ret)
goto error; return ret;
ret = mt7915_thermal_init(phy); ret = mt7915_thermal_init(phy);
if (ret) if (ret)
goto error; goto unreg;
ret = mt7915_init_debugfs(phy); mt7915_init_debugfs(phy);
if (ret)
goto error;
return 0; return 0;
error: unreg:
ieee80211_free_hw(mphy->hw); mt76_unregister_phy(mphy);
return ret; return ret;
} }
...@@ -645,7 +644,8 @@ static bool mt7915_band_config(struct mt7915_dev *dev) ...@@ -645,7 +644,8 @@ static bool mt7915_band_config(struct mt7915_dev *dev)
return ret; return ret;
} }
static int mt7915_init_hardware(struct mt7915_dev *dev) static int
mt7915_init_hardware(struct mt7915_dev *dev, struct mt7915_phy *phy2)
{ {
int ret, idx; int ret, idx;
...@@ -653,14 +653,12 @@ static int mt7915_init_hardware(struct mt7915_dev *dev) ...@@ -653,14 +653,12 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)
INIT_WORK(&dev->init_work, mt7915_init_work); INIT_WORK(&dev->init_work, mt7915_init_work);
dev->dbdc_support = mt7915_band_config(dev);
/* If MCU was already running, it is likely in a bad state */ /* If MCU was already running, it is likely in a bad state */
if (mt76_get_field(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE) > if (mt76_get_field(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE) >
FW_STATE_FW_DOWNLOAD) FW_STATE_FW_DOWNLOAD)
mt7915_wfsys_reset(dev); mt7915_wfsys_reset(dev);
ret = mt7915_dma_init(dev); ret = mt7915_dma_init(dev, phy2);
if (ret) if (ret)
return ret; return ret;
...@@ -1048,9 +1046,22 @@ static void mt7915_unregister_ext_phy(struct mt7915_dev *dev) ...@@ -1048,9 +1046,22 @@ static void mt7915_unregister_ext_phy(struct mt7915_dev *dev)
ieee80211_free_hw(mphy->hw); ieee80211_free_hw(mphy->hw);
} }
static void mt7915_stop_hardware(struct mt7915_dev *dev)
{
mt7915_mcu_exit(dev);
mt7915_tx_token_put(dev);
mt7915_dma_cleanup(dev);
tasklet_disable(&dev->irq_tasklet);
if (is_mt7986(&dev->mt76))
mt7986_wmac_disable(dev);
}
int mt7915_register_device(struct mt7915_dev *dev) int mt7915_register_device(struct mt7915_dev *dev)
{ {
struct ieee80211_hw *hw = mt76_hw(dev); struct ieee80211_hw *hw = mt76_hw(dev);
struct mt7915_phy *phy2;
int ret; int ret;
dev->phy.dev = dev; dev->phy.dev = dev;
...@@ -1066,9 +1077,15 @@ int mt7915_register_device(struct mt7915_dev *dev) ...@@ -1066,9 +1077,15 @@ int mt7915_register_device(struct mt7915_dev *dev)
init_waitqueue_head(&dev->reset_wait); init_waitqueue_head(&dev->reset_wait);
INIT_WORK(&dev->reset_work, mt7915_mac_reset_work); INIT_WORK(&dev->reset_work, mt7915_mac_reset_work);
ret = mt7915_init_hardware(dev); dev->dbdc_support = mt7915_band_config(dev);
phy2 = mt7915_alloc_ext_phy(dev);
if (IS_ERR(phy2))
return PTR_ERR(phy2);
ret = mt7915_init_hardware(dev, phy2);
if (ret) if (ret)
return ret; goto free_phy2;
mt7915_init_wiphy(hw); mt7915_init_wiphy(hw);
...@@ -1085,19 +1102,34 @@ int mt7915_register_device(struct mt7915_dev *dev) ...@@ -1085,19 +1102,34 @@ int mt7915_register_device(struct mt7915_dev *dev)
ret = mt76_register_device(&dev->mt76, true, mt76_rates, ret = mt76_register_device(&dev->mt76, true, mt76_rates,
ARRAY_SIZE(mt76_rates)); ARRAY_SIZE(mt76_rates));
if (ret) if (ret)
return ret; goto stop_hw;
ret = mt7915_thermal_init(&dev->phy); ret = mt7915_thermal_init(&dev->phy);
if (ret) if (ret)
return ret; goto unreg_dev;
ieee80211_queue_work(mt76_hw(dev), &dev->init_work); ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
ret = mt7915_register_ext_phy(dev); if (phy2) {
if (ret) ret = mt7915_register_ext_phy(dev, phy2);
return ret; if (ret)
goto unreg_thermal;
}
return mt7915_init_debugfs(&dev->phy); mt7915_init_debugfs(&dev->phy);
return 0;
unreg_thermal:
mt7915_unregister_thermal(&dev->phy);
unreg_dev:
mt76_unregister_device(&dev->mt76);
stop_hw:
mt7915_stop_hardware(dev);
free_phy2:
if (phy2)
ieee80211_free_hw(phy2->mt76->hw);
return ret;
} }
void mt7915_unregister_device(struct mt7915_dev *dev) void mt7915_unregister_device(struct mt7915_dev *dev)
...@@ -1105,13 +1137,7 @@ void mt7915_unregister_device(struct mt7915_dev *dev) ...@@ -1105,13 +1137,7 @@ void mt7915_unregister_device(struct mt7915_dev *dev)
mt7915_unregister_ext_phy(dev); mt7915_unregister_ext_phy(dev);
mt7915_unregister_thermal(&dev->phy); mt7915_unregister_thermal(&dev->phy);
mt76_unregister_device(&dev->mt76); mt76_unregister_device(&dev->mt76);
mt7915_mcu_exit(dev); mt7915_stop_hardware(dev);
mt7915_tx_token_put(dev);
mt7915_dma_cleanup(dev);
tasklet_disable(&dev->irq_tasklet);
if (is_mt7986(&dev->mt76))
mt7986_wmac_disable(dev);
mt76_free_device(&dev->mt76); mt76_free_device(&dev->mt76);
} }
...@@ -440,7 +440,7 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev, ...@@ -440,7 +440,7 @@ int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
struct ieee80211_channel *chan, struct ieee80211_channel *chan,
u8 chain_idx); u8 chain_idx);
s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band); s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band);
int mt7915_dma_init(struct mt7915_dev *dev); int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2);
void mt7915_dma_prefetch(struct mt7915_dev *dev); void mt7915_dma_prefetch(struct mt7915_dev *dev);
void mt7915_dma_cleanup(struct mt7915_dev *dev); void mt7915_dma_cleanup(struct mt7915_dev *dev);
int mt7915_mcu_init(struct mt7915_dev *dev); int mt7915_mcu_init(struct mt7915_dev *dev);
...@@ -572,7 +572,6 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -572,7 +572,6 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
struct mt76_tx_info *tx_info); struct mt76_tx_info *tx_info);
void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e);
void mt7915_tx_token_put(struct mt7915_dev *dev); void mt7915_tx_token_put(struct mt7915_dev *dev);
int mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base);
void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
struct sk_buff *skb); struct sk_buff *skb);
bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len); bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment