aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_lib.c
diff options
context:
space:
mode:
authorMichal Swiatkowski <michal.swiatkowski@intel.com>2019-04-16 13:21:17 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2019-05-04 17:18:27 -0400
commitba0db585bdb696d28bd6ec3ae9908d45c0bdeb37 (patch)
tree78d346d9c441410208743fab4037f99c44d633e9 /drivers/net/ethernet/intel/ice/ice_lib.c
parentbb877b22bcb5334fc4e1752fe77e96ab762c3738 (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.c32
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 }