aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/zd1211rw/zd_chip.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_chip.c')
-rw-r--r--drivers/net/wireless/zd1211rw/zd_chip.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_chip.c b/drivers/net/wireless/zd1211rw/zd_chip.c
index 71d3cdebca14..d8dc92711f40 100644
--- a/drivers/net/wireless/zd1211rw/zd_chip.c
+++ b/drivers/net/wireless/zd1211rw/zd_chip.c
@@ -888,14 +888,36 @@ static int set_aw_pt_bi(struct zd_chip *chip, struct aw_pt_bi *s)
888} 888}
889 889
890 890
891static int set_beacon_interval(struct zd_chip *chip, u32 interval) 891static int set_beacon_interval(struct zd_chip *chip, u16 interval,
892 u8 dtim_period, int type)
892{ 893{
893 int r; 894 int r;
894 struct aw_pt_bi s; 895 struct aw_pt_bi s;
896 u32 b_interval, mode_flag;
895 897
896 ZD_ASSERT(mutex_is_locked(&chip->mutex)); 898 ZD_ASSERT(mutex_is_locked(&chip->mutex));
897 899
898 r = zd_iowrite32_locked(chip, interval, CR_BCN_INTERVAL); 900 if (interval > 0) {
901 switch (type) {
902 case NL80211_IFTYPE_ADHOC:
903 case NL80211_IFTYPE_MESH_POINT:
904 mode_flag = BCN_MODE_IBSS;
905 break;
906 case NL80211_IFTYPE_AP:
907 mode_flag = BCN_MODE_AP;
908 break;
909 default:
910 mode_flag = 0;
911 break;
912 }
913 } else {
914 dtim_period = 0;
915 mode_flag = 0;
916 }
917
918 b_interval = mode_flag | (dtim_period << 16) | interval;
919
920 r = zd_iowrite32_locked(chip, b_interval, CR_BCN_INTERVAL);
899 if (r) 921 if (r)
900 return r; 922 return r;
901 r = get_aw_pt_bi(chip, &s); 923 r = get_aw_pt_bi(chip, &s);
@@ -904,12 +926,13 @@ static int set_beacon_interval(struct zd_chip *chip, u32 interval)
904 return set_aw_pt_bi(chip, &s); 926 return set_aw_pt_bi(chip, &s);
905} 927}
906 928
907int zd_set_beacon_interval(struct zd_chip *chip, u32 interval) 929int zd_set_beacon_interval(struct zd_chip *chip, u16 interval, u8 dtim_period,
930 int type)
908{ 931{
909 int r; 932 int r;
910 933
911 mutex_lock(&chip->mutex); 934 mutex_lock(&chip->mutex);
912 r = set_beacon_interval(chip, interval); 935 r = set_beacon_interval(chip, interval, dtim_period, type);
913 mutex_unlock(&chip->mutex); 936 mutex_unlock(&chip->mutex);
914 return r; 937 return r;
915} 938}
@@ -928,7 +951,7 @@ static int hw_init(struct zd_chip *chip)
928 if (r) 951 if (r)
929 return r; 952 return r;
930 953
931 return set_beacon_interval(chip, 100); 954 return set_beacon_interval(chip, 100, 0, NL80211_IFTYPE_UNSPECIFIED);
932} 955}
933 956
934static zd_addr_t fw_reg_addr(struct zd_chip *chip, u16 offset) 957static zd_addr_t fw_reg_addr(struct zd_chip *chip, u16 offset)