diff options
author | Dmitry Kravkov <dmitry@broadcom.com> | 2013-10-27 07:07:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-29 00:12:45 -0400 |
commit | e3ed4eaef4932fd3867465784d11a36deaa6d22c (patch) | |
tree | 84d3fedd18189a0c055374a332f6f03516b4b432 | |
parent | 0d08c42cf9a71530fef5ebcfe368f38f2dd0476f (diff) |
bnx2x: prevent FW assert on low mem during unload
Buffers for FW statistics were allocated at an inappropriate time; In a machine
where the driver encounters problems allocating all of its queues, the driver
would still create FW requests for the statistics of the non-existing queues.
The wrong order of memory allocation could lead to zeroed statistics messages
being sent, leading to fw assert in case function 0 was down.
This changes the order of allocations, guaranteeing that statistic requests will
only be generated for actual queues.
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 4ab4c89c60cd..74d6486fccfd 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -2545,10 +2545,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
2545 | } | 2545 | } |
2546 | } | 2546 | } |
2547 | 2547 | ||
2548 | /* Allocated memory for FW statistics */ | ||
2549 | if (bnx2x_alloc_fw_stats_mem(bp)) | ||
2550 | LOAD_ERROR_EXIT(bp, load_error0); | ||
2551 | |||
2552 | /* need to be done after alloc mem, since it's self adjusting to amount | 2548 | /* need to be done after alloc mem, since it's self adjusting to amount |
2553 | * of memory available for RSS queues | 2549 | * of memory available for RSS queues |
2554 | */ | 2550 | */ |
@@ -2558,6 +2554,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
2558 | LOAD_ERROR_EXIT(bp, load_error0); | 2554 | LOAD_ERROR_EXIT(bp, load_error0); |
2559 | } | 2555 | } |
2560 | 2556 | ||
2557 | /* Allocated memory for FW statistics */ | ||
2558 | if (bnx2x_alloc_fw_stats_mem(bp)) | ||
2559 | LOAD_ERROR_EXIT(bp, load_error0); | ||
2560 | |||
2561 | /* request pf to initialize status blocks */ | 2561 | /* request pf to initialize status blocks */ |
2562 | if (IS_VF(bp)) { | 2562 | if (IS_VF(bp)) { |
2563 | rc = bnx2x_vfpf_init(bp); | 2563 | rc = bnx2x_vfpf_init(bp); |
@@ -2812,8 +2812,8 @@ load_error1: | |||
2812 | if (IS_PF(bp)) | 2812 | if (IS_PF(bp)) |
2813 | bnx2x_clear_pf_load(bp); | 2813 | bnx2x_clear_pf_load(bp); |
2814 | load_error0: | 2814 | load_error0: |
2815 | bnx2x_free_fp_mem(bp); | ||
2816 | bnx2x_free_fw_stats_mem(bp); | 2815 | bnx2x_free_fw_stats_mem(bp); |
2816 | bnx2x_free_fp_mem(bp); | ||
2817 | bnx2x_free_mem(bp); | 2817 | bnx2x_free_mem(bp); |
2818 | 2818 | ||
2819 | return rc; | 2819 | return rc; |