Skip to content

Commit

Permalink
mt6625l: found position where wlanX is created and fix potential hang
Browse files Browse the repository at this point in the history
[  104.040891] DEBUG: Passed wlanNetRegister 2272 devname:wlan%d
[  104.051938] DEBUG: Passed wlanNetRegister 2281 devname:wlan0 (need to be used everywhere "wlan0" is used)

hang traced:

[   58.771475] DEBUG: Passed wlanNetRegister 2272 devname:wlan%d
[   58.778346] DEBUG: Passed wlanNetRegister 2281 devname:wlan1 (need to be used everywhere "wlan0" is used)
...
[   58.797687] [MTK-WIFI] WIFI_write: WMT turn on WIFI success!
[   58.803489] DEBUG: Passed WIFI_write 467 wlan0 <<<< wrong device
[   58.807973] DEBUG: Passed WIFI_write 479
[   58.811995] DEBUG: Passed WIFI_write 487
[   58.815950] DEBUG: Passed WIFI_write 499
[   58.819897] DEBUG: Passed WIFI_write 528
[   58.823930] DEBUG: Passed WIFI_write 551

pf_set_p2p_mode(netdev, p2pmode) is called for wrong netdev (wlan0 instead of wlan1)

mt6625l: add function for get the last wlanX interface

[   89.046106] [MTK-WIFI] WIFI_write: WIFI_write A
[   89.046106]
[   89.091795] DEBUG: Passed createWirelessDevice 1596
[   89.096727] DEBUG: Passed createWirelessDevice 1614
[   89.101688] DEBUG: Passed createWirelessDevice 1646
[   89.106571] DEBUG: Passed createWirelessDevice 1656 (wiphy_register) (null)
[   89.114116] DEBUG: Passed createWirelessDevice 1662 ((null))
[   89.120539] DEBUG: Passed glP2pCreateWirelessDevice 1254 devname: (null)
[   89.127409] DEBUG: Passed createWirelessDevice 1712 ((null))
[   89.137518] kalFirmwareImageMapping firmware size 225840
[   90.301517] DEBUG: Passed wlanNetRegister 2272 devname:wlan%d
[   90.308382] DEBUG: Passed wlanNetRegister 2281 devname:wlan1 (need to be used everywhere "wlan0" is used)
[   90.318135] [MTK-WIFI] register_set_p2p_mode_handler: (pid 547) register set p2p mode handler b3838a0d
[   90.327674] [MTK-WIFI] WIFI_write: WMT turn on WIFI success!
[   90.333467] DEBUG: Passed get_netdev 194 ifname:wlan0 <<< still wrong because it uses the static "ifname" (disabled copy)
[   90.338542] DEBUG: Passed WIFI_write 485 wlan1 <<<<<<<< but right netdev is used
[   90.343086] DEBUG: Passed WIFI_write 496
[   90.347032] DEBUG: Passed WIFI_write 504
[   90.350980] DEBUG: Passed WIFI_write 516
[   90.355008] DEBUG: Passed WIFI_write 545
[   90.358956] DEBUG: Passed WIFI_write 568
[   90.363546] DEBUG: Passed p2pNetRegister 1111,devname: ap%d
[   90.370330] DEBUG: Passed WIFI_write 575
[   90.374426] [MTK-WIFI] WIFI_write: Set wlan mode 0 --> 1
[   90.379797] DEBUG: Passed WIFI_write 580
[   90.383853] DEBUG: Passed WIFI_write 582
[   90.387803] DEBUG: Passed WIFI_write 588
[   90.391845] DEBUG: Passed WIFI_write 592
[   90.395807] DEBUG: Passed WIFI_write 594
[   90.427766] [MTK-WIFI] WIFI_close: WIFI_close: major 155 minor 0 (pid 541)
  • Loading branch information
frank-w committed Mar 23, 2021
1 parent 2a292a0 commit d978208
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 17 deletions.
Expand Up @@ -75,7 +75,7 @@ enum {
};
static INT32 wlan_mode = WLAN_MODE_HALT;
static INT32 powered;
static INT8 *ifname = WLAN_IFACE_NAME;
static INT8 *ifname = WLAN_IFACE_NAME;//how to get wlan-inteface name created by register_netdev
#if CFG_TC1_FEATURE
volatile INT32 wlan_if_changed = 0;
EXPORT_SYMBOL(wlan_if_changed);
Expand Down Expand Up @@ -178,6 +178,22 @@ do { \
} \
} while (0)

