diff options
Diffstat (limited to 'drivers/net/wireless/ti/wl12xx')
-rw-r--r-- | drivers/net/wireless/ti/wl12xx/main.c | 67 | ||||
-rw-r--r-- | drivers/net/wireless/ti/wl12xx/wl12xx.h | 53 |
2 files changed, 118 insertions, 2 deletions
diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c index be7129ba16ad..d50dfac91631 100644 --- a/drivers/net/wireless/ti/wl12xx/main.c +++ b/drivers/net/wireless/ti/wl12xx/main.c | |||
@@ -1378,7 +1378,7 @@ static u32 wl12xx_get_rx_packet_len(struct wl1271 *wl, void *rx_data, | |||
1378 | 1378 | ||
1379 | static int wl12xx_tx_delayed_compl(struct wl1271 *wl) | 1379 | static int wl12xx_tx_delayed_compl(struct wl1271 *wl) |
1380 | { | 1380 | { |
1381 | if (wl->fw_status_1->tx_results_counter == | 1381 | if (wl->fw_status->tx_results_counter == |
1382 | (wl->tx_results_count & 0xff)) | 1382 | (wl->tx_results_count & 0xff)) |
1383 | return 0; | 1383 | return 0; |
1384 | 1384 | ||
@@ -1438,6 +1438,37 @@ out: | |||
1438 | return ret; | 1438 | return ret; |
1439 | } | 1439 | } |
1440 | 1440 | ||
1441 | static void wl12xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status, | ||
1442 | struct wl_fw_status *fw_status) | ||
1443 | { | ||
1444 | struct wl12xx_fw_status *int_fw_status = raw_fw_status; | ||
1445 | |||
1446 | fw_status->intr = le32_to_cpu(int_fw_status->intr); | ||
1447 | fw_status->fw_rx_counter = int_fw_status->fw_rx_counter; | ||
1448 | fw_status->drv_rx_counter = int_fw_status->drv_rx_counter; | ||
1449 | fw_status->tx_results_counter = int_fw_status->tx_results_counter; | ||
1450 | fw_status->rx_pkt_descs = int_fw_status->rx_pkt_descs; | ||
1451 | |||
1452 | fw_status->fw_localtime = le32_to_cpu(int_fw_status->fw_localtime); | ||
1453 | fw_status->link_ps_bitmap = le32_to_cpu(int_fw_status->link_ps_bitmap); | ||
1454 | fw_status->link_fast_bitmap = | ||
1455 | le32_to_cpu(int_fw_status->link_fast_bitmap); | ||
1456 | fw_status->total_released_blks = | ||
1457 | le32_to_cpu(int_fw_status->total_released_blks); | ||
1458 | fw_status->tx_total = le32_to_cpu(int_fw_status->tx_total); | ||
1459 | |||
1460 | fw_status->counters.tx_released_pkts = | ||
1461 | int_fw_status->counters.tx_released_pkts; | ||
1462 | fw_status->counters.tx_lnk_free_pkts = | ||
1463 | int_fw_status->counters.tx_lnk_free_pkts; | ||
1464 | fw_status->counters.tx_voice_released_blks = | ||
1465 | int_fw_status->counters.tx_voice_released_blks; | ||
1466 | fw_status->counters.tx_last_rate = | ||
1467 | int_fw_status->counters.tx_last_rate; | ||
1468 | |||
1469 | fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr); | ||
1470 | } | ||
1471 | |||
1441 | static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl, | 1472 | static u32 wl12xx_sta_get_ap_rate_mask(struct wl1271 *wl, |
1442 | struct wl12xx_vif *wlvif) | 1473 | struct wl12xx_vif *wlvif) |
1443 | { | 1474 | { |
@@ -1677,6 +1708,7 @@ static struct wlcore_ops wl12xx_ops = { | |||
1677 | .tx_delayed_compl = wl12xx_tx_delayed_compl, | 1708 | .tx_delayed_compl = wl12xx_tx_delayed_compl, |
1678 | .hw_init = wl12xx_hw_init, | 1709 | .hw_init = wl12xx_hw_init, |
1679 | .init_vif = NULL, | 1710 | .init_vif = NULL, |
1711 | .convert_fw_status = wl12xx_convert_fw_status, | ||
1680 | .sta_get_ap_rate_mask = wl12xx_sta_get_ap_rate_mask, | 1712 | .sta_get_ap_rate_mask = wl12xx_sta_get_ap_rate_mask, |
1681 | .get_pg_ver = wl12xx_get_pg_ver, | 1713 | .get_pg_ver = wl12xx_get_pg_ver, |
1682 | .get_mac = wl12xx_get_mac, | 1714 | .get_mac = wl12xx_get_mac, |
@@ -1711,22 +1743,53 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = { | |||
1711 | }, | 1743 | }, |
1712 | }; | 1744 | }; |
1713 | 1745 | ||
1746 | static const struct ieee80211_iface_limit wl12xx_iface_limits[] = { | ||
1747 | { | ||
1748 | .max = 3, | ||
1749 | .types = BIT(NL80211_IFTYPE_STATION), | ||
1750 | }, | ||
1751 | { | ||
1752 | .max = 1, | ||
1753 | .types = BIT(NL80211_IFTYPE_AP) | | ||
1754 | BIT(NL80211_IFTYPE_P2P_GO) | | ||
1755 | BIT(NL80211_IFTYPE_P2P_CLIENT), | ||
1756 | }, | ||
1757 | }; | ||
1758 | |||
1759 | static const struct ieee80211_iface_combination | ||
1760 | wl12xx_iface_combinations[] = { | ||
1761 | { | ||
1762 | .max_interfaces = 3, | ||
1763 | .limits = wl12xx_iface_limits, | ||
1764 | .n_limits = ARRAY_SIZE(wl12xx_iface_limits), | ||
1765 | .num_different_channels = 1, | ||
1766 | }, | ||
1767 | }; | ||
1768 | |||
1714 | static int wl12xx_setup(struct wl1271 *wl) | 1769 | static int wl12xx_setup(struct wl1271 *wl) |
1715 | { | 1770 | { |
1716 | struct wl12xx_priv *priv = wl->priv; | 1771 | struct wl12xx_priv *priv = wl->priv; |
1717 | struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev); | 1772 | struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev); |
1718 | struct wl12xx_platform_data *pdata = pdev_data->pdata; | 1773 | struct wl12xx_platform_data *pdata = pdev_data->pdata; |
1719 | 1774 | ||
1775 | BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS); | ||
1776 | BUILD_BUG_ON(WL12XX_MAX_AP_STATIONS > WL12XX_MAX_LINKS); | ||
1777 | |||
1720 | wl->rtable = wl12xx_rtable; | 1778 | wl->rtable = wl12xx_rtable; |
1721 | wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS; | 1779 | wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS; |
1722 | wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS; | 1780 | wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS; |
1723 | wl->num_channels = 1; | 1781 | wl->num_links = WL12XX_MAX_LINKS; |
1782 | wl->max_ap_stations = WL12XX_MAX_AP_STATIONS; | ||
1783 | wl->iface_combinations = wl12xx_iface_combinations; | ||
1784 | wl->n_iface_combinations = ARRAY_SIZE(wl12xx_iface_combinations); | ||
1724 | wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES; | 1785 | wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES; |
1725 | wl->band_rate_to_idx = wl12xx_band_rate_to_idx; | 1786 | wl->band_rate_to_idx = wl12xx_band_rate_to_idx; |
1726 | wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX; | 1787 | wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX; |
1727 | wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0; | 1788 | wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0; |
1789 | wl->fw_status_len = sizeof(struct wl12xx_fw_status); | ||
1728 | wl->fw_status_priv_len = 0; | 1790 | wl->fw_status_priv_len = 0; |
1729 | wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics); | 1791 | wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics); |
1792 | wl->ofdm_only_ap = true; | ||
1730 | wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ, &wl12xx_ht_cap); | 1793 | wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ, &wl12xx_ht_cap); |
1731 | wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap); | 1794 | wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap); |
1732 | wl12xx_conf_init(wl); | 1795 | wl12xx_conf_init(wl); |
diff --git a/drivers/net/wireless/ti/wl12xx/wl12xx.h b/drivers/net/wireless/ti/wl12xx/wl12xx.h index 9e5484a73667..75c92658bfea 100644 --- a/drivers/net/wireless/ti/wl12xx/wl12xx.h +++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h | |||
@@ -65,6 +65,9 @@ | |||
65 | 65 | ||
66 | #define WL12XX_RX_BA_MAX_SESSIONS 3 | 66 | #define WL12XX_RX_BA_MAX_SESSIONS 3 |
67 | 67 | ||
68 | #define WL12XX_MAX_AP_STATIONS 8 | ||
69 | #define WL12XX_MAX_LINKS 12 | ||
70 | |||
68 | struct wl127x_rx_mem_pool_addr { | 71 | struct wl127x_rx_mem_pool_addr { |
69 | u32 addr; | 72 | u32 addr; |
70 | u32 addr_extra; | 73 | u32 addr_extra; |
@@ -79,4 +82,54 @@ struct wl12xx_priv { | |||
79 | struct wl127x_rx_mem_pool_addr *rx_mem_addr; | 82 | struct wl127x_rx_mem_pool_addr *rx_mem_addr; |
80 | }; | 83 | }; |
81 | 84 | ||
85 | struct wl12xx_fw_packet_counters { | ||
86 | /* Cumulative counter of released packets per AC */ | ||
87 | u8 tx_released_pkts[NUM_TX_QUEUES]; | ||
88 | |||
89 | /* Cumulative counter of freed packets per HLID */ | ||
90 | u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS]; | ||
91 | |||
92 | /* Cumulative counter of released Voice memory blocks */ | ||
93 | u8 tx_voice_released_blks; | ||
94 | |||
95 | /* Tx rate of the last transmitted packet */ | ||
96 | u8 tx_last_rate; | ||
97 | |||
98 | u8 padding[2]; | ||
99 | } __packed; | ||
100 | |||
101 | /* FW status registers */ | ||
102 | struct wl12xx_fw_status { | ||
103 | __le32 intr; | ||
104 | u8 fw_rx_counter; | ||
105 | u8 drv_rx_counter; | ||
106 | u8 reserved; | ||
107 | u8 tx_results_counter; | ||
108 | __le32 rx_pkt_descs[WL12XX_NUM_RX_DESCRIPTORS]; | ||
109 | |||
110 | __le32 fw_localtime; | ||
111 | |||
112 | /* | ||
113 | * A bitmap (where each bit represents a single HLID) | ||
114 | * to indicate if the station is in PS mode. | ||
115 | */ | ||
116 | __le32 link_ps_bitmap; | ||
117 | |||
118 | /* | ||
119 | * A bitmap (where each bit represents a single HLID) to indicate | ||
120 | * if the station is in Fast mode | ||
121 | */ | ||
122 | __le32 link_fast_bitmap; | ||
123 | |||
124 | /* Cumulative counter of total released mem blocks since FW-reset */ | ||
125 | __le32 total_released_blks; | ||
126 | |||
127 | /* Size (in Memory Blocks) of TX pool */ | ||
128 | __le32 tx_total; | ||
129 | |||
130 | struct wl12xx_fw_packet_counters counters; | ||
131 | |||
132 | __le32 log_start_addr; | ||
133 | } __packed; | ||
134 | |||
82 | #endif /* __WL12XX_PRIV_H__ */ | 135 | #endif /* __WL12XX_PRIV_H__ */ |