⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ee_intr.c,v

📁 TCP-IP红宝书源代码
💻 C,V
字号:
head	1.2;
access;
symbols;
locks; strict;
comment	@ * @;


1.2
date	95.02.05.21.44.01;	author dls;	state Broken;
branches;
next	1.1;

1.1
date	94.09.24.01.00.41;	author dls;	state Works;
branches;
next	;


desc
@@


1.2
log
@*** empty log message ***
@
text
@/* ee_intr.c - ee_intr */

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

/*------------------------------------------------------------------------
 * ee_intr - handle an Intel EtherExpress16 device interrupt
 *------------------------------------------------------------------------
 */
int
ee_intr()
{
	static int	next;
	struct etdev	*ped;
	int		i, csr, status;

	ped = 0;
	for (i=0; i<Neth; ++i, ++next) {
		if (next >= Neth)
			next = 0;
		ped = &ee[next];
		if ((status = ee_hasintr(ped)) & 0xf000)
			break;
	}
	if (i == Neth)
		return;
	csr = ped->ed_pdev->dvcsr;

	ee_ack(ped, status);

	if (status & (STAT_CX|STAT_CNA))
		ee_xintr(ped);

	/*
	 * ee_demux can cause a context switch, so must re-enable board
	 * interrupt latch before calling it.
	 */
	outb(csr+SIRQ, ped->ed_irq);
	outb(csr+SIRQ, ped->ed_irq | SIRQ_IEN);

	if (status & STAT_FR)
		ee_demux(ped);
}

/*------------------------------------------------------------------------
 * ee_hasintr - return true if this ee device has a pending interrupt
 *------------------------------------------------------------------------
 */
int
ee_hasintr(ped)
struct etdev	*ped;
{
	struct scb	*pscb = ped->ed_scb;

	ee_wait(ped);
	return pscb->scb_status & 0xf000;
}

/*------------------------------------------------------------------------
 * ee_xintr - handle a transmit interrupt on an Intel EtherExpress
 *------------------------------------------------------------------------
 */
int
ee_xintr(ped)
struct etdev	*ped;
{
	struct cbl	*pcbl = ped->ed_cbl;
	struct devsw	*pdev = ped->ed_pdev;

	if (!(pcbl->cbl_status & MCSTAT_C)) {
		kprintf("ee%d: CBL status not complete (%x)\n",pdev->dvminor,
			pcbl->cbl_status);
		return;
	}
	if ((pcbl->cbl_cmd & EECMD_MASK) == EECMD_MCSET) {
		signal(ped->ed_cmutex);
	} else if (pcbl->cbl_status & TSTAT_C) {
		if (!(pcbl->cbl_status & TSTAT_OK)) {
			kprintf("ee%d: tranmission error, status %x\n",
				ped->ed_pdev->dvminor, pcbl->cbl_status);
			nif[ped->ed_ifnum].ni_oerrors++;
		}
		if (scount(ped->ed_cmutex) > 0) {
			kprintf("ee%d: stray command interrupt (stat %x)\n",
				pdev->dvminor, pcbl->cbl_status);
			return;
		} else
			signal(ped->ed_cmutex);
		pcbl->cbl_status = 0;
	}
}
@


1.1
log
@Initial revision
@
text
@d70 1
d72 8
a79 1
	if (pcbl->cbl_status & TSTAT_C) {
d85 6
a90 4
		if (!ped->ed_xpending)
			kprintf("stray transmit interrupt\n");
		else
			ped->ed_xpending--;
a92 2
	if (lenq(ped->ed_outq))
		ee_wstrt(ped);
@

⌨️ 快捷键说明

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