| From foo@baz Sun Jun 17 12:07:33 CEST 2018 |
| From: Vinicius Costa Gomes <vinicius.gomes@intel.com> |
| Date: Fri, 30 Mar 2018 17:06:52 -0700 |
| Subject: igb: Fix the transmission mode of queue 0 for Qav mode |
| |
| From: Vinicius Costa Gomes <vinicius.gomes@intel.com> |
| |
| [ Upstream commit 2707df9773cd2cb8b0f35b8592431b301da9d352 ] |
| |
| When Qav mode is enabled, queue 0 should be kept on Stream Reservation |
| mode. From the i210 datasheet, section 8.12.19: |
| |
| "Note: Queue0 QueueMode must be set to 1b when TransmitMode is set to |
| Qav." ("QueueMode 1b" represents the Stream Reservation mode) |
| |
| The solution is to give queue 0 the all the credits it might need, so |
| it has priority over queue 1. |
| |
| A situation where this can happen is when cbs is "installed" only on |
| queue 1, leaving queue 0 alone. For example: |
| |
| $ tc qdisc replace dev enp2s0 handle 100: parent root mqprio num_tc 3 \ |
| map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 queues 1@0 1@1 2@2 hw 0 |
| |
| $ tc qdisc replace dev enp2s0 parent 100:2 cbs locredit -1470 \ |
| hicredit 30 sendslope -980000 idleslope 20000 offload 1 |
| |
| Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> |
| Tested-by: Aaron Brown <aaron.f.brown@intel.com> |
| Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/intel/igb/igb_main.c | 17 ++++++++++++++++- |
| 1 file changed, 16 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/ethernet/intel/igb/igb_main.c |
| +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
| @@ -1698,7 +1698,22 @@ static void igb_configure_cbs(struct igb |
| WARN_ON(hw->mac.type != e1000_i210); |
| WARN_ON(queue < 0 || queue > 1); |
| |
| - if (enable) { |
| + if (enable || queue == 0) { |
| + /* i210 does not allow the queue 0 to be in the Strict |
| + * Priority mode while the Qav mode is enabled, so, |
| + * instead of disabling strict priority mode, we give |
| + * queue 0 the maximum of credits possible. |
| + * |
| + * See section 8.12.19 of the i210 datasheet, "Note: |
| + * Queue0 QueueMode must be set to 1b when |
| + * TransmitMode is set to Qav." |
| + */ |
| + if (queue == 0 && !enable) { |
| + /* max "linkspeed" idleslope in kbps */ |
| + idleslope = 1000000; |
| + hicredit = ETH_FRAME_LEN; |
| + } |
| + |
| set_tx_desc_fetch_prio(hw, queue, TX_QUEUE_PRIO_HIGH); |
| set_queue_mode(hw, queue, QUEUE_MODE_STREAM_RESERVATION); |
| |