static struct net_device * get_netdev(void)
{
struct net_device *netdev;
char tmpifname[6]="";
int i;

for (i = 9; i>=0; i--) {
snprintf(tmpifname,sizeof(tmpifname),"wlan%d",i);
netdev = dev_get_by_name(&init_net, tmpifname); //crash if wlan1
if (netdev) break;
}
//if (netdev) strcpy(ifname,tmpifname); //causes page fault, maybe type mismatch

return netdev;
}

/*******************************************************************
* WHOLE CHIP RESET PROCEDURE:
*
Expand All @@ -200,7 +216,7 @@ INT32 wifi_reset_start(VOID)
down(&wr_mtx);

if (powered == 1) {
netdev = dev_get_by_name(&init_net, ifname);
netdev = get_netdev();
if (netdev == NULL) {
WIFI_ERR_FUNC("Fail to get %s net device\n", ifname);
} else {
Expand Down Expand Up @@ -257,12 +273,12 @@ INT32 wifi_reset_end(ENUM_RESET_STATUS_T status)
goto done;
}

netdev = dev_get_by_name(&init_net, ifname);
netdev = get_netdev();
while (netdev == NULL && wait_cnt < 10) {
WIFI_ERR_FUNC("Fail to get %s net device, sleep 300ms\n", ifname);
msleep(300);
wait_cnt++;
netdev = dev_get_by_name(&init_net, ifname);
netdev = get_netdev();
}
if (wait_cnt >= 10) {
WIFI_ERR_FUNC("Get %s net device timeout\n", ifname);
Expand Down Expand Up @@ -343,7 +359,7 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff
goto done;
}

netdev = dev_get_by_name(&init_net, ifname);
netdev = get_netdev();
if (netdev == NULL) {
WIFI_ERR_FUNC("Fail to get %s net device\n", ifname);
} else {
Expand Down Expand Up @@ -463,25 +479,24 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff
goto done;
}

netdev = dev_get_by_name(&init_net, ifname);
netdev = get_netdev();//dev_get_by_name(&init_net, ifname);//maybe this is the problem as ifname is fixed to wlan0 (WLAN_IFACE_NAME)
printk(KERN_ALERT "DEBUG: Passed %s %d %s\n",__FUNCTION__,__LINE__,netdev->name);
while (netdev == NULL && wait_cnt < 10) {
WIFI_ERR_FUNC("Fail to get %s net device, sleep 300ms\n", ifname);
msleep(300);
wait_cnt++;
netdev = dev_get_by_name(&init_net, ifname);
netdev = get_netdev();
}
if (wait_cnt >= 10) {
WIFI_ERR_FUNC("Get %s net device timeout\n", ifname);
goto done;
}

if ((wlan_mode == WLAN_MODE_STA_P2P && (local[0] == 'S' || local[0] == 'P')) ||
(wlan_mode == WLAN_MODE_AP && (local[0] == 'A'))) {
WIFI_INFO_FUNC("WIFI is already in mode %d!\n", wlan_mode);
retval = count;
goto done;
}

if ((wlan_mode == WLAN_MODE_AP && (local[0] == 'S' || local[0] == 'P')) ||
(wlan_mode == WLAN_MODE_STA_P2P && (local[0] == 'A'))) {
p2pmode.u4Enable = 0;
Expand Down Expand Up @@ -539,7 +554,7 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff
#endif
p2pmode.u4Enable = 1;
p2pmode.u4Mode = 1;
if (pf_set_p2p_mode(netdev, p2pmode) != 0) {
if (pf_set_p2p_mode(netdev, p2pmode) != 0) { //hangs if interface not bound to this driver
WIFI_ERR_FUNC("Set wlan mode fail\n");
} else {
WIFI_INFO_FUNC("Set wlan mode %d --> %d\n", wlan_mode, WLAN_MODE_AP);
Expand Down
Expand Up @@ -1131,6 +1131,7 @@ BOOLEAN kalInitBowDevice(IN P_GLUE_INFO_T prGlueInfo, IN const char *prDevName)
#if (MTK_WCN_HIF_SDIO == 0)
SET_NETDEV_DEV(prGlueInfo->rBowInfo.prDevHandler, prHif->Dev);
#endif
printk(KERN_ALERT "DEBUG: Passed %s %d devname:%s\n",__FUNCTION__,__LINE__,prDevName);
register_netdev(prGlueInfo->rBowInfo.prDevHandler);
/* 2. net device initialize */
netif_carrier_off(prGlueInfo->rBowInfo.prDevHandler);
Expand Down
15 changes: 11 additions & 4 deletions drivers/misc/mediatek/connectivity/wlan/gen2/os/linux/gl_init.c
Expand Up @@ -667,9 +667,9 @@
* E X T E R N A L R E F E R E N C E S
********************************************************************************
*/
#include "gl_os.h"
#include "gl_os.h" //also in gl_kal.c //drivers/misc/mediatek/connectivity/wlan/gen2/os/linux/include/gl_os.h
#include "wlan_lib.h"
#include "gl_wext.h"
#include "gl_wext.h" //also in gl_kal.c
#include "gl_cfg80211.h"
#include "precomp.h"
#if CFG_SUPPORT_AGPS_ASSIST
Expand Down Expand Up @@ -1593,7 +1593,6 @@ static void createWirelessDevice(void)
#if CFG_SUPPORT_PERSIST_NETDEV
struct net_device *prNetDev = NULL;
#endif

/* <1.1> Create wireless_dev */
prWdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
if (!prWdev) {
Expand Down Expand Up @@ -2259,13 +2258,19 @@ static INT_32 wlanNetRegister(struct wireless_dev *prWdev)
}

#if !CFG_SUPPORT_PERSIST_NETDEV
//struct net_device *alloc_netdev_mqs( /net/core/dev.c )
//netdev name is done register_netdevice with dev_get_valid_name => __dev_alloc_name (return int) and written to dev->name
//https://elixir.bootlin.com/linux/latest/source/net/core/dev.c#L1197
printk(KERN_ALERT "DEBUG: Passed %s %d devname:%s\n",__FUNCTION__,__LINE__,prWdev->netdev->name);//wlan%s
if (register_netdev(prWdev->netdev) < 0) {
DBGLOG(INIT, ERROR, "wlanNetRegister: net_device context is not registered.\n");

wiphy_unregister(prWdev->wiphy);
wlanClearDevIdx(prWdev->netdev);
i4DevIdx = -1;
}
break;
} else
printk(KERN_ALERT "DEBUG: Passed %s %d devname:%s (need to be used everywhere \"wlan0\" is used)\n",__FUNCTION__,__LINE__,prWdev->netdev->name); //wlan0, driver->name causes null pointer dereference
#endif
if (i4DevIdx != -1)
prGlueInfo->fgIsRegistered = TRUE;
Expand Down Expand Up @@ -2842,6 +2847,7 @@ static void set_dbg_level_handler(unsigned char dbg_lvl[DBG_MODULE_NUM])
static INT_32 wlanProbe(PVOID pvData)
{
struct wireless_dev *prWdev = NULL;
//maybe define wireless_dev static global
enum probe_fail_reason {
BUS_INIT_FAIL,
NET_CREATE_FAIL,
Expand All @@ -2859,6 +2865,7 @@ static INT_32 wlanProbe(PVOID pvData)
BOOLEAN bRet = FALSE;

eFailReason = FAIL_REASON_NUM;

do {
/* 4 <1> Initialize the IO port of the interface */
/* GeorgeKuo: pData has different meaning for _HIF_XXX:
Expand Down
Expand Up @@ -4369,7 +4369,8 @@ int kalMetInitProcfs(IN P_GLUE_INFO_T prGlueInfo)
/*
* Directory: Root (/proc/net/wlan0)
*/
pMetProcDir = proc_mkdir("wlan0", init_net.proc_net);
//how to read interface-name from drivers/misc/mediatek/connectivity/wlan/gen2/os/linux/gl_init.c??
pMetProcDir = proc_mkdir("wlan_ap", init_net.proc_net);
if (pMetProcDir == NULL)
return -ENOENT;
/*
Expand All @@ -4396,7 +4397,7 @@ int kalMetRemoveProcfs(void)
remove_proc_entry(PROC_MET_PROF_CTRL, pMetProcDir);
remove_proc_entry(PROC_MET_PROF_PORT, pMetProcDir);
/* remove root directory (proc/net/wlan0) */
remove_proc_entry("wlan0", init_net.proc_net);
remove_proc_entry("wlan_ap", init_net.proc_net);
/* clear MetGlobalData */
pMetGlobalData = NULL;

Expand Down
Expand Up @@ -1108,7 +1108,7 @@ BOOLEAN p2pNetRegister(P_GLUE_INFO_T prGlueInfo, BOOLEAN fgIsRtnlLockAcquired)
/* net device initialize */
netif_carrier_off(prGlueInfo->prP2PInfo->prDevHandler);
netif_tx_stop_all_queues(prGlueInfo->prP2PInfo->prDevHandler);

printk(KERN_ALERT "DEBUG: Passed %s %d,devname: %s\n",__FUNCTION__,__LINE__,prGlueInfo->prP2PInfo->prDevHandler->name);//is called (with name ap%s)!!
/* register for net device */
if (register_netdev(prGlueInfo->prP2PInfo->prDevHandler) < 0) {
DBGLOG(P2P, WARN, "unable to register netdevice for p2p\n");
Expand Down

0 comments on commit d978208

Please sign in to comment.