| From 2eedc75441ca95c9b9666e043e8e195a538b2913 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 10 Feb 2020 10:48:11 +0100 |
| Subject: s390/qdio: fill SL with absolute addresses |
| |
| From: Julian Wiedmann <jwi@linux.ibm.com> |
| |
| [ Upstream commit e9091ffd6a0aaced111b5d6ead5eaab5cd7101bc ] |
| |
| As the comment says, sl->sbal holds an absolute address. qeth currently |
| solves this through wild casting, while zfcp doesn't care. |
| |
| Handle this properly in the code that actually builds the SL. |
| |
| Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> |
| Reviewed-by: Alexandra Winter <wintera@linux.ibm.com> |
| Reviewed-by: Steffen Maier <maier@linux.ibm.com> [for qdio] |
| Reviewed-by: Benjamin Block <bblock@linux.ibm.com> |
| Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/include/asm/qdio.h | 2 +- |
| drivers/s390/cio/qdio_setup.c | 3 ++- |
| drivers/s390/net/qeth_core_main.c | 23 +++++++++++------------ |
| 3 files changed, 14 insertions(+), 14 deletions(-) |
| |
| diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h |
| index 71e3f0146cda0..7870cf8345334 100644 |
| --- a/arch/s390/include/asm/qdio.h |
| +++ b/arch/s390/include/asm/qdio.h |
| @@ -227,7 +227,7 @@ struct qdio_buffer { |
| * @sbal: absolute SBAL address |
| */ |
| struct sl_element { |
| - unsigned long sbal; |
| + u64 sbal; |
| } __attribute__ ((packed)); |
| |
| /** |
| diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c |
| index dc430bd86ade9..58eaac70dba7f 100644 |
| --- a/drivers/s390/cio/qdio_setup.c |
| +++ b/drivers/s390/cio/qdio_setup.c |
| @@ -8,6 +8,7 @@ |
| #include <linux/kernel.h> |
| #include <linux/slab.h> |
| #include <linux/export.h> |
| +#include <linux/io.h> |
| #include <asm/qdio.h> |
| |
| #include "cio.h" |
| @@ -205,7 +206,7 @@ static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr, |
| |
| /* fill in sl */ |
| for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++) |
| - q->sl->element[j].sbal = (unsigned long)q->sbal[j]; |
| + q->sl->element[j].sbal = virt_to_phys(q->sbal[j]); |
| } |
| |
| static void setup_queues(struct qdio_irq *irq_ptr, |
| diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c |
| index 10edfd6fc9302..4fd7b0ceb4ffd 100644 |
| --- a/drivers/s390/net/qeth_core_main.c |
| +++ b/drivers/s390/net/qeth_core_main.c |
| @@ -4749,10 +4749,10 @@ static void qeth_qdio_establish_cq(struct qeth_card *card, |
| if (card->options.cq == QETH_CQ_ENABLED) { |
| int offset = QDIO_MAX_BUFFERS_PER_Q * |
| (card->qdio.no_in_queues - 1); |
| - for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) { |
| - in_sbal_ptrs[offset + i] = (struct qdio_buffer *) |
| - virt_to_phys(card->qdio.c_q->bufs[i].buffer); |
| - } |
| + |
| + for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) |
| + in_sbal_ptrs[offset + i] = |
| + card->qdio.c_q->bufs[i].buffer; |
| |
| queue_start_poll[card->qdio.no_in_queues - 1] = NULL; |
| } |
| @@ -4786,10 +4786,9 @@ static int qeth_qdio_establish(struct qeth_card *card) |
| rc = -ENOMEM; |
| goto out_free_qib_param; |
| } |
| - for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) { |
| - in_sbal_ptrs[i] = (struct qdio_buffer *) |
| - virt_to_phys(card->qdio.in_q->bufs[i].buffer); |
| - } |
| + |
| + for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) |
| + in_sbal_ptrs[i] = card->qdio.in_q->bufs[i].buffer; |
| |
| queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *), |
| GFP_KERNEL); |
| @@ -4810,11 +4809,11 @@ static int qeth_qdio_establish(struct qeth_card *card) |
| rc = -ENOMEM; |
| goto out_free_queue_start_poll; |
| } |
| + |
| for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i) |
| - for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) { |
| - out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys( |
| - card->qdio.out_qs[i]->bufs[j]->buffer); |
| - } |
| + for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++, k++) |
| + out_sbal_ptrs[k] = |
| + card->qdio.out_qs[i]->bufs[j]->buffer; |
| |
| memset(&init_data, 0, sizeof(struct qdio_initialize)); |
| init_data.cdev = CARD_DDEV(card); |
| -- |
| 2.20.1 |
| |