diff options
author | Swen Schillig <swen@vnet.ibm.com> | 2011-08-15 08:40:31 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-08-27 10:37:02 -0400 |
commit | dfe5bb506172307e43287b8962348fb85801c0f4 (patch) | |
tree | e0d37e3d37068b39b886a3895f1cfacc7fb8c04f | |
parent | cc405acee244310cc87ddc5e3f4bc61342ec8161 (diff) |
[SCSI] qdio: base support for hardware data router with zfcp
FICON Express8S supports hardware data router, which requires an
adapted qdio request format.
This part 1/2 provides the qdio base required for exploitation in
zfcp.
Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r-- | arch/s390/include/asm/qdio.h | 5 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 11 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_setup.c | 1 |
3 files changed, 14 insertions, 3 deletions
diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h index 15c97625df8d..cbbf7d831a33 100644 --- a/arch/s390/include/asm/qdio.h +++ b/arch/s390/include/asm/qdio.h | |||
@@ -46,6 +46,8 @@ struct qdesfmt0 { | |||
46 | u32 : 16; | 46 | u32 : 16; |
47 | } __attribute__ ((packed)); | 47 | } __attribute__ ((packed)); |
48 | 48 | ||
49 | #define QDR_AC_MULTI_BUFFER_ENABLE 0x01 | ||
50 | |||
49 | /** | 51 | /** |
50 | * struct qdr - queue description record (QDR) | 52 | * struct qdr - queue description record (QDR) |
51 | * @qfmt: queue format | 53 | * @qfmt: queue format |
@@ -222,6 +224,8 @@ struct slsb { | |||
222 | u8 val[QDIO_MAX_BUFFERS_PER_Q]; | 224 | u8 val[QDIO_MAX_BUFFERS_PER_Q]; |
223 | } __attribute__ ((packed, aligned(256))); | 225 | } __attribute__ ((packed, aligned(256))); |
224 | 226 | ||
227 | #define CHSC_AC2_MULTI_BUFFER_AVAILABLE 0x0080 | ||
228 | #define CHSC_AC2_MULTI_BUFFER_ENABLED 0x0040 | ||
225 | #define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010 | 229 | #define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010 |
226 | #define CHSC_AC2_DATA_DIV_ENABLED 0x0002 | 230 | #define CHSC_AC2_DATA_DIV_ENABLED 0x0002 |
227 | 231 | ||
@@ -287,6 +291,7 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int, | |||
287 | struct qdio_initialize { | 291 | struct qdio_initialize { |
288 | struct ccw_device *cdev; | 292 | struct ccw_device *cdev; |
289 | unsigned char q_format; | 293 | unsigned char q_format; |
294 | unsigned char qdr_ac; | ||
290 | unsigned char adapter_name[8]; | 295 | unsigned char adapter_name[8]; |
291 | unsigned int qib_param_field_format; | 296 | unsigned int qib_param_field_format; |
292 | unsigned char *qib_param_field; | 297 | unsigned char *qib_param_field; |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 288c9140290e..d2c1f1becd4f 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -156,7 +156,8 @@ again: | |||
156 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); | 156 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); |
157 | q->handler(q->irq_ptr->cdev, | 157 | q->handler(q->irq_ptr->cdev, |
158 | QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 158 | QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
159 | 0, -1, -1, q->irq_ptr->int_parm); | 159 | q->nr, q->first_to_kick, count, |
160 | q->irq_ptr->int_parm); | ||
160 | return 0; | 161 | return 0; |
161 | } | 162 | } |
162 | return count - tmp_count; | 163 | return count - tmp_count; |
@@ -202,7 +203,8 @@ again: | |||
202 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); | 203 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); |
203 | q->handler(q->irq_ptr->cdev, | 204 | q->handler(q->irq_ptr->cdev, |
204 | QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 205 | QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
205 | 0, -1, -1, q->irq_ptr->int_parm); | 206 | q->nr, q->first_to_kick, count, |
207 | q->irq_ptr->int_parm); | ||
206 | return 0; | 208 | return 0; |
207 | } | 209 | } |
208 | WARN_ON(tmp_count); | 210 | WARN_ON(tmp_count); |
@@ -942,6 +944,7 @@ static void qdio_handle_activate_check(struct ccw_device *cdev, | |||
942 | { | 944 | { |
943 | struct qdio_irq *irq_ptr = cdev->private->qdio_data; | 945 | struct qdio_irq *irq_ptr = cdev->private->qdio_data; |
944 | struct qdio_q *q; | 946 | struct qdio_q *q; |
947 | int count; | ||
945 | 948 | ||
946 | DBF_ERROR("%4x ACT CHECK", irq_ptr->schid.sch_no); | 949 | DBF_ERROR("%4x ACT CHECK", irq_ptr->schid.sch_no); |
947 | DBF_ERROR("intp :%lx", intparm); | 950 | DBF_ERROR("intp :%lx", intparm); |
@@ -955,8 +958,10 @@ static void qdio_handle_activate_check(struct ccw_device *cdev, | |||
955 | dump_stack(); | 958 | dump_stack(); |
956 | goto no_handler; | 959 | goto no_handler; |
957 | } | 960 | } |
961 | |||
962 | count = sub_buf(q->first_to_check, q->first_to_kick); | ||
958 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 963 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
959 | 0, -1, -1, irq_ptr->int_parm); | 964 | q->nr, q->first_to_kick, count, irq_ptr->int_parm); |
960 | no_handler: | 965 | no_handler: |
961 | qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED); | 966 | qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED); |
962 | } | 967 | } |
diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c index 89107d0938c4..a82b2d39c9f0 100644 --- a/drivers/s390/cio/qdio_setup.c +++ b/drivers/s390/cio/qdio_setup.c | |||
@@ -345,6 +345,7 @@ static void setup_qdr(struct qdio_irq *irq_ptr, | |||
345 | int i; | 345 | int i; |
346 | 346 | ||
347 | irq_ptr->qdr->qfmt = qdio_init->q_format; | 347 | irq_ptr->qdr->qfmt = qdio_init->q_format; |
348 | irq_ptr->qdr->ac = qdio_init->qdr_ac; | ||
348 | irq_ptr->qdr->iqdcnt = qdio_init->no_input_qs; | 349 | irq_ptr->qdr->iqdcnt = qdio_init->no_input_qs; |
349 | irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs; | 350 | irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs; |
350 | irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */ | 351 | irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */ |