15 Dec, 2011

1 commit


16 Oct, 2011

1 commit


27 Aug, 2011

1 commit


01 Mar, 2011

1 commit


13 Feb, 2011

2 commits

  • To facilitate LLDDs to reuse the code, skb queue related functions are moved to
    libfcoe, so that both fcoe and bnx2fc drivers can use them. The common structures
    fcoe_port, fcoe_percpu_s are moved to libfcoe. fcoe_port will now have an
    opaque pointer that points to corresponding driver's interface structure.
    Also, fcoe_start_io and fcoe_fc_crc are moved to libfcoe.

    As part of this change, fixed fcoe_start_io to return ENOMEM if
    skb_clone fails.

    Signed-off-by: Bhanu Prakash Gollapudi
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Bhanu Prakash Gollapudi
     
  • add the fcoe_transport struct to the common libfcoe.h header so all fcoe
    transport provides can use it to attach itself as an fcoe transport. This
    is the header part, and the next patch will be the transport code itself.

    Signed-off-by: Yi Zou
    Signed-off-by: Bhanu Prakash Gollapudi
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Yi Zou
     

22 Dec, 2010

1 commit

  • Switches using multiple-FCFs may reject FLOGI in order to
    balance the load between multiple FCFs. Even though the FCF
    was available, it may have more load at the point we actually
    send the FLOGI.

    If the FLOGI fails, select a different FCF
    if possible, among those with the same priority. If no other
    FCF is available, just deliver the reject to libfc for retry.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     

28 Jul, 2010

4 commits

  • The FC-BB-6 committee is proposing a new FIP usage model called
    VN_port to VN_port mode. It allows VN_ports to discover each other
    over a loss-free L2 Ethernet without any FCF or Fibre-channel fabric
    services. This is point-to-multipoint. There is also a variant
    of this called point-to-point which provides for making sure there
    is just one pair of ports operating over the Ethernet fabric.

    We add these new states: VNMP_START, _PROBE1, _PROBE2, _CLAIM, and _UP.
    These usually go quickly in that sequence. After waiting a random
    amount of time up to 100 ms in START, we select a pseudo-random
    proposed locally-unique port ID and send out probes in states PROBE1
    and PROBE2, 100 ms apart. If no probe responses are heard, we
    proceed to CLAIM state 400 ms later and send a claim notification.
    We wait another 400 ms to receive claim responses, which give us
    a list of the other nodes on the network, including their FC-4
    capabilities. After another 400 ms we go to VNMP_UP state and
    should start interoperating with any of the nodes for whic we
    receivec claim responses. More details are in the spec.j

    Add the new mode as FIP_MODE_VN2VN. The driver must specify
    explicitly that it wants to operate in this mode. There is
    no automatic detection between point-to-multipoint and fabric
    mode, and the local port initialization is affected, so it isn't
    anticipated that there will ever be any such automatic switchover.

    It may eventually be possible to have both fabric and VN2VN
    modes on the same L2 network, which may be done by two separate
    local VN_ports (lports).

    When in VN2VN mode, FIP replaces libfc's fabric-oriented discovery
    module with its own simple code that adds remote ports as they
    are discovered from incoming claim notifications and responses.
    These hooks are placed by fcoe_disc_init().

    A linear list of discovered vn_ports is maintained under the
    fcoe_ctlr struct. It is expected to be short for now, and
    accessed infrequently. It is kept under RCU for lock-ordering
    reasons. The lport and/or rport mutexes may be held when we
    need to lookup a fcoe_vnport during an ELS send.

    Change fcoe_ctlr_encaps() to lookup the destination vn_port in
    the list of peers for the destination MAC address of the
    FIP-encapsulated frame.

    Add a new function fcoe_disc_init() to initialize just the
    discovery portion of libfcoe for VN2VN mode.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • There are three modes that libfcoe currently supports, and a new one
    is coming. Change the fcoe_ctlr_init() interface to add the mode
    desired. This should not change any functionality.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • It turns out most of the FIP work is now done from worker threads
    or process context now, so there's no need to use a spin lock.

    Change to use mutex instead of spin lock and delayed_work instead
    of a timer.

    This will make it nicer for the VN_port to VN_port feature that
    will interact more with the libfc layers requiring that
    spinlocks not be held.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • This is per FC-BB-5 Annex-D recommendation and per that
    if address checking fails then drop the frame.

    FIP code paths are already doing this so only needed for fcoe
    frames.

    The src address checking is limited to only fip mode since
    this might break non-fip mode used in p2p due to used OUI
    based addressing in some p2p code paths, going forward FIP
    will be the only mode, therefore limited this to only FIP
    mode so that it won't break non-fip p2p mode for now.

    -v2
    Removes FCOE packet type checking since fcoe_rcv is
    registered to receive only FCoE type packets from netdev
    and it is already checked by netdev.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev
     

12 Apr, 2010

1 commit


11 Apr, 2010

1 commit

  • The link and last_link fields in the fcoe_ctlr struct are no
    longer useful, since they are always set to the same value,
    and FIP always calls libfc to pass link information to the lport.

    Eliminate those fields and rename link_work to timer_work, since
    it no longer has any link change work to do.

    Thanks to Brian Uchino for discovering this issue.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     

05 Dec, 2009

6 commits

  • When the D bit is set if the FKA_ADV_Period of the FIP Discovery
    Advertisement, the ENode should not transmit period ENode FIP Keep Alive and
    VN_Port FIP Keep Alive (FC-BB-5 Rev2, 7.8.3.13).

    Note that fcf->flags is taken directly from the fip_header, I am claiming one
    bit for the purpose of the FIP_FKA_Period D bit as FIP_FL_FK_ADV_B, and use
    FIP_HEADER_FLAGS as bitmask for bits used in fip_header.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Yi Zou
     
  • There was a locking problem where the fip->lock was held during
    the call to update_mac(). The rtnl_lock() must be taken before
    the fip->lock, not the other way around. This fixes that.

    Now that fcoe_ctlr_recv_flog() is called only from the response handler
    to a FLOGI request, some checking can be eliminated. Instead of calling
    update_mac(), just fill in the granted_mac address for the passed-in
    frame (skb).

    Eliminate the passed-in source MAC address since it is also in the skb.

    Also, in fcoe, call fcoe_set_src_mac() directly instead of going thru
    the fip function pointer. This will generate less code.
    Then, since fip isn't needed for LOGO response, use lport as the arg.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • The fnic driver with FIP is reporting link up, even though it's down.

    When the interface is shut down by the switch, we receive a clear
    virtual link, and set the state reported to libfc as down, although
    we still report it up. Clearly wrong. That causes the subsequent
    link down event not to be reported, and /sys shows the host "Online".

    Currently, in FIP mode, if an FCF times out, then link to libfc
    is reported as down, to stop FLOGIs. That interferes with the LLD
    link down being reported.

    Users really need to know the physical link information, to diagnose
    cabling issues, so physical link status should be reported to libfc.

    If the selected FCF needs to be reported, that should be done
    separately, in a later patch.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • Allow FIP to be disabled by the driver for devices
    that want to use libfcoe in non-FIP mode.

    The driver merely sets the fcoe_ctlr mode to the state which
    should be entered when the link comes up. The default is auto.
    No change is needed for fcoe.c which uses auto mode.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • Ensures that there are kernel-doc style comments for all
    routines and structures.

    There were also a few instances of fc_lport's named 'lp'
    which were switched to 'lport' as per the libfc/libfcoe/fcoe
    naming convention.

    Also, emacs 'indent-region' and 'tabify' were ran on libfcoe.c.

    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Robert Love
     
  • The FIP code in libfcoe needed several changes to support NPIV

    1) dst_src_addr needs to be managed per-n_port-ID for FPMA fabrics with NPIV
    enabled. Managing the MAC address is now handled in fcoe, with some slight
    changes to update_mac() and a new get_src_addr() function pointer.

    2) The libfc elsct_send() hook is used to setup FCoE specific response
    handlers for FIP encapsulated ELS exchanges. This lets the FCoE specific
    handling know which VN_Port the exchange is for, and doesn't require
    tracking OX_IDs. It might be possible to roll back to the full FIP frame
    in these, but for now I've just stashed the contents of the MAC address
    descriptor in the skb context block for later use. Also, because
    fcoe_elsct_send() just passes control on to fc_elsct_send(), all transmits
    still come through the normal frame_send() path.

    3) The NPIV changes added a mutex hold in the keep alive sending, the lport
    mutex is protecting the vport list. We can't take a mutex from a timer,
    so move the FIP keep alive logic to the link work struct.

    Signed-off-by: Chris Leech
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Chris Leech
     

18 May, 2009

1 commit

  • If we can find a type NETDEV_HW_ADDR_T_SAN mac address from the
    corresponding netdev for a fcoe interface then sets up added the
    fc->ctlr.spma flag and stores spma mode address in ctl_src_addr.

    In case the spma flag is set then:-

    1. Adds spma mode MAC address in ctl_src_addr as secondary
    MAC address, the FLOGI for FIP and pre-FIP will go out
    using this address.
    2. Cleans up stored spma MAC address in ctl_src_addr in
    fcoe_netdev_cleanup.
    3. Sets up spma bit in fip_flags for FIP solicitations along
    with exiting FPMA bit setting.
    4. Initialize the FLOGI FIP MAC descriptor to stored spma
    MAC address in ctl_src_addr. This is used as proposed
    FCoE MAC address from initiator along with both SPMA
    and FPMA bit set in FIP solicitation, in response the
    switch may grant any FPMA or SPMA mode MAC address to
    initiator.

    Removes FIP descriptor type checking against ELS type
    ELS_FLOGI in fcoe_ctlr_encaps to update a FIP MAC descriptor,
    instead now checks against FIP_DT_FLOGI.

    I've tested this with available FPMA-only FCoE switch but
    since data_src_addr is updated using same old code for
    both FPMA and SPMA modes with FIP or pre-FIP links, so added
    SPMA mode will work with SPMA-only switch also provided that
    switch grants a valid MAC address.

    Signed-off-by: Vasu Dev
    Signed-off-by: Yi Zou
    Signed-off-by: Jeff Kirsher
    Signed-off-by: David S. Miller

    Vasu Dev
     

03 Apr, 2009

6 commits

  • FIP is the new standard way to discover Fibre-Channel Forwarders (FCFs)
    by sending solicitations and listening for advertisements from FCFs.

    It also provides for keep-alives and period advertisements so that both
    parties know they have connectivity. If the FCF loses connectivity to
    the storage fabric, it can send a Link Reset to inform the E_node.

    This version is also compatible with pre-FIP implementations, so no
    configured selection between FIP mode and non-FIP mode is required.

    We wait a couple seconds after sending the initial solicitation
    and then send an old-style FLOGI. If we receive any FIP frames,
    we use FIP only mode. If the old FLOGI receives a response,
    we disable FIP mode. After every reset or link up, this
    determination is repeated.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • Removes no where used several inline functions prefixed with skb_*
    and be16_to_cpu.

    Moves fcoe module specific func prototypes to fcoe.c from libfcoe.h,
    moved only need for build.

    Adds fcoe module header file fcoe.h and then moves fcoe module
    specific fcoe_percpu_s and fcoe_softc to fcoe.h from libfcoe.h.

    Moves all defines from fcoe.c to fcoe.h since now fcoe module
    has its own header file fcoe.h.

    [jejb: removed EXPORT_SYMBOL_GPL(fcoe_fc_crc) which caused a section mismatch]
    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Moves only required code from fcoe_sw.c to libfcoe.c towards having
    just one source file for fcoe module, this gets rid off default sw
    transport code in a separate fcoe_sw.c file.

    Very minor renaming along this move, dropped _sw_ or _SW_ use
    in names and replaced them by _if_ as a auxiliary interface
    functions. Now some of these funcs can be removed or merged with
    other func after fcoe transport is gone, but that should be
    in another patch to keep this patch simple.

    Now the libfcoe.c file name for fcoe module doesn't go along well,
    so the libfcoe.c file renaming to fcoe.c as the only single fcoe
    module file is done in next patch to keep this patch clean
    and small for review.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • The fcoe transport code was added for generic FCoE transport
    infrastructure to allow additional offload related module loading
    on demand, this is not required anymore after recently added
    different offload approach by having offload related func ops
    in netdev.

    This patch removes fcoe transport related code use, calls functions
    directly between existing libfcoe.c and fcoe_sw.c for now, for
    example fcoe_sw_destroy and fcoe_sw_create calling.

    The fcoe_sw.c and libfcoe.c code will be further consolidated in
    later patches and then also the default fcoe sw transport code
    file fcoe_sw.c will be completely removed.

    The fcoe transport code files are completely removed in next
    patch to keep this patch simple for reviewing.

    [This patch is an update to a previous patch. This update
    resolves a build error as well as fixes a defect related to
    not calling fc_release_transport().]

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Convert fcoe_percpu array to use the per-cpu variables
    that the kernel provides. Use the kernel's functions to
    access this structure.

    The cpu member of the fcoe_percpu_s is no longer needed,
    so this patch removes it too.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Robert Love
     
  • Currently the skb_queue is initialized every time the associated
    CPU goes online. This patch has libfcoe initializing the skb_queue
    for all possible CPUs when the module is loaded.

    This patch also re-orders some declarations in the fcoe_rcv()
    function so the structure declarations are grouped before
    the primitive declarations.

    Lastly, this patch converts all CPU indicies to use unsigned int
    since CPU indicies should not be negative.

    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Robert Love
     

14 Mar, 2009

1 commit

  • When LLD supports direct data placement (ddp) for large receive of an scsi
    i/o coming into fc_fcp, we call into libfc_function_template's ddp_setup()
    to prepare for a ddp of large receive for this read I/O. When I/O is complete,
    we call the corresponding ddp_done() to get the length of data ddped as well
    as to let LLD do clean up.

    fc_fcp_ddp_setup()/fc_fcp_ddp_done() are added to setup and complete a ddped
    read I/O described by the given fc_fcp_pkt. They would call into corresponding
    ddp_setup/ddp_done implemented by the fcoe layer. Eventually, fcoe layer calls
    into LLD's ddp_setup/ddp_done provided through net_device

    Signed-off-by: Yi Zou
    Signed-off-by: James Bottomley

    Yi Zou
     

10 Mar, 2009

2 commits

  • frames followed by these errors in log.

    [sdp] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE,SUGGEST_OK
    [sdp] Sense Key : Aborted Command [current]
    [sdp] Add. Sense: Data phase error

    This was causing some test apps to exit due to write failure under heavy
    load.

    This was due to a race around adding and removing tx frame skb in
    fcoe_pending_queue, Chris Leech helped me to find that brief unlocking
    period when pulling skb from fcoe_pending_queue in various contexts
    (fcoe_watchdog and fcoe_xmit) and then adding skb back into fcoe_pending_queue
    up on a failed fcoe_start_io could change skb/tx frame order in
    fcoe_pending_queue. Thanks Chris.

    This patch allows only single context to pull skb from fcoe_pending_queue
    at any time to prevent above described ordering issue/race by use of
    fcoe_pending_queue_active flag.

    This patch simplified fcoe_watchdog with modified fcoe_check_wait_queue by
    use of FCOE_LOW_QUEUE_DEPTH instead previously used several conditionals
    to clear and set lp->qfull.

    I think FCOE_MAX_QUEUE_DEPTH with FCOE_LOW_QUEUE_DEPTH will work better
    in re/setting lp->qfull and these could be fine tuned for performance.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Comment from "Andrew Morton "

    > +{
    > + return (struct fcoe_softc *)lport_priv(lp);

    unneeded/undesirable cast of void*. There are probably zillions of
    instances of this - there always are.

    This whole inline function was unnecessary. The FCoE layer knows
    that it's data structure is stored in the lport private data, it
    can just access it from lport_priv().

    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Robert Love
     

30 Dec, 2008

1 commit

  • Encapsulation protocol for running Fibre Channel over Ethernet interfaces.
    Creates virtual Fibre Channel host adapters using libfc.

    This layer is the LLD to the scsi-ml. It allocates the Scsi_Host, utilizes
    libfc for Fibre Channel protocol processing and interacts with netdev to
    send/receive Ethernet packets.

    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley

    Robert Love