• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
5import logging
6
7from autotest_lib.client.bin import test
8from autotest_lib.client.bin import utils
9from autotest_lib.client.common_lib import error
10from autotest_lib.client.common_lib.cros.network import interface
11from autotest_lib.client.cros.networking import shill_proxy
12
13
14class 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