11 Jul, 2016

7 commits

  • When sending an ATR_REQ, the initiator must wait for the ATR_RES at
    least 'RWT(nfcdep,activation) + dRWT(nfcdep)' and no more than
    'RWT(nfcdep,activation) + dRWT(nfcdep) + dT(nfcdep,initiator)'. This
    gives a timeout value between 1237 ms and 1337 ms. This patch defines
    DIGITAL_ATR_RES_RWT to 1337 used for the timeout value of ATR_REQ
    command.

    For other DEP PDUs, the initiator must wait between 'RWT + dRWT(nfcdep)'
    and 'RWT + dRWT(nfcdep) + dT(nfcdep,initiator)' where RWT is given by
    the following formula: '(256 * 16 / f(c)) * 2^wt' where wt is the value
    of the TO field in the ATR_RES response and is in the range between 0
    and 14. This patch declares a mapping table for wt values and gives RWT
    max values between 100 ms and 5049 ms.

    This patch also defines DIGITAL_ATR_RES_TO_WT, the maximum wt value in
    target mode, to 8.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • This patch frees the RTOX resp sk_buff in initiator mode. It also makes
    use of the free_resp exit point for ATN supervisor PDUs in both
    initiator and target mode.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • With this patch, ACK PDU sk_buffs are now freed and code has been
    refactored for better errors handling.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • When the target receives a NACK PDU, it re-sends the last sent PDU.

    ACK PDUs are received by the target as a reply from the initiator to
    chained I-PDUs. There are 3 cases to handle:
    - If the target has previously received 1 or more ATN PDUs and the PNI
    in the ACK PDU is equal to the target PNI - 1, then it means that the
    initiator did not received the last issued PDU from the target. In
    this case it re-sends this PDU.
    - If the target has received 1 or more ATN PDUs but the ACK PNI is not
    the target PNI - 1, then this means that this ACK is the reply of the
    previous chained I-PDU sent by the target. The target did not received
    it on the first attempt and it is being re-sent by the initiator. The
    process continues as usual.
    - No ATN PDU received before this ACK PDU. This is the reply of a
    chained I-PDU. The target keeps on processing its chained I-PDU.

    The code has been refactored to avoid too many indentation levels.

    Also, ACK and NACK PDUs were not freed. This is now fixed.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • When the initiator sends a DEP_REQ I-PDU, the target device may not
    reply in a timely manner. In this case the initiator device must send an
    attention PDU (ATN) and if the recipient replies with an ATN PDU in
    return, then the last I-PDU must be sent again by the initiator.

    This patch fixes how the target handles I-PDU received after an ATN PDU
    has been received.

    There are 2 possible cases:
    - The target has received the initial DEP_REQ and sends back the DEP_RES
    but the initiator did not receive it. In this case, after the
    initiator has sent an ATN PDU and the target replied it (with an ATN
    as well), the initiator sends the saved skb of the initial DEP_REQ
    again and the target replies with the saved skb of the initial
    DEP_RES.
    - Or the target did not even received the initial DEP_REQ. In this case,
    after the ATN PDUs exchange, the initiator sends the saved skb and the
    target simply passes it up, just as usual.

    This behavior is controlled using the atn_count and the PNI field of the
    digital device structure.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • When allocating chained I-PDUs, there is no need to call skb_reserve()
    since it's already done by digital_alloc_skb() and contains enough room
    for the driver head and tail data.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • This patch fixes the way an I-PDU is saved in case it needs to be sent
    again. It is now copied using pskb_copy() and not simply referenced
    using skb_get() since it could be modified by the driver.

    digital_in_send_saved_skb() and digital_tg_send_saved_skb() still get a
    reference on the saved skb which is re-sent but release it if the send
    operation fails. That way the caller doesn't have to take care about skb
    ref in case of error.

    RTOX supervisor PDU must not be saved as this can override a previously
    saved I-PDU that should be re-sent later on.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     

06 Jul, 2016

12 commits

  • With this patch, the Digital Protocol layer abort the last issued
    command when the dep link goes down. That way it does not have to wait
    for the driver to reply with a timeout error before sending a new
    command (i.e. a start poll command if constant polling is on).

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • There is a flag in the command structure indicating that this command is
    pending. It was checked before sending the command to not send the same
    command twice but it was actually never set. This is now fixed.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • With this patch, when freeing the command queue in the module unregister
    function, the callbacks of the commands still queued are called with a
    ENODEV error. This gives a chance to the command issuer to free any
    memory it could have allocate.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • The Digital Protocol stack used to send a NACK frame whatever the error
    type it receives in digital_in_recv_dep_res(). It actually should only
    send a NACK frame on CRC or parity check errors or on any transmission
    error if a NACK frame was previously sent. Existing drivers used to send
    EIO error for this kind of issues so this patch limits sending of NACK
    frames on EIO errors. All other errors will be reported to the upper
    layers.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • When configured as a target listening for a SENSF_REQ poll command, a
    nfcid2 array was allocated for no reason leading to a memory leak. The
    nfcid2 is sent by the target in the SENSF_RES reply.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • The nfcsim driver now depends on the Digital layer. This patch adds the
    missing dependency on NFC_DIGITAL for NFC_SIM config.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • If a command is still being processed by the device, the switch RF off
    command will be rejected. With this patch, the port100 driver calls
    port100_abort_cmd() before sending the switch RF off command.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • This patch makes the abort_cmd function synchronous. This allows the
    caller to immediately send a new command after abort_cmd() returns.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • The USB out_urb used to send commands to the device can be submitted
    through the standard command processing queue coming from the Digital
    Protocol layer but it can also be submitted from port100_abort_cmd().

    To not submit the URB while already active, a mutex is now used to
    protect it and a cmd_cancel flag is used to not send command while
    canceling the previous one.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • This patch ensures that a command is not still in process before sending
    a new one to the device. This can happen when neard is in constant
    polling mode: the configure_hw command can be sent when neard restarts
    polling after a LLCP SYMM timeout but before the device has returned in
    timeout from the last DEP frame sent.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • Once copied into the sk_buff data area using llcp_add_tlv(), the
    allocated TLVs must be freed.

    With this patch nfc_llcp_send_connect() and nfc_llcp_send_cc() don't
    return immediately on success and now free the allocated TLVs.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • In functions using llcp_add_tlv(), a skb pointer could be set to NULL
    and then reuse afterward.

    With this patch, the skb pointer returned by llcp_add_tlv() is ignored
    since it can only be the passed skb pointer or NULL when the passed TLV
    is NULL. There is also no need to check for the TLV pointer as this is
    done by llcp_add_tlv().

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     

04 Jul, 2016

9 commits

  • With this complete rewrite, the loopback nfcsim driver now relies on the
    Digital layer of the nfc stack. As with the previous version, 2 nfc
    devices are declared when the driver is initialized. The driver supports
    the NFC_DEP protocol in NFC-A and NFC-F technologies.

    The 2 devices are using a pair of virtual links for sk_buff exchange.
    The out-link of one device is the in-link of the other and conversely.

    To receive data, a device calls nfcsim_link_recv_skb() on its in-link
    and waits for incoming data on a wait queue. To send data, a device
    calls nfcsim_link_send_skb() on its out-link which stores the passed skb
    and signals its wait queue. If the peer device was in the
    nfcsim_link_recv_skb() call, it will be signaled and will be able to
    pass the received sk_buff up to the Digital layer.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • LLCP skb tx and rx functions now use print_hex_dump_debug() making
    these verbose traces controllable using dynamic debug.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • This replaces the polling work struct with a delayed work struct and add
    a 10 ms delay between 2 poll cycles. This avoids to flood the device
    with 'switch off'/'switch on' commands.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • When setting the driver framing as NFC_DIGITAL_FRAMING_NFCF_NFC_DEP it
    used to be already configured as NFC_DIGITAL_FRAMING_NFCF which is the
    same. So this entry was empty in the in_protocols table.
    Now that the digital stack can handle PLS requests, it can be changed
    on the fly from NFC_DIGITAL_FRAMING_NFCA_NFC_DEP.
    This patch explicitly defines the framing configuration values for
    NFC_DIGITAL_FRAMING_NFCF_NFC_DEP.

    Signed-off-by: Thierry Escande
    Signed-off-by: Samuel Ortiz

    Thierry Escande
     
  • Signed-off-by: Geoff Lansberry
    Signed-off-by: Samuel Ortiz

    Geoff Lansberry
     
  • drivers/nfc/fdp/fdp.c: In function ‘fdp_nci_patch_otp’:
    drivers/nfc/fdp/fdp.c:373: warning: comparison is always false due to limited range of data type
    drivers/nfc/fdp/fdp.c: In function ‘fdp_nci_patch_ram’:
    drivers/nfc/fdp/fdp.c:444: warning: comparison is always false due to limited range of data type

    fdp_nci_create_conn() may return a negative error code, which is
    silently ignored by assigning it to a u8.

    Change conn_id from u8 to int to fix this.

    Fixes: a06347c04c13e380 ("NFC: Add Intel Fields Peak NFC solution driver")
    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: Samuel Ortiz

    Geert Uytterhoeven
     
  • We can't pass devm_ allocated pointers to kfree() because they will be
    freed again after the drive is unloaded.

    Signed-off-by: Dan Carpenter
    Signed-off-by: Samuel Ortiz

    Dan Carpenter
     
  • It used to be EXPORTed, but then EXPORT usage was cleaned up
    (in 2012), without noticing that the function has no users at all
    (and curiously, never had any users).

    Delete it.

    While at it, remove non-static "inline" hints on nearby functions:
    these hints don't work across compilation units anyway,
    and these functions are not used in their .c file, thus they are
    never inlined. IOW: "inline" here does not help in any way.

    Signed-off-by: Denys Vlasenko
    CC: Samuel Ortiz
    CC: Christophe Ricard
    CC: linux-wireless@vger.kernel.org
    CC: linux-kernel@vger.kernel.org
    Signed-off-by: Samuel Ortiz

    Denys Vlasenko
     
  • When info->ram_patch is released info->otp_patch is being set
    to NULL rather than info->ram_patch. I believe this is a cut-n-paste
    bug from almost identical code proceeding it that uses the same
    idiom for info->otp_patch.

    Signed-off-by: Colin Ian King
    Signed-off-by: Samuel Ortiz

    Colin Ian King
     

03 Jul, 2016

12 commits

  • commit 8067302973a1 ("net-next: mediatek: add support for IRQ grouping")
    failed to properly update the irq handling inside mtk_poll_controller()
    causing compile errors if netconsole was enabled. Fix this by updating
    the code to use the new separated irq handler function for RX.

    Signed-off-by: John Crispin
    Signed-off-by: David S. Miller

    John Crispin
     
  • Jiri Pirko says:

    ====================
    mlxsw: Lay the groundwork for the introduction of router interfaces

    This is first patchset on a way to introduce ipv4 routing offload support
    in mlxsw driver. Does preparations before router interfaces will
    be introduced in mlxsw.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     
  • ip2me:
    To instruct HW to send trapped ip2me traffic to kernel, we have to add
    this trap. Selection ip2me traffic is introduced later on in this set.

    ARPs:
    We are going to stop flooding to CPU port when netdev isn't bridged and
    only get packets destined to the netdev's IP address and certain control
    packets.

    Add traps for ARP request (broadcast) and response (unicast) in order to
    get these to the CPU and resolve neighbours.

    host miss:
    If a packet is routed through a directly connected route and its
    destination IP is not in the device's neighbour table, then we need to
    trap it to CPU. This will cause the host to resolve the MAC of the
    neighbour, which will be eventually programmed to the device's table.

    router ingress:
    In order to trap packets in router part.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Jiri Pirko
     
  • When removing packet traps we should use action 'discard' instead of
    'forward', as some trap IDs we'll add cannot be configured with the
    later. However, result is the same, as packets are not trapped to the
    CPU.

    In the future we will be able to reverse the operation properly by
    detaching the trap group from the CPU.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • Add the Router Interface Table Register (RITR), which allows us to
    create and configure router interfaces (RIFs).

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • Incoming packets are directed to the router when they match an FDB
    entry with action forward to IP router.

    Add this action, which was mistakenly named "TRAP".

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • When enabling the router in the device we will represent L3 netdevs
    using router interfaces (RIFs). These will be specified whenever
    programming routes or neighbours on the netdev.

    Introduce the basic RIF infrastructure which allows one to lookup a RIF
    by its netdev. Later patches in the series will extend this, but the
    basic routines are needed now in order to direct traffic to CPU.

    Pointers to the RIF structs are stored in an array indexed by the RIF's
    number. This will allow us to efficiently update the kernel's neighbour
    table when regularly dumping the device's table.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • Create a skeleton router file and do basic HW initialization of router.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • During ports initialization a net device is registered for each
    available port, which implies the port is usable. However, a port is
    only usable after the different parts of the device (e.g. flooding,
    buffers) are initialized. This is especially important now, when we must
    initialize the router before the ports, as otherwise the device can't be
    initialized.

    Solve that by initializing the switch ports at the end of init sequence.

    Also, remove an unnecessary warning about port up/down events, which
    would otherwise be invoked whenever removing the driver, as ports are
    removed before unregistering the listener for these events.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • Add the Router General Configuration Register (RGCR), which allows us to
    enable the router in the device and configure its various parameters.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • We are going to assign router interfaces (RIFs) to netdevs if an IPv4
    address was assigned to them. If one was assigned to a port netdev, this
    will translate to the PVID vPort being member in a RIF.

    While it's possible for a LAG slave to have an IP address, we can't have
    a vPort being member in two FIDs (assuming the LAG device will be
    put in bridge / assigned an IP address).

    Solve that by making the PVID vPort leave any FID it might be a member
    in when joining / leaving LAG.

    Note that the PVID vPort is the only vPort that can be present on the
    port when it's put under LAG.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel
     
  • When VLAN devices are created on top of LAG, their underlying vPorts are
    configured correctly with LAG membership.

    However, the PVID vPort is implicit and already present when the port
    netdev is put under LAG, so its LAG membership is never set. Set it
    correctly when joining / leaving LAG.

    This didn't matter until now, but we are going to introduce support for
    router interfaces (RIFs), which need to take into account LAG membership.

    Signed-off-by: Ido Schimmel
    Signed-off-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Ido Schimmel