aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorEilon Greenstein <eilong@broadcom.com>2009-01-15 00:26:01 -0500
committerDavid S. Miller <davem@davemloft.net>2009-01-15 11:28:12 -0500
commita5e9a7cfad5fd301ce2b7869bbf386b70aa39e7c (patch)
treec9df5d842741db2beae2c515df9214aabd8ab4cb /drivers
parent3c96c68b0c67d11b8519bc38233aec586f0211f4 (diff)
bnx2x: Protecting the link change indication
Without this lock, in some race conditions the driver missed link change indication Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/bnx2x_main.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c
index 4f1ee1f2968c..701bcc1260c2 100644
--- a/drivers/net/bnx2x_main.c
+++ b/drivers/net/bnx2x_main.c
@@ -2234,9 +2234,7 @@ static void bnx2x_link_attn(struct bnx2x *bp)
2234 /* Make sure that we are synced with the current statistics */ 2234 /* Make sure that we are synced with the current statistics */
2235 bnx2x_stats_handle(bp, STATS_EVENT_STOP); 2235 bnx2x_stats_handle(bp, STATS_EVENT_STOP);
2236 2236
2237 bnx2x_acquire_phy_lock(bp);
2238 bnx2x_link_update(&bp->link_params, &bp->link_vars); 2237 bnx2x_link_update(&bp->link_params, &bp->link_vars);
2239 bnx2x_release_phy_lock(bp);
2240 2238
2241 if (bp->link_vars.link_up) { 2239 if (bp->link_vars.link_up) {
2242 2240
@@ -2485,6 +2483,8 @@ static void bnx2x_attn_int_asserted(struct bnx2x *bp, u32 asserted)
2485 if (asserted & ATTN_HARD_WIRED_MASK) { 2483 if (asserted & ATTN_HARD_WIRED_MASK) {
2486 if (asserted & ATTN_NIG_FOR_FUNC) { 2484 if (asserted & ATTN_NIG_FOR_FUNC) {
2487 2485
2486 bnx2x_acquire_phy_lock(bp);
2487
2488 /* save nig interrupt mask */ 2488 /* save nig interrupt mask */
2489 bp->nig_mask = REG_RD(bp, nig_int_mask_addr); 2489 bp->nig_mask = REG_RD(bp, nig_int_mask_addr);
2490 REG_WR(bp, nig_int_mask_addr, 0); 2490 REG_WR(bp, nig_int_mask_addr, 0);
@@ -2540,8 +2540,10 @@ static void bnx2x_attn_int_asserted(struct bnx2x *bp, u32 asserted)
2540 REG_WR(bp, hc_addr, asserted); 2540 REG_WR(bp, hc_addr, asserted);
2541 2541
2542 /* now set back the mask */ 2542 /* now set back the mask */
2543 if (asserted & ATTN_NIG_FOR_FUNC) 2543 if (asserted & ATTN_NIG_FOR_FUNC) {
2544 REG_WR(bp, nig_int_mask_addr, bp->nig_mask); 2544 REG_WR(bp, nig_int_mask_addr, bp->nig_mask);
2545 bnx2x_release_phy_lock(bp);
2546 }
2545} 2547}
2546 2548
2547static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) 2549static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)