diff options
author | Michal Swiatkowski <michal.swiatkowski@intel.com> | 2019-04-16 13:21:17 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2019-05-04 17:18:27 -0400 |
commit | ba0db585bdb696d28bd6ec3ae9908d45c0bdeb37 (patch) | |
tree | 78d346d9c441410208743fab4037f99c44d633e9 /drivers/net/ethernet/intel/ice/ice_lib.c | |
parent | bb877b22bcb5334fc4e1752fe77e96ab762c3738 (diff) |
ice: Add more validation in ice_vc_cfg_irq_map_msg
Add few checks to validate msg from iavf driver.
Test if we have got enough q_vectors allocated in VSI connected with VF.
Add masks for itr_indx and msix_indx to avoid writing to reserved fieldi
of QINT. Clear q_vector->num_ring_rx/tx, without it we can increment this
value every time we send irq map msg from VF. So after second call this
value will be incorrect.
Decrement num_vectors from msg, because last vector in iavf msg is misc
vector (we don't set map for it).
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@intel.com>
Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_lib.c')
-rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lib.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 83d0aef7f77e..caa00e8873ec 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c | |||
@@ -1879,33 +1879,37 @@ void ice_vsi_cfg_msix(struct ice_vsi *vsi) | |||
1879 | * tracked for this PF. | 1879 | * tracked for this PF. |
1880 | */ | 1880 | */ |
1881 | for (q = 0; q < q_vector->num_ring_tx; q++) { | 1881 | for (q = 0; q < q_vector->num_ring_tx; q++) { |
1882 | int itr_idx = q_vector->tx.itr_idx; | 1882 | int itr_idx = (q_vector->tx.itr_idx << |
1883 | QINT_TQCTL_ITR_INDX_S) & | ||
1884 | QINT_TQCTL_ITR_INDX_M; | ||
1883 | u32 val; | 1885 | u32 val; |
1884 | 1886 | ||
1885 | if (vsi->type == ICE_VSI_VF) | 1887 | if (vsi->type == ICE_VSI_VF) |
1886 | val = QINT_TQCTL_CAUSE_ENA_M | | 1888 | val = QINT_TQCTL_CAUSE_ENA_M | itr_idx | |
1887 | (itr_idx << QINT_TQCTL_ITR_INDX_S) | | 1889 | (((i + 1) << QINT_TQCTL_MSIX_INDX_S) & |
1888 | ((i + 1) << QINT_TQCTL_MSIX_INDX_S); | 1890 | QINT_TQCTL_MSIX_INDX_M); |
1889 | else | 1891 | else |
1890 | val = QINT_TQCTL_CAUSE_ENA_M | | 1892 | val = QINT_TQCTL_CAUSE_ENA_M | itr_idx | |
1891 | (itr_idx << QINT_TQCTL_ITR_INDX_S) | | 1893 | ((reg_idx << QINT_TQCTL_MSIX_INDX_S) & |
1892 | (reg_idx << QINT_TQCTL_MSIX_INDX_S); | 1894 | QINT_TQCTL_MSIX_INDX_M); |
1893 | wr32(hw, QINT_TQCTL(vsi->txq_map[txq]), val); | 1895 | wr32(hw, QINT_TQCTL(vsi->txq_map[txq]), val); |
1894 | txq++; | 1896 | txq++; |
1895 | } | 1897 | } |
1896 | 1898 | ||
1897 | for (q = 0; q < q_vector->num_ring_rx; q++) { | 1899 | for (q = 0; q < q_vector->num_ring_rx; q++) { |
1898 | int itr_idx = q_vector->rx.itr_idx; | 1900 | int itr_idx = (q_vector->rx.itr_idx << |
1901 | QINT_RQCTL_ITR_INDX_S) & | ||
1902 | QINT_RQCTL_ITR_INDX_M; | ||
1899 | u32 val; | 1903 | u32 val; |
1900 | 1904 | ||
1901 | if (vsi->type == ICE_VSI_VF) | 1905 | if (vsi->type == ICE_VSI_VF) |
1902 | val = QINT_RQCTL_CAUSE_ENA_M | | 1906 | val = QINT_RQCTL_CAUSE_ENA_M | itr_idx | |
1903 | (itr_idx << QINT_RQCTL_ITR_INDX_S) | | 1907 | (((i + 1) << QINT_RQCTL_MSIX_INDX_S) & |
1904 | ((i + 1) << QINT_RQCTL_MSIX_INDX_S); | 1908 | QINT_RQCTL_MSIX_INDX_M); |
1905 | else | 1909 | else |
1906 | val = QINT_RQCTL_CAUSE_ENA_M | | 1910 | val = QINT_RQCTL_CAUSE_ENA_M | itr_idx | |
1907 | (itr_idx << QINT_RQCTL_ITR_INDX_S) | | 1911 | ((reg_idx << QINT_RQCTL_MSIX_INDX_S) & |
1908 | (reg_idx << QINT_RQCTL_MSIX_INDX_S); | 1912 | QINT_RQCTL_MSIX_INDX_M); |
1909 | wr32(hw, QINT_RQCTL(vsi->rxq_map[rxq]), val); | 1913 | wr32(hw, QINT_RQCTL(vsi->rxq_map[rxq]), val); |
1910 | rxq++; | 1914 | rxq++; |
1911 | } | 1915 | } |