亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dm9000end.c

?? 基于s3c2440和vxworks的dm9000驅動代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
                return (EINVAL);
            bcopy ((char *)data, (char *)END_HADDR(&pDrvCtrl->end),
            END_HADDR_LEN(&pDrvCtrl->end));
            break;
        case EIOCGADDR:
        DRV_LOG (DRV_DEBUG_LOAD, "EIOCGADDR", 1, 2, 3, 4, 5, 6);
            if (data == NULL)
                return (EINVAL);
            bcopy ((char *)END_HADDR(&pDrvCtrl->end), (char *)data,
            END_HADDR_LEN(&pDrvCtrl->end));
            break;
        case EIOCSFLAGS:
        DRV_LOG (DRV_DEBUG_LOAD, "EIOCSFLAGS", 1, 2, 3, 4, 5, 6);
            value = (long)data;
            if (value < 0)
            {
                value = -(--value);
                END_FLAGS_CLR (&pDrvCtrl->end, value);
            }
            else
            {
                END_FLAGS_SET (&pDrvCtrl->end, value);
            }
            dm9000Config (pDrvCtrl);
            break;
        case EIOCGFLAGS:
        DRV_LOG (DRV_DEBUG_LOAD, "EIOCGFLAGS", 1, 2, 3, 4, 5, 6);
            *(int *)data = END_FLAGS_GET(&pDrvCtrl->end);
            break;

        case EIOCPOLLSTART: /* Begin polled operation */
        DRV_LOG (DRV_DEBUG_LOAD, "begin polled operation", 1, 2, 3, 4, 5, 6);
            dm9000PollStart (pDrvCtrl);
            break;

        case EIOCPOLLSTOP:  /* End polled operation */
        DRV_LOG (DRV_DEBUG_LOAD, "end polled operation", 1, 2, 3, 4, 5, 6);
            dm9000PollStop (pDrvCtrl);
            break;

        case EIOCGMIB2:     /* return MIB information */
        DRV_LOG (DRV_DEBUG_LOAD, "return MIB information", 1, 2, 3, 4, 5, 6);
            if (data == NULL)
                return (EINVAL);
            bcopy((char *)&pDrvCtrl->end.mib2Tbl,
                  (char *)data,
                  sizeof(pDrvCtrl->end.mib2Tbl));
            break;
        case EIOCGFBUF:     /* return minimum First Buffer for chaining */
        		DRV_LOG (DRV_DEBUG_LOAD, "return minimun first buffer for chaining", 1, 2, 3, 4, 5, 6);
            if (data == NULL)
                return (EINVAL);
            *(int *)data = DM9000_MIN_FBUF;					
            break;
        default:
        DRV_LOG (DRV_DEBUG_LOAD, "error", 1, 2, 3, 4, 5, 6);
            error = EINVAL;
    }
    return (error);
}

/******************************************************************************
*
* dm9000Mode - configure the interface mode
*
* mode:
* #define DM9000_10MHD        0x00
* #define DM9000_100MHD       0x01
* #define DM9000_10MFD        0x04
* #define DM9000_100MFD       0x05
* #define DM9000_AUTO         0x08
* #define DM9008A             0x10
* #define DM900xA_PECL        0x15
* RETURNS: N/A.
*/
void     dm9000Mode( END_DEVICE *pDrvCtrl, int mode, int reset )
{
    if( pDrvCtrl != 0 )
    {
        printf("pDrvCtrl->op_mode = %d\n",(int)(pDrvCtrl->op_mode) );
        pDrvCtrl->op_mode = (UCHAR)mode;
        printf("pDrvCtrl->op_mode = %d\n",(int)(pDrvCtrl->op_mode) );
        if( reset != 0 )
        {
            dm9000Reset( pDrvCtrl );
            dm9000Config( pDrvCtrl );
        }
    }
    else
    {
        printf("DrvCtrl->op_mode = %d\n",(int)(DrvCtrl->op_mode) );
        DrvCtrl->op_mode = (UCHAR)mode;
        printf("DrvCtrl->op_mode = %d\n",(int)(DrvCtrl->op_mode) );
        if( reset != 0 )
        {
            dm9000Reset( DrvCtrl );
            dm9000Config( DrvCtrl );
        }
    }
}

/******************************************************************************
*
* dm9000Config - reconfigure the interface under us.
*
* Reconfigure the interface setting promiscuous mode, and changing the
* multicast interface list.
*
* RETURNS: N/A.
*/

static void dm9000Config( END_DEVICE *pDrvCtrl ) /* device to be re-configured */
{
    /* Set promiscuous mode if it's asked for. */
    DRV_LOG (DRV_DEBUG_LOAD, "dm9000Config()", 1, 2, 3, 4, 5, 6);

    if (END_FLAGS_GET(&pDrvCtrl->end) & IFF_PROMISC)
    {
        DRV_LOG (DRV_DEBUG_IOCTL, "Setting promiscuous mode on!",
                 1, 2, 3, 4, 5, 6);
    }
    else
    {
        DRV_LOG (DRV_DEBUG_IOCTL, "Setting promiscuous mode off!",
                 1, 2, 3, 4, 5, 6);
    }

    /* Set up address filter for multicasting. */

    if (END_MULTI_LST_CNT(&pDrvCtrl->end) > 0)
    {
        dm9000AddrFilterSet (pDrvCtrl);
        dm9000_hash_table( pDrvCtrl ); 
    }

    /* TODO - shutdown device completely */

    /* TODO - reset all device counters/pointers, etc. */

    /* TODO - initialise the hardware according to flags */
      dmfe_config_dm9000( pDrvCtrl, 2 );

    DRV_LOG (DRV_DEBUG_LOAD, "dm9000Config() done", 1, 2, 3, 4, 5, 6);
    return;
}


static void dm9000needreset( END_DEVICE *pDrvCtrl )
{
    int oldv;

    DRV_LOG (DRV_DEBUG_STATUS, "dm9000needreset()", 1, 2, 3, 4, 5, 6);

    oldv = intLock();
    pDrvCtrl->device_wait_reset = 0;

    dm9000Reset( pDrvCtrl );
    dm9000Config( pDrvCtrl );
    intUnlock( oldv );
}
/******************************************************************************
*
* dm9000AddrFilterSet - set the address filter for multicast addresses
*
* This routine goes through all of the multicast addresses on the list
* of addresses (added with the endAddrAdd() routine) and sets the
* device's filter correctly.
*
* RETURNS: N/A.
*/

void dm9000AddrFilterSet( END_DEVICE *pDrvCtrl )
{
    int i;
    unsigned long crc; 
    unsigned long hash_table[4];
    ETHER_MULTI* pCurr;
    
    pDrvCtrl->mcastFilter[0] = 0;
    pDrvCtrl->mcastFilter[1] = 0;
    pDrvCtrl->mcastFilter[2] = 0;
    pDrvCtrl->mcastFilter[3] = 0;
    pDrvCtrl->mcastFilter[4] = 0;
    pDrvCtrl->mcastFilter[5] = 0;
    pDrvCtrl->mcastFilter[6] = 0;
    pDrvCtrl->mcastFilter[7] = 0;
    
    for(i=0;i<4;i++)hash_table[i]=0;
    hash_table[3]=0x8000;
    
    /* broadcast address */
    /*pDrvCtrl->mcastFilter[7] = 0x80; */      /*mabe  [6] */

    /* the multicast address in Hash Table : 64 bits */

    pCurr = END_MULTI_LST_FIRST (&pDrvCtrl->end);

    while (pCurr != NULL)
    {
        /* TODO - set up the multicast list */
        crc = cal_CRC(((unsigned char *)&pCurr->addr), 6, 0 )&0x3f;
        hash_table[crc/16] |= (unsigned short) 1 << (crc % 16);
        
    pCurr = END_MULTI_LST_NEXT(pCurr);     
    }
 
       pDrvCtrl->mcastFilter[0] |= hash_table[0]&0xff;
       pDrvCtrl->mcastFilter[1] |= (hash_table[0]>>8)&0xff;
       pDrvCtrl->mcastFilter[2] |= hash_table[1]&0xff;
       pDrvCtrl->mcastFilter[3] |= (hash_table[1]>>8)&0xff;
       pDrvCtrl->mcastFilter[4] |= hash_table[2]&0xff;
       pDrvCtrl->mcastFilter[5] |= (hash_table[2]>>8)&0xff;
       pDrvCtrl->mcastFilter[6] |= hash_table[3]&0xff;
       pDrvCtrl->mcastFilter[7] |= (hash_table[3]>>8)&0xff;
}

/*******************************************************************************
*
* dm9000PollRcv - routine to receive a packet in polled mode.
*
* This routine is called by a user to try and get a packet from the
* device.
*
* RETURNS: OK upon success.  EAGAIN is returned when no packet is available.
*/

