}
 
 
-static int set_beacon_interval(struct zd_chip *chip, u32 interval)
+static int set_beacon_interval(struct zd_chip *chip, u16 interval,
+                              u8 dtim_period, int type)
 {
        int r;
        struct aw_pt_bi s;
+       u32 b_interval, mode_flag;
 
        ZD_ASSERT(mutex_is_locked(&chip->mutex));
 
-       r = zd_iowrite32_locked(chip, interval, CR_BCN_INTERVAL);
+       if (interval > 0) {
+               switch (type) {
+               case NL80211_IFTYPE_ADHOC:
+               case NL80211_IFTYPE_MESH_POINT:
+                       mode_flag = BCN_MODE_IBSS;
+                       break;
+               case NL80211_IFTYPE_AP:
+                       mode_flag = BCN_MODE_AP;
+                       break;
+               default:
+                       mode_flag = 0;
+                       break;
+               }
+       } else {
+               dtim_period = 0;
+               mode_flag = 0;
+       }
+
+       b_interval = mode_flag | (dtim_period << 16) | interval;
+
+       r = zd_iowrite32_locked(chip, b_interval, CR_BCN_INTERVAL);
        if (r)
                return r;
        r = get_aw_pt_bi(chip, &s);
        return set_aw_pt_bi(chip, &s);
 }
 
-int zd_set_beacon_interval(struct zd_chip *chip, u32 interval)
+int zd_set_beacon_interval(struct zd_chip *chip, u16 interval, u8 dtim_period,
+                          int type)
 {
        int r;
 
        mutex_lock(&chip->mutex);
-       r = set_beacon_interval(chip, interval);
+       r = set_beacon_interval(chip, interval, dtim_period, type);
        mutex_unlock(&chip->mutex);
        return r;
 }
        if (r)
                return r;
 
-       return set_beacon_interval(chip, 100);
+       return set_beacon_interval(chip, 100, 0, NL80211_IFTYPE_UNSPECIFIED);
 }
 
 static zd_addr_t fw_reg_addr(struct zd_chip *chip, u16 offset)
 
 #define RX_FILTER_CTRL (RX_FILTER_RTS | RX_FILTER_CTS | \
        RX_FILTER_CFEND | RX_FILTER_CFACK)
 
+#define BCN_MODE_AP                    0x1000000
 #define BCN_MODE_IBSS                  0x2000000
 
 /* Monitor mode sets filter to 0xfffff */
 
 int zd_chip_control_leds(struct zd_chip *chip, enum led_status status);
 
-int zd_set_beacon_interval(struct zd_chip *chip, u32 interval);
+int zd_set_beacon_interval(struct zd_chip *chip, u16 interval, u8 dtim_period,
+                          int type);
 
 static inline int zd_get_beacon_interval(struct zd_chip *chip, u32 *interval)
 {
 
        struct zd_mac *mac = zd_hw_mac(hw);
        mac->type = NL80211_IFTYPE_UNSPECIFIED;
        mac->vif = NULL;
-       zd_set_beacon_interval(&mac->chip, 0);
+       zd_set_beacon_interval(&mac->chip, 0, 0, NL80211_IFTYPE_UNSPECIFIED);
        zd_write_mac_addr(&mac->chip, NULL);
 }
 
                }
 
                if (changes & BSS_CHANGED_BEACON_ENABLED) {
-                       u32 interval;
+                       u16 interval = 0;
+                       u8 period = 0;
 
-                       if (bss_conf->enable_beacon)
-                               interval = BCN_MODE_IBSS |
-                                               bss_conf->beacon_int;
-                       else
-                               interval = 0;
+                       if (bss_conf->enable_beacon) {
+                               period = bss_conf->dtim_period;
+                               interval = bss_conf->beacon_int;
+                       }
 
-                       zd_set_beacon_interval(&mac->chip, interval);
+                       zd_set_beacon_interval(&mac->chip, interval, period,
+                                              mac->type);
                }
        } else
                associated = is_valid_ether_addr(bss_conf->bssid);