static int fs3270_do_io(struct raw3270_view *view, struct raw3270_request *rq) { struct fs3270 *fp; int rc; fp = (struct fs3270 *) view; rq->callback = fs3270_wake_up; rq->callback_data = &fp->wait; do { if (!fs3270_working(fp)) { /* Fullscreen view isn't ready yet. */ rc = wait_event_interruptible(fp->wait, fs3270_working(fp)); if (rc != 0) break; } rc = raw3270_start(view, rq); if (rc == 0) { /* Started sucessfully. Now wait for completion. */ wait_event(fp->wait, raw3270_request_final(rq)); } } while (rc == -EACCES); return rc; }
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); }
static inline int fs3270_working(struct fs3270 *fp) { /* * The fullscreen view is in working order if the view * has been activated AND the initial request is finished. */ return fp->active && raw3270_request_final(fp->init); }
static int fs3270_do_io(struct raw3270_view *view, struct raw3270_request *rq) { wait_queue_head_t wq; int rc; init_waitqueue_head(&wq); rq->callback = fs3270_wake_up; rq->callback_data = &wq; rc = raw3270_start(view, rq); if (rc) return rc; /* Started sucessfully. Now wait for completion. */ wait_event(wq, raw3270_request_final(rq)); return rq->rc; }
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; }