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

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

?? apm.c

?? linux-2.6.15.6
?? C
?? 第 1 頁 / 共 5 頁
字號:
			/*			 * If we are already processing a SUSPEND,			 * then further SUSPEND events from the BIOS			 * will be ignored.  We also return here to			 * cope with the fact that the Thinkpads keep			 * sending a SUSPEND event until something else			 * happens!			 */			if (ignore_sys_suspend)				return;			ignore_sys_suspend = 1;			queue_event(event, NULL);			if (suspends_pending <= 0)				(void) suspend(1);			break;		case APM_NORMAL_RESUME:		case APM_CRITICAL_RESUME:		case APM_STANDBY_RESUME:			ignore_sys_suspend = 0;			last_resume = jiffies;			ignore_bounce = 1;			if ((event != APM_NORMAL_RESUME)			    || (ignore_normal_resume == 0)) {				write_seqlock_irq(&xtime_lock);				set_time();				write_sequnlock_irq(&xtime_lock);				device_resume();				pm_send_all(PM_RESUME, (void *)0);				queue_event(event, NULL);			}			ignore_normal_resume = 0;			break;		case APM_CAPABILITY_CHANGE:		case APM_LOW_BATTERY:		case APM_POWER_STATUS_CHANGE:			queue_event(event, NULL);			/* If needed, notify drivers here */			break;		case APM_UPDATE_TIME:			write_seqlock_irq(&xtime_lock);			set_time();			write_sequnlock_irq(&xtime_lock);			break;		case APM_CRITICAL_SUSPEND:			/*			 * We are not allowed to reject a critical suspend.			 */			(void) suspend(0);			break;		}	}}static void apm_event_handler(void){	static int	pending_count = 4;	int		err;	if ((standbys_pending > 0) || (suspends_pending > 0)) {		if ((apm_info.connection_version > 0x100) &&				(pending_count-- <= 0)) {			pending_count = 4;			if (debug)				printk(KERN_DEBUG "apm: setting state busy\n");			err = set_system_power_state(APM_STATE_BUSY);			if (err)				apm_error("busy", err);		}	} else		pending_count = 4;	check_events();}/* * This is the APM thread main loop. */static void apm_mainloop(void){	DECLARE_WAITQUEUE(wait, current);	add_wait_queue(&apm_waitqueue, &wait);	set_current_state(TASK_INTERRUPTIBLE);	for (;;) {		schedule_timeout(APM_CHECK_TIMEOUT);		if (exit_kapmd)			break;		/*		 * Ok, check all events, check for idle (and mark us sleeping		 * so as not to count towards the load average)..		 */		set_current_state(TASK_INTERRUPTIBLE);		apm_event_handler();	}	remove_wait_queue(&apm_waitqueue, &wait);}static int check_apm_user(struct apm_user *as, const char *func){	if ((as == NULL) || (as->magic != APM_BIOS_MAGIC)) {		printk(KERN_ERR "apm: %s passed bad filp\n", func);		return 1;	}	return 0;}static ssize_t do_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos){	struct apm_user *	as;	int			i;	apm_event_t		event;	as = fp->private_data;	if (check_apm_user(as, "read"))		return -EIO;	if ((int)count < sizeof(apm_event_t))		return -EINVAL;	if ((queue_empty(as)) && (fp->f_flags & O_NONBLOCK))		return -EAGAIN;	wait_event_interruptible(apm_waitqueue, !queue_empty(as));	i = count;	while ((i >= sizeof(event)) && !queue_empty(as)) {		event = get_queued_event(as);		if (copy_to_user(buf, &event, sizeof(event))) {			if (i < count)				break;			return -EFAULT;		}		switch (event) {		case APM_SYS_SUSPEND:		case APM_USER_SUSPEND:			as->suspends_read++;			break;		case APM_SYS_STANDBY:		case APM_USER_STANDBY:			as->standbys_read++;			break;		}		buf += sizeof(event);		i -= sizeof(event);	}	if (i < count)		return count - i;	if (signal_pending(current))		return -ERESTARTSYS;	return 0;}static unsigned int do_poll(struct file *fp, poll_table * wait){	struct apm_user * as;	as = fp->private_data;	if (check_apm_user(as, "poll"))		return 0;	poll_wait(fp, &apm_waitqueue, wait);	if (!queue_empty(as))		return POLLIN | POLLRDNORM;	return 0;}static int do_ioctl(struct inode * inode, struct file *filp,		    u_int cmd, u_long arg){	struct apm_user *	as;	as = filp->private_data;	if (check_apm_user(as, "ioctl"))		return -EIO;	if ((!as->suser) || (!as->writer))		return -EPERM;	switch (cmd) {	case APM_IOC_STANDBY:		if (as->standbys_read > 0) {			as->standbys_read--;			as->standbys_pending--;			standbys_pending--;		} else			queue_event(APM_USER_STANDBY, as);		if (standbys_pending <= 0)			standby();		break;	case APM_IOC_SUSPEND:		if (as->suspends_read > 0) {			as->suspends_read--;			as->suspends_pending--;			suspends_pending--;		} else			queue_event(APM_USER_SUSPEND, as);		if (suspends_pending <= 0) {			return suspend(1);		} else {			as->suspend_wait = 1;			wait_event_interruptible(apm_suspend_waitqueue,					as->suspend_wait == 0);			return as->suspend_result;		}		break;	default:		return -EINVAL;	}	return 0;}static int do_release(struct inode * inode, struct file * filp){	struct apm_user *	as;	as = filp->private_data;	if (check_apm_user(as, "release"))		return 0;	filp->private_data = NULL;	if (as->standbys_pending > 0) {		standbys_pending -= as->standbys_pending;		if (standbys_pending <= 0)			standby();	}	if (as->suspends_pending > 0) {		suspends_pending -= as->suspends_pending;		if (suspends_pending <= 0)			(void) suspend(1);	}  	spin_lock(&user_list_lock);	if (user_list == as)		user_list = as->next;	else {		struct apm_user *	as1;		for (as1 = user_list;		     (as1 != NULL) && (as1->next != as);		     as1 = as1->next)			;		if (as1 == NULL)			printk(KERN_ERR "apm: filp not in user list\n");		else			as1->next = as->next;	}	spin_unlock(&user_list_lock);	kfree(as);	return 0;}static int do_open(struct inode * inode, struct file * filp){	struct apm_user *	as;	as = (struct apm_user *)kmalloc(sizeof(*as), GFP_KERNEL);	if (as == NULL) {		printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n",		       sizeof(*as));		return -ENOMEM;	}	as->magic = APM_BIOS_MAGIC;	as->event_tail = as->event_head = 0;	as->suspends_pending = as->standbys_pending = 0;	as->suspends_read = as->standbys_read = 0;	/*	 * XXX - this is a tiny bit broken, when we consider BSD         * process accounting. If the device is opened by root, we	 * instantly flag that we used superuser privs. Who knows,	 * we might close the device immediately without doing a	 * privileged operation -- cevans	 */	as->suser = capable(CAP_SYS_ADMIN);	as->writer = (filp->f_mode & FMODE_WRITE) == FMODE_WRITE;	as->reader = (filp->f_mode & FMODE_READ) == FMODE_READ;	spin_lock(&user_list_lock);	as->next = user_list;	user_list = as;	spin_unlock(&user_list_lock);	filp->private_data = as;	return 0;}static int apm_get_info(char *buf, char **start, off_t fpos, int length){	char *		p;	unsigned short	bx;	unsigned short	cx;	unsigned short	dx;	int		error;	unsigned short  ac_line_status = 0xff;	unsigned short  battery_status = 0xff;	unsigned short  battery_flag   = 0xff;	int		percentage     = -1;	int             time_units     = -1;	char            *units         = "?";	p = buf;	if ((num_online_cpus() == 1) &&	    !(error = apm_get_power_status(&bx, &cx, &dx))) {		ac_line_status = (bx >> 8) & 0xff;		battery_status = bx & 0xff;		if ((cx & 0xff) != 0xff)			percentage = cx & 0xff;		if (apm_info.connection_version > 0x100) {			battery_flag = (cx >> 8) & 0xff;			if (dx != 0xffff) {				units = (dx & 0x8000) ? "min" : "sec";				time_units = dx & 0x7fff;			}		}	}	/* Arguments, with symbols from linux/apm_bios.h.  Information is	   from the Get Power Status (0x0a) call unless otherwise noted.	   0) Linux driver version (this will change if format changes)	   1) APM BIOS Version.  Usually 1.0, 1.1 or 1.2.	   2) APM flags from APM Installation Check (0x00):	      bit 0: APM_16_BIT_SUPPORT	      bit 1: APM_32_BIT_SUPPORT	      bit 2: APM_IDLE_SLOWS_CLOCK	      bit 3: APM_BIOS_DISABLED	      bit 4: APM_BIOS_DISENGAGED	   3) AC line status	      0x00: Off-line	      0x01: On-line	      0x02: On backup power (BIOS >= 1.1 only)	      0xff: Unknown	   4) Battery status	      0x00: High	      0x01: Low	      0x02: Critical	      0x03: Charging	      0x04: Selected battery not present (BIOS >= 1.2 only)	      0xff: Unknown	   5) Battery flag	      bit 0: High	      bit 1: Low	      bit 2: Critical	      bit 3: Charging	      bit 7: No system battery	      0xff: Unknown	   6) Remaining battery life (percentage of charge):	      0-100: valid	      -1: Unknown	   7) Remaining battery life (time units):	      Number of remaining minutes or seconds	      -1: Unknown	   8) min = minutes; sec = seconds */	p += sprintf(p, "%s %d.%d 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n",		     driver_version,		     (apm_info.bios.version >> 8) & 0xff,		     apm_info.bios.version & 0xff,		     apm_info.bios.flags,		     ac_line_status,		     battery_status,		     battery_flag,		     percentage,		     time_units,		     units);	return p - buf;}static int apm(void *unused){	unsigned short	bx;	unsigned short	cx;	unsigned short	dx;	int		error;	char *		power_stat;	char *		bat_stat;	kapmd_running = 1;	daemonize("kapmd");	current->flags |= PF_NOFREEZE;#ifdef CONFIG_SMP	/* 2002/08/01 - WT	 * This is to avoid random crashes at boot time during initialization	 * on SMP systems in case of "apm=power-off" mode. Seen on ASUS A7M266D.	 * Some bioses don't like being called from CPU != 0.	 * Method suggested by Ingo Molnar.	 */	set_cpus_allowed(current, cpumask_of_cpu(0));	BUG_ON(smp_processor_id() != 0);#endif	if (apm_info.connection_version == 0) {		apm_info.connection_version = apm_info.bios.version;		if (apm_info.connection_version > 0x100) {			/*			 * We only support BIOSs up to version 1.2			 */			if (apm_info.connection_version > 0x0102)				apm_info.connection_version = 0x0102;			error = apm_driver_version(&apm_info.connection_version);			if (error != APM_SUCCESS) {				apm_error("driver version", error);				/* Fall back to an APM 1.0 connection. */				apm_info.connection_version = 0x100;			}		}	}	if (debug)		printk(KERN_INFO "apm: Connection version %d.%d\n",			(apm_info.connection_version >> 8) & 0xff,			apm_info.connection_version & 0xff);#ifdef CONFIG_APM_DO_ENABLE	if (apm_info.bios.flags & APM_BIOS_DISABLED) {		/*		 * This call causes my NEC UltraLite Versa 33/C to hang if it		 * is booted with PM disabled but not in the docking station.		 * Unfortunate ...		 */		error = apm_enable_power_management(1);		if (error) {			apm_error("enable power management", error);			return -1;		}	}#endif	if ((apm_info.bios.flags & APM_BIOS_DISENGAGED)	    && (apm_info.connection_version > 0x0100)) {		error = apm_engage_power_management(APM_DEVICE_ALL, 1);		if (error) {			apm_error("engage power management", error);			return -1;		}	}	if (debug && (num_online_cpus() == 1 || smp )) {		error = apm_get_power_status(&bx, &cx, &dx);		if (error)			printk(KERN_INFO "apm: power status not available\n");		else {			switch ((bx >> 8) & 0xff) {			case 0: power_stat = "off line"; break;			case 1: power_stat = "on line"; break;			case 2: power_stat = "on backup power"; break;			default: power_stat = "unknown"; break;			}			switch (bx & 0xff) {			case 0: bat_stat = "high"; break;			case 1: bat_stat = "low"; break;			case 2: bat_stat = "critical"; break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品一区二区在线观看| 欧美国产日本视频| 午夜精品国产更新| 在线精品视频小说1| 国产精品萝li| av亚洲精华国产精华精| 中文字幕国产一区二区| 成人综合激情网| 国产精品婷婷午夜在线观看| 丁香一区二区三区| 中国av一区二区三区| 国产成人亚洲综合色影视| 久久免费看少妇高潮| 国产综合久久久久影院| 久久免费午夜影院| 国产成人精品在线看| 国产精品美女久久久久高潮| 成人aaaa免费全部观看| 最近中文字幕一区二区三区| 色综合久久综合| 亚洲永久免费av| 欧美人牲a欧美精品| 日韩成人一级大片| 日韩精品一区二区三区视频| 国产伦精品一区二区三区视频青涩| 26uuu色噜噜精品一区二区| 国产风韵犹存在线视精品| 国产日产欧美一区二区视频| 成人美女视频在线观看| 国产精品久久久久久久久免费桃花| 成人av资源在线| 亚洲精品久久久久久国产精华液| 91成人看片片| 蜜臀av一区二区在线免费观看| 精品久久久久久久久久久久久久久| 国产在线播精品第三| 国产精品久久久久四虎| 91久久国产最好的精华液| 亚洲chinese男男1069| 日韩亚洲欧美综合| 国产乱码精品一区二区三区忘忧草 | 国产精品免费av| 色婷婷国产精品久久包臀| 亚洲一级片在线观看| 91精品国产综合久久久久| 精品一区在线看| 国产精品午夜在线| 91高清在线观看| 久久国产精品免费| 国产精品久久久久三级| 欧美日韩的一区二区| 精品午夜久久福利影院| 国产精品久久久久久妇女6080| 91国偷自产一区二区开放时间| 美女视频网站黄色亚洲| 国产欧美日韩精品一区| 91国产丝袜在线播放| 激情综合一区二区三区| 一区在线观看免费| 欧美精品在线观看播放| 国产成人综合精品三级| 一区二区三区国产豹纹内裤在线| 欧美电视剧免费观看| a级高清视频欧美日韩| 亚洲成人在线网站| 国产网站一区二区| 欧美色国产精品| 国产高清一区日本| 亚洲国产中文字幕| 久久久99免费| 欧美三电影在线| 国产成人一区在线| 日本欧美一区二区| 综合中文字幕亚洲| 精品国产乱码久久久久久夜甘婷婷 | 亚洲午夜电影在线观看| 国产情人综合久久777777| 欧美在线一区二区三区| 国产精品伊人色| 日本网站在线观看一区二区三区 | 国产喷白浆一区二区三区| 欧美网站一区二区| 成人激情黄色小说| 麻豆成人免费电影| 亚洲精品国产无天堂网2021| 精品99一区二区三区| 欧美性淫爽ww久久久久无| 国产福利精品一区二区| 三级影片在线观看欧美日韩一区二区 | 美女高潮久久久| 亚洲一区二区三区美女| 中文字幕不卡三区| 亚洲精品在线三区| 欧美妇女性影城| 色婷婷亚洲综合| 成人av手机在线观看| 激情亚洲综合在线| 日韩高清一区二区| 亚洲一二三四久久| 中文字幕在线观看一区| 国产亚洲制服色| 久久综合九色综合欧美98| 日韩一区二区免费视频| 欧美三电影在线| 欧美亚洲一区二区在线观看| 99国产欧美久久久精品| 国产成人免费av在线| 国内国产精品久久| 免费成人你懂的| 三级在线观看一区二区| 亚洲丰满少妇videoshd| 一区二区三区毛片| 亚洲视频一区二区在线| 欧美国产精品劲爆| 国产三级一区二区三区| 2023国产一二三区日本精品2022| 制服.丝袜.亚洲.另类.中文 | 欧美日韩午夜精品| 在线亚洲一区二区| 99久久99久久精品免费看蜜桃| 国产精品99久久久久| 国产一区二区视频在线| 精品一区二区国语对白| 免费看精品久久片| 日本va欧美va瓶| 日精品一区二区| 日韩黄色在线观看| 日韩精彩视频在线观看| 日韩精品视频网站| 欧美96一区二区免费视频| 五月婷婷另类国产| 午夜电影网一区| 日韩精品一区第一页| 污片在线观看一区二区| 日韩福利视频网| 蜜桃视频一区二区三区在线观看| 日韩激情av在线| 毛片av一区二区| 韩国在线一区二区| 国产综合色视频| 成人综合在线观看| 一本色道a无线码一区v| 91国偷自产一区二区三区观看| 欧美在线播放高清精品| 欧美日韩精品专区| 在线播放日韩导航| 精品国产乱码久久久久久影片| 久久综合狠狠综合| 国产精品国产三级国产aⅴ中文| 最新国产成人在线观看| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲精品中文字幕在线观看| 亚洲综合视频在线| 日本特黄久久久高潮| 国产综合色精品一区二区三区| 国产999精品久久久久久| 94-欧美-setu| 欧美视频中文一区二区三区在线观看| 欧美日本在线播放| ww亚洲ww在线观看国产| 中文幕一区二区三区久久蜜桃| 一区二区三区中文免费| 天堂va蜜桃一区二区三区| 免费观看在线色综合| 国产99精品国产| 日本乱人伦一区| 日韩一级黄色大片| 国产精品私人自拍| 亚洲高清不卡在线观看| 久久99蜜桃精品| 99re6这里只有精品视频在线观看| 欧美日韩一本到| 久久这里都是精品| 一区二区三区在线视频观看| 日韩高清在线不卡| 成人综合在线观看| 欧美精品电影在线播放| 国产欧美一区二区精品久导航| 一区二区三区四区不卡视频| 美国毛片一区二区三区| 91丨porny丨蝌蚪视频| 日韩一级片网址| 亚洲欧美在线视频观看| 日韩av成人高清| 成人激情av网| 69久久夜色精品国产69蝌蚪网| 久久久久久久电影| 99视频有精品| 日韩午夜小视频| 亚洲欧洲综合另类| 老司机精品视频线观看86| 91香蕉视频黄| 亚洲精品一区二区三区福利| 亚洲青青青在线视频| 精品一区二区三区在线播放 | 国产99久久久国产精品潘金| 欧美日韩在线播放一区| 国产免费成人在线视频| 日韩精品1区2区3区| 99国产精品国产精品毛片|