Home | History | Annotate | Download | only in network_WlanDriver
      1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 
      7 from autotest_lib.client.bin import test
      8 from autotest_lib.client.bin import utils
      9 from autotest_lib.client.common_lib import error
     10 from autotest_lib.client.common_lib.cros.network import interface
     11 from autotest_lib.client.cros.networking import shill_proxy
     12 
     13 
     14 class network_WlanDriver(test.test):
     15     """
     16     Ensure wireless devices have the expected associated kernel driver.
     17     """
     18     version = 1
     19     EXPECTED_DRIVER = {
     20             'Atheros AR9280': {
     21                     '3.4': 'wireless/ath/ath9k/ath9k.ko',
     22                     '3.8': 'wireless-3.4/ath/ath9k/ath9k.ko',
     23                     '4.14': 'wireless/ath/ath9k/ath9k.ko',
     24                     '4.19': 'wireless/ath/ath9k/ath9k.ko',
     25             },
     26             'Atheros AR9382': {
     27                     '3.4': 'wireless/ath/ath9k/ath9k.ko',
     28                     '3.8': 'wireless-3.4/ath/ath9k/ath9k.ko',
     29                     '4.14': 'wireless/ath/ath9k/ath9k.ko',
     30                     '4.19': 'wireless/ath/ath9k/ath9k.ko',
     31             },
     32             'Intel 7260': {
     33                     '3.8': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     34                     '3.10': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
     35                     '3.14': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
     36                     '4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     37                     '4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     38                     '4.19': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     39             },
     40             'Intel 7265': {
     41                     '3.8': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     42                     '3.10': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
     43                     '3.14': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
     44                     '3.18': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     45                     '4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     46                     '4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     47                     '4.19': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     48             },
     49             'Intel 9000': {
     50                     '4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     51                     '4.19': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     52             },
     53             'Intel 9260': {
     54                     '4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     55                     '4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     56                     '4.19': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     57             },
     58             'Intel 22260': {
     59                     '4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     60                     '4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     61                     '4.19': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
     62             },
     63             'Atheros AR9462': {
     64                     '3.4': 'wireless/ath/ath9k_btcoex/ath9k_btcoex.ko',
     65                     '3.8': 'wireless-3.4/ath/ath9k_btcoex/ath9k_btcoex.ko',
     66                     '4.14': 'wireless/ath/ath9k/ath9k.ko',
     67                     '4.19': 'wireless/ath/ath9k/ath9k.ko',
     68             },
     69             'Qualcomm Atheros QCA6174': {
     70                     '4.4': 'wireless/ar10k/ath/ath10k/ath10k_pci.ko',
     71                     '4.14': 'wireless/ath/ath10k/ath10k_pci.ko',
     72                     '4.19': 'wireless/ath/ath10k/ath10k_pci.ko',
     73             },
     74             'Qualcomm WCN3990': {
     75                     '4.14': 'wireless/ath/ath10k/ath10k_snoc.ko',
     76                     '4.19': 'wireless/ath/ath10k/ath10k_snoc.ko',
     77             },
     78             'Marvell 88W8797 SDIO': {
     79                     '3.4': 'wireless/mwifiex/mwifiex_sdio.ko',
     80                     '3.8': 'wireless-3.4/mwifiex/mwifiex_sdio.ko',
     81                     '4.14': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
     82                     '4.19': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
     83             },
     84             'Marvell 88W8887 SDIO': {
     85                      '3.14': 'wireless-3.8/mwifiex/mwifiex_sdio.ko',
     86                      '4.14': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
     87                      '4.19': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
     88             },
     89             'Marvell 88W8897 PCIE': {
     90                      '3.8': 'wireless/mwifiex/mwifiex_pcie.ko',
     91                      '3.10': 'wireless-3.8/mwifiex/mwifiex_pcie.ko',
     92                      '4.14': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
     93                      '4.19': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
     94             },
     95             'Marvell 88W8897 SDIO': {
     96                      '3.8': 'wireless/mwifiex/mwifiex_sdio.ko',
     97                      '3.10': 'wireless-3.8/mwifiex/mwifiex_sdio.ko',
     98                      '3.14': 'wireless-3.8/mwifiex/mwifiex_sdio.ko',
     99                      '3.18': 'wireless/mwifiex/mwifiex_sdio.ko',
    100                      '4.14': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
    101                      '4.19': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
    102             },
    103             'Broadcom BCM4354 SDIO': {
    104                      '3.8': 'wireless/brcm80211/brcmfmac/brcmfmac.ko',
    105                      '3.14': 'wireless-3.8/brcm80211/brcmfmac/brcmfmac.ko',
    106                      '4.14': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
    107                      '4.19': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
    108             },
    109             'Broadcom BCM4356 PCIE': {
    110                      '3.10': 'wireless-3.8/brcm80211/brcmfmac/brcmfmac.ko',
    111                      '4.14': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
    112                      '4.19': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
    113             },
    114             'Marvell 88W8997 PCIE': {
    115                      '4.4': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
    116                      '4.14': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
    117                      '4.19': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
    118             },
    119     }
    120     EXCEPTION_BOARDS = [
    121             # Exhibits very similar symptoms to http://crbug.com/693724,
    122             # b/65858242, b/36264732.
    123             'nyan_kitty',
    124     ]
    125 
    126 
    127     def NoDeviceFailure(self, forgive_flaky, message):
    128         """
    129         No WiFi device found. Forgiveable in some suites, for some boards.
    130         """
    131         board = utils.get_board()
    132         if forgive_flaky and board in self.EXCEPTION_BOARDS:
    133             return error.TestWarn('Exception (%s): %s' % (board, message))
    134         else:
    135             return error.TestFail(message)
    136 
    137 
    138     def run_once(self, forgive_flaky=False):
    139         """Test main loop"""
    140         # full_revision looks like "3.4.0".
    141         full_revision = utils.system_output('uname -r')
    142         # base_revision looks like "3.4".
    143         base_revision = '.'.join(full_revision.split('.')[:2])
    144         logging.info('Kernel base is %s', base_revision)
    145 
    146         proxy = shill_proxy.ShillProxy()
    147 
    148         uninit = proxy.get_proxy().get_dbus_property(proxy.manager,
    149                  shill_proxy.ShillProxy.MANAGER_PROPERTY_UNINITIALIZED_TECHNOLOGIES)
    150         logging.info("Uninitialized technologies: %s", uninit)
    151         # If Wifi support is not enabled for shill, it will be uninitialized.
    152         # Don't fail the test if Wifi was intentionally disabled.
    153         if "wifi" in uninit:
    154             raise error.TestNAError('Wireless support not enabled')
    155 
    156         wlan_ifs = [nic for nic in interface.get_interfaces()
    157                         if nic.is_wifi_device()]
    158         if wlan_ifs:
    159             net_if = wlan_ifs[0]
    160         else:
    161             raise self.NoDeviceFailure(forgive_flaky,
    162                                        'Found no recognized wireless device')
    163 
    164         # Some systems (e.g., moblab) might blacklist certain devices. We don't
    165         # rely on shill for most of this test, but it can be a helpful clue if
    166         # we see shill barfing.
    167         device_obj = proxy.find_object('Device',
    168                                        {'Type': proxy.TECHNOLOGY_WIFI})
    169         if device_obj is None:
    170             logging.warning("Shill couldn't find wireless device; "
    171                             "did someone blacklist it?")
    172 
    173         device_description = net_if.device_description
    174         if not device_description:
    175             raise error.TestFail('Device %s is not supported' % net_if.name)
    176 
    177         device_name, module_path = device_description
    178         logging.info('Device name %s, module path %s', device_name, module_path)
    179         if not device_name in self.EXPECTED_DRIVER:
    180             raise error.TestFail('Unexpected device name %s' %
    181                                  device_name)
    182 
    183         if not base_revision in self.EXPECTED_DRIVER[device_name]:
    184             raise error.TestNAError('Unexpected base kernel revision %s with device name %s' %
    185                                     (base_revision, device_name))
    186 
    187         expected_driver = self.EXPECTED_DRIVER[device_name][base_revision]
    188         if module_path != expected_driver:
    189             raise error.TestFail('Unexpected driver for %s/%s; got %s but expected %s' %
    190                                  (base_revision, device_name,
    191                                   module_path, expected_driver))
    192