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

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

?? scsi.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 5 頁
字號:
		if (!HBA_ptr)			goto out;		for (scd = HBA_ptr->host_queue; scd; scd = scd->next) {			if ((scd->channel == channel			     && scd->id == id			     && scd->lun == lun)) {				break;			}		}		err = -ENOSYS;		if (scd)			goto out;	/* We do not yet support unplugging */		scan_scsis(HBA_ptr, 1, channel, id, lun);		/* FIXME (DB) This assumes that the queue_depth routines can be used		   in this context as well, while they were all designed to be		   called only once after the detect routine. (DB) */		/* queue_depth routine moved to inside scan_scsis(,1,,,) so		   it is called before build_commandblocks() */		err = length;		goto out;	}	/*	 * Usage: echo "scsi remove-single-device 0 1 2 3" >/proc/scsi/scsi	 * with  "0 1 2 3" replaced by your "Host Channel Id Lun".	 *	 * Consider this feature pre-BETA.	 *	 *     CAUTION: This is not for hotplugging your peripherals. As	 *     SCSI was not designed for this you could damage your	 *     hardware and thoroughly confuse the SCSI subsystem.	 *	 */	else if (!strncmp("remove-single-device", buffer + 5, 20)) {		p = buffer + 26;		host = simple_strtoul(p, &p, 0);		channel = simple_strtoul(p + 1, &p, 0);		id = simple_strtoul(p + 1, &p, 0);		lun = simple_strtoul(p + 1, &p, 0);		for (HBA_ptr = scsi_hostlist; HBA_ptr; HBA_ptr = HBA_ptr->next) {			if (HBA_ptr->host_no == host) {				break;			}		}		err = -ENODEV;		if (!HBA_ptr)			goto out;		for (scd = HBA_ptr->host_queue; scd; scd = scd->next) {			if ((scd->channel == channel			     && scd->id == id			     && scd->lun == lun)) {				break;			}		}		if (scd == NULL)			goto out;	/* there is no such device attached */		err = -EBUSY;		if (scd->access_count)			goto out;		SDTpnt = scsi_devicelist;		while (SDTpnt != NULL) {			if (SDTpnt->detach)				(*SDTpnt->detach) (scd);			SDTpnt = SDTpnt->next;		}		if (scd->attached == 0) {			/*			 * Nobody is using this device any more.			 * Free all of the command structures.			 */                        if (HBA_ptr->hostt->revoke)                                HBA_ptr->hostt->revoke(scd);			devfs_unregister (scd->de);			scsi_release_commandblocks(scd);			/* Now we can remove the device structure */			if (scd->next != NULL)				scd->next->prev = scd->prev;			if (scd->prev != NULL)				scd->prev->next = scd->next;			if (HBA_ptr->host_queue == scd) {				HBA_ptr->host_queue = scd->next;			}			blk_cleanup_queue(&scd->request_queue);			kfree((char *) scd);		} else {			goto out;		}		err = 0;	}out:		free_page((unsigned long) buffer);	return err;}#endif/* * This entry point should be called by a driver if it is trying * to add a low level scsi driver to the system. */static int scsi_register_host(Scsi_Host_Template * tpnt){	int pcount;	struct Scsi_Host *shpnt;	Scsi_Device *SDpnt;	struct Scsi_Device_Template *sdtpnt;	const char *name;	unsigned long flags;	int out_of_space = 0;	if (tpnt->next || !tpnt->detect)		return 1;	/* Must be already loaded, or				 * no detect routine available				 */	/* If max_sectors isn't set, default to max */	if (!tpnt->max_sectors)		tpnt->max_sectors = MAX_SECTORS;	pcount = next_scsi_host;	MOD_INC_USE_COUNT;	/* The detect routine must carefully spinunlock/spinlock if 	   it enables interrupts, since all interrupt handlers do 	   spinlock as well.	   All lame drivers are going to fail due to the following 	   spinlock. For the time beeing let's use it only for drivers 	   using the new scsi code. NOTE: the detect routine could	   redefine the value tpnt->use_new_eh_code. (DB, 13 May 1998) */	if (tpnt->use_new_eh_code) {		spin_lock_irqsave(&io_request_lock, flags);		tpnt->present = tpnt->detect(tpnt);		spin_unlock_irqrestore(&io_request_lock, flags);	} else		tpnt->present = tpnt->detect(tpnt);	if (tpnt->present) {		if (pcount == next_scsi_host) {			if (tpnt->present > 1) {				printk(KERN_ERR "scsi: Failure to register low-level scsi driver");				scsi_unregister_host(tpnt);				return 1;			}			/* 			 * The low-level driver failed to register a driver.			 * We can do this now.			 */			if(scsi_register(tpnt, 0)==NULL)			{				printk(KERN_ERR "scsi: register failed.\n");				scsi_unregister_host(tpnt);				return 1;			}		}		tpnt->next = scsi_hosts;	/* Add to the linked list */		scsi_hosts = tpnt;		/* Add the new driver to /proc/scsi */#ifdef CONFIG_PROC_FS		build_proc_dir_entries(tpnt);#endif		/*		 * Add the kernel threads for each host adapter that will		 * handle error correction.		 */		for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {			if (shpnt->hostt == tpnt && shpnt->hostt->use_new_eh_code) {				DECLARE_MUTEX_LOCKED(sem);				shpnt->eh_notify = &sem;				kernel_thread((int (*)(void *)) scsi_error_handler,					      (void *) shpnt, 0);				/*				 * Now wait for the kernel error thread to initialize itself				 * as it might be needed when we scan the bus.				 */				down(&sem);				shpnt->eh_notify = NULL;			}		}		for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {			if (shpnt->hostt == tpnt) {				if (tpnt->info) {					name = tpnt->info(shpnt);				} else {					name = tpnt->name;				}				printk(KERN_INFO "scsi%d : %s\n",		/* And print a little message */				       shpnt->host_no, name);			}		}		/* The next step is to call scan_scsis here.  This generates the		 * Scsi_Devices entries		 */		for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {			if (shpnt->hostt == tpnt) {				scan_scsis(shpnt, 0, 0, 0, 0);				if (shpnt->select_queue_depths != NULL) {					(shpnt->select_queue_depths) (shpnt, shpnt->host_queue);				}			}		}		for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next) {			if (sdtpnt->init && sdtpnt->dev_noticed)				(*sdtpnt->init) ();		}		/*		 * Next we create the Scsi_Cmnd structures for this host 		 */		for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {			for (SDpnt = shpnt->host_queue; SDpnt; SDpnt = SDpnt->next)				if (SDpnt->host->hostt == tpnt) {					for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)						if (sdtpnt->attach)							(*sdtpnt->attach) (SDpnt);					if (SDpnt->attached) {						scsi_build_commandblocks(SDpnt);						if (0 == SDpnt->has_cmdblocks)							out_of_space = 1;					}				}		}		/*		 * Now that we have all of the devices, resize the DMA pool,		 * as required.  */		if (!out_of_space)			scsi_resize_dma_pool();		/* This does any final handling that is required. */		for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next) {			if (sdtpnt->finish && sdtpnt->nr_dev) {				(*sdtpnt->finish) ();			}		}	}#if defined(USE_STATIC_SCSI_MEMORY)	printk("SCSI memory: total %ldKb, used %ldKb, free %ldKb.\n",	       (scsi_memory_upper_value - scsi_memory_lower_value) / 1024,	       (scsi_init_memory_start - scsi_memory_lower_value) / 1024,	       (scsi_memory_upper_value - scsi_init_memory_start) / 1024);#endif	if (out_of_space) {		scsi_unregister_host(tpnt);	/* easiest way to clean up?? */		return 1;	} else		return 0;}/* * Similarly, this entry point should be called by a loadable module if it * is trying to remove a low level scsi driver from the system. */static int scsi_unregister_host(Scsi_Host_Template * tpnt){	int online_status;	int pcount0, pcount;	Scsi_Cmnd *SCpnt;	Scsi_Device *SDpnt;	Scsi_Device *SDpnt1;	struct Scsi_Device_Template *sdtpnt;	struct Scsi_Host *sh1;	struct Scsi_Host *shpnt;	char name[10];	/* host_no>=10^9? I don't think so. */	/* get the big kernel lock, so we don't race with open() */	lock_kernel();	/*	 * First verify that this host adapter is completely free with no pending	 * commands 	 */	for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {		for (SDpnt = shpnt->host_queue; SDpnt;		     SDpnt = SDpnt->next) {			if (SDpnt->host->hostt == tpnt			    && SDpnt->host->hostt->module			    && GET_USE_COUNT(SDpnt->host->hostt->module))				goto err_out;			/* 			 * FIXME(eric) - We need to find a way to notify the			 * low level driver that we are shutting down - via the			 * special device entry that still needs to get added. 			 *			 * Is detach interface below good enough for this?			 */		}	}	/*	 * FIXME(eric) put a spinlock on this.  We force all of the devices offline	 * to help prevent race conditions where other hosts/processors could try and	 * get in and queue a command.	 */	for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {		for (SDpnt = shpnt->host_queue; SDpnt;		     SDpnt = SDpnt->next) {			if (SDpnt->host->hostt == tpnt)				SDpnt->online = FALSE;		}	}	for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {		if (shpnt->hostt != tpnt) {			continue;		}		for (SDpnt = shpnt->host_queue; SDpnt;		     SDpnt = SDpnt->next) {			/*			 * Loop over all of the commands associated with the device.  If any of			 * them are busy, then set the state back to inactive and bail.			 */			for (SCpnt = SDpnt->device_queue; SCpnt;			     SCpnt = SCpnt->next) {				online_status = SDpnt->online;				SDpnt->online = FALSE;				if (SCpnt->request.rq_status != RQ_INACTIVE) {					printk(KERN_ERR "SCSI device not inactive - rq_status=%d, target=%d, pid=%ld, state=%d, owner=%d.\n",					       SCpnt->request.rq_status, SCpnt->target, SCpnt->pid,					     SCpnt->state, SCpnt->owner);					for (SDpnt1 = shpnt->host_queue; SDpnt1;					     SDpnt1 = SDpnt1->next) {						for (SCpnt = SDpnt1->device_queue; SCpnt;						     SCpnt = SCpnt->next)							if (SCpnt->request.rq_status == RQ_SCSI_DISCONNECTING)								SCpnt->request.rq_status = RQ_INACTIVE;					}					SDpnt->online = online_status;					printk(KERN_ERR "Device busy???\n");					goto err_out;				}				/*				 * No, this device is really free.  Mark it as such, and				 * continue on.				 */				SCpnt->state = SCSI_STATE_DISCONNECTING;				SCpnt->request.rq_status = RQ_SCSI_DISCONNECTING;	/* Mark as busy */			}		}	}	/* Next we detach the high level drivers from the Scsi_Device structures */	for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {		if (shpnt->hostt != tpnt) {			continue;		}		for (SDpnt = shpnt->host_queue; SDpnt;		     SDpnt = SDpnt->next) {			for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)				if (sdtpnt->detach)					(*sdtpnt->detach) (SDpnt);			/* If something still attached, punt */			if (SDpnt->attached) {				printk(KERN_ERR "Attached usage count = %d\n", SDpnt->attached);				goto err_out;			}			devfs_unregister (SDpnt->de);		}	}	/*	 * Next, kill the kernel error recovery thread for this host.	 */	for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {		if (shpnt->hostt == tpnt		    && shpnt->hostt->use_new_eh_code		    && shpnt->ehandler != NULL) {			DECLARE_MUTEX_LOCKED(sem);			shpnt->eh_notify = &sem;			send_sig(SIGHUP, shpnt->ehandler, 1);			down(&sem);			shpnt->eh_notify = NULL;		}	}	/* Next we free up the Scsi_Cmnd structures for this host */	for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {		if (shpnt->hostt != tpnt) {			continue;		}		for (SDpnt = shpnt->host_queue; SDpnt;		     SDpnt = shpnt->host_queue) {			scsi_release_commandblocks(SDpnt);			blk_cleanup_queue(&SDpnt->request_queue);			/* Next free up the Scsi_Device structures for this host */			shpnt->host_queue = SDpnt->next;			kfree((char *) SDpnt);		}	}	/* Next we go through and remove the instances of the individual hosts	 * that were detected */	pcount0 = next_scsi_host;	for (shpnt = scsi_hostlist; shpnt; shpnt = sh1) {		sh1 = shpnt->next;		if (shpnt->hostt != tpnt)			continue;		pcount = next_scsi_host;		/* Remove the /proc/scsi directory entry */		sprintf(name,"%d",shpnt->host_no);		remove_proc_entry(name

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲欧美在线观看| 国产一区二区不卡| 不卡一区二区中文字幕| 337p日本欧洲亚洲大胆精品| 蜜桃视频一区二区三区在线观看| 91精品国产一区二区| 一区二区国产视频| 欧美精三区欧美精三区| 老司机精品视频导航| 国产女人18毛片水真多成人如厕| www.亚洲色图| 亚洲大片精品永久免费| 精品黑人一区二区三区久久| 播五月开心婷婷综合| 亚洲最大色网站| 欧美tickling网站挠脚心| 国产成人精品aa毛片| 悠悠色在线精品| 日韩精品中文字幕一区二区三区| 成人网在线免费视频| 亚洲gay无套男同| 2023国产精品自拍| 色又黄又爽网站www久久| 午夜精品123| 国产欧美久久久精品影院| 色狠狠一区二区| 国内不卡的二区三区中文字幕| 国产精品久久久久一区二区三区共| 欧美丝袜丝交足nylons| 国产麻豆一精品一av一免费 | 91精品国产入口| 国产高清成人在线| 午夜精品爽啪视频| 中文字幕 久热精品 视频在线| 国产精品亲子伦对白| 在线免费一区三区| 国产高清在线精品| 日韩不卡手机在线v区| 亚洲人成精品久久久久久| 久久一日本道色综合| 欧美日韩中文国产| www.欧美.com| 精品无码三级在线观看视频| 亚洲自拍偷拍av| 国产精品久久久久影院色老大| 欧美不卡在线视频| 欧美人与性动xxxx| 91丝袜呻吟高潮美腿白嫩在线观看| 黑人巨大精品欧美黑白配亚洲| 午夜视频一区在线观看| 亚洲另类在线制服丝袜| 中国色在线观看另类| 精品国产一区二区精华| 欧美日韩精品综合在线| 色婷婷av一区二区三区之一色屋| 国产成人免费视频网站| 久久精品国产99| 免费成人性网站| 婷婷一区二区三区| 亚洲一二三区在线观看| 亚洲图片另类小说| 日韩美女视频一区二区 | 国产一区视频网站| 青娱乐精品视频在线| 午夜精品爽啪视频| 丝袜亚洲另类欧美综合| 婷婷国产在线综合| 亚洲福利视频一区| 亚洲国产美女搞黄色| 亚洲国产成人91porn| 夜夜嗨av一区二区三区四季av | 色综合天天天天做夜夜夜夜做| 国产传媒日韩欧美成人| 国产经典欧美精品| 国产**成人网毛片九色| 成人精品鲁一区一区二区| 国产嫩草影院久久久久| 久久久亚洲精华液精华液精华液| 精品久久国产老人久久综合| 欧美大片免费久久精品三p| 欧美va亚洲va香蕉在线| 2023国产一二三区日本精品2022| 久久奇米777| 国产精品色一区二区三区| 一色桃子久久精品亚洲| 亚洲欧美乱综合| 婷婷六月综合网| 久久99久久精品欧美| 国产在线精品免费| av毛片久久久久**hd| 在线精品国精品国产尤物884a| 欧美日韩精品专区| 精品久久久三级丝袜| 欧美激情综合五月色丁香小说| 亚洲人妖av一区二区| 午夜免费欧美电影| 久久爱www久久做| 丁香激情综合国产| 色噜噜狠狠色综合中国| 欧美喷水一区二区| 久久婷婷综合激情| 成人免费在线视频| 水野朝阳av一区二区三区| 久久99久久久久| 91玉足脚交白嫩脚丫在线播放| 欧美性猛交xxxxxxxx| 日韩欧美资源站| 亚洲欧洲日本在线| 免费在线欧美视频| 成人一道本在线| 欧美在线观看视频一区二区三区| 日韩免费在线观看| 亚洲女同ⅹxx女同tv| 日韩国产精品大片| av一区二区三区在线| 欧美丰满嫩嫩电影| 一色桃子久久精品亚洲| 六月丁香婷婷久久| 色婷婷久久综合| 久久亚洲综合av| 亚洲小说欧美激情另类| 国产精品18久久久久| 欧美日韩一级二级| 日本一区二区三区在线不卡| 亚洲成a人片在线观看中文| 国产精品一区二区在线播放| 色综合视频一区二区三区高清| 欧美成人aa大片| 午夜视频一区在线观看| 99精品视频在线观看| 日韩欧美资源站| 亚洲国产日韩一区二区| 不卡一区二区在线| 久久久午夜精品理论片中文字幕| 亚洲高清免费在线| 91亚洲精品一区二区乱码| 久久综合色天天久久综合图片| 亚洲图片自拍偷拍| 91美女片黄在线观看| 国产亚洲欧洲一区高清在线观看| 婷婷久久综合九色国产成人| 在线亚洲欧美专区二区| 欧美国产精品一区二区三区| 日韩av在线免费观看不卡| 欧美在线免费观看视频| **网站欧美大片在线观看| 国产成人自拍在线| 精品国产成人在线影院 | 国内一区二区视频| 欧美一区二区三区在线电影| 亚洲韩国精品一区| 色综合久久综合网| 亚洲人成网站影音先锋播放| 国产白丝精品91爽爽久久| 久久先锋资源网| 国产自产2019最新不卡| 日韩免费福利电影在线观看| 五月综合激情网| 欧美精三区欧美精三区| 丝袜国产日韩另类美女| 91精品国产一区二区三区| 日韩1区2区日韩1区2区| 欧美高清视频不卡网| 首页欧美精品中文字幕| 欧美日韩高清不卡| 免费看日韩精品| 欧美tickling网站挠脚心| 久久se精品一区精品二区| 精品欧美乱码久久久久久 | 国产精品不卡一区| 不卡欧美aaaaa| 亚洲欧美电影一区二区| 欧日韩精品视频| 日本亚洲欧美天堂免费| 欧美人伦禁忌dvd放荡欲情| 日本亚洲天堂网| 久久久久久久久久久久久夜| 国产一区高清在线| 日本一区二区三区免费乱视频| 成人久久视频在线观看| 亚洲婷婷在线视频| 欧美日韩国产经典色站一区二区三区| 亚洲成人免费电影| 精品国产免费一区二区三区四区 | 国产日韩欧美高清在线| 成人高清免费在线播放| 伊人夜夜躁av伊人久久| 欧美一区中文字幕| 国产一区二区三区观看| 亚洲美女视频在线观看| 欧美丰满少妇xxxxx高潮对白| 久久99精品国产| 亚洲图片激情小说| 欧美一级日韩不卡播放免费| 国产美女一区二区三区| 一区二区视频在线看| 精品美女在线观看| av男人天堂一区| 青椒成人免费视频| 欧美极品少妇xxxxⅹ高跟鞋|