Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dfe5bb50 authored by Swen Schillig's avatar Swen Schillig Committed by James Bottomley
Browse files

[SCSI] qdio: base support for hardware data router with zfcp



FICON Express8S supports hardware data router, which requires an
adapted qdio request format.
This part 1/2 provides the qdio base required for exploitation in
zfcp.

Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarSteffen Maier <maier@linux.vnet.ibm.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent cc405ace
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,8 @@ struct qdesfmt0 {
	u32	 : 16;
	u32	 : 16;
} __attribute__ ((packed));
} __attribute__ ((packed));


#define QDR_AC_MULTI_BUFFER_ENABLE 0x01

/**
/**
 * struct qdr - queue description record (QDR)
 * struct qdr - queue description record (QDR)
 * @qfmt: queue format
 * @qfmt: queue format
@@ -222,6 +224,8 @@ struct slsb {
	u8 val[QDIO_MAX_BUFFERS_PER_Q];
	u8 val[QDIO_MAX_BUFFERS_PER_Q];
} __attribute__ ((packed, aligned(256)));
} __attribute__ ((packed, aligned(256)));


#define CHSC_AC2_MULTI_BUFFER_AVAILABLE	0x0080
#define CHSC_AC2_MULTI_BUFFER_ENABLED	0x0040
#define CHSC_AC2_DATA_DIV_AVAILABLE	0x0010
#define CHSC_AC2_DATA_DIV_AVAILABLE	0x0010
#define CHSC_AC2_DATA_DIV_ENABLED	0x0002
#define CHSC_AC2_DATA_DIV_ENABLED	0x0002


@@ -287,6 +291,7 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
struct qdio_initialize {
struct qdio_initialize {
	struct ccw_device *cdev;
	struct ccw_device *cdev;
	unsigned char q_format;
	unsigned char q_format;
	unsigned char qdr_ac;
	unsigned char adapter_name[8];
	unsigned char adapter_name[8];
	unsigned int qib_param_field_format;
	unsigned int qib_param_field_format;
	unsigned char *qib_param_field;
	unsigned char *qib_param_field;
+8 −3
Original line number Original line Diff line number Diff line
@@ -156,7 +156,8 @@ again:
		DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
		DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
		q->handler(q->irq_ptr->cdev,
		q->handler(q->irq_ptr->cdev,
			   QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
			   QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
			   0, -1, -1, q->irq_ptr->int_parm);
			   q->nr, q->first_to_kick, count,
			   q->irq_ptr->int_parm);
		return 0;
		return 0;
	}
	}
	return count - tmp_count;
	return count - tmp_count;
@@ -202,7 +203,8 @@ again:
		DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
		DBF_ERROR("%3d%3d%2d", count, tmp_count, nr);
		q->handler(q->irq_ptr->cdev,
		q->handler(q->irq_ptr->cdev,
			   QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
			   QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
			   0, -1, -1, q->irq_ptr->int_parm);
			   q->nr, q->first_to_kick, count,
			   q->irq_ptr->int_parm);
		return 0;
		return 0;
	}
	}
	WARN_ON(tmp_count);
	WARN_ON(tmp_count);
@@ -942,6 +944,7 @@ static void qdio_handle_activate_check(struct ccw_device *cdev,
{
{
	struct qdio_irq *irq_ptr = cdev->private->qdio_data;
	struct qdio_irq *irq_ptr = cdev->private->qdio_data;
	struct qdio_q *q;
	struct qdio_q *q;
	int count;


	DBF_ERROR("%4x ACT CHECK", irq_ptr->schid.sch_no);
	DBF_ERROR("%4x ACT CHECK", irq_ptr->schid.sch_no);
	DBF_ERROR("intp :%lx", intparm);
	DBF_ERROR("intp :%lx", intparm);
@@ -955,8 +958,10 @@ static void qdio_handle_activate_check(struct ccw_device *cdev,
		dump_stack();
		dump_stack();
		goto no_handler;
		goto no_handler;
	}
	}

	count = sub_buf(q->first_to_check, q->first_to_kick);
	q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
	q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION,
		   0, -1, -1, irq_ptr->int_parm);
		   q->nr, q->first_to_kick, count, irq_ptr->int_parm);
no_handler:
no_handler:
	qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED);
	qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED);
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -345,6 +345,7 @@ static void setup_qdr(struct qdio_irq *irq_ptr,
	int i;
	int i;


	irq_ptr->qdr->qfmt = qdio_init->q_format;
	irq_ptr->qdr->qfmt = qdio_init->q_format;
	irq_ptr->qdr->ac = qdio_init->qdr_ac;
	irq_ptr->qdr->iqdcnt = qdio_init->no_input_qs;
	irq_ptr->qdr->iqdcnt = qdio_init->no_input_qs;
	irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs;
	irq_ptr->qdr->oqdcnt = qdio_init->no_output_qs;
	irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */
	irq_ptr->qdr->iqdsz = sizeof(struct qdesfmt0) / 4; /* size in words */