Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
This commit is contained in:
@@ -9,5 +9,7 @@ wil6210-objs += wmi.o
|
||||
wil6210-objs += interrupt.o
|
||||
wil6210-objs += txrx.o
|
||||
|
||||
subdir-ccflags-y += -Werror
|
||||
ifeq (, $(findstring -W,$(EXTRA_CFLAGS)))
|
||||
subdir-ccflags-y += -Werror
|
||||
endif
|
||||
subdir-ccflags-y += -D__CHECK_ENDIAN__
|
||||
|
@@ -14,16 +14,6 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/version.h>
|
||||
#include <net/cfg80211.h>
|
||||
|
||||
#include "wil6210.h"
|
||||
#include "wmi.h"
|
||||
|
||||
@@ -292,7 +282,7 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
|
||||
|
||||
/* WMI_CONNECT_CMD */
|
||||
memset(&conn, 0, sizeof(conn));
|
||||
switch (bss->capability & 0x03) {
|
||||
switch (bss->capability & WLAN_CAPABILITY_DMG_TYPE_MASK) {
|
||||
case WLAN_CAPABILITY_DMG_TYPE_AP:
|
||||
conn.network_type = WMI_NETTYPE_INFRA;
|
||||
break;
|
||||
@@ -437,17 +427,18 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = wmi_set_channel(wil, channel->hw_value);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* MAC address - pre-requisite for other commands */
|
||||
wmi_set_mac_address(wil, ndev->dev_addr);
|
||||
|
||||
/* IE's */
|
||||
/* bcon 'head IE's are not relevant for 60g band */
|
||||
wmi_set_ie(wil, WMI_FRAME_BEACON, bcon->beacon_ies_len,
|
||||
bcon->beacon_ies);
|
||||
/*
|
||||
* FW do not form regular beacon, so bcon IE's are not set
|
||||
* For the DMG bcon, when it will be supported, bcon IE's will
|
||||
* be reused; add something like:
|
||||
* wmi_set_ie(wil, WMI_FRAME_BEACON, bcon->beacon_ies_len,
|
||||
* bcon->beacon_ies);
|
||||
*/
|
||||
wmi_set_ie(wil, WMI_FRAME_PROBE_RESP, bcon->proberesp_ies_len,
|
||||
bcon->proberesp_ies);
|
||||
wmi_set_ie(wil, WMI_FRAME_ASSOC_RESP, bcon->assocresp_ies_len,
|
||||
@@ -455,7 +446,8 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
|
||||
|
||||
wil->secure_pcp = info->privacy;
|
||||
|
||||
rc = wmi_set_bcon(wil, info->beacon_interval, wmi_nettype);
|
||||
rc = wmi_pcp_start(wil, info->beacon_interval, wmi_nettype,
|
||||
channel->hw_value);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -472,11 +464,8 @@ static int wil_cfg80211_stop_ap(struct wiphy *wiphy,
|
||||
{
|
||||
int rc = 0;
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wireless_dev *wdev = ndev->ieee80211_ptr;
|
||||
u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);
|
||||
|
||||
/* To stop beaconing, set BI to 0 */
|
||||
rc = wmi_set_bcon(wil, 0, wmi_nettype);
|
||||
rc = wmi_pcp_stop(wil);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@@ -1,20 +0,0 @@
|
||||
#ifndef WIL_DBG_HEXDUMP_H_
|
||||
#define WIL_DBG_HEXDUMP_H_
|
||||
|
||||
#include <linux/printk.h>
|
||||
#include <linux/dynamic_debug.h>
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
#define wil_print_hex_dump_debug(prefix_str, prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii) \
|
||||
dynamic_hex_dump(prefix_str, prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii)
|
||||
|
||||
#else /* defined(CONFIG_DYNAMIC_DEBUG) */
|
||||
#define wil_print_hex_dump_debug(prefix_str, prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii) \
|
||||
print_hex_dump(KERN_DEBUG, prefix_str, prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii)
|
||||
#endif /* defined(CONFIG_DYNAMIC_DEBUG) */
|
||||
|
||||
#endif /* WIL_DBG_HEXDUMP_H_ */
|
@@ -312,14 +312,6 @@ static const struct file_operations fops_memread = {
|
||||
.llseek = seq_lseek,
|
||||
};
|
||||
|
||||
static int wil_default_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (inode->i_private)
|
||||
file->private_data = inode->i_private;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
@@ -361,7 +353,7 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
||||
|
||||
static const struct file_operations fops_ioblob = {
|
||||
.read = wil_read_file_ioblob,
|
||||
.open = wil_default_open,
|
||||
.open = simple_open,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
@@ -396,7 +388,7 @@ static ssize_t wil_write_file_reset(struct file *file, const char __user *buf,
|
||||
|
||||
static const struct file_operations fops_reset = {
|
||||
.write = wil_write_file_reset,
|
||||
.open = wil_default_open,
|
||||
.open = simple_open,
|
||||
};
|
||||
/*---------Tx descriptor------------*/
|
||||
|
||||
@@ -526,7 +518,50 @@ static ssize_t wil_write_file_ssid(struct file *file, const char __user *buf,
|
||||
static const struct file_operations fops_ssid = {
|
||||
.read = wil_read_file_ssid,
|
||||
.write = wil_write_file_ssid,
|
||||
.open = wil_default_open,
|
||||
.open = simple_open,
|
||||
};
|
||||
|
||||
/*---------temp------------*/
|
||||
static void print_temp(struct seq_file *s, const char *prefix, u32 t)
|
||||
{
|
||||
switch (t) {
|
||||
case 0:
|
||||
case ~(u32)0:
|
||||
seq_printf(s, "%s N/A\n", prefix);
|
||||
break;
|
||||
default:
|
||||
seq_printf(s, "%s %d.%03d\n", prefix, t / 1000, t % 1000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int wil_temp_debugfs_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct wil6210_priv *wil = s->private;
|
||||
u32 t_m, t_r;
|
||||
|
||||
int rc = wmi_get_temperature(wil, &t_m, &t_r);
|
||||
if (rc) {
|
||||
seq_printf(s, "Failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
print_temp(s, "MAC temperature :", t_m);
|
||||
print_temp(s, "Radio temperature :", t_r);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wil_temp_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, wil_temp_debugfs_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations fops_temp = {
|
||||
.open = wil_temp_seq_open,
|
||||
.release = single_release,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
};
|
||||
|
||||
/*----------------*/
|
||||
@@ -563,6 +598,7 @@ int wil6210_debugfs_init(struct wil6210_priv *wil)
|
||||
debugfs_create_file("mem_val", S_IRUGO, dbg, wil, &fops_memread);
|
||||
|
||||
debugfs_create_file("reset", S_IWUSR, dbg, wil, &fops_reset);
|
||||
debugfs_create_file("temp", S_IRUGO, dbg, wil, &fops_temp);
|
||||
|
||||
wil->rgf_blob.data = (void * __force)wil->csr + 0;
|
||||
wil->rgf_blob.size = 0xa000;
|
||||
|
@@ -240,6 +240,15 @@ static void wil_notify_fw_error(struct wil6210_priv *wil)
|
||||
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
|
||||
}
|
||||
|
||||
static void wil_cache_mbox_regs(struct wil6210_priv *wil)
|
||||
{
|
||||
/* make shadow copy of registers that should not change on run time */
|
||||
wil_memcpy_fromio_32(&wil->mbox_ctl, wil->csr + HOST_MBOX,
|
||||
sizeof(struct wil6210_mbox_ctl));
|
||||
wil_mbox_ring_le2cpus(&wil->mbox_ctl.rx);
|
||||
wil_mbox_ring_le2cpus(&wil->mbox_ctl.tx);
|
||||
}
|
||||
|
||||
static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
|
||||
{
|
||||
struct wil6210_priv *wil = cookie;
|
||||
@@ -257,14 +266,19 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
|
||||
wil6210_mask_irq_misc(wil);
|
||||
|
||||
if (isr & ISR_MISC_FW_ERROR) {
|
||||
wil_dbg_irq(wil, "IRQ: Firmware error\n");
|
||||
wil_err(wil, "Firmware error detected\n");
|
||||
clear_bit(wil_status_fwready, &wil->status);
|
||||
wil_notify_fw_error(wil);
|
||||
isr &= ~ISR_MISC_FW_ERROR;
|
||||
/*
|
||||
* do not clear @isr here - we do 2-nd part in thread
|
||||
* there, user space get notified, and it should be done
|
||||
* in non-atomic context
|
||||
*/
|
||||
}
|
||||
|
||||
if (isr & ISR_MISC_FW_READY) {
|
||||
wil_dbg_irq(wil, "IRQ: FW ready\n");
|
||||
wil_cache_mbox_regs(wil);
|
||||
set_bit(wil_status_reset_done, &wil->status);
|
||||
/**
|
||||
* Actual FW ready indicated by the
|
||||
* WMI_FW_READY_EVENTID
|
||||
@@ -289,6 +303,11 @@ static irqreturn_t wil6210_irq_misc_thread(int irq, void *cookie)
|
||||
|
||||
wil_dbg_irq(wil, "Thread ISR MISC 0x%08x\n", isr);
|
||||
|
||||
if (isr & ISR_MISC_FW_ERROR) {
|
||||
wil_notify_fw_error(wil);
|
||||
isr &= ~ISR_MISC_FW_ERROR;
|
||||
}
|
||||
|
||||
if (isr & ISR_MISC_MBOX_EVT) {
|
||||
wil_dbg_irq(wil, "MBOX event\n");
|
||||
wmi_recv_cmd(wil);
|
||||
|
@@ -14,12 +14,6 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/if_arp.h>
|
||||
|
||||
@@ -109,13 +103,24 @@ static void wil_connect_timer_fn(ulong x)
|
||||
schedule_work(&wil->disconnect_worker);
|
||||
}
|
||||
|
||||
static void wil_cache_mbox_regs(struct wil6210_priv *wil)
|
||||
static void wil_connect_worker(struct work_struct *work)
|
||||
{
|
||||
/* make shadow copy of registers that should not change on run time */
|
||||
wil_memcpy_fromio_32(&wil->mbox_ctl, wil->csr + HOST_MBOX,
|
||||
sizeof(struct wil6210_mbox_ctl));
|
||||
wil_mbox_ring_le2cpus(&wil->mbox_ctl.rx);
|
||||
wil_mbox_ring_le2cpus(&wil->mbox_ctl.tx);
|
||||
int rc;
|
||||
struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
|
||||
connect_worker);
|
||||
int cid = wil->pending_connect_cid;
|
||||
|
||||
if (cid < 0) {
|
||||
wil_err(wil, "No connection pending\n");
|
||||
return;
|
||||
}
|
||||
|
||||
wil_dbg_wmi(wil, "Configure for connection CID %d\n", cid);
|
||||
|
||||
rc = wil_vring_init_tx(wil, 0, WIL6210_TX_RING_SIZE, cid, 0);
|
||||
wil->pending_connect_cid = -1;
|
||||
if (rc == 0)
|
||||
wil_link_on(wil);
|
||||
}
|
||||
|
||||
int wil_priv_init(struct wil6210_priv *wil)
|
||||
@@ -130,7 +135,7 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
wil->pending_connect_cid = -1;
|
||||
setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil);
|
||||
|
||||
INIT_WORK(&wil->wmi_connect_worker, wmi_connect_worker);
|
||||
INIT_WORK(&wil->connect_worker, wil_connect_worker);
|
||||
INIT_WORK(&wil->disconnect_worker, wil_disconnect_worker);
|
||||
INIT_WORK(&wil->wmi_event_worker, wmi_event_worker);
|
||||
|
||||
@@ -147,8 +152,6 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
wil_cache_mbox_regs(wil);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -185,15 +188,11 @@ static void wil_target_reset(struct wil6210_priv *wil)
|
||||
W(RGF_USER_MAC_CPU_0, BIT(1)); /* mac_cpu_man_rst */
|
||||
W(RGF_USER_USER_CPU_0, BIT(1)); /* user_cpu_man_rst */
|
||||
|
||||
msleep(100);
|
||||
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0xFE000000);
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0x0000003F);
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000170);
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0xFFE7FC00);
|
||||
|
||||
msleep(100);
|
||||
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0);
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0);
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0);
|
||||
@@ -203,12 +202,6 @@ static void wil_target_reset(struct wil6210_priv *wil)
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0x00000080);
|
||||
W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0);
|
||||
|
||||
msleep(2000);
|
||||
|
||||
W(RGF_USER_USER_CPU_0, BIT(0)); /* user_cpu_man_de_rst */
|
||||
|
||||
msleep(2000);
|
||||
|
||||
wil_dbg_misc(wil, "Reset completed\n");
|
||||
|
||||
#undef W
|
||||
@@ -265,8 +258,6 @@ int wil_reset(struct wil6210_priv *wil)
|
||||
wil->pending_connect_cid = -1;
|
||||
INIT_COMPLETION(wil->wmi_ready);
|
||||
|
||||
wil_cache_mbox_regs(wil);
|
||||
|
||||
/* TODO: release MAC reset */
|
||||
wil6210_enable_irq(wil);
|
||||
|
||||
@@ -352,9 +343,9 @@ static int __wil_up(struct wil6210_priv *wil)
|
||||
wil_err(wil, "SSID not set\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
wmi_set_ssid(wil, wdev->ssid_len, wdev->ssid);
|
||||
if (channel)
|
||||
wmi_set_channel(wil, channel->hw_value);
|
||||
rc = wmi_set_ssid(wil, wdev->ssid_len, wdev->ssid);
|
||||
if (rc)
|
||||
return rc;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -364,9 +355,12 @@ static int __wil_up(struct wil6210_priv *wil)
|
||||
wmi_set_mac_address(wil, ndev->dev_addr);
|
||||
|
||||
/* Set up beaconing if required. */
|
||||
rc = wmi_set_bcon(wil, bi, wmi_nettype);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (bi > 0) {
|
||||
rc = wmi_pcp_start(wil, bi, wmi_nettype,
|
||||
(channel ? channel->hw_value : 0));
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Rx VRING. After MAC and beacon */
|
||||
wil_rx_init(wil);
|
||||
|
@@ -14,10 +14,7 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "wil6210.h"
|
||||
|
||||
|
@@ -14,10 +14,7 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
@@ -14,10 +14,7 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <net/ieee80211_radiotap.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/moduleparam.h>
|
||||
@@ -558,7 +555,7 @@ int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,
|
||||
if (rc)
|
||||
goto out_free;
|
||||
|
||||
if (reply.cmd.status != WMI_VRING_CFG_SUCCESS) {
|
||||
if (reply.cmd.status != WMI_FW_STATUS_SUCCESS) {
|
||||
wil_err(wil, "Tx config failed, status 0x%02x\n",
|
||||
reply.cmd.status);
|
||||
rc = -EINVAL;
|
||||
|
@@ -21,8 +21,6 @@
|
||||
#include <linux/wireless.h>
|
||||
#include <net/cfg80211.h>
|
||||
|
||||
#include "dbg_hexdump.h"
|
||||
|
||||
#define WIL_NAME "wil6210"
|
||||
|
||||
/**
|
||||
@@ -188,6 +186,7 @@ enum { /* for wil6210_priv.status */
|
||||
wil_status_fwready = 0,
|
||||
wil_status_fwconnected,
|
||||
wil_status_dontscan,
|
||||
wil_status_reset_done,
|
||||
wil_status_irqen, /* FIXME: interrupts enabled - for debug */
|
||||
};
|
||||
|
||||
@@ -210,6 +209,8 @@ struct wil6210_priv {
|
||||
struct wireless_dev *wdev;
|
||||
void __iomem *csr;
|
||||
ulong status;
|
||||
u32 fw_version;
|
||||
u8 n_mids; /* number of additional MIDs as reported by FW */
|
||||
/* profile */
|
||||
u32 monitor_flags;
|
||||
u32 secure_pcp; /* create secure PCP? */
|
||||
@@ -227,7 +228,7 @@ struct wil6210_priv {
|
||||
struct workqueue_struct *wmi_wq; /* for deferred calls */
|
||||
struct work_struct wmi_event_worker;
|
||||
struct workqueue_struct *wmi_wq_conn; /* for connect worker */
|
||||
struct work_struct wmi_connect_worker;
|
||||
struct work_struct connect_worker;
|
||||
struct work_struct disconnect_worker;
|
||||
struct timer_list connect_timer;
|
||||
int pending_connect_cid;
|
||||
@@ -277,13 +278,13 @@ struct wil6210_priv {
|
||||
|
||||
#define wil_hex_dump_txrx(prefix_str, prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii) \
|
||||
wil_print_hex_dump_debug("DBG[TXRX]" prefix_str,\
|
||||
print_hex_dump_debug("DBG[TXRX]" prefix_str,\
|
||||
prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii)
|
||||
|
||||
#define wil_hex_dump_wmi(prefix_str, prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii) \
|
||||
wil_print_hex_dump_debug("DBG[ WMI]" prefix_str,\
|
||||
print_hex_dump_debug("DBG[ WMI]" prefix_str,\
|
||||
prefix_type, rowsize, \
|
||||
groupsize, buf, len, ascii)
|
||||
|
||||
@@ -313,7 +314,6 @@ int wmi_send(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len);
|
||||
void wmi_recv_cmd(struct wil6210_priv *wil);
|
||||
int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
|
||||
u16 reply_id, void *reply, u8 reply_size, int to_msec);
|
||||
void wmi_connect_worker(struct work_struct *work);
|
||||
void wmi_event_worker(struct work_struct *work);
|
||||
void wmi_event_flush(struct wil6210_priv *wil);
|
||||
int wmi_set_ssid(struct wil6210_priv *wil, u8 ssid_len, const void *ssid);
|
||||
@@ -328,6 +328,8 @@ int wmi_add_cipher_key(struct wil6210_priv *wil, u8 key_index,
|
||||
int wmi_echo(struct wil6210_priv *wil);
|
||||
int wmi_set_ie(struct wil6210_priv *wil, u8 type, u16 ie_len, const void *ie);
|
||||
int wmi_rx_chain_add(struct wil6210_priv *wil, struct vring *vring);
|
||||
int wmi_p2p_cfg(struct wil6210_priv *wil, int channel);
|
||||
int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r);
|
||||
|
||||
int wil6210_init_irq(struct wil6210_priv *wil, int irq);
|
||||
void wil6210_fini_irq(struct wil6210_priv *wil, int irq);
|
||||
@@ -341,7 +343,8 @@ struct wireless_dev *wil_cfg80211_init(struct device *dev);
|
||||
void wil_wdev_free(struct wil6210_priv *wil);
|
||||
|
||||
int wmi_set_mac_address(struct wil6210_priv *wil, void *addr);
|
||||
int wmi_set_bcon(struct wil6210_priv *wil, int bi, u8 wmi_nettype);
|
||||
int wmi_pcp_start(struct wil6210_priv *wil, int bi, u8 wmi_nettype, u8 chan);
|
||||
int wmi_pcp_stop(struct wil6210_priv *wil);
|
||||
void wil6210_disconnect(struct wil6210_priv *wil, void *bssid);
|
||||
|
||||
int wil_rx_init(struct wil6210_priv *wil);
|
||||
|
@@ -14,9 +14,6 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_arp.h>
|
||||
|
||||
@@ -272,16 +269,18 @@ static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
struct net_device *ndev = wil_to_ndev(wil);
|
||||
struct wireless_dev *wdev = wil->wdev;
|
||||
struct wmi_ready_event *evt = d;
|
||||
u32 ver = le32_to_cpu(evt->sw_version);
|
||||
wil->fw_version = le32_to_cpu(evt->sw_version);
|
||||
wil->n_mids = evt->numof_additional_mids;
|
||||
|
||||
wil_dbg_wmi(wil, "FW ver. %d; MAC %pM\n", ver, evt->mac);
|
||||
wil_dbg_wmi(wil, "FW ver. %d; MAC %pM; %d MID's\n", wil->fw_version,
|
||||
evt->mac, wil->n_mids);
|
||||
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
memcpy(ndev->dev_addr, evt->mac, ETH_ALEN);
|
||||
memcpy(ndev->perm_addr, evt->mac, ETH_ALEN);
|
||||
}
|
||||
snprintf(wdev->wiphy->fw_version, sizeof(wdev->wiphy->fw_version),
|
||||
"%d", ver);
|
||||
"%d", wil->fw_version);
|
||||
}
|
||||
|
||||
static void wmi_evt_fw_ready(struct wil6210_priv *wil, int id, void *d,
|
||||
@@ -324,17 +323,9 @@ static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
|
||||
if (ieee80211_is_beacon(fc) || ieee80211_is_probe_resp(fc)) {
|
||||
struct cfg80211_bss *bss;
|
||||
u64 tsf = le64_to_cpu(rx_mgmt_frame->u.beacon.timestamp);
|
||||
u16 cap = le16_to_cpu(rx_mgmt_frame->u.beacon.capab_info);
|
||||
u16 bi = le16_to_cpu(rx_mgmt_frame->u.beacon.beacon_int);
|
||||
const u8 *ie_buf = rx_mgmt_frame->u.beacon.variable;
|
||||
size_t ie_len = d_len - offsetof(struct ieee80211_mgmt,
|
||||
u.beacon.variable);
|
||||
wil_dbg_wmi(wil, "Capability info : 0x%04x\n", cap);
|
||||
|
||||
bss = cfg80211_inform_bss(wiphy, channel, rx_mgmt_frame->bssid,
|
||||
tsf, cap, bi, ie_buf, ie_len,
|
||||
signal, GFP_KERNEL);
|
||||
bss = cfg80211_inform_bss_frame(wiphy, channel, rx_mgmt_frame,
|
||||
d_len, signal, GFP_KERNEL);
|
||||
if (bss) {
|
||||
wil_dbg_wmi(wil, "Added BSS %pM\n",
|
||||
rx_mgmt_frame->bssid);
|
||||
@@ -342,6 +333,9 @@ static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
} else {
|
||||
wil_err(wil, "cfg80211_inform_bss() failed\n");
|
||||
}
|
||||
} else {
|
||||
cfg80211_rx_mgmt(wil->wdev, freq, signal,
|
||||
(void *)rx_mgmt_frame, d_len, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -443,7 +437,7 @@ static void wmi_evt_connect(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
memcpy(wil->dst_addr[0], evt->bssid, ETH_ALEN);
|
||||
|
||||
wil->pending_connect_cid = evt->cid;
|
||||
queue_work(wil->wmi_wq_conn, &wil->wmi_connect_worker);
|
||||
queue_work(wil->wmi_wq_conn, &wil->connect_worker);
|
||||
}
|
||||
|
||||
static void wmi_evt_disconnect(struct wil6210_priv *wil, int id,
|
||||
@@ -528,6 +522,37 @@ static void wmi_evt_eapol_rx(struct wil6210_priv *wil, int id,
|
||||
}
|
||||
}
|
||||
|
||||
static void wmi_evt_linkup(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
{
|
||||
struct net_device *ndev = wil_to_ndev(wil);
|
||||
struct wmi_data_port_open_event *evt = d;
|
||||
|
||||
wil_dbg_wmi(wil, "Link UP for CID %d\n", evt->cid);
|
||||
|
||||
netif_carrier_on(ndev);
|
||||
}
|
||||
|
||||
static void wmi_evt_linkdown(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
{
|
||||
struct net_device *ndev = wil_to_ndev(wil);
|
||||
struct wmi_wbe_link_down_event *evt = d;
|
||||
|
||||
wil_dbg_wmi(wil, "Link DOWN for CID %d, reason %d\n",
|
||||
evt->cid, le32_to_cpu(evt->reason));
|
||||
|
||||
netif_carrier_off(ndev);
|
||||
}
|
||||
|
||||
static void wmi_evt_ba_status(struct wil6210_priv *wil, int id, void *d,
|
||||
int len)
|
||||
{
|
||||
struct wmi_vring_ba_status_event *evt = d;
|
||||
|
||||
wil_dbg_wmi(wil, "BACK[%d] %s {%d} timeout %d\n",
|
||||
evt->ringid, evt->status ? "N/A" : "OK", evt->agg_wsize,
|
||||
__le16_to_cpu(evt->ba_timeout));
|
||||
}
|
||||
|
||||
static const struct {
|
||||
int eventid;
|
||||
void (*handler)(struct wil6210_priv *wil, int eventid,
|
||||
@@ -541,6 +566,9 @@ static const struct {
|
||||
{WMI_DISCONNECT_EVENTID, wmi_evt_disconnect},
|
||||
{WMI_NOTIFY_REQ_DONE_EVENTID, wmi_evt_notify},
|
||||
{WMI_EAPOL_RX_EVENTID, wmi_evt_eapol_rx},
|
||||
{WMI_DATA_PORT_OPEN_EVENTID, wmi_evt_linkup},
|
||||
{WMI_WBE_LINKDOWN_EVENTID, wmi_evt_linkdown},
|
||||
{WMI_BA_STATUS_EVENTID, wmi_evt_ba_status},
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -559,6 +587,11 @@ void wmi_recv_cmd(struct wil6210_priv *wil)
|
||||
void __iomem *src;
|
||||
ulong flags;
|
||||
|
||||
if (!test_bit(wil_status_reset_done, &wil->status)) {
|
||||
wil_err(wil, "Reset not completed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
u16 len;
|
||||
|
||||
@@ -683,18 +716,39 @@ int wmi_set_mac_address(struct wil6210_priv *wil, void *addr)
|
||||
return wmi_send(wil, WMI_SET_MAC_ADDRESS_CMDID, &cmd, sizeof(cmd));
|
||||
}
|
||||
|
||||
int wmi_set_bcon(struct wil6210_priv *wil, int bi, u8 wmi_nettype)
|
||||
int wmi_pcp_start(struct wil6210_priv *wil, int bi, u8 wmi_nettype, u8 chan)
|
||||
{
|
||||
struct wmi_bcon_ctrl_cmd cmd = {
|
||||
int rc;
|
||||
|
||||
struct wmi_pcp_start_cmd cmd = {
|
||||
.bcon_interval = cpu_to_le16(bi),
|
||||
.network_type = wmi_nettype,
|
||||
.disable_sec_offload = 1,
|
||||
.channel = chan,
|
||||
};
|
||||
struct {
|
||||
struct wil6210_mbox_hdr_wmi wmi;
|
||||
struct wmi_pcp_started_event evt;
|
||||
} __packed reply;
|
||||
|
||||
if (!wil->secure_pcp)
|
||||
cmd.disable_sec = 1;
|
||||
|
||||
return wmi_send(wil, WMI_BCON_CTRL_CMDID, &cmd, sizeof(cmd));
|
||||
rc = wmi_call(wil, WMI_PCP_START_CMDID, &cmd, sizeof(cmd),
|
||||
WMI_PCP_STARTED_EVENTID, &reply, sizeof(reply), 100);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (reply.evt.status != WMI_FW_STATUS_SUCCESS)
|
||||
rc = -EINVAL;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int wmi_pcp_stop(struct wil6210_priv *wil)
|
||||
{
|
||||
return wmi_call(wil, WMI_PCP_STOP_CMDID, NULL, 0,
|
||||
WMI_PCP_STOPPED_EVENTID, NULL, 0, 20);
|
||||
}
|
||||
|
||||
int wmi_set_ssid(struct wil6210_priv *wil, u8 ssid_len, const void *ssid)
|
||||
@@ -765,6 +819,16 @@ int wmi_get_channel(struct wil6210_priv *wil, int *channel)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wmi_p2p_cfg(struct wil6210_priv *wil, int channel)
|
||||
{
|
||||
struct wmi_p2p_cfg_cmd cmd = {
|
||||
.discovery_mode = WMI_DISCOVERY_MODE_NON_OFFLOAD,
|
||||
.channel = channel - 1,
|
||||
};
|
||||
|
||||
return wmi_send(wil, WMI_P2P_CFG_CMDID, &cmd, sizeof(cmd));
|
||||
}
|
||||
|
||||
int wmi_tx_eapol(struct wil6210_priv *wil, struct sk_buff *skb)
|
||||
{
|
||||
struct wmi_eapol_tx_cmd *cmd;
|
||||
@@ -843,7 +907,7 @@ int wmi_set_ie(struct wil6210_priv *wil, u8 type, u16 ie_len, const void *ie)
|
||||
/* BUG: FW API define ieLen as u8. Will fix FW */
|
||||
cmd->ie_len = cpu_to_le16(ie_len);
|
||||
memcpy(cmd->ie_info, ie, ie_len);
|
||||
rc = wmi_send(wil, WMI_SET_APPIE_CMDID, &cmd, len);
|
||||
rc = wmi_send(wil, WMI_SET_APPIE_CMDID, cmd, len);
|
||||
kfree(cmd);
|
||||
|
||||
return rc;
|
||||
@@ -898,6 +962,31 @@ int wmi_rx_chain_add(struct wil6210_priv *wil, struct vring *vring)
|
||||
return rc;
|
||||
}
|
||||
|
||||
int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r)
|
||||
{
|
||||
int rc;
|
||||
struct wmi_temp_sense_cmd cmd = {
|
||||
.measure_marlon_m_en = cpu_to_le32(!!t_m),
|
||||
.measure_marlon_r_en = cpu_to_le32(!!t_r),
|
||||
};
|
||||
struct {
|
||||
struct wil6210_mbox_hdr_wmi wmi;
|
||||
struct wmi_temp_sense_done_event evt;
|
||||
} __packed reply;
|
||||
|
||||
rc = wmi_call(wil, WMI_TEMP_SENSE_CMDID, &cmd, sizeof(cmd),
|
||||
WMI_TEMP_SENSE_DONE_EVENTID, &reply, sizeof(reply), 100);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (t_m)
|
||||
*t_m = le32_to_cpu(reply.evt.marlon_m_t1000);
|
||||
if (t_r)
|
||||
*t_r = le32_to_cpu(reply.evt.marlon_r_t1000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void wmi_event_flush(struct wil6210_priv *wil)
|
||||
{
|
||||
struct pending_wmi_event *evt, *t;
|
||||
@@ -997,24 +1086,3 @@ void wmi_event_worker(struct work_struct *work)
|
||||
kfree(evt);
|
||||
}
|
||||
}
|
||||
|
||||
void wmi_connect_worker(struct work_struct *work)
|
||||
{
|
||||
int rc;
|
||||
struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
|
||||
wmi_connect_worker);
|
||||
|
||||
if (wil->pending_connect_cid < 0) {
|
||||
wil_err(wil, "No connection pending\n");
|
||||
return;
|
||||
}
|
||||
|
||||
wil_dbg_wmi(wil, "Configure for connection CID %d\n",
|
||||
wil->pending_connect_cid);
|
||||
|
||||
rc = wil_vring_init_tx(wil, 0, WIL6210_TX_RING_SIZE,
|
||||
wil->pending_connect_cid, 0);
|
||||
wil->pending_connect_cid = -1;
|
||||
if (rc == 0)
|
||||
wil_link_on(wil);
|
||||
}
|
||||
|
@@ -36,6 +36,7 @@
|
||||
enum wmi_command_id {
|
||||
WMI_CONNECT_CMDID = 0x0001,
|
||||
WMI_DISCONNECT_CMDID = 0x0003,
|
||||
WMI_DISCONNECT_STA_CMDID = 0x0004,
|
||||
WMI_START_SCAN_CMDID = 0x0007,
|
||||
WMI_SET_BSS_FILTER_CMDID = 0x0009,
|
||||
WMI_SET_PROBED_SSID_CMDID = 0x000a,
|
||||
@@ -44,7 +45,6 @@ enum wmi_command_id {
|
||||
WMI_ADD_CIPHER_KEY_CMDID = 0x0016,
|
||||
WMI_DELETE_CIPHER_KEY_CMDID = 0x0017,
|
||||
WMI_SET_APPIE_CMDID = 0x003f,
|
||||
WMI_GET_APPIE_CMDID = 0x0040,
|
||||
WMI_SET_WSC_STATUS_CMDID = 0x0041,
|
||||
WMI_PXMT_RANGE_CFG_CMDID = 0x0042,
|
||||
WMI_PXMT_SNR2_RANGE_CFG_CMDID = 0x0043,
|
||||
@@ -55,11 +55,11 @@ enum wmi_command_id {
|
||||
WMI_DEEP_ECHO_CMDID = 0x0804,
|
||||
WMI_CONFIG_MAC_CMDID = 0x0805,
|
||||
WMI_CONFIG_PHY_DEBUG_CMDID = 0x0806,
|
||||
WMI_ADD_STATION_CMDID = 0x0807,
|
||||
WMI_ADD_DEBUG_TX_PCKT_CMDID = 0x0808,
|
||||
WMI_PHY_GET_STATISTICS_CMDID = 0x0809,
|
||||
WMI_FS_TUNE_CMDID = 0x080a,
|
||||
WMI_CORR_MEASURE_CMDID = 0x080b,
|
||||
WMI_READ_RSSI_CMDID = 0x080c,
|
||||
WMI_TEMP_SENSE_CMDID = 0x080e,
|
||||
WMI_DC_CALIB_CMDID = 0x080f,
|
||||
WMI_SEND_TONE_CMDID = 0x0810,
|
||||
@@ -75,9 +75,9 @@ enum wmi_command_id {
|
||||
MAC_IO_STATIC_PARAMS_CMDID = 0x081b,
|
||||
MAC_IO_DYNAMIC_PARAMS_CMDID = 0x081c,
|
||||
WMI_SILENT_RSSI_CALIB_CMDID = 0x081d,
|
||||
WMI_RF_RX_TEST_CMDID = 0x081e,
|
||||
WMI_CFG_RX_CHAIN_CMDID = 0x0820,
|
||||
WMI_VRING_CFG_CMDID = 0x0821,
|
||||
WMI_RX_ON_CMDID = 0x0822,
|
||||
WMI_VRING_BA_EN_CMDID = 0x0823,
|
||||
WMI_VRING_BA_DIS_CMDID = 0x0824,
|
||||
WMI_RCP_ADDBA_RESP_CMDID = 0x0825,
|
||||
@@ -87,7 +87,6 @@ enum wmi_command_id {
|
||||
WMI_SET_PCP_CHANNEL_CMDID = 0x0829,
|
||||
WMI_GET_PCP_CHANNEL_CMDID = 0x082a,
|
||||
WMI_SW_TX_REQ_CMDID = 0x082b,
|
||||
WMI_RX_OFF_CMDID = 0x082c,
|
||||
WMI_READ_MAC_RXQ_CMDID = 0x0830,
|
||||
WMI_READ_MAC_TXQ_CMDID = 0x0831,
|
||||
WMI_WRITE_MAC_RXQ_CMDID = 0x0832,
|
||||
@@ -112,6 +111,18 @@ enum wmi_command_id {
|
||||
WMI_FLASH_READ_CMDID = 0x0902,
|
||||
WMI_FLASH_WRITE_CMDID = 0x0903,
|
||||
WMI_SECURITY_UNIT_TEST_CMDID = 0x0904,
|
||||
/*P2P*/
|
||||
WMI_P2P_CFG_CMDID = 0x0910,
|
||||
WMI_PORT_ALLOCATE_CMDID = 0x0911,
|
||||
WMI_PORT_DELETE_CMDID = 0x0912,
|
||||
WMI_POWER_MGMT_CFG_CMDID = 0x0913,
|
||||
WMI_START_LISTEN_CMDID = 0x0914,
|
||||
WMI_START_SEARCH_CMDID = 0x0915,
|
||||
WMI_DISCOVERY_START_CMDID = 0x0916,
|
||||
WMI_DISCOVERY_STOP_CMDID = 0x0917,
|
||||
WMI_PCP_START_CMDID = 0x0918,
|
||||
WMI_PCP_STOP_CMDID = 0x0919,
|
||||
WMI_GET_PCP_FACTOR_CMDID = 0x091b,
|
||||
|
||||
WMI_SET_MAC_ADDRESS_CMDID = 0xf003,
|
||||
WMI_ABORT_SCAN_CMDID = 0xf007,
|
||||
@@ -131,18 +142,6 @@ enum wmi_command_id {
|
||||
* Commands data structures
|
||||
*/
|
||||
|
||||
/*
|
||||
* Frame Types
|
||||
*/
|
||||
enum wmi_mgmt_frame_type {
|
||||
WMI_FRAME_BEACON = 0,
|
||||
WMI_FRAME_PROBE_REQ = 1,
|
||||
WMI_FRAME_PROBE_RESP = 2,
|
||||
WMI_FRAME_ASSOC_REQ = 3,
|
||||
WMI_FRAME_ASSOC_RESP = 4,
|
||||
WMI_NUM_MGMT_FRAME,
|
||||
};
|
||||
|
||||
/*
|
||||
* WMI_CONNECT_CMDID
|
||||
*/
|
||||
@@ -184,7 +183,7 @@ enum wmi_crypto_type {
|
||||
enum wmi_connect_ctrl_flag_bits {
|
||||
WMI_CONNECT_ASSOC_POLICY_USER = 0x0001,
|
||||
WMI_CONNECT_SEND_REASSOC = 0x0002,
|
||||
WMI_CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
|
||||
WMI_CONNECT_IGNORE_WPA_GROUP_CIPHER = 0x0004,
|
||||
WMI_CONNECT_PROFILE_MATCH_DONE = 0x0008,
|
||||
WMI_CONNECT_IGNORE_AAC_BEACON = 0x0010,
|
||||
WMI_CONNECT_CSA_FOLLOW_BSS = 0x0020,
|
||||
@@ -212,6 +211,13 @@ struct wmi_connect_cmd {
|
||||
u8 reserved1[2];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_DISCONNECT_STA_CMDID
|
||||
*/
|
||||
struct wmi_disconnect_sta_cmd {
|
||||
u8 dst_mac[WMI_MAC_LEN];
|
||||
__le16 disconnect_reason;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_RECONNECT_CMDID
|
||||
@@ -289,10 +295,12 @@ struct wmi_delete_cipher_key_cmd {
|
||||
enum wmi_scan_type {
|
||||
WMI_LONG_SCAN = 0,
|
||||
WMI_SHORT_SCAN = 1,
|
||||
WMI_PBC_SCAN = 2,
|
||||
};
|
||||
|
||||
struct wmi_start_scan_cmd {
|
||||
u8 reserved[8];
|
||||
|
||||
__le32 home_dwell_time; /* Max duration in the home channel(ms) */
|
||||
__le32 force_scan_interval; /* Time interval between scans (ms)*/
|
||||
u8 scan_type; /* wmi_scan_type */
|
||||
@@ -309,7 +317,7 @@ struct wmi_start_scan_cmd {
|
||||
/*
|
||||
* WMI_SET_PROBED_SSID_CMDID
|
||||
*/
|
||||
#define MAX_PROBED_SSID_INDEX (15)
|
||||
#define MAX_PROBED_SSID_INDEX (3)
|
||||
|
||||
enum wmi_ssid_flag {
|
||||
WMI_SSID_FLAG_DISABLE = 0, /* disables entry */
|
||||
@@ -328,6 +336,20 @@ struct wmi_probed_ssid_cmd {
|
||||
* WMI_SET_APPIE_CMDID
|
||||
* Add Application specified IE to a management frame
|
||||
*/
|
||||
#define WMI_MAX_IE_LEN (1024)
|
||||
|
||||
/*
|
||||
* Frame Types
|
||||
*/
|
||||
enum wmi_mgmt_frame_type {
|
||||
WMI_FRAME_BEACON = 0,
|
||||
WMI_FRAME_PROBE_REQ = 1,
|
||||
WMI_FRAME_PROBE_RESP = 2,
|
||||
WMI_FRAME_ASSOC_REQ = 3,
|
||||
WMI_FRAME_ASSOC_RESP = 4,
|
||||
WMI_NUM_MGMT_FRAME,
|
||||
};
|
||||
|
||||
struct wmi_set_appie_cmd {
|
||||
u8 mgmt_frm_type; /* enum wmi_mgmt_frame_type */
|
||||
u8 reserved;
|
||||
@@ -335,13 +357,18 @@ struct wmi_set_appie_cmd {
|
||||
u8 ie_info[0];
|
||||
} __packed;
|
||||
|
||||
#define WMI_MAX_IE_LEN (1024)
|
||||
|
||||
/*
|
||||
* WMI_PXMT_RANGE_CFG_CMDID
|
||||
*/
|
||||
struct wmi_pxmt_range_cfg_cmd {
|
||||
u8 dst_mac[WMI_MAC_LEN];
|
||||
__le16 range;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_PXMT_SNR2_RANGE_CFG_CMDID
|
||||
*/
|
||||
struct wmi_pxmt_snr2_range_cfg_cmd {
|
||||
s8 snr2range_arr[WMI_PROX_RANGE_NUM-1];
|
||||
} __packed;
|
||||
@@ -359,6 +386,23 @@ struct wmi_rf_mgmt_cmd {
|
||||
__le32 rf_mgmt_type;
|
||||
} __packed;
|
||||
|
||||
|
||||
/*
|
||||
* WMI_RF_RX_TEST_CMDID
|
||||
*/
|
||||
struct wmi_rf_rx_test_cmd {
|
||||
__le32 sector;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_CORR_MEASURE_CMDID
|
||||
*/
|
||||
struct wmi_corr_measure_cmd {
|
||||
s32 freq_mhz;
|
||||
__le32 length_samples;
|
||||
__le32 iterations;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_SET_SSID_CMDID
|
||||
*/
|
||||
@@ -388,6 +432,74 @@ struct wmi_bcon_ctrl_cmd {
|
||||
u8 disable_sec;
|
||||
} __packed;
|
||||
|
||||
|
||||
/******* P2P ***********/
|
||||
|
||||
/*
|
||||
* WMI_PORT_ALLOCATE_CMDID
|
||||
*/
|
||||
enum wmi_port_role {
|
||||
WMI_PORT_STA = 0,
|
||||
WMI_PORT_PCP = 1,
|
||||
WMI_PORT_AP = 2,
|
||||
WMI_PORT_P2P_DEV = 3,
|
||||
WMI_PORT_P2P_CLIENT = 4,
|
||||
WMI_PORT_P2P_GO = 5,
|
||||
};
|
||||
|
||||
struct wmi_port_allocate_cmd {
|
||||
u8 mac[WMI_MAC_LEN];
|
||||
u8 port_role;
|
||||
u8 midid;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_PORT_DELETE_CMDID
|
||||
*/
|
||||
struct wmi_delete_port_cmd {
|
||||
u8 mid;
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_P2P_CFG_CMDID
|
||||
*/
|
||||
enum wmi_discovery_mode {
|
||||
WMI_DISCOVERY_MODE_NON_OFFLOAD = 0,
|
||||
WMI_DISCOVERY_MODE_OFFLOAD = 1,
|
||||
};
|
||||
|
||||
struct wmi_p2p_cfg_cmd {
|
||||
u8 discovery_mode; /* wmi_discovery_mode */
|
||||
u8 channel;
|
||||
__le16 bcon_interval; /* base to listen/search duration calculation */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_POWER_MGMT_CFG_CMDID
|
||||
*/
|
||||
enum wmi_power_source_type {
|
||||
WMI_POWER_SOURCE_BATTERY = 0,
|
||||
WMI_POWER_SOURCE_OTHER = 1,
|
||||
};
|
||||
|
||||
struct wmi_power_mgmt_cfg_cmd {
|
||||
u8 power_source; /* wmi_power_source_type */
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_PCP_START_CMDID
|
||||
*/
|
||||
struct wmi_pcp_start_cmd {
|
||||
__le16 bcon_interval;
|
||||
u8 reserved0[10];
|
||||
u8 network_type;
|
||||
u8 channel;
|
||||
u8 disable_sec_offload;
|
||||
u8 disable_sec;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_SW_TX_REQ_CMDID
|
||||
*/
|
||||
@@ -435,16 +547,17 @@ enum wmi_vring_cfg_schd_params_priority {
|
||||
WMI_SCH_PRIO_HIGH = 1,
|
||||
};
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
|
||||
struct wmi_vring_cfg {
|
||||
struct wmi_sw_ring_cfg tx_sw_ring;
|
||||
u8 ringid; /* 0-23 vrings */
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 encap_trans_type;
|
||||
@@ -501,8 +614,14 @@ struct wmi_vring_ba_dis_cmd {
|
||||
*/
|
||||
struct wmi_notify_req_cmd {
|
||||
u8 cid;
|
||||
u8 reserved[3];
|
||||
u8 year;
|
||||
u8 month;
|
||||
u8 day;
|
||||
__le32 interval_usec;
|
||||
u8 hour;
|
||||
u8 minute;
|
||||
u8 second;
|
||||
u8 miliseconds;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
@@ -548,6 +667,11 @@ enum wmi_cfg_rx_chain_cmd_nwifi_ds_trans_type {
|
||||
WMI_NWIFI_RX_TRANS_MODE_PBSS2STA = 2,
|
||||
};
|
||||
|
||||
enum wmi_cfg_rx_chain_cmd_reorder_type {
|
||||
WMI_RX_HW_REORDER = 0,
|
||||
WMI_RX_SW_REORDER = 1,
|
||||
};
|
||||
|
||||
struct wmi_cfg_rx_chain_cmd {
|
||||
__le32 action;
|
||||
struct wmi_sw_ring_cfg rx_sw_ring;
|
||||
@@ -596,7 +720,8 @@ struct wmi_cfg_rx_chain_cmd {
|
||||
__le16 wb_thrsh;
|
||||
__le32 itr_value;
|
||||
__le16 host_thrsh;
|
||||
u8 reserved[2];
|
||||
u8 reorder_type;
|
||||
u8 reserved;
|
||||
struct wmi_sniffer_cfg sniffer_cfg;
|
||||
} __packed;
|
||||
|
||||
@@ -604,15 +729,7 @@ struct wmi_cfg_rx_chain_cmd {
|
||||
* WMI_RCP_ADDBA_RESP_CMDID
|
||||
*/
|
||||
struct wmi_rcp_addba_resp_cmd {
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 dialog_token;
|
||||
__le16 status_code;
|
||||
__le16 ba_param_set; /* ieee80211_ba_parameterset field to send */
|
||||
@@ -623,15 +740,7 @@ struct wmi_rcp_addba_resp_cmd {
|
||||
* WMI_RCP_DELBA_CMDID
|
||||
*/
|
||||
struct wmi_rcp_delba_cmd {
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 reserved;
|
||||
__le16 reason;
|
||||
} __packed;
|
||||
@@ -640,15 +749,7 @@ struct wmi_rcp_delba_cmd {
|
||||
* WMI_RCP_ADDBA_REQ_CMDID
|
||||
*/
|
||||
struct wmi_rcp_addba_req_cmd {
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 dialog_token;
|
||||
/* ieee80211_ba_parameterset field as it received */
|
||||
__le16 ba_param_set;
|
||||
@@ -665,7 +766,6 @@ struct wmi_set_mac_address_cmd {
|
||||
u8 reserved[2];
|
||||
} __packed;
|
||||
|
||||
|
||||
/*
|
||||
* WMI_EAPOL_TX_CMDID
|
||||
*/
|
||||
@@ -691,6 +791,17 @@ struct wmi_echo_cmd {
|
||||
__le32 value;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_TEMP_SENSE_CMDID
|
||||
*
|
||||
* Measure MAC and radio temperatures
|
||||
*/
|
||||
struct wmi_temp_sense_cmd {
|
||||
__le32 measure_marlon_m_en;
|
||||
__le32 measure_marlon_r_en;
|
||||
} __packed;
|
||||
|
||||
|
||||
/*
|
||||
* WMI Events
|
||||
*/
|
||||
@@ -699,7 +810,6 @@ struct wmi_echo_cmd {
|
||||
* List of Events (target to host)
|
||||
*/
|
||||
enum wmi_event_id {
|
||||
WMI_IMM_RSP_EVENTID = 0x0000,
|
||||
WMI_READY_EVENTID = 0x1001,
|
||||
WMI_CONNECT_EVENTID = 0x1002,
|
||||
WMI_DISCONNECT_EVENTID = 0x1003,
|
||||
@@ -709,13 +819,9 @@ enum wmi_event_id {
|
||||
WMI_FW_READY_EVENTID = 0x1801,
|
||||
WMI_EXIT_FAST_MEM_ACC_MODE_EVENTID = 0x0200,
|
||||
WMI_ECHO_RSP_EVENTID = 0x1803,
|
||||
WMI_CONFIG_MAC_DONE_EVENTID = 0x1805,
|
||||
WMI_CONFIG_PHY_DEBUG_DONE_EVENTID = 0x1806,
|
||||
WMI_ADD_STATION_DONE_EVENTID = 0x1807,
|
||||
WMI_ADD_DEBUG_TX_PCKT_DONE_EVENTID = 0x1808,
|
||||
WMI_PHY_GET_STATISTICS_EVENTID = 0x1809,
|
||||
WMI_FS_TUNE_DONE_EVENTID = 0x180a,
|
||||
WMI_CORR_MEASURE_DONE_EVENTID = 0x180b,
|
||||
WMI_CORR_MEASURE_EVENTID = 0x180b,
|
||||
WMI_READ_RSSI_EVENTID = 0x180c,
|
||||
WMI_TEMP_SENSE_DONE_EVENTID = 0x180e,
|
||||
WMI_DC_CALIB_DONE_EVENTID = 0x180f,
|
||||
WMI_IQ_TX_CALIB_DONE_EVENTID = 0x1811,
|
||||
@@ -727,10 +833,9 @@ enum wmi_event_id {
|
||||
WMI_MARLON_R_WRITE_DONE_EVENTID = 0x1819,
|
||||
WMI_MARLON_R_TXRX_SEL_DONE_EVENTID = 0x181a,
|
||||
WMI_SILENT_RSSI_CALIB_DONE_EVENTID = 0x181d,
|
||||
|
||||
WMI_RF_RX_TEST_DONE_EVENTID = 0x181e,
|
||||
WMI_CFG_RX_CHAIN_DONE_EVENTID = 0x1820,
|
||||
WMI_VRING_CFG_DONE_EVENTID = 0x1821,
|
||||
WMI_RX_ON_DONE_EVENTID = 0x1822,
|
||||
WMI_BA_STATUS_EVENTID = 0x1823,
|
||||
WMI_RCP_ADDBA_REQ_EVENTID = 0x1824,
|
||||
WMI_ADDBA_RESP_SENT_EVENTID = 0x1825,
|
||||
@@ -738,7 +843,6 @@ enum wmi_event_id {
|
||||
WMI_GET_SSID_EVENTID = 0x1828,
|
||||
WMI_GET_PCP_CHANNEL_EVENTID = 0x182a,
|
||||
WMI_SW_TX_COMPLETE_EVENTID = 0x182b,
|
||||
WMI_RX_OFF_DONE_EVENTID = 0x182c,
|
||||
|
||||
WMI_READ_MAC_RXQ_EVENTID = 0x1830,
|
||||
WMI_READ_MAC_TXQ_EVENTID = 0x1831,
|
||||
@@ -765,7 +869,16 @@ enum wmi_event_id {
|
||||
WMI_UNIT_TEST_EVENTID = 0x1900,
|
||||
WMI_FLASH_READ_DONE_EVENTID = 0x1902,
|
||||
WMI_FLASH_WRITE_DONE_EVENTID = 0x1903,
|
||||
|
||||
/*P2P*/
|
||||
WMI_PORT_ALLOCATED_EVENTID = 0x1911,
|
||||
WMI_PORT_DELETED_EVENTID = 0x1912,
|
||||
WMI_LISTEN_STARTED_EVENTID = 0x1914,
|
||||
WMI_SEARCH_STARTED_EVENTID = 0x1915,
|
||||
WMI_DISCOVERY_STARTED_EVENTID = 0x1916,
|
||||
WMI_DISCOVERY_STOPPED_EVENTID = 0x1917,
|
||||
WMI_PCP_STARTED_EVENTID = 0x1918,
|
||||
WMI_PCP_STOPPED_EVENTID = 0x1919,
|
||||
WMI_PCP_FACTOR_EVENTID = 0x191a,
|
||||
WMI_SET_CHANNEL_EVENTID = 0x9000,
|
||||
WMI_ASSOC_REQ_EVENTID = 0x9001,
|
||||
WMI_EAPOL_RX_EVENTID = 0x9002,
|
||||
@@ -777,6 +890,12 @@ enum wmi_event_id {
|
||||
* Events data structures
|
||||
*/
|
||||
|
||||
|
||||
enum wmi_fw_status {
|
||||
WMI_FW_STATUS_SUCCESS,
|
||||
WMI_FW_STATUS_FAILURE,
|
||||
};
|
||||
|
||||
/*
|
||||
* WMI_RF_MGMT_STATUS_EVENTID
|
||||
*/
|
||||
@@ -857,7 +976,7 @@ struct wmi_ready_event {
|
||||
__le32 abi_version;
|
||||
u8 mac[WMI_MAC_LEN];
|
||||
u8 phy_capability; /* enum wmi_phy_capability */
|
||||
u8 reserved;
|
||||
u8 numof_additional_mids;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
@@ -876,6 +995,8 @@ struct wmi_notify_req_done_event {
|
||||
__le16 other_rx_sector;
|
||||
__le16 other_tx_sector;
|
||||
__le16 range;
|
||||
u8 sqi;
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
@@ -951,27 +1072,15 @@ struct wmi_vring_ba_status_event {
|
||||
* WMI_DELBA_EVENTID
|
||||
*/
|
||||
struct wmi_delba_event {
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 from_initiator;
|
||||
__le16 reason;
|
||||
} __packed;
|
||||
|
||||
|
||||
/*
|
||||
* WMI_VRING_CFG_DONE_EVENTID
|
||||
*/
|
||||
enum wmi_vring_cfg_done_event_status {
|
||||
WMI_VRING_CFG_SUCCESS = 0,
|
||||
WMI_VRING_CFG_FAILURE = 1,
|
||||
};
|
||||
|
||||
struct wmi_vring_cfg_done_event {
|
||||
u8 ringid;
|
||||
u8 status;
|
||||
@@ -982,21 +1091,8 @@ struct wmi_vring_cfg_done_event {
|
||||
/*
|
||||
* WMI_ADDBA_RESP_SENT_EVENTID
|
||||
*/
|
||||
enum wmi_rcp_addba_resp_sent_event_status {
|
||||
WMI_ADDBA_SUCCESS = 0,
|
||||
WMI_ADDBA_FAIL = 1,
|
||||
};
|
||||
|
||||
struct wmi_rcp_addba_resp_sent_event {
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 reserved;
|
||||
__le16 status;
|
||||
} __packed;
|
||||
@@ -1005,15 +1101,7 @@ struct wmi_rcp_addba_resp_sent_event {
|
||||
* WMI_RCP_ADDBA_REQ_EVENTID
|
||||
*/
|
||||
struct wmi_rcp_addba_req_event {
|
||||
|
||||
#define CIDXTID_CID_POS (0)
|
||||
#define CIDXTID_CID_LEN (4)
|
||||
#define CIDXTID_CID_MSK (0xF)
|
||||
#define CIDXTID_TID_POS (4)
|
||||
#define CIDXTID_TID_LEN (4)
|
||||
#define CIDXTID_TID_MSK (0xF0)
|
||||
u8 cidxtid;
|
||||
|
||||
u8 dialog_token;
|
||||
__le16 ba_param_set; /* ieee80211_ba_parameterset as it received */
|
||||
__le16 ba_timeout;
|
||||
@@ -1055,6 +1143,7 @@ struct wmi_data_port_open_event {
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
|
||||
/*
|
||||
* WMI_GET_PCP_CHANNEL_EVENTID
|
||||
*/
|
||||
@@ -1063,6 +1152,54 @@ struct wmi_get_pcp_channel_event {
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
|
||||
/*
|
||||
* WMI_PORT_ALLOCATED_EVENTID
|
||||
*/
|
||||
struct wmi_port_allocated_event {
|
||||
u8 status; /* wmi_fw_status */
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_PORT_DELETED_EVENTID
|
||||
*/
|
||||
struct wmi_port_deleted_event {
|
||||
u8 status; /* wmi_fw_status */
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_LISTEN_STARTED_EVENTID
|
||||
*/
|
||||
struct wmi_listen_started_event {
|
||||
u8 status; /* wmi_fw_status */
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_SEARCH_STARTED_EVENTID
|
||||
*/
|
||||
struct wmi_search_started_event {
|
||||
u8 status; /* wmi_fw_status */
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_PCP_STARTED_EVENTID
|
||||
*/
|
||||
struct wmi_pcp_started_event {
|
||||
u8 status; /* wmi_fw_status */
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_PCP_FACTOR_EVENTID
|
||||
*/
|
||||
struct wmi_pcp_factor_event {
|
||||
__le32 pcp_factor;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_SW_TX_COMPLETE_EVENTID
|
||||
*/
|
||||
@@ -1077,6 +1214,23 @@ struct wmi_sw_tx_complete_event {
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_CORR_MEASURE_EVENTID
|
||||
*/
|
||||
struct wmi_corr_measure_event {
|
||||
s32 i;
|
||||
s32 q;
|
||||
s32 image_i;
|
||||
s32 image_q;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_READ_RSSI_EVENTID
|
||||
*/
|
||||
struct wmi_read_rssi_event {
|
||||
__le32 ina_rssi_adc_dbm;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_GET_SSID_EVENTID
|
||||
*/
|
||||
@@ -1091,7 +1245,8 @@ struct wmi_get_ssid_event {
|
||||
struct wmi_rx_mgmt_info {
|
||||
u8 mcs;
|
||||
s8 snr;
|
||||
__le16 range;
|
||||
u8 range;
|
||||
u8 sqi;
|
||||
__le16 stype;
|
||||
__le16 status;
|
||||
__le32 len;
|
||||
@@ -1113,4 +1268,14 @@ struct wmi_echo_event {
|
||||
__le32 echoed_value;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* WMI_TEMP_SENSE_DONE_EVENTID
|
||||
*
|
||||
* Measure MAC and radio temperatures
|
||||
*/
|
||||
struct wmi_temp_sense_done_event {
|
||||
__le32 marlon_m_t1000;
|
||||
__le32 marlon_r_t1000;
|
||||
} __packed;
|
||||
|
||||
#endif /* __WILOCITY_WMI_H__ */
|
||||
|
Reference in New Issue
Block a user