Commit 9685262b authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Kalle Valo

wifi: wl18xx: add support for reading 8.9.1 fw status

Add the necessary code to read the 8.9.1 firmware status into the
driver private status structure, augmenting the 8.9.0 firmware
status code. New structure layout taken from:

https://git.ti.com/cgit/wilink8-wlan/build-utilites/tree/patches/kernel_patches/4.19.38/0023-wlcore-Fixing-PN-drift-on-encrypted-link-after-recov.patch?h=r8.9&id=a2ee50aa5190ed3b334373d6cd09b1bff56ffcf7Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://msgid.link/E1sBsyC-00E8w0-Rz@rmk-PC.armlinux.org.uk
parent bb8edd90
...@@ -1177,7 +1177,48 @@ static int wl18xx_hw_init(struct wl1271 *wl) ...@@ -1177,7 +1177,48 @@ static int wl18xx_hw_init(struct wl1271 *wl)
return ret; return ret;
} }
static void wl18xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status, static void wl18xx_convert_fw_status_8_9_1(struct wl1271 *wl,
void *raw_fw_status,
struct wl_fw_status *fw_status)
{
struct wl18xx_fw_status_8_9_1 *int_fw_status = raw_fw_status;
fw_status->intr = le32_to_cpu(int_fw_status->intr);
fw_status->fw_rx_counter = int_fw_status->fw_rx_counter;
fw_status->drv_rx_counter = int_fw_status->drv_rx_counter;
fw_status->tx_results_counter = int_fw_status->tx_results_counter;
fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs;
fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime);
fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap);
fw_status->link_fast_bitmap =
le32_to_cpu(int_fw_status->link_fast_bitmap);
fw_status->total_released_blks =
le32_to_cpu(int_fw_status->total_released_blks);
fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total);
fw_status->counters.tx_released_pkts =
int_fw_status->counters.tx_released_pkts;
fw_status->counters.tx_lnk_free_pkts =
int_fw_status->counters.tx_lnk_free_pkts;
fw_status->counters.tx_lnk_sec_pn16 =
int_fw_status->counters.tx_lnk_sec_pn16;
fw_status->counters.tx_voice_released_blks =
int_fw_status->counters.tx_voice_released_blks;
fw_status->counters.tx_last_rate =
int_fw_status->counters.tx_last_rate;
fw_status->counters.tx_last_rate_mbps =
int_fw_status->counters.tx_last_rate_mbps;
fw_status->counters.hlid =
int_fw_status->counters.hlid;
fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);
fw_status->priv = &int_fw_status->priv;
}
static void wl18xx_convert_fw_status_8_9_0(struct wl1271 *wl,
void *raw_fw_status,
struct wl_fw_status *fw_status) struct wl_fw_status *fw_status)
{ {
struct wl18xx_fw_status *int_fw_status = raw_fw_status; struct wl18xx_fw_status *int_fw_status = raw_fw_status;
...@@ -1214,6 +1255,15 @@ static void wl18xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status, ...@@ -1214,6 +1255,15 @@ static void wl18xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
fw_status->priv = &int_fw_status->priv; fw_status->priv = &int_fw_status->priv;
} }
static void wl18xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
struct wl_fw_status *fw_status)
{
if (wl->chip.fw_ver[FW_VER_MAJOR] == 0)
wl18xx_convert_fw_status_8_9_0(wl, raw_fw_status, fw_status);
else
wl18xx_convert_fw_status_8_9_1(wl, raw_fw_status, fw_status);
}
static void wl18xx_set_tx_desc_csum(struct wl1271 *wl, static void wl18xx_set_tx_desc_csum(struct wl1271 *wl,
struct wl1271_tx_hw_descr *desc, struct wl1271_tx_hw_descr *desc,
struct sk_buff *skb) struct sk_buff *skb)
...@@ -1515,12 +1565,29 @@ static int wl18xx_handle_static_data(struct wl1271 *wl, ...@@ -1515,12 +1565,29 @@ static int wl18xx_handle_static_data(struct wl1271 *wl,
{ {
struct wl18xx_static_data_priv *static_data_priv = struct wl18xx_static_data_priv *static_data_priv =
(struct wl18xx_static_data_priv *) static_data->priv; (struct wl18xx_static_data_priv *) static_data->priv;
size_t fw_status_len;
strscpy(wl->chip.phy_fw_ver_str, static_data_priv->phy_version, strscpy(wl->chip.phy_fw_ver_str, static_data_priv->phy_version,
sizeof(wl->chip.phy_fw_ver_str)); sizeof(wl->chip.phy_fw_ver_str));
wl1271_info("PHY firmware version: %s", static_data_priv->phy_version); wl1271_info("PHY firmware version: %s", static_data_priv->phy_version);
/* Adjust the firmware status size according to the firmware version */
if (wl->chip.fw_ver[FW_VER_MAJOR] == 0)
fw_status_len = sizeof(struct wl18xx_fw_status);
else
fw_status_len = sizeof(struct wl18xx_fw_status_8_9_1);
if (wl->fw_status_len != fw_status_len) {
void *new_status = krealloc(wl->raw_fw_status, fw_status_len,
GFP_KERNEL | __GFP_ZERO);
if (!new_status)
return -ENOMEM;
wl->raw_fw_status = new_status;
wl->fw_status_len = fw_status_len;
}
return 0; return 0;
} }
......
...@@ -155,6 +155,66 @@ struct wl18xx_fw_status { ...@@ -155,6 +155,66 @@ struct wl18xx_fw_status {
struct wl18xx_fw_status_priv priv; struct wl18xx_fw_status_priv priv;
} __packed; } __packed;
struct wl18xx_fw_packet_counters_8_9_1 {
/* Cumulative counter of released packets per AC */
u8 tx_released_pkts[NUM_TX_QUEUES];
/* Cumulative counter of freed packets per HLID */
u8 tx_lnk_free_pkts[WL18XX_MAX_LINKS];
/* PN16 of last TKIP/AES seq-num per HLID */
__le16 tx_lnk_sec_pn16[WL18XX_MAX_LINKS];
/* Cumulative counter of released Voice memory blocks */
u8 tx_voice_released_blks;
/* Tx rate of the last transmitted packet */
u8 tx_last_rate;
/* Tx rate or Tx rate estimate pre-calculated by fw in mbps units */
u8 tx_last_rate_mbps;
/* hlid for which the rates were reported */
u8 hlid;
} __packed;
/* FW status registers */
struct wl18xx_fw_status_8_9_1 {
__le32 intr;
u8 fw_rx_counter;
u8 drv_rx_counter;
u8 reserved;
u8 tx_results_counter;
__le32 rx_pkt_descs[WL18XX_NUM_RX_DESCRIPTORS];
__le32 fw_localtime;
/*
* A bitmap (where each bit represents a single HLID)
* to indicate if the station is in PS mode.
*/
__le32 link_ps_bitmap;
/*
* A bitmap (where each bit represents a single HLID) to indicate
* if the station is in Fast mode
*/
__le32 link_fast_bitmap;
/* Cumulative counter of total released mem blocks since FW-reset */
__le32 total_released_blks;
/* Size (in Memory Blocks) of TX pool */
__le32 tx_total;
struct wl18xx_fw_packet_counters_8_9_1 counters;
__le32 log_start_addr;
/* Private status to be used by the lower drivers */
struct wl18xx_fw_status_priv priv;
} __packed;
#define WL18XX_PHY_VERSION_MAX_LEN 20 #define WL18XX_PHY_VERSION_MAX_LEN 20
struct wl18xx_static_data_priv { struct wl18xx_static_data_priv {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment