| #!/usr/bin/env python3 | 
 | # | 
 | # b43 firmware file squasher | 
 | # Removes unnecessary firmware files | 
 | # | 
 | # Copyright (c) 2009 Michael Buesch <mb@bu3sch.de> | 
 | # | 
 | # Licensed under the GNU/GPL version 2 or (at your option) any later version. | 
 | # | 
 |  | 
 | import sys | 
 | import os | 
 |  | 
 | def usage(): | 
 | 	print("Usage: %s PHYTYPES COREREVS /path/to/extracted/firmware" % sys.argv[0]) | 
 | 	print("") | 
 | 	print("PHYTYPES is a comma separated list of:") | 
 | 	print("A         => A-PHY") | 
 | 	print("AG        => Dual A-PHY G-PHY") | 
 | 	print("G         => G-PHY") | 
 | 	print("LP        => LP-PHY") | 
 | 	print("N         => N-PHY") | 
 | 	print("HT        => HT-PHY") | 
 | 	print("LCN       => LCN-PHY") | 
 | 	print("LCN40     => LCN40-PHY") | 
 | 	print("AC        => AC-PHY") | 
 | 	print("") | 
 | 	print("COREREVS is a comma separated list of core revision numbers.") | 
 |  | 
 | if len(sys.argv) != 4: | 
 | 	usage() | 
 | 	sys.exit(1) | 
 |  | 
 | phytypes = sys.argv[1] | 
 | corerevs = sys.argv[2] | 
 | fwpath = sys.argv[3] | 
 |  | 
 | phytypes = phytypes.split(',') | 
 | try: | 
 | 	corerevs = [int(r) for r in corerevs.split(',')] | 
 | except ValueError: | 
 | 	print("ERROR: \"%s\" is not a valid COREREVS string\n" % corerevs) | 
 | 	usage() | 
 | 	sys.exit(1) | 
 |  | 
 |  | 
 | fwfiles = os.listdir(fwpath) | 
 | fwfiles = [str for str in fwfiles if str.endswith(".fw")] | 
 | if not fwfiles: | 
 | 	print("ERROR: No firmware files found in %s" % fwpath) | 
 | 	sys.exit(1) | 
 |  | 
 | required_fwfiles = [] | 
 |  | 
 | def revs_match(revs_a, revs_b): | 
 | 	for rev in revs_a: | 
 | 		if rev in revs_b: | 
 | 			return True | 
 | 	return False | 
 |  | 
 | def phytypes_match(types_a, types_b): | 
 | 	for type in types_a: | 
 | 		type = type.strip().upper() | 
 | 		if type in types_b: | 
 | 			return True | 
 | 	return False | 
 |  | 
 | revmapping = { | 
 | 	"ucode2.fw"		: ( (2,3,),		("G",), ), | 
 | 	"ucode4.fw"		: ( (4,),		("G",), ), | 
 | 	"ucode5.fw"		: ( (5,6,7,8,9,10,),	("G","A","AG",), ), | 
 | 	"ucode11.fw"		: ( (11,12,),		("N",), ), | 
 | 	"ucode13.fw"		: ( (13,),		("LP","G",), ), | 
 | 	"ucode14.fw"		: ( (14,),		("LP",), ), | 
 | 	"ucode15.fw"		: ( (15,),		("LP",), ), | 
 | 	"ucode16_mimo.fw"	: ( (16,17,18,19,23,),	("N",), ), | 
 | #	"ucode16_lp.fw"		: ( (16,17,18,19,),	("LP",), ), | 
 | 	"ucode24_lcn.fw"	: ( (24,),		("LCN",), ), | 
 | 	"ucode25_mimo.fw"	: ( (25,28,),		("N",), ), | 
 | 	"ucode25_lcn.fw"	: ( (25,28,),		("LCN",), ), | 
 | 	"ucode26_mimo.fw"	: ( (26,),		("HT",), ), | 
 | 	"ucode29_mimo.fw"	: ( (29,),		("HT",), ), | 
 | 	"ucode30_mimo.fw"	: ( (30,),		("N",), ), | 
 | 	"ucode33_lcn40.fw"	: ( (33,),		("LCN40",), ), | 
 | 	"ucode40.fw"		: ( (40,),		("AC",), ), | 
 | 	"ucode42.fw"		: ( (42,),		("AC",), ), | 
 | 	"pcm4.fw"		: ( (1,2,3,4,),		("G",), ), | 
 | 	"pcm5.fw"		: ( (5,6,7,8,9,10,),	("G","A","AG",), ), | 
 | } | 
 |  | 
 | initvalmapping = { | 
 | 	"a0g1initvals5.fw"	: ( (5,6,7,8,9,10,),	("AG",), ), | 
 | 	"a0g0initvals5.fw"	: ( (5,6,7,8,9,10,),	("A", "AG",), ), | 
 | 	"b0g0initvals2.fw"	: ( (2,4,),		("G",), ), | 
 | 	"b0g0initvals5.fw"	: ( (5,6,7,8,9,10,),	("G",), ), | 
 | 	"b0g0initvals13.fw"	: ( (13,),		("G",), ), | 
 | 	"n0initvals11.fw"	: ( (11,12,),		("N",), ), | 
 | 	"n0initvals16.fw"	: ( (16,17,18,23,),	("N",), ), | 
 | 	"n0initvals24.fw"	: ( (24,),		("N",), ), | 
 | 	"n0initvals25.fw"	: ( (25,28,),		("N",), ), | 
 | 	"n16initvals30.fw"	: ( (30,),		("N",), ), | 
 | 	"lp0initvals13.fw"	: ( (13,),		("LP",), ), | 
 | 	"lp0initvals14.fw"	: ( (14,),		("LP",), ), | 
 | 	"lp0initvals15.fw"	: ( (15,),		("LP",), ), | 
 | #	"lp0initvals16.fw"	: ( (16,17,18,),	("LP",), ), | 
 | 	"lcn0initvals24.fw"	: ( (24,),		("LCN",), ), | 
 | 	"ht0initvals26.fw"	: ( (26,),		("HT",), ), | 
 | 	"ht0initvals29.fw"	: ( (29,),		("HT",), ), | 
 | 	"lcn400initvals33.fw"	: ( (33,),		("LCN40",), ), | 
 | 	"ac0initvals40.fw"	: ( (40,),		("AC",), ), | 
 | 	"ac1initvals42.fw"	: ( (42,),		("AC",), ), | 
 | 	"a0g1bsinitvals5.fw"	: ( (5,6,7,8,9,10,),	("AG",), ), | 
 | 	"a0g0bsinitvals5.fw"	: ( (5,6,7,8,9,10,),	("A", "AG"), ), | 
 | 	"b0g0bsinitvals5.fw"	: ( (5,6,7,8,9,10,),	("G",), ), | 
 | 	"n0bsinitvals11.fw"	: ( (11,12,),		("N",), ), | 
 | 	"n0bsinitvals16.fw"	: ( (16,17,18,23,),	("N",), ), | 
 | 	"n0bsinitvals24.fw"	: ( (24,),		("N",), ), | 
 | 	"n0bsinitvals25.fw"	: ( (25,28,),		("N",), ), | 
 | 	"n16bsinitvals30.fw"	: ( (30,),		("N",), ), | 
 | 	"lp0bsinitvals13.fw"	: ( (13,),		("LP",), ), | 
 | 	"lp0bsinitvals14.fw"	: ( (14,),		("LP",), ), | 
 | 	"lp0bsinitvals15.fw"	: ( (15,),		("LP",), ), | 
 | #	"lp0bsinitvals16.fw"	: ( (16,17,18,),	("LP",), ), | 
 | 	"lcn0bsinitvals24.fw"	: ( (24,),		("LCN",), ), | 
 | 	"ht0bsinitvals26.fw"	: ( (26,),		("HT",), ), | 
 | 	"ht0bsinitvals29.fw"	: ( (29,),		("HT",), ), | 
 | 	"lcn400bsinitvals33.fw"	: ( (33,),		("LCN40",), ), | 
 | 	"ac0bsinitvals40.fw"	: ( (40,),		("AC",), ), | 
 | 	"ac1bsinitvals42.fw"	: ( (42,),		("AC",), ), | 
 | } | 
 |  | 
 | for f in fwfiles: | 
 | 	if f in revmapping: | 
 | 		if revs_match(corerevs, revmapping[f][0]) and\ | 
 | 		   phytypes_match(phytypes, revmapping[f][1]): | 
 | 			required_fwfiles += [f] | 
 | 		continue | 
 | 	if f in initvalmapping: | 
 | 		if revs_match(corerevs, initvalmapping[f][0]) and\ | 
 | 		   phytypes_match(phytypes, initvalmapping[f][1]): | 
 | 			required_fwfiles += [f] | 
 | 		continue | 
 | 	print("WARNING: Firmware file %s not found in the mapping lists" % f) | 
 |  | 
 | for f in fwfiles: | 
 | 	if f not in required_fwfiles: | 
 | 		print("Deleting %s" % f) | 
 | 		os.unlink(fwpath + '/' + f) | 
 |  |