diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/net/qeth_core.h | 4 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 21 |
2 files changed, 17 insertions, 8 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index a2088af51cc5..4f9a3180f663 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h | |||
@@ -439,10 +439,10 @@ struct qeth_qdio_buffer { | |||
439 | }; | 439 | }; |
440 | 440 | ||
441 | struct qeth_qdio_q { | 441 | struct qeth_qdio_q { |
442 | struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q]; | 442 | struct qdio_buffer *qdio_bufs[QDIO_MAX_BUFFERS_PER_Q]; |
443 | struct qeth_qdio_buffer bufs[QDIO_MAX_BUFFERS_PER_Q]; | 443 | struct qeth_qdio_buffer bufs[QDIO_MAX_BUFFERS_PER_Q]; |
444 | int next_buf_to_init; | 444 | int next_buf_to_init; |
445 | } __attribute__ ((aligned(256))); | 445 | }; |
446 | 446 | ||
447 | struct qeth_qdio_out_buffer { | 447 | struct qeth_qdio_out_buffer { |
448 | struct qdio_buffer *buffer; | 448 | struct qdio_buffer *buffer; |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index a0a6ad7a1739..acedba8539e4 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -294,6 +294,10 @@ EXPORT_SYMBOL_GPL(qeth_realloc_buffer_pool); | |||
294 | 294 | ||
295 | static void qeth_free_qdio_queue(struct qeth_qdio_q *q) | 295 | static void qeth_free_qdio_queue(struct qeth_qdio_q *q) |
296 | { | 296 | { |
297 | if (!q) | ||
298 | return; | ||
299 | |||
300 | qdio_free_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); | ||
297 | kfree(q); | 301 | kfree(q); |
298 | } | 302 | } |
299 | 303 | ||
@@ -305,8 +309,13 @@ static struct qeth_qdio_q *qeth_alloc_qdio_queue(void) | |||
305 | if (!q) | 309 | if (!q) |
306 | return NULL; | 310 | return NULL; |
307 | 311 | ||
312 | if (qdio_alloc_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q)) { | ||
313 | kfree(q); | ||
314 | return NULL; | ||
315 | } | ||
316 | |||
308 | for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) | 317 | for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) |
309 | q->bufs[i].buffer = &q->qdio_bufs[i]; | 318 | q->bufs[i].buffer = q->qdio_bufs[i]; |
310 | 319 | ||
311 | QETH_DBF_HEX(SETUP, 2, &q, sizeof(void *)); | 320 | QETH_DBF_HEX(SETUP, 2, &q, sizeof(void *)); |
312 | return q; | 321 | return q; |
@@ -318,8 +327,8 @@ static inline int qeth_cq_init(struct qeth_card *card) | |||
318 | 327 | ||
319 | if (card->options.cq == QETH_CQ_ENABLED) { | 328 | if (card->options.cq == QETH_CQ_ENABLED) { |
320 | QETH_DBF_TEXT(SETUP, 2, "cqinit"); | 329 | QETH_DBF_TEXT(SETUP, 2, "cqinit"); |
321 | memset(card->qdio.c_q->qdio_bufs, 0, | 330 | qdio_reset_buffers(card->qdio.c_q->qdio_bufs, |
322 | QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer)); | 331 | QDIO_MAX_BUFFERS_PER_Q); |
323 | card->qdio.c_q->next_buf_to_init = 127; | 332 | card->qdio.c_q->next_buf_to_init = 127; |
324 | rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, | 333 | rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, |
325 | card->qdio.no_in_queues - 1, 0, | 334 | card->qdio.no_in_queues - 1, 0, |
@@ -2791,8 +2800,8 @@ int qeth_init_qdio_queues(struct qeth_card *card) | |||
2791 | QETH_DBF_TEXT(SETUP, 2, "initqdqs"); | 2800 | QETH_DBF_TEXT(SETUP, 2, "initqdqs"); |
2792 | 2801 | ||
2793 | /* inbound queue */ | 2802 | /* inbound queue */ |
2794 | memset(card->qdio.in_q->qdio_bufs, 0, | 2803 | qdio_reset_buffers(card->qdio.in_q->qdio_bufs, |
2795 | QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer)); | 2804 | QDIO_MAX_BUFFERS_PER_Q); |
2796 | qeth_initialize_working_pool_list(card); | 2805 | qeth_initialize_working_pool_list(card); |
2797 | /*give only as many buffers to hardware as we have buffer pool entries*/ | 2806 | /*give only as many buffers to hardware as we have buffer pool entries*/ |
2798 | for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i) | 2807 | for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i) |
@@ -3533,7 +3542,7 @@ static void qeth_qdio_cq_handler(struct qeth_card *card, | |||
3533 | 3542 | ||
3534 | for (i = first_element; i < first_element + count; ++i) { | 3543 | for (i = first_element; i < first_element + count; ++i) { |
3535 | int bidx = i % QDIO_MAX_BUFFERS_PER_Q; | 3544 | int bidx = i % QDIO_MAX_BUFFERS_PER_Q; |
3536 | struct qdio_buffer *buffer = &cq->qdio_bufs[bidx]; | 3545 | struct qdio_buffer *buffer = cq->qdio_bufs[bidx]; |
3537 | int e; | 3546 | int e; |
3538 | 3547 | ||
3539 | e = 0; | 3548 | e = 0; |