static STATUS dm9000PollRcv( END_DEVICE *pDrvCtrl,  /* device to be polled */
                            M_BLK_ID   pMblk )     /* ptr to buffer */
{
    u_short stat;
    char* pPacket;
    int len;
    PKT         skb;

    DRV_LOG (DRV_DEBUG_POLL_RX, "dm9000PollRcv", 1, 2, 3, 4, 5, 6);

    stat = dm9000StatusRead (pDrvCtrl);
    /* TODO - If no packet is available return immediately */

    if( !(stat&DM9000_RXRDY) )
    {
        DRV_LOG (DRV_DEBUG_POLL_RX, "dm9000PollRcv no data", 1,
                 2, 3, 4, 5, 6);
        return (EAGAIN);
    }

    
    pPacket = NULL; /* DUMMY CODE */
    len = 64;       /* DUMMY CODE */

    /* Upper layer must provide a valid buffer. */

    if ((pMblk->mBlkHdr.mLen < len) || (!(pMblk->mBlkHdr.mFlags & M_EXT)))
    {
        DRV_LOG (DRV_DEBUG_POLL_RX, "PRX bad mblk", 1, 2, 3, 4, 5, 6);
        return (EAGAIN);
    }

    /* TODO - clear any status bits that may be set. */

    /* TODO - Check packet and device for errors */

    END_ERR_ADD (&pDrvCtrl->end, MIB2_IN_UCAST, +1);

    /* TODO - Process device packet into net buffer */
    skb.len = 0;
    skb.pData = pMblk->m_data;
    if( dmfe_packet_receive( &skb, pDrvCtrl ) )
    {
        DRV_LOG (DRV_DEBUG_POLL_RX, "packet receive FAIL", 1, 2, 3, 4, 5, 6);
        return (EAGAIN);
    }

/*    bcopy (pPacket, pMblk->m_data, len);   */
    pMblk->mBlkHdr.mFlags |= M_PKTHDR;  /* set the packet header */
    pMblk->mBlkHdr.mLen = len;          /* set the data len */
    pMblk->mBlkPktHdr.len = len;        /* set the total len */

    /* TODO - Done with packet, clean up and give it to the device. */

    DRV_LOG (DRV_DEBUG_POLL_RX, "dm9000PollRcv OK", 1, 2, 3, 4, 5, 6);
    DRV_LOG (DRV_DEBUG_POLL_RX, "dm9000PollRcv OK", 1, 2, 3, 4, 5, 6);

    return (OK);
}

/*******************************************************************************
*
* dm9000PollSend - routine to send a packet in polled mode.
*
* This routine is called by a user to try and send a packet on the
* device.
*
* RETURNS: OK upon success.  EAGAIN if device is busy.
*/

static STATUS dm9000PollSend( END_DEVICE *pDrvCtrl,   /* device to be polled */
                             M_BLK_ID   pMblk )      /* packet to send */
{
    int         len;
    u_short     stat;
    PKT         skb;
    int         oldv;

    DRV_LOG (DRV_DEBUG_POLL_TX, "dm9000PollSend", 1, 2, 3, 4, 5, 6);

    /* TODO - test to see if tx is busy */
    stat = dm9000StatusRead (pDrvCtrl);             /* dummy code */
    if ((stat & (DM9000_TINT|DM9000_TFULL)) == 0)
        return ((STATUS) EAGAIN);

    /* TODO - Process the net buffer into a device transmit packet */

    /* TODO - transmit packet */
    len = netMblkToBufCopy (pMblk, (char*)(pDrvCtrl->txBuf), NULL);
    len = max (len, ETHERSMALL);
    skb.len = len;
    skb.pData = (char*)pDrvCtrl->txBuf;

    oldv = intLock();
    dmfe_start_xmit( &skb, pDrvCtrl );
    intUnlock( oldv );

    /* Bump the statistic counter. */

    END_ERR_ADD (&pDrvCtrl->end, MIB2_OUT_UCAST, +1);

    /* Free the data if it was accepted by device */

    netMblkClFree (pMblk);

    DRV_LOG (DRV_DEBUG_POLL_TX, "leaving dm9000PollSend", 1, 2, 3, 4, 5, 6);

    return (OK);
}

/*****************************************************************************
*
* dm9000MCastAdd - add a multicast address for the device
*
* This routine adds a multicast address to whatever the driver
* is already listening for.  It then resets the address filter.
*
* RETURNS: OK or ERROR.
*/

static STATUS dm9000MCastAdd( END_DEVICE *pDrvCtrl,      /* device pointer */
                             char* pAddress )           /* new address to add */
{
    int error;
    int oldv=intLock();
    DRV_LOG (DRV_DEBUG_LOAD, "dm9000MCastAdd()", 1, 2, 3, 4, 5, 6);

    if (etherMultiAdd (&pDrvCtrl->end.multiList,
        pAddress) == ENETRESET)
    {
        dm9000AddrFilterSet (pDrvCtrl);
        dm9000_hash_table( pDrvCtrl ); 
    }
    intUnlock(oldv);
    return (OK);
}

/*****************************************************************************
*
* dm9000MCastDel - delete a multicast address for the device
*
* This routine removes a multicast address from whatever the driver
* is listening for.  It then resets the address filter.
*
* RETURNS: OK or ERROR.
*/

static STATUS dm9000MCastDel( END_DEVICE *pDrvCtrl,  /* device pointer */
                             char *pAddress )       /* address to be deleted */
{
    int error;
    int oldv=intLock();
    DRV_LOG (DRV_DEBUG_LOAD, "dm9000MCastDel()", 1, 2, 3, 4, 5, 6);

    if (etherMultiDel (&pDrvCtrl->end.multiList,
         (char *)pAddress) == ENETRESET)
    {
        dm9000AddrFilterSet (pDrvCtrl);
        dm9000_hash_table( pDrvCtrl );
    }
   intUnlock(oldv);
    return (OK);
}

/*****************************************************************************
*
* dm9000MCastGet - get the multicast address list for the device
*
* This routine gets the multicast list of whatever the driver
* is already listening for.
*
* RETURNS: OK or ERROR.
*/

static STATUS dm9000MCastGet( END_DEVICE *pDrvCtrl,  /* device pointer */
                             MULTI_TABLE *pTable )  /* address table to be filled in */
{
    DRV_LOG (DRV_DEBUG_LOAD, "dm9000MCastGet()", 1, 2, 3, 4, 5, 6);

    return (etherMultiGet (&pDrvCtrl->end.multiList, pTable));
}

/*******************************************************************************
*
* dm9000Stop - stop the device
*
* This function calls BSP functions to disconnect interrupts and stop
* the device from operating in interrupt mode.
*

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色爱区综合激月婷婷| 精品无人码麻豆乱码1区2区| 精品国产乱子伦一区| 欧美日韩国产首页| 欧美日韩专区在线| 欧美中文一区二区三区| 在线免费观看日本一区| 在线观看91视频| 欧美精品一级二级| 91精品国产麻豆国产自产在线| 欧美日本一道本在线视频| 欧美午夜精品免费| 欧美日本国产视频| 日韩三级免费观看| 国产三级一区二区| 亚洲视频一区在线观看| 亚洲在线视频免费观看| 日韩主播视频在线| 国模一区二区三区白浆| 国产成人av网站| 一本久久精品一区二区| 欧美性videosxxxxx| 日韩限制级电影在线观看| 欧美成人精品二区三区99精品| 久久久天堂av| 亚洲三级小视频| 青青草原综合久久大伊人精品| 狠狠色丁香婷婷综合| 99久久伊人精品| 91精品欧美久久久久久动漫| 欧美精品一区二区精品网| 国产精品久久久久久久浪潮网站| 亚洲精品日韩专区silk| 久久国产精品99精品国产| 91在线视频在线| 日韩午夜在线观看| 亚洲欧美一区二区在线观看| 奇米精品一区二区三区在线观看一 | 亚洲成人tv网| 激情综合色播五月| 欧美又粗又大又爽| 久久精品一区二区三区不卡牛牛| 亚洲欧美日韩电影| 国产精品自在在线| 5月丁香婷婷综合| 中文字幕一区二区三区精华液| 亚洲不卡在线观看| thepron国产精品| 久久综合久久综合久久| 亚洲国产精品一区二区久久 | 亚洲激情综合网| 黑人精品欧美一区二区蜜桃| 色狠狠一区二区| 欧美高清在线一区| 精品制服美女久久| 91精品久久久久久久99蜜桃 | 欧美三级中文字幕在线观看| 中文字幕欧美激情| 国产综合一区二区| 日韩一级黄色大片| 偷偷要91色婷婷| 欧美最猛黑人xxxxx猛交| 国产精品国产精品国产专区不蜜| 国产在线精品一区在线观看麻豆| 日本久久一区二区| 亚洲男人电影天堂| av在线播放不卡| 国产精品乱码一区二区三区软件| 久草中文综合在线| 日韩一区二区三区高清免费看看| 午夜免费久久看| 精品视频全国免费看| 玉足女爽爽91| 色婷婷久久久综合中文字幕| 亚洲欧洲日产国码二区| 不卡视频在线看| 国产精品国产三级国产三级人妇| 国产91高潮流白浆在线麻豆| 欧美经典三级视频一区二区三区| 国产一区二区三区蝌蚪| 久久久精品中文字幕麻豆发布| 精品亚洲成av人在线观看| 精品国产一二三区| 国产成人精品一区二区三区网站观看| 日韩免费视频线观看| 国产在线观看一区二区| 亚洲精品一区二区三区香蕉| 国产精品一区二区三区99| 久久精品亚洲国产奇米99| 国产91精品在线观看| 日韩一区在线免费观看| 在线观看日韩国产| 午夜视黄欧洲亚洲| 精品久久国产老人久久综合| 国产福利一区二区| 亚洲精品国产无天堂网2021| 欧美日韩精品综合在线| 美女视频网站久久| 中文字幕精品—区二区四季| 色综合久久66| 偷窥国产亚洲免费视频| 久久女同精品一区二区| av色综合久久天堂av综合| 亚洲一区精品在线| 日韩欧美电影一区| 不卡的电视剧免费网站有什么| 亚洲综合激情小说| 精品三级av在线| 91麻豆免费视频| 久久爱另类一区二区小说| 国产精品久久久久久久久久免费看| 欧洲精品在线观看| 国产乱人伦精品一区二区在线观看 | 偷窥少妇高潮呻吟av久久免费| 日韩精品一区二区三区中文不卡| 国产成人a级片| 性感美女久久精品| 日本一区二区三区在线观看| 欧美性xxxxxxxx| 丰满少妇久久久久久久| 五月综合激情婷婷六月色窝| 中文字幕国产一区二区| 91精品婷婷国产综合久久性色| av电影一区二区| 久久国产欧美日韩精品| 亚洲国产三级在线| 中文字幕精品一区| 精品国产一区二区三区久久影院| 91麻豆精品视频| 国产乱码字幕精品高清av| 日韩电影免费一区| 亚洲自拍都市欧美小说| 国产精品毛片久久久久久| 精品久久国产97色综合| 欧美精品乱码久久久久久按摩| 99视频一区二区| 成人精品视频一区| 国产一区二区精品久久91| 日韩激情视频网站| 亚洲一区二区三区中文字幕在线| 国产日韩v精品一区二区| 精品久久久久久久久久久久久久久 | 麻豆精品一区二区综合av| 亚洲综合在线五月| 国产精品美女视频| 久久嫩草精品久久久精品一| 在线播放日韩导航| 欧美丝袜自拍制服另类| 在线免费观看视频一区| 欧美曰成人黄网| 欧美日本视频在线| 欧美电影一区二区三区| 欧美精品三级日韩久久| 欧美猛男gaygay网站| 在线观看网站黄不卡| 在线观看区一区二| 日本久久一区二区三区| 国产精品传媒视频| 亚洲欧洲国产日韩| 一区二区中文字幕在线| 亚洲精品成人在线| 一区二区不卡在线视频 午夜欧美不卡在| 中文字幕欧美日韩一区| 国产精品色噜噜| 成人欧美一区二区三区视频网页| 亚洲欧美在线aaa| 亚洲动漫第一页| 日本亚洲天堂网| 久久精品国产网站| 国产成人三级在线观看| 不卡视频在线看| 欧美色窝79yyyycom| 91精品国产综合久久婷婷香蕉 | 欧美亚日韩国产aⅴ精品中极品| 在线视频亚洲一区| 欧美一区二区三区播放老司机| 日韩欧美一二三区| 国产精品视频一二三| 一区av在线播放| 精品午夜一区二区三区在线观看| 久久 天天综合| 99麻豆久久久国产精品免费| 在线观看亚洲一区| 日韩亚洲欧美在线| 国产精品久久看| 日本在线不卡视频一二三区| 国产乱国产乱300精品| 91麻豆成人久久精品二区三区| 91精品国产综合久久福利| 中文字幕欧美日本乱码一线二线| 亚洲免费看黄网站| 激情图片小说一区| 色婷婷久久久综合中文字幕| 欧美成人国产一区二区| 国产精品九色蝌蚪自拍| 日本女人一区二区三区| 91亚洲精品久久久蜜桃网站| 日韩亚洲欧美综合| 一区二区三区免费| 国产精品一二三四|