⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 5 页
字号:
			    /* 			     * lets see if the mode select parameter length 			     * is valid			     * We must build it by hand...........			    */			    if( todp->opt_flags & MSEL_PLL_VAL){				sc->sz_modsel.pll = todp->msel_pll;				if( todp->opt_flags & MSEL_BLKDL_VAL){				    sc->sz_modsel.rdeclen = todp->msel_blkdl;				}				if( todp->opt_flags & MSEL_VUL_VAL){				    sc->sz_modsel.vulen = todp->msel_vul;				}			    /* end of if MSEL_PLL_VAL */			    }			    else{				/* 				 * no sense in testing anything else				 * default to hdr and block ( 12 )				*/				sc->sz_modsel.pll = 12;				sc->sz_modsel.rdeclen = 8;				/* ERRLOG_MARK */				cprintf("scsi OPTTABLE off id = %X\n", targid);			    }			    /* 			     * get our density struct pointer...			    */			    ddp = &todp->tape_info[DENS_IDX( bp )];			    /* 			     * lets see if this density selection is valid..			    */			    if( ddp->tape_flags & DENS_VAL ){				/*				 * this is valid lets get our stuff				*/				sc->sz_modsel.density = 					(char)(SCSI_DENS_MASK & ddp->dens);								/*				 * must set our block size......				*/				sc->sz_modsel.reclen2 = LTOB(ddp->blk_size,2);				sc->sz_modsel.reclen1 = LTOB(ddp->blk_size,1);				sc->sz_modsel.reclen0 = LTOB(ddp->blk_size,0);			    }			    /*			     * well we have a option table but this density			     * struct is not valid.... We must do something			     * but is it QIC 9trk 8mm etc... 			    */			    else {				/* ERRLOG_MARK */				cprintf("scsi OPTTABLE off id = %X\n", targid);				/* default it */				sc->sz_modsel.density = 0;			        /*				 * since we zeroed the command struct before				 * we got here we don't have to set zero's				 * in the block size field				*/			    }			    /* 			     * check speed setting 			    */			    if( ddp->tape_flags & SPEED_VAL){				sc->sz_modsel.speed = 					(SCSI_SPEED_MASK & ddp->tape_speed);			    } 			    if( todp->opt_flags & BUF_MOD ){				sc->sz_modsel.bufmode =  1;			    }			    /*			     * is this scsi 2 if so must set pf.			    */			    if( sdp->flags & SCSI_MODSEL_PF ){				sc->sz_modsel.pf = 1;			    }							/*			 * end of if option table for tapes			*/			}			/* 			 * default the tape settings backwards compat			*/			else { 			    sc->sz_modsel.bufmode = 1;			    sc->sz_modsel.rdeclen = 8;			    if ((sc->sc_devtyp[ targid ] == TZxx) ||					(sc->sc_devtyp[ targid ] == TZ05) ||					(sc->sc_devtyp[ targid ] == TLZ04)) {				if ((sdp->flags & SCSI_MODSEL_EXABYTE) &&						    (tz_exabyte_vu != -1)) {				    /* Do extended mode select for EXABYTE */				    sc->sz_modsel.pll = 16;				    /* see scsi_data.c for values */				    sc->sz_modsel.vulen = tz_exabyte_vu;				    sc->sz_modsel.pad[0] = tz_exabyte_mt;				    sc->sz_modsel.pad[1] = tz_exabyte_rt;			        }				else {				    /* Don't send any VU bits. */				    sc->sz_modsel.pll = 12;				    sc->sz_modsel.rdeclen = 8;				}			    }			    /* END of if TZXX TZ05 TLZ04 */			    else {				sc->sz_modsel.pll = 14;				sc->sz_modsel.vulen = 1;#ifdef SZDEBUG				sc->sz_modsel.vu7 = sz_direct_track_mode;#endif SZDEBUG				sc->sz_modsel.notimo = 1;				sc->sz_modsel.nof = sz_max_numof_fills;			    }			/* end of tape NO option table */			}		    /* 		     * end of if tape ...... 		    */		    }		    else {		/* DISK or CDROM */	 		/*			 * Check to see if we have an option table			 * if we do use those values in the table to set			 * things up.......		   	*/			if( sdp->opt_tab != NULL ){			    /*			     * we have an option table use it.			     * must cast the pointer			    */			     dodp = (struct disk_opt_tab *)sdp->opt_tab;			    /* 			     * lets see if the mode select parameter length is valid			     * We must build it build hand...........			    */			    if( dodp->opt_flags & MSEL_PLL_VAL){				sc->sz_modsel.pll = dodp->msel_pll;				if( dodp->opt_flags & MSEL_BLKDL_VAL){				    sc->sz_modsel.rdeclen = dodp->msel_blkdl;				}				if( dodp->opt_flags & MSEL_VUL_VAL){				    sc->sz_modsel.vulen = dodp->msel_vul;				}			    /* end of if MSEL_PLL_VAL */			    }			    else{				/* 				 * no sense in testing anything else				 * default to hdr and block ( 12 )				*/				sc->sz_modsel.pll = 12;				sc->sz_modsel.rdeclen = 8;				/* ERRLOG_MARK */				cprintf("scsi OPTTABLE off id = %X\n", targid);			    }							    /*			     * must set our block size..512 for disks			    */			    i = 512;			    sc->sz_modsel.reclen2 = LTOB(i,2);			    sc->sz_modsel.reclen1 = LTOB(i,1);			    sc->sz_modsel.reclen0 = LTOB(i,0);			    /* 			     * get our other flags and set up			    */			    if( dodp->opt_flags & BUF_MOD ){				sc->sz_modsel.bufmode =  1;			    }			    /*			     * is this scsi 2 if so must set pf.			    */			    if( sdp->flags & SCSI_MODSEL_PF ){				sc->sz_modsel.pf = 1;			    }						/* end of if disk option table */			}			/* 			 * we have no option table for this			 * disk... This is here for backward			 * compat.			*/			else { 			    if(sdp->flags & SCSI_MODSEL_PF){				sc->sz_modsel.pf = 1;			    }			    else{				sc->sz_modsel.pf = 0;			    }			    sc->sz_modsel.pll = 12;			    sc->sz_modsel.rdeclen = 8;			    i = 512;	/* reclen really means LBN size */			    sc->sz_modsel.reclen2 = LTOB(i,2);			    sc->sz_modsel.reclen1 = LTOB(i,1);			    sc->sz_modsel.reclen0 = LTOB(i,0);			    if(sc->sc_rzspecial[targid]) {				msp = (struct mode_sel_sns_params *)					    sc->sc_rzparams[targid];				sc->sz_modsel.pll = msp->msp_length;				sc->sz_modsel.sp = msp->msp_setps;			    }			}		    }		    break;		case SZ_P_NOCACHE:		    /* 		     * The following is only for tapes....		    */		    cmd = SZ_MODSEL;		    if( sdp->opt_tab != NULL ){			/*			 * we have an option table use it.			 * must cast the pointer			*/			todp = (struct tape_opt_tab *)sdp->opt_tab;			/* 			 * lets see if the mode select parameter length is valid			 * We must build it build hand...........			*/			if( todp->opt_flags & MSEL_PLL_VAL){			    sc->sz_modsel.pll = todp->msel_pll;			    if( todp->opt_flags & MSEL_BLKDL_VAL){				sc->sz_modsel.rdeclen = todp->msel_blkdl;			    }			    if( todp->opt_flags & MSEL_VUL_VAL){				sc->sz_modsel.vulen = todp->msel_vul;			    }			/* end of if MSEL_PLL_VAL */			 }			 else{			    /* 			     * no sense in testing anything else			     * default to hdr and block ( 12 )			    */			    sc->sz_modsel.pll = 12;			    sc->sz_modsel.rdeclen = 8;			    /* ERRLOG_MARK */			    cprintf("scsi OPTTABLE off id = %X\n", targid);			}		        /* 			 * get our density struct pointer...			*/			ddp = &todp->tape_info[DENS_IDX( bp )];			/* 			 * lets see if this density selection is valid..			*/			if( ddp->tape_flags & DENS_VAL ){			    /*		 	     * this is valid lets get our stuff			    */			    sc->sz_modsel.density = 					(char)(SCSI_DENS_MASK & ddp->dens);							    /*			     * must set our block size......			    */			    sc->sz_modsel.reclen2 = LTOB(ddp->blk_size,2);			    sc->sz_modsel.reclen1 = LTOB(ddp->blk_size,1);			    sc->sz_modsel.reclen0 = LTOB(ddp->blk_size,0);			}			/*			 * well we have a option table but this density			 * struct is not valid.... We must do something			 * but is it QIC 9trk 8mm etc... 			*/			else {			    /* ERRLOG_MARK */			    mprintf("scsi OPTTABLE off id = %X\n", targid);			    /* default it */			    sc->sz_modsel.density = 0;			    /*			     * since we zeroed the command struct before			     * we got here we don't have to set zero's			     * in the block size field			    */			}			/* 			 * check speed setting 			*/			if( ddp->tape_flags & SPEED_VAL){			    sc->sz_modsel.speed = 					(SCSI_SPEED_MASK & ddp->tape_speed);			} 			/*			 * is this scsi 2 if so must set pf.			*/			if( sdp->flags & SCSI_MODSEL_PF ){			    sc->sz_modsel.pf = 1;			}						/*			 * end of if option table for tapes			*/		    }		    /*		     * For the old stuff backward compat		    */		    else {			sc->sz_modsel.pll = 0x0e;			sc->sz_modsel.bufmode = 0;			sc->sz_modsel.rdeclen = 0x08;			sc->sz_modsel.vulen = 1;			sc->sz_modsel.nof = 0;		    }		    break;		case SZ_TRKSEL:		    return(SZ_RET_ERR);		    break;		case SZ_RESUNIT:		case SZ_RELUNIT:		    PRINTD(targid, 0x10,			("sz_bldpkt: unimplemented command 0x%x\n", cmd));		    return (SZ_RET_ERR);		    break;						case SZ_P_EJECT:		    cmd = SZ_SSLU;		    sc->sz_ssu.start = 0;	/* Stop the unit.	*/		    sc->sz_ssu.loej = 1;	/* Eject the caddy.	*/		    sc->sz_ssu.immed = 1;	/* Complete immediatly.	*/		    break;		case SZ_MEDREMOVAL:		    sc->sz_mr.prevent = count;		    break;		case SZ_PAUSE_RESUME:		    sc->sz_cd_pr.resume = count;		    break;		case SZ_PLAY_AUDIO:		case SZ_PLAY_VAUDIO: {		    struct cd_play_audio *pa;		    pa = (struct cd_play_audio *) sc->sc_rzparams[targid];		    sc->sz_cd_pa.lbaddr3 = LTOB(pa->pa_lba, 3);		    sc->sz_cd_pa.lbaddr2 = LTOB(pa->pa_lba, 2);		    sc->sz_cd_pa.lbaddr1 = LTOB(pa->pa_lba, 1);		    sc->sz_cd_pa.lbaddr0 = LTOB(pa->pa_lba, 0);		    sc->sz_cd_pa.xferlen1 = LTOB(pa->pa_length, 1);		    sc->sz_cd_pa.xferlen0 = LTOB(pa->pa_length, 0);		    break;		}		case SZ_PLAY_MSF:		case SZ_PLAY_AUDIO_MSF: {		    struct cd_play_audio_msf *msf;		    msf = (struct cd_play_audio_msf *) sc->sc_rzparams[targid];		    sc->sz_cd_msf.starting_M_unit = msf->msf_starting_M_unit;		    sc->sz_cd_msf.starting_S_unit = msf->msf_starting_S_unit;		    sc->sz_cd_msf.starting_F_unit = msf->msf_starting_F_unit;		    sc->sz_cd_msf.ending_M_unit = msf->msf_ending_M_unit;		    sc->sz_cd_msf.ending_S_unit = msf->msf_ending_S_unit;		    sc->sz_cd_msf.ending_F_unit = msf->msf_ending_F_unit;		    break;		}		case SZ_PLAY_AUDIO_TI: {		    struct cd_play_audio_ti *ti;		    ti = (struct cd_play_audio_ti *) sc->sc_rzparams[targid];		    sc->sz_cd_ti.starting_track = ti->ti_starting_track;		    sc->sz_cd_ti.starting_index = ti->ti_starting_index;		    sc->sz_cd_ti.ending_track = ti->ti_ending_track;		    sc->sz_cd_ti.ending_index = ti->ti_ending_index;		    break;		}		case SZ_PLAY_TRACK_REL: {		    struct cd_play_audio_tr *tr;		    tr = (struct cd_play_audio_tr *) sc->sc_rzparams[targid];		    sc->sz_cd_tr.lbaddr3 = LTOB(tr->tr_lba, 3);		    sc->sz_cd_tr.lbaddr2 = LTOB(tr->tr_lba, 2);		    sc->sz_cd_tr.lbaddr1 = LTOB(tr->tr_lba, 1);		    sc->sz_cd_tr.lbaddr0 = LTOB(tr->tr_lba, 0);		    sc->sz_cd_tr.starting_track = tr->tr_starting_track; 		    sc->sz_cd_tr.xfer_len1 = LTOB(tr->tr_xfer_length,1);		    sc->sz_cd_tr.xfer_len0 = LTOB(tr->tr_xfer_length,0);		    break;		}		case SZ_PLAY_TRACK: {		    struct cd_play_track *pt;		    pt = (struct cd_play_track *) sc->sc_rzparams[targid];		    sc->sz_cd_pt.starting_track = pt->pt_starting_track;		    sc->sz_cd_pt.starting_index = pt->pt_starting_index;		    sc->sz_cd_pt.number_indexes = pt->pt_number_indexes;		    break;		}		case SZ_READ_TOC: {		    register struct cd_toc *toc;		    toc = (struct cd_toc *)sc->sc_rzparams[targid];		    if (toc->toc_address_format == CDROM_MSF_FORMAT) {			sc->sz_cd_toc.msf = 1;		    }		    sc->sz_cd_toc.starting_track = toc->toc_starting_track;		    sc->sz_cd_toc.alloc_len1 = LTOB(toc->toc_alloc_length,1);		    sc->sz_cd_toc.alloc_len0 = LTOB(toc->toc_alloc_length,0);		    break;		}		case SZ_READ_SUBCHAN: {		    register struct cd_sub_channel *sch;		    sch = (struct cd_sub_channel *)sc->sc_rzparams[targid];		    if (sch->sch_address_format == CDROM_MSF_FORMAT) {			sc->sz_cd_sch.msf = 1;		    }		    sc->sz_cd_sch.subQ = 1;		    sc->sz_cd_sch.data_format = sch->sch_data_format;		    sc->sz_cd_sch.track_number = sch

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -