Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cdb478e5 authored by Satanand Burla's avatar Satanand Burla Committed by David S. Miller
Browse files

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: default avatarSatanand Burla <satananda.burla@cavium.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: default avatarRaghu Vatsavayi <raghu.vatsavayi@cavium.com>
Signed-off-by: default avatarDerek Chickles <derek.chickles@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1f5e29ce
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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);
+5 −1
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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)
{
+4 −0
Original line number Diff line number Diff line
@@ -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;
	}