|
|
|
@@ -7,27 +7,6 @@
|
|
|
|
|
#include "iavf_adminq.h"
|
|
|
|
|
#include "iavf_prototype.h"
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* iavf_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 iavf_adminq_init_regs(struct iavf_hw *hw)
|
|
|
|
|
{
|
|
|
|
|
/* set head and tail registers in our local struct */
|
|
|
|
|
hw->aq.asq.tail = IAVF_VF_ATQT1;
|
|
|
|
|
hw->aq.asq.head = IAVF_VF_ATQH1;
|
|
|
|
|
hw->aq.asq.len = IAVF_VF_ATQLEN1;
|
|
|
|
|
hw->aq.asq.bal = IAVF_VF_ATQBAL1;
|
|
|
|
|
hw->aq.asq.bah = IAVF_VF_ATQBAH1;
|
|
|
|
|
hw->aq.arq.tail = IAVF_VF_ARQT1;
|
|
|
|
|
hw->aq.arq.head = IAVF_VF_ARQH1;
|
|
|
|
|
hw->aq.arq.len = IAVF_VF_ARQLEN1;
|
|
|
|
|
hw->aq.arq.bal = IAVF_VF_ARQBAL1;
|
|
|
|
|
hw->aq.arq.bah = IAVF_VF_ARQBAH1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* iavf_alloc_adminq_asq_ring - Allocate Admin Queue send rings
|
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
@@ -259,17 +238,17 @@ static enum iavf_status iavf_config_asq_regs(struct iavf_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, IAVF_VF_ATQH1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ATQT1, 0);
|
|
|
|
|
|
|
|
|
|
/* set starting point */
|
|
|
|
|
wr32(hw, hw->aq.asq.len, (hw->aq.num_asq_entries |
|
|
|
|
|
wr32(hw, IAVF_VF_ATQLEN1, (hw->aq.num_asq_entries |
|
|
|
|
|
IAVF_VF_ATQLEN1_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, IAVF_VF_ATQBAL1, lower_32_bits(hw->aq.asq.desc_buf.pa));
|
|
|
|
|
wr32(hw, IAVF_VF_ATQBAH1, 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, IAVF_VF_ATQBAL1);
|
|
|
|
|
if (reg != lower_32_bits(hw->aq.asq.desc_buf.pa))
|
|
|
|
|
ret_code = IAVF_ERR_ADMIN_QUEUE_ERROR;
|
|
|
|
|
|
|
|
|
@@ -288,20 +267,20 @@ static enum iavf_status iavf_config_arq_regs(struct iavf_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, IAVF_VF_ARQH1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ARQT1, 0);
|
|
|
|
|
|
|
|
|
|
/* set starting point */
|
|
|
|
|
wr32(hw, hw->aq.arq.len, (hw->aq.num_arq_entries |
|
|
|
|
|
wr32(hw, IAVF_VF_ARQLEN1, (hw->aq.num_arq_entries |
|
|
|
|
|
IAVF_VF_ARQLEN1_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, IAVF_VF_ARQBAL1, lower_32_bits(hw->aq.arq.desc_buf.pa));
|
|
|
|
|
wr32(hw, IAVF_VF_ARQBAH1, 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, IAVF_VF_ARQT1, 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, IAVF_VF_ARQBAL1);
|
|
|
|
|
if (reg != lower_32_bits(hw->aq.arq.desc_buf.pa))
|
|
|
|
|
ret_code = IAVF_ERR_ADMIN_QUEUE_ERROR;
|
|
|
|
|
|
|
|
|
@@ -455,11 +434,11 @@ static enum iavf_status iavf_shutdown_asq(struct iavf_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, IAVF_VF_ATQH1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ATQT1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ATQLEN1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ATQBAL1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ATQBAH1, 0);
|
|
|
|
|
|
|
|
|
|
hw->aq.asq.count = 0; /* to indicate uninitialized queue */
|
|
|
|
|
|
|
|
|
@@ -489,11 +468,11 @@ static enum iavf_status iavf_shutdown_arq(struct iavf_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, IAVF_VF_ARQH1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ARQT1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ARQLEN1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ARQBAL1, 0);
|
|
|
|
|
wr32(hw, IAVF_VF_ARQBAH1, 0);
|
|
|
|
|
|
|
|
|
|
hw->aq.arq.count = 0; /* to indicate uninitialized queue */
|
|
|
|
|
|
|
|
|
@@ -529,9 +508,6 @@ enum iavf_status iavf_init_adminq(struct iavf_hw *hw)
|
|
|
|
|
goto init_adminq_exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set up register offsets */
|
|
|
|
|
iavf_adminq_init_regs(hw);
|
|
|
|
|
|
|
|
|
|
/* setup ASQ command write back timeout */
|
|
|
|
|
hw->aq.asq_cmd_timeout = IAVF_ASQ_CMD_TIMEOUT;
|
|
|
|
|
|
|
|
|
@@ -587,9 +563,9 @@ static u16 iavf_clean_asq(struct iavf_hw *hw)
|
|
|
|
|
|
|
|
|
|
desc = IAVF_ADMINQ_DESC(*asq, ntc);
|
|
|
|
|
details = IAVF_ADMINQ_DETAILS(*asq, ntc);
|
|
|
|
|
while (rd32(hw, hw->aq.asq.head) != ntc) {
|
|
|
|
|
while (rd32(hw, IAVF_VF_ATQH1) != ntc) {
|
|
|
|
|
iavf_debug(hw, IAVF_DEBUG_AQ_MESSAGE,
|
|
|
|
|
"ntc %d head %d.\n", ntc, rd32(hw, hw->aq.asq.head));
|
|
|
|
|
"ntc %d head %d.\n", ntc, rd32(hw, IAVF_VF_ATQH1));
|
|
|
|
|
|
|
|
|
|
if (details->callback) {
|
|
|
|
|
IAVF_ADMINQ_CALLBACK cb_func =
|
|
|
|
@@ -624,7 +600,7 @@ bool iavf_asq_done(struct iavf_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, IAVF_VF_ATQH1) == hw->aq.asq.next_to_use;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@@ -663,7 +639,7 @@ enum iavf_status iavf_asq_send_command(struct iavf_hw *hw,
|
|
|
|
|
|
|
|
|
|
hw->aq.asq_last_status = IAVF_AQ_RC_OK;
|
|
|
|
|
|
|
|
|
|
val = rd32(hw, hw->aq.asq.head);
|
|
|
|
|
val = rd32(hw, IAVF_VF_ATQH1);
|
|
|
|
|
if (val >= hw->aq.num_asq_entries) {
|
|
|
|
|
iavf_debug(hw, IAVF_DEBUG_AQ_MESSAGE,
|
|
|
|
|
"AQTX: head overrun at %d\n", val);
|
|
|
|
@@ -755,7 +731,7 @@ enum iavf_status iavf_asq_send_command(struct iavf_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, IAVF_VF_ATQT1, 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
|
|
|
|
@@ -810,7 +786,7 @@ enum iavf_status iavf_asq_send_command(struct iavf_hw *hw,
|
|
|
|
|
/* update the error if time out occurred */
|
|
|
|
|
if ((!cmd_completed) &&
|
|
|
|
|
(!details->async && !details->postpone)) {
|
|
|
|
|
if (rd32(hw, hw->aq.asq.len) & IAVF_VF_ATQLEN1_ATQCRIT_MASK) {
|
|
|
|
|
if (rd32(hw, IAVF_VF_ATQLEN1) & IAVF_VF_ATQLEN1_ATQCRIT_MASK) {
|
|
|
|
|
iavf_debug(hw, IAVF_DEBUG_AQ_MESSAGE,
|
|
|
|
|
"AQTX: AQ Critical error.\n");
|
|
|
|
|
status = IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR;
|
|
|
|
@@ -878,7 +854,7 @@ enum iavf_status iavf_clean_arq_element(struct iavf_hw *hw,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* set next_to_use to head */
|
|
|
|
|
ntu = rd32(hw, hw->aq.arq.head) & IAVF_VF_ARQH1_ARQH_MASK;
|
|
|
|
|
ntu = rd32(hw, IAVF_VF_ARQH1) & IAVF_VF_ARQH1_ARQH_MASK;
|
|
|
|
|
if (ntu == ntc) {
|
|
|
|
|
/* nothing to do - shouldn't need to update ring's values */
|
|
|
|
|
ret_code = IAVF_ERR_ADMIN_QUEUE_NO_WORK;
|
|
|
|
@@ -926,7 +902,7 @@ enum iavf_status iavf_clean_arq_element(struct iavf_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, IAVF_VF_ARQT1, ntc);
|
|
|
|
|
/* ntc is updated to tail + 1 */
|
|
|
|
|
ntc++;
|
|
|
|
|
if (ntc == hw->aq.num_arq_entries)
|
|
|
|
|