06 Sep, 2013

8 commits

  • PCI core will initialize device MSI/MSI-X capability in
    pci_msi_init_pci_dev(). So device driver should use
    pci_dev->msi_cap/msix_cap to determine whether the device
    support MSI/MSI-X instead of using
    pci_find_capability(pci_dev, PCI_CAP_ID_MSI/MSIX).
    Access to PCIe device config space again will consume more time.

    Signed-off-by: Yijing Wang
    Signed-off-by: Jon Mason

    Yijing Wang
     
  • Update NTB version to 1.0

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Add "data" ntb_register_db_callback parameter description comment and
    correct poor spelling.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Remove unused pci_dev variable from ntb_transport_free()

    Signed-off-by: Jon Mason

    Jon Mason
     
  • NTB-RP is not a supported configuration on BWD hardware. Remove the
    code attempting to set it up.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Add support for Non-Transparent Bridge connected to a PCI-E Root Port on
    the remote system (also known as NTB-RP mode). This allows for a NTB
    enabled system to be connected to a non-NTB enabled system/slot.

    Modifications to the registers and BARs/MWs on the Secondary side by the
    remote system are reflected into registers on the Primary side for the
    local system. Similarly, modifications of registers and BARs/MWs on
    Primary side by the local system are reflected into registers on the
    Secondary side for the Remote System. This allows communication between
    the 2 sides via these registers and BARs/MWs.

    Note: there is not a fix for the Xeon Errata (that was already worked
    around in NTB-B2B mode) for NTB-RP mode. Due to this limitation, NTB-RP
    will not work on the Secondary side with the Xeon Errata workaround
    enabled. To get around this, disable the workaround via the
    xeon_errata_workaround=0 modparm. However, this can cause the hang
    described in the errata.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Many variable names in the NTB driver refer to the primary or secondary
    side. However, these variables will be used to access the reverse case
    when in NTB-RP mode. Make these names more generic in anticipation of
    NTB-RP support.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Allocate and use a DMA engine channel to transmit and receive data over
    NTB. If none is allocated, fall back to using the CPU to transfer data.

    Signed-off-by: Jon Mason
    Reviewed-by: Dan Williams
    Reviewed-by: Dave Jiang

    Jon Mason
     

04 Sep, 2013

8 commits

  • Correct the issues on NTB that prevented it from working on x86_32 and
    modify the Kconfig to allow it to be permitted to be used in that
    environment as well.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Add support for new Intel NTB devices on upcoming Xeon hardware. Since
    the Xeon hardware design is already in place in the driver, all that is
    needed are the new device ids.

    Remove the device IDs for NTB devs running in Transparent Bridge mode,
    as this driver is not being used for those devices.

    Rename the device IDs for NTB devs running in NTB-RP mode to better
    identify their usage model. "PS" to denote the Primary Side of NTB, and
    "SS" to denote the secondary side. The primary side is the interface
    exposed to the local system, and the secondary side is the interface
    exposed to the remote system.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • The BWD NTB device will drop the link if an error is encountered on the
    point-to-point PCI bridge. The link will stay down until all errors are
    cleared and the link is re-established. On link down, check to see if
    the error is detected, if so do the necessary housekeeping to try and
    recover from the error and reestablish the link.

    There is a potential race between the 2 NTB devices recovering at the
    same time. If the times are synchronized, the link will not recover and the
    driver will be stuck in this loop forever. Add a random interval to the
    recovery time to prevent this race.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • There is a Xeon hardware errata related to writes to SDOORBELL or
    B2BDOORBELL in conjunction with inbound access to NTB MMIO Space, which
    may hang the system. To workaround this issue, use one of the memory
    windows to access the interrupt and scratch pad registers on the remote
    system. This bypasses the issue, but removes one of the memory windows
    from use by the transport. This reduction of MWs necessitates adding
    some logic to determine the number of available MWs.

    Since some NTB usage methodologies may have unidirectional traffic, the
    ability to disable the workaround via modparm has been added.

    See BF113 in
    http://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/xeon-c5500-c3500-spec-update.pdf
    See BT119 in
    http://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/xeon-e5-family-spec-update.pdf

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Debugfs was setup in NTB to only have a single debugfs directory. This
    resulted in the leaking of debugfs directories and files when multiple
    NTB devices were present, due to each device stomping on the variables
    containing the previous device's values (thus preventing them from being
    freed on cleanup). Correct this by creating a secondary directory of
    the PCI BDF for each device present, and nesting the previously existing
    information in those directories.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Due to ambiguous documentation, the USD/DSD identification is backward
    when compared to the setting in BIOS. Correct the bits to match the
    BIOS setting.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • The NTB Xeon hardware has 16 scratch pad registers and 16 back-to-back
    scratch pad registers. Correct the #define to represent this and update
    the variable names to reflect their usage.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • If an error is encountered in ntb_device_setup, it is possible that the
    spci_cmd isn't populated. Writes to the offset can result in a NULL
    pointer dereference. This issue is easily encountered by running in
    NTB-RP mode, as it currently is not supported and will generate an
    error. To get around this issue, return if an error is encountered
    prior to attempting to write to the spci_cmd offset.

    Signed-off-by: Jon Mason

    Jon Mason
     

16 May, 2013

9 commits

  • Fix issue with adding multiple ntb client devices to the ntb virtual
    bus. Previously, multiple devices would be added with the same name,
    resulting in crashes. To get around this issue, add a unique number to
    the device when it is added.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • The system will appear to lockup for long periods of time due to the NTB
    driver spending too much time in memcpy. Avoid this by reducing the
    number of packets that can be serviced on a given interrupt.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • The ring logic of the NTB receive buffer/transmit memory window requires
    there to be at least 2 payload sized allotments. For the minimal size
    case, split the buffer into two and set the transport_mtu to the
    appropriate size.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • If the NTB link toggles, the driver could stop receiving due to the
    tx_index not being set to 0 on the transmitting size on a link-up event.
    This is due to the driver expecting the incoming data to start at the
    beginning of the receive buffer and not at a random place.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • Each link-up will allocate a new NTB receive buffer when the NTB
    properties are negotiated with the remote system. These allocations did
    not check for existing buffers and thus did not free them. Now, the
    driver will check for an existing buffer and free it if not of the
    correct size, before trying to alloc a new one.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • 64bit BAR sizes are permissible with an NTB device. To support them
    various modifications and clean-ups were required, most significantly
    using 2 32bit scratch pad registers for each BAR.

    Also, modify the driver to allow more than 2 Memory Windows.

    Signed-off-by: Jon Mason

    Jon Mason
     
  • ->remote_rx_info and ->rx_info are struct ntb_rx_info pointers. If we
    add sizeof(struct ntb_rx_info) then it goes too far.

    Signed-off-by: Dan Carpenter
    Signed-off-by: Jon Mason

    Dan Carpenter
     
  • These tests are off by one. If "mw" is equal to NTB_NUM_MW then we
    would go beyond the end of the ndev->mw[] array.

    Signed-off-by: Dan Carpenter
    Signed-off-by: Jon Mason

    Dan Carpenter
     
  • Correct instances of variable dereferencing before checking its value on
    the functions exported to the client drivers. Also, add sanity checks
    for all exported functions.

    Reported-by: Dan Carpenter
    Signed-off-by: Jon Mason

    Jon Mason
     

22 Jan, 2013

2 commits

  • Address the sparse warnings and resulting fallout

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Atomic readq and writeq do not exist by default on some 32bit
    architectures, thus causing compile errors due to non-existent symbols.
    Since NTB has not been tested 32bit, disable x86_32 support until such
    time as this and any other issues can be properly discovered.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     

21 Jan, 2013

11 commits

  • Update NTB version to 0.25

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • If the NTB client driver enqueues the maximum number of rx buffers, it
    will not be able to re-enqueue another in its callback handler due to a
    lack of free entries. This can be avoided by adding the current entry
    to the free queue prior to calling the client callback handler. With
    this change, ntb_netdev will no longer encounter a rx error on its first
    packet.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • CPU reads across NTB are slow(er) and can hang the local system if an
    ECC error is encountered on the remote. To work around the need for a
    read, have the remote side write its current position in the rx buffer
    to the local system's buffer and use that to see if there is room when
    transmitting.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Correct gcc warning of using too much stack debugfs_read. This is done
    by kmallocing the buffer instead of using the char array on stack.
    Also, shrinking the buffer to something closer to what is currently
    being used.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Whitespace cleanups found via `indent`

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Declare ntb_bus_type static to remove it from name space, and remove
    unused ntb_get_max_spads function. Found via `make namespacecheck`.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Use simple_open for debugfs instead of recreating it in the NTB driver.
    Caught by coccicheck.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Move all cancel_delayed_work_sync to a work thread to prevent sleeping
    in interrupt context (when the NTB link goes down). Caught via
    'Sleep inside atomic section checking'

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Since it is possible for the memory windows on the two NTB connected
    systems to be different sizes, the divergent sizes must be accounted for
    in the segmentation of the MW's on each side. Create separate size
    variables and initialization as necessary.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • mmiowb is not sufficient to flush the data and is causing data
    corruption. Change to wmb and the data corruption is no more.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     
  • Attempts to probe client ntb drivers without ntb hardware present will
    result in null pointer dereference due to the lack of the ntb bus device
    being registers. Check to see if this is the case, and fail all calls
    by the clients registering their drivers.

    Signed-off-by: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason
     

18 Jan, 2013

2 commits

  • These are now gone from the kernel, so remove them from the newly-added
    drivers before they start to cause build errors for people.

    Cc: Jon Mason
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • A PCI-Express non-transparent bridge (NTB) is a point-to-point PCIe bus
    connecting 2 systems, providing electrical isolation between the two subsystems.
    A non-transparent bridge is functionally similar to a transparent bridge except
    that both sides of the bridge have their own independent address domains. The
    host on one side of the bridge will not have the visibility of the complete
    memory or I/O space on the other side of the bridge. To communicate across the
    non-transparent bridge, each NTB endpoint has one (or more) apertures exposed to
    the local system. Writes to these apertures are mirrored to memory on the
    remote system. Communications can also occur through the use of doorbell
    registers that initiate interrupts to the alternate domain, and scratch-pad
    registers accessible from both sides.

    The NTB device driver is needed to configure these memory windows, doorbell, and
    scratch-pad registers as well as use them in such a way as they can be turned
    into a viable communication channel to the remote system. ntb_hw.[ch]
    determines the usage model (NTB to NTB or NTB to Root Port) and abstracts away
    the underlying hardware to provide access and a common interface to the doorbell
    registers, scratch pads, and memory windows. These hardware interfaces are
    exported so that other, non-mainlined kernel drivers can access these.
    ntb_transport.[ch] also uses the exported interfaces in ntb_hw.[ch] to setup a
    communication channel(s) and provide a reliable way of transferring data from
    one side to the other, which it then exports so that "client" drivers can access
    them. These client drivers are used to provide a standard kernel interface
    (i.e., Ethernet device) to NTB, such that Linux can transfer data from one
    system to the other in a standard way.

    Signed-off-by: Jon Mason
    Reviewed-by: Nicholas Bellinger
    Signed-off-by: Greg Kroah-Hartman

    Jon Mason