From 1ba80e20d3774025789b8ac595c0f8d750f13831 Mon Sep 17 00:00:00 2001 From: Yaniv Rosner Date: Sun, 2 Dec 2012 04:05:54 +0000 Subject: [PATCH] --- yaml --- r: 341727 b: refs/heads/master c: 27c1151c324b5a7dacd2d03e54b7c99aa5b67f27 h: refs/heads/master i: 341725: c4101c788630d3bbcc5f6561f653055e7f0f99f7 341723: f5c301786b17b80f23c4df5922ea68c3ef56061c 341719: 17a5746e8094efe933f383fc73fb2d7fa3268853 341711: dbfe4395ab65cfc3ceadb8e63bbc4fa763f2c8e6 341695: c9b3ac83b2b68555e708c278bef934b6eadd46f4 v: v3 --- [refs] | 2 +- trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 1 + .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 9920ae520403..9e5418a556a9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b343d0025b08a1ef543e3cabf8b753d84b938d48 +refs/heads/master: 27c1151c324b5a7dacd2d03e54b7c99aa5b67f27 diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 03647bf3ddb9..02ea644573ca 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -915,6 +915,7 @@ struct bnx2x_common { #define BNX2X_IGU_STAS_MSG_VF_CNT 64 #define BNX2X_IGU_STAS_MSG_PF_CNT 4 +#define MAX_IGU_ATTN_ACK_TO 100 /* end of common */ /* port */ diff --git a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 983a0c86ee33..d76ca90eea94 100644 --- a/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/trunk/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -3588,6 +3588,21 @@ static void bnx2x_attn_int_asserted(struct bnx2x *bp, u32 asserted) /* now set back the mask */ if (asserted & ATTN_NIG_FOR_FUNC) { + /* Verify that IGU ack through BAR was written before restoring + * NIG mask. This loop should exit after 2-3 iterations max. + */ + if (bp->common.int_block != INT_BLOCK_HC) { + u32 cnt = 0, igu_acked; + do { + igu_acked = REG_RD(bp, + IGU_REG_ATTENTION_ACK_BITS); + } while (((igu_acked & ATTN_NIG_FOR_FUNC) == 0) && + (++cnt < MAX_IGU_ATTN_ACK_TO)); + if (!igu_acked) + DP(NETIF_MSG_HW, + "Failed to verify IGU ack on time\n"); + barrier(); + } REG_WR(bp, nig_int_mask_addr, nig_mask); bnx2x_release_phy_lock(bp); }