]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/ethtool-link-mode.py
Merge pull request #33355 from YHNdnzj/shutdown-cad
[thirdparty/systemd.git] / src / shared / ethtool-link-mode.py
1 #!/usr/bin/env python3
2 # SPDX-License-Identifier: LGPL-2.1-or-later
3
4 import re
5 import shlex
6 import subprocess
7 import sys
8
9 OVERRIDES = {
10 'autoneg' : 'autonegotiation',
11 }
12
13 mode, cpp, header = sys.argv[1:]
14 xml = mode == '--xml'
15
16 command = [*shlex.split(cpp), '-include', header, '-']
17 out = subprocess.check_output(command, stdin=subprocess.DEVNULL, universal_newlines=True)
18
19 lines = iter(out.splitlines())
20 for line in lines:
21 if line.startswith('enum ethtool_link_mode_bit_indices {'):
22 break
23
24 entries = []
25 for line in lines:
26 if line.startswith('}'):
27 break
28 # ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0,
29 m = re.match(r'^\s*(ETHTOOL_LINK_MODE_((\d*).*)_BIT)\s*=\s*(\d+),', line)
30 if not m:
31 continue
32 enum, name, speed, value = m.groups()
33
34 name = name.lower().replace('_', '-')
35 name = OVERRIDES.get(name, name)
36
37 duplex = name.split('-')[-1].lower()
38 if duplex not in {'half', 'full'}:
39 duplex = ''
40
41 entries += [(enum, name, speed, value, duplex)]
42
43 if xml:
44 print(' <tbody>')
45
46 entries.sort(key=lambda entry: (int(entry[2]) if entry[2] else 1e20, entry[4], entry[1], entry[3]))
47
48 for enum, name, speed, value, duplex in entries:
49 if xml:
50 print(f'''\
51 <row><entry><option>{name}</option></entry>
52 <entry>{speed}</entry><entry>{duplex}</entry></row>
53 ''')
54 else:
55 enum = f'[{enum}]'
56 print(f' {enum:50} = "{name}",')
57
58 if xml:
59 print(' </tbody>')
60
61 assert len(entries) >= 99