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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dp83815.c

?? linux下的DP83815網(wǎng)卡驅(qū)動源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
dp83815_mac_address_set (u32 iobase, char *mac_addr)
#endif    
{
    u16 *    mac_addr_ptr;
    int i;
#ifdef LINK_AGGR
    u32 iobase = (u32) pAdp->RegAddr;
#endif
    
    for (i=0, mac_addr_ptr = (u16 *)mac_addr; i<3; i++, mac_addr_ptr++) {
        DP_REG32_WRITE (DP_RFCR, DP_RFCR_RFADDR_PMATCH1 + i*2);
        DP_REG32_WRITE (DP_RFDR, CPU_TO_BUS_SWAP_16(*mac_addr_ptr));
    }
#ifdef LINK_AGGR
    if (pAdp->nFlags)
        LacpSetMacAddress(pAdp, mac_addr);
#endif    
}

#define EEPROM_READ  (0x6 << 6)

static void
dp83815_eeprom_delay (u32 iobase)
{
    DP_REG32_READ(DP_MEAR);
}

static u16
dp83815_eeprom_read (u32 iobase, int addr)
{
    int cmd = addr | EEPROM_READ;
    int i;
    u16 val = 0;

    DP_REG32_WRITE (DP_MEAR, DP_MEAR_EESEL);

    for (i = 10; i>=0; i--)
    {
        if ( cmd & (1 << i))
            DP_REG32_WRITE (DP_MEAR, DP_MEAR_EESEL | DP_MEAR_EEDI);
        else
            DP_REG32_WRITE (DP_MEAR, DP_MEAR_EESEL);
        dp83815_eeprom_delay (iobase);
        DP_REG32_WRITE (DP_MEAR, DP_MEAR_EECLK |
                        DP_REG32_READ(DP_MEAR));
        dp83815_eeprom_delay (iobase);
    }
    
    DP_REG32_WRITE (DP_MEAR, DP_MEAR_EESEL);
    dp83815_eeprom_delay (iobase);

    for (i = 0; i < 16; i++) {
        DP_REG32_WRITE (DP_MEAR, DP_MEAR_EECLK | DP_MEAR_EESEL);
        dp83815_eeprom_delay (iobase);
        if (DP_REG32_READ (DP_MEAR) & DP_MEAR_EEDO)
            val |= 1 << i;
        DP_REG32_WRITE (DP_MEAR, DP_MEAR_EESEL);
        dp83815_eeprom_delay (iobase);
    }
    DP_REG32_WRITE (DP_MEAR, DP_MEAR_EESEL);   
    DP_REG32_WRITE (DP_MEAR, 0);
    return val;
}

/* dp83815_mac_address_get - get the ethernet address */
static void
dp83815_mac_address_get (u32 iobase, char *mac_addr)
{
    u16 old_val, new_val;
    int  i;
    
    old_val = dp83815_eeprom_read (iobase, 6);
    for (i = 0; i < 3; i++)
    {
        new_val = dp83815_eeprom_read (iobase, i + 7);
        mac_addr[i*2] = (new_val << 1) + (old_val >> 15);
        mac_addr[(i*2) + 1] = new_val >> 7;
        old_val = new_val;
    }
    /* If address is not set, set up a default one */
    /* XXX needed only for pre-release versions of the hardware */
    if ((mac_addr[0] == 0) && (mac_addr[1] == 0) &&
	(mac_addr[2] == 0) && (mac_addr[3] == 0) &&
	(mac_addr[4] == 0) && (mac_addr[5] == 0)) {
         u32   random = jiffies;
         u8 *  ptr = (u8 *) &random;

	 mac_addr[0] = 0x08; /* National's Ethernet ID 0 */
	 mac_addr[1] = 0x00; /* National's Ethernet ID 1 */
	 mac_addr[2] = 0x17; /* National's Ethernet ID 2 */
	 mac_addr[3] = *ptr++;
	 mac_addr[4] = *ptr++;
	 mac_addr[5] = *ptr;
    }

}

/* dp83815_dev_reset - soft reset DP83815 */
static status
#ifdef LINK_AGGR
dp83815_dev_reset (AdapterContext *pAdp)
#else    
dp83815_dev_reset (u32 iobase)
#endif    
{
    int  timeout = 100;     /* XXX cleanup: use macro */
#ifdef LINK_AGGR
    u32 iobase = (u32) pAdp->RegAddr;
    pAdp->MacStats.txOkCount = 0;
#endif
    
    DP_REG32_WRITE (DP_CR, DP_CR_RST);
    DP_REG32_WRITE (DP_BMCR, DP_BMCR_RESET);
    while (timeout--) {
        if (DP_REG32_READ (DP_ISR) == 0x03008000) {
            return (OK);
        }
        udelay (5);
    }
    return ERROR;
}

