rtw88: use struct rtw_fw_hdr to access firmware header
This commit doesn't change logic at all, just use struct rtw_fw_hdr to access fixed part of 64 bytes header. Since remaining part is variable length data of actual firmware, we don't define them within the struct. Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
bc3696e0a4
commit
cc20a71398
@ -11,22 +11,6 @@
|
|||||||
/* FW bin information */
|
/* FW bin information */
|
||||||
#define FW_HDR_SIZE 64
|
#define FW_HDR_SIZE 64
|
||||||
#define FW_HDR_CHKSUM_SIZE 8
|
#define FW_HDR_CHKSUM_SIZE 8
|
||||||
#define FW_HDR_VERSION 4
|
|
||||||
#define FW_HDR_SUBVERSION 6
|
|
||||||
#define FW_HDR_SUBINDEX 7
|
|
||||||
#define FW_HDR_MONTH 16
|
|
||||||
#define FW_HDR_DATE 17
|
|
||||||
#define FW_HDR_HOUR 18
|
|
||||||
#define FW_HDR_MIN 19
|
|
||||||
#define FW_HDR_YEAR 20
|
|
||||||
#define FW_HDR_MEM_USAGE 24
|
|
||||||
#define FW_HDR_H2C_FMT_VER 28
|
|
||||||
#define FW_HDR_DMEM_ADDR 32
|
|
||||||
#define FW_HDR_DMEM_SIZE 36
|
|
||||||
#define FW_HDR_IMEM_SIZE 48
|
|
||||||
#define FW_HDR_EMEM_SIZE 52
|
|
||||||
#define FW_HDR_EMEM_ADDR 56
|
|
||||||
#define FW_HDR_IMEM_ADDR 60
|
|
||||||
|
|
||||||
#define FIFO_PAGE_SIZE_SHIFT 12
|
#define FIFO_PAGE_SIZE_SHIFT 12
|
||||||
#define FIFO_PAGE_SIZE 4096
|
#define FIFO_PAGE_SIZE 4096
|
||||||
@ -116,6 +100,35 @@ struct rtw_rsvd_page {
|
|||||||
bool add_txdesc;
|
bool add_txdesc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct rtw_fw_hdr {
|
||||||
|
__le16 signature;
|
||||||
|
u8 category;
|
||||||
|
u8 function;
|
||||||
|
__le16 version; /* 0x04 */
|
||||||
|
u8 subversion;
|
||||||
|
u8 subindex;
|
||||||
|
__le32 rsvd; /* 0x08 */
|
||||||
|
__le32 rsvd2; /* 0x0C */
|
||||||
|
u8 month; /* 0x10 */
|
||||||
|
u8 day;
|
||||||
|
u8 hour;
|
||||||
|
u8 min;
|
||||||
|
__le16 year; /* 0x14 */
|
||||||
|
__le16 rsvd3;
|
||||||
|
u8 mem_usage; /* 0x18 */
|
||||||
|
u8 rsvd4[3];
|
||||||
|
__le16 h2c_fmt_ver; /* 0x1C */
|
||||||
|
__le16 rsvd5;
|
||||||
|
__le32 dmem_addr; /* 0x20 */
|
||||||
|
__le32 dmem_size;
|
||||||
|
__le32 rsvd6;
|
||||||
|
__le32 rsvd7;
|
||||||
|
__le32 imem_size; /* 0x30 */
|
||||||
|
__le32 emem_size;
|
||||||
|
__le32 emem_addr;
|
||||||
|
__le32 imem_addr;
|
||||||
|
};
|
||||||
|
|
||||||
/* C2H */
|
/* C2H */
|
||||||
#define GET_CCX_REPORT_SEQNUM(c2h_payload) (c2h_payload[8] & 0xfc)
|
#define GET_CCX_REPORT_SEQNUM(c2h_payload) (c2h_payload[8] & 0xfc)
|
||||||
#define GET_CCX_REPORT_STATUS(c2h_payload) (c2h_payload[9] & 0xc0)
|
#define GET_CCX_REPORT_STATUS(c2h_payload) (c2h_payload[9] & 0xc0)
|
||||||
|
@ -312,15 +312,16 @@ void rtw_mac_power_off(struct rtw_dev *rtwdev)
|
|||||||
|
|
||||||
static bool check_firmware_size(const u8 *data, u32 size)
|
static bool check_firmware_size(const u8 *data, u32 size)
|
||||||
{
|
{
|
||||||
|
const struct rtw_fw_hdr *fw_hdr = (const struct rtw_fw_hdr *)data;
|
||||||
u32 dmem_size;
|
u32 dmem_size;
|
||||||
u32 imem_size;
|
u32 imem_size;
|
||||||
u32 emem_size;
|
u32 emem_size;
|
||||||
u32 real_size;
|
u32 real_size;
|
||||||
|
|
||||||
dmem_size = le32_to_cpu(*((__le32 *)(data + FW_HDR_DMEM_SIZE)));
|
dmem_size = le32_to_cpu(fw_hdr->dmem_size);
|
||||||
imem_size = le32_to_cpu(*((__le32 *)(data + FW_HDR_IMEM_SIZE)));
|
imem_size = le32_to_cpu(fw_hdr->imem_size);
|
||||||
emem_size = ((*(data + FW_HDR_MEM_USAGE)) & BIT(4)) ?
|
emem_size = (fw_hdr->mem_usage & BIT(4)) ?
|
||||||
le32_to_cpu(*((__le32 *)(data + FW_HDR_EMEM_SIZE))) : 0;
|
le32_to_cpu(fw_hdr->emem_size) : 0;
|
||||||
|
|
||||||
dmem_size += FW_HDR_CHKSUM_SIZE;
|
dmem_size += FW_HDR_CHKSUM_SIZE;
|
||||||
imem_size += FW_HDR_CHKSUM_SIZE;
|
imem_size += FW_HDR_CHKSUM_SIZE;
|
||||||
@ -569,14 +570,13 @@ download_firmware_to_mem(struct rtw_dev *rtwdev, const u8 *data,
|
|||||||
static void update_firmware_info(struct rtw_dev *rtwdev,
|
static void update_firmware_info(struct rtw_dev *rtwdev,
|
||||||
struct rtw_fw_state *fw)
|
struct rtw_fw_state *fw)
|
||||||
{
|
{
|
||||||
const u8 *data = fw->firmware->data;
|
const struct rtw_fw_hdr *fw_hdr =
|
||||||
|
(const struct rtw_fw_hdr *)fw->firmware->data;
|
||||||
|
|
||||||
fw->h2c_version =
|
fw->h2c_version = le16_to_cpu(fw_hdr->h2c_fmt_ver);
|
||||||
le16_to_cpu(*((__le16 *)(data + FW_HDR_H2C_FMT_VER)));
|
fw->version = le16_to_cpu(fw_hdr->version);
|
||||||
fw->version =
|
fw->sub_version = fw_hdr->subversion;
|
||||||
le16_to_cpu(*((__le16 *)(data + FW_HDR_VERSION)));
|
fw->sub_index = fw_hdr->subindex;
|
||||||
fw->sub_version = *(data + FW_HDR_SUBVERSION);
|
|
||||||
fw->sub_index = *(data + FW_HDR_SUBINDEX);
|
|
||||||
|
|
||||||
rtw_info(rtwdev, "Firmware version %u.%u.%u, H2C version %u\n",
|
rtw_info(rtwdev, "Firmware version %u.%u.%u, H2C version %u\n",
|
||||||
fw->version, fw->sub_version, fw->sub_index, fw->h2c_version);
|
fw->version, fw->sub_version, fw->sub_index, fw->h2c_version);
|
||||||
@ -585,6 +585,7 @@ static void update_firmware_info(struct rtw_dev *rtwdev,
|
|||||||
static int
|
static int
|
||||||
start_download_firmware(struct rtw_dev *rtwdev, const u8 *data, u32 size)
|
start_download_firmware(struct rtw_dev *rtwdev, const u8 *data, u32 size)
|
||||||
{
|
{
|
||||||
|
const struct rtw_fw_hdr *fw_hdr = (const struct rtw_fw_hdr *)data;
|
||||||
const u8 *cur_fw;
|
const u8 *cur_fw;
|
||||||
u16 val;
|
u16 val;
|
||||||
u32 imem_size;
|
u32 imem_size;
|
||||||
@ -593,10 +594,10 @@ start_download_firmware(struct rtw_dev *rtwdev, const u8 *data, u32 size)
|
|||||||
u32 addr;
|
u32 addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dmem_size = le32_to_cpu(*((__le32 *)(data + FW_HDR_DMEM_SIZE)));
|
dmem_size = le32_to_cpu(fw_hdr->dmem_size);
|
||||||
imem_size = le32_to_cpu(*((__le32 *)(data + FW_HDR_IMEM_SIZE)));
|
imem_size = le32_to_cpu(fw_hdr->imem_size);
|
||||||
emem_size = ((*(data + FW_HDR_MEM_USAGE)) & BIT(4)) ?
|
emem_size = (fw_hdr->mem_usage & BIT(4)) ?
|
||||||
le32_to_cpu(*((__le32 *)(data + FW_HDR_EMEM_SIZE))) : 0;
|
le32_to_cpu(fw_hdr->emem_size) : 0;
|
||||||
dmem_size += FW_HDR_CHKSUM_SIZE;
|
dmem_size += FW_HDR_CHKSUM_SIZE;
|
||||||
imem_size += FW_HDR_CHKSUM_SIZE;
|
imem_size += FW_HDR_CHKSUM_SIZE;
|
||||||
emem_size += emem_size ? FW_HDR_CHKSUM_SIZE : 0;
|
emem_size += emem_size ? FW_HDR_CHKSUM_SIZE : 0;
|
||||||
@ -606,14 +607,14 @@ start_download_firmware(struct rtw_dev *rtwdev, const u8 *data, u32 size)
|
|||||||
rtw_write16(rtwdev, REG_MCUFW_CTRL, val);
|
rtw_write16(rtwdev, REG_MCUFW_CTRL, val);
|
||||||
|
|
||||||
cur_fw = data + FW_HDR_SIZE;
|
cur_fw = data + FW_HDR_SIZE;
|
||||||
addr = le32_to_cpu(*((__le32 *)(data + FW_HDR_DMEM_ADDR)));
|
addr = le32_to_cpu(fw_hdr->dmem_addr);
|
||||||
addr &= ~BIT(31);
|
addr &= ~BIT(31);
|
||||||
ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, dmem_size);
|
ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, dmem_size);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
cur_fw = data + FW_HDR_SIZE + dmem_size;
|
cur_fw = data + FW_HDR_SIZE + dmem_size;
|
||||||
addr = le32_to_cpu(*((__le32 *)(data + FW_HDR_IMEM_ADDR)));
|
addr = le32_to_cpu(fw_hdr->imem_addr);
|
||||||
addr &= ~BIT(31);
|
addr &= ~BIT(31);
|
||||||
ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, imem_size);
|
ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, imem_size);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -621,7 +622,7 @@ start_download_firmware(struct rtw_dev *rtwdev, const u8 *data, u32 size)
|
|||||||
|
|
||||||
if (emem_size) {
|
if (emem_size) {
|
||||||
cur_fw = data + FW_HDR_SIZE + dmem_size + imem_size;
|
cur_fw = data + FW_HDR_SIZE + dmem_size + imem_size;
|
||||||
addr = le32_to_cpu(*((__le32 *)(data + FW_HDR_EMEM_ADDR)));
|
addr = le32_to_cpu(fw_hdr->emem_addr);
|
||||||
addr &= ~BIT(31);
|
addr &= ~BIT(31);
|
||||||
ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr,
|
ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr,
|
||||||
emem_size);
|
emem_size);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user