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: 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>
This commit is contained in:
parent
140588bfed
commit
e9091ffd6a
|
@ -227,7 +227,7 @@ struct qdio_buffer {
|
|||
* @sbal: absolute SBAL address
|
||||
*/
|
||||
struct sl_element {
|
||||
unsigned long sbal;
|
||||
u64 sbal;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -4746,10 +4746,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;
|
||||
}
|
||||
|
@ -4783,10 +4783,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);
|
||||
|
@ -4807,11 +4806,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);
|
||||
|
|
Loading…
Reference in New Issue