• Alexandre Bounine's avatar
    rapidio: fix blocking wait for discovery ready · fa3dbaa0
    Alexandre Bounine authored
    The following set of patches provides modifications targeting support of
    multiple RapidIO master port (mport) devices on a CPU-side of
    RapidIO-capable board.  While the RapidIO subsystem code has definitions
    suitable for multi-controller/multi-net support, the existing
    implementation cannot be considered ready for multiple mport
    configurations.
    
    =========== NOTES: =============
    
    a) The patches below do not address RapidIO side view of multiport
       processing elements defined in Part 6 of RapidIO spec Rev.2.1 (section
       6.4.1).  These devices have Base Device ID CSR (0x60) and Component Tag
       CSR (0x6C) shared by all SRIO ports.  For example, Freescale's P4080,
       P3041 and P5020 have a dual-port SRIO controller implemented according
       the specification.  Enumeration/discovery of such devices from RapidIO
       side may require device-specific fixups.
    
    b) Devices referenced above may also require implementation specific
       code to setup a host device ID for mport device.  These operations are
       not addressed by patches in this package.
    
    =================================
    
    Details about provided patches:
    
    1. Fix blocking wait for discovery ready
    
       While it does not happen on PowerPC based platforms, there is
       possibility of stalled CPU warning dump on x86 based platforms that run
       RapidIO discovery process if they wait too long for being enumerated.
    
       Currently users can avoid it by disabling the soft-lockup detector
       using "nosoftlockup" kernel parameter OR by ensuring that enumeration
       is completed before soft-lockup is detected.
    
       This patch eliminates blocking wait and keeps a scheduler running.
       It also is required for patch 3 below which introduces asynchronous
       discovery process.
    
    2. Use device lists handling on per-net basis
    
       This patch allows to correctly support multiple RapidIO nets and
       resolves possible issues caused by using single global list of devices
       during RapidIO system enumeration/discovery.  The most common sign of
       existing issue is incorrect contents of switch routing tables in
       systems with multiple mport controllers while single-port configuration
       performs as expected.
    
       The patch does not eliminate the global RapidIO device list but
       changes some routines in enumeration/discovery to use per-net device
       lists instead.  This way compatibility with upper layer RIO routines is
       preserved.
    
    3.  Run discovery as an asynchronous process
    
       This patch modifies RapidIO initialization routine to asynchronously
       run the discovery process for each corresponding mport.  This allows
       having an arbitrary order of enumerating and discovering mports without
       creating a deadlock situation if an enumerator port was registered
       after a discovering one.
    
       On boards with multiple discovering mports it also eliminates order
       dependency between mports and may reduce total time of RapidIO
       subsystem initialization.
    
       Making netID matching to mportID ensures consistent netID assignment
       in multiport RapidIO systems with asynchronous discovery process
       (global counter implementation is affected by race between threads).
    
    4. Rework RIONET to support multiple RIO master ports
    
       In the current version of the driver rionet_probe() has comment "XXX
       Make multi-net safe".  Now it is a good time to address this comment.
    
       This patch makes RIONET driver multi-net safe/capable by introducing
       per-net lists of RapidIO network peers.  It also enables to register
       network adapters for all available mport devices.
    
    5. Add destination ID allocation mechanism
    
       The patch replaces a single global destination ID counter with
       per-net allocation mechanism to allow independent destID management for
       each available RapidIO network.  Using bitmap based mechanism instead
       of counters allows destination ID release and reuse in systems that
       support hot-swap.
    
    This patch:
    
    Fix blocking wait loop in the RapidIO discovery routine to avoid warning
    dumps about stalled CPU on x86 platforms.
    Signed-off-by: default avatarAlexandre Bounine <alexandre.bounine@idt.com>
    Cc: Matt Porter <mporter@kernel.crashing.org>
    Cc: Li Yang <leoli@freescale.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fa3dbaa0
rio-scan.c 35.2 KB