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