blob: ef79831315e54fb5e6a02791e868d719303c77b2 [file] [log] [blame]
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros.network import interface
from autotest_lib.client.cros.networking import shill_proxy
class network_WlanDriver(test.test):
"""
Ensure wireless devices have the expected associated kernel driver.
"""
version = 1
EXPECTED_DRIVER = {
'Atheros AR9280': {
'3.4': 'wireless/ath/ath9k/ath9k.ko',
'3.8': 'wireless-3.4/ath/ath9k/ath9k.ko',
'4.14': 'wireless/ath/ath9k/ath9k.ko',
'4.19': 'wireless/ath/ath9k/ath9k.ko',
},
'Atheros AR9382': {
'3.4': 'wireless/ath/ath9k/ath9k.ko',
'3.8': 'wireless-3.4/ath/ath9k/ath9k.ko',
'4.14': 'wireless/ath/ath9k/ath9k.ko',
'4.19': 'wireless/ath/ath9k/ath9k.ko',
},
'Intel 7260': {
'3.8': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'3.10': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
'3.14': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
'4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.19': 'wireless/intel/iwlwifi/iwlwifi.ko',
},
'Intel 7265': {
'3.8': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'3.10': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
'3.14': 'wireless-3.8/iwl7000/iwlwifi/iwlwifi.ko',
'3.18': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.19': 'wireless/intel/iwlwifi/iwlwifi.ko',
},
'Intel 9000': {
'4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.19': 'wireless/intel/iwlwifi/iwlwifi.ko',
},
'Intel 9260': {
'4.4': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.14': 'wireless/iwl7000/iwlwifi/iwlwifi.ko',
'4.19': 'wireless/intel/iwlwifi/iwlwifi.ko',
},
'Atheros AR9462': {
'3.4': 'wireless/ath/ath9k_btcoex/ath9k_btcoex.ko',
'3.8': 'wireless-3.4/ath/ath9k_btcoex/ath9k_btcoex.ko',
'4.14': 'wireless/ath/ath9k/ath9k.ko',
'4.19': 'wireless/ath/ath9k/ath9k.ko',
},
'Qualcomm Atheros QCA6174': {
'4.4': 'wireless/ar10k/ath/ath10k/ath10k_pci.ko',
'4.14': 'wireless/ath/ath10k/ath10k_pci.ko',
'4.19': 'wireless/ath/ath10k/ath10k_pci.ko',
},
'Qualcomm WCN3990': {
'4.14': 'wireless/ath/ath10k/ath10k_snoc.ko',
'4.19': 'wireless/ath/ath10k/ath10k_snoc.ko',
},
'Marvell 88W8797 SDIO': {
'3.4': 'wireless/mwifiex/mwifiex_sdio.ko',
'3.8': 'wireless-3.4/mwifiex/mwifiex_sdio.ko',
'4.14': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
'4.19': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
},
'Marvell 88W8887 SDIO': {
'3.14': 'wireless-3.8/mwifiex/mwifiex_sdio.ko',
'4.14': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
'4.19': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
},
'Marvell 88W8897 PCIE': {
'3.8': 'wireless/mwifiex/mwifiex_pcie.ko',
'3.10': 'wireless-3.8/mwifiex/mwifiex_pcie.ko',
'4.14': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
'4.19': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
},
'Marvell 88W8897 SDIO': {
'3.8': 'wireless/mwifiex/mwifiex_sdio.ko',
'3.10': 'wireless-3.8/mwifiex/mwifiex_sdio.ko',
'3.14': 'wireless-3.8/mwifiex/mwifiex_sdio.ko',
'3.18': 'wireless/mwifiex/mwifiex_sdio.ko',
'4.14': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
'4.19': 'wireless/marvell/mwifiex/mwifiex_sdio.ko',
},
'Broadcom BCM4354 SDIO': {
'3.8': 'wireless/brcm80211/brcmfmac/brcmfmac.ko',
'3.14': 'wireless-3.8/brcm80211/brcmfmac/brcmfmac.ko',
'4.14': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
'4.19': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
},
'Broadcom BCM4356 PCIE': {
'3.10': 'wireless-3.8/brcm80211/brcmfmac/brcmfmac.ko',
'4.14': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
'4.19': 'wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko',
},
'Marvell 88W8997 PCIE': {
'4.4': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
'4.14': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
'4.19': 'wireless/marvell/mwifiex/mwifiex_pcie.ko',
},
}
EXCEPTION_BOARDS = [
# Exhibits very similar symptoms to http://crbug.com/693724,
# b/65858242, b/36264732.
'nyan_kitty',
]
def NoDeviceFailure(self, forgive_flaky, message):
"""
No WiFi device found. Forgiveable in some suites, for some boards.
"""
board = utils.get_board()
if forgive_flaky and board in self.EXCEPTION_BOARDS:
return error.TestWarn('Exception (%s): %s' % (board, message))
else:
return error.TestFail(message)
def run_once(self, forgive_flaky=False):
"""Test main loop"""
# full_revision looks like "3.4.0".
full_revision = utils.system_output('uname -r')
# base_revision looks like "3.4".
base_revision = '.'.join(full_revision.split('.')[:2])
logging.info('Kernel base is %s', base_revision)
proxy = shill_proxy.ShillProxy()
uninit = proxy.get_proxy().get_dbus_property(proxy.manager,
shill_proxy.ShillProxy.MANAGER_PROPERTY_UNINITIALIZED_TECHNOLOGIES)
logging.info("Uninitialized technologies: %s", uninit)
# If Wifi support is not enabled for shill, it will be uninitialized.
# Don't fail the test if Wifi was intentionally disabled.
if "wifi" in uninit:
raise error.TestNAError('Wireless support not enabled')
wlan_ifs = [nic for nic in interface.get_interfaces()
if nic.is_wifi_device()]
if wlan_ifs:
net_if = wlan_ifs[0]
else:
raise self.NoDeviceFailure(forgive_flaky,
'Found no recognized wireless device')
# Some systems (e.g., moblab) might blacklist certain devices. We don't
# rely on shill for most of this test, but it can be a helpful clue if
# we see shill barfing.
device_obj = proxy.find_object('Device',
{'Type': proxy.TECHNOLOGY_WIFI})
if device_obj is None:
logging.warning("Shill couldn't find wireless device; "
"did someone blacklist it?")
device_description = net_if.device_description
if not device_description:
raise error.TestFail('Device %s is not supported' % net_if.name)
device_name, module_path = device_description
logging.info('Device name %s, module path %s', device_name, module_path)
if not device_name in self.EXPECTED_DRIVER:
raise error.TestFail('Unexpected device name %s' %
device_name)
if not base_revision in self.EXPECTED_DRIVER[device_name]:
raise error.TestNAError('Unexpected base kernel revision %s with device name %s' %
(base_revision, device_name))
expected_driver = self.EXPECTED_DRIVER[device_name][base_revision]
if module_path != expected_driver:
raise error.TestFail('Unexpected driver for %s/%s; got %s but expected %s' %
(base_revision, device_name,
module_path, expected_driver))