16 Oct, 2007

2 commits


13 Oct, 2007

38 commits

  • * remove pointless pci_dev_to_dev() wrapper. Just directly reference
    the embedded struct device like everyone else does.

    * pata_cs5520: delete cs5520_remove_one(), it was a duplicate of
    ata_pci_remove_one()

    * linux/libata.h: don't bother including linux/pci.h, we don't need it.
    Simply declare 'struct pci_dev' and assume interested parties will
    include the header, as they should be doing anyway.

    * linux/libata.h: consolidate all CONFIG_PCI declarations into a
    single location in the header.

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • 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
     
  • Add @timeout argument to ata_exec_internal[_sg](). If 0, default
    timeout ata_probe_timeout is used.

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

    Tejun Heo
     
  • ehi description field is used to carry LLD specific controller
    description. Sometimes, it's used without clearing before and LLD
    description gets printed with exception information one more time.
    Clear after printing.

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

    Tejun Heo
     
  • ST9160821AS / 3.ALD also does spurious NCQ completions. Disable NCQ.

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

    Tejun Heo
     
  • HDT722516DLA380 does spurious completion of NCQ commands. Blacklist
    it.

    Signed-off-by: Tejun Heo
    Cc: Frans Pop
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Seagate Barracuda ST380817AS has troubles with NCQ. For example,
    unpacking a tarball on an XFS filesystem gives this:

    ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x2 frozen
    ata1.00: cmd 61/40:00:29:a3:98/00:00:00:00:00/40 tag 0 cdb 0x0 data 32768 out
    res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)

    More info here:
    http://lkml.org/lkml/2007/1/21/76

    Blacklist it!

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

    Paolo Ornati
     
  • Let's see what explodes.

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • Correct handling of SRST reset sequences. After an SRST it is undefined
    whether the drive has gone back to PIO0. In order to talk safely we should
    talk slowly and carefully until we know.

    Thus when we do the reset if the controller has a pio setup method we call it
    to flip back to PIO 0 and a known state. After the reset completes the
    identify will then be done at the safe speed and the drive/controller will
    pick suitable faster modes and reconfigure the controller to these timings.

    As a side effect it means we force the controller to PIO 0 as we bring it up
    which fixes funnies on a few systems where the BIOS firmware leaves us in an
    interesting choice of modes, or embedded boxes with no firmware which come up
    in random states.

    For smart controllers there is nothing to do - they know about this
    internally.

    Signed-off-by: Alan Cox
    Signed-off-by: Andrew Morton
    Signed-off-by: Jeff Garzik

    Alan Cox
     
  • This is useful when debugging, handling problem systems, or for
    distributions just to get the system installed so it can be sorted
    out later.

    This is a bit smarter than the old IDE one and lets you do

    libata.dma=0 Disable all PATA DMA like old IDE
    libata.dma=1 Disk DMA only
    libata.dma=2 ATAPI DMA only
    libata.dma=4 CF DMA only

    (or combinations thereof - 0,1,3 being the useful ones I suspect)

    (I've split CF as it seems to be a seperate case of pain and suffering
    different to the others and caused by assorted PIO wired adapters etc)

    Signed-off-by: Alan Cox

    [edited to work on SATA too, changing name from 'pata_dma' to 'dma']
    Signed-off-by: Jeff Garzik

    Alan Cox
     
  • 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
     
  • Hook PMP support into libata and enable it. Connect SCR and probing
    functions, and update ata_dev_classify() to detect PMP.

    Signed-off-by: Tejun Heo
    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
     
  • Restore the support for handling drives that report one sector too many
    (ie SCSI not ATA style). This worked before the HPA update but was
    removed in that process.

    Signed-off-by: Alan Cox
    Signed-off-by: Jeff Garzik

    Alan Cox
     
  • Blacklist HITACHI HDS7250SASUN500G and HITACHI HDS7225SBSUN250G
    drives using wildcard matching.

    Signed-off-by David Milburn

    Signed-off-by: Jeff Garzik

    David Milburn
     
  • * The firmware version of ST3160812AS is "3.ADJ" no "3.AD".
    * Add several entries from various sources.

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

    Tejun Heo
     
  • In ata_set_max_sectors(), the highest nibble in LBA28 mode was
    missing. This made drives sized between 8G and 128G with HPA turned
    on to be resized to under 8G. Fix it.

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

    Tejun Heo
     
  • AN serves multiple purposes. For ATAPI, it's used for media change
    notification. For PMP, for downstream PHY status change notification.
    Implement sata_async_notification() which demultiplexes AN.

    To avoid unnecessary port events, ATAPI AN is not enabled if PMP is
    attached but SNTF is not available.

    Signed-off-by: Tejun Heo
    Cc: Kriten Carlson Accardi
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Implement ap->nr_active_links (the number of links with active qcs),
    ap->excl_link (pointer to link which can be used by ->qc_defer and is
    cleared when a qc with ATA_QCFLAG_CLEAR_EXCL completes), and
    ata_link_active().

    These can be used by ->qc_defer() to implement proper command
    exclusion. This set of helpers seem enough for both sil24 (ATAPI
    exclusion needed) and cmd-switching PMP.

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

    Tejun Heo
     
  • Controllers which support PMP have various restrictions on which
    combinations of commands are allowed to what number of devices
    concurrently. This patch implements ops->qc_defer() which determines
    whether a qc can be issued at the moment or should be deferred.

    If the function returns ATA_DEFER_LINK, the qc will be deferred until
    a qc completes on the link. If ATA_DEFER_PORT, until a qc completes
    on any link. The defer conditions are advisory and in general
    ATA_DEFER_LINK can be considered as lower priority deferring than
    ATA_DEFER_PORT.

    ops->qc_defer() replaces fixed ata_scmd_need_defer(). For standard
    NCQ/non-NCQ exclusion, ata_std_qc_defer() is implemented. ahci and
    sata_sil24 are converted to use ata_std_qc_defer().

    ops->qc_defer() is heavier than the original mechanism because full qc
    is prepped before determining to defer it, but various information is
    needed to determine defer conditinos and fully translating a qc is the
    only way to supply such information in generic manner.

    IMHO, this shouldn't cause any noticeable performance issues as

    * for most cases deferring occurs rarely (except for NCQ-aware
    cmd-switching PMP)
    * translation itself isn't that expensive
    * once deferred the command won't be repeated until another command
    completes which usually is a very long time cpu-wise.

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

    Tejun Heo
     
  • Make a number of functions from libata-core.c and libata-eh.c global
    to libata (drivers/ata/libata.h). These will be used by PMP.

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

    Tejun Heo
     
  • Consider newly found class code while revalidating. PMP resetting
    always results in valid class code and issuing PMP commands to
    ATA/ATAPI device isn't very attractive. Add @new_class to
    ata_dev_revalidate() and check class code for revalidation.

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

    Tejun Heo
     
  • Update AN support in preparation of PMP support.

    * s/ata_id_has_AN/ata_id_has_atapi_AN/
    * add AN enabled reporting during configuration
    * add err_mask to AN configuration failure reporting
    * update LOCKING comment for ata_scsi_media_change_notify()
    * check whether ATA dev is attached to SCSI dev ata_scsi_media_change_notify()
    * set ATA_FLAG_AN in ahci and sata_sil24

    Signed-off-by: Tejun Heo
    Cc: Kriten Carlson Accardi
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • Certain device which reports diagnostic failure also reports invalid
    device signature. Assume ATA_DEV_ATA on diagnostic failure if reset
    indicates device presence.

    This is fix for bugzilla bug 8784.

    http://bugzilla.kernel.org/show_bug.cgi?id=8784

    Signed-off-by: Tejun Heo
    Acked-by: Alan Cox
    Cc: Edward Amsden
    Signed-off-by: Jeff Garzik

    Tejun Heo
     
  • Make ata_dev_try_classify() take a pointer to ata_device instead of
    ata_port/port_number combination for consistency and add @present
    argument. @present indicates whether the device seems present during
    reset. It's the result of TF access during softreset and link
    onlineness during hardreset. @present will be used to improve
    diagnostic failure handling.

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

    Tejun Heo
     
  • This patch reimplement ata_hpa_resize() such that...

    * All HPA related decisions are made inside ata_hpa_resize() proper.
    ata_hpa_resize() returns 0 if configuration can proceed, -errno if
    device needs to be reset and reconfigured.

    * All errors are handled properly. If HPA unlocking isn't requested,
    HPA handling is disabled automatically to avoid unnecessary device
    detection failure.

    * Messages are trimmed. HPA detection message is printed only during
    initial configuration. HPA unlocked message is printed only during
    initial configuration or unlocking results in different size.

    * Instead of using sectors returned in TF of SET_MAX, re-read IDENTIFY
    data as that's the value the device is going to use.

    * It's called early during ata_dev_configure() as IDENTIFY data might
    change after resizing.

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

    Tejun Heo
     
  • Merge ata_read_native_max_addres_ext() into ata_read_native_max_address()
    and combine ata_set_native_max_address_ext() and
    ata_set_native_max_address() into ata_set_max_sectors().

    * reduce duplicate code
    * return 0 or -errno depending on error conditions
    * report if command fails
    * use ATA_LBA instead of 0x40

    This is in preparation of ata_hpa_resize() update.

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

    Tejun Heo
     
  • Move ata_id_n_sectors() upward right below ata_id_c_string(). This is
    to accomodate later changes.

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

    Tejun Heo
     
  • Support the use of '*' in model_num and model_rev entries
    in ata_device_blacklist[].

    Based largely on David Milburn's "libata-core: support wildcard matching
    in ata_blacklist_entry" patch.

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • Currently, port configuration reporting has the following problems.

    * iomapped address is reported instead of raw address
    * report contains irrelevant fields or lacks necessary fields for
    non-SFF controllers.
    * host->irq/irq2 are there just for reporting and hacky.

    This patch implements and uses ata_port_desc() and
    ata_port_pbar_desc(). ata_port_desc() is almost identical to
    ata_ehi_push_desc() except that it takes @ap instead of @ehi, has no
    locking requirement, can only be used during host initialization and "
    " is used as separator instead of ", ". ata_port_pbar_desc() is a
    helper to ease reporting of a PCI BAR or an offsetted address into it.

    LLD pushes whatever description it wants using the above two
    functions. The accumulated description is printed on host
    registration after "[S/P]ATA max MAX_XFERMODE ".

    SFF init helpers and ata_host_activate() automatically add
    descriptions for addresses and irq respectively, so only LLDs which
    isn't standard SFF need to add custom descriptions. In many cases,
    such controllers need to report different things anyway.

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

    Tejun Heo
     
  • If we have a PATA cable with a SATA drive on it then we've found a
    bridge and we can flip the cable type. This fixes some cable detect
    problems with SATA bridges on chipsets and misdetected cable types.

    In theory cable detection and mode limiting is needed if you put a
    SATA/PATA bridge on a 40 wire cable, but I see no way to deal with
    that other than to point out its not a good idea anyway.

    Signed-off-by: Alan Cox
    Signed-off-by: Jeff Garzik

    Alan Cox
     
  • It was always set to ata_port_disable(). Removed the hook, and replaced
    the very few ap->ops->port_disable() callsites with direct calls to
    ata_port_disable().

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • * ->irq_ack() is redundant to what the irq handler already
    performs... chk-status + irq-clear. Furthermore, it is only
    called in one place, when screaming-irq-debugging is enabled,
    so we don't want to bother with a hook just for that.

    * ata_dummy_irq_on() is only ever used in drivers that have
    no callpath reaching ->irq_on(). Remove .irq_on hook from
    those drivers, and the now-unused ata_dummy_irq_on()

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • Check to see if an ATAPI device supports Asynchronous Notification.
    If so, enable it, if the host controller supports AN.

    Signed-off-by: Kristen Carlson Accardi
    Signed-off-by: Jeff Garzik

    Kristen Carlson Accardi
     
  • Remembered this while doing auditing and code review versus the specs

    Signed-off-by: Alan Cox
    Signed-off-by: Jeff Garzik

    Alan Cox
     
  • Signed-off-by: Alan Cox
    Signed-off-by: Jeff Garzik

    Alan Cox
     
  • Add support for issuing ATA_16 passthru commands to ATAPI devices
    managed by libata. It requires the previous CDB length fix patch.

    A boot/module parameter, "atapi_passthru16=0" can be used to globally
    disable this feature, if ever desired.

    tj: restructured __ata_scsi_queuecmd() according to Jeff's suggestion.

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

    Mark Lord