rix = 0;
        rt = sc->sc_currates;
        rate = rt->info[rix].rateCode;
-       if (sc->sc_flags & ATH_PREAMBLE_SHORT)
+       if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
                rate |= rt->info[rix].shortPreamble;
 
        ath9k_hw_set11n_txdesc(ah, ds
         * beacon frame we just received.
         */
        ath_beacon_config(sc, if_id);
-       sc->sc_beacons = 1;
+       sc->sc_flags |= SC_OP_BEACONS;
 }
 
 {
        struct ath_hal *ah = sc->sc_ah;
 
-       DPRINTF(sc, ATH_DBG_CONFIG, "%s: invalid %u\n",
-               __func__, sc->sc_invalid);
+       DPRINTF(sc, ATH_DBG_CONFIG, "%s: invalid %ld\n",
+               __func__, sc->sc_flags & SC_OP_INVALID);
 
        /*
         * Shutdown the hardware and driver:
         * hardware is gone (invalid).
         */
 
-       if (!sc->sc_invalid)
+       if (!(sc->sc_flags & SC_OP_INVALID))
                ath9k_hw_set_interrupts(ah, 0);
        ath_draintxq(sc, false);
-       if (!sc->sc_invalid) {
+       if (!(sc->sc_flags & SC_OP_INVALID)) {
                ath_stoprecv(sc);
                ath9k_hw_phy_disable(ah);
        } else
        bool fastcc = true, stopped;
        enum ath9k_ht_macmode ht_macmode;
 
-       if (sc->sc_invalid)     /* if the device is invalid or removed */
+       if (sc->sc_flags & SC_OP_INVALID) /* the device is invalid or removed */
                return -EIO;
 
        DPRINTF(sc, ATH_DBG_CONFIG,
 
        if (hchan->channel != sc->sc_curchan.channel ||
            hchan->channelFlags != sc->sc_curchan.channelFlags ||
-           sc->sc_update_chainmask || sc->sc_full_reset) {
+           (sc->sc_flags & SC_OP_CHAINMASK_UPDATE) ||
+           (sc->sc_flags & SC_OP_FULL_RESET)) {
                int status;
                /*
                 * This is only performed if the channel settings have
                 * to flush data frames already in queue because of
                 * changing channel. */
 
-               if (!stopped || sc->sc_full_reset)
+               if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET))
                        fastcc = false;
 
                spin_lock_bh(&sc->sc_resetlock);
                spin_unlock_bh(&sc->sc_resetlock);
 
                sc->sc_curchan = *hchan;
-               sc->sc_update_chainmask = 0;
-               sc->sc_full_reset = 0;
+               sc->sc_flags &= ~SC_OP_CHAINMASK_UPDATE;
+               sc->sc_flags &= ~SC_OP_FULL_RESET;
 
                /* Re-enable rx framework */
                if (ath_startrecv(sc) != 0) {
 
 void ath_update_chainmask(struct ath_softc *sc, int is_ht)
 {
-       sc->sc_update_chainmask = 1;
+       sc->sc_flags |= SC_OP_CHAINMASK_UPDATE;
        if (is_ht) {
                sc->sc_tx_chainmask = sc->sc_ah->ah_caps.tx_chainmask;
                sc->sc_rx_chainmask = sc->sc_ah->ah_caps.rx_chainmask;
                sc->sc_imask & ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS));
        sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
        /* need to reconfigure the beacons when it moves to RUN */
-       sc->sc_beacons = 0;
+       sc->sc_flags &= ~SC_OP_BEACONS;
 
        return 0;
 }
 
        /* XXX: we must make sure h/w is ready and clear invalid flag
         * before turning on interrupt. */
-       sc->sc_invalid = 0;
+       sc->sc_flags &= ~SC_OP_INVALID;
 done:
        return error;
 }
 
        ath_update_txpow(sc);
 
-       if (sc->sc_beacons)
+       if (sc->sc_flags & SC_OP_BEACONS)
                ath_beacon_config(sc, ATH_IF_ID_ANY);   /* restart beacons */
 
        ath9k_hw_set_interrupts(ah, sc->sc_imask);
        struct ath_hal *ah = sc->sc_ah;
 
        /* No I/O if device has been surprise removed */
-       if (sc->sc_invalid)
+       if (sc->sc_flags & SC_OP_INVALID)
                return -EIO;
 
        /* Shut off the interrupt before setting sc->sc_invalid to '1' */
 
        /* XXX: we must make sure h/w will not generate any interrupt
         * before setting the invalid flag. */
-       sc->sc_invalid = 1;
+       sc->sc_flags |= SC_OP_INVALID;
 
        /* disable HAL and put h/w to sleep */
        ath9k_hw_disable(sc->sc_ah);
        bool sched = false;
 
        do {
-               if (sc->sc_invalid) {
+               if (sc->sc_flags & SC_OP_INVALID) {
                        /*
                         * The hardware is not ready/present, don't
                         * touch anything. Note this can happen early
        u32 rd;
 
        /* XXX: hardware will not be ready until ath_open() being called */
-       sc->sc_invalid = 1;
+       sc->sc_flags |= SC_OP_INVALID;
 
        sc->sc_debug = DBG_DEFAULT;
        DPRINTF(sc, ATH_DBG_CONFIG, "%s: devid 0x%x\n", __func__, devid);
 
        /* 11n Capabilities */
        if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) {
-               sc->sc_txaggr = 1;
-               sc->sc_rxaggr = 1;
+               sc->sc_flags |= SC_OP_TXAGGR;
+               sc->sc_flags |= SC_OP_RXAGGR;
        }
 
        sc->sc_tx_chainmask = ah->ah_caps.tx_chainmask;
        DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__);
 
        ath_stop(sc);
-       if (!sc->sc_invalid)
+       if (!(sc->sc_flags & SC_OP_INVALID))
                ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
        ath_rate_detach(sc->sc_rc);
        /* cleanup tx queues */
        /* if station reassociates, tear down the aggregation state. */
        if (!isnew) {
                for (tidno = 0; tidno < WME_NUM_TID; tidno++) {
-                       if (sc->sc_txaggr)
+                       if (sc->sc_flags & SC_OP_TXAGGR)
                                ath_tx_aggr_teardown(sc, an, tidno);
-                       if (sc->sc_rxaggr)
+                       if (sc->sc_flags & SC_OP_RXAGGR)
                                ath_rx_aggr_teardown(sc, an, tidno);
                }
        }
 
 #define        ATH_DEFAULT_NOISE_FLOOR -95
 #define ATH_REGCLASSIDS_MAX     10
 #define ATH_CABQ_READY_TIME     80  /* % of beacon interval */
-#define ATH_PREAMBLE_SHORT     (1<<0)
-#define ATH_PROTECT_ENABLE     (1<<1)
 #define ATH_MAX_SW_RETRIES      10
 #define ATH_CHAN_MAX            255
 #define IEEE80211_WEP_NKID      4       /* number of key ids */
        u8 ext_chan_offset;
 };
 
+#define SC_OP_INVALID          BIT(0)
+#define SC_OP_BEACONS          BIT(1)
+#define SC_OP_RXAGGR           BIT(2)
+#define SC_OP_TXAGGR           BIT(3)
+#define SC_OP_CHAINMASK_UPDATE BIT(4)
+#define SC_OP_FULL_RESET       BIT(5)
+#define SC_OP_PREAMBLE_SHORT   BIT(6)
+#define SC_OP_PROTECT_ENABLE   BIT(7)
+
 struct ath_softc {
        struct ieee80211_hw *hw;
        struct pci_dev *pdev;
        struct tasklet_struct intr_tq;
        struct tasklet_struct bcon_tasklet;
-       struct ath_config sc_config;    /* load-time parameters */
+       struct ath_config sc_config;
        struct ath_hal *sc_ah;
-       struct ath_rate_softc *sc_rc;   /* tx rate control support */
+       struct ath_rate_softc *sc_rc;
        void __iomem *mem;
 
        int sc_debug;
        u32 sc_intrstatus;
+       u32 sc_flags; /* SC_OP_* */
        unsigned int rx_filter;
-       u8 sc_invalid;                  /* being detached */
-       u8 sc_beacons;                  /* beacons running */
-       u8 sc_txaggr;                   /* enable 11n tx aggregation */
-       u8 sc_rxaggr;                   /* enable 11n rx aggregation */
-       u8 sc_update_chainmask;         /* change chain mask */
-       u8 sc_full_reset;               /* force full reset */
+
        enum wireless_mode sc_curmode;  /* current phy mode */
        u16 sc_curtxpow;
        u16 sc_curaid;
        u8 sc_rxchaindetect_delta5GHz;
        u8 sc_rxchaindetect_delta2GHz;
        u32 sc_rtsaggrlimit;            /* Chipset specific aggr limit */
-       u32 sc_flags;
 #ifdef CONFIG_SLOW_ANT_DIV
        struct ath_antdiv sc_antdiv;
 #endif
 
        /* Set interrupt mask */
        sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
        ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_imask & ~ATH9K_INT_GLOBAL);
-       sc->sc_beacons = 0;
+       sc->sc_flags &= ~SC_OP_BEACONS;
 
        error = ath_vap_detach(sc, 0);
        if (error)
                                print_mac(mac, sc->sc_curbssid), sc->sc_curaid);
 
                        /* need to reconfigure the beacon */
-                       sc->sc_beacons = 0;
+                       sc->sc_flags &= ~SC_OP_BEACONS ;
 
                        break;
                default:
 
                /* Configure the beacon */
                ath_beacon_config(sc, 0);
-               sc->sc_beacons = 1;
+               sc->sc_flags |= SC_OP_BEACONS;
 
                /* Reset rssi stats */
                sc->sc_halstats.ns_avgbrssi = ATH_RSSI_DUMMY_MARKER;
                        __func__,
                        bss_conf->use_short_preamble);
                if (bss_conf->use_short_preamble)
-                       sc->sc_flags |= ATH_PREAMBLE_SHORT;
+                       sc->sc_flags |= SC_OP_PREAMBLE_SHORT;
                else
-                       sc->sc_flags &= ~ATH_PREAMBLE_SHORT;
+                       sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT;
        }
 
        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
                        bss_conf->use_cts_prot);
                if (bss_conf->use_cts_prot &&
                    hw->conf.channel->band != IEEE80211_BAND_5GHZ)
-                       sc->sc_flags |= ATH_PROTECT_ENABLE;
+                       sc->sc_flags |= SC_OP_PROTECT_ENABLE;
                else
-                       sc->sc_flags &= ~ATH_PROTECT_ENABLE;
+                       sc->sc_flags &= ~SC_OP_PROTECT_ENABLE;
        }
 
        if (changed & BSS_CHANGED_HT) {
 
        int state;
        DECLARE_MAC_BUF(mac);
 
-       if (!sc->sc_txaggr)
+       if (!(sc->sc_flags & SC_OP_TXAGGR))
                return;
 
        txtid = ATH_AN_2_TID(an, tidno);
 
                 struct ath_recv_status *rx_status,
                 enum ATH_RX_TYPE *status)
 {
-       if (is_ampdu && sc->sc_rxaggr) {
+       if (is_ampdu && (sc->sc_flags & SC_OP_RXAGGR)) {
                *status = ATH_RX_CONSUMED;
                return ath_ampdu_input(sc, an, skb, rx_status);
        } else {
        rxtid = &an->an_aggr.rx.tid[tid];
 
        spin_lock_bh(&rxtid->tidlock);
-       if (sc->sc_rxaggr) {
+       if (sc->sc_flags & SC_OP_RXAGGR) {
                /* Allow aggregation reception
                 * Adjust rx BA window size. Peer might indicate a
                 * zero buffer size for a _dont_care_ condition.
 
 void ath_rx_node_init(struct ath_softc *sc, struct ath_node *an)
 {
-       if (sc->sc_rxaggr) {
+       if (sc->sc_flags & SC_OP_RXAGGR) {
                struct ath_arx_tid *rxtid;
                int tidno;
 
 
 void ath_rx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
 {
-       if (sc->sc_rxaggr) {
+       if (sc->sc_flags & SC_OP_RXAGGR) {
                struct ath_arx_tid *rxtid;
                int tidno, i;
 
 
                 * incremented by the fragmentation routine.
                 */
                if (likely(!(txctl->flags & ATH9K_TXDESC_FRAG_IS_ON)) &&
-                       txctl->ht && sc->sc_txaggr) {
+                   txctl->ht && (sc->sc_flags & SC_OP_TXAGGR)) {
                        struct ath_atx_tid *tid;
 
                        tid = ATH_AN_2_TID(txctl->an, txctl->tidno);
                /*
                 * XXX not right with fragmentation.
                 */
-               if (sc->sc_flags & ATH_PREAMBLE_SHORT)
+               if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
                        dur = rt->info[rix].spAckDuration;
                else
                        dur = rt->info[rix].lpAckDuration;
                        ** Add time for next fragment.
                        */
                        dur += ath9k_hw_computetxtime(sc->sc_ah, rt,
-                                       txctl->nextfraglen,
-                                       rix, sc->sc_flags & ATH_PREAMBLE_SHORT);
+                                     txctl->nextfraglen,
+                                     rix,
+                                     (sc->sc_flags & SC_OP_PREAMBLE_SHORT));
                }
 
                if (ieee80211_has_morefrags(fc) ||
                /*
                 * schedule any pending packets if aggregation is enabled
                 */
-               if (sc->sc_txaggr)
+               if (sc->sc_flags & SC_OP_TXAGGR)
                        ath_txq_schedule(sc, txq);
                spin_unlock_bh(&txq->axq_lock);
        }
        enum ath9k_ht_macmode ht_macmode = ath_cwm_macmode(sc);
 
        /* XXX return value */
-       if (!sc->sc_invalid) {
+       if (!(sc->sc_flags & SC_OP_INVALID)) {
                for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
                        if (ATH_TXQ_SETUP(sc, i)) {
                                ath_tx_stopdma(sc, &sc->sc_txq[i]);
        ieee80211_is_pspoll(fc) ?
                (bf->bf_state.bf_type |= BUF_PSPOLL) :
                (bf->bf_state.bf_type &= ~BUF_PSPOLL);
-       (sc->sc_flags & ATH_PREAMBLE_SHORT) ?
+       (sc->sc_flags & SC_OP_PREAMBLE_SHORT) ?
                (bf->bf_state.bf_type |= BUF_SHORT_PREAMBLE) :
                (bf->bf_state.bf_type &= ~BUF_SHORT_PREAMBLE);
 
 
        spin_lock_bh(&txq->axq_lock);
 
-       if (txctl->ht && sc->sc_txaggr) {
+       if (txctl->ht && (sc->sc_flags & SC_OP_TXAGGR)) {
                struct ath_atx_tid *tid = ATH_AN_2_TID(an, txctl->tidno);
                if (ath_aggr_query(sc, an, txctl->tidno)) {
                        /*
                tx_status.retries = 0;
                tx_status.flags = ATH_TX_ERROR;
 
-               if (txctl->ht && sc->sc_txaggr) {
+               if (txctl->ht && (sc->sc_flags & SC_OP_TXAGGR)) {
                        /* Reclaim the seqno. */
                        tid = ATH_AN_2_TID((struct ath_node *)
                                txctl->an, txctl->tidno);
        }
 
        /* flush any pending frames if aggregation is enabled */
-       if (sc->sc_txaggr) {
+       if (sc->sc_flags & SC_OP_TXAGGR) {
                if (!retry_tx) {
                        spin_lock_bh(&txq->axq_lock);
                        ath_txq_drain_pending_buffers(sc, txq,
 {
        /* stop beacon queue. The beacon will be freed when
         * we go to INIT state */
-       if (!sc->sc_invalid) {
+       if (!(sc->sc_flags & SC_OP_INVALID)) {
                (void) ath9k_hw_stoptxdma(sc->sc_ah, sc->sc_bhalq);
                DPRINTF(sc, ATH_DBG_XMIT, "%s: beacon queue %x\n", __func__,
                        ath9k_hw_gettxbuf(sc->sc_ah, sc->sc_bhalq));
        struct ath_atx_tid *txtid;
        DECLARE_MAC_BUF(mac);
 
-       if (!sc->sc_txaggr)
+       if (!(sc->sc_flags & SC_OP_TXAGGR))
                return AGGR_NOT_REQUIRED;
 
        /* ADDBA exchange must be completed before sending aggregates */
                return -1;
        }
 
-       if (sc->sc_txaggr) {
+       if (sc->sc_flags & SC_OP_TXAGGR) {
                txtid = ATH_AN_2_TID(an, tid);
                txtid->addba_exchangeinprogress = 1;
                ath_tx_pause_tid(sc, txtid);
 
 void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
 {
-       if (sc->sc_txaggr) {
+       if (sc->sc_flags & SC_OP_TXAGGR) {
                struct ath_atx_tid *tid;
                struct ath_atx_ac *ac;
                int tidno, acno;
 
 void ath_tx_node_free(struct ath_softc *sc, struct ath_node *an)
 {
-       if (sc->sc_txaggr) {
+       if (sc->sc_flags & SC_OP_TXAGGR) {
                struct ath_atx_tid *tid;
                int tidno, i;