liquidio: fix for iq and droq cnts going negative
Flush the mmio writes before releasing spin locks. if the maintained counts get too high > 2M force writeback of the counts to clear them Signed-off-by: Satanand Burla <satananda.burla@cavium.com> Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com> Signed-off-by: Raghu Vatsavayi <raghu.vatsavayi@cavium.com> Signed-off-by: Derek Chickles <derek.chickles@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1f5e29ce79
commit
cdb478e5e4
@ -2445,7 +2445,11 @@ static int liquidio_napi_poll(struct napi_struct *napi, int budget)
|
||||
__func__, iq_no);
|
||||
}
|
||||
|
||||
if ((work_done < budget) && (tx_done)) {
|
||||
/* force enable interrupt if reg cnts are high to avoid wraparound */
|
||||
if ((work_done < budget && tx_done) ||
|
||||
(iq->pkt_in_done >= MAX_REG_CNT) ||
|
||||
(droq->pkt_count >= MAX_REG_CNT)) {
|
||||
tx_done = 1;
|
||||
napi_complete_done(napi, work_done);
|
||||
octeon_process_droq_poll_cmd(droq->oct_dev, droq->q_no,
|
||||
POLL_EVENT_ENABLE_INTR, 0);
|
||||
|
@ -1630,7 +1630,11 @@ static int liquidio_napi_poll(struct napi_struct *napi, int budget)
|
||||
__func__, iq_no);
|
||||
}
|
||||
|
||||
if ((work_done < budget) && (tx_done)) {
|
||||
/* force enable interrupt if reg cnts are high to avoid wraparound */
|
||||
if ((work_done < budget && tx_done) ||
|
||||
(iq->pkt_in_done >= MAX_REG_CNT) ||
|
||||
(droq->pkt_count >= MAX_REG_CNT)) {
|
||||
tx_done = 1;
|
||||
napi_complete_done(napi, work_done);
|
||||
octeon_process_droq_poll_cmd(droq->oct_dev, droq->q_no,
|
||||
POLL_EVENT_ENABLE_INTR, 0);
|
||||
|
@ -99,6 +99,7 @@ enum octeon_tag_type {
|
||||
#define CVM_DRV_APP_END (CVM_DRV_INVALID_APP - 1)
|
||||
|
||||
#define BYTES_PER_DHLEN_UNIT 8
|
||||
#define MAX_REG_CNT 2000000U
|
||||
|
||||
static inline u32 incr_index(u32 index, u32 count, u32 max)
|
||||
{
|
||||
|
@ -1361,6 +1361,8 @@ void lio_enable_irq(struct octeon_droq *droq, struct octeon_instr_queue *iq)
|
||||
spin_lock_bh(&droq->lock);
|
||||
writel(droq->pkt_count, droq->pkts_sent_reg);
|
||||
droq->pkt_count = 0;
|
||||
/* this write needs to be flushed before we release the lock */
|
||||
mmiowb();
|
||||
spin_unlock_bh(&droq->lock);
|
||||
oct = droq->oct_dev;
|
||||
}
|
||||
@ -1368,6 +1370,8 @@ void lio_enable_irq(struct octeon_droq *droq, struct octeon_instr_queue *iq)
|
||||
spin_lock_bh(&iq->lock);
|
||||
writel(iq->pkt_in_done, iq->inst_cnt_reg);
|
||||
iq->pkt_in_done = 0;
|
||||
/* this write needs to be flushed before we release the lock */
|
||||
mmiowb();
|
||||
spin_unlock_bh(&iq->lock);
|
||||
oct = iq->oct_dev;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user