hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/s390/cio/qdio.h
....@@ -15,7 +15,6 @@
1515 #define QDIO_BUSY_BIT_PATIENCE (100 << 12) /* 100 microseconds */
1616 #define QDIO_BUSY_BIT_RETRY_DELAY 10 /* 10 milliseconds */
1717 #define QDIO_BUSY_BIT_RETRIES 1000 /* = 10s retry time */
18
-#define QDIO_INPUT_THRESHOLD (500 << 12) /* 500 microseconds */
1918
2019 enum qdio_irq_states {
2120 QDIO_IRQ_STATE_INACTIVE,
....@@ -82,21 +81,22 @@
8281 #define QDIO_SIGA_WRITE 0x00
8382 #define QDIO_SIGA_READ 0x01
8483 #define QDIO_SIGA_SYNC 0x02
84
+#define QDIO_SIGA_WRITEM 0x03
8585 #define QDIO_SIGA_WRITEQ 0x04
8686 #define QDIO_SIGA_QEBSM_FLAG 0x80
8787
8888 static inline int do_sqbs(u64 token, unsigned char state, int queue,
8989 int *start, int *count)
9090 {
91
- register unsigned long _ccq asm ("0") = *count;
92
- register unsigned long _token asm ("1") = token;
9391 unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
92
+ unsigned long _ccq = *count;
9493
9594 asm volatile(
96
- " .insn rsy,0xeb000000008A,%1,0,0(%2)"
97
- : "+d" (_ccq), "+d" (_queuestart)
98
- : "d" ((unsigned long)state), "d" (_token)
99
- : "memory", "cc");
95
+ " lgr 1,%[token]\n"
96
+ " .insn rsy,0xeb000000008a,%[qs],%[ccq],0(%[state])"
97
+ : [ccq] "+&d" (_ccq), [qs] "+&d" (_queuestart)
98
+ : [state] "a" ((unsigned long)state), [token] "d" (token)
99
+ : "memory", "cc", "1");
100100 *count = _ccq & 0xff;
101101 *start = _queuestart & 0xff;
102102
....@@ -106,16 +106,17 @@
106106 static inline int do_eqbs(u64 token, unsigned char *state, int queue,
107107 int *start, int *count, int ack)
108108 {
109
- register unsigned long _ccq asm ("0") = *count;
110
- register unsigned long _token asm ("1") = token;
111109 unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
112110 unsigned long _state = (unsigned long)ack << 63;
111
+ unsigned long _ccq = *count;
113112
114113 asm volatile(
115
- " .insn rrf,0xB99c0000,%1,%2,0,0"
116
- : "+d" (_ccq), "+d" (_queuestart), "+d" (_state)
117
- : "d" (_token)
118
- : "memory", "cc");
114
+ " lgr 1,%[token]\n"
115
+ " .insn rrf,0xb99c0000,%[qs],%[state],%[ccq],0"
116
+ : [ccq] "+&d" (_ccq), [qs] "+&d" (_queuestart),
117
+ [state] "+&d" (_state)
118
+ : [token] "d" (token)
119
+ : "memory", "cc", "1");
119120 *count = _ccq & 0xff;
120121 *start = _queuestart & 0xff;
121122 *state = _state & 0xff;
....@@ -165,34 +166,21 @@
165166 } ____cacheline_aligned;
166167
167168 struct qdio_queue_perf_stat {
168
- /*
169
- * Sorted into order-2 buckets: 1, 2-3, 4-7, ... 64-127, 128.
170
- * Since max. 127 SBALs are scanned reuse entry for 128 as queue full
171
- * aka 127 SBALs found.
172
- */
169
+ /* Sorted into order-2 buckets: 1, 2-3, 4-7, ... 64-127, 128. */
173170 unsigned int nr_sbals[8];
174171 unsigned int nr_sbal_error;
175172 unsigned int nr_sbal_nop;
176173 unsigned int nr_sbal_total;
177174 };
178175
179
-enum qdio_queue_irq_states {
180
- QDIO_QUEUE_IRQS_DISABLED,
176
+enum qdio_irq_poll_states {
177
+ QDIO_IRQ_DISABLED,
181178 };
182179
183180 struct qdio_input_q {
184
- /* input buffer acknowledgement flag */
185
- int polling;
186
- /* first ACK'ed buffer */
187
- int ack_start;
188
- /* how much sbals are acknowledged with qebsm */
189
- int ack_count;
190
- /* last time of noticing incoming data */
191
- u64 timestamp;
192
- /* upper-layer polling flag */
193
- unsigned long queue_irq_state;
194
- /* callback to start upper-layer polling */
195
- void (*queue_start_poll) (struct ccw_device *, int, unsigned long);
181
+ /* Batch of SBALs that we processed while polling the queue: */
182
+ unsigned int batch_start;
183
+ unsigned int batch_count;
196184 };
197185
198186 struct qdio_output_q {
....@@ -206,8 +194,6 @@
206194 struct qdio_outbuf_state *sbal_state;
207195 /* timer to check for more outbound work */
208196 struct timer_list timer;
209
- /* used SBALs before tasklet schedule */
210
- int scan_threshold;
211197 };
212198
213199 /*
....@@ -227,12 +213,6 @@
227213 * outbound: next buffer to check if adapter processed it
228214 */
229215 int first_to_check;
230
-
231
- /* first_to_check of the last time */
232
- int last_move;
233
-
234
- /* beginning position for calling the program */
235
- int first_to_kick;
236216
237217 /* number of buffers in use by the adapter */
238218 atomic_t nr_buf_used;
....@@ -257,13 +237,9 @@
257237 /* input or output queue */
258238 int is_input_q;
259239
260
- /* list of thinint input queues */
261
- struct list_head entry;
262
-
263240 /* upper-layer program handler */
264241 qdio_handler_t (*handler);
265242
266
- struct dentry *debugfs_q;
267243 struct qdio_irq *irq_ptr;
268244 struct sl *sl;
269245 /*
....@@ -277,8 +253,8 @@
277253 struct qib qib;
278254 u32 *dsci; /* address of device state change indicator */
279255 struct ccw_device *cdev;
256
+ struct list_head entry; /* list of thinint devices */
280257 struct dentry *debugfs_dev;
281
- struct dentry *debugfs_perf;
282258
283259 unsigned long int_parm;
284260 struct subchannel_id schid;
....@@ -298,6 +274,7 @@
298274 struct qdio_ssqd_desc ssqd_desc;
299275 void (*orig_handler) (struct ccw_device *, unsigned long, struct irb *);
300276
277
+ unsigned int scan_threshold; /* used SBALs before tasklet schedule */
301278 int perf_stat_enabled;
302279
303280 struct qdr *qdr;
....@@ -305,6 +282,11 @@
305282
306283 struct qdio_q *input_qs[QDIO_MAX_QUEUES_PER_IRQ];
307284 struct qdio_q *output_qs[QDIO_MAX_QUEUES_PER_IRQ];
285
+ unsigned int max_input_qs;
286
+ unsigned int max_output_qs;
287
+
288
+ void (*irq_poll)(struct ccw_device *cdev, unsigned long data);
289
+ unsigned long poll_state;
308290
309291 debug_info_t *debug_area;
310292 struct mutex setup_mutex;
....@@ -321,12 +303,14 @@
321303
322304 #define qperf(__qdev, __attr) ((__qdev)->perf_stat.(__attr))
323305
324
-#define qperf_inc(__q, __attr) \
306
+#define QDIO_PERF_STAT_INC(__irq, __attr) \
325307 ({ \
326
- struct qdio_irq *qdev = (__q)->irq_ptr; \
308
+ struct qdio_irq *qdev = __irq; \
327309 if (qdev->perf_stat_enabled) \
328310 (qdev->perf_stat.__attr)++; \
329311 })
312
+
313
+#define qperf_inc(__q, __attr) QDIO_PERF_STAT_INC((__q)->irq_ptr, __attr)
330314
331315 static inline void account_sbals_error(struct qdio_q *q, int count)
332316 {
....@@ -341,8 +325,7 @@
341325 (q->nr == q->irq_ptr->nr_output_qs - 1);
342326 }
343327
344
-#define pci_out_supported(q) \
345
- (q->irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)
328
+#define pci_out_supported(irq) ((irq)->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)
346329 #define is_qebsm(q) (q->irq_ptr->sch_token != 0)
347330
348331 #define need_siga_in(q) (q->irq_ptr->siga_flag.input)
....@@ -360,14 +343,10 @@
360343 for (i = 0; i < irq_ptr->nr_output_qs && \
361344 ({ q = irq_ptr->output_qs[i]; 1; }); i++)
362345
363
-#define prev_buf(bufnr) \
364
- ((bufnr + QDIO_MAX_BUFFERS_MASK) & QDIO_MAX_BUFFERS_MASK)
365
-#define next_buf(bufnr) \
366
- ((bufnr + 1) & QDIO_MAX_BUFFERS_MASK)
367
-#define add_buf(bufnr, inc) \
368
- ((bufnr + inc) & QDIO_MAX_BUFFERS_MASK)
369
-#define sub_buf(bufnr, dec) \
370
- ((bufnr - dec) & QDIO_MAX_BUFFERS_MASK)
346
+#define add_buf(bufnr, inc) QDIO_BUFNR((bufnr) + (inc))
347
+#define next_buf(bufnr) add_buf(bufnr, 1)
348
+#define sub_buf(bufnr, dec) QDIO_BUFNR((bufnr) - (dec))
349
+#define prev_buf(bufnr) sub_buf(bufnr, 1)
371350
372351 #define queue_irqs_enabled(q) \
373352 (test_bit(QDIO_QUEUE_IRQS_DISABLED, &q->u.in.queue_irq_state) == 0)
....@@ -379,14 +358,11 @@
379358 /* prototypes for thin interrupt */
380359 int qdio_establish_thinint(struct qdio_irq *irq_ptr);
381360 void qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
382
-void tiqdio_add_input_queues(struct qdio_irq *irq_ptr);
383
-void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr);
361
+void tiqdio_add_device(struct qdio_irq *irq_ptr);
362
+void tiqdio_remove_device(struct qdio_irq *irq_ptr);
384363 void tiqdio_inbound_processing(unsigned long q);
385
-int tiqdio_allocate_memory(void);
386
-void tiqdio_free_memory(void);
387
-int tiqdio_register_thinints(void);
388
-void tiqdio_unregister_thinints(void);
389
-void clear_nonshared_ind(struct qdio_irq *);
364
+int qdio_thinint_init(void);
365
+void qdio_thinint_exit(void);
390366 int test_nonshared_ind(struct qdio_irq *);
391367
392368 /* prototypes for setup */
....@@ -401,12 +377,11 @@
401377 int qdio_setup_get_ssqd(struct qdio_irq *irq_ptr,
402378 struct subchannel_id *schid,
403379 struct qdio_ssqd_desc *data);
404
-int qdio_setup_irq(struct qdio_initialize *init_data);
405
-void qdio_print_subchannel_info(struct qdio_irq *irq_ptr,
406
- struct ccw_device *cdev);
407
-void qdio_release_memory(struct qdio_irq *irq_ptr);
408
-int qdio_setup_create_sysfs(struct ccw_device *cdev);
409
-void qdio_setup_destroy_sysfs(struct ccw_device *cdev);
380
+int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data);
381
+void qdio_shutdown_irq(struct qdio_irq *irq);
382
+void qdio_print_subchannel_info(struct qdio_irq *irq_ptr);
383
+void qdio_free_queues(struct qdio_irq *irq_ptr);
384
+void qdio_free_async_data(struct qdio_irq *irq_ptr);
410385 int qdio_setup_init(void);
411386 void qdio_setup_exit(void);
412387 int qdio_enable_async_operation(struct qdio_output_q *q);