?? dec21140.c
字號:
/*-------------------------------------------------------------------*/
FlushFlag = 1;
/*-------------------------------------------------------------------*/
/* Stop Transmitter. */
/*-------------------------------------------------------------------*/
saved_csr6 = ioLongRead(CSR6) | LAN_CSR6_MBO;
ioLongWrite(CSR6, saved_csr6 & ~LAN_CSR6_ST);
/*-------------------------------------------------------------------*/
/* Clear the status register CSR5 */
/*-------------------------------------------------------------------*/
ioLongWrite(CSR5, 0x0000FFFF);
/*-------------------------------------------------------------------*/
/* PCI Status Register - Clear */
/*-------------------------------------------------------------------*/
WrPciCfg16(CF_STATUS, LAN_DS_PER | LAN_DS_SERR | LAN_DS_MA |
LAN_DS_RTA | LAN_DS_STA | LAN_DS_DPAR);
/*-------------------------------------------------------------------*/
/* Clean out the transmit buffer descriptor ring. */
/*-------------------------------------------------------------------*/
TxBufThrowAway();
TxNewBD = TxUsedBD = TxDesc;
ioLongWrite(CSR4, (ULONG)TxDesc);
/*-------------------------------------------------------------------*/
/* Turn off MAC interrupts. */
/*-------------------------------------------------------------------*/
saved_csr7 = ioLongRead(CSR7);
ioLongWrite(CSR7, 0);
/*-------------------------------------------------------------------*/
/* Setup transmit descriptor without turning interrupts on. We will */
/* poll the status until "transmission" is complete. */
/*-------------------------------------------------------------------*/
TxNewBD->buffAddr1 = EtherBlock;
TxNewBD->ctrlNsize = LAN_XMTD_SET | 192;
TxNewBD->status = MAC_OWNS_DESC;
COPYBACK(TxNewBD->buffAddr1, 4);
COPYBACK((void *)TxNewBD, 1);
/*-------------------------------------------------------------------*/
/* Start transmission and loop until MAC has processed setup frame. */
/*-------------------------------------------------------------------*/
ioLongWrite(CSR6, saved_csr6 | LAN_CSR6_ST);
do {
microsleep(10);
ioLongWrite(CSR5, 0x0000FFFF);
command = RdPciCfg16(CF_STATUS);
command &= LAN_DS_PER | LAN_DS_SERR | LAN_DS_MA |
LAN_DS_RTA | LAN_DS_STA | LAN_DS_DPAR;
WrPciCfg16(CF_STATUS, command);
INVALIDATE((void *)TxNewBD, 1);
}
while (TxNewBD->status != ~MAC_OWNS_DESC);
/*-------------------------------------------------------------------*/
/* Stop the transmitter and zero the descriptor's status. */
/*-------------------------------------------------------------------*/
ioLongWrite(CSR6, saved_csr6 & ~LAN_CSR6_ST);
TxNewBD->status = 0;
/*-------------------------------------------------------------------*/
/* Set transmitter back to the beginning of the buffer descriptor */
/* ring, restore LAN interrupt state and transmitter state. */
/*-------------------------------------------------------------------*/
TxNewBD = TxUsedBD = TxDesc;
ioLongWrite(CSR4, (ULONG)TxDesc);
ioLongWrite(CSR7, saved_csr7);
ioLongWrite(CSR6, saved_csr6);
FlushFlag = 0;
}
/***********************************************************************/
/* ni_init: Initialize the network interface. */
/* */
/* INPUTS: ap_addr: pNA+'s announce packet entry point. */
/* if_num: Interface number */
/* funcs: Pointer to pNA memory mgmnt functions */
/* */
/* RETURNS: Pointer to hardware address of NI or -1 if failure */
/* */
/***********************************************************************/
static long ni_init(void)
{
int i;
tmLibdevErr_t tm_err;
intInstanceSetup_t iisetup;
Bool ien;
LAN_BUFF_DESC *descp;
ULONG lword;
ien = intCLEAR_IEN();
/*-------------------------------------------------------------------*/
/* Stop all LAN activity */
/*-------------------------------------------------------------------*/
LanStop();
/*-------------------------------------------------------------------*/
/* Initialize the receive buffers and transmit headers. */
/*-------------------------------------------------------------------*/
InitBuffers();
/*-------------------------------------------------------------------*/
/* Install the interrupt service routine. */
/*-------------------------------------------------------------------*/
iisetup.enabled = True;
iisetup.handler = ni_isr;
iisetup.priority = intPRIO_1;
iisetup.level_triggered = True;
tm_err = intOpen(V_LAN);
if (tm_err != TMLIBDEV_OK) {
return -1;
}
tm_err = intInstanceSetup(V_LAN, &iisetup);
if (tm_err != TMLIBDEV_OK) {
intClose(V_LAN);
return -1;
}
/*-------------------------------------------------------------------*/
/* Get the Ethernet Address. This is set in bpdialog.c. */
/* This is an interim solution till I get the roms working. */
/*-------------------------------------------------------------------*/
for (i = 0; i < 6; ++i)
OurAddress.byte[i] = EtherHwAddr[i];
/*-------------------------------------------------------------------*/
/* Initialize MIB variables. */
/*-------------------------------------------------------------------*/
InErrors = outerrors = 0;
InOctets = OutOctets = 0;
InUcastPkts = OutUcastPkts = 0;
innucastpkts = outnucastpkts = 0;
ifadminstatus = 1; /* up */
InUnknownProtos = 0;
lc_err = 0;
/*-------------------------------------------------------------------*/
/* Zero out transmit & receive descriptors */
/*-------------------------------------------------------------------*/
bzero((UCHAR *)TxDesc, sizeof(LAN_BUFF_DESC) * TxNumDesc);
bzero((UCHAR *)RxDesc, sizeof(LAN_BUFF_DESC) * RxNumDesc);
/*-------------------------------------------------------------------*/
/* Initialize the transmit buffer descriptor ring. */
/*-------------------------------------------------------------------*/
for (descp = TxDesc; descp < TxDesc + TxNumDesc - 1; ++descp)
{
descp->nextDesc = descp + 1;
COPYBACK((void *)descp, 1);
}
descp->nextDesc = TxDesc;
COPYBACK((void *)descp, 1);
/*-------------------------------------------------------------------*/
/* Initialize the receive buffer descriptor ring. */
/*-------------------------------------------------------------------*/
for (descp = RxDesc; descp < RxDesc + TxNumDesc - 1; ++descp)
{
descp->nextDesc = descp + 1;
COPYBACK((void *)descp, 1);
}
descp->nextDesc = RxDesc;
COPYBACK((void *)descp, 1);
/*-------------------------------------------------------------------*/
/* Initialize buffer descriptor pointers. */
/*-------------------------------------------------------------------*/
RxUsedBD = RxNextBD = RxDesc;
TxUsedBD = TxNewBD = TxDesc;
TxFreeDesc = TxNumDesc;
/*-------------------------------------------------------------------*/
/* Link receive buffers with receive descriptors. */
/*-------------------------------------------------------------------*/
RxBufAttach();
/*-------------------------------------------------------------------*/
/* Initialize Lan chip in Ethernet mode in stopped mode. */
/*-------------------------------------------------------------------*/
lanInit();
/*-------------------------------------------------------------------*/
/* Add our Ethernet address to MAC's list. */
/*-------------------------------------------------------------------*/
lan_addr_clear();
lan_add_mcast((UCHAR *)&OurAddress.word1);
/*-------------------------------------------------------------------*/
/* Clear the status register - CSR5 */
/*-------------------------------------------------------------------*/
ioLongWrite(CSR5, 0x0000FFFF);
/*-------------------------------------------------------------------*/
/* PCI Status Register - Clear */
/*-------------------------------------------------------------------*/
WrPciCfg16(CF_STATUS, LAN_DS_PER | LAN_DS_SERR | LAN_DS_MA |
LAN_DS_RTA | LAN_DS_STA | LAN_DS_DPAR);
/*-------------------------------------------------------------------*/
/* Interrupt Mask Register - CSR7 */
/*-------------------------------------------------------------------*/
ioLongWrite(CSR7, LAN_CSR7_TI | /* Tx Int enable */
LAN_CSR7_UN | /* underflow Int */
LAN_CSR7_RI | /* Rx Int */
LAN_CSR7_RU | /* Rx Buf unavailable */
LAN_CSR7_RS | /* Rx Stopped */
LAN_CSR7_FBE | /* fatal bus error */
LAN_CSR7_AI | /* abnormal Int */
LAN_CSR7_GPT | /* general purpose timer expired */
LAN_CSR7_NI); /* normal int */
#if 0
/*-------------------------------------------------------------------*/
/* Start general purpose timer in continuous mode. */
/*-------------------------------------------------------------------*/
ioLongWrite(CSR11, 0x11FFF);
#endif
/*-------------------------------------------------------------------*/
/* Start transmitter and receiver in normal operation mode. */
/*-------------------------------------------------------------------*/
lword = ioLongRead(CSR6);
lword |= LAN_CSR6_MBO | LAN_CSR6_SR | LAN_CSR6_ST;
ioLongWrite(CSR6, lword);
/*-------------------------------------------------------------------*/
/* No errors if we got here, so return pointer to Ethernet address. */
/*-------------------------------------------------------------------*/
intRESTORE_IEN(ien);
return (long)&OurAddress;
}
/***********************************************************************/
/* ni_send: Send a packet to another node */
/* */
/* INPUTS: hwa_ptr = pointer to the destination hardware address */
/* pkb_ptr = pointer to packet (msg block triplet) */
/* type = flag indicating either IP, ARP, or RARP */
/* */
/***********************************************************************/
static void ni_send(char *hwa_ptr, char *pkb_ptr, USHORT type)
{
LAN_TX_HDR *tx_hdr;
mblk_t *msgBlk, *tmp, *prev;
ULONG i, numDesc;
Bool ien;
/*-------------------------------------------------------------------*/
/* Try to keep the transmit descriptors full. */
/*-------------------------------------------------------------------*/
TxFillDesc();
/*-------------------------------------------------------------------*/
/* Compute the # of descriptors required to send this frame. */
/*-------------------------------------------------------------------*/
msgBlk = (mblk_t *)pkb_ptr;
numDesc = 1; /* 1 for the header */
prev = NULL;
while (msgBlk)
{
if (msgBlk->b_rptr != msgBlk->b_wptr)
{
++numDesc;
}
else
{
tmp = msgBlk->b_cont;
if (prev)
prev->b_cont = tmp;
msgBlk->b_cont = NULL;
NiFuncs.freemsg(msgBlk);
msgBlk = tmp;
continue;
}
prev = msgBlk;
msgBlk = msgBlk->b_cont;
}
msgBlk = (mblk_t *)pkb_ptr;
/*----------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -