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

Commit ef026b18 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Tejun Heo
Browse files

libsas: enable FPDMA SEND/RECEIVE



Update libsas and dependent drivers to handle FPDMA
SEND/RECEIVE correctly.

Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent d238ffd5
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -1630,6 +1630,8 @@ static u8 get_ata_protocol(u8 cmd, int direction)
	switch (cmd) {
	switch (cmd) {
	case ATA_CMD_FPDMA_WRITE:
	case ATA_CMD_FPDMA_WRITE:
	case ATA_CMD_FPDMA_READ:
	case ATA_CMD_FPDMA_READ:
	case ATA_CMD_FPDMA_RECV:
	case ATA_CMD_FPDMA_SEND:
	return SATA_PROTOCOL_FPDMA;
	return SATA_PROTOCOL_FPDMA;


	case ATA_CMD_ID_ATA:
	case ATA_CMD_ID_ATA:
+3 −1
Original line number Original line Diff line number Diff line
@@ -3169,7 +3169,9 @@ static enum sci_status isci_request_stp_request_construct(struct isci_request *i
	status = sci_io_request_construct_basic_sata(ireq);
	status = sci_io_request_construct_basic_sata(ireq);


	if (qc && (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
	if (qc && (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
		   qc->tf.command == ATA_CMD_FPDMA_READ)) {
		   qc->tf.command == ATA_CMD_FPDMA_READ ||
		   qc->tf.command == ATA_CMD_FPDMA_RECV ||
		   qc->tf.command == ATA_CMD_FPDMA_SEND)) {
		fis->sector_count = qc->tag << 3;
		fis->sector_count = qc->tag << 3;
		ireq->tc->type.stp.ncq_tag = qc->tag;
		ireq->tc->type.stp.ncq_tag = qc->tag;
	}
	}
+4 −2
Original line number Original line Diff line number Diff line
@@ -205,7 +205,9 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
	task->task_done = sas_ata_task_done;
	task->task_done = sas_ata_task_done;


	if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
	if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
	    qc->tf.command == ATA_CMD_FPDMA_READ) {
	    qc->tf.command == ATA_CMD_FPDMA_READ ||
	    qc->tf.command == ATA_CMD_FPDMA_RECV ||
	    qc->tf.command == ATA_CMD_FPDMA_SEND) {
		/* Need to zero out the tag libata assigned us */
		/* Need to zero out the tag libata assigned us */
		qc->tf.nsect = 0;
		qc->tf.nsect = 0;
	}
	}
@@ -548,7 +550,7 @@ static struct ata_port_operations sas_sata_ops = {


static struct ata_port_info sata_port_info = {
static struct ata_port_info sata_port_info = {
	.flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA | ATA_FLAG_NCQ |
	.flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA | ATA_FLAG_NCQ |
		 ATA_FLAG_SAS_HOST,
		 ATA_FLAG_SAS_HOST | ATA_FLAG_FPDMA_AUX,
	.pio_mask = ATA_PIO4,
	.pio_mask = ATA_PIO4,
	.mwdma_mask = ATA_MWDMA2,
	.mwdma_mask = ATA_MWDMA2,
	.udma_mask = ATA_UDMA6,
	.udma_mask = ATA_UDMA6,
+3 −1
Original line number Original line Diff line number Diff line
@@ -429,7 +429,9 @@ static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag)


	if (qc) {
	if (qc) {
		if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
		if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
			qc->tf.command == ATA_CMD_FPDMA_READ) {
		    qc->tf.command == ATA_CMD_FPDMA_READ ||
		    qc->tf.command == ATA_CMD_FPDMA_RECV ||
		    qc->tf.command == ATA_CMD_FPDMA_SEND) {
			*tag = qc->tag;
			*tag = qc->tag;
			return 1;
			return 1;
		}
		}
+3 −1
Original line number Original line Diff line number Diff line
@@ -280,7 +280,9 @@ u32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag)
	struct ata_queued_cmd *qc = task->uldd_task;
	struct ata_queued_cmd *qc = task->uldd_task;
	if (qc) {
	if (qc) {
		if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
		if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
			qc->tf.command == ATA_CMD_FPDMA_READ) {
		    qc->tf.command == ATA_CMD_FPDMA_READ ||
		    qc->tf.command == ATA_CMD_FPDMA_RECV ||
		    qc->tf.command == ATA_CMD_FPDMA_SEND) {
			*tag = qc->tag;
			*tag = qc->tag;
			return 1;
			return 1;
		}
		}