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

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

?? chp.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  drivers/s390/cio/chp.c * *    Copyright IBM Corp. 1999,2007 *    Author(s): Cornelia Huck (cornelia.huck@de.ibm.com) *		 Arnd Bergmann (arndb@de.ibm.com) *		 Peter Oberparleiter <peter.oberparleiter@de.ibm.com> */#include <linux/bug.h>#include <linux/workqueue.h>#include <linux/spinlock.h>#include <linux/init.h>#include <linux/jiffies.h>#include <linux/wait.h>#include <linux/mutex.h>#include <linux/errno.h>#include <asm/chpid.h>#include <asm/sclp.h>#include "cio.h"#include "css.h"#include "ioasm.h"#include "cio_debug.h"#include "chp.h"#define to_channelpath(device) container_of(device, struct channel_path, dev)#define CHP_INFO_UPDATE_INTERVAL	1*HZenum cfg_task_t {	cfg_none,	cfg_configure,	cfg_deconfigure};/* Map for pending configure tasks. */static enum cfg_task_t chp_cfg_task[__MAX_CSSID + 1][__MAX_CHPID + 1];static DEFINE_MUTEX(cfg_lock);static int cfg_busy;/* Map for channel-path status. */static struct sclp_chp_info chp_info;static DEFINE_MUTEX(info_lock);/* Time after which channel-path status may be outdated. */static unsigned long chp_info_expires;/* Workqueue to perform pending configure tasks. */static struct workqueue_struct *chp_wq;static struct work_struct cfg_work;/* Wait queue for configure completion events. */static wait_queue_head_t cfg_wait_queue;/* Return channel_path struct for given chpid. */static inline struct channel_path *chpid_to_chp(struct chp_id chpid){	return channel_subsystems[chpid.cssid]->chps[chpid.id];}/* Set vary state for given chpid. */static void set_chp_logically_online(struct chp_id chpid, int onoff){	chpid_to_chp(chpid)->state = onoff;}/* On succes return 0 if channel-path is varied offline, 1 if it is varied * online. Return -ENODEV if channel-path is not registered. */int chp_get_status(struct chp_id chpid){	return (chpid_to_chp(chpid) ? chpid_to_chp(chpid)->state : -ENODEV);}/** * chp_get_sch_opm - return opm for subchannel * @sch: subchannel * * Calculate and return the operational path mask (opm) based on the chpids * used by the subchannel and the status of the associated channel-paths. */u8 chp_get_sch_opm(struct subchannel *sch){	struct chp_id chpid;	int opm;	int i;	opm = 0;	chp_id_init(&chpid);	for (i = 0; i < 8; i++) {		opm <<= 1;		chpid.id = sch->schib.pmcw.chpid[i];		if (chp_get_status(chpid) != 0)			opm |= 1;	}	return opm;}/** * chp_is_registered - check if a channel-path is registered * @chpid: channel-path ID * * Return non-zero if a channel-path with the given chpid is registered, * zero otherwise. */int chp_is_registered(struct chp_id chpid){	return chpid_to_chp(chpid) != NULL;}/* * Function: s390_vary_chpid * Varies the specified chpid online or offline */static int s390_vary_chpid(struct chp_id chpid, int on){	char dbf_text[15];	int status;	sprintf(dbf_text, on?"varyon%x.%02x":"varyoff%x.%02x", chpid.cssid,		chpid.id);	CIO_TRACE_EVENT(2, dbf_text);	status = chp_get_status(chpid);	if (!on && !status) {		printk(KERN_ERR "cio: chpid %x.%02x is already offline\n",		       chpid.cssid, chpid.id);		return -EINVAL;	}	set_chp_logically_online(chpid, on);	chsc_chp_vary(chpid, on);	return 0;}/* * Channel measurement related functions */static ssize_t chp_measurement_chars_read(struct kobject *kobj,					  struct bin_attribute *bin_attr,					  char *buf, loff_t off, size_t count){	struct channel_path *chp;	struct device *device;	unsigned int size;	device = container_of(kobj, struct device, kobj);	chp = to_channelpath(device);	if (!chp->cmg_chars)		return 0;	size = sizeof(struct cmg_chars);	if (off > size)		return 0;	if (off + count > size)		count = size - off;	memcpy(buf, chp->cmg_chars + off, count);	return count;}static struct bin_attribute chp_measurement_chars_attr = {	.attr = {		.name = "measurement_chars",		.mode = S_IRUSR,	},	.size = sizeof(struct cmg_chars),	.read = chp_measurement_chars_read,};static void chp_measurement_copy_block(struct cmg_entry *buf,				       struct channel_subsystem *css,				       struct chp_id chpid){	void *area;	struct cmg_entry *entry, reference_buf;	int idx;	if (chpid.id < 128) {		area = css->cub_addr1;		idx = chpid.id;	} else {		area = css->cub_addr2;		idx = chpid.id - 128;	}	entry = area + (idx * sizeof(struct cmg_entry));	do {		memcpy(buf, entry, sizeof(*entry));		memcpy(&reference_buf, entry, sizeof(*entry));	} while (reference_buf.values[0] != buf->values[0]);}static ssize_t chp_measurement_read(struct kobject *kobj,				    struct bin_attribute *bin_attr,				    char *buf, loff_t off, size_t count){	struct channel_path *chp;	struct channel_subsystem *css;	struct device *device;	unsigned int size;	device = container_of(kobj, struct device, kobj);	chp = to_channelpath(device);	css = to_css(chp->dev.parent);	size = sizeof(struct cmg_entry);	/* Only allow single reads. */	if (off || count < size)		return 0;	chp_measurement_copy_block((struct cmg_entry *)buf, css, chp->chpid);	count = size;	return count;}static struct bin_attribute chp_measurement_attr = {	.attr = {		.name = "measurement",		.mode = S_IRUSR,	},	.size = sizeof(struct cmg_entry),	.read = chp_measurement_read,};void chp_remove_cmg_attr(struct channel_path *chp){	device_remove_bin_file(&chp->dev, &chp_measurement_chars_attr);	device_remove_bin_file(&chp->dev, &chp_measurement_attr);}int chp_add_cmg_attr(struct channel_path *chp){	int ret;	ret = device_create_bin_file(&chp->dev, &chp_measurement_chars_attr);	if (ret)		return ret;	ret = device_create_bin_file(&chp->dev, &chp_measurement_attr);	if (ret)		device_remove_bin_file(&chp->dev, &chp_measurement_chars_attr);	return ret;}/* * Files for the channel path entries. */static ssize_t chp_status_show(struct device *dev,			       struct device_attribute *attr, char *buf){	struct channel_path *chp = to_channelpath(dev);	if (!chp)		return 0;	return (chp_get_status(chp->chpid) ? sprintf(buf, "online\n") :		sprintf(buf, "offline\n"));}static ssize_t chp_status_write(struct device *dev,				struct device_attribute *attr,				const char *buf, size_t count){	struct channel_path *cp = to_channelpath(dev);	char cmd[10];	int num_args;	int error;	num_args = sscanf(buf, "%5s", cmd);	if (!num_args)		return count;	if (!strnicmp(cmd, "on", 2) || !strcmp(cmd, "1"))		error = s390_vary_chpid(cp->chpid, 1);	else if (!strnicmp(cmd, "off", 3) || !strcmp(cmd, "0"))		error = s390_vary_chpid(cp->chpid, 0);	else		error = -EINVAL;	return error < 0 ? error : count;}static DEVICE_ATTR(status, 0644, chp_status_show, chp_status_write);static ssize_t chp_configure_show(struct device *dev,				  struct device_attribute *attr, char *buf){	struct channel_path *cp;	int status;	cp = to_channelpath(dev);	status = chp_info_get_status(cp->chpid);	if (status < 0)		return status;	return snprintf(buf, PAGE_SIZE, "%d\n", status);}static int cfg_wait_idle(void);static ssize_t chp_configure_write(struct device *dev,				   struct device_attribute *attr,				   const char *buf, size_t count){	struct channel_path *cp;	int val;	char delim;	if (sscanf(buf, "%d %c", &val, &delim) != 1)		return -EINVAL;	if (val != 0 && val != 1)		return -EINVAL;	cp = to_channelpath(dev);	chp_cfg_schedule(cp->chpid, val);	cfg_wait_idle();	return count;}static DEVICE_ATTR(configure, 0644, chp_configure_show, chp_configure_write);static ssize_t chp_type_show(struct device *dev, struct device_attribute *attr,			     char *buf){	struct channel_path *chp = to_channelpath(dev);	if (!chp)		return 0;	return sprintf(buf, "%x\n", chp->desc.desc);}static DEVICE_ATTR(type, 0444, chp_type_show, NULL);static ssize_t chp_cmg_show(struct device *dev, struct device_attribute *attr,			    char *buf){	struct channel_path *chp = to_channelpath(dev);	if (!chp)		return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产麻豆| 2014亚洲片线观看视频免费| 日韩美女啊v在线免费观看| 国内国产精品久久| 2014亚洲片线观看视频免费| 久久99精品一区二区三区| 日韩午夜电影在线观看| 午夜精品久久久久久久久久久 | 国产网红主播福利一区二区| 国内外精品视频| 久久久久久亚洲综合影院红桃| 国产资源精品在线观看| 久久精品人人做人人爽97| 国产福利91精品| 国产人成亚洲第一网站在线播放 | 九一九一国产精品| 精品国产成人在线影院| 国产乱码精品1区2区3区| 国产欧美日韩精品a在线观看| 国产999精品久久久久久绿帽| 国产精品拍天天在线| 94-欧美-setu| 一区二区三区在线观看网站| 欧美午夜在线一二页| 午夜精品在线视频一区| 日韩三级在线免费观看| 精品一区二区三区欧美| 久久精品视频一区二区三区| 成人av影视在线观看| 亚洲天堂av一区| 欧美色精品天天在线观看视频| 日日摸夜夜添夜夜添精品视频| 在线综合+亚洲+欧美中文字幕| 免费av网站大全久久| 久久综合久久鬼色中文字| 国产91精品免费| 亚洲色图一区二区三区| 欧美最新大片在线看| 青青草国产精品亚洲专区无| 久久中文字幕电影| 亚洲线精品一区二区三区| 免费高清在线视频一区·| 精品国产一区二区三区久久久蜜月| 国产精品1区二区.| 亚洲欧美激情视频在线观看一区二区三区| 91成人在线观看喷潮| 男女男精品网站| 亚洲国产高清aⅴ视频| 色屁屁一区二区| 捆绑调教美女网站视频一区| 中文字幕免费一区| 欧美色中文字幕| 久久99久久精品| 亚洲免费观看高清完整| 日韩一二三区不卡| 成人午夜电影久久影院| 香蕉久久夜色精品国产使用方法| 精品国产百合女同互慰| 一本大道av伊人久久综合| 美女网站色91| 日韩码欧中文字| 日韩欧美国产午夜精品| 99天天综合性| 久久精品国内一区二区三区| 一区在线观看视频| 日韩一区二区三区在线| 91性感美女视频| 久久激情五月激情| 亚洲女性喷水在线观看一区| 久久综合资源网| 欧美视频中文字幕| 国产91清纯白嫩初高中在线观看 | 国产精品久久午夜| 欧美日韩国产不卡| 99久久精品国产精品久久| 久久精品国产一区二区三 | 一区二区在线免费观看| 久久久精品欧美丰满| 欧美另类一区二区三区| av高清久久久| 狠狠色丁香久久婷婷综| 亚洲成人第一页| 亚洲欧美综合另类在线卡通| 精品成人一区二区| 欧美日韩高清一区二区| 91毛片在线观看| 国产精品一区二区三区网站| 五月天中文字幕一区二区| 中文字幕亚洲区| 久久免费看少妇高潮| 4438x成人网最大色成网站| 91偷拍与自偷拍精品| 国产成人小视频| 久久疯狂做爰流白浆xx| 午夜精品久久久久影视| 亚洲欧美日韩久久精品| 国产女同性恋一区二区| 精品乱码亚洲一区二区不卡| 欧美日韩日日摸| 在线视频亚洲一区| 99国内精品久久| 国产东北露脸精品视频| 激情综合网av| 麻豆91免费观看| 奇米影视一区二区三区小说| 亚洲成人av一区二区| 亚洲综合视频在线| 亚洲欧美日韩在线不卡| 国产精品五月天| 国产日韩亚洲欧美综合| 欧美精品一区二区蜜臀亚洲| 日韩一级二级三级| 欧美精品日韩精品| 欧美在线999| 在线看国产一区二区| 91麻豆免费在线观看| 99久久99精品久久久久久| 不卡视频在线看| 成人午夜视频在线| 丁香激情综合五月| 国产不卡一区视频| 国产成人三级在线观看| 国产黄人亚洲片| 国产精品一区久久久久| 国产乱理伦片在线观看夜一区| 狠狠狠色丁香婷婷综合激情| 国产在线精品一区二区不卡了| 麻豆精品国产传媒mv男同| 免费成人在线影院| 精品一区二区三区在线观看国产| 蜜乳av一区二区| 久久国产欧美日韩精品| 狂野欧美性猛交blacked| 精品一区二区精品| 激情伊人五月天久久综合| 黑人巨大精品欧美黑白配亚洲| 国产在线不卡一卡二卡三卡四卡| 国产精品亚洲第一| 国产91精品一区二区麻豆亚洲| 成人av在线一区二区| 91丨九色porny丨蝌蚪| 欧美亚洲国产一卡| 欧美高清激情brazzers| 日韩美女视频在线| 久久久国产精品不卡| 国产精品高清亚洲| 亚洲激情校园春色| 午夜国产精品一区| 免费观看在线综合| 国产一区二区三区美女| 成人午夜碰碰视频| 91丨九色丨蝌蚪丨老版| 在线观看精品一区| 91精品国产综合久久久久久| 精品精品国产高清一毛片一天堂| 国产亚洲一区二区三区四区| 亚洲同性gay激情无套| 亚洲一区二区av在线| 欧美aⅴ一区二区三区视频| 国产一区免费电影| 91美女在线观看| 欧美电影在哪看比较好| wwwwxxxxx欧美| 亚洲欧美另类小说视频| 亚洲成人综合视频| 久久精品国产精品亚洲红杏| 大胆亚洲人体视频| 欧美在线999| 久久久久久久久久久电影| 自拍偷拍亚洲综合| 蜜臀精品一区二区三区在线观看| 丰满亚洲少妇av| 在线视频综合导航| 337p粉嫩大胆噜噜噜噜噜91av| 综合婷婷亚洲小说| 人人狠狠综合久久亚洲| 高清国产一区二区三区| 国产大片一区二区| 91免费视频网| 日韩午夜av电影| 中文字幕在线不卡一区二区三区| 亚洲h精品动漫在线观看| 国产一区 二区| 欧美在线你懂的| 久久久久国色av免费看影院| 夜夜精品浪潮av一区二区三区| 韩国精品一区二区| 在线免费观看日本欧美| 久久这里只有精品6| 亚洲欧美偷拍三级| 石原莉奈在线亚洲二区| 福利一区二区在线观看| 在线成人免费观看| 国产精品成人一区二区三区夜夜夜| 日本欧美韩国一区三区| 成人avav在线| 欧美r级在线观看| 一区二区国产盗摄色噜噜| 国产成人精品亚洲777人妖| 欧美日韩免费在线视频|