Skip to content

Commit

Permalink
[S390] qdio enhanced SIGA (iqdio) support.
Browse files Browse the repository at this point in the history
Add support for z10 HiperSockets multiwrite SBALs on output
queues. This is used on LPAR with EDDP enabled devices.

Signed-off-by: Klaus-Dieter Wacker <kdwacker@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Klaus-Dieter Wacker authored and Martin Schwidefsky committed Oct 10, 2008
1 parent b1e7661 commit 7a0f475
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 6 deletions.
8 changes: 7 additions & 1 deletion arch/s390/include/asm/qdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,13 @@ struct qdio_ssqd_desc {
u8 mbccnt;
u16 qdioac2;
u64 sch_token;
u64:64;
u8 mro;
u8 mri;
u8:8;
u8 sbalic;
u16:16;
u8:8;
u8 mmwc;
} __attribute__ ((packed));

/* params are: ccw_device, qdio_error, queue_number,
Expand Down
3 changes: 3 additions & 0 deletions drivers/s390/cio/qdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,9 @@ struct qdio_output_q {
/* PCIs are enabled for the queue */
int pci_out_enabled;

/* IQDIO: output multiple buffers (enhanced SIGA) */
int use_enh_siga;

/* timer to check for more outbound work */
struct timer_list timer;
};
Expand Down
24 changes: 19 additions & 5 deletions drivers/s390/cio/qdio_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,9 @@ static inline int qdio_do_siga_output(struct qdio_q *q, unsigned int *busy_bit)
unsigned int fc = 0;
unsigned long schid;

if (q->u.out.use_enh_siga) {
fc = 3;
}
if (!is_qebsm(q))
schid = *((u32 *)&q->irq_ptr->schid);
else {
Expand Down Expand Up @@ -1449,6 +1452,8 @@ int qdio_establish(struct qdio_initialize *init_data)
}

qdio_setup_ssqd_info(irq_ptr);
sprintf(dbf_text, "qDmmwc%2x", irq_ptr->ssqd_desc.mmwc);
QDIO_DBF_TEXT2(0, setup, dbf_text);
sprintf(dbf_text, "qib ac%2x", irq_ptr->qib.ac);
QDIO_DBF_TEXT2(0, setup, dbf_text);

Expand Down Expand Up @@ -1621,12 +1626,21 @@ static void handle_outbound(struct qdio_q *q, unsigned int callflags,
if (multicast_outbound(q))
qdio_kick_outbound_q(q);
else
/*
* One siga-w per buffer required for unicast
* HiperSockets.
*/
while (count--)
if ((q->irq_ptr->ssqd_desc.mmwc > 1) &&
(count > 1) &&
(count <= q->irq_ptr->ssqd_desc.mmwc)) {
/* exploit enhanced SIGA */
q->u.out.use_enh_siga = 1;
qdio_kick_outbound_q(q);
} else {
/*
* One siga-w per buffer required for unicast
* HiperSockets.
*/
q->u.out.use_enh_siga = 0;
while (count--)
qdio_kick_outbound_q(q);
}
goto out;
}

Expand Down

0 comments on commit 7a0f475

Please sign in to comment.