diff options
| author | Frank Pavlic <fpavlic@de.ibm.com> | 2006-02-20 21:28:12 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-20 23:00:12 -0500 |
| commit | 15c73691780252a5571bfa7902b4dc227ec66c84 (patch) | |
| tree | 2a2829292ca09b1774c3941ef8fdb2f5cf0f39c6 /drivers/s390 | |
| parent | a1909e631caa3a02c25e493ac4004cd67984e0e0 (diff) | |
[PATCH] s390: V=V qdio fixes
Using FCP devices with V=V support, the input queue stalled when CCQ 97 had
been returned in qdio_do_eqbs. When this happen we have to reissue the eqbs
instruction.
Another bug was when V=V was enabled we checked if hardware has SIGA-sync
support. If not we returned with 0 from tiqdio_is_inbound_q_done. Thus qdio
lost initiative on FCP devices and input queue stalled. Running devices in
V=V there is no SIGA-sync support but nevertheless we have to process
tiqdio_is_inbound_q_done either.
Signed-off-by: Frank Pavlic <fpavlic@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/s390')
| -rw-r--r-- | drivers/s390/cio/qdio.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 45ce032772f..9ed37dc9a1b 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
| @@ -165,8 +165,13 @@ qdio_do_eqbs(struct qdio_q *q, unsigned char *state, | |||
| 165 | q_no = q->q_no; | 165 | q_no = q->q_no; |
| 166 | if(!q->is_input_q) | 166 | if(!q->is_input_q) |
| 167 | q_no += irq->no_input_qs; | 167 | q_no += irq->no_input_qs; |
| 168 | again: | ||
| 168 | ccq = do_eqbs(irq->sch_token, state, q_no, start, cnt); | 169 | ccq = do_eqbs(irq->sch_token, state, q_no, start, cnt); |
| 169 | rc = qdio_check_ccq(q, ccq); | 170 | rc = qdio_check_ccq(q, ccq); |
| 171 | if (rc == 1) { | ||
| 172 | QDIO_DBF_TEXT5(1,trace,"eqAGAIN"); | ||
| 173 | goto again; | ||
| 174 | } | ||
| 170 | if (rc < 0) { | 175 | if (rc < 0) { |
| 171 | QDIO_DBF_TEXT2(1,trace,"eqberr"); | 176 | QDIO_DBF_TEXT2(1,trace,"eqberr"); |
| 172 | sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt, *cnt, ccq, q_no); | 177 | sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt, *cnt, ccq, q_no); |
| @@ -195,8 +200,13 @@ qdio_do_sqbs(struct qdio_q *q, unsigned char state, | |||
| 195 | q_no = q->q_no; | 200 | q_no = q->q_no; |
| 196 | if(!q->is_input_q) | 201 | if(!q->is_input_q) |
| 197 | q_no += irq->no_input_qs; | 202 | q_no += irq->no_input_qs; |
| 203 | again: | ||
| 198 | ccq = do_sqbs(irq->sch_token, state, q_no, start, cnt); | 204 | ccq = do_sqbs(irq->sch_token, state, q_no, start, cnt); |
| 199 | rc = qdio_check_ccq(q, ccq); | 205 | rc = qdio_check_ccq(q, ccq); |
| 206 | if (rc == 1) { | ||
| 207 | QDIO_DBF_TEXT5(1,trace,"sqAGAIN"); | ||
| 208 | goto again; | ||
| 209 | } | ||
| 200 | if (rc < 0) { | 210 | if (rc < 0) { |
| 201 | QDIO_DBF_TEXT3(1,trace,"sqberr"); | 211 | QDIO_DBF_TEXT3(1,trace,"sqberr"); |
| 202 | sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt,*cnt,ccq,q_no); | 212 | sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt,*cnt,ccq,q_no); |
| @@ -1187,8 +1197,7 @@ tiqdio_is_inbound_q_done(struct qdio_q *q) | |||
| 1187 | 1197 | ||
| 1188 | if (!no_used) | 1198 | if (!no_used) |
| 1189 | return 1; | 1199 | return 1; |
| 1190 | 1200 | if (!q->siga_sync && !irq->is_qebsm) | |
| 1191 | if (!q->siga_sync) | ||
| 1192 | /* we'll check for more primed buffers in qeth_stop_polling */ | 1201 | /* we'll check for more primed buffers in qeth_stop_polling */ |
| 1193 | return 0; | 1202 | return 0; |
| 1194 | if (irq->is_qebsm) { | 1203 | if (irq->is_qebsm) { |
