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

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

?? ub.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
				break;			cmd->error = rc;			cmd->state = UB_CMDST_DONE;		} else {			if (!ub_is_completed(&sc->work_done))				break;			del_timer(&sc->work_timer);			ub_scsi_urb_compl(sc, cmd);		}	}}static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd){	struct urb *urb = &sc->work_urb;	struct bulk_cs_wrap *bcs;	int len;	int rc;	if (atomic_read(&sc->poison)) {		ub_state_done(sc, cmd, -ENODEV);		return;	}	if (cmd->state == UB_CMDST_CLEAR) {		if (urb->status == -EPIPE) {			/*			 * STALL while clearning STALL.			 * The control pipe clears itself - nothing to do.			 */			printk(KERN_NOTICE "%s: stall on control pipe\n",			    sc->name);			goto Bad_End;		}		/*		 * We ignore the result for the halt clear.		 */		/* reset the endpoint toggle */		usb_settoggle(sc->dev, usb_pipeendpoint(sc->last_pipe),			usb_pipeout(sc->last_pipe), 0);		ub_state_sense(sc, cmd);	} else if (cmd->state == UB_CMDST_CLR2STS) {		if (urb->status == -EPIPE) {			printk(KERN_NOTICE "%s: stall on control pipe\n",			    sc->name);			goto Bad_End;		}		/*		 * We ignore the result for the halt clear.		 */		/* reset the endpoint toggle */		usb_settoggle(sc->dev, usb_pipeendpoint(sc->last_pipe),			usb_pipeout(sc->last_pipe), 0);		ub_state_stat(sc, cmd);	} else if (cmd->state == UB_CMDST_CLRRS) {		if (urb->status == -EPIPE) {			printk(KERN_NOTICE "%s: stall on control pipe\n",			    sc->name);			goto Bad_End;		}		/*		 * We ignore the result for the halt clear.		 */		/* reset the endpoint toggle */		usb_settoggle(sc->dev, usb_pipeendpoint(sc->last_pipe),			usb_pipeout(sc->last_pipe), 0);		ub_state_stat_counted(sc, cmd);	} else if (cmd->state == UB_CMDST_CMD) {		switch (urb->status) {		case 0:			break;		case -EOVERFLOW:			goto Bad_End;		case -EPIPE:			rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);			if (rc != 0) {				printk(KERN_NOTICE "%s: "				    "unable to submit clear (%d)\n",				    sc->name, rc);				/*				 * This is typically ENOMEM or some other such shit.				 * Retrying is pointless. Just do Bad End on it...				 */				ub_state_done(sc, cmd, rc);				return;			}			cmd->state = UB_CMDST_CLEAR;			return;		case -ESHUTDOWN:	/* unplug */		case -EILSEQ:		/* unplug timeout on uhci */			ub_state_done(sc, cmd, -ENODEV);			return;		default:			goto Bad_End;		}		if (urb->actual_length != US_BULK_CB_WRAP_LEN) {			goto Bad_End;		}		if (cmd->dir == UB_DIR_NONE || cmd->nsg < 1) {			ub_state_stat(sc, cmd);			return;		}		// udelay(125);		// usb-storage has this		ub_data_start(sc, cmd);	} else if (cmd->state == UB_CMDST_DATA) {		if (urb->status == -EPIPE) {			rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);			if (rc != 0) {				printk(KERN_NOTICE "%s: "				    "unable to submit clear (%d)\n",				    sc->name, rc);				ub_state_done(sc, cmd, rc);				return;			}			cmd->state = UB_CMDST_CLR2STS;			return;		}		if (urb->status == -EOVERFLOW) {			/*			 * A babble? Failure, but we must transfer CSW now.			 */			cmd->error = -EOVERFLOW;	/* A cheap trick... */			ub_state_stat(sc, cmd);			return;		}		if (cmd->dir == UB_DIR_WRITE) {			/*			 * Do not continue writes in case of a failure.			 * Doing so would cause sectors to be mixed up,			 * which is worse than sectors lost.			 *			 * We must try to read the CSW, or many devices			 * get confused.			 */			len = urb->actual_length;			if (urb->status != 0 ||			    len != cmd->sgv[cmd->current_sg].length) {				cmd->act_len += len;				cmd->error = -EIO;				ub_state_stat(sc, cmd);				return;			}		} else {			/*			 * If an error occurs on read, we record it, and			 * continue to fetch data in order to avoid bubble.			 *			 * As a small shortcut, we stop if we detect that			 * a CSW mixed into data.			 */			if (urb->status != 0)				cmd->error = -EIO;			len = urb->actual_length;			if (urb->status != 0 ||			    len != cmd->sgv[cmd->current_sg].length) {				if ((len & 0x1FF) == US_BULK_CS_WRAP_LEN)					goto Bad_End;			}		}		cmd->act_len += urb->actual_length;		if (++cmd->current_sg < cmd->nsg) {			ub_data_start(sc, cmd);			return;		}		ub_state_stat(sc, cmd);	} else if (cmd->state == UB_CMDST_STAT) {		if (urb->status == -EPIPE) {			rc = ub_submit_clear_stall(sc, cmd, sc->last_pipe);			if (rc != 0) {				printk(KERN_NOTICE "%s: "				    "unable to submit clear (%d)\n",				    sc->name, rc);				ub_state_done(sc, cmd, rc);				return;			}			/*			 * Having a stall when getting CSW is an error, so			 * make sure uppper levels are not oblivious to it.			 */			cmd->error = -EIO;		/* A cheap trick... */			cmd->state = UB_CMDST_CLRRS;			return;		}		/* Catch everything, including -EOVERFLOW and other nasties. */		if (urb->status != 0)			goto Bad_End;		if (urb->actual_length == 0) {			ub_state_stat_counted(sc, cmd);			return;		}		/*		 * Check the returned Bulk protocol status.		 * The status block has to be validated first.		 */		bcs = &sc->work_bcs;		if (sc->signature == cpu_to_le32(0)) {			/*			 * This is the first reply, so do not perform the check.			 * Instead, remember the signature the device uses			 * for future checks. But do not allow a nul.			 */			sc->signature = bcs->Signature;			if (sc->signature == cpu_to_le32(0)) {				ub_state_stat_counted(sc, cmd);				return;			}		} else {			if (bcs->Signature != sc->signature) {				ub_state_stat_counted(sc, cmd);				return;			}		}		if (bcs->Tag != cmd->tag) {			/*			 * This usually happens when we disagree with the			 * device's microcode about something. For instance,			 * a few of them throw this after timeouts. They buffer			 * commands and reply at commands we timed out before.			 * Without flushing these replies we loop forever.			 */			ub_state_stat_counted(sc, cmd);			return;		}		len = le32_to_cpu(bcs->Residue);		if (len != cmd->len - cmd->act_len) {			/*			 * It is all right to transfer less, the caller has			 * to check. But it's not all right if the device			 * counts disagree with our counts.			 */			goto Bad_End;		}		switch (bcs->Status) {		case US_BULK_STAT_OK:			break;		case US_BULK_STAT_FAIL:			ub_state_sense(sc, cmd);			return;		case US_BULK_STAT_PHASE:			goto Bad_End;		default:			printk(KERN_INFO "%s: unknown CSW status 0x%x\n",			    sc->name, bcs->Status);			ub_state_done(sc, cmd, -EINVAL);			return;		}		/* Not zeroing error to preserve a babble indicator */		if (cmd->error != 0) {			ub_state_sense(sc, cmd);			return;		}		cmd->state = UB_CMDST_DONE;		ub_cmdq_pop(sc);		(*cmd->done)(sc, cmd);	} else if (cmd->state == UB_CMDST_SENSE) {		ub_state_done(sc, cmd, -EIO);	} else {		printk(KERN_WARNING "%s: "		    "wrong command state %d\n",		    sc->name, cmd->state);		ub_state_done(sc, cmd, -EINVAL);		return;	}	return;Bad_End: /* Little Excel is dead */	ub_state_done(sc, cmd, -EIO);}/* * Factorization helper for the command state machine: * Initiate a data segment transfer. */static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd){	struct scatterlist *sg = &cmd->sgv[cmd->current_sg];	int pipe;	int rc;	UB_INIT_COMPLETION(sc->work_done);	if (cmd->dir == UB_DIR_READ)		pipe = sc->recv_bulk_pipe;	else		pipe = sc->send_bulk_pipe;	sc->last_pipe = pipe;	usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, sg_virt(sg),	    sg->length, ub_urb_complete, sc);	sc->work_urb.actual_length = 0;	sc->work_urb.error_count = 0;	sc->work_urb.status = 0;	if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {		/* XXX Clear stalls */		ub_complete(&sc->work_done);		ub_state_done(sc, cmd, rc);		return;	}	sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT;	add_timer(&sc->work_timer);	cmd->state = UB_CMDST_DATA;}/* * Factorization helper for the command state machine: * Finish the command. */static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc){	cmd->error = rc;	cmd->state = UB_CMDST_DONE;	ub_cmdq_pop(sc);	(*cmd->done)(sc, cmd);}/* * Factorization helper for the command state machine: * Submit a CSW read. */static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd){	int rc;	UB_INIT_COMPLETION(sc->work_done);	sc->last_pipe = sc->recv_bulk_pipe;	usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe,	    &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc);	sc->work_urb.actual_length = 0;	sc->work_urb.error_count = 0;	sc->work_urb.status = 0;	if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {		/* XXX Clear stalls */		ub_complete(&sc->work_done);		ub_state_done(sc, cmd, rc);		return -1;	}	sc->work_timer.expires = jiffies + UB_STAT_TIMEOUT;	add_timer(&sc->work_timer);	return 0;}/* * Factorization helper for the command state machine: * Submit a CSW read and go to STAT state. */static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd){	if (__ub_state_stat(sc, cmd) != 0)		return;	cmd->stat_count = 0;	cmd->state = UB_CMDST_STAT;}/* * Factorization helper for the command state machine: * Submit a CSW read and go to STAT state with counter (along [C] path). */static void ub_state_stat_counted(struct ub_dev *sc, struct ub_scsi_cmd *cmd){	if (++cmd->stat_count >= 4) {		ub_state_sense(sc, cmd);		return;	}	if (__ub_state_stat(sc, cmd) != 0)		return;	cmd->state = UB_CMDST_STAT;}/* * Factorization helper for the command state machine: * Submit a REQUEST SENSE and go to SENSE state. */static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd){	struct ub_scsi_cmd *scmd;	struct scatterlist *sg;	int rc;	if (cmd->cdb[0] == REQUEST_SENSE) {		rc = -EPIPE;		goto error;	}	scmd = &sc->top_rqs_cmd;	memset(scmd, 0, sizeof(struct ub_scsi_cmd));	scmd->cdb[0] = REQUEST_SENSE;	scmd->cdb[4] = UB_SENSE_SIZE;	scmd->cdb_len = 6;	scmd->dir = UB_DIR_READ;	scmd->state = UB_CMDST_INIT;	scmd->nsg = 1;	sg = &scmd->sgv[0];	sg_init_table(sg, UB_MAX_REQ_SG);	sg_set_page(sg, virt_to_page(sc->top_sense), UB_SENSE_SIZE,			(unsigned long)sc->top_sense & (PAGE_SIZE-1));	scmd->len = UB_SENSE_SIZE;	scmd->lun = cmd->lun;	scmd->done = ub_top_sense_done;	scmd->back = cmd;	scmd->tag = sc->tagcnt++;	cmd->state = UB_CMDST_SENSE;	ub_cmdq_insert(sc, scmd);	return;error:	ub_state_done(sc, cmd, rc);}/* * A helper for the command's state machine: * Submit a stall clear. */static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd,    int stalled_pipe){	int endp;	struct usb_ctrlrequest *cr;	int rc;	endp = usb_pipeendpoint(stalled_pipe);	if (usb_pipein (stalled_pipe))		endp |= USB_DIR_IN;	cr = &sc->work_cr;	cr->bRequestType = USB_RECIP_ENDPOINT;	cr->bRequest = USB_REQ_CLEAR_FEATURE;	cr->wValue = cpu_to_le16(USB_ENDPOINT_HALT);	cr->wIndex = cpu_to_le16(endp);	cr->wLength = cpu_to_le16(0);	UB_INIT_COMPLETION(sc->work_done);	usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe,	    (unsigned char*) cr, NULL, 0, ub_urb_complete, sc);	sc->work_urb.actual_length = 0;	sc->work_urb.error_count = 0;	sc->work_urb.status = 0;	if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {		ub_complete(&sc->work_done);		return rc;	}	sc->work_timer.expires = jiffies + UB_CTRL_TIMEOUT;	add_timer(&sc->work_timer);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 亚洲精品综合在线| 国产福利精品导航| 国产三级欧美三级日产三级99 | 亚洲理论在线观看| 色婷婷综合久久久中文字幕| 高清在线观看日韩| 欧美美女激情18p| 日本不卡不码高清免费观看| 欧美一区二区免费视频| 久久99精品网久久| 国产欧美精品一区二区色综合朱莉| 成人亚洲精品久久久久软件| 亚洲欧洲性图库| 欧美日韩精品是欧美日韩精品| 日韩高清不卡一区| 久久嫩草精品久久久精品一| av日韩在线网站| 亚洲成a人片综合在线| 日韩欧美在线1卡| 成人一道本在线| 午夜精品久久久久久久蜜桃app| 日韩欧美亚洲国产精品字幕久久久| 国内精品嫩模私拍在线| 中文字幕一区二区三区乱码在线| 色哟哟亚洲精品| 久久激情五月婷婷| 国产精品不卡一区| 欧美疯狂性受xxxxx喷水图片| 国内不卡的二区三区中文字幕| 欧美极品aⅴ影院| 欧美日韩国产天堂| 国产精品夜夜爽| 亚洲午夜在线视频| 国产人成一区二区三区影院| 欧美体内she精高潮| 国产一区二区伦理| 亚洲地区一二三色| 国产女人水真多18毛片18精品视频| 色婷婷国产精品久久包臀 | 亚洲精品视频一区二区| 日韩一区二区三区在线观看| 成人动漫中文字幕| 另类专区欧美蜜桃臀第一页| 亚洲另类在线制服丝袜| 久久综合久久综合久久| 欧美做爰猛烈大尺度电影无法无天| 国产一区亚洲一区| 亚洲国产成人va在线观看天堂| 久久九九国产精品| 精品久久一二三区| 7878成人国产在线观看| 91麻豆精品在线观看| 国产在线视频不卡二| 日韩一区精品字幕| 亚洲丶国产丶欧美一区二区三区| 一区在线播放视频| 中文字幕免费在线观看视频一区| 欧美一区二区网站| 欧美日本一道本在线视频| 一本色道久久加勒比精品| 国产成人av电影免费在线观看| 免费日本视频一区| 午夜精品视频在线观看| 精品乱码亚洲一区二区不卡| 国产精品一区三区| 久久精品久久99精品久久| 五月天亚洲婷婷| 亚洲一区视频在线| 亚洲精品成a人| 国产精品久久久久久妇女6080 | 亚洲精品一区二区三区四区高清 | 99精品欧美一区二区三区小说| 狠狠色丁香久久婷婷综合_中| 日韩电影免费在线观看网站| 亚洲第一会所有码转帖| 日韩在线卡一卡二| 性久久久久久久| 视频一区视频二区中文| 亚洲国产精品精华液网站| 亚洲一区二区三区不卡国产欧美| 亚洲三级免费观看| 一区二区高清视频在线观看| 亚洲欧美另类小说| 亚洲精品免费视频| 亚洲自拍另类综合| 午夜精品爽啪视频| 蜜桃视频一区二区| 国产真实乱对白精彩久久| 国产一区 二区 三区一级| 国产成a人无v码亚洲福利| 粉嫩av一区二区三区粉嫩| av在线不卡免费看| 欧亚一区二区三区| 欧美大胆人体bbbb| 亚洲精品在线观看网站| 国产精品网站在线| 一区二区三区精品视频在线| 亚洲国产精品久久久久婷婷884 | 日韩国产一二三区| 美国欧美日韩国产在线播放| 精品一区二区三区在线观看 | 色天天综合久久久久综合片| 欧洲精品一区二区三区在线观看| 91精品国产综合久久福利 | 成人动漫av在线| 日本久久电影网| 91麻豆精品国产自产在线观看一区 | 国产精品国产三级国产三级人妇| 中文字幕一区二区不卡| 亚洲福利一二三区| 欧美一区午夜精品| 精品久久五月天| 中文字幕一区二区三中文字幕| 亚洲妇女屁股眼交7| 激情综合五月天| 91色九色蝌蚪| 日韩欧美高清dvd碟片| 国产精品久久久久影院老司| 亚洲图片自拍偷拍| 国产精品一区2区| 91福利社在线观看| 久久嫩草精品久久久久| 一区二区成人在线观看| 精品一区二区三区影院在线午夜| aa级大片欧美| 欧美成人乱码一区二区三区| 国产精品精品国产色婷婷| 欧美a级理论片| 91麻豆免费看片| 日韩欧美一级在线播放| 一区二区三区四区中文字幕| 国产在线精品一区在线观看麻豆| 日本韩国欧美一区二区三区| 亚洲午夜激情av| 日韩欧美成人一区二区| 亚洲私人影院在线观看| 国产激情视频一区二区三区欧美| 91传媒视频在线播放| 久久久久久久电影| 日本欧美韩国一区三区| 99精品偷自拍| 中文字幕精品在线不卡| 久色婷婷小香蕉久久| 在线视频欧美区| 国产精品国产三级国产a | 日韩不卡一区二区| 99久久国产综合精品女不卡| 精品国产乱码久久久久久牛牛| 一区二区三区蜜桃| 99精品视频免费在线观看| 久久久久久亚洲综合影院红桃| 日韩中文字幕不卡| 欧美日韩一区二区三区高清| 亚洲视频一二三| av电影在线观看一区| 国产精品视频一区二区三区不卡| 久热成人在线视频| 欧美va亚洲va| 日韩亚洲欧美在线观看| 午夜精品福利在线| 欧美最猛黑人xxxxx猛交| 日韩美女精品在线| 99久久精品国产一区| 国产精品久久久久精k8 | 久久久午夜精品| 久久精品国产亚洲aⅴ| 91精品国产全国免费观看| 调教+趴+乳夹+国产+精品| 欧美裸体一区二区三区| 亚洲综合精品久久| 欧美手机在线视频| 偷拍亚洲欧洲综合| 盗摄精品av一区二区三区| 精品国产a毛片| 国产一区二区中文字幕| 精品乱码亚洲一区二区不卡| 国产中文字幕一区| 国产精品免费人成网站| youjizz久久| 亚洲精品中文字幕在线观看| 精品污污网站免费看| 日韩成人精品在线| 精品黑人一区二区三区久久| 国产盗摄一区二区三区| 国产精品全国免费观看高清| av激情成人网| 亚洲r级在线视频| 日韩免费看网站| 懂色av中文一区二区三区| 国产精品理论片| 色8久久精品久久久久久蜜| 日本亚洲免费观看| 久久噜噜亚洲综合| 91视频.com| 人禽交欧美网站| 中文字幕免费不卡| 欧美日韩第一区日日骚| 韩国女主播成人在线| 亚洲欧洲日韩av|