• David Wei's avatar
    bnxt: fix bnxt_get_avail_msix() returning negative values · 5bfadc57
    David Wei authored
    Current net-next/main does not boot for older chipsets e.g. Stratus.
    
    Sample dmesg:
    [   11.368315] bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): Able to reserve only 0 out of 9 requested RX rings
    [   11.390181] bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): Unable to reserve tx rings
    [   11.438780] bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): 2nd rings reservation failed.
    [   11.487559] bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): Not enough rings available.
    [   11.506012] bnxt_en 0000:02:00.0: probe with driver bnxt_en failed with error -12
    
    This is caused by bnxt_get_avail_msix() returning a negative value for
    these chipsets not using the new resource manager i.e. !BNXT_NEW_RM.
    This in turn causes hwr.cp in __bnxt_reserve_rings() to be set to 0.
    
    In the current call stack, __bnxt_reserve_rings() is called from
    bnxt_set_dflt_rings() before bnxt_init_int_mode(). Therefore,
    bp->total_irqs is always 0 and for !BNXT_NEW_RM bnxt_get_avail_msix()
    always returns a negative number.
    
    Historically, MSIX vectors were requested by the RoCE driver during
    run-time and bnxt_get_avail_msix() was used for this purpose. Today,
    RoCE MSIX vectors are statically allocated. bnxt_get_avail_msix() should
    only be called for the BNXT_NEW_RM() case to reserve the MSIX ahead of
    time for RoCE use.
    
    bnxt_get_avail_msix() is also be simplified to handle the BNXT_NEW_RM()
    case only.
    
    Fixes: d630624e ("bnxt_en: Utilize ulp client resources if RoCE is not registered")
    Signed-off-by: default avatarDavid Wei <dw@davidwei.uk>
    Reviewed-by: default avatarMichael Chan <michael.chan@broadcom.com>
    Link: https://lore.kernel.org/r/20240502203757.3761827-1-dw@davidwei.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    5bfadc57
bnxt.h 86.1 KB