Skip to content

Commit e9091ff

Browse files
julianwiedmannVasily Gorbik
authored andcommitted
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 <[email protected]> Reviewed-by: Alexandra Winter <[email protected]> Reviewed-by: Steffen Maier <[email protected]> [for qdio] Reviewed-by: Benjamin Block <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
1 parent 140588b commit e9091ff

File tree

3 files changed

+14
-14
lines changed

3 files changed

+14
-14
lines changed

arch/s390/include/asm/qdio.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ struct qdio_buffer {
227227
* @sbal: absolute SBAL address
228228
*/
229229
struct sl_element {
230-
unsigned long sbal;
230+
u64 sbal;
231231
} __attribute__ ((packed));
232232

233233
/**

drivers/s390/cio/qdio_setup.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/kernel.h>
99
#include <linux/slab.h>
1010
#include <linux/export.h>
11+
#include <linux/io.h>
1112
#include <asm/qdio.h>
1213

1314
#include "cio.h"
@@ -205,7 +206,7 @@ static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr,
205206

206207
/* fill in sl */
207208
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++)
208-
q->sl->element[j].sbal = (unsigned long)q->sbal[j];
209+
q->sl->element[j].sbal = virt_to_phys(q->sbal[j]);
209210
}
210211

211212
static void setup_queues(struct qdio_irq *irq_ptr,

drivers/s390/net/qeth_core_main.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4746,10 +4746,10 @@ static void qeth_qdio_establish_cq(struct qeth_card *card,
47464746
if (card->options.cq == QETH_CQ_ENABLED) {
47474747
int offset = QDIO_MAX_BUFFERS_PER_Q *
47484748
(card->qdio.no_in_queues - 1);
4749-
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4750-
in_sbal_ptrs[offset + i] = (struct qdio_buffer *)
4751-
virt_to_phys(card->qdio.c_q->bufs[i].buffer);
4752-
}
4749+
4750+
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++)
4751+
in_sbal_ptrs[offset + i] =
4752+
card->qdio.c_q->bufs[i].buffer;
47534753

47544754
queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
47554755
}
@@ -4783,10 +4783,9 @@ static int qeth_qdio_establish(struct qeth_card *card)
47834783
rc = -ENOMEM;
47844784
goto out_free_qib_param;
47854785
}
4786-
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4787-
in_sbal_ptrs[i] = (struct qdio_buffer *)
4788-
virt_to_phys(card->qdio.in_q->bufs[i].buffer);
4789-
}
4786+
4787+
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++)
4788+
in_sbal_ptrs[i] = card->qdio.in_q->bufs[i].buffer;
47904789

47914790
queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *),
47924791
GFP_KERNEL);
@@ -4807,11 +4806,11 @@ static int qeth_qdio_establish(struct qeth_card *card)
48074806
rc = -ENOMEM;
48084807
goto out_free_queue_start_poll;
48094808
}
4809+
48104810
for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
4811-
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) {
4812-
out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys(
4813-
card->qdio.out_qs[i]->bufs[j]->buffer);
4814-
}
4811+
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++, k++)
4812+
out_sbal_ptrs[k] =
4813+
card->qdio.out_qs[i]->bufs[j]->buffer;
48154814

48164815
memset(&init_data, 0, sizeof(struct qdio_initialize));
48174816
init_data.cdev = CARD_DDEV(card);

0 commit comments

Comments
 (0)