Commit 60d1bc2c authored by Kirill Smelkov's avatar Kirill Smelkov

promise/plugin/check_sdr_busy: Don't hardcode /dev/sdr0@0

Currently check_sdr_busy always checks /dev/sdr0 (via `-c 0`) and
also implicitly DMA channel 0 as sdr_util help explains:

    ./sdr_util  -h
    ...
    -c device_num              select the device (default = all)
    -d channel_num             select the channel (default = 0)

This works well for ORS, which always has only single SDR board.

However for cases when there are either a) multiple SDR boards, or b)
single CPRI board, the assumption is incorrect:

- for multiple SDR boards we need to be able to specify /dev/sdrX
  instead of sdr0.

- for the case of one CPRI boards, links to different Radio Units
  attached to different SFP ports are associated with different DMA
  channels, so to test e.g. whether RU1 is being used it is necessary to
  check e.g. sdr0@0, while for RU2 it is necessary to check sdr0@1.

  I explicitly verified that for CPRI case

  a) Amarisoft kernel driver allows /dev/sdrX associated with CPRI card
     to be opened multiple times simultaneously - up to the amount of SFP
     ports = # of DMA channels, and

  b) that only DMA channels / SFP ports actually being in use are
     reported as busy by sdr_util, while the other DMA channels / SFP
     ports are not reported as busy.

  I also verified that for regular SDR board (not CPRI) using -d 0 does
  not change any verification semantic as such SDR boards have only one
  DMA channel.

-> As a preparatory step for multiRU work adjust check_sdr_busy promise
to take SDR device number and DMA channel number as arguments instead of
hardcoding sdr0@0.

For now this change is accompanied by the following change in
ors-amarisoft SR to keep it working as before:

    --- a/software/ors-amarisoft/instance-enb.jinja2.cfg
    +++ b/software/ors-amarisoft/instance-enb.jinja2.cfg
    @@ -615,6 +615,8 @@ name = ${:_buildout_section_name_}
     promise = check_sdr_busy
     config-testing = {{ slapparameter_dict.get("testing", False) }}
     config-sdr = {{ sdr }}
    +config-sdr_dev  = 0
    +config-dma_chan = 0

(posted in slapos!1458)

/cc @xavier_thompson, @Daetalus
/reviewed-by @jhuge, @lu.xu
/partly-reviewed-by @tomo
/reviewed-on !125
parent 5c1d2f76
...@@ -16,20 +16,23 @@ class RunPromise(GenericPromise): ...@@ -16,20 +16,23 @@ class RunPromise(GenericPromise):
testing = self.getConfig('testing') == "True" testing = self.getConfig('testing') == "True"
sdr = self.getConfig('sdr') sdr = self.getConfig('sdr')
sdr_dev = self.getConfig('sdr_dev')
dma_chan = self.getConfig('dma_chan')
sdr_devchan = "/dev/sdr%s@%s" % (sdr_dev, dma_chan)
if testing: if testing:
self.logger.info("skipping promise") self.logger.info("skipping promise")
return return
try: try:
out = subprocess.check_output([ out = subprocess.check_output([
sdr + '/sdr_util', '-c', '0', 'version'], stderr=subprocess.STDOUT) sdr + '/sdr_util', '-c', sdr_dev, '-d', dma_chan, 'version'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
if e.returncode == 1 and \ if e.returncode == 1 and \
("DMA channel is already opened" in e.output.decode() or \ ("DMA channel is already opened" in e.output.decode() or \
"Device or resource busy" in e.output.decode()): "Device or resource busy" in e.output.decode()):
self.logger.info("eNB is using /dev/sdr0") self.logger.info("eNB is using %s", sdr_devchan)
return return
self.logger.error("eNB is not using /dev/sdr0") self.logger.error("eNB is not using %s", sdr_devchan)
def test(self): def test(self):
""" """
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment