📄 scsi.c
字号:
/* * 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 + -