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

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

?? smc91c92_cs.c

?? pcmcia驅動源代碼,直接可以在linux2.6下使用 !
?? C
?? 第 1 頁 / 共 5 頁
字號:
    dev_kfree_skb_irq(skb);    dev->trans_start = jiffies;    netif_start_queue(dev);    return;}/*====================================================================*/static void smc_tx_timeout(struct net_device *dev){    struct smc_private *smc = netdev_priv(dev);    kio_addr_t ioaddr = dev->base_addr;    printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "	   "Tx_status %2.2x status %4.4x.\n",	   dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));    smc->stats.tx_errors++;    smc_reset(dev);    dev->trans_start = jiffies;    smc->saved_skb = NULL;    netif_wake_queue(dev);}static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev){    struct smc_private *smc = netdev_priv(dev);    kio_addr_t ioaddr = dev->base_addr;    u_short num_pages;    short time_out, ir;    netif_stop_queue(dev);    DEBUG(2, "%s: smc_start_xmit(length = %d) called,"	  " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));    if (smc->saved_skb) {	/* THIS SHOULD NEVER HAPPEN. */	smc->stats.tx_aborted_errors++;	printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",	       dev->name);	return 1;    }    smc->saved_skb = skb;    num_pages = skb->len >> 8;    if (num_pages > 7) {	printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);	dev_kfree_skb (skb);	smc->saved_skb = NULL;	smc->stats.tx_dropped++;	return 0;		/* Do not re-queue this packet. */    }    /* A packet is now waiting. */    smc->packets_waiting++;    SMC_SELECT_BANK(2);	/* Paranoia, we should always be in window 2 */    /* need MC_RESET to keep the memory consistent. errata? */    if (smc->rx_ovrn) {	outw(MC_RESET, ioaddr + MMU_CMD);	smc->rx_ovrn = 0;    }    /* Allocate the memory; send the packet now if we win. */    outw(MC_ALLOC | num_pages, ioaddr + MMU_CMD);    for (time_out = MEMORY_WAIT_TIME; time_out >= 0; time_out--) {	ir = inw(ioaddr+INTERRUPT);	if (ir & IM_ALLOC_INT) {	    /* Acknowledge the interrupt, send the packet. */	    outw((ir&0xff00) | IM_ALLOC_INT, ioaddr + INTERRUPT);	    smc_hardware_send_packet(dev);	/* Send the packet now.. */	    return 0;	}    }    /* Otherwise defer until the Tx-space-allocated interrupt. */    DEBUG(2, "%s: memory allocation deferred.\n", dev->name);    outw((IM_ALLOC_INT << 8) | (ir & 0xff00), ioaddr + INTERRUPT);    return 0;}/*======================================================================    Handle a Tx anomolous event.  Entered while in Window 2.======================================================================*/static void smc_tx_err(struct net_device * dev){    struct smc_private *smc = netdev_priv(dev);    kio_addr_t ioaddr = dev->base_addr;    int saved_packet = inw(ioaddr + PNR_ARR) & 0xff;    int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f;    int tx_status;    /* select this as the packet to read from */    outw(packet_no, ioaddr + PNR_ARR);    /* read the first word from this packet */    outw(PTR_AUTOINC | PTR_READ | 0, ioaddr + POINTER);    tx_status = inw(ioaddr + DATA_1);    smc->stats.tx_errors++;    if (tx_status & TS_LOSTCAR) smc->stats.tx_carrier_errors++;    if (tx_status & TS_LATCOL)  smc->stats.tx_window_errors++;    if (tx_status & TS_16COL) {	smc->stats.tx_aborted_errors++;	smc->tx_err++;    }    if (tx_status & TS_SUCCESS) {	printk(KERN_NOTICE "%s: Successful packet caused error "	       "interrupt?\n", dev->name);    }    /* re-enable transmit */    SMC_SELECT_BANK(0);    outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);    SMC_SELECT_BANK(2);    outw(MC_FREEPKT, ioaddr + MMU_CMD); 	/* Free the packet memory. */    /* one less packet waiting for me */    smc->packets_waiting--;    outw(saved_packet, ioaddr + PNR_ARR);    return;}/*====================================================================*/static void smc_eph_irq(struct net_device *dev){    struct smc_private *smc = netdev_priv(dev);    kio_addr_t ioaddr = dev->base_addr;    u_short card_stats, ephs;    SMC_SELECT_BANK(0);    ephs = inw(ioaddr + EPH);    DEBUG(2, "%s: Ethernet protocol handler interrupt, status"	  " %4.4x.\n", dev->name, ephs);    /* Could be a counter roll-over warning: update stats. */    card_stats = inw(ioaddr + COUNTER);    /* single collisions */    smc->stats.collisions += card_stats & 0xF;    card_stats >>= 4;    /* multiple collisions */    smc->stats.collisions += card_stats & 0xF;#if 0 		/* These are for when linux supports these statistics */    card_stats >>= 4;			/* deferred */    card_stats >>= 4;			/* excess deferred */#endif    /* If we had a transmit error we must re-enable the transmitter. */    outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);    /* Clear a link error interrupt. */    SMC_SELECT_BANK(1);    outw(CTL_AUTO_RELEASE | 0x0000, ioaddr + CONTROL);    outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,	 ioaddr + CONTROL);    SMC_SELECT_BANK(2);}/*====================================================================*/static irqreturn_t smc_interrupt(int irq, void *dev_id){    struct net_device *dev = dev_id;    struct smc_private *smc = netdev_priv(dev);    kio_addr_t ioaddr;    u_short saved_bank, saved_pointer, mask, status;    unsigned int handled = 1;    char bogus_cnt = INTR_WORK;		/* Work we are willing to do. */    if (!netif_device_present(dev))	return IRQ_NONE;    ioaddr = dev->base_addr;    DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,	  irq, ioaddr);    smc->watchdog = 0;    saved_bank = inw(ioaddr + BANK_SELECT);    if ((saved_bank & 0xff00) != 0x3300) {	/* The device does not exist -- the card could be off-line, or	   maybe it has been ejected. */	DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"	      "/ejected device.\n", dev->name, irq);	handled = 0;	goto irq_done;    }    SMC_SELECT_BANK(2);    saved_pointer = inw(ioaddr + POINTER);    mask = inw(ioaddr + INTERRUPT) >> 8;    /* clear all interrupts */    outw(0, ioaddr + INTERRUPT);    do { /* read the status flag, and mask it */	status = inw(ioaddr + INTERRUPT) & 0xff;	DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,	      status, mask);	if ((status & mask) == 0) {	    if (bogus_cnt == INTR_WORK)		handled = 0;	    break;	}	if (status & IM_RCV_INT) {	    /* Got a packet(s). */	    smc_rx(dev);	}	if (status & IM_TX_INT) {	    smc_tx_err(dev);	    outw(IM_TX_INT, ioaddr + INTERRUPT);	}	status &= mask;	if (status & IM_TX_EMPTY_INT) {	    outw(IM_TX_EMPTY_INT, ioaddr + INTERRUPT);	    mask &= ~IM_TX_EMPTY_INT;	    smc->stats.tx_packets += smc->packets_waiting;	    smc->packets_waiting = 0;	}	if (status & IM_ALLOC_INT) {	    /* Clear this interrupt so it doesn't happen again */	    mask &= ~IM_ALLOC_INT;		    smc_hardware_send_packet(dev);		    /* enable xmit interrupts based on this */	    mask |= (IM_TX_EMPTY_INT | IM_TX_INT);		    /* and let the card send more packets to me */	    netif_wake_queue(dev);	}	if (status & IM_RX_OVRN_INT) {	    smc->stats.rx_errors++;	    smc->stats.rx_fifo_errors++;	    if (smc->duplex)		smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */	    outw(IM_RX_OVRN_INT, ioaddr + INTERRUPT);	}	if (status & IM_EPH_INT)	    smc_eph_irq(dev);    } while (--bogus_cnt);    DEBUG(3, "  Restoring saved registers mask %2.2x bank %4.4x"	  " pointer %4.4x.\n", mask, saved_bank, saved_pointer);    /* restore state register */    outw((mask<<8), ioaddr + INTERRUPT);    outw(saved_pointer, ioaddr + POINTER);    SMC_SELECT_BANK(saved_bank);    DEBUG(3, "%s: Exiting interrupt IRQ%d.\n", dev->name, irq);irq_done:    if ((smc->manfid == MANFID_OSITECH) &&	(smc->cardid != PRODID_OSITECH_SEVEN)) {	/* Retrigger interrupt if needed */	mask_bits(0x00ff, ioaddr-0x10+OSITECH_RESET_ISR);	set_bits(0x0300, ioaddr-0x10+OSITECH_RESET_ISR);    }    if (smc->manfid == MANFID_MOTOROLA) {	u_char cor;	cor = readb(smc->base + MOT_UART + CISREG_COR);	writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR);	writeb(cor, smc->base + MOT_UART + CISREG_COR);	cor = readb(smc->base + MOT_LAN + CISREG_COR);	writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR);	writeb(cor, smc->base + MOT_LAN + CISREG_COR);    }#ifdef DOES_NOT_WORK    if (smc->base != NULL) { /* Megahertz MFC's */	readb(smc->base+MEGAHERTZ_ISR);	readb(smc->base+MEGAHERTZ_ISR);    }#endif    return IRQ_RETVAL(handled);}/*====================================================================*/static void smc_rx(struct net_device *dev){    struct smc_private *smc = netdev_priv(dev);    kio_addr_t ioaddr = dev->base_addr;    int rx_status;    int packet_length;	/* Caution: not frame length, rather words			   to transfer from the chip. */    /* Assertion: we are in Window 2. */    if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {	printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",	       dev->name);	return;    }    /*  Reset the read pointer, and read the status and packet length. */    outw(PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER);    rx_status = inw(ioaddr + DATA_1);    packet_length = inw(ioaddr + DATA_1) & 0x07ff;    DEBUG(2, "%s: Receive status %4.4x length %d.\n",	  dev->name, rx_status, packet_length);    if (!(rx_status & RS_ERRORS)) {			/* do stuff to make a new packet */	struct sk_buff *skb;		/* Note: packet_length adds 5 or 6 extra bytes here! */	skb = dev_alloc_skb(packet_length+2);		if (skb == NULL) {	    DEBUG(1, "%s: Low memory, packet dropped.\n", dev->name);	    smc->stats.rx_dropped++;	    outw(MC_RELEASE, ioaddr + MMU_CMD);	    return;	}		packet_length -= (rx_status & RS_ODDFRAME ? 5 : 6);	skb_reserve(skb, 2);	insw(ioaddr+DATA_1, skb_put(skb, packet_length),	     (packet_length+1)>>1);	skb->protocol = eth_type_trans(skb, dev);		skb->dev = dev;	netif_rx(skb);	dev->last_rx = jiffies;	smc->stats.rx_packets++;	smc->stats.rx_bytes += packet_length;	if (rx_status & RS_MULTICAST)	    smc->stats.multicast++;    } else {	/* error ... */	smc->stats.rx_errors++;		if (rx_status & RS_ALGNERR)  smc->stats.rx_frame_errors++;	if (rx_status & (RS_TOOSHORT | RS_TOOLONG))	    smc->stats.rx_length_errors++;	if (rx_status & RS_BADCRC)	smc->stats.rx_crc_errors++;    }    /* Let the MMU free the memory of this packet. */    outw(MC_RELEASE, ioaddr + MMU_CMD);    return;}/*====================================================================*/static struct net_device_stats *smc_get_stats(struct net_device *dev){    struct smc_private *smc = netdev_priv(dev);    /* Nothing to update - the 91c92 is a pretty primative chip. */    return &smc->stats;}/*======================================================================    Calculate values for the hardware multicast filter hash table.======================================================================*/static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,			       u_char *multicast_table){    struct dev_mc_list	*mc_addr;    for (mc_addr = addrs;  mc_addr && count-- > 0;  mc_addr = mc_addr->next) {	u_int position = ether_crc(6, mc_addr->dmi_addr);#ifndef final_version		/* Verify multicast address. */	if ((mc_addr->dmi_addr[0] & 1) == 0)	    continue;#endif	multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);    }}/*======================================================================    Set the receive mode.    This routine is used by both the protocol level to notify us of    promiscuous/multicast mode changes, and by the open/reset code to    initialize the Rx registers.  We always set the multicast list and    leave the receiver running.======================================================================*/static void set_rx_mode(struct net_device *dev){    kio_addr_t ioaddr = dev->base_addr;    struct smc_private *smc = netdev_priv(dev);    u_int multicast_table[ 2 ] = { 0, };    unsigned long flags;    u_short rx_cfg_setting;    if (dev->flags & IFF_PROMISC) {	rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti;    } else if (dev->flags & IFF_ALLMULTI)	rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;    else {	if (dev->mc_count)  {	    fill_multicast_tbl(dev->mc_count, dev->mc_list,			       (u_char *)multicast_table);	}	rx_cfg_setting = RxStripCRC | RxEnable;    }    /* Load MC table and Rx setting into the chip without interrupts. */    spin_lock_irqsave(&smc->lock, flags);    SMC_SELECT_BANK(3);    outl(multicast_table[0], ioaddr + MULTICAST0);    outl(multicast_table[1], ioaddr + MULTICAST4);    SMC_SELECT_BANK(0);    outw(rx_cfg_setting, ioaddr + RCR);    SMC_SELECT_BANK(2);    spin_unlock_irqrestore(&smc->lock, flags);    return;}/*======================================================================    Senses when a card's config changes. Here, it's coax or TP.======================================================================*/static int s9k_config(struct net_device *dev, struct ifmap *map){    struct smc_private *smc = netdev_priv(dev);    if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {	if (smc->cfg & CFG_MII_SELECT)	    return -EOPNOTSUPP;	else if (map->port > 2)	    return -EINVAL;	dev->if_port = map->port;	printk(KERN_INFO "%s: switched to %s port\n",	       dev->name, if_names[dev->if_port]);	smc_reset(dev);    }    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品一区二区三区| 26uuu欧美| 久久亚洲私人国产精品va媚药| 国产精品免费久久久久| 日韩精品1区2区3区| 91蜜桃在线观看| 久久久蜜桃精品| 蜜桃av一区二区三区电影| 色综合久久久久网| 国产精品久久久久久久久久久免费看| 丝袜诱惑制服诱惑色一区在线观看| 成人深夜在线观看| 日韩一卡二卡三卡| 午夜国产精品一区| 色94色欧美sute亚洲线路一ni | 美女看a上一区| 91色在线porny| 亚洲国产高清不卡| 国产曰批免费观看久久久| 日韩写真欧美这视频| 香蕉久久夜色精品国产使用方法 | 午夜精品久久久久久久久| 99免费精品视频| 日本一区二区三区国色天香| 久久精品国产网站| 欧美电视剧免费全集观看| 日韩黄色免费网站| 欧美老人xxxx18| 日韩成人av影视| 欧美一区二区三区人| 三级久久三级久久| 日韩欧美在线影院| 六月丁香综合在线视频| 精品毛片乱码1区2区3区| 看电视剧不卡顿的网站| 日韩欧美综合一区| 国产自产v一区二区三区c| 精品国产欧美一区二区| 国产在线看一区| 欧美国产一区在线| 97久久久精品综合88久久| 日韩理论片在线| 欧美色精品天天在线观看视频| 亚洲国产色一区| 在线播放中文一区| 精品在线亚洲视频| 国产免费成人在线视频| 91在线你懂得| 婷婷中文字幕一区三区| 欧美成人福利视频| 成人黄色小视频| 午夜欧美电影在线观看| 日韩无一区二区| 成人app下载| 亚洲成av人影院| 欧美精品一区二区蜜臀亚洲| 成人午夜视频免费看| 亚洲第一激情av| 久久蜜臀中文字幕| 一本久道中文字幕精品亚洲嫩| 亚洲成人资源在线| 国产亚洲短视频| 欧美视频一区二区在线观看| 蜜臀91精品一区二区三区| 国产亚洲精品久| 欧美日韩国产精选| 国产v综合v亚洲欧| 亚洲成人精品影院| 久久久午夜电影| 欧美日韩专区在线| 粉嫩绯色av一区二区在线观看| 亚洲美女免费视频| 久久亚洲捆绑美女| 欧美日韩精品福利| 懂色av一区二区三区免费看| 亚洲国产精品久久艾草纯爱| 久久久久国色av免费看影院| 欧美日韩小视频| 成人午夜av电影| 久久国产欧美日韩精品| 中文字幕在线不卡| 欧美大尺度电影在线| 色八戒一区二区三区| 丁香一区二区三区| 美女高潮久久久| 亚洲一区二区三区美女| 国产精品不卡一区二区三区| 日韩精品一区二区三区视频播放| 欧美亚州韩日在线看免费版国语版| 国产一区免费电影| 麻豆精品一区二区综合av| 亚洲福利视频三区| 亚洲欧洲av另类| 国产日韩精品一区二区三区在线| 欧美浪妇xxxx高跟鞋交| 欧洲亚洲精品在线| 91色.com| 91色九色蝌蚪| 色综合久久久久久久久久久| 成人免费高清在线观看| 国产九色精品成人porny| 精品一区中文字幕| 免费在线观看成人| 蜜臀久久99精品久久久久宅男| 亚洲第一激情av| 亚洲成人自拍偷拍| 亚洲va在线va天堂| 日日夜夜一区二区| 秋霞午夜av一区二区三区| 亚洲mv在线观看| 亚洲午夜免费电影| 午夜一区二区三区视频| 日韩精品欧美精品| 天天色图综合网| 日本成人在线电影网| 免费视频最近日韩| 激情综合网天天干| 国产综合色产在线精品| 国产精品18久久久久| 国产福利精品导航| 成人精品视频一区二区三区尤物| 99精品热视频| 在线亚洲一区二区| 69成人精品免费视频| 日韩免费高清视频| 国产视频一区在线观看| ...av二区三区久久精品| 亚洲激情五月婷婷| 午夜精品视频一区| 精品亚洲成a人| 东方aⅴ免费观看久久av| 一本色道久久综合狠狠躁的推荐| 欧美亚洲图片小说| 日韩三级在线观看| 日本一区二区三区四区| 亚洲黄色在线视频| 天堂资源在线中文精品| 狠狠v欧美v日韩v亚洲ⅴ| 国产91清纯白嫩初高中在线观看| 99九九99九九九视频精品| 欧美午夜不卡视频| www国产成人免费观看视频 深夜成人网| 国产欧美日韩麻豆91| 亚洲午夜一区二区三区| 国内精品免费**视频| 91麻豆成人久久精品二区三区| 欧美久久久久中文字幕| 久久久久一区二区三区四区| 一区二区三区欧美| 国模冰冰炮一区二区| 日本道色综合久久| 精品国产乱码久久久久久图片 | 这里只有精品免费| 久久久美女毛片| 亚洲v中文字幕| 成人做爰69片免费看网站| 欧美精品色一区二区三区| 国产日本欧美一区二区| 亚洲午夜激情网站| 懂色av一区二区三区免费观看| 欧美人伦禁忌dvd放荡欲情| 国产精品私人自拍| 激情五月婷婷综合网| 在线一区二区三区做爰视频网站| 欧美精品一区二区三区蜜臀| 亚洲国产精品久久人人爱| 成人手机电影网| 欧美精品一区二区三区视频 | 国产精品美女一区二区在线观看| 亚洲国产日韩综合久久精品| 国产成人av电影| 欧美一区二区三区在线视频| 亚洲三级免费观看| 成人精品国产免费网站| 精品国产凹凸成av人导航| 日韩精品91亚洲二区在线观看| 色综合久久88色综合天天6| 国产婷婷色一区二区三区在线| 日本成人在线网站| 欧美日韩国产精品成人| 一区二区三区在线视频免费| 成人一级视频在线观看| 久久一区二区三区四区| 理论片日本一区| 7777精品伊人久久久大香线蕉完整版 | 91色.com| 中文字幕亚洲成人| 成人一区二区三区| 国产女人水真多18毛片18精品视频| 麻豆国产欧美日韩综合精品二区| 在线不卡a资源高清| 日韩中文欧美在线| 欧美剧在线免费观看网站| 亚洲第一主播视频| 在线91免费看| 奇米一区二区三区| 69久久99精品久久久久婷婷| 日本欧美肥老太交大片| 日韩欧美中文字幕公布| 国模套图日韩精品一区二区|