}
 
                deadline += fcf->fka_period;
-               if (time_after(jiffies, deadline)) {
+               if (time_after_eq(jiffies, deadline)) {
                        if (fip->sel_fcf == fcf)
                                fip->sel_fcf = NULL;
                        list_del(&fcf->list);
                                sel_time = fcf->time;
                }
        }
-       if (sel_time) {
+       if (sel_time && !fip->sel_fcf && !fip->sel_time) {
                sel_time += msecs_to_jiffies(FCOE_CTLR_START_DELAY);
                fip->sel_time = sel_time;
-       } else {
-               fip->sel_time = 0;
        }
+
        return next_timer;
 }
 
                 * ignored after a usable solicited advertisement
                 * has been received.
                 */
-               if (fcf == fip->sel_fcf) {
+               if (fcf == fip->sel_fcf && !fcf->fd_flags) {
                        fip->ctlr_ka_time -= fcf->fka_period;
                        fip->ctlr_ka_time += new.fka_period;
                        if (time_before(fip->ctlr_ka_time, fip->timer.expires))
         * If this is the first validated FCF, note the time and
         * set a timer to trigger selection.
         */
-       if (mtu_valid && !fip->sel_time && fcoe_ctlr_fcf_usable(fcf)) {
+       if (mtu_valid && !fip->sel_fcf && fcoe_ctlr_fcf_usable(fcf)) {
                fip->sel_time = jiffies +
                        msecs_to_jiffies(FCOE_CTLR_START_DELAY);
                if (!timer_pending(&fip->timer) ||
                        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.  "