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

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

?? fec.c

?? linux驅動源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* * Fast Ethernet Controller (FEC) driver for Motorola MPC8xx. * Copyright (c) 1997 Dan Malek (dmalek@jlc.net) * * This version of the driver is specific to the FADS implementation, * since the board contains control registers external to the processor * for the control of the LevelOne LXT970 transceiver.  The MPC860T manual * describes connections using the internal parallel port I/O, which * is basically all of Port D. * * Includes support for the following PHYs: QS6612, LXT970, LXT971/2. * * Right now, I am very wasteful with the buffers.  I allocate memory * pages and then divide them into 2K frame buffers.  This way I know I * have buffers large enough to hold one frame within one buffer descriptor. * Once I get this working, I will use 64 or 128 byte CPM buffers, which * will be much more memory efficient and will easily handle lots of * small packets. * * Much better multiple PHY support by Magnus Damm. * Copyright (c) 2000 Ericsson Radio Systems AB. * * Make use of MII for PHY control configurable. * Some fixes. * Copyright (c) 2000, 2001, 2002 Wolfgang Denk, DENX Software Engineering. * * Fixes for tx_full condition and relink when using MII. * Support for AMD AM79C874 added. * Thomas Lange, thomas@corelatus.com * * Added code for Multicast support, Frederic Goddeeris, Paul Geerinckx * Copyright (c) 2002 Siemens Atea */#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/string.h>#include <linux/ptrace.h>#include <linux/errno.h>#include <linux/ioport.h>#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/pci.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <linux/skbuff.h>#include <linux/spinlock.h>#include <linux/mii.h>#include <linux/ethtool.h>#ifdef CONFIG_FEC_PACKETHOOK#include <linux/pkthook.h>#endif#include <asm/8xx_immap.h>#include <asm/pgtable.h>#include <asm/mpc8xx.h>#include <asm/irq.h>#include <asm/bitops.h>#include <asm/uaccess.h>#include "commproc.h"/* multicast support*//* #define DEBUG_MULTICAST *//* CRC polynomium used by the FEC for the multicast group filtering*/#define FEC_CRC_POLY	0x04c11db7#ifdef	CONFIG_USE_MDIO/* Forward declarations of some structures to support different PHYs*/typedef struct {	uint mii_data;	void (*funct)(uint mii_reg, struct net_device *dev, uint data);} phy_cmd_t;typedef struct {	uint id;	char *name;	const phy_cmd_t *config;	const phy_cmd_t *startup;	const phy_cmd_t *ack_int;	const phy_cmd_t *shutdown;} phy_info_t;#endif	/* CONFIG_USE_MDIO *//* The number of Tx and Rx buffers.  These are allocated from the page * pool.  The code may assume these are power of two, so it is best * to keep them that size. * We don't need to allocate pages for the transmitter.  We just use * the skbuffer directly. */#ifdef CONFIG_ENET_BIG_BUFFERS#define FEC_ENET_RX_PAGES	16#define FEC_ENET_RX_FRSIZE	2048#define FEC_ENET_RX_FRPPG	(PAGE_SIZE / FEC_ENET_RX_FRSIZE)#define RX_RING_SIZE		(FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)#define TX_RING_SIZE		16	/* Must be power of two */#define TX_RING_MOD_MASK	15	/*   for this to work */#else#define FEC_ENET_RX_PAGES	4#define FEC_ENET_RX_FRSIZE	2048#define FEC_ENET_RX_FRPPG	(PAGE_SIZE / FEC_ENET_RX_FRSIZE)#define RX_RING_SIZE		(FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)#define TX_RING_SIZE		8	/* Must be power of two */#define TX_RING_MOD_MASK	7	/*   for this to work */#endif/* Interrupt events/masks.*/#define FEC_ENET_HBERR	((uint)0x80000000)	/* Heartbeat error */#define FEC_ENET_BABR	((uint)0x40000000)	/* Babbling receiver */#define FEC_ENET_BABT	((uint)0x20000000)	/* Babbling transmitter */#define FEC_ENET_GRA	((uint)0x10000000)	/* Graceful stop complete */#define FEC_ENET_TXF	((uint)0x08000000)	/* Full frame transmitted */#define FEC_ENET_TXB	((uint)0x04000000)	/* A buffer was transmitted */#define FEC_ENET_RXF	((uint)0x02000000)	/* Full frame received */#define FEC_ENET_RXB	((uint)0x01000000)	/* A buffer was received */#define FEC_ENET_MII	((uint)0x00800000)	/* MII interrupt */#define FEC_ENET_EBERR	((uint)0x00400000)	/* SDMA bus error *//**/#define FEC_ECNTRL_PINMUX	0x00000004#define FEC_ECNTRL_ETHER_EN	0x00000002#define FEC_ECNTRL_RESET	0x00000001#define FEC_RCNTRL_BC_REJ	0x00000010#define FEC_RCNTRL_PROM		0x00000008#define FEC_RCNTRL_MII_MODE	0x00000004#define FEC_RCNTRL_DRT		0x00000002#define FEC_RCNTRL_LOOP		0x00000001#define FEC_TCNTRL_FDEN		0x00000004#define FEC_TCNTRL_HBC		0x00000002#define FEC_TCNTRL_GTS		0x00000001/* Delay to wait for FEC reset command to complete (in us)*/#define FEC_RESET_DELAY		50/* The FEC stores dest/src/type, data, and checksum for receive packets. */#define PKT_MAXBUF_SIZE		1518#define PKT_MINBUF_SIZE		64#define PKT_MAXBLR_SIZE		1520/* The FEC buffer descriptors track the ring buffers.  The rx_bd_base and * tx_bd_base always point to the base of the buffer descriptors.  The * cur_rx and cur_tx point to the currently available buffer. * The dirty_tx tracks the current buffer that is being sent by the * controller.  The cur_tx and dirty_tx are equal under both completely * empty and completely full conditions.  The empty/ready indicator in * the buffer descriptor determines the actual condition. */struct fec_enet_private {	/* The saved address of a sent-in-place packet/buffer, for skfree(). */	struct	sk_buff* tx_skbuff[TX_RING_SIZE];	ushort	skb_cur;	ushort	skb_dirty;	/* CPM dual port RAM relative addresses.	*/	cbd_t	*rx_bd_base;		/* Address of Rx and Tx buffers. */	cbd_t	*tx_bd_base;	cbd_t	*cur_rx, *cur_tx;		/* The next free ring entry */	cbd_t	*dirty_tx;	/* The ring entries to be free()ed. */	scc_t	*sccp;	struct	net_device_stats stats;	uint	tx_full;;	spinlock_t lock;#ifdef	CONFIG_USE_MDIO	uint	phy_id;	uint	phy_id_done;	uint	phy_status;	uint	phy_speed;	phy_info_t	*phy;	struct tq_struct phy_task;	uint	sequence_done;	uint	phy_addr;	struct timer_list phy_timer_list;	u16 old_status;#endif	/* CONFIG_USE_MDIO */	int	link;	int	old_link;	int	full_duplex;#ifdef CONFIG_FEC_PACKETHOOK	unsigned long	ph_lock;	fec_ph_func	*ph_rxhandler;	fec_ph_func	*ph_txhandler;	__u16		ph_proto;	volatile __u32	*ph_regaddr;	void 		*ph_priv;#endif};static int fec_enet_open(struct net_device *dev);static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);#ifdef	CONFIG_USE_MDIOstatic void fec_enet_mii(struct net_device *dev);#endif	/* CONFIG_USE_MDIO */static void fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs);#ifdef CONFIG_FEC_PACKETHOOKstatic void  fec_enet_tx(struct net_device *dev, __u32 regval);static void  fec_enet_rx(struct net_device *dev, __u32 regval);#elsestatic void  fec_enet_tx(struct net_device *dev);static void  fec_enet_rx(struct net_device *dev);#endifstatic int fec_enet_close(struct net_device *dev);static struct net_device_stats *fec_enet_get_stats(struct net_device *dev);static void set_multicast_list(struct net_device *dev);static void fec_restart(struct net_device *dev, int duplex);static void fec_stop(struct net_device *dev);static	ushort	my_enet_addr[3];#ifdef	CONFIG_USE_MDIOstatic int fec_enet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr);static void mdio_callback(uint regval, struct net_device *dev, uint data);static int mdio_read(struct net_device *dev, int phy_id, int location);#if defined(CONFIG_FEC_DP83846A)static void mdio_timer_callback(unsigned long data);#endif /* CONFIG_FEC_DP83846A *//* MII processing.  We keep this as simple as possible.  Requests are * placed on the list (if there is room).  When the request is finished * by the MII, an optional function may be called. */typedef struct mii_list {	uint	mii_regval;	void	(*mii_func)(uint val, struct net_device *dev, uint data);	struct	mii_list *mii_next;	uint	mii_data;} mii_list_t;#define		NMII	20mii_list_t	mii_cmds[NMII];mii_list_t	*mii_free;mii_list_t	*mii_head;mii_list_t	*mii_tail;typedef struct mdio_read_data {	u16 regval;	struct task_struct *sleeping_task;} mdio_read_data_t;static int  mii_queue ( struct net_device *dev, int request,			void (*func)(uint, struct net_device *, uint),			uint data );/* Make MII read/write commands for the FEC.*/#define mk_mii_read(REG)	(0x60020000 | ((REG & 0x1f) << 18))#define mk_mii_write(REG, VAL)	(0x50020000 | ((REG & 0x1f) << 18) | \						(VAL & 0xffff))#define mk_mii_end	0#endif	/* CONFIG_USE_MDIO *//* Transmitter timeout.*/#define TX_TIMEOUT (2*HZ)#ifdef	CONFIG_USE_MDIO/* Register definitions for the PHY.*/#define MII_REG_CR          0  /* Control Register                         */#define MII_REG_SR          1  /* Status Register                          */#define MII_REG_PHYIR1      2  /* PHY Identification Register 1            */#define MII_REG_PHYIR2      3  /* PHY Identification Register 2            */#define MII_REG_ANAR        4  /* A-N Advertisement Register               */#define MII_REG_ANLPAR      5  /* A-N Link Partner Ability Register        */#define MII_REG_ANER        6  /* A-N Expansion Register                   */#define MII_REG_ANNPTR      7  /* A-N Next Page Transmit Register          */#define MII_REG_ANLPRNPR    8  /* A-N Link Partner Received Next Page Reg. *//* values for phy_status */#define PHY_CONF_ANE	0x0001  /* 1 auto-negotiation enabled */#define PHY_CONF_LOOP	0x0002  /* 1 loopback mode enabled */#define PHY_CONF_SPMASK	0x00f0  /* mask for speed */#define PHY_CONF_10HDX	0x0010  /* 10 Mbit half duplex supported */#define PHY_CONF_10FDX	0x0020  /* 10 Mbit full duplex supported */#define PHY_CONF_100HDX	0x0040  /* 100 Mbit half duplex supported */#define PHY_CONF_100FDX	0x0080  /* 100 Mbit full duplex supported */#define PHY_STAT_LINK	0x0100  /* 1 up - 0 down */#define PHY_STAT_FAULT	0x0200  /* 1 remote fault */#define PHY_STAT_ANC	0x0400  /* 1 auto-negotiation complete	*/#define PHY_STAT_SPMASK	0xf000  /* mask for speed */#define PHY_STAT_10HDX	0x1000  /* 10 Mbit half duplex selected	*/#define PHY_STAT_10FDX	0x2000  /* 10 Mbit full duplex selected	*/#define PHY_STAT_100HDX	0x4000  /* 100 Mbit half duplex selected */#define PHY_STAT_100FDX	0x8000  /* 100 Mbit full duplex selected */#endif	/* CONFIG_USE_MDIO */#ifdef CONFIG_FEC_PACKETHOOKintfec_register_ph(struct net_device *dev, fec_ph_func *rxfun, fec_ph_func *txfun,		__u16 proto, volatile __u32 *regaddr, void *priv){	struct fec_enet_private *fep;	int retval = 0;	fep = dev->priv;	if (test_and_set_bit(0, (void*)&fep->ph_lock) != 0) {		/* Someone is messing with the packet hook */		return -EAGAIN;	}	if (fep->ph_rxhandler != NULL || fep->ph_txhandler != NULL) {		retval = -EBUSY;		goto out;	}	fep->ph_rxhandler = rxfun;	fep->ph_txhandler = txfun;	fep->ph_proto = proto;	fep->ph_regaddr = regaddr;	fep->ph_priv = priv;	out:	fep->ph_lock = 0;	return retval;}intfec_unregister_ph(struct net_device *dev){	struct fec_enet_private *fep;	int retval = 0;	fep = dev->priv;	if (test_and_set_bit(0, (void*)&fep->ph_lock) != 0) {		/* Someone is messing with the packet hook */		return -EAGAIN;	}	fep->ph_rxhandler = fep->ph_txhandler = NULL;	fep->ph_proto = 0;	fep->ph_regaddr = NULL;	fep->ph_priv = NULL;	fep->ph_lock = 0;	return retval;}EXPORT_SYMBOL(fec_register_ph);EXPORT_SYMBOL(fec_unregister_ph);#endif /* CONFIG_FEC_PACKETHOOK */static intfec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev){	struct fec_enet_private *fep;	volatile fec_t	*fecp;	volatile cbd_t	*bdp;	fep = dev->priv;	fecp = (volatile fec_t*)dev->base_addr;	if (!fep->link) {		/* Link is down or autonegotiation is in progress. */		return 1;	}	/* Fill in a Tx ring entry */	bdp = fep->cur_tx;	/* Clear all of the status flags.	 */	bdp->cbd_sc &= ~BD_ENET_TX_STATS;	/* Set buffer length and buffer pointer.	*/	bdp->cbd_bufaddr = __pa(skb->data);	bdp->cbd_datlen = skb->len;	/* Save skb pointer.	*/	fep->tx_skbuff[fep->skb_cur] = skb;	fep->stats.tx_bytes += skb->len;	fep->skb_cur = (fep->skb_cur+1) & TX_RING_MOD_MASK;	/* Push the data cache so the CPM does not get stale memory	 * data.	 */	flush_dcache_range((unsigned long)skb->data,			   (unsigned long)skb->data + skb->len);	spin_lock_irq(&fep->lock);	/* Send it on its way.  Tell FEC its ready, interrupt when done,	 * its the last BD of the frame, and to put the CRC on the end.	 */	bdp->cbd_sc |= (BD_ENET_TX_READY | BD_ENET_TX_INTR			| BD_ENET_TX_LAST | BD_ENET_TX_TC);	dev->trans_start = jiffies;	/* Trigger transmission start */	fecp->fec_x_des_active = 0x01000000;	/* If this was the last BD in the ring, start at the beginning again.	*/	if (bdp->cbd_sc & BD_ENET_TX_WRAP) {		bdp = fep->tx_bd_base;	} else {		bdp++;	}	if (bdp->cbd_sc & BD_ENET_TX_READY) {		netif_stop_queue(dev);		fep->tx_full = 1;	}	fep->cur_tx = (cbd_t *)bdp;/* AJZ Mar06 2002 * As of v1.2 of the ICU this problem has gone away. * This is probably the result of improved PCB layout. */#if 0 && defined(CONFIG_ICU862)	/* workaround for hardware problem */	udelay(1000);#endif	spin_unlock_irq(&fep->lock);	return 0;}static voidfec_timeout(struct net_device *dev){	struct fec_enet_private *fep = dev->priv;	if (fep->link || fep->old_link) {		/* Link status changed - print timeout message */		printk("%s: transmit timed out.\n", dev->name);	}	fep->stats.tx_errors++;#ifndef final_version	if (fep->link) {		int	i;		cbd_t	*bdp;		printk ("Ring data dump: "			"cur_tx %p%s dirty_tx %p cur_rx %p\n",		       fep->cur_tx,		       fep->tx_full ? " (full)" : "",		       fep->dirty_tx,		       fep->cur_rx);		bdp = fep->tx_bd_base;		printk(" tx: %u buffers\n",  TX_RING_SIZE);		for (i = 0 ; i < TX_RING_SIZE; i++) {			printk("  %08x: %04x %04x %08x\n",			       (uint) bdp,			       bdp->cbd_sc,			       bdp->cbd_datlen,			       bdp->cbd_bufaddr);			bdp++;		}		bdp = fep->rx_bd_base;		printk(" rx: %lu buffers\n",  RX_RING_SIZE);		for (i = 0 ; i < RX_RING_SIZE; i++) {			printk("  %08x: %04x %04x %08x\n",			       (uint) bdp,			       bdp->cbd_sc,			       bdp->cbd_datlen,			       bdp->cbd_bufaddr);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品毛片乱码1区2区3区| 成人免费的视频| 91精品国产综合久久精品图片| 亚洲国产日韩精品| 欧美日本免费一区二区三区| 日韩经典中文字幕一区| 日韩一区和二区| 国产精品一二一区| 亚洲欧美一区二区在线观看| 色婷婷激情综合| 日本亚洲三级在线| 久久久久国产精品厨房| www.亚洲国产| 丝瓜av网站精品一区二区| 91精品国产综合久久久久久久| 狠狠色狠狠色综合系列| 中文字幕久久午夜不卡| 一本色道久久加勒比精品 | 国产乱码字幕精品高清av| 国产欧美一区二区精品性色超碰| 99久久er热在这里只有精品15 | 日韩精品亚洲专区| 久久一留热品黄| 99久久99久久综合| 天天色综合成人网| 欧美国产国产综合| 欧美精选在线播放| 国产不卡在线一区| 五月天网站亚洲| 国产精品婷婷午夜在线观看| 欧美中文字幕不卡| 国产一区二区主播在线| 亚洲精选视频免费看| 精品sm捆绑视频| 日本韩国欧美国产| 国产专区欧美精品| 亚洲成人综合网站| 国产精品视频第一区| 7878成人国产在线观看| 不卡大黄网站免费看| 日本中文在线一区| 亚洲另类在线制服丝袜| 久久久久久久久久久久电影| 欧美日韩免费电影| 国产高清一区日本| 日韩福利电影在线观看| 一区二区三区四区乱视频| 国产亚洲一本大道中文在线| 91精品欧美福利在线观看| 99久久国产综合精品女不卡| 国产精品综合二区| 日韩精品亚洲专区| 亚洲一区二区三区在线看| 中文字幕国产一区| 久久蜜臀精品av| 欧美一区二区不卡视频| 在线一区二区观看| 成人av网站在线观看免费| 久久99国产乱子伦精品免费| 午夜精品久久久久久久久久| 亚洲靠逼com| 国产精品乱码人人做人人爱 | 这里是久久伊人| 色狠狠色狠狠综合| 91日韩在线专区| 成人动漫av在线| 国产精品538一区二区在线| 麻豆精品一区二区| 免费高清不卡av| 日韩主播视频在线| 亚洲成人免费看| 亚洲成人一二三| 亚洲福利视频一区| 亚洲午夜久久久久久久久电影网 | 亚洲欧美在线视频观看| 中文无字幕一区二区三区| 久久综合久久综合久久综合| 欧美不卡一区二区| 日韩欧美中文字幕精品| 精品免费一区二区三区| 精品成人在线观看| 久久久欧美精品sm网站| 国产亚洲精品福利| 国产日韩综合av| 国产精品麻豆视频| 亚洲精品欧美激情| 一区二区三区免费观看| 亚洲国产综合91精品麻豆| 亚洲123区在线观看| 婷婷成人综合网| 久久疯狂做爰流白浆xx| 国产一本一道久久香蕉| 成人免费视频视频| 波多野洁衣一区| 在线视频一区二区三| 欧洲激情一区二区| 欧美一区二区视频观看视频| 久久久美女艺术照精彩视频福利播放| 久久久美女毛片| 1024亚洲合集| 日韩精品一二区| 激情综合一区二区三区| 成人午夜伦理影院| 欧美中文字幕一区二区三区| 日韩欧美成人激情| 日本一区二区三区高清不卡| 一区二区国产盗摄色噜噜| 日韩在线一区二区| 成人自拍视频在线| 精品视频一区 二区 三区| 日韩午夜三级在线| 国产精品国产三级国产| 亚洲妇熟xx妇色黄| 国产黑丝在线一区二区三区| 91搞黄在线观看| 精品国产区一区| 洋洋av久久久久久久一区| 免费高清在线一区| 91视频91自| 久久久青草青青国产亚洲免观| 一区二区三区中文在线| 国产又黄又大久久| 欧美日韩另类一区| 中文字幕精品一区二区精品绿巨人| 亚洲国产一区二区在线播放| 国产成+人+日韩+欧美+亚洲| 制服丝袜亚洲色图| 国产精品乱码人人做人人爱| 蜜桃在线一区二区三区| 91麻豆精东视频| 久久九九影视网| 青青草97国产精品免费观看| 91看片淫黄大片一级在线观看| 精品国产人成亚洲区| 婷婷中文字幕综合| 在线看国产日韩| 国产精品国产三级国产有无不卡| 久久国产精品99久久人人澡| 欧美制服丝袜第一页| 国产精品久久久久久久裸模| 国产一区二区三区| 欧美裸体一区二区三区| 专区另类欧美日韩| 国产很黄免费观看久久| 欧美mv和日韩mv国产网站| 亚洲福利视频导航| 91久久免费观看| 亚洲丝袜美腿综合| 成人永久aaa| 中文字幕av一区二区三区高 | 亚洲永久免费av| 不卡视频一二三四| 亚洲国产精品99久久久久久久久| 精品亚洲porn| 欧美一区中文字幕| 天天综合网天天综合色| 欧美日韩国产一级二级| 亚洲综合成人在线视频| 色激情天天射综合网| 亚洲天堂中文字幕| 92精品国产成人观看免费| 国产精品视频一区二区三区不卡| 国产成人精品免费网站| 久久久99久久| 成人av在线影院| 亚洲欧洲精品一区二区精品久久久| 国产成人亚洲精品狼色在线| 久久久久久黄色| 国产精品主播直播| 亚洲一区在线观看网站| 亚洲国产成人tv| 欧美精品v日韩精品v韩国精品v| 一区二区三区欧美日| 色8久久精品久久久久久蜜| 亚洲自拍另类综合| 欧美视频一区在线观看| 亚洲一区二区在线免费观看视频| 欧美四级电影网| 香蕉久久夜色精品国产使用方法| 欧美色精品天天在线观看视频| 亚洲第一成年网| 日韩一区二区免费电影| 激情伊人五月天久久综合| 日本一区二区三级电影在线观看| 成人激情午夜影院| 亚洲图片欧美激情| 欧美日韩国产综合一区二区| 奇米色一区二区| 久久精品欧美一区二区三区不卡| www.日韩大片| 亚洲444eee在线观看| 日韩欧美一区二区在线视频| 国产经典欧美精品| 国产精品高潮呻吟久久| 91国偷自产一区二区使用方法| 日日夜夜精品视频天天综合网| 精品成人免费观看| 99re6这里只有精品视频在线观看| 亚洲一区二区三区四区中文字幕| 欧美一区二区三区爱爱|