Commit ccc413f6 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Martin Schwidefsky

s390/qdio: clean up AOB handling

I've stumbled over this too many times now... AOBs are only ever used on
Output Queues. So in qdio_kick_handler(), move the call to their handler
into the Output-only path, and get rid of the convoluted contains_aobs()
helper. No functional change.

While at it, also remove
1. the unused sbal_state->aob field. For processing an async completion,
   upper-layer drivers get their AOB pointer from the CQ buffer.
2. an unused EXPORT for qdio_allocate_aob(). External users would have
   no way of passing an allocated AOB back into qdio.ko anyways...
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 4e62d458
...@@ -252,13 +252,11 @@ struct slsb { ...@@ -252,13 +252,11 @@ struct slsb {
* (for communication with upper layer programs) * (for communication with upper layer programs)
* (only required for use with completion queues) * (only required for use with completion queues)
* @flags: flags indicating state of buffer * @flags: flags indicating state of buffer
* @aob: pointer to QAOB used for the particular SBAL
* @user: pointer to upper layer program's state information related to SBAL * @user: pointer to upper layer program's state information related to SBAL
* (stored in user1 data of QAOB) * (stored in user1 data of QAOB)
*/ */
struct qdio_outbuf_state { struct qdio_outbuf_state {
u8 flags; u8 flags;
struct qaob *aob;
void *user; void *user;
}; };
......
...@@ -595,19 +595,11 @@ static inline int qdio_inbound_q_done(struct qdio_q *q) ...@@ -595,19 +595,11 @@ static inline int qdio_inbound_q_done(struct qdio_q *q)
return 0; return 0;
} }
static inline int contains_aobs(struct qdio_q *q)
{
return !q->is_input_q && q->u.out.use_cq;
}
static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count) static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count)
{ {
unsigned char state = 0; unsigned char state = 0;
int j, b = start; int j, b = start;
if (!contains_aobs(q))
return;
for (j = 0; j < count; ++j) { for (j = 0; j < count; ++j) {
get_buf_state(q, b, &state, 0); get_buf_state(q, b, &state, 0);
if (state == SLSB_P_OUTPUT_PENDING) { if (state == SLSB_P_OUTPUT_PENDING) {
...@@ -618,8 +610,6 @@ static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count) ...@@ -618,8 +610,6 @@ static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count)
q->u.out.sbal_state[b].flags |= q->u.out.sbal_state[b].flags |=
QDIO_OUTBUF_STATE_FLAG_PENDING; QDIO_OUTBUF_STATE_FLAG_PENDING;
q->u.out.aobs[b] = NULL; q->u.out.aobs[b] = NULL;
} else if (state == SLSB_P_OUTPUT_EMPTY) {
q->u.out.sbal_state[b].aob = NULL;
} }
b = next_buf(b); b = next_buf(b);
} }
...@@ -638,7 +628,6 @@ static inline unsigned long qdio_aob_for_buffer(struct qdio_output_q *q, ...@@ -638,7 +628,6 @@ static inline unsigned long qdio_aob_for_buffer(struct qdio_output_q *q,
q->aobs[bufnr] = aob; q->aobs[bufnr] = aob;
} }
if (q->aobs[bufnr]) { if (q->aobs[bufnr]) {
q->sbal_state[bufnr].aob = q->aobs[bufnr];
q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user; q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user;
phys_aob = virt_to_phys(q->aobs[bufnr]); phys_aob = virt_to_phys(q->aobs[bufnr]);
WARN_ON_ONCE(phys_aob & 0xFF); WARN_ON_ONCE(phys_aob & 0xFF);
...@@ -666,10 +655,10 @@ static void qdio_kick_handler(struct qdio_q *q) ...@@ -666,10 +655,10 @@ static void qdio_kick_handler(struct qdio_q *q)
qperf_inc(q, outbound_handler); qperf_inc(q, outbound_handler);
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "koh: s:%02x c:%02x", DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "koh: s:%02x c:%02x",
start, count); start, count);
if (q->u.out.use_cq)
qdio_handle_aobs(q, start, count);
} }
qdio_handle_aobs(q, start, count);
q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count, q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count,
q->irq_ptr->int_parm); q->irq_ptr->int_parm);
......
...@@ -27,7 +27,6 @@ struct qaob *qdio_allocate_aob(void) ...@@ -27,7 +27,6 @@ struct qaob *qdio_allocate_aob(void)
{ {
return kmem_cache_zalloc(qdio_aob_cache, GFP_ATOMIC); return kmem_cache_zalloc(qdio_aob_cache, GFP_ATOMIC);
} }
EXPORT_SYMBOL_GPL(qdio_allocate_aob);
void qdio_release_aob(struct qaob *aob) void qdio_release_aob(struct qaob *aob)
{ {
......
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