1. 19 2月, 2008 4 次提交
    • J
      libata: implement drain buffers · fa2fc7f4
      James Bottomley 提交于
      This just updates the libata slave configure routine to take advantage
      of the block layer drain buffers.  It also adjusts the size lengths in
      the atapi code to add the drain buffer to the DMA length so the driver
      knows it can rely on it.
      
      I suspect I should also be checking for AHCI as well as ATA_DEV_ATAPI,
      but I couldn't see how to do that easily.
      
      tj: * atapi_drain_needed() added such that draining is applied to only
            misc ATAPI commands.
          * q->bounce_gfp used when allocating drain buffer.
          * Now duplicate ATAPI PIO drain logic dropped.
          * ata_dev_printk() used instead of sdev_printk().
      Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      fa2fc7f4
    • J
      libata: eliminate the home grown dma padding in favour of · dde20207
      James Bottomley 提交于
      that provided by the block layer
      
      ATA requires that all DMA transfers begin and end on word boundaries.
      Because of this, a large amount of machinery grew up in ide to adjust
      scatterlists on this basis.  However, as of 2.5, the block layer has a
      dma_alignment variable which ensures both the beginning and length of a
      DMA transfer are aligned on the dma_alignment boundary.  Although the
      block layer does adjust the beginning of the transfer to ensure this
      happens, it doesn't actually adjust the length, it merely makes sure
      that space is allocated for transfers beyond the declared length.  The
      upshot of this is that scatterlists may be padded to any size between
      the actual length and the length adjusted to the dma_alignment safely
      knowing that memory is allocated in this region.
      
      Right at the moment, SCSI takes the default dma_aligment which is on a
      512 byte boundary.  Note that this aligment only applies to transfers
      coming in from user space.  However, since all kernel allocations are
      automatically aligned on a minimum of 32 byte boundaries, it is safe to
      adjust them in this manner as well.
      
      tj: * Adjusting sg after padding is done in block layer.  Make libata
            set queue alignment correctly for ATAPI devices and drop broken
            sg mangling from ata_sg_setup().
          * Use request->raw_data_len for ATAPI transfer chunk size.
          * Killed qc->raw_nbytes.
          * Separated out killing qc->n_iter.
      Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      dde20207
    • T
      libata: update ATAPI overflow draining · 56c819df
      Tejun Heo 提交于
      For misc ATAPI commands which transfer variable length data to the
      host, overflow can occur due to application or hardware bug.  Such
      overflows can be ignored safely as long as overflow data is properly
      drained.  libata HSM implementation has this implemented in
      __atapi_pio_bytes() and recently updated for 2.6.24-rc but it requires
      further improvements.  Improve drain logic such that...
      
      * Report overflow errors using ehi desc mechanism instead of printing
        directly.
      
      * Properly calculate the number of bytes to be drained considering
        actual number of consumed bytes for partial draining.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Acked-by: NAlbert Lee <albertcc@tw.ibm.com>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      56c819df
    • M
      ide/libata: ST310211A has buggy HPA too · b152fcd3
      Mikko Rapeli 提交于
      Signed-off-by: NMikko Rapeli <mikko.rapeli@teleca.com>
      Tested-by: NBart Champagne <bart@as35701.net>
      Cc: Jeff Garzik <jgarzik@pobox.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      b152fcd3
  2. 16 2月, 2008 1 次提交
  3. 12 2月, 2008 1 次提交
  4. 06 2月, 2008 1 次提交
  5. 03 2月, 2008 1 次提交
  6. 29 1月, 2008 1 次提交
  7. 23 1月, 2008 24 次提交
    • T
      libata: factor out ata_pci_activate_sff_host() from ata_pci_one() · 4e6b79fa
      Tejun Heo 提交于
      Factor out ata_pci_activate_sff_host() from ata_pci_one().  This does
      about the same thing as ata_host_activate() but needs to be separate
      because SFF controllers use different and multiple IRQs in legacy
      mode.
      
      This will be used to make SFF LLD initialization more flexible.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      4e6b79fa
    • A
      libata annotations and fixes · 4ca4e439
      Al Viro 提交于
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      4ca4e439
    • J
      libata: make ata_port_queue_task() an internal function · 442eacc3
      Jeff Garzik 提交于
      ata_port_queue_task() served a single user:  ata_pio_task()
      
      Rename to ata_pio_queue_task() and un-export it, as nobody outside of
      libata-core.c uses it.
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      442eacc3
    • A
      libata/pata_it821x: Improve handling of poorly compatible emulations · c5038fc0
      Alan Cox 提交于
      Some it821x RAID firmwares return 0 for the err return off both devices.
      A similar issue occurs with the slave returning 0 not 1 if you plug a
      gigabyte sata ramdisk into a controller that fakes two SATA ports as
      master/slave on an SFF channel.
      
      The patch does the following
      
      - Allow the 'failed diagnostics' case on both master and slave
      - Move the HORKAGE_DIAGNOSTIC check after ->dev_config
      
      This second change also allows IT821x to fix up a problem where we report
      drive diagnostic failures when in fact the drive is fine but the
      microcontroller firmware doesn't appear to get it right. IT821x clears
      the flag again to avoid giving the user bogus warnings about their disk.
      
      The other IT821x change is a bit ugly, we slightly abuse the cable type
      hook to fiddle with the identify data for the devices. We could add a new
      hook for this but as we have only one offender and no more seeming likely
      it seems better to keep libata-core clean.
      
      Please let this sit in -mm briefly, just in case the relaxed checking
      breaks some other emulated interface.
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      c5038fc0
    • T
      libata: make qc->nbytes include extra buffers · 0bcc65ad
      Tejun Heo 提交于
      qc->nbytes didn't use to include extra buffers setup by libata core
      layer and my be odd.  This patch makes qc->nbytes include any extra
      buffers setup by libata core layer and guaranteed to be aligned on 4
      byte boundary.
      
      This value is to be used to program the host controller.  As this
      represents the actual length of buffer available to the controller and
      the controller must be able to deal with short transfers for ATAPI
      commands which can transfer variable length, this shouldn't break any
      controllers while making problems like rounding-down and controllers
      choking up on odd transfer bytes much less likely.
      
      The unmodified value is stored in new field qc->raw_nbytes.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      0bcc65ad
    • T
      libata: convert to chained sg · ff2aeb1e
      Tejun Heo 提交于
      libata used private sg iterator to handle padding sg.  Now that sg can
      be chained, padding can be handled using standard sg ops.  Convert to
      chained sg.
      
      * s/qc->__sg/qc->sg/
      
      * s/qc->pad_sgent/qc->extra_sg[]/.  Because chaining consumes one sg
        entry.  There need to be two extra sg entries.  The renaming is also
        for future addition of other extra sg entries.
      
      * Padding setup is moved into ata_sg_setup_extra() which is organized
        in a way that future addition of other extra sg entries is easy.
      
      * qc->orig_n_elem is unused and removed.
      
      * qc->n_elem now contains the number of sg entries that LLDs should
        map.  qc->mapped_n_elem is added to carry the original number of
        mapped sgs for unmapping.
      
      * The last sg of the original sg list is used to chain to extra sg
        list.  The original last sg is pointed to by qc->last_sg and the
        content is stored in qc->saved_last_sg.  It's restored during
        ata_sg_clean().
      
      * All sg walking code has been updated.  Unnecessary assertions and
        checks for conditions the core layer already guarantees are removed.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Jens Axboe <jens.axboe@oracle.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      ff2aeb1e
    • T
      libata: change ATA_QCFLAG_DMAMAP semantics · f92a2636
      Tejun Heo 提交于
      ATA_QCFLAG_DMAMAP was a bit peculiar in that it got set during qc
      initialization and cleared if DMA mapping wasn't necessary.  Make it
      more straight forward by making the following changes.
      
      * Don't set it during initialization.  Set it after DMA is actually
        mapped.
      
      * Add BUG_ON() to guarantee that there is data to transfer if DMAMAP
        is set.  This always holds for the current code.  The BUG_ON() is
        for docummentation and sanity check.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      f92a2636
    • T
      libata: kill non-sg DMA interface · 001102d7
      Tejun Heo 提交于
      With atapi_request_sense() converted to use sg, there's no user of
      non-sg interface.  Kill non-sg interface.
      
      * ATA_QCFLAG_SINGLE and ATA_QCFLAG_SG are removed.  ATA_QCFLAG_DMAMAP
        is used instead.  (this way no LLD change is necessary)
      
      * qc->buf_virt is removed.
      
      * ata_sg_init_one() and ata_sg_setup_one() are removed.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Rusty Russel <rusty@rustcorp.com.au>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      001102d7
    • T
      libata: update ->data_xfer hook for ATAPI · 55dba312
      Tejun Heo 提交于
      Depending on how many bytes are transferred as a unit, PIO data
      transfer may consume more bytes than requested.  Knowing how much
      data is consumed is necessary to determine how much is left for
      draining.  This patch update ->data_xfer such that it returns the
      number of consumed bytes.
      
      While at it, it also makes the following changes.
      
      * s/adev/dev/
      * use READ/WRITE constants for rw indication
      * misc clean ups
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      55dba312
    • T
      libata: rename ATA_PROT_ATAPI_* to ATAPI_PROT_* · 0dc36888
      Tejun Heo 提交于
      ATA_PROT_ATAPI_* are ugly and naming schemes between ATA_PROT_* and
      ATA_PROT_ATAPI_* are inconsistent causing confusion.  Rename them to
      ATAPI_PROT_* and make them consistent with ATA counterpart.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      0dc36888
    • A
      libata: zero xfer length on ATAPI data xfer IRQ is HSM violation · 0106372d
      Albert Lee 提交于
      Treat zero xfer length as HSM violation.  While at it, add
      unlikely()'s to ATAPI ireason and transfer length checks.
      
      tj: Formatted patch and added unlikely()'s.
      Signed-off-by: NAlbert Lee <albertcc@tw.ibm.com>
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      0106372d
    • T
      libata: convert NCQ test in ata_qc_issue() to ata_is_ncq() · 1973a023
      Tejun Heo 提交于
      I missed one while converting to ata_is_*() protocol test helpers.
      Convert it.  Pointed out by Jeff Garzik.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      1973a023
    • T
      libata: implement ata_timing_cycle2mode() and use it in libata-acpi and pata_acpi · a0f79b92
      Tejun Heo 提交于
      libata-acpi is using separate timing tables for transfer modes
      although libata-core has the complete ata_timing table.  Implement
      ata_timing_cycle2mode() to look for matching mode given transfer type
      and cycle duration and use it in libata-acpi and pata_acpi to replace
      private timing tables.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      a0f79b92
    • T
      libata: add ATA_CBL_PATA_IGN · c88f90c3
      Tejun Heo 提交于
      ATA_CBL_PATA_UNK indicates that the cable type can't be determined
      from the host side and might be either 80c or 40c.  libata applies
      drive or other generic limit in this case.  However, there are
      controllers where both host and drive side detections are
      misimplemented and the driver has to rely solely on private method -
      peeking BIOS or ACPI configuration or using some other private
      mechanism.
      
      This patch adds ATA_CBL_PATA_IGN which tells libata to ignore the
      cable type completely and just let the LLD determine the transfer mode
      via host transfer mode masks and ->mode_filter().
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      c88f90c3
    • T
      libata: xfer_mask is unsigned long not unsigned int · 7dc951ae
      Tejun Heo 提交于
      Jeff says xfer_mask is unsigned long not unsigned int.  Convert all
      xfermask fields and handling functions to deal with unsigned longs.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      7dc951ae
    • T
      libata: kill ata_id_to_dma_mode() · 9d3501ab
      Tejun Heo 提交于
      ata_id_to_dma_mode() isn't quite generic.  The function is basically
      privately implemented ata_id_xfermask() combined with hardcoded mode
      printing and configuration which are specific to ata_generic.
      
      Kill the function and open code it in generic_set_mode() using generic
      xfermode handling functions.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      9d3501ab
    • T
      libata: clean up xfermode / PATA timing related stuff · 70cd071e
      Tejun Heo 提交于
      * s/ATA_BITS_(PIO|MWDMA|UDMA)/ATA_NR_\1_MODES/g
      
      * Consistently use 0xff to indicate invalid transfer mode (0x00 is
        valid for PIO_SLOW).
      
      * Make ata_xfer_mode2mask() return proper mode mask instead of just
        the highest bit.
      
      * Sort ata_timing table in increasing xfermode order and update
        ata_timing_find_mode() accordingly.
      
      This patch doesn't introduce any behavior change.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      70cd071e
    • T
      libata: export xfermode / PATA timing related functions · 6357357c
      Tejun Heo 提交于
      Export the following xfermode related functions.
      
      * ata_pack_xfermask()
      * ata_unpack_xfermask()
      * ata_xfer_mask2mode()
      * ata_xfer_mode2mask()
      * ata_xfer_mode2shift()
      * ata_mode_string()
      * ata_id_xfermask()
      * ata_timing_find_mode()
      
      These functions will be used later by LLD updates.  While at it,
      change unsigned short @speed to u8 @xfer_mode in
      ata_timing_find_mode() for consistency.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      6357357c
    • T
      libata: implement ATA_DFLAG_DUBIOUS_XFER · 00115e0f
      Tejun Heo 提交于
      ATA_DFLAG_DUBIOUS_XFER is set whenever data transfer speed or method
      changes and gets cleared when data transfer command succeeds in the
      newly configured transfer mode.
      
      This will be used to improve speed down logic.
      
      Signed-off-by: Tejun Heo <htejun@gmail.com<
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      00115e0f
    • T
      libata: move ata_set_mode() to libata-eh.c · 6f1d1e3a
      Tejun Heo 提交于
      Move ata_set_mode() to libata-eh.c.  ata_set_mode() is surely an EH
      action and will be more tightly coupled with the rest of error
      handling.  Move it to libata-eh.c.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      6f1d1e3a
    • T
      libata: implement protocol tests · 405e66b3
      Tejun Heo 提交于
      Implement protocol tests - ata_is_atapi(), ata_is_nodata(),
      ata_is_pio(), ata_is_dma(), ata_is_ncq() and ata_is_data() and use
      them to replace is_atapi_taskfile() and hard coded protocol tests.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      405e66b3
    • J
      libata: checkpatch fixes · 11b7becc
      Jeff Garzik 提交于
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      11b7becc
    • A
      libata: IORDY handling · b9f8ab2d
      Alan Cox 提交于
      I believe this version meets all Sergei's objections
      
      Correct the logic for when we issue a set features for transfer mode
      
      - If the device has IORDY and the controller has IORDY - set the mode
      - If the device has IORDY and the controller does not - turn IORDY off
      - If neither has IORDY do nothing
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      b9f8ab2d
    • A
      libata: Disable ATA8-ACS proposed Trusted Computing features by default · ae8d4ee7
      Alan Cox 提交于
      Historically word 48 in the identify data was used to mean 32bit I/O
      was supported for VLB IDE etc. ATA8 reassigns this word to the Trusted
      Computing Group, where it is used for TCG features. This means that
      an ATA8 TCG drive is going to trigger 32bit I/O on some systems which
      will be funny.
      
      Anyway we need to sort this out ready for ATA8 so:
      - Reorder the ata.h header a bit so the ata_version function occurs early
        in it
      - Make dword_io check the ATA version
      - Add an ATA8 version checking TCG presence test
      
      While we are at it the current drafts have a flaw where it may not be
      possible to disable TCG features at boot (and opt out of the trusted
      model) as TCG intends because it relies on presence of a different
      optional feature (DCS). Handle this in software by refusing the TCG
      commands if libata.allow_tpm is not set. (We must make it possible
      as some environments such as proprietary VDR devices will doubtless
      want to use it to lock up content)
      
      Finally as with CPRM print a warning so that the user knows they may
      not be able to full access and use the device.
      Signed-off-by: NAlan Cox <alan@redhat.com>
      ae8d4ee7
  8. 16 1月, 2008 1 次提交
  9. 18 12月, 2007 5 次提交
  10. 08 12月, 2007 1 次提交
    • T
      libata: kill spurious NCQ completion detection · 459ad688
      Tejun Heo 提交于
      Spurious NCQ completion detection implemented in ahci was incorrect.
      On AHCI receving and processing FISes and raising interrupts are not
      interlocked and spurious interrupts are expected.
      
      For example, if an interrupt occurs while interrupt handler is running
      and the running interrupt handler handles the event the new IRQ
      indicated, after IRQ handler finishes, it will be executed again
      because IRQ pending bit is set by the new interrupt but there won't be
      anything to process.
      
      Please read the following message for more information.
      
        http://article.gmane.org/gmane.linux.ide/26012
      
      This patch...
      
      * Removes all spurious IRQ whining from ahci.  Spurious NCQ completion
        detection was completely wrong.  Spurious D2H Register FIS taught us
        that some early drives send spurious D2H Register FIS with I bit set
        while NCQ commands are in progress but none of recent drives does
        that and even the ones which show such behavior can do NCQ fine.
      
      * Kills all NCQ blacklist entries which were added because of spurious
        NCQ completions.  I tracked down each commit and verified all
        removed ones are actually added because of spurious completions.
      
        WD740ADFD-00NLR1 wasn't deleted but moved upward because the drive
        not only had spurious NCQ completions but also is slow on sequential
        data transfers if NCQ is enabled.
      
        Maxtor 7V300F0 was added by 0e3dbc01
        from Alan Cox.  I can only find evidences that the drive only had
        troubles with spuruious completions by searching the mailing list.
        This entry needs to be verified and removed if it doesn't have other
        NCQ related problems.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      459ad688