📄 tape34xx.c
字号:
* (blocksize is set via MTSETBLK. */ccw_req_t *tape34xx_mtbsr (tape_info_t * ti, int count){ long lockflags; int i; ccw_req_t *cqr; ccw1_t *ccw; if ((count == 0) || (count > 510)) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xbsr parm");#endif /* TAPE_DEBUG */ return NULL; } cqr = tape_alloc_ccw_req (ti, 2 + count, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xbsr nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; for (i = 0; i < count; i++) { ccw->cmd_code = BACKSPACEBLOCK; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; } ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_BSB_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xbsr ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTWEOF: Write 'count' file marks at the current position. */ccw_req_t *tape34xx_mtweof (tape_info_t * ti, int count){ long lockflags; int i; ccw_req_t *cqr; ccw1_t *ccw; if ((count == 0) || (count > 510)) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xweo parm");#endif /* TAPE_DEBUG */ return NULL; } cqr = tape_alloc_ccw_req (ti, 2 + count, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xweo nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; for (i = 0; i < count; i++) { ccw->cmd_code = WRITETAPEMARK; ccw->flags = CCW_FLAG_CC; ccw->count = 1; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; } ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_WTM_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xweo ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTREW: Rewind the tape. */ccw_req_t *tape34xx_mtrew (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; cqr = tape_alloc_ccw_req (ti, 3, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xrew nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; ccw->cmd_code = REWIND; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_REW_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xrew ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTOFFL: Rewind the tape and put the drive off-line. * Implement 'rewind unload' */ccw_req_t *tape34xx_mtoffl (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; cqr = tape_alloc_ccw_req (ti, 3, 32); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xoff nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; ccw->cmd_code = REWIND_UNLOAD; ccw->flags = CCW_FLAG_CC; ccw->count = 1; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = SENSE; ccw->flags = 0; ccw->count = 32; ccw->cda = (unsigned long) cqr->cpaddr; s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_RUN_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xoff ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTNOP: 'No operation'. */ccw_req_t *tape34xx_mtnop (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; cqr = tape_alloc_ccw_req (ti, 1, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xnop nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) ccw->cmd_code; s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_NOP_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xnop ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTBSFM: Backward space over 'count' file marks. * The tape is positioned at the BOT (Begin Of Tape) side of the * last skipped file mark. */ccw_req_t *tape34xx_mtbsfm (tape_info_t * ti, int count){ long lockflags; int i; ccw_req_t *cqr; ccw1_t *ccw; if ((count == 0) || (count > 510)) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xbsm parm");#endif /* TAPE_DEBUG */ return NULL; } cqr = tape_alloc_ccw_req (ti, 2 + count, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xbsm nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; for (i = 0; i < count; i++) { ccw->cmd_code = BACKSPACEFILE; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; } ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_BSF_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xbsm ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTFSFM: Forward space over 'count' file marks. * The tape is positioned at the BOT (Begin Of Tape) side * of the last skipped file mark. */ccw_req_t *tape34xx_mtfsfm (tape_info_t * ti, int count){ long lockflags; int i; ccw_req_t *cqr; ccw1_t *ccw; if ((count == 0) || (count > 510)) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xfsm parm");#endif /* TAPE_DEBUG */ return NULL; } cqr = tape_alloc_ccw_req (ti, 2 + count, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xfsm nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; for (i = 0; i < count; i++) { ccw->cmd_code = FORSPACEFILE; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; } ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_FSF_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xfsm ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTEOM: positions at the end of the portion of the tape already used * for recordind data. MTEOM positions after the last file mark, ready for * appending another file. * MTRETEN: Retension the tape, i.e. forward space to end of tape and rewind. */ccw_req_t *tape34xx_mteom (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; cqr = tape_alloc_ccw_req (ti, 4, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xeom nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; ccw->cmd_code = FORSPACEFILE; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = NOP; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = CCW_CMD_TIC; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (cqr->cpaddr); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_FSF_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xeom ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTERASE: erases the tape. */ccw_req_t *tape34xx_mterase (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; cqr = tape_alloc_ccw_req (ti, 5, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xera nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; ccw->cmd_code = REWIND; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = ERASE_GAP; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = DATA_SEC_ERASE; ccw->flags = CCW_FLAG_CC; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); ccw++; ccw->cmd_code = NOP; ccw->flags = 0; ccw->count = 0; ccw->cda = (unsigned long) (&(ccw->cmd_code)); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = NULL; ti->userbuf = NULL; tapestate_set (ti, TS_DSE_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xera ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTSETDENSITY: set tape density. */ccw_req_t *tape34xx_mtsetdensity (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; cqr = tape_alloc_ccw_req (ti, 2, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xden nomem");#endif /* TAPE_DEBUG */ return NULL; } ccw = cqr->cpaddr; ccw->cmd_code = MODE_SET_DB; ccw->flags = CCW_FLAG_CC; ccw->count = 1; set_normalized_cda (ccw, (unsigned long) (&(((tape34xx_disc_data_t *) ti->discdata)->modeset_byte))); ccw++; ccw->cmd_code = NOP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -