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

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

?? ccwgroup.c

?? linux-2.6.15.6
?? C
字號:
/* *  drivers/s390/cio/ccwgroup.c *  bus driver for ccwgroup *   $Revision: 1.32 $ * *    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, struct device_attribute *attr, 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->creator_id = creator_id;	gdev->count = argc;	gdev->dev = (struct device ) {		.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 ? gdrv->set_online(gdev) : 0))		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 ? gdrv->set_offline(gdev) : 0))		goto out;	gdev->state = CCWGROUP_OFFLINE; out:	atomic_set(&gdev->onoff, 0);	return ret;}static ssize_tccwgroup_online_store (struct device *dev, struct device_attribute *attr, 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, struct device_attribute *attr, 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 int__ccwgroup_driver_unregister_device(struct device *dev, void *data){	__ccwgroup_remove_symlinks(to_ccwgroupdev(dev));	device_unregister(dev);	put_device(dev);	return 0;}voidccwgroup_driver_unregister (struct ccwgroup_driver *cdriver){	/* We don't want ccwgroup devices to live longer than their driver. */	get_driver(&cdriver->driver);	driver_for_each_device(&cdriver->driver, NULL, NULL,			       __ccwgroup_driver_unregister_device);	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 (device_is_registered(&gdev->dev))				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久久综合桃花| 亚洲人妖av一区二区| 国产在线乱码一区二区三区| 欧美日韩高清在线播放| 国产精品久久久久天堂| 国产精品一区二区视频| 欧美日韩大陆在线| 伊人色综合久久天天人手人婷| 精品午夜一区二区三区在线观看| 欧美日韩黄色影视| 亚洲精品日韩专区silk| zzijzzij亚洲日本少妇熟睡| www国产精品av| 蜜臀av性久久久久蜜臀aⅴ | 亚洲国产日日夜夜| 不卡电影一区二区三区| 欧美成人激情免费网| 秋霞影院一区二区| 欧美精品色综合| 亚洲一二三区不卡| 欧美亚洲愉拍一区二区| 一区二区欧美视频| 91福利在线看| 亚洲综合偷拍欧美一区色| 91在线观看高清| 亚洲女人****多毛耸耸8| av电影在线不卡| 国产精品国产三级国产aⅴ中文 | 欧美三级日韩在线| 亚洲精品第1页| 日本电影欧美片| 亚洲午夜精品久久久久久久久| 在线亚洲欧美专区二区| 一区二区三区国产豹纹内裤在线| 色婷婷av久久久久久久| 亚洲精品欧美专区| 欧美精品18+| 日本成人在线不卡视频| 日韩欧美一级二级| 国产美女在线观看一区| 国产精品水嫩水嫩| 色一情一乱一乱一91av| 亚洲在线免费播放| 日韩你懂的在线播放| 国产麻豆91精品| 亚洲人成小说网站色在线| 欧美在线免费观看视频| 奇米888四色在线精品| 久久综合九色综合97_久久久| 国产99精品国产| 樱花草国产18久久久久| 日韩欧美自拍偷拍| 国产v综合v亚洲欧| 一区2区3区在线看| 日韩午夜在线影院| 成人污视频在线观看| 亚洲一二三四区| 久久久久久免费| 色综合久久久久综合体桃花网| 午夜亚洲福利老司机| 久久久综合视频| 欧美性受xxxx黑人xyx| 麻豆精品国产传媒mv男同| 亚洲国产精品高清| 欧美精品久久99久久在免费线| 激情综合色丁香一区二区| 亚洲人成网站精品片在线观看| 欧美一区二区在线视频| 国产成人亚洲综合色影视| 亚洲777理论| 国产精品你懂的在线| 欧美一区二区三区在线看| kk眼镜猥琐国模调教系列一区二区| 亚洲制服欧美中文字幕中文字幕| 久久亚区不卡日本| 欧美欧美午夜aⅴ在线观看| 丰满少妇久久久久久久| 日本在线不卡视频| 亚洲欧美一区二区久久| 国产丝袜美腿一区二区三区| 91精品国产91久久综合桃花| 一本到不卡免费一区二区| 国产在线一区观看| 蜜臀久久久久久久| 亚洲一区二区三区四区的 | 日韩欧美国产成人一区二区| 色88888久久久久久影院按摩| 国产一区欧美一区| 日本欧美在线观看| 亚洲国产美女搞黄色| 中文字幕一区二区视频| 国产色产综合产在线视频| 69堂亚洲精品首页| 欧美在线制服丝袜| 91色porny蝌蚪| 国产成人8x视频一区二区| 日韩国产在线一| 亚洲一区在线看| 久久久亚洲国产美女国产盗摄| 国产精品一区二区在线看| 日本一区二区三区高清不卡| 国产精品一区二区久久不卡| 欧美aⅴ一区二区三区视频| 精品国产伦理网| 国产色91在线| 亚洲午夜在线观看视频在线| 美女高潮久久久| 波多野结衣的一区二区三区| 欧美喷潮久久久xxxxx| 久久嫩草精品久久久久| 亚洲人成网站在线| 久久av资源网| 色噜噜偷拍精品综合在线| 日韩精品一区二区三区swag| 亚洲视频一区二区在线| 日韩精品国产欧美| 成人精品在线视频观看| 91精品中文字幕一区二区三区| 亚洲国产精品精华液2区45| 五月天欧美精品| eeuss鲁片一区二区三区在线看| 欧美精品三级在线观看| 国产精品久久久久久久久动漫| 日韩福利电影在线| 91麻豆123| 久久网站热最新地址| 午夜欧美在线一二页| av激情综合网| 2024国产精品| 同产精品九九九| 色香蕉久久蜜桃| 国产日韩欧美亚洲| 欧美aaaaaa午夜精品| 欧洲一区在线电影| 国产精品毛片高清在线完整版| 视频一区在线播放| 91亚洲精品一区二区乱码| 欧美xxxx在线观看| 五月婷婷综合激情| 91国偷自产一区二区开放时间 | 亚洲婷婷综合色高清在线| 国产中文一区二区三区| 欧美一级在线观看| 亚洲免费av高清| 99视频精品免费视频| 久久久三级国产网站| 捆绑调教美女网站视频一区| 欧美三片在线视频观看| 亚洲欧美日韩人成在线播放| 成人午夜视频福利| 久久久久久久精| 国产精品一区二区在线观看网站| 欧美一级精品在线| 舔着乳尖日韩一区| 欧美日韩一区二区三区在线| 亚洲影视在线观看| 欧美三级三级三级| 婷婷亚洲久悠悠色悠在线播放| 在线观看亚洲a| 亚洲自拍偷拍麻豆| 欧美在线影院一区二区| 亚洲国产美国国产综合一区二区| 在线国产电影不卡| 亚洲一级二级在线| 欧美日韩精品一区二区三区四区 | 亚洲成av人片观看| 欧美三级电影一区| 亚洲国产一区二区视频| 欧美日韩国产中文| 免费成人在线视频观看| 日韩一级免费观看| 国产资源在线一区| 欧美一区二区性放荡片| 91精品国产综合久久蜜臀| 欧美r级在线观看| 2023国产一二三区日本精品2022| 久久精品免费看| 久久综合九色综合欧美就去吻| 国产永久精品大片wwwapp| 国产免费成人在线视频| www.视频一区| 亚洲永久精品国产| 日韩三级电影网址| 懂色av一区二区三区免费观看| 国产精品久久久久久久久免费樱桃 | 色婷婷综合久久久久中文一区二区| 中文字幕一区二区在线观看| 欧美影视一区在线| 日本亚洲一区二区| 国产亚洲欧美在线| 91视频国产观看| 日韩**一区毛片| 国产精品久久久久久久久久免费看 | 精品日韩在线观看| 成人免费毛片aaaaa**| 亚洲大片免费看|