ATH_OFFCHANNEL_ROC_DONE,
 };
 
+enum ath_roc_complete_reason {
+       ATH_ROC_COMPLETE_EXPIRE,
+       ATH_ROC_COMPLETE_ABORT,
+       ATH_ROC_COMPLETE_CANCEL,
+};
+
 struct ath_offchannel {
        struct ath_chanctx chan;
        struct timer_list timer;
 void ath_chanctx_set_next(struct ath_softc *sc, bool force);
 void ath_offchannel_next(struct ath_softc *sc);
 void ath_scan_complete(struct ath_softc *sc, bool abort);
-void ath_roc_complete(struct ath_softc *sc, bool abort);
+void ath_roc_complete(struct ath_softc *sc,
+                     enum ath_roc_complete_reason reason);
 struct ath_chanctx* ath_is_go_chanctx_present(struct ath_softc *sc);
 
 #else
 
        }
 }
 
-void ath_roc_complete(struct ath_softc *sc, bool abort)
+void ath_roc_complete(struct ath_softc *sc, enum ath_roc_complete_reason reason)
 {
        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 
-       if (abort)
+       sc->offchannel.roc_vif = NULL;
+       sc->offchannel.roc_chan = NULL;
+
+       switch (reason) {
+       case ATH_ROC_COMPLETE_ABORT:
                ath_dbg(common, CHAN_CTX, "RoC aborted\n");
-       else
+               ieee80211_remain_on_channel_expired(sc->hw);
+               break;
+       case ATH_ROC_COMPLETE_EXPIRE:
                ath_dbg(common, CHAN_CTX, "RoC expired\n");
+               ieee80211_remain_on_channel_expired(sc->hw);
+               break;
+       case ATH_ROC_COMPLETE_CANCEL:
+               ath_dbg(common, CHAN_CTX, "RoC canceled\n");
+               break;
+       }
 
-       sc->offchannel.roc_vif = NULL;
-       sc->offchannel.roc_chan = NULL;
-       ieee80211_remain_on_channel_expired(sc->hw);
        ath_offchannel_next(sc);
        ath9k_ps_restore(sc);
 }
        case ATH_OFFCHANNEL_ROC_START:
        case ATH_OFFCHANNEL_ROC_WAIT:
                sc->offchannel.state = ATH_OFFCHANNEL_ROC_DONE;
-               ath_roc_complete(sc, false);
+               ath_roc_complete(sc, ATH_ROC_COMPLETE_EXPIRE);
                break;
        default:
                break;
 
 
                del_timer_sync(&sc->offchannel.timer);
                if (sc->offchannel.state >= ATH_OFFCHANNEL_ROC_START)
-                       ath_roc_complete(sc, true);
+                       ath_roc_complete(sc, ATH_ROC_COMPLETE_ABORT);
        }
 
        if (test_bit(ATH_OP_SCANNING, &common->op_flags)) {
 
        if (sc->offchannel.roc_vif) {
                if (sc->offchannel.state >= ATH_OFFCHANNEL_ROC_START)
-                       ath_roc_complete(sc, true);
+                       ath_roc_complete(sc, ATH_ROC_COMPLETE_CANCEL);
        }
 
        mutex_unlock(&sc->mutex);