mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 16:07:39 +00:00
mt76: mt7921: add EEPROM support
Add EEPROM support to MT7921 to determine the capability the card has such as indentificaiton, MAC address, the band and antenna number the card able to support. Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Co-developed-by: Soul Huang <Soul.Huang@mediatek.com> Signed-off-by: Soul Huang <Soul.Huang@mediatek.com> Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
12d1c31788
commit
bb1f6aaf71
2 changed files with 127 additions and 0 deletions
100
drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c
Normal file
100
drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c
Normal file
|
@ -0,0 +1,100 @@
|
|||
// SPDX-License-Identifier: ISC
|
||||
/* Copyright (C) 2020 MediaTek Inc. */
|
||||
|
||||
#include "mt7921.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
static u32 mt7921_eeprom_read(struct mt7921_dev *dev, u32 offset)
|
||||
{
|
||||
u8 *data = dev->mt76.eeprom.data;
|
||||
|
||||
if (data[offset] == 0xff)
|
||||
mt7921_mcu_get_eeprom(dev, offset);
|
||||
|
||||
return data[offset];
|
||||
}
|
||||
|
||||
static int mt7921_eeprom_load(struct mt7921_dev *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mt76_eeprom_init(&dev->mt76, MT7921_EEPROM_SIZE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
memset(dev->mt76.eeprom.data, -1, MT7921_EEPROM_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt7921_check_eeprom(struct mt7921_dev *dev)
|
||||
{
|
||||
u8 *eeprom = dev->mt76.eeprom.data;
|
||||
u16 val;
|
||||
|
||||
mt7921_eeprom_read(dev, MT_EE_CHIP_ID);
|
||||
val = get_unaligned_le16(eeprom);
|
||||
|
||||
switch (val) {
|
||||
case 0x7961:
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
void mt7921_eeprom_parse_band_config(struct mt7921_phy *phy)
|
||||
{
|
||||
struct mt7921_dev *dev = phy->dev;
|
||||
u32 val;
|
||||
|
||||
val = mt7921_eeprom_read(dev, MT_EE_WIFI_CONF);
|
||||
val = FIELD_GET(MT_EE_WIFI_CONF_BAND_SEL, val);
|
||||
|
||||
switch (val) {
|
||||
case MT_EE_5GHZ:
|
||||
phy->mt76->cap.has_5ghz = true;
|
||||
break;
|
||||
case MT_EE_2GHZ:
|
||||
phy->mt76->cap.has_2ghz = true;
|
||||
break;
|
||||
default:
|
||||
phy->mt76->cap.has_2ghz = true;
|
||||
phy->mt76->cap.has_5ghz = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void mt7921_eeprom_parse_hw_cap(struct mt7921_dev *dev)
|
||||
{
|
||||
u8 tx_mask;
|
||||
|
||||
mt7921_eeprom_parse_band_config(&dev->phy);
|
||||
|
||||
/* TODO: read NSS with MCU_CMD_NIC_CAPV2 */
|
||||
tx_mask = 2;
|
||||
dev->chainmask = BIT(tx_mask) - 1;
|
||||
dev->mphy.antenna_mask = dev->chainmask;
|
||||
dev->mphy.chainmask = dev->mphy.antenna_mask;
|
||||
}
|
||||
|
||||
int mt7921_eeprom_init(struct mt7921_dev *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mt7921_eeprom_load(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = mt7921_check_eeprom(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mt7921_eeprom_parse_hw_cap(dev);
|
||||
memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
|
||||
ETH_ALEN);
|
||||
|
||||
mt76_eeprom_override(&dev->mphy);
|
||||
|
||||
return 0;
|
||||
}
|
27
drivers/net/wireless/mediatek/mt76/mt7921/eeprom.h
Normal file
27
drivers/net/wireless/mediatek/mt76/mt7921/eeprom.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* SPDX-License-Identifier: ISC */
|
||||
/* Copyright (C) 2020 MediaTek Inc. */
|
||||
|
||||
#ifndef __MT7921_EEPROM_H
|
||||
#define __MT7921_EEPROM_H
|
||||
|
||||
#include "mt7921.h"
|
||||
|
||||
enum mt7921_eeprom_field {
|
||||
MT_EE_CHIP_ID = 0x000,
|
||||
MT_EE_VERSION = 0x002,
|
||||
MT_EE_MAC_ADDR = 0x004,
|
||||
MT_EE_WIFI_CONF = 0x07c,
|
||||
__MT_EE_MAX = 0x3bf
|
||||
};
|
||||
|
||||
#define MT_EE_WIFI_CONF_TX_MASK BIT(0)
|
||||
#define MT_EE_WIFI_CONF_BAND_SEL GENMASK(3, 2)
|
||||
|
||||
enum mt7921_eeprom_band {
|
||||
MT_EE_NA,
|
||||
MT_EE_5GHZ,
|
||||
MT_EE_2GHZ,
|
||||
MT_EE_DUAL_BAND,
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue