11 Jul, 2007

1 commit

  • This patch enables hotplugging of SATA devices in the
    sata_promise driver. It's been tested successfully on
    both first- and second-generation Promise SATA chips:
    SATA150 TX2plus, SATAII150 TX2plus, SATAII150 TX4,
    SATA300 TX2plus, and SATA300 TX4.

    The only quirk I've seen is that hotplugging (insertion)
    on the first-generation SATA150 TX2plus requires a lengthier
    EH sequence than on the second-generation chips.
    On the second-generation chips a simple soft reset seems
    to suffice, but on the first-generation chip there's a
    "port is slow to respond" after the initial soft reset,
    after which libata issues a hard reset, and then the
    device is recognised.

    The hotplug checks are high up in the interrupt handling
    path, not deep down in error_intr as in ahci/sata_sil24.
    That's because the chip doesn't signal hotplug status changes
    in the per-port status register: instead a global register
    contains hotplug control and status flags for all ports.
    I considered following the ahci/sata_sil24 structure, but
    that would have required non-trivial changes to the interrupt
    handling path, so I chose to keep the hotplug changes simple
    and unobtrusive.

    Signed-off-by: Mikael Pettersson
    --
    This patch depends on the "sata_promise: cleanups" patch.

    Changes since the previous version (posted June 19):
    - Correct pdc_interrupt() to increment 'handled' also in
    the hotplug case. This prevents IRQ_NONE from being
    returned when an interrupt only has hotplug events to
    handle, which could confuse the kernel's IRQ machinery.
    - Added testing on the SATAII150 TX4.

    drivers/ata/sata_promise.c | 41 ++++++++++++++++++++++++++++++++++++-----
    1 files changed, 36 insertions(+), 5 deletions(-)
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

10 Jul, 2007

3 commits


09 Jun, 2007

1 commit

  • sata_promise uses two different command modes - packet and TF. Packet mode
    is intelligent low-overhead mode while TF is the same old taskfile
    interface. As with other advanced interface (ahci/sil24),
    ATA_TFLAG_POLLING has no effect in packet mode. However, PIO commands are
    issued using TF interface in polling mode, so pdc_interrupt() considers
    interrupts spurious if ATA_TFLAG_POLLING is set.

    This is broken for polling NODATA commands because command is issued using
    packet mode but the interrupt handler ignores it due to ATA_TFLAG_POLLING.
    Fix pdc_qc_issue_prot() such that ATA/ATAPI NODATA commands are issued
    using TF interface if ATA_TFLAG_POLLING is set.

    This patch fixes detection failure introduced by polling SETXFERMODE.

    Signed-off-by: Tejun Heo
    Acked-by: Mikael Pettersson
    Acked-by: Jeff Garzik
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tejun Heo
     

25 May, 2007

1 commit


10 May, 2007

2 commits

  • There is a known problem with sata_promise on SATAII-150/300 TX4
    controller cards: it enumerates drives in an order that differs
    from the port numbers printed on the controller cards. However,
    Promise's BIOS and Linux driver both get the order right.

    I investigated Promise's Linux driver (v1.01.0.23), and found
    that it explicitly changes the mapping from logical port number
    to ATA engine MMIO address on the SATAII TX4 cards. It does this
    on all SATAII TX4 cards, without inspecting revision etc. The
    SATAII TX2plus cards continue to use the same mapping that was
    used for the first-generation chips.

    This patch updates sata_promise to use the new port number to
    ATA engine mapping on SATAII TX4 cards, which fixes the drive
    enumeration order problem on those cards. Tested on several
    1st and 2nd generation TX2plus and TX4 chips.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • The sata_promise error decode update changed pdc_host_intr()
    to return and not complete the qc after detecting an error.
    Unfortunately not completing the qc:s causes them to always
    time out on error, which is wrong and has nasty side-effects.

    This patch updates pdc_error_intr() to call ata_port_abort(),
    similar to ahci and sata_sil24. Doing this is important as it
    makes EH see the original error and not a bogus timeout.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

