[SCSI] fcoe, libfcoe: Add support for FIP. FCoE discovery and keep-alive.

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 <jeykholt@cisco.com>
Signed-off-by: Vasu Dev <vasu.dev@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
diff --git a/drivers/scsi/fcoe/fcoe.h b/drivers/scsi/fcoe/fcoe.h
index 4a9611f..917aae8 100644
--- a/drivers/scsi/fcoe/fcoe.h
+++ b/drivers/scsi/fcoe/fcoe.h
@@ -26,10 +26,6 @@
 #define FCOE_MAX_QUEUE_DEPTH	256
 #define FCOE_LOW_QUEUE_DEPTH	32
 
-/* destination address mode */
-#define FCOE_GW_ADDR_MODE	0x00
-#define FCOE_FCOUI_ADDR_MODE	0x01
-
 #define FCOE_WORD_TO_BYTE	4
 
 #define FCOE_VERSION	"0.1"
@@ -59,24 +55,17 @@
  */
 struct fcoe_softc {
 	struct list_head list;
-	struct fc_lport *lp;
 	struct net_device *real_dev;
 	struct net_device *phys_dev;		/* device with ethtool_ops */
 	struct packet_type  fcoe_packet_type;
+	struct packet_type  fip_packet_type;
 	struct sk_buff_head fcoe_pending_queue;
 	u8	fcoe_pending_queue_active;
-
-	u8 dest_addr[ETH_ALEN];
-	u8 ctl_src_addr[ETH_ALEN];
-	u8 data_src_addr[ETH_ALEN];
-	/*
-	 * fcoe protocol address learning related stuff
-	 */
-	u16 flogi_oxid;
-	u8 flogi_progress;
-	u8 address_mode;
+	struct fcoe_ctlr ctlr;
 };
 
+#define fcoe_from_ctlr(fc) container_of(fc, struct fcoe_softc, ctlr)
+
 static inline struct net_device *fcoe_netdev(
 	const struct fc_lport *lp)
 {