aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fnic
diff options
context:
space:
mode:
authorJoe Eykholt <jeykholt@cisco.com>2010-07-20 18:20:30 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-28 10:05:56 -0400
commite10f8c667b874a57512c936089092a3d1ef7ab8a (patch)
tree8094610399133fd6e0ad26d23c46ec0a6cc91398 /drivers/scsi/fnic
parent9b651da900ccfe5581befb46eb06ef781a1d7e74 (diff)
[SCSI] libfcoe: fcoe: fnic: add FIP VN2VN point-to-multipoint support
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 <jeykholt@cisco.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/fnic')
-rw-r--r--drivers/scsi/fnic/fnic_main.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index d0fe1c3345b8..9eb7a9ebccae 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -673,7 +673,6 @@ static int __devinit fnic_probe(struct pci_dev *pdev,
673 /* Start local port initiatialization */ 673 /* Start local port initiatialization */
674 674
675 lp->link_up = 0; 675 lp->link_up = 0;
676 lp->tt = fnic_transport_template;
677 676
678 lp->max_retry_count = fnic->config.flogi_retries; 677 lp->max_retry_count = fnic->config.flogi_retries;
679 lp->max_rport_retry_count = fnic->config.plogi_retries; 678 lp->max_rport_retry_count = fnic->config.plogi_retries;
@@ -689,11 +688,7 @@ static int __devinit fnic_probe(struct pci_dev *pdev,
689 fc_set_wwnn(lp, fnic->config.node_wwn); 688 fc_set_wwnn(lp, fnic->config.node_wwn);
690 fc_set_wwpn(lp, fnic->config.port_wwn); 689 fc_set_wwpn(lp, fnic->config.port_wwn);
691 690
692 fc_lport_init(lp); 691 fcoe_libfc_config(lp, &fnic->ctlr, &fnic_transport_template, 0);
693 fc_exch_init(lp);
694 fc_elsct_init(lp);
695 fc_rport_init(lp);
696 fc_disc_init(lp);
697 692
698 if (!fc_exch_mgr_alloc(lp, FC_CLASS_3, FCPIO_HOST_EXCH_RANGE_START, 693 if (!fc_exch_mgr_alloc(lp, FC_CLASS_3, FCPIO_HOST_EXCH_RANGE_START,
699 FCPIO_HOST_EXCH_RANGE_END, NULL)) { 694 FCPIO_HOST_EXCH_RANGE_END, NULL)) {