29 Apr, 2007

7 commits

  • Convert sata_via and sata_promise to new init model. Both controllers
    can have combined configuration (SATA + PATA) and used twisted
    initialization method (modifying port in ->port_start) to overcome
    probe_ent limitations.

    This patch converts both drivers to new init model in which such
    configuration is natively supported.

    * promise: Combined pata port now uses separate port_info entry right
    after the sata counterpart entry.

    * promise: Controller configuration is discerned using ap->flags.
    This simplifies init path and makes it look more like other LLDs.

    * via: Both SATA and PATA ports in vt6421 are represented in their
    own port_info structure.

    Tested on PDC20375 (SATA150 TX2plus) [105a:3375] and PDC40775 (SATA
    300 TX2plus) [105a:3d73]. Couldn't test via cuz my c3 won't boot the
    current kernel.

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

    Tejun Heo
     
  • ->post_internal_cmd is simplified EH for internal commands. Its
    primary mission is to stop the controller such that no rogue memory
    access or other activities occur after the internal command is
    released. It may provide error diagnostics by setting qc->err_mask
    but this hasn't been a requirement.

    To ignore SETXFER failure for CFA devices, libata needs to know
    whether a command was failed by the device or for any other reason.
    ie. internal command needs to get AC_ERR_DEV right.

    This patch makes the following changes to AC_ERR_DEV handling and
    ->post_internal_cmd semantics to accomodate this need and simplify
    callback implementation.

    1. As long as the correct bits in the result TF registers are set,
    there is no need to set AC_ERR_DEV explicitly. libata EH core
    takes care of that for both normal and internal commands.

    2. The only requirement for ->post_internal_cmd() is to put the
    controller into quiescent state. It needs not to set any err_mask.

    3. ata_exec_internal_sg() performs minimal error analysis such that
    AC_ERR_DEV is automatically set as long as result_tf is filled
    correctly.

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

    Tejun Heo
     
  • Promise ATA ports should always be reset by pdc_reset_port()
    when errors are detected, but the recent error reason decoding
    update to sata_promise replaced that reset with a freeze.

    This patch changes the error detection to do a reset again.
    This makes the error decoding update safer, as it now only
    adds error decoding without changing any other behaviour.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch adds much needed error reason decoding and
    reporting to sata_promise. It's simplistic but should
    log all relevant error info the controller provides.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch changes sata_promise so that the PATA ports
    on TX2plus chips are bound to the pdc_pata_ops structure.
    This means that operations called from the SATA ops
    structures don't need any SATA-vs-PATA tests any more.
    Instead, operations that depend on a port being SATA or
    PATA are separated into different procedures.

    * pdc_cable_type() is split into a PATA version and a
    SATA version
    * pdc_error_handler() is split into a PATA version and a
    SATA version, that both call a common version after
    setting up the `hardreset' function pointer
    * pdc_old_check_atapi_dma() is now only used for SATAI
    ports, so is renamed to pdc_old_sata_check_atapi_dma()
    and simplified
    * pdc_sata_scr_{read,write}() are now only used for SATA
    ports, so their is-not-SATA tests are removed
    * pdc_port_start() is split into three procedures: a wrapper
    which performs the ->ops adjustment on TX2plus PATA ports,
    a procedure with the common code, and a procedure with
    the SATA-specific code (this bit might be cleaned up by
    Tejun's new init model)

    Tested on 20619, 20575, and 20775 chips.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • The recent change which moved cable detection from
    pdc_pre_reset() to the new ->cable_detect hook only
    added the hook for SATAII chips, leaving SATAI chips
    and the 20619 without the hook. Fixed by this patch.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

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

    Alan Cox
     

26 Feb, 2007

3 commits

  • Bump versions based on changes submitted during 2.6.21 merge window.

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     
  • Each place in pdc_ata_init_one() that initialises a SATA
    port first calls pdc_ata_setup_port(), and then manually
    assigns the port's ->scr_addr. Simplify the code by extending
    pdc_ata_setup_port() to also handle scr_addr initialisation;
    for PATA ports we pass NULL as scr_addr.

    The initialisation of the PATA-only 20619 redundantly set
    up scr_addr for the ports. Remove this.

    Tested on 20619, 20575, and 20775 chips.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • When I merged my 20619 new EH conversion with #libata-upstream
    I had to manually resolve a conflict, and inadvertently lost
    pdc_pata_ops' ->post_internal_cmd binding. Corrected by this patch.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

16 Feb, 2007

2 commits

  • This patch updates the sata_promise driver to use new-style
    libata error handling for 20619 (TX4000) chips. sata_promise
    already uses new EH for the other chips it supports, so the
    patch is quite simple:

    * remove ->phy_reset and ->eng_timeout ops from pdc_pata_ops,
    and instead bind ->freeze, ->thaw, ->error_handler, and
    ->post_internal_cmd to existing new EH functions
    * drop ATA_FLAG_SRST from board_20619's flags
    * remove now unused pdc_pata_phy_reset() and pdc_eng_timeout()

    Tested on a TX4000 with both modern working disks and old/quirky
    disks. Also used a CD-RW drive to test reading and writing CDs.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch fixes an oversight which caused sata_promise to
    not perform cable detection on the TX2plus chips' PATA ports.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

15 Feb, 2007

1 commit

  • After Al Viro (finally) succeeded in removing the sched.h #include in module.h
    recently, it makes sense again to remove other superfluous sched.h includes.
    There are quite a lot of files which include it but don't actually need
    anything defined in there. Presumably these includes were once needed for
    macros that used to live in sched.h, but moved to other header files in the
    course of cleaning it up.

    To ease the pain, this time I did not fiddle with any header files and only
    removed #includes from .c-files, which tend to cause less trouble.

    Compile tested against 2.6.20-rc2 and 2.6.20-rc2-mm2 (with offsets) on alpha,
    arm, i386, ia64, mips, powerpc, and x86_64 with allnoconfig, defconfig,
    allmodconfig, and allyesconfig as well as a few randconfigs on x86_64 and all
    configs in arch/arm/configs on arm. I also checked that no new warnings were
    introduced by the patch (actually, some warnings are removed that were emitted
    by unnecessarily included header files).

    Signed-off-by: Tim Schmielau
    Acked-by: Russell King
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tim Schmielau
     

10 Feb, 2007

9 commits

  • This patch is against each libata driver.

    Two IRQ calls are added in ata_port_operations.
    - irq_on() is used to enable interrupts.
    - irq_ack() is used to acknowledge a device interrupt.

    In most drivers, ata_irq_on() and ata_irq_ack() are used for
    irq_on and irq_ack respectively.

    In some drivers (ex: ahci, sata_sil24) which cannot use them
    as is, ata_dummy_irq_on() and ata_dummy_irq_ack() are used.

    Signed-off-by: Kou Ishizaki
    Signed-off-by: Akira Iguchi
    Signed-off-by: Jeff Garzik

    Akira Iguchi
     
  • Convert libata core layer and LLDs to use iomap.

    * managed iomap is used. Pointer to pcim_iomap_table() is cached at
    host->iomap and used through out LLDs. This basically replaces
    host->mmio_base.

    * if possible, pcim_iomap_regions() is used

    Most iomap operation conversions are taken from Jeff Garzik
    's iomap branch.

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

    Tejun Heo
     
  • Update libata LLDs to use devres. Core layer is already converted to
    support managed LLDs. This patch simplifies initialization and fixes
    many resource related bugs in init failure and detach path. For
    example, all converted drivers now handle ata_device_add() failure
    gracefully without excessive resource rollback code.

    As most resources are released automatically on driver detach, many
    drivers don't need or can do with much simpler ->{port|host}_stop().
    In general, stop callbacks are need iff port or host needs to be given
    commands to shut it down. Note that freezing is enough in many cases
    and ports are automatically frozen before being detached.

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

    Tejun Heo
     
  • Merge order left qc->nsect usage in sata_promise dangling. Kill it.

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

    Tejun Heo
     
  • This patch extends sata_promise to handle ATAPI_NODATA
    commands internally. However, commands destined to
    ATA_DFLAG_CDB_INTR devices are excluded from this and
    continue to be returned to libata.

    Concrete changes:
    - pdc_atapi_dma_pkt() is renamed to pdc_atapi_pkt(), and is
    extended to set up correct headers for NODATA packets
    - pdc_qc_prep() calls pdc_atapi_pkt() for ATAPI_NODATA
    - pdc_host_intr() handles ATAPI_NODATA
    - pdc_qc_issue_prot() sends ATAPI_NODATA packets via the
    chip's packet mechanism, except for CDB_INTR devices

    Tested on first- and second-generation chips, SATAPI and PATAPI,
    with no observable regressions.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch (against libata #upstream + the ATAPI cleanup patch)
    reimplements sata_promise's ATAPI support to format ATAPI DMA
    commands as normal packets, and to issue them via the hardware's
    normal packet machinery.

    It turns out that the only reason for issuing ATAPI DMA
    commands via the pdc_issue_atapi_pkt_cmd() procedure was to
    perform two interrupt-fiddling steps for ATA_DFLAG_CDB_INTR
    devices. But these steps aren't needed because sata_promise
    sets ATA_FLAG_PIO_POLLING, which disables DMA for those devices.
    The remaining steps can easily be done in ATA taskfile packets.

    Concrete changes:
    - pdc_atapi_dma_pkt() is extended to program all packet setup
    steps, and not just contain the CDB; the sequence of steps
    exactly mirrors what pdc_issue_atapi_pkt_cmd() did
    - pdc_atapi_dma_pkt() needed more parameters: simplify it by
    just passing 'qc' and having it extract the data it needs
    - pdc_issue_atai_pkt_cmd() and its two helper procedures
    pdc_wait_for_drq() and pdc_wait_on_busy() are removed

    Tested on first- and second-generation chips, SATAPI and PATAPI,
    with no observable regressions.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • Here's a cleanup for yesterday's sata_promise ATAPI patch:
    - add and use a symbolic constant for the altstatus register
    - check return status from ata_busy_wait()
    - add missing newline in a warning printk()
    - update comment in pdc_issue_atapi_pkt_cmd() to clarify
    that the maybe-wait-for-INT issue cannot occur in the
    current driver, but may occur if the driver starts issuing
    ATAPI non-DMA commands as PDC packets

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch adds ATAPI support to the sata_promise driver.
    This has been tested on both first- and second-generation
    chips (20378 and 20575), and with both SATAPI and PATAPI
    devices. CD-writing works.

    SATAPI DMA works on second-generation chips, but on
    first-generation chips SATAPI is limited to PIO due
    to what appears to be HW limitations.
    PATAPI DMA works on both first- and second-generation
    chips, but requires the separate PATA support patch
    before it can be used on TX2plus chips.

    The functional changes to the driver are:
    - remove ATA_FLAG_NO_ATAPI from PDC_COMMON_FLAGS
    - add ->check_atapi_dma() operation to enable DMA for bulk data
    transfers but force PIO for other ATAPI commands; this filter
    is from Promise's driver and largely matches pata_pdc207x.c
    - use a more restrictive ->check_atapi_dma() on first-generation
    chips to force SATAPI to always use PIO
    - add handling of ATAPI protocols to pdc_qc_prep(), pdc_host_intr(),
    and pdc_qc_issue_prot(): ATAPI_DMA is handled by the driver
    while non-DMA protocols are handed over to libata generic code
    - add pdc_issue_atapi_pkt_cmd() to handle the initial steps in
    issuing ATAPI DMA commands before sending the actual CDB;
    this procedure was ported from Promise's driver

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch implements a simple way of setting up per-port
    flags on the SATA+PATA Promise TX2plus chips, which is a
    prerequisite for supporting the PATA port on those chips.

    It is based on the observation that ap->flags isn't really
    used until after ->port_start() has been invoked. So it
    places the "exceptional" per-port flags array in the driver's
    private host structure, and uses it in ->port_start() to
    finalise the port's flags.

    This patch obsoletes the #promise-sata-pata branch included
    in the #all branch.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

07 Dec, 2006

2 commits

  • This patch converts sata_promise to use new-style libata error
    handling on Promise SATA chips, for both SATA and PATA ports.

    * ATA_FLAG_SRST is no longer set
    * ->phy_reset is no longer set as it is unused when ->error_handler
    is present, and pdc_sata_phy_reset() has been removed
    * pdc_freeze() masks interrupts and halts DMA via PDC_CTLSTAT
    * pdc_thaw() clears interrupt status in PDC_INT_SEQMASK and then
    unmasks interrupts in PDC_CTLSTAT
    * pdc_error_handler() reinitialises the port if it isn't frozen,
    and then invokes ata_do_eh() with standard {s,}ata reset methods
    * pdc_post_internal_cmd() resets the port in case of errors
    * the PATA-only 20619 chip continues to use old-style EH:
    not by necessity but simply because I don't have documentation
    for it or any way to test it

    Since the previous version pdc_error_handler() has been rewritten
    and it now mostly matches ahci and sata_sil24. In case anyone
    wonders: the call to pdc_reset_port() isn't a heavy-duty reset,
    it's a light-weight reset to quickly put a port into a sane state.

    The discussion about the PCI flushes in pdc_freeze() and pdc_thaw()
    seemed to end with a consensus that the flushes are OK and not
    obviously redundant, so I decided to keep them for now.

    This patch was prepared against 2.6.19-git7, but it also applies
    to 2.6.19 + libata #upstream, with or without the revised sata_promise
    cleanup patch I recently submitted.

    This patch does conflict with the #promise-sata-pata patch:
    this patch removes pdc_sata_phy_reset() while #promise-sata-pata
    modifies it. The correct patch resolution is to remove the function.

    Tested on 2037x and 2057x chips, with PATA patches on top and disks
    on both SATA and PATA ports.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • This patch performs two simple cleanups of sata_promise.

    * Remove board_20771 and map device id 0x3577 to board_2057x.
    After the recent corrections for SATAII chips, board_20771 and
    board_2057x were equivalent in the driver.

    * Remove hp->hotplug_offset and use hp->flags & PDC_FLAG_GEN_II
    to compute hotplug_offset in pdc_host_init(). hp->hotplug_offset
    was used to distinguish 1st and 2nd generation chips in one
    particular case, but now we have that information in a more
    general form in hp->flags, so hp->hotplug_offset is redundant.

    Changes since previous submission: rebased on libata-dev #upstream,
    cleaned up hotplug_offset computation based on Tejun's comments,
    expanded hotplug_offset removal rationale.

    This patch does not depend on the pending new EH conversion patch.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

03 Dec, 2006

1 commit

  • This patch adds code to fix up the PHYMODE4 "align timing"
    register value on second-generation Promise SATA chips.
    Failure to correct this value on non-x86 machines makes
    drive detection prone to failure due to timeouts. (I've
    observed about 50% detection failure rates on SPARC64.)

    The HW boots with a bad value in this register, but on x86
    machines the Promise BIOS corrects it to the value recommended
    by the manual, so most people have been unaffected by this issue.

    After developing the patch I checked Promise's SATAII driver,
    and discovered that it also corrects PHYMODE4 just like this
    patch does.

    This patch depends on the sata_promise SATAII updates
    patch I sent recently.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     

02 Dec, 2006

2 commits

  • This patch updates the sata_promise driver as follows:
    - Correct typo in definition of PDC_TBG_MODE: it's at 0x41C not 0x41
    in first-generation chips. This error caused PCI access alignment
    exceptions on SPARC64, and on all platforms it disabled the expected
    initialisation of TBG mode.
    - Add flags field to struct pdc_host_priv. Define PDC_FLAG_GEN_II
    and use it to distinguish first- and second-generation chips.
    - Prevent the FLASH_CTL FIFO_SHD bit from being set to 1 on second-
    generation chips. This matches Promises' ulsata2 driver.
    - Prevent TBG mode and SLEW rate initialisation in second-generation chips.
    These two registers have moved, TBG mode has been redefined, and
    Promise's ulsata2 driver no longer attempts to initialise them.
    - Correct PCI device table so devices 0x3570, 0x3571, and 0x3d73 are
    marked as 2057x (2nd gen) not 2037x (1st gen).
    - Correct PCI device table so device 0x3d17 is marked as 40518
    (2nd gen 4 ports) not 20319 (1st gen 4 ports).
    - Correct pdc_ata_init_one() to treat 20771 as a second-generation chip.

    Tested on 0x3d75 (2nd gen), 0x3d73 (2nd gen), and 0x3373 (1st gen) chips.
    The information comes from the newly uploaded Promise SATA HW specs,
    Promise's ultra and ulsata2 drivers, and debugging on 3d75/3d73/3373 chips.

    hp->hotplug_offset could now be removed and its value recomputed
    in pdc_host_init() using hp->flags, but that would be a cleanup
    not a functional change, so I'm ignoring it for now.

    Signed-off-by: Mikael Pettersson
    Signed-off-by: Jeff Garzik

    Mikael Pettersson
     
  • Fixes crashes on sparc, and may correct weird behavior reported on
    occasions, because we were never programming this register correctly (or
    at all).

    Signed-off-by: Jeff Garzik

    Jeff Garzik
     

11 Oct, 2006

3 commits


05 Oct, 2006

1 commit

  • Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
    of passing regs around manually through all ~1800 interrupt handlers in the
    Linux kernel.

    The regs pointer is used in few places, but it potentially costs both stack
    space and code to pass it around. On the FRV arch, removing the regs parameter
    from all the genirq function results in a 20% speed up of the IRQ exit path
    (ie: from leaving timer_interrupt() to leaving do_IRQ()).

    Where appropriate, an arch may override the generic storage facility and do
    something different with the variable. On FRV, for instance, the address is
    maintained in GR28 at all times inside the kernel as part of general exception
    handling.

    Having looked over the code, it appears that the parameter may be handed down
    through up to twenty or so layers of functions. Consider a USB character
    device attached to a USB hub, attached to a USB controller that posts its
    interrupts through a cascaded auxiliary interrupt controller. A character
    device driver may want to pass regs to the sysrq handler through the input
    layer which adds another few layers of parameter passing.

    I've build this code with allyesconfig for x86_64 and i386. I've runtested the
    main part of the code on FRV and i386, though I can't test most of the drivers.
    I've also done partial conversion for powerpc and MIPS - these at least compile
    with minimal configurations.

    This will affect all archs. Mostly the changes should be relatively easy.
    Take do_IRQ(), store the regs pointer at the beginning, saving the old one:

    struct pt_regs *old_regs = set_irq_regs(regs);

    And put the old one back at the end:

    set_irq_regs(old_regs);

    Don't pass regs through to generic_handle_irq() or __do_IRQ().

    In timer_interrupt(), this sort of change will be necessary:

    - update_process_times(user_mode(regs));
    - profile_tick(CPU_PROFILING, regs);
    + update_process_times(user_mode(get_irq_regs()));
    + profile_tick(CPU_PROFILING);

    I'd like to move update_process_times()'s use of get_irq_regs() into itself,
    except that i386, alone of the archs, uses something other than user_mode().

    Some notes on the interrupt handling in the drivers:

    (*) input_dev() is now gone entirely. The regs pointer is no longer stored in
    the input_dev struct.

    (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does
    something different depending on whether it's been supplied with a regs
    pointer or not.

    (*) Various IRQ handler function pointers have been moved to type
    irq_handler_t.

    Signed-Off-By: David Howells
    (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)

    David Howells
     

28 Sep, 2006

1 commit