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

📄 dec21140.c

📁 基于psos操作系统的dec21140驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
  /*-------------------------------------------------------------------*/
  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 + -