Commit f4afbed9 authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wlcore/wl18xx/wl12xx: allow up to 3 mac addresses

Allow 3 native mac addresses on 18xx. On 12xx allow 2 native mac
addresses and set the LAA bit to create a third mac address. This
enabled operation with a separate group interface.
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <luca@coelho.fi>
parent d49524d3
...@@ -1643,6 +1643,7 @@ static int __devinit wl12xx_probe(struct platform_device *pdev) ...@@ -1643,6 +1643,7 @@ static int __devinit wl12xx_probe(struct platform_device *pdev)
wl->rtable = wl12xx_rtable; wl->rtable = wl12xx_rtable;
wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS; wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS; wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
wl->band_rate_to_idx = wl12xx_band_rate_to_idx; wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX; wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0; wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
......
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
#define WL12XX_NUM_TX_DESCRIPTORS 16 #define WL12XX_NUM_TX_DESCRIPTORS 16
#define WL12XX_NUM_RX_DESCRIPTORS 8 #define WL12XX_NUM_RX_DESCRIPTORS 8
#define WL12XX_NUM_MAC_ADDRESSES 2
struct wl127x_rx_mem_pool_addr { struct wl127x_rx_mem_pool_addr {
u32 addr; u32 addr;
u32 addr_extra; u32 addr_extra;
......
...@@ -1394,6 +1394,7 @@ static int __devinit wl18xx_probe(struct platform_device *pdev) ...@@ -1394,6 +1394,7 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
wl->rtable = wl18xx_rtable; wl->rtable = wl18xx_rtable;
wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS; wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS;
wl->num_rx_desc = WL18XX_NUM_TX_DESCRIPTORS; wl->num_rx_desc = WL18XX_NUM_TX_DESCRIPTORS;
wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
wl->band_rate_to_idx = wl18xx_band_rate_to_idx; wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX; wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX;
wl->hw_min_ht_rate = WL18XX_CONF_HW_RXTX_RATE_MCS0; wl->hw_min_ht_rate = WL18XX_CONF_HW_RXTX_RATE_MCS0;
......
...@@ -38,6 +38,8 @@ ...@@ -38,6 +38,8 @@
#define WL18XX_NUM_TX_DESCRIPTORS 32 #define WL18XX_NUM_TX_DESCRIPTORS 32
#define WL18XX_NUM_RX_DESCRIPTORS 32 #define WL18XX_NUM_RX_DESCRIPTORS 32
#define WL18XX_NUM_MAC_ADDRESSES 3
struct wl18xx_priv { struct wl18xx_priv {
/* buffer for sending commands to FW */ /* buffer for sending commands to FW */
u8 cmd_buf[WL18XX_CMD_MAX_SIZE]; u8 cmd_buf[WL18XX_CMD_MAX_SIZE];
......
...@@ -5074,18 +5074,17 @@ static void wl1271_connection_loss_work(struct work_struct *work) ...@@ -5074,18 +5074,17 @@ static void wl1271_connection_loss_work(struct work_struct *work)
mutex_unlock(&wl->mutex); mutex_unlock(&wl->mutex);
} }
static void wl12xx_derive_mac_addresses(struct wl1271 *wl, static void wl12xx_derive_mac_addresses(struct wl1271 *wl, u32 oui, u32 nic)
u32 oui, u32 nic, int n)
{ {
int i; int i;
wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x, n %d", wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x",
oui, nic, n); oui, nic);
if (nic + n - 1 > 0xffffff) if (nic + WLCORE_NUM_MAC_ADDRESSES - wl->num_mac_addr > 0xffffff)
wl1271_warning("NIC part of the MAC address wraps around!"); wl1271_warning("NIC part of the MAC address wraps around!");
for (i = 0; i < n; i++) { for (i = 0; i < wl->num_mac_addr; i++) {
wl->addresses[i].addr[0] = (u8)(oui >> 16); wl->addresses[i].addr[0] = (u8)(oui >> 16);
wl->addresses[i].addr[1] = (u8)(oui >> 8); wl->addresses[i].addr[1] = (u8)(oui >> 8);
wl->addresses[i].addr[2] = (u8) oui; wl->addresses[i].addr[2] = (u8) oui;
...@@ -5095,7 +5094,22 @@ static void wl12xx_derive_mac_addresses(struct wl1271 *wl, ...@@ -5095,7 +5094,22 @@ static void wl12xx_derive_mac_addresses(struct wl1271 *wl,
nic++; nic++;
} }
wl->hw->wiphy->n_addresses = n; /* we may be one address short at the most */
WARN_ON(wl->num_mac_addr + 1 < WLCORE_NUM_MAC_ADDRESSES);
/*
* turn on the LAA bit in the first address and use it as
* the last address.
*/
if (wl->num_mac_addr < WLCORE_NUM_MAC_ADDRESSES) {
int idx = WLCORE_NUM_MAC_ADDRESSES - 1;
memcpy(&wl->addresses[idx], &wl->addresses[0],
sizeof(wl->addresses[0]));
/* LAA bit */
wl->addresses[idx].addr[2] |= BIT(1);
}
wl->hw->wiphy->n_addresses = WLCORE_NUM_MAC_ADDRESSES;
wl->hw->wiphy->addresses = wl->addresses; wl->hw->wiphy->addresses = wl->addresses;
} }
...@@ -5155,7 +5169,7 @@ static int wl1271_register_hw(struct wl1271 *wl) ...@@ -5155,7 +5169,7 @@ static int wl1271_register_hw(struct wl1271 *wl)
nic_addr = wl->fuse_nic_addr + 1; nic_addr = wl->fuse_nic_addr + 1;
} }
wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr, 2); wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr);
ret = ieee80211_register_hw(wl->hw); ret = ieee80211_register_hw(wl->hw);
if (ret < 0) { if (ret < 0) {
......
...@@ -31,6 +31,12 @@ ...@@ -31,6 +31,12 @@
/* The maximum number of Tx descriptors in all chip families */ /* The maximum number of Tx descriptors in all chip families */
#define WLCORE_MAX_TX_DESCRIPTORS 32 #define WLCORE_MAX_TX_DESCRIPTORS 32
/*
* We always allocate this number of mac addresses. If we don't
* have enough allocated addresses, the LAA bit is used
*/
#define WLCORE_NUM_MAC_ADDRESSES 3
/* forward declaration */ /* forward declaration */
struct wl1271_tx_hw_descr; struct wl1271_tx_hw_descr;
enum wl_rx_buf_align; enum wl_rx_buf_align;
...@@ -181,7 +187,7 @@ struct wl1271 { ...@@ -181,7 +187,7 @@ struct wl1271 {
u32 fuse_nic_addr; u32 fuse_nic_addr;
/* we have up to 2 MAC addresses */ /* we have up to 2 MAC addresses */
struct mac_address addresses[2]; struct mac_address addresses[WLCORE_NUM_MAC_ADDRESSES];
int channel; int channel;
u8 system_hlid; u8 system_hlid;
...@@ -394,6 +400,9 @@ struct wl1271 { ...@@ -394,6 +400,9 @@ struct wl1271 {
/* sleep auth value currently configured to FW */ /* sleep auth value currently configured to FW */
int sleep_auth; int sleep_auth;
/* the number of allocated MAC addresses in this chip */
int num_mac_addr;
/* the minimum FW version required for the driver to work */ /* the minimum FW version required for the driver to work */
unsigned int min_fw_ver[NUM_FW_VER]; unsigned int min_fw_ver[NUM_FW_VER];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment