diff options
Diffstat (limited to 'drivers/net/wireless/ath/carl9170')
-rw-r--r-- | drivers/net/wireless/ath/carl9170/carl9170.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/carl9170/fw.c | 33 | ||||
-rw-r--r-- | drivers/net/wireless/ath/carl9170/mac.c | 35 | ||||
-rw-r--r-- | drivers/net/wireless/ath/carl9170/main.c | 18 | ||||
-rw-r--r-- | drivers/net/wireless/ath/carl9170/phy.c | 36 | ||||
-rw-r--r-- | drivers/net/wireless/ath/carl9170/tx.c | 4 |
6 files changed, 54 insertions, 74 deletions
diff --git a/drivers/net/wireless/ath/carl9170/carl9170.h b/drivers/net/wireless/ath/carl9170/carl9170.h index 6cfbb419e2f6..0cea20e3e250 100644 --- a/drivers/net/wireless/ath/carl9170/carl9170.h +++ b/drivers/net/wireless/ath/carl9170/carl9170.h | |||
@@ -559,6 +559,7 @@ int carl9170_set_hwretry_limit(struct ar9170 *ar, const u32 max_retry); | |||
559 | int carl9170_upload_key(struct ar9170 *ar, const u8 id, const u8 *mac, | 559 | int carl9170_upload_key(struct ar9170 *ar, const u8 id, const u8 *mac, |
560 | const u8 ktype, const u8 keyidx, const u8 *keydata, const int keylen); | 560 | const u8 ktype, const u8 keyidx, const u8 *keydata, const int keylen); |
561 | int carl9170_disable_key(struct ar9170 *ar, const u8 id); | 561 | int carl9170_disable_key(struct ar9170 *ar, const u8 id); |
562 | int carl9170_set_mac_tpc(struct ar9170 *ar, struct ieee80211_channel *channel); | ||
562 | 563 | ||
563 | /* RX */ | 564 | /* RX */ |
564 | void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len); | 565 | void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len); |
@@ -593,7 +594,6 @@ int carl9170_get_noisefloor(struct ar9170 *ar); | |||
593 | 594 | ||
594 | /* FW */ | 595 | /* FW */ |
595 | int carl9170_parse_firmware(struct ar9170 *ar); | 596 | int carl9170_parse_firmware(struct ar9170 *ar); |
596 | int carl9170_fw_fix_eeprom(struct ar9170 *ar); | ||
597 | 597 | ||
598 | extern struct ieee80211_rate __carl9170_ratetable[]; | 598 | extern struct ieee80211_rate __carl9170_ratetable[]; |
599 | extern int modparam_noht; | 599 | extern int modparam_noht; |
diff --git a/drivers/net/wireless/ath/carl9170/fw.c b/drivers/net/wireless/ath/carl9170/fw.c index 3de61adacd34..cffde8d9a521 100644 --- a/drivers/net/wireless/ath/carl9170/fw.c +++ b/drivers/net/wireless/ath/carl9170/fw.c | |||
@@ -389,39 +389,6 @@ carl9170_find_fw_desc(struct ar9170 *ar, const __u8 *fw_data, const size_t len) | |||
389 | return (void *)&fw_data[scan - found]; | 389 | return (void *)&fw_data[scan - found]; |
390 | } | 390 | } |
391 | 391 | ||
392 | int carl9170_fw_fix_eeprom(struct ar9170 *ar) | ||
393 | { | ||
394 | const struct carl9170fw_fix_desc *fix_desc = NULL; | ||
395 | unsigned int i, n, off; | ||
396 | u32 *data = (void *)&ar->eeprom; | ||
397 | |||
398 | fix_desc = carl9170_fw_find_desc(ar, FIX_MAGIC, | ||
399 | sizeof(*fix_desc), CARL9170FW_FIX_DESC_CUR_VER); | ||
400 | |||
401 | if (!fix_desc) | ||
402 | return 0; | ||
403 | |||
404 | n = (le16_to_cpu(fix_desc->head.length) - sizeof(*fix_desc)) / | ||
405 | sizeof(struct carl9170fw_fix_entry); | ||
406 | |||
407 | for (i = 0; i < n; i++) { | ||
408 | off = le32_to_cpu(fix_desc->data[i].address) - | ||
409 | AR9170_EEPROM_START; | ||
410 | |||
411 | if (off >= sizeof(struct ar9170_eeprom) || (off & 3)) { | ||
412 | dev_err(&ar->udev->dev, "Skip invalid entry %d\n", i); | ||
413 | continue; | ||
414 | } | ||
415 | |||
416 | data[off / sizeof(*data)] &= | ||
417 | le32_to_cpu(fix_desc->data[i].mask); | ||
418 | data[off / sizeof(*data)] |= | ||
419 | le32_to_cpu(fix_desc->data[i].value); | ||
420 | } | ||
421 | |||
422 | return 0; | ||
423 | } | ||
424 | |||
425 | int carl9170_parse_firmware(struct ar9170 *ar) | 392 | int carl9170_parse_firmware(struct ar9170 *ar) |
426 | { | 393 | { |
427 | const struct carl9170fw_desc_head *fw_desc = NULL; | 394 | const struct carl9170fw_desc_head *fw_desc = NULL; |
diff --git a/drivers/net/wireless/ath/carl9170/mac.c b/drivers/net/wireless/ath/carl9170/mac.c index dfda91970995..53415bfd8bef 100644 --- a/drivers/net/wireless/ath/carl9170/mac.c +++ b/drivers/net/wireless/ath/carl9170/mac.c | |||
@@ -485,3 +485,38 @@ int carl9170_disable_key(struct ar9170 *ar, const u8 id) | |||
485 | return carl9170_exec_cmd(ar, CARL9170_CMD_DKEY, | 485 | return carl9170_exec_cmd(ar, CARL9170_CMD_DKEY, |
486 | sizeof(key), (u8 *)&key, 0, NULL); | 486 | sizeof(key), (u8 *)&key, 0, NULL); |
487 | } | 487 | } |
488 | |||
489 | int carl9170_set_mac_tpc(struct ar9170 *ar, struct ieee80211_channel *channel) | ||
490 | { | ||
491 | unsigned int power, chains; | ||
492 | |||
493 | if (ar->eeprom.tx_mask != 1) | ||
494 | chains = AR9170_TX_PHY_TXCHAIN_2; | ||
495 | else | ||
496 | chains = AR9170_TX_PHY_TXCHAIN_1; | ||
497 | |||
498 | switch (channel->band) { | ||
499 | case IEEE80211_BAND_2GHZ: | ||
500 | power = ar->power_2G_ofdm[0] & 0x3f; | ||
501 | break; | ||
502 | case IEEE80211_BAND_5GHZ: | ||
503 | power = ar->power_5G_leg[0] & 0x3f; | ||
504 | break; | ||
505 | default: | ||
506 | BUG_ON(1); | ||
507 | } | ||
508 | |||
509 | power = min_t(unsigned int, power, ar->hw->conf.power_level * 2); | ||
510 | |||
511 | carl9170_regwrite_begin(ar); | ||
512 | carl9170_regwrite(AR9170_MAC_REG_ACK_TPC, | ||
513 | 0x3c1e | power << 20 | chains << 26); | ||
514 | carl9170_regwrite(AR9170_MAC_REG_RTS_CTS_TPC, | ||
515 | power << 5 | chains << 11 | | ||
516 | power << 21 | chains << 27); | ||
517 | carl9170_regwrite(AR9170_MAC_REG_CFEND_QOSNULL_TPC, | ||
518 | power << 5 | chains << 11 | | ||
519 | power << 21 | chains << 27); | ||
520 | carl9170_regwrite_finish(); | ||
521 | return carl9170_regwrite_result(); | ||
522 | } | ||
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index db774212161b..8d2523b3f722 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c | |||
@@ -853,11 +853,6 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed) | |||
853 | goto out; | 853 | goto out; |
854 | } | 854 | } |
855 | 855 | ||
856 | if (changed & IEEE80211_CONF_CHANGE_POWER) { | ||
857 | /* TODO */ | ||
858 | err = 0; | ||
859 | } | ||
860 | |||
861 | if (changed & IEEE80211_CONF_CHANGE_SMPS) { | 856 | if (changed & IEEE80211_CONF_CHANGE_SMPS) { |
862 | /* TODO */ | 857 | /* TODO */ |
863 | err = 0; | 858 | err = 0; |
@@ -891,6 +886,12 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed) | |||
891 | goto out; | 886 | goto out; |
892 | } | 887 | } |
893 | 888 | ||
889 | if (changed & IEEE80211_CONF_CHANGE_POWER) { | ||
890 | err = carl9170_set_mac_tpc(ar, ar->hw->conf.channel); | ||
891 | if (err) | ||
892 | goto out; | ||
893 | } | ||
894 | |||
894 | out: | 895 | out: |
895 | mutex_unlock(&ar->mutex); | 896 | mutex_unlock(&ar->mutex); |
896 | return err; | 897 | return err; |
@@ -1796,6 +1797,9 @@ void *carl9170_alloc(size_t priv_size) | |||
1796 | ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */ | 1797 | ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */ |
1797 | 1798 | ||
1798 | hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; | 1799 | hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; |
1800 | |||
1801 | /* As IBSS Encryption is software-based, IBSS RSN is supported. */ | ||
1802 | hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; | ||
1799 | return ar; | 1803 | return ar; |
1800 | 1804 | ||
1801 | err_nomem: | 1805 | err_nomem: |
@@ -1931,10 +1935,6 @@ int carl9170_register(struct ar9170 *ar) | |||
1931 | if (err) | 1935 | if (err) |
1932 | return err; | 1936 | return err; |
1933 | 1937 | ||
1934 | err = carl9170_fw_fix_eeprom(ar); | ||
1935 | if (err) | ||
1936 | return err; | ||
1937 | |||
1938 | err = carl9170_parse_eeprom(ar); | 1938 | err = carl9170_parse_eeprom(ar); |
1939 | if (err) | 1939 | if (err) |
1940 | return err; | 1940 | return err; |
diff --git a/drivers/net/wireless/ath/carl9170/phy.c b/drivers/net/wireless/ath/carl9170/phy.c index 472efc7e3402..b72c09cf43a4 100644 --- a/drivers/net/wireless/ath/carl9170/phy.c +++ b/drivers/net/wireless/ath/carl9170/phy.c | |||
@@ -1426,15 +1426,15 @@ static void carl9170_calc_ctl(struct ar9170 *ar, u32 freq, enum carl9170_bw bw) | |||
1426 | #undef EDGES | 1426 | #undef EDGES |
1427 | } | 1427 | } |
1428 | 1428 | ||
1429 | static int carl9170_set_power_cal(struct ar9170 *ar, u32 freq, | 1429 | static void carl9170_set_power_cal(struct ar9170 *ar, u32 freq, |
1430 | enum carl9170_bw bw) | 1430 | enum carl9170_bw bw) |
1431 | { | 1431 | { |
1432 | struct ar9170_calibration_target_power_legacy *ctpl; | 1432 | struct ar9170_calibration_target_power_legacy *ctpl; |
1433 | struct ar9170_calibration_target_power_ht *ctph; | 1433 | struct ar9170_calibration_target_power_ht *ctph; |
1434 | u8 *ctpres; | 1434 | u8 *ctpres; |
1435 | int ntargets; | 1435 | int ntargets; |
1436 | int idx, i, n; | 1436 | int idx, i, n; |
1437 | u8 ackpower, ackchains, f; | 1437 | u8 f; |
1438 | u8 pwr_freqs[AR5416_MAX_NUM_TGT_PWRS]; | 1438 | u8 pwr_freqs[AR5416_MAX_NUM_TGT_PWRS]; |
1439 | 1439 | ||
1440 | if (freq < 3000) | 1440 | if (freq < 3000) |
@@ -1523,32 +1523,6 @@ static int carl9170_set_power_cal(struct ar9170 *ar, u32 freq, | |||
1523 | 1523 | ||
1524 | /* calc. conformance test limits and apply to ar->power*[] */ | 1524 | /* calc. conformance test limits and apply to ar->power*[] */ |
1525 | carl9170_calc_ctl(ar, freq, bw); | 1525 | carl9170_calc_ctl(ar, freq, bw); |
1526 | |||
1527 | /* set ACK/CTS TX power */ | ||
1528 | carl9170_regwrite_begin(ar); | ||
1529 | |||
1530 | if (ar->eeprom.tx_mask != 1) | ||
1531 | ackchains = AR9170_TX_PHY_TXCHAIN_2; | ||
1532 | else | ||
1533 | ackchains = AR9170_TX_PHY_TXCHAIN_1; | ||
1534 | |||
1535 | if (freq < 3000) | ||
1536 | ackpower = ar->power_2G_ofdm[0] & 0x3f; | ||
1537 | else | ||
1538 | ackpower = ar->power_5G_leg[0] & 0x3f; | ||
1539 | |||
1540 | carl9170_regwrite(AR9170_MAC_REG_ACK_TPC, | ||
1541 | 0x3c1e | ackpower << 20 | ackchains << 26); | ||
1542 | carl9170_regwrite(AR9170_MAC_REG_RTS_CTS_TPC, | ||
1543 | ackpower << 5 | ackchains << 11 | | ||
1544 | ackpower << 21 | ackchains << 27); | ||
1545 | |||
1546 | carl9170_regwrite(AR9170_MAC_REG_CFEND_QOSNULL_TPC, | ||
1547 | ackpower << 5 | ackchains << 11 | | ||
1548 | ackpower << 21 | ackchains << 27); | ||
1549 | |||
1550 | carl9170_regwrite_finish(); | ||
1551 | return carl9170_regwrite_result(); | ||
1552 | } | 1526 | } |
1553 | 1527 | ||
1554 | int carl9170_get_noisefloor(struct ar9170 *ar) | 1528 | int carl9170_get_noisefloor(struct ar9170 *ar) |
@@ -1712,7 +1686,9 @@ int carl9170_set_channel(struct ar9170 *ar, struct ieee80211_channel *channel, | |||
1712 | if (err) | 1686 | if (err) |
1713 | return err; | 1687 | return err; |
1714 | 1688 | ||
1715 | err = carl9170_set_power_cal(ar, channel->center_freq, bw); | 1689 | carl9170_set_power_cal(ar, channel->center_freq, bw); |
1690 | |||
1691 | err = carl9170_set_mac_tpc(ar, channel); | ||
1716 | if (err) | 1692 | if (err) |
1717 | return err; | 1693 | return err; |
1718 | 1694 | ||
diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c index bbc813dee983..aed305177af6 100644 --- a/drivers/net/wireless/ath/carl9170/tx.c +++ b/drivers/net/wireless/ath/carl9170/tx.c | |||
@@ -719,6 +719,8 @@ static void carl9170_tx_rate_tpc_chains(struct ar9170 *ar, | |||
719 | else | 719 | else |
720 | *chains = AR9170_TX_PHY_TXCHAIN_2; | 720 | *chains = AR9170_TX_PHY_TXCHAIN_2; |
721 | } | 721 | } |
722 | |||
723 | *tpc = min_t(unsigned int, *tpc, ar->hw->conf.power_level * 2); | ||
722 | } | 724 | } |
723 | 725 | ||
724 | static __le32 carl9170_tx_physet(struct ar9170 *ar, | 726 | static __le32 carl9170_tx_physet(struct ar9170 *ar, |
@@ -1245,7 +1247,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) | |||
1245 | tx_info = IEEE80211_SKB_CB(skb); | 1247 | tx_info = IEEE80211_SKB_CB(skb); |
1246 | 1248 | ||
1247 | if (unlikely(sta_info->sleeping) && | 1249 | if (unlikely(sta_info->sleeping) && |
1248 | !(tx_info->flags & (IEEE80211_TX_CTL_POLL_RESPONSE | | 1250 | !(tx_info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER | |
1249 | IEEE80211_TX_CTL_CLEAR_PS_FILT))) { | 1251 | IEEE80211_TX_CTL_CLEAR_PS_FILT))) { |
1250 | rcu_read_unlock(); | 1252 | rcu_read_unlock(); |
1251 | 1253 | ||