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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ccwgroup.c

?? 底層驅(qū)動(dòng)開發(fā)
?? C
字號(hào):
/* *  drivers/s390/cio/ccwgroup.c *  bus driver for ccwgroup *   $Revision: 1.29 $ * *    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(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, 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);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频在线观看| 欧美午夜片在线看| 亚洲精品欧美专区| 91精品在线观看入口| 国产成人在线色| 爽爽淫人综合网网站| 国产精品成人免费精品自在线观看| 欧美美女网站色| 色哟哟日韩精品| 国产成人精品免费看| 日韩va亚洲va欧美va久久| 亚洲精品成人天堂一二三| 久久影院视频免费| 91精品国产综合久久久久| 91国产福利在线| 成人99免费视频| 国产成人免费9x9x人网站视频| 日韩中文字幕亚洲一区二区va在线| 亚洲欧洲综合另类在线| 亚洲国产精品99久久久久久久久| 日韩精品中文字幕在线一区| 欧美精品aⅴ在线视频| 欧洲一区在线观看| av成人免费在线观看| 国产98色在线|日韩| 国产福利91精品一区二区三区| 七七婷婷婷婷精品国产| 午夜不卡av在线| 亚洲午夜电影在线观看| 亚洲一区二区欧美| 亚洲综合成人在线视频| 亚洲精品免费在线观看| 中文字幕一区二区三区不卡| 国产精品家庭影院| 亚洲国产精品成人综合| 国产视频一区二区在线| 久久久青草青青国产亚洲免观| 久久综合成人精品亚洲另类欧美| 精品免费视频一区二区| 久久久久久久久久久久久久久99| 精品国产一区二区三区av性色| 日韩欧美久久久| 精品福利av导航| 久久综合九色综合97婷婷女人| 2021国产精品久久精品| 亚洲视频在线一区| 亚洲色欲色欲www| 亚洲伊人色欲综合网| 亚洲综合视频在线观看| 三级久久三级久久久| 美国一区二区三区在线播放| 精品无码三级在线观看视频| 国产一区二区福利| 成人理论电影网| 色av成人天堂桃色av| 欧美日韩大陆一区二区| 欧美一区二区精美| 精品日韩99亚洲| 国产精品网站一区| 亚洲欧美色图小说| 日韩二区在线观看| 黑人精品欧美一区二区蜜桃 | 欧美一区二区精美| 欧美一区二区播放| 久久日韩粉嫩一区二区三区| 中文字幕一区二区三区不卡 | 日韩av中文字幕一区二区三区 | 色视频成人在线观看免| 欧美日韩一级黄| 日韩女优视频免费观看| 中文字幕 久热精品 视频在线 | 国产精品888| 99久久婷婷国产综合精品电影| 欧洲在线/亚洲| 精品久久久久久最新网址| 国产精品日日摸夜夜摸av| 亚洲宅男天堂在线观看无病毒| 久久国产精品无码网站| 99久久er热在这里只有精品66| 欧美日韩精品欧美日韩精品一| www久久精品| 一区二区三区在线影院| 激情综合五月天| 色综合久久精品| 精品成a人在线观看| 亚洲日本护士毛茸茸| 久久99精品国产.久久久久| 成人午夜在线播放| 欧美一卡二卡三卡| 亚洲欧美另类久久久精品2019| 蜜臀99久久精品久久久久久软件| av在线不卡电影| 欧美第一区第二区| 一区二区国产视频| 成人一区二区在线观看| 欧美一区二区高清| 一区二区三区四区高清精品免费观看 | 日本欧美一区二区在线观看| 成人免费电影视频| 欧美丰满美乳xxx高潮www| 国产精品久久久久一区二区三区共| 日日欢夜夜爽一区| 97久久精品人人澡人人爽| 精品va天堂亚洲国产| 天堂影院一区二区| 日本大香伊一区二区三区| 国产亚洲精久久久久久| 美腿丝袜亚洲三区| 欧美亚洲免费在线一区| 国产精品久久久久久久蜜臀| 精品一区二区三区久久| 欧美精品在线一区二区三区| 综合精品久久久| 国产91精品在线观看| 欧美成人精品福利| 日韩黄色小视频| 欧美性大战久久久久久久| 日韩一区在线播放| 奇米综合一区二区三区精品视频| 欧美一区日本一区韩国一区| 色婷婷一区二区三区四区| 91精品国产综合久久久久久久久久 | 日本三级韩国三级欧美三级| 色8久久人人97超碰香蕉987| 国产精品欧美一区喷水| 26uuu国产在线精品一区二区| 亚洲专区一二三| 色一情一乱一乱一91av| 久久蜜桃av一区二区天堂| 国产精品一二三在| 中文字幕一区三区| 在线国产电影不卡| 日本欧美一区二区三区| 久久久精品免费网站| 91亚洲国产成人精品一区二区三 | 91丝袜高跟美女视频| 亚洲在线视频免费观看| 欧美一区二区三区公司| 国产不卡一区视频| 亚洲午夜一二三区视频| 日韩欧美国产系列| 成人毛片老司机大片| 无吗不卡中文字幕| 日本一区二区三区四区在线视频| 色婷婷亚洲精品| 久久www免费人成看片高清| 亚洲国产精品ⅴa在线观看| 欧美视频在线观看一区| 国产一区二区电影| 亚洲综合久久久久| 国产亚洲一区二区三区在线观看| 91免费版在线| 奇米精品一区二区三区在线观看 | 国产一区二区视频在线播放| 亚洲女人的天堂| 日韩免费电影一区| 一本色道久久加勒比精品| 久久精品国产一区二区| 亚洲伦理在线免费看| 26uuu亚洲综合色| 欧美少妇一区二区| 福利一区在线观看| 日本成人中文字幕在线视频| 成人欧美一区二区三区小说| 精品欧美乱码久久久久久 | 国产精品久久久久久久久果冻传媒| 欧美日韩国产综合视频在线观看| 成人性生交大片免费看在线播放| 丝袜a∨在线一区二区三区不卡| 中文字幕+乱码+中文字幕一区| 日韩一区二区三区免费看| 一本大道av一区二区在线播放 | 精品国产一二三| 欧美中文字幕一区二区三区| 国产精品一区二区视频| 青青青伊人色综合久久| 有坂深雪av一区二区精品| 国产午夜久久久久| 欧美不卡一区二区| 欧美精品 日韩| 日本韩国精品一区二区在线观看| 成人午夜又粗又硬又大| 国产麻豆精品久久一二三| 日本视频免费一区| 亚洲18女电影在线观看| 亚洲你懂的在线视频| 国产精品久99| 国产肉丝袜一区二区| 欧美精品一区二区三区在线 | 亚洲女同一区二区| 中文字幕一区二区不卡 | 国产最新精品免费| 91色视频在线| 成人国产亚洲欧美成人综合网| 国产综合色精品一区二区三区| 奇米精品一区二区三区在线观看| 天天做天天摸天天爽国产一区| 亚洲一区二区三区在线播放| 亚洲精品亚洲人成人网在线播放| 中文子幕无线码一区tr|