1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * IBM/3270 Driver
4 *
5 * Author(s):
6 * Original 3270 Code for 2.4 written by Richard Hitt (UTS Global)
7 * Rewritten for 2.5 by Martin Schwidefsky <schwidefsky@de.ibm.com>
8 * Copyright IBM Corp. 2003, 2009
9 */
10
11#include <uapi/asm/raw3270.h>
12#include <asm/idals.h>
13#include <asm/ioctl.h>
14
15struct raw3270;
16struct raw3270_view;
17extern struct class *class3270;
18
19/* 3270 CCW request */
20struct raw3270_request {
21 struct list_head list; /* list head for request queueing. */
22 struct raw3270_view *view; /* view of this request */
23 struct ccw1 ccw; /* single ccw. */
24 void *buffer; /* output buffer. */
25 size_t size; /* size of output buffer. */
26 int rescnt; /* residual count from devstat. */
27 int rc; /* return code for this request. */
28
29 /* Callback for delivering final status. */
30 void (*callback)(struct raw3270_request *rq, void *data);
31 void *callback_data;
32};
33
34struct raw3270_request *raw3270_request_alloc(size_t size);
35void raw3270_request_free(struct raw3270_request *rq);
36int raw3270_request_reset(struct raw3270_request *rq);
37void raw3270_request_set_cmd(struct raw3270_request *rq, u8 cmd);
38int raw3270_request_add_data(struct raw3270_request *rq, void *data, size_t size);
39void raw3270_request_set_data(struct raw3270_request *rq, void *data, size_t size);
40void raw3270_request_set_idal(struct raw3270_request *rq, struct idal_buffer *ib);
41
42static inline int
43raw3270_request_final(struct raw3270_request *rq)
44{
45 return list_empty(head: &rq->list);
46}
47
48void raw3270_buffer_address(struct raw3270 *, char *, int, int);
49
50/*
51 * Functions of a 3270 view.
52 */
53struct raw3270_fn {
54 int (*activate)(struct raw3270_view *rq);
55 void (*deactivate)(struct raw3270_view *rq);
56 void (*intv)(struct raw3270_view *view,
57 struct raw3270_request *rq, struct irb *ib);
58 void (*release)(struct raw3270_view *view);
59 void (*free)(struct raw3270_view *view);
60 void (*resize)(struct raw3270_view *view,
61 int new_model, int new_cols, int new_rows,
62 int old_model, int old_cols, int old_rows);
63};
64
65/*
66 * View structure chaining. The raw3270_view structure is meant to
67 * be embedded at the start of the real view data structure, e.g.:
68 * struct example {
69 * struct raw3270_view view;
70 * ...
71 * };
72 */
73struct raw3270_view {
74 struct list_head list;
75 spinlock_t lock; /* protects members of view */
76#define RAW3270_VIEW_LOCK_IRQ 0
77#define RAW3270_VIEW_LOCK_BH 1
78 atomic_t ref_count;
79 struct raw3270 *dev;
80 struct raw3270_fn *fn;
81 unsigned int model;
82 unsigned int rows, cols; /* # of rows & colums of the view */
83 unsigned char *ascebc; /* ascii -> ebcdic table */
84};
85
86int raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor, int subclass);
87int raw3270_view_lock_unavailable(struct raw3270_view *view);
88int raw3270_activate_view(struct raw3270_view *view);
89void raw3270_del_view(struct raw3270_view *view);
90void raw3270_deactivate_view(struct raw3270_view *view);
91struct raw3270_view *raw3270_find_view(struct raw3270_fn *fn, int minor);
92int raw3270_start(struct raw3270_view *view, struct raw3270_request *rq);
93int raw3270_start_locked(struct raw3270_view *view, struct raw3270_request *rq);
94int raw3270_start_irq(struct raw3270_view *view, struct raw3270_request *rq);
95int raw3270_reset(struct raw3270_view *view);
96struct raw3270_view *raw3270_view(struct raw3270_view *view);
97int raw3270_view_active(struct raw3270_view *view);
98int raw3270_start_request(struct raw3270_view *view, struct raw3270_request *rq,
99 int cmd, void *data, size_t len);
100void raw3270_read_modified_cb(struct raw3270_request *rq, void *data);
101
102/* Reference count inliner for view structures. */
103static inline void
104raw3270_get_view(struct raw3270_view *view)
105{
106 atomic_inc(v: &view->ref_count);
107}
108
109extern wait_queue_head_t raw3270_wait_queue;
110
111static inline void
112raw3270_put_view(struct raw3270_view *view)
113{
114 if (atomic_dec_return(v: &view->ref_count) == 0)
115 wake_up(&raw3270_wait_queue);
116}
117
118struct raw3270 *raw3270_setup_console(void);
119void raw3270_wait_cons_dev(struct raw3270 *rp);
120
121/* Notifier for device addition/removal */
122struct raw3270_notifier {
123 struct list_head list;
124 void (*create)(int minor);
125 void (*destroy)(int minor);
126};
127
128int raw3270_register_notifier(struct raw3270_notifier *notifier);
129void raw3270_unregister_notifier(struct raw3270_notifier *notifier);
130

source code of linux/drivers/s390/char/raw3270.h