BigW Consortium Gitlab

Commit 36d344b1 by David Clark

MT7697 WiFi driver now works w/o any code updates to wpa-supplicant

parent 0a75741c
......@@ -18,7 +18,7 @@
#define _MT7697_CORE_H_
#include <net/cfg80211.h>
#include <net/iw_handler.h> /* New driver API */
#include "wifi_api.h"
#include "wmi.h"
......@@ -107,12 +107,11 @@ struct mt7697_cfg80211_info {
enum mt7697_wifi_phy_mode_t wireless_mode;
enum mt7697_wifi_phy_mode_t hw_wireless_mode;
struct mac_address mac_addr;
struct mt7697_wifi_config_t wifi_config;
struct mt7697_wifi_config_t wifi_cfg;
int listen_interval;
enum mt7697_wifi_rx_filter_t rx_filter;
u8 smart_conn_filter;
u8 reg_rx_hndlr;
u8 psk[MT7697_PASSPHRASE_LEN];
struct list_head vif_list;
spinlock_t vif_list_lock;
......@@ -140,6 +139,7 @@ struct mt7697_vif {
struct wireless_dev wdev;
struct net_device *ndev;
struct mt7697_cfg80211_info *cfg;
struct iw_public_data wireless_data;
/* Lock to protect vif specific net_stats and flags */
spinlock_t if_lock;
......@@ -150,6 +150,7 @@ struct mt7697_vif {
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 bssid[ETH_ALEN];
u8 req_bssid[ETH_ALEN];
u8 pmk[MT7697_WIFI_LENGTH_PMK];
u16 ch_hint;
struct work_struct disconnect_work;
......
/*
* Copyright (c) 2017 Sierra Wireless Corporation
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _MT7697_IOCTL_H_
#define _MT7697_IOCTL_H_
#include <net/iw_handler.h> /* New driver API */
#define SUPPORTED_WIRELESS_EXT 19
extern const struct iw_handler_def mt7697_wireless_hndlrs;
#endif
......@@ -20,6 +20,7 @@
#include <net/cfg80211.h>
#include "queue_i.h"
#include "common.h"
#include "ioctl.h"
#include "core.h"
#include "cfg80211.h"
......@@ -166,14 +167,6 @@ static void mt7697_init_hw_start(struct work_struct *work)
goto failed;
}
err = mt7697_wr_get_psk_req(cfg, MT7697_PORT_STA);
if (err < 0) {
dev_err(cfg->dev,
"%s(): mt7697_wr_get_psk_req() failed(%d)\n",
__func__, err);
goto failed;
}
err = mt7697_wr_mac_addr_req(cfg, MT7697_PORT_STA);
if (err < 0) {
dev_err(cfg->dev,
......@@ -195,13 +188,15 @@ static const struct net_device_ops mt7697_netdev_ops = {
.ndo_set_rx_mode = mt7697_set_multicast_list,
};
void mt7697_init_netdev(struct net_device *dev)
void mt7697_init_netdev(struct net_device *ndev)
{
dev->netdev_ops = &mt7697_netdev_ops;
dev->destructor = free_netdev;
dev->watchdog_timeo = MT7697_TX_TIMEOUT;
dev->needed_headroom = sizeof(struct ieee80211_hdr) + sizeof(struct mt7697_llc_snap_hdr);
dev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
ndev->netdev_ops = &mt7697_netdev_ops;
ndev->wireless_handlers = &mt7697_wireless_hndlrs;
ndev->destructor = free_netdev;
ndev->watchdog_timeo = MT7697_TX_TIMEOUT;
ndev->needed_headroom = sizeof(struct ieee80211_hdr) +
sizeof(struct mt7697_llc_snap_hdr);
ndev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
}
static const struct mt7697q_if_ops if_ops = {
......@@ -371,15 +366,15 @@ int mt7697_disconnect(struct mt7697_vif *vif)
if (test_bit(CONNECTED, &vif->flags) ||
test_bit(CONNECT_PEND, &vif->flags)) {
if (vif->cfg->reg_rx_hndlr) {
ret = mt7697_wr_set_op_mode_req(vif->cfg,
vif->cfg->wifi_config.opmode);
/* ret = mt7697_wr_set_op_mode_req(vif->cfg,
vif->cfg->wifi_cfg.opmode);
if (ret < 0) {
dev_err(vif->cfg->dev,
"%s(): mt7697_wr_set_op_mode_req() failed(%d)\n",
__func__, ret);
goto failed;
}
*/
ret = mt7697_wr_unreg_rx_hndlr_req(vif->cfg);
if (ret < 0) {
dev_err(vif->cfg->dev,
......
......@@ -4,10 +4,13 @@ sources:
cfg80211.c
main.c
txrx.c
ioctl.c
}
cflags:
{
-DDEBUG
-DCONFIG_WIRELESS_EXT
-DCONFIG_CFG80211_WEXT
-I$MANGOH_ROOT/linux_kernel_modules/mt7697q
}
......@@ -8,11 +8,10 @@
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp
mt_wifi_start() {
# insmod /tmp/spisvc.ko || exit 127
lsmod | grep spi-cp2130 >/dev/null
# TODO figure way to only call echo command once
lsmod | grep 0-cp2130 >/dev/null
if [ $? -eq 1 ]; then
insmod /tmp/spi-cp2130.ko || exit 127
for f in `ls -d /sys/class/gpio/gpiochip*`; do echo $f `cat $f/label $f/base $f/ngpio` ; done
insmod /tmp/0-cp2130.ko || exit 127
echo -n 0,2,-1,0,0,1,0,0,0,0,0,mt7697 > /sys/devices/platform/msm_hsic_host/usb1/1-1/1-1.1/1-1.1:1.0/channel_config
fi
......
......@@ -82,7 +82,7 @@ cleanup:
}
static void mt7697_ethernet_to_80211(struct sk_buff *skb,
struct net_device *ndev)
struct net_device *ndev)
{
struct ieee80211_hdr hdr;
struct mt7697_cfg80211_info *cfg = mt7697_priv(ndev);
......@@ -94,26 +94,26 @@ static void mt7697_ethernet_to_80211(struct sk_buff *skb,
__le16 fc;
u16 hdrlen;
dev_dbg(cfg->dev, "%s(): Tx 802.3 Frame len(%u)\n", __func__, skb->len);
dev_dbg(cfg->dev, "%s(): Tx 802.3 Frame len(%u)\n",
__func__, skb->len);
print_hex_dump(KERN_DEBUG, DRVNAME" 802.3 Frame ", DUMP_PREFIX_OFFSET,
16, 1, skb->data, skb->len, 0);
fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA);
// fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
/* DA BSSID SA */
hdr.frame_control = fc;
hdr.duration_id = 0;
// memcpy(hdr.addr1, eth_hdr->h_dest, ETH_ALEN);
// memcpy(hdr.addr2, vif->bssid, ETH_ALEN);
// memcpy(hdr.addr3, eth_hdr->h_source, ETH_ALEN);
memcpy(hdr.addr1, vif->bssid, ETH_ALEN);
memcpy(hdr.addr2, eth_hdr->h_source, ETH_ALEN);
memcpy(hdr.addr3, eth_hdr->h_dest, ETH_ALEN);
memcpy(hdr.addr1, vif->bssid, ETH_ALEN);
memcpy(hdr.addr2, eth_hdr->h_source, ETH_ALEN);
memcpy(hdr.addr3, eth_hdr->h_dest, ETH_ALEN);
hdr.seq_ctrl = 0;
hdrlen = sizeof(struct ieee80211_hdr_3addr);
datap = skb_push(skb, hdrlen + sizeof(struct mt7697_llc_snap_hdr) - sizeof(struct ethhdr));
datap = skb_push(skb, hdrlen +
sizeof(struct mt7697_llc_snap_hdr) -
sizeof(struct ethhdr));
memcpy(datap, &hdr, hdrlen);
llc_hdr = (struct mt7697_llc_snap_hdr*)(datap + hdrlen);
......@@ -127,8 +127,8 @@ memcpy(hdr.addr3, eth_hdr->h_dest, ETH_ALEN);
dev_dbg(cfg->dev, "%s(): Tx 802.11 Frame len(%u)\n",
__func__, skb->len);
print_hex_dump(KERN_DEBUG, DRVNAME" <-- Tx 802.11 Frame ", DUMP_PREFIX_OFFSET,
16, 1, skb->data, skb->len, 0);
print_hex_dump(KERN_DEBUG, DRVNAME" <-- Tx 802.11 Frame ",
DUMP_PREFIX_OFFSET, 16, 1, skb->data, skb->len, 0);
}
int mt7697_data_tx(struct sk_buff *skb, struct net_device *ndev)
......
......@@ -35,6 +35,7 @@
#define mt7697_scan_stop mt7697q_cmd_hdr
#define mt7697_register_rx_hndlr_req mt7697q_cmd_hdr
#define mt7697_unregister_rx_hndlr_req mt7697q_cmd_hdr
#define mt7697_reload_settings_req mt7697q_cmd_hdr
#define mt7697_set_wireless_mode_rsp mt7697q_rsp_hdr
#define mt7697_set_radio_state_rsp mt7697q_rsp_hdr
......@@ -42,11 +43,15 @@
#define mt7697_set_rx_filter_rsp mt7697q_rsp_hdr
#define mt7697_set_smart_conn_filter_rsp mt7697q_rsp_hdr
#define mt7697_set_listen_interval_rsp mt7697q_rsp_hdr
#define mt7697_set_psk_rsp mt7697q_rsp_hdr
#define mt7697_set_pmk_rsp mt7697q_rsp_hdr
#define mt7697_set_channel_rsp mt7697q_rsp_hdr
#define mt7697_set_bssid_rsp mt7697q_rsp_hdr
#define mt7697_set_ssid_rsp mt7697q_rsp_hdr
#define mt7697_set_security_mode_rsp mt7697q_rsp_hdr
#define mt7697_scan_stop_rsp mt7697q_rsp_hdr
#define mt7697_register_rx_hndlr_rsp mt7697q_rsp_hdr
#define mt7697_unregister_rx_hndlr_rsp mt7697q_rsp_hdr
#define mt7697_reload_settings_rsp mt7697q_rsp_hdr
#define mt7697_disconnect_rsp mt7697q_rsp_hdr
enum mt7697_connect_ctrl_flags_bits {
......@@ -102,13 +107,17 @@ enum mt7697_wifi_cmd_types {
MT7697_CMD_SCAN_COMPLETE_IND,
MT7697_CMD_SCAN_STOP,
MT7697_CMD_SCAN_STOP_RSP,
MT7697_CMD_GET_PSK_REQ,
MT7697_CMD_GET_PSK_RSP,
MT7697_CMD_SET_PSK_REQ,
MT7697_CMD_SET_PSK_RSP,
MT7697_CMD_SET_PMK_REQ,
MT7697_CMD_SET_PMK_RSP,
MT7697_CMD_SET_CHANNEL_REQ,
MT7697_CMD_SET_CHANNEL_RSP,
MT7697_CMD_SET_BSSID_REQ,
MT7697_CMD_SET_BSSID_RSP,
MT7697_CMD_SET_SSID_REQ,
MT7697_CMD_SET_SSID_RSP,
MT7697_CMD_RELOAD_SETTINGS_REQ,
MT7697_CMD_RELOAD_SETTINGS_RSP,
MT7697_CMD_CONNECT_IND,
MT7697_CMD_CONNECT_REQ,
MT7697_CMD_CONNECT_RSP,
MT7697_CMD_DISCONNECT_IND,
MT7697_CMD_DISCONNECT_REQ,
MT7697_CMD_DISCONNECT_RSP,
......@@ -223,22 +232,28 @@ struct mt7697_scan_complete_ind {
__be32 if_idx;
} __attribute__((packed, aligned(4)));
struct mt7697_get_psk_req {
struct mt7697_set_pmk_req {
struct mt7697q_cmd_hdr cmd;
__be32 port;
u8 pmk[LEN32_ALIGNED(MT7697_WIFI_LENGTH_PMK)];
} __attribute__((packed, aligned(4)));
struct mt7697_get_psk_rsp {
struct mt7697q_rsp_hdr rsp;
__be32 len;
u8 psk[LEN32_ALIGNED(MT7697_PASSPHRASE_LEN)];
struct mt7697_set_channel_req {
struct mt7697q_cmd_hdr cmd;
__be32 port;
__be32 ch;
} __attribute__((packed, aligned(4)));
struct mt7697_set_psk_req {
struct mt7697_set_bssid_req {
struct mt7697q_cmd_hdr cmd;
u8 bssid[LEN32_ALIGNED(ETH_ALEN)];
} __attribute__((packed, aligned(4)));
struct mt7697_set_ssid_req {
struct mt7697q_cmd_hdr cmd;
__be32 port;
__be32 len;
u8 psk[LEN32_ALIGNED(MT7697_PASSPHRASE_LEN)];
u8 ssid[LEN32_ALIGNED(IEEE80211_MAX_SSID_LEN)];
} __attribute__((packed, aligned(4)));
struct mt7697_set_security_mode_req {
......@@ -261,16 +276,6 @@ struct mt7697_get_security_mode_rsp {
__be32 encrypt_type;
} __attribute__((packed, aligned(4)));
struct mt7697_connect_req {
struct mt7697q_cmd_hdr cmd;
__be32 if_idx;
__be32 port;
__be32 channel;
u8 bssid[LEN32_ALIGNED(ETH_ALEN)];
__be32 ssid_len;
u8 ssid[LEN32_ALIGNED(IEEE80211_MAX_SSID_LEN)];
} __attribute__((packed, aligned(4)));
struct mt7697_connect_ind {
struct mt7697q_rsp_hdr rsp;
__be32 if_idx;
......@@ -278,12 +283,6 @@ struct mt7697_connect_ind {
u8 bssid[LEN32_ALIGNED(ETH_ALEN)];
} __attribute__((packed, aligned(4)));
struct mt7697_connect_rsp {
struct mt7697q_rsp_hdr rsp;
__be32 if_idx;
u8 bssid[LEN32_ALIGNED(ETH_ALEN)];
} __attribute__((packed, aligned(4)));
struct mt7697_disconnect_req {
struct mt7697q_cmd_hdr cmd;
__be32 if_idx;
......@@ -313,8 +312,11 @@ int mt7697_wr_reset(struct mt7697_cfg80211_info*);
int mt7697_wr_set_wireless_mode_req(struct mt7697_cfg80211_info*, u8, u8);
int mt7697_wr_get_wireless_mode_req(struct mt7697_cfg80211_info*, u8);
int mt7697_wr_get_psk_req(struct mt7697_cfg80211_info*, u8);
int mt7697_wr_set_psk_req(struct mt7697_cfg80211_info*, u8, const u8[]);
int mt7697_wr_set_pmk_req(struct mt7697_cfg80211_info*, u8, const u8[MT7697_WIFI_LENGTH_PMK]);
int mt7697_wr_set_channel_req(struct mt7697_cfg80211_info*, u8, u8);
int mt7697_wr_set_bssid_req(struct mt7697_cfg80211_info*, const u8[ETH_ALEN]);
int mt7697_wr_set_ssid_req(struct mt7697_cfg80211_info*, u8, u8, const u8[]);
int mt7697_wr_reload_settings_req(struct mt7697_cfg80211_info*);
int mt7697_wr_mac_addr_req(struct mt7697_cfg80211_info*, u8);
int mt7697_wr_cfg_req(struct mt7697_cfg80211_info*);
int mt7697_wr_reg_rx_hndlr_req(struct mt7697_cfg80211_info*);
......@@ -333,8 +335,6 @@ int mt7697_wr_scan_req(struct mt7697_cfg80211_info*, u32,
int mt7697_wr_set_security_mode_req(struct mt7697_cfg80211_info*, u8, u8, u8);
int mt7697_wr_get_security_mode_req(struct mt7697_cfg80211_info*, u32, u8);
int mt7697_wr_scan_stop_req(struct mt7697_cfg80211_info*);
int mt7697_wr_connect_req(struct mt7697_cfg80211_info*,
u8, u32, const u8*, const u8*, u32, u32);
int mt7697_wr_disconnect_req(struct mt7697_cfg80211_info*, u32, const u8*);
int mt7697_wr_tx_raw_packet(struct mt7697_cfg80211_info*, const u8*, u32);
int mt7697_proc_data(void*);
......
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