Skip to content

Commit

Permalink
mt76: connac: move shared fw structures in connac module
Browse files Browse the repository at this point in the history
Move mt76_connac2 fw structures in connac module since they are shared
between mt7921 and mt7915 drivers. This is a preliminary patch to add
mt7902e support.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
  • Loading branch information
LorenzoBianconi authored and nbd168 committed Jun 17, 2022
1 parent 9aeca2a commit fee8a59
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 143 deletions.
56 changes: 56 additions & 0 deletions mt76_connac_mcu.h
Expand Up @@ -26,6 +26,62 @@
#define PATCH_SEC_TYPE_MASK GENMASK(15, 0)
#define PATCH_SEC_TYPE_INFO 0x2

struct mt76_connac2_patch_hdr {
char build_date[16];
char platform[4];
__be32 hw_sw_ver;
__be32 patch_ver;
__be16 checksum;
u16 rsv;
struct {
__be32 patch_ver;
__be32 subsys;
__be32 feature;
__be32 n_region;
__be32 crc;
u32 rsv[11];
} desc;
} __packed;

struct mt76_connac2_patch_sec {
__be32 type;
__be32 offs;
__be32 size;
union {
__be32 spec[13];
struct {
__be32 addr;
__be32 len;
__be32 sec_key_idx;
__be32 align_len;
u32 rsv[9];
} info;
};
} __packed;

struct mt76_connac2_fw_trailer {
u8 chip_id;
u8 eco_code;
u8 n_region;
u8 format_ver;
u8 format_flag;
u8 rsv[2];
char fw_ver[10];
char build_date[15];
__le32 crc;
} __packed;

struct mt76_connac2_fw_region {
__le32 decomp_crc;
__le32 decomp_len;
__le32 decomp_blk_sz;
u8 rsv[4];
__le32 addr;
__le32 len;
u8 feature_set;
u8 rsv1[15];
} __packed;

struct tlv {
__le16 tag;
__le16 len;
Expand Down
85 changes: 12 additions & 73 deletions mt7915/mcu.c
Expand Up @@ -8,62 +8,6 @@
#include "mac.h"
#include "eeprom.h"

struct mt7915_patch_hdr {
char build_date[16];
char platform[4];
__be32 hw_sw_ver;
__be32 patch_ver;
__be16 checksum;
u16 reserved;
struct {
__be32 patch_ver;
__be32 subsys;
__be32 feature;
__be32 n_region;
__be32 crc;
u32 reserved[11];
} desc;
} __packed;

struct mt7915_patch_sec {
__be32 type;
__be32 offs;
__be32 size;
union {
__be32 spec[13];
struct {
__be32 addr;
__be32 len;
__be32 sec_key_idx;
__be32 align_len;
u32 reserved[9];
} info;
};
} __packed;

struct mt7915_fw_trailer {
u8 chip_id;
u8 eco_code;
u8 n_region;
u8 format_ver;
u8 format_flag;
u8 reserved[2];
char fw_ver[10];
char build_date[15];
u32 crc;
} __packed;

struct mt7915_fw_region {
__le32 decomp_crc;
__le32 decomp_len;
__le32 decomp_blk_sz;
u8 reserved[4];
__le32 addr;
__le32 len;
u8 feature_set;
u8 reserved1[15];
} __packed;

#define fw_name(_dev, name, ...) ({ \
char *_fw; \
switch (mt76_chip(&(_dev)->mt76)) { \
Expand Down Expand Up @@ -2136,7 +2080,7 @@ static int mt7915_driver_own(struct mt7915_dev *dev, u8 band)

static int mt7915_load_patch(struct mt7915_dev *dev)
{
const struct mt7915_patch_hdr *hdr;
const struct mt76_connac2_patch_hdr *hdr;
const struct firmware *fw = NULL;
int i, ret, sem;

Expand All @@ -2162,18 +2106,17 @@ static int mt7915_load_patch(struct mt7915_dev *dev)
goto out;
}

hdr = (const struct mt7915_patch_hdr *)(fw->data);
hdr = (const struct mt76_connac2_patch_hdr *)fw->data;

dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);

for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
struct mt7915_patch_sec *sec;
struct mt76_connac2_patch_sec *sec;
const u8 *dl;
u32 len, addr;

sec = (struct mt7915_patch_sec *)(fw->data + sizeof(*hdr) +
i * sizeof(*sec));
sec = (void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec));
if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
PATCH_SEC_TYPE_INFO) {
ret = -EINVAL;
Expand Down Expand Up @@ -2220,19 +2163,19 @@ static int mt7915_load_patch(struct mt7915_dev *dev)

static int
mt7915_mcu_send_ram_firmware(struct mt7915_dev *dev,
const struct mt7915_fw_trailer *hdr,
const struct mt76_connac2_fw_trailer *hdr,
const u8 *data, bool is_wa)
{
int i, offset = 0;
u32 override = 0, option = 0;

for (i = 0; i < hdr->n_region; i++) {
const struct mt7915_fw_region *region;
int err;
const struct mt76_connac2_fw_region *region;
u32 len, addr, mode;
int err;

region = (const struct mt7915_fw_region *)((const u8 *)hdr -
(hdr->n_region - i) * sizeof(*region));
region = (const void *)((const u8 *)hdr -
(hdr->n_region - i) * sizeof(*region));
mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
region->feature_set, is_wa);
len = le32_to_cpu(region->len);
Expand Down Expand Up @@ -2269,7 +2212,7 @@ mt7915_mcu_send_ram_firmware(struct mt7915_dev *dev,

static int mt7915_load_ram(struct mt7915_dev *dev)
{
const struct mt7915_fw_trailer *hdr;
const struct mt76_connac2_fw_trailer *hdr;
const struct firmware *fw;
int ret;

Expand All @@ -2284,9 +2227,7 @@ static int mt7915_load_ram(struct mt7915_dev *dev)
goto out;
}

hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
sizeof(*hdr));

hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
hdr->fw_ver, hdr->build_date);

Expand All @@ -2309,9 +2250,7 @@ static int mt7915_load_ram(struct mt7915_dev *dev)
goto out;
}

hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
sizeof(*hdr));

hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
hdr->fw_ver, hdr->build_date);

Expand Down
81 changes: 11 additions & 70 deletions mt7921/mcu.c
Expand Up @@ -8,62 +8,6 @@
#include "mcu.h"
#include "mac.h"

struct mt7921_patch_hdr {
char build_date[16];
char platform[4];
__be32 hw_sw_ver;
__be32 patch_ver;
__be16 checksum;
u16 reserved;
struct {
__be32 patch_ver;
__be32 subsys;
__be32 feature;
__be32 n_region;
__be32 crc;
u32 reserved[11];
} desc;
} __packed;

struct mt7921_patch_sec {
__be32 type;
__be32 offs;
__be32 size;
union {
__be32 spec[13];
struct {
__be32 addr;
__be32 len;
__be32 sec_key_idx;
__be32 align_len;
u32 reserved[9];
} info;
};
} __packed;

struct mt7921_fw_trailer {
u8 chip_id;
u8 eco_code;
u8 n_region;
u8 format_ver;
u8 format_flag;
u8 reserved[2];
char fw_ver[10];
char build_date[15];
u32 crc;
} __packed;

struct mt7921_fw_region {
__le32 decomp_crc;
__le32 decomp_len;
__le32 decomp_blk_sz;
u8 reserved[4];
__le32 addr;
__le32 len;
u8 feature_set;
u8 reserved1[15];
} __packed;

#define MT_STA_BFER BIT(0)
#define MT_STA_BFEE BIT(1)

Expand Down Expand Up @@ -512,7 +456,7 @@ static char *mt7921_patch_name(struct mt7921_dev *dev)

static int mt7921_load_patch(struct mt7921_dev *dev)
{
const struct mt7921_patch_hdr *hdr;
const struct mt76_connac2_patch_hdr *hdr;
const struct firmware *fw = NULL;
int i, ret, sem, max_len;

Expand All @@ -539,19 +483,18 @@ static int mt7921_load_patch(struct mt7921_dev *dev)
goto out;
}

hdr = (const struct mt7921_patch_hdr *)(fw->data);
hdr = (const struct mt76_connac2_patch_hdr *)fw->data;

dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);

for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
struct mt7921_patch_sec *sec;
struct mt76_connac2_patch_sec *sec;
const u8 *dl;
u32 len, addr, mode;
u32 sec_info = 0;

sec = (struct mt7921_patch_sec *)(fw->data + sizeof(*hdr) +
i * sizeof(*sec));
sec = (void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec));
if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
PATCH_SEC_TYPE_INFO) {
ret = -EINVAL;
Expand Down Expand Up @@ -608,7 +551,7 @@ static int mt7921_load_patch(struct mt7921_dev *dev)

static int
mt7921_mcu_send_ram_firmware(struct mt7921_dev *dev,
const struct mt7921_fw_trailer *hdr,
const struct mt76_connac2_fw_trailer *hdr,
const u8 *data, bool is_wa)
{
int i, offset = 0, max_len;
Expand All @@ -617,12 +560,12 @@ mt7921_mcu_send_ram_firmware(struct mt7921_dev *dev,
max_len = mt76_is_sdio(&dev->mt76) ? 2048 : 4096;

for (i = 0; i < hdr->n_region; i++) {
const struct mt7921_fw_region *region;
int err;
const struct mt76_connac2_fw_region *region;
u32 len, addr, mode;
int err;

region = (const struct mt7921_fw_region *)((const u8 *)hdr -
(hdr->n_region - i) * sizeof(*region));
region = (const void *)((const u8 *)hdr -
(hdr->n_region - i) * sizeof(*region));
mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
region->feature_set, is_wa);
len = le32_to_cpu(region->len);
Expand Down Expand Up @@ -671,7 +614,7 @@ static char *mt7921_ram_name(struct mt7921_dev *dev)

static int mt7921_load_ram(struct mt7921_dev *dev)
{
const struct mt7921_fw_trailer *hdr;
const struct mt76_connac2_fw_trailer *hdr;
const struct firmware *fw;
int ret;

Expand All @@ -685,9 +628,7 @@ static int mt7921_load_ram(struct mt7921_dev *dev)
goto out;
}

hdr = (const struct mt7921_fw_trailer *)(fw->data + fw->size -
sizeof(*hdr));

hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
hdr->fw_ver, hdr->build_date);

Expand Down

0 comments on commit fee8a59

Please sign in to comment.