hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/s390/include/asm/qdio.h
....@@ -16,6 +16,7 @@
1616 #define QDIO_MAX_QUEUES_PER_IRQ 4
1717 #define QDIO_MAX_BUFFERS_PER_Q 128
1818 #define QDIO_MAX_BUFFERS_MASK (QDIO_MAX_BUFFERS_PER_Q - 1)
19
+#define QDIO_BUFNR(num) ((num) & QDIO_MAX_BUFFERS_MASK)
1920 #define QDIO_MAX_ELEMENTS_PER_BUFFER 16
2021 #define QDIO_SBAL_SIZE 256
2122
....@@ -25,10 +26,10 @@
2526
2627 /**
2728 * struct qdesfmt0 - queue descriptor, format 0
28
- * @sliba: storage list information block address
29
- * @sla: storage list address
30
- * @slsba: storage list state block address
31
- * @akey: access key for DLIB
29
+ * @sliba: absolute address of storage list information block
30
+ * @sla: absolute address of storage list
31
+ * @slsba: absolute address of storage list state block
32
+ * @akey: access key for SLIB
3233 * @bkey: access key for SL
3334 * @ckey: access key for SBALs
3435 * @dkey: access key for SLSB
....@@ -50,20 +51,18 @@
5051 /**
5152 * struct qdr - queue description record (QDR)
5253 * @qfmt: queue format
53
- * @pfmt: implementation dependent parameter format
5454 * @ac: adapter characteristics
5555 * @iqdcnt: input queue descriptor count
5656 * @oqdcnt: output queue descriptor count
57
- * @iqdsz: inpout queue descriptor size
57
+ * @iqdsz: input queue descriptor size
5858 * @oqdsz: output queue descriptor size
59
- * @qiba: queue information block address
59
+ * @qiba: absolute address of queue information block
6060 * @qkey: queue information block key
6161 * @qdf0: queue descriptions
6262 */
6363 struct qdr {
6464 u32 qfmt : 8;
65
- u32 pfmt : 8;
66
- u32 : 8;
65
+ u32 : 16;
6766 u32 ac : 8;
6867 u32 : 8;
6968 u32 iqdcnt : 8;
....@@ -112,7 +111,7 @@
112111 /* private: */
113112 u8 res[88];
114113 /* public: */
115
- u8 parm[QDIO_MAX_BUFFERS_PER_Q];
114
+ u8 parm[128];
116115 } __attribute__ ((packed, aligned(256)));
117116
118117 /**
....@@ -202,7 +201,7 @@
202201 * @scount: SBAL count
203202 * @sflags: whole SBAL flags
204203 * @length: length
205
- * @addr: address
204
+ * @addr: absolute data address
206205 */
207206 struct qdio_buffer_element {
208207 u8 eflags;
....@@ -212,7 +211,7 @@
212211 u8 scount;
213212 u8 sflags;
214213 u32 length;
215
- void *addr;
214
+ u64 addr;
216215 } __attribute__ ((packed, aligned(16)));
217216
218217 /**
....@@ -252,13 +251,11 @@
252251 * (for communication with upper layer programs)
253252 * (only required for use with completion queues)
254253 * @flags: flags indicating state of buffer
255
- * @aob: pointer to QAOB used for the particular SBAL
256254 * @user: pointer to upper layer program's state information related to SBAL
257255 * (stored in user1 data of QAOB)
258256 */
259257 struct qdio_outbuf_state {
260258 u8 flags;
261
- struct qaob *aob;
262259 void *user;
263260 };
264261
....@@ -279,6 +276,7 @@
279276 #define CHSC_AC2_MULTI_BUFFER_AVAILABLE 0x0080
280277 #define CHSC_AC2_MULTI_BUFFER_ENABLED 0x0040
281278 #define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010
279
+#define CHSC_AC2_SNIFFER_AVAILABLE 0x0008
282280 #define CHSC_AC2_DATA_DIV_ENABLED 0x0002
283281
284282 #define CHSC_AC3_FORMAT2_CQ_AVAILABLE 0x8000
....@@ -327,9 +325,8 @@
327325
328326 /**
329327 * struct qdio_initialize - qdio initialization data
330
- * @cdev: associated ccw device
331328 * @q_format: queue format
332
- * @adapter_name: name for the adapter
329
+ * @qdr_ac: feature flags to set
333330 * @qib_param_field_format: format for qib_parm_field
334331 * @qib_param_field: pointer to 128 bytes or NULL, if no param field
335332 * @qib_rflags: rflags to set
....@@ -339,17 +336,16 @@
339336 * @no_output_qs: number of output queues
340337 * @input_handler: handler to be called for input queues
341338 * @output_handler: handler to be called for output queues
342
- * @queue_start_poll_array: polling handlers (one per input queue or NULL)
339
+ * @irq_poll: Data IRQ polling handler (NULL when not supported)
340
+ * @scan_threshold: # of in-use buffers that triggers scan on output queue
343341 * @int_parm: interruption parameter
344
- * @input_sbal_addr_array: address of no_input_qs * 128 pointers
345
- * @output_sbal_addr_array: address of no_output_qs * 128 pointers
342
+ * @input_sbal_addr_array: per-queue array, each element points to 128 SBALs
343
+ * @output_sbal_addr_array: per-queue array, each element points to 128 SBALs
346344 * @output_sbal_state_array: no_output_qs * 128 state info (for CQ or NULL)
347345 */
348346 struct qdio_initialize {
349
- struct ccw_device *cdev;
350347 unsigned char q_format;
351348 unsigned char qdr_ac;
352
- unsigned char adapter_name[8];
353349 unsigned int qib_param_field_format;
354350 unsigned char *qib_param_field;
355351 unsigned char qib_rflags;
....@@ -359,42 +355,13 @@
359355 unsigned int no_output_qs;
360356 qdio_handler_t *input_handler;
361357 qdio_handler_t *output_handler;
362
- void (**queue_start_poll_array) (struct ccw_device *, int,
363
- unsigned long);
364
- int scan_threshold;
358
+ void (*irq_poll)(struct ccw_device *cdev, unsigned long data);
359
+ unsigned int scan_threshold;
365360 unsigned long int_parm;
366
- void **input_sbal_addr_array;
367
- void **output_sbal_addr_array;
361
+ struct qdio_buffer ***input_sbal_addr_array;
362
+ struct qdio_buffer ***output_sbal_addr_array;
368363 struct qdio_outbuf_state *output_sbal_state_array;
369364 };
370
-
371
-/**
372
- * enum qdio_brinfo_entry_type - type of address entry for qdio_brinfo_desc()
373
- * @l3_ipv6_addr: entry contains IPv6 address
374
- * @l3_ipv4_addr: entry contains IPv4 address
375
- * @l2_addr_lnid: entry contains MAC address and VLAN ID
376
- */
377
-enum qdio_brinfo_entry_type {l3_ipv6_addr, l3_ipv4_addr, l2_addr_lnid};
378
-
379
-/**
380
- * struct qdio_brinfo_entry_XXX - Address entry for qdio_brinfo_desc()
381
- * @nit: Network interface token
382
- * @addr: Address of one of the three types
383
- *
384
- * The struct is passed to the callback function by qdio_brinfo_desc()
385
- */
386
-struct qdio_brinfo_entry_l3_ipv6 {
387
- u64 nit;
388
- struct { unsigned char _s6_addr[16]; } addr;
389
-} __packed;
390
-struct qdio_brinfo_entry_l3_ipv4 {
391
- u64 nit;
392
- struct { uint32_t _s_addr; } addr;
393
-} __packed;
394
-struct qdio_brinfo_entry_l2 {
395
- u64 nit;
396
- struct { u8 mac[6]; u16 lnid; } addr_lnid;
397
-} __packed;
398365
399366 #define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */
400367 #define QDIO_STATE_ESTABLISHED 0x00000004 /* after qdio_establish */
....@@ -409,22 +376,22 @@
409376 void qdio_free_buffers(struct qdio_buffer **buf, unsigned int count);
410377 void qdio_reset_buffers(struct qdio_buffer **buf, unsigned int count);
411378
412
-extern int qdio_allocate(struct qdio_initialize *);
413
-extern int qdio_establish(struct qdio_initialize *);
379
+extern int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs,
380
+ unsigned int no_output_qs);
381
+extern int qdio_establish(struct ccw_device *cdev,
382
+ struct qdio_initialize *init_data);
414383 extern int qdio_activate(struct ccw_device *);
415384 extern void qdio_release_aob(struct qaob *);
416385 extern int do_QDIO(struct ccw_device *, unsigned int, int, unsigned int,
417386 unsigned int);
418
-extern int qdio_start_irq(struct ccw_device *, int);
419
-extern int qdio_stop_irq(struct ccw_device *, int);
387
+extern int qdio_start_irq(struct ccw_device *cdev);
388
+extern int qdio_stop_irq(struct ccw_device *cdev);
420389 extern int qdio_get_next_buffers(struct ccw_device *, int, int *, int *);
390
+extern int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr,
391
+ bool is_input, unsigned int *bufnr,
392
+ unsigned int *error);
421393 extern int qdio_shutdown(struct ccw_device *, int);
422394 extern int qdio_free(struct ccw_device *);
423395 extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *);
424
-extern int qdio_pnso_brinfo(struct subchannel_id schid,
425
- int cnc, u16 *response,
426
- void (*cb)(void *priv, enum qdio_brinfo_entry_type type,
427
- void *entry),
428
- void *priv);
429396
430397 #endif /* __QDIO_H__ */