Skip to content

Commit 5d33053

Browse files
csyuancnbd168
authored andcommitted
wifi: mt76: mt7996: add variants support
There are variants of mt7996 which are different from eht supported and wtbl size limit. Get the hw caps with CHIP_CONFIG command. Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent 731425f commit 5d33053

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,28 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
8787
return mt7996_check_eeprom(dev);
8888
}
8989

90+
static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev *dev)
91+
{
92+
#define MODE_HE_ONLY BIT(0)
93+
#define WTBL_SIZE_GROUP GENMASK(31, 28)
94+
u32 cap = 0;
95+
int ret;
96+
97+
ret = mt7996_mcu_get_chip_config(dev, &cap);
98+
if (ret)
99+
return ret;
100+
101+
if (cap) {
102+
dev->has_eht = !(cap & MODE_HE_ONLY);
103+
dev->wtbl_size_group = u32_get_bits(cap, WTBL_SIZE_GROUP);
104+
}
105+
106+
if (dev->wtbl_size_group < 2 || dev->wtbl_size_group > 4)
107+
dev->wtbl_size_group = 2; /* set default */
108+
109+
return 0;
110+
}
111+
90112
static int mt7996_eeprom_parse_band_config(struct mt7996_phy *phy)
91113
{
92114
u8 *eeprom = phy->dev->mt76.eeprom.data;
@@ -133,6 +155,7 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
133155
u8 path, nss, band_idx = phy->mt76->band_idx;
134156
u8 *eeprom = dev->mt76.eeprom.data;
135157
struct mt76_phy *mphy = phy->mt76;
158+
int ret;
136159

137160
switch (band_idx) {
138161
case MT_BAND1:
@@ -167,6 +190,10 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
167190
dev->chainshift[band_idx + 1] = dev->chainshift[band_idx] +
168191
hweight16(mphy->chainmask);
169192

193+
ret = mt7996_eeprom_parse_efuse_hw_cap(dev);
194+
if (ret)
195+
return ret;
196+
170197
return mt7996_eeprom_parse_band_config(phy);
171198
}
172199

drivers/net/wireless/mediatek/mt76/mt7996/mcu.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2977,6 +2977,52 @@ int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num)
29772977
return 0;
29782978
}
29792979

2980+
int mt7996_mcu_get_chip_config(struct mt7996_dev *dev, u32 *cap)
2981+
{
2982+
#define NIC_CAP 3
2983+
#define UNI_EVENT_CHIP_CONFIG_EFUSE_VERSION 0x21
2984+
struct {
2985+
u8 _rsv[4];
2986+
2987+
__le16 tag;
2988+
__le16 len;
2989+
} __packed req = {
2990+
.tag = cpu_to_le16(NIC_CAP),
2991+
.len = cpu_to_le16(sizeof(req) - 4),
2992+
};
2993+
struct sk_buff *skb;
2994+
u8 *buf;
2995+
int ret;
2996+
2997+
ret = mt76_mcu_send_and_get_msg(&dev->mt76,
2998+
MCU_WM_UNI_CMD_QUERY(CHIP_CONFIG), &req,
2999+
sizeof(req), true, &skb);
3000+
if (ret)
3001+
return ret;
3002+
3003+
/* fixed field */
3004+
skb_pull(skb, 4);
3005+
3006+
buf = skb->data;
3007+
while (buf - skb->data < skb->len) {
3008+
struct tlv *tlv = (struct tlv *)buf;
3009+
3010+
switch (le16_to_cpu(tlv->tag)) {
3011+
case UNI_EVENT_CHIP_CONFIG_EFUSE_VERSION:
3012+
*cap = le32_to_cpu(*(__le32 *)(buf + sizeof(*tlv)));
3013+
break;
3014+
default:
3015+
break;
3016+
};
3017+
3018+
buf += le16_to_cpu(tlv->len);
3019+
}
3020+
3021+
dev_kfree_skb(skb);
3022+
3023+
return 0;
3024+
}
3025+
29803026
int mt7996_mcu_get_chan_mib_info(struct mt7996_phy *phy, bool chan_switch)
29813027
{
29823028
struct {

drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ struct mt7996_dev {
264264
bool dbdc_support:1;
265265
bool tbtc_support:1;
266266
bool flash_mode:1;
267+
bool has_eht:1;
267268

268269
bool ibf;
269270
u8 fw_debug_wm;
@@ -281,6 +282,8 @@ struct mt7996_dev {
281282

282283
u32 reg_l1_backup;
283284
u32 reg_l2_backup;
285+
286+
u8 wtbl_size_group;
284287
};
285288

286289
enum {
@@ -419,6 +422,7 @@ int mt7996_mcu_set_fixed_rate_ctrl(struct mt7996_dev *dev,
419422
int mt7996_mcu_set_eeprom(struct mt7996_dev *dev);
420423
int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset);
421424
int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num);
425+
int mt7996_mcu_get_chip_config(struct mt7996_dev *dev, u32 *cap);
422426
int mt7996_mcu_set_ser(struct mt7996_dev *dev, u8 action, u8 set, u8 band);
423427
int mt7996_mcu_set_txbf(struct mt7996_dev *dev, u8 action);
424428
int mt7996_mcu_set_fcc5_lpn(struct mt7996_dev *dev, int val);

0 commit comments

Comments
 (0)