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

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

?? ipmi_bt_sm.c

?? linux-2.6.15.6
?? C
?? 第 1 頁 / 共 2 頁
字號:
	if (bt_debug & BT_DEBUG_MSG) {    		printk(KERN_WARNING "BT: write %d bytes seq=0x%02X",			bt->write_count, bt->seq);		for (i = 0; i < bt->write_count; i++)			printk (" %02x", bt->write_data[i]);		printk ("\n");	}	for (i = 0; i < bt->write_count; i++)	       HOST2BMC(bt->write_data[i]);}static inline int read_all_bytes(struct si_sm_data *bt){	unsigned char i;	bt->read_data[0] = BMC2HOST;	bt->read_count = bt->read_data[0];	if (bt_debug & BT_DEBUG_MSG)    		printk(KERN_WARNING "BT: read %d bytes:", bt->read_count);	/* minimum: length, NetFn, Seq, Cmd, cCode == 5 total, or 4 more	   following the length byte. */	if (bt->read_count < 4 || bt->read_count >= IPMI_MAX_MSG_LENGTH) {		if (bt_debug & BT_DEBUG_MSG)			printk("bad length %d\n", bt->read_count);		bt->truncated = 1;		return 1;	/* let next XACTION START clean it up */	}	for (i = 1; i <= bt->read_count; i++)	       bt->read_data[i] = BMC2HOST;	bt->read_count++;	/* account for the length byte */	if (bt_debug & BT_DEBUG_MSG) {	    	for (i = 0; i < bt->read_count; i++)			printk (" %02x", bt->read_data[i]);	    	printk ("\n");	}	if (bt->seq != bt->write_data[2])	/* idiot check */		printk(KERN_DEBUG "BT: internal error: sequence mismatch\n");	/* per the spec, the (NetFn, Seq, Cmd) tuples should match */	if ((bt->read_data[3] == bt->write_data[3]) &&		/* Cmd */        	(bt->read_data[2] == bt->write_data[2]) &&	/* Sequence */        	((bt->read_data[1] & 0xF8) == (bt->write_data[1] & 0xF8)))			return 1;	if (bt_debug & BT_DEBUG_MSG)	       printk(KERN_WARNING "BT: bad packet: "		"want 0x(%02X, %02X, %02X) got (%02X, %02X, %02X)\n",		bt->write_data[1], bt->write_data[2], bt->write_data[3],		bt->read_data[1],  bt->read_data[2],  bt->read_data[3]);	return 0;}/* Modifies bt->state appropriately, need to get into the bt_event() switch */static void error_recovery(struct si_sm_data *bt, char *reason){	unsigned char status;	char buf[40]; /* For getting status */	bt->timeout = BT_NORMAL_TIMEOUT; /* various places want to retry */	status = BT_STATUS;	printk(KERN_DEBUG "BT: %s in %s %s\n", reason, STATE2TXT,	       STATUS2TXT(buf));	(bt->error_retries)++;	if (bt->error_retries > BT_RETRY_LIMIT) {		printk(KERN_DEBUG "retry limit (%d) exceeded\n", BT_RETRY_LIMIT);		bt->state = BT_STATE_HOSED;		if (!bt->nonzero_status)			printk(KERN_ERR "IPMI: BT stuck, try power cycle\n");		else if (bt->error_retries <= BT_RETRY_LIMIT + 1) {			printk(KERN_DEBUG "IPMI: BT reset (takes 5 secs)\n");        		bt->state = BT_STATE_RESET1;		}	return;	}	/* Sometimes the BMC queues get in an "off-by-one" state...*/	if ((bt->state == BT_STATE_B2H_WAIT) && (status & BT_B2H_ATN)) {    		printk(KERN_DEBUG "retry B2H_WAIT\n");		return;	}	printk(KERN_DEBUG "restart command\n");	bt->state = BT_STATE_RESTART;}/* Check the status and (possibly) advance the BT state machine.  The   default return is SI_SM_CALL_WITH_DELAY. */static enum si_sm_result bt_event(struct si_sm_data *bt, long time){	unsigned char status;	char buf[40]; /* For getting status */	int i;	status = BT_STATUS;	bt->nonzero_status |= status;	if ((bt_debug & BT_DEBUG_STATES) && (bt->state != bt->last_state))		printk(KERN_WARNING "BT: %s %s TO=%ld - %ld \n",			STATE2TXT,			STATUS2TXT(buf),			bt->timeout,			time);	bt->last_state = bt->state;	if (bt->state == BT_STATE_HOSED)	       return SI_SM_HOSED;	if (bt->state != BT_STATE_IDLE) {	/* do timeout test */		bt->timeout -= time;		if ((bt->timeout < 0) && (bt->state < BT_STATE_RESET1)) {			error_recovery(bt, "timed out");			return SI_SM_CALL_WITHOUT_DELAY;		}	}	switch (bt->state) {    	case BT_STATE_IDLE:	/* check for asynchronous messages */		if (status & BT_SMS_ATN) {			BT_CONTROL(BT_SMS_ATN);	/* clear it */			return SI_SM_ATTN;		}		return SI_SM_IDLE;	case BT_STATE_XACTION_START:		if (status & BT_H_BUSY) {			BT_CONTROL(BT_H_BUSY);			break;		}    		if (status & BT_B2H_ATN)		       break;		bt->state = BT_STATE_WRITE_BYTES;		return SI_SM_CALL_WITHOUT_DELAY;	/* for logging */	case BT_STATE_WRITE_BYTES:		if (status & (BT_B_BUSY | BT_H2B_ATN))		       break;		BT_CONTROL(BT_CLR_WR_PTR);		write_all_bytes(bt);		BT_CONTROL(BT_H2B_ATN);	/* clears too fast to catch? */		bt->state = BT_STATE_WRITE_CONSUME;		return SI_SM_CALL_WITHOUT_DELAY; /* it MIGHT sail through */	case BT_STATE_WRITE_CONSUME: /* BMCs usually blow right thru here */        	if (status & (BT_H2B_ATN | BT_B_BUSY))		       break;		bt->state = BT_STATE_B2H_WAIT;		/* fall through with status */	/* Stay in BT_STATE_B2H_WAIT until a packet matches.  However, spinning	   hard here, constantly reading status, seems to hold off the	   generation of B2H_ATN so ALWAYS return CALL_WITH_DELAY. */	case BT_STATE_B2H_WAIT:    		if (!(status & BT_B2H_ATN))		       break;		/* Assume ordered, uncached writes: no need to wait */		if (!(status & BT_H_BUSY))		       BT_CONTROL(BT_H_BUSY); /* set */		BT_CONTROL(BT_B2H_ATN);		/* clear it, ACK to the BMC */		BT_CONTROL(BT_CLR_RD_PTR);	/* reset the queue */		i = read_all_bytes(bt);		BT_CONTROL(BT_H_BUSY);		/* clear */		if (!i)				/* Try this state again */		       break;		bt->state = BT_STATE_READ_END;		return SI_SM_CALL_WITHOUT_DELAY;	/* for logging */    	case BT_STATE_READ_END:		/* I could wait on BT_H_BUSY to go clear for a truly clean		   exit.  However, this is already done in XACTION_START		   and the (possible) extra loop/status/possible wait affects		   performance.  So, as long as it works, just ignore H_BUSY */#ifdef MAKE_THIS_TRUE_IF_NECESSARY		if (status & BT_H_BUSY)		       break;#endif		bt->seq++;		bt->state = BT_STATE_IDLE;		return SI_SM_TRANSACTION_COMPLETE;	case BT_STATE_RESET1:    		reset_flags(bt);    		bt->timeout = BT_RESET_DELAY;		bt->state = BT_STATE_RESET2;		break;	case BT_STATE_RESET2:		/* Send a soft reset */		BT_CONTROL(BT_CLR_WR_PTR);		HOST2BMC(3);		/* number of bytes following */		HOST2BMC(0x18);		/* NetFn/LUN == Application, LUN 0 */		HOST2BMC(42);		/* Sequence number */		HOST2BMC(3);		/* Cmd == Soft reset */		BT_CONTROL(BT_H2B_ATN);		bt->state = BT_STATE_RESET3;		break;	case BT_STATE_RESET3:		if (bt->timeout > 0)		       return SI_SM_CALL_WITH_DELAY;		bt->state = BT_STATE_RESTART;	/* printk in debug modes */		break;	case BT_STATE_RESTART:		/* don't reset retries! */		reset_flags(bt);		bt->write_data[2] = ++bt->seq;		bt->read_count = 0;		bt->nonzero_status = 0;		bt->timeout = BT_NORMAL_TIMEOUT;		bt->state = BT_STATE_XACTION_START;		break;	default:	/* HOSED is supposed to be caught much earlier */		error_recovery(bt, "internal logic error");		break;  	}  	return SI_SM_CALL_WITH_DELAY;}static int bt_detect(struct si_sm_data *bt){	/* It's impossible for the BT status and interrupt registers to be	   all 1's, (assuming a properly functioning, self-initialized BMC)	   but that's what you get from reading a bogus address, so we	   test that first.  The calling routine uses negative logic. */	if ((BT_STATUS == 0xFF) && (BT_INTMASK_R == 0xFF))	       return 1;	reset_flags(bt);	return 0;}static void bt_cleanup(struct si_sm_data *bt){}static int bt_size(void){	return sizeof(struct si_sm_data);}struct si_sm_handlers bt_smi_handlers ={	.init_data         = bt_init_data,	.start_transaction = bt_start_transaction,	.get_result        = bt_get_result,	.event             = bt_event,	.detect            = bt_detect,	.cleanup           = bt_cleanup,	.size              = bt_size,};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
heyzo一本久久综合| 日韩av不卡在线观看| 国产91精品露脸国语对白| 精品人在线二区三区| 久久精品久久99精品久久| 欧美一区二区三区免费视频 | 久久久久久电影| 国产在线精品国自产拍免费| 久久五月婷婷丁香社区| 国产不卡免费视频| 亚洲欧美自拍偷拍| 99视频热这里只有精品免费| 洋洋成人永久网站入口| 91精品国产综合久久精品app | 欧洲亚洲国产日韩| 午夜精品久久一牛影视| 日韩精品一区二区三区在线观看| 美国十次了思思久久精品导航| 国产亚洲一区二区三区在线观看| 99久久精品免费观看| 三级在线观看一区二区| 日韩欧美色电影| 99国产精品久久久久久久久久久| 亚洲地区一二三色| 久久一日本道色综合| 9久草视频在线视频精品| 三级影片在线观看欧美日韩一区二区| 欧美v亚洲v综合ⅴ国产v| 岛国一区二区在线观看| 亚洲国产精品自拍| 欧美精品一区二区久久久 | 91在线免费看| 日日夜夜精品免费视频| 国产亚洲欧洲一区高清在线观看| 99久久精品国产一区| 午夜a成v人精品| 欧美国产激情一区二区三区蜜月| 欧美日产国产精品| 精品久久久久久久久久久久久久久| 国产精品夜夜爽| 亚洲成人综合网站| 国产欧美一区二区精品秋霞影院 | 《视频一区视频二区| 日韩丝袜美女视频| 色狠狠综合天天综合综合| 久久99精品国产| 亚洲最大成人综合| 久久久久久亚洲综合影院红桃 | 中文一区二区在线观看| 69堂国产成人免费视频| 色狠狠桃花综合| 国产成人免费视频网站| 欧美在线观看一区| 中文字幕在线不卡视频| 高清不卡一区二区| 欧美tk—视频vk| 成人做爰69片免费看网站| 亚洲视频在线一区| 精品国产1区2区3区| 一区二区三区视频在线观看| 亚洲国产精品久久久久秋霞影院| 久久精品亚洲麻豆av一区二区 | 91免费看`日韩一区二区| 狠狠色狠狠色综合| 亚洲成人福利片| 欧美系列在线观看| 国产一区久久久| 五月天亚洲婷婷| 欧美一区二区三区白人| 午夜精品久久久久久久| 欧美亚洲综合另类| 亚洲综合在线第一页| 国产喂奶挤奶一区二区三区| 97精品久久久久中文字幕| 国产98色在线|日韩| 日韩高清不卡在线| 国产91精品久久久久久久网曝门| 亚洲国产综合91精品麻豆| 欧美xxxxx牲另类人与| 欧美日韩一区二区三区免费看| 蜜桃视频在线一区| 欧美国产禁国产网站cc| 欧美一区在线视频| 99久久免费精品| 国产成人h网站| 成人h精品动漫一区二区三区| 婷婷一区二区三区| 色悠悠久久综合| 亚洲国产va精品久久久不卡综合| 国产欧美日韩久久| 欧美日韩国产一区| 激情文学综合丁香| 中文字幕 久热精品 视频在线| 欧美在线不卡一区| 婷婷成人综合网| 亚洲自拍与偷拍| 国产精品一区免费在线观看| 久久精品国产精品亚洲综合| 青青草伊人久久| 丝袜亚洲精品中文字幕一区| 精品国产sm最大网站免费看 | 亚洲午夜电影网| 中文字幕一区二区三区精华液 | 美国毛片一区二区三区| 亚洲精品日日夜夜| 日韩av中文在线观看| 日本不卡视频一二三区| 日韩国产成人精品| 欧美一区二区美女| 91免费小视频| 欧美日韩亚洲综合一区| 91精品国产欧美一区二区18| 精品日韩在线观看| 国产精品久久久久一区| 亚洲精品一二三四区| 日本欧美一区二区三区| 国产成人精品免费在线| 欧美这里有精品| 久久久久久久久久久久电影| 亚洲最新视频在线观看| 国产一区二区中文字幕| 欧美优质美女网站| 久久久精品免费免费| 亚洲成在线观看| 国产99一区视频免费| 337p亚洲精品色噜噜噜| 最新久久zyz资源站| 久久精品国产77777蜜臀| 色女孩综合影院| 久久免费看少妇高潮| 日韩制服丝袜先锋影音| 波波电影院一区二区三区| 欧美一区二区精品久久911| 综合av第一页| 国产精品综合视频| 91精品国产综合久久久久| 日韩毛片精品高清免费| 国产白丝精品91爽爽久久| 欧美一区二区三区啪啪| 亚洲一区二区免费视频| 丁香婷婷综合色啪| 欧美电影免费观看完整版| 亚洲最大成人网4388xx| 99re亚洲国产精品| 日韩国产在线观看| 亚洲国产一二三| 97精品超碰一区二区三区| 美女一区二区视频| 99视频一区二区三区| 久久久91精品国产一区二区精品| 日韩高清一级片| 欧美日韩国产首页| 亚洲黄色小说网站| a级精品国产片在线观看| 国产清纯在线一区二区www| 久久99国产精品久久| 欧美一二三四区在线| 舔着乳尖日韩一区| 欧美亚洲图片小说| 亚洲一区在线视频| 欧美三级蜜桃2在线观看| 亚洲精品菠萝久久久久久久| 91视频免费看| 亚洲色图制服诱惑| 色美美综合视频| 亚洲一区在线观看视频| 欧美日韩中文精品| 亚洲精品免费在线| 在线一区二区视频| 亚洲一区二区成人在线观看| 色综合久久中文综合久久牛| 综合久久久久综合| 在线观看免费成人| 亚洲图片欧美色图| 欧美色图片你懂的| 亚洲福利国产精品| 欧美一区二区三区精品| 久久不见久久见免费视频1| 精品久久久久久无| 丁香婷婷综合色啪| 亚洲精品乱码久久久久久黑人 | jlzzjlzz亚洲女人18| 自拍偷在线精品自拍偷无码专区 | 国产99久久精品| 国产精品丝袜黑色高跟| 色综合久久六月婷婷中文字幕| 亚洲乱码国产乱码精品精98午夜| 91久久一区二区| 轻轻草成人在线| 久久久久久麻豆| av高清久久久| 亚洲综合激情另类小说区| 538在线一区二区精品国产| 精品一区二区三区久久| 久久精品网站免费观看| 91捆绑美女网站| 日韩成人免费看| 国产亚洲视频系列| 欧美专区日韩专区| 国产乱子伦一区二区三区国色天香|