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

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

?? sw.c

?? 操作系統SunOS 4.1.3版本的源碼
?? C
字號:
/* * @(#)sw.c 1.1 92/07/30 Copyright (c) 1988 by Sun Microsystems, Inc. *//*#define SWDEBUG 	/* Allow compiling of debug code */#define REL4		/* Enable release 4 mods */#ifdef	REL4#include <sys/types.h>#include <sys/buf.h>#include <sun/dklabel.h>#include <sun/dkio.h>#include <stand/swreg.h>#include <stand/scsi.h>#include <stand/saio.h>#include <mon/sunromvec.h>#include <mon/idprom.h>#else REL4#include "../h/types.h"#include "../h/buf.h"#include "../sun/dklabel.h"#include "../sun/dkio.h"#include "swreg.h"#include "scsi.h"#include "saio.h"#include "../mon/sunromvec.h"#include "../mon/idprom.h"#endif REL4#ifdef SWDEBUG/* Handy debugging 0, 1, and 2 argument printfs */#define DPRINTF(str) \	if (scsi_debug > 1) printf(str)#define DPRINTF1(str, arg1) \	if (scsi_debug > 1) printf(str,arg1)#define DPRINTF2(str, arg1, arg2) \	if (scsi_debug > 1) printf(str,arg1,arg2)/* Handy extended error reporting 0, 1, and 2 argument printfs */#define EPRINTF(str) \	if (scsi_debug) printf(str)#define EPRINTF1(str, arg1) \	if (scsi_debug) printf(str,arg1)#define EPRINTF2(str, arg1, arg2) \	if (scsi_debug) printf(str,arg1,arg2)#else SWDEBUG#define DPRINTF(str)#define DPRINTF1(str, arg2)#define DPRINTF2(str, arg1, arg2)#define EPRINTF(str)#define EPRINTF1(str, arg2)#define EPRINTF2(str, arg1, arg2)#endif SWDEBUG#ifdef BOOTBLOCK#define SC_ERROR(str)#define SC_ERROR1(str, arg1)#else BOOTBLOCK#define SC_ERROR	printf#define SC_ERROR1	printf#endif BOOTBLOCK#define SHORT_RESET	0#define LONG_RESET	1/* * Low-level routines common to all devices on the SCSI bus. * * Interface to the routines in this module is via a second "h_sip" * structure contained in the caller's local variables. *//* How sw addresses look to the sun4/110 scsi dma hardware */#define	SW_COBRA_DMA_ADDR(x)	(((int)x)&0x00FFFFFF)/* * The interfaces we export */extern int scsi_debug;extern char *devalloc();extern char *resalloc();extern int nullsys();extern u_char sc_cdb_size[];int swopen(), swdoit(), sw_reset();#define	COBRA 1#define	SW_COBRA_BASE	0xfa000000#define SW_SIZE		0x4000#ifdef	sun4/* * Open the SCSI host adapter. */intswopen(h_sip)	register struct host_saioreq *h_sip;{	register int base;	struct idprom id;	enum MAPTYPES space;	DPRINTF("swopen:\n");	/* determine type of sw interface */	if (idprom(IDFORM_1, &id) == IDFORM_1  &&	    h_sip->ctlr == 0  &&	    id.id_machine == IDM_SUN4_COBRA) {		EPRINTF("swopen: CPU SCSI\n");		base = SW_COBRA_BASE;		space = MAP_OBIO;	} else {		DPRINTF("swopen: failed\n");		return (-1);	}	/* Map in device registers */	h_sip->devaddr = devalloc(space, (char *)base, 	    sizeof(struct scsi_sw_reg));	if ((int)h_sip->devaddr == 0) {		EPRINTF("swopen: devalloc failure\n");		return (-2);	}	/* Allocate dma resources */	h_sip->dmaaddr = 0;	/* Link top level driver to host adapter */	h_sip->doit = swdoit;	h_sip->reset = sw_reset;	sw_reset(h_sip, SHORT_RESET);	return (0);}/* * Write a command to the SCSI bus. * * The supplied sip is the one opened by swopen(). * DMA is done based on sip->si_ma and sip->si_cc. * * Returns -1 for error, otherwise returns the residual count not DMAed * (zero for success). * */static intswdoit(cdb, scb, h_sip)	struct scsi_cdb *cdb;	struct scsi_scb *scb;	register struct host_saioreq *h_sip;	/* sip for host adapter */{	register struct scsi_sw_reg *swr;	register char junk;	register u_char *cp;	u_char size;	register int i, b;	DPRINTF("swdoit:\n");	/* Get to scsi control logic registers */	swr = (struct scsi_sw_reg *) h_sip->devaddr;	DPRINTF1("swdoit: swr= 0x%x\n", (int)swr);	if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_BSY,	    SCSI_SHORT_DELAY, 0) == 0) {		SC_ERROR("sw: bus busy\n");		goto FAILED;	}	/* Select target */	DPRINTF1("swdoit: unit= 0x%x\n", h_sip->unit);	SBC_WR.odr = (1 << h_sip->unit) | SI_HOST_ID;	SBC_WR.icr = SBC_ICR_DATA;	SBC_WR.icr |= SBC_ICR_SEL;	/* Wait for target to acknowledge our selection */	if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_BSY,	    SCSI_SEL_DELAY, 1) == 0) {		EPRINTF1("sw: device offline, cbsr= 0x%x\n", SBC_RD.cbsr);		SBC_WR.icr = 0;		return (-2);	}	SBC_WR.icr = 0;	/* Do initial dma setup */	swr->bcr = 0;	/* also reset dma_count for vme */	if (h_sip->cc > 0) {		if (h_sip->dma_dir == SC_RECV_DATA) {			DPRINTF("swdoit: DMA receive\n");			swr->csr &= ~SI_CSR_SEND;		} else {			DPRINTF("swdoit: DMA send\n");			swr->csr |= SI_CSR_SEND;		}	}	/* Put command onto scsi bus */	cp = (u_char *)cdb;	size = sc_cdb_size[CDB_GROUPID(*cp)];	if (sw_putbyte(swr, PHASE_COMMAND, cp, size) == 0) {		SC_ERROR("sw: cmd put failed\n");		goto FAILED;	}	if (h_sip->cc > 0) {		DPRINTF("swdoit: dma enable\n");		/* Finish dma setup and wait for dma completion */		if (((int)h_sip->ma & 1) || ((int)h_sip->ma & 2)) {			SC_ERROR("sw: illegal odd dma starting address\n");			goto FAILED;		}		SET_DMA_ADDR(swr, SW_COBRA_DMA_ADDR(h_sip->ma));		SET_DMA_COUNT(swr, h_sip->cc);		sw_dma_setup(swr, h_sip);	/* No dma, wait for target to request a byte */	} else if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_REQ,		   SCSI_LONG_DELAY, 1) == 0) {		SC_ERROR("sw: target never set REQ\n");		goto FAILED;	}	/* Get status */	junk = SBC_RD.clr;#ifdef	lint	junk = junk;#endif	lint	cp = (u_char *)scb;	cp[0] = sw_getbyte(swr, PHASE_STATUS);	b = sw_getbyte(swr, PHASE_MSG_IN);	if (b != SC_COMMAND_COMPLETE) {		EPRINTF("swdoit: no cmd complete msg\n");		/* If b < 0, sw_getbyte already printed msg */		if (b >= 0)			SC_ERROR("sw: invalid message\n");		goto FAILED;	}	/* Compute number of bytes actually transferred. */	if (h_sip->cc == 0)		return (0);	i = SW_COBRA_DMA_ADDR(swr->dma_addr | 0xFF000000);	return ( (int)(i - SW_COBRA_DMA_ADDR(h_sip->ma)) );FAILED:	EPRINTF("swdoit: failed\n");	sw_reset(h_sip, LONG_RESET);	return (-1);}static intsw_dma_setup(swr, h_sip)	register struct scsi_sw_reg *swr;	register struct host_saioreq *h_sip;{       	register char junk;	register char *cp;	DPRINTF("sw_dma_setup:\n");	/* setup sbc and start dma */	SBC_WR.mr |= SBC_MR_DMA;	if (h_sip->dma_dir == SC_RECV_DATA) {		SBC_WR.tcr = TCR_DATA_IN;		SBC_WR.ircv = 0;	} else {		SBC_WR.tcr = TCR_DATA_OUT;		SBC_WR.icr = SBC_ICR_DATA;		SBC_WR.send = 0;	}	swr->csr |= SI_CSR_DMA_EN;	/* wait for dma completion */	if (sw_wait(&swr->csr, 	    SI_CSR_SBC_IP | SI_CSR_DMA_CONFLICT | SI_CSR_DMA_BUS_ERR, 1) == 0) {		SC_ERROR("sw: dma never completed\n");		swr->csr &= ~SI_CSR_DMA_EN;		sw_dma_cleanup(swr);		goto FAILED;	}	/* check reason for dma completion */	if (swr->csr & SI_CSR_SBC_IP) {			/* dma operation should end with a phase mismatch */		swr->csr &= ~SI_CSR_DMA_EN;		(void) sw_sbc_wait((caddr_t)&SBC_RD.bsr, SBC_BSR_PMTCH,			SCSI_SHORT_DELAY, 0);	} else {		swr->csr &= ~SI_CSR_DMA_EN;		if (swr->csr & SI_CSR_DMA_CONFLICT) {			SC_ERROR("sw: illegal reg access during dma\n");		} else if (swr->csr & SI_CSR_DMA_BUS_ERR) {				SC_ERROR("sw: bus error during dma\n");		} else {			SC_ERROR("sw: dma overrun\n");		}		sw_dma_cleanup(swr);		goto FAILED;	}	/* handle special dma recv situations */	if (h_sip->dma_dir == SC_RECV_DATA) {		cp = (char *)((swr->dma_addr&0xFFFFFC) | 0xff000000);		switch (swr->dma_addr & 0x3) {		    case 3:			    *cp = (swr->bpr & 0xff000000) >> 24;			    *(cp + 1) = (swr->bpr & 0x00ff0000) >> 16;			    *(cp + 2) = (swr->bpr & 0x0000ff00) >> 8;			    break;		    case 2:			    *cp = (swr->bpr & 0xff000000) >> 24;			    *(cp + 1) = (swr->bpr & 0x00ff0000) >> 16;			    break;		    case 1:			    *cp = (swr->bpr & 0xff000000) >> 24;			    break;		}	}	/* clear sbc interrupt */	junk = SBC_RD.clr;#ifdef	lint	junk = junk;#endif	lint	/* Cleanup after a dma operation */	sw_dma_cleanup(swr);FAILED:	return;}/* * Reset some register information after a dma operation. */static intsw_dma_cleanup(swr)	register struct scsi_sw_reg *swr;{	DPRINTF("sw_dma_cleanup:\n");	swr->csr &= ~SI_CSR_DMA_EN;	SBC_WR.mr &= ~SBC_MR_DMA;	SBC_WR.icr = 0;	SBC_WR.tcr = 0;}/* * Wait for a condition to be (de)asserted. */static intsw_wait(reg, cond, set)	register u_int *reg;	register u_int cond;	register int set;{	register int i;	register u_int regval;	for (i = 0; i < SCSI_LONG_DELAY; i++) {		regval = *reg;		if ((set == 1) && (regval & cond)) {			return (1);		}		if ((set == 0) && !(regval & cond)) {			return (1);		} 		DELAY(10);	}	return (0);}/* * Wait for a condition to be (de)asserted on the scsi bus. */static intsw_sbc_wait(reg, cond, delay, set)	register caddr_t reg;	register u_char cond;	register int delay;	register int set;{	register int i;	register u_char regval;	DPRINTF("sw_sbc_wait:\n");	for (i = 0; i < delay; i++) {		regval = *reg;		if ((set == 1) && (regval & cond)) {			return (1);		}		if ((set == 0) && !(regval & cond)) {			return (1);		} 		DELAY(10);	}	return (0);}/* * Put a byte onto the scsi bus. */static intsw_putbyte(swr, phase, data, num)	register struct scsi_sw_reg *swr;	register u_short phase;	register u_char *data;	register u_char num;{	register int i;	u_char icr;	DPRINTF("sw_putbyte:\n");	/* Set up tcr so a phase match will occur */	swr->sbc_wreg.tcr = phase >> 2;	icr = SBC_WR.icr;	/* Put all desired bytes onto scsi bus */	for (i = 0; i < num; i++) {		SBC_WR.icr = icr | SBC_ICR_DATA; /* clear ack */		/* Wait for target to request a byte */		if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_REQ,			SCSI_SHORT_DELAY, 1) == 0) {			SC_ERROR1("sw: REQ not active, cbsr 0x%x\n",				SBC_RD.cbsr);			return (0);		}		/* Load data for transfer */		SBC_WR.odr = *data++;		/* Complete req/ack handshake */		SBC_WR.icr |= SBC_ICR_ACK;		if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_REQ,			SCSI_SHORT_DELAY, 0) == 0) {			SC_ERROR("sw: target never released REQ\n");			return (0);		}	}	SBC_WR.tcr = 0;	SBC_WR.icr = 0;	return (1);}/* * Get a byte from the scsi bus. */static intsw_getbyte(swr, phase)	register struct scsi_sw_reg *swr;	register u_short phase;{	register u_char data;	DPRINTF("sw_getbyte:\n");	/* Wait for target request */	if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_REQ,		SCSI_SHORT_DELAY, 1) == 0) {		SC_ERROR1("sw: REQ not active, cbsr 0x%x\n",			SBC_RD.cbsr);		SBC_WR.tcr = 0;		return (-1);	}	/* Check for correct phase on scsi bus */	if (phase != (SBC_RD.cbsr & CBSR_PHASE_BITS)) {		SC_ERROR1("sw: wrong phase, cbsr 0x%x\n",			SBC_RD.cbsr);		return (-1);	}	/* Grab data */	data = SBC_RD.cdr;	SBC_WR.icr = SBC_ICR_ACK;	/* Complete req/ack handshake */	if (sw_sbc_wait((caddr_t)&SBC_RD.cbsr, SBC_CBSR_REQ,		SCSI_SHORT_DELAY, 0) == 0) {		SC_ERROR("sw: target never released REQ\n");		SBC_WR.icr = 0;		return (-1);	}	SBC_WR.icr = 0;		/* Clear ack */	return (data);}/* * Reset SCSI control logic. */static intsw_reset(h_sip, flag)	register struct host_saioreq *h_sip;	int flag;{	register struct scsi_sw_reg *swr;	register char junk;	EPRINTF("sw_reset:\n");	swr = (struct scsi_sw_reg *) h_sip->devaddr;	/* Reset bcr, fifo, udc, and sbc */	swr->csr = 0;	DELAY(10);	swr->csr = SI_CSR_SCSI_RES | SI_CSR_FIFO_RES;	SET_DMA_ADDR(swr, 0);	SET_DMA_COUNT(swr, 0);	/* Issue scsi bus reset */	if (flag != SHORT_RESET) {		SBC_WR.icr = SBC_ICR_RST;		DELAY(100);		SBC_WR.icr = 0;		SBC_WR.tcr = 0;		SBC_WR.mr = 0;		junk = SBC_RD.clr;#ifdef		lint		junk = junk;#endif		lint		DELAY(SCSI_RESET_DELAY);	/* Recovery time */	}}#endif	sun4

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区日韩| 日韩一区在线免费观看| 91丨porny丨首页| 美日韩一区二区| 亚洲综合成人在线视频| 国产婷婷色一区二区三区在线| 在线免费观看视频一区| 福利一区二区在线| 捆绑紧缚一区二区三区视频| 亚洲精品大片www| 国产午夜精品一区二区三区四区| 制服丝袜亚洲播放| 色老汉av一区二区三区| 国产成人精品三级| 久久国产成人午夜av影院| 亚洲图片欧美综合| 国产精品二三区| 欧美国产激情二区三区| 欧美大片国产精品| 91精品国产麻豆| 欧美日韩在线精品一区二区三区激情 | 亚洲国产aⅴ成人精品无吗| 久久久久久久久久久久电影 | 亚洲美女一区二区三区| 久久久久久黄色| 精品欧美乱码久久久久久1区2区| 欧美四级电影网| 日本韩国视频一区二区| 99国产精品久| 99视频精品全部免费在线| 国产精品一区二区久激情瑜伽| 蜜臀91精品一区二区三区| 午夜电影网一区| 亚洲成人午夜电影| 五月天激情小说综合| 一区二区三区精品视频在线| 亚洲日本乱码在线观看| 国产精品高潮久久久久无| 国产精品久久影院| 中文字幕一区二区三区av| 一区视频在线播放| 最新成人av在线| 一区二区三区欧美| 亚洲成人av免费| 丝袜亚洲另类丝袜在线| 日韩在线一区二区| 麻豆91免费看| 国产一区二区久久| yourporn久久国产精品| 91原创在线视频| 欧洲一区在线电影| 正在播放亚洲一区| 精品久久久久久亚洲综合网| 久久先锋影音av| 中文字幕第一区二区| 亚洲精品日产精品乱码不卡| 亚洲电影一级片| 精品中文字幕一区二区| 国产精一区二区三区| 不卡电影免费在线播放一区| 91美女在线视频| 欧美日韩视频在线第一区| 91精品国模一区二区三区| 日韩美女视频在线| 中文字幕精品一区二区精品绿巨人 | 成人精品gif动图一区| 91蝌蚪国产九色| 91超碰这里只有精品国产| ww亚洲ww在线观看国产| 1区2区3区国产精品| 亚洲第一成人在线| 国产精品一二三四五| 99精品在线免费| 欧美日韩一区三区| 精品国产不卡一区二区三区| 亚洲日本欧美天堂| 老司机免费视频一区二区三区| 成人精品国产一区二区4080| 欧美日韩不卡一区二区| 久久综合久久99| 亚洲一区二区偷拍精品| 寂寞少妇一区二区三区| 91蝌蚪porny九色| 日韩精品一区二区三区视频在线观看 | 亚洲乱码中文字幕| 精品一区二区三区在线播放视频| 欧美三区在线视频| 国产日韩精品一区二区三区在线| 中文字幕中文字幕一区| 午夜不卡在线视频| 中文天堂在线一区| 三级成人在线视频| 成人午夜电影小说| 欧美一区二区大片| 亚洲色图另类专区| 精品亚洲成a人| 欧美亚洲高清一区| 亚洲另类在线视频| 韩国av一区二区| 欧美高清一级片在线| 国产精品久久久久影院| 麻豆精品一区二区| 欧美日韩在线播| 亚洲天天做日日做天天谢日日欢| 久久超碰97中文字幕| 欧美色视频在线观看| 国产福利精品一区| 久久久亚洲精品一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 欧美丰满高潮xxxx喷水动漫| 亚洲色图都市小说| 欧美xxxx老人做受| 成人免费看片app下载| 国产精品久久久久久妇女6080| 色噜噜夜夜夜综合网| 夜夜嗨av一区二区三区四季av| 欧洲人成人精品| 一区二区日韩av| www.成人网.com| 亚洲精品成人少妇| 欧美日韩国产天堂| 五月激情综合婷婷| 欧美一区二区在线视频| 亚洲一区二区综合| 3751色影院一区二区三区| 午夜视频在线观看一区| 91精品啪在线观看国产60岁| 亚洲国产精品一区二区www在线 | 国产精品亚洲午夜一区二区三区| 欧洲人成人精品| 日本少妇一区二区| www激情久久| 成人午夜激情在线| 亚洲激情男女视频| 欧美理论电影在线| 国产一区二区三区四区五区美女 | 日韩高清在线观看| 不卡电影一区二区三区| 欧美韩国日本不卡| 亚洲人吸女人奶水| 丝袜诱惑亚洲看片| 在线中文字幕一区| 久久久久久久网| 国产精品一区二区免费不卡 | 欧美激情中文不卡| 丰满少妇在线播放bd日韩电影| 26uuu亚洲婷婷狠狠天堂| 激情六月婷婷久久| 555www色欧美视频| 男男成人高潮片免费网站| 一区二区三区四区国产精品| 精品少妇一区二区三区在线视频| 欧美一级夜夜爽| 丰满白嫩尤物一区二区| 视频一区二区三区中文字幕| 日韩你懂的在线观看| 国产欧美精品国产国产专区| 国产精品美女久久久久久久久久久 | 一区二区三区免费| 欧美性一二三区| 首页国产丝袜综合| 精品sm捆绑视频| 99久久精品免费观看| 亚洲高清中文字幕| 精品国产精品一区二区夜夜嗨 | 91精品婷婷国产综合久久竹菊| 欧美aaa在线| 日韩午夜中文字幕| 成人午夜激情影院| 午夜精品视频一区| 色综合久久中文字幕综合网| 三级在线观看一区二区| 久久久精品综合| 欧美亚一区二区| 国产在线精品一区在线观看麻豆| 亚洲欧美在线另类| 91麻豆精品国产自产在线观看一区| 国产一区二三区好的| 亚洲女同一区二区| 日韩视频在线永久播放| 波波电影院一区二区三区| 国产精品丝袜久久久久久app| 2024国产精品视频| 蜜桃精品视频在线观看| 色综合天天性综合| 欧美日韩一区二区电影| 91精品在线一区二区| 欧美精品一区二区三区蜜臀| 国产精品无人区| 夜夜夜精品看看| 久久激五月天综合精品| 豆国产96在线|亚洲| 91麻豆高清视频| 久久伊99综合婷婷久久伊| 亚洲国产综合91精品麻豆| 99国产精品99久久久久久| 亚洲免费看黄网站| 日韩美女视频在线| 在线精品亚洲一区二区不卡| 国产成人亚洲综合a∨猫咪|