|
|
|
@@ -8,27 +8,6 @@
|
|
|
|
|
|
|
|
|
|
static void i40e_resume_aq(struct i40e_hw *hw);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* i40e_adminq_init_regs - Initialize AdminQ registers
|
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
|
*
|
|
|
|
|
* This assumes the alloc_asq and alloc_arq functions have already been called
|
|
|
|
|
**/
|
|
|
|
|
static void i40e_adminq_init_regs(struct i40e_hw *hw)
|
|
|
|
|
{
|
|
|
|
|
/* set head and tail registers in our local struct */
|
|
|
|
|
hw->aq.asq.tail = I40E_PF_ATQT;
|
|
|
|
|
hw->aq.asq.head = I40E_PF_ATQH;
|
|
|
|
|
hw->aq.asq.len = I40E_PF_ATQLEN;
|
|
|
|
|
hw->aq.asq.bal = I40E_PF_ATQBAL;
|
|
|
|
|
hw->aq.asq.bah = I40E_PF_ATQBAH;
|
|
|
|
|
hw->aq.arq.tail = I40E_PF_ARQT;
|
|
|
|
|
hw->aq.arq.head = I40E_PF_ARQH;
|
|
|
|
|
hw->aq.arq.len = I40E_PF_ARQLEN;
|
|
|
|
|
hw->aq.arq.bal = I40E_PF_ARQBAL;
|
|
|
|
|
hw->aq.arq.bah = I40E_PF_ARQBAH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* i40e_alloc_adminq_asq_ring - Allocate Admin Queue send rings
|
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
@@ -254,17 +233,17 @@ static int i40e_config_asq_regs(struct i40e_hw *hw)
|
|
|
|
|
u32 reg = 0;
|
|
|
|
|
|
|
|
|
|
/* Clear Head and Tail */
|
|
|
|
|
wr32(hw, hw->aq.asq.head, 0);
|
|
|
|
|
wr32(hw, hw->aq.asq.tail, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQH, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQT, 0);
|
|
|
|
|
|
|
|
|
|
/* set starting point */
|
|
|
|
|
wr32(hw, hw->aq.asq.len, (hw->aq.num_asq_entries |
|
|
|
|
|
wr32(hw, I40E_PF_ATQLEN, (hw->aq.num_asq_entries |
|
|
|
|
|
I40E_PF_ATQLEN_ATQENABLE_MASK));
|
|
|
|
|
wr32(hw, hw->aq.asq.bal, lower_32_bits(hw->aq.asq.desc_buf.pa));
|
|
|
|
|
wr32(hw, hw->aq.asq.bah, upper_32_bits(hw->aq.asq.desc_buf.pa));
|
|
|
|
|
wr32(hw, I40E_PF_ATQBAL, lower_32_bits(hw->aq.asq.desc_buf.pa));
|
|
|
|
|
wr32(hw, I40E_PF_ATQBAH, upper_32_bits(hw->aq.asq.desc_buf.pa));
|
|
|
|
|
|
|
|
|
|
/* Check one register to verify that config was applied */
|
|
|
|
|
reg = rd32(hw, hw->aq.asq.bal);
|
|
|
|
|
reg = rd32(hw, I40E_PF_ATQBAL);
|
|
|
|
|
if (reg != lower_32_bits(hw->aq.asq.desc_buf.pa))
|
|
|
|
|
ret_code = -EIO;
|
|
|
|
|
|
|
|
|
@@ -283,20 +262,20 @@ static int i40e_config_arq_regs(struct i40e_hw *hw)
|
|
|
|
|
u32 reg = 0;
|
|
|
|
|
|
|
|
|
|
/* Clear Head and Tail */
|
|
|
|
|
wr32(hw, hw->aq.arq.head, 0);
|
|
|
|
|
wr32(hw, hw->aq.arq.tail, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQH, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQT, 0);
|
|
|
|
|
|
|
|
|
|
/* set starting point */
|
|
|
|
|
wr32(hw, hw->aq.arq.len, (hw->aq.num_arq_entries |
|
|
|
|
|
wr32(hw, I40E_PF_ARQLEN, (hw->aq.num_arq_entries |
|
|
|
|
|
I40E_PF_ARQLEN_ARQENABLE_MASK));
|
|
|
|
|
wr32(hw, hw->aq.arq.bal, lower_32_bits(hw->aq.arq.desc_buf.pa));
|
|
|
|
|
wr32(hw, hw->aq.arq.bah, upper_32_bits(hw->aq.arq.desc_buf.pa));
|
|
|
|
|
wr32(hw, I40E_PF_ARQBAL, lower_32_bits(hw->aq.arq.desc_buf.pa));
|
|
|
|
|
wr32(hw, I40E_PF_ARQBAH, upper_32_bits(hw->aq.arq.desc_buf.pa));
|
|
|
|
|
|
|
|
|
|
/* Update tail in the HW to post pre-allocated buffers */
|
|
|
|
|
wr32(hw, hw->aq.arq.tail, hw->aq.num_arq_entries - 1);
|
|
|
|
|
wr32(hw, I40E_PF_ARQT, hw->aq.num_arq_entries - 1);
|
|
|
|
|
|
|
|
|
|
/* Check one register to verify that config was applied */
|
|
|
|
|
reg = rd32(hw, hw->aq.arq.bal);
|
|
|
|
|
reg = rd32(hw, I40E_PF_ARQBAL);
|
|
|
|
|
if (reg != lower_32_bits(hw->aq.arq.desc_buf.pa))
|
|
|
|
|
ret_code = -EIO;
|
|
|
|
|
|
|
|
|
@@ -439,11 +418,11 @@ static int i40e_shutdown_asq(struct i40e_hw *hw)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Stop firmware AdminQ processing */
|
|
|
|
|
wr32(hw, hw->aq.asq.head, 0);
|
|
|
|
|
wr32(hw, hw->aq.asq.tail, 0);
|
|
|
|
|
wr32(hw, hw->aq.asq.len, 0);
|
|
|
|
|
wr32(hw, hw->aq.asq.bal, 0);
|
|
|
|
|
wr32(hw, hw->aq.asq.bah, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQH, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQT, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQLEN, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQBAL, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ATQBAH, 0);
|
|
|
|
|
|
|
|
|
|
hw->aq.asq.count = 0; /* to indicate uninitialized queue */
|
|
|
|
|
|
|
|
|
@@ -473,11 +452,11 @@ static int i40e_shutdown_arq(struct i40e_hw *hw)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Stop firmware AdminQ processing */
|
|
|
|
|
wr32(hw, hw->aq.arq.head, 0);
|
|
|
|
|
wr32(hw, hw->aq.arq.tail, 0);
|
|
|
|
|
wr32(hw, hw->aq.arq.len, 0);
|
|
|
|
|
wr32(hw, hw->aq.arq.bal, 0);
|
|
|
|
|
wr32(hw, hw->aq.arq.bah, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQH, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQT, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQLEN, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQBAL, 0);
|
|
|
|
|
wr32(hw, I40E_PF_ARQBAH, 0);
|
|
|
|
|
|
|
|
|
|
hw->aq.arq.count = 0; /* to indicate uninitialized queue */
|
|
|
|
|
|
|
|
|
@@ -608,9 +587,6 @@ int i40e_init_adminq(struct i40e_hw *hw)
|
|
|
|
|
goto init_adminq_exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set up register offsets */
|
|
|
|
|
i40e_adminq_init_regs(hw);
|
|
|
|
|
|
|
|
|
|
/* setup ASQ command write back timeout */
|
|
|
|
|
hw->aq.asq_cmd_timeout = I40E_ASQ_CMD_TIMEOUT;
|
|
|
|
|
|
|
|
|
@@ -720,9 +696,9 @@ static u16 i40e_clean_asq(struct i40e_hw *hw)
|
|
|
|
|
|
|
|
|
|
desc = I40E_ADMINQ_DESC(*asq, ntc);
|
|
|
|
|
details = I40E_ADMINQ_DETAILS(*asq, ntc);
|
|
|
|
|
while (rd32(hw, hw->aq.asq.head) != ntc) {
|
|
|
|
|
while (rd32(hw, I40E_PF_ATQH) != ntc) {
|
|
|
|
|
i40e_debug(hw, I40E_DEBUG_AQ_COMMAND,
|
|
|
|
|
"ntc %d head %d.\n", ntc, rd32(hw, hw->aq.asq.head));
|
|
|
|
|
"ntc %d head %d.\n", ntc, rd32(hw, I40E_PF_ATQH));
|
|
|
|
|
|
|
|
|
|
if (details->callback) {
|
|
|
|
|
I40E_ADMINQ_CALLBACK cb_func =
|
|
|
|
@@ -756,7 +732,7 @@ static bool i40e_asq_done(struct i40e_hw *hw)
|
|
|
|
|
/* AQ designers suggest use of head for better
|
|
|
|
|
* timing reliability than DD bit
|
|
|
|
|
*/
|
|
|
|
|
return rd32(hw, hw->aq.asq.head) == hw->aq.asq.next_to_use;
|
|
|
|
|
return rd32(hw, I40E_PF_ATQH) == hw->aq.asq.next_to_use;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -797,7 +773,7 @@ i40e_asq_send_command_atomic_exec(struct i40e_hw *hw,
|
|
|
|
|
|
|
|
|
|
hw->aq.asq_last_status = I40E_AQ_RC_OK;
|
|
|
|
|
|
|
|
|
|
val = rd32(hw, hw->aq.asq.head);
|
|
|
|
|
val = rd32(hw, I40E_PF_ATQH);
|
|
|
|
|
if (val >= hw->aq.num_asq_entries) {
|
|
|
|
|
i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE,
|
|
|
|
|
"AQTX: head overrun at %d\n", val);
|
|
|
|
@@ -889,7 +865,7 @@ i40e_asq_send_command_atomic_exec(struct i40e_hw *hw,
|
|
|
|
|
if (hw->aq.asq.next_to_use == hw->aq.asq.count)
|
|
|
|
|
hw->aq.asq.next_to_use = 0;
|
|
|
|
|
if (!details->postpone)
|
|
|
|
|
wr32(hw, hw->aq.asq.tail, hw->aq.asq.next_to_use);
|
|
|
|
|
wr32(hw, I40E_PF_ATQT, hw->aq.asq.next_to_use);
|
|
|
|
|
|
|
|
|
|
/* if cmd_details are not defined or async flag is not set,
|
|
|
|
|
* we need to wait for desc write back
|
|
|
|
@@ -949,7 +925,7 @@ i40e_asq_send_command_atomic_exec(struct i40e_hw *hw,
|
|
|
|
|
/* update the error if time out occurred */
|
|
|
|
|
if ((!cmd_completed) &&
|
|
|
|
|
(!details->async && !details->postpone)) {
|
|
|
|
|
if (rd32(hw, hw->aq.asq.len) & I40E_GL_ATQLEN_ATQCRIT_MASK) {
|
|
|
|
|
if (rd32(hw, I40E_PF_ATQLEN) & I40E_GL_ATQLEN_ATQCRIT_MASK) {
|
|
|
|
|
i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE,
|
|
|
|
|
"AQTX: AQ Critical error.\n");
|
|
|
|
|
status = -EIO;
|
|
|
|
@@ -1103,7 +1079,7 @@ int i40e_clean_arq_element(struct i40e_hw *hw,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* set next_to_use to head */
|
|
|
|
|
ntu = rd32(hw, hw->aq.arq.head) & I40E_PF_ARQH_ARQH_MASK;
|
|
|
|
|
ntu = rd32(hw, I40E_PF_ARQH) & I40E_PF_ARQH_ARQH_MASK;
|
|
|
|
|
if (ntu == ntc) {
|
|
|
|
|
/* nothing to do - shouldn't need to update ring's values */
|
|
|
|
|
ret_code = -EALREADY;
|
|
|
|
@@ -1151,7 +1127,7 @@ int i40e_clean_arq_element(struct i40e_hw *hw,
|
|
|
|
|
desc->params.external.addr_low = cpu_to_le32(lower_32_bits(bi->pa));
|
|
|
|
|
|
|
|
|
|
/* set tail = the last cleaned desc index. */
|
|
|
|
|
wr32(hw, hw->aq.arq.tail, ntc);
|
|
|
|
|
wr32(hw, I40E_PF_ARQT, ntc);
|
|
|
|
|
/* ntc is updated to tail + 1 */
|
|
|
|
|
ntc++;
|
|
|
|
|
if (ntc == hw->aq.num_arq_entries)
|
|
|
|
|