lkml.org 
[lkml]   [2009]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 07/10] ide: add ->dma_check method
    From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    Subject: [PATCH] ide: add ->dma_check method

    * Add (an optional) ->dma_check method for checking if DMA can be
    used for a given command and fail DMA setup in ide_dma_prepare()
    if necessary.

    * Convert alim15x3 and trm290 host drivers to use ->dma_check.

    * Rename ali15x3_dma_setup() to ali_dma_setup() while at it.

    There should be no functional changes caused by this patch.

    Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    ---
    drivers/ide/alim15x3.c | 9 +++++----
    drivers/ide/ide-dma.c | 5 ++++-
    drivers/ide/trm290.c | 17 ++++++++++-------
    include/linux/ide.h | 1 +
    4 files changed, 20 insertions(+), 12 deletions(-)

    Index: b/drivers/ide/alim15x3.c
    ===================================================================
    --- a/drivers/ide/alim15x3.c
    +++ b/drivers/ide/alim15x3.c
    @@ -189,20 +189,20 @@ static void ali_set_dma_mode(ide_drive_t
    }

    /**
    - * ali15x3_dma_setup - begin a DMA phase
    + * ali_dma_check - DMA check
    * @drive: target device
    * @cmd: command
    *
    * Returns 1 if the DMA cannot be performed, zero on success.
    */

    -static int ali15x3_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd)
    +static int ali_dma_check(ide_drive_t *drive, struct ide_cmd *cmd)
    {
    if (m5229_revision < 0xC2 && drive->media != ide_disk) {
    if (cmd->tf_flags & IDE_TFLAG_WRITE)
    return 1; /* try PIO instead of DMA */
    }
    - return ide_dma_setup(drive, cmd);
    + return 0;
    }

    /**
    @@ -503,11 +503,12 @@ static const struct ide_port_ops ali_por

    static const struct ide_dma_ops ali_dma_ops = {
    .dma_host_set = ide_dma_host_set,
    - .dma_setup = ali15x3_dma_setup,
    + .dma_setup = ide_dma_setup,
    .dma_start = ide_dma_start,
    .dma_end = ide_dma_end,
    .dma_test_irq = ide_dma_test_irq,
    .dma_lost_irq = ide_dma_lost_irq,
    + .dma_check = ali_dma_check,
    .dma_timer_expiry = ide_dma_sff_timer_expiry,
    .dma_sff_read_status = ide_dma_sff_read_status,
    };
    Index: b/drivers/ide/ide-dma.c
    ===================================================================
    --- a/drivers/ide/ide-dma.c
    +++ b/drivers/ide/ide-dma.c
    @@ -562,9 +562,12 @@ EXPORT_SYMBOL_GPL(ide_allocate_dma_engin

    int ide_dma_prepare(ide_drive_t *drive, struct ide_cmd *cmd)
    {
    + const struct ide_dma_ops *dma_ops = drive->hwif->dma_ops;
    +
    if ((drive->dev_flags & IDE_DFLAG_USING_DMA) == 0 ||
    + (dma_ops->dma_check && dma_ops->dma_check(drive, cmd)) ||
    ide_build_sglist(drive, cmd) == 0 ||
    - drive->hwif->dma_ops->dma_setup(drive, cmd))
    + dma_ops->dma_setup(drive, cmd))
    return 1;
    return 0;
    }
    Index: b/drivers/ide/trm290.c
    ===================================================================
    --- a/drivers/ide/trm290.c
    +++ b/drivers/ide/trm290.c
    @@ -176,19 +176,21 @@ static void trm290_selectproc (ide_drive
    trm290_prepare_drive(drive, !!(drive->dev_flags & IDE_DFLAG_USING_DMA));
    }

    -static int trm290_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd)
    +static int trm290_dma_check(ide_drive_t *drive, struct ide_cmd *cmd)
    {
    - ide_hwif_t *hwif = drive->hwif;
    - unsigned int count, rw;
    -
    if (cmd->tf_flags & IDE_TFLAG_WRITE) {
    #ifdef TRM290_NO_DMA_WRITES
    /* always use PIO for writes */
    return 1;
    #endif
    - rw = 1;
    - } else
    - rw = 2;
    + }
    + return 0;
    +}
    +
    +static int trm290_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd)
    +{
    + ide_hwif_t *hwif = drive->hwif;
    + unsigned int count, rw = (cmd->tf_flags & IDE_TFLAG_WRITE) ? 1 : 2;

    count = ide_build_dmatable(drive, cmd);
    if (count == 0) {
    @@ -312,6 +314,7 @@ static struct ide_dma_ops trm290_dma_ops
    .dma_end = trm290_dma_end,
    .dma_test_irq = trm290_dma_test_irq,
    .dma_lost_irq = ide_dma_lost_irq,
    + .dma_check = trm290_dma_check,
    };

    static const struct ide_port_info trm290_chipset __devinitdata = {
    Index: b/include/linux/ide.h
    ===================================================================
    --- a/include/linux/ide.h
    +++ b/include/linux/ide.h
    @@ -716,6 +716,7 @@ struct ide_dma_ops {
    int (*dma_test_irq)(struct ide_drive_s *);
    void (*dma_lost_irq)(struct ide_drive_s *);
    /* below ones are optional */
    + int (*dma_check)(struct ide_drive_s *, struct ide_cmd *);
    int (*dma_timer_expiry)(struct ide_drive_s *);
    void (*dma_clear)(struct ide_drive_s *);
    /*

    \
     
     \ /
      Last update: 2009-02-20 18:17    [W:4.159 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site