mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-29 09:32:34 +00:00 
			
		
		
		
	Compare commits
	
		
			44 Commits
		
	
	
		
			WIFI-14697
			...
			WIFI-14631
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | e13636535f | ||
|   | f67a2c404b | ||
|   | 974351335f | ||
|   | 311b1a620c | ||
|   | 066b442247 | ||
|   | f2b69ce972 | ||
|   | 88830b2537 | ||
|   | 842b21fb5e | ||
|   | 8f8eb63ac4 | ||
|   | 367a919d67 | ||
|   | 919fe12372 | ||
|   | d6d22433c5 | ||
|   | eff579f3ec | ||
|   | 0768008764 | ||
|   | 53c45dfaeb | ||
|   | 7e3f851788 | ||
|   | 205484080e | ||
|   | f1fc99ccbe | ||
|   | db36e09553 | ||
|   | b3174a0434 | ||
|   | 5f8c4d31cc | ||
|   | aa78f40843 | ||
|   | 721fb4cc4d | ||
|   | f75a36f89f | ||
|   | a375b9f774 | ||
|   | 16d029f10f | ||
|   | bb45e09e8b | ||
|   | 2798088cec | ||
|   | 470703a490 | ||
|   | c56d60b2d3 | ||
|   | 1178c3b6f1 | ||
|   | 0db44ca55b | ||
|   | ae5015424b | ||
|   | 32c7a7ff1d | ||
|   | 39e601cbd4 | ||
|   | ce9c896371 | ||
|   | 0008cb20dd | ||
|   | 701242ed25 | ||
|   | 67dd4bfca7 | ||
|   | 88fb4cafbc | ||
|   | feb410ddc3 | ||
|   | 43a8dd1303 | ||
|   | 188f6b33e0 | ||
|   | 27e4eb3685 | 
| @@ -41,8 +41,10 @@ ALLWIFIBOARDS:= \ | ||||
| 	edgecore-oap102 \ | ||||
| 	edgecore-oap103 \ | ||||
| 	edgecore-eap104 \ | ||||
| 	emplus-wap380c \ | ||||
| 	emplus-wap385c \ | ||||
| 	emplus-wap386v2 \ | ||||
| 	emplus-wap581 \ | ||||
| 	liteon-wpx8324 \ | ||||
| 	indio-um-310ax-v1 \ | ||||
| 	indio-um-510axp-v1 \ | ||||
| @@ -56,6 +58,7 @@ ALLWIFIBOARDS:= \ | ||||
| 	sonicfi-rap630w-311g \ | ||||
| 	sonicfi-rap630w-312g \ | ||||
| 	sonicfi-rap650c \ | ||||
| 	sonicfi-rap630e \ | ||||
| 	tplink-ex227 \ | ||||
| 	tplink-ex447 \ | ||||
| 	yuncore-ax840 \ | ||||
| @@ -406,8 +409,10 @@ $(eval $(call generate-ath11k-wifi-package,edgecore-eap102,Edgecore EAP102)) | ||||
| $(eval $(call generate-ath11k-wifi-package,edgecore-oap102,Edgecore OAP102)) | ||||
| $(eval $(call generate-ath11k-wifi-package,edgecore-oap103,Edgecore OAP103)) | ||||
| $(eval $(call generate-ath11k-wifi-package,edgecore-eap104,Edgecore EAP104)) | ||||
| $(eval $(call generate-ath11k-wifi-package,emplus-wap380c,Emplus WAP380C)) | ||||
| $(eval $(call generate-ath11k-wifi-package,emplus-wap385c,Emplus WAP385C)) | ||||
| $(eval $(call generate-ath11k-wifi-package,emplus-wap386v2,Emplus WAP386 V2)) | ||||
| $(eval $(call generate-ath11k-wifi-package,emplus-wap581,Emplus WAP581)) | ||||
| $(eval $(call generate-ath11k-wifi-package,liteon-wpx8324,Liteon WPX8324)) | ||||
| $(eval $(call generate-ath11k-wifi-package,indio-um-310ax-v1,Indio UM-310AX V1)) | ||||
| $(eval $(call generate-ath11k-wifi-package,indio-um-510axp-v1,Indio UM-510AXP V1)) | ||||
| @@ -416,6 +421,7 @@ $(eval $(call generate-ath11k-wifi-package,sonicfi-rap630c-311g,Sonicfi RAP630C | ||||
| $(eval $(call generate-ath11k-wifi-package,sonicfi-rap630w-311g,Sonicfi RAP630W 311G)) | ||||
| $(eval $(call generate-ath11k-wifi-package,sonicfi-rap630w-312g,Sonicfi RAP630W 312G)) | ||||
| $(eval $(call generate-ath11k-wifi-package,sonicfi-rap650c,SonicFi RAP650C)) | ||||
| $(eval $(call generate-ath11k-wifi-package,sonicfi-rap630e,SonicFi RAP630E)) | ||||
| $(eval $(call generate-ath11k-wifi-package,tplink-ex227,TP-Link EX227)) | ||||
| $(eval $(call generate-ath11k-wifi-package,tplink-ex447,TP-Link EX447)) | ||||
| $(eval $(call generate-ath11k-wifi-package,yuncore-ax840,YunCore AX840)) | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-emplus-wap380c.bin.IPQ8074
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-emplus-wap380c.bin.IPQ8074
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-emplus-wap581.bin.IPQ5018
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-emplus-wap581.bin.IPQ5018
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-emplus-wap581.bin.QCN6122
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-emplus-wap581.bin.QCN6122
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-sonicfi-rap630e.bin.IPQ5018
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-sonicfi-rap630e.bin.IPQ5018
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-sonicfi-rap630e.bin.QCN6122
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq807x_v5.4/ath11k-wifi/board-sonicfi-rap630e.bin.QCN6122
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -33,6 +33,11 @@ sonicfi,rap630c-311g|\ | ||||
| sonicfi,rap630w-311g) | ||||
|         ucidef_set_led_default "power" "POWER" "pwm:blue" "on" | ||||
| 	;; | ||||
| sonicfi,rap630e) | ||||
| 	ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy0tpt" | ||||
| 	ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt" | ||||
| 	ucidef_set_led_default "power" "POWER" "green:power" "on" | ||||
| 	;; | ||||
| edgecore,oap101|\ | ||||
| edgecore,oap101-6e|\ | ||||
| edgecore,oap101e|\ | ||||
|   | ||||
| @@ -68,6 +68,12 @@ qcom_setup_interfaces() | ||||
| 	glinet,b3000) | ||||
| 		ucidef_add_switch "switch1" "6u@eth1" "1:wan" "2:lan" "3:lan" | ||||
| 		;; | ||||
| 	sonicfi,rap630e) | ||||
| 		ucidef_set_interface_wan "eth1" | ||||
| 		ucidef_set_interface_lan "eth0" | ||||
| 	emplus,wap581) | ||||
| 		ucidef_set_interface_wan "eth0 eth1" | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
|  | ||||
| @@ -104,6 +110,16 @@ qcom_setup_macs() | ||||
| 		wan_mac=$(cat /sys/class/net/eth1/address) | ||||
| 		lan_mac=$(macaddr_add "$wan_mac" 2) | ||||
| 		;; | ||||
| 	sonicfi,rap630e) | ||||
| 		mac=$(fw_printenv -n BaseMacAddress) | ||||
| 		[ -z "$mac" ] && return; | ||||
| 		lan_mac=$(macaddr_canonicalize $mac) | ||||
| 		wan_mac=$(macaddr_add "$wan_mac" 1) | ||||
| 		ucidef_set_network_device_mac eth1 $wan_mac | ||||
| 		ucidef_set_network_device_mac eth0 $lan_mac | ||||
| 		ip link set eth1 address $wan_mac | ||||
| 		ip link set eth0 address $lan_mac | ||||
| 		;; | ||||
| 	*) | ||||
| 		wan_mac=$(cat /sys/class/net/eth0/address) | ||||
| 		lan_mac=$(macaddr_add "$wan_mac" 1) | ||||
|   | ||||
| @@ -94,6 +94,15 @@ ath11k_generate_macs_gl_b3000() { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| ath11k_generate_macs_rap630e() { | ||||
| 	touch /lib/firmware/ath11k-macs | ||||
| 	eth=$(cat /sys/class/net/eth0/address) | ||||
| 	mac1=$(macaddr_add $eth 2) | ||||
| 	mac2=$(macaddr_add $eth 3) | ||||
| 	echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs | ||||
| 	echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs | ||||
| } | ||||
|  | ||||
| caldata_die() { | ||||
| 	echo "caldata: " "$*" | ||||
| 	exit 1 | ||||
| @@ -122,6 +131,7 @@ ath11k/IPQ5018/hw1.0/caldata.bin) | ||||
| 	sonicfi,rap630c-311g|\ | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	sonicfi,rap630w-312g|\ | ||||
| 	sonicfi,rap630e|\ | ||||
| 	cybertan,eww631-a1|\ | ||||
| 	cybertan,eww631-b1|\ | ||||
| 	edgecore,eap104|\ | ||||
| @@ -140,6 +150,7 @@ ath11k/IPQ5018/hw1.0/caldata.bin) | ||||
| 	udaya,a6-od2|\ | ||||
| 	wallys,dr5018|\ | ||||
| 	yuncore,fap655|\ | ||||
| 	emplus,wap581|\ | ||||
| 	glinet,b3000) | ||||
| 		caldata_extract "0:ART" 0x1000 0x20000   | ||||
| 		;; | ||||
| @@ -152,6 +163,7 @@ ath11k/qcn6122/hw1.0/caldata_1.bin) | ||||
| 	sonicfi,rap630c-311g|\ | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	sonicfi,rap630w-312g|\ | ||||
| 	sonicfi,rap630e|\ | ||||
| 	cybertan,eww631-a1|\ | ||||
| 	cybertan,eww631-b1|\ | ||||
| 	edgecore,oap101|\ | ||||
| @@ -163,6 +175,7 @@ ath11k/qcn6122/hw1.0/caldata_1.bin) | ||||
| 	udaya,a6-od2|\ | ||||
| 	hfcl,ion4xi_w|\ | ||||
| 	wallys,dr5018|\ | ||||
| 	emplus,wap581|\ | ||||
| 	yuncore,fap655) | ||||
| 		caldata_extract "0:ART" 0x26800 0x20000   | ||||
| 		;; | ||||
| @@ -178,6 +191,7 @@ ath11k/qcn6122/hw1.0/caldata_2.bin) | ||||
| 		;; | ||||
| 	sonicfi,rap630c-311g|\ | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	sonicfi,rap630e|\ | ||||
| 	cybertan,eww631-a1|\ | ||||
| 	cybertan,eww631-b1|\ | ||||
| 	glinet,b3000) | ||||
| @@ -213,6 +227,9 @@ ath11k-macs) | ||||
| 	cybertan,eww631-b1) | ||||
| 		ath11k_generate_macs_eww631_b1 | ||||
| 		;; | ||||
| 	sonicfi,rap630e) | ||||
| 		ath11k_generate_macs_rap630e | ||||
| 		;; | ||||
| 	edgecore,eap104|\ | ||||
| 	edgecore,oap101|\ | ||||
| 	edgecore,oap101-6e|\ | ||||
|   | ||||
| @@ -73,6 +73,7 @@ platform_check_image() { | ||||
| 	sonicfi,rap630c-311g|\ | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	sonicfi,rap630w-312g|\ | ||||
| 	sonicfi,rap630e|\ | ||||
| 	cybertan,eww631-a1|\ | ||||
| 	cybertan,eww631-b1|\ | ||||
| 	edgecore,eap104|\ | ||||
| @@ -91,6 +92,7 @@ platform_check_image() { | ||||
| 	edgecore,oap101|\ | ||||
| 	edgecore,oap101-6e|\ | ||||
| 	edgecore,oap101e|\ | ||||
| 	emplus,wap581|\ | ||||
| 	edgecore,oap101e-6e) | ||||
| 		[ "$magic_long" = "73797375" ] && return 0 | ||||
| 		;; | ||||
| @@ -138,6 +140,7 @@ platform_do_upgrade() { | ||||
| 	optimcloud,d60-5g|\ | ||||
| 	optimcloud,d50|\ | ||||
| 	optimcloud,d50-5g|\ | ||||
| 	emplus,wap581|\ | ||||
| 	yuncore,fap655) | ||||
| 		[ -f /proc/boot_info/rootfs/upgradepartition ] && { | ||||
| 			CI_UBIPART="$(cat /proc/boot_info/rootfs/upgradepartition)" | ||||
| @@ -149,7 +152,8 @@ platform_do_upgrade() { | ||||
| 	cybertan,eww631-b1|\ | ||||
| 	sonicfi,rap630c-311g|\ | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	sonicfi,rap630w-312g) | ||||
| 	sonicfi,rap630w-312g|\ | ||||
| 	sonicfi,rap630e) | ||||
| 		boot_part=$(fw_printenv bootfrom | cut  -d = -f2) | ||||
| 			echo "Current bootfrom is $boot_part" | ||||
| 			if [[ $boot_part == 1 ]]; then | ||||
|   | ||||
| @@ -450,6 +450,8 @@ CONFIG_GPIO_DEVRES=y | ||||
| # CONFIG_GPIO_SAMA5D2_PIOBU is not set | ||||
| CONFIG_GPIO_SYSFS=y | ||||
| # CONFIG_GPIO_USB_DETECT is not set | ||||
| CONFIG_GPIO_WATCHDOG=y | ||||
| CONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y | ||||
| # CONFIG_GSI is not set | ||||
| # CONFIG_HABANA_AI is not set | ||||
| CONFIG_HANDLE_DOMAIN_IRQ=y | ||||
|   | ||||
| @@ -0,0 +1,831 @@ | ||||
| /dts-v1/; | ||||
| /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
|  * copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| #include "ipq5018.dtsi" | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| / { | ||||
| 	#address-cells = <0x2>; | ||||
| 	#size-cells = <0x2>; | ||||
| 	model = "Emplus WAP581"; | ||||
| 	compatible = "emplus,wap581", "qcom,ipq5018-mp03.3", "qcom,ipq5018"; | ||||
| 	interrupt-parent = <&intc>; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &blsp1_uart1; | ||||
| 		ethernet0 = "/soc/dp1"; | ||||
| 		ethernet1 = "/soc/dp2"; | ||||
| 	}; | ||||
|  | ||||
| 	chosen { | ||||
| 		bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; | ||||
| 		bootargs-append = " swiotlb=1 coherent_pool=2M"; | ||||
| 		stdout-path = "serial0"; | ||||
| 	}; | ||||
|  | ||||
| 	reserved-memory { | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	/*		   256 MB Profile | ||||
| 	 * +==========+==============+=========================+ | ||||
| 	 * |	  |	      |			 | | ||||
| 	 * |  Region  | Start Offset |	  Size	   | | ||||
| 	 * |	  |	      |			 | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    NSS   |  0x40000000  |	   8MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   Linux  |  0x40800000  | Depends on total memory | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   uboot  |  0x4A600000  |	   4MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    SBL   |  0x4AA00000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   smem   |  0x4AB00000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    TZ    |  0x4AC00000  |	   4MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    Q6    |	      |			 | | ||||
| 	 * |   code/  |  0x4B000000  |	  20MB	   | | ||||
| 	 * |   data   |	      |			 | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |   data   |  0x4C400000  |	  13MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |  M3 Dump |  0x4D100000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |   QDSS   |  0x4D200000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |   data   |  0x4D300000  |	  13MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |  M3 Dump |  0x4E000000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |   QDSS   |  0x4E100000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |   data   |  0x4E200000  |	  13MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |  M3 Dump |  0x4EF00000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |   QDSS   |  0x4F000000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |						   | | ||||
| 	 * |	    Rest of the memory for Linux	   | | ||||
| 	 * |						   | | ||||
| 	 * +===================================================+ | ||||
| 	 */ | ||||
| 		q6_mem_regions: q6_mem_regions@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 0x4100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_code_data: q6_code_data@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 0x1400000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_ipq5018_data: q6_ipq5018_data@4C400000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4C400000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump: m3_dump@4D100000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D100000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_etr_region: q6_etr_dump@4D200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D200000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data1: q6_qcn6122_data1@4D300000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D300000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E000000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E100000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E100000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data2: q6_qcn6122_data2@4E200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E200000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_2: m3_dump_qcn6122_2@4EF00000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4EF00000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4F000000 0x0 0x100000>; | ||||
| 		}; | ||||
| 	#else | ||||
| 	/*		 512MB/1GB Profiles | ||||
| 	 * +==========+==============+=========================+ | ||||
| 	 * |	  |	      |			 | | ||||
| 	 * |  Region  | Start Offset |	  Size	   | | ||||
| 	 * |	  |	      |			 | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    NSS   |  0x40000000  |	  16MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   Linux  |  0x41000000  | Depends on total memory | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   uboot  |  0x4A600000  |	   4MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    SBL   |  0x4AA00000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   smem   |  0x4AB00000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    TZ    |  0x4AC00000  |	   4MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    Q6    |	      |			 | | ||||
| 	 * |   code/  |  0x4B000000  |	  20MB	   | | ||||
| 	 * |   data   |	      |			 | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |   data   |  0x4C400000  |	  13MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |  M3 Dump |  0x4D100000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |   QDSS   |  0x4D200000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |	      |			 | | ||||
| 	 * |  Caldb   |  0x4D300000  |	   2MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |   data   |  0x4D500000  |	  13MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |  M3 Dump |  0x4E200000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |   QDSS   |  0x4E300000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|	      |			 | | ||||
| 	 * |  Caldb   |  0x4E400000  |	   5MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |   data   |  0x4E900000  |	  13MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |  M3 Dump |  0x4F600000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |   QDSS   |  0x4F700000  |	   1MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|	      |			 | | ||||
| 	 * |  Caldb   |  0x4F800000  |	   5MB	   | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |						   | | ||||
| 	 * |	    Rest of the memory for Linux	   | | ||||
| 	 * |						   | | ||||
| 	 * +===================================================+ | ||||
| 	 */ | ||||
|  | ||||
| 		q6_mem_regions: q6_mem_regions@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 0x4D00000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_code_data: q6_code_data@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 01400000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_ipq5018_data: q6_ipq5018_data@4C400000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4C400000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump: m3_dump@4D100000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D100000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_etr_region: q6_etr_dump@4D200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D200000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_caldb_region: q6_caldb_region@4D300000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D300000 0x0 0x200000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data1: q6_qcn6122_data1@4D500000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D500000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E200000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E300000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E400000 0x0 0x500000>; | ||||
| 		}; | ||||
| 	#endif | ||||
| 	}; | ||||
|  | ||||
| 	soc { | ||||
| 		serial@78af000 { | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		qpic_bam: dma@7984000{ | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		nand: qpic-nand@79b0000 { | ||||
| 			pinctrl-0 = <&qspi_nand_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		spi_0: spi@78b5000 { /* BLSP1 QUP0 */ | ||||
| 			pinctrl-0 = <&blsp0_spi_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			cs-select = <0>; | ||||
| 			status = "ok"; | ||||
|  | ||||
| 			m25p80@0 { | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <1>; | ||||
| 				reg = <0>; | ||||
| 				compatible = "n25q128a11"; | ||||
| 				linux,modalias = "m25p80", "n25q128a11"; | ||||
| 				spi-max-frequency = <50000000>; | ||||
| 				use-default-sizes; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		mdio0: mdio@88000 { | ||||
| 			status = "ok"; | ||||
|  | ||||
| 			ethernet-phy@0 { | ||||
| 				reg = <7>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		mdio1: mdio@90000 { | ||||
| 			status = "ok"; | ||||
| 			pinctrl-0 = <&mdio1_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			phy-reset-gpio = <&tlmm 39 0>; | ||||
|  | ||||
| 			ethernet-phy@0 { | ||||
| 				reg = <0>; | ||||
| 			}; | ||||
|  | ||||
| 			ethernet-phy@1 { | ||||
| 				reg = <1>; | ||||
| 			}; | ||||
|  | ||||
| 			ethernet-phy@2 { | ||||
| 				reg = <2>; | ||||
| 			}; | ||||
|  | ||||
| 			ethernet-phy@3 { | ||||
| 				reg = <3>; | ||||
| 			}; | ||||
|  | ||||
| 			ethernet-phy@4 { | ||||
| 				reg = <4>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		ess-instance { | ||||
| 			num_devices = <0x2>; | ||||
| 			ess-switch@0x39c00000 { | ||||
| 				compatible = "qcom,ess-switch-ipq50xx"; | ||||
| 				device_id = <0>; | ||||
| 				switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/ | ||||
| 				cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/ | ||||
| 				qcom,port_phyinfo { | ||||
| 					port@0 { | ||||
| 						port_id = <1>; | ||||
| 						phy_address = <7>; | ||||
| 					}; | ||||
| 					port@1 { | ||||
| 						port_id = <2>; | ||||
| 						forced-speed = <1000>; | ||||
| 						forced-duplex = <1>; | ||||
| 					}; | ||||
| 				}; | ||||
| 				led_source@0 { | ||||
| 					source = <0>; | ||||
| 					mode = "normal"; | ||||
| 					speed = "all"; | ||||
| 					blink_en = "enable"; | ||||
| 					active = "high"; | ||||
| 				}; | ||||
| 			}; | ||||
|  | ||||
| 			ess-switch1@1 { | ||||
| 				compatible = "qcom,ess-switch-qca83xx"; | ||||
| 				device_id = <1>; | ||||
| 				switch_access_mode = "mdio"; | ||||
| 				mdio-bus = <&mdio1>; | ||||
| 				reset_gpio = <&tlmm 0x27 0>; | ||||
| 				switch_cpu_bmp = <0x40>;  /* cpu port bitmap */ | ||||
| 				switch_lan_bmp = <0x3e>; /* lan port bitmap */ | ||||
| 				switch_wan_bmp = <0x0>;  /* wan port bitmap */ | ||||
| 				qca,ar8327-initvals = < | ||||
| 						0x00004 0x7600000   /* PAD0_MODE */ | ||||
| 						0x00008 0x1000000   /* PAD5_MODE */ | ||||
| 						0x0000c 0x80        /* PAD6_MODE */ | ||||
| 						0x00010 0x2613a0    /* PORT6 FORCE MODE*/ | ||||
| 						0x000e4 0xaa545     /* MAC_POWER_SEL */ | ||||
| 						0x000e0 0xc74164de  /* SGMII_CTRL */ | ||||
| 						0x0007c 0x4e        /* PORT0_STATUS */ | ||||
| 						0x00094 0x4e        /* PORT6_STATUS */ | ||||
| 				>; | ||||
| 				qcom,port_phyinfo { | ||||
| 					port@0 { | ||||
| 						port_id = <1>; | ||||
| 						phy_address = <0>; | ||||
| 					}; | ||||
| 					port@1 { | ||||
| 						port_id = <2>; | ||||
| 						phy_address = <1>; | ||||
| 					}; | ||||
| 					port@2 { | ||||
| 						port_id = <3>; | ||||
| 						phy_address = <2>; | ||||
| 					}; | ||||
| 					port@3 { | ||||
| 						port_id = <4>; | ||||
| 						phy_address = <3>; | ||||
| 					}; | ||||
| 					port@4 { | ||||
| 						port_id = <5>; | ||||
| 						phy_address = <4>; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		wifi0: wifi@c000000 { | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		dp1 { | ||||
| 			device_type = "network"; | ||||
| 			compatible = "qcom,nss-dp"; | ||||
| 			clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>; | ||||
| 			clock-names = "nss-snoc-gmac-axi-clk"; | ||||
| 			qcom,id = <1>; | ||||
| 			reg = <0x39C00000 0x10000>; | ||||
| 			interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			qcom,mactype = <2>; | ||||
| 			qcom,link-poll = <1>; | ||||
| 			qcom,phy-mdio-addr = <7>; | ||||
| 			mdio-bus = <&mdio0>; | ||||
| 			local-mac-address = [000000000000]; | ||||
| 			phy-mode = "sgmii"; | ||||
| 			qcom,rx-page-mode = <0>; | ||||
| 		}; | ||||
|  | ||||
| 		dp2 { | ||||
| 			device_type = "network"; | ||||
| 			compatible = "qcom,nss-dp"; | ||||
| 			clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>; | ||||
| 			clock-names = "nss-snoc-gmac-axi-clk"; | ||||
| 			qcom,id = <2>; | ||||
| 			reg = <0x39D00000 0x10000>; | ||||
| 			interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			qcom,mactype = <2>; | ||||
| 			local-mac-address = [000000000000]; | ||||
| 			phy-mode = "sgmii"; | ||||
| 			qcom,rx-page-mode = <0>; | ||||
| 		}; | ||||
|  | ||||
| 		leds { | ||||
| 			compatible = "gpio-leds"; | ||||
| 			pinctrl-0 = <&leds_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
|  | ||||
| 				led@28 { | ||||
| 					label = "led_blue"; | ||||
| 					gpios = <&tlmm 28 GPIO_ACTIVE_HIGH>; | ||||
| 					default-state = "off"; | ||||
| 				}; | ||||
|  | ||||
| 				led@38 { | ||||
| 					label = "led_red"; | ||||
| 					gpios = <&tlmm 38 GPIO_ACTIVE_HIGH>; | ||||
| 					default-state = "off"; | ||||
| 				}; | ||||
|  | ||||
| 				led@46 { | ||||
| 					label = "led_green"; | ||||
| 					gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>; | ||||
| 					default-state = "off"; | ||||
| 				}; | ||||
| 		}; | ||||
|  | ||||
|  | ||||
| 		nss-macsec1 { | ||||
| 			compatible = "qcom,nss-macsec"; | ||||
| 			phy_addr = <0x1c>; | ||||
| 			mdiobus = <&mdio1>; | ||||
| 		}; | ||||
|  | ||||
| 		lpass: lpass@0xA000000{ | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
|  | ||||
| 		pcm_lb: pcm_lb@0 { | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 		gpio_keys { | ||||
| 			compatible = "gpio-keys"; | ||||
| 			pinctrl-0 = <&button_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			button@1 { | ||||
| 				label = "reset"; | ||||
| 				linux,code = <KEY_RESTART>; | ||||
| 				gpios = <&tlmm 27 GPIO_ACTIVE_LOW>; | ||||
| 				linux,input-type = <1>; | ||||
| 				debounce-interval = <60>; | ||||
| 			}; | ||||
| 		};		 | ||||
| 	}; | ||||
|  | ||||
| 	qcom,test@0 { | ||||
| 		status = "ok"; | ||||
| 	}; | ||||
|  | ||||
| 	thermal-zones { | ||||
| 		status = "ok"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &tlmm { | ||||
| 	pinctrl-0 = <&blsp0_uart_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
|  | ||||
| 	blsp0_uart_pins: uart_pins { | ||||
| 		blsp0_uart_rx_tx { | ||||
| 			pins = "gpio20", "gpio21"; | ||||
| 			function = "blsp0_uart0"; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	blsp0_spi_pins: blsp0_spi_pins { | ||||
| 		mux { | ||||
| 			pins = "gpio10", "gpio11", "gpio12", "gpio13"; | ||||
| 			function = "blsp0_spi"; | ||||
| 			drive-strength = <2>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	qspi_nand_pins: qspi_nand_pins { | ||||
| 		qspi_clock { | ||||
| 			pins = "gpio9"; | ||||
| 			function = "qspi_clk"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
|  | ||||
| 		qspi_cs { | ||||
| 			pins = "gpio8"; | ||||
| 			function = "qspi_cs"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
|  | ||||
| 		qspi_data { | ||||
| 			pins = "gpio4", "gpio5", "gpio6", "gpio7"; | ||||
| 			function = "qspi_data"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	mdio1_pins: mdio_pinmux { | ||||
| 		mux_0 { | ||||
| 			pins = "gpio36"; | ||||
| 			function = "mdc"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-up; | ||||
| 		}; | ||||
|  | ||||
| 		mux_1 { | ||||
| 			pins = "gpio37"; | ||||
| 			function = "mdio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-up; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	i2c_pins: i2c_pins { | ||||
| 		i2c_scl { | ||||
| 			pins = "gpio25"; | ||||
| 			function = "blsp2_i2c1"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
|  | ||||
| 		i2c_sda { | ||||
| 			pins = "gpio26"; | ||||
| 			function = "blsp2_i2c1"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	button_pins: button_pins { | ||||
| 		reset_button { | ||||
| 			pins = "gpio27"; | ||||
| 			function = "gpio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-up; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	leds_pins: leds_pins { | ||||
| 		led_blue { | ||||
| 			pins = "gpio28"; | ||||
| 			function = "gpio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-down; | ||||
| 		}; | ||||
|  | ||||
| 		led_red { /* POWER_LED */ | ||||
| 			pins = "gpio38"; | ||||
| 			function = "gpio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-down; | ||||
| 		}; | ||||
|  | ||||
| 		led_green { /* 2G_LED */ | ||||
| 			pins = "gpio46"; | ||||
| 			function = "gpio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-down; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &soc { | ||||
|  | ||||
|  | ||||
| }; | ||||
|  | ||||
| &q6v5_wcss { | ||||
| 	compatible = "qcom,ipq5018-q6-mpd"; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 	ranges; | ||||
| 	firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 	reg = <0x0cd00000 0x4040>, | ||||
| 		<0x1938000 0x8>, | ||||
| 		<0x193d204 0x4>; | ||||
| 	reg-names = "qdsp6", | ||||
| 			"tcsr-msip", | ||||
| 			"tcsr-q6"; | ||||
| 	resets = <&gcc GCC_WCSSAON_RESET>, | ||||
| 			<&gcc GCC_WCSS_Q6_BCR>; | ||||
|  | ||||
| 	reset-names = "wcss_aon_reset", | ||||
| 			"wcss_q6_reset"; | ||||
|  | ||||
| 	clocks = <&gcc GCC_Q6_AXIS_CLK>, | ||||
| 		<&gcc GCC_WCSS_ECAHB_CLK>, | ||||
| 		<&gcc GCC_Q6_AXIM_CLK>, | ||||
| 		<&gcc GCC_Q6_AXIM2_CLK>, | ||||
| 		<&gcc GCC_Q6_AHB_CLK>, | ||||
| 		<&gcc GCC_Q6_AHB_S_CLK>, | ||||
| 		<&gcc GCC_WCSS_AXI_S_CLK>; | ||||
| 	clock-names = "gcc_q6_axis_clk", | ||||
| 		"gcc_wcss_ecahb_clk", | ||||
| 		"gcc_q6_axim_clk", | ||||
| 		"gcc_q6_axim2_clk", | ||||
| 		"gcc_q6_ahb_clk", | ||||
| 		"gcc_q6_ahb_s_clk", | ||||
| 		"gcc_wcss_axi_s_clk"; | ||||
|  | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_mem_regions>, <&q6_etr_region>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_mem_regions>, <&q6_etr_region>, | ||||
| 				<&q6_caldb_region>; | ||||
| 	#endif | ||||
|  | ||||
| 	qcom,rproc = <&q6v5_wcss>; | ||||
| 	qcom,bootargs_smem = <507>; | ||||
| 	boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>, | ||||
| 			<0x2 0x4 0x2 0x12 0x0 0x0>; | ||||
| 	status = "ok"; | ||||
|  | ||||
| 	q6_wcss_pd1: remoteproc_pd1@4ab000 { | ||||
| 		compatible = "qcom,ipq5018-wcss-ahb-mpd"; | ||||
| 		reg = <0x4ab000 0x20>; | ||||
| 		reg-names = "rmb"; | ||||
| 		firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 		m3_firmware = "IPQ5018/m3_fw.mdt"; | ||||
| 		interrupts-extended = <&wcss_smp2p_in 8 0>, | ||||
| 			<&wcss_smp2p_in 9 0>, | ||||
| 			<&wcss_smp2p_in 12 0>, | ||||
| 			<&wcss_smp2p_in 11 0>; | ||||
| 		interrupt-names = "fatal", | ||||
| 			"ready", | ||||
| 			"spawn-ack", | ||||
| 			"stop-ack"; | ||||
|  | ||||
| 		resets = <&gcc GCC_WCSSAON_RESET>, | ||||
| 				<&gcc GCC_WCSS_BCR>, | ||||
| 				<&gcc GCC_CE_BCR>; | ||||
| 		reset-names = "wcss_aon_reset", | ||||
| 				"wcss_reset", | ||||
| 				"ce_reset"; | ||||
|  | ||||
| 		clocks = <&gcc GCC_WCSS_AHB_S_CLK>, | ||||
| 				<&gcc GCC_WCSS_ACMT_CLK>, | ||||
| 				<&gcc GCC_WCSS_AXI_M_CLK>; | ||||
| 		clock-names = "gcc_wcss_ahb_s_clk", | ||||
| 			"gcc_wcss_acmt_clk", | ||||
| 			"gcc_wcss_axi_m_clk"; | ||||
|  | ||||
| 		qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>; | ||||
|  | ||||
| 		qcom,smem-states = <&wcss_smp2p_out 8>, | ||||
| 			<&wcss_smp2p_out 9>, | ||||
| 			<&wcss_smp2p_out 10>; | ||||
| 		qcom,smem-state-names = "shutdown", | ||||
| 			"stop", | ||||
| 			"spawn"; | ||||
|  | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_ipq5018_data>, <&m3_dump>, | ||||
| 				<&q6_etr_region>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_ipq5018_data>, <&m3_dump>, | ||||
| 				<&q6_etr_region>, <&q6_caldb_region>; | ||||
| 	#endif | ||||
| 	}; | ||||
|  | ||||
| 	q6_wcss_pd2: remoteproc_pd2 { | ||||
| 		compatible = "qcom,ipq5018-wcss-pcie-mpd"; | ||||
| 		firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 		m3_firmware = "qcn6122/m3_fw.mdt"; | ||||
| 		interrupts-extended = <&wcss_smp2p_in 16 0>, | ||||
| 			<&wcss_smp2p_in 17 0>, | ||||
| 			<&wcss_smp2p_in 20 0>, | ||||
| 			<&wcss_smp2p_in 19 0>; | ||||
| 		interrupt-names = "fatal", | ||||
| 			"ready", | ||||
| 			"spawn-ack", | ||||
| 			"stop-ack"; | ||||
| 		qcom,smem-states = <&wcss_smp2p_out 16>, | ||||
| 			<&wcss_smp2p_out 17>, | ||||
| 			<&wcss_smp2p_out 18>; | ||||
| 		qcom,smem-state-names = "shutdown", | ||||
| 			"stop", | ||||
| 			"spawn"; | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, | ||||
| 				<&q6_qcn6122_etr_1>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, | ||||
| 				<&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>; | ||||
| 	#endif | ||||
|  | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &i2c_0 { | ||||
| 	pinctrl-0 = <&i2c_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
| }; | ||||
|  | ||||
| &wifi0 { | ||||
| 	/* IPQ5018 */ | ||||
| 	qcom,multipd_arch; | ||||
| 	qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; | ||||
| 	qcom,rproc = <&q6_wcss_pd1>; | ||||
| #ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	qcom,tgt-mem-mode = <2>; | ||||
| #else | ||||
| 	qcom,tgt-mem-mode = <1>; | ||||
| #endif | ||||
| 	qcom,board_id = <0x23>; | ||||
| #ifdef __CNSS2__ | ||||
| 	qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0>; | ||||
| 	qcom,caldb-addr = <0x4D300000 0x4D300000 0 0 0>; | ||||
| 	qcom,caldb-size = <0x200000>; | ||||
| 	mem-region = <&q6_ipq5018_data>; | ||||
| #else | ||||
| 	memory-region = <&q6_ipq5018_data>; | ||||
| #endif | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &wifi1 { | ||||
| 	/* QCN6122 5G */ | ||||
| 	qcom,multipd_arch; | ||||
| 	qcom,userpd-subsys-name = "q6v5_wcss_userpd2"; | ||||
| 	qcom,rproc = <&q6_wcss_pd2>; | ||||
| #ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	qcom,tgt-mem-mode = <2>; | ||||
| #else | ||||
| 	qcom,tgt-mem-mode = <1>; | ||||
| #endif | ||||
| 	qcom,board_id = <0x50>; | ||||
| #ifdef __CNSS2__ | ||||
| 	qcom,bdf-addr = <0x4D500000 0x4D500000 0x4D300000 0x0 0x0>; | ||||
| 	qcom,caldb-addr = <0x4E400000 0x4E400000 0 0 0>; | ||||
| 	qcom,caldb-size = <0x500000>; | ||||
| 	mem-region = <&q6_qcn6122_data1>; | ||||
| #else | ||||
| 	memory-region = <&q6_qcn6122_data1>; | ||||
| #endif | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &dwc_0 { | ||||
| 	/delete-property/ #phy-cells; | ||||
| 	/delete-property/ phys; | ||||
| 	/delete-property/ phy-names; | ||||
| }; | ||||
|  | ||||
| &hs_m31phy_0 { | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &eud { | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &pcie_x1 { | ||||
| 	perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>; | ||||
| }; | ||||
| &pcie_x2 { | ||||
| 	perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>; | ||||
| 	status = "disabled";	 | ||||
| }; | ||||
|  | ||||
| &pcie_x1_rp { | ||||
| 	status = "disabled"; | ||||
|  | ||||
| 	mhi_0: qcom,mhi@0 { | ||||
| 		reg = <0 0 0 0 0 >; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &pcie_x2_rp { | ||||
| 	status = "disabled"; | ||||
|  | ||||
| 	mhi_1: qcom,mhi@1 { | ||||
| 		reg = <0 0 0 0 0 >; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &qfprom { | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &tsens { | ||||
| 	status = "ok"; | ||||
| }; | ||||
| @@ -0,0 +1,893 @@ | ||||
| /dts-v1/; | ||||
| /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
|  * copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| #include "ipq5018.dtsi" | ||||
| #include <dt-bindings/input/input.h> | ||||
|  | ||||
| / { | ||||
| 	#address-cells = <0x2>; | ||||
| 	#size-cells = <0x2>; | ||||
| 	model = "Sonicfi RAP630E"; | ||||
| 	compatible = "sonicfi,rap630e", "qcom,ipq5018-mp03.5", "qcom,ipq5018"; | ||||
| 	interrupt-parent = <&intc>; | ||||
|  | ||||
| 	aliases { | ||||
| 		sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ | ||||
| 		serial0 = &blsp1_uart1; | ||||
| 		serial1 = &blsp1_uart2; | ||||
| 		ethernet0 = "/soc/dp1"; | ||||
| 		ethernet1 = "/soc/dp2"; | ||||
|  | ||||
| 		led-boot = &led_power; | ||||
| 		led-failsafe = &led_power; | ||||
| 		led-running = &led_power; | ||||
| 		led-upgrade = &led_power; | ||||
| 	}; | ||||
|  | ||||
| 	chosen { | ||||
| 		bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; | ||||
| 		bootargs-append = " swiotlb=1 coherent_pool=2M"; | ||||
| 		stdout-path = "serial0"; | ||||
| 	}; | ||||
|  | ||||
| 	reserved-memory { | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	/*                   256 MB Profile | ||||
| 	 * +==========+==============+=========================+ | ||||
| 	 * |          |              |                         | | ||||
| 	 * |  Region  | Start Offset |          Size           | | ||||
| 	 * |          |              |                         | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    NSS   |  0x40000000  |           8MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   Linux  |  0x40800000  | Depends on total memory | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   uboot  |  0x4A600000  |           4MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    SBL   |  0x4AA00000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   smem   |  0x4AB00000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    TZ    |  0x4AC00000  |           4MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    Q6    |              |                         | | ||||
| 	 * |   code/  |  0x4B000000  |          20MB           | | ||||
| 	 * |   data   |              |                         | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |   data   |  0x4C400000  |          13MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |  M3 Dump |  0x4D100000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |   QDSS   |  0x4D200000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |   data   |  0x4D300000  |          13MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |  M3 Dump |  0x4E000000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |   QDSS   |  0x4E100000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |   data   |  0x4E200000  |          13MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |  M3 Dump |  0x4EF00000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |   QDSS   |  0x4F000000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |                                                   | | ||||
| 	 * |            Rest of the memory for Linux           | | ||||
| 	 * |                                                   | | ||||
| 	 * +===================================================+ | ||||
| 	 */ | ||||
| 		q6_mem_regions: q6_mem_regions@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 0x4100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_code_data: q6_code_data@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 0x1400000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_ipq5018_data: q6_ipq5018_data@4C400000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4C400000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump: m3_dump@4D100000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D100000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_etr_region: q6_etr_dump@4D200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D200000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data1: q6_qcn6122_data1@4D300000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D300000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E000000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E100000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E100000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data2: q6_qcn6122_data2@4E200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E200000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_2: m3_dump_qcn6122_2@4EF00000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4EF00000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4F000000 0x0 0x100000>; | ||||
| 		}; | ||||
| 	#else | ||||
| 	/*                 512MB/1GB Profiles | ||||
| 	 * +==========+==============+=========================+ | ||||
| 	 * |          |              |                         | | ||||
| 	 * |  Region  | Start Offset |          Size           | | ||||
| 	 * |          |              |                         | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    NSS   |  0x40000000  |          16MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   Linux  |  0x41000000  | Depends on total memory | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   uboot  |  0x4A600000  |           4MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    SBL   |  0x4AA00000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |   smem   |  0x4AB00000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    TZ    |  0x4AC00000  |           4MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |    Q6    |              |                         | | ||||
| 	 * |   code/  |  0x4B000000  |          20MB           | | ||||
| 	 * |   data   |              |                         | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |   data   |  0x4C400000  |          13MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |  M3 Dump |  0x4D100000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |   QDSS   |  0x4D200000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |  IPQ5018 |              |                         | | ||||
| 	 * |  Caldb   |  0x4D300000  |           2MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |   data   |  0x4D500000  |          13MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |  M3 Dump |  0x4E200000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |   QDSS   |  0x4E300000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_1|              |                         | | ||||
| 	 * |  Caldb   |  0x4E400000  |           5MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |   data   |  0x4E900000  |          13MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |  M3 Dump |  0x4F600000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |   QDSS   |  0x4F700000  |           1MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * | QCN6122_2|              |                         | | ||||
| 	 * |  Caldb   |  0x4F800000  |           5MB           | | ||||
| 	 * +----------+--------------+-------------------------+ | ||||
| 	 * |                                                   | | ||||
| 	 * |            Rest of the memory for Linux           | | ||||
| 	 * |                                                   | | ||||
| 	 * +===================================================+ | ||||
| 	 */ | ||||
| 		q6_mem_regions: q6_mem_regions@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 0x4D00000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_code_data: q6_code_data@4B000000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4B000000 0x0 01400000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_ipq5018_data: q6_ipq5018_data@4C400000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4C400000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump: m3_dump@4D100000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D100000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_etr_region: q6_etr_dump@4D200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D200000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_caldb_region: q6_caldb_region@4D300000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D300000 0x0 0x200000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data1: q6_qcn6122_data1@4D500000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4D500000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E200000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E300000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E400000 0x0 0x500000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_data2: q6_qcn6122_data2@4E900000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4E900000 0x0 0xD00000>; | ||||
| 		}; | ||||
|  | ||||
| 		m3_dump_qcn6122_2: m3_dump_qcn6122_2@4F600000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4F600000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F700000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4F700000 0x0 0x100000>; | ||||
| 		}; | ||||
|  | ||||
| 		q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4F800000 { | ||||
| 			no-map; | ||||
| 			reg = <0x0 0x4F800000 0x0 0x500000>; | ||||
| 		}; | ||||
| 		ramoops: ramoops@50400000 { | ||||
| 			compatible = "ramoops"; | ||||
| 			reg = <0x0 0x50400000 0x0 0x80000>; // 512KB | ||||
| 			record-size = <0x20000>; | ||||
| 			console-size = <0x20000>; | ||||
| 			pmsg-size = <0x20000>; | ||||
| 			no-map; | ||||
| 		}; | ||||
|  | ||||
| 	#endif | ||||
| 	}; | ||||
|  | ||||
| 	soc { | ||||
| 		serial@78af000 { | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		blsp1_uart2: serial@78b0000 { | ||||
| 			pinctrl-0 = <&blsp1_uart_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 		}; | ||||
|  | ||||
| 		qpic_bam: dma@7984000{ | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		nand: qpic-nand@79b0000 { | ||||
| 			pinctrl-0 = <&qspi_nand_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		spi_0: spi@78b5000 { /* BLSP1 QUP0 */ | ||||
| 			pinctrl-0 = <&blsp0_spi_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			cs-select = <0>; | ||||
| 			status = "ok"; | ||||
|  | ||||
| 			m25p80@0 { | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <1>; | ||||
| 				reg = <0>; | ||||
| 				compatible = "n25q128a11"; | ||||
| 				linux,modalias = "m25p80", "n25q128a11"; | ||||
| 				spi-max-frequency = <50000000>; | ||||
| 				use-default-sizes; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		mdio0: mdio@88000 { | ||||
| 			status = "ok"; | ||||
|  | ||||
| 			ethernet-phy@0 { | ||||
| 				reg = <7>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		mdio1: mdio@90000 { | ||||
| 			status = "ok"; | ||||
| 			pinctrl-0 = <&mdio1_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			phy-reset-gpio = <&tlmm 39 0>; | ||||
|  | ||||
| 			ethernet-phy@0 { | ||||
| 				reg = <28>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		ess-instance { | ||||
| 			num_devices = <0x1>; | ||||
| 			ess-switch@0x39c00000 { | ||||
| 				switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/ | ||||
| 				cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/ | ||||
| 				qcom,port_phyinfo { | ||||
| 					port@0 { | ||||
| 						port_id = <1>; | ||||
| 						phy_address = <7>; | ||||
| 						mdiobus = <&mdio0>; | ||||
| 					}; | ||||
| 					port@1 { | ||||
| 						port_id = <2>; | ||||
| 						phy_address = <0x1c>; | ||||
| 						mdiobus = <&mdio1>; | ||||
| 						port_mac_sel = "QGMAC_PORT"; | ||||
| 					}; | ||||
| 				}; | ||||
| 				led_source@0 { | ||||
| 					source = <0>; | ||||
| 					mode = "normal"; | ||||
| 					speed = "all"; | ||||
| 					blink_en = "enable"; | ||||
| 					active = "high"; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		dp1 { | ||||
| 			device_type = "network"; | ||||
| 			compatible = "qcom,nss-dp"; | ||||
| 			clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>; | ||||
| 			clock-names = "nss-snoc-gmac-axi-clk"; | ||||
| 			qcom,id = <1>; | ||||
| 			reg = <0x39C00000 0x10000>; | ||||
| 			interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			qcom,mactype = <2>; | ||||
| 			qcom,link-poll = <1>; | ||||
| 			qcom,phy-mdio-addr = <7>; | ||||
| 			mdio-bus = <&mdio0>; | ||||
| 			local-mac-address = [000000000000]; | ||||
| 			phy-mode = "sgmii"; | ||||
| 			qcom,rx-page-mode = <0>; | ||||
| 		}; | ||||
|  | ||||
| 		dp2 { | ||||
| 			device_type = "network"; | ||||
| 			compatible = "qcom,nss-dp"; | ||||
| 			clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>; | ||||
| 			clock-names = "nss-snoc-gmac-axi-clk"; | ||||
| 			qcom,id = <2>; | ||||
| 			reg = <0x39D00000 0x10000>; | ||||
| 			interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 			qcom,mactype = <2>; | ||||
| 			qcom,link-poll = <1>; | ||||
| 			qcom,phy-mdio-addr = <28>; | ||||
| 			mdio-bus = <&mdio1>; | ||||
| 			local-mac-address = [000000000000]; | ||||
| 			phy-mode = "sgmii"; | ||||
| 			qcom,rx-page-mode = <0>; | ||||
| 		}; | ||||
|  | ||||
| 		nss-macsec1 { | ||||
| 			compatible = "qcom,nss-macsec"; | ||||
| 			phy_addr = <0x1c>; | ||||
| 			mdiobus = <&mdio1>; | ||||
| 		}; | ||||
|  | ||||
| 		pcm: pcm@0xA3C0000{ | ||||
| 			pinctrl-0 = <&audio_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 		}; | ||||
|  | ||||
| 	}; | ||||
|  | ||||
| 	qcom,test@0 { | ||||
| 		status = "ok"; | ||||
| 	}; | ||||
|  | ||||
| 	thermal-zones { | ||||
| 		status = "ok"; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &tlmm { | ||||
| 	pinctrl-0 = <&blsp0_uart_pins &phy_led_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
|  | ||||
| 	blsp0_uart_pins: uart_pins { | ||||
| 		blsp0_uart_rx_tx { | ||||
| 			pins = "gpio20", "gpio21"; | ||||
| 			function = "blsp0_uart0"; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	blsp1_uart_pins: blsp1_uart_pins { | ||||
| 		blsp1_uart_rx_tx { | ||||
| 			pins = "gpio22", "gpio24", "gpio23", "gpio25"; | ||||
| 			function = "blsp1_uart2"; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	blsp0_spi_pins: blsp0_spi_pins { | ||||
| 		mux { | ||||
| 			pins = "gpio10", "gpio11", "gpio12", "gpio13"; | ||||
| 			function = "blsp0_spi"; | ||||
| 			drive-strength = <2>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	qspi_nand_pins: qspi_nand_pins { | ||||
| 		qspi_clock { | ||||
| 			pins = "gpio9"; | ||||
| 			function = "qspi_clk"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
|  | ||||
| 		qspi_cs { | ||||
| 			pins = "gpio8"; | ||||
| 			function = "qspi_cs"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
|  | ||||
| 		qspi_data { | ||||
| 			pins = "gpio4", "gpio5", "gpio6", "gpio7"; | ||||
| 			function = "qspi_data"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	mdio1_pins: mdio_pinmux { | ||||
| 		mux_0 { | ||||
| 			pins = "gpio36"; | ||||
| 			function = "mdc"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-up; | ||||
| 		}; | ||||
|  | ||||
| 		mux_1 { | ||||
| 			pins = "gpio37"; | ||||
| 			function = "mdio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-up; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	phy_led_pins: phy_led_pins { | ||||
| 		gephy_led_pin { | ||||
| 			pins = "gpio46"; | ||||
| 			function = "led0"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-down; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	i2c_pins: i2c_pins { | ||||
| 		i2c_scl { | ||||
| 			pins = "gpio25"; | ||||
| 			function = "blsp2_i2c1"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
|  | ||||
| 		i2c_sda { | ||||
| 			pins = "gpio26"; | ||||
| 			function = "blsp2_i2c1"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-disable; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	button_pins: button_pins { | ||||
| 		reset_button { | ||||
| 			pins = "gpio38"; | ||||
| 			function = "gpio"; | ||||
| 			drive-strength = <8>; | ||||
| 			bias-pull-up; | ||||
| 		}; | ||||
| 	}; | ||||
|  | ||||
| 	audio_pins: audio_pinmux { | ||||
| 	}; | ||||
|  | ||||
| 	leds_pins: leds_pins { | ||||
| 			led_5g { | ||||
| 					pins = "gpio34"; | ||||
| 					function = "gpio"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-down; | ||||
| 					}; | ||||
| 			led_2g { | ||||
| 					pins = "gpio33"; | ||||
| 					function = "gpio"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-down; | ||||
| 					}; | ||||
| 			led_sys { | ||||
| 					pins = "gpio26"; | ||||
| 					function = "gpio"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-down; | ||||
| 					}; | ||||
| 			led_onekey { | ||||
| 					pins = "gpio28"; | ||||
| 					function = "gpio"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-down; | ||||
| 			}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &soc { | ||||
| 	gpio_keys { | ||||
| 		compatible = "gpio-keys"; | ||||
| 		pinctrl-0 = <&button_pins>; | ||||
| 		pinctrl-names = "default"; | ||||
|  | ||||
| 		button@1 { | ||||
| 			label = "reset"; | ||||
| 			linux,code = <KEY_RESTART>; | ||||
| 			gpios = <&tlmm 38 GPIO_ACTIVE_LOW>; | ||||
| 			linux,input-type = <1>; | ||||
| 			debounce-interval = <60>; | ||||
| 		}; | ||||
| 	}; | ||||
| 	leds { | ||||
| 			compatible = "gpio-leds"; | ||||
| 			pinctrl-0 = <&leds_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
|  | ||||
| 			led34 { | ||||
| 				label = "green:wifi5"; | ||||
| 				gpios = <&tlmm 34 GPIO_ACTIVE_LOW>; | ||||
| 				linux,default-trigger = "default-on"; | ||||
| 				default-state = "on"; | ||||
| 			}; | ||||
| 			led33 { | ||||
| 				label = "green:wifi2"; | ||||
| 				gpios = <&tlmm 33 GPIO_ACTIVE_LOW>; | ||||
| 				linux,default-trigger = "default-on"; | ||||
| 				default-state = "on"; | ||||
| 			}; | ||||
| 			led_power: led26 { | ||||
| 				label = "green:power"; | ||||
| 				gpios = <&tlmm 26 GPIO_ACTIVE_LOW>; | ||||
| 				linux,default-trigger = "default-on"; | ||||
| 				default-state = "on"; | ||||
| 			}; | ||||
| 			led@28 { | ||||
| 				label = "led_onekey"; | ||||
| 				gpios = <&tlmm 28 GPIO_ACTIVE_LOW>; | ||||
| 				linux,default-trigger = "led_onekey"; | ||||
| 				default-state = "off"; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		gpio-watchdog { | ||||
| 			compatible = "linux,wdt-gpio"; | ||||
|             gpios = <&tlmm 27 GPIO_ACTIVE_HIGH>; | ||||
| 			hw_algo = "toggle"; | ||||
| 			hw_margin_ms = <5000>; | ||||
| 			start-at-boot; | ||||
| 			always-running; | ||||
| 			status = "okay"; | ||||
| 		}; | ||||
| }; | ||||
|  | ||||
| &q6v5_wcss { | ||||
| 	compatible = "qcom,ipq5018-q6-mpd"; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 	ranges; | ||||
| 	firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 	reg = <0x0cd00000 0x4040>, | ||||
| 		<0x1938000 0x8>, | ||||
| 		<0x193d204 0x4>; | ||||
| 	reg-names = "qdsp6", | ||||
| 			"tcsr-msip", | ||||
| 			"tcsr-q6"; | ||||
| 	resets = <&gcc GCC_WCSSAON_RESET>, | ||||
| 			<&gcc GCC_WCSS_Q6_BCR>; | ||||
|  | ||||
| 	reset-names = "wcss_aon_reset", | ||||
| 			"wcss_q6_reset"; | ||||
|  | ||||
| 	clocks = <&gcc GCC_Q6_AXIS_CLK>, | ||||
| 		<&gcc GCC_WCSS_ECAHB_CLK>, | ||||
| 		<&gcc GCC_Q6_AXIM_CLK>, | ||||
| 		<&gcc GCC_Q6_AXIM2_CLK>, | ||||
| 		<&gcc GCC_Q6_AHB_CLK>, | ||||
| 		<&gcc GCC_Q6_AHB_S_CLK>, | ||||
| 		<&gcc GCC_WCSS_AXI_S_CLK>; | ||||
| 	clock-names = "gcc_q6_axis_clk", | ||||
| 		"gcc_wcss_ecahb_clk", | ||||
| 		"gcc_q6_axim_clk", | ||||
| 		"gcc_q6_axim2_clk", | ||||
| 		"gcc_q6_ahb_clk", | ||||
| 		"gcc_q6_ahb_s_clk", | ||||
| 		"gcc_wcss_axi_s_clk"; | ||||
|  | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_mem_regions>, <&q6_etr_region>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_mem_regions>, <&q6_etr_region>, | ||||
| 				<&q6_caldb_region>; | ||||
| 	#endif | ||||
|  | ||||
| 	qcom,rproc = <&q6v5_wcss>; | ||||
| 	qcom,bootargs_smem = <507>; | ||||
| 	boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>, | ||||
| 			<0x2 0x4 0x2 0x12 0x0 0x0>; | ||||
| 	status = "ok"; | ||||
| 	q6_wcss_pd1: remoteproc_pd1@4ab000 { | ||||
| 		compatible = "qcom,ipq5018-wcss-ahb-mpd"; | ||||
| 		reg = <0x4ab000 0x20>; | ||||
| 		reg-names = "rmb"; | ||||
| 		firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 		m3_firmware = "IPQ5018/m3_fw.mdt"; | ||||
| 		interrupts-extended = <&wcss_smp2p_in 8 0>, | ||||
| 					<&wcss_smp2p_in 9 0>, | ||||
| 					<&wcss_smp2p_in 12 0>, | ||||
| 					<&wcss_smp2p_in 11 0>; | ||||
| 		interrupt-names = "fatal", | ||||
| 					"ready", | ||||
| 					"spawn-ack", | ||||
| 					"stop-ack"; | ||||
|  | ||||
| 		resets = <&gcc GCC_WCSSAON_RESET>, | ||||
| 				<&gcc GCC_WCSS_BCR>, | ||||
| 				<&gcc GCC_CE_BCR>; | ||||
| 		reset-names = "wcss_aon_reset", | ||||
| 				"wcss_reset", | ||||
| 				"ce_reset"; | ||||
|  | ||||
| 		clocks = <&gcc GCC_WCSS_AHB_S_CLK>, | ||||
| 				<&gcc GCC_WCSS_ACMT_CLK>, | ||||
| 				<&gcc GCC_WCSS_AXI_M_CLK>; | ||||
| 		clock-names = "gcc_wcss_ahb_s_clk", | ||||
| 					"gcc_wcss_acmt_clk", | ||||
| 					"gcc_wcss_axi_m_clk"; | ||||
|  | ||||
| 		qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>; | ||||
|  | ||||
| 		qcom,smem-states = <&wcss_smp2p_out 8>, | ||||
| 					<&wcss_smp2p_out 9>, | ||||
| 					<&wcss_smp2p_out 10>; | ||||
| 		qcom,smem-state-names = "shutdown", | ||||
| 					"stop", | ||||
| 					"spawn"; | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_ipq5018_data>, <&m3_dump>, | ||||
| 				<&q6_etr_region>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_ipq5018_data>, <&m3_dump>, | ||||
| 				<&q6_etr_region>, <&q6_caldb_region>; | ||||
| 	#endif | ||||
|  | ||||
| 	}; | ||||
|  | ||||
| 	q6_wcss_pd2: remoteproc_pd2 { | ||||
| 		compatible = "qcom,ipq5018-wcss-pcie-mpd"; | ||||
| 		firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 		m3_firmware = "qcn6122/m3_fw.mdt"; | ||||
| 		interrupts-extended = <&wcss_smp2p_in 16 0>, | ||||
| 					<&wcss_smp2p_in 17 0>, | ||||
| 					<&wcss_smp2p_in 20 0>, | ||||
| 					<&wcss_smp2p_in 19 0>; | ||||
| 		interrupt-names = "fatal", | ||||
| 					"ready", | ||||
| 					"spawn-ack", | ||||
| 					"stop-ack"; | ||||
|  | ||||
| 		qcom,smem-states = <&wcss_smp2p_out 16>, | ||||
| 					<&wcss_smp2p_out 17>, | ||||
| 					<&wcss_smp2p_out 18>; | ||||
| 		qcom,smem-state-names = "shutdown", | ||||
| 					"stop", | ||||
| 					"spawn"; | ||||
| 	#ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, | ||||
| 				<&q6_qcn6122_etr_1>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, | ||||
| 				<&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>; | ||||
| 	#endif | ||||
|  | ||||
| 	}; | ||||
|  | ||||
| 	q6_wcss_pd3: remoteproc_pd3 { | ||||
| 		compatible = "qcom,ipq5018-wcss-pcie-mpd"; | ||||
| 		firmware = "IPQ5018/q6_fw.mdt"; | ||||
| 		interrupts-extended = <&wcss_smp2p_in 24 0>, | ||||
| 					<&wcss_smp2p_in 25 0>, | ||||
| 					<&wcss_smp2p_in 28 0>, | ||||
| 					<&wcss_smp2p_in 27 0>; | ||||
| 		interrupt-names = "fatal", | ||||
| 					"ready", | ||||
| 					"spawn-ack", | ||||
| 					"stop-ack"; | ||||
|  | ||||
| 		qcom,smem-states = <&wcss_smp2p_out 24>, | ||||
| 					<&wcss_smp2p_out 25>, | ||||
| 					<&wcss_smp2p_out 26>; | ||||
| 		qcom,smem-state-names = "shutdown", | ||||
| 					"stop", | ||||
| 					"spawn"; | ||||
| 	#ifdef	__IPQ_MEM_PROFILE_256_MB__ | ||||
| 		memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>, | ||||
| 				<&q6_qcn6122_etr_2>; | ||||
| 	#else | ||||
| 		memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>, | ||||
| 				<&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>; | ||||
| 	#endif | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &i2c_0 { | ||||
| 	pinctrl-0 = <&i2c_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
| }; | ||||
|  | ||||
| &wifi0 { | ||||
| 	/* IPQ5018 */ | ||||
| 	qcom,multipd_arch; | ||||
| 	qcom,rproc = <&q6_wcss_pd1>; | ||||
| 	qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; | ||||
| #ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	qcom,tgt-mem-mode = <2>; | ||||
| #else | ||||
| 	qcom,tgt-mem-mode = <1>; | ||||
| #endif | ||||
| 	qcom,board_id = <0x24>; | ||||
| #ifdef __CNSS2__ | ||||
| 	qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0>; | ||||
| 	qcom,caldb-addr = <0x4D300000 0x4D300000 0 0 0>; | ||||
| 	qcom,caldb-size = <0x200000>; | ||||
| 	mem-region = <&q6_ipq5018_data>; | ||||
| #else | ||||
| 	memory-region = <&q6_ipq5018_data>; | ||||
| #endif | ||||
| 	nss-radio-priority = <0>; | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &wifi1 { | ||||
| 	/* QCN6122 5G */ | ||||
| 	qcom,multipd_arch; | ||||
| 	qcom,userpd-subsys-name = "q6v5_wcss_userpd3"; | ||||
| 	qcom,rproc = <&q6_wcss_pd3>; | ||||
| #ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	qcom,tgt-mem-mode = <2>; | ||||
| #else | ||||
| 	qcom,tgt-mem-mode = <1>; | ||||
| #endif | ||||
| 	qcom,board_id = <0x60>; | ||||
| #ifdef __CNSS2__ | ||||
| 	qcom,bdf-addr = <0x4E900000 0x4E900000 0x4E200000 0x0 0x0>; | ||||
| 	qcom,caldb-addr = <0x4F800000 0x4F800000 0 0 0>; | ||||
| 	qcom,caldb-size = <0x500000>; | ||||
| 	mem-region = <&q6_qcn6122_data2>; | ||||
| #else | ||||
| 	memory-region = <&q6_qcn6122_data2>; | ||||
| #endif | ||||
| 	nss-radio-priority = <1>; | ||||
| 	status = "ok"; | ||||
| }; | ||||
|  | ||||
| &wifi2 { | ||||
| 	/* QCN6122 6G */ | ||||
| 	qcom,multipd_arch; | ||||
| 	qcom,userpd-subsys-name = "q6v5_wcss_userpd3"; | ||||
| #ifdef __IPQ_MEM_PROFILE_256_MB__ | ||||
| 	qcom,tgt-mem-mode = <2>; | ||||
| #else | ||||
| 	qcom,tgt-mem-mode = <1>; | ||||
| #endif | ||||
| 	qcom,board_id = <0x60>; | ||||
| 	qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>; | ||||
| #ifdef __CNSS2__ | ||||
| 	qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>; | ||||
| #else | ||||
| 	qcom,caldb-addr = <0x4FF00000>; | ||||
| 	m3-dump-addr = <0x4FD00000>; | ||||
| 	nss-radio-priority = <1>; | ||||
| #endif | ||||
| 	mem-region = <&q6_qcn6122_data2>; | ||||
| 	qcom,caldb-size = <0x500000>; | ||||
| 	status = "disabled"; | ||||
| }; | ||||
|  | ||||
| &dwc_0 { | ||||
|        /delete-property/ #phy-cells; | ||||
|        /delete-property/ phys; | ||||
|        /delete-property/ phy-names; | ||||
| }; | ||||
|  | ||||
| &hs_m31phy_0 { | ||||
|        status = "ok"; | ||||
| }; | ||||
|  | ||||
| &eud { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
|  | ||||
| &pcie_x1 { | ||||
| 	perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>; | ||||
| }; | ||||
|  | ||||
| &pcie_x2 { | ||||
| 	perst-gpio = <&tlmm 15 GPIO_ACTIVE_LOW>; | ||||
| }; | ||||
|  | ||||
|  | ||||
| &pcie_x1_rp { | ||||
| 	status = "disabled"; | ||||
|  | ||||
| 	mhi_0: qcom,mhi@0 { | ||||
| 		reg = <0 0 0 0 0 >; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &pcie_x2_rp { | ||||
| 	status = "disabled"; | ||||
|  | ||||
| 	mhi_1: qcom,mhi@1 { | ||||
| 		reg = <0 0 0 0 0 >; | ||||
|  | ||||
| 	}; | ||||
| }; | ||||
| @@ -73,6 +73,17 @@ define Device/sonicfi_rap630w_311g | ||||
| endef | ||||
| TARGET_DEVICES += sonicfi_rap630w_311g | ||||
|  | ||||
| define Device/sonicfi_rap630e | ||||
|   DEVICE_TITLE := Sonicfi RAP630E | ||||
|   DEVICE_DTS := qcom-ipq5018-rap630e | ||||
|   SUPPORTED_DEVICES := sonicfi,rap630e | ||||
|   DEVICE_PACKAGES := ath11k-wifi-sonicfi-rap630e ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122 | ||||
|   DEVICE_DTS_CONFIG := config@mp03.5-c1 | ||||
|   IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi | ||||
|   IMAGE/nand-factory.ubi := append-ubi | ||||
| endef | ||||
| TARGET_DEVICES += sonicfi_rap630e | ||||
|  | ||||
| define Device/edgecore_eap104 | ||||
|   DEVICE_TITLE := EdgeCore EAP104 | ||||
|   DEVICE_DTS := qcom-ipq5018-eap104 | ||||
| @@ -228,3 +239,16 @@ define Device/glinet_b3000 | ||||
|   IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand | ||||
| endef | ||||
| TARGET_DEVICES += glinet_b3000 | ||||
|  | ||||
| define Device/emplus_wap581 | ||||
|   DEVICE_TITLE := Emplus WAP581 | ||||
|   DEVICE_DTS := qcom-ipq5018-emplus-wap581 | ||||
|   SUPPORTED_DEVICES := emplus,wap581 | ||||
|   DEVICE_PACKAGES := ath11k-wifi-emplus-wap581 ath11k-firmware-ipq50xx-map-spruce | ||||
|   DEVICE_DTS_CONFIG := config@mp03.3 | ||||
|   IMAGES := sysupgrade.tar nand-factory.bin | ||||
|   IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata | ||||
|   IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand   | ||||
| endef | ||||
| TARGET_DEVICES += emplus_wap581 | ||||
|  | ||||
|   | ||||
| @@ -20,6 +20,12 @@ edgecore,oap103) | ||||
|         ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt" | ||||
|         ucidef_set_led_wlan "power" "POWER" "green:power" "default-on" | ||||
| 	;; | ||||
| emplus,wap380c) | ||||
| 	ucidef_set_led_default "power"  "POWER"  "ipq::led0" "on" | ||||
| 	ucidef_set_led_netdev  "wan"    "WAN"    "ipq::led1" "eth0" | ||||
| 	ucidef_set_led_wlan    "wlan2g" "WLAN2G" "ipq::led2" "phy1tpt" | ||||
| 	ucidef_set_led_wlan    "wlan5g" "WLAN5G" "ipq::led3" "phy0tpt" | ||||
| 	;; | ||||
| sonicfi,rap630w-311g|\ | ||||
| sonicfi,rap650c|\ | ||||
| cybertan,eww631-b1) | ||||
|   | ||||
| @@ -12,6 +12,7 @@ qcom_setup_interfaces() | ||||
| 	ucidef_add_switch_attr "switch0" "reset" "false" | ||||
|  | ||||
| 	case $board in | ||||
| 	emplus,wap380c|\ | ||||
| 	tplink,ex227|\ | ||||
| 	tplink,ex447) | ||||
| 		ucidef_set_interface_wan "eth0" | ||||
|   | ||||
| @@ -72,6 +72,7 @@ case "$FIRMWARE" in | ||||
| 	edgecore,oap102 |\ | ||||
| 	edgecore,oap103 |\ | ||||
| 	edgecore,eap106 |\ | ||||
| 	emplus,wap380c|\ | ||||
| 	qcom,ipq807x-hk01|\ | ||||
| 	qcom,ipq807x-hk14|\ | ||||
| 	tplink,ex227|\ | ||||
|   | ||||
| @@ -29,6 +29,7 @@ platform_check_image() { | ||||
| 	edgecore,oap102|\ | ||||
| 	edgecore,oap103|\ | ||||
| 	edgecore,eap106|\ | ||||
| 	emplus,wap380c|\ | ||||
| 	sonicfi,rap650c|\ | ||||
| 	tplink,ex227|\ | ||||
| 	tplink,ex447) | ||||
| @@ -48,7 +49,8 @@ platform_do_upgrade() { | ||||
| 	tplink,ex227)	 | ||||
| 		qca_do_upgrade "$1" | ||||
| 		;; | ||||
|         cig,wf196) | ||||
| 	cig,wf196|\ | ||||
| 	emplus,wap380c) | ||||
|                 [ -f /proc/boot_info/rootfs/upgradepartition ] && { | ||||
|                         CI_UBIPART="$(cat /proc/boot_info/rootfs/upgradepartition)" | ||||
|                         CI_BOOTCFG=1 | ||||
|   | ||||
| @@ -0,0 +1,648 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-only | ||||
| /dts-v1/; | ||||
| /* Copyright (c) 2020 The Linux Foundation. All rights reserved. | ||||
|  */ | ||||
| #include "ipq8074.dtsi" | ||||
| #include "ipq8074-ac-cpu.dtsi" | ||||
|  | ||||
| / { | ||||
| 	#address-cells = <0x2>; | ||||
| 	#size-cells = <0x2>; | ||||
| 	model = "Emplus WAP380C"; | ||||
| 	compatible = "emplus,wap380c", "qcom,ipq8074-ap-hk07", "qcom,ipq8074"; | ||||
| 	qcom,msm-id = <0x143 0x0>; | ||||
| 	interrupt-parent = <&intc>; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &blsp1_uart5; | ||||
| 		/* Aliases as required by u-boot to patch MAC addresses */ | ||||
| 		ethernet0 = "/soc/dp6"; | ||||
|  | ||||
| 		led-boot = &led_power; | ||||
| 		led-failsafe = &led_power; | ||||
| 		led-running = &led_power; | ||||
| 		led-upgrade = &led_power; | ||||
| 	}; | ||||
|  | ||||
| 	chosen { | ||||
| 		stdout-path = "serial0"; | ||||
| 	}; | ||||
|  | ||||
| 	soc { | ||||
| 		qti: ledc@191E000  { | ||||
| 			compatible = "qti,ledc"; | ||||
| 			reg = <0x191E000 0x20070>; | ||||
| 			reg-names = "ledc_base_addr"; | ||||
| 			qti,tcsr_ledc_values = <0x0320193 0x00000000 \ | ||||
| 									0x00000000 0x00000000 \ | ||||
| 									0x00000000 0xFFFFFFFF \ | ||||
| 									0xFFFF7FFF 0xFFFFFFFF \ | ||||
| 									0x007D0820 0x00000000 \ | ||||
| 									0x10482094 0x03FFFFE1>; | ||||
| 			qti,ledc_blink_indices_cnt = <6>; | ||||
| 			qti,ledc_blink_indices = <15 14 13 12 11 10>; | ||||
| 			qti,ledc_blink_idx_src_pair = <5 20>; | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		pinctrl@1000000 { | ||||
| 			button_pins: button_pins { | ||||
| 				reset_button { | ||||
| 					pins = "gpio52"; | ||||
| 					function = "gpio"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-up; | ||||
| 				}; | ||||
| 			}; | ||||
|  | ||||
| 			mdio_pins: mdio_pinmux { | ||||
| 				mux_0 { | ||||
| 					pins = "gpio68"; | ||||
| 					function = "mdc"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-up; | ||||
| 				}; | ||||
| 				mux_1 { | ||||
| 					pins = "gpio69"; | ||||
| 					function = "mdio"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-up; | ||||
| 				}; | ||||
| 				mux_2 { | ||||
| 					pins = "gpio44"; | ||||
| 					function = "gpio"; | ||||
| 					bias-pull-up; | ||||
| 				}; | ||||
| 			}; | ||||
|  | ||||
| 			ledc_pins: ledc_pinmux { | ||||
| 				led_clk { | ||||
| 					pins = "gpio18"; | ||||
| 					function = "led0"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-down; | ||||
| 				}; | ||||
| 				led_data { | ||||
| 					pins = "gpio19"; | ||||
| 					function = "led1"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-down; | ||||
| 				}; | ||||
| 				led_clr { | ||||
| 					pins = "gpio20"; | ||||
| 					function = "led2"; | ||||
| 					drive-strength = <8>; | ||||
| 					bias-pull-up; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		serial@78b3000 { | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		spi@78b5000 { | ||||
| 			status = "ok"; | ||||
| 			pinctrl-0 = <&spi_0_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			cs-select = <0>; | ||||
|  | ||||
| 			m25p80@0 { | ||||
| 				  compatible = "n25q128a11"; | ||||
| 				  #address-cells = <1>; | ||||
| 				  #size-cells = <1>; | ||||
| 				  reg = <0>; | ||||
| 				  spi-max-frequency = <50000000>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		dma@7984000 { | ||||
| 			 status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		nand@79b0000 { | ||||
| 			status = "ok"; | ||||
|  | ||||
| 			nand@0 { | ||||
| 				reg = <0>; | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <1>; | ||||
|  | ||||
| 				nand-ecc-strength = <4>; | ||||
| 				nand-ecc-step-size = <512>; | ||||
| 				nand-bus-width = <8>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		ssphy@78000 { | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		ssphy@58000 { | ||||
| 			status = "ok"; | ||||
| 		}; | ||||
|  | ||||
| 		gpio_keys { | ||||
| 			compatible = "gpio-keys"; | ||||
| 			pinctrl-0 = <&button_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			status = "ok"; | ||||
|  | ||||
| 			button@1 { | ||||
| 				label = "reset"; | ||||
| 				linux,code = <KEY_RESTART>; | ||||
| 				gpios = <&tlmm 52 GPIO_ACTIVE_LOW>; | ||||
| 				linux,input-type = <1>; | ||||
| 				debounce-interval = <60>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		mdio: mdio@90000 { | ||||
| 			pinctrl-0 = <&mdio_pins>; | ||||
| 			pinctrl-names = "default"; | ||||
| 			phy-reset-gpio = <&tlmm 43 1 &tlmm 44 1>; | ||||
| 			phy0: ethernet-phy@0 { | ||||
| 				reg = <0>; | ||||
| 			}; | ||||
| 			phy1: ethernet-phy@1 { | ||||
| 				reg = <1>; | ||||
| 			}; | ||||
| 			phy2: ethernet-phy@2 { | ||||
| 				reg = <2>; | ||||
| 			}; | ||||
| 			phy3: ethernet-phy@3 { | ||||
| 				reg = <3>; | ||||
| 			}; | ||||
| 			phy4: ethernet-phy@4 { | ||||
| 				reg = <4>; | ||||
| 			}; | ||||
| 			phy5: ethernet-phy@5 { | ||||
| 				reg = <28>; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		ess-switch@3a000000 { | ||||
| 			switch_cpu_bmp = <0x1>;  /* cpu port bitmap */ | ||||
| 			switch_lan_bmp = <0x3e>; /* lan port bitmap */ | ||||
| 			switch_wan_bmp = <0x40>; /* wan port bitmap */ | ||||
| 			switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ | ||||
| 			switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ | ||||
| 			switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/ | ||||
| 			bm_tick_mode = <0>; /* bm tick mode */ | ||||
| 			tm_tick_mode = <0>; /* tm tick mode */ | ||||
| 			qcom,port_phyinfo { | ||||
| 				port@0 { | ||||
| 					port_id = <1>; | ||||
| 					phy_address = <0>; | ||||
| 				}; | ||||
| 				port@1 { | ||||
| 					port_id = <2>; | ||||
| 					phy_address = <1>; | ||||
| 				}; | ||||
| 				port@2 { | ||||
| 					port_id = <3>; | ||||
| 					phy_address = <2>; | ||||
| 				}; | ||||
| 				port@3 { | ||||
| 					port_id = <4>; | ||||
| 					phy_address = <3>; | ||||
| 				}; | ||||
| 				port@4 { | ||||
| 					port_id = <5>; | ||||
| 					phy_address = <4>; | ||||
| 				}; | ||||
| 				port@5 { | ||||
| 					port_id = <6>; | ||||
| 					phy_address = <28>; | ||||
| 					port_mac_sel = "QGMAC_PORT"; | ||||
| 				}; | ||||
| 			}; | ||||
| 			port_scheduler_resource { | ||||
| 				port@0 { | ||||
| 					port_id = <0>; | ||||
| 					ucast_queue = <0 143>; | ||||
| 					mcast_queue = <256 271>; | ||||
| 					l0sp = <0 35>; | ||||
| 					l0cdrr = <0 47>; | ||||
| 					l0edrr = <0 47>; | ||||
| 					l1cdrr = <0 7>; | ||||
| 					l1edrr = <0 7>; | ||||
| 				}; | ||||
| 				port@1 { | ||||
| 					port_id = <1>; | ||||
| 					ucast_queue = <144 159>; | ||||
| 					mcast_queue = <272 275>; | ||||
| 					l0sp = <36 39>; | ||||
| 					l0cdrr = <48 63>; | ||||
| 					l0edrr = <48 63>; | ||||
| 					l1cdrr = <8 11>; | ||||
| 					l1edrr = <8 11>; | ||||
| 				}; | ||||
| 				port@2 { | ||||
| 					port_id = <2>; | ||||
| 					ucast_queue = <160 175>; | ||||
| 					mcast_queue = <276 279>; | ||||
| 					l0sp = <40 43>; | ||||
| 					l0cdrr = <64 79>; | ||||
| 					l0edrr = <64 79>; | ||||
| 					l1cdrr = <12 15>; | ||||
| 					l1edrr = <12 15>; | ||||
| 				}; | ||||
| 				port@3 { | ||||
| 					port_id = <3>; | ||||
| 					ucast_queue = <176 191>; | ||||
| 					mcast_queue = <280 283>; | ||||
| 					l0sp = <44 47>; | ||||
| 					l0cdrr = <80 95>; | ||||
| 					l0edrr = <80 95>; | ||||
| 					l1cdrr = <16 19>; | ||||
| 					l1edrr = <16 19>; | ||||
| 				}; | ||||
| 				port@4 { | ||||
| 					port_id = <4>; | ||||
| 					ucast_queue = <192 207>; | ||||
| 					mcast_queue = <284 287>; | ||||
| 					l0sp = <48 51>; | ||||
| 					l0cdrr = <96 111>; | ||||
| 					l0edrr = <96 111>; | ||||
| 					l1cdrr = <20 23>; | ||||
| 					l1edrr = <20 23>; | ||||
| 				}; | ||||
| 				port@5 { | ||||
| 					port_id = <5>; | ||||
| 					ucast_queue = <208 223>; | ||||
| 					mcast_queue = <288 291>; | ||||
| 					l0sp = <52 55>; | ||||
| 					l0cdrr = <112 127>; | ||||
| 					l0edrr = <112 127>; | ||||
| 					l1cdrr = <24 27>; | ||||
| 					l1edrr = <24 27>; | ||||
| 				}; | ||||
| 				port@6 { | ||||
| 					port_id = <6>; | ||||
| 					ucast_queue = <224 239>; | ||||
| 					mcast_queue = <292 295>; | ||||
| 					l0sp = <56 59>; | ||||
| 					l0cdrr = <128 143>; | ||||
| 					l0edrr = <128 143>; | ||||
| 					l1cdrr = <28 31>; | ||||
| 					l1edrr = <28 31>; | ||||
| 				}; | ||||
| 				port@7 { | ||||
| 					port_id = <7>; | ||||
| 					ucast_queue = <240 255>; | ||||
| 					mcast_queue = <296 299>; | ||||
| 					l0sp = <60 63>; | ||||
| 					l0cdrr = <144 159>; | ||||
| 					l0edrr = <144 159>; | ||||
| 					l1cdrr = <32 35>; | ||||
| 					l1edrr = <32 35>; | ||||
| 				}; | ||||
| 			}; | ||||
| 			port_scheduler_config { | ||||
| 				port@0 { | ||||
| 					port_id = <0>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <0 1>; /*L0 SPs*/ | ||||
| 							/*cpri cdrr epri edrr*/ | ||||
| 							cfg = <0 0 0 0>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							/*unicast queues*/ | ||||
| 							ucast_queue = <0 4 8>; | ||||
| 							/*multicast queues*/ | ||||
| 							mcast_queue = <256 260>; | ||||
| 							/*sp cpri cdrr epri edrr*/ | ||||
| 							cfg = <0 0 0 0 0>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							ucast_queue = <1 5 9>; | ||||
| 							mcast_queue = <257 261>; | ||||
| 							cfg = <0 1 1 1 1>; | ||||
| 						}; | ||||
| 						group@2 { | ||||
| 							ucast_queue = <2 6 10>; | ||||
| 							mcast_queue = <258 262>; | ||||
| 							cfg = <0 2 2 2 2>; | ||||
| 						}; | ||||
| 						group@3 { | ||||
| 							ucast_queue = <3 7 11>; | ||||
| 							mcast_queue = <259 263>; | ||||
| 							cfg = <0 3 3 3 3>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@1 { | ||||
| 					port_id = <1>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <36>; | ||||
| 							cfg = <0 8 0 8>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <37>; | ||||
| 							cfg = <1 9 1 9>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <144>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <272>; | ||||
| 							mcast_loop_pri = <4>; | ||||
| 							cfg = <36 0 48 0 48>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@2 { | ||||
| 					port_id = <2>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <40>; | ||||
| 							cfg = <0 12 0 12>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <41>; | ||||
| 							cfg = <1 13 1 13>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <160>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <276>; | ||||
| 							mcast_loop_pri = <4>; | ||||
| 							cfg = <40 0 64 0 64>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@3 { | ||||
| 					port_id = <3>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <44>; | ||||
| 							cfg = <0 16 0 16>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <45>; | ||||
| 							cfg = <1 17 1 17>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <176>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <280>; | ||||
| 							mcast_loop_pri = <4>; | ||||
| 							cfg = <44 0 80 0 80>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@4 { | ||||
| 					port_id = <4>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <48>; | ||||
| 							cfg = <0 20 0 20>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <49>; | ||||
| 							cfg = <1 21 1 21>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <192>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <284>; | ||||
| 							mcast_loop_pri = <4>; | ||||
| 							cfg = <48 0 96 0 96>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@5 { | ||||
| 					port_id = <5>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <52>; | ||||
| 							cfg = <0 24 0 24>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <53>; | ||||
| 							cfg = <1 25 1 25>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <208>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <288>; | ||||
| 							mcast_loop_pri = <4>; | ||||
| 							cfg = <52 0 112 0 112>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@6 { | ||||
| 					port_id = <6>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <56>; | ||||
| 							cfg = <0 28 0 28>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <57>; | ||||
| 							cfg = <1 29 1 29>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <224>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <292>; | ||||
| 							mcast_loop_pri = <4>; | ||||
| 							cfg = <56 0 128 0 128>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 				port@7 { | ||||
| 					port_id = <7>; | ||||
| 					l1scheduler { | ||||
| 						group@0 { | ||||
| 							sp = <60>; | ||||
| 							cfg = <0 32 0 32>; | ||||
| 						}; | ||||
| 						group@1 { | ||||
| 							sp = <61>; | ||||
| 							cfg = <1 33 1 33>; | ||||
| 						}; | ||||
| 					}; | ||||
| 					l0scheduler { | ||||
| 						group@0 { | ||||
| 							ucast_queue = <240>; | ||||
| 							ucast_loop_pri = <16>; | ||||
| 							mcast_queue = <296>; | ||||
| 							cfg = <60 0 144 0 144>; | ||||
| 						}; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		dp6 { | ||||
| 			device_type = "network"; | ||||
| 			compatible = "qcom,nss-dp"; | ||||
| 			qcom,id = <6>; | ||||
| 			reg = <0x3a001800 0x200>; | ||||
| 			qcom,mactype = <0>; | ||||
| 			local-mac-address = [000000000000]; | ||||
| 			qcom,link-poll = <1>; | ||||
| 			qcom,phy-mdio-addr = <28>; | ||||
| 			phy-mode = "sgmii"; | ||||
| 		}; | ||||
|  | ||||
| 		nss-macsec1 { | ||||
| 			compatible = "qcom,nss-macsec"; | ||||
| 			phy_addr = <0x1c>; | ||||
| 			mdiobus = <&mdio>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &apc_cpr { | ||||
| 	/* Same CPR configuration as OAK */ | ||||
| 	compatible = "qcom,cpr4-ipq817x-apss-regulator"; | ||||
|  | ||||
| 	thread@0 { | ||||
| 		apc_vreg: regulator { | ||||
| 			regulator-min-microvolt = <1>; | ||||
| 			regulator-max-microvolt = <2>; | ||||
| 			qcom,cpr-fuse-corners = <2>; | ||||
| 			qcom,cpr-corners = <3>; | ||||
| 			qcom,cpr-speed-bin-corners = <3>; | ||||
| 			qcom,cpr-corner-fmax-map = <1 3>; | ||||
|  | ||||
| 			qcom,cpr-voltage-ceiling = | ||||
| 				<840000 904000 944000>; | ||||
| 			qcom,cpr-voltage-floor = | ||||
| 				<592000 648000 712000>; | ||||
| 			qcom,corner-frequencies = | ||||
| 				<1017600000 1382400000 1382400000>; | ||||
|  | ||||
| 			qcom,cpr-open-loop-voltage-fuse-adjustment-0 = | ||||
| 				/* Speed bin 0; CPR rev 0..7 */ | ||||
| 				< 0      0>, | ||||
| 				< 0      0>, | ||||
| 				< 0      0>, | ||||
| 				< 0      0>, | ||||
| 				< 0      0>, | ||||
| 				< 0      0>, | ||||
| 				< 0      0>, | ||||
| 				< 0      0>; | ||||
|  | ||||
| 			qcom,cpr-open-loop-voltage-fuse-adjustment-1 = | ||||
| 				/* Speed bin 0; CPR rev 0..7 */ | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				< 20000  26000>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>; | ||||
|  | ||||
| 			qcom,cpr-open-loop-voltage-fuse-adjustment-v2-0 = | ||||
| 				/* Speed bin 0; CPR rev 0..7 */ | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>; | ||||
|  | ||||
| 			qcom,cpr-open-loop-voltage-fuse-adjustment-v2-1 = | ||||
| 				/* Speed bin 0; CPR rev 0..7 */ | ||||
| 				<     0      0>, | ||||
| 				<     0   7000>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>, | ||||
| 				<     0      0>; | ||||
|  | ||||
| 			qcom,cpr-floor-to-ceiling-max-range = | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>, | ||||
| 				< 40000 40000 40000>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| &npu_cpr { | ||||
| 	status = "disabled"; | ||||
| }; | ||||
|  | ||||
| &nss0 { | ||||
| 	qcom,low-frequency = <187200000>; | ||||
| 	qcom,mid-frequency = <748800000>; | ||||
| 	qcom,max-frequency = <1497600000>; | ||||
| }; | ||||
|  | ||||
| &nss0 { | ||||
| 	npu-supply = <&dummy_reg>; | ||||
| 	mx-supply = <&dummy_reg>; | ||||
| }; | ||||
|  | ||||
| &wifi0 { | ||||
| 	qcom,board_id = <0x92>; | ||||
| }; | ||||
|  | ||||
| &wifi1 { | ||||
| 	qcom,board_id = <0x290>; | ||||
| }; | ||||
|  | ||||
| &ledc { | ||||
| 	pinctrl-0 = <&ledc_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
| 	status = "ok"; | ||||
|  | ||||
| 	led_power: led0 { | ||||
| 		label = "ipq::led0"; | ||||
| 		linux,default-trigger = "default-on"; | ||||
| 	}; | ||||
|  | ||||
| 	wan: led1 { | ||||
| 		label = "ipq::led1"; | ||||
| 		linux,default-trigger = "netdev"; | ||||
| 	}; | ||||
|  | ||||
| 	wifi2g: led2 { | ||||
| 		label = "ipq::led2"; | ||||
| 		linux,default-trigger = "phy1tpt"; | ||||
| 	}; | ||||
|  | ||||
| 	wifi5g: led3 { | ||||
| 		label = "ipq::led3"; | ||||
| 		linux,default-trigger = "phy0tpt"; | ||||
| 	}; | ||||
|  | ||||
| 	led4 { | ||||
| 		label = "ipq::led4"; | ||||
| 		linux,default-trigger = "none"; | ||||
| 	}; | ||||
|  | ||||
| 	led5 { | ||||
| 		label = "ipq::led5"; | ||||
| 		linux,default-trigger = "none"; | ||||
| 	}; | ||||
| }; | ||||
| @@ -57,6 +57,15 @@ define Device/edgecore_eap106 | ||||
| endef | ||||
| #TARGET_DEVICES += edgecore_eap106 | ||||
|  | ||||
| define Device/emplus_wap380c | ||||
|   DEVICE_TITLE := Emplus WAP380C | ||||
|   DEVICE_DTS := qcom-ipq807x-wap380c | ||||
|   DEVICE_DTS_CONFIG=config@hk07 | ||||
|   SUPPORTED_DEVICES := emplus,wap380c | ||||
|   DEVICE_PACKAGES := ath11k-wifi-emplus-wap380c uboot-envtools | ||||
| endef | ||||
| TARGET_DEVICES += emplus_wap380c | ||||
|  | ||||
| define Device/sonicfi_rap650c | ||||
|   DEVICE_TITLE := SonicFi RAP650C | ||||
|   DEVICE_DTS := qcom-ipq807x-rap650c | ||||
|   | ||||
| @@ -832,6 +832,13 @@ morse_hostapd_add_bss(){ | ||||
| 	morse_override_hostapd_set_bss_options hostapd_cfg "$_phy" "$vif" || return 1 | ||||
| 	json_get_vars wds wds_bridge sae_pwe dtim_period max_listen_int start_disabled | ||||
|  | ||||
| 	local network_config network_values | ||||
| 	json_get_values network_values network | ||||
| 	network_config=$(echo "$network_values" | cut -d' ' -f1) | ||||
|  | ||||
| 	if [ "$wds" -gt 0 ] && [ -z "$wds_bridge" ]; then | ||||
| 		wds_bridge="${network_config%%[0-9]*}" | ||||
| 	fi | ||||
|  | ||||
| 	raw_block= | ||||
| 	json_for_each_item morse_hostapd_add_raw raws | ||||
|   | ||||
							
								
								
									
										29
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-device-boot/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-device-boot/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=cig-device-boot | ||||
| PKG_RELEASE:=1 | ||||
| PKG_LICENSE:=GPL-2.0 | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define Package/cig-device-boot | ||||
|   SECTION:=utils | ||||
|   CATEGORY:=Utilities | ||||
|   DEPENDS:=+kmod-usb-serial-xr | ||||
|   TITLE:=CIG device init | ||||
| endef | ||||
|  | ||||
| define Package/cig-device-boot/description | ||||
|   Initialize particular functions of the CIG device | ||||
| endef | ||||
|  | ||||
| define Build/Compile | ||||
|  | ||||
| endef | ||||
|  | ||||
| define Package/cig-device-boot/install | ||||
| 	$(INSTALL_DIR) $(1)/etc/init.d | ||||
| 	$(INSTALL_BIN) ./files/cig-device.init $(1)/etc/init.d/cig-device-boot | ||||
| endef | ||||
|  | ||||
| $(eval $(call BuildPackage,cig-device-boot)) | ||||
							
								
								
									
										7
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-device-boot/files/cig-device.init
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-device-boot/files/cig-device.init
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| #!/bin/sh /etc/rc.common | ||||
|  | ||||
| START=99 | ||||
|  | ||||
| boot(){ | ||||
|     [ -e /dev/ttyUSB0 ] && stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -icrnl -onlcr | ||||
| } | ||||
							
								
								
									
										25
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/kernel.mk | ||||
|  | ||||
| PKG_NAME:=cig-poe-judgment | ||||
| PKG_RELEASE:=1 | ||||
| PKG_LICENSE:=GPL-2.0 | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define KernelPackage/cig-poe-judgment | ||||
|   SUBMENU:=Other modules | ||||
|   TITLE:=CIG POE judgment | ||||
|   FILES:=$(PKG_BUILD_DIR)/cig_poe_judgment.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,99,cig_poe_judgment) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/cig-poe-judgment/description | ||||
|   Find POE type | ||||
| endef | ||||
|  | ||||
| define Build/Compile | ||||
| 	$(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,cig-poe-judgment)) | ||||
| @@ -0,0 +1 @@ | ||||
| obj-m += cig_poe_judgment.o | ||||
| @@ -0,0 +1,252 @@ | ||||
| #include <linux/module.h> | ||||
| #include <linux/device.h> | ||||
| #include <linux/proc_fs.h> | ||||
| #include <linux/kthread.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/irqreturn.h> | ||||
| #include <linux/of_gpio.h> | ||||
| #include <linux/err.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/of_irq.h> | ||||
| #include <linux/of_platform.h> | ||||
| #include <asm/uaccess.h> | ||||
|  | ||||
| #define GPIO_MAX 		8  | ||||
| #define INT_MODE_MASK 		0xf0 | ||||
| #define DETECT_MODE1	 	0x3 | ||||
| #define DETECT_MODE2	 	0x4 | ||||
|  | ||||
| enum POE_TYPE { | ||||
| 	POE_TYPE_AT = 1, | ||||
| 	POE_TYPE_AF, | ||||
| 	POE_TYPE_BT, | ||||
| 	POE_TYPE_DC, | ||||
| 	POE_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| struct poe_irq_data | ||||
| { | ||||
| 	struct device *dev; | ||||
| 	int irq; | ||||
| 	struct tasklet_struct tasklet; | ||||
| 	int poe_type; | ||||
| }; | ||||
|  | ||||
| static void  *poe_gpio_base; | ||||
| static void  *pse_gpio_base; | ||||
| struct poe_irq_data *data = NULL; | ||||
| u32 mode; | ||||
|  | ||||
| static const struct of_device_id my_of_ids[] = { | ||||
| 	{.compatible = "poe-judge"}, | ||||
| 	{}, | ||||
| }; | ||||
|  | ||||
| MODULE_DEVICE_TABLE(of,my_of_ids); | ||||
|  | ||||
| static int poe_info_proc_show(struct seq_file *m, void *v) | ||||
| { | ||||
| 	const char *type_str = "invalid"; | ||||
|  | ||||
| 	switch (data->poe_type) { | ||||
| 		case POE_TYPE_AT:  | ||||
| 			type_str = "AT";  | ||||
| 			break; | ||||
| 		case POE_TYPE_AF:  | ||||
| 			type_str = "AF";  | ||||
| 			break; | ||||
| 		case POE_TYPE_BT:  | ||||
| 			type_str = "BT";  | ||||
| 			break; | ||||
| 		case POE_TYPE_DC:  | ||||
| 			type_str = "DC";  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	seq_printf(m, "%s\n", type_str); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void poe_tasklet_func(unsigned long data) | ||||
| { | ||||
| 	struct poe_irq_data *irq_data = (struct poe_irq_data *)data; | ||||
|  | ||||
| 	writel(0x3, pse_gpio_base+4); | ||||
| 	irq_data->poe_type = POE_TYPE_BT; | ||||
|  | ||||
| 	return; | ||||
| } | ||||
|  | ||||
| static irqreturn_t gpio_key1_irq_handler(int irq, void *dev_id) | ||||
| { | ||||
| 	struct poe_irq_data *data = (struct poe_irq_data *)dev_id; | ||||
|  | ||||
| 	disable_irq_nosync(data->irq); | ||||
| 	tasklet_schedule(&data->tasklet); | ||||
|  | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
|  | ||||
| static int poe_info_proc_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	return single_open(file, poe_info_proc_show, NULL); | ||||
| } | ||||
|  | ||||
| static const struct proc_ops poe_info_proc_fops = { | ||||
| 	.proc_open = poe_info_proc_open, | ||||
| 	.proc_read = seq_read, | ||||
| 	.proc_lseek = seq_lseek, | ||||
| 	.proc_release = single_release, | ||||
| }; | ||||
|  | ||||
| static int gpio_key_probe(struct platform_device *dev) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	int irq = (-1); | ||||
| 	int val = 0; | ||||
| 	int gpio_id = 0; | ||||
| 	int gpio[GPIO_MAX] = {0}, gpio_val[GPIO_MAX] = {0}; | ||||
| 	int num; | ||||
| 	char name[16]; | ||||
| 	struct device_node *np = dev->dev.of_node; | ||||
|  | ||||
| 	if (of_property_read_u32(np, "detect-mode", &mode)) { | ||||
| 		pr_err("Failed to read detect mode\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
|  | ||||
| 	data = devm_kzalloc(&dev->dev, sizeof(struct poe_irq_data), GFP_KERNEL); | ||||
| 	if (!data) | ||||
| 	{ | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	if (mode & INT_MODE_MASK) { | ||||
| 		poe_gpio_base = ioremap(0x1017004, 8); | ||||
| 		pse_gpio_base = ioremap(0x1026000, 8); | ||||
|  | ||||
| 		writel(0x2c1, pse_gpio_base); | ||||
| 		writel(0x0, pse_gpio_base+4); | ||||
|  | ||||
|  | ||||
| 		data->dev = &dev->dev; | ||||
| 		dev_set_drvdata(&dev->dev, data); | ||||
|  | ||||
| 		gpio_id = of_get_named_gpio(dev->dev.of_node, "detect_gpio", 0); | ||||
| 		if (gpio_id < 0) | ||||
| 		{ | ||||
| 			return -EINVAL; | ||||
| 		} | ||||
|  | ||||
| 		tasklet_init(&data->tasklet, poe_tasklet_func, (unsigned long)data); | ||||
|  | ||||
| 		ret = devm_gpio_request_one(&dev->dev, gpio_id, GPIOF_IN, "poe_judge"); | ||||
| 		if(ret) | ||||
| 		{ | ||||
| 			pr_err("GPIO23 request failed, ret:%d\n", ret); | ||||
| 			return ret; | ||||
| 		} | ||||
|  | ||||
| 		val = readl(poe_gpio_base); | ||||
| 		if(val == 1) | ||||
| 		{ | ||||
| 			pr_info("poe type is af or bt,close pse first\n"); | ||||
| 			data->poe_type = POE_TYPE_AF; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			data->poe_type = POE_TYPE_AT; | ||||
| 		} | ||||
|  | ||||
| 		irq = gpio_to_irq(gpio_id); | ||||
| 		data->irq = irq; | ||||
|  | ||||
| 		ret = devm_request_any_context_irq(&dev->dev, data->irq,  | ||||
| 				gpio_key1_irq_handler,  | ||||
| 				IRQF_TRIGGER_FALLING,  | ||||
| 				"poe_judge", data); | ||||
| 		if (ret) | ||||
| 		{ | ||||
| 			pr_err("Request irq fail %d\n", ret); | ||||
| 			return ret; | ||||
| 		} | ||||
| 	} else { | ||||
| 		if (mode == DETECT_MODE1 || mode == DETECT_MODE2) { | ||||
| 			num = 3; | ||||
| 		} else { | ||||
| 			pr_err("Wrong poe detect mode\n"); | ||||
| 			return -ENOMEM; | ||||
| 		} | ||||
|  | ||||
| 		for (int i = 0; i < num; i++) { | ||||
| 			sprintf(name, "detect-gpio%d", i+1); | ||||
| 			gpio[i] = of_get_named_gpio(np, name, 0); 	 | ||||
| 			ret = gpio_request(gpio[i], name); | ||||
| 			if (ret) { | ||||
| 				pr_err("Can not request gpio %d\n", i+1); | ||||
| 				return ret; | ||||
| 			} | ||||
| 			gpio_direction_input(gpio[i]); | ||||
| 			gpio_val[i] = gpio_get_value_cansleep(gpio[i]); | ||||
| 		} | ||||
| 		 | ||||
| 		if (mode == DETECT_MODE1){ | ||||
| 			if (gpio_val[0] > 0) { | ||||
| 				data->poe_type = POE_TYPE_DC; | ||||
| 			} else if (gpio_val[1] > 0){ | ||||
| 				if (gpio_val[2] == 0) { | ||||
| 					data->poe_type = POE_TYPE_AT; | ||||
| 				} else { | ||||
| 					data->poe_type = POE_TYPE_AF; | ||||
| 				} | ||||
| 			} | ||||
| 		}else if (mode == DETECT_MODE2){ | ||||
| 			switch (gpio_val[0] | (gpio_val[1] << 1) | (gpio_val[2] << 2)) { | ||||
| 				case 3: | ||||
| 					data->poe_type = POE_TYPE_AT; | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					data->poe_type = POE_TYPE_BT; | ||||
| 					break; | ||||
| 				case 7: | ||||
| 					data->poe_type = POE_TYPE_AF; | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	if (!proc_create("poe_info", 0444, NULL, &poe_info_proc_fops)) { | ||||
| 		pr_err("Failed to create proc entry for poe_info\n"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| static int gpio_key_remove(struct platform_device *dev) | ||||
| { | ||||
| 	remove_proc_entry("poe_info", NULL); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static struct platform_driver poe_judge_driver = | ||||
| { | ||||
| 	.driver = { | ||||
| 		.name = "poe_judge", | ||||
| 		.of_match_table = my_of_ids, | ||||
| 		.owner = THIS_MODULE, | ||||
| 	}, | ||||
| 	.probe = gpio_key_probe, | ||||
| 	.remove = gpio_key_remove, | ||||
| }; | ||||
|  | ||||
| module_platform_driver(poe_judge_driver); | ||||
|  | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_DESCRIPTION("Poe type judgment driver"); | ||||
| MODULE_AUTHOR("huangyunxiang<huangyunxiang@cigtech.com>"); | ||||
| @@ -3,9 +3,9 @@ | ||||
| band=$1 | ||||
| if [ $band -eq 2 ] || [ $band -eq 3 ]; then | ||||
| 	echo $band > /proc/rf_switch | ||||
| 	echo "reboot for switch wifi mode 2/3 bands" | ||||
| 	echo "firstboot for switch wifi mode 2/3 bands" | ||||
| 	sleep 1 | ||||
| 	reboot | ||||
| 	firstboot -y -r | ||||
| else | ||||
| 	echo "error band param" | ||||
| fi | ||||
| @@ -1225,3 +1225,4 @@ CONFIG_PSTORE_PMSG=y | ||||
| CONFIG_PSTORE_RAM=y | ||||
| # CONFIG_RTL8221D_PHY is not set | ||||
| # CONFIG_INPUT_LSM303AGR is not set | ||||
| # CONFIG_USB_SERIAL_XR is not set | ||||
|   | ||||
| @@ -236,6 +236,15 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
| 			compatible = "poe-judge"; | ||||
| 			detect-mode = <0x3>; | ||||
| 			detect-gpio1 = <&tlmm 25 GPIO_ACTIVE_HIGH>; | ||||
| 			detect-gpio2 = <&tlmm 43 GPIO_ACTIVE_HIGH>; | ||||
| 			detect-gpio3 = <&tlmm 29 GPIO_ACTIVE_HIGH>; | ||||
| 			status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		wsi: wsi { | ||||
| 			id = <0>; | ||||
| 			num_chip = <2>; | ||||
|   | ||||
| @@ -85,6 +85,15 @@ | ||||
| 		/delete-node/ wcnss@4a900000; | ||||
| 		/delete-node/ q6_caldb_region@4ce00000; | ||||
|  | ||||
|         ramoops@49c00000 { | ||||
|             compatible = "ramoops"; | ||||
|             no-map; | ||||
|             reg = <0x0 0x49c00000 0x0 0x50000>; | ||||
|             record-size = <0x20000>; | ||||
|             console-size = <0x8000>; | ||||
|             pmsg-size = <0x8000>; | ||||
|         }; | ||||
|  | ||||
| 		q6_mem_regions: q6_mem_regions@4A900000  { | ||||
| 			reg = <0x0 0x4a900000 0x0 0x6D00000>; | ||||
| 			no-map; | ||||
| @@ -298,6 +307,13 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
|                         compatible = "poe-judge"; | ||||
| 			detect-mode = <0x11>; | ||||
|                         detect_gpio = <&tlmm 0x17 0>; | ||||
|                         status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		ess-instance { | ||||
| 			num_devices = <0x2>; | ||||
|  | ||||
|   | ||||
| @@ -85,6 +85,15 @@ | ||||
| 		/delete-node/ wcnss@4a900000; | ||||
| 		/delete-node/ q6_caldb_region@4ce00000; | ||||
|  | ||||
|         ramoops@49c00000 { | ||||
|             compatible = "ramoops"; | ||||
|             no-map; | ||||
|             reg = <0x0 0x49c00000 0x0 0x50000>; | ||||
|             record-size = <0x20000>; | ||||
|             console-size = <0x8000>; | ||||
|             pmsg-size = <0x8000>; | ||||
|         }; | ||||
|  | ||||
| 		q6_mem_regions: q6_mem_regions@4A900000  { | ||||
| 			reg = <0x0 0x4a900000 0x0 0x6D00000>; | ||||
| 			no-map; | ||||
| @@ -298,6 +307,13 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
|                         compatible = "poe-judge"; | ||||
| 			detect-mode = <0x11>; | ||||
|                         detect_gpio = <&tlmm 0x17 0>; | ||||
|                         status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		ess-instance { | ||||
| 			num_devices = <0x2>; | ||||
|  | ||||
|   | ||||
| @@ -18,6 +18,21 @@ | ||||
| 	model = "CIG WF672"; | ||||
| 	compatible = "cig,wf672", "qcom,ipq5332-rdp468", "qcom,ipq5332"; | ||||
|  | ||||
|     reserved-memory { | ||||
|         #address-cells = <2>; | ||||
|         #size-cells = <2>; | ||||
|         ranges; | ||||
|  | ||||
|        ramoops@49c00000 { | ||||
|            compatible = "ramoops"; | ||||
|            no-map; | ||||
|            reg = <0x0 0x49c00000 0x0 0x50000>; | ||||
|            record-size = <0x20000>; | ||||
|            console-size = <0x8000>; | ||||
|            pmsg-size = <0x8000>; | ||||
|        }; | ||||
|     }; | ||||
|  | ||||
| 	aliases { | ||||
| 		serial0 = &blsp1_uart0; | ||||
| 		serial1 = &blsp1_uart1; | ||||
| @@ -59,6 +74,8 @@ | ||||
| 			num_devices = <0x1>; | ||||
|  | ||||
| 			ess-switch@3a000000 { | ||||
| 				pinctrl-0 = <&sfp_pins>; | ||||
| 				pinctrl-names = "default"; | ||||
| 				switch_cpu_bmp = <0x1>;  /* cpu port bitmap */ | ||||
| 				switch_lan_bmp = <0x2>; /* lan port bitmap */ | ||||
| 				switch_wan_bmp = <0x4>; /* wan port bitmap */ | ||||
| @@ -234,6 +251,15 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
| 			compatible = "poe-judge"; | ||||
| 			detect-mode = <0x4>; | ||||
| 			detect-gpio1 = <&extgpio 0 0>; | ||||
| 			detect-gpio2 = <&extgpio 1 0>; | ||||
| 			detect-gpio3 = <&extgpio 2 0>; | ||||
| 			status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		wsi: wsi { | ||||
| 			id = <0>; | ||||
| 			num_chip = <2>; | ||||
| @@ -275,7 +301,7 @@ | ||||
|  | ||||
| &blsp1_i2c1 { | ||||
| 	status = "okay"; | ||||
| 	clock-frequency  = <400000>; | ||||
| 	clock-frequency  = <100000>; | ||||
| 	pinctrl-0 = <&i2c_1_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
| 	extgpio:pca9555@20{ | ||||
| @@ -433,6 +459,13 @@ | ||||
|                 }; | ||||
| 	}; | ||||
|  | ||||
| 	sfp_pins: sfp-state { | ||||
| 		pins = "gpio43"; | ||||
| 		function = "gpio"; | ||||
| 		bias-pull-up; | ||||
| 		input-enable; | ||||
| 	}; | ||||
|  | ||||
| 	spi_0_data_clk_pins: spi-0-data-clk-state { | ||||
| 		pins = "gpio14", "gpio15", "gpio16"; | ||||
| 		function = "blsp0_spi"; | ||||
| @@ -538,7 +571,6 @@ | ||||
| 	pinctrl-0 = <&pwm_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
| 	dft-pwm-status = <0>, <0>, <1>, <0>; | ||||
|         poe_type_pin = <&extgpio 0 0 &extgpio 1 0 &extgpio 2 0>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,181 @@ | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c | ||||
| --- a/drivers/net/wireless/ath/ath12k/mac.c	2025-06-24 15:49:49.813180049 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/mac.c	2025-06-24 15:50:19.499525336 +0800 | ||||
| @@ -10451,6 +10451,30 @@ | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +int ath12k_mac_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) | ||||
| +{ | ||||
| +    int ret; | ||||
| +     | ||||
| +    if (!tx_ant || !rx_ant) { | ||||
| +        ath12k_warn(ar->ab, "Invalid chainmask tx=0x%x rx=0x%x\n", tx_ant, rx_ant); | ||||
| +        return -EINVAL; | ||||
| +    } | ||||
| + | ||||
| +    /* return if it is no changed */ | ||||
| +    if (ar->cfg_tx_chainmask == tx_ant && ar->cfg_rx_chainmask == rx_ant) | ||||
| +        return 0; | ||||
| + | ||||
| +    mutex_lock(&ar->conf_mutex); | ||||
| +    ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); | ||||
| +    if (!ret) { | ||||
| +        ar->cfg_tx_chainmask = tx_ant; | ||||
| +        ar->cfg_rx_chainmask = rx_ant; | ||||
| +    } | ||||
| +    mutex_unlock(&ar->conf_mutex); | ||||
| + | ||||
| +    return ret; | ||||
| +} | ||||
| + | ||||
|  static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) | ||||
|  { | ||||
|  	int num_mgmt = 0; | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/mac.h b/drivers/net/wireless/ath/ath12k/mac.h | ||||
| --- a/drivers/net/wireless/ath/ath12k/mac.h	2025-06-24 15:49:49.719178955 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/mac.h	2025-06-24 15:50:19.500525348 +0800 | ||||
| @@ -168,6 +168,7 @@ | ||||
|   | ||||
|  extern const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default; | ||||
|   | ||||
| +int ath12k_mac_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant); | ||||
|  void ath12k_mac_set_cw_intf_detect(struct ath12k *ar, u8 intf_detect_param); | ||||
|  void ath12k_mac_set_vendor_intf_detect(struct ath12k *ar, u8 intf_detect_bitmap); | ||||
|  void ath12k_mac_ap_ps_recalc(struct ath12k *ar); | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/thermal.c b/drivers/net/wireless/ath/ath12k/thermal.c | ||||
| --- a/drivers/net/wireless/ath/ath12k/thermal.c	2025-06-24 15:49:49.388175103 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/thermal.c	2025-06-24 15:50:19.500525348 +0800 | ||||
| @@ -401,8 +401,25 @@ | ||||
|  	complete(&ar->thermal.wmi_sync); | ||||
|  } | ||||
|   | ||||
| +static void ath12k_thermal_antenna_switch_work(struct work_struct *work) { | ||||
| +    struct ath12k_thermal_work *thermal_work = container_of(work, struct ath12k_thermal_work, work); | ||||
| +    struct ath12k *ar = thermal_work->ar; | ||||
| +    int ret; | ||||
| + | ||||
| +    ret = ath12k_mac_set_antenna(ar, thermal_work->tx_mask, thermal_work->rx_mask); | ||||
| +    if (ret) { | ||||
| +        ath12k_warn(ar->ab, "Radio %d: Failed to set antenna (tx=0x%x rx=0x%x, err=%d)\n", | ||||
| +                   ar->pdev_idx, thermal_work->tx_mask, thermal_work->rx_mask, ret); | ||||
| +    } | ||||
| +    kfree(thermal_work); | ||||
| +} | ||||
| + | ||||
|  void ath12k_thermal_event_throt_level(struct ath12k *ar, int curr_level) | ||||
|  { | ||||
| +	int temp = ar->thermal.temperature; | ||||
| +    	u32 tx_mask, rx_mask; | ||||
| +    	bool need_switch = false; | ||||
| + | ||||
|  	if (test_bit(WMI_TLV_SERVICE_THERM_THROT_POUT_REDUCTION, ar->ab->wmi_ab.svc_map) && | ||||
|  	    curr_level >= ENHANCED_THERMAL_LEVELS) | ||||
|  		return; | ||||
| @@ -416,7 +433,37 @@ | ||||
|  	else | ||||
|  		ar->thermal.throttle_state = | ||||
|  			tt_level_configs[ATH12K_DEFAULT_THERMAL_LEVEL][curr_level].dcoffpercent; | ||||
| -	spin_unlock_bh(&ar->data_lock); | ||||
| +	 | ||||
| +	/* configure ant mode */ | ||||
| +	if (temp >= 110 && ar->cfg_tx_chainmask != 0x1) { | ||||
| +        	tx_mask = 0x1; | ||||
| +        	rx_mask = 0x1; | ||||
| +        	need_switch = true; | ||||
| +    	} else if (temp <= 105 && ar->cfg_tx_chainmask != ar->thermal.default_tx_chainmask) { | ||||
| +        	tx_mask = ar->thermal.default_tx_chainmask; | ||||
| +        	rx_mask = ar->thermal.default_rx_chainmask; | ||||
| +        	need_switch = true; | ||||
| +    	} | ||||
| + | ||||
| +    	spin_unlock_bh(&ar->data_lock); | ||||
| + | ||||
| +    /* set param async*/  | ||||
| +    if (need_switch) { | ||||
| +        struct ath12k_thermal_work *work = kmalloc(sizeof(*work), GFP_ATOMIC); | ||||
| +        if (work) { | ||||
| +            work->ar = ar; | ||||
| +            work->tx_mask = tx_mask; | ||||
| +            work->rx_mask = rx_mask; | ||||
| +            INIT_WORK(&work->work, ath12k_thermal_antenna_switch_work); | ||||
| +            schedule_work(&work->work); | ||||
| +             | ||||
| +            ath12k_info(ar->ab, "Radio %d: Temp %d°C, %s → %s antenna (level=%d)\n", | ||||
| +                       ar->pdev_idx, temp, | ||||
| +                       (ar->cfg_tx_chainmask > 0x1) ? "dual" : "single", | ||||
| +                       (tx_mask > 0x1) ? "dual" : "single", | ||||
| +                       curr_level); | ||||
| +        } | ||||
| +    } | ||||
|  } | ||||
|   | ||||
|  static SENSOR_DEVICE_ATTR(temp1_input, 0444, ath12k_thermal_show_temp, | ||||
| @@ -459,6 +506,11 @@ | ||||
|  			param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].priority = 0; | ||||
|  			param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].pout_reduction_db = | ||||
|  				tt_level_configs[ATH12K_ENHANCED_THERMAL_LEVEL][level].pout_reduction_db; | ||||
| + | ||||
| +                        ath12k_info(NULL, "Using low=%d, high=%d; throttle_state=%d\n",  | ||||
| +                                       param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].tmplwm, | ||||
| +                                       param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].tmphwm, | ||||
| +                                       param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].dcoffpercent); | ||||
|  		} | ||||
|  	} else { | ||||
|  		tt_level_configs[ATH12K_DEFAULT_THERMAL_LEVEL][0].dcoffpercent = throttle_state; | ||||
| @@ -494,6 +546,10 @@ | ||||
|  	for (i = 0; i < ab->num_radios; i++) { | ||||
|  		pdev = &ab->pdevs[i]; | ||||
|  		ar = pdev->ar; | ||||
| + | ||||
| +		ar->thermal.default_tx_chainmask = ar->pdev->cap.tx_chain_mask; | ||||
| +        	ar->thermal.default_rx_chainmask = ar->pdev->cap.rx_chain_mask; | ||||
| + | ||||
|  		if (!ar) | ||||
|  			continue; | ||||
|   | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/thermal.h b/drivers/net/wireless/ath/ath12k/thermal.h | ||||
| --- a/drivers/net/wireless/ath/ath12k/thermal.h	2025-06-24 15:49:49.388175103 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/thermal.h	2025-06-24 15:53:27.288704303 +0800 | ||||
| @@ -22,15 +22,15 @@ | ||||
|  #define ATH12K_THERMAL_LVL3_TEMP_HIGH_MARK 120 | ||||
|   | ||||
|  #define ATH12K_THERMAL_LVL0_V2_TEMP_LOW_MARK -100 | ||||
| -#define ATH12K_THERMAL_LVL0_V2_TEMP_HIGH_MARK 95 | ||||
| -#define ATH12K_THERMAL_LVL1_V2_TEMP_LOW_MARK 90 | ||||
| -#define ATH12K_THERMAL_LVL1_V2_TEMP_HIGH_MARK 100 | ||||
| -#define ATH12K_THERMAL_LVL2_V2_TEMP_LOW_MARK 95 | ||||
| -#define ATH12K_THERMAL_LVL2_V2_TEMP_HIGH_MARK 105 | ||||
| -#define ATH12K_THERMAL_LVL3_V2_TEMP_LOW_MARK 100 | ||||
| -#define ATH12K_THERMAL_LVL3_V2_TEMP_HIGH_MARK 110 | ||||
| -#define ATH12K_THERMAL_LVL4_V2_TEMP_LOW_MARK 105 | ||||
| -#define ATH12K_THERMAL_LVL4_V2_TEMP_HIGH_MARK 120 | ||||
| +#define ATH12K_THERMAL_LVL0_V2_TEMP_HIGH_MARK 100 | ||||
| +#define ATH12K_THERMAL_LVL1_V2_TEMP_LOW_MARK 95 | ||||
| +#define ATH12K_THERMAL_LVL1_V2_TEMP_HIGH_MARK 105 | ||||
| +#define ATH12K_THERMAL_LVL2_V2_TEMP_LOW_MARK 100 | ||||
| +#define ATH12K_THERMAL_LVL2_V2_TEMP_HIGH_MARK 115 | ||||
| +#define ATH12K_THERMAL_LVL3_V2_TEMP_LOW_MARK 110 | ||||
| +#define ATH12K_THERMAL_LVL3_V2_TEMP_HIGH_MARK 120 | ||||
| +#define ATH12K_THERMAL_LVL4_V2_TEMP_LOW_MARK 115 | ||||
| +#define ATH12K_THERMAL_LVL4_V2_TEMP_HIGH_MARK 125 | ||||
|   | ||||
|  #define ATH12K_THERMAL_LVL0_DUTY_CYCLE 0 | ||||
|  #define ATH12K_THERMAL_LVL1_DUTY_CYCLE 50 | ||||
| @@ -83,6 +83,16 @@ | ||||
|  	 * protected by data_lock | ||||
|  	 */ | ||||
|  	int temperature; | ||||
| + | ||||
| +	u32 default_tx_chainmask; | ||||
| +    	u32 default_rx_chainmask; | ||||
| +}; | ||||
| + | ||||
| +struct ath12k_thermal_work { | ||||
| +    struct work_struct work; | ||||
| +    struct ath12k *ar; | ||||
| +    u32 tx_mask; | ||||
| +    u32 rx_mask; | ||||
|  }; | ||||
|   | ||||
|  #ifdef CPTCFG_ATH12K_POWER_OPTIMIZATION | ||||
| @@ -0,0 +1,181 @@ | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c | ||||
| --- a/drivers/net/wireless/ath/ath12k/mac.c	2025-06-24 15:49:49.813180049 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/mac.c	2025-06-24 15:50:19.499525336 +0800 | ||||
| @@ -10451,6 +10451,30 @@ | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +int ath12k_mac_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant) | ||||
| +{ | ||||
| +    int ret; | ||||
| +     | ||||
| +    if (!tx_ant || !rx_ant) { | ||||
| +        ath12k_warn(ar->ab, "Invalid chainmask tx=0x%x rx=0x%x\n", tx_ant, rx_ant); | ||||
| +        return -EINVAL; | ||||
| +    } | ||||
| + | ||||
| +    /* return if it is no changed */ | ||||
| +    if (ar->cfg_tx_chainmask == tx_ant && ar->cfg_rx_chainmask == rx_ant) | ||||
| +        return 0; | ||||
| + | ||||
| +    mutex_lock(&ar->conf_mutex); | ||||
| +    ret = __ath12k_set_antenna(ar, tx_ant, rx_ant); | ||||
| +    if (!ret) { | ||||
| +        ar->cfg_tx_chainmask = tx_ant; | ||||
| +        ar->cfg_rx_chainmask = rx_ant; | ||||
| +    } | ||||
| +    mutex_unlock(&ar->conf_mutex); | ||||
| + | ||||
| +    return ret; | ||||
| +} | ||||
| + | ||||
|  static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb) | ||||
|  { | ||||
|  	int num_mgmt = 0; | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/mac.h b/drivers/net/wireless/ath/ath12k/mac.h | ||||
| --- a/drivers/net/wireless/ath/ath12k/mac.h	2025-06-24 15:49:49.719178955 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/mac.h	2025-06-24 15:50:19.500525348 +0800 | ||||
| @@ -168,6 +168,7 @@ | ||||
|   | ||||
|  extern const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default; | ||||
|   | ||||
| +int ath12k_mac_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant); | ||||
|  void ath12k_mac_set_cw_intf_detect(struct ath12k *ar, u8 intf_detect_param); | ||||
|  void ath12k_mac_set_vendor_intf_detect(struct ath12k *ar, u8 intf_detect_bitmap); | ||||
|  void ath12k_mac_ap_ps_recalc(struct ath12k *ar); | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/thermal.c b/drivers/net/wireless/ath/ath12k/thermal.c | ||||
| --- a/drivers/net/wireless/ath/ath12k/thermal.c	2025-06-24 15:49:49.388175103 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/thermal.c	2025-06-24 15:50:19.500525348 +0800 | ||||
| @@ -401,8 +401,25 @@ | ||||
|  	complete(&ar->thermal.wmi_sync); | ||||
|  } | ||||
|   | ||||
| +static void ath12k_thermal_antenna_switch_work(struct work_struct *work) { | ||||
| +    struct ath12k_thermal_work *thermal_work = container_of(work, struct ath12k_thermal_work, work); | ||||
| +    struct ath12k *ar = thermal_work->ar; | ||||
| +    int ret; | ||||
| + | ||||
| +    ret = ath12k_mac_set_antenna(ar, thermal_work->tx_mask, thermal_work->rx_mask); | ||||
| +    if (ret) { | ||||
| +        ath12k_warn(ar->ab, "Radio %d: Failed to set antenna (tx=0x%x rx=0x%x, err=%d)\n", | ||||
| +                   ar->pdev_idx, thermal_work->tx_mask, thermal_work->rx_mask, ret); | ||||
| +    } | ||||
| +    kfree(thermal_work); | ||||
| +} | ||||
| + | ||||
|  void ath12k_thermal_event_throt_level(struct ath12k *ar, int curr_level) | ||||
|  { | ||||
| +	int temp = ar->thermal.temperature; | ||||
| +    	u32 tx_mask, rx_mask; | ||||
| +    	bool need_switch = false; | ||||
| + | ||||
|  	if (test_bit(WMI_TLV_SERVICE_THERM_THROT_POUT_REDUCTION, ar->ab->wmi_ab.svc_map) && | ||||
|  	    curr_level >= ENHANCED_THERMAL_LEVELS) | ||||
|  		return; | ||||
| @@ -416,7 +433,37 @@ | ||||
|  	else | ||||
|  		ar->thermal.throttle_state = | ||||
|  			tt_level_configs[ATH12K_DEFAULT_THERMAL_LEVEL][curr_level].dcoffpercent; | ||||
| -	spin_unlock_bh(&ar->data_lock); | ||||
| +	 | ||||
| +	/* configure ant mode */ | ||||
| +	if (temp >= 110 && ar->cfg_tx_chainmask != 0x1) { | ||||
| +        	tx_mask = 0x1; | ||||
| +        	rx_mask = 0x1; | ||||
| +        	need_switch = true; | ||||
| +    	} else if (temp <= 105 && ar->cfg_tx_chainmask != ar->thermal.default_tx_chainmask) { | ||||
| +        	tx_mask = ar->thermal.default_tx_chainmask; | ||||
| +        	rx_mask = ar->thermal.default_rx_chainmask; | ||||
| +        	need_switch = true; | ||||
| +    	} | ||||
| + | ||||
| +    	spin_unlock_bh(&ar->data_lock); | ||||
| + | ||||
| +    /* set param async*/  | ||||
| +    if (need_switch) { | ||||
| +        struct ath12k_thermal_work *work = kmalloc(sizeof(*work), GFP_ATOMIC); | ||||
| +        if (work) { | ||||
| +            work->ar = ar; | ||||
| +            work->tx_mask = tx_mask; | ||||
| +            work->rx_mask = rx_mask; | ||||
| +            INIT_WORK(&work->work, ath12k_thermal_antenna_switch_work); | ||||
| +            schedule_work(&work->work); | ||||
| +             | ||||
| +            ath12k_info(ar->ab, "Radio %d: Temp %d°C, %s → %s antenna (level=%d)\n", | ||||
| +                       ar->pdev_idx, temp, | ||||
| +                       (ar->cfg_tx_chainmask > 0x1) ? "dual" : "single", | ||||
| +                       (tx_mask > 0x1) ? "dual" : "single", | ||||
| +                       curr_level); | ||||
| +        } | ||||
| +    } | ||||
|  } | ||||
|   | ||||
|  static SENSOR_DEVICE_ATTR(temp1_input, 0444, ath12k_thermal_show_temp, | ||||
| @@ -459,6 +506,11 @@ | ||||
|  			param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].priority = 0; | ||||
|  			param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].pout_reduction_db = | ||||
|  				tt_level_configs[ATH12K_ENHANCED_THERMAL_LEVEL][level].pout_reduction_db; | ||||
| + | ||||
| +                        ath12k_info(NULL, "Using low=%d, high=%d; throttle_state=%d\n",  | ||||
| +                                       param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].tmplwm, | ||||
| +                                       param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].tmphwm, | ||||
| +                                       param.levelconf[ATH12K_ENHANCED_THERMAL_LEVEL][level].dcoffpercent); | ||||
|  		} | ||||
|  	} else { | ||||
|  		tt_level_configs[ATH12K_DEFAULT_THERMAL_LEVEL][0].dcoffpercent = throttle_state; | ||||
| @@ -494,6 +546,10 @@ | ||||
|  	for (i = 0; i < ab->num_radios; i++) { | ||||
|  		pdev = &ab->pdevs[i]; | ||||
|  		ar = pdev->ar; | ||||
| + | ||||
| +		ar->thermal.default_tx_chainmask = ar->pdev->cap.tx_chain_mask; | ||||
| +        	ar->thermal.default_rx_chainmask = ar->pdev->cap.rx_chain_mask; | ||||
| + | ||||
|  		if (!ar) | ||||
|  			continue; | ||||
|   | ||||
| diff -Nur a/drivers/net/wireless/ath/ath12k/thermal.h b/drivers/net/wireless/ath/ath12k/thermal.h | ||||
| --- a/drivers/net/wireless/ath/ath12k/thermal.h	2025-06-24 15:49:49.388175103 +0800 | ||||
| +++ b/drivers/net/wireless/ath/ath12k/thermal.h	2025-06-24 15:53:27.288704303 +0800 | ||||
| @@ -22,15 +22,15 @@ | ||||
|  #define ATH12K_THERMAL_LVL3_TEMP_HIGH_MARK 120 | ||||
|   | ||||
|  #define ATH12K_THERMAL_LVL0_V2_TEMP_LOW_MARK -100 | ||||
| -#define ATH12K_THERMAL_LVL0_V2_TEMP_HIGH_MARK 95 | ||||
| -#define ATH12K_THERMAL_LVL1_V2_TEMP_LOW_MARK 90 | ||||
| -#define ATH12K_THERMAL_LVL1_V2_TEMP_HIGH_MARK 100 | ||||
| -#define ATH12K_THERMAL_LVL2_V2_TEMP_LOW_MARK 95 | ||||
| -#define ATH12K_THERMAL_LVL2_V2_TEMP_HIGH_MARK 105 | ||||
| -#define ATH12K_THERMAL_LVL3_V2_TEMP_LOW_MARK 100 | ||||
| -#define ATH12K_THERMAL_LVL3_V2_TEMP_HIGH_MARK 110 | ||||
| -#define ATH12K_THERMAL_LVL4_V2_TEMP_LOW_MARK 105 | ||||
| -#define ATH12K_THERMAL_LVL4_V2_TEMP_HIGH_MARK 120 | ||||
| +#define ATH12K_THERMAL_LVL0_V2_TEMP_HIGH_MARK 100 | ||||
| +#define ATH12K_THERMAL_LVL1_V2_TEMP_LOW_MARK 95 | ||||
| +#define ATH12K_THERMAL_LVL1_V2_TEMP_HIGH_MARK 105 | ||||
| +#define ATH12K_THERMAL_LVL2_V2_TEMP_LOW_MARK 100 | ||||
| +#define ATH12K_THERMAL_LVL2_V2_TEMP_HIGH_MARK 115 | ||||
| +#define ATH12K_THERMAL_LVL3_V2_TEMP_LOW_MARK 110 | ||||
| +#define ATH12K_THERMAL_LVL3_V2_TEMP_HIGH_MARK 120 | ||||
| +#define ATH12K_THERMAL_LVL4_V2_TEMP_LOW_MARK 115 | ||||
| +#define ATH12K_THERMAL_LVL4_V2_TEMP_HIGH_MARK 125 | ||||
|   | ||||
|  #define ATH12K_THERMAL_LVL0_DUTY_CYCLE 0 | ||||
|  #define ATH12K_THERMAL_LVL1_DUTY_CYCLE 50 | ||||
| @@ -83,6 +83,16 @@ | ||||
|  	 * protected by data_lock | ||||
|  	 */ | ||||
|  	int temperature; | ||||
| + | ||||
| +	u32 default_tx_chainmask; | ||||
| +    	u32 default_rx_chainmask; | ||||
| +}; | ||||
| + | ||||
| +struct ath12k_thermal_work { | ||||
| +    struct work_struct work; | ||||
| +    struct ath12k *ar; | ||||
| +    u32 tx_mask; | ||||
| +    u32 rx_mask; | ||||
|  }; | ||||
|   | ||||
|  #ifdef CPTCFG_ATH12K_POWER_OPTIMIZATION | ||||
| @@ -475,6 +475,22 @@ endef | ||||
|  | ||||
| $(eval $(call KernelPackage,usb-f-qdss)) | ||||
|  | ||||
| define KernelPackage/usb-serial-xr | ||||
|   TITLE:=USB xr Serial driver support | ||||
|   KCONFIG:=CONFIG_USB_SERIAL_XR | ||||
|   FILES:=\ | ||||
|         $(LINUX_DIR)/drivers/usb/serial/xr_serial.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,60,xr_serial) | ||||
|   DEPENDS:=+kmod-usb-serial | ||||
|   $(call AddPlatformDepends/usb) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/usb-serial-xr/description | ||||
|  USB MaxLinear/Exar USB to Serial driver | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,usb-serial-xr)) | ||||
|  | ||||
| LEDS_MENU:=LED modules | ||||
|  | ||||
| define KernelPackage/leds-tlc591xx | ||||
|   | ||||
| @@ -5,12 +5,10 @@ START=09 | ||||
| copy_certificates() { | ||||
| 	[ -f /certificates/key.pem ] || return | ||||
|  | ||||
| 	cp /certificates/*.pem /etc/ucentral/ | ||||
| 	chown root.network /etc/ucentral/*.pem | ||||
| 	chmod 0440 root.network /etc/ucentral/*.pem | ||||
| 	cp /certificates/cert.pem /certificates/key.pem /certificates/operational.* /etc/ucentral/ | ||||
| 	chown root.network /etc/ucentral/*.pem /etc/ucentral/*.ca | ||||
| 	chmod 0440 root.network /etc/ucentral/*.pem /etc/ucentral/*.ca | ||||
| 	[ -f /certificates/gateway.json ] && cp /certificates/gateway.json /etc/ucentral/gateway.flash | ||||
| 	[ -f /certificates/dev-id ] && cp /certificates/dev-id /etc/ucentral/ | ||||
| 	[ -f /etc/ucentral/dev-id ] && chmod 0400 /etc/ucentral/dev-id | ||||
| 	[ -f /certificates/restrictions.json ] && cp /certificates/restrictions.json /etc/ucentral/ | ||||
| 	[ -f /certificates/sign_pubkey.pem ] && cp /certificates/sign_pubkey.pem /etc/ucentral/ | ||||
| 	country=`cat /certificates/ucentral.defaults | jsonfilter -e '@.country'` | ||||
|   | ||||
| @@ -2,5 +2,6 @@ | ||||
|  | ||||
| uci add system certificates | ||||
| uci set system.@certificates[-1].key=/etc/ucentral/key.pem | ||||
| uci set system.@certificates[-1].cert=/etc/ucentral/cert.pem | ||||
| uci set system.@certificates[-1].ca=/etc/ucentral/cas.pem | ||||
| uci set system.@certificates[-1].cert=/etc/ucentral/operational.pem | ||||
| uci set system.@certificates[-1].ca=/etc/ucentral/operational.ca | ||||
| uci commit | ||||
|   | ||||
| @@ -1,25 +1,22 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| check_certificates() { | ||||
| 	[ -f /certificates/cas.pem -a -f /certificates/cert.pem -a -f /certificates/key.pem ] && exit 0 | ||||
| 	[ -f /certificates/cert.pem -a -f /certificates/key.pem ] && exit 0 | ||||
| } | ||||
|  | ||||
| check_certificates | ||||
|  | ||||
| bootconfig_lookup() { | ||||
| 	case "$(fw_printenv -n cert_part)" in | ||||
| 	0)	echo "0:BOOTCONFIG" | ||||
| 		;; | ||||
| 	1)	echo "0:BOOTCONFIG1" | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
|  | ||||
| . /lib/functions.sh | ||||
| mkdir -p /certificates /etc/ucentral/ | ||||
| mtd=$(find_mtd_index certificates) | ||||
|  | ||||
| if [ "$(head -c 4 /dev/mtd$mtd)" == "hsqs" ]; then | ||||
| 	mount -t squashfs /dev/mtdblock$mtd /certificates | ||||
| else | ||||
| 	[ -n "$mtd" -a -f /sys/class/mtd/mtd$mtd/oobsize ] && ubiattach -p /dev/mtd$mtd | ||||
| 	if [ -n "$(ubinfo -a | grep certificates)" ]; then | ||||
| 		[ -e /dev/ubi0 ] && mount -t ubifs ubi0:certificates /certificates | ||||
| 		[ -e /dev/ubi1 ] && mount -t ubifs ubi1:certificates /certificates | ||||
| 	fi | ||||
| fi | ||||
|  | ||||
| case "$(board_name)" in | ||||
| cig,wf660a) | ||||
| 	mmc_dev=$(echo $(find_mmc_part "0:ETHPHYFW") | sed 's/^.\{5\}//') | ||||
| @@ -31,8 +28,28 @@ cig,wf672) | ||||
| 	;; | ||||
| sonicfi,rap7110c-341x) | ||||
| 	mmc_dev=$(echo $(find_mmc_part "certificates") | sed 's/^.\{5\}//') | ||||
| 	[ -n "$mmc_dev" ] && mount -t squashfs /dev/$mmc_dev /certificates | ||||
| 	[ -n "$mmc_dev" ] && mount -t squashfs /dev/$mmc_dev /mnt | ||||
| 	bootconfig=$(bootconfig_lookup) | ||||
| 	if [ -n "$bootconfig" ]; then | ||||
| 		mmc_dev=$(echo $(find_mmc_part "$bootconfig") | sed 's/^.\{5\}//') | ||||
| 		[ -n "$mmc_dev" ] && tar xf /dev/$mmc_dev -C /certificates | ||||
| 	else | ||||
| 		cp /mnt/* /certificates/ | ||||
| 		umount /mnt | ||||
| 	fi | ||||
| 	;; | ||||
| *) | ||||
| 	mtd=$(find_mtd_index certificates) | ||||
|  | ||||
| 	if [ "$(head -c 4 /dev/mtd$mtd)" == "hsqs" ]; then | ||||
| 		mount -t squashfs /dev/mtdblock$mtd /certificates | ||||
| 	else | ||||
| 		[ -n "$mtd" -a -f /sys/class/mtd/mtd$mtd/oobsize ] && ubiattach -p /dev/mtd$mtd | ||||
| 		if [ -n "$(ubinfo -a | grep certificates)" ]; then | ||||
| 			[ -e /dev/ubi0 ] && mount -t ubifs ubi0:certificates /certificates | ||||
| 			[ -e /dev/ubi1 ] && mount -t ubifs ubi1:certificates /certificates | ||||
| 		fi | ||||
| 	fi | ||||
| esac | ||||
|  | ||||
| check_certificates | ||||
| @@ -88,8 +105,10 @@ cig,wf189h|\ | ||||
| cig,wf186h|\ | ||||
| cig,wf196|\ | ||||
| cig,wf188n|\ | ||||
| emplus,wap380c|\ | ||||
| emplus,wap385c|\ | ||||
| emplus,wap386v2|\ | ||||
| emplus,wap581|\ | ||||
| yuncore,ax840|\ | ||||
| yuncore,fap655) | ||||
| 	PART_NAME=rootfs_1 | ||||
|   | ||||
							
								
								
									
										25
									
								
								feeds/tip/certificates/files/usr/bin/store_certs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								feeds/tip/certificates/files/usr/bin/store_certs
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| bootconfig_lookup() { | ||||
| 	bootconfig="$(fw_printenv -n cert_part)" | ||||
| 	case "$(fw_printenv -n cert_part)" in | ||||
| 	0)	echo "0:BOOTCONFIG1" | ||||
| 		bootconfig=1 | ||||
| 		;; | ||||
| 	*)	echo "0:BOOTCONFIG" | ||||
| 		bootconfig=0 | ||||
| 		;; | ||||
| 	esac | ||||
| 	fw_setenv cert_part $bootconfig | ||||
| } | ||||
|  | ||||
| . /lib/functions.sh | ||||
| case "$(board_name)" in | ||||
| sonicfi,rap7110c-341x) | ||||
| 	cd /certificates | ||||
| 	tar cf /tmp/certs.tar | ||||
| 	bootconfig=$(bootconfig_lookup) | ||||
| 	mmc_dev=$(echo $(find_mmc_part $bootconfig) | sed 's/^.\{5\}//') | ||||
| 	dd if=/tmp/certs.tar of=/dev/$bootconfig | ||||
| 	;; | ||||
| esac | ||||
| @@ -12,6 +12,7 @@ define Package/cloud_discovery | ||||
|   SECTION:=ucentral | ||||
|   CATEGORY:=uCentral | ||||
|   TITLE:=TIP cloud_discovery | ||||
|   DEPENDS:=+certificates | ||||
| endef | ||||
|  | ||||
| Build/Compile= | ||||
|   | ||||
| @@ -22,13 +22,6 @@ start_service() { | ||||
| 	[ "$valid" == "true" ] ||  | ||||
| 		/usr/share/ucentral/ucentral.uc /etc/ucentral/ucentral.cfg.0000000001 > /dev/null | ||||
|  | ||||
| 	[ "$(fw_printenv -n pki2)" -eq 1 ] || { | ||||
| 		/etc/init.d/cloud_discover disable | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	/etc/init.d/firstcontact disable | ||||
|  | ||||
| 	procd_open_instance | ||||
| 	procd_set_param command "$PROG" | ||||
| 	procd_set_param respawn | ||||
|   | ||||
| @@ -80,7 +80,7 @@ function gateway_write(data) { | ||||
| 	gateway ??= {}; | ||||
| 	let new = {}; | ||||
| 	let changed = false; | ||||
| 	for (let key in [ 'server', 'port', 'valid' ]) { | ||||
| 	for (let key in [ 'server', 'port', 'valid', 'hostname_validate' ]) { | ||||
| 		if (exists(data, key)) | ||||
| 			new[key] = data[key]; | ||||
| 		else if (exists(gateway, key)) | ||||
| @@ -144,7 +144,7 @@ function set_state(set) { | ||||
| function discover_dhcp() { | ||||
| 	let dhcp = readjsonfile('/tmp/cloud.json'); | ||||
| 	if (dhcp?.dhcp_server && dhcp?.dhcp_port) { | ||||
| 		if (gateway_write({ server: dhcp.dhcp_server, port:dhcp.dhcp_port, valid: false })) { | ||||
| 		if (gateway_write({ server: dhcp.dhcp_server, port:dhcp.dhcp_port, valid: false, hostname_validate: dhcp.no_validation ? 0 : 1 })) { | ||||
| 			ulog(LOG_INFO, `Discovered cloud via DHCP ${dhcp.dhcp_server}:${dhcp.dhcp_port}\n`); | ||||
| 			client_start(); | ||||
| 			set_state(VALIDATING); | ||||
| @@ -160,27 +160,30 @@ function redirector_lookup() { | ||||
| 	let serial = uci.get('system', '@system[-1]', 'mac'); | ||||
|  | ||||
| 	fs.unlink(path); | ||||
| 	system(`curl -k --cert /etc/ucentral/cert.pem --key /etc/ucentral/key.pem --cacert /etc/ucentral/cas.pem https://openlan.keys.tip.build/v1/devices/${serial} --output /tmp/ucentral.redirector`); | ||||
| 	system(`curl -k --cert /etc/ucentral/operational.pem --key /etc/ucentral/key.pem --cacert /etc/ucentral/operational.ca https://openlan.keys.tip.build/v1/devices/${serial} --output /tmp/ucentral.redirector`); | ||||
| 	if (!fs.stat(path)) | ||||
| 		return; | ||||
| 	let redir = readjsonfile(path); | ||||
| 	if (redir?.controller_endpoint) { | ||||
| 		let controller_endpoint = split(redir.controller_endpoint, ':'); | ||||
| 		if (gateway_write({ server: controller_endpoint[0], port: controller_endpoint[1] || 15002, valid: false })) { | ||||
| 			ulog(LOG_INFO, `Discovered cloud via lookup service ${redir.server}:${redir.port}\n`); | ||||
| 		if (gateway_write({ server: controller_endpoint[0], port: controller_endpoint[1] || 15002, valid: false, hostname_validate: 1 })) { | ||||
| 			ulog(LOG_INFO, `Discovered cloud via lookup service ${controller_endpoint[0]}:${controller_endpoint[1] || 15002}\n`); | ||||
|                         client_start(); | ||||
|                 	set_state(VALIDATING); | ||||
| 		} | ||||
| 	} else { | ||||
| 		ulog(LOG_INFO, 'Failed to discover cloud endpoint\n'); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function discover_flash() { | ||||
| 	if (!fs.stat('/etc/ucentral/gateway.flash')) | ||||
| 		return false; | ||||
| 		return 1; | ||||
| 	ulog(LOG_INFO, 'Using pre-populated cloud information\n'); | ||||
| 	fs.writefile('/etc/ucentral/gateway.json', fs.readfile('/etc/ucentral/gateway.flash')); | ||||
| 	client_start(); | ||||
| 	set_state(VALIDATING); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| function time_is_valid() { | ||||
| @@ -210,7 +213,10 @@ function interval_handler() { | ||||
| 		if (discover_dhcp()) | ||||
| 			return; | ||||
|  | ||||
| 		if (discover_flash()) | ||||
| 		if (system('/usr/bin/est_client enroll')) | ||||
| 			return; | ||||
|  | ||||
| 		if (!discover_flash()) | ||||
| 			return; | ||||
|  | ||||
| 		redirector_lookup(); | ||||
| @@ -287,6 +293,25 @@ let ubus_methods = { | ||||
|  | ||||
| 		} | ||||
| 	}, | ||||
| 	status: { | ||||
| 		call: function(req) { | ||||
| 			const names = [ 'discover', 'validate', 'online', 'offline', 'orphan' ]; | ||||
| 			let ret = { state: names[state] }; | ||||
| 			switch(state){ | ||||
| 			case OFFLINE: | ||||
| 				ret.since = time() - offline_time; | ||||
| 				break; | ||||
| 			case ORPHAN: | ||||
| 				ret.since = time() - orphan_time; | ||||
| 				break; | ||||
| 			case VALIDATING: | ||||
| 				ret.since = time() - validate_time;; | ||||
| 				break; | ||||
| 			} | ||||
| 			return ret; | ||||
| 		}, | ||||
| 		args: {}, | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| if (gateway_available()) { | ||||
|   | ||||
							
								
								
									
										172
									
								
								feeds/tip/cloud_discovery/files/usr/bin/est_client
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										172
									
								
								feeds/tip/cloud_discovery/files/usr/bin/est_client
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,172 @@ | ||||
| #!/usr/bin/ucode | ||||
|  | ||||
| 'use strict'; | ||||
|  | ||||
| import { ulog_open, ulog, ULOG_SYSLOG, ULOG_STDIO, LOG_DAEMON, LOG_INFO } from 'log'; | ||||
| import * as fs from 'fs'; | ||||
|  | ||||
|  | ||||
| ulog_open(ULOG_SYSLOG | ULOG_STDIO, LOG_DAEMON, "est_client"); | ||||
|  | ||||
| function generate_csr(cert) { | ||||
| 	if (!fs.stat('/tmp/csr.nohdr.p10')) { | ||||
| 		let pipe = fs.popen(`openssl x509 -in ${cert} -noout -subject`); | ||||
| 		let subject = pipe.read("all"); | ||||
| 		pipe.close(); | ||||
| 		subject = rtrim(subject); | ||||
| 		subject = replace(subject, 'subject=', '/'); | ||||
| 		subject = replace(subject, ' = ', '='); | ||||
| 		subject = replace(subject, ', ', '/'); | ||||
|  | ||||
| 		let ret = system(`openssl req -subj "${subject}" -new -key /etc/ucentral/key.pem -out /tmp/csr.p10`); | ||||
| 		if (ret) { | ||||
| 			ulog(LOG_INFO, 'Failed to generate CSR\n'); | ||||
| 			return 1; | ||||
| 		} | ||||
|  | ||||
| 		let input = fs.open('/tmp/csr.p10', 'r'); | ||||
| 		let output = fs.open('/tmp/csr.nohdr.p10', 'w'); | ||||
| 		let line; | ||||
| 		while (line = input.read('line')) { | ||||
| 		        if (substr(line, 0, 4) == '----') | ||||
| 		                continue; | ||||
| 			output.write(line); | ||||
| 		} | ||||
| 		input.close(); | ||||
| 		output.close(); | ||||
| 		ulog(LOG_INFO, 'Generated CSR\n'); | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| function store_operational_cert(path, target) { | ||||
| 	system('mount_certs'); | ||||
| 	system(`cp ${path} /certificates/${target}`); | ||||
| 	system('store_certs'); | ||||
|  | ||||
| 	ulog(LOG_INFO, `Persistently stored ${target}\n`); | ||||
| } | ||||
|  | ||||
| function p7_too_pem(src, dst) { | ||||
| 	let input = fs.readfile(src); | ||||
| 	let output = fs.open('/tmp/convert.p7', 'w'); | ||||
| 	output.write('-----BEGIN PKCS #7 SIGNED DATA-----\n'); | ||||
| 	output.write(`${input}\n-----END PKCS #7 SIGNED DATA-----`); | ||||
| 	output.close(); | ||||
|  | ||||
| 	let ret = system(`openssl pkcs7 -outform PEM -print_certs -in /tmp/convert.p7 -out ${dst}`); | ||||
| 	if (ret) { | ||||
| 		ulog(LOG_INFO, 'Failed to convert P7 to PEM\n'); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	 | ||||
| 	ulog(LOG_INFO, 'Converted P7 to PEM\n'); | ||||
| 	 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| function call_est_server(path, cert, target) { | ||||
| 	if (generate_csr(cert)) | ||||
| 		return 1; | ||||
|  | ||||
| 	let ret = system('curl -X POST https://qaest.certificates.open-lan.org:8001/.well-known/est/' + path + ' -d @/tmp/csr.nohdr.p10 -H "Content-Type: application/pkcs10" --cert ' + cert + ' --key /etc/ucentral/key.pem --cacert /etc/ucentral/insta.pem -o /tmp/operational.nohdr.p7'); | ||||
| 	if (ret) { | ||||
| 		ulog(LOG_INFO, 'Failed to request operational certificate\n'); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	ulog(LOG_INFO, 'EST succeeded\n'); | ||||
|  | ||||
| 	return p7_too_pem('/tmp/operational.nohdr.p7', target); | ||||
| } | ||||
|  | ||||
|  | ||||
| function simpleenroll() { | ||||
| 	if (fs.stat('/etc/ucentral/operational.pem')) { | ||||
| 		ulog(LOG_INFO, 'Operational certificate is present\n'); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (call_est_server('simpleenroll', '/etc/ucentral/cert.pem', '/etc/ucentral/operational.pem')) | ||||
| 		return 1;  | ||||
| 	 | ||||
| 	ulog(LOG_INFO, 'Operational cert acquired\n'); | ||||
| 	store_operational_cert('/etc/ucentral/operational.pem', 'operational.pem'); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| function simplereenroll() { | ||||
| 	if (!fs.stat('/etc/ucentral/operational.pem')) { | ||||
| 		ulog(LOG_INFO, 'Operational certificate was not found\n'); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (call_est_server('simplereenroll', '/etc/ucentral/operational.pem', '/tmp/operational.pem')) | ||||
| 		return 1; | ||||
| 	 | ||||
| 	ulog(LOG_INFO, 'Operational cert updated\n'); | ||||
| 	store_operational_cert('/tmp/operational.pem', 'operational.pem'); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| function load_operational_ca() { | ||||
| 	if (fs.stat('/etc/ucentral/operational.ca')) { | ||||
| 		ulog(LOG_INFO, 'Operational CA is present\n'); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	let ret = system('curl -X GET https://qaest.certificates.open-lan.org:8001/.well-known/est/cacerts --cert /etc/ucentral/operational.pem --key /etc/ucentral/key.pem --cacert /etc/ucentral/insta.pem -o /tmp/operational.ca.nohdr.p7'); | ||||
| 	if (!ret) | ||||
| 		ret = p7_too_pem('/tmp/operational.ca.nohdr.p7', '/etc/ucentral/operational.ca'); | ||||
| 	if (ret) { | ||||
| 		ulog(LOG_INFO, 'Failed to load CA\n'); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	system('cat /etc/ucentral/openlan.pem >> /etc/ucentral/operational.ca'); | ||||
| 	ulog(LOG_INFO, 'Acquired CA\n'); | ||||
| 	store_operational_cert('/etc/ucentral/operational.ca', 'operational.ca'); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| function fwtool() { | ||||
| 	let pipe = fs.popen(`openssl x509 -in /etc/ucentral/cert.pem -noout -issuer`); | ||||
| 	let issuer = pipe.read("all"); | ||||
| 	pipe.close(); | ||||
|  | ||||
| 	if (!(match(issuer, /OpenLAN/) && match(issuer, /Birth CA/))) | ||||
| 		return 0; | ||||
|  | ||||
| 	ulog(LOG_INFO, 'The issuer is insta\n'); | ||||
|  | ||||
| 	let metadata = fs.readfile('/tmp/sysupgrade.meta'); | ||||
| 	if (metadata) | ||||
| 		metadata = json(metadata); | ||||
| 	if (!metadata) | ||||
| 		return 0; | ||||
|  | ||||
| 	if (!metadata.est_supported) { | ||||
| 		ulog(LOG_INFO, 'The image does not support EST\n'); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	ulog(LOG_INFO, 'The image supports EST\n'); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| switch(ARGV[0]) { | ||||
| case 'enroll': | ||||
| 	if (simpleenroll()) | ||||
| 		exit(1); | ||||
|  | ||||
| 	if (load_operational_ca()) | ||||
| 		exit(1); | ||||
|  | ||||
| 	exit(0); | ||||
|  | ||||
| case 'reenroll': | ||||
| 	if (simplereenroll()) | ||||
| 		exit(1); | ||||
| 	exit(0); | ||||
|  | ||||
| case 'fwtool': | ||||
| 	exit(fwtool()); | ||||
| } | ||||
| @@ -5,6 +5,7 @@ import * as fs from 'fs'; | ||||
|  | ||||
| let cmd = ARGV[0]; | ||||
| let ifname = getenv("interface"); | ||||
| let opt224 = getenv("opt138"); | ||||
| let opt224 = getenv("opt224"); | ||||
|  | ||||
| if (cmd != 'bound' && cmd != 'renew') | ||||
| @@ -21,6 +22,13 @@ if (file.server && file.port && file.valid) | ||||
| let cloud = { | ||||
| 	lease: true, | ||||
| }; | ||||
| if (opt138) { | ||||
| 	let dhcp = hexdec(opt138); | ||||
| 	dhcp = split(dhcp, ':'); | ||||
| 	cloud.dhcp_server = dhcp[0]; | ||||
| 	cloud.dhcp_port = dhcp[1] ?? 15002; | ||||
| 	cloud.no_validation = true; | ||||
| } | ||||
| if (opt224) { | ||||
| 	let dhcp = hexdec(opt224); | ||||
| 	dhcp = split(dhcp, ':'); | ||||
| @@ -29,7 +37,7 @@ if (opt224) { | ||||
| } | ||||
| fs.writefile('/tmp/cloud.json', cloud); | ||||
|  | ||||
| if (opt224 && cmd == 'renew') { | ||||
| if ((opt138 || opt224) && cmd == 'renew') { | ||||
| 	let ubus = libubus.connect(); | ||||
| 	ubus.call('cloud', 'renew'); | ||||
| } | ||||
|   | ||||
| @@ -1,25 +0,0 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=firstcontact | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_LICENSE:=BSD-3-Clause | ||||
| PKG_MAINTAINER:=John Crispin <john@phrozen.org> | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
| include $(INCLUDE_DIR)/cmake.mk | ||||
|  | ||||
| define Package/firstcontact | ||||
|   SECTION:=ucentral | ||||
|   CATEGORY:=uCentral | ||||
|   TITLE:=TIP DigiCert firstcontact | ||||
|   DEPENDS:=+libubox +libcurl +libopenssl +certificates | ||||
| endef | ||||
|  | ||||
| define Package/firstcontact/install | ||||
| 	$(INSTALL_DIR) $(1)/usr/sbin | ||||
| 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/digicert $(1)/usr/sbin/ | ||||
| 	$(CP) ./files/* $(1) | ||||
| endef | ||||
|  | ||||
| $(eval $(call BuildPackage,firstcontact)) | ||||
| @@ -1,12 +0,0 @@ | ||||
| #!/bin/sh /etc/rc.common | ||||
|  | ||||
| START=99 | ||||
| USE_PROCD=1 | ||||
| PROG=/usr/bin/ucode | ||||
|  | ||||
| start_service() { | ||||
| 	procd_open_instance | ||||
| 	procd_set_param command "$PROG" -l uci -l fs /usr/share/ucentral/firstcontact.uc | ||||
| 	procd_set_param respawn 1 10 0 | ||||
| 	procd_close_instance | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| #!/bin/sh | ||||
| [ -f "/etc/ucentral/gateway.json" ] && /etc/init.d/firstcontact disable | ||||
| [ -f "/etc/ucentral/gateway.json" ] || /etc/init.d/ucentral disable | ||||
| @@ -1,83 +0,0 @@ | ||||
| let config = {}; | ||||
|  | ||||
| function store_config() { | ||||
| 	let redir = split(config.Redirector, ":"); | ||||
| 	let gw = { | ||||
| 		server: redir[0], | ||||
| 		port: redir[1] || 15002 | ||||
| 	}; | ||||
| 	fs.writefile('/etc/ucentral/gateway.json', gw); | ||||
| } | ||||
|  | ||||
| function store_config_uci(path) { | ||||
|         let cursor = uci.cursor(path); | ||||
|         let redir = split(config.Redirector, ":"); | ||||
|  | ||||
|         cursor.load("ucentral"); | ||||
|         cursor.set("ucentral", "config", "server", redir[0]); | ||||
|         cursor.set("ucentral", "config", "port", redir[1] || 15002); | ||||
|         cursor.commit(); | ||||
| } | ||||
|  | ||||
| function digicert() { | ||||
| 	let devid; | ||||
| 	let fd = fs.open("/etc/ucentral/dev-id", "r"); | ||||
| 	if (!fd) { | ||||
| 		warn("firstcontact: failed to find device id"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	devid = fd.read("all"); | ||||
| 	fd.close(); | ||||
|  | ||||
| 	ret = system(sprintf('/usr/sbin/digicert -i %s', devid)); | ||||
| 	if (ret) { | ||||
| 		warn("firstcontact failed to contact redirector, check DHCP option\n"); | ||||
| 		let fd = fs.open("/tmp/capwap/dhcp_opt.txt", "r"); | ||||
| 		if (!fd) { | ||||
| 			warn("No redirector found\n"); | ||||
| 			exit(1); | ||||
| 		} else { | ||||
| 			config.Redirector = fd.read("all"); | ||||
| 			fd.close(); | ||||
| 		} | ||||
| 	} else { | ||||
| 		let redirector = { }; | ||||
| 		let fd = fs.open("/etc/ucentral/redirector.json", "r"); | ||||
| 		if (fd) { | ||||
| 			let data = fd.read("all"); | ||||
| 			fd.close(); | ||||
|  | ||||
| 			try { | ||||
| 				redirector = json(data); | ||||
| 			} | ||||
| 			catch (e) { | ||||
| 				warn("firstcontact: Unable to parse JSON data in %s: %s", path, e); | ||||
|  | ||||
| 				exit(1); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		for (let r in redirector.fields) | ||||
| 			if (r.name && r.value) | ||||
| 				config[r.name] = r.value; | ||||
| 		if (!config.Redirector) { | ||||
| 			warn("Reply is missing Redirector field\n"); | ||||
| 			exit(1); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| if (!fs.stat('/etc/ucentral/gateway.json')) { | ||||
| 	digicert(); | ||||
| 	store_config(); | ||||
| 	store_config_uci(); | ||||
| 	store_config_uci("/etc/config-shadow/"); | ||||
| 	warn("firstcontact: managed to look up redirector\n"); | ||||
| } | ||||
|  | ||||
| system("/etc/init.d/ucentral enable"); | ||||
| system("/etc/init.d/firstcontact disable"); | ||||
| system("reload_config"); | ||||
| system("/etc/init.d/ucentral start"); | ||||
| system("/etc/init.d/firstcontact stop"); | ||||
| @@ -1,13 +0,0 @@ | ||||
| cmake_minimum_required(VERSION 2.6) | ||||
|  | ||||
| PROJECT(digicert C) | ||||
| INCLUDE(GNUInstallDirs) | ||||
| ADD_DEFINITIONS(-Os -ggdb -Wall -Werror --std=gnu99 -Wmissing-declarations) | ||||
|  | ||||
| SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") | ||||
|  | ||||
| ADD_EXECUTABLE(digicert digicert.c) | ||||
| TARGET_LINK_LIBRARIES(digicert curl crypto ssl ubox) | ||||
| INSTALL(TARGETS digicert | ||||
| 	RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR} | ||||
| ) | ||||
| @@ -1,104 +0,0 @@ | ||||
| #define _GNU_SOURCE | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <getopt.h> | ||||
|  | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| #include <libubox/ulog.h> | ||||
|  | ||||
| static const char *file_cert = "/etc/ucentral/cert.pem"; | ||||
| static const char *file_key  = "/etc/ucentral/key.pem"; | ||||
| static const char *file_json = "/etc/ucentral/redirector.json"; | ||||
| static const char *file_dbg  = "/tmp/digicert.hdr"; | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
| 	FILE *fp_json; | ||||
| 	FILE *fp_dbg; | ||||
| 	CURLcode res; | ||||
| 	CURL *curl; | ||||
| 	char *devid = NULL; | ||||
| 	char *url; | ||||
|  | ||||
| 	alarm(15); | ||||
|  | ||||
| 	while (1) { | ||||
| 		int option = getopt(argc, argv, "k:c:o:hi:"); | ||||
|  | ||||
| 		if (option == -1) | ||||
| 			break; | ||||
|  | ||||
| 		switch (option) { | ||||
| 		case 'k': | ||||
| 			file_key = optarg; | ||||
| 			break; | ||||
| 		case 'c': | ||||
| 			file_cert = optarg; | ||||
| 			break; | ||||
| 		case 'o': | ||||
| 			file_json = optarg; | ||||
| 			break; | ||||
| 		case 'i': | ||||
| 			devid = optarg; | ||||
| 			break; | ||||
| 		default: | ||||
| 		case 'h': | ||||
| 			printf("Usage: digicert OPTIONS\n" | ||||
| 			       "  -k <keyfile>\n" | ||||
| 			       "  -c <certfile>\n" | ||||
| 			       "  -o <outfile>\n" | ||||
| 			       "  -i <devid>\n"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (!devid) { | ||||
| 		fprintf(stderr, "missing devid\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	ulog_open(ULOG_SYSLOG | ULOG_STDIO, LOG_DAEMON, "digicert"); | ||||
| 	ULOG_INFO("attempting first contact\n"); | ||||
|  | ||||
| 	fp_dbg = fopen(file_dbg, "wb"); | ||||
| 	fp_json = fopen(file_json, "wb"); | ||||
| 	if (!fp_json) { | ||||
| 		ULOG_ERR("failed to create %s\n", file_json); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	curl_global_init(CURL_GLOBAL_DEFAULT); | ||||
| 	curl = curl_easy_init(); | ||||
| 	if (!curl) { | ||||
| 		ULOG_ERR("curl_easy_init failed\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (asprintf(&url, "https://clientauth.one.digicert.com/iot/api/v2/device/%s", devid) < 0) { | ||||
| 		ULOG_ERR("failed to assemble url\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	curl_easy_setopt(curl, CURLOPT_URL, url); | ||||
| 	curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp_json); | ||||
| 	curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp_dbg); | ||||
| 	curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM"); | ||||
| 	curl_easy_setopt(curl, CURLOPT_SSLCERT, file_cert); | ||||
| 	curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM"); | ||||
| 	curl_easy_setopt(curl, CURLOPT_SSLKEY, file_key); | ||||
| 	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); | ||||
| 	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L); | ||||
|  | ||||
| 	res = curl_easy_perform(curl); | ||||
| 	if (res != CURLE_OK) | ||||
| 		ULOG_ERR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); | ||||
| 	else | ||||
| 		ULOG_INFO("downloaded first contact data\n"); | ||||
| 	curl_easy_cleanup(curl); | ||||
| 	curl_global_cleanup(); | ||||
|  | ||||
| 	ulog_close(); | ||||
|  | ||||
| 	return (res != CURLE_OK); | ||||
| } | ||||
| @@ -17,14 +17,16 @@ mkdir -p /tmp/certs | ||||
| tar x -C /tmp/certs -f /tmp/certs.tar | ||||
|  | ||||
| # make sure the required files exist | ||||
| [ -f /tmp/certs/cas.pem -a -f /tmp/certs/key.pem -a -f /tmp/certs/cert.pem ] || exit 1 | ||||
| [ -f /tmp/certs/gateway.json -o -f /tmp/certs/dev-id ] || exit 1 | ||||
| [ -f /tmp/certs/key.pem -a -f /tmp/certs/cert.pem ] || exit 1 | ||||
|  | ||||
| # copy the certificates to /etc | ||||
| cp /tmp/certs/*.pem /certificates | ||||
|  | ||||
| # remove old operational certs | ||||
| rm /certificates/operational.* | ||||
|  | ||||
| # copy dev-id or gateway.json | ||||
| for a in dev-id gateway.json; do | ||||
| for a in gateway.json; do | ||||
| 	if [ -f /tmp/certs/$a ]; then | ||||
| 		cp /tmp/certs/$a /certificates | ||||
| 	else | ||||
|   | ||||
							
								
								
									
										6
									
								
								feeds/tip/tip-defaults/files/etc/ucentral/insta.pem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								feeds/tip/tip-defaults/files/etc/ucentral/insta.pem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIFajCCA1KgAwIBAgICDnowDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUT3BlbkxBTiBEZW1vIFJvb3QgQ0EwHhcNMjUwMjIxMTUwMDAwWhcNMjYwMjIxMTUwMDAwWjAgMR4wHAYDVQQDExVPcGVuTEFOIERlbW8gQmlydGggQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVWIyySul6Fv4wl1O+DQpaLRa0p+Az5L/jcqTpdVf6w+8tlmeIY9C28uDQoDjewrIkvf3lcfK86nshs02s9ehqZUnEP8+GvKM19x3JbWxeTvWwFirjHir4x897iQ606bAMbrHHtntI9ZyBZyXDGeElGJxJQNX+0d50SFq609cB3yxpBPJ67ag+4Oq0uHgROHjEQMrfwLwlAune0c1fjQDrN14PDNjMZHvvhc/pkAHxR1PP6LOFNV5NuQ58tC5N7R2EqqFbIJ8VZgcagrGRYuAuFFTaV+D7RIt9xGTuWlCyxHI7VkRBJ1mRoEr4GOrP9QFjBD8NzNK+/wnR/fZwhpEnRsgHiI33wKHBDg+l3r8tvRzuB5X6Gl/SfuAeaoCuDHMncTjQg1zGhyEwjQhUe4RY3w+yHAjeeOE6c5spOMDDdaBibkzLmSjXztuLeAdzsUcD3fvGeOvh9vG14TKEmF8puNkqEcc0W8NyUWKFdr9umdJEMbaRSSsMGtp8bDj3Ddh4PhEJrIFeo89+HwXhU6sk+wzE9BULTohahsfwOV/08t1cZ3Q04Oj1KI+4YWu8BJns5gX35rQ8GIbkXQwfvFMwqmbg+ij2o9HWdkSL4bcqW/83Ho+31ce210rVGPK9cav0CjA2Eexgxi45cbgnfoade74Qa5zXboJEBmp7rbo4swIDAQABo4GuMIGrMB8GA1UdIwQYMBaAFDzIg8eyTI3xc4A2R60f8HanhBZDMB0GA1UdDgQWBBS5xC3inqLQl+vxzn9PsjNzlZ5hYDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vZGVtby5jZXJ0aWZpY2F0ZS5maS9jcmwvT3BlbkxBTkRlbW9Sb290Q0EuY3JsMA0GCSqGSIb3DQEBCwUAA4ICAQA9DJEjsDLqtSFkF0XTWfzbebXA+X8++Qmiukrw0s2LRx798ce0mVITRAFDLf78BeUYF0B+PQ8hgq4fWyFsXRgZVrITd1BszT3LJ2r/6xWQJVpVHzLqKgIlW/PY/uTUz+xqR0Ev6hYrmrjfya0K0XEZZqxkmrTrcECaA3RCFkWQl9ZUlb9BClmdhayO8x1XpJplIYAMKVuoPL9IUQH6HUPFnzlPNQHIK9gcFACtgPVWCJg3IAvSLa41KpRxTDwGFvlrNKtkBlGRYhFGCHWXXZn8fdQHW9vykkkfPOaPR/AVyuRzfAT6wbtVWSy38BurSdqSCuNQPQBfF2vMeUGwNbD/7B4tYrWVtnIbgxRPKvX0o3mZkKry6BJf2m/AKWA16W+i4ojnPRORLTTq9cEZ0WL6NRHCgMrbWaCs/+ADTErqK6cv7GhoOVEiqugvnz93dit2IXg4zdDJ4hF9ZSlicwgZKVvMqnNQ1iiXezIQBehgYcWwXRIfdrRPe88HgkySuDZ2lkKYdc+oTc6e7upRh4Kh2ZSipcRb6ehPan533jnQJyU8A9vFAJiQfZZ4lD3tcsqlsDnlu5YEDYSjcfnkyOH/Mlx5VVTWYGvqNNVKRDw2slSxKwVCobkcF/2dAxP9DqOaGaCnMeOaR7kMaBm5d1fwb+bCl9usQAELjZBv2vAH8g== | ||||
| -----END CERTIFICATE----- | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIFIDCCAwigAwIBAgICDnkwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUT3BlbkxBTiBEZW1vIFJvb3QgQ0EwHhcNMjUwMjIxMTUwMDAwWhcNMjYwMjIxMTUwMDAwWjAfMR0wGwYDVQQDDBRPcGVuTEFOIERlbW8gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMjExylKdJWoJu9mOHPJ6yZFXKe1lE467G65acpS2FKIWnPVFjNCmATMpkMOIFzEFwyFdbQjzOidtiL+73zlE52lOJpXCfOcxDFqDYDJJ8//J1/gQWsBaKpSvgLiHU/0awkQg+yJYZpj8YZa4NkFe+zTjQScSfOsqPPb3rZ7DOQ2BKAhjVShKmVbtNil0iO0zm8vE8DNkktTNMREp2pzb8MbCAgfOkwlrby6T+rV3TvmjThGdFUb5lWDFxWtlF8W0SUII9qj7p5TdGpryeLsO0nZTBtS4HxZNdvmKOHfgcRHmSZIJigB2NzKLNrXF9JBW0WnUSwZJZAG2C1RTx6lADILPueuusyfR/hZ3koKi4PHnSiTwQghzia9K9QjNHq5z9R9ZoCnhBg1VyU4LKmp862L0sIp2vgnOYunEIi9aCYBaDwo+0FuVjZuXyDIatwVuA7TN5IWPHA6XLdOt1mmkeYy1Ldr4XHjdondhtOyeei1UFXmyyLm2+kmRYfTm91TqYmNzRgbRV2NHO50AmsnBknX4Rv3gishGe0+dV5yFcUwZud0z2rSCkuoai5tKrPT+6Y6NqkT9u9HFifIBXnLwEzVUqHRtW6SuWj2DClVQIXIUZtFnhY4GuTuf6DlzgnXO58oDVCZmCW4ULIpbqGeRsvBHR8Sw5JXP/1+TMUYhE8TAgMBAAGjZjBkMB8GA1UdIwQYMBaAFDzIg8eyTI3xc4A2R60f8HanhBZDMB0GA1UdDgQWBBQ8yIPHskyN8XOANketH/B2p4QWQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATANBgkqhkiG9w0BAQsFAAOCAgEAkHZ5KR8IOrdfMFy+iOvauvZxfQ84LL6TpB2FQKDjneJUdd7c29UJJFNW/0mp4Gc6jKZab6J8Dx/pNnbH0RqFjGjeRGtJ4Sk0G7gf9zw1S7qut5WJDcisM9l/wXC+zy/KSKKPQmbt0grWOtU7+NNPh1YU76hIrInq/u2sVZyKH8SXQ957fbJk6BX6JTKyNEn05AB6rNSrbOWo8sy2MlcJ7bBsrWYI1t6GcWFh4b36bLu7/dKJWpyFNXXIkKJsgMEDpEQae56+fSSDo0KRNtYB82fNZDIQlGK81rGJWNzAahM+3GD1tgk/3ZVugfaJhcBpoHHKNOGqZAvtirLAIDocno7AzqoeIz974Rh2Olsl2/arApYPyyfi8PMYuFe/d4h+Wie8n+jh5n48lZ2Ve4PK+j+QHD6tTZS4f0bGnPL1puMxzQloltuQWgLDeVfEgrc3snLvjOg8aDzWm/es85lP8XcyW54U4t3JmrNUC2C7v+Uafx7cL7eDeunhs+BRhtGV+IUmjub2IrpqZp3zZqn+LVRdYJIy/qHhjS5+ImckXkFojOmeWhfmEmYSuNP8Oa6cGuXp829qnbxLh9Qzi3TfXV883KLse4kL5Zl7gBA/4hz2hVMyGJ8fY+VvzbaTuOXyvKJ+rGZCTcRSeotBLnIevVMiL7SqOEwN0j4Mfbznfq8= | ||||
| -----END CERTIFICATE----- | ||||
							
								
								
									
										42
									
								
								feeds/ucentral/poe/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								feeds/ucentral/poe/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=poe | ||||
| PKG_VERSION:=1.0 | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| ifeq ($(CONFIG_TARGET_ipq50xx_generic_DEVICE_sonicfi_rap630w_311g),y) | ||||
| TARGET_CFLAGS += -DPLATFORM_EWW631_B1=1 | ||||
| endif | ||||
|  | ||||
| define Package/poe | ||||
| 	SECTION:=utils | ||||
| 	CATEGORY:=Utilities | ||||
| 	TITLE:=Turn on/off PoE ports with TSP23861 chipset | ||||
| 	DEPENDS:= +libubox +libubus +libuci +libi2c | ||||
| endef | ||||
|  | ||||
| define Package/poe/description | ||||
|   Turn on/off PoE ports | ||||
| endef | ||||
|  | ||||
| define Build/Prepare | ||||
| 	mkdir -p $(PKG_BUILD_DIR) | ||||
| 	$(CP) ./src/* $(PKG_BUILD_DIR)/ | ||||
| endef | ||||
|  | ||||
|  | ||||
| define Package/poe/install | ||||
| 	$(INSTALL_DIR) $(1) | ||||
| 	$(INSTALL_DIR) $(1)/etc/config $(1)/etc/init.d | ||||
| 	$(INSTALL_BIN) ./files/poe.init $(1)/etc/init.d/poe | ||||
| 	$(INSTALL_BIN) ./files/poe.config $(1)/etc/config/poe | ||||
|  | ||||
| 	$(INSTALL_DIR) $(1)/usr/bin | ||||
| 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tps23861-poe-ctrl $(1)/usr/bin | ||||
| endef | ||||
|  | ||||
| $(eval $(call BuildPackage,poe)) | ||||
							
								
								
									
										0
									
								
								feeds/ucentral/poe/files/poe.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								feeds/ucentral/poe/files/poe.config
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										33
									
								
								feeds/ucentral/poe/files/poe.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								feeds/ucentral/poe/files/poe.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| #!/bin/sh /etc/rc.common | ||||
|  | ||||
| START=10 | ||||
|  | ||||
| tps23861_poe_ctrl () { | ||||
| 	local section="$1" | ||||
| 	local num mode | ||||
| 	config_get num "$section" port_num | ||||
| 	config_get mode "$section" admin_mode | ||||
| 	 | ||||
| 	if [ "$mode" == "1" ]; then | ||||
| 		output=$(tps23861-poe-ctrl -p "${num}" -P on) | ||||
| 		echo "<6>${output}" > "/dev/kmsg" | ||||
| 	else | ||||
| 		output=$(tps23861-poe-ctrl -p "${num}" -P off) | ||||
| 		echo "<6>${output}" > "/dev/kmsg" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| start(){ | ||||
| 	. /lib/functions.sh | ||||
| 	 | ||||
| 	board=$(board_name) | ||||
| 	case $board in | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	cybertan,eww631-b1) | ||||
| 		config_load poe | ||||
| 		config_foreach tps23861_poe_ctrl port | ||||
| 		;; | ||||
| 	*) | ||||
| 		;; | ||||
| 	esac | ||||
| } | ||||
							
								
								
									
										26
									
								
								feeds/ucentral/poe/src/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								feeds/ucentral/poe/src/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| CFLAGS += -Wall -g | ||||
|  | ||||
| INCLUDES = | ||||
|  | ||||
| LDFLAGS = -lubus -lubox -li2c | ||||
|  | ||||
| LIBS =  | ||||
|  | ||||
| SRCS = tps23861-poe-ctrl.c \ | ||||
|  | ||||
| OBJS = $(SRCS:.c=.o) | ||||
|  | ||||
| MAIN = tps23861-poe-ctrl | ||||
|  | ||||
|  | ||||
| all:   $(MAIN)  | ||||
|  | ||||
| $(MAIN): $(OBJS) | ||||
| 	$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LDFLAGS) $(LIBS) | ||||
| 	 | ||||
| .c.o: | ||||
| 	$(CC) $(CFLAGS) $(INCLUDES) -c $<  -o $@ | ||||
|  | ||||
| clean: | ||||
| 	$(RM) *.o *~ $(MAIN) $(TEST) | ||||
|  | ||||
							
								
								
									
										215
									
								
								feeds/ucentral/poe/src/tps23861-poe-ctrl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								feeds/ucentral/poe/src/tps23861-poe-ctrl.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,215 @@ | ||||
| /* | ||||
|  * User-space daemon formonitoring and managing PoE ports with | ||||
|  * TI TPS23861 chips. based on the Linux Kernel TPS23861 | ||||
|  * HWMON driver. | ||||
| */ | ||||
|  | ||||
| #include <stdio.h>		/* Standard input/output definitions */ | ||||
| #include <string.h>		/* String function definitions */ | ||||
| #include <unistd.h>		/* UNIX standard function definitions */ | ||||
| #include <fcntl.h>		/* File control definitions */ | ||||
| #include <errno.h>		/* Error number definitions */ | ||||
| #include <sys/ioctl.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/i2c-dev.h>  /* uapi/linux/i2c-dev.h */ | ||||
|  | ||||
| #include <libubox/ulog.h> | ||||
|  | ||||
| #define TPS23861_I2C_ADDR				0x20 | ||||
| #define DETECT_CLASS_RESTART			0x18 | ||||
| #define POWER_ENABLE					0x19 | ||||
| #define POWER_ON_SHIFT					0 | ||||
| #define POWER_OFF_SHIFT					4 | ||||
|  | ||||
| typedef unsigned char	u8; | ||||
|  | ||||
| #if defined(PLATFORM_EWW631_B1) | ||||
| #define TPS23861_NUM_PORTS				1 | ||||
| #endif | ||||
|  | ||||
| #define CONVERT_PORT_NUM(x)				(1 << ((u8)x-1)) | ||||
|  | ||||
| unsigned int  PORT_POWER_STATUS[TPS23861_NUM_PORTS]; | ||||
|  | ||||
| int i2c_handler = -1; | ||||
| #define ULOG_DBG(fmt, ...) ulog(LOG_DEBUG, fmt, ## __VA_ARGS__) | ||||
|  | ||||
| int open_device(void) | ||||
| { | ||||
| 	int fd, fset; | ||||
|  | ||||
| 	fd = open("/dev/i2c-0", O_RDWR); | ||||
| 	fset = fcntl(fd, F_SETFL, 0); | ||||
| 	if (fset < 0) | ||||
| 		printf("fcntl failed!\n"); | ||||
|  | ||||
| 	//if (isatty(STDIN_FILENO) == 0) | ||||
| 	//	printf("standard input is not a terminal device\n"); | ||||
|  | ||||
| 	return fd; | ||||
| } | ||||
|  | ||||
| int access_salve(int fd) | ||||
| { | ||||
| 	int ret; | ||||
|  | ||||
| 	if((ret = ioctl(fd, I2C_SLAVE, TPS23861_I2C_ADDR)) < 0) | ||||
| 	{ | ||||
| 		printf("%s: Failed to access slave bus[%s]\n",__func__, strerror(errno)); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	return(ret); | ||||
| } | ||||
|  | ||||
| // Write to an I2C slave device's register: | ||||
| int i2c_write(u8 slave_addr, u8 reg, u8 data) | ||||
| { | ||||
| 	u8 outbuf[2]; | ||||
|  | ||||
| 	struct i2c_msg msgs[1]; | ||||
| 	struct i2c_rdwr_ioctl_data msgset[1]; | ||||
|  | ||||
| 	outbuf[0] = reg; | ||||
| 	outbuf[1] = data; | ||||
|  | ||||
| 	msgs[0].addr = slave_addr; | ||||
| 	msgs[0].flags = 0; | ||||
| 	msgs[0].len = 2; | ||||
| 	msgs[0].buf = outbuf; | ||||
|  | ||||
| 	msgset[0].msgs = msgs; | ||||
| 	msgset[0].nmsgs = 1; | ||||
|  | ||||
| 	if (ioctl(i2c_handler, I2C_RDWR, &msgset) < 0) { | ||||
| 		perror("ioctl(I2C_RDWR) in i2c_write"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void poe_set_PowerOnOff(u8 port, u8 on_off) { | ||||
| 	u8 value; | ||||
| 	u8 portBit; | ||||
| 	portBit = CONVERT_PORT_NUM(port+1); | ||||
|  | ||||
| 	if(on_off == 0) { | ||||
| 		value = (portBit << POWER_OFF_SHIFT); | ||||
| 		PORT_POWER_STATUS[port] = 0; | ||||
| 	} else { | ||||
| 		value = (portBit << POWER_ON_SHIFT); | ||||
| 		PORT_POWER_STATUS[port] = 1; | ||||
| 	} | ||||
|  | ||||
| 	ULOG_DBG("set Port%d Power Status [%d] portBit 0x[%x] value 0x[%x]\n", port+1, PORT_POWER_STATUS[port], portBit, value); | ||||
|  | ||||
| 	if(i2c_write(TPS23861_I2C_ADDR, POWER_ENABLE, value) < 0) | ||||
| 	{ | ||||
| 		ULOG_ERR("Set port%d power on-off error (0x19)\n", port); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void RestartPortDetectClass(u8 port) | ||||
| { | ||||
| 	u8 value; | ||||
|  | ||||
| 	value = (1 << port) | (1 << (port + 4)); | ||||
| 	ULOG_DBG("RestartPortDetectClass value 0x%x\n", value); | ||||
| 	if(i2c_write(TPS23861_I2C_ADDR, DETECT_CLASS_RESTART, value) < 0) { | ||||
| 			ULOG_ERR("Set port%d detection and class on error\n",port); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| int usage(const char *progname) | ||||
| { | ||||
| 	fprintf(stderr, "Usage: %s -p <1-3> -P <on|off> [options]\n" | ||||
| 			"Required options:\n" | ||||
| 			"  -p <1-3>:           Select port number (Only port 1 is supported)\n" | ||||
| 			"  -P <on|off>:        Set PSE function state <on|off>\n" | ||||
| 			"Optional options:\n" | ||||
| 			"  -d                  Enable debug mode\n" | ||||
| 			"\n", progname); | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| static int setPSE(int port ,char *optarg) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	i2c_handler = open_device(); | ||||
| 	if (i2c_handler < 0) { | ||||
| 		ULOG_ERR("open i2c-0 device error!\n"); | ||||
| 		goto EXIT; | ||||
| 	} | ||||
|  | ||||
| 	ret = access_salve(i2c_handler); | ||||
| 	if (ret < 0) | ||||
| 	{ | ||||
| 		ULOG_ERR("The i2c-0 access error\n"); | ||||
| 		goto EXIT; | ||||
| 	} | ||||
|  | ||||
| 	if(!strncmp("on", optarg, 2)) { | ||||
| 		printf("Enable port%d PSE function\n", port); | ||||
| 		RestartPortDetectClass(port-1); | ||||
| 	} | ||||
| 	else if (!strncmp("off", optarg, 3)) { | ||||
| 		printf("Disable port%d PSE function\n", port); | ||||
| 		poe_set_PowerOnOff(port-1, 0); | ||||
| 	} | ||||
| 	else { | ||||
| 		ULOG_ERR("[Set] Do not accept this optarg!!!\n"); | ||||
| 		ret = 1; | ||||
| 	} | ||||
| EXIT: | ||||
| 	close(i2c_handler); | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
| 	int ch, ret = 0, port = 0; | ||||
| 	char *PSE = NULL; | ||||
| 	if (argc == 1) { | ||||
| 		return usage(argv[0]); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	ulog_open(ULOG_STDIO | ULOG_SYSLOG, LOG_DAEMON, "tps23861"); | ||||
| 	ulog_threshold(LOG_INFO); | ||||
|  | ||||
| 	while ((ch = getopt(argc, argv, "dp:P:")) != -1) { | ||||
| 		switch (ch) { | ||||
| 		case 'd': | ||||
| 			printf("tps23861-i2c-control ulog_threshold set to debug level\n"); | ||||
| 			ulog_threshold(LOG_DEBUG); | ||||
| 			break; | ||||
|  | ||||
| 		case 'p': | ||||
| 			port = atoi(optarg); | ||||
| 			break; | ||||
|  | ||||
| 		case 'P': | ||||
| 			PSE = optarg; | ||||
| 			break; | ||||
|  | ||||
| 		default: | ||||
| 			ret = usage(argv[0]); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (port < 1 || port > 3) { | ||||
| 		ret = usage(argv[0]); | ||||
| 	} | ||||
| 	else { | ||||
| 		if (PSE) { | ||||
| 			setPSE(port, PSE); | ||||
| 		} | ||||
| 		else { | ||||
| 			ret = usage(argv[0]); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return ret; | ||||
|  | ||||
| } | ||||
| @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-client | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-client.git | ||||
| PKG_MIRROR_HASH:=20d0573e5460ae9780307ab9d54234bb75d3b98fb36806f896819918087b14df | ||||
| PKG_MIRROR_HASH:=2e28e0aa61b74851c7daf3634ec34d303a603e881e6c5d1fd76c837dea527582 | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_DATE:=2024-10-20 | ||||
| PKG_SOURCE_VERSION:=8c45f965c30d1cf11e3a5a625a5e2baf3178697f | ||||
| PKG_SOURCE_DATE:=2025-07-08 | ||||
| PKG_SOURCE_VERSION:=69829f63ea172ce9bd19b7b02073746fe9cf6a52 | ||||
|  | ||||
| PKG_LICENSE:=BSD-3-Clause | ||||
| PKG_MAINTAINER:=John Crispin <john@phrozen.org> | ||||
|   | ||||
| @@ -44,14 +44,15 @@ start_service() { | ||||
|  | ||||
| 	server=$(cat /etc/ucentral/gateway.json | jsonfilter -e '@["server"]') | ||||
| 	port=$(cat /etc/ucentral/gateway.json | jsonfilter -e '@["port"]') | ||||
| 	[ -n "$server" -a -n "$port" ] || return 0 | ||||
|  | ||||
| 	boot_cause=$(cat /tmp/pstore | jsonfilter -e '@["pstore"][-1]'.boot_cause) | ||||
| 	[ -z $boot_cause ] && boot_cause=coldboot | ||||
| 	procd_open_instance | ||||
| 	procd_set_param command "$PROG" | ||||
| 	[ -n "$serial" ] && procd_append_param command -S $serial | ||||
| 	[ -n "$server" ] && procd_append_param command -s $server | ||||
| 	[ -n "$port" ] && procd_append_param command -P $port | ||||
| 	procd_append_param command -s $server | ||||
| 	procd_append_param command -P $port | ||||
| 	[ "$debug" -eq 0 ] || procd_append_param command -d | ||||
| 	[ "$insecure" -eq 0 ] || procd_append_param command -i | ||||
| 	[ -z "$(mount | grep 'tmpfs on / type tmpfs')" ] || procd_append_param command -r | ||||
|   | ||||
| @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git | ||||
| PKG_MIRROR_HASH:=aac8731d564f4ccd85a366417b9a02c1d3de9b6533d1474b58768249c50707f1 | ||||
| PKG_MIRROR_HASH:=3857f9adcb12625350ada5274d177540d205f0b77c51129d298bb5d38fb6dbf6 | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_DATE:=2025-06-27 | ||||
| PKG_SOURCE_VERSION:=125a148764c9ef7a02086b6fadccd7b96bfdf591 | ||||
| PKG_SOURCE_DATE:=2025-07-08 | ||||
| PKG_SOURCE_VERSION:=f3d1356a066daa28f7ee1cf3adc27f09ca742708 | ||||
| PKG_MAINTAINER:=John Crispin <john@phrozen.org> | ||||
| PKG_LICENSE:=BSD-3-Clause | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,20 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . /lib/functions.sh | ||||
|  | ||||
| board=$(board_name) | ||||
| case $board in | ||||
| 	sonicfi,rap630w-311g|\ | ||||
| 	cybertan,eww631-b1) | ||||
| 		for num in $(seq 1 3) | ||||
| 		do | ||||
| 			uci add poe port | ||||
| 			uci set poe.@port[-1]='port' | ||||
| 			eval uci set poe.@port[-1].port_num='${num}' | ||||
| 			uci set poe.@port[-1].admin_mode='1' | ||||
| 		done | ||||
| 		uci commit | ||||
| 		;; | ||||
| 	*) | ||||
| 		;; | ||||
| esac | ||||
| @@ -5,9 +5,9 @@ PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_URL=https://github.com/blogic/udevmand.git | ||||
| PKG_MIRROR_HASH:=b643cae7315b6bc92262b9b632fe39bd9f766525a5fb69e8a8a5c37f4e26867b | ||||
| PKG_SOURCE_DATE:=20241219 | ||||
| PKG_SOURCE_VERSION:=be0f45e7bcf6bad8143222c541c3d077bdadbecc | ||||
| PKG_MIRROR_HASH:=6f6a5536656a64e1f38f03747ef06ab03b28ef797adc72a901eb7dbc6e45e496 | ||||
| PKG_SOURCE_DATE:=20250704 | ||||
| PKG_SOURCE_VERSION:=e56be31d7c341467cc26714dac5c6b450a612808 | ||||
| CMAKE_INSTALL:=1 | ||||
|  | ||||
| PKG_LICENSE:=LGPL-2.1 | ||||
|   | ||||
| @@ -1,93 +0,0 @@ | ||||
| From e4ad9777fae3bb3a71988fa738f16cb8d6884d7e Mon Sep 17 00:00:00 2001 | ||||
| From: Tanya Singh <tanya_singh@accton.com> | ||||
| Date: Tue, 28 Jun 2022 17:11:52 +0800 | ||||
| Subject: [PATCH 29/68] netifd: Support DHCP option 138 and store values in | ||||
|  /tmp/capwap/dhcp_opt.txt | ||||
|  | ||||
| Signed-off-by: Tanya Singh <tanya_singh@accton.com> | ||||
| --- | ||||
|  .../netifd/files/lib/netifd/dhcp.script       | 22 +++++++++++++++++++ | ||||
|  .../netifd/files/lib/netifd/proto/dhcp.sh     |  1 + | ||||
|  .../busybox/patches/531-dhcp_opt_capwap.patch | 18 +++++++++++++++ | ||||
|  3 files changed, 41 insertions(+) | ||||
|  create mode 100644 package/utils/busybox/patches/531-dhcp_opt_capwap.patch | ||||
|  | ||||
| diff --git a/package/network/config/netifd/files/lib/netifd/dhcp.script b/package/network/config/netifd/files/lib/netifd/dhcp.script | ||||
| index 6fcf139beb..29de85f221 100755 | ||||
| --- a/package/network/config/netifd/files/lib/netifd/dhcp.script | ||||
| +++ b/package/network/config/netifd/files/lib/netifd/dhcp.script | ||||
| @@ -4,6 +4,24 @@ | ||||
|  . /lib/functions.sh | ||||
|  . /lib/netifd/netifd-proto.sh | ||||
|   | ||||
| +WORKING_PATH=/tmp/capwap | ||||
| +DHCP_OPT_FILE=${WORKING_PATH}/dhcp_opt.txt | ||||
| +DHCP_OPT_FILE_TMP=${WORKING_PATH}/dhcp_opt_tmp.txt | ||||
| + | ||||
| +set_capwap_ip() | ||||
| +{ | ||||
| +	local ip | ||||
| +	if [ ! -d "${WORKING_PATH}" ]; then | ||||
| +		mkdir -p ${WORKING_PATH} | ||||
| +	fi | ||||
| +	for ip in ${capwap}; do | ||||
| +		echo -n ${ip} >> ${DHCP_OPT_FILE_TMP} | ||||
| +	done | ||||
| +	if ! cmp -s "${DHCP_OPT_FILE}" "${DHCP_OPT_FILE_TMP}"; then | ||||
| +		mv ${DHCP_OPT_FILE_TMP} ${DHCP_OPT_FILE} | ||||
| +	fi | ||||
| +} | ||||
| + | ||||
|  set_classless_routes() { | ||||
|  	local max=128 | ||||
|  	while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do | ||||
| @@ -111,6 +129,10 @@ case "$1" in | ||||
|  	;; | ||||
|  esac | ||||
|   | ||||
| +if [ -n "${capwap}" ]; then | ||||
| +	set_capwap_ip | ||||
| +fi | ||||
| + | ||||
|  # user rules | ||||
|  [ -f /etc/udhcpc.user ] && . /etc/udhcpc.user "$@" | ||||
|  for f in /etc/udhcpc.user.d/*; do | ||||
| diff --git a/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh b/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh | ||||
| index 636b4654ff..18a9aaf2a3 100755 | ||||
| --- a/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh | ||||
| +++ b/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh | ||||
| @@ -61,6 +61,7 @@ proto_dhcp_setup() { | ||||
|  	[ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0" | ||||
|  	# Request classless route option (see RFC 3442) by default | ||||
|  	[ "$classlessroute" = "0" ] || append dhcpopts "-O 121" | ||||
| +	append dhcpopts "-O 138" | ||||
|   | ||||
|  	proto_export "INTERFACE=$config" | ||||
|  	proto_run_command "$config" udhcpc \ | ||||
| diff --git a/package/utils/busybox/patches/531-dhcp_opt_capwap.patch b/package/utils/busybox/patches/531-dhcp_opt_capwap.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..6c60159555 | ||||
| --- /dev/null | ||||
| +++ b/package/utils/busybox/patches/531-dhcp_opt_capwap.patch | ||||
| @@ -0,0 +1,18 @@ | ||||
| +--- a/networking/udhcp/common.c	2022-06-28 09:32:48.853072914 +0800 | ||||
| ++++ b/networking/udhcp/common.c	2022-06-28 09:39:28.000000000 +0800 | ||||
| +@@ -54,6 +54,7 @@ | ||||
| + 	{ OPTION_STRING                           , 0x43 }, /* DHCP_BOOT_FILE     */ | ||||
| + //TODO: not a string, but a set of LASCII strings: | ||||
| + //	{ OPTION_STRING                           , 0x4D }, /* DHCP_USER_CLASS    */ | ||||
| ++	{ OPTION_IP	| OPTION_LIST				  , 0x8A }, /* DHCP_CAPWAP       */ | ||||
| + 	{ OPTION_STRING                           , 0x64 }, /* DHCP_PCODE         */ | ||||
| + 	{ OPTION_STRING                           , 0x65 }, /* DHCP_TCODE         */ | ||||
| + #if ENABLE_FEATURE_UDHCP_RFC3397 | ||||
| +@@ -123,6 +124,7 @@ | ||||
| + 	"tftp" "\0"             /* DHCP_TFTP_SERVER_NAME*/ | ||||
| + 	"bootfile" "\0"         /* DHCP_BOOT_FILE       */ | ||||
| + //	"userclass" "\0"        /* DHCP_USER_CLASS      */ | ||||
| ++	"capwap" "\0"      		/* DHCP_CAPWAP		*/ | ||||
| + 	"tzstr" "\0"            /* DHCP_PCODE           */ | ||||
| + 	"tzdbstr" "\0"          /* DHCP_TCODE           */ | ||||
| + #if ENABLE_FEATURE_UDHCP_RFC3397 | ||||
| --  | ||||
| 2.34.1 | ||||
|  | ||||
| @@ -1,59 +0,0 @@ | ||||
| From 6866492b26cf59d5557d1ea0fdae24834410afff Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Wed, 11 Jun 2025 14:24:48 +0200 | ||||
| Subject: [PATCH] netifd: add gcmp-256 as a cipher suite when SAE is enabled on | ||||
|  HE/EHT | ||||
|  | ||||
| Fixes: WIFI-14594 | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  .../config/netifd/patches/200-gcmp-256.patch  | 37 +++++++++++++++++++ | ||||
|  1 file changed, 37 insertions(+) | ||||
|  create mode 100644 package/network/config/netifd/patches/200-gcmp-256.patch | ||||
|  | ||||
| diff --git a/package/network/config/netifd/patches/200-gcmp-256.patch b/package/network/config/netifd/patches/200-gcmp-256.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..defe66a816 | ||||
| --- /dev/null | ||||
| +++ b/package/network/config/netifd/patches/200-gcmp-256.patch | ||||
| @@ -0,0 +1,37 @@ | ||||
| +--- a/scripts/netifd-wireless.sh | ||||
| ++++ b/scripts/netifd-wireless.sh | ||||
| +@@ -39,11 +39,10 @@ prepare_key_wep() { | ||||
| + } | ||||
| +  | ||||
| + _wdev_prepare_channel() { | ||||
| +-	json_get_vars channel band hwmode | ||||
| ++	json_get_vars channel band hwmode htmode | ||||
| +  | ||||
| + 	auto_channel=0 | ||||
| + 	enable_ht=0 | ||||
| +-	htmode= | ||||
| + 	hwmode="${hwmode##11}" | ||||
| +  | ||||
| + 	case "$channel" in | ||||
| +@@ -80,6 +79,11 @@ _wdev_prepare_channel() { | ||||
| + 			esac | ||||
| + 		;; | ||||
| + 	esac | ||||
| ++ | ||||
| ++	case "$htmode" in | ||||
| ++		HE*|EHT*) wpa3_cipher="GCMP-256 ";; | ||||
| ++		*) wpa3_cipher="";; | ||||
| ++	esac | ||||
| + } | ||||
| +  | ||||
| + _wdev_handler() { | ||||
| +@@ -216,6 +220,9 @@ wireless_vif_parse_encryption() { | ||||
| + 		wpa_cipher="GCMP" | ||||
| + 	else | ||||
| + 		wpa_cipher="CCMP" | ||||
| ++		case "$encryption" in | ||||
| ++			sae*|wpa3*|psk3*|owe) wpa_cipher="${wpa3_cipher}$wpa_cipher";; | ||||
| ++		esac | ||||
| + 	fi | ||||
| +  | ||||
| + 	case "$encryption" in | ||||
| --  | ||||
| 2.34.1 | ||||
|  | ||||
| @@ -0,0 +1,43 @@ | ||||
| From 8e70ae7c71fb0a31b3b95f156b2d865ba8a07ae8 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Fri, 13 Jun 2025 12:06:48 +0200 | ||||
| Subject: [PATCH] fwtool: check for EST support if the cert was issued by insta | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  include/image-commands.mk                      | 3 ++- | ||||
|  package/base-files/files/lib/upgrade/fwtool.sh | 4 ++++ | ||||
|  2 files changed, 6 insertions(+), 1 deletion(-) | ||||
|  | ||||
| diff --git a/include/image-commands.mk b/include/image-commands.mk | ||||
| index d3c9cea293..b7a0d98d3d 100644 | ||||
| --- a/include/image-commands.mk | ||||
| +++ b/include/image-commands.mk | ||||
| @@ -85,7 +85,8 @@ metadata_json = \ | ||||
|  			"revision": "$(call json_quote,$(REVISION))", \ | ||||
|  			"target": "$(call json_quote,$(TARGETID))", \ | ||||
|  			"board": "$(call json_quote,$(if $(BOARD_NAME),$(BOARD_NAME),$(DEVICE_NAME)))" \ | ||||
| -		} \ | ||||
| +		}, \ | ||||
| +		"est_supported": 1 \ | ||||
|  	}' | ||||
|   | ||||
|  define Build/append-metadata | ||||
| diff --git a/package/base-files/files/lib/upgrade/fwtool.sh b/package/base-files/files/lib/upgrade/fwtool.sh | ||||
| index 8bd00a3332..a84eb96baf 100644 | ||||
| --- a/package/base-files/files/lib/upgrade/fwtool.sh | ||||
| +++ b/package/base-files/files/lib/upgrade/fwtool.sh | ||||
| @@ -51,6 +51,10 @@ fwtool_check_image() { | ||||
|  	json_get_var compatmessage compat_message | ||||
|  	[ -n "$imagecompat" ] || imagecompat="1.0" | ||||
|   | ||||
| +	if ! est_client fwtool; then | ||||
| +		return 1 | ||||
| +	fi | ||||
| + | ||||
|  	# select correct supported list based on compat_version | ||||
|  	# (using this ensures that compatibility check works for devices | ||||
|  	#  not knowing about compat-version) | ||||
| --  | ||||
| 2.34.1 | ||||
|  | ||||
							
								
								
									
										30
									
								
								patches/0092-ubus-bump-to-latest-HEAD.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								patches/0092-ubus-bump-to-latest-HEAD.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| From 2630ee161ad4d5981d98ee8cf0b7be3832b32ee8 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Thu, 3 Jul 2025 09:20:03 +0200 | ||||
| Subject: [PATCH] ubus: bump to latest HEAD | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  package/system/ubus/Makefile | 6 +++--- | ||||
|  1 file changed, 3 insertions(+), 3 deletions(-) | ||||
|  | ||||
| diff --git a/package/system/ubus/Makefile b/package/system/ubus/Makefile | ||||
| index 82c4dc601a..ea536930ea 100644 | ||||
| --- a/package/system/ubus/Makefile | ||||
| +++ b/package/system/ubus/Makefile | ||||
| @@ -5,9 +5,9 @@ PKG_RELEASE:=1 | ||||
|   | ||||
|  PKG_SOURCE_PROTO:=git | ||||
|  PKG_SOURCE_URL=$(PROJECT_GIT)/project/ubus.git | ||||
| -PKG_SOURCE_DATE:=2023-06-05 | ||||
| -PKG_SOURCE_VERSION:=f787c97b34894a38b15599886cacbca01271684f | ||||
| -PKG_MIRROR_HASH:=f4e898eb9207f069652f1767835f6aa9f015df2282d51e50ab57a0c3736f36e3 | ||||
| +PKG_SOURCE_DATE:=2025-07-02 | ||||
| +PKG_SOURCE_VERSION:=5952b48e251c0ea76dfce97f129da6f18d889eda | ||||
| +PKG_MIRROR_HASH:=3285485a4d9d0e62e4abcfb004d2be0bec7b5ebc564c68030be0c35f0bc223c4 | ||||
|  PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE)) | ||||
|  CMAKE_INSTALL:=1 | ||||
|   | ||||
| --  | ||||
| 2.34.1 | ||||
|  | ||||
| @@ -13,3 +13,4 @@ packages: | ||||
|   - ipq53xx | ||||
|   - ftm | ||||
|   - qca-ssdk-shell | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
| @@ -12,3 +12,4 @@ include: | ||||
| packages: | ||||
|   - ipq53xx | ||||
|   - qca-ssdk-shell | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
| @@ -12,3 +12,4 @@ include: | ||||
| packages: | ||||
|   - ipq53xx | ||||
|   - qca-ssdk-shell | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
| @@ -15,9 +15,14 @@ packages: | ||||
|   - qca-ssdk-shell | ||||
|   - iperf3 | ||||
|   - sysstat | ||||
|   - cig-device-boot | ||||
|   - kmod-cig-wifi-mode-sw | ||||
|   - kmod-input-lsm303agr | ||||
|   - kmod-rtl8221d-phy | ||||
|   - kmod-gpio-pca953x | ||||
|   - kmod-hwmon-tmp103 | ||||
|   - kmod-iio-ilps22qs | ||||
|   - kmod-cig-poe-judgment  | ||||
| diffconfig: | | ||||
|   CONFIG_BUSYBOX_CUSTOM=y | ||||
|   CONFIG_BUSYBOX_CONFIG_STTY=y | ||||
|   | ||||
							
								
								
									
										21
									
								
								profiles/emplus_wap380c.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								profiles/emplus_wap380c.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| profile: emplus_wap380c | ||||
| target: ipq807x | ||||
| subtarget: generic | ||||
| description: Build image for the Emplus WAP380C | ||||
| image: bin/targets/ipq807x/generic/openwrt-ipq807x-emplus_wap380c-squashfs-sysupgrade.tar | ||||
| feeds: | ||||
|   - name: ipq807x | ||||
|     path: ../../feeds/ipq807x_v5.4 | ||||
| include: | ||||
|   - ucentral-ap | ||||
| packages: | ||||
|   - ipq807x | ||||
| diffconfig: | | ||||
|   CONFIG_KERNEL_IPQ_MEM_PROFILE=0 | ||||
|   CONFIG_BUSYBOX_CUSTOM=y | ||||
|   CONFIG_BUSYBOX_CONFIG_TFTP=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_GET=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_PUT=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_BLOCKSIZE=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_PROGRESS_BAR=y | ||||
							
								
								
									
										27
									
								
								profiles/emplus_wap581.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								profiles/emplus_wap581.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| --- | ||||
| profile: emplus_wap581 | ||||
| target: ipq50xx | ||||
| subtarget: generic | ||||
| description: Build image for Emplus WAP581 | ||||
| image: bin/targets/ipq50xx/generic/openwrt-ipq50xx-emplus_wap581-squashfs-sysupgrade.tar | ||||
| feeds: | ||||
|   - name: ipq807x | ||||
|     path: ../../feeds/ipq807x_v5.4 | ||||
| include: | ||||
|   - ucentral-ap | ||||
| packages: | ||||
|   - ipq50xx | ||||
|   - iperf3 | ||||
|   - lscpu | ||||
|   - tree | ||||
| diffconfig: | | ||||
|   CONFIG_KERNEL_IPQ_MEM_PROFILE=512 | ||||
|   CONFIG_BUSYBOX_CUSTOM=y | ||||
|   CONFIG_BUSYBOX_CONFIG_TFTP=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_GET=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_PUT=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_BLOCKSIZE=y | ||||
|   CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_PROGRESS_BAR=y | ||||
|   CONFIG_BUSYBOX_CONFIG_MPSTAT=y | ||||
|   CONFIG_BUSYBOX_CONFIG_PSTREE=y | ||||
|  | ||||
							
								
								
									
										15
									
								
								profiles/sonicfi_rap630e.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								profiles/sonicfi_rap630e.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| --- | ||||
| profile: sonicfi_rap630e | ||||
| target: ipq50xx | ||||
| subtarget: generic | ||||
| description: Build image for the Sonicfi Wallmount EAP RAP630E | ||||
| image: bin/targets/ipq50xx/generic/openwrt-ipq50xx-sonicfi_rap630e-squashfs-sysupgrade.tar | ||||
| feeds: | ||||
|   - name: ipq807x | ||||
|     path: ../../feeds/ipq807x_v5.4 | ||||
| packages: | ||||
|   - ipq50xx | ||||
| include: | ||||
|   - ucentral-ap | ||||
| diffconfig: | | ||||
|   CONFIG_KERNEL_IPQ_MEM_PROFILE=512 | ||||
| @@ -10,5 +10,6 @@ feeds: | ||||
| packages: | ||||
|   - ipq50xx | ||||
|   - cooling | ||||
|   - poe | ||||
| include: | ||||
|   - ucentral-ap | ||||
|   | ||||
		Reference in New Issue
	
	Block a user