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

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

?? lcs.c

?? LINUX 2.6.17.4的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
			break;		default:			PRINT_INFO("UNRECOGNIZED LGW COMMAND\n");			break;		}	} else		lcs_notify_lancmd_waiters(card, cmd);}/** * Unpack network packet. */static voidlcs_get_skb(struct lcs_card *card, char *skb_data, unsigned int skb_len){	struct sk_buff *skb;	LCS_DBF_TEXT(5, trace, "getskb");	if (card->dev == NULL ||	    card->state != DEV_STATE_UP)		/* The card isn't up. Ignore the packet. */		return;	skb = dev_alloc_skb(skb_len);	if (skb == NULL) {		PRINT_ERR("LCS: alloc_skb failed for device=%s\n",			  card->dev->name);		card->stats.rx_dropped++;		return;	}	skb->dev = card->dev;	memcpy(skb_put(skb, skb_len), skb_data, skb_len);	skb->protocol =	card->lan_type_trans(skb, card->dev);	card->stats.rx_bytes += skb_len;	card->stats.rx_packets++;	*((__u32 *)skb->cb) = ++card->pkt_seq;	netif_rx(skb);}/** * LCS main routine to get packets and lancmd replies from the buffers */static voidlcs_get_frames_cb(struct lcs_channel *channel, struct lcs_buffer *buffer){	struct lcs_card *card;	struct lcs_header *lcs_hdr;	__u16 offset;	LCS_DBF_TEXT(5, trace, "lcsgtpkt");	lcs_hdr = (struct lcs_header *) buffer->data;	if (lcs_hdr->offset == LCS_ILLEGAL_OFFSET) {		LCS_DBF_TEXT(4, trace, "-eiogpkt");		return;	}	card = (struct lcs_card *)		((char *) channel - offsetof(struct lcs_card, read));	offset = 0;	while (lcs_hdr->offset != 0) {		if (lcs_hdr->offset <= 0 ||		    lcs_hdr->offset > LCS_IOBUFFERSIZE ||		    lcs_hdr->offset < offset) {			/* Offset invalid. */			card->stats.rx_length_errors++;			card->stats.rx_errors++;			return;		}		/* What kind of frame is it? */		if (lcs_hdr->type == LCS_FRAME_TYPE_CONTROL)			/* Control frame. */			lcs_get_control(card, (struct lcs_cmd *) lcs_hdr);		else if (lcs_hdr->type == LCS_FRAME_TYPE_ENET ||			 lcs_hdr->type == LCS_FRAME_TYPE_TR ||			 lcs_hdr->type == LCS_FRAME_TYPE_FDDI)			/* Normal network packet. */			lcs_get_skb(card, (char *)(lcs_hdr + 1),				    lcs_hdr->offset - offset -				    sizeof(struct lcs_header));		else			/* Unknown frame type. */			; // FIXME: error message ?		/* Proceed to next frame. */		offset = lcs_hdr->offset;		lcs_hdr->offset = LCS_ILLEGAL_OFFSET;		lcs_hdr = (struct lcs_header *) (buffer->data + offset);	}	/* The buffer is now empty. Make it ready again. */	lcs_ready_buffer(&card->read, buffer);}/** * get network statistics for ifconfig and other user programs */static struct net_device_stats *lcs_getstats(struct net_device *dev){	struct lcs_card *card;	LCS_DBF_TEXT(4, trace, "netstats");	card = (struct lcs_card *) dev->priv;	return &card->stats;}/** * stop lcs device * This function will be called by user doing ifconfig xxx down */static intlcs_stop_device(struct net_device *dev){	struct lcs_card *card;	int rc;	LCS_DBF_TEXT(2, trace, "stopdev");	card   = (struct lcs_card *) dev->priv;	netif_carrier_off(dev);	netif_tx_disable(dev);	dev->flags &= ~IFF_UP;	wait_event(card->write.wait_q,		(card->write.state != CH_STATE_RUNNING));	rc = lcs_stopcard(card);	if (rc)		PRINT_ERR("Try it again!\n ");	return rc;}/** * start lcs device and make it runnable * This function will be called by user doing ifconfig xxx up */static intlcs_open_device(struct net_device *dev){	struct lcs_card *card;	int rc;	LCS_DBF_TEXT(2, trace, "opendev");	card = (struct lcs_card *) dev->priv;	/* initialize statistics */	rc = lcs_detect(card);	if (rc) {		PRINT_ERR("LCS:Error in opening device!\n");	} else {		dev->flags |= IFF_UP;		netif_carrier_on(dev);		netif_wake_queue(dev);		card->state = DEV_STATE_UP;	}	return rc;}/** * show function for portno called by cat or similar things */static ssize_tlcs_portno_show (struct device *dev, struct device_attribute *attr, char *buf){        struct lcs_card *card;	card = (struct lcs_card *)dev->driver_data;        if (!card)                return 0;        return sprintf(buf, "%d\n", card->portno);}/** * store the value which is piped to file portno */static ssize_tlcs_portno_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count){        struct lcs_card *card;        int value;	card = (struct lcs_card *)dev->driver_data;        if (!card)                return 0;        sscanf(buf, "%u", &value);        /* TODO: sanity checks */        card->portno = value;        return count;}static DEVICE_ATTR(portno, 0644, lcs_portno_show, lcs_portno_store);static ssize_tlcs_type_show(struct device *dev, struct device_attribute *attr, char *buf){	struct ccwgroup_device *cgdev;	cgdev = to_ccwgroupdev(dev);	if (!cgdev)		return -ENODEV;	return sprintf(buf, "%s\n", cu3088_type[cgdev->cdev[0]->id.driver_info]);}static DEVICE_ATTR(type, 0444, lcs_type_show, NULL);static ssize_tlcs_timeout_show(struct device *dev, struct device_attribute *attr, char *buf){	struct lcs_card *card;	card = (struct lcs_card *)dev->driver_data;	return card ? sprintf(buf, "%u\n", card->lancmd_timeout) : 0;}static ssize_tlcs_timeout_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count){        struct lcs_card *card;        int value;	card = (struct lcs_card *)dev->driver_data;        if (!card)                return 0;        sscanf(buf, "%u", &value);        /* TODO: sanity checks */        card->lancmd_timeout = value;        return count;}DEVICE_ATTR(lancmd_timeout, 0644, lcs_timeout_show, lcs_timeout_store);static ssize_tlcs_dev_recover_store(struct device *dev, struct device_attribute *attr,		      const char *buf, size_t count){	struct lcs_card *card = dev->driver_data;	char *tmp;	int i;	if (!card)		return -EINVAL;	if (card->state != DEV_STATE_UP)		return -EPERM;	i = simple_strtoul(buf, &tmp, 16);	if (i == 1)		lcs_schedule_recovery(card);	return count;}static DEVICE_ATTR(recover, 0200, NULL, lcs_dev_recover_store);static struct attribute * lcs_attrs[] = {	&dev_attr_portno.attr,	&dev_attr_type.attr,	&dev_attr_lancmd_timeout.attr,	&dev_attr_recover.attr,	NULL,};static struct attribute_group lcs_attr_group = {	.attrs = lcs_attrs,};/** * lcs_probe_device is called on establishing a new ccwgroup_device. */static intlcs_probe_device(struct ccwgroup_device *ccwgdev){	struct lcs_card *card;	int ret;	if (!get_device(&ccwgdev->dev))		return -ENODEV;	LCS_DBF_TEXT(2, setup, "add_dev");        card = lcs_alloc_card();        if (!card) {                PRINT_ERR("Allocation of lcs card failed\n");		put_device(&ccwgdev->dev);                return -ENOMEM;        }	ret = sysfs_create_group(&ccwgdev->dev.kobj, &lcs_attr_group);	if (ret) {                PRINT_ERR("Creating attributes failed");		lcs_free_card(card);		put_device(&ccwgdev->dev);		return ret;        }	ccwgdev->dev.driver_data = card;	ccwgdev->cdev[0]->handler = lcs_irq;	ccwgdev->cdev[1]->handler = lcs_irq;	card->gdev = ccwgdev;	INIT_WORK(&card->kernel_thread_starter,		  (void *) lcs_start_kernel_thread, card);	card->thread_start_mask = 0;	card->thread_allowed_mask = 0;	card->thread_running_mask = 0;        return 0;}static intlcs_register_netdev(struct ccwgroup_device *ccwgdev){	struct lcs_card *card;	LCS_DBF_TEXT(2, setup, "regnetdv");	card = (struct lcs_card *)ccwgdev->dev.driver_data;	if (card->dev->reg_state != NETREG_UNINITIALIZED)		return 0;	SET_NETDEV_DEV(card->dev, &ccwgdev->dev);	return register_netdev(card->dev);}/** * lcs_new_device will be called by setting the group device online. */static intlcs_new_device(struct ccwgroup_device *ccwgdev){	struct  lcs_card *card;	struct net_device *dev=NULL;	enum lcs_dev_states recover_state;	int rc;	card = (struct lcs_card *)ccwgdev->dev.driver_data;	if (!card)		return -ENODEV;	LCS_DBF_TEXT(2, setup, "newdev");	LCS_DBF_HEX(3, setup, &card, sizeof(void*));	card->read.ccwdev  = ccwgdev->cdev[0];	card->write.ccwdev = ccwgdev->cdev[1];	recover_state = card->state;	ccw_device_set_online(card->read.ccwdev);	ccw_device_set_online(card->write.ccwdev);	LCS_DBF_TEXT(3, setup, "lcsnewdv");	lcs_setup_card(card);	rc = lcs_detect(card);	if (rc) {		LCS_DBF_TEXT(2, setup, "dtctfail");		PRINT_WARN("Detection of LCS card failed with return code "			   "%d (0x%x)\n", rc, rc);		lcs_stopcard(card);		goto out;	}	if (card->dev) {		LCS_DBF_TEXT(2, setup, "samedev");		LCS_DBF_HEX(3, setup, &card, sizeof(void*));		goto netdev_out;	}	switch (card->lan_type) {#ifdef CONFIG_NET_ETHERNET	case LCS_FRAME_TYPE_ENET:		card->lan_type_trans = eth_type_trans;		dev = alloc_etherdev(0);		break;#endif#ifdef CONFIG_TR	case LCS_FRAME_TYPE_TR:		card->lan_type_trans = tr_type_trans;		dev = alloc_trdev(0);		break;#endif#ifdef CONFIG_FDDI	case LCS_FRAME_TYPE_FDDI:		card->lan_type_trans = fddi_type_trans;		dev = alloc_fddidev(0);		break;#endif	default:		LCS_DBF_TEXT(3, setup, "errinit");		PRINT_ERR("LCS: Initialization failed\n");		PRINT_ERR("LCS: No device found!\n");		goto out;	}	if (!dev)		goto out;	card->dev = dev;	card->dev->priv = card;	card->dev->open = lcs_open_device;	card->dev->stop = lcs_stop_device;	card->dev->hard_start_xmit = lcs_start_xmit;	card->dev->get_stats = lcs_getstats;	SET_MODULE_OWNER(dev);	memcpy(card->dev->dev_addr, card->mac, LCS_MAC_LENGTH);#ifdef CONFIG_IP_MULTICAST	if (!lcs_check_multicast_support(card))		card->dev->set_multicast_list = lcs_set_multicast_list;#endifnetdev_out:	lcs_set_allowed_threads(card,0xffffffff);	if (recover_state == DEV_STATE_RECOVER) {		lcs_set_multicast_list(card->dev);		card->dev->flags |= IFF_UP;		netif_carrier_on(card->dev);		netif_wake_queue(card->dev);		card->state = DEV_STATE_UP;	} else {		lcs_stopcard(card);	}	if (lcs_register_netdev(ccwgdev) != 0)		goto out;	/* Print out supported assists: IPv6 */	PRINT_INFO("LCS device %s %s IPv6 support\n", card->dev->name,		   (card->ip_assists_supported & LCS_IPASS_IPV6_SUPPORT) ?		   "with" : "without");	/* Print out supported assist: Multicast */	PRINT_INFO("LCS device %s %s Multicast support\n", card->dev->name,		   (card->ip_assists_supported & LCS_IPASS_MULTICAST_SUPPORT) ?		   "with" : "without");	return 0;out:	ccw_device_set_offline(card->read.ccwdev);	ccw_device_set_offline(card->write.ccwdev);	return -ENODEV;}/** * lcs_shutdown_device, called when setting the group device offline. */static int__lcs_shutdown_device(struct ccwgroup_device *ccwgdev, int recovery_mode){	struct lcs_card *card;	enum lcs_dev_states recover_state;	int ret;	LCS_DBF_TEXT(3, setup, "shtdndev");	card = (struct lcs_card *)ccwgdev->dev.driver_data;	if (!card)		return -ENODEV;	if (recovery_mode == 0) {		lcs_set_allowed_threads(card, 0);		if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD))			return -ERESTARTSYS;	}	LCS_DBF_HEX(3, setup, &card, sizeof(void*));	recover_state = card->state;	ret = lcs_stop_device(card->dev);	ret = ccw_device_set_offline(card->read.ccwdev);	ret = ccw_device_set_offline(card->write.ccwdev);	if (recover_state == DEV_STATE_UP) {		card->state = DEV_STATE_RECOVER;	}	if (ret)		return ret;	return 0;}static intlcs_shutdown_device(struct ccwgroup_device *ccwgdev){	return __lcs_shutdown_device(ccwgdev, 0);}/** * drive lcs recovery after startup and startlan initiated by Lan Gateway */static intlcs_recovery(void *ptr){	struct lcs_card *card;	struct ccwgroup_device *gdev;        int rc;	card = (struct lcs_card *) ptr;	daemonize("lcs_recover");	LCS_DBF_TEXT(4, trace, "recover1");	if (!lcs_do_run_thread(card, LCS_RECOVERY_THREAD))		return 0;	LCS_DBF_TEXT(4, trace, "recover2");	gdev = card->gdev;	PRINT_WARN("Recovery of device %s started...\n", gdev->dev.bus_id);	rc = __lcs_shutdown_device(gdev, 1);	rc = lcs_new_device(gdev);	if (!rc)		PRINT_INFO("Device %s successfully recovered!\n",				card->dev->name);	else		PRINT_INFO("Device %s could not be recovered!\n",				card->dev->name);	lcs_clear_thread_running_bit(card, LCS_RECOVERY_THREAD);	return 0;}/** * lcs_remove_device, free buffers and card */static voidlcs_remove_device(struct ccwgroup_device *ccwgdev){	struct lcs_card *card;	card = (struct lcs_card *)ccwgdev->dev.driver_data;	if (!card)		return;	PRINT_INFO("Removing lcs group device ....\n");	LCS_DBF_TEXT(3, setup, "remdev");	LCS_DBF_HEX(3, setup, &card, sizeof(void*));	if (ccwgdev->state == CCWGROUP_ONLINE) {		lcs_shutdown_device(ccwgdev);	}	if (card->dev)		unregister_netdev(card->dev);	sysfs_remove_group(&ccwgdev->dev.kobj, &lcs_attr_group);	lcs_cleanup_card(card);	lcs_free_card(card);	put_device(&ccwgdev->dev);}/** * LCS ccwgroup driver registration */static struct ccwgroup_driver lcs_group_driver = {	.owner       = THIS_MODULE,	.name        = "lcs",	.max_slaves  = 2,	.driver_id   = 0xD3C3E2,	.probe       = lcs_probe_device,	.remove      = lcs_remove_device,	.set_online  = lcs_new_device,	.set_offline = lcs_shutdown_device,};/** *  LCS Module/Kernel initialization function */static int__init lcs_init_module(void){	int rc;	PRINT_INFO("Loading %s\n",version);	rc = lcs_register_debug_facility();	LCS_DBF_TEXT(0, setup, "lcsinit");	if (rc) {		PRINT_ERR("Initialization failed\n");		return rc;	}	rc = register_cu3088_discipline(&lcs_group_driver);	if (rc) {		PRINT_ERR("Initialization failed\n");		return rc;	}	return 0;}/** *  LCS module cleanup function */static void__exit lcs_cleanup_module(void){	PRINT_INFO("Terminating lcs module.\n");	LCS_DBF_TEXT(0, trace, "cleanup");	unregister_cu3088_discipline(&lcs_group_driver);	lcs_unregister_debug_facility();}module_init(lcs_init_module);module_exit(lcs_cleanup_module);MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本中文字幕一区二区有限公司| 久久精品亚洲国产奇米99| 一区二区三区鲁丝不卡| 色综合天天性综合| 亚洲综合丝袜美腿| 欧美日韩国产乱码电影| 蜜臀久久久久久久| 久久在线免费观看| 成人午夜精品一区二区三区| 亚洲日本va午夜在线影院| 色婷婷综合五月| 蜜桃久久久久久久| 国产精品久久久久久久岛一牛影视| 99久久综合狠狠综合久久| 亚洲动漫第一页| 日韩写真欧美这视频| 国产成人精品aa毛片| 亚洲蜜臀av乱码久久精品蜜桃| 欧美日韩免费一区二区三区| 美女爽到高潮91| 成人欧美一区二区三区1314| 717成人午夜免费福利电影| 狠狠色伊人亚洲综合成人| 国产精品每日更新| 91精品一区二区三区在线观看| 激情深爱一区二区| 自拍av一区二区三区| 欧美精品日日鲁夜夜添| 国产精品91一区二区| 一区二区三区成人| 久久这里都是精品| 精品1区2区3区| 国产成人综合网| 日韩在线一区二区三区| 国产精品理论在线观看| 欧美酷刑日本凌虐凌虐| 成人天堂资源www在线| 日韩电影在线免费看| 中文字幕av免费专区久久| 欧美日韩成人综合在线一区二区| 国产白丝精品91爽爽久久| 午夜精品久久久久久久99水蜜桃| 欧美va天堂va视频va在线| 99久久精品免费看| 国产专区欧美精品| 三级欧美在线一区| 亚洲人吸女人奶水| 久久天堂av综合合色蜜桃网| 欧美精品v日韩精品v韩国精品v| 成人99免费视频| 精品写真视频在线观看| 天天亚洲美女在线视频| 亚洲精品日韩专区silk| 国产亲近乱来精品视频| 精品久久久久香蕉网| 欧美日韩国产精品成人| av电影天堂一区二区在线| 久久99精品久久久| 日本亚洲一区二区| 亚洲电影中文字幕在线观看| 亚洲欧美日韩国产另类专区| 中文字幕一区二区三| 国产午夜亚洲精品不卡| 欧美精品一区男女天堂| 日韩欧美一区二区免费| 91精品国产黑色紧身裤美女| 欧美色爱综合网| 欧美三级日本三级少妇99| 91国产丝袜在线播放| 99麻豆久久久国产精品免费优播| 国产成人欧美日韩在线电影| 狠狠色伊人亚洲综合成人| 国内久久精品视频| 国精产品一区一区三区mba桃花| 蜜桃视频第一区免费观看| 日韩国产精品久久| 五月天一区二区| 午夜精品久久久久久久久| 亚洲成人免费在线观看| 亚洲国产日日夜夜| 日一区二区三区| 蜜芽一区二区三区| 激情欧美一区二区| 国产91在线|亚洲| 成人午夜激情影院| 色婷婷av一区二区三区gif| 欧美性猛片aaaaaaa做受| 欧美日韩精品欧美日韩精品一 | 午夜精品久久久久久久久| 亚洲一区二区精品视频| 午夜久久久影院| 日韩黄色免费网站| 经典三级在线一区| 国产夫妻精品视频| 91欧美一区二区| 欧美精品日韩一本| 精品久久久久久久久久久院品网| 国产亚洲人成网站| 国产精品成人一区二区艾草| 亚洲影院久久精品| 人妖欧美一区二区| 国产成a人亚洲精品| 色网站国产精品| 日韩三级在线免费观看| 337p日本欧洲亚洲大胆精品| 国产精品久久久久影院老司 | 国产精品夜夜嗨| 色综合咪咪久久| 欧美一区二区视频观看视频| 中文字幕巨乱亚洲| 亚洲国产美女搞黄色| 久久99精品久久久久久久久久久久| 成人综合激情网| 欧美日韩久久久久久| 久久久久国产精品厨房| 亚洲色欲色欲www在线观看| 五月天一区二区三区| 国产成人在线观看| 欧美美女bb生活片| 久久久久久夜精品精品免费| 亚洲激情综合网| 国产激情一区二区三区四区| 欧美三级韩国三级日本一级| 国产校园另类小说区| 亚洲国产精品一区二区久久| 国产精品系列在线播放| 欧美精品一级二级三级| 国产精品萝li| 国产中文字幕精品| 欧美日韩国产天堂| 中文字幕日本不卡| 国产一区二区三区国产| 欧美美女一区二区| 亚洲人成网站色在线观看| 九九热在线视频观看这里只有精品| 91老司机福利 在线| 久久精品网站免费观看| 蜜臀av性久久久久蜜臀av麻豆| 色综合久久久网| 国产精品视频免费看| 精品无人码麻豆乱码1区2区 | 国产一区二区91| 欧美精品一卡二卡| 日韩伦理av电影| 成人免费看的视频| 久久日一线二线三线suv| 亚洲国产另类精品专区| 99久久精品国产网站| 久久久久国产精品麻豆ai换脸| 蜜桃视频免费观看一区| 欧美性高清videossexo| 亚洲色欲色欲www| av午夜一区麻豆| 国产精品无码永久免费888| 国产揄拍国内精品对白| 日韩精品一区二区三区在线观看| 亚洲午夜免费视频| 欧美性色aⅴ视频一区日韩精品| 国产精品久久久久影院色老大 | 蜜桃一区二区三区在线| 欧美日韩aaaaa| 调教+趴+乳夹+国产+精品| 欧美亚洲免费在线一区| 一区二区理论电影在线观看| 色综合中文字幕国产| 综合久久给合久久狠狠狠97色| 国产91高潮流白浆在线麻豆 | 日韩欧美专区在线| 日韩精品电影一区亚洲| 欧美日本国产视频| 日日夜夜精品免费视频| 日韩三级视频中文字幕| 久久成人18免费观看| 精品国产亚洲一区二区三区在线观看| 日韩影院精彩在线| 91精品婷婷国产综合久久竹菊| 肉肉av福利一精品导航| 日韩欧美在线网站| 精品在线一区二区| 国产色产综合色产在线视频 | 亚洲美女免费视频| 91老师片黄在线观看| 舔着乳尖日韩一区| 欧美变态tickle挠乳网站| 国产一区二区精品久久91| 日本一区二区三区四区在线视频| 成av人片一区二区| 亚洲福利一二三区| 欧美电影免费观看高清完整版在线观看 | 国产精品乱码人人做人人爱| 91麻豆精东视频| 日韩国产一区二| 国产婷婷色一区二区三区| eeuss鲁片一区二区三区| 亚洲一区二区中文在线| 日韩欧美中文字幕一区| 不卡av免费在线观看| 一个色综合av| 久久综合久久99| 欧美性受xxxx黑人xyx|