• Somnath Kotur's avatar
    bnxt_en: Fix possible bnxt_open() failure caused by wrong RFS flag · 13ba7943
    Somnath Kotur authored
    bnxt_open() can fail in this code path, especially on a VF when
    it fails to reserve default rings:
    
    bnxt_open()
      __bnxt_open_nic()
        bnxt_clear_int_mode()
        bnxt_init_dflt_ring_mode()
    
    RX rings would be set to 0 when we hit this error path.
    
    It is possible for a subsequent bnxt_open() call to potentially succeed
    with a code path like this:
    
    bnxt_open()
      bnxt_hwrm_if_change()
        bnxt_fw_init_one()
          bnxt_fw_init_one_p3()
            bnxt_set_dflt_rfs()
              bnxt_rfs_capable()
                bnxt_hwrm_reserve_rings()
    
    On older chips, RFS is capable if we can reserve the number of vnics that
    is equal to RX rings + 1.  But since RX rings is still set to 0 in this
    code path, we may mistakenly think that RFS is supported for 0 RX rings.
    
    Later, when the default RX rings are reserved and we try to enable
    RFS, it would fail and cause bnxt_open() to fail unnecessarily.
    
    We fix this in 2 places.  bnxt_rfs_capable() will always return false if
    RX rings is not yet set.  bnxt_init_dflt_ring_mode() will call
    bnxt_set_dflt_rfs() which will always clear the RFS flags if RFS is not
    supported.
    
    Fixes: 20d7d1c5 ("bnxt_en: reliably allocate IRQ table on reset to avoid crash")
    Signed-off-by: default avatarSomnath Kotur <somnath.kotur@broadcom.com>
    Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    13ba7943
bnxt.c 358 KB