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 <yi.zou@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
                        if (dlen != sizeof(struct fip_fka_desc))
                                goto len_err;
                        fka = (struct fip_fka_desc *)desc;
+                       if (fka->fd_flags & FIP_FKA_ADV_D)
+                               fcf->fd_flags = 1;
                        t = ntohl(fka->fd_fka_period);
                        if (t >= FCOE_CTLR_MIN_FKA)
                                fcf->fka_period = msecs_to_jiffies(t);
                }
        }
 
-       if (sel) {
+       if (sel && !sel->fd_flags) {
                if (time_after_eq(jiffies, fip->ctlr_ka_time)) {
                        fip->ctlr_ka_time = jiffies + sel->fka_period;
                        fip->send_ctlr_ka = 1;
 
  */
 struct fip_fka_desc {
        struct fip_desc fd_desc;
-       __u8            fd_resvd[2];
+       __u8            fd_resvd;
+       __u8            fd_flags;       /* bit0 is fka disable flag */
        __be32          fd_fka_period;  /* adv./keep-alive period in mS */
 } __attribute__((packed));
 
+/*
+ * flags for fip_fka_desc.fd_flags
+ */
+enum fip_fka_flags {
+       FIP_FKA_ADV_D = 0x01,           /* no need for FKA from ENode */
+};
+
+/* FIP_DT_FKA flags */
+
 /*
  * FIP_DT_VENDOR descriptor.
  */
 
        u8 pri;
        u16 flags;
        u32 fka_period;
+       u8 fd_flags:1;
 };
 
 /* FIP API functions */