static void fs3270_deactivate(struct raw3270_view *view) { struct fs3270 *fp; fp = (struct fs3270 *) view; fp->active = 0; /* If an old init command is still running just return. */ if (!raw3270_request_final(fp->init)) return; /* Prepare read-buffer request. */ raw3270_request_set_cmd(fp->init, TC_RDBUF); /* * Hackish: skip first 5 bytes of the idal buffer to make * room for the TW_KR/TO_SBA/<address>/<address>/TO_IC sequence * in the activation command. */ fp->rdbuf->data[0] += 5; fp->rdbuf->size -= 5; raw3270_request_set_idal(fp->init, fp->rdbuf); fp->init->rescnt = 0; fp->init->callback = fs3270_save_callback; /* Start I/O to read in the 3270 buffer. */ fp->init->rc = raw3270_start_locked(view, fp->init); if (fp->init->rc) fp->init->callback(fp->init, NULL); }
/* * Process reads from fullscreen 3270. */ static ssize_t fs3270_read(struct file *filp, char *data, size_t count, loff_t *off) { struct fs3270 *fp; struct raw3270_request *rq; struct idal_buffer *ib; int rc; if (count == 0 || count > 65535) return -EINVAL; fp = filp->private_data; if (!fp) return -ENODEV; ib = idal_buffer_alloc(count, 0); if (!ib) return -ENOMEM; rq = raw3270_request_alloc(0); if (!IS_ERR(rq)) { if (fp->read_command == 0 && fp->write_command != 0) fp->read_command = 6; raw3270_request_set_cmd(rq, fp->read_command ? : 2); raw3270_request_set_idal(rq, ib); wait_event(fp->attn_wait, fp->attention); rc = fs3270_do_io(&fp->view, rq); if (rc == 0 && idal_buffer_to_user(ib, data, count)) rc = -EFAULT; raw3270_request_free(rq); } else
static int fs3270_activate(struct raw3270_view *view) { struct fs3270 *fp; char *cp; int rc; fp = (struct fs3270 *) view; /* If an old init command is still running just return. */ if (!raw3270_request_final(fp->init)) return 0; if (fp->rdbuf_size == 0) { /* No saved buffer. Just clear the screen. */ raw3270_request_set_cmd(fp->init, TC_EWRITEA); fp->init->callback = fs3270_reset_callback; } else { /* Restore fullscreen buffer saved by fs3270_deactivate. */ raw3270_request_set_cmd(fp->init, TC_EWRITEA); raw3270_request_set_idal(fp->init, fp->rdbuf); fp->init->ccw.count = fp->rdbuf_size; cp = fp->rdbuf->data[0]; cp[0] = TW_KR; cp[1] = TO_SBA; cp[2] = cp[6]; cp[3] = cp[7]; cp[4] = TO_IC; cp[5] = TO_SBA; cp[6] = 0x40; cp[7] = 0x40; fp->init->rescnt = 0; fp->init->callback = fs3270_restore_callback; } rc = fp->init->rc = raw3270_start_locked(view, fp->init); if (rc) fp->init->callback(fp->init, NULL); else fp->active = 1; return rc; }