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

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

?? rtl8150.c

?? linux2.6.11.1 USB有線網卡rtl8150移植到arm平臺源碼及詳細說明和步驟。試驗過可以上網 !
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  Copyright (c) 2002 Petko Manolov (petkan@users.sourceforge.net) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. */#include <linux/config.h>#include <linux/sched.h>#include <linux/init.h>#include <linux/signal.h>#include <linux/slab.h>#include <linux/module.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <linux/mii.h>#include <linux/ethtool.h>#include <linux/usb.h>#include <asm/uaccess.h>/* Version Information */#define DRIVER_VERSION "v0.6.2 (2004/08/27)"#define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>"#define DRIVER_DESC "rtl8150 based usb-ethernet driver"#define	IDR			0x0120#define	MAR			0x0126#define	CR			0x012e#define	TCR			0x012f#define	RCR			0x0130#define	TSR			0x0132#define	RSR			0x0133#define	CON0			0x0135#define	CON1			0x0136#define	MSR			0x0137#define	PHYADD			0x0138#define	PHYDAT			0x0139#define	PHYCNT			0x013b#define	GPPC			0x013d#define	BMCR			0x0140#define	BMSR			0x0142#define	ANAR			0x0144#define	ANLP			0x0146#define	AER			0x0148#define CSCR			0x014C  /* This one has the link status */#define CSCR_LINK_STATUS	(1 << 3)#define	IDR_EEPROM		0x1202#define	PHY_READ		0#define	PHY_WRITE		0x20#define	PHY_GO			0x40#define	MII_TIMEOUT		10#define	INTBUFSIZE		8#define	RTL8150_REQT_READ	0xc0#define	RTL8150_REQT_WRITE	0x40#define	RTL8150_REQ_GET_REGS	0x05#define	RTL8150_REQ_SET_REGS	0x05/* Transmit status register errors */#define TSR_ECOL		(1<<5)#define TSR_LCOL		(1<<4)#define TSR_LOSS_CRS		(1<<3)#define TSR_JBR			(1<<2)#define TSR_ERRORS		(TSR_ECOL | TSR_LCOL | TSR_LOSS_CRS | TSR_JBR)/* Receive status register errors */#define RSR_CRC			(1<<2)#define RSR_FAE			(1<<1)#define RSR_ERRORS		(RSR_CRC | RSR_FAE)/* Media status register definitions */#define MSR_DUPLEX		(1<<4)#define MSR_SPEED		(1<<3)#define MSR_LINK		(1<<2)/* Interrupt pipe data */#define INT_TSR			0x00#define INT_RSR			0x01#define INT_MSR			0x02#define INT_WAKSR		0x03#define INT_TXOK_CNT		0x04#define INT_RXLOST_CNT		0x05#define INT_CRERR_CNT		0x06#define INT_COL_CNT		0x07/* Transmit status register errors */#define TSR_ECOL		(1<<5)#define TSR_LCOL		(1<<4)#define TSR_LOSS_CRS		(1<<3)#define TSR_JBR			(1<<2)#define TSR_ERRORS		(TSR_ECOL | TSR_LCOL | TSR_LOSS_CRS | TSR_JBR)/* Receive status register errors */#define RSR_CRC			(1<<2)#define RSR_FAE			(1<<1)#define RSR_ERRORS		(RSR_CRC | RSR_FAE)/* Media status register definitions */#define MSR_DUPLEX		(1<<4)#define MSR_SPEED		(1<<3)#define MSR_LINK		(1<<2)/* Interrupt pipe data */#define INT_TSR			0x00#define INT_RSR			0x01#define INT_MSR			0x02#define INT_WAKSR		0x03#define INT_TXOK_CNT		0x04#define INT_RXLOST_CNT		0x05#define INT_CRERR_CNT		0x06#define INT_COL_CNT		0x07#define	RTL8150_MTU		1540#define	RTL8150_TX_TIMEOUT	(HZ)#define	RX_SKB_POOL_SIZE	4/* rtl8150 flags */#define	RTL8150_HW_CRC		0#define	RX_REG_SET		1#define	RTL8150_UNPLUG		2#define	RX_URB_FAIL		3/* Define these values to match your device */#define VENDOR_ID_REALTEK		0x0bda#define	VENDOR_ID_MELCO			0x0411#define VENDOR_ID_MICRONET		0x3980#define	VENDOR_ID_LONGSHINE		0x07b8#define	VENDOR_ID_ZYXEL			0x0586#define PRODUCT_ID_RTL8150		0x8150#define	PRODUCT_ID_LUAKTX		0x0012#define	PRODUCT_ID_LCS8138TX		0x401a#define PRODUCT_ID_SP128AR		0x0003#define	PRODUCT_ID_PRESTIGE		0x401a#undef	EEPROM_WRITE/* table of devices that work with this driver */static struct usb_device_id rtl8150_table[] = {	{USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150)},	{USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)},	{USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)},	{USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)},	{USB_DEVICE(VENDOR_ID_ZYXEL, PRODUCT_ID_PRESTIGE)},	{}};MODULE_DEVICE_TABLE(usb, rtl8150_table);struct rtl8150 {	unsigned long flags;	struct usb_device *udev;	struct tasklet_struct tl;	struct net_device_stats stats;	struct net_device *netdev;	struct urb *rx_urb, *tx_urb, *intr_urb, *ctrl_urb;	struct sk_buff *tx_skb, *rx_skb;	struct sk_buff *rx_skb_pool[RX_SKB_POOL_SIZE];	spinlock_t rx_pool_lock;	struct usb_ctrlrequest dr;	int intr_interval;	__le16 rx_creg;	u8 *intr_buff;	u8 phy;};typedef struct rtl8150 rtl8150_t;static void fill_skb_pool(rtl8150_t *);static void free_skb_pool(rtl8150_t *);static inline struct sk_buff *pull_skb(rtl8150_t *);static void rtl8150_disconnect(struct usb_interface *intf);static int rtl8150_probe(struct usb_interface *intf,			   const struct usb_device_id *id);static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message);static int rtl8150_resume(struct usb_interface *intf);static const char driver_name [] = "rtl8150";static struct usb_driver rtl8150_driver = {	.name =		driver_name,	.probe =	rtl8150_probe,	.disconnect =	rtl8150_disconnect,	.id_table =	rtl8150_table,	.suspend =	rtl8150_suspend,	.resume =	rtl8150_resume};/*****	device related part of the code***/static int get_registers(rtl8150_t * dev, u16 indx, u16 size, void *data){	return usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),			       RTL8150_REQ_GET_REGS, RTL8150_REQT_READ,			       indx, 0, data, size, 500);}static int set_registers(rtl8150_t * dev, u16 indx, u16 size, void *data){	return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),			       RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE,			       indx, 0, data, size, 500);}static void ctrl_callback(struct urb *urb, struct pt_regs *regs){	rtl8150_t *dev;	switch (urb->status) {	case 0:		break;	case -EINPROGRESS:		break;	case -ENOENT:		break;	default:		warn("ctrl urb status %d", urb->status);	}	dev = urb->context;	clear_bit(RX_REG_SET, &dev->flags);}static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size){	int ret;	if (test_bit(RX_REG_SET, &dev->flags))		return -EAGAIN;	dev->dr.bRequestType = RTL8150_REQT_WRITE;	dev->dr.bRequest = RTL8150_REQ_SET_REGS;	dev->dr.wValue = cpu_to_le16(indx);	dev->dr.wIndex = 0;	dev->dr.wLength = cpu_to_le16(size);	dev->ctrl_urb->transfer_buffer_length = size;	usb_fill_control_urb(dev->ctrl_urb, dev->udev,			 usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr,			 &dev->rx_creg, size, ctrl_callback, dev);	if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) {		if (ret == -ENODEV)			netif_device_detach(dev->netdev);		err("control request submission failed: %d", ret);	} else		set_bit(RX_REG_SET, &dev->flags);	return ret;}static int read_mii_word(rtl8150_t * dev, u8 phy, __u8 indx, u16 * reg){	int i;	u8 data[3], tmp;	data[0] = phy;	data[1] = data[2] = 0;	tmp = indx | PHY_READ | PHY_GO;	i = 0;	set_registers(dev, PHYADD, sizeof(data), data);	set_registers(dev, PHYCNT, 1, &tmp);	do {		get_registers(dev, PHYCNT, 1, data);	} while ((data[0] & PHY_GO) && (i++ < MII_TIMEOUT));	if (i < MII_TIMEOUT) {		get_registers(dev, PHYDAT, 2, data);		*reg = data[0] | (data[1] << 8);		return 0;	} else		return 1;}static int write_mii_word(rtl8150_t * dev, u8 phy, __u8 indx, u16 reg){	int i;	u8 data[3], tmp;	data[0] = phy;	*(data + 1) = cpu_to_le16p(&reg);	tmp = indx | PHY_WRITE | PHY_GO;	i = 0;	set_registers(dev, PHYADD, sizeof(data), data);	set_registers(dev, PHYCNT, 1, &tmp);	do {		get_registers(dev, PHYCNT, 1, data);	} while ((data[0] & PHY_GO) && (i++ < MII_TIMEOUT));	if (i < MII_TIMEOUT)		return 0;	else		return 1;}static inline void set_ethernet_addr(rtl8150_t * dev){	u8 node_id[6];	get_registers(dev, IDR, sizeof(node_id), node_id);	memcpy(dev->netdev->dev_addr, node_id, sizeof(node_id));}static int rtl8150_set_mac_address(struct net_device *netdev, void *p){	struct sockaddr *addr = p;	rtl8150_t *dev = netdev_priv(netdev);	int i;	if (netif_running(netdev))		return -EBUSY;	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);	dbg("%s: Setting MAC address to ", netdev->name);	for (i = 0; i < 5; i++)		dbg("%02X:", netdev->dev_addr[i]);	dbg("%02X\n", netdev->dev_addr[i]);	/* Set the IDR registers. */	set_registers(dev, IDR, sizeof(netdev->dev_addr), netdev->dev_addr);#ifdef EEPROM_WRITE	{	u8 cr;	/* Get the CR contents. */	get_registers(dev, CR, 1, &cr);	/* Set the WEPROM bit (eeprom write enable). */	cr |= 0x20;	set_registers(dev, CR, 1, &cr);	/* Write the MAC address into eeprom. Eeprom writes must be word-sized,	   so we need to split them up. */	for (i = 0; i * 2 < netdev->addr_len; i++) {		set_registers(dev, IDR_EEPROM + (i * 2), 2, 		netdev->dev_addr + (i * 2));	}	/* Clear the WEPROM bit (preventing accidental eeprom writes). */	cr &= 0xdf;	set_registers(dev, CR, 1, &cr);	}#endif	return 0;}static int rtl8150_reset(rtl8150_t * dev){	u8 data = 0x10;	int i = HZ;	set_registers(dev, CR, 1, &data);	do {		get_registers(dev, CR, 1, &data);	} while ((data & 0x10) && --i);	return (i > 0) ? 1 : 0;}static int alloc_all_urbs(rtl8150_t * dev){	dev->rx_urb = usb_alloc_urb(0, GFP_KERNEL);	if (!dev->rx_urb)		return 0;	dev->tx_urb = usb_alloc_urb(0, GFP_KERNEL);	if (!dev->tx_urb) {		usb_free_urb(dev->rx_urb);		return 0;	}	dev->intr_urb = usb_alloc_urb(0, GFP_KERNEL);	if (!dev->intr_urb) {		usb_free_urb(dev->rx_urb);		usb_free_urb(dev->tx_urb);		return 0;	}	dev->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);	if (!dev->intr_urb) {		usb_free_urb(dev->rx_urb);		usb_free_urb(dev->tx_urb);		usb_free_urb(dev->intr_urb);		return 0;	}	return 1;}static void free_all_urbs(rtl8150_t * dev){	usb_free_urb(dev->rx_urb);	usb_free_urb(dev->tx_urb);	usb_free_urb(dev->intr_urb);	usb_free_urb(dev->ctrl_urb);}static void unlink_all_urbs(rtl8150_t * dev){	usb_kill_urb(dev->rx_urb);	usb_kill_urb(dev->tx_urb);	usb_kill_urb(dev->intr_urb);	usb_kill_urb(dev->ctrl_urb);}static inline struct sk_buff *pull_skb(rtl8150_t *dev){	struct sk_buff *skb;	int i;	for (i = 0; i < RX_SKB_POOL_SIZE; i++) {		if (dev->rx_skb_pool[i]) {			skb = dev->rx_skb_pool[i];			dev->rx_skb_pool[i] = NULL;			return skb;		}	}	return NULL;}static void read_bulk_callback(struct urb *urb, struct pt_regs *regs){	rtl8150_t *dev;	unsigned pkt_len, res;	struct sk_buff *skb;	struct net_device *netdev;	u16 rx_stat;	int status;	dev = urb->context;	if (!dev)		return;	if (test_bit(RTL8150_UNPLUG, &dev->flags))		return;	netdev = dev->netdev;	if (!netif_device_present(netdev))		return;	switch (urb->status) {	case 0:		break;	case -ENOENT:		return;	/* the urb is in unlink state */	case -ETIMEDOUT:		warn("may be reset is needed?..");		goto goon;	default:		warn("Rx status %d", urb->status);		goto goon;	}	if (!dev->rx_skb)		goto resched;	/* protect against short packets (tell me why we got some?!?) */	if (urb->actual_length < 4)		goto goon;	res = urb->actual_length;	rx_stat = le16_to_cpu(*(__le16 *)(urb->transfer_buffer + res - 4));	pkt_len = res - 4;	skb_put(dev->rx_skb, pkt_len);	dev->rx_skb->protocol = eth_type_trans(dev->rx_skb, netdev);	netif_rx(dev->rx_skb);	dev->stats.rx_packets++;	dev->stats.rx_bytes += pkt_len;	spin_lock(&dev->rx_pool_lock);	skb = pull_skb(dev);	spin_unlock(&dev->rx_pool_lock);	if (!skb)		goto resched;	dev->rx_skb = skb;goon:	usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),		      dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);	status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC);	if (status == -ENODEV)		netif_device_detach(dev->netdev);	else if (status) {		set_bit(RX_URB_FAIL, &dev->flags);		goto resched;	} else {		clear_bit(RX_URB_FAIL, &dev->flags);	}	return;resched:	tasklet_schedule(&dev->tl);}static void rx_fixup(unsigned long data){	rtl8150_t *dev;	struct sk_buff *skb;	int status;	dev = (rtl8150_t *)data;	spin_lock_irq(&dev->rx_pool_lock);	fill_skb_pool(dev);	spin_unlock_irq(&dev->rx_pool_lock);	if (test_bit(RX_URB_FAIL, &dev->flags))		if (dev->rx_skb)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩avvvv在线播放| 国产不卡一区视频| 极品少妇一区二区三区精品视频 | 国产黄人亚洲片| 色乱码一区二区三区88| 久久免费偷拍视频| 午夜伦欧美伦电影理论片| 国产999精品久久久久久绿帽| 欧美日韩精品福利| 亚洲图片激情小说| 国产99久久久国产精品免费看| 欧美精品tushy高清| 一区二区三区美女| 91在线视频免费观看| 久久精品视频在线看| 喷白浆一区二区| 欧美理论片在线| 亚洲制服丝袜一区| 色哟哟一区二区| 亚洲欧洲日韩av| 不卡的av中国片| 久久你懂得1024| 精品亚洲国内自在自线福利| 91麻豆精品国产91| 亚洲成av人影院| 欧美三区在线视频| 亚洲一区二区三区影院| 91免费国产在线| 伊人性伊人情综合网| 91看片淫黄大片一级在线观看| 午夜久久久久久电影| av欧美精品.com| 国产精品免费看片| 成人av影视在线观看| 国产精品妹子av| 99精品久久久久久| 亚洲同性gay激情无套| 91麻豆精东视频| 亚洲综合久久久| 欧美日韩免费高清一区色橹橹 | 久久综合色综合88| 久久99久久久久久久久久久| 日韩欧美成人一区二区| 久久99国产精品麻豆| 国产亚洲精品超碰| www.一区二区| 亚洲一区在线观看视频| 欧美美女直播网站| 热久久一区二区| 欧美mv日韩mv国产网站| 国产激情偷乱视频一区二区三区| 国产欧美日韩另类视频免费观看| 不卡免费追剧大全电视剧网站| 亚洲欧洲日韩av| 欧美老女人在线| 国产一区二区看久久| 国产精品久久久久久久久快鸭| 91原创在线视频| 日精品一区二区| 国产区在线观看成人精品| 99国产精品久久久久久久久久久| 亚洲午夜精品17c| 日韩精品中文字幕一区二区三区| 国产精品一区二区三区四区| 亚洲乱码中文字幕| 日韩欧美国产麻豆| 97精品久久久久中文字幕| 亚洲成av人影院| 国产视频一区二区在线| 日本韩国一区二区三区| 激情五月播播久久久精品| 国产精品乱码久久久久久| 欧美日韩精品一区二区三区蜜桃| 国产精一品亚洲二区在线视频| 亚洲欧美综合色| 欧美成人一区二区三区片免费| 成人91在线观看| 免费亚洲电影在线| 亚洲欧美日韩在线播放| 精品精品国产高清a毛片牛牛 | 亚洲嫩草精品久久| 欧美va在线播放| 欧美亚洲一区二区三区四区| 极品少妇xxxx精品少妇| 亚洲一区在线播放| 亚洲国产精华液网站w| 欧美一级电影网站| 色噜噜狠狠色综合中国| 国产成人av一区二区三区在线| 亚洲无线码一区二区三区| 国产精品美女久久久久久久久| 日韩亚洲欧美一区二区三区| www.亚洲激情.com| 国产精品资源网站| 美女www一区二区| 亚洲成人一区在线| 亚洲人成小说网站色在线| 久久久99精品久久| 欧美电影免费观看高清完整版在线观看 | 亚洲婷婷综合色高清在线| 精品国产91乱码一区二区三区| 欧美日韩亚洲综合在线| 色综合久久久久网| av在线播放成人| 成人高清视频在线观看| 国产露脸91国语对白| 久久疯狂做爰流白浆xx| 蜜桃久久精品一区二区| 日本vs亚洲vs韩国一区三区| 午夜日韩在线电影| 日韩国产欧美在线观看| 日韩综合一区二区| 国产精品伊人色| 国产精品911| 国产91精品入口| 成人免费观看男女羞羞视频| 国产91精品一区二区麻豆亚洲| 国产美女主播视频一区| 国产精品白丝jk黑袜喷水| 国产一区二区按摩在线观看| 国产精品亚洲人在线观看| 国产成人亚洲综合色影视| 国产69精品久久久久777| 成人性生交大片免费看在线播放| 成人国产精品免费| 91在线观看高清| 91搞黄在线观看| 欧美群妇大交群的观看方式| 欧美日韩一二区| 日韩免费一区二区| 国产欧美精品区一区二区三区 | 亚洲色图欧洲色图| 一区二区三区日本| 日本特黄久久久高潮| 精品亚洲porn| 暴力调教一区二区三区| 在线观看一区二区视频| 欧美一区在线视频| 亚洲成在线观看| 欧美裸体一区二区三区| 在线一区二区三区四区五区| 色视频成人在线观看免| 欧美精品久久天天躁| 精品国产乱码久久久久久影片| 欧美韩日一区二区三区四区| 亚洲日本在线视频观看| 免费视频一区二区| av亚洲精华国产精华| 69p69国产精品| 国产欧美精品国产国产专区| 一区二区三区在线视频观看| 美国毛片一区二区| 北岛玲一区二区三区四区| 欧美日韩国产大片| 国产网站一区二区| 午夜欧美大尺度福利影院在线看 | 天天综合网 天天综合色| 国产精品中文字幕日韩精品| 一本色道久久加勒比精品 | 亚洲一区二区三区四区五区黄| 日韩高清一级片| 99精品视频在线播放观看| 欧美一级专区免费大片| 中文字幕在线不卡视频| 欧美aaa在线| 91久久精品一区二区| xfplay精品久久| 亚洲第一久久影院| 99精品在线观看视频| 精品日韩在线一区| 午夜免费久久看| 91视视频在线观看入口直接观看www| 日韩视频一区二区三区| 亚洲综合久久av| www.一区二区| 久久久国产一区二区三区四区小说| 亚洲国产成人av网| 91啪在线观看| 中文字幕不卡在线观看| 久久精品72免费观看| 欧美日韩视频在线一区二区| 国产精品剧情在线亚洲| 国产精品白丝jk黑袜喷水| 日韩视频一区二区| 日本中文在线一区| 欧美日韩国产一区二区三区地区| 国产精品超碰97尤物18| 国产91精品露脸国语对白| 久久蜜桃av一区精品变态类天堂| 日韩av电影免费观看高清完整版在线观看| 91麻豆国产福利精品| 亚洲欧洲成人自拍| 国产suv精品一区二区6| 久久麻豆一区二区| 欧美精品黑人性xxxx| 一区二区三区日韩欧美精品| 91在线播放网址| 亚洲久本草在线中文字幕| 91在线精品秘密一区二区| 中文字幕在线不卡国产视频|