aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/carl9170
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/carl9170')
-rw-r--r--drivers/net/wireless/ath/carl9170/carl9170.h2
-rw-r--r--drivers/net/wireless/ath/carl9170/fw.c33
-rw-r--r--drivers/net/wireless/ath/carl9170/mac.c35
-rw-r--r--drivers/net/wireless/ath/carl9170/main.c18
-rw-r--r--drivers/net/wireless/ath/carl9170/phy.c36
-rw-r--r--drivers/net/wireless/ath/carl9170/tx.c4
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);
559int carl9170_upload_key(struct ar9170 *ar, const u8 id, const u8 *mac, 559int 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);
561int carl9170_disable_key(struct ar9170 *ar, const u8 id); 561int carl9170_disable_key(struct ar9170 *ar, const u8 id);
562int carl9170_set_mac_tpc(struct ar9170 *ar, struct ieee80211_channel *channel);
562 563
563/* RX */ 564/* RX */
564void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len); 565void 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 */
595int carl9170_parse_firmware(struct ar9170 *ar); 596int carl9170_parse_firmware(struct ar9170 *ar);
596int carl9170_fw_fix_eeprom(struct ar9170 *ar);
597 597
598extern struct ieee80211_rate __carl9170_ratetable[]; 598extern struct ieee80211_rate __carl9170_ratetable[];
599extern int modparam_noht; 599extern 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
392int 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
425int carl9170_parse_firmware(struct ar9170 *ar) 392int 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
489int 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
894out: 895out:
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
1801err_nomem: 1805err_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
1429static int carl9170_set_power_cal(struct ar9170 *ar, u32 freq, 1429static 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
1554int carl9170_get_noisefloor(struct ar9170 *ar) 1528int 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
724static __le32 carl9170_tx_physet(struct ar9170 *ar, 726static __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