diff options
Diffstat (limited to 'drivers/net/cxgb3/sge.c')
-rw-r--r-- | drivers/net/cxgb3/sge.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index 318a018ca7c5..048205903741 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -480,6 +480,7 @@ static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q) | |||
480 | { | 480 | { |
481 | if (q->pend_cred >= q->credits / 4) { | 481 | if (q->pend_cred >= q->credits / 4) { |
482 | q->pend_cred = 0; | 482 | q->pend_cred = 0; |
483 | wmb(); | ||
483 | t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id)); | 484 | t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id)); |
484 | } | 485 | } |
485 | } | 486 | } |
@@ -2286,11 +2287,14 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs, | |||
2286 | while (likely(budget_left && is_new_response(r, q))) { | 2287 | while (likely(budget_left && is_new_response(r, q))) { |
2287 | int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled; | 2288 | int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled; |
2288 | struct sk_buff *skb = NULL; | 2289 | struct sk_buff *skb = NULL; |
2289 | u32 len, flags = ntohl(r->flags); | 2290 | u32 len, flags; |
2290 | __be32 rss_hi = *(const __be32 *)r, | 2291 | __be32 rss_hi, rss_lo; |
2291 | rss_lo = r->rss_hdr.rss_hash_val; | ||
2292 | 2292 | ||
2293 | rmb(); | ||
2293 | eth = r->rss_hdr.opcode == CPL_RX_PKT; | 2294 | eth = r->rss_hdr.opcode == CPL_RX_PKT; |
2295 | rss_hi = *(const __be32 *)r; | ||
2296 | rss_lo = r->rss_hdr.rss_hash_val; | ||
2297 | flags = ntohl(r->flags); | ||
2294 | 2298 | ||
2295 | if (unlikely(flags & F_RSPD_ASYNC_NOTIF)) { | 2299 | if (unlikely(flags & F_RSPD_ASYNC_NOTIF)) { |
2296 | skb = alloc_skb(AN_PKT_SIZE, GFP_ATOMIC); | 2300 | skb = alloc_skb(AN_PKT_SIZE, GFP_ATOMIC); |
@@ -2501,7 +2505,10 @@ static int process_pure_responses(struct adapter *adap, struct sge_qset *qs, | |||
2501 | refill_rspq(adap, q, q->credits); | 2505 | refill_rspq(adap, q, q->credits); |
2502 | q->credits = 0; | 2506 | q->credits = 0; |
2503 | } | 2507 | } |
2504 | } while (is_new_response(r, q) && is_pure_response(r)); | 2508 | if (!is_new_response(r, q)) |
2509 | break; | ||
2510 | rmb(); | ||
2511 | } while (is_pure_response(r)); | ||
2505 | 2512 | ||
2506 | if (sleeping) | 2513 | if (sleeping) |
2507 | check_ring_db(adap, qs, sleeping); | 2514 | check_ring_db(adap, qs, sleeping); |
@@ -2535,6 +2542,7 @@ static inline int handle_responses(struct adapter *adap, struct sge_rspq *q) | |||
2535 | 2542 | ||
2536 | if (!is_new_response(r, q)) | 2543 | if (!is_new_response(r, q)) |
2537 | return -1; | 2544 | return -1; |
2545 | rmb(); | ||
2538 | if (is_pure_response(r) && process_pure_responses(adap, qs, r) == 0) { | 2546 | if (is_pure_response(r) && process_pure_responses(adap, qs, r) == 0) { |
2539 | t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) | | 2547 | t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) | |
2540 | V_NEWTIMER(q->holdoff_tmr) | V_NEWINDEX(q->cidx)); | 2548 | V_NEWTIMER(q->holdoff_tmr) | V_NEWINDEX(q->cidx)); |