123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571 |
- From 537f98362192d5812c1192e5707f3151307ae062 Mon Sep 17 00:00:00 2001
- From: Chuhong Yuan <hslester96@gmail.com>
- Date: Wed, 24 Jul 2019 19:27:45 +0800
- Subject: [PATCH] mwifiex: pcie: Use dev_get_drvdata
- Instead of using to_pci_dev + pci_get_drvdata,
- use dev_get_drvdata to make code simpler.
- Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
- Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
- (cherry picked from commit ffa4d78cbc2644b4867b8129b3fbb5ddcdfcdba2)
- Reason for cherry-picking this commit:
- to avoid conflicts when backporting incoming commits
- Signed-off-by: Tsuchiya Yuto (kitakar5525) <kitakar@gmail.com>
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 8 ++------
- 1 file changed, 2 insertions(+), 6 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 2f0141c964e2..a822f8524737 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -150,10 +150,8 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
- static int mwifiex_pcie_suspend(struct device *dev)
- {
- struct mwifiex_adapter *adapter;
- - struct pcie_service_card *card;
- - struct pci_dev *pdev = to_pci_dev(dev);
- + struct pcie_service_card *card = dev_get_drvdata(dev);
-
- - card = pci_get_drvdata(pdev);
-
- /* Might still be loading firmware */
- wait_for_completion(&card->fw_done);
- @@ -195,10 +193,8 @@ static int mwifiex_pcie_suspend(struct device *dev)
- static int mwifiex_pcie_resume(struct device *dev)
- {
- struct mwifiex_adapter *adapter;
- - struct pcie_service_card *card;
- - struct pci_dev *pdev = to_pci_dev(dev);
- + struct pcie_service_card *card = dev_get_drvdata(dev);
-
- - card = pci_get_drvdata(pdev);
-
- if (!card->adapter) {
- dev_err(dev, "adapter structure is not valid\n");
- --
- 2.33.0
- From 08e679300b1d7825da5667bc8d1bbd024d64adaf Mon Sep 17 00:00:00 2001
- From: Tsuchiya Yuto <kitakar@gmail.com>
- Date: Mon, 28 Sep 2020 17:46:49 +0900
- Subject: [PATCH] mwifiex: pcie: add DMI-based quirk impl for Surface devices
- This commit adds quirk implementation based on DMI matching with DMI
- table for Surface devices.
- This implementation can be used for quirks later.
- Signed-off-by: Tsuchiya Yuto <kitakar@gmail.com>
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/Makefile | 1 +
- drivers/net/wireless/marvell/mwifiex/pcie.c | 4 +
- drivers/net/wireless/marvell/mwifiex/pcie.h | 1 +
- .../wireless/marvell/mwifiex/pcie_quirks.c | 114 ++++++++++++++++++
- .../wireless/marvell/mwifiex/pcie_quirks.h | 11 ++
- 5 files changed, 131 insertions(+)
- create mode 100644 drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- create mode 100644 drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- diff --git a/drivers/net/wireless/marvell/mwifiex/Makefile b/drivers/net/wireless/marvell/mwifiex/Makefile
- index fdfd9bf15ed4..8a1e7c5b9c6e 100644
- --- a/drivers/net/wireless/marvell/mwifiex/Makefile
- +++ b/drivers/net/wireless/marvell/mwifiex/Makefile
- @@ -49,6 +49,7 @@ mwifiex_sdio-y += sdio.o
- obj-$(CONFIG_MWIFIEX_SDIO) += mwifiex_sdio.o
-
- mwifiex_pcie-y += pcie.o
- +mwifiex_pcie-y += pcie_quirks.o
- obj-$(CONFIG_MWIFIEX_PCIE) += mwifiex_pcie.o
-
- mwifiex_usb-y += usb.o
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index a822f8524737..9d12a0b726a3 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -27,6 +27,7 @@
- #include "wmm.h"
- #include "11n.h"
- #include "pcie.h"
- +#include "pcie_quirks.h"
-
- #define PCIE_VERSION "1.0"
- #define DRV_NAME "Marvell mwifiex PCIe"
- @@ -261,6 +262,9 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
- return ret;
- }
-
- + /* check quirks */
- + mwifiex_initialize_quirks(card);
- +
- if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
- MWIFIEX_PCIE, &pdev->dev)) {
- pr_err("%s failed\n", __func__);
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.h b/drivers/net/wireless/marvell/mwifiex/pcie.h
- index 72d0c01ff359..f7e968306a0c 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.h
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.h
- @@ -393,6 +393,7 @@ struct pcie_service_card {
- unsigned long work_flags;
-
- bool pci_reset_ongoing;
- + unsigned long quirks;
- };
-
- static inline int
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- new file mode 100644
- index 000000000000..929aee2b0a60
- --- /dev/null
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- @@ -0,0 +1,114 @@
- +// SPDX-License-Identifier: GPL-2.0
- +/*
- + * File for PCIe quirks.
- + */
- +
- +/* The low-level PCI operations will be performed in this file. Therefore,
- + * let's use dev_*() instead of mwifiex_dbg() here to avoid troubles (e.g.
- + * to avoid using mwifiex_adapter struct before init or wifi is powered
- + * down, or causes NULL ptr deref).
- + */
- +
- +#include <linux/dmi.h>
- +
- +#include "pcie_quirks.h"
- +
- +/* quirk table based on DMI matching */
- +static const struct dmi_system_id mwifiex_quirk_table[] = {
- + {
- + .ident = "Surface Pro 4",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 4"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Pro 5",
- + .matches = {
- + /* match for SKU here due to generic product name "Surface Pro" */
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1796"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Pro 5 (LTE)",
- + .matches = {
- + /* match for SKU here due to generic product name "Surface Pro" */
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1807"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Pro 6",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 6"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Book 1",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Book 2",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book 2"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Laptop 1",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Laptop 2",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop 2"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface 3",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface 3"),
- + },
- + .driver_data = 0,
- + },
- + {
- + .ident = "Surface Pro 3",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 3"),
- + },
- + .driver_data = 0,
- + },
- + {}
- +};
- +
- +void mwifiex_initialize_quirks(struct pcie_service_card *card)
- +{
- + struct pci_dev *pdev = card->dev;
- + const struct dmi_system_id *dmi_id;
- +
- + dmi_id = dmi_first_match(mwifiex_quirk_table);
- + if (dmi_id)
- + card->quirks = (uintptr_t)dmi_id->driver_data;
- +
- + if (!card->quirks)
- + dev_info(&pdev->dev, "no quirks enabled\n");
- +}
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- new file mode 100644
- index 000000000000..5326ae7e5671
- --- /dev/null
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- @@ -0,0 +1,11 @@
- +/* SPDX-License-Identifier: GPL-2.0 */
- +/*
- + * Header file for PCIe quirks.
- + */
- +
- +#include "pcie.h"
- +
- +/* quirks */
- +// quirk flags can be added here
- +
- +void mwifiex_initialize_quirks(struct pcie_service_card *card);
- --
- 2.33.0
- From 663283113cc8744300c2113b7e1777ba57da49be Mon Sep 17 00:00:00 2001
- From: Tsuchiya Yuto <kitakar@gmail.com>
- Date: Tue, 29 Sep 2020 17:25:22 +0900
- Subject: [PATCH] mwifiex: pcie: add reset_d3cold quirk for Surface gen4+
- devices
- To reset mwifiex on Surface gen4+ (Pro 4 or later gen) devices, it
- seems that putting the wifi device into D3cold is required according
- to errata.inf file on Windows installation (Windows/INF/errata.inf).
- This patch adds a function that performs power-cycle (put into D3cold
- then D0) and call the function at the end of reset_prepare().
- Note: Need to also reset the parent device (bridge) of wifi on SB1;
- it might be because the bridge of wifi always reports it's in D3hot.
- When I tried to reset only the wifi device (not touching parent), it gave
- the following error and the reset failed:
- acpi device:4b: Cannot transition to power state D0 for parent in D3hot
- mwifiex_pcie 0000:03:00.0: can't change power state from D3cold to D0 (config space inaccessible)
- Signed-off-by: Tsuchiya Yuto <kitakar@gmail.com>
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 7 ++
- .../wireless/marvell/mwifiex/pcie_quirks.c | 73 +++++++++++++++++--
- .../wireless/marvell/mwifiex/pcie_quirks.h | 3 +-
- 3 files changed, 74 insertions(+), 9 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 9d12a0b726a3..4613e8cb2431 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -380,6 +380,13 @@ static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev)
- mwifiex_shutdown_sw(adapter);
- clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
- clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
- +
- + /* For Surface gen4+ devices, we need to put wifi into D3cold right
- + * before performing FLR
- + */
- + if (card->quirks & QUIRK_FW_RST_D3COLD)
- + mwifiex_pcie_reset_d3cold_quirk(pdev);
- +
- mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
-
- card->pci_reset_ongoing = true;
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- index 929aee2b0a60..edc739c542fe 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- @@ -21,7 +21,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 4"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Pro 5",
- @@ -30,7 +30,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1796"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Pro 5 (LTE)",
- @@ -39,7 +39,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1807"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Pro 6",
- @@ -47,7 +47,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 6"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Book 1",
- @@ -55,7 +55,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Book 2",
- @@ -63,7 +63,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book 2"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Laptop 1",
- @@ -71,7 +71,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface Laptop 2",
- @@ -79,7 +79,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop 2"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- },
- {
- .ident = "Surface 3",
- @@ -111,4 +111,61 @@ void mwifiex_initialize_quirks(struct pcie_service_card *card)
-
- if (!card->quirks)
- dev_info(&pdev->dev, "no quirks enabled\n");
- + if (card->quirks & QUIRK_FW_RST_D3COLD)
- + dev_info(&pdev->dev, "quirk reset_d3cold enabled\n");
- +}
- +
- +static void mwifiex_pcie_set_power_d3cold(struct pci_dev *pdev)
- +{
- + dev_info(&pdev->dev, "putting into D3cold...\n");
- +
- + pci_save_state(pdev);
- + if (pci_is_enabled(pdev))
- + pci_disable_device(pdev);
- + pci_set_power_state(pdev, PCI_D3cold);
- +}
- +
- +static int mwifiex_pcie_set_power_d0(struct pci_dev *pdev)
- +{
- + int ret;
- +
- + dev_info(&pdev->dev, "putting into D0...\n");
- +
- + pci_set_power_state(pdev, PCI_D0);
- + ret = pci_enable_device(pdev);
- + if (ret) {
- + dev_err(&pdev->dev, "pci_enable_device failed\n");
- + return ret;
- + }
- + pci_restore_state(pdev);
- +
- + return 0;
- +}
- +
- +int mwifiex_pcie_reset_d3cold_quirk(struct pci_dev *pdev)
- +{
- + struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
- + int ret;
- +
- + /* Power-cycle (put into D3cold then D0) */
- + dev_info(&pdev->dev, "Using reset_d3cold quirk to perform FW reset\n");
- +
- + /* We need to perform power-cycle also for bridge of wifi because
- + * on some devices (e.g. Surface Book 1), the OS for some reasons
- + * can't know the real power state of the bridge.
- + * When tried to power-cycle only wifi, the reset failed with the
- + * following dmesg log:
- + * "Cannot transition to power state D0 for parent in D3hot".
- + */
- + mwifiex_pcie_set_power_d3cold(pdev);
- + mwifiex_pcie_set_power_d3cold(parent_pdev);
- +
- + ret = mwifiex_pcie_set_power_d0(parent_pdev);
- + if (ret)
- + return ret;
- + ret = mwifiex_pcie_set_power_d0(pdev);
- + if (ret)
- + return ret;
- +
- + return 0;
- }
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- index 5326ae7e5671..8b9dcb5070d8 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- @@ -6,6 +6,7 @@
- #include "pcie.h"
-
- /* quirks */
- -// quirk flags can be added here
- +#define QUIRK_FW_RST_D3COLD BIT(0)
-
- void mwifiex_initialize_quirks(struct pcie_service_card *card);
- +int mwifiex_pcie_reset_d3cold_quirk(struct pci_dev *pdev);
- --
- 2.33.0
- From f12e03a06906f7992f03b992796c6ce19b75a215 Mon Sep 17 00:00:00 2001
- From: Tsuchiya Yuto <kitakar@gmail.com>
- Date: Tue, 29 Sep 2020 17:32:22 +0900
- Subject: [PATCH] mwifiex: pcie: add reset_wsid quirk for Surface 3
- This commit adds reset_wsid quirk and uses this quirk for Surface 3 on
- card reset.
- To reset mwifiex on Surface 3, it seems that calling the _DSM method
- exists in \_SB.WSID [1] device is required.
- On Surface 3, calling the _DSM method removes/re-probes the card by
- itself. So, need to place the reset function before performing FLR and
- skip performing any other reset-related works.
- Note that Surface Pro 3 also has the WSID device [2], but it seems to need
- more work. This commit only supports Surface 3 yet.
- [1] https://github.com/linux-surface/acpidumps/blob/05cba925f3a515f222acb5b3551a032ddde958fe/surface_3/dsdt.dsl#L11947-L12011
- [2] https://github.com/linux-surface/acpidumps/blob/05cba925f3a515f222acb5b3551a032ddde958fe/surface_pro_3/dsdt.dsl#L12164-L12216
- Signed-off-by: Tsuchiya Yuto <kitakar@gmail.com>
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 10 +++
- .../wireless/marvell/mwifiex/pcie_quirks.c | 77 ++++++++++++++++++-
- .../wireless/marvell/mwifiex/pcie_quirks.h | 5 ++
- 3 files changed, 91 insertions(+), 1 deletion(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 4613e8cb2431..8b1412c49bc2 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -2815,6 +2815,16 @@ static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
- {
- struct pcie_service_card *card = adapter->card;
-
- + /* On Surface 3, reset_wsid method removes then re-probes card by
- + * itself. So, need to place it here and skip performing any other
- + * reset-related works.
- + */
- + if (card->quirks & QUIRK_FW_RST_WSID_S3) {
- + mwifiex_pcie_reset_wsid_quirk(card->dev);
- + /* skip performing any other reset-related works */
- + return;
- + }
- +
- /* We can't afford to wait here; remove() might be waiting on us. If we
- * can't grab the device lock, maybe we'll get another chance later.
- */
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- index edc739c542fe..f0a6fa0a7ae5 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- @@ -9,10 +9,21 @@
- * down, or causes NULL ptr deref).
- */
-
- +#include <linux/acpi.h>
- #include <linux/dmi.h>
-
- #include "pcie_quirks.h"
-
- +/* For reset_wsid quirk */
- +#define ACPI_WSID_PATH "\\_SB.WSID"
- +#define WSID_REV 0x0
- +#define WSID_FUNC_WIFI_PWR_OFF 0x1
- +#define WSID_FUNC_WIFI_PWR_ON 0x2
- +/* WSID _DSM UUID: "534ea3bf-fcc2-4e7a-908f-a13978f0c7ef" */
- +static const guid_t wsid_dsm_guid =
- + GUID_INIT(0x534ea3bf, 0xfcc2, 0x4e7a,
- + 0x90, 0x8f, 0xa1, 0x39, 0x78, 0xf0, 0xc7, 0xef);
- +
- /* quirk table based on DMI matching */
- static const struct dmi_system_id mwifiex_quirk_table[] = {
- {
- @@ -87,7 +98,7 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface 3"),
- },
- - .driver_data = 0,
- + .driver_data = (void *)QUIRK_FW_RST_WSID_S3,
- },
- {
- .ident = "Surface Pro 3",
- @@ -113,6 +124,9 @@ void mwifiex_initialize_quirks(struct pcie_service_card *card)
- dev_info(&pdev->dev, "no quirks enabled\n");
- if (card->quirks & QUIRK_FW_RST_D3COLD)
- dev_info(&pdev->dev, "quirk reset_d3cold enabled\n");
- + if (card->quirks & QUIRK_FW_RST_WSID_S3)
- + dev_info(&pdev->dev,
- + "quirk reset_wsid for Surface 3 enabled\n");
- }
-
- static void mwifiex_pcie_set_power_d3cold(struct pci_dev *pdev)
- @@ -169,3 +183,64 @@ int mwifiex_pcie_reset_d3cold_quirk(struct pci_dev *pdev)
-
- return 0;
- }
- +
- +int mwifiex_pcie_reset_wsid_quirk(struct pci_dev *pdev)
- +{
- + acpi_handle handle;
- + union acpi_object *obj;
- + acpi_status status;
- +
- + dev_info(&pdev->dev, "Using reset_wsid quirk to perform FW reset\n");
- +
- + status = acpi_get_handle(NULL, ACPI_WSID_PATH, &handle);
- + if (ACPI_FAILURE(status)) {
- + dev_err(&pdev->dev, "No ACPI handle for path %s\n",
- + ACPI_WSID_PATH);
- + return -ENODEV;
- + }
- +
- + if (!acpi_has_method(handle, "_DSM")) {
- + dev_err(&pdev->dev, "_DSM method not found\n");
- + return -ENODEV;
- + }
- +
- + if (!acpi_check_dsm(handle, &wsid_dsm_guid,
- + WSID_REV, WSID_FUNC_WIFI_PWR_OFF)) {
- + dev_err(&pdev->dev,
- + "_DSM method doesn't support wifi power off func\n");
- + return -ENODEV;
- + }
- +
- + if (!acpi_check_dsm(handle, &wsid_dsm_guid,
- + WSID_REV, WSID_FUNC_WIFI_PWR_ON)) {
- + dev_err(&pdev->dev,
- + "_DSM method doesn't support wifi power on func\n");
- + return -ENODEV;
- + }
- +
- + /* card will be removed immediately after this call on Surface 3 */
- + dev_info(&pdev->dev, "turning wifi off...\n");
- + obj = acpi_evaluate_dsm(handle, &wsid_dsm_guid,
- + WSID_REV, WSID_FUNC_WIFI_PWR_OFF,
- + NULL);
- + if (!obj) {
- + dev_err(&pdev->dev,
- + "device _DSM execution failed for turning wifi off\n");
- + return -EIO;
- + }
- + ACPI_FREE(obj);
- +
- + /* card will be re-probed immediately after this call on Surface 3 */
- + dev_info(&pdev->dev, "turning wifi on...\n");
- + obj = acpi_evaluate_dsm(handle, &wsid_dsm_guid,
- + WSID_REV, WSID_FUNC_WIFI_PWR_ON,
- + NULL);
- + if (!obj) {
- + dev_err(&pdev->dev,
- + "device _DSM execution failed for turning wifi on\n");
- + return -EIO;
- + }
- + ACPI_FREE(obj);
- +
- + return 0;
- +}
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- index 8b9dcb5070d8..3ef7440418e3 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- @@ -7,6 +7,11 @@
-
- /* quirks */
- #define QUIRK_FW_RST_D3COLD BIT(0)
- +/* Surface 3 and Surface Pro 3 have the same _DSM method but need to
- + * be handled differently. Currently, only S3 is supported.
- + */
- +#define QUIRK_FW_RST_WSID_S3 BIT(1)
-
- void mwifiex_initialize_quirks(struct pcie_service_card *card);
- int mwifiex_pcie_reset_d3cold_quirk(struct pci_dev *pdev);
- +int mwifiex_pcie_reset_wsid_quirk(struct pci_dev *pdev);
- --
- 2.33.0
- From 1792b38ea0d695b96ddd03ef2385b1b39052ca7a Mon Sep 17 00:00:00 2001
- From: Tsuchiya Yuto <kitakar@gmail.com>
- Date: Wed, 30 Sep 2020 18:08:24 +0900
- Subject: [PATCH] mwifiex: pcie: (OEMB) add quirk for Surface 3 with broken DMI
- table
- (made referring to http://git.osdn.net/view?p=android-x86/kernel.git;a=commitdiff;h=18e2e857c57633b25b3b4120f212224a108cd883)
- On some Surface 3, the DMI table gets corrupted for unknown reasons
- and breaks existing DMI matching used for device-specific quirks.
- This commit adds the (broken) DMI info for the affected Surface 3.
- On affected systems, DMI info will look like this:
- $ grep . /sys/devices/virtual/dmi/id/{bios_vendor,board_name,board_vendor,\
- chassis_vendor,product_name,sys_vendor}
- /sys/devices/virtual/dmi/id/bios_vendor:American Megatrends Inc.
- /sys/devices/virtual/dmi/id/board_name:OEMB
- /sys/devices/virtual/dmi/id/board_vendor:OEMB
- /sys/devices/virtual/dmi/id/chassis_vendor:OEMB
- /sys/devices/virtual/dmi/id/product_name:OEMB
- /sys/devices/virtual/dmi/id/sys_vendor:OEMB
- Expected:
- $ grep . /sys/devices/virtual/dmi/id/{bios_vendor,board_name,board_vendor,\
- chassis_vendor,product_name,sys_vendor}
- /sys/devices/virtual/dmi/id/bios_vendor:American Megatrends Inc.
- /sys/devices/virtual/dmi/id/board_name:Surface 3
- /sys/devices/virtual/dmi/id/board_vendor:Microsoft Corporation
- /sys/devices/virtual/dmi/id/chassis_vendor:Microsoft Corporation
- /sys/devices/virtual/dmi/id/product_name:Surface 3
- /sys/devices/virtual/dmi/id/sys_vendor:Microsoft Corporation
- Signed-off-by: Tsuchiya Yuto <kitakar@gmail.com>
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie_quirks.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- index f0a6fa0a7ae5..34dcd84f02a6 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- @@ -100,6 +100,15 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- },
- .driver_data = (void *)QUIRK_FW_RST_WSID_S3,
- },
- + {
- + .ident = "Surface 3",
- + .matches = {
- + DMI_EXACT_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
- + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "OEMB"),
- + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "OEMB"),
- + },
- + .driver_data = (void *)QUIRK_FW_RST_WSID_S3,
- + },
- {
- .ident = "Surface Pro 3",
- .matches = {
- --
- 2.33.0
- From f9db59aedf1fab30389305390e9d691f782b5521 Mon Sep 17 00:00:00 2001
- From: Tsuchiya Yuto <kitakar@gmail.com>
- Date: Sun, 4 Oct 2020 00:11:49 +0900
- Subject: [PATCH] mwifiex: pcie: disable bridge_d3 for Surface gen4+
- Currently, mwifiex fw will crash after suspend on recent kernel series.
- On Windows, it seems that the root port of wifi will never enter D3 state
- (stay on D0 state). And on Linux, disabling the D3 state for the
- bridge fixes fw crashing after suspend.
- This commit disables the D3 state of root port on driver initialization
- and fixes fw crashing after suspend.
- Signed-off-by: Tsuchiya Yuto <kitakar@gmail.com>
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 7 +++++
- .../wireless/marvell/mwifiex/pcie_quirks.c | 27 +++++++++++++------
- .../wireless/marvell/mwifiex/pcie_quirks.h | 1 +
- 3 files changed, 27 insertions(+), 8 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 8b1412c49bc2..21f7a913978d 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -230,6 +230,7 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
- const struct pci_device_id *ent)
- {
- struct pcie_service_card *card;
- + struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
- int ret;
-
- pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
- @@ -271,6 +272,12 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
- return -1;
- }
-
- + /* disable bridge_d3 for Surface gen4+ devices to fix fw crashing
- + * after suspend
- + */
- + if (card->quirks & QUIRK_NO_BRIDGE_D3)
- + parent_pdev->bridge_d3 = false;
- +
- return 0;
- }
-
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- index 34dcd84f02a6..a2aeb2af907e 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- @@ -32,7 +32,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 4"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Pro 5",
- @@ -41,7 +42,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1796"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Pro 5 (LTE)",
- @@ -50,7 +52,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1807"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Pro 6",
- @@ -58,7 +61,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 6"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Book 1",
- @@ -66,7 +70,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Book 2",
- @@ -74,7 +79,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book 2"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Laptop 1",
- @@ -82,7 +88,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface Laptop 2",
- @@ -90,7 +97,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop 2"),
- },
- - .driver_data = (void *)QUIRK_FW_RST_D3COLD,
- + .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- + QUIRK_NO_BRIDGE_D3),
- },
- {
- .ident = "Surface 3",
- @@ -136,6 +144,9 @@ void mwifiex_initialize_quirks(struct pcie_service_card *card)
- if (card->quirks & QUIRK_FW_RST_WSID_S3)
- dev_info(&pdev->dev,
- "quirk reset_wsid for Surface 3 enabled\n");
- + if (card->quirks & QUIRK_NO_BRIDGE_D3)
- + dev_info(&pdev->dev,
- + "quirk no_brigde_d3 enabled\n");
- }
-
- static void mwifiex_pcie_set_power_d3cold(struct pci_dev *pdev)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- index 3ef7440418e3..a95ebac06e13 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- @@ -11,6 +11,7 @@
- * be handled differently. Currently, only S3 is supported.
- */
- #define QUIRK_FW_RST_WSID_S3 BIT(1)
- +#define QUIRK_NO_BRIDGE_D3 BIT(2)
-
- void mwifiex_initialize_quirks(struct pcie_service_card *card);
- int mwifiex_pcie_reset_d3cold_quirk(struct pci_dev *pdev);
- --
- 2.33.0
- From 652e4e9d07e50238a2af5f17eb44881f2eca2daa Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 10 Nov 2020 12:49:56 +0100
- Subject: [PATCH] mwifiex: Use non-posted PCI register writes
- On the 88W8897 card it's very important the TX ring write pointer is
- updated correctly to its new value before setting the TX ready
- interrupt, otherwise the firmware appears to crash (probably because
- it's trying to DMA-read from the wrong place).
- Since PCI uses "posted writes" when writing to a register, it's not
- guaranteed that a write will happen immediately. That means the pointer
- might be outdated when setting the TX ready interrupt, leading to
- firmware crashes especially when ASPM L1 and L1 substates are enabled
- (because of the higher link latency, the write will probably take
- longer).
- So fix those firmware crashes by always forcing non-posted writes. We do
- that by simply reading back the register after writing it, just as a lot
- of other drivers do.
- There are two reproducers that are fixed with this patch:
- 1) During rx/tx traffic and with ASPM L1 substates enabled (the enabled
- substates are platform dependent), the firmware crashes and eventually a
- command timeout appears in the logs. That crash is fixed by using a
- non-posted write in mwifiex_pcie_send_data().
- 2) When sending lots of commands to the card, waking it up from sleep in
- very quick intervals, the firmware eventually crashes. That crash
- appears to be fixed by some other non-posted write included here.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 6 ++++++
- 1 file changed, 6 insertions(+)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 21f7a913978d..0488b9610fa3 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -88,6 +88,12 @@ static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
-
- iowrite32(data, card->pci_mmap1 + reg);
-
- + /* Do a read-back, which makes the write non-posted, ensuring the
- + * completion before returning.
- + * The firmware of the 88W8897 card is buggy and this avoids crashes.
- + */
- + ioread32(card->pci_mmap1 + reg);
- +
- return 0;
- }
-
- --
- 2.33.0
- From 13a1cd06e88b37cebf30ba50445f9bda87032dc5 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 3 Nov 2020 13:28:04 +0100
- Subject: [PATCH] mwifiex: Add quirk resetting the PCI bridge on MS Surface
- devices
- The most recent firmware of the 88W8897 card reports a hardcoded LTR
- value to the system during initialization, probably as an (unsuccessful)
- attempt of the developers to fix firmware crashes. This LTR value
- prevents most of the Microsoft Surface devices from entering deep
- powersaving states (either platform C-State 10 or S0ix state), because
- the exit latency of that state would be higher than what the card can
- tolerate.
- Turns out the card works just the same (including the firmware crashes)
- no matter if that hardcoded LTR value is reported or not, so it's kind
- of useless and only prevents us from saving power.
- To get rid of those hardcoded LTR reports, it's possible to reset the
- PCI bridge device after initializing the cards firmware. I'm not exactly
- sure why that works, maybe the power management subsystem of the PCH
- resets its stored LTR values when doing a function level reset of the
- bridge device. Doing the reset once after starting the wifi firmware
- works very well, probably because the firmware only reports that LTR
- value a single time during firmware startup.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 12 +++++++++
- .../wireless/marvell/mwifiex/pcie_quirks.c | 26 +++++++++++++------
- .../wireless/marvell/mwifiex/pcie_quirks.h | 1 +
- 3 files changed, 31 insertions(+), 8 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 0488b9610fa3..1ad41c6e14ff 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -1608,9 +1608,21 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
- static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
- {
- struct pcie_service_card *card = adapter->card;
- + struct pci_dev *pdev = card->dev;
- + struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
- const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
- int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
-
- + /* Trigger a function level reset of the PCI bridge device, this makes
- + * the firmware of PCIe 88W8897 cards stop reporting a fixed LTR value
- + * that prevents the system from entering package C10 and S0ix powersaving
- + * states.
- + * We need to do it here because it must happen after firmware
- + * initialization and this function is called after that is done.
- + */
- + if (card->quirks & QUIRK_DO_FLR_ON_BRIDGE)
- + pci_reset_function(parent_pdev);
- +
- /* Write the RX ring read pointer in to reg->rx_rdptr */
- if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
- tx_wrap)) {
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- index a2aeb2af907e..6885575826a6 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.c
- @@ -33,7 +33,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 4"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Pro 5",
- @@ -43,7 +44,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1796"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Pro 5 (LTE)",
- @@ -53,7 +55,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "Surface_Pro_1807"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Pro 6",
- @@ -62,7 +65,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Pro 6"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Book 1",
- @@ -71,7 +75,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Book 2",
- @@ -80,7 +85,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Book 2"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Laptop 1",
- @@ -89,7 +95,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface Laptop 2",
- @@ -98,7 +105,8 @@ static const struct dmi_system_id mwifiex_quirk_table[] = {
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Surface Laptop 2"),
- },
- .driver_data = (void *)(QUIRK_FW_RST_D3COLD |
- - QUIRK_NO_BRIDGE_D3),
- + QUIRK_NO_BRIDGE_D3 |
- + QUIRK_DO_FLR_ON_BRIDGE),
- },
- {
- .ident = "Surface 3",
- @@ -147,6 +155,8 @@ void mwifiex_initialize_quirks(struct pcie_service_card *card)
- if (card->quirks & QUIRK_NO_BRIDGE_D3)
- dev_info(&pdev->dev,
- "quirk no_brigde_d3 enabled\n");
- + if (card->quirks & QUIRK_DO_FLR_ON_BRIDGE)
- + dev_info(&pdev->dev, "quirk do_flr_on_bridge enabled\n");
- }
-
- static void mwifiex_pcie_set_power_d3cold(struct pci_dev *pdev)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- index a95ebac06e13..4ec2ae72f632 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie_quirks.h
- @@ -12,6 +12,7 @@
- */
- #define QUIRK_FW_RST_WSID_S3 BIT(1)
- #define QUIRK_NO_BRIDGE_D3 BIT(2)
- +#define QUIRK_DO_FLR_ON_BRIDGE BIT(3)
-
- void mwifiex_initialize_quirks(struct pcie_service_card *card);
- int mwifiex_pcie_reset_d3cold_quirk(struct pci_dev *pdev);
- --
- 2.33.0
- From cec09dc4302c324e652452b81b8609a044b3fc39 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Sun, 28 Mar 2021 21:10:06 +0200
- Subject: [PATCH] mwifiex: Try waking the firmware until we get an interrupt
- It seems that the firmware of the 88W8897 card sometimes ignores or
- misses when we try to wake it up by reading the firmware status
- register. This leads to the firmware wakeup timeout expiring and the
- driver resetting the card because we assume the firmware has hung up or
- crashed (unfortunately that's not unlikely with this card).
- Turns out that most of the time the firmware actually didn't hang up,
- but simply "missed" our wakeup request and doesn't send us an AWAKE
- event.
- Trying again to read the firmware status register after a short timeout
- usually makes the firmware wake we up as expected, so add a small retry
- loop to mwifiex_pm_wakeup_card() that looks at the interrupt status to
- check whether the card woke up.
- The number of tries and timeout lengths for this were determined
- experimentally: The firmware usually takes about 500 us to wake up
- after we attempt to read the status register. In some cases where the
- firmware is very busy (for example while doing a bluetooth scan) it
- might even miss our requests for multiple milliseconds, which is why
- after 15 tries the waiting time gets increased to 10 ms. The maximum
- number of tries it took to wake the firmware when testing this was
- around 20, so a maximum number of 50 tries should give us plenty of
- safety margin.
- A good reproducer for this issue is letting the firmware sleep and wake
- up in very short intervals, for example by pinging an device on the
- network every 0.1 seconds.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/pcie.c | 29 ++++++++++++++++-----
- 1 file changed, 23 insertions(+), 6 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
- index 1ad41c6e14ff..cf1304eb9b8c 100644
- --- a/drivers/net/wireless/marvell/mwifiex/pcie.c
- +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
- @@ -518,6 +518,7 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
- {
- struct pcie_service_card *card = adapter->card;
- const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
- + int n_tries = 0;
-
- mwifiex_dbg(adapter, EVENT,
- "event: Wakeup device...\n");
- @@ -525,12 +526,28 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
- if (reg->sleep_cookie)
- mwifiex_pcie_dev_wakeup_delay(adapter);
-
- - /* Accessing fw_status register will wakeup device */
- - if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
- - mwifiex_dbg(adapter, ERROR,
- - "Writing fw_status register failed\n");
- - return -1;
- - }
- + /* Access the fw_status register to wake up the device.
- + * Since the 88W8897 firmware sometimes appears to ignore or miss
- + * that wakeup request, we continue trying until we receive an
- + * interrupt from the card.
- + */
- + do {
- + if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
- + mwifiex_dbg(adapter, ERROR,
- + "Writing fw_status register failed\n");
- + return -1;
- + }
- +
- + n_tries++;
- +
- + if (n_tries <= 15)
- + usleep_range(400, 700);
- + else
- + msleep(10);
- + } while (n_tries <= 50 && READ_ONCE(adapter->int_status) == 0);
- +
- + mwifiex_dbg(adapter, EVENT,
- + "event: Tried %d times until firmware woke up\n", n_tries);
-
- if (reg->sleep_cookie) {
- mwifiex_pcie_dev_wakeup_delay(adapter);
- --
- 2.33.0
- From 178ace012f8cf67a6461843fb3378d1382b0f81d Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Thu, 25 Mar 2021 11:33:02 +0100
- Subject: [PATCH] Bluetooth: btusb: Lower passive lescan interval on Marvell
- 88W8897
- The Marvell 88W8897 combined wifi and bluetooth card (pcie+usb version)
- is used in a lot of Microsoft Surface devices, and all those devices
- suffer from very low 2.4GHz wifi connection speeds while bluetooth is
- enabled. The reason for that is that the default passive scanning
- interval for Bluetooth Low Energy devices is quite high in Linux
- (interval of 60 msec and scan window of 30 msec, see hci_core.c), and
- the Marvell chip is known for its bad bt+wifi coexisting performance.
- So decrease that passive scan interval and make the scan window shorter
- on this particular device to allow for spending more time transmitting
- wifi signals: The new scan interval is 250 msec (0x190 * 0.625 msec) and
- the new scan window is 6.25 msec (0xa * 0,625 msec).
- This change has a very large impact on the 2.4GHz wifi speeds and gets
- it up to performance comparable with the Windows driver, which seems to
- apply a similar quirk.
- The interval and window length were tested and found to work very well
- with a lot of Bluetooth Low Energy devices, including the Surface Pen, a
- Bluetooth Speaker and two modern Bluetooth headphones. All devices were
- discovered immediately after turning them on. Even lower values were
- also tested, but they introduced longer delays until devices get
- discovered.
- Patchset: wifi
- ---
- drivers/bluetooth/btusb.c | 15 +++++++++++++++
- 1 file changed, 15 insertions(+)
- diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
- index 7188f0fb2e05..1fda8be4e8e1 100644
- --- a/drivers/bluetooth/btusb.c
- +++ b/drivers/bluetooth/btusb.c
- @@ -69,6 +69,7 @@ static struct usb_driver btusb_driver;
- #define BTUSB_BCM2045 0x40000
- #define BTUSB_IFNUM_2 0x80000
- #define BTUSB_CW6622 0x100000
- +#define BTUSB_LOWER_LESCAN_INTERVAL 0x200000
-
- static const struct usb_device_id btusb_table[] = {
- /* Generic Bluetooth USB device */
- @@ -341,6 +342,7 @@ static const struct usb_device_id blacklist_table[] = {
- { USB_DEVICE(0x1286, 0x2044), .driver_info = BTUSB_MARVELL },
- { USB_DEVICE(0x1286, 0x2046), .driver_info = BTUSB_MARVELL },
- { USB_DEVICE(0x1286, 0x204e), .driver_info = BTUSB_MARVELL },
- + { USB_DEVICE(0x1286, 0x204c), .driver_info = BTUSB_LOWER_LESCAN_INTERVAL },
-
- /* Intel Bluetooth devices */
- { USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW },
- @@ -3110,6 +3112,19 @@ static int btusb_probe(struct usb_interface *intf,
- if (id->driver_info & BTUSB_MARVELL)
- hdev->set_bdaddr = btusb_set_bdaddr_marvell;
-
- + /* The Marvell 88W8897 combined wifi and bluetooth card is known for
- + * very bad bt+wifi coexisting performance.
- + *
- + * Decrease the passive BT Low Energy scan interval a bit
- + * (0x0190 * 0.625 msec = 250 msec) and make the scan window shorter
- + * (0x000a * 0,625 msec = 6.25 msec). This allows for significantly
- + * higher wifi throughput while passively scanning for BT LE devices.
- + */
- + if (id->driver_info & BTUSB_LOWER_LESCAN_INTERVAL) {
- + hdev->le_scan_interval = 0x0190;
- + hdev->le_scan_window = 0x000a;
- + }
- +
- if (id->driver_info & BTUSB_SWAVE) {
- set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks);
- set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
- --
- 2.33.0
- From 44fcb8da980dce251bb3705b204a916f2e749a2b Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Wed, 11 Nov 2020 12:31:26 +0100
- Subject: [PATCH] mwifiex: Small cleanup for handling virtual interface type
- changes
- Handle the obvious invalid virtual interface type changes with a general
- check instead of looking at the individual change.
- For type changes from P2P_CLIENT to P2P_GO and the other way round, this
- changes the behavior slightly: We now still do nothing, but return
- -EOPNOTSUPP instead of 0. Now that behavior was incorrect before and
- still is, because type changes between these two types are actually
- possible and supported, which we'll fix in a following commit.
- Patchset: wifi
- ---
- .../net/wireless/marvell/mwifiex/cfg80211.c | 39 +++++++------------
- 1 file changed, 14 insertions(+), 25 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 650191db25cb..5badf7fef37e 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -1145,6 +1145,20 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return -EBUSY;
- }
-
- + if (type == NL80211_IFTYPE_UNSPECIFIED) {
- + mwifiex_dbg(priv->adapter, INFO,
- + "%s: no new type specified, keeping old type %d\n",
- + dev->name, curr_iftype);
- + return 0;
- + }
- +
- + if (curr_iftype == type) {
- + mwifiex_dbg(priv->adapter, INFO,
- + "%s: interface already is of type %d\n",
- + dev->name, curr_iftype);
- + return 0;
- + }
- +
- switch (curr_iftype) {
- case NL80211_IFTYPE_ADHOC:
- switch (type) {
- @@ -1164,12 +1178,6 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- case NL80211_IFTYPE_AP:
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- - case NL80211_IFTYPE_UNSPECIFIED:
- - mwifiex_dbg(priv->adapter, INFO,
- - "%s: kept type as IBSS\n", dev->name);
- - /* fall through */
- - case NL80211_IFTYPE_ADHOC: /* This shouldn't happen */
- - return 0;
- default:
- mwifiex_dbg(priv->adapter, ERROR,
- "%s: changing to %d not supported\n",
- @@ -1195,12 +1203,6 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- case NL80211_IFTYPE_AP:
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- - case NL80211_IFTYPE_UNSPECIFIED:
- - mwifiex_dbg(priv->adapter, INFO,
- - "%s: kept type as STA\n", dev->name);
- - /* fall through */
- - case NL80211_IFTYPE_STATION: /* This shouldn't happen */
- - return 0;
- default:
- mwifiex_dbg(priv->adapter, ERROR,
- "%s: changing to %d not supported\n",
- @@ -1218,12 +1220,6 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- case NL80211_IFTYPE_P2P_GO:
- return mwifiex_change_vif_to_p2p(dev, curr_iftype,
- type, params);
- - case NL80211_IFTYPE_UNSPECIFIED:
- - mwifiex_dbg(priv->adapter, INFO,
- - "%s: kept type as AP\n", dev->name);
- - /* fall through */
- - case NL80211_IFTYPE_AP: /* This shouldn't happen */
- - return 0;
- default:
- mwifiex_dbg(priv->adapter, ERROR,
- "%s: changing to %d not supported\n",
- @@ -1258,13 +1254,6 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return -EFAULT;
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- - case NL80211_IFTYPE_UNSPECIFIED:
- - mwifiex_dbg(priv->adapter, INFO,
- - "%s: kept type as P2P\n", dev->name);
- - /* fall through */
- - case NL80211_IFTYPE_P2P_CLIENT:
- - case NL80211_IFTYPE_P2P_GO:
- - return 0;
- default:
- mwifiex_dbg(priv->adapter, ERROR,
- "%s: changing to %d not supported\n",
- --
- 2.33.0
- From 9dfc8a4c16f19c30ba54538f153041b103429a10 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Wed, 11 Nov 2020 12:44:39 +0100
- Subject: [PATCH] mwifiex: Use function to check whether interface type change
- is allowed
- Instead of bailing out in the function which is supposed to do the type
- change, detect invalid changes beforehand using a generic function and
- return an error if the change is not allowed.
- Patchset: wifi
- ---
- .../net/wireless/marvell/mwifiex/cfg80211.c | 139 ++++++++++++------
- 1 file changed, 92 insertions(+), 47 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 5badf7fef37e..e73334679992 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -943,6 +943,76 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
- return 0;
- }
-
- +static bool
- +is_vif_type_change_allowed(struct mwifiex_adapter *adapter,
- + enum nl80211_iftype old_iftype,
- + enum nl80211_iftype new_iftype)
- +{
- + switch (old_iftype) {
- + case NL80211_IFTYPE_ADHOC:
- + switch (new_iftype) {
- + case NL80211_IFTYPE_STATION:
- + return true;
- + case NL80211_IFTYPE_P2P_CLIENT:
- + case NL80211_IFTYPE_P2P_GO:
- + return adapter->curr_iface_comb.p2p_intf !=
- + adapter->iface_limit.p2p_intf;
- + case NL80211_IFTYPE_AP:
- + return adapter->curr_iface_comb.uap_intf !=
- + adapter->iface_limit.uap_intf;
- + default:
- + return false;
- + }
- +
- + case NL80211_IFTYPE_STATION:
- + switch (new_iftype) {
- + case NL80211_IFTYPE_ADHOC:
- + return true;
- + case NL80211_IFTYPE_P2P_CLIENT:
- + case NL80211_IFTYPE_P2P_GO:
- + return adapter->curr_iface_comb.p2p_intf !=
- + adapter->iface_limit.p2p_intf;
- + case NL80211_IFTYPE_AP:
- + return adapter->curr_iface_comb.uap_intf !=
- + adapter->iface_limit.uap_intf;
- + default:
- + return false;
- + }
- +
- + case NL80211_IFTYPE_AP:
- + switch (new_iftype) {
- + case NL80211_IFTYPE_ADHOC:
- + case NL80211_IFTYPE_STATION:
- + return adapter->curr_iface_comb.sta_intf !=
- + adapter->iface_limit.sta_intf;
- + case NL80211_IFTYPE_P2P_CLIENT:
- + case NL80211_IFTYPE_P2P_GO:
- + return adapter->curr_iface_comb.p2p_intf !=
- + adapter->iface_limit.p2p_intf;
- + default:
- + return false;
- + }
- +
- + case NL80211_IFTYPE_P2P_CLIENT:
- + case NL80211_IFTYPE_P2P_GO:
- + switch (new_iftype) {
- + case NL80211_IFTYPE_ADHOC:
- + case NL80211_IFTYPE_STATION:
- + return true;
- + case NL80211_IFTYPE_AP:
- + return adapter->curr_iface_comb.uap_intf !=
- + adapter->iface_limit.uap_intf;
- + default:
- + return false;
- + }
- +
- + default:
- + break;
- + }
- +
- + return false;
- +}
- +
- static int
- mwifiex_change_vif_to_p2p(struct net_device *dev,
- enum nl80211_iftype curr_iftype,
- @@ -959,13 +1029,6 @@ mwifiex_change_vif_to_p2p(struct net_device *dev,
-
- adapter = priv->adapter;
-
- - if (adapter->curr_iface_comb.p2p_intf ==
- - adapter->iface_limit.p2p_intf) {
- - mwifiex_dbg(adapter, ERROR,
- - "cannot create multiple P2P ifaces\n");
- - return -1;
- - }
- -
- mwifiex_dbg(adapter, INFO,
- "%s: changing role to p2p\n", dev->name);
-
- @@ -1031,15 +1094,6 @@ mwifiex_change_vif_to_sta_adhoc(struct net_device *dev,
-
- adapter = priv->adapter;
-
- - if ((curr_iftype != NL80211_IFTYPE_P2P_CLIENT &&
- - curr_iftype != NL80211_IFTYPE_P2P_GO) &&
- - (adapter->curr_iface_comb.sta_intf ==
- - adapter->iface_limit.sta_intf)) {
- - mwifiex_dbg(adapter, ERROR,
- - "cannot create multiple station/adhoc ifaces\n");
- - return -1;
- - }
- -
- if (type == NL80211_IFTYPE_STATION)
- mwifiex_dbg(adapter, INFO,
- "%s: changing role to station\n", dev->name);
- @@ -1090,13 +1144,6 @@ mwifiex_change_vif_to_ap(struct net_device *dev,
-
- adapter = priv->adapter;
-
- - if (adapter->curr_iface_comb.uap_intf ==
- - adapter->iface_limit.uap_intf) {
- - mwifiex_dbg(adapter, ERROR,
- - "cannot create multiple AP ifaces\n");
- - return -1;
- - }
- -
- mwifiex_dbg(adapter, INFO,
- "%s: changing role to AP\n", dev->name);
-
- @@ -1159,6 +1206,13 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return 0;
- }
-
- + if (!is_vif_type_change_allowed(priv->adapter, curr_iftype, type)) {
- + mwifiex_dbg(priv->adapter, ERROR,
- + "%s: change from type %d to %d is not allowed\n",
- + dev->name, curr_iftype, type);
- + return -EOPNOTSUPP;
- + }
- +
- switch (curr_iftype) {
- case NL80211_IFTYPE_ADHOC:
- switch (type) {
- @@ -1179,12 +1233,9 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- default:
- - mwifiex_dbg(priv->adapter, ERROR,
- - "%s: changing to %d not supported\n",
- - dev->name, type);
- - return -EOPNOTSUPP;
- + goto errnotsupp;
- }
- - break;
- +
- case NL80211_IFTYPE_STATION:
- switch (type) {
- case NL80211_IFTYPE_ADHOC:
- @@ -1204,12 +1255,9 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- default:
- - mwifiex_dbg(priv->adapter, ERROR,
- - "%s: changing to %d not supported\n",
- - dev->name, type);
- - return -EOPNOTSUPP;
- + goto errnotsupp;
- }
- - break;
- +
- case NL80211_IFTYPE_AP:
- switch (type) {
- case NL80211_IFTYPE_ADHOC:
- @@ -1221,12 +1269,9 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return mwifiex_change_vif_to_p2p(dev, curr_iftype,
- type, params);
- default:
- - mwifiex_dbg(priv->adapter, ERROR,
- - "%s: changing to %d not supported\n",
- - dev->name, type);
- - return -EOPNOTSUPP;
- + goto errnotsupp;
- }
- - break;
- +
- case NL80211_IFTYPE_P2P_CLIENT:
- case NL80211_IFTYPE_P2P_GO:
- switch (type) {
- @@ -1255,21 +1300,21 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- default:
- - mwifiex_dbg(priv->adapter, ERROR,
- - "%s: changing to %d not supported\n",
- - dev->name, type);
- - return -EOPNOTSUPP;
- + goto errnotsupp;
- }
- - break;
- +
- default:
- - mwifiex_dbg(priv->adapter, ERROR,
- - "%s: unknown iftype: %d\n",
- - dev->name, dev->ieee80211_ptr->iftype);
- - return -EOPNOTSUPP;
- + goto errnotsupp;
- }
-
-
- return 0;
- +
- +errnotsupp:
- + mwifiex_dbg(priv->adapter, ERROR,
- + "unsupported interface type transition: %d to %d\n",
- + curr_iftype, type);
- + return -EOPNOTSUPP;
- }
-
- static void
- --
- 2.33.0
- From c7538183a79e680bdfa8236049128e9c88af8d21 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Wed, 11 Nov 2020 13:33:04 +0100
- Subject: [PATCH] mwifiex: Run SET_BSS_MODE when changing from P2P to STATION
- vif-type
- We currently handle changing from the P2P to the STATION virtual
- interface type slightly different than changing from P2P to ADHOC: When
- changing to STATION, we don't send the SET_BSS_MODE command. We do send
- that command on all other type-changes though, and it probably makes
- sense to send the command since after all we just changed our BSS_MODE.
- Looking at prior changes to this part of the code, it seems that this is
- simply a leftover from old refactorings.
- Since sending the SET_BSS_MODE command is the only difference between
- mwifiex_change_vif_to_sta_adhoc() and the current code, we can now use
- mwifiex_change_vif_to_sta_adhoc() for both switching to ADHOC and
- STATION interface type.
- This does not fix any particular bug and just "looked right", so there's
- a small chance it might be a regression.
- Patchset: wifi
- ---
- .../net/wireless/marvell/mwifiex/cfg80211.c | 22 ++++---------------
- 1 file changed, 4 insertions(+), 18 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index e73334679992..99da637692cc 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -1274,29 +1274,15 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
-
- case NL80211_IFTYPE_P2P_CLIENT:
- case NL80211_IFTYPE_P2P_GO:
- + if (mwifiex_cfg80211_deinit_p2p(priv))
- + return -EFAULT;
- +
- switch (type) {
- - case NL80211_IFTYPE_STATION:
- - if (mwifiex_cfg80211_deinit_p2p(priv))
- - return -EFAULT;
- - priv->adapter->curr_iface_comb.p2p_intf--;
- - priv->adapter->curr_iface_comb.sta_intf++;
- - dev->ieee80211_ptr->iftype = type;
- - if (mwifiex_deinit_priv_params(priv))
- - return -1;
- - if (mwifiex_init_new_priv_params(priv, dev, type))
- - return -1;
- - if (mwifiex_sta_init_cmd(priv, false, false))
- - return -1;
- - break;
- case NL80211_IFTYPE_ADHOC:
- - if (mwifiex_cfg80211_deinit_p2p(priv))
- - return -EFAULT;
- + case NL80211_IFTYPE_STATION:
- return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
- type, params);
- - break;
- case NL80211_IFTYPE_AP:
- - if (mwifiex_cfg80211_deinit_p2p(priv))
- - return -EFAULT;
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- default:
- --
- 2.33.0
- From 58da22d55a0a6a15b4243a75dfb4f8ea4fc4e8a8 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Wed, 11 Nov 2020 14:42:54 +0100
- Subject: [PATCH] mwifiex: Use helper function for counting interface types
- Use a small helper function to increment and decrement the counter of
- the interface types we currently manage. This makes the code that
- actually changes and sets up the interface type a bit less messy and
- also helps avoiding mistakes in case someone increments/decrements a
- counter wrongly.
- Patchset: wifi
- ---
- .../net/wireless/marvell/mwifiex/cfg80211.c | 110 ++++++------------
- 1 file changed, 35 insertions(+), 75 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 99da637692cc..feb3a858d8c1 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -1013,6 +1013,32 @@ is_vif_type_change_allowed(struct mwifiex_adapter *adapter,
- return false;
- }
-
- +static void
- +update_vif_type_counter(struct mwifiex_adapter *adapter,
- + enum nl80211_iftype iftype,
- + int change)
- +{
- + switch (iftype) {
- + case NL80211_IFTYPE_UNSPECIFIED:
- + case NL80211_IFTYPE_ADHOC:
- + case NL80211_IFTYPE_STATION:
- + adapter->curr_iface_comb.sta_intf += change;
- + break;
- + case NL80211_IFTYPE_AP:
- + adapter->curr_iface_comb.uap_intf += change;
- + break;
- + case NL80211_IFTYPE_P2P_CLIENT:
- + case NL80211_IFTYPE_P2P_GO:
- + adapter->curr_iface_comb.p2p_intf += change;
- + break;
- + default:
- + mwifiex_dbg(adapter, ERROR,
- + "%s: Unsupported iftype passed: %d\n",
- + __func__, iftype);
- + break;
- + }
- +}
- +
- static int
- mwifiex_change_vif_to_p2p(struct net_device *dev,
- enum nl80211_iftype curr_iftype,
- @@ -1060,19 +1086,8 @@ mwifiex_change_vif_to_p2p(struct net_device *dev,
- if (mwifiex_sta_init_cmd(priv, false, false))
- return -1;
-
- - switch (curr_iftype) {
- - case NL80211_IFTYPE_STATION:
- - case NL80211_IFTYPE_ADHOC:
- - adapter->curr_iface_comb.sta_intf--;
- - break;
- - case NL80211_IFTYPE_AP:
- - adapter->curr_iface_comb.uap_intf--;
- - break;
- - default:
- - break;
- - }
- -
- - adapter->curr_iface_comb.p2p_intf++;
- + update_vif_type_counter(adapter, curr_iftype, -1);
- + update_vif_type_counter(adapter, type, +1);
- dev->ieee80211_ptr->iftype = type;
-
- return 0;
- @@ -1111,20 +1126,10 @@ mwifiex_change_vif_to_sta_adhoc(struct net_device *dev,
- if (mwifiex_sta_init_cmd(priv, false, false))
- return -1;
-
- - switch (curr_iftype) {
- - case NL80211_IFTYPE_P2P_CLIENT:
- - case NL80211_IFTYPE_P2P_GO:
- - adapter->curr_iface_comb.p2p_intf--;
- - break;
- - case NL80211_IFTYPE_AP:
- - adapter->curr_iface_comb.uap_intf--;
- - break;
- - default:
- - break;
- - }
- -
- - adapter->curr_iface_comb.sta_intf++;
- + update_vif_type_counter(adapter, curr_iftype, -1);
- + update_vif_type_counter(adapter, type, +1);
- dev->ieee80211_ptr->iftype = type;
- +
- return 0;
- }
-
- @@ -1157,20 +1162,8 @@ mwifiex_change_vif_to_ap(struct net_device *dev,
- if (mwifiex_sta_init_cmd(priv, false, false))
- return -1;
-
- - switch (curr_iftype) {
- - case NL80211_IFTYPE_P2P_CLIENT:
- - case NL80211_IFTYPE_P2P_GO:
- - adapter->curr_iface_comb.p2p_intf--;
- - break;
- - case NL80211_IFTYPE_STATION:
- - case NL80211_IFTYPE_ADHOC:
- - adapter->curr_iface_comb.sta_intf--;
- - break;
- - default:
- - break;
- - }
- -
- - adapter->curr_iface_comb.uap_intf++;
- + update_vif_type_counter(adapter, curr_iftype, -1);
- + update_vif_type_counter(adapter, type, +1);
- dev->ieee80211_ptr->iftype = type;
- return 0;
- }
- @@ -3091,23 +3084,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
- mwifiex_dev_debugfs_init(priv);
- #endif
-
- - switch (type) {
- - case NL80211_IFTYPE_UNSPECIFIED:
- - case NL80211_IFTYPE_STATION:
- - case NL80211_IFTYPE_ADHOC:
- - adapter->curr_iface_comb.sta_intf++;
- - break;
- - case NL80211_IFTYPE_AP:
- - adapter->curr_iface_comb.uap_intf++;
- - break;
- - case NL80211_IFTYPE_P2P_CLIENT:
- - adapter->curr_iface_comb.p2p_intf++;
- - break;
- - default:
- - /* This should be dead code; checked above */
- - mwifiex_dbg(adapter, ERROR, "type not supported\n");
- - return ERR_PTR(-EINVAL);
- - }
- + update_vif_type_counter(adapter, type, +1);
-
- return &priv->wdev;
-
- @@ -3173,24 +3150,7 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
- /* Clear the priv in adapter */
- priv->netdev = NULL;
-
- - switch (priv->bss_mode) {
- - case NL80211_IFTYPE_UNSPECIFIED:
- - case NL80211_IFTYPE_STATION:
- - case NL80211_IFTYPE_ADHOC:
- - adapter->curr_iface_comb.sta_intf--;
- - break;
- - case NL80211_IFTYPE_AP:
- - adapter->curr_iface_comb.uap_intf--;
- - break;
- - case NL80211_IFTYPE_P2P_CLIENT:
- - case NL80211_IFTYPE_P2P_GO:
- - adapter->curr_iface_comb.p2p_intf--;
- - break;
- - default:
- - mwifiex_dbg(adapter, ERROR,
- - "del_virtual_intf: type not supported\n");
- - break;
- - }
- + update_vif_type_counter(adapter, priv->bss_mode, -1);
-
- priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
-
- --
- 2.33.0
- From a963cff901b373ee52aa99f96acd034ad7697637 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Fri, 26 Mar 2021 15:56:58 +0100
- Subject: [PATCH] mwifiex: Update virtual interface counters right after
- setting bss_type
- In mwifiex_init_new_priv_params() we update our private driver state to
- reflect the currently selected virtual interface type. Most notably we
- set the bss_mode to the mode we're going to put the firmware in.
- Now after we updated the driver state we actually start talking to the
- firmware and instruct it to set up the new mode. Those commands can and
- will sometimes fail, in which case we return with an error from
- mwifiex_change_vif_to_*. We currently update our virtual interface type
- counters after this return, which means the code is never reached when a
- firmware error happens and we never update the counters. Since we have
- updated our bss_mode earlier though, the counters now no longer reflect
- the actual state of the driver.
- This will break things on the next virtual interface change, because the
- virtual interface type we're switching away from didn't get its counter
- incremented, and we end up decrementing a 0-counter.
- To fix this, simply update the virtual interface type counters right
- after updating our driver structures, so that they are always in sync.
- Patchset: wifi
- ---
- .../net/wireless/marvell/mwifiex/cfg80211.c | 25 +++++++++++--------
- 1 file changed, 14 insertions(+), 11 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index feb3a858d8c1..54d9e789aa14 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -1063,6 +1063,10 @@ mwifiex_change_vif_to_p2p(struct net_device *dev,
- if (mwifiex_init_new_priv_params(priv, dev, type))
- return -1;
-
- + update_vif_type_counter(adapter, curr_iftype, -1);
- + update_vif_type_counter(adapter, type, +1);
- + dev->ieee80211_ptr->iftype = type;
- +
- switch (type) {
- case NL80211_IFTYPE_P2P_CLIENT:
- if (mwifiex_cfg80211_init_p2p_client(priv))
- @@ -1086,10 +1090,6 @@ mwifiex_change_vif_to_p2p(struct net_device *dev,
- if (mwifiex_sta_init_cmd(priv, false, false))
- return -1;
-
- - update_vif_type_counter(adapter, curr_iftype, -1);
- - update_vif_type_counter(adapter, type, +1);
- - dev->ieee80211_ptr->iftype = type;
- -
- return 0;
- }
-
- @@ -1120,16 +1120,17 @@ mwifiex_change_vif_to_sta_adhoc(struct net_device *dev,
- return -1;
- if (mwifiex_init_new_priv_params(priv, dev, type))
- return -1;
- +
- + update_vif_type_counter(adapter, curr_iftype, -1);
- + update_vif_type_counter(adapter, type, +1);
- + dev->ieee80211_ptr->iftype = type;
- +
- if (mwifiex_send_cmd(priv, HostCmd_CMD_SET_BSS_MODE,
- HostCmd_ACT_GEN_SET, 0, NULL, true))
- return -1;
- if (mwifiex_sta_init_cmd(priv, false, false))
- return -1;
-
- - update_vif_type_counter(adapter, curr_iftype, -1);
- - update_vif_type_counter(adapter, type, +1);
- - dev->ieee80211_ptr->iftype = type;
- -
- return 0;
- }
-
- @@ -1156,15 +1157,17 @@ mwifiex_change_vif_to_ap(struct net_device *dev,
- return -1;
- if (mwifiex_init_new_priv_params(priv, dev, type))
- return -1;
- +
- + update_vif_type_counter(adapter, curr_iftype, -1);
- + update_vif_type_counter(adapter, type, +1);
- + dev->ieee80211_ptr->iftype = type;
- +
- if (mwifiex_send_cmd(priv, HostCmd_CMD_SET_BSS_MODE,
- HostCmd_ACT_GEN_SET, 0, NULL, true))
- return -1;
- if (mwifiex_sta_init_cmd(priv, false, false))
- return -1;
-
- - update_vif_type_counter(adapter, curr_iftype, -1);
- - update_vif_type_counter(adapter, type, +1);
- - dev->ieee80211_ptr->iftype = type;
- return 0;
- }
- /*
- --
- 2.33.0
- From 8eb7471eb2fe6e028ff6ddd218f593cf3def7886 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Wed, 11 Nov 2020 13:42:40 +0100
- Subject: [PATCH] mwifiex: Allow switching interface type from P2P_CLIENT to
- P2P_GO
- It's possible to change virtual interface type between P2P_CLIENT and
- P2P_GO, the card supports that just fine, and it happens for example
- when using miracast with the miraclecast software.
- So allow type changes between P2P_CLIENT and P2P_GO and simply call into
- mwifiex_change_vif_to_p2p(), which handles this just fine. We have to
- call mwifiex_cfg80211_deinit_p2p() before though to make sure the old
- p2p mode is properly uninitialized.
- Patchset: wifi
- ---
- .../net/wireless/marvell/mwifiex/cfg80211.c | 36 +++++++++++++++++++
- 1 file changed, 36 insertions(+)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 54d9e789aa14..ec5ed00b4b89 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -994,11 +994,26 @@ is_vif_type_change_allowed(struct mwifiex_adapter *adapter,
- }
-
- case NL80211_IFTYPE_P2P_CLIENT:
- + switch (new_iftype) {
- + case NL80211_IFTYPE_ADHOC:
- + case NL80211_IFTYPE_STATION:
- + return true;
- + case NL80211_IFTYPE_P2P_GO:
- + return true;
- + case NL80211_IFTYPE_AP:
- + return adapter->curr_iface_comb.uap_intf !=
- + adapter->iface_limit.uap_intf;
- + default:
- + return false;
- + }
- +
- case NL80211_IFTYPE_P2P_GO:
- switch (new_iftype) {
- case NL80211_IFTYPE_ADHOC:
- case NL80211_IFTYPE_STATION:
- return true;
- + case NL80211_IFTYPE_P2P_CLIENT:
- + return true;
- case NL80211_IFTYPE_AP:
- return adapter->curr_iface_comb.uap_intf !=
- adapter->iface_limit.uap_intf;
- @@ -1269,6 +1284,24 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- }
-
- case NL80211_IFTYPE_P2P_CLIENT:
- + if (mwifiex_cfg80211_deinit_p2p(priv))
- + return -EFAULT;
- +
- + switch (type) {
- + case NL80211_IFTYPE_ADHOC:
- + case NL80211_IFTYPE_STATION:
- + return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
- + type, params);
- + case NL80211_IFTYPE_P2P_GO:
- + return mwifiex_change_vif_to_p2p(dev, curr_iftype,
- + type, params);
- + case NL80211_IFTYPE_AP:
- + return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- + params);
- + default:
- + goto errnotsupp;
- + }
- +
- case NL80211_IFTYPE_P2P_GO:
- if (mwifiex_cfg80211_deinit_p2p(priv))
- return -EFAULT;
- @@ -1278,6 +1311,9 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- case NL80211_IFTYPE_STATION:
- return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
- type, params);
- + case NL80211_IFTYPE_P2P_CLIENT:
- + return mwifiex_change_vif_to_p2p(dev, curr_iftype,
- + type, params);
- case NL80211_IFTYPE_AP:
- return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
- params);
- --
- 2.33.0
- From 35e241e203f53307a21d57ea1a73fa17dd93b49e Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Fri, 26 Mar 2021 15:31:08 +0100
- Subject: [PATCH] mwifiex: Handle interface type changes from AP to STATION
- Looks like this case was simply overseen, so handle it, too.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 1 +
- 1 file changed, 1 insertion(+)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index ec5ed00b4b89..0fc554abfea3 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -1272,6 +1272,7 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
- case NL80211_IFTYPE_AP:
- switch (type) {
- case NL80211_IFTYPE_ADHOC:
- + case NL80211_IFTYPE_STATION:
- return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
- type, params);
- break;
- --
- 2.33.0
- From 34f1e5ab4f15920960db9a68864cb66ba20a6f2d Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Fri, 26 Mar 2021 15:32:16 +0100
- Subject: [PATCH] mwifiex: Properly initialize private structure on interface
- type changes
- When creating a new virtual interface in mwifiex_add_virtual_intf(), we
- update our internal driver states like bss_type, bss_priority, bss_role
- and bss_mode to reflect the mode the firmware will be set to.
- When switching virtual interface mode using
- mwifiex_init_new_priv_params() though, we currently only update bss_mode
- and bss_role. In order for the interface mode switch to actually work,
- we also need to update bss_type to its proper value, so do that.
- This fixes a crash of the firmware (because the driver tries to execute
- commands that are invalid in AP mode) when switching from station mode
- to AP mode.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 0fc554abfea3..7c6d31eb058c 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -912,16 +912,20 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
- switch (type) {
- case NL80211_IFTYPE_STATION:
- case NL80211_IFTYPE_ADHOC:
- - priv->bss_role = MWIFIEX_BSS_ROLE_STA;
- + priv->bss_role = MWIFIEX_BSS_ROLE_STA;
- + priv->bss_type = MWIFIEX_BSS_TYPE_STA;
- break;
- case NL80211_IFTYPE_P2P_CLIENT:
- - priv->bss_role = MWIFIEX_BSS_ROLE_STA;
- + priv->bss_role = MWIFIEX_BSS_ROLE_STA;
- + priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
- break;
- case NL80211_IFTYPE_P2P_GO:
- - priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
- + priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
- + priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
- break;
- case NL80211_IFTYPE_AP:
- priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
- + priv->bss_type = MWIFIEX_BSS_TYPE_UAP;
- break;
- default:
- mwifiex_dbg(adapter, ERROR,
- --
- 2.33.0
- From 92ba5d5ddc96e1ea6321352ff1194ac93ef3a846 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Sat, 27 Mar 2021 12:19:14 +0100
- Subject: [PATCH] mwifiex: Fix copy-paste mistake when creating virtual
- interface
- The BSS priority here for a new P2P_CLIENT device was accidentally set
- to an enum that's certainly not meant for this. Since
- MWIFIEX_BSS_ROLE_STA is 0 anyway, we can just set the bss_priority to 0
- instead here.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 7c6d31eb058c..16a94f06a518 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -3017,7 +3017,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
- priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
-
- priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II;
- - priv->bss_priority = MWIFIEX_BSS_ROLE_STA;
- + priv->bss_priority = 0;
- priv->bss_role = MWIFIEX_BSS_ROLE_STA;
- priv->bss_started = 0;
-
- --
- 2.33.0
- From a20c86dd42f62e6ef2338e5bfa0ac636bbe927e9 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 13 Apr 2021 14:30:28 +0200
- Subject: [PATCH] mwifiex: Deactive host sleep using HSCFG after it was
- activated manually
- When powersaving (so either wifi powersaving or deep sleep, depending on
- which state the firmware is in) is disabled, the way the firmware goes
- into host sleep is different: Usually the firmware implicitely enters
- host sleep on the next SLEEP event we get when we configured host sleep
- via HSCFG before. When powersaving is disabled though, there are no
- SLEEP events, the way we enter host sleep in that case is different: The
- firmware will send us a HS_ACT_REQ event and after that we "manually"
- make the firmware enter host sleep by sending it another HSCFG command
- with the action HS_ACTIVATE.
- Now waking up from host sleep appears to be different depending on
- whether powersaving is enabled again: When powersaving is enabled, the
- firmware implicitely leaves host sleep as soon as it wakes up and sends
- us an AWAKE event. When powersaving is disabled though, it apparently
- doesn't implicitely leave host sleep, but instead we need to send it a
- HSCFG command with the HS_CONFIGURE action and the HS_CFG_CANCEL
- condition. We didn't do that so far, which is why waking up from host
- sleep was broken when powersaving is disabled.
- So add some additional state to mwifiex_adapter where we keep track of
- whether host sleep was activated manually via HS_ACTIVATE, and if that
- was the case, deactivate it manually again via HS_CFG_CANCEL.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/cmdevt.c | 21 +++++++++++++++++++
- drivers/net/wireless/marvell/mwifiex/main.c | 18 ++++++++++++++++
- drivers/net/wireless/marvell/mwifiex/main.h | 1 +
- .../net/wireless/marvell/mwifiex/sta_cmd.c | 4 ++++
- 4 files changed, 44 insertions(+)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
- index 60db2b969e20..c7db969aa11d 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
- @@ -604,6 +604,11 @@ int mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no,
- return -1;
- }
-
- + if (priv->adapter->hs_activated_manually &&
- + cmd_no != HostCmd_CMD_802_11_HS_CFG_ENH) {
- + mwifiex_cancel_hs(priv, MWIFIEX_ASYNC_CMD);
- + priv->adapter->hs_activated_manually = false;
- + }
-
- /* Get a new command node */
- cmd_node = mwifiex_get_cmd_node(adapter);
- @@ -711,6 +716,15 @@ mwifiex_insert_cmd_to_pending_q(struct mwifiex_adapter *adapter,
- }
- }
-
- + /* Same with exit host sleep cmd, luckily that can't happen at the same time as EXIT_PS */
- + if (command == HostCmd_CMD_802_11_HS_CFG_ENH) {
- + struct host_cmd_ds_802_11_hs_cfg_enh *hs_cfg =
- + &host_cmd->params.opt_hs_cfg;
- +
- + if (le16_to_cpu(hs_cfg->action) == HS_ACTIVATE)
- + add_tail = false;
- + }
- +
- spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
- if (add_tail)
- list_add_tail(&cmd_node->list, &adapter->cmd_pending_q);
- @@ -1215,6 +1229,13 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter)
- __func__);
-
- adapter->if_ops.wakeup(adapter);
- +
- + if (adapter->hs_activated_manually) {
- + mwifiex_cancel_hs(mwifiex_get_priv (adapter, MWIFIEX_BSS_ROLE_ANY),
- + MWIFIEX_ASYNC_CMD);
- + adapter->hs_activated_manually = false;
- + }
- +
- adapter->hs_activated = false;
- clear_bit(MWIFIEX_IS_HS_CONFIGURED, &adapter->work_flags);
- clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
- diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
- index ceac611ef086..fd55f502dd2e 100644
- --- a/drivers/net/wireless/marvell/mwifiex/main.c
- +++ b/drivers/net/wireless/marvell/mwifiex/main.c
- @@ -402,6 +402,12 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
- !adapter->scan_processing) &&
- !adapter->data_sent &&
- !skb_queue_empty(&adapter->tx_data_q)) {
- + if (adapter->hs_activated_manually) {
- + mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY),
- + MWIFIEX_ASYNC_CMD);
- + adapter->hs_activated_manually = false;
- + }
- +
- mwifiex_process_tx_queue(adapter);
- if (adapter->hs_activated) {
- clear_bit(MWIFIEX_IS_HS_CONFIGURED,
- @@ -419,6 +425,12 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
- !mwifiex_bypass_txlist_empty(adapter) &&
- !mwifiex_is_tdls_chan_switching
- (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA))) {
- + if (adapter->hs_activated_manually) {
- + mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY),
- + MWIFIEX_ASYNC_CMD);
- + adapter->hs_activated_manually = false;
- + }
- +
- mwifiex_process_bypass_tx(adapter);
- if (adapter->hs_activated) {
- clear_bit(MWIFIEX_IS_HS_CONFIGURED,
- @@ -435,6 +447,12 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
- !adapter->data_sent && !mwifiex_wmm_lists_empty(adapter) &&
- !mwifiex_is_tdls_chan_switching
- (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA))) {
- + if (adapter->hs_activated_manually) {
- + mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY),
- + MWIFIEX_ASYNC_CMD);
- + adapter->hs_activated_manually = false;
- + }
- +
- mwifiex_wmm_process_tx(adapter);
- if (adapter->hs_activated) {
- clear_bit(MWIFIEX_IS_HS_CONFIGURED,
- diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
- index 7e526014b638..96395854c085 100644
- --- a/drivers/net/wireless/marvell/mwifiex/main.h
- +++ b/drivers/net/wireless/marvell/mwifiex/main.h
- @@ -986,6 +986,7 @@ struct mwifiex_adapter {
- struct timer_list wakeup_timer;
- struct mwifiex_hs_config_param hs_cfg;
- u8 hs_activated;
- + u8 hs_activated_manually;
- u16 hs_activate_wait_q_woken;
- wait_queue_head_t hs_activate_wait_q;
- u8 event_body[MAX_EVENT_SIZE];
- diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
- index 4ed10cf82f9a..057c810a9ef7 100644
- --- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
- +++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
- @@ -396,6 +396,10 @@ mwifiex_cmd_802_11_hs_cfg(struct mwifiex_private *priv,
- if (hs_activate) {
- hs_cfg->action = cpu_to_le16(HS_ACTIVATE);
- hs_cfg->params.hs_activate.resp_ctrl = cpu_to_le16(RESP_NEEDED);
- +
- + adapter->hs_activated_manually = true;
- + mwifiex_dbg(priv->adapter, CMD,
- + "cmd: Activating host sleep manually\n");
- } else {
- hs_cfg->action = cpu_to_le16(HS_CONFIGURE);
- hs_cfg->params.hs_config.conditions = hscfg_param->conditions;
- --
- 2.33.0
- From 9d470202ac7c2a374da22666b7a0d1135cb99995 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 13 Apr 2021 14:23:05 +0200
- Subject: [PATCH] mwifiex: Add quirk to disable deep sleep with certain
- hardware revision
- The 88W8897 pcie card with the hardware revision 20 apparently has a
- hardware issue where the card wakes up from deep sleep randomly and very
- often, somewhat depending on the card activity, maybe the hardware has a
- floating wakeup pin or something.
- Those continuous wakeups prevent the card from entering host sleep when
- the computer suspends. And because the host won't answer to events from
- the card anymore while it's suspended, the firmwares internal
- powersaving state machine seems to get confused and the card can't sleep
- anymore at all after that.
- Since we can't work around that hardware bug in the firmware, let's
- get the hardware revision string from the firmware and match it with
- known bad revisions. Then disable auto deep sleep for those revisions,
- which makes sure we no longer get those spurious wakeups.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/main.c | 14 ++++++++++++++
- drivers/net/wireless/marvell/mwifiex/main.h | 1 +
- .../net/wireless/marvell/mwifiex/sta_cmdresp.c | 16 ++++++++++++++++
- 3 files changed, 31 insertions(+)
- diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
- index fd55f502dd2e..7159033fcc2e 100644
- --- a/drivers/net/wireless/marvell/mwifiex/main.c
- +++ b/drivers/net/wireless/marvell/mwifiex/main.c
- @@ -227,6 +227,19 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
- return 0;
- }
-
- +static void maybe_quirk_fw_disable_ds(struct mwifiex_adapter *adapter)
- +{
- + struct mwifiex_private *priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA);
- + struct mwifiex_ver_ext ver_ext;
- +
- + set_bit(MWIFIEX_IS_REQUESTING_FW_VEREXT, &adapter->work_flags);
- +
- + memset(&ver_ext, 0, sizeof(ver_ext));
- + ver_ext.version_str_sel = 1;
- + mwifiex_send_cmd(priv, HostCmd_CMD_VERSION_EXT,
- + HostCmd_ACT_GEN_GET, 0, &ver_ext, false);
- +}
- +
- /*
- * The main process.
- *
- @@ -357,6 +370,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
- if (adapter->hw_status == MWIFIEX_HW_STATUS_INIT_DONE) {
- adapter->hw_status = MWIFIEX_HW_STATUS_READY;
- mwifiex_init_fw_complete(adapter);
- + maybe_quirk_fw_disable_ds(adapter);
- }
- }
-
- diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
- index 96395854c085..fa84258f042a 100644
- --- a/drivers/net/wireless/marvell/mwifiex/main.h
- +++ b/drivers/net/wireless/marvell/mwifiex/main.h
- @@ -524,6 +524,7 @@ enum mwifiex_adapter_work_flags {
- MWIFIEX_IS_SUSPENDED,
- MWIFIEX_IS_HS_CONFIGURED,
- MWIFIEX_IS_HS_ENABLING,
- + MWIFIEX_IS_REQUESTING_FW_VEREXT,
- };
-
- struct mwifiex_band_config {
- diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
- index 7003767eef42..3079ca3e3fdc 100644
- --- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
- +++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
- @@ -708,6 +708,22 @@ static int mwifiex_ret_ver_ext(struct mwifiex_private *priv,
- {
- struct host_cmd_ds_version_ext *ver_ext = &resp->params.verext;
-
- + if (test_and_clear_bit(MWIFIEX_IS_REQUESTING_FW_VEREXT, &priv->adapter->work_flags)) {
- + if (strncmp(ver_ext->version_str, "ChipRev:20, BB:9b(10.00), RF:40(21)", 128) == 0) {
- + struct mwifiex_ds_auto_ds auto_ds = {
- + .auto_ds = DEEP_SLEEP_OFF,
- + };
- +
- + mwifiex_dbg(priv->adapter, MSG,
- + "Bad HW revision detected, disabling deep sleep\n");
- +
- + mwifiex_send_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
- + DIS_AUTO_PS, BITMAP_AUTO_DS, &auto_ds, false);
- + }
- +
- + return 0;
- + }
- +
- if (version_ext) {
- version_ext->version_str_sel = ver_ext->version_str_sel;
- memcpy(version_ext->version_str, ver_ext->version_str,
- --
- 2.33.0
- From 8ab64537c8da107d3803bba61e904269ac0e265a Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Wed, 11 Nov 2020 15:17:07 +0100
- Subject: [PATCH] mwifiex: Don't log error on suspend if wake-on-wlan is
- disabled
- It's not an error if someone chooses to put their computer to sleep, not
- wanting it to wake up because the person next door has just discovered
- what a magic packet is. So change the loglevel of this annoying message
- from ERROR to INFO.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 16a94f06a518..92d5c9aa5ec7 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -3457,7 +3457,7 @@ static int mwifiex_cfg80211_suspend(struct wiphy *wiphy,
- }
-
- if (!wowlan) {
- - mwifiex_dbg(adapter, ERROR,
- + mwifiex_dbg(adapter, INFO,
- "None of the WOWLAN triggers enabled\n");
- ret = 0;
- goto done;
- --
- 2.33.0
- From e3854660e8665e0bb7f2a9601094e41a720de905 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Sun, 28 Mar 2021 21:42:54 +0200
- Subject: [PATCH] mwifiex: Log an error on command failure during key-material
- upload
- Sometimes the KEY_MATERIAL command can fail with the 88W8897 firmware
- (when this happens exactly seems pretty random). This appears to prevent
- the access point from starting, so it seems like a good idea to log an
- error in that case.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 10 ++++++++--
- 1 file changed, 8 insertions(+), 2 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- index 92d5c9aa5ec7..5786dcea79cc 100644
- --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
- @@ -523,8 +523,14 @@ mwifiex_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
- encrypt_key.is_igtk_def_key = true;
- eth_broadcast_addr(encrypt_key.mac_addr);
-
- - return mwifiex_send_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- - HostCmd_ACT_GEN_SET, true, &encrypt_key, true);
- + if (mwifiex_send_cmd(priv, HostCmd_CMD_802_11_KEY_MATERIAL,
- + HostCmd_ACT_GEN_SET, true, &encrypt_key, true)) {
- + mwifiex_dbg(priv->adapter, ERROR,
- + "Sending KEY_MATERIAL command failed\n");
- + return -1;
- + }
- +
- + return 0;
- }
-
- /*
- --
- 2.33.0
- From 7a49607e0d149fa55126a3e86b9487d807647d7c Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 13 Apr 2021 12:44:03 +0200
- Subject: [PATCH] mwifiex: Fix an incorrect comment
- We're sending DELBA requests here, not ADDBA requests.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/11n.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c
- index 5d75c971004b..b36b2103d555 100644
- --- a/drivers/net/wireless/marvell/mwifiex/11n.c
- +++ b/drivers/net/wireless/marvell/mwifiex/11n.c
- @@ -127,7 +127,7 @@ int mwifiex_ret_11n_delba(struct mwifiex_private *priv,
- tx_ba_tbl->ra);
- } else { /*
- * In case of failure, recreate the deleted stream in case
- - * we initiated the ADDBA
- + * we initiated the DELBA
- */
- if (!INITIATOR_BIT(del_ba_param_set))
- return 0;
- --
- 2.33.0
- From 35223ec3a57e7f5db3a1f592f44951b4ba3f9a8e Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 13 Apr 2021 12:45:59 +0200
- Subject: [PATCH] mwifiex: Send DELBA requests according to spec
- We're currently failing to set the initiator bit for DELBA requests:
- While we set the bit on our del_ba_param_set bitmask, we forget to
- actually copy that bitmask over to the command struct, which means we
- never actually set the initiator bit.
- Fix that and copy the bitmask over to the host_cmd_ds_11n_delba command
- struct.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/11n.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c
- index b36b2103d555..4ed6ae8a96f1 100644
- --- a/drivers/net/wireless/marvell/mwifiex/11n.c
- +++ b/drivers/net/wireless/marvell/mwifiex/11n.c
- @@ -664,14 +664,15 @@ int mwifiex_send_delba(struct mwifiex_private *priv, int tid, u8 *peer_mac,
- uint16_t del_ba_param_set;
-
- memset(&delba, 0, sizeof(delba));
- - delba.del_ba_param_set = cpu_to_le16(tid << DELBA_TID_POS);
-
- - del_ba_param_set = le16_to_cpu(delba.del_ba_param_set);
- + del_ba_param_set = tid << DELBA_TID_POS;
- +
- if (initiator)
- del_ba_param_set |= IEEE80211_DELBA_PARAM_INITIATOR_MASK;
- else
- del_ba_param_set &= ~IEEE80211_DELBA_PARAM_INITIATOR_MASK;
-
- + delba.del_ba_param_set = cpu_to_le16(del_ba_param_set);
- memcpy(&delba.peer_mac_addr, peer_mac, ETH_ALEN);
-
- /* We don't wait for the response of this command */
- --
- 2.33.0
- From 64af2962611212536a1189a51934c720e373b51d Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
- Date: Tue, 13 Apr 2021 12:57:41 +0200
- Subject: [PATCH] mwifiex: Ignore BTCOEX events from the firmware
- The firmware of the pcie 88W8897 chip sends those events very
- unreliably, which means we sometimes end up actually capping the window
- size while bluetooth is disabled, artifically limiting wifi speeds even
- though it's not needed.
- Since we can't fix the firmware, let's just ignore those events, it
- seems that the Windows driver also doesn't change the rx/tx block ack
- buffer sizes when bluetooth gets enabled or disabled, so this is
- consistent with the Windows driver.
- Patchset: wifi
- ---
- drivers/net/wireless/marvell/mwifiex/sta_event.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
- diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c
- index a327fc5b36e3..6228971d9b8b 100644
- --- a/drivers/net/wireless/marvell/mwifiex/sta_event.c
- +++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c
- @@ -1058,9 +1058,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
- adapter->event_skb);
- break;
- case EVENT_BT_COEX_WLAN_PARA_CHANGE:
- - dev_dbg(adapter->dev, "EVENT: BT coex wlan param update\n");
- - mwifiex_bt_coex_wlan_param_update_event(priv,
- - adapter->event_skb);
- + dev_dbg(adapter->dev, "EVENT: ignoring BT coex wlan param update\n");
- break;
- case EVENT_RXBA_SYNC:
- dev_dbg(adapter->dev, "EVENT: RXBA_SYNC\n");
- --
- 2.33.0
|