Skip to content

Commit

Permalink
libata: Protect DMA core code by #ifdef CONFIG_HAS_DMA
Browse files Browse the repository at this point in the history
If NO_DMA=y:

    ERROR: "bad_dma_ops" [drivers/ata/libata.ko] undefined!

To fix this, protect the DMA code by #ifdef CONFIG_HAS_DMA, and provide
dummies of ata_sg_clean() and ata_sg_setup() for the !CONFIG_HAS_DMA
case.

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
  • Loading branch information
Geert Uytterhoeven authored and Tejun Heo committed Jan 6, 2017
1 parent 6cf32ed commit 2874d5e
Showing 1 changed file with 35 additions and 26 deletions.
61 changes: 35 additions & 26 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -4813,32 +4813,6 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
return err_mask;
}

/**
* ata_sg_clean - Unmap DMA memory associated with command
* @qc: Command containing DMA memory to be released
*
* Unmap all mapped DMA memory associated with this command.
*
* LOCKING:
* spin_lock_irqsave(host lock)
*/
static void ata_sg_clean(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;
struct scatterlist *sg = qc->sg;
int dir = qc->dma_dir;

WARN_ON_ONCE(sg == NULL);

VPRINTK("unmapping %u sg elements\n", qc->n_elem);

if (qc->n_elem)
dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);

qc->flags &= ~ATA_QCFLAG_DMAMAP;
qc->sg = NULL;
}

/**
* atapi_check_dma - Check whether ATAPI DMA can be supported
* @qc: Metadata associated with taskfile to check
Expand Down Expand Up @@ -4923,6 +4897,34 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
qc->cursg = qc->sg;
}

#ifdef CONFIG_HAS_DMA

/**
* ata_sg_clean - Unmap DMA memory associated with command
* @qc: Command containing DMA memory to be released
*
* Unmap all mapped DMA memory associated with this command.
*
* LOCKING:
* spin_lock_irqsave(host lock)
*/
void ata_sg_clean(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;
struct scatterlist *sg = qc->sg;
int dir = qc->dma_dir;

WARN_ON_ONCE(sg == NULL);

VPRINTK("unmapping %u sg elements\n", qc->n_elem);

if (qc->n_elem)
dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);

qc->flags &= ~ATA_QCFLAG_DMAMAP;
qc->sg = NULL;
}

/**
* ata_sg_setup - DMA-map the scatter-gather table associated with a command.
* @qc: Command with scatter-gather table to be mapped.
Expand Down Expand Up @@ -4955,6 +4957,13 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
return 0;
}

#else /* !CONFIG_HAS_DMA */

static inline void ata_sg_clean(struct ata_queued_cmd *qc) {}
static inline int ata_sg_setup(struct ata_queued_cmd *qc) { return -1; }

#endif /* !CONFIG_HAS_DMA */

/**
* swap_buf_le16 - swap halves of 16-bit words in place
* @buf: Buffer to swap
Expand Down

0 comments on commit 2874d5e

Please sign in to comment.