diff options
author | Imre Kaloz <kaloz@openwrt.org> | 2014-03-18 18:55:54 +0000 |
---|---|---|
committer | Imre Kaloz <kaloz@openwrt.org> | 2014-03-18 18:55:54 +0000 |
commit | 531dc9fe42ce5baa4d6af991600606e418ea52ca (patch) | |
tree | c198b11fb053024a4a611b1c06eea2bbe2b7c65f /package/kernel/mac80211/patches/909-wl18xx-move-to-new-firmware-wl18xx-fw-3.bin.patch | |
parent | aabce5cf6a31bf82c3df2328f60ca747c6f5b84f (diff) | |
download | upstream-531dc9fe42ce5baa4d6af991600606e418ea52ca.tar.gz upstream-531dc9fe42ce5baa4d6af991600606e418ea52ca.tar.bz2 upstream-531dc9fe42ce5baa4d6af991600606e418ea52ca.zip |
add add new firmware support and additional fixes for wl18xx
Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
SVN-Revision: 39947
Diffstat (limited to 'package/kernel/mac80211/patches/909-wl18xx-move-to-new-firmware-wl18xx-fw-3.bin.patch')
-rw-r--r-- | package/kernel/mac80211/patches/909-wl18xx-move-to-new-firmware-wl18xx-fw-3.bin.patch | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/909-wl18xx-move-to-new-firmware-wl18xx-fw-3.bin.patch b/package/kernel/mac80211/patches/909-wl18xx-move-to-new-firmware-wl18xx-fw-3.bin.patch new file mode 100644 index 0000000000..85214c1037 --- /dev/null +++ b/package/kernel/mac80211/patches/909-wl18xx-move-to-new-firmware-wl18xx-fw-3.bin.patch @@ -0,0 +1,200 @@ +Bump the min wl18xx fw version to 8.8.0.0.13 + +This fw is not backward compatible with older +firmware (due to api changes), so use bump +the firmware name as well. + +Some modifications were done to the driver-fw api +in order to support multiple APs. + +Additionally, some of the consts (such as max stations, +max links and max RX BA sessions) were changed. + +Signed-off-by: Arik Nemtsov <arik@wizery.com> +Signed-off-by: Eliad Peller <eliad@wizery.com> + +--- +drivers/net/wireless/ti/wl18xx/main.c | 2 +- + drivers/net/wireless/ti/wl18xx/wl18xx.h | 10 +++++----- + drivers/net/wireless/ti/wlcore/acx.c | 4 +++- + drivers/net/wireless/ti/wlcore/acx.h | 6 ++++-- + drivers/net/wireless/ti/wlcore/cmd.c | 5 ++++- + drivers/net/wireless/ti/wlcore/cmd.h | 7 +++++-- + drivers/net/wireless/ti/wlcore/main.c | 2 +- + drivers/net/wireless/ti/wlcore/tx.c | 2 +- + drivers/net/wireless/ti/wlcore/wlcore_i.h | 2 +- + 9 files changed, 25 insertions(+), 15 deletions(-) + +--- a/drivers/net/wireless/ti/wl18xx/main.c ++++ b/drivers/net/wireless/ti/wl18xx/main.c +@@ -648,7 +648,7 @@ static const struct wl18xx_clk_cfg wl18x + }; + + /* TODO: maybe move to a new header file? */ +-#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-2.bin" ++#define WL18XX_FW_NAME "ti-connectivity/wl18xx-fw-3.bin" + + static int wl18xx_identify_chip(struct wl1271 *wl) + { +--- a/drivers/net/wireless/ti/wl18xx/wl18xx.h ++++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h +@@ -26,10 +26,10 @@ + + /* minimum FW required for driver */ + #define WL18XX_CHIP_VER 8 +-#define WL18XX_IFTYPE_VER 5 ++#define WL18XX_IFTYPE_VER 8 + #define WL18XX_MAJOR_VER WLCORE_FW_VER_IGNORE + #define WL18XX_SUBTYPE_VER WLCORE_FW_VER_IGNORE +-#define WL18XX_MINOR_VER 39 ++#define WL18XX_MINOR_VER 13 + + #define WL18XX_CMD_MAX_SIZE 740 + +@@ -40,10 +40,10 @@ + + #define WL18XX_NUM_MAC_ADDRESSES 3 + +-#define WL18XX_RX_BA_MAX_SESSIONS 5 ++#define WL18XX_RX_BA_MAX_SESSIONS 13 + +-#define WL18XX_MAX_AP_STATIONS 8 +-#define WL18XX_MAX_LINKS 12 ++#define WL18XX_MAX_AP_STATIONS 10 ++#define WL18XX_MAX_LINKS 16 + + struct wl18xx_priv { + /* buffer for sending commands to FW */ +--- a/drivers/net/wireless/ti/wlcore/acx.c ++++ b/drivers/net/wireless/ti/wlcore/acx.c +@@ -1591,7 +1591,8 @@ out: + return ret; + } + +-int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr) ++int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, ++ struct wl12xx_vif *wlvif, u8 *addr) + { + struct wl1271_acx_inconnection_sta *acx = NULL; + int ret; +@@ -1603,6 +1604,7 @@ int wl1271_acx_set_inconnection_sta(stru + return -ENOMEM; + + memcpy(acx->addr, addr, ETH_ALEN); ++ acx->role_id = wlvif->role_id; + + ret = wl1271_cmd_configure(wl, ACX_UPDATE_INCONNECTION_STA_LIST, + acx, sizeof(*acx)); +--- a/drivers/net/wireless/ti/wlcore/acx.h ++++ b/drivers/net/wireless/ti/wlcore/acx.h +@@ -824,7 +824,8 @@ struct wl1271_acx_inconnection_sta { + struct acx_header header; + + u8 addr[ETH_ALEN]; +- u8 padding1[2]; ++ u8 role_id; ++ u8 padding; + } __packed; + + /* +@@ -1118,7 +1119,8 @@ int wl1271_acx_ps_rx_streaming(struct wl + bool enable); + int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif); + int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif); +-int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); ++int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, ++ struct wl12xx_vif *wlvif, u8 *addr); + int wl1271_acx_fm_coex(struct wl1271 *wl); + int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl); + int wl12xx_acx_config_hangover(struct wl1271 *wl); +--- a/drivers/net/wireless/ti/wlcore/cmd.c ++++ b/drivers/net/wireless/ti/wlcore/cmd.c +@@ -1532,6 +1532,7 @@ int wl12xx_cmd_add_peer(struct wl1271 *w + cmd->sp_len = sta->max_sp; + cmd->wmm = sta->wme ? 1 : 0; + cmd->session_id = wl->session_ids[hlid]; ++ cmd->role_id = wlvif->role_id; + + for (i = 0; i < NUM_ACCESS_CATEGORIES_COPY; i++) + if (sta->wme && (sta->uapsd_queues & BIT(i))) +@@ -1568,7 +1569,8 @@ out: + return ret; + } + +-int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid) ++int wl12xx_cmd_remove_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif, ++ u8 hlid) + { + struct wl12xx_cmd_remove_peer *cmd; + int ret; +@@ -1586,6 +1588,7 @@ int wl12xx_cmd_remove_peer(struct wl1271 + /* We never send a deauth, mac80211 is in charge of this */ + cmd->reason_opcode = 0; + cmd->send_deauth_flag = 0; ++ cmd->role_id = wlvif->role_id; + + ret = wl1271_cmd_send(wl, CMD_REMOVE_PEER, cmd, sizeof(*cmd), 0); + if (ret < 0) { +--- a/drivers/net/wireless/ti/wlcore/cmd.h ++++ b/drivers/net/wireless/ti/wlcore/cmd.h +@@ -88,7 +88,8 @@ int wl12xx_roc(struct wl1271 *wl, struct + int wl12xx_croc(struct wl1271 *wl, u8 role_id); + int wl12xx_cmd_add_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif, + struct ieee80211_sta *sta, u8 hlid); +-int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid); ++int wl12xx_cmd_remove_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif, ++ u8 hlid); + void wlcore_set_pending_regdomain_ch(struct wl1271 *wl, u16 channel, + enum ieee80211_band band); + int wlcore_cmd_regdomain_config_locked(struct wl1271 *wl); +@@ -594,6 +595,8 @@ struct wl12xx_cmd_add_peer { + u8 sp_len; + u8 wmm; + u8 session_id; ++ u8 role_id; ++ u8 padding[3]; + } __packed; + + struct wl12xx_cmd_remove_peer { +@@ -602,7 +605,7 @@ struct wl12xx_cmd_remove_peer { + u8 hlid; + u8 reason_opcode; + u8 send_deauth_flag; +- u8 padding1; ++ u8 role_id; + } __packed; + + /* +--- a/drivers/net/wireless/ti/wlcore/main.c ++++ b/drivers/net/wireless/ti/wlcore/main.c +@@ -4798,7 +4798,7 @@ static int wl12xx_sta_remove(struct wl12 + if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map))) + return -EINVAL; + +- ret = wl12xx_cmd_remove_peer(wl, wl_sta->hlid); ++ ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid); + if (ret < 0) + return ret; + +--- a/drivers/net/wireless/ti/wlcore/tx.c ++++ b/drivers/net/wireless/ti/wlcore/tx.c +@@ -101,7 +101,7 @@ static void wl1271_tx_ap_update_inconnec + * authentication response. this way it won't get de-authed by FW + * when transmitting too soon. + */ +- wl1271_acx_set_inconnection_sta(wl, hdr->addr1); ++ wl1271_acx_set_inconnection_sta(wl, wlvif, hdr->addr1); + + /* + * ROC for 1 second on the AP channel for completing the connection. +--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h ++++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h +@@ -65,7 +65,7 @@ + * max number of links allowed by all HWs. + * this is NOT the actual max links supported by the current hw. + */ +-#define WLCORE_MAX_LINKS 12 ++#define WLCORE_MAX_LINKS 16 + + /* the driver supports the 2.4Ghz and 5Ghz bands */ + #define WLCORE_NUM_BANDS 2 |