blob: d87e05e7dfe6edea613cf8d33884a149adf180d2 [file] [log] [blame]
#!/usr/bin/python
"""Wifi commands for Quantenna using QCSAPI."""
import os
import subprocess
import time
import utils
# Detect Quantenna device.
#
# qcsapi_pcie_static runs on PCIe hosts, e.g. GFRG250.
# call_qcsapi runs on the LHOST, e.g. GFEX250.
#
# When called without arguments, qcsapi_pcie_static checks for a Quantenna
# device without sending any RPCs. Both programs return 234 only if a Quantenna
# device is present.
_QCSAPI = None
for qcsapi in ['qcsapi_pcie_static', 'call_qcsapi']:
with open(os.devnull, 'w') as devnull:
try:
if subprocess.call([qcsapi], stdout=devnull, stderr=devnull) == 234:
_QCSAPI = qcsapi
break
except OSError:
continue
def _qcsapi(*args):
return subprocess.check_output([_QCSAPI] + list(args))
def _set(mode, opt):
"""Enable wifi."""
_qcsapi('rfenable', '0')
_qcsapi('restore_default_config', 'noreboot')
config = {
'bw': opt.width,
'channel': '149' if opt.channel == 'auto' else opt.channel,
'mode': mode,
'pmf': '0',
'scs': '0',
}
for param, value in config.iteritems():
_qcsapi('update_config_param', 'wifi0', param, value)
if int(_qcsapi('is_startprod_done')):
_qcsapi('reload_in_mode', 'wifi0', mode)
else:
_qcsapi('startprod', 'wifi0')
for _ in xrange(30):
if int(_qcsapi('is_startprod_done')):
break
time.sleep(1)
else:
raise utils.BinWifiException('startprod timed out')
if mode == 'ap':
_qcsapi('set_ssid', 'wifi0', opt.ssid)
_qcsapi('set_passphrase', 'wifi0', '0', os.environ['WIFI_PSK'])
_qcsapi('set_option', 'wifi0', 'ssid_broadcast',
'0' if opt.hidden_mode else '1')
_qcsapi('rfenable', '1')
else:
_qcsapi('create_ssid', 'wifi0', opt.ssid)
_qcsapi('ssid_set_passphrase', 'wifi0', opt.ssid, '0',
os.environ['WIFI_CLIENT_PSK'])
# In STA mode, 'rfenable 1' is already done by 'startprod'/'reload_in_mode'.
# 'apply_security_config' must be called instead.
_qcsapi('apply_security_config', 'wifi0')
return True
def _stop(_):
"""Disable wifi."""
_qcsapi('rfenable', '0')
return True
def has_quantenna():
return _QCSAPI is not None
def set_wifi(opt):
return _set('ap', opt)
def set_client_wifi(opt):
return _set('sta', opt)
def stop_ap_wifi(opt):
return _stop(opt)
def stop_client_wifi(opt):
return _stop(opt)