ue_intr.c

来自「TCP-IP红宝书源代码」· C语言 代码 · 共 71 行

C
71
字号
/* ue_intr.c - ue_intr */

#include <conf.h>
#include <kernel.h>
#include <network.h>
#include <ue.h>

/*------------------------------------------------------------------------
 * ue_intr - handle an SMC Ultra Ethernet device interrupt
 *------------------------------------------------------------------------
 */
void
ue_intr(struct devsw *pdev)
{
	struct utdev	*pud;
	static int	next;
	struct ep	*pep;
	int		i;
	void		*csr;
	unsigned int	intstat;

	pud = 0;
	for (i=0; i<Neth; ++i, ++next) {
		if (next >= Neth)
			next = 0;
		if (intstat = ue_hasintr(&ue[next])) {
			pud = &ue[next];
			break;
		}
	}
	if (pud == 0)
		return;
	csr = pud->ud_pdev->dvcsr;
	uewr(csr, W_INTMASK, 0);
	uewr(csr, INTSTAT, intstat);	/* clear the interrupt */
	if (intstat & INTSTAT_PTX)
		ue_xintr(pud, intstat & INTSTAT_TXE);
	if (intstat & INTSTAT_RXE)
		kprintf("receive error, rstat %x\n", uerd(csr, RSTAT));
	if (intstat & INTSTAT_TXE)
		kprintf("receive error, rstat %x\n", uerd(csr, TSTAT));
	uewr(csr, W_INTMASK, 0x7f);
	if (intstat & INTSTAT_PRX)
		ue_demux(pud);
}

/*------------------------------------------------------------------------
 * ue_hasintr - return true if this ue device has a pending interrupt
 *------------------------------------------------------------------------
 */
int
ue_hasintr(pud)
struct utdev	*pud;
{
	return uerd(pud->ud_pdev->dvcsr, INTSTAT);
}

/*------------------------------------------------------------------------
 * ue_xintr - handle a transmit interrupt on an SMC Ultra Ethernet
 *------------------------------------------------------------------------
 */
int
ue_xintr(struct utdev *pud, int err)
{
	if (err)
		kprintf("transmit error\n");
	pud->ud_xpending--;
	if (lenq(pud->ud_outq))
		ue_wstrt(pud);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?