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

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

?? ccwgroup.c

?? 優龍2410linux2.6.8內核源代碼
?? C
字號:
/* *  drivers/s390/cio/ccwgroup.c *  bus driver for ccwgroup *   $Revision: 1.28 $ * *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, *                       IBM Corporation *    Author(s): Arnd Bergmann (arndb@de.ibm.com) *               Cornelia Huck (cohuck@de.ibm.com) */#include <linux/module.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/list.h>#include <linux/device.h>#include <linux/init.h>#include <linux/ctype.h>#include <linux/dcache.h>#include <asm/semaphore.h>#include <asm/ccwdev.h>#include <asm/ccwgroup.h>/* In Linux 2.4, we had a channel device layer called "chandev" * that did all sorts of obscure stuff for networking devices. * This is another driver that serves as a replacement for just * one of its functions, namely the translation of single subchannels * to devices that use multiple subchannels. *//* a device matches a driver if all its slave devices match the same * entry of the driver */static intccwgroup_bus_match (struct device * dev, struct device_driver * drv){	struct ccwgroup_device *gdev;	struct ccwgroup_driver *gdrv;	gdev = container_of(dev, struct ccwgroup_device, dev);	gdrv = container_of(drv, struct ccwgroup_driver, driver);	if (gdev->creator_id == gdrv->driver_id)		return 1;	return 0;}static intccwgroup_hotplug (struct device *dev, char **envp, int num_envp, char *buffer,		  int buffer_size){	/* TODO */	return 0;}static struct bus_type ccwgroup_bus_type = {	.name    = "ccwgroup",	.match   = ccwgroup_bus_match,	.hotplug = ccwgroup_hotplug,};static inline void__ccwgroup_remove_symlinks(struct ccwgroup_device *gdev){	int i;	char str[8];	for (i = 0; i < gdev->count; i++) {		sprintf(str, "cdev%d", i);		sysfs_remove_link(&gdev->dev.kobj, str);		sysfs_remove_link(&gdev->cdev[i]->dev.kobj, "group_device");	}	}/* * Provide an 'ungroup' attribute so the user can remove group devices no * longer needed or accidentially created. Saves memory :) */static ssize_tccwgroup_ungroup_store(struct device *dev, const char *buf, size_t count){	struct ccwgroup_device *gdev;	gdev = to_ccwgroupdev(dev);	if (gdev->state != CCWGROUP_OFFLINE)		return -EINVAL;	__ccwgroup_remove_symlinks(gdev);	device_unregister(dev);	return count;}static DEVICE_ATTR(ungroup, 0200, NULL, ccwgroup_ungroup_store);static voidccwgroup_release (struct device *dev){	struct ccwgroup_device *gdev;	int i;	gdev = to_ccwgroupdev(dev);	for (i = 0; i < gdev->count; i++) {		gdev->cdev[i]->dev.driver_data = NULL;		put_device(&gdev->cdev[i]->dev);	}	kfree(gdev);}static inline int__ccwgroup_create_symlinks(struct ccwgroup_device *gdev){	char str[8];	int i, rc;	for (i = 0; i < gdev->count; i++) {		rc = sysfs_create_link(&gdev->cdev[i]->dev.kobj, &gdev->dev.kobj,				       "group_device");		if (rc) {			for (--i; i >= 0; i--)				sysfs_remove_link(&gdev->cdev[i]->dev.kobj,						  "group_device");			return rc;		}	}	for (i = 0; i < gdev->count; i++) {		sprintf(str, "cdev%d", i);		rc = sysfs_create_link(&gdev->dev.kobj, &gdev->cdev[i]->dev.kobj,				       str);		if (rc) {			for (--i; i >= 0; i--) {				sprintf(str, "cdev%d", i);				sysfs_remove_link(&gdev->dev.kobj, str);			}			for (i = 0; i < gdev->count; i++)				sysfs_remove_link(&gdev->cdev[i]->dev.kobj,						  "group_device");			return rc;		}	}	return 0;}/* * try to add a new ccwgroup device for one driver * argc and argv[] are a list of bus_id's of devices * belonging to the driver. */intccwgroup_create(struct device *root,		unsigned int creator_id,		struct ccw_driver *cdrv,		int argc, char *argv[]){	struct ccwgroup_device *gdev;	int i;	int rc;	int del_drvdata;	if (argc > 256) /* disallow dumb users */		return -EINVAL;	gdev = kmalloc(sizeof(*gdev) + argc*sizeof(gdev->cdev[0]), GFP_KERNEL);	if (!gdev)		return -ENOMEM;	memset(gdev, 0, sizeof(*gdev) + argc*sizeof(gdev->cdev[0]));	atomic_set(&gdev->onoff, 0);	del_drvdata = 0;	for (i = 0; i < argc; i++) {		gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]);		/* all devices have to be of the same type in		 * order to be grouped */		if (!gdev->cdev[i]		    || gdev->cdev[i]->id.driver_info !=		    gdev->cdev[0]->id.driver_info) {			rc = -EINVAL;			goto free_dev;		}		/* Don't allow a device to belong to more than one group. */		if (gdev->cdev[i]->dev.driver_data) {			rc = -EINVAL;			goto free_dev;		}	}	for (i = 0; i < argc; i++)		gdev->cdev[i]->dev.driver_data = gdev;	del_drvdata = 1;	*gdev = (struct ccwgroup_device) {		.creator_id = creator_id,		.count = argc,		.dev = {			.bus = &ccwgroup_bus_type,			.parent = root,			.release = ccwgroup_release,		},	};	snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s",			gdev->cdev[0]->dev.bus_id);	rc = device_register(&gdev->dev);		if (rc)		goto free_dev;	get_device(&gdev->dev);	rc = device_create_file(&gdev->dev, &dev_attr_ungroup);	if (rc) {		device_unregister(&gdev->dev);		goto error;	}	rc = __ccwgroup_create_symlinks(gdev);	if (!rc) {		put_device(&gdev->dev);		return 0;	}	device_remove_file(&gdev->dev, &dev_attr_ungroup);	device_unregister(&gdev->dev);error:	for (i = 0; i < argc; i++)		if (gdev->cdev[i]) {			put_device(&gdev->cdev[i]->dev);			gdev->cdev[i]->dev.driver_data = NULL;		}	put_device(&gdev->dev);	return rc;free_dev:	for (i = 0; i < argc; i++)		if (gdev->cdev[i]) {			put_device(&gdev->cdev[i]->dev);			if (del_drvdata)				gdev->cdev[i]->dev.driver_data = NULL;		}	kfree(gdev);	return rc;}static int __initinit_ccwgroup (void){	return bus_register (&ccwgroup_bus_type);}static void __exitcleanup_ccwgroup (void){	bus_unregister (&ccwgroup_bus_type);}module_init(init_ccwgroup);module_exit(cleanup_ccwgroup);/************************** driver stuff ******************************/static intccwgroup_set_online(struct ccwgroup_device *gdev){	struct ccwgroup_driver *gdrv;	int ret;	if (atomic_compare_and_swap(0, 1, &gdev->onoff))		return -EAGAIN;	if (gdev->state == CCWGROUP_ONLINE) {		ret = 0;		goto out;	}	if (!gdev->dev.driver) {		ret = -EINVAL;		goto out;	}	gdrv = to_ccwgroupdrv (gdev->dev.driver);	if ((ret = gdrv->set_online(gdev)))		goto out;	gdev->state = CCWGROUP_ONLINE; out:	atomic_set(&gdev->onoff, 0);	return ret;}static intccwgroup_set_offline(struct ccwgroup_device *gdev){	struct ccwgroup_driver *gdrv;	int ret;	if (atomic_compare_and_swap(0, 1, &gdev->onoff))		return -EAGAIN;	if (gdev->state == CCWGROUP_OFFLINE) {		ret = 0;		goto out;	}	if (!gdev->dev.driver) {		ret = -EINVAL;		goto out;	}	gdrv = to_ccwgroupdrv (gdev->dev.driver);	if ((ret = gdrv->set_offline(gdev)))		goto out;	gdev->state = CCWGROUP_OFFLINE; out:	atomic_set(&gdev->onoff, 0);	return ret;}static ssize_tccwgroup_online_store (struct device *dev, const char *buf, size_t count){	struct ccwgroup_device *gdev;	struct ccwgroup_driver *gdrv;	unsigned int value;	int ret;	gdev = to_ccwgroupdev(dev);	if (!dev->driver)		return count;	gdrv = to_ccwgroupdrv (gdev->dev.driver);	if (!try_module_get(gdrv->owner))		return -EINVAL;	value = simple_strtoul(buf, 0, 0);	ret = count;	if (value == 1)		ccwgroup_set_online(gdev);	else if (value == 0)		ccwgroup_set_offline(gdev);	else		ret = -EINVAL;	module_put(gdrv->owner);	return ret;}static ssize_tccwgroup_online_show (struct device *dev, char *buf){	int online;	online = (to_ccwgroupdev(dev)->state == CCWGROUP_ONLINE);	return sprintf(buf, online ? "1\n" : "0\n");}static DEVICE_ATTR(online, 0644, ccwgroup_online_show, ccwgroup_online_store);static intccwgroup_probe (struct device *dev){	struct ccwgroup_device *gdev;	struct ccwgroup_driver *gdrv;	int ret;	gdev = to_ccwgroupdev(dev);	gdrv = to_ccwgroupdrv(dev->driver);	if ((ret = device_create_file(dev, &dev_attr_online)))		return ret;	pr_debug("%s: device %s\n", __func__, gdev->dev.bus_id);	ret = gdrv->probe ? gdrv->probe(gdev) : -ENODEV;	if (ret)		device_remove_file(dev, &dev_attr_online);	return ret;}static intccwgroup_remove (struct device *dev){	struct ccwgroup_device *gdev;	struct ccwgroup_driver *gdrv;	gdev = to_ccwgroupdev(dev);	gdrv = to_ccwgroupdrv(dev->driver);	pr_debug("%s: device %s\n", __func__, gdev->dev.bus_id);	device_remove_file(dev, &dev_attr_online);	if (gdrv && gdrv->remove)		gdrv->remove(gdev);	return 0;}intccwgroup_driver_register (struct ccwgroup_driver *cdriver){	/* register our new driver with the core */	cdriver->driver = (struct device_driver) {		.bus = &ccwgroup_bus_type,		.name = cdriver->name,		.probe = ccwgroup_probe,		.remove = ccwgroup_remove,	};	return driver_register(&cdriver->driver);}static inline struct device *__get_next_ccwgroup_device(struct device_driver *drv){	struct device *dev, *d;	down_read(&drv->bus->subsys.rwsem);	dev = NULL;	list_for_each_entry(d, &drv->devices, driver_list) {		dev = get_device(d);		if (dev)			break;	}	up_read(&drv->bus->subsys.rwsem);	return dev;}voidccwgroup_driver_unregister (struct ccwgroup_driver *cdriver){	struct device *dev;	/* We don't want ccwgroup devices to live longer than their driver. */	get_driver(&cdriver->driver);	while ((dev = __get_next_ccwgroup_device(&cdriver->driver))) {		__ccwgroup_remove_symlinks(to_ccwgroupdev(dev));		device_unregister(dev);		put_device(dev);	};	put_driver(&cdriver->driver);	driver_unregister(&cdriver->driver);}intccwgroup_probe_ccwdev(struct ccw_device *cdev){	return 0;}static inline struct ccwgroup_device *__ccwgroup_get_gdev_by_cdev(struct ccw_device *cdev){	struct ccwgroup_device *gdev;	if (cdev->dev.driver_data) {		gdev = (struct ccwgroup_device *)cdev->dev.driver_data;		if (get_device(&gdev->dev)) {			if (!list_empty(&gdev->dev.node))				return gdev;			put_device(&gdev->dev);		}		return NULL;	}	return NULL;}voidccwgroup_remove_ccwdev(struct ccw_device *cdev){	struct ccwgroup_device *gdev;	/* Ignore offlining errors, device is gone anyway. */	ccw_device_set_offline(cdev);	/* If one of its devices is gone, the whole group is done for. */	gdev = __ccwgroup_get_gdev_by_cdev(cdev);	if (gdev) {		__ccwgroup_remove_symlinks(gdev);		device_unregister(&gdev->dev);		put_device(&gdev->dev);	}}MODULE_LICENSE("GPL");EXPORT_SYMBOL(ccwgroup_driver_register);EXPORT_SYMBOL(ccwgroup_driver_unregister);EXPORT_SYMBOL(ccwgroup_create);EXPORT_SYMBOL(ccwgroup_probe_ccwdev);EXPORT_SYMBOL(ccwgroup_remove_ccwdev);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91福利视频在线| 日本女人一区二区三区| 欧美精品一区二区在线播放| 欧美视频一区二区三区在线观看| 91啪亚洲精品| 在线欧美小视频| 欧美亚洲综合久久| 欧美日韩国产系列| 91精品在线麻豆| 精品国产sm最大网站| www欧美成人18+| 欧美韩国一区二区| 亚洲女同ⅹxx女同tv| 一区二区三区 在线观看视频| 亚洲一卡二卡三卡四卡无卡久久| 亚洲一区欧美一区| 日韩高清在线电影| 国产在线播放一区二区三区| 国产成人av电影| 97se亚洲国产综合在线| 欧美另类z0zxhd电影| 日韩欧美123| 亚洲欧美一区二区在线观看| 亚洲综合网站在线观看| 久久精品国产99国产精品| 国产精品中文字幕一区二区三区| 成人av中文字幕| 在线不卡免费欧美| 欧美国产乱子伦| 偷窥少妇高潮呻吟av久久免费| 久久精品国产一区二区三| 粉嫩av一区二区三区| 欧美男人的天堂一二区| 久久精品在线免费观看| 亚洲综合av网| 国产乱淫av一区二区三区 | 久久久久久黄色| 亚洲视频资源在线| 蜜桃久久精品一区二区| 99re视频精品| 久久综合色婷婷| 伊人夜夜躁av伊人久久| 美女任你摸久久| 色94色欧美sute亚洲线路一ni| 日韩一区二区三区在线视频| 亚洲欧美日韩电影| 国产美女精品一区二区三区| 欧美日本在线看| 日韩一区有码在线| 久久国产精品99精品国产| 欧美体内she精高潮| 中文字幕在线观看不卡视频| 久久电影网电视剧免费观看| 欧美日韩和欧美的一区二区| 亚洲欧洲在线观看av| 黄色小说综合网站| 日韩女优电影在线观看| 午夜欧美电影在线观看| 色一情一乱一乱一91av| 国产午夜精品久久| 国产麻豆精品久久一二三| 欧美二区三区的天堂| 一区二区久久久久久| 色婷婷综合激情| 国产精品国产三级国产普通话蜜臀 | 国产美女在线观看一区| 欧美精品九九99久久| 久久99精品久久只有精品| 国产精品综合二区| 欧美变态口味重另类| 午夜欧美在线一二页| 欧美日韩视频一区二区| 亚洲影视在线观看| 色妞www精品视频| 亚洲人吸女人奶水| 91欧美激情一区二区三区成人| 中文av一区二区| 成人在线一区二区三区| 久久毛片高清国产| 高清国产一区二区三区| 国产精品久久久久久户外露出| 国产一区二区三区| 久久久久99精品一区| 国产福利不卡视频| 国产精品免费视频观看| 日韩专区欧美专区| 欧美精选一区二区| 亚洲一区二区三区在线播放| 欧美日韩国产高清一区二区三区 | 亚洲免费视频中文字幕| 色综合久久天天综合网| 亚洲sss视频在线视频| 欧美电影一区二区| 久久99精品久久久久久国产越南| 欧美videos中文字幕| 国产98色在线|日韩| 亚洲欧美日韩综合aⅴ视频| 欧美日韩在线播放一区| 日本欧美加勒比视频| 久久婷婷国产综合精品青草| 成人av电影在线观看| 亚洲妇熟xx妇色黄| 久久婷婷成人综合色| 99re热这里只有精品视频| 丝袜美腿亚洲色图| 国产欧美日韩综合精品一区二区| 99国产精品久久| 老司机午夜精品| 韩国av一区二区三区四区 | 亚洲国产一区视频| 色综合天天综合| 日韩精品电影一区亚洲| 欧美高清在线一区| 91精品国产免费| 91蜜桃在线免费视频| 毛片不卡一区二区| 亚洲色图欧洲色图| 日韩欧美高清在线| 色88888久久久久久影院野外| 美女一区二区三区| 一区二区三区国产精华| 久久久久久99久久久精品网站| 欧美性猛交xxxxxxxx| 成人教育av在线| 美日韩一区二区三区| 亚洲综合偷拍欧美一区色| 欧美国产欧美综合| 日韩精品一区二区三区视频| 欧美日韩精品福利| 91丨国产丨九色丨pron| 国产精品一二三四五| 日韩av网站免费在线| 亚洲一区成人在线| 亚洲天堂精品在线观看| 久久久精品国产99久久精品芒果| 欧美日韩三级视频| 色国产综合视频| 成人免费va视频| 国产91在线看| 国产成人福利片| 国产精品综合二区| 精品无人码麻豆乱码1区2区| 日韩av二区在线播放| 五月婷婷综合激情| 亚洲成av人片一区二区| 一卡二卡三卡日韩欧美| 亚洲男同性视频| 亚洲免费伊人电影| 一区二区三区鲁丝不卡| 一区二区三区影院| 亚洲美女屁股眼交3| 亚洲色图清纯唯美| 一区二区欧美精品| 亚洲成人激情av| 丝袜诱惑亚洲看片| 另类综合日韩欧美亚洲| 老司机精品视频在线| 捆绑调教一区二区三区| 国产伦理精品不卡| 国产成人高清视频| 99精品欧美一区二区三区综合在线| 波波电影院一区二区三区| eeuss鲁一区二区三区| 色嗨嗨av一区二区三区| 欧美日本在线看| 欧美一区二区三区免费大片 | 日韩欧美电影在线| 久久夜色精品国产欧美乱极品| 精品国产乱码久久久久久蜜臀| 久久精品亚洲国产奇米99| 国产精品青草久久| 亚洲一区二区影院| 美脚の诱脚舐め脚责91| 国产精品一区在线| 色婷婷综合久久久| 日韩一卡二卡三卡四卡| 久久久久88色偷偷免费 | 欧美日韩一级片网站| 日韩一区二区影院| 欧美激情一区二区| 亚洲国产精品久久人人爱 | 国产精品久久久久久久第一福利| 最新中文字幕一区二区三区| 亚洲一区在线免费观看| 国产在线视频一区二区三区| 不卡的av电影在线观看| 日韩一卡二卡三卡| 国产精品你懂的在线欣赏| 亚洲一区视频在线| 国产河南妇女毛片精品久久久 | 国产成人午夜精品影院观看视频| 91小视频在线观看| 欧美xxxx老人做受| 亚洲成av人片一区二区三区| 丁香激情综合国产| 欧美一卡二卡在线观看| 亚洲欧美成aⅴ人在线观看| 国产在线精品国自产拍免费| 欧美性大战久久久久久久蜜臀| 国产网红主播福利一区二区|