diff mbox

[Xenial,SRU] UBUNTU: SAUCE: Redpine: Upgrade to ver. 1.2.RC12

Message ID 20170602092727.12826-1-shrirang.bagul@canonical.com
State New
Headers show

Commit Message

Shrirang Bagul June 2, 2017, 9:27 a.m. UTC
BugLink: https://bugs.launchpad.net/bugs/1694607

Vendor release ver: 1.2.RC12

Changelog:

1.2.RC12 -
    WLAN Bug Fixes:
    ---------------
    1) WoWLAN stress test cases issue resolved (when all wifi, bt, ble
    traffics run and suspend)

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) Low throughput observed for TCP downlink traffic in Coex mode

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC11 -
    WLAN New Features:
    ------------------
    1) Module parameter for debug level(ven_rsi_zone_enabled) is added.
    2) Regulatory changes for Caracalla added

    WLAN Bug Fixes:
    ---------------
    1) Legacy power save issue is fixed.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) Low throughput observed for TCP downlink traffic in Coex mode

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC10 -
    WLAN Bug Fixes:
    ---------------
    1) 1 minute time delay in sdio resume issue is resolved (Reduced to 10s).
    2) Fail in multiple iterations of hibernate issue is resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT New Features:
    ----------------
    1) BT classic + BT LE mode is supported

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC9 -
    WLAN Bug Fixes:
    ---------------
    1) BT reset added before going to S3/S4/S5 sleep when WoWLAN is enabled.
    2) Station connection check before going to S3/S4/S5 sleep removed.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC8 -
    WLAN Bug Fixes:
    ---------------
    1) Added power leak fixes for S4.
    2) S5 WoLAN issue resolved.
    3) Wakeup short pulse issue resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC7 -
    WLAN Bug Fixes:
    ---------------
    1) Configured host wakeup pin as active low from driver.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC6 -
    WLAN Bug Fixes:
    ---------------
    1) AP data throughput issue resolved.
    2) Scan results issue resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC4 -
    WLAN Bug Fixes:
    ---------------
    1) Buffer status interrupt handling improved.
    2) Scan results update in sta+bt dual mode issue resolved

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC3 -
    WLAN Bug Fixes:
    ---------------
    1) WoWLAN multiple cycles issue resolved.
    2) Driver Version is correctly updated.
    3) Default operating mode for Caracalla board is corrected.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.

    BT New Features:
    ----------------
    1) Multiple slaves issue in WLAN-BT coex mode resolved.

    BT Limitations/Features NOT Supported:
    --------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC2 -
    WLAN Bug Fixes:
    ---------------
    1) Suspend/resume issues resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) EAP not tested

    BT Limitations/Features NOT Supported:
    --------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.2.RC1 -
    WLAN New Features:
    ------------------
    1) Restrict functional modes as per device operating mode
    2) Default operating mode for Caracalla board is 13

    WLAN Bug Fixes:
    ---------------
    1) Driver oops issue if more than 4 clients try to connect in
       operating mode 14 resolved.
    2) Issue with connecting more than max clients and disconnection
       issue resolved.
    3) L2 test stop when wlan interface down issue resolved.
    4) Driver version corrected.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) EAP not tested
    4) For channels 12 and 13 in US region max TX power is coming 0 in
       beacons.

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated
       from rsi module.
    2) In coex mode, BT file transfer fails at times with certain
       mobiles.

1.1 -
    Generic
    -------
    1) Firmware file name is displayed along with version information.
       at the driver load time.
    2) Device operating mode is made available in the below files:
       /sys/module/rsi_sdio/parameters/dev_oper_mode
       /sys/module/rsi_usb/parameters/dev_oper_mode
    3) Wi-Fi BT radio sharing has been improved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) EAP not tested
    4) For channels 12 and 13 in US region max TX power is coming 0 in beacons.

    BT Limitations/Features NOT Supported:
    --------------------------------------
    1) To connect multiple BT slaves, connection should be initiated from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.0.RC7 -
    Generic
    -------
    1) Driver version, Firmware version and operating mode information is displayed
       at the driver load time.
    2) Driver version is made available in the below files:
       /sys/module/rsi_91x/version
       /sys/module/rsi_sdio/version
       /sys/module/rsi_usb/version

    WLAN Bug Fixes:
    ---------------
    1) Power save latencies resolved

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) EAP not tested

    BT Limitations/Features NOT Supported:
    --------------------------------------
    1) To connect multiple BT slaves, connection should be initiated from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.0 -
    WLAN New Features:
    ------------------
    1) Station mode
    2) All Security modes (WEP/WPA/WPA2)
    3) Station Power save (legacy and UAPSD)
    4) Bgscan and roaming
    5) External antenna selection
    6) Neighbour report request in RRM
    7) Regulatory (802)11d) support
    8) Management frame protection support (802)11w)
    9) Software RF-kill
    10) AP mode
    11) S3, S4 suspend and resume
    12) WoWLAN
    13) AP Power save
    14) Wi-Fi direct

    WLAN Bug Fixes:
    ---------------
    1) Allowed channels 12 and 13 in FCC region.
    2) For the allowed channels 12 and 13 in any region, power configuration
       updated as per Caracalla regulatory rules.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S5 with WoWLAN does not work.
    2) For GTK rekey, wakeup trigger send to host.
    3) EAP not tested

    BT New Features:
    ----------------
    1) BT EDR mode
    2) BT LE mode
    3) BT coex mode (All the coex modes))
    4) Multi-slave mode supported)

    BT Limitations/Features NOT Supported:
    ----------------------------------------
    1) To connect multiple BT slaves, connection should be initiated from rsi module.
    2) In coex mode, BT file transfer fails at times with certain mobiles.

1.0_RC3 -
    Gerenic:
    --------
    1) Device operating mode is changed as module parameter. Please check
       README or TRM on how to configure this while loading the modules.
    2) Max number of stations supported in Wi-Fi AP alone mode is 32, and AP +
       BT coex mode is 4.
    3) AP + BT-EDR + BLE support added.

    WLAN Bug Fixes:
    ---------------
    1) Bgscan probe request issue resolved.
    2) WoWLAN before association issue resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) S4 with and without WoWLAN works with the work-around implemented by Canonical.
    2) S5 with WoWLAN does not work.
    3) For GTK rekey, wakeup trigger send to host.
    4) EAP not tested
    5) To connect multiple BT slaves, connection should be initiated from rsi module.
    6) In coex mode, BT file transfer fails at times with certain mobiles.

    BT New Features:
    ----------------
    1) Multi-slave mode supported.

    BT Bug Fixes:
    -------------
    1) Radio sharing of coex modes improved.

1.0.RC2 -
    WLAN Bug Fixes:
    ---------------
    1) PVB preparation issue in AP mode resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Issue while Resume in S4 with or without WoWLAN.
    3) S5 with WoWLAN does not work.
    4) For GTK rekey, wakeup trigger send to host.

    BT Bug Fixes:
    -------------
    1) BT dual mode disconnection issue resolved
    2) AP BT dual mode issue resolved

1.0_RC1 -
    WLAN Bug Fixes:
    ---------------
    1) WoWLAN in Co-ex mode issue resolved.
    2) AP beacon DTIM count update issue resolved.
    3) Firmware assertion (0x5d) in bgscan issue is resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Issue while Resume in S4 with or without WoWLAN.
    3) S5 with WoWLAN does not work.
    4) For GTK rekey, wakeup trigger send to host.

0.9.8.5_RC6 -
    WLAN Bug Fixes:
    ---------------
    1) Firmware CRC check fail issue resolved
    2) Compilation fails on 4.10.1 kernel issue resolved
    3) BG scan issues resolved
    4) AP mode regulatory fixes
    5) WoWLAN issues resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Issue while Resume in S4 with or without WoWLAN.
    3) S5 with WoWLAN does not work.
    4) For GTK rekey, wakeup trigger send to host.

0.9.8.5_RC4 -
    WLAN Bug Fixes:
    -------------------
    1) AP mode configuration in channels 12 and 13 for EU region issue resolved.
    2) Data latencies in AP mode issue resolved.
    3) Roaming issues resolved.
    4) AP WEP mode issue resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Issue while Resume in S4 with or without WoWLAN.
    3) S5 with WoWLAN does not work.
    4) For GTK rekey, wakeup trigger send to host.
    5) WoWLAN does not work in WEP mode.

    Others:
    -------
    1) USB binds only to RS9113, let upstream kernel driver handle other RSI chips

0.9.8.5_RC3 -
    WLAN Bug Fixes:
    -------------------
    1) Power save issue in station mode (By default UAPSD is enabled on
    Caracalla board) fixed.
    2) WoWLAN with S3 issue resolved

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Not verified removing SDIO interrupt polling
    3) S4/S5 sleep states not supported (with and without WoWLAN)

0.9.8.5_RC2 -
    WLAN Bug Fixes:
    -------------------
    1) Power save issue in station mode (By default UAPSD is enabled on
    Caracalla board) fixed.
    2) Firmware assert 0x71 (while doing bgscan) issue fixed.
    3) Keep alive functionality in station mode issue fixed.
    4) Data traffic stops when connected to multiple stations issue resolved
    5) WoWLAN not working issue is resolved

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Not verified removing SDIO interrupt polling
    3) S4/S5 sleep states not supported (with and without WoWLAN)
    4) Wi-Fi direct testing is in progress

