[SCSI] libfcoe: add tracking FIP Missing Discovery Advertisement count
authorYi Zou <yi.zou@intel.com>
Fri, 20 Nov 2009 22:55:08 +0000 (14:55 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Fri, 4 Dec 2009 18:01:56 +0000 (12:01 -0600)
Add tracking the Missing Discovery Advertisement count for FIP Fiber Channel
Forwarder (FCF) as described in FC-BB-5 Rev2.0 for LESB. The time is 1.5 times
the FKA_ADV_PERIOD of the corresponding FCF.

Signed-off-by: Yi Zou <yi.zou@intel.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 34800af808e1087b1f9eb7f46aacb2f1d9727a61..9823291395ad677578c79d26fb3cdb67da46391b 100644 (file)
@@ -562,14 +562,28 @@ EXPORT_SYMBOL(fcoe_ctlr_els_send);
  * times its keep-alive period including fuzz.
  *
  * In addition, determine the time when an FCF selection can occur.
+ *
+ * Also, increment the MissDiscAdvCount when no advertisement is received
+ * for the corresponding FCF for 1.5 * FKA_ADV_PERIOD (FC-BB-5 LESB).
  */
 static void fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
 {
        struct fcoe_fcf *fcf;
        struct fcoe_fcf *next;
        unsigned long sel_time = 0;
+       unsigned long mda_time = 0;
 
        list_for_each_entry_safe(fcf, next, &fip->fcfs, list) {
+               mda_time = fcf->fka_period + (fcf->fka_period >> 1);
+               if ((fip->sel_fcf == fcf) &&
+                   (time_after(jiffies, fcf->time + mda_time))) {
+                       mod_timer(&fip->timer, jiffies + mda_time);
+                       fc_lport_get_stats(fip->lp)->MissDiscAdvCount++;
+                       printk(KERN_INFO "libfcoe: host%d: Missing Discovery "
+                              "Advertisement for fab %llx count %lld\n",
+                              fip->lp->host->host_no, fcf->fabric_name,
+                              fc_lport_get_stats(fip->lp)->MissDiscAdvCount);
+               }
                if (time_after(jiffies, fcf->time + fcf->fka_period * 3 +
                               msecs_to_jiffies(FIP_FCF_FUZZ * 3))) {
                        if (fip->sel_fcf == fcf)