1. 18 4月, 2008 12 次提交
    • A
      libata: isolate and rework cable logic · 15a5551c
      Alan Cox 提交于
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      15a5551c
    • T
      libata: kill ata_chk_status() call from ata_dev_configure() · 3d5a3d67
      Tejun Heo 提交于
      ata_dev_configure() isn't tied to any controller interface except for
      the probe debug message printing at the end of the function.  Kill the
      message.
      
      This is to help separating out SFF support from core layer.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      3d5a3d67
    • T
      libata: reorganize SFF related stuff · 624d5c51
      Tejun Heo 提交于
      * Move SFF related functions from libata-core.c to libata-sff.c.
      
        ata_[bmdma_]sff_port_ops, ata_devchk(), ata_dev_try_classify(),
        ata_std_dev_select(), ata_tf_to_host(), ata_busy_sleep(),
        ata_wait_after_reset(), ata_wait_ready(), ata_bus_post_reset(),
        ata_bus_softreset(), ata_bus_reset(), ata_std_softreset(),
        sata_std_hardreset(), ata_fill_sg(), ata_fill_sg_dumb(),
        ata_qc_prep(), ata_dump_qc_prep(), ata_data_xfer(),
        ata_data_xfer_noirq(), ata_pio_sector(), ata_pio_sectors(),
        atapi_send_cdb(), __atapi_pio_bytes(), atapi_pio_bytes(),
        ata_hsm_ok_in_wq(), ata_hsm_qc_complete(), ata_hsm_move(),
        ata_pio_task(), ata_qc_issue_prot(), ata_host_intr(),
        ata_interrupt(), ata_std_ports()
      
      * Make ata_pio_queue_task() global as it's now called from
        libata-sff.c.
      
      * Move SFF related stuff in include/linux/libata.h and
        drivers/ata/libata.h into one place.  While at it, move timing
        constants into the global enum definition and fortify comments a
        bit.
      
      This patch strictly moves stuff around and as such doesn't cause any
      functional difference.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      624d5c51
    • T
      libata: drop ata_dev_select() from ata_dev_read_id · 21572ea5
      Tejun Heo 提交于
      There is no reason to issue device select in read_id, it will be done
      by ops->qc_issue() when IDENTIFY[_PACKET] is issued via
      ata_exec_internal().
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      21572ea5
    • T
      libata: make reset related methods proper port operations · a1efdaba
      Tejun Heo 提交于
      Currently reset methods are not specified directly in the
      ata_port_operations table.  If a LLD wants to use custom reset
      methods, it should construct and use a error_handler which uses those
      reset methods.  It's done this way for two reasons.
      
      First, the ops table already contained too many methods and adding
      four more of them would noticeably increase the amount of necessary
      boilerplate code all over low level drivers.
      
      Second, as ->error_handler uses those reset methods, it can get
      confusing.  ie. By overriding ->error_handler, those reset ops can be
      made useless making layering a bit hazy.
      
      Now that ops table uses inheritance, the first problem doesn't exist
      anymore.  The second isn't completely solved but is relieved by
      providing default values - most drivers can just override what it has
      implemented and don't have to concern itself about higher level
      callbacks.  In fact, there currently is no driver which actually
      modifies error handling behavior.  Drivers which override
      ->error_handler just wraps the standard error handler only to prepare
      the controller for EH.  I don't think making ops layering strict has
      any noticeable benefit.
      
      This patch makes ->prereset, ->softreset, ->hardreset, ->postreset and
      their PMP counterparts propoer ops.  Default ops are provided in the
      base ops tables and drivers are converted to override individual reset
      methods instead of creating custom error_handler.
      
      * ata_std_error_handler() doesn't use sata_std_hardreset() if SCRs
        aren't accessible.  sata_promise doesn't need to use separate
        error_handlers for PATA and SATA anymore.
      
      * softreset is broken for sata_inic162x and sata_sx4.  As libata now
        always prefers hardreset, this doesn't really matter but the ops are
        forced to NULL using ATA_OP_NULL for documentation purpose.
      
      * pata_hpt374 needs to use different prereset for the first and second
        PCI functions.  This used to be done by branching from
        hpt374_error_handler().  The proper way to do this is to use
        separate ops and port_info tables for each function.  Converted.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      a1efdaba
    • T
      libata: stop overloading port_info->private_data · 887125e3
      Tejun Heo 提交于
      port_info->private_data is currently used for two purposes - to record
      private data about the port_info or to specify host->private_data to
      use when allocating ata_host.
      
      This overloading is confusing and counter-intuitive in that
      port_info->private_data becomes host->private_data instead of
      port->private_data.  In addition, port_info and host don't correspond
      to each other 1-to-1.  Currently, the first non-NULL
      port_info->private_data is used.
      
      This patch makes port_info->private_data just be what it is -
      private_data for the port_info where LLD can jot down extra info.
      libata no longer sets host->private_data to the first non-NULL
      port_info->private_data, @host_priv argument is added to
      ata_pci_init_one() instead.  LLDs which use ata_pci_init_one() can use
      this argument to pass in pointer to host private data.  LLDs which
      don't should use init-register model anyway and can initialize
      host->private_data directly.
      
      Adding @host_priv instead of using init-register model for LLDs which
      use ata_pci_init_one() is suggested by Alan Cox.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      887125e3
    • T
      libata: make ata_pci_init_one() not use ops->irq_handler and pi->sht · 1bd5b715
      Tejun Heo 提交于
      ata_pci_init_one() is the only function which uses ops->irq_handler
      and pi->sht.  Other initialization functions take the same information
      as arguments.  This causes confusion and duplicate unused entries in
      structures.
      
      Make ata_pci_init_one() take sht as an argument and use ata_interrupt
      implicitly.  All current users use ata_interrupt and if different irq
      handler is necessary open coding ata_pci_init_one() using
      ata_prepare_sff_host() and ata_activate_sff_host can be done under ten
      lines including error handling and driver which requires custom
      interrupt handler is likely to require custom initialization anyway.
      
      As ata_pci_init_one() was the last user of ops->irq_handler, this
      patch also kills the field.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      1bd5b715
    • T
      libata: implement and use ops inheritance · 029cfd6b
      Tejun Heo 提交于
      libata lets low level drivers build ata_port_operations table and
      register it with libata core layer.  This allows low level drivers
      high level of flexibility but also burdens them with lots of
      boilerplate entries.
      
      This becomes worse for drivers which support related similar
      controllers which differ slightly.  They share most of the operations
      except for a few.  However, the driver still needs to list all
      operations for each variant.  This results in large number of
      duplicate entries, which is not only inefficient but also error-prone
      as it becomes very difficult to tell what the actual differences are.
      
      This duplicate boilerplates all over the low level drivers also make
      updating the core layer exteremely difficult and error-prone.  When
      compounded with multi-branched development model, it ends up
      accumulating inconsistencies over time.  Some of those inconsistencies
      cause immediate problems and fixed.  Others just remain there dormant
      making maintenance increasingly difficult.
      
      To rectify the problem, this patch implements ata_port_operations
      inheritance.  To allow LLDs to easily re-use their own ops tables
      overriding only specific methods, this patch implements poor man's
      class inheritance.  An ops table has ->inherits field which can be set
      to any ops table as long as it doesn't create a loop.  When the host
      is started, the inheritance chain is followed and any operation which
      isn't specified is taken from the nearest ancestor which has it
      specified.  This operation is called finalization and done only once
      per an ops table and the LLD doesn't have to do anything special about
      it other than making the ops table non-const such that libata can
      update it.
      
      libata provides four base ops tables lower drivers can inherit from -
      base, sata, pmp, sff and bmdma.  To avoid overriding these ops
      accidentaly, these ops are declared const and LLDs should always
      inherit these instead of using them directly.
      
      After finalization, all the ops table are identical before and after
      the patch except for setting .irq_handler to ata_interrupt in drivers
      which didn't use to.  The .irq_handler doesn't have any actual effect
      and the field will soon be removed by later patch.
      
      * sata_sx4 is still using old style EH and currently doesn't take
        advantage of ops inheritance.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      029cfd6b
    • T
      libata: implement and use ata_noop_irq_clear() · 358f9a77
      Tejun Heo 提交于
      ->irq_clear() is used to clear IRQ bit of a SFF controller and isn't
      useful for drivers which don't use libata SFF HSM implementation.
      However, it's a required callback and many drivers implement their own
      noop version as placeholder.  This patch implements ata_noop_irq_clear
      and use it to replace those custom placeholders.
      
      Also, SFF drivers which don't support BMDMA don't need to use
      ata_bmdma_irq_clear().  It becomes noop if BMDMA address isn't
      initialized.  Convert them to use ata_noop_irq_clear().
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      358f9a77
    • T
      libata: kill ata_ehi_schedule_probe() · b558eddd
      Tejun Heo 提交于
      ata_ehi_schedule_probe() was created to hide details of link-resuming
      reset magic.  Now that all the softreset workarounds are gone,
      scheduling probe is very simple - set probe_mask and request RESET.
      Kill ata_ehi_schedule_probe() and open code it.  This also increases
      consistency as ata_ehi_schedule_probe() couldn't cover individual
      device probings so they were open-coded even when the helper existed.
      
      While at it, define ATA_ALL_DEVICES as mask of all possible devices on
      a link and always use it when requesting probe on link level for
      simplicity and consistency.  Setting extra bits in the probe_mask
      doesn't hurt anybody.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      b558eddd
    • T
      libata: kill ATA_LFLAG_SKIP_D2H_BSY · 8cebf274
      Tejun Heo 提交于
      Some controllers can't reliably record the initial D2H FIS after SATA
      link is brought online for whatever reason.  Advanced controllers
      which don't have traditional TF register based interface often have
      this problem as they don't really have the TF registers to update
      while the controller and link are being initialized.
      
      SKIP_D2H_BSY works around the problem by skipping the wait for device
      readiness before issuing SRST, so for such controllers libata issues
      SRST blindly and hopes for the best.
      
      Now that libata defaults to hardreset, this workaround is no longer
      necessary.  For controllers which have support for hardreset, SRST is
      never issued by itself.  It is only issued as follow-up SRST for
      device classification and PMP initialization, so there's no need to
      wait for it from prereset.
      
      Kill ATA_LFLAG_SKIP_D2H_BSY.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      8cebf274
    • T
      libata: prefer hardreset · cf480626
      Tejun Heo 提交于
      When both soft and hard resets are available, libata preferred
      softreset till now.  The logic behind it was to be softer to devices;
      however, this doesn't really help much.  Rationales for the change:
      
      * BIOS may freeze lock certain things during boot and softreset can't
        unlock those.  This by itself is okay but during operation PHY event
        or other error conditions can trigger hardreset and the device may
        end up with different configuration.
      
        For example, after a hardreset, previously unlockable HPA can be
        unlocked resulting in different device size and thus revalidation
        failure.  Similar condition can occur during or after resume.
      
      * Certain ATAPI devices require hardreset to recover after certain
        error conditions.  On PATA, this is done by issuing the DEVICE RESET
        command.  On SATA, COMRESET has equivalent effect.  The problem is
        that DEVICE RESET needs its own execution protocol.
      
        For SFF controllers with bare TF access, it can be easily
        implemented but more advanced controllers (e.g. ahci and sata_sil24)
        require specialized implementations.  Simply using hardreset solves
        the problem nicely.
      
      * COMRESET initialization sequence is the norm in SATA land and many
        SATA devices don't work properly if only SRST is used.  For example,
        some PMPs behave this way and libata works around by always issuing
        hardreset if the host supports PMP.
      
        Like the above example, libata has developed a number of mechanisms
        aiming to promote softreset to hardreset if softreset is not going
        to work.  This approach is time consuming and error prone.
      
        Also, note that, dependingon how you read the specs, it could be
        argued that PMP fan-out ports require COMRESET to start operation.
        In fact, all the PMPs on the market except one don't work properly
        if COMRESET is not issued to fan-out ports after PMP reset.
      
      * COMRESET is an integral part of SATA connection and any working
        device should be able to handle COMRESET properly.  After all, it's
        the way to signal hardreset during reboot.  This is the most used
        and recommended (at least by the ahci spec) method of resetting
        devices.
      
      So, this patch makes libata prefer hardreset over softreset by making
      the following changes.
      
      * Rename ATA_EH_RESET_MASK to ATA_EH_RESET and use it whereever
        ATA_EH_{SOFT|HARD}RESET used to be used.  ATA_EH_{SOFT|HARD}RESET is
        now only used to tell prereset whether soft or hard reset will be
        issued.
      
      * Strip out now unneeded promote-to-hardreset logics from
        ata_eh_reset(), ata_std_prereset(), sata_pmp_std_prereset() and
        other places.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      cf480626
  2. 04 4月, 2008 3 次提交
  3. 30 3月, 2008 1 次提交
  4. 25 3月, 2008 2 次提交
    • T
      libata: improve HPA error handling · dda7aba1
      Tejun Heo 提交于
      There's no point in retrying and eventually failing device detection
      when the device rejects READ_NATIVE_MAX[_EXT].  Disable HPA unlocking
      if READ_NATIVE_MAX[_EXT] is rejected as done when SET_MAX[_EXT] is
      rejected.
      
      This allows some old drives to work even if they aren't blacklisted.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      dda7aba1
    • T
      libata: assume no device is attached if both IDENTIFYs are aborted · 1ffc151f
      Tejun Heo 提交于
      This is to fix bugzilla #10254.  QSI cdrom attached to pata_sis as
      secondary master appears as phantom device for the slave.
      Interestingly, instead of not setting DRQ after IDENTIFY which
      triggers NODEV_HINT, it aborts both IDENTIFY and IDENTIFY PACKET which
      makes EH retry.
      
      Modify EH such that it assumes no device is attached if both flavors
      of IDENTIFY are aborted by the device.  There really isn't much point
      in retrying when the device actively aborts the commands.
      
      While at it, convert NODEV detection message to ata_dev_printk() to
      help debugging obscure detection problems.
      
      This problem was reported by Jan Bücken.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Jan Bücken <jb.faq@gmx.de>
      Acked-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      1ffc151f
  5. 11 3月, 2008 2 次提交
  6. 26 2月, 2008 2 次提交
  7. 24 2月, 2008 4 次提交
  8. 21 2月, 2008 1 次提交
    • T
      libata: implement libata.force module parameter · 33267325
      Tejun Heo 提交于
      This patch implements libata.force module parameter which can
      selectively override ATA port, link and device configurations
      including cable type, SATA PHY SPD limit, transfer mode and NCQ.
      
      For example, you can say "use 1.5Gbps for all fan-out ports attached
      to the second port but allow 3.0Gbps for the PMP device itself, oh,
      the device attached to the third fan-out port chokes on NCQ and
      shouldn't go over UDMA4" by the following.
      
       libata.force=2:1.5g,2.15:3.0g,2.03:noncq,udma4
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      33267325
  9. 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
  10. 16 2月, 2008 1 次提交
  11. 12 2月, 2008 1 次提交
  12. 06 2月, 2008 1 次提交
  13. 03 2月, 2008 1 次提交
  14. 29 1月, 2008 1 次提交
  15. 23 1月, 2008 4 次提交
    • 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