ue_wstrt.c

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

C
56
字号
/* ue_wstrt.c - ue_wstrt */

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

/*------------------------------------------------------------------------
 * ue_wstrt - start output on an SMC Ultra Ethernet device
 *------------------------------------------------------------------------
 */
int
ue_wstrt(pud)
struct utdev	*pud;
{
	STATWORD	ps;
	unsigned char	*xmbuf;		/* transmit buffer address	*/
	unsigned int	xmaddr;		/* transmit buf addr to card	*/
	unsigned int	csr;
	struct ep	*pep;
	int		len, isbcast;

	disable(ps);
	if (pud->ud_xpending) {
		restore(ps);
		return OK;
	}
	pud->ud_xpending++;
	pep = (struct ep *)deq(pud->ud_outq);
	if (pep == 0) {
		pud->ud_xpending--;
		restore(ps);
		return OK;
	}
	isbcast = !memcmp(pep->ep_dst, pud->ud_bcast, EP_ALEN);
	len = pep->ep_len;
	/* this version supports one packet per interrupt only */

	xmaddr = pud->ud_xmaddr;
	xmbuf = (unsigned char *) (pud->ud_iomem + xmaddr * UE_BUFSIZE);
	pud->ud_wretry = EP_RETRY;
	memcpy(xmbuf, &pep->ep_eh, pep->ep_len);
	csr = pud->ud_pdev->dvcsr;
	uewr(csr, W_TSTARTH, xmaddr);
	uewr(csr, W_TCNTH, (len >> 8) & 0xff);
	uewr(csr, W_TCNTL, len & 0xff);
	uewr(csr, CMD, uerd(csr, CMD) | CMD_TXP);
	restore(ps);
	freebuf(pep);
	if (isbcast)
		nif[pud->ud_ifnum].ni_onucast++;
	else
		nif[pud->ud_ifnum].ni_oucast++;
	nif[pud->ud_ifnum].ni_ooctets += len;
}

⌨️ 快捷键说明

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