Commit 6ae87626 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-aquantia-minor-bug-fixes-after-static-analysis'

Igor Russkikh says:

====================
net: aquantia: minor bug fixes after static analysis

This patchset fixes minor errors and warnings found by smatch and kasan.

Extra patch is to replace AQ_HW_WAIT_FOR with readx_poll_timeout
to improve readability.

V2:
use readx_poll
resubmitted to net-next since the changeset became quite big.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 699be715 0b926d46
...@@ -138,7 +138,7 @@ static void aq_ethtool_get_strings(struct net_device *ndev, ...@@ -138,7 +138,7 @@ static void aq_ethtool_get_strings(struct net_device *ndev,
u8 *p = data; u8 *p = data;
if (stringset == ETH_SS_STATS) { if (stringset == ETH_SS_STATS) {
memcpy(p, *aq_ethtool_stat_names, memcpy(p, aq_ethtool_stat_names,
sizeof(aq_ethtool_stat_names)); sizeof(aq_ethtool_stat_names));
p = p + sizeof(aq_ethtool_stat_names); p = p + sizeof(aq_ethtool_stat_names);
for (i = 0; i < cfg->vecs; i++) { for (i = 0; i < cfg->vecs; i++) {
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#ifndef AQ_HW_UTILS_H #ifndef AQ_HW_UTILS_H
#define AQ_HW_UTILS_H #define AQ_HW_UTILS_H
#include <linux/iopoll.h>
#include "aq_common.h" #include "aq_common.h"
#ifndef HIDWORD #ifndef HIDWORD
...@@ -23,18 +25,6 @@ ...@@ -23,18 +25,6 @@
#define AQ_HW_SLEEP(_US_) mdelay(_US_) #define AQ_HW_SLEEP(_US_) mdelay(_US_)
#define AQ_HW_WAIT_FOR(_B_, _US_, _N_) \
do { \
unsigned int AQ_HW_WAIT_FOR_i; \
for (AQ_HW_WAIT_FOR_i = _N_; (!(_B_)) && (AQ_HW_WAIT_FOR_i);\
--AQ_HW_WAIT_FOR_i) {\
udelay(_US_); \
} \
if (!AQ_HW_WAIT_FOR_i) {\
err = -ETIME; \
} \
} while (0)
#define aq_pr_err(...) pr_err(AQ_CFG_DRV_NAME ": " __VA_ARGS__) #define aq_pr_err(...) pr_err(AQ_CFG_DRV_NAME ": " __VA_ARGS__)
#define aq_pr_trace(...) pr_info(AQ_CFG_DRV_NAME ": " __VA_ARGS__) #define aq_pr_trace(...) pr_info(AQ_CFG_DRV_NAME ": " __VA_ARGS__)
......
...@@ -986,4 +986,4 @@ void aq_nic_shutdown(struct aq_nic_s *self) ...@@ -986,4 +986,4 @@ void aq_nic_shutdown(struct aq_nic_s *self)
err_exit: err_exit:
rtnl_unlock(); rtnl_unlock();
} }
\ No newline at end of file
...@@ -170,6 +170,8 @@ void aq_pci_func_free_irqs(struct aq_nic_s *self) ...@@ -170,6 +170,8 @@ void aq_pci_func_free_irqs(struct aq_nic_s *self)
for (i = 32U; i--;) { for (i = 32U; i--;) {
if (!((1U << i) & self->msix_entry_mask)) if (!((1U << i) & self->msix_entry_mask))
continue; continue;
if (i >= AQ_CFG_VECS_MAX)
continue;
if (pdev->msix_enabled) if (pdev->msix_enabled)
irq_set_affinity_hint(pci_irq_vector(pdev, i), NULL); irq_set_affinity_hint(pci_irq_vector(pdev, i), NULL);
......
...@@ -85,6 +85,7 @@ const struct aq_hw_caps_s hw_atl_a0_caps_aqc109 = { ...@@ -85,6 +85,7 @@ const struct aq_hw_caps_s hw_atl_a0_caps_aqc109 = {
static int hw_atl_a0_hw_reset(struct aq_hw_s *self) static int hw_atl_a0_hw_reset(struct aq_hw_s *self)
{ {
int err = 0; int err = 0;
u32 val;
hw_atl_glb_glb_reg_res_dis_set(self, 1U); hw_atl_glb_glb_reg_res_dis_set(self, 1U);
hw_atl_pci_pci_reg_res_dis_set(self, 0U); hw_atl_pci_pci_reg_res_dis_set(self, 0U);
...@@ -95,7 +96,9 @@ static int hw_atl_a0_hw_reset(struct aq_hw_s *self) ...@@ -95,7 +96,9 @@ static int hw_atl_a0_hw_reset(struct aq_hw_s *self)
hw_atl_glb_soft_res_set(self, 1); hw_atl_glb_soft_res_set(self, 1);
/* check 10 times by 1ms */ /* check 10 times by 1ms */
AQ_HW_WAIT_FOR(hw_atl_glb_soft_res_get(self) == 0, 1000U, 10U); err = readx_poll_timeout_atomic(hw_atl_glb_soft_res_get,
self, val, val == 0,
1000U, 10000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
...@@ -103,7 +106,9 @@ static int hw_atl_a0_hw_reset(struct aq_hw_s *self) ...@@ -103,7 +106,9 @@ static int hw_atl_a0_hw_reset(struct aq_hw_s *self)
hw_atl_itr_res_irq_set(self, 1U); hw_atl_itr_res_irq_set(self, 1U);
/* check 10 times by 1ms */ /* check 10 times by 1ms */
AQ_HW_WAIT_FOR(hw_atl_itr_res_irq_get(self) == 0, 1000U, 10U); err = readx_poll_timeout_atomic(hw_atl_itr_res_irq_get,
self, val, val == 0,
1000U, 10000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
...@@ -181,6 +186,7 @@ static int hw_atl_a0_hw_rss_hash_set(struct aq_hw_s *self, ...@@ -181,6 +186,7 @@ static int hw_atl_a0_hw_rss_hash_set(struct aq_hw_s *self,
int err = 0; int err = 0;
unsigned int i = 0U; unsigned int i = 0U;
unsigned int addr = 0U; unsigned int addr = 0U;
u32 val;
for (i = 10, addr = 0U; i--; ++addr) { for (i = 10, addr = 0U; i--; ++addr) {
u32 key_data = cfg->is_rss ? u32 key_data = cfg->is_rss ?
...@@ -188,8 +194,9 @@ static int hw_atl_a0_hw_rss_hash_set(struct aq_hw_s *self, ...@@ -188,8 +194,9 @@ static int hw_atl_a0_hw_rss_hash_set(struct aq_hw_s *self,
hw_atl_rpf_rss_key_wr_data_set(self, key_data); hw_atl_rpf_rss_key_wr_data_set(self, key_data);
hw_atl_rpf_rss_key_addr_set(self, addr); hw_atl_rpf_rss_key_addr_set(self, addr);
hw_atl_rpf_rss_key_wr_en_set(self, 1U); hw_atl_rpf_rss_key_wr_en_set(self, 1U);
AQ_HW_WAIT_FOR(hw_atl_rpf_rss_key_wr_en_get(self) == 0, err = readx_poll_timeout_atomic(hw_atl_rpf_rss_key_wr_en_get,
1000U, 10U); self, val, val == 0,
1000U, 10000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
} }
...@@ -207,8 +214,9 @@ static int hw_atl_a0_hw_rss_set(struct aq_hw_s *self, ...@@ -207,8 +214,9 @@ static int hw_atl_a0_hw_rss_set(struct aq_hw_s *self,
u32 i = 0U; u32 i = 0U;
u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues); u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues);
int err = 0; int err = 0;
u16 bitary[(HW_ATL_A0_RSS_REDIRECTION_MAX * u16 bitary[1 + (HW_ATL_A0_RSS_REDIRECTION_MAX *
HW_ATL_A0_RSS_REDIRECTION_BITS / 16U)]; HW_ATL_A0_RSS_REDIRECTION_BITS / 16U)];
u32 val;
memset(bitary, 0, sizeof(bitary)); memset(bitary, 0, sizeof(bitary));
...@@ -222,8 +230,9 @@ static int hw_atl_a0_hw_rss_set(struct aq_hw_s *self, ...@@ -222,8 +230,9 @@ static int hw_atl_a0_hw_rss_set(struct aq_hw_s *self,
hw_atl_rpf_rss_redir_tbl_wr_data_set(self, bitary[i]); hw_atl_rpf_rss_redir_tbl_wr_data_set(self, bitary[i]);
hw_atl_rpf_rss_redir_tbl_addr_set(self, i); hw_atl_rpf_rss_redir_tbl_addr_set(self, i);
hw_atl_rpf_rss_redir_wr_en_set(self, 1U); hw_atl_rpf_rss_redir_wr_en_set(self, 1U);
AQ_HW_WAIT_FOR(hw_atl_rpf_rss_redir_wr_en_get(self) == 0, err = readx_poll_timeout_atomic(hw_atl_rpf_rss_redir_wr_en_get,
1000U, 10U); self, val, val == 0,
1000U, 10000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
} }
......
...@@ -173,6 +173,7 @@ static int hw_atl_b0_hw_rss_hash_set(struct aq_hw_s *self, ...@@ -173,6 +173,7 @@ static int hw_atl_b0_hw_rss_hash_set(struct aq_hw_s *self,
int err = 0; int err = 0;
unsigned int i = 0U; unsigned int i = 0U;
unsigned int addr = 0U; unsigned int addr = 0U;
u32 val;
for (i = 10, addr = 0U; i--; ++addr) { for (i = 10, addr = 0U; i--; ++addr) {
u32 key_data = cfg->is_rss ? u32 key_data = cfg->is_rss ?
...@@ -180,8 +181,9 @@ static int hw_atl_b0_hw_rss_hash_set(struct aq_hw_s *self, ...@@ -180,8 +181,9 @@ static int hw_atl_b0_hw_rss_hash_set(struct aq_hw_s *self,
hw_atl_rpf_rss_key_wr_data_set(self, key_data); hw_atl_rpf_rss_key_wr_data_set(self, key_data);
hw_atl_rpf_rss_key_addr_set(self, addr); hw_atl_rpf_rss_key_addr_set(self, addr);
hw_atl_rpf_rss_key_wr_en_set(self, 1U); hw_atl_rpf_rss_key_wr_en_set(self, 1U);
AQ_HW_WAIT_FOR(hw_atl_rpf_rss_key_wr_en_get(self) == 0, err = readx_poll_timeout_atomic(hw_atl_rpf_rss_key_wr_en_get,
1000U, 10U); self, val, val == 0,
1000U, 10000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
} }
...@@ -199,8 +201,9 @@ static int hw_atl_b0_hw_rss_set(struct aq_hw_s *self, ...@@ -199,8 +201,9 @@ static int hw_atl_b0_hw_rss_set(struct aq_hw_s *self,
u32 i = 0U; u32 i = 0U;
u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues); u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues);
int err = 0; int err = 0;
u16 bitary[(HW_ATL_B0_RSS_REDIRECTION_MAX * u16 bitary[1 + (HW_ATL_B0_RSS_REDIRECTION_MAX *
HW_ATL_B0_RSS_REDIRECTION_BITS / 16U)]; HW_ATL_B0_RSS_REDIRECTION_BITS / 16U)];
u32 val;
memset(bitary, 0, sizeof(bitary)); memset(bitary, 0, sizeof(bitary));
...@@ -214,8 +217,9 @@ static int hw_atl_b0_hw_rss_set(struct aq_hw_s *self, ...@@ -214,8 +217,9 @@ static int hw_atl_b0_hw_rss_set(struct aq_hw_s *self,
hw_atl_rpf_rss_redir_tbl_wr_data_set(self, bitary[i]); hw_atl_rpf_rss_redir_tbl_wr_data_set(self, bitary[i]);
hw_atl_rpf_rss_redir_tbl_addr_set(self, i); hw_atl_rpf_rss_redir_tbl_addr_set(self, i);
hw_atl_rpf_rss_redir_wr_en_set(self, 1U); hw_atl_rpf_rss_redir_wr_en_set(self, 1U);
AQ_HW_WAIT_FOR(hw_atl_rpf_rss_redir_wr_en_get(self) == 0, err = readx_poll_timeout_atomic(hw_atl_rpf_rss_redir_wr_en_get,
1000U, 10U); self, val, val == 0,
1000U, 10000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
} }
......
...@@ -1585,3 +1585,24 @@ void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location, ...@@ -1585,3 +1585,24 @@ void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location,
HW_ATL_RPF_L3_DSTA_ADR(location + i), HW_ATL_RPF_L3_DSTA_ADR(location + i),
ipv6_dest[i]); ipv6_dest[i]);
} }
u32 hw_atl_sem_ram_get(struct aq_hw_s *self)
{
return hw_atl_reg_glb_cpu_sem_get(self, HW_ATL_FW_SM_RAM);
}
u32 hw_atl_scrpad_get(struct aq_hw_s *aq_hw, u32 scratch_scp)
{
return aq_hw_read_reg(aq_hw,
HW_ATL_GLB_CPU_SCRATCH_SCP_ADR(scratch_scp));
}
u32 hw_atl_scrpad12_get(struct aq_hw_s *self)
{
return hw_atl_scrpad_get(self, 0xB);
}
u32 hw_atl_scrpad25_get(struct aq_hw_s *self)
{
return hw_atl_scrpad_get(self, 0x18);
}
...@@ -752,4 +752,16 @@ void hw_atl_rpfl3l4_ipv6_src_addr_set(struct aq_hw_s *aq_hw, u8 location, ...@@ -752,4 +752,16 @@ void hw_atl_rpfl3l4_ipv6_src_addr_set(struct aq_hw_s *aq_hw, u8 location,
void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location, void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location,
u32 *ipv6_dest); u32 *ipv6_dest);
/* get global microprocessor ram semaphore */
u32 hw_atl_sem_ram_get(struct aq_hw_s *self);
/* get global microprocessor scratch pad register */
u32 hw_atl_scrpad_get(struct aq_hw_s *aq_hw, u32 scratch_scp);
/* get global microprocessor scratch pad 12 register */
u32 hw_atl_scrpad12_get(struct aq_hw_s *self);
/* get global microprocessor scratch pad 25 register */
u32 hw_atl_scrpad25_get(struct aq_hw_s *self);
#endif /* HW_ATL_LLH_H */ #endif /* HW_ATL_LLH_H */
...@@ -2519,4 +2519,6 @@ ...@@ -2519,4 +2519,6 @@
/* Default value of bitfield l3_da0[1F:0] */ /* Default value of bitfield l3_da0[1F:0] */
#define HW_ATL_RPF_L3_DSTA_DEFAULT 0x0 #define HW_ATL_RPF_L3_DSTA_DEFAULT 0x0
#define HW_ATL_FW_SM_RAM 0x2U
#endif /* HW_ATL_LLH_INTERNAL_H */ #endif /* HW_ATL_LLH_INTERNAL_H */
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
#define HW_ATL_MIF_ADDR 0x0208U #define HW_ATL_MIF_ADDR 0x0208U
#define HW_ATL_MIF_VAL 0x020CU #define HW_ATL_MIF_VAL 0x020CU
#define HW_ATL_FW_SM_RAM 0x2U #define HW_ATL_RPC_CONTROL_ADR 0x0338U
#define HW_ATL_RPC_STATE_ADR 0x033CU
#define HW_ATL_MPI_FW_VERSION 0x18 #define HW_ATL_MPI_FW_VERSION 0x18
#define HW_ATL_MPI_CONTROL_ADR 0x0368U #define HW_ATL_MPI_CONTROL_ADR 0x0368U
#define HW_ATL_MPI_STATE_ADR 0x036CU #define HW_ATL_MPI_STATE_ADR 0x036CU
...@@ -53,6 +55,12 @@ static int hw_atl_utils_ver_match(u32 ver_expected, u32 ver_actual); ...@@ -53,6 +55,12 @@ static int hw_atl_utils_ver_match(u32 ver_expected, u32 ver_actual);
static int hw_atl_utils_mpi_set_state(struct aq_hw_s *self, static int hw_atl_utils_mpi_set_state(struct aq_hw_s *self,
enum hal_atl_utils_fw_state_e state); enum hal_atl_utils_fw_state_e state);
static u32 hw_atl_utils_get_mpi_mbox_tid(struct aq_hw_s *self);
static u32 hw_atl_utils_mpi_get_state(struct aq_hw_s *self);
static u32 hw_atl_utils_mif_cmd_get(struct aq_hw_s *self);
static u32 hw_atl_utils_mif_addr_get(struct aq_hw_s *self);
static u32 hw_atl_utils_rpc_state_get(struct aq_hw_s *self);
int hw_atl_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops) int hw_atl_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops)
{ {
int err = 0; int err = 0;
...@@ -234,6 +242,7 @@ int hw_atl_utils_soft_reset(struct aq_hw_s *self) ...@@ -234,6 +242,7 @@ int hw_atl_utils_soft_reset(struct aq_hw_s *self)
{ {
int k; int k;
u32 boot_exit_code = 0; u32 boot_exit_code = 0;
u32 val;
for (k = 0; k < 1000; ++k) { for (k = 0; k < 1000; ++k) {
u32 flb_status = aq_hw_read_reg(self, u32 flb_status = aq_hw_read_reg(self,
...@@ -260,9 +269,11 @@ int hw_atl_utils_soft_reset(struct aq_hw_s *self) ...@@ -260,9 +269,11 @@ int hw_atl_utils_soft_reset(struct aq_hw_s *self)
int err = 0; int err = 0;
hw_atl_utils_mpi_set_state(self, MPI_DEINIT); hw_atl_utils_mpi_set_state(self, MPI_DEINIT);
AQ_HW_WAIT_FOR((aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR) & err = readx_poll_timeout_atomic(hw_atl_utils_mpi_get_state,
HW_ATL_MPI_STATE_MSK) == MPI_DEINIT, self, val,
10, 1000U); (val & HW_ATL_MPI_STATE_MSK) ==
MPI_DEINIT,
10, 10000U);
if (err) if (err)
return err; return err;
} }
...@@ -277,16 +288,17 @@ int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a, ...@@ -277,16 +288,17 @@ int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a,
u32 *p, u32 cnt) u32 *p, u32 cnt)
{ {
int err = 0; int err = 0;
u32 val;
AQ_HW_WAIT_FOR(hw_atl_reg_glb_cpu_sem_get(self, err = readx_poll_timeout_atomic(hw_atl_sem_ram_get,
HW_ATL_FW_SM_RAM) == 1U, self, val, val == 1U,
1U, 10000U); 1U, 10000U);
if (err < 0) { if (err < 0) {
bool is_locked; bool is_locked;
hw_atl_reg_glb_cpu_sem_set(self, 1U, HW_ATL_FW_SM_RAM); hw_atl_reg_glb_cpu_sem_set(self, 1U, HW_ATL_FW_SM_RAM);
is_locked = hw_atl_reg_glb_cpu_sem_get(self, HW_ATL_FW_SM_RAM); is_locked = hw_atl_sem_ram_get(self);
if (!is_locked) { if (!is_locked) {
err = -ETIME; err = -ETIME;
goto err_exit; goto err_exit;
...@@ -299,13 +311,14 @@ int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a, ...@@ -299,13 +311,14 @@ int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a,
aq_hw_write_reg(self, HW_ATL_MIF_CMD, 0x00008000U); aq_hw_write_reg(self, HW_ATL_MIF_CMD, 0x00008000U);
if (IS_CHIP_FEATURE(REVISION_B1)) if (IS_CHIP_FEATURE(REVISION_B1))
AQ_HW_WAIT_FOR(a != aq_hw_read_reg(self, err = readx_poll_timeout_atomic(hw_atl_utils_mif_addr_get,
HW_ATL_MIF_ADDR), self, val, val != a,
1, 1000U); 1U, 1000U);
else else
AQ_HW_WAIT_FOR(!(0x100 & aq_hw_read_reg(self, err = readx_poll_timeout_atomic(hw_atl_utils_mif_cmd_get,
HW_ATL_MIF_CMD)), self, val,
1, 1000U); !(val & 0x100),
1U, 1000U);
*(p++) = aq_hw_read_reg(self, HW_ATL_MIF_VAL); *(p++) = aq_hw_read_reg(self, HW_ATL_MIF_VAL);
a += 4; a += 4;
...@@ -320,10 +333,11 @@ int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a, ...@@ -320,10 +333,11 @@ int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a,
static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p, static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p,
u32 cnt) u32 cnt)
{ {
u32 val;
int err = 0; int err = 0;
bool is_locked; bool is_locked;
is_locked = hw_atl_reg_glb_cpu_sem_get(self, HW_ATL_FW_SM_RAM); is_locked = hw_atl_sem_ram_get(self);
if (!is_locked) { if (!is_locked) {
err = -ETIME; err = -ETIME;
goto err_exit; goto err_exit;
...@@ -337,10 +351,11 @@ static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p, ...@@ -337,10 +351,11 @@ static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p,
(0x80000000 | (0xFFFF & (offset * 4)))); (0x80000000 | (0xFFFF & (offset * 4))));
hw_atl_mcp_up_force_intr_set(self, 1); hw_atl_mcp_up_force_intr_set(self, 1);
/* 1000 times by 10us = 10ms */ /* 1000 times by 10us = 10ms */
AQ_HW_WAIT_FOR((aq_hw_read_reg(self, err = readx_poll_timeout_atomic(hw_atl_scrpad12_get,
0x32C) & 0xF0000000) != self, val,
0x80000000, (val & 0xF0000000) ==
10, 1000); 0x80000000,
10U, 10000U);
} }
} else { } else {
u32 offset = 0; u32 offset = 0;
...@@ -351,8 +366,10 @@ static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p, ...@@ -351,8 +366,10 @@ static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p,
aq_hw_write_reg(self, 0x20C, p[offset]); aq_hw_write_reg(self, 0x20C, p[offset]);
aq_hw_write_reg(self, 0x200, 0xC000); aq_hw_write_reg(self, 0x200, 0xC000);
AQ_HW_WAIT_FOR((aq_hw_read_reg(self, 0x200U) & err = readx_poll_timeout_atomic(hw_atl_utils_mif_cmd_get,
0x100) == 0, 10, 1000); self, val,
(val & 0x100) == 0,
1000U, 10000U);
} }
} }
...@@ -395,15 +412,14 @@ static int hw_atl_utils_init_ucp(struct aq_hw_s *self, ...@@ -395,15 +412,14 @@ static int hw_atl_utils_init_ucp(struct aq_hw_s *self,
hw_atl_reg_glb_cpu_scratch_scp_set(self, 0x00000000U, 25U); hw_atl_reg_glb_cpu_scratch_scp_set(self, 0x00000000U, 25U);
/* check 10 times by 1ms */ /* check 10 times by 1ms */
AQ_HW_WAIT_FOR(0U != (self->mbox_addr = err = readx_poll_timeout_atomic(hw_atl_scrpad25_get,
aq_hw_read_reg(self, 0x360U)), 1000U, 10U); self, self->mbox_addr,
self->mbox_addr != 0U,
1000U, 10000U);
return err; return err;
} }
#define HW_ATL_RPC_CONTROL_ADR 0x0338U
#define HW_ATL_RPC_STATE_ADR 0x033CU
struct aq_hw_atl_utils_fw_rpc_tid_s { struct aq_hw_atl_utils_fw_rpc_tid_s {
union { union {
u32 val; u32 val;
...@@ -452,10 +468,10 @@ int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self, ...@@ -452,10 +468,10 @@ int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self,
self->rpc_tid = sw.tid; self->rpc_tid = sw.tid;
AQ_HW_WAIT_FOR(sw.tid == err = readx_poll_timeout_atomic(hw_atl_utils_rpc_state_get,
(fw.val = self, fw.val,
aq_hw_read_reg(self, HW_ATL_RPC_STATE_ADR), sw.tid == fw.tid,
fw.tid), 1000U, 100U); 1000U, 100000U);
if (fw.len == 0xFFFFU) { if (fw.len == 0xFFFFU) {
err = hw_atl_utils_fw_rpc_call(self, sw.len); err = hw_atl_utils_fw_rpc_call(self, sw.len);
...@@ -559,10 +575,11 @@ static int hw_atl_utils_mpi_set_state(struct aq_hw_s *self, ...@@ -559,10 +575,11 @@ static int hw_atl_utils_mpi_set_state(struct aq_hw_s *self,
transaction_id = mbox.transaction_id; transaction_id = mbox.transaction_id;
AQ_HW_WAIT_FOR(transaction_id != err = readx_poll_timeout_atomic(hw_atl_utils_get_mpi_mbox_tid,
(hw_atl_utils_mpi_read_mbox(self, &mbox), self, mbox.transaction_id,
mbox.transaction_id), transaction_id !=
1000U, 100U); mbox.transaction_id,
1000U, 100000U);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
} }
...@@ -585,7 +602,7 @@ static int hw_atl_utils_mpi_set_state(struct aq_hw_s *self, ...@@ -585,7 +602,7 @@ static int hw_atl_utils_mpi_set_state(struct aq_hw_s *self,
int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self) int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self)
{ {
u32 cp0x036C = aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR); u32 cp0x036C = hw_atl_utils_mpi_get_state(self);
u32 link_speed_mask = cp0x036C >> HW_ATL_MPI_SPEED_SHIFT; u32 link_speed_mask = cp0x036C >> HW_ATL_MPI_SPEED_SHIFT;
struct aq_hw_link_status_s *link_status = &self->aq_link_status; struct aq_hw_link_status_s *link_status = &self->aq_link_status;
...@@ -905,6 +922,35 @@ static int aq_fw1x_set_power(struct aq_hw_s *self, unsigned int power_state, ...@@ -905,6 +922,35 @@ static int aq_fw1x_set_power(struct aq_hw_s *self, unsigned int power_state,
return err; return err;
} }
static u32 hw_atl_utils_get_mpi_mbox_tid(struct aq_hw_s *self)
{
struct hw_atl_utils_mbox_header mbox;
hw_atl_utils_mpi_read_mbox(self, &mbox);
return mbox.transaction_id;
}
static u32 hw_atl_utils_mpi_get_state(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR);
}
static u32 hw_atl_utils_mif_cmd_get(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_MIF_CMD);
}
static u32 hw_atl_utils_mif_addr_get(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_MIF_ADDR);
}
static u32 hw_atl_utils_rpc_state_get(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_RPC_STATE_ADR);
}
const struct aq_fw_ops aq_fw_1x_ops = { const struct aq_fw_ops aq_fw_1x_ops = {
.init = hw_atl_utils_mpi_create, .init = hw_atl_utils_mpi_create,
.deinit = hw_atl_fw1x_deinit, .deinit = hw_atl_fw1x_deinit,
......
...@@ -20,15 +20,14 @@ ...@@ -20,15 +20,14 @@
#include "hw_atl_utils.h" #include "hw_atl_utils.h"
#include "hw_atl_llh.h" #include "hw_atl_llh.h"
#define HW_ATL_FW2X_MPI_EFUSE_ADDR 0x364
#define HW_ATL_FW2X_MPI_MBOX_ADDR 0x360
#define HW_ATL_FW2X_MPI_RPC_ADDR 0x334 #define HW_ATL_FW2X_MPI_RPC_ADDR 0x334
#define HW_ATL_FW2X_MPI_MBOX_ADDR 0x360
#define HW_ATL_FW2X_MPI_EFUSE_ADDR 0x364
#define HW_ATL_FW2X_MPI_CONTROL_ADDR 0x368 #define HW_ATL_FW2X_MPI_CONTROL_ADDR 0x368
#define HW_ATL_FW2X_MPI_CONTROL2_ADDR 0x36C #define HW_ATL_FW2X_MPI_CONTROL2_ADDR 0x36C
#define HW_ATL_FW2X_MPI_STATE_ADDR 0x370 #define HW_ATL_FW2X_MPI_STATE_ADDR 0x370
#define HW_ATL_FW2X_MPI_STATE2_ADDR 0x374 #define HW_ATL_FW2X_MPI_STATE2_ADDR 0x374
#define HW_ATL_FW2X_CAP_PAUSE BIT(CAPS_HI_PAUSE) #define HW_ATL_FW2X_CAP_PAUSE BIT(CAPS_HI_PAUSE)
#define HW_ATL_FW2X_CAP_ASYM_PAUSE BIT(CAPS_HI_ASYMMETRIC_PAUSE) #define HW_ATL_FW2X_CAP_ASYM_PAUSE BIT(CAPS_HI_ASYMMETRIC_PAUSE)
...@@ -72,17 +71,24 @@ static int aq_fw2x_set_link_speed(struct aq_hw_s *self, u32 speed); ...@@ -72,17 +71,24 @@ static int aq_fw2x_set_link_speed(struct aq_hw_s *self, u32 speed);
static int aq_fw2x_set_state(struct aq_hw_s *self, static int aq_fw2x_set_state(struct aq_hw_s *self,
enum hal_atl_utils_fw_state_e state); enum hal_atl_utils_fw_state_e state);
static u32 aq_fw2x_mbox_get(struct aq_hw_s *self);
static u32 aq_fw2x_rpc_get(struct aq_hw_s *self);
static u32 aq_fw2x_state2_get(struct aq_hw_s *self);
static int aq_fw2x_init(struct aq_hw_s *self) static int aq_fw2x_init(struct aq_hw_s *self)
{ {
int err = 0; int err = 0;
/* check 10 times by 1ms */ /* check 10 times by 1ms */
AQ_HW_WAIT_FOR(0U != (self->mbox_addr = err = readx_poll_timeout_atomic(aq_fw2x_mbox_get,
aq_hw_read_reg(self, HW_ATL_FW2X_MPI_MBOX_ADDR)), self, self->mbox_addr,
1000U, 10U); self->mbox_addr != 0U,
AQ_HW_WAIT_FOR(0U != (self->rpc_addr = 1000U, 10000U);
aq_hw_read_reg(self, HW_ATL_FW2X_MPI_RPC_ADDR)),
1000U, 100U); err = readx_poll_timeout_atomic(aq_fw2x_rpc_get,
self, self->rpc_addr,
self->rpc_addr != 0U,
1000U, 100000U);
return err; return err;
} }
...@@ -286,16 +292,18 @@ static int aq_fw2x_update_stats(struct aq_hw_s *self) ...@@ -286,16 +292,18 @@ static int aq_fw2x_update_stats(struct aq_hw_s *self)
int err = 0; int err = 0;
u32 mpi_opts = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR); u32 mpi_opts = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR);
u32 orig_stats_val = mpi_opts & BIT(CAPS_HI_STATISTICS); u32 orig_stats_val = mpi_opts & BIT(CAPS_HI_STATISTICS);
u32 stats_val;
/* Toggle statistics bit for FW to update */ /* Toggle statistics bit for FW to update */
mpi_opts = mpi_opts ^ BIT(CAPS_HI_STATISTICS); mpi_opts = mpi_opts ^ BIT(CAPS_HI_STATISTICS);
aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts); aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts);
/* Wait FW to report back */ /* Wait FW to report back */
AQ_HW_WAIT_FOR(orig_stats_val != err = readx_poll_timeout_atomic(aq_fw2x_state2_get,
(aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR) & self, stats_val,
BIT(CAPS_HI_STATISTICS)), orig_stats_val != (stats_val &
1U, 10000U); BIT(CAPS_HI_STATISTICS)),
1U, 10000U);
if (err) if (err)
return err; return err;
...@@ -309,6 +317,7 @@ static int aq_fw2x_set_sleep_proxy(struct aq_hw_s *self, u8 *mac) ...@@ -309,6 +317,7 @@ static int aq_fw2x_set_sleep_proxy(struct aq_hw_s *self, u8 *mac)
unsigned int rpc_size = 0U; unsigned int rpc_size = 0U;
u32 mpi_opts; u32 mpi_opts;
int err = 0; int err = 0;
u32 val;
rpc_size = sizeof(rpc->msg_id) + sizeof(*cfg); rpc_size = sizeof(rpc->msg_id) + sizeof(*cfg);
...@@ -337,8 +346,10 @@ static int aq_fw2x_set_sleep_proxy(struct aq_hw_s *self, u8 *mac) ...@@ -337,8 +346,10 @@ static int aq_fw2x_set_sleep_proxy(struct aq_hw_s *self, u8 *mac)
mpi_opts |= HW_ATL_FW2X_CTRL_SLEEP_PROXY; mpi_opts |= HW_ATL_FW2X_CTRL_SLEEP_PROXY;
aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts); aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts);
AQ_HW_WAIT_FOR((aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR) & err = readx_poll_timeout_atomic(aq_fw2x_state2_get,
HW_ATL_FW2X_CTRL_SLEEP_PROXY), 1U, 10000U); self, val,
val & HW_ATL_FW2X_CTRL_SLEEP_PROXY,
1U, 10000U);
err_exit: err_exit:
return err; return err;
...@@ -350,6 +361,7 @@ static int aq_fw2x_set_wol_params(struct aq_hw_s *self, u8 *mac) ...@@ -350,6 +361,7 @@ static int aq_fw2x_set_wol_params(struct aq_hw_s *self, u8 *mac)
struct fw2x_msg_wol *msg = NULL; struct fw2x_msg_wol *msg = NULL;
u32 mpi_opts; u32 mpi_opts;
int err = 0; int err = 0;
u32 val;
err = hw_atl_utils_fw_rpc_wait(self, &rpc); err = hw_atl_utils_fw_rpc_wait(self, &rpc);
if (err < 0) if (err < 0)
...@@ -374,8 +386,9 @@ static int aq_fw2x_set_wol_params(struct aq_hw_s *self, u8 *mac) ...@@ -374,8 +386,9 @@ static int aq_fw2x_set_wol_params(struct aq_hw_s *self, u8 *mac)
mpi_opts |= HW_ATL_FW2X_CTRL_WOL; mpi_opts |= HW_ATL_FW2X_CTRL_WOL;
aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts); aq_hw_write_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR, mpi_opts);
AQ_HW_WAIT_FOR((aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR) & err = readx_poll_timeout_atomic(aq_fw2x_state2_get,
HW_ATL_FW2X_CTRL_WOL), 1U, 10000U); self, val, val & HW_ATL_FW2X_CTRL_WOL,
1U, 10000U);
err_exit: err_exit:
return err; return err;
...@@ -425,7 +438,7 @@ static int aq_fw2x_get_eee_rate(struct aq_hw_s *self, u32 *rate, ...@@ -425,7 +438,7 @@ static int aq_fw2x_get_eee_rate(struct aq_hw_s *self, u32 *rate,
*supported_rates = fw2x_to_eee_mask(caps_hi); *supported_rates = fw2x_to_eee_mask(caps_hi);
mpi_state = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR); mpi_state = aq_fw2x_state2_get(self);
*rate = fw2x_to_eee_mask(mpi_state); *rate = fw2x_to_eee_mask(mpi_state);
return err; return err;
...@@ -455,7 +468,7 @@ static int aq_fw2x_set_flow_control(struct aq_hw_s *self) ...@@ -455,7 +468,7 @@ static int aq_fw2x_set_flow_control(struct aq_hw_s *self)
static u32 aq_fw2x_get_flow_control(struct aq_hw_s *self, u32 *fcmode) static u32 aq_fw2x_get_flow_control(struct aq_hw_s *self, u32 *fcmode)
{ {
u32 mpi_state = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR); u32 mpi_state = aq_fw2x_state2_get(self);
if (mpi_state & HW_ATL_FW2X_CAP_PAUSE) if (mpi_state & HW_ATL_FW2X_CAP_PAUSE)
if (mpi_state & HW_ATL_FW2X_CAP_ASYM_PAUSE) if (mpi_state & HW_ATL_FW2X_CAP_ASYM_PAUSE)
...@@ -471,6 +484,21 @@ static u32 aq_fw2x_get_flow_control(struct aq_hw_s *self, u32 *fcmode) ...@@ -471,6 +484,21 @@ static u32 aq_fw2x_get_flow_control(struct aq_hw_s *self, u32 *fcmode)
return 0; return 0;
} }
static u32 aq_fw2x_mbox_get(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_FW2X_MPI_MBOX_ADDR);
}
static u32 aq_fw2x_rpc_get(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_FW2X_MPI_RPC_ADDR);
}
static u32 aq_fw2x_state2_get(struct aq_hw_s *self)
{
return aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR);
}
const struct aq_fw_ops aq_fw_2x_ops = { const struct aq_fw_ops aq_fw_2x_ops = {
.init = aq_fw2x_init, .init = aq_fw2x_init,
.deinit = aq_fw2x_deinit, .deinit = aq_fw2x_deinit,
......
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