/*
 * dp83815_queue_create - create a circular queue of descriptors
 *
 * This routine allocates a descriptor buffer array aligned  on a word
 * boundary, initializes and links the array to make a circular queue.
 */
static status
dp83815_queue_create (struct dp83815_queue *q, int count, int qtype)
{
    virt_addr     desc_addr;
    int           i;
    struct sk_buff *skb;
    
    /* allocate the desc buffer array */
    q->qbuf = (virt_addr) kmalloc (DP_QUEUE_ELE_SIZE * count + DP_ALIGN,
                                   GFP_DMA);
    if (q->qbuf == (virt_addr) NULL)
        return ERROR;

    memset ((char *)q->qbuf, 0, DP_QUEUE_ELE_SIZE * count + DP_ALIGN);

    /* Adjust alignment and Initialize queue data */
    q->cur_desc_addr =
        q->first_desc_addr =
        (virt_addr)(((u32)q->qbuf + DP_ALIGN) & ~(DP_ALIGN - 1));
    q->last_desc_addr = q->first_desc_addr + ((count -1) * DP_QUEUE_ELE_SIZE);
    q->count = count;
    q->read_desc_addr = q->cur_desc_addr;

    /* Initialize each buffer descriptor, and link them into circular queue */
    for (i=0, desc_addr=q->first_desc_addr; i<count;
         i++, desc_addr+=DP_QUEUE_ELE_SIZE) {
        DP_DESC_LNK_XLATE_SET (desc_addr, desc_addr + DP_QUEUE_ELE_SIZE);
            
        /* Update the size, BUFPTR, and SKBPTR fields for RX descriptors */
        if (qtype == DP_QUEUE_TYPE_RX) {
            skb = alloc_skb (ETH_MAX_PKT_SIZE, GFP_ATOMIC);
            if (skb == NULL) {
                dp83815_queue_delete (q);
                return (ERROR);
            }
            DP_DESC_CMDSTS_XLATE_SET (desc_addr, ETH_MAX_PKT_SIZE);
            DP_DESC_BUFPTR_XLATE_SET (desc_addr, skb->data);
            DP_DESC_SKBPTR_SET (desc_addr, (u32) skb);
        }
    }
    /* Make the queue circular */
    DP_DESC_LNK_XLATE_SET (q->last_desc_addr, q->first_desc_addr);
    return OK;
}

/* dp83815_queue_delete - frees an allocated descriptor queue */
static status
dp83815_queue_delete (struct dp83815_queue *q)
{
    int       i;
    virt_addr desc_addr;
    struct sk_buff *skb;
        
    /* Free all SKBs in the queue */
    for (i=0, desc_addr=q->first_desc_addr;
         (i < q->count);
         i++, desc_addr += DP_QUEUE_ELE_SIZE) {
        skb = (struct sk_buff *) DP_DESC_SKBPTR_GET (desc_addr);
        if (skb != NULL)
            dev_kfree_skb (skb);
    }

    /* Free the queue buffer */
    kfree ((char *)q->qbuf);
    
    return (OK);
}

/*
 * dp83815_tx_desc_get - get a valid transmit descriptor
 *
 * This routine returns the current descriptor from the tx_queue if driver is 
 * the owner, else returns NULL
 */
static virt_addr
dp83815_tx_desc_get (struct net_device *dev)
{
    struct dp83815_queue *   q;
    virt_addr  desc_addr = NULL;

    q = &((struct dp83815_priv *)(dev->priv))->tx_queue;

    /* Check if we own the descriptor */
    if  (((DP_DESC_CMDSTS_XLATE_GET (q->cur_desc_addr) & DP_DESC_CMDSTS_OWN)
          == 0) &&
         (DP_DESC_SKBPTR_GET(q->cur_desc_addr) == (u32)NULL)) {
        desc_addr = q->cur_desc_addr;
        DP_QUEUE_ELE_NEXT (q);                 /* Move to the next element */
    }

    return desc_addr;
}

/* dp83815_tx_skb_reclaim_irq - reclaim SKBs in transmitted descriptors */
static void
dp83815_tx_skb_reclaim_irq (struct net_device *dev, virt_addr desc_addr)
{
    struct sk_buff *       skb;
    struct dp83815_queue * q;

    /* Reclaim buffers from all descriptors we own. */
    q = &((struct dp83815_priv *)(dev->priv))->tx_queue;
    while (((DP_DESC_CMDSTS_XLATE_GET(q->read_desc_addr) & DP_DESC_CMDSTS_OWN) == 0) &&
           ((skb=(struct sk_buff *) DP_DESC_SKBPTR_GET(q->read_desc_addr)) != NULL))
    {
        dev_kfree_skb_irq (skb);
        DP_DESC_SKBPTR_SET (q->read_desc_addr, 0);
        q->read_desc_addr = DP_QUEUE_ELE_NEXT_GET (q, q->read_desc_addr);
    }
}

/*
 * dp83815_rx_desc_get - get a valid receive descriptor
 *
 * This routine returns the current descriptor from the rx_queue if driver is 
 * the owner, else returns NULL
 */
static virt_addr
dp83815_rx_desc_get (struct net_device *dev)
{
    struct dp83815_queue *   q;
    virt_addr                desc_addr = NULL;

    q = &((struct dp83815_priv *)(dev->priv))->rx_queue;
    /* Check if we own the descriptor */
    if  (DP_DESC_CMDSTS_XLATE_GET (q->cur_desc_addr) & DP_DESC_CMDSTS_OWN) {
        desc_addr = q->cur_desc_addr;
        DP_QUEUE_ELE_NEXT(q);                 /* Move to the next element */
    }

    return desc_addr;
}

/* dp83815_phy_setup - reset and setup the PHY device */
static status
dp83815_phy_setup (struct net_device *dev)
{
    u32  iobase = dev->base_addr;
    u32  dp_cfg_val;
    u16  phy_status;
    u16  timeout;
	u32  tmpVal;
	u32  version;

    char strbuf[80];
    struct dp83815_priv *dev_priv = (struct dp83815_priv *)dev->priv;
#ifdef LINK_AGGR
    NsmContext     *pNsm = &((struct dp83815_priv *)(dev->priv))->NsmCtxt;
    AdapterContext *pAdp =  &pNsm->AdpCtxt;
#endif

#define ATAN_AT8989P
#ifdef ATAN_AT8989P
#define DP_DSPTST 0xEC /* ATAN AT8989P switch does not meet IEEE 802.3u FLP SPEC */
	tmpVal = DP_REG32_READ(DP_DSPTST);
	tmpVal &= 0x00ff;
	DP_REG32_WRITE(DP_DSPTST, tmpVal | 0x80ff);
#endif

    if (dev_priv->autoneg == 1)
    {
        dp_cfg_val =  (DP_CFG_PESEL           |     /* parity error detect */
                       DP_CFG_PAUSE_ADV       |     /* pause capable */
                       DP_CFG_PINT_ACEN       |     /* phy intr auto clear */
                       0x00040000);                 /* phy config */

        if ((dev_priv->speed100 == 2) && (dev_priv->fullduplex == 2))
	{
            dp_cfg_val |= DP_CFG_ANEG_SEL_ALL_XD;     /* negotiate 10/100 full/half */
            sprintf (strbuf, "auto negotiate for 10/100 full/half duplex\n");
	}
	else if ((dev_priv->speed100 == 2) && (dev_priv->fullduplex == 0))
	{
            dp_cfg_val |= DP_CFG_ANEG_SEL_ALL_HD;     /* negotiate 10/100 half duplex */
            sprintf (strbuf, "auto negotiate for 10/100 half duplex\n");
	}
	else if ((dev_priv->speed100 == 0) && (dev_priv->fullduplex == 2))
	{
            dp_cfg_val |= DP_CFG_ANEG_SEL_10_XD;     /* negotiate 10 half/full duplex */
            sprintf (strbuf, "auto negotiate 10 half/full duplex\n");
	}
	else if ((dev_priv->speed100 == 1) && (dev_priv->fullduplex == 2))
	{
            dp_cfg_val |= DP_CFG_ANEG_SEL_100_XD;     /* negotiate 100 half/full duplex */
            sprintf (strbuf, "auto negotiate 100 half/full duplex\n");
	}

	DP_DEBUG (DP_DEBUG_OPEN, (KERN_INFO "%s: %s \n",dev->name, strbuf));    

	// NSC20030123 for Atan Fix start
//	DP_REG32_WRITE (DP_CFG, dp_cfg_val | DP_CFG_PHY_RST);
//	udelay (500);

	dp83815_ResetPhy(dev);
	// NSC20030123 for Atan Fix End
	dp83815_PhyAdjust(dev);
	DP_REG32_WRITE (DP_CFG, dp_cfg_val);
	for (timeout=10000; timeout; timeout--) {
	    if (DP_REG32_READ (DP_CFG) & DP_CFG_ANEG_DN)
                break;
	    udelay (500);
	}

	if (timeout == 0) {
	    printk (KERN_INFO "Phy Autonegotiate Failed, please check the cable\n");
	}
    } 
    else {
        dp_cfg_val =  (DP_CFG_PESEL           |     /* parity error detect */
                       DP_CFG_PAUSE_ADV       |     /* pause capable */
                       DP_CFG_PINT_ACEN       |     /* phy intr auto clear */
                       0x00040000);                 /* phy config */
    
        if ((dev_priv->fullduplex == 1) && (dev_priv->speed100 == 1))
	{
	    dp_cfg_val |= DP_CFG_ANEG_SEL_100_FD;   /* force 100 & full duplex */
            sprintf (strbuf, "force 100 & full duplex\n");
	}
        else if ((dev_priv->fullduplex != 1) && (dev_priv->speed100 == 1))
        {
	    dp_cfg_val |= DP_CFG_ANEG_SEL_100_HD;   /* force 100 & half duplex */
            sprintf (strbuf, "force 100 & half duplex\n");
	}
	else if ((dev_priv->fullduplex != 1) && (dev_priv->speed100 != 1))
	{
            dp_cfg_val |= DP_CFG_ANEG_SEL_10_HD;    /* force 10 & half duplex */
            sprintf (strbuf, "force 10 & half duplex\n");
        }
        else if ((dev_priv->fullduplex == 1) && (dev_priv->speed100 != 1))
	{
            dp_cfg_val |= DP_CFG_ANEG_SEL_10_FD;    /* force 10 & full duplex */
            sprintf (strbuf, "force 10 & full duplex\n");
	}

	DP_DEBUG (DP_DEBUG_OPEN, (KERN_INFO "%s: %s",dev->name, strbuf));    

	DP_REG32_WRITE (DP_CFG, DP_CFG_PHY_RST);
        udelay (1000);	

	DP_REG32_WRITE (DP_CFG, dp_cfg_val);     
    }

    /**** enable the phy interrupt ****/
    DP_REG16_WRITE (DP_MICR, DP_MICR_PHY_INT);
   
    phy_status = DP_REG16_READ (DP_PHYSTS);
    printk (KERN_INFO "%s: speed=%d duplex=%s link=%s\n",
            dev->name,
            (phy_status & DP_PHYSTS_SPEED_10) ? 10 : 100,
            (phy_status & DP_PHYSTS_FDX)? "full" : "half",
            (phy_status & DP_PHYSTS_LNK_VALID) ? "up" : "down");

    if(phy_status&DP_PHYSTS_LNK_VALID){
	    dev_priv->PrevLinkSts = 1;
    }
    else{
	    de

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
911精品产国品一二三产区| 91色九色蝌蚪| 2023国产精品自拍| 免费在线观看日韩欧美| 6080国产精品一区二区| 亚洲综合av网| 欧美色区777第一页| 亚洲精品国产a久久久久久| aaa欧美大片| 亚洲三级电影网站| 色综合久久天天| 亚洲精品国产精华液| 一本一道久久a久久精品| 黄一区二区三区| 精品欧美一区二区在线观看| 蜜臀久久99精品久久久画质超高清| 91精品国产欧美一区二区| 日韩国产欧美在线观看| 91精品国产综合久久精品图片| 日韩专区一卡二卡| 欧美一二三四在线| 美国欧美日韩国产在线播放| 精品国产91乱码一区二区三区| 久久超碰97人人做人人爱| 亚洲精品在线观看视频| 国产精品99精品久久免费| 中文字幕中文字幕一区| 色网站国产精品| 日韩中文字幕麻豆| 欧美成人a∨高清免费观看| 国产伦理精品不卡| 中文字幕中文字幕一区二区| 色狠狠桃花综合| 天天影视网天天综合色在线播放| 日韩欧美国产系列| 国产成人亚洲综合a∨婷婷 | 欧美理论片在线| 免费美女久久99| 久久九九国产精品| 99久久亚洲一区二区三区青草| 亚洲精品视频免费看| 91精品国产综合久久久久久漫画| 经典三级在线一区| 亚洲视频一二三| 7799精品视频| 国产精品一区二区久激情瑜伽| 亚洲婷婷国产精品电影人久久| 欧美视频日韩视频在线观看| 久久99九九99精品| 成人免费在线观看入口| 欧美精品 日韩| 国产精品1024| 亚洲国产一二三| 精品国产99国产精品| 91蜜桃传媒精品久久久一区二区| 亚洲第一在线综合网站| 久久蜜臀中文字幕| 欧美做爰猛烈大尺度电影无法无天| 蜜桃av一区二区| 中文字幕欧美区| 欧美三片在线视频观看| 久久精品999| 亚洲欧美另类久久久精品2019| 日韩一区二区三免费高清| 成人av网站大全| 日韩精品午夜视频| 国产精品久线在线观看| 91麻豆精品国产| av电影一区二区| 日本不卡视频在线| 综合网在线视频| 精品少妇一区二区三区视频免付费 | 懂色一区二区三区免费观看| 亚洲乱码中文字幕| 精品精品国产高清a毛片牛牛| 91免费视频观看| 欧美在线999| 国产精品一级黄| 午夜精品福利在线| 国产精品国产三级国产a| 欧美一区二区视频在线观看 | 久久精品久久精品| 亚洲精品伦理在线| 久久久蜜臀国产一区二区| 欧美性生交片4| 成人少妇影院yyyy| 免费看欧美女人艹b| 一区二区三区色| 国产欧美日韩另类视频免费观看 | 色婷婷av一区| 国产精品羞羞答答xxdd| 日韩经典一区二区| 亚洲黄色片在线观看| 国产欧美1区2区3区| 日韩一区二区三区三四区视频在线观看 | 在线一区二区视频| 国产ts人妖一区二区| 麻豆精品一区二区三区| 亚洲高清免费在线| 日韩毛片视频在线看| 久久综合一区二区| 日韩欧美亚洲国产另类| 欧美日韩国产bt| 色久优优欧美色久优优| 成人av在线资源网| 国产精品一区二区视频| 另类小说图片综合网| 手机精品视频在线观看| 亚洲精品老司机| 中文字幕亚洲欧美在线不卡| 国产亚洲一区二区三区| 久久亚洲免费视频| 精品国产sm最大网站免费看| 91精品国产欧美日韩| 欧美日韩一二三区| 欧美怡红院视频| 在线中文字幕不卡| 91网站在线播放| 91在线看国产| 99re成人精品视频| 91在线视频在线| eeuss鲁片一区二区三区在线观看| 国产精品911| 国产91在线观看| 国产91清纯白嫩初高中在线观看 | 成人高清免费在线播放| 岛国一区二区三区| 日本电影亚洲天堂一区| 亚洲视频每日更新| 亚洲精品国产一区二区三区四区在线 | 欧美日韩免费视频| 欧美性猛片aaaaaaa做受| 欧美在线视频不卡| 欧美日韩国产成人在线免费| 欧美美女bb生活片| 欧美男女性生活在线直播观看| 欧美日韩国产免费| 欧美人狂配大交3d怪物一区| 亚洲精品五月天| 欧美日韩免费一区二区三区| 亚洲综合视频在线| 精品写真视频在线观看| 国产夜色精品一区二区av| 欧美做爰猛烈大尺度电影无法无天| 国产精品女同一区二区三区| 一区二区三区中文字幕精品精品 | 99热精品国产| 亚洲欧洲性图库| 国产精品中文字幕日韩精品| 国产98色在线|日韩| 成人性生交大片免费看视频在线| 日韩一区二区三区免费观看| 26uuu亚洲| 中文字幕在线观看一区二区| 亚洲电影一级黄| 日本欧美肥老太交大片| 亚洲成人综合网站| 日本怡春院一区二区| 欧美日韩国产在线播放网站| 麻豆国产精品视频| 成人综合在线观看| 激情国产一区二区| 成人动漫在线一区| 久久精品国产99| 国产成人av电影在线播放| 婷婷国产v国产偷v亚洲高清| 久久精品二区亚洲w码| 亚洲一区二区精品视频| 蜜臂av日日欢夜夜爽一区| 人人精品人人爱| 亚洲三级在线观看| 中文久久乱码一区二区| 亚洲成人福利片| 亚洲成人久久影院| 一区二区三区91| 91精品国产入口在线| 久久午夜免费电影| 精品免费一区二区三区| 欧美在线制服丝袜| 久久美女高清视频 | 亚洲精品日产精品乱码不卡| 久久一区二区视频| 国产欧美一区二区精品性 | 欧美一级精品大片| 国产自产视频一区二区三区| 久久久久国产精品麻豆| 亚洲免费三区一区二区| 2023国产精品| 91蜜桃在线免费视频| 亚洲精品视频一区二区| 欧美激情中文字幕一区二区| 一区二区高清免费观看影视大全 | 精品少妇一区二区| 国产亚洲精品资源在线26u| 亚洲欧美视频在线观看视频| 中文字幕av在线一区二区三区| 亚洲高清在线精品| 国产精品乱码一区二三区小蝌蚪| 欧美变态tickling挠脚心| 亚洲线精品一区二区三区 |