mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-12 19:44:51 -04:00
wifi: mt76: mt7921: introduce mt7921_get_mac80211_ops utility routine
Since the fw offload capability check is shared between pci,usb and sdio devices, move it in common init code and reduce code duplication. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
committed by
Felix Fietkau
parent
72fc0df300
commit
a1ec7e6237
@@ -169,7 +169,8 @@ mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)
|
||||
mt76_rmw(dev, MT_WTBLOFF_TOP_RSCR(band), mask, set);
|
||||
}
|
||||
|
||||
u8 mt7921_check_offload_capability(struct device *dev, const char *fw_wm)
|
||||
static u8
|
||||
mt7921_get_offload_capability(struct device *dev, const char *fw_wm)
|
||||
{
|
||||
struct mt7921_fw_features *features = NULL;
|
||||
const struct mt76_connac2_fw_trailer *hdr;
|
||||
@@ -220,7 +221,31 @@ u8 mt7921_check_offload_capability(struct device *dev, const char *fw_wm)
|
||||
|
||||
return features ? features->data : 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt7921_check_offload_capability);
|
||||
|
||||
struct ieee80211_ops *
|
||||
mt7921_get_mac80211_ops(struct device *dev, void *drv_data, u8 *fw_features)
|
||||
{
|
||||
struct ieee80211_ops *ops;
|
||||
|
||||
ops = devm_kmemdup(dev, &mt7921_ops, sizeof(mt7921_ops), GFP_KERNEL);
|
||||
if (!ops)
|
||||
return NULL;
|
||||
|
||||
*fw_features = mt7921_get_offload_capability(dev, drv_data);
|
||||
if (!(*fw_features & MT7921_FW_CAP_CNM)) {
|
||||
ops->remain_on_channel = NULL;
|
||||
ops->cancel_remain_on_channel = NULL;
|
||||
ops->add_chanctx = NULL;
|
||||
ops->remove_chanctx = NULL;
|
||||
ops->change_chanctx = NULL;
|
||||
ops->assign_vif_chanctx = NULL;
|
||||
ops->unassign_vif_chanctx = NULL;
|
||||
ops->mgd_prepare_tx = NULL;
|
||||
ops->mgd_complete_tx = NULL;
|
||||
}
|
||||
return ops;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt7921_get_mac80211_ops);
|
||||
|
||||
int mt7921_mac_init(struct mt7921_dev *dev)
|
||||
{
|
||||
|
||||
@@ -593,5 +593,6 @@ int mt7921_mcu_set_roc(struct mt7921_phy *phy, struct mt7921_vif *vif,
|
||||
enum mt7921_roc_req type, u8 token_id);
|
||||
int mt7921_mcu_abort_roc(struct mt7921_phy *phy, struct mt7921_vif *vif,
|
||||
u8 token_id);
|
||||
u8 mt7921_check_offload_capability(struct device *dev, const char *fw_wm);
|
||||
struct ieee80211_ops *mt7921_get_mac80211_ops(struct device *dev,
|
||||
void *drv_data, u8 *fw_features);
|
||||
#endif
|
||||
|
||||
@@ -256,7 +256,6 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
|
||||
.drv_own = mt7921e_mcu_drv_pmctrl,
|
||||
.fw_own = mt7921e_mcu_fw_pmctrl,
|
||||
};
|
||||
|
||||
struct ieee80211_ops *ops;
|
||||
struct mt76_bus_ops *bus_ops;
|
||||
struct mt7921_dev *dev;
|
||||
@@ -285,27 +284,13 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
|
||||
if (mt7921_disable_aspm)
|
||||
mt76_pci_disable_aspm(pdev);
|
||||
|
||||
features = mt7921_check_offload_capability(&pdev->dev, (const char *)
|
||||
id->driver_data);
|
||||
ops = devm_kmemdup(&pdev->dev, &mt7921_ops, sizeof(mt7921_ops),
|
||||
GFP_KERNEL);
|
||||
ops = mt7921_get_mac80211_ops(&pdev->dev, (void *)id->driver_data,
|
||||
&features);
|
||||
if (!ops) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_pci_vec;
|
||||
}
|
||||
|
||||
if (!(features & MT7921_FW_CAP_CNM)) {
|
||||
ops->remain_on_channel = NULL;
|
||||
ops->cancel_remain_on_channel = NULL;
|
||||
ops->add_chanctx = NULL;
|
||||
ops->remove_chanctx = NULL;
|
||||
ops->change_chanctx = NULL;
|
||||
ops->assign_vif_chanctx = NULL;
|
||||
ops->unassign_vif_chanctx = NULL;
|
||||
ops->mgd_prepare_tx = NULL;
|
||||
ops->mgd_complete_tx = NULL;
|
||||
}
|
||||
|
||||
mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), ops, &drv_ops);
|
||||
if (!mdev) {
|
||||
ret = -ENOMEM;
|
||||
|
||||
@@ -122,33 +122,17 @@ static int mt7921s_probe(struct sdio_func *func,
|
||||
.drv_own = mt7921s_mcu_drv_pmctrl,
|
||||
.fw_own = mt7921s_mcu_fw_pmctrl,
|
||||
};
|
||||
|
||||
struct ieee80211_ops *ops;
|
||||
struct mt7921_dev *dev;
|
||||
struct mt76_dev *mdev;
|
||||
u8 features;
|
||||
int ret;
|
||||
|
||||
features = mt7921_check_offload_capability(&func->dev, (const char *)
|
||||
id->driver_data);
|
||||
|
||||
ops = devm_kmemdup(&func->dev, &mt7921_ops, sizeof(mt7921_ops),
|
||||
GFP_KERNEL);
|
||||
ops = mt7921_get_mac80211_ops(&func->dev, (void *)id->driver_data,
|
||||
&features);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!(features & MT7921_FW_CAP_CNM)) {
|
||||
ops->remain_on_channel = NULL;
|
||||
ops->cancel_remain_on_channel = NULL;
|
||||
ops->add_chanctx = NULL;
|
||||
ops->remove_chanctx = NULL;
|
||||
ops->change_chanctx = NULL;
|
||||
ops->assign_vif_chanctx = NULL;
|
||||
ops->unassign_vif_chanctx = NULL;
|
||||
ops->mgd_prepare_tx = NULL;
|
||||
ops->mgd_complete_tx = NULL;
|
||||
}
|
||||
|
||||
mdev = mt76_alloc_device(&func->dev, sizeof(*dev), ops, &drv_ops);
|
||||
if (!mdev)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -210,27 +210,12 @@ static int mt7921u_probe(struct usb_interface *usb_intf,
|
||||
u8 features;
|
||||
int ret;
|
||||
|
||||
features = mt7921_check_offload_capability(&usb_intf->dev, (const char *)
|
||||
id->driver_info);
|
||||
ops = devm_kmemdup(&usb_intf->dev, &mt7921_ops, sizeof(mt7921_ops),
|
||||
GFP_KERNEL);
|
||||
ops = mt7921_get_mac80211_ops(&usb_intf->dev, (void *)id->driver_info,
|
||||
&features);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!(features & MT7921_FW_CAP_CNM)) {
|
||||
ops->remain_on_channel = NULL;
|
||||
ops->cancel_remain_on_channel = NULL;
|
||||
ops->add_chanctx = NULL;
|
||||
ops->remove_chanctx = NULL;
|
||||
ops->change_chanctx = NULL;
|
||||
ops->assign_vif_chanctx = NULL;
|
||||
ops->unassign_vif_chanctx = NULL;
|
||||
ops->mgd_prepare_tx = NULL;
|
||||
ops->mgd_complete_tx = NULL;
|
||||
}
|
||||
|
||||
ops->stop = mt7921u_stop;
|
||||
|
||||
mdev = mt76_alloc_device(&usb_intf->dev, sizeof(*dev), ops, &drv_ops);
|
||||
if (!mdev)
|
||||
return -ENOMEM;
|
||||
|
||||
Reference in New Issue
Block a user