#include <linux/types.h>
 #include <net/mac80211.h>
 
+#include "../ath/regd.h"
+
 /* RX/TX descriptor hw structs
  * TODO: Driver part should only see sw structs */
 #include "desc.h"
        bool                    ah_5ghz;
        bool                    ah_2ghz;
 
-#define ah_regdomain           ah_capabilities.cap_regdomain.reg_current
-#define ah_regdomain_hw                ah_capabilities.cap_regdomain.reg_hw
 #define ah_modes               ah_capabilities.cap_mode
 #define ah_ee_version          ah_capabilities.cap_eeprom.ee_version
 
        u32                     ah_gpio[AR5K_MAX_GPIO];
        int                     ah_gpio_npins;
 
+       struct ath_regulatory   ah_regulatory;
        struct ath5k_capabilities ah_capabilities;
 
        struct ath5k_txq_info   ah_txq[AR5K_NUM_TX_QUEUES];
 
 * Driver Initialization *
 \***********************/
 
+static int ath5k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+{
+       struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
+       struct ath5k_softc *sc = hw->priv;
+       struct ath_regulatory *reg = &sc->ah->ah_regulatory;
+
+       return ath_reg_notifier_apply(wiphy, request, reg);
+}
+
 static int
 ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
 {
        memset(sc->bssidmask, 0xff, ETH_ALEN);
        ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
 
+       ah->ah_regulatory.current_rd =
+               ah->ah_capabilities.cap_eeprom.ee_regdomain;
+       ret = ath_regd_init(&ah->ah_regulatory, hw->wiphy, ath5k_reg_notifier);
+       if (ret) {
+               ATH5K_ERR(sc, "can't initialize regulatory system\n");
+               goto err_queues;
+       }
+
        ret = ieee80211_register_hw(hw);
        if (ret) {
                ATH5K_ERR(sc, "can't register ieee80211 hw\n");
                goto err_queues;
        }
 
+       if (!ath_is_world_regd(&sc->ah->ah_regulatory))
+               regulatory_hint(hw->wiphy, sc->ah->ah_regulatory.alpha2);
+
        ath5k_init_leds(sc);
 
        return 0;