📄 tape34xx.c
字号:
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,"xden ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTSEEK: seek to the specified block. */ccw_req_t *tape34xx_mtseek (tape_info_t * ti, int count){ long lockflags; __u8 *data; ccw_req_t *cqr; ccw1_t *ccw; if ((data = kmalloc (4 * sizeof (__u8), GFP_KERNEL)) == NULL) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xsee nomem");#endif /* TAPE_DEBUG */ return NULL; } data[0] = 0x01; data[1] = data[2] = data[3] = 0x00; if (count >= 4194304) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xsee parm");#endif /* TAPE_DEBUG */ kfree(data); return NULL; } if (((tape34xx_disc_data_t *) ti->discdata)->modeset_byte & 0x08) // IDRC on data[1] = data[1] | 0x80; data[3] += count % 256; data[2] += (count / 256) % 256; data[1] += (count / 65536);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xsee id:"); debug_int_event (tape_debug_area,6,count);#endif /* TAPE_DEBUG */ cqr = tape_alloc_ccw_req (ti, 3, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xsee nomem");#endif /* TAPE_DEBUG */ kfree (data); 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 = LOCATE; ccw->flags = CCW_FLAG_CC; ccw->count = 4; set_normalized_cda (ccw, (unsigned long) data); 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 = data; ti->userbuf = NULL; tapestate_set (ti, TS_LBL_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xsee ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTTELL: Tell block. Return the number of block relative to current file. */ccw_req_t *tape34xx_mttell (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; void *mem; cqr = tape_alloc_ccw_req (ti, 2, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xtel nomem");#endif /* TAPE_DEBUG */ return NULL; } mem = kmalloc (8, GFP_KERNEL); if (!mem) { tape_free_request (cqr);#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xtel 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 = READ_BLOCK_ID; ccw->flags = 0; ccw->count = 8; set_normalized_cda (ccw, (unsigned long) mem); s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); ti->kernbuf = mem; ti->userbuf = NULL; tapestate_set (ti, TS_RBI_INIT); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags);#ifdef TAPE_DEBUG debug_text_event (tape_debug_area,6,"xtel ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTSETDRVBUFFER: Set the tape drive buffer code to number. * Implement NOP. */ccw_req_t *tape34xx_mtsetdrvbuffer (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,"xbuf 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; 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,"xbuf ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTLOCK: Locks the tape drive door. * Implement NOP CCW command. */ccw_req_t *tape34xx_mtlock (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,"xloc 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; 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,"xloc ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTUNLOCK: Unlocks the tape drive door. * Implement the NOP CCW command. */ccw_req_t *tape34xx_mtunlock (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,"xulk 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; 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,"xulk ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTLOAD: Loads the tape. * This function is not implemented and returns NULL, which causes the Frontend to wait for a medium being loaded. * The 3480/3490 type Tapes do not support a load command */ccw_req_t *tape34xx_mtload (tape_info_t * ti, int count){ return NULL;}/* * MTUNLOAD: Rewind the tape and unload it. */ccw_req_t *tape34xx_mtunload (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,"xunl 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,"xunl ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTCOMPRESSION: used to enable compression. * Sets the IDRC on/off. */ccw_req_t *tape34xx_mtcompression (tape_info_t * ti, int count){ long lockflags; ccw_req_t *cqr; ccw1_t *ccw; if ((count < 0) || (count > 1)) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xcom parm");#endif /* TAPE_DEBUG */ return NULL; } if (count == 0) ((tape34xx_disc_data_t *) ti->discdata)->modeset_byte = 0x00; // IDRC off else ((tape34xx_disc_data_t *) ti->discdata)->modeset_byte = 0x08; // IDRC on cqr = tape_alloc_ccw_req (ti, 2, 0); if (!cqr) {#ifdef TAPE_DEBUG debug_text_exception (tape_debug_area,6,"xcom 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; 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,"xcom ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTSTPART: Move the tape head at the partition with the number 'count'. * Implement the NOP CCW command. */ccw_req_t *tape34xx_mtsetpart (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,"xspa 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; 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,"xspa ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTMKPART: .... dummy . * Implement the NOP CCW command. */ccw_req_t *tape34xx_mtmkpart (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,"xnpa 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; 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,"xnpa ccwg");#endif /* TAPE_DEBUG */ return cqr;}/* * MTIOCGET: query the tape drive status. */ccw_req_t *tape34xx_mtiocget (tape_info_t * ti, int count){ return NULL;}/* * MTIOCPOS: query the tape position. */ccw_req_t *tape34xx_mtiocpos (tape_info_t * ti, int count){ return NULL;}ccw_req_t * tape34xx_bread (struct request *req,tape_info_t* ti,int tapeblock_major) { ccw_req_t *cqr; ccw1_t *ccw; __u8 *data; int s2b = blksize_size[tapeblock_major][ti->blk_minor]/hardsect_size[tapeblock_major][ti->blk_minor]; int realcount; int size,bhct = 0; struct buffer_head* bh; for (bh = req->bh; bh; bh = bh->b_reqnext) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -