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 | |
15 | struct raw3270; |
16 | struct raw3270_view; |
17 | extern struct class *class3270; |
18 | |
19 | /* 3270 CCW request */ |
20 | struct 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 | |
34 | struct raw3270_request *raw3270_request_alloc(size_t size); |
35 | void raw3270_request_free(struct raw3270_request *rq); |
36 | int raw3270_request_reset(struct raw3270_request *rq); |
37 | void raw3270_request_set_cmd(struct raw3270_request *rq, u8 cmd); |
38 | int raw3270_request_add_data(struct raw3270_request *rq, void *data, size_t size); |
39 | void raw3270_request_set_data(struct raw3270_request *rq, void *data, size_t size); |
40 | void raw3270_request_set_idal(struct raw3270_request *rq, struct idal_buffer *ib); |
41 | |
42 | static inline int |
43 | raw3270_request_final(struct raw3270_request *rq) |
44 | { |
45 | return list_empty(head: &rq->list); |
46 | } |
47 | |
48 | void raw3270_buffer_address(struct raw3270 *, char *, int, int); |
49 | |
50 | /* |
51 | * Functions of a 3270 view. |
52 | */ |
53 | struct 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 | */ |
73 | struct 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 | |
86 | int raw3270_add_view(struct raw3270_view *view, struct raw3270_fn *fn, int minor, int subclass); |
87 | int raw3270_view_lock_unavailable(struct raw3270_view *view); |
88 | int raw3270_activate_view(struct raw3270_view *view); |
89 | void raw3270_del_view(struct raw3270_view *view); |
90 | void raw3270_deactivate_view(struct raw3270_view *view); |
91 | struct raw3270_view *raw3270_find_view(struct raw3270_fn *fn, int minor); |
92 | int raw3270_start(struct raw3270_view *view, struct raw3270_request *rq); |
93 | int raw3270_start_locked(struct raw3270_view *view, struct raw3270_request *rq); |
94 | int raw3270_start_irq(struct raw3270_view *view, struct raw3270_request *rq); |
95 | int raw3270_reset(struct raw3270_view *view); |
96 | struct raw3270_view *raw3270_view(struct raw3270_view *view); |
97 | int raw3270_view_active(struct raw3270_view *view); |
98 | int raw3270_start_request(struct raw3270_view *view, struct raw3270_request *rq, |
99 | int cmd, void *data, size_t len); |
100 | void raw3270_read_modified_cb(struct raw3270_request *rq, void *data); |
101 | |
102 | /* Reference count inliner for view structures. */ |
103 | static inline void |
104 | raw3270_get_view(struct raw3270_view *view) |
105 | { |
106 | atomic_inc(v: &view->ref_count); |
107 | } |
108 | |
109 | extern wait_queue_head_t raw3270_wait_queue; |
110 | |
111 | static inline void |
112 | raw3270_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 | |
118 | struct raw3270 *raw3270_setup_console(void); |
119 | void raw3270_wait_cons_dev(struct raw3270 *rp); |
120 | |
121 | /* Notifier for device addition/removal */ |
122 | struct raw3270_notifier { |
123 | struct list_head list; |
124 | void (*create)(int minor); |
125 | void (*destroy)(int minor); |
126 | }; |
127 | |
128 | int raw3270_register_notifier(struct raw3270_notifier *notifier); |
129 | void raw3270_unregister_notifier(struct raw3270_notifier *notifier); |
130 | |