0.9.8.5_RC1 -
    WLAN Bug Fixes:
    -------------------
    1) Observed unicast probe requests during bgscan issue fixed
    2) Firmware assert 0x71 (while doing bgscan) issue fixed.
    3) Crash when doing rmmod while data traffic is going on issue resolved.
    4) Beacons stopped after 5 minutes of data traffic issue fixed.
    5) Keep alive functionality in station mode issue fixed
    6) 11n data rates issue in station mode resolved.

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) EAP not supported
    2) Not verified removing SDIO interrupt polling
    3) S4/S5 sleep states not supported (with.without WoWLAN)
    4) power save is not working consistently
    5) WoWLAN is not working consistently

0.9.8.3 -
    WLAN New Features:
    -----------------------------------------
    1) AP Mode
    2) S3, S4 suspend and resume
    3) WoWLAN [Testing in progress]

    WLAN Bug Fixes:
    -------------------
    1) First EAPOL drop issue is resolved
    2) Firmware Assert while roaming issue is resolved
       (Provide driver bgsan should be enabled along with supplicant bgscan)
    3) Roaming takes longer time issue is resolved
    4) Added polling support as a work-around for the SDIO interrupt issue
       on some platforms

    WLAN Limitations/Features NOT Supported:
    ----------------------------------------
    1) Wi-Fi Direct mode not supported
    2) EAP not supported
    3) SDIO interrupts are not being delivered to the 9113 driver
    4) In S4 state 9113 device gets reset but device isn't getting re-enumerated.

Signed-off-by: Shrirang Bagul <shrirang.bagul@canonical.com>
---
 ubuntu/rsi/rsi_91x_core.c     |   3 ++
 ubuntu/rsi/rsi_91x_hci.c      |   2 -
 ubuntu/rsi/rsi_91x_mac80211.c | 106 +++++++++++++++++++++++++++++++++++-------
 ubuntu/rsi/rsi_91x_main.c     |  12 ++++-
 ubuntu/rsi/rsi_91x_sdio.c     |  79 +++++++++++++++++--------------
 ubuntu/rsi/rsi_main.h         |   8 +++-
 6 files changed, 151 insertions(+), 59 deletions(-)

Comments

Stefan Bader June 2, 2017, 10:18 a.m. UTC | #1
Only touches special driver.

-Stefan
Colin Ian King June 2, 2017, 11:17 a.m. UTC | #2
On 02/06/17 10:27, Shrirang Bagul wrote:
> BugLink: https://bugs.launchpad.net/bugs/1694607
> 
> Vendor release ver: 1.2.RC12
> 
> Changelog:
> 
> 1.2.RC12 -
>     WLAN Bug Fixes:
>     ---------------
>     1) WoWLAN stress test cases issue resolved (when all wifi, bt, ble
>     traffics run and suspend)
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) Low throughput observed for TCP downlink traffic in Coex mode
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC11 -
>     WLAN New Features:
>     ------------------
>     1) Module parameter for debug level(ven_rsi_zone_enabled) is added.
>     2) Regulatory changes for Caracalla added
> 
>     WLAN Bug Fixes:
>     ---------------
>     1) Legacy power save issue is fixed.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) Low throughput observed for TCP downlink traffic in Coex mode
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC10 -
>     WLAN Bug Fixes:
>     ---------------
>     1) 1 minute time delay in sdio resume issue is resolved (Reduced to 10s).
>     2) Fail in multiple iterations of hibernate issue is resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT New Features:
>     ----------------
>     1) BT classic + BT LE mode is supported
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC9 -
>     WLAN Bug Fixes:
>     ---------------
>     1) BT reset added before going to S3/S4/S5 sleep when WoWLAN is enabled.
>     2) Station connection check before going to S3/S4/S5 sleep removed.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC8 -
>     WLAN Bug Fixes:
>     ---------------
>     1) Added power leak fixes for S4.
>     2) S5 WoLAN issue resolved.
>     3) Wakeup short pulse issue resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC7 -
>     WLAN Bug Fixes:
>     ---------------
>     1) Configured host wakeup pin as active low from driver.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC6 -
>     WLAN Bug Fixes:
>     ---------------
>     1) AP data throughput issue resolved.
>     2) Scan results issue resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC4 -
>     WLAN Bug Fixes:
>     ---------------
>     1) Buffer status interrupt handling improved.
>     2) Scan results update in sta+bt dual mode issue resolved
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC3 -
>     WLAN Bug Fixes:
>     ---------------
>     1) WoWLAN multiple cycles issue resolved.
>     2) Driver Version is correctly updated.
>     3) Default operating mode for Caracalla board is corrected.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
> 
>     BT New Features:
>     ----------------
>     1) Multiple slaves issue in WLAN-BT coex mode resolved.
> 
>     BT Limitations/Features NOT Supported:
>     --------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC2 -
>     WLAN Bug Fixes:
>     ---------------
>     1) Suspend/resume issues resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) EAP not tested
> 
>     BT Limitations/Features NOT Supported:
>     --------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.2.RC1 -
>     WLAN New Features:
>     ------------------
>     1) Restrict functional modes as per device operating mode
>     2) Default operating mode for Caracalla board is 13
> 
>     WLAN Bug Fixes:
>     ---------------
>     1) Driver oops issue if more than 4 clients try to connect in
>        operating mode 14 resolved.
>     2) Issue with connecting more than max clients and disconnection
>        issue resolved.
>     3) L2 test stop when wlan interface down issue resolved.
>     4) Driver version corrected.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) EAP not tested
>     4) For channels 12 and 13 in US region max TX power is coming 0 in
>        beacons.
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated
>        from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain
>        mobiles.
> 
> 1.1 -
>     Generic
>     -------
>     1) Firmware file name is displayed along with version information.
>        at the driver load time.
>     2) Device operating mode is made available in the below files:
>        /sys/module/rsi_sdio/parameters/dev_oper_mode
>        /sys/module/rsi_usb/parameters/dev_oper_mode
>     3) Wi-Fi BT radio sharing has been improved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) EAP not tested
>     4) For channels 12 and 13 in US region max TX power is coming 0 in beacons.
> 
>     BT Limitations/Features NOT Supported:
>     --------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.0.RC7 -
>     Generic
>     -------
>     1) Driver version, Firmware version and operating mode information is displayed
>        at the driver load time.
>     2) Driver version is made available in the below files:
>        /sys/module/rsi_91x/version
>        /sys/module/rsi_sdio/version
>        /sys/module/rsi_usb/version
> 
>     WLAN Bug Fixes:
>     ---------------
>     1) Power save latencies resolved
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) EAP not tested
> 
>     BT Limitations/Features NOT Supported:
>     --------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.0 -
>     WLAN New Features:
>     ------------------
>     1) Station mode
>     2) All Security modes (WEP/WPA/WPA2)
>     3) Station Power save (legacy and UAPSD)
>     4) Bgscan and roaming
>     5) External antenna selection
>     6) Neighbour report request in RRM
>     7) Regulatory (802)11d) support
>     8) Management frame protection support (802)11w)
>     9) Software RF-kill
>     10) AP mode
>     11) S3, S4 suspend and resume
>     12) WoWLAN
>     13) AP Power save
>     14) Wi-Fi direct
> 
>     WLAN Bug Fixes:
>     ---------------
>     1) Allowed channels 12 and 13 in FCC region.
>     2) For the allowed channels 12 and 13 in any region, power configuration
>        updated as per Caracalla regulatory rules.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S5 with WoWLAN does not work.
>     2) For GTK rekey, wakeup trigger send to host.
>     3) EAP not tested
> 
>     BT New Features:
>     ----------------
>     1) BT EDR mode
>     2) BT LE mode
>     3) BT coex mode (All the coex modes))
>     4) Multi-slave mode supported)
> 
>     BT Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) To connect multiple BT slaves, connection should be initiated from rsi module.
>     2) In coex mode, BT file transfer fails at times with certain mobiles.
> 
> 1.0_RC3 -
>     Gerenic:
>     --------
>     1) Device operating mode is changed as module parameter. Please check
>        README or TRM on how to configure this while loading the modules.
>     2) Max number of stations supported in Wi-Fi AP alone mode is 32, and AP +
>        BT coex mode is 4.
>     3) AP + BT-EDR + BLE support added.
> 
>     WLAN Bug Fixes:
>     ---------------
>     1) Bgscan probe request issue resolved.
>     2) WoWLAN before association issue resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) S4 with and without WoWLAN works with the work-around implemented by Canonical.
>     2) S5 with WoWLAN does not work.
>     3) For GTK rekey, wakeup trigger send to host.
>     4) EAP not tested
>     5) To connect multiple BT slaves, connection should be initiated from rsi module.
>     6) In coex mode, BT file transfer fails at times with certain mobiles.
> 
>     BT New Features:
>     ----------------
>     1) Multi-slave mode supported.
> 
>     BT Bug Fixes:
>     -------------
>     1) Radio sharing of coex modes improved.
> 
> 1.0.RC2 -
>     WLAN Bug Fixes:
>     ---------------
>     1) PVB preparation issue in AP mode resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Issue while Resume in S4 with or without WoWLAN.
>     3) S5 with WoWLAN does not work.
>     4) For GTK rekey, wakeup trigger send to host.
> 
>     BT Bug Fixes:
>     -------------
>     1) BT dual mode disconnection issue resolved
>     2) AP BT dual mode issue resolved
> 
> 1.0_RC1 -
>     WLAN Bug Fixes:
>     ---------------
>     1) WoWLAN in Co-ex mode issue resolved.
>     2) AP beacon DTIM count update issue resolved.
>     3) Firmware assertion (0x5d) in bgscan issue is resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Issue while Resume in S4 with or without WoWLAN.
>     3) S5 with WoWLAN does not work.
>     4) For GTK rekey, wakeup trigger send to host.
> 
> 0.9.8.5_RC6 -
>     WLAN Bug Fixes:
>     ---------------
>     1) Firmware CRC check fail issue resolved
>     2) Compilation fails on 4.10.1 kernel issue resolved
>     3) BG scan issues resolved
>     4) AP mode regulatory fixes
>     5) WoWLAN issues resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Issue while Resume in S4 with or without WoWLAN.
>     3) S5 with WoWLAN does not work.
>     4) For GTK rekey, wakeup trigger send to host.
> 
> 0.9.8.5_RC4 -
>     WLAN Bug Fixes:
>     -------------------
>     1) AP mode configuration in channels 12 and 13 for EU region issue resolved.
>     2) Data latencies in AP mode issue resolved.
>     3) Roaming issues resolved.
>     4) AP WEP mode issue resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Issue while Resume in S4 with or without WoWLAN.
>     3) S5 with WoWLAN does not work.
>     4) For GTK rekey, wakeup trigger send to host.
>     5) WoWLAN does not work in WEP mode.
> 
>     Others:
>     -------
>     1) USB binds only to RS9113, let upstream kernel driver handle other RSI chips
> 
> 0.9.8.5_RC3 -
>     WLAN Bug Fixes:
>     -------------------
>     1) Power save issue in station mode (By default UAPSD is enabled on
>     Caracalla board) fixed.
>     2) WoWLAN with S3 issue resolved
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Not verified removing SDIO interrupt polling
>     3) S4/S5 sleep states not supported (with and without WoWLAN)
> 
> 0.9.8.5_RC2 -
>     WLAN Bug Fixes:
>     -------------------
>     1) Power save issue in station mode (By default UAPSD is enabled on
>     Caracalla board) fixed.
>     2) Firmware assert 0x71 (while doing bgscan) issue fixed.
>     3) Keep alive functionality in station mode issue fixed.
>     4) Data traffic stops when connected to multiple stations issue resolved
>     5) WoWLAN not working issue is resolved
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Not verified removing SDIO interrupt polling
>     3) S4/S5 sleep states not supported (with and without WoWLAN)
>     4) Wi-Fi direct testing is in progress
> 
> 0.9.8.5_RC1 -
>     WLAN Bug Fixes:
>     -------------------
>     1) Observed unicast probe requests during bgscan issue fixed
>     2) Firmware assert 0x71 (while doing bgscan) issue fixed.
>     3) Crash when doing rmmod while data traffic is going on issue resolved.
>     4) Beacons stopped after 5 minutes of data traffic issue fixed.
>     5) Keep alive functionality in station mode issue fixed
>     6) 11n data rates issue in station mode resolved.
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) EAP not supported
>     2) Not verified removing SDIO interrupt polling
>     3) S4/S5 sleep states not supported (with.without WoWLAN)
>     4) power save is not working consistently
>     5) WoWLAN is not working consistently
> 
> 0.9.8.3 -
>     WLAN New Features:
>     -----------------------------------------
>     1) AP Mode
>     2) S3, S4 suspend and resume
>     3) WoWLAN [Testing in progress]
> 
>     WLAN Bug Fixes:
>     -------------------
>     1) First EAPOL drop issue is resolved
>     2) Firmware Assert while roaming issue is resolved
>        (Provide driver bgsan should be enabled along with supplicant bgscan)
>     3) Roaming takes longer time issue is resolved
>     4) Added polling support as a work-around for the SDIO interrupt issue
>        on some platforms
> 
>     WLAN Limitations/Features NOT Supported:
>     ----------------------------------------
>     1) Wi-Fi Direct mode not supported
>     2) EAP not supported
>     3) SDIO interrupts are not being delivered to the 9113 driver
>     4) In S4 state 9113 device gets reset but device isn't getting re-enumerated.
> 
> Signed-off-by: Shrirang Bagul <shrirang.bagul@canonical.com>
> ---
>  ubuntu/rsi/rsi_91x_core.c     |   3 ++
>  ubuntu/rsi/rsi_91x_hci.c      |   2 -
>  ubuntu/rsi/rsi_91x_mac80211.c | 106 +++++++++++++++++++++++++++++++++++-------
>  ubuntu/rsi/rsi_91x_main.c     |  12 ++++-
>  ubuntu/rsi/rsi_91x_sdio.c     |  79 +++++++++++++++++--------------
>  ubuntu/rsi/rsi_main.h         |   8 +++-
>  6 files changed, 151 insertions(+), 59 deletions(-)
> 
> diff --git a/ubuntu/rsi/rsi_91x_core.c b/ubuntu/rsi/rsi_91x_core.c
> index a349f973f0e8..db320e235388 100644
> --- a/ubuntu/rsi/rsi_91x_core.c
> +++ b/ubuntu/rsi/rsi_91x_core.c
> @@ -292,6 +292,9 @@ void rsi_core_qos_processor(struct rsi_common *common)
>  		if (q_num == INVALID_QUEUE)
>  			break;
>  
> +		if (common->hibernate_resume)
> +			break;
> +
>  		mutex_lock(&common->tx_lock);
>  
>  		status = adapter->host_intf_ops->check_hw_queue_status(adapter,
> diff --git a/ubuntu/rsi/rsi_91x_hci.c b/ubuntu/rsi/rsi_91x_hci.c
> index 2f982bdab470..559962229e28 100644
> --- a/ubuntu/rsi/rsi_91x_hci.c
> +++ b/ubuntu/rsi/rsi_91x_hci.c
> @@ -295,8 +295,6 @@ int rsi_hci_recv_pkt(struct rsi_common *common, u8 *pkt)
>  			return 0;
>  		}
>  
> -		rsi_send_rfmode_frame(common);
> -
>  		ven_rsi_dbg(INFO_ZONE, "Attaching HCI module\n");
>  
>  		if (rsi_hci_attach(common)) {
> diff --git a/ubuntu/rsi/rsi_91x_mac80211.c b/ubuntu/rsi/rsi_91x_mac80211.c
> index 185444f77cf9..75aaa0897d59 100644
> --- a/ubuntu/rsi/rsi_91x_mac80211.c
> +++ b/ubuntu/rsi/rsi_91x_mac80211.c
> @@ -193,6 +193,29 @@ static const struct ieee80211_iface_combination rsi_iface_combinations[] = {
>  };
>  #endif
>  
> +#ifdef CONFIG_CARACALLA_BOARD
> +struct reg_map {
> +	char country_code[2];
> +	u8 region_code; 
> +};
> +
> +static struct reg_map rsi_caracalla_reg_db[MAX_REG_COUNTRIES] = {
> +	{"AU", NL80211_DFS_ETSI}, {"AT", NL80211_DFS_ETSI},
> +	{"BE", NL80211_DFS_ETSI}, {"BR", NL80211_DFS_WORLD},
> +	{"CA", NL80211_DFS_FCC}, {"CL", NL80211_DFS_WORLD},
> +	{"CN", NL80211_DFS_WORLD}, {"CO", NL80211_DFS_FCC},
> +	{"CZ", NL80211_DFS_ETSI}, {"DK", NL80211_DFS_ETSI},
> +	{"FI", NL80211_DFS_ETSI}, {"FR", NL80211_DFS_ETSI},
> +	{"DE", NL80211_DFS_ETSI}, {"HK", NL80211_DFS_WORLD},
> +	{"IN", NL80211_DFS_WORLD}, {"ID", NL80211_DFS_WORLD},
> +	{"IE", NL80211_DFS_ETSI}, {"IL", NL80211_DFS_ETSI},
> +	{"IT", NL80211_DFS_ETSI}, {"JP", NL80211_DFS_JP},
> +	{"KR", NL80211_DFS_WORLD}, {"LU", NL80211_DFS_ETSI},
> +	{"MY", NL80211_DFS_WORLD}, {"MX", NL80211_DFS_FCC},
> +	{"MA", NL80211_DFS_WORLD}, {"NL", NL80211_DFS_ETSI},
> +};
> +#endif
> +
>  struct ieee80211_vif *rsi_get_vif(struct rsi_hw *adapter, u8 *mac)
>  {
>  	u8 i;
> @@ -337,6 +360,9 @@ static int rsi_mac80211_hw_scan_start(struct ieee80211_hw *hw,
>  
>  	ven_rsi_dbg(INFO_ZONE, "***** Hardware scan start *****\n");
>  
> +	if (common->fsm_state != FSM_MAC_INIT_DONE)
> +		return -ENODEV;
> +
>  	if (scan_req->n_channels == 0)
>  		return -EINVAL;
>  
> @@ -585,6 +611,9 @@ static void rsi_mac80211_stop(struct ieee80211_hw *hw)
>  #endif
>  	ven_rsi_dbg(ERR_ZONE, "===> Interface DOWN <===\n");
>  
> +	if (common->fsm_state != FSM_MAC_INIT_DONE)
> +		return;
> +
>  	mutex_lock(&common->mutex);
>  	
>  	common->iface_down = true;
> @@ -1001,6 +1030,9 @@ static int rsi_mac80211_config(struct ieee80211_hw *hw,
>  	struct ieee80211_conf *conf = &hw->conf;
>  	int status = -EOPNOTSUPP;
>  
> +	if (common->fsm_state != FSM_MAC_INIT_DONE)
> +		return -ENODEV;
> +
>  	mutex_lock(&common->mutex);
>  
>  	/* channel */
> @@ -1139,6 +1171,9 @@ static void rsi_mac80211_bss_info_changed(struct ieee80211_hw *hw,
>  	ven_rsi_dbg(INFO_ZONE, "%s: BSS status changed; changed=%08x\n",
>  		__func__, changed);
>  
> +	if (common->fsm_state != FSM_MAC_INIT_DONE)
> +		return;
> +
>  	mutex_lock(&common->mutex);
>  
>  	if ((changed & BSS_CHANGED_ASSOC) &&
> @@ -1176,10 +1211,13 @@ static void rsi_mac80211_bss_info_changed(struct ieee80211_hw *hw,
>  			bss->dtim_period);
>  
>  		/* If UAPSD is updated send ps params */
> -		if (common->uapsd_bitmap) {
> -			ven_rsi_dbg(INFO_ZONE, "Configuring UAPSD\n");
> -			rsi_conf_uapsd(adapter);
> -		}
> +		if (bss->assoc) {
> +			if (common->uapsd_bitmap) {
> +				ven_rsi_dbg(INFO_ZONE, "Configuring UAPSD\n");
> +				rsi_conf_uapsd(adapter);
> +			}
> +		} else
> +			common->uapsd_bitmap = 0;
>  	}
>  
>  	if ((vif->type == NL80211_IFTYPE_STATION) &&
> @@ -1300,6 +1338,8 @@ static int rsi_mac80211_conf_tx(struct ieee80211_hw *hw,
>  
>  	if (params->uapsd)
>  		common->uapsd_bitmap |= idx;
> +	else
> +		common->uapsd_bitmap &= (~idx);
>  
>  	mutex_unlock(&common->mutex);
>  	return 0;
> @@ -1985,6 +2025,9 @@ static void rsi_mac80211_sw_scan_start(struct ieee80211_hw *hw,
>  	struct rsi_common *common = adapter->priv;
>  	struct ieee80211_bss_conf *bss = &adapter->vifs[0]->bss_conf;
>  
> +	if (common->fsm_state != FSM_MAC_INIT_DONE)
> +		return -ENODEV;
> +
>  	if (common->p2p_enabled)
>  		return;
>  	if (!bss->assoc)
> @@ -2120,6 +2163,8 @@ static const char *regdfs_region_str(enum nl80211_dfs_regions dfs_region)
>                  return "ETSI";
>          case NL80211_DFS_JP:
>                  return "JP";
> +	case NL80211_DFS_WORLD:
> +		return "WORLD";
>          }
>          return "Unknown";
>  }
> @@ -2136,14 +2181,32 @@ static void rsi_reg_notify(struct wiphy *wiphy,
>  	struct ieee80211_vif *vif = adapter->vifs[adapter->sc_nvifs -1];
>  #endif
>  	int i;
> +	u8 region_code;
>  
>  	mutex_lock(&common->mutex);
>  
> +	ven_rsi_dbg(INFO_ZONE,
> +		"%s: country = %s dfs_region = %d\n",
> +		__func__, request->alpha2, request->dfs_region);
> +
> +	region_code = request->dfs_region;
> +#ifdef CONFIG_CARACALLA_BOARD
> +	for (i = 0; i < ARRAY_SIZE(rsi_caracalla_reg_db); i++) {
> +		if (!memcmp(rsi_caracalla_reg_db[i].country_code,
> +		            request->alpha2, 2)) {
> +			region_code = rsi_caracalla_reg_db[i].region_code;
> +			break;
> +		}
> +	}
> +	if (!memcmp(request->alpha2, "00", 2))
> +		region_code = NL80211_DFS_JP;
> +#endif
> +
>  	ven_rsi_dbg(ERR_ZONE, "%s: Updating regulatory for region %s\n",
> -		__func__, regdfs_region_str(request->dfs_region));
> +		__func__, regdfs_region_str(region_code));
>  
>  	sband = wiphy->bands[NL80211_BAND_2GHZ];
> -	switch (request->dfs_region) {
> +	switch (region_code) {
>  	case NL80211_DFS_FCC:
>  		for(i = 0; i < sband->n_channels; i++){
>  	 		ch = &sband->channels[i];
> @@ -2170,7 +2233,7 @@ static void rsi_reg_notify(struct wiphy *wiphy,
>  
>  	case NL80211_DFS_UNSET:
>  	case NL80211_DFS_ETSI:
> -		
> +	case NL80211_DFS_WORLD:
>  		for(i = 0; i < sband->n_channels; i++){
>  	 		ch = &sband->channels[i];
>  			
> @@ -2208,7 +2271,7 @@ static void rsi_reg_notify(struct wiphy *wiphy,
>  	default:
>  		ven_rsi_dbg(ERR_ZONE,
>  			"Wrong Country region code seleted\ndfs_region = %d\n",
> -			request->dfs_region);
> +			region_code);
>  		break;
>  	}
>  
> @@ -2224,15 +2287,11 @@ static void rsi_reg_notify(struct wiphy *wiphy,
>  				ch->flags |= IEEE80211_CHAN_NO_IR;
>  		}
>  	}
> -	
> -	ven_rsi_dbg(INFO_ZONE,
> -		"country = %s dfs_region = %d\n",
> -		request->alpha2, request->dfs_region);
>  
>  #ifndef CONFIG_HW_SCAN_OFFLOAD 
>  	/* If DFS region or country is changed configure back ground scan
>  	 * params to device again */
> -	if ((adapter->dfs_region != request->dfs_region) ||
> +	if ((adapter->dfs_region != region_code) ||
>  	    (memcmp(adapter->country, request->alpha2, 2))) {
>  		if (common->bgscan_en) {
>  			rsi_send_bgscan_params(common, 0);
> @@ -2244,7 +2303,15 @@ static void rsi_reg_notify(struct wiphy *wiphy,
>  	}
>  #endif
>  	
> -	adapter->dfs_region = request->dfs_region;
> +	if (region_code == NL80211_DFS_UNSET)
> +		region_code = NL80211_DFS_WORLD;
> +	ven_rsi_dbg(INFO_ZONE, "Region code: %s\n", regdfs_region_str(region_code));
> +
> +	/* Firmware region code values 1 less than the standard
> +	 * linux values; At this point DFS_UNSET is not set
> +	 * as this is set to WORLD (4)
> +	 */
> +	adapter->dfs_region = region_code - 1;
>  	adapter->country[0] = request->alpha2[0];
>  	adapter->country[1] = request->alpha2[1];
>  	mutex_unlock(&common->mutex);
> @@ -2355,19 +2422,21 @@ fail_wow:
>  
>  static int rsi_mac80211_resume(struct ieee80211_hw *hw)
>  {
> -#ifdef CONFIG_VEN_RSI_WOW
>  	struct rsi_hw *adapter = hw->priv;
>  	struct rsi_common *common = adapter->priv;
> +#ifdef CONFIG_VEN_RSI_WOW
>  	u16 rx_filter_word = 0;
> -
> -	adapter->priv->wow_flags = 0;
>  #endif
> +        
> +	adapter->priv->wow_flags = 0;
>  	
>  	ven_rsi_dbg(INFO_ZONE, "%s: mac80211 resume\n", __func__);
>  
> +	if (common->hibernate_resume)
> +		return 0;
> +
>  #ifdef CONFIG_VEN_RSI_WOW
>  	rsi_send_wowlan_request(common, 0, 0);
> -	//rx_filter_word = 0xE ;
>  
>  	rx_filter_word = (ALLOW_DATA_ASSOC_PEER |
>  			  ALLOW_CTRL_ASSOC_PEER |
> @@ -2378,6 +2447,7 @@ static int rsi_mac80211_resume(struct ieee80211_hw *hw)
>  	return 0;
>  }
>  #endif
> +
>  char *rsi_vif_type_to_name(enum nl80211_iftype vif_type)
>  {
>  	switch (vif_type) {
> diff --git a/ubuntu/rsi/rsi_91x_main.c b/ubuntu/rsi/rsi_91x_main.c
> index 72b80ba1a878..0bae9fed3d64 100644
> --- a/ubuntu/rsi/rsi_91x_main.c
> +++ b/ubuntu/rsi/rsi_91x_main.c
> @@ -42,7 +42,7 @@
>  #include "rsi_coex.h"
>  #endif
>  
> -u32 ven_rsi_zone_enabled =	//INFO_ZONE |
> +u16 ven_rsi_zone_enabled =	//INFO_ZONE |
>  				//INIT_ZONE |
>  				//MGMT_TX_ZONE |
>  				//MGMT_RX_ZONE |
> @@ -53,6 +53,16 @@ u32 ven_rsi_zone_enabled =	//INFO_ZONE |
>  				ERR_ZONE |
>  				0;
>  EXPORT_SYMBOL_GPL(ven_rsi_zone_enabled);
> +MODULE_PARM_DESC(ven_rsi_zone_enabled,
> +		 "BIT(0) - ERROR ZONE \
> +		  BIT(1) - INFO ZONE \
> +		  BIT(2) - INIT ZONE \
> +		  BIT(3) - MGMT TX ZONE \
> +		  BIT(4) - MGMT RX ZONE \
> +		  BIT(5) - DATA TX ZONE \
> +		  BIT(6) - DATA RX ZONE \
> +		  BIT(7) - FSM ZONE \
> +		  BIT(8) - ISR ZONE");
>  
>  /**
>   * ven_rsi_dbg() - This function outputs informational messages.
> diff --git a/ubuntu/rsi/rsi_91x_sdio.c b/ubuntu/rsi/rsi_91x_sdio.c
> index 8eb939868b0b..eb7821b7b8d7 100644
> --- a/ubuntu/rsi/rsi_91x_sdio.c
> +++ b/ubuntu/rsi/rsi_91x_sdio.c
> @@ -1122,6 +1122,7 @@ static int rsi_probe(struct sdio_func *pfunction,
>  		goto fail;
>  	}
>  	sdio_release_host(pfunction);
> +	adapter->priv->hibernate_resume = false;
>  
>  	return 0;
>  
> @@ -1156,24 +1157,24 @@ static void rsi_disconnect(struct sdio_func *pfunction)
>  	sdio_claim_host(pfunction);
>  	sdio_release_irq(pfunction);
>  	sdio_release_host(pfunction);
> -	mdelay(10);
>  
>  	ven_rsi_mac80211_detach(adapter);
> -	mdelay(10);
>  
>  #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
>  	rsi_hci_detach(adapter->priv);
> -	mdelay(10);
>  #endif
>  
> -	/* Reset Chip */
> -	rsi_reset_chip(adapter);
> +	if (!adapter->priv->hibernate_resume) {
> +		/* Reset Chip */
> +		rsi_reset_chip(adapter);
>  
> -	/* Resetting to take care of the case, where-in driver is re-loaded */
> -	sdio_claim_host(pfunction);
> -	rsi_reset_card(pfunction);
> -	sdio_disable_func(pfunction);
> -	sdio_release_host(pfunction);
> +		/* Resetting to take care of the case, where-in driver
> +		 * is re-loaded */
> +		sdio_claim_host(pfunction);
> +		rsi_reset_card(pfunction);
> +		sdio_disable_func(pfunction);
> +		sdio_release_host(pfunction);
> +	}
>  	dev->write_fail = 2;
>  	ven_rsi_91x_deinit(adapter);
>  	ven_rsi_dbg(ERR_ZONE, "##### RSI SDIO device disconnected #####\n");
> @@ -1295,12 +1296,10 @@ static int rsi_suspend(struct device *dev)
>  	struct sdio_func *pfunction = dev_to_sdio_func(dev);
>  	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
>  	struct rsi_common *common = adapter->priv;
> -#ifdef CONFIG_VEN_RSI_WOW
>  	struct rsi_91x_sdiodev *sdev =
>  		(struct rsi_91x_sdiodev *)adapter->rsi_dev;
> -#endif
>  
> -	ven_rsi_dbg(INFO_ZONE, "SDIO Bus suspend ===>\n");
> +	ven_rsi_dbg(ERR_ZONE, "SDIO Bus suspend ===>\n");
>  
>  	if (!adapter) {
>  		ven_rsi_dbg(ERR_ZONE, "Device is not ready\n");
> @@ -1314,29 +1313,28 @@ static int rsi_suspend(struct device *dev)
>  			ven_rsi_dbg(ERR_ZONE,
>  				"##### Device can not wake up through WLAN\n");
>  
> +#if 0
>  #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
>  		if ((common->coex_mode == 2) || (common->coex_mode == 4)) {
>  			/* Deregister BT protocol */
>  			rsi_hci_detach(common);
>  		}
>  #endif
> +#endif
>  	}
>  #endif
>  
>  	ret = rsi_sdio_disable_interrupts(pfunction);
> -	if (ret)
> -		return ret;
>  
> -	if (sdev->write_fail) {
> +	if (sdev->write_fail)
>  		ven_rsi_dbg(INFO_ZONE, "###### Device is not ready #######\n");
> -		return 0;
> -	}
>  
>  	ret = rsi_set_sdio_pm_caps(adapter);
>  	if (ret)
>  		ven_rsi_dbg(INFO_ZONE,
>  			"Setting power management caps failed\n");
>  
> +	common->fsm_state = FSM_CARD_NOT_READY;
>  	ven_rsi_dbg(INFO_ZONE, "***** SDIO BUS SUSPEND DONE ******\n");
>  
>  	return 0;
> @@ -1352,11 +1350,11 @@ int rsi_resume(struct device *dev)
>  	ven_rsi_dbg(INFO_ZONE, "***** BUS RESUME ******\n");
>  
>  	common->suspend_in_prog = false;
> +	common->fsm_state = FSM_MAC_INIT_DONE;
>  
>  	ret = rsi_sdio_enable_interrupts(pfunction);
> -	if (ret)
> -		return ret;
>  
> +#if 0
>  #ifdef CONFIG_VEN_RSI_WOW
>  #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
>  	if ((common->wow_flags & RSI_WOW_ENABLED) &&
> @@ -1367,6 +1365,7 @@ int rsi_resume(struct device *dev)
>  #endif
>          adapter->priv->wow_flags = 0;
>  #endif
> +#endif
>  
>  	ven_rsi_dbg(INFO_ZONE, "***** RSI module resumed *****\n");
>  	return 0;
> @@ -1378,10 +1377,8 @@ static int rsi_freeze(struct device *dev)
>  	struct sdio_func *pfunction = dev_to_sdio_func(dev);
>  	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
>  	struct rsi_common *common = adapter->priv;
> -#ifdef CONFIG_VEN_RSI_WOW
>  	struct rsi_91x_sdiodev *sdev =
>  		(struct rsi_91x_sdiodev *)adapter->rsi_dev;
> -#endif
>  
>  	ven_rsi_dbg(INFO_ZONE, "SDIO Bus freeze ===>\n");
>  
> @@ -1397,23 +1394,21 @@ static int rsi_freeze(struct device *dev)
>  			ven_rsi_dbg(ERR_ZONE,
>  				"##### Device can not wake up through WLAN\n");
>  
> +#if 0
>  #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
>  		if ((common->coex_mode == 2) || (common->coex_mode == 4)) {
>  			/* Deregister BT protocol */
>  			rsi_deregister_bt(common);
>  		}
>  #endif
> +#endif
>  	}
>  #endif
>  
>  	ret = rsi_sdio_disable_interrupts(pfunction);
> -	if (ret)
> -		return ret;
>  
> -	if (sdev->write_fail) {
> +	if (sdev->write_fail)
>  		ven_rsi_dbg(INFO_ZONE, "###### Device is not ready #######\n");
> -		return 0;
> -	}
>  	
>  	ret = rsi_set_sdio_pm_caps(adapter);
>  	if (ret)
> @@ -1424,17 +1419,18 @@ static int rsi_freeze(struct device *dev)
>  
>  int rsi_thaw(struct device *dev)
>  {
> -	int ret;
>  	struct sdio_func *pfunction = dev_to_sdio_func(dev);
>  	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
>  
> -	ven_rsi_dbg(INFO_ZONE, "***** BUS THAW ******\n");
> +	ven_rsi_dbg(ERR_ZONE, "***** BUS THAW ******\n");
>  
> -	adapter->priv->suspend_in_prog = false;
> +//	adapter->priv->suspend_in_prog = false;
> +	adapter->priv->hibernate_resume = true;
> +	adapter->priv->fsm_state = FSM_CARD_NOT_READY;
> +	adapter->priv->bt_fsm_state = BT_DEVICE_NOT_READY;
> +	adapter->priv->iface_down = true;
>  
> -	ret = rsi_sdio_enable_interrupts(pfunction);
> -	if (ret)
> -		return ret;
> +	rsi_sdio_enable_interrupts(pfunction);
>  
>  	ven_rsi_dbg(INFO_ZONE, "RSI module resumed\n");
>  	return 0;
> @@ -1442,17 +1438,28 @@ int rsi_thaw(struct device *dev)
>  
>  static int rsi_poweroff(struct device *dev)
>  {
> -	return rsi_suspend(dev);
> +	return rsi_freeze(dev);
>  }
>  
>  static void rsi_shutdown(struct device *dev)
>  {
> -	rsi_suspend(dev);
> +	rsi_freeze(dev);
>  }
>  
>  int rsi_restore(struct device *dev)
>  {
> -	return rsi_thaw(dev);
> +	struct sdio_func *pfunction = dev_to_sdio_func(dev);
> +	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
> +
> +	adapter->priv->suspend_in_prog = false;
> +	adapter->priv->hibernate_resume = true;
> +	adapter->priv->fsm_state = FSM_CARD_NOT_READY;
> +	adapter->priv->bt_fsm_state = BT_DEVICE_NOT_READY;
> +	adapter->priv->iface_down = true;
> +
> +	ven_rsi_dbg(INFO_ZONE, "RSI module restored\n");
> +
> +	return 0;
>  }
>  
>  static const struct dev_pm_ops rsi_pm_ops = {
> diff --git a/ubuntu/rsi/rsi_main.h b/ubuntu/rsi/rsi_main.h
> index 0fc3ce316bf1..eb1afbb6c4c5 100644
> --- a/ubuntu/rsi/rsi_main.h
> +++ b/ubuntu/rsi/rsi_main.h
> @@ -41,7 +41,7 @@ struct rsi_hw;
>  
>  #include "rsi_ps.h"
>  
> -#define DRV_VER				"RS9113.NB0.NL.GNU.LNX.1.2.RC9"
> +#define DRV_VER				"RS9113.NB0.NL.GNU.LNX.1.2.RC12"
>  
>  #define ERR_ZONE                        BIT(0) /* Error Msgs		*/
>  #define INFO_ZONE                       BIT(1) /* Generic Debug Msgs	*/
> @@ -63,7 +63,7 @@ struct rsi_hw;
>  #define FSM_BB_RF_PROG_SENT             7
>  #define FSM_MAC_INIT_DONE               8
>  
> -extern u32 ven_rsi_zone_enabled;
> +extern u16 ven_rsi_zone_enabled;
>  extern __printf(2, 3) void ven_rsi_dbg(u32 zone, const char *fmt, ...);
>  void rsi_hex_dump(u32 zone, char *msg_str, const u8 *msg, u32 len);
>  
> @@ -131,6 +131,9 @@ void rsi_hex_dump(u32 zone, char *msg_str, const u8 *msg, u32 len);
>  #define RSI_WOW_ENABLED			BIT(0)
>  #define RSI_WOW_NO_CONNECTION		BIT(1)
>  
> +#define MAX_REG_COUNTRIES		30
> +#define NL80211_DFS_WORLD		4
> +
>  struct version_info {
>  	u16 major;
>  	u16 minor;
> @@ -327,6 +330,7 @@ struct rsi_common {
>  	int tx_power;
>  	u8 ant_in_use;
>  	bool suspend_in_prog;
> +	bool hibernate_resume;
>  #ifdef CONFIG_VEN_RSI_WOW
>  	u8 wow_flags;
>  #endif
> 

Update to a specific driver, resolves known issues

Acked-by: Colin Ian King <colin.king@canonical.com>
Kleber Sacilotto de Souza June 6, 2017, 2:14 p.m. UTC | #3
Applied on xenial/master-next branch. Thanks.
diff mbox

Patch

diff --git a/ubuntu/rsi/rsi_91x_core.c b/ubuntu/rsi/rsi_91x_core.c
index a349f973f0e8..db320e235388 100644
--- a/ubuntu/rsi/rsi_91x_core.c
+++ b/ubuntu/rsi/rsi_91x_core.c
@@ -292,6 +292,9 @@  void rsi_core_qos_processor(struct rsi_common *common)
 		if (q_num == INVALID_QUEUE)
 			break;
 
+		if (common->hibernate_resume)
+			break;
+
 		mutex_lock(&common->tx_lock);
 
 		status = adapter->host_intf_ops->check_hw_queue_status(adapter,
diff --git a/ubuntu/rsi/rsi_91x_hci.c b/ubuntu/rsi/rsi_91x_hci.c
index 2f982bdab470..559962229e28 100644
--- a/ubuntu/rsi/rsi_91x_hci.c
+++ b/ubuntu/rsi/rsi_91x_hci.c
@@ -295,8 +295,6 @@  int rsi_hci_recv_pkt(struct rsi_common *common, u8 *pkt)
 			return 0;
 		}
 
-		rsi_send_rfmode_frame(common);
-
 		ven_rsi_dbg(INFO_ZONE, "Attaching HCI module\n");
 
 		if (rsi_hci_attach(common)) {
diff --git a/ubuntu/rsi/rsi_91x_mac80211.c b/ubuntu/rsi/rsi_91x_mac80211.c
index 185444f77cf9..75aaa0897d59 100644
--- a/ubuntu/rsi/rsi_91x_mac80211.c
+++ b/ubuntu/rsi/rsi_91x_mac80211.c
@@ -193,6 +193,29 @@  static const struct ieee80211_iface_combination rsi_iface_combinations[] = {
 };
 #endif
 
+#ifdef CONFIG_CARACALLA_BOARD
+struct reg_map {
+	char country_code[2];
+	u8 region_code; 
+};
+
+static struct reg_map rsi_caracalla_reg_db[MAX_REG_COUNTRIES] = {
+	{"AU", NL80211_DFS_ETSI}, {"AT", NL80211_DFS_ETSI},
+	{"BE", NL80211_DFS_ETSI}, {"BR", NL80211_DFS_WORLD},
+	{"CA", NL80211_DFS_FCC}, {"CL", NL80211_DFS_WORLD},
+	{"CN", NL80211_DFS_WORLD}, {"CO", NL80211_DFS_FCC},
+	{"CZ", NL80211_DFS_ETSI}, {"DK", NL80211_DFS_ETSI},
+	{"FI", NL80211_DFS_ETSI}, {"FR", NL80211_DFS_ETSI},
+	{"DE", NL80211_DFS_ETSI}, {"HK", NL80211_DFS_WORLD},
+	{"IN", NL80211_DFS_WORLD}, {"ID", NL80211_DFS_WORLD},
+	{"IE", NL80211_DFS_ETSI}, {"IL", NL80211_DFS_ETSI},
+	{"IT", NL80211_DFS_ETSI}, {"JP", NL80211_DFS_JP},
+	{"KR", NL80211_DFS_WORLD}, {"LU", NL80211_DFS_ETSI},
+	{"MY", NL80211_DFS_WORLD}, {"MX", NL80211_DFS_FCC},
+	{"MA", NL80211_DFS_WORLD}, {"NL", NL80211_DFS_ETSI},
+};
+#endif
+
 struct ieee80211_vif *rsi_get_vif(struct rsi_hw *adapter, u8 *mac)
 {
 	u8 i;
@@ -337,6 +360,9 @@  static int rsi_mac80211_hw_scan_start(struct ieee80211_hw *hw,
 
 	ven_rsi_dbg(INFO_ZONE, "***** Hardware scan start *****\n");
 
+	if (common->fsm_state != FSM_MAC_INIT_DONE)
+		return -ENODEV;
+
 	if (scan_req->n_channels == 0)
 		return -EINVAL;
 
@@ -585,6 +611,9 @@  static void rsi_mac80211_stop(struct ieee80211_hw *hw)
 #endif
 	ven_rsi_dbg(ERR_ZONE, "===> Interface DOWN <===\n");
 
+	if (common->fsm_state != FSM_MAC_INIT_DONE)
+		return;
+
 	mutex_lock(&common->mutex);
 	
 	common->iface_down = true;
@@ -1001,6 +1030,9 @@  static int rsi_mac80211_config(struct ieee80211_hw *hw,
 	struct ieee80211_conf *conf = &hw->conf;
 	int status = -EOPNOTSUPP;
 
+	if (common->fsm_state != FSM_MAC_INIT_DONE)
+		return -ENODEV;
+
 	mutex_lock(&common->mutex);
 
 	/* channel */
@@ -1139,6 +1171,9 @@  static void rsi_mac80211_bss_info_changed(struct ieee80211_hw *hw,
 	ven_rsi_dbg(INFO_ZONE, "%s: BSS status changed; changed=%08x\n",
 		__func__, changed);
 
+	if (common->fsm_state != FSM_MAC_INIT_DONE)
+		return;
+
 	mutex_lock(&common->mutex);
 
 	if ((changed & BSS_CHANGED_ASSOC) &&
@@ -1176,10 +1211,13 @@  static void rsi_mac80211_bss_info_changed(struct ieee80211_hw *hw,
 			bss->dtim_period);
 
 		/* If UAPSD is updated send ps params */
-		if (common->uapsd_bitmap) {
-			ven_rsi_dbg(INFO_ZONE, "Configuring UAPSD\n");
-			rsi_conf_uapsd(adapter);
-		}
+		if (bss->assoc) {
+			if (common->uapsd_bitmap) {
+				ven_rsi_dbg(INFO_ZONE, "Configuring UAPSD\n");
+				rsi_conf_uapsd(adapter);
+			}
+		} else
+			common->uapsd_bitmap = 0;
 	}
 
 	if ((vif->type == NL80211_IFTYPE_STATION) &&
@@ -1300,6 +1338,8 @@  static int rsi_mac80211_conf_tx(struct ieee80211_hw *hw,
 
 	if (params->uapsd)
 		common->uapsd_bitmap |= idx;
+	else
+		common->uapsd_bitmap &= (~idx);
 
 	mutex_unlock(&common->mutex);
 	return 0;
@@ -1985,6 +2025,9 @@  static void rsi_mac80211_sw_scan_start(struct ieee80211_hw *hw,
 	struct rsi_common *common = adapter->priv;
 	struct ieee80211_bss_conf *bss = &adapter->vifs[0]->bss_conf;
 
+	if (common->fsm_state != FSM_MAC_INIT_DONE)
+		return -ENODEV;
+
 	if (common->p2p_enabled)
 		return;
 	if (!bss->assoc)
@@ -2120,6 +2163,8 @@  static const char *regdfs_region_str(enum nl80211_dfs_regions dfs_region)
                 return "ETSI";
         case NL80211_DFS_JP:
                 return "JP";
+	case NL80211_DFS_WORLD:
+		return "WORLD";
         }
         return "Unknown";
 }
@@ -2136,14 +2181,32 @@  static void rsi_reg_notify(struct wiphy *wiphy,
 	struct ieee80211_vif *vif = adapter->vifs[adapter->sc_nvifs -1];
 #endif
 	int i;
+	u8 region_code;
 
 	mutex_lock(&common->mutex);
 
+	ven_rsi_dbg(INFO_ZONE,
+		"%s: country = %s dfs_region = %d\n",
+		__func__, request->alpha2, request->dfs_region);
+
+	region_code = request->dfs_region;
+#ifdef CONFIG_CARACALLA_BOARD
+	for (i = 0; i < ARRAY_SIZE(rsi_caracalla_reg_db); i++) {
+		if (!memcmp(rsi_caracalla_reg_db[i].country_code,
+		            request->alpha2, 2)) {
+			region_code = rsi_caracalla_reg_db[i].region_code;
+			break;
+		}
+	}
+	if (!memcmp(request->alpha2, "00", 2))
+		region_code = NL80211_DFS_JP;
+#endif
+
 	ven_rsi_dbg(ERR_ZONE, "%s: Updating regulatory for region %s\n",
-		__func__, regdfs_region_str(request->dfs_region));
+		__func__, regdfs_region_str(region_code));
 
 	sband = wiphy->bands[NL80211_BAND_2GHZ];
-	switch (request->dfs_region) {
+	switch (region_code) {
 	case NL80211_DFS_FCC:
 		for(i = 0; i < sband->n_channels; i++){
 	 		ch = &sband->channels[i];
@@ -2170,7 +2233,7 @@  static void rsi_reg_notify(struct wiphy *wiphy,
 
 	case NL80211_DFS_UNSET:
 	case NL80211_DFS_ETSI:
-		
+	case NL80211_DFS_WORLD:
 		for(i = 0; i < sband->n_channels; i++){
 	 		ch = &sband->channels[i];
 			
@@ -2208,7 +2271,7 @@  static void rsi_reg_notify(struct wiphy *wiphy,
 	default:
 		ven_rsi_dbg(ERR_ZONE,
 			"Wrong Country region code seleted\ndfs_region = %d\n",
-			request->dfs_region);
+			region_code);
 		break;
 	}
 
@@ -2224,15 +2287,11 @@  static void rsi_reg_notify(struct wiphy *wiphy,
 				ch->flags |= IEEE80211_CHAN_NO_IR;
 		}
 	}
-	
-	ven_rsi_dbg(INFO_ZONE,
-		"country = %s dfs_region = %d\n",
-		request->alpha2, request->dfs_region);
 
 #ifndef CONFIG_HW_SCAN_OFFLOAD 
 	/* If DFS region or country is changed configure back ground scan
 	 * params to device again */
-	if ((adapter->dfs_region != request->dfs_region) ||
+	if ((adapter->dfs_region != region_code) ||
 	    (memcmp(adapter->country, request->alpha2, 2))) {
 		if (common->bgscan_en) {
 			rsi_send_bgscan_params(common, 0);
@@ -2244,7 +2303,15 @@  static void rsi_reg_notify(struct wiphy *wiphy,
 	}
 #endif
 	
-	adapter->dfs_region = request->dfs_region;
+	if (region_code == NL80211_DFS_UNSET)
+		region_code = NL80211_DFS_WORLD;
+	ven_rsi_dbg(INFO_ZONE, "Region code: %s\n", regdfs_region_str(region_code));
+
+	/* Firmware region code values 1 less than the standard
+	 * linux values; At this point DFS_UNSET is not set
+	 * as this is set to WORLD (4)
+	 */
+	adapter->dfs_region = region_code - 1;
 	adapter->country[0] = request->alpha2[0];
 	adapter->country[1] = request->alpha2[1];
 	mutex_unlock(&common->mutex);
@@ -2355,19 +2422,21 @@  fail_wow:
 
 static int rsi_mac80211_resume(struct ieee80211_hw *hw)
 {
-#ifdef CONFIG_VEN_RSI_WOW
 	struct rsi_hw *adapter = hw->priv;
 	struct rsi_common *common = adapter->priv;
+#ifdef CONFIG_VEN_RSI_WOW
 	u16 rx_filter_word = 0;
-
-	adapter->priv->wow_flags = 0;
 #endif
+        
+	adapter->priv->wow_flags = 0;
 	
 	ven_rsi_dbg(INFO_ZONE, "%s: mac80211 resume\n", __func__);
 
+	if (common->hibernate_resume)
+		return 0;
+
 #ifdef CONFIG_VEN_RSI_WOW
 	rsi_send_wowlan_request(common, 0, 0);
-	//rx_filter_word = 0xE ;
 
 	rx_filter_word = (ALLOW_DATA_ASSOC_PEER |
 			  ALLOW_CTRL_ASSOC_PEER |
@@ -2378,6 +2447,7 @@  static int rsi_mac80211_resume(struct ieee80211_hw *hw)
 	return 0;
 }
 #endif
+
 char *rsi_vif_type_to_name(enum nl80211_iftype vif_type)
 {
 	switch (vif_type) {
diff --git a/ubuntu/rsi/rsi_91x_main.c b/ubuntu/rsi/rsi_91x_main.c
index 72b80ba1a878..0bae9fed3d64 100644
--- a/ubuntu/rsi/rsi_91x_main.c
+++ b/ubuntu/rsi/rsi_91x_main.c
@@ -42,7 +42,7 @@ 
 #include "rsi_coex.h"
 #endif
 
-u32 ven_rsi_zone_enabled =	//INFO_ZONE |
+u16 ven_rsi_zone_enabled =	//INFO_ZONE |
 				//INIT_ZONE |
 				//MGMT_TX_ZONE |
 				//MGMT_RX_ZONE |
@@ -53,6 +53,16 @@  u32 ven_rsi_zone_enabled =	//INFO_ZONE |
 				ERR_ZONE |
 				0;
 EXPORT_SYMBOL_GPL(ven_rsi_zone_enabled);
+MODULE_PARM_DESC(ven_rsi_zone_enabled,
+		 "BIT(0) - ERROR ZONE \
+		  BIT(1) - INFO ZONE \
+		  BIT(2) - INIT ZONE \
+		  BIT(3) - MGMT TX ZONE \
+		  BIT(4) - MGMT RX ZONE \
+		  BIT(5) - DATA TX ZONE \
+		  BIT(6) - DATA RX ZONE \
+		  BIT(7) - FSM ZONE \
+		  BIT(8) - ISR ZONE");
 
 /**
  * ven_rsi_dbg() - This function outputs informational messages.
diff --git a/ubuntu/rsi/rsi_91x_sdio.c b/ubuntu/rsi/rsi_91x_sdio.c
index 8eb939868b0b..eb7821b7b8d7 100644
--- a/ubuntu/rsi/rsi_91x_sdio.c
+++ b/ubuntu/rsi/rsi_91x_sdio.c
@@ -1122,6 +1122,7 @@  static int rsi_probe(struct sdio_func *pfunction,
 		goto fail;
 	}
 	sdio_release_host(pfunction);
+	adapter->priv->hibernate_resume = false;
 
 	return 0;
 
@@ -1156,24 +1157,24 @@  static void rsi_disconnect(struct sdio_func *pfunction)
 	sdio_claim_host(pfunction);
 	sdio_release_irq(pfunction);
 	sdio_release_host(pfunction);
-	mdelay(10);
 
 	ven_rsi_mac80211_detach(adapter);
-	mdelay(10);
 
 #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
 	rsi_hci_detach(adapter->priv);
-	mdelay(10);
 #endif
 
-	/* Reset Chip */
-	rsi_reset_chip(adapter);
+	if (!adapter->priv->hibernate_resume) {
+		/* Reset Chip */
+		rsi_reset_chip(adapter);
 
-	/* Resetting to take care of the case, where-in driver is re-loaded */
-	sdio_claim_host(pfunction);
-	rsi_reset_card(pfunction);
-	sdio_disable_func(pfunction);
-	sdio_release_host(pfunction);
+		/* Resetting to take care of the case, where-in driver
+		 * is re-loaded */
+		sdio_claim_host(pfunction);
+		rsi_reset_card(pfunction);
+		sdio_disable_func(pfunction);
+		sdio_release_host(pfunction);
+	}
 	dev->write_fail = 2;
 	ven_rsi_91x_deinit(adapter);
 	ven_rsi_dbg(ERR_ZONE, "##### RSI SDIO device disconnected #####\n");
@@ -1295,12 +1296,10 @@  static int rsi_suspend(struct device *dev)
 	struct sdio_func *pfunction = dev_to_sdio_func(dev);
 	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
 	struct rsi_common *common = adapter->priv;
-#ifdef CONFIG_VEN_RSI_WOW
 	struct rsi_91x_sdiodev *sdev =
 		(struct rsi_91x_sdiodev *)adapter->rsi_dev;
-#endif
 
-	ven_rsi_dbg(INFO_ZONE, "SDIO Bus suspend ===>\n");
+	ven_rsi_dbg(ERR_ZONE, "SDIO Bus suspend ===>\n");
 
 	if (!adapter) {
 		ven_rsi_dbg(ERR_ZONE, "Device is not ready\n");
@@ -1314,29 +1313,28 @@  static int rsi_suspend(struct device *dev)
 			ven_rsi_dbg(ERR_ZONE,
 				"##### Device can not wake up through WLAN\n");
 
+#if 0
 #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
 		if ((common->coex_mode == 2) || (common->coex_mode == 4)) {
 			/* Deregister BT protocol */
 			rsi_hci_detach(common);
 		}
 #endif
+#endif
 	}
 #endif
 
 	ret = rsi_sdio_disable_interrupts(pfunction);
-	if (ret)
-		return ret;
 
-	if (sdev->write_fail) {
+	if (sdev->write_fail)
 		ven_rsi_dbg(INFO_ZONE, "###### Device is not ready #######\n");
-		return 0;
-	}
 
 	ret = rsi_set_sdio_pm_caps(adapter);
 	if (ret)
 		ven_rsi_dbg(INFO_ZONE,
 			"Setting power management caps failed\n");
 
+	common->fsm_state = FSM_CARD_NOT_READY;
 	ven_rsi_dbg(INFO_ZONE, "***** SDIO BUS SUSPEND DONE ******\n");
 
 	return 0;
@@ -1352,11 +1350,11 @@  int rsi_resume(struct device *dev)
 	ven_rsi_dbg(INFO_ZONE, "***** BUS RESUME ******\n");
 
 	common->suspend_in_prog = false;
+	common->fsm_state = FSM_MAC_INIT_DONE;
 
 	ret = rsi_sdio_enable_interrupts(pfunction);
-	if (ret)
-		return ret;
 
+#if 0
 #ifdef CONFIG_VEN_RSI_WOW
 #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
 	if ((common->wow_flags & RSI_WOW_ENABLED) &&
@@ -1367,6 +1365,7 @@  int rsi_resume(struct device *dev)
 #endif
         adapter->priv->wow_flags = 0;
 #endif
+#endif
 
 	ven_rsi_dbg(INFO_ZONE, "***** RSI module resumed *****\n");
 	return 0;
@@ -1378,10 +1377,8 @@  static int rsi_freeze(struct device *dev)
 	struct sdio_func *pfunction = dev_to_sdio_func(dev);
 	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
 	struct rsi_common *common = adapter->priv;
-#ifdef CONFIG_VEN_RSI_WOW
 	struct rsi_91x_sdiodev *sdev =
 		(struct rsi_91x_sdiodev *)adapter->rsi_dev;
-#endif
 
 	ven_rsi_dbg(INFO_ZONE, "SDIO Bus freeze ===>\n");
 
@@ -1397,23 +1394,21 @@  static int rsi_freeze(struct device *dev)
 			ven_rsi_dbg(ERR_ZONE,
 				"##### Device can not wake up through WLAN\n");
 
+#if 0
 #if defined(CONFIG_VEN_RSI_BT_ALONE) || defined(CONFIG_VEN_RSI_COEX)
 		if ((common->coex_mode == 2) || (common->coex_mode == 4)) {
 			/* Deregister BT protocol */
 			rsi_deregister_bt(common);
 		}
 #endif
+#endif
 	}
 #endif
 
 	ret = rsi_sdio_disable_interrupts(pfunction);
-	if (ret)
-		return ret;
 
-	if (sdev->write_fail) {
+	if (sdev->write_fail)
 		ven_rsi_dbg(INFO_ZONE, "###### Device is not ready #######\n");
-		return 0;
-	}
 	
 	ret = rsi_set_sdio_pm_caps(adapter);
 	if (ret)
@@ -1424,17 +1419,18 @@  static int rsi_freeze(struct device *dev)
 
 int rsi_thaw(struct device *dev)
 {
-	int ret;
 	struct sdio_func *pfunction = dev_to_sdio_func(dev);
 	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
 
-	ven_rsi_dbg(INFO_ZONE, "***** BUS THAW ******\n");
+	ven_rsi_dbg(ERR_ZONE, "***** BUS THAW ******\n");
 
-	adapter->priv->suspend_in_prog = false;
+//	adapter->priv->suspend_in_prog = false;
+	adapter->priv->hibernate_resume = true;
+	adapter->priv->fsm_state = FSM_CARD_NOT_READY;
+	adapter->priv->bt_fsm_state = BT_DEVICE_NOT_READY;
+	adapter->priv->iface_down = true;
 
-	ret = rsi_sdio_enable_interrupts(pfunction);
-	if (ret)
-		return ret;
+	rsi_sdio_enable_interrupts(pfunction);
 
 	ven_rsi_dbg(INFO_ZONE, "RSI module resumed\n");
 	return 0;
@@ -1442,17 +1438,28 @@  int rsi_thaw(struct device *dev)
 
 static int rsi_poweroff(struct device *dev)
 {
-	return rsi_suspend(dev);
+	return rsi_freeze(dev);
 }
 
 static void rsi_shutdown(struct device *dev)
 {
-	rsi_suspend(dev);
+	rsi_freeze(dev);
 }
 
 int rsi_restore(struct device *dev)
 {
-	return rsi_thaw(dev);
+	struct sdio_func *pfunction = dev_to_sdio_func(dev);
+	struct rsi_hw *adapter = sdio_get_drvdata(pfunction);
+
+	adapter->priv->suspend_in_prog = false;
+	adapter->priv->hibernate_resume = true;
+	adapter->priv->fsm_state = FSM_CARD_NOT_READY;
+	adapter->priv->bt_fsm_state = BT_DEVICE_NOT_READY;
+	adapter->priv->iface_down = true;
+
+	ven_rsi_dbg(INFO_ZONE, "RSI module restored\n");
+
+	return 0;
 }
 
 static const struct dev_pm_ops rsi_pm_ops = {
diff --git a/ubuntu/rsi/rsi_main.h b/ubuntu/rsi/rsi_main.h
index 0fc3ce316bf1..eb1afbb6c4c5 100644
--- a/ubuntu/rsi/rsi_main.h
+++ b/ubuntu/rsi/rsi_main.h
@@ -41,7 +41,7 @@  struct rsi_hw;
 
 #include "rsi_ps.h"
 
-#define DRV_VER				"RS9113.NB0.NL.GNU.LNX.1.2.RC9"
+#define DRV_VER				"RS9113.NB0.NL.GNU.LNX.1.2.RC12"
 
 #define ERR_ZONE                        BIT(0) /* Error Msgs		*/
 #define INFO_ZONE                       BIT(1) /* Generic Debug Msgs	*/
@@ -63,7 +63,7 @@  struct rsi_hw;
 #define FSM_BB_RF_PROG_SENT             7
 #define FSM_MAC_INIT_DONE               8
 
-extern u32 ven_rsi_zone_enabled;
+extern u16 ven_rsi_zone_enabled;
 extern __printf(2, 3) void ven_rsi_dbg(u32 zone, const char *fmt, ...);
 void rsi_hex_dump(u32 zone, char *msg_str, const u8 *msg, u32 len);
 
@@ -131,6 +131,9 @@  void rsi_hex_dump(u32 zone, char *msg_str, const u8 *msg, u32 len);
 #define RSI_WOW_ENABLED			BIT(0)
 #define RSI_WOW_NO_CONNECTION		BIT(1)
 
+#define MAX_REG_COUNTRIES		30
+#define NL80211_DFS_WORLD		4
+
 struct version_info {
 	u16 major;
 	u16 minor;
@@ -327,6 +330,7 @@  struct rsi_common {
 	int tx_power;
 	u8 ant_in_use;
 	bool suspend_in_prog;
+	bool hibernate_resume;
 #ifdef CONFIG_VEN_RSI_WOW
 	u8 wow_flags;
 #endif