diff mbox series

[v2,1/6] wifi: mt76: mt7925: load the appropriate CLC data based on hardware type

Message ID 20250304062854.829194-1-mingyen.hsieh@mediatek.com (mailing list archive)
State Deferred
Delegated to: Felix Fietkau
Headers show
Series [v2,1/6] wifi: mt76: mt7925: load the appropriate CLC data based on hardware type | expand

Checks

Context Check Description
jmberg/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Mingyen Hsieh March 4, 2025, 6:28 a.m. UTC
From: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>

Read the EEPROM to determine the hardware type and uses this to load the
correct CLC data.

Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
---
v2: no change
---
 .../net/wireless/mediatek/mt76/mt7925/mcu.c   | 61 ++++++++++++++++++-
 .../wireless/mediatek/mt76/mt7925/mt7925.h    |  3 +
 2 files changed, 63 insertions(+), 1 deletion(-)

Comments

Ping-Ke Shih March 4, 2025, 9:06 a.m. UTC | #1
Mingyen Hsieh <mingyen.hsieh@mediatek.com> wrote:

[...]

> +       struct evt {
> +               u8 rsv[4];
> +
> +               __le16 tag;
> +               __le16 len;
> +
> +               __le32 ver;
> +               __le32 addr;
> +               __le32 valid;
> +               __le32 size;
> +               __le32 magic_num;
> +               __le32 type;
> +               __le32 rsv1[4];
> +               u8 data[32];
> +       } __packed * res;

nit: no need space between * and res, i.e. "__packed *res".

> +       struct sk_buff *skb;
> +       int ret;
> +
> +       ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL),
> +                                       &req, sizeof(req), true, &skb);
> +       if (ret)
> +               return ret;
> +
> +       res = (struct evt *)skb->data;
> +       *val = res->data[offset % MT7925_EEPROM_BLOCK_SIZE];
> +
> +       dev_kfree_skb(skb);
> +
> +       return 0;
> +}
> +
>  static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
>  {
>         const struct mt76_connac2_fw_trailer *hdr;
> @@ -809,12 +857,19 @@ static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
>         struct mt792x_phy *phy = &dev->phy;
>         const struct firmware *fw;
>         int ret, i, len, offset = 0;
> -       u8 *clc_base = NULL;
> +       u8 *clc_base = NULL, hw_encap = 0;

not sure if mt76 declare local variables in reverse X'mas tree order?
Mingyen Hsieh March 4, 2025, 9:37 a.m. UTC | #2
On Tue, 2025-03-04 at 09:06 +0000, Ping-Ke Shih wrote:
> 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> 
> 
> Mingyen Hsieh <mingyen.hsieh@mediatek.com> wrote:
> 
> [...]
> 
> > +       struct evt {
> > +               u8 rsv[4];
> > +
> > +               __le16 tag;
> > +               __le16 len;
> > +
> > +               __le32 ver;
> > +               __le32 addr;
> > +               __le32 valid;
> > +               __le32 size;
> > +               __le32 magic_num;
> > +               __le32 type;
> > +               __le32 rsv1[4];
> > +               u8 data[32];
> > +       } __packed * res;
> 
> nit: no need space between * and res, i.e. "__packed *res".
> 
Hi Ping-Ke,

I also think this is better, but this was suggested to me by
script/checkpatch.pl.

I will send v4 for this.

> > +       struct sk_buff *skb;
> > +       int ret;
> > +
> > +       ret = mt76_mcu_send_and_get_msg(&dev->mt76,
> > MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL),
> > +                                       &req, sizeof(req), true,
> > &skb);
> > +       if (ret)
> > +               return ret;
> > +
> > +       res = (struct evt *)skb->data;
> > +       *val = res->data[offset % MT7925_EEPROM_BLOCK_SIZE];
> > +
> > +       dev_kfree_skb(skb);
> > +
> > +       return 0;
> > +}
> > +
> >  static int mt7925_load_clc(struct mt792x_dev *dev, const char
> > *fw_name)
> >  {
> >         const struct mt76_connac2_fw_trailer *hdr;
> > @@ -809,12 +857,19 @@ static int mt7925_load_clc(struct mt792x_dev
> > *dev, const char *fw_name)
> >         struct mt792x_phy *phy = &dev->phy;
> >         const struct firmware *fw;
> >         int ret, i, len, offset = 0;
> > -       u8 *clc_base = NULL;
> > +       u8 *clc_base = NULL, hw_encap = 0;
> 
> not sure if mt76 declare local variables in reverse X'mas tree order?
> 
>
diff mbox series

Patch

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index d4fac7c2d0e6..505a6467f147 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -800,6 +800,54 @@  int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev,
 				 enable, false);
 }
 
+static int mt7925_mcu_read_eeprom(struct mt792x_dev *dev, u32 offset, u8 *val)
+{
+	struct {
+		u8 rsv[4];
+
+		__le16 tag;
+		__le16 len;
+
+		__le32 addr;
+		__le32 valid;
+		u8 data[MT7925_EEPROM_BLOCK_SIZE];
+	} __packed req = {
+		.tag = cpu_to_le16(1),
+		.len = cpu_to_le16(sizeof(req) - 4),
+		.addr = cpu_to_le32(round_down(offset,
+				    MT7925_EEPROM_BLOCK_SIZE)),
+	};
+	struct evt {
+		u8 rsv[4];
+
+		__le16 tag;
+		__le16 len;
+
+		__le32 ver;
+		__le32 addr;
+		__le32 valid;
+		__le32 size;
+		__le32 magic_num;
+		__le32 type;
+		__le32 rsv1[4];
+		u8 data[32];
+	} __packed * res;
+	struct sk_buff *skb;
+	int ret;
+
+	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL),
+					&req, sizeof(req), true, &skb);
+	if (ret)
+		return ret;
+
+	res = (struct evt *)skb->data;
+	*val = res->data[offset % MT7925_EEPROM_BLOCK_SIZE];
+
+	dev_kfree_skb(skb);
+
+	return 0;
+}
+
 static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
 {
 	const struct mt76_connac2_fw_trailer *hdr;
@@ -809,12 +857,19 @@  static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
 	struct mt792x_phy *phy = &dev->phy;
 	const struct firmware *fw;
 	int ret, i, len, offset = 0;
-	u8 *clc_base = NULL;
+	u8 *clc_base = NULL, hw_encap = 0;
 
 	if (mt7925_disable_clc ||
 	    mt76_is_usb(&dev->mt76))
 		return 0;
 
+	if (mt76_is_mmio(&dev->mt76)) {
+		ret = mt7925_mcu_read_eeprom(dev, MT_EE_HW_TYPE, &hw_encap);
+		if (ret)
+			return ret;
+		hw_encap = u8_get_bits(hw_encap, MT_EE_HW_TYPE_ENCAP);
+	}
+
 	ret = request_firmware(&fw, fw_name, mdev->dev);
 	if (ret)
 		return ret;
@@ -859,6 +914,10 @@  static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
 		if (phy->clc[clc->idx])
 			continue;
 
+		/* header content sanity */
+		if (u8_get_bits(clc->type, MT_EE_HW_TYPE_ENCAP) != hw_encap)
+			continue;
+
 		phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc,
 						  le32_to_cpu(clc->len),
 						  GFP_KERNEL);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
index 3f7187309513..abecaf897159 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
@@ -167,9 +167,12 @@  enum mt7925_eeprom_field {
 	MT_EE_CHIP_ID =		0x000,
 	MT_EE_VERSION =		0x002,
 	MT_EE_MAC_ADDR =	0x004,
+	MT_EE_HW_TYPE =		0xa71,
 	__MT_EE_MAX =		0x9ff
 };
 
+#define MT_EE_HW_TYPE_ENCAP     GENMASK(1, 0)
+
 enum {
 	TXPWR_USER,
 	TXPWR_EEPROM,