Commit e9091ffd authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Vasily Gorbik

s390/qdio: fill SL with absolute addresses

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: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: default avatarAlexandra Winter <wintera@linux.ibm.com>
Reviewed-by: Steffen Maier <maier@linux.ibm.com> [for qdio]
Reviewed-by: default avatarBenjamin Block <bblock@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 140588bf
...@@ -227,7 +227,7 @@ struct qdio_buffer { ...@@ -227,7 +227,7 @@ struct qdio_buffer {
* @sbal: absolute SBAL address * @sbal: absolute SBAL address
*/ */
struct sl_element { struct sl_element {
unsigned long sbal; u64 sbal;
} __attribute__ ((packed)); } __attribute__ ((packed));
/** /**
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/io.h>
#include <asm/qdio.h> #include <asm/qdio.h>
#include "cio.h" #include "cio.h"
...@@ -205,7 +206,7 @@ static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr, ...@@ -205,7 +206,7 @@ static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr,
/* fill in sl */ /* fill in sl */
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++) 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, static void setup_queues(struct qdio_irq *irq_ptr,
......
...@@ -4746,10 +4746,10 @@ static void qeth_qdio_establish_cq(struct qeth_card *card, ...@@ -4746,10 +4746,10 @@ static void qeth_qdio_establish_cq(struct qeth_card *card,
if (card->options.cq == QETH_CQ_ENABLED) { if (card->options.cq == QETH_CQ_ENABLED) {
int offset = QDIO_MAX_BUFFERS_PER_Q * int offset = QDIO_MAX_BUFFERS_PER_Q *
(card->qdio.no_in_queues - 1); (card->qdio.no_in_queues - 1);
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
in_sbal_ptrs[offset + i] = (struct qdio_buffer *) for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++)
virt_to_phys(card->qdio.c_q->bufs[i].buffer); in_sbal_ptrs[offset + i] =
} card->qdio.c_q->bufs[i].buffer;
queue_start_poll[card->qdio.no_in_queues - 1] = NULL; queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
} }
...@@ -4783,10 +4783,9 @@ static int qeth_qdio_establish(struct qeth_card *card) ...@@ -4783,10 +4783,9 @@ static int qeth_qdio_establish(struct qeth_card *card)
rc = -ENOMEM; rc = -ENOMEM;
goto out_free_qib_param; goto out_free_qib_param;
} }
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
in_sbal_ptrs[i] = (struct qdio_buffer *) for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++)
virt_to_phys(card->qdio.in_q->bufs[i].buffer); in_sbal_ptrs[i] = card->qdio.in_q->bufs[i].buffer;
}
queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *), queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *),
GFP_KERNEL); GFP_KERNEL);
...@@ -4807,11 +4806,11 @@ static int qeth_qdio_establish(struct qeth_card *card) ...@@ -4807,11 +4806,11 @@ static int qeth_qdio_establish(struct qeth_card *card)
rc = -ENOMEM; rc = -ENOMEM;
goto out_free_queue_start_poll; goto out_free_queue_start_poll;
} }
for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i) for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) { for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++, k++)
out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys( out_sbal_ptrs[k] =
card->qdio.out_qs[i]->bufs[j]->buffer); card->qdio.out_qs[i]->bufs[j]->buffer;
}
memset(&init_data, 0, sizeof(struct qdio_initialize)); memset(&init_data, 0, sizeof(struct qdio_initialize));
init_data.cdev = CARD_DDEV(card); init_data.cdev = CARD_DDEV(card);
......
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