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

Commit 73650f28 authored by Tony Zelenoff's avatar Tony Zelenoff Committed by David S. Miller
Browse files

atl1: enable errors and link ints when rx/tx scheduled

parent aa45ba90
Loading
Loading
Loading
Loading
+22 −10
Original line number Original line Diff line number Diff line
@@ -2460,20 +2460,33 @@ static int atl1_rings_clean(struct napi_struct *napi, int budget)


	napi_complete(napi);
	napi_complete(napi);
	/* re-enable Interrupt */
	/* re-enable Interrupt */
	iowrite32(ISR_DIS_SMB | ISR_DIS_DMA, adapter->hw.hw_addr + REG_ISR);
	if (likely(adapter->int_enabled))
		atlx_imr_set(adapter, IMR_NORMAL_MASK);
	return work_done;
	return work_done;
}
}


static inline int atl1_sched_rings_clean(struct atl1_adapter* adapter)
static inline int atl1_sched_rings_clean(struct atl1_adapter* adapter)
{
{
	if (likely(napi_schedule_prep(&adapter->napi))) {
	if (!napi_schedule_prep(&adapter->napi))
		/* It is possible in case even the RX/TX ints are disabled via IMR
		 * register the ISR bits are set anyway (but do not produce IRQ).
		 * To handle such situation the napi functions used to check is
		 * something scheduled or not.
		 */
		return 0;

	__napi_schedule(&adapter->napi);
	__napi_schedule(&adapter->napi);

	/*
	 * Disable RX/TX ints via IMR register if it is
	 * allowed. NAPI handler must reenable them in same
	 * way.
	 */
	if (!adapter->int_enabled)
		return 1;
		return 1;
	}


	dev_printk(KERN_ERR, &adapter->pdev->dev,
	atlx_imr_set(adapter, IMR_NORXTX_MASK);
		   "rx: INTs must be disabled!");
	return 1;
	return 0;
}
}


/*
/*
@@ -2538,8 +2551,7 @@ static irqreturn_t atl1_intr(int irq, void *data)
		/* transmit or receive event */
		/* transmit or receive event */
		if (status & (ISR_CMB_TX | ISR_CMB_RX) &&
		if (status & (ISR_CMB_TX | ISR_CMB_RX) &&
		    atl1_sched_rings_clean(adapter))
		    atl1_sched_rings_clean(adapter))
			/* Go away with INTs disabled */
			break;
			return IRQ_HANDLED;


		/* rx exception */
		/* rx exception */
		if (unlikely(status & (ISR_RXF_OV | ISR_RFD_UNRUN |
		if (unlikely(status & (ISR_RXF_OV | ISR_RFD_UNRUN |
@@ -2551,7 +2563,7 @@ static irqreturn_t atl1_intr(int irq, void *data)
					"rx exception, ISR = 0x%x\n",
					"rx exception, ISR = 0x%x\n",
					status);
					status);
			if (atl1_sched_rings_clean(adapter))
			if (atl1_sched_rings_clean(adapter))
				return IRQ_HANDLED;
				break;
		}
		}


		if (--max_ints < 0)
		if (--max_ints < 0)
+7 −3
Original line number Original line Diff line number Diff line
@@ -275,13 +275,17 @@ static u32 atl1_check_link(struct atl1_adapter *adapter);
#define ISR_DIS_SMB				0x20000000
#define ISR_DIS_SMB				0x20000000
#define ISR_DIS_DMA				0x40000000
#define ISR_DIS_DMA				0x40000000


/* Normal Interrupt mask  */
/* Normal Interrupt mask without RX/TX enabled */
#define IMR_NORMAL_MASK	(\
#define IMR_NORXTX_MASK	(\
	ISR_SMB		|\
	ISR_SMB		|\
	ISR_GPHY	|\
	ISR_GPHY	|\
	ISR_PHY_LINKDOWN|\
	ISR_PHY_LINKDOWN|\
	ISR_DMAR_TO_RST	|\
	ISR_DMAR_TO_RST	|\
	ISR_DMAW_TO_RST	|\
	ISR_DMAW_TO_RST)

/* Normal Interrupt mask  */
#define IMR_NORMAL_MASK	(\
	IMR_NORXTX_MASK	|\
	ISR_CMB_TX	|\
	ISR_CMB_TX	|\
	ISR_CMB_RX)
	ISR_CMB_RX)