13 Oct, 2007

4 commits

  • PMP registers used to be accessed with dedicated accessors ->pmp_read
    and ->pmp_write. During reset, those callbacks are called with the
    port frozen so they should be able to run without depending on
    interrupt delivery. To achieve this, they were implemented polling.

    However, as resetting the host port makes the PMP to isolate fan-out
    ports until SError.X is cleared, resetting fan-out ports while port is
    frozen doesn't buy much additional safety.

    This patch updates libata PMP support such that PMP registers are
    accessed using regular ata_exec_internal() mechanism and kills
    ->pmp_read/write() callbacks. The following changes are made.

    * PMP access helpers - sata_pmp_read_init_tf(), sata_pmp_read_val(),
    sata_pmp_write_init_tf() are folded into sata_pmp_read/write() which
    are now standalone PMP register access functions.

    * sata_pmp_read/write() returns err_mask instead of rc. This is
    consistent with other functions which issue internal commands and
    allows more detailed error reporting.

    * ahci interrupt handler is modified to ignore BAD_PMP and
    spurious/illegal completion IRQs while reset is in progress. These
    conditions are expected during reset.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Implement sata_pmp_qc_defer_cmd_switch() - standard qc_defer for
    command switching PMP support.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Extend ata_acpi_associate_sata_port() such that it can handle PMP and
    call it when PMP is attached and detached.

    Build breakage when !CONFIG_ATA_ACPI was spotted and fixed by Petr
    Vandrovec.

    Signed-off-by: Tejun Heo
    Cc: Petr Vandrovec
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Implement Port Multiplier support. To support PMP, a LLDD has to
    supply ops->pmp_read() and pmp_write(). If non-null, ->pmp_attach and
    ->pmp_detach are called on PMP attach and detach, respectively.

    ->pmp_read/write() can be called while the port is frozen, so they
    must be implemented by polling. This patch supplies several helpers
    to ease ->pmp_read/write() implementation.

    Also, irq_handler and error_handler must be PMP aware. Most of PMP
    aware EH can be done by calling ata_pmp_do_eh() with appropriate
    methods. PMP EH uses separate set of reset methods and this patch
    implements standard prereset, hardreset and postreset methods.

    This patch only implements PMP support. The next patch will integrate
    PMP into the reset of libata and thus enable PMP support.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jeff Garzik

    Tejun Heo