[S390] qdio: move ACK to newest buffer for devices without QEBSM
authorJan Glauber <jang@linux.vnet.ibm.com>
Thu, 26 Mar 2009 14:24:28 +0000 (15:24 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 26 Mar 2009 14:24:21 +0000 (15:24 +0100)
The ACKnowledgement state should be set on the newest SBAL so an
adapter interrupt surpression check needs to scan fewer SBALs.

Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/qdio_main.c

index 8e6bc9cddfa02d514bca838ea34bf8d0f7ce7d19..61ba765936a63b0bc0ecdbb3c6b530c872f4a846 100644 (file)
@@ -440,12 +440,16 @@ static inline void inbound_primed(struct qdio_q *q, int count)
                /* reset the previous ACK but first set the new one */
                set_buf_state(q, new, SLSB_P_INPUT_ACK);
                set_buf_state(q, q->last_move_ftc, SLSB_P_INPUT_NOT_INIT);
-       }
-       else {
+       } else {
                q->u.in.polling = 1;
-               set_buf_state(q, q->first_to_check, SLSB_P_INPUT_ACK);
+               set_buf_state(q, new, SLSB_P_INPUT_ACK);
        }
 
+       /*
+        * last_move_ftc points to the ACK'ed buffer and not to the last turns
+        * first_to_check like for qebsm. Since it is only used to check if
+        * the queue front moved in qdio_inbound_q_done this is not a problem.
+        */
        q->last_move_ftc = new;
        count--;
        if (!count)
@@ -455,7 +459,7 @@ static inline void inbound_primed(struct qdio_q *q, int count)
         * Need to change all PRIMED buffers to NOT_INIT, otherwise
         * we're loosing initiative in the thinint code.
         */
-       set_buf_states(q, next_buf(q->first_to_check), SLSB_P_INPUT_NOT_INIT,
+       set_buf_states(q, q->first_to_check, SLSB_P_INPUT_NOT_INIT,
                       count);
 }
 
@@ -1480,7 +1484,6 @@ static void handle_inbound(struct qdio_q *q, unsigned int callflags,
                        if (q->u.in.ack_count <= 0) {
                                q->u.in.polling = 0;
                                q->u.in.ack_count = 0;
-                               /* TODO: must we set last_move_ftc to something meaningful? */
                                goto set;
                        }
                        q->last_move_ftc = add_buf(q->last_move_ftc, diff);