Commit 15c73691 authored by Frank Pavlic's avatar Frank Pavlic Committed by Linus Torvalds

[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: default avatarFrank Pavlic <fpavlic@de.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a1909e63
...@@ -165,8 +165,13 @@ qdio_do_eqbs(struct qdio_q *q, unsigned char *state, ...@@ -165,8 +165,13 @@ qdio_do_eqbs(struct qdio_q *q, unsigned char *state,
q_no = q->q_no; q_no = q->q_no;
if(!q->is_input_q) if(!q->is_input_q)
q_no += irq->no_input_qs; q_no += irq->no_input_qs;
again:
ccq = do_eqbs(irq->sch_token, state, q_no, start, cnt); ccq = do_eqbs(irq->sch_token, state, q_no, start, cnt);
rc = qdio_check_ccq(q, ccq); rc = qdio_check_ccq(q, ccq);
if (rc == 1) {
QDIO_DBF_TEXT5(1,trace,"eqAGAIN");
goto again;
}
if (rc < 0) { if (rc < 0) {
QDIO_DBF_TEXT2(1,trace,"eqberr"); QDIO_DBF_TEXT2(1,trace,"eqberr");
sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt, *cnt, ccq, q_no); 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,8 +200,13 @@ qdio_do_sqbs(struct qdio_q *q, unsigned char state,
q_no = q->q_no; q_no = q->q_no;
if(!q->is_input_q) if(!q->is_input_q)
q_no += irq->no_input_qs; q_no += irq->no_input_qs;
again:
ccq = do_sqbs(irq->sch_token, state, q_no, start, cnt); ccq = do_sqbs(irq->sch_token, state, q_no, start, cnt);
rc = qdio_check_ccq(q, ccq); rc = qdio_check_ccq(q, ccq);
if (rc == 1) {
QDIO_DBF_TEXT5(1,trace,"sqAGAIN");
goto again;
}
if (rc < 0) { if (rc < 0) {
QDIO_DBF_TEXT3(1,trace,"sqberr"); QDIO_DBF_TEXT3(1,trace,"sqberr");
sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt,*cnt,ccq,q_no); 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,8 +1197,7 @@ tiqdio_is_inbound_q_done(struct qdio_q *q)
if (!no_used) if (!no_used)
return 1; return 1;
if (!q->siga_sync && !irq->is_qebsm)
if (!q->siga_sync)
/* we'll check for more primed buffers in qeth_stop_polling */ /* we'll check for more primed buffers in qeth_stop_polling */
return 0; return 0;
if (irq->is_qebsm) { if (irq->is_qebsm) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment