diff options
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_chip.c')
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_chip.c | 33 |
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 | ||
891 | static int set_beacon_interval(struct zd_chip *chip, u32 interval) | 891 | static 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 | ||
907 | int zd_set_beacon_interval(struct zd_chip *chip, u32 interval) | 929 | int 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 | ||
934 | static zd_addr_t fw_reg_addr(struct zd_chip *chip, u16 offset) | 957 | static zd_addr_t fw_reg_addr(struct zd_chip *chip, u16 offset) |