mirror of https://gitee.com/openkylin/linux.git
i40e: Helper routine for Rx/Tx queue enable/disable wait
Introduce helper routines that would wait for the Rx/Tx queue to reach the enable or disable state as requested. Change-ID: I518d9d0e2afef3f45107af3b46e9af402ff587c3 Signed-off-by: Neerav Parikh <neerav.parikh@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
70114ec4aa
commit
23527308d6
|
@ -84,6 +84,7 @@
|
||||||
#define I40E_AQ_WORK_LIMIT 16
|
#define I40E_AQ_WORK_LIMIT 16
|
||||||
#define I40E_MAX_USER_PRIORITY 8
|
#define I40E_MAX_USER_PRIORITY 8
|
||||||
#define I40E_DEFAULT_MSG_ENABLE 4
|
#define I40E_DEFAULT_MSG_ENABLE 4
|
||||||
|
#define I40E_QUEUE_WAIT_RETRY_LIMIT 10
|
||||||
|
|
||||||
#define I40E_NVM_VERSION_LO_SHIFT 0
|
#define I40E_NVM_VERSION_LO_SHIFT 0
|
||||||
#define I40E_NVM_VERSION_LO_MASK (0xff << I40E_NVM_VERSION_LO_SHIFT)
|
#define I40E_NVM_VERSION_LO_MASK (0xff << I40E_NVM_VERSION_LO_SHIFT)
|
||||||
|
|
|
@ -3231,6 +3231,35 @@ static void i40e_netpoll(struct net_device *netdev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i40e_pf_txq_wait - Wait for a PF's Tx queue to be enabled or disabled
|
||||||
|
* @pf: the PF being configured
|
||||||
|
* @pf_q: the PF queue
|
||||||
|
* @enable: enable or disable state of the queue
|
||||||
|
*
|
||||||
|
* This routine will wait for the given Tx queue of the PF to reach the
|
||||||
|
* enabled or disabled state.
|
||||||
|
* Returns -ETIMEDOUT in case of failing to reach the requested state after
|
||||||
|
* multiple retries; else will return 0 in case of success.
|
||||||
|
**/
|
||||||
|
static int i40e_pf_txq_wait(struct i40e_pf *pf, int pf_q, bool enable)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u32 tx_reg;
|
||||||
|
|
||||||
|
for (i = 0; i < I40E_QUEUE_WAIT_RETRY_LIMIT; i++) {
|
||||||
|
tx_reg = rd32(&pf->hw, I40E_QTX_ENA(pf_q));
|
||||||
|
if (enable == !!(tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
||||||
|
break;
|
||||||
|
|
||||||
|
udelay(10);
|
||||||
|
}
|
||||||
|
if (i >= I40E_QUEUE_WAIT_RETRY_LIMIT)
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* i40e_vsi_control_tx - Start or stop a VSI's rings
|
* i40e_vsi_control_tx - Start or stop a VSI's rings
|
||||||
* @vsi: the VSI being configured
|
* @vsi: the VSI being configured
|
||||||
|
@ -3240,7 +3269,7 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
|
||||||
{
|
{
|
||||||
struct i40e_pf *pf = vsi->back;
|
struct i40e_pf *pf = vsi->back;
|
||||||
struct i40e_hw *hw = &pf->hw;
|
struct i40e_hw *hw = &pf->hw;
|
||||||
int i, j, pf_q;
|
int i, j, pf_q, ret = 0;
|
||||||
u32 tx_reg;
|
u32 tx_reg;
|
||||||
|
|
||||||
pf_q = vsi->base_queue;
|
pf_q = vsi->base_queue;
|
||||||
|
@ -3273,22 +3302,46 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
|
||||||
wr32(hw, I40E_QTX_ENA(pf_q), tx_reg);
|
wr32(hw, I40E_QTX_ENA(pf_q), tx_reg);
|
||||||
|
|
||||||
/* wait for the change to finish */
|
/* wait for the change to finish */
|
||||||
for (j = 0; j < 10; j++) {
|
ret = i40e_pf_txq_wait(pf, pf_q, enable);
|
||||||
tx_reg = rd32(hw, I40E_QTX_ENA(pf_q));
|
if (ret) {
|
||||||
if (enable == !!(tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
dev_info(&pf->pdev->dev,
|
||||||
break;
|
"%s: VSI seid %d Tx ring %d %sable timeout\n",
|
||||||
|
__func__, vsi->seid, pf_q,
|
||||||
udelay(10);
|
(enable ? "en" : "dis"));
|
||||||
}
|
break;
|
||||||
if (j >= 10) {
|
|
||||||
dev_info(&pf->pdev->dev, "Tx ring %d %sable timeout\n",
|
|
||||||
pf_q, (enable ? "en" : "dis"));
|
|
||||||
return -ETIMEDOUT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hw->revision_id == 0)
|
if (hw->revision_id == 0)
|
||||||
mdelay(50);
|
mdelay(50);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i40e_pf_rxq_wait - Wait for a PF's Rx queue to be enabled or disabled
|
||||||
|
* @pf: the PF being configured
|
||||||
|
* @pf_q: the PF queue
|
||||||
|
* @enable: enable or disable state of the queue
|
||||||
|
*
|
||||||
|
* This routine will wait for the given Rx queue of the PF to reach the
|
||||||
|
* enabled or disabled state.
|
||||||
|
* Returns -ETIMEDOUT in case of failing to reach the requested state after
|
||||||
|
* multiple retries; else will return 0 in case of success.
|
||||||
|
**/
|
||||||
|
static int i40e_pf_rxq_wait(struct i40e_pf *pf, int pf_q, bool enable)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u32 rx_reg;
|
||||||
|
|
||||||
|
for (i = 0; i < I40E_QUEUE_WAIT_RETRY_LIMIT; i++) {
|
||||||
|
rx_reg = rd32(&pf->hw, I40E_QRX_ENA(pf_q));
|
||||||
|
if (enable == !!(rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
||||||
|
break;
|
||||||
|
|
||||||
|
udelay(10);
|
||||||
|
}
|
||||||
|
if (i >= I40E_QUEUE_WAIT_RETRY_LIMIT)
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3302,7 +3355,7 @@ static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable)
|
||||||
{
|
{
|
||||||
struct i40e_pf *pf = vsi->back;
|
struct i40e_pf *pf = vsi->back;
|
||||||
struct i40e_hw *hw = &pf->hw;
|
struct i40e_hw *hw = &pf->hw;
|
||||||
int i, j, pf_q;
|
int i, j, pf_q, ret = 0;
|
||||||
u32 rx_reg;
|
u32 rx_reg;
|
||||||
|
|
||||||
pf_q = vsi->base_queue;
|
pf_q = vsi->base_queue;
|
||||||
|
@ -3327,22 +3380,17 @@ static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable)
|
||||||
wr32(hw, I40E_QRX_ENA(pf_q), rx_reg);
|
wr32(hw, I40E_QRX_ENA(pf_q), rx_reg);
|
||||||
|
|
||||||
/* wait for the change to finish */
|
/* wait for the change to finish */
|
||||||
for (j = 0; j < 10; j++) {
|
ret = i40e_pf_rxq_wait(pf, pf_q, enable);
|
||||||
rx_reg = rd32(hw, I40E_QRX_ENA(pf_q));
|
if (ret) {
|
||||||
|
dev_info(&pf->pdev->dev,
|
||||||
if (enable == !!(rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
"%s: VSI seid %d Rx ring %d %sable timeout\n",
|
||||||
break;
|
__func__, vsi->seid, pf_q,
|
||||||
|
(enable ? "en" : "dis"));
|
||||||
udelay(10);
|
break;
|
||||||
}
|
|
||||||
if (j >= 10) {
|
|
||||||
dev_info(&pf->pdev->dev, "Rx ring %d %sable timeout\n",
|
|
||||||
pf_q, (enable ? "en" : "dis"));
|
|
||||||
return -ETIMEDOUT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue