[SCSI] libfcoe: update FIP FCF announcements
authorJoe Eykholt <jeykholt@cisco.com>
Wed, 1 Dec 2010 00:19:40 +0000 (16:19 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 21 Dec 2010 18:24:28 +0000 (12:24 -0600)
Move the announcement code to a separate function for reuse in
a forthcoming patch.

For messages regarding FCF timeout and selection, use the
previously-announced FCF MAC address (dest_addr) in the fcoe_ctlr struct.
Only print (announce) the FCF if it is new.   Print MAC for
timed-out or deselected FCFs.

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>
drivers/scsi/fcoe/libfcoe.c

index 58ad3c7a454f46f23f064d11f87c13d1ca10cca7..26381f00e4e5350084d3de1641c4af1874c618fa 100644 (file)
@@ -230,6 +230,33 @@ void fcoe_ctlr_destroy(struct fcoe_ctlr *fip)
 }
 EXPORT_SYMBOL(fcoe_ctlr_destroy);
 
+/**
+ * fcoe_ctlr_announce() - announce new selection
+ * @fip: The FCoE controller
+ *
+ * Also sets the destination MAC for FCoE and control packets
+ */
+static void fcoe_ctlr_announce(struct fcoe_ctlr *fip)
+{
+       struct fcoe_fcf *sel = fip->sel_fcf;
+
+       if (sel && !compare_ether_addr(sel->fcf_mac, fip->dest_addr))
+               return;
+       if (!is_zero_ether_addr(fip->dest_addr)) {
+               printk(KERN_NOTICE "libfcoe: host%d: "
+                      "FIP Fibre-Channel Forwarder MAC %pM deselected\n",
+                      fip->lp->host->host_no, fip->dest_addr);
+               memset(fip->dest_addr, 0, ETH_ALEN);
+       }
+       if (sel) {
+               printk(KERN_INFO "libfcoe: host%d: FIP selected "
+                      "Fibre-Channel Forwarder MAC %pM\n",
+                      fip->lp->host->host_no, sel->fcf_mac);
+               memcpy(fip->dest_addr, sel->fcf_mac, ETH_ALEN);
+               fip->map_dest = 0;
+       }
+}
+
 /**
  * fcoe_ctlr_fcoe_size() - Return the maximum FCoE size required for VN_Port
  * @fip: The FCoE controller to get the maximum FCoE size from
@@ -1420,24 +1447,15 @@ static void fcoe_ctlr_timer_work(struct work_struct *work)
 
        if (sel != fcf) {
                fcf = sel;              /* the old FCF may have been freed */
+               fcoe_ctlr_announce(fip);
                if (sel) {
-                       printk(KERN_INFO "libfcoe: host%d: FIP selected "
-                              "Fibre-Channel Forwarder MAC %pM\n",
-                              fip->lp->host->host_no, sel->fcf_mac);
-                       memcpy(fip->dest_addr, sel->fcf_mac, ETH_ALEN);
-                       fip->map_dest = 0;
                        fip->port_ka_time = jiffies +
                                msecs_to_jiffies(FIP_VN_KA_PERIOD);
                        fip->ctlr_ka_time = jiffies + sel->fka_period;
                        if (time_after(next_timer, fip->ctlr_ka_time))
                                next_timer = fip->ctlr_ka_time;
-               } else {
-                       printk(KERN_NOTICE "libfcoe: host%d: "
-                              "FIP Fibre-Channel Forwarder timed out.  "
-                              "Starting FCF discovery.\n",
-                              fip->lp->host->host_no);
+               } else
                        reset = 1;
-               }
        }
 
        if (sel && !sel->fd_flags) {