Compare commits

...

6 Commits

Author SHA1 Message Date
Ken
6fbe0d7213 WIFI-14582 WF189 Save crash log into pstore
Signed-off-by: Ken <xshi@actiontec.com>
2025-05-12 16:42:40 +08:00
John Crispin
772f078eb9 ucentral-schema: update to latest HEAD
6faaa1f HaLow: Extend ucentral schema & state for HaLow
aa9cac5 dhcp_inject: Use same keyword "dhcp-inject" in config file

Signed-off-by: John Crispin <john@phrozen.org>
2025-05-12 07:47:57 +02:00
Wingate Chi
7874d5eff1 qca-wifi-7: Support Sonicfi RAP750E-H
Fixes: WIFI-14563
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-05-12 07:37:16 +02:00
800246@emplustech.com
c0658672bf mediatek: Add EMPLUS WAP588M model
Specifications:
SoC: MediaTek MT7981B
RF Chipset: MT7976C @2.4GHz 2T2R
MT7976C @5ghz 2T2R
RAM: 512MB DDR4 RAM
Flash: SPI-NAND 128 MiB
Ethernet: 2 x 1GbE PHY
Reset Button: 1
Power on/off switch dip: 1
Power Source: Standard PoE 802.3af/at
LED Indicator: 5x Single-color LED indicator (GPIO Control)

Signed-off-by: 800246@emplustech.com <cp.chang@emplustech.com>
2025-05-12 07:32:48 +02:00
Tanya Singh
eff3b9ec2b rrmd: RRM with Channel Utilization - update radio status check
Fixes: WIFI-14575
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-05-12 07:31:16 +02:00
ian77_chen
4db1ebe0f9 mediatek-sdk: Support HaLow on EAP112
1. porting MorseMicro HaLow driver to support HaLow on EAP112
2. Only support FCC regulation because of hardware limitation
3. Add /etc/init.d/halow-gpio-reset to initialize HaLow chip in early stage
4. Add /etc/uci-defaults/aaa-fix-phy0-to-morse to correct the default uci for HaLow radio.

Signed-off-by: Ian Chen <ian77_chen@accton.com>
2025-05-12 07:30:08 +02:00
76 changed files with 12046 additions and 106 deletions

View File

@@ -21,7 +21,7 @@ jobs:
strategy:
fail-fast: false
matrix:
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf189', 'cig_wf196', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'sonicfi_rap630w-312g', 'sonicfi_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap650c', 'sonicfi_rap7110c-341x', 'sonicfi_rap750w-311a', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap103', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_iap2300m', 'senao_jeap6500', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf189', 'cig_wf196', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'sonicfi_rap630w-312g', 'sonicfi_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap650c', 'sonicfi_rap7110c-341x', 'sonicfi_rap750e-h', 'sonicfi_rap750w-311a', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap103', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_iap2300m', 'senao_jeap6500', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655', 'emplus_wap588m' ]
steps:
- uses: actions/checkout@v3

View File

@@ -146,6 +146,40 @@ check_board_phy() {
fi
}
is_morse_phy() {
local dev="$1"
local morse_path="/sys/class/ieee80211/${dev}/device/morse/"
if [ -d "$morse_path" ]; then
return 0 # This is a Morse PHY
else
return 1 # Not a Morse PHY
fi
}
# Set up Morse-specific wireless configuration
setup_morse_wireless() {
local dev="$1"
local name="$2"
# Create Morse-specific wireless configuration with exact settings
uci -q batch <<-EOF
set wireless.${name}=wifi-device
set wireless.${name}.disabled='0'
set wireless.${name}.mode='ap'
set wireless.${name}.type='morse'
set wireless.${name}.path='platform/11009000.spi/spi_master/spi1/spi1.0'
set wireless.${name}.channel='12'
set wireless.${name}.hwmode='a'
set wireless.${name}.band='s1g'
set wireless.${name}.htmode='8'
set wireless.${name}.country='US'
set wireless.${name}.channels=''
EOF
uci -q commit wireless
}
detect_mac80211() {
devidx=0
config_load wireless
@@ -158,13 +192,6 @@ detect_mac80211() {
dev="${_dev##*/}"
mode_band=""
channel=""
htmode=""
ht_capab=""
get_band_defaults "$dev"
path="$(iwinfo nl80211 path "$dev")"
macaddr="$(cat /sys/class/ieee80211/${dev}/macaddress)"
@@ -183,35 +210,51 @@ detect_mac80211() {
name="radio${devidx}"
devidx=$(($devidx + 1))
case "$dev" in
phy*)
if [ -n "$path" ]; then
dev_id="set wireless.${name}.path='$path'"
else
dev_id="set wireless.${name}.macaddr='$macaddr'"
fi
;;
*)
dev_id="set wireless.${name}.phy='$dev'"
;;
esac
uci -q batch <<-EOF
set wireless.${name}=wifi-device
set wireless.${name}.type=mac80211
${dev_id}
set wireless.${name}.channel=${channel}
set wireless.${name}.band=${mode_band}
set wireless.${name}.htmode=$htmode
set wireless.${name}.disabled=1
# Check if this is a Morse PHY
if is_morse_phy "$dev"; then
# Use dedicated Morse configuration
setup_morse_wireless "$dev" "$name"
else
# Standard wireless configuration for non-Morse devices
mode_band=""
channel=""
htmode=""
ht_capab=""
set wireless.default_${name}=wifi-iface
set wireless.default_${name}.device=${name}
set wireless.default_${name}.network=lan
set wireless.default_${name}.mode=ap
set wireless.default_${name}.ssid=OpenWrt
set wireless.default_${name}.encryption=none
# Get default settings for standard devices
get_band_defaults "$dev"
case "$dev" in
phy*)
if [ -n "$path" ]; then
dev_id="set wireless.${name}.path='$path'"
else
dev_id="set wireless.${name}.macaddr='$macaddr'"
fi
;;
*)
dev_id="set wireless.${name}.phy='$dev'"
;;
esac
uci -q batch <<-EOF
set wireless.${name}=wifi-device
set wireless.${name}.type=mac80211
${dev_id}
set wireless.${name}.channel=${channel}
set wireless.${name}.band=${mode_band}
set wireless.${name}.htmode=$htmode
set wireless.${name}.disabled=1
set wireless.default_${name}=wifi-iface
set wireless.default_${name}.device=${name}
set wireless.default_${name}.network=lan
set wireless.default_${name}.mode=ap
set wireless.default_${name}.ssid=OpenWrt
set wireless.default_${name}.encryption=none
EOF
uci -q commit wireless
uci -q commit wireless
fi
done
}

View File

@@ -0,0 +1,13 @@
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -4193,8 +4196,10 @@
case NL80211_IFTYPE_STATION:
if (!bssid && !sdata->u.mgd.use_4addr)
return false;
+#if 0
if (ieee80211_is_robust_mgmt_frame(skb) && !rx->sta)
return false;
+#endif
if (multicast)
return true;
return ether_addr_equal(sdata->vif.addr, hdr->addr1);

View File

@@ -0,0 +1,443 @@
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -3434,6 +3434,9 @@
WLAN_ACTION_ADDBA_REQ = 0,
WLAN_ACTION_ADDBA_RESP = 1,
WLAN_ACTION_DELBA = 2,
+ WLAN_ACTION_NDP_ADDBA_REQ = 128,
+ WLAN_ACTION_NDP_ADDBA_RESP = 129,
+ WLAN_ACTION_NDP_DELBA = 130,
};
/* BACK (block-ack) parties */
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -125,6 +125,13 @@
* via the usual ieee80211_tx_dequeue).
*/
+ /** Morse Micro patches which add functionality that the driver needs to know about, can be
+ * signalled by adding a define here.
+ */
+
+ /** mac80211 has the capability to negotiate NDP block acknowledgements */
+ #define MORSE_MAC80211_S1G_FEATURE_NDP_BLOCKACK
+
struct device;
/**
@@ -2437,7 +2444,10 @@
*
* @IEEE80211_HW_DETECTS_COLOR_COLLISION: HW/driver has support for BSS color
* collision detection and doesn't need it in software.
- *
+ *
+ + @IEEE80211_HW_SUPPORTS_NDP_BLOCKACK: Hardware supports 11ah A-MPDU aggregation with NDP block
+ + ACKs
+ +
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
*/
enum ieee80211_hw_flags {
@@ -2494,6 +2504,7 @@
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP,
IEEE80211_HW_DETECTS_COLOR_COLLISION,
+ IEEE80211_HW_SUPPORTS_NDP_BLOCKACK,
/* keep last, obviously */
NUM_IEEE80211_HW_FLAGS
@@ -3315,7 +3326,8 @@
* action is set to %IEEE80211_AMPDU_RX_START or
* %IEEE80211_AMPDU_TX_OPERATIONAL
* @amsdu: indicates the peer's ability to receive A-MSDU within A-MPDU.
- * valid when the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL
+ * valid when the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL
+ * @ndp: indicates the driver has requested the session to use NDP block ACKs
* @timeout: BA session timeout. Valid only when the action is set to
* %IEEE80211_AMPDU_RX_START
*/
@@ -3326,6 +3338,7 @@
u16 ssn;
u16 buf_size;
bool amsdu;
+ bool ndp;
u16 timeout;
};
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -80,6 +80,8 @@
RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], NULL);
__clear_bit(tid, sta->ampdu_mlme.agg_session_valid);
+ if (tid_rx) params.ndp = tid_rx->ndp;
+
ht_dbg(sta->sdata,
"Rx BA session stop requested for %pM tid %u %s reason: %d\n",
sta->sta.addr, tid,
@@ -94,7 +96,7 @@
/* check if this is a self generated aggregation halt */
if (initiator == WLAN_BACK_RECIPIENT && tx)
ieee80211_send_delba(sta->sdata, sta->sta.addr,
- tid, WLAN_BACK_RECIPIENT, reason);
+ tid, params.ndp, WLAN_BACK_RECIPIENT, reason);
/*
* return here in case tid_rx is not assigned - which will happen if
@@ -214,7 +216,7 @@
static void ieee80211_send_addba_resp(struct sta_info *sta, u8 *da, u16 tid,
u8 dialog_token, u16 status, u16 policy,
- u16 buf_size, u16 timeout,
+ u16 buf_size, u16 timeout, bool ndp,
const struct ieee80211_addba_ext_ie *addbaext)
{
struct ieee80211_sub_if_data *sdata = sta->sdata;
@@ -248,7 +250,8 @@
skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_resp));
mgmt->u.action.category = WLAN_CATEGORY_BACK;
- mgmt->u.action.u.addba_resp.action_code = WLAN_ACTION_ADDBA_RESP;
+ mgmt->u.action.u.addba_resp.action_code = ndp ?
+ WLAN_ACTION_NDP_ADDBA_RESP : WLAN_ACTION_ADDBA_RESP;
mgmt->u.action.u.addba_resp.dialog_token = dialog_token;
capab = 0;
@@ -273,7 +276,7 @@
void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
u8 dialog_token, u16 timeout,
u16 start_seq_num, u16 ba_policy, u16 tid,
- u16 buf_size, bool tx, bool auto_seq,
+ u16 buf_size, bool tx, bool auto_seq, bool ndp,
const struct ieee80211_addba_ext_ie *addbaext)
{
struct ieee80211_local *local = sta->sdata->local;
@@ -284,6 +287,7 @@
.tid = tid,
.amsdu = false,
.timeout = timeout,
+ .ndp = ndp,
.ssn = start_seq_num,
};
int i, ret = -EOPNOTSUPP;
@@ -306,6 +310,12 @@
goto end;
}
+
+ if (ndp && !ieee80211_hw_check(&local->hw, SUPPORTS_NDP_BLOCKACK)) {
+ ht_dbg(sta->sdata, "Requested NDP BA but HW does not support it\n");
+ goto end;
+ }
+
if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) {
ht_dbg(sta->sdata,
"Suspend in progress - Denying ADDBA request (%pM tid %d)\n",
@@ -438,6 +448,7 @@
tid_agg_rx->started = false;
tid_agg_rx->reorder_buf_filtered = 0;
tid_agg_rx->tid = tid;
+ tid_agg_rx->ndp = params.ndp;
tid_agg_rx->sta = sta;
status = WLAN_STATUS_SUCCESS;
@@ -459,20 +470,20 @@
if (tx)
ieee80211_send_addba_resp(sta, sta->sta.addr, tid,
dialog_token, status, 1, buf_size,
- timeout, addbaext);
+ timeout, params.ndp, addbaext);
}
static void __ieee80211_start_rx_ba_session(struct sta_info *sta,
u8 dialog_token, u16 timeout,
u16 start_seq_num, u16 ba_policy,
u16 tid, u16 buf_size, bool tx,
- bool auto_seq,
+ bool auto_seq, bool ndp,
const struct ieee80211_addba_ext_ie *addbaext)
{
mutex_lock(&sta->ampdu_mlme.mtx);
___ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
start_seq_num, ba_policy, tid,
- buf_size, tx, auto_seq, addbaext);
+ buf_size, tx, auto_seq, ndp, addbaext);
mutex_unlock(&sta->ampdu_mlme.mtx);
}
@@ -485,6 +496,7 @@
struct ieee802_11_elems *elems = NULL;
u8 dialog_token;
int ies_len;
+ bool ndp_ba;
/* extract session parameters from addba request frame */
dialog_token = mgmt->u.action.u.addba_req.dialog_token;
@@ -496,6 +508,7 @@
ba_policy = (capab & IEEE80211_ADDBA_PARAM_POLICY_MASK) >> 1;
tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
+ ndp_ba = (mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_NDP_ADDBA_REQ);
ies_len = len - offsetof(struct ieee80211_mgmt,
u.action.u.addba_req.variable);
@@ -508,7 +521,7 @@
__ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
start_seq_num, ba_policy, tid,
- buf_size, true, false,
+ buf_size, true, false, ndp_ba,
elems ? elems->addba_ext_ie : NULL);
free:
kfree(elems);
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -65,7 +65,7 @@
*/
static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
- const u8 *da, u16 tid,
+ const u8 *da, u16 tid, bool ndp,
u8 dialog_token, u16 start_seq_num,
u16 agg_size, u16 timeout)
{
@@ -99,7 +99,8 @@
skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_req));
mgmt->u.action.category = WLAN_CATEGORY_BACK;
- mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ;
+ mgmt->u.action.u.addba_req.action_code = ndp ? WLAN_ACTION_NDP_ADDBA_REQ :
+ WLAN_ACTION_ADDBA_REQ;
mgmt->u.action.u.addba_req.dialog_token = dialog_token;
if (amsdu)
@@ -488,7 +489,7 @@
}
/* send AddBA request */
- ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
+ ieee80211_send_addba_request(sdata, sta->sta.addr, tid, tid_tx->ndp,
tid_tx->dialog_token, tid_tx->ssn,
buf_size, tid_tx->timeout);
@@ -506,10 +507,18 @@
.tid = tid,
.buf_size = 0,
.amsdu = false,
+ .ndp = false,
.timeout = 0,
};
int ret;
+ /* If the HW supports NDP blockacks, try to negotiate. It's the drivers responsibility to
+ * clear .ndp if the conditions for NDP block acks are not met for this TID.
+ * TODO: remove driver responsibility when S1G STA caps exist in mac80211
+ */
+ if (ieee80211_hw_check(&local->hw, SUPPORTS_NDP_BLOCKACK))
+ params.ndp = true;
+
tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
/*
@@ -532,6 +541,11 @@
params.ssn = sta->tid_seq[tid] >> 4;
ret = drv_ampdu_action(local, sdata, &params);
tid_tx->ssn = params.ssn;
+
+
+ /* driver may clear this flag if it does not want NDP for this session */
+ tid_tx->ndp = params.ndp;
+
if (ret == IEEE80211_AMPDU_TX_START_DELAY_ADDBA) {
return;
} else if (ret == IEEE80211_AMPDU_TX_START_IMMEDIATE) {
@@ -769,6 +783,7 @@
tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
params.buf_size = tid_tx->buf_size;
params.amsdu = tid_tx->amsdu;
+ params.ndp = tid_tx->ndp;
ht_dbg(sta->sdata, "Aggregation is on for %pM tid %d\n",
sta->sta.addr, tid);
@@ -950,7 +965,7 @@
ieee80211_agg_start_txq(sta, tid, false);
if (send_delba)
- ieee80211_send_delba(sdata, sta->sta.addr, tid,
+ ieee80211_send_delba(sdata, sta->sta.addr, tid, tid_tx->ndp,
WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE);
}
@@ -1009,6 +1024,13 @@
goto out;
}
+ if ((tid_tx->ndp && mgmt->u.action.u.addba_resp.action_code != WLAN_ACTION_NDP_ADDBA_RESP) ||
+ (!tid_tx->ndp && mgmt->u.action.u.addba_resp.action_code != WLAN_ACTION_ADDBA_RESP)) {
+ ht_dbg(sta->sdata, "wrong addBA response action code, %d ndp %d\n",
+ mgmt->u.action.u.addba_resp.action_code, tid_tx->ndp);
+ goto out;
+ }
+
del_timer_sync(&tid_tx->addba_resp_timer);
ht_dbg(sta->sdata, "switched off addBA timer for %pM tid %d\n",
--- a/net/mac80211/debugfs.c
+++ b/net/mac80211/debugfs.c
@@ -543,6 +543,7 @@
FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
FLAG(SUPPORTS_CONC_MON_RX_DECAP),
FLAG(DETECTS_COLOR_COLLISION),
+ FLAG(SUPPORTS_NDP_BLOCKACK),
#undef FLAG
};
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -365,7 +365,7 @@
sta->ampdu_mlme.tid_rx_manage_offl))
___ieee80211_start_rx_ba_session(sta, 0, 0, 0, 1, tid,
IEEE80211_MAX_AMPDU_BUF_HT,
- false, true, NULL);
+ false, true, false, NULL);
if (test_and_clear_bit(tid + IEEE80211_NUM_TIDS,
sta->ampdu_mlme.tid_rx_manage_offl))
@@ -412,7 +412,7 @@
}
void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
- const u8 *da, u16 tid,
+ const u8 *da, u16 tid, bool ndp,
u16 initiator, u16 reason_code)
{
struct ieee80211_local *local = sdata->local;
@@ -443,7 +443,7 @@
skb_put(skb, 1 + sizeof(mgmt->u.action.u.delba));
mgmt->u.action.category = WLAN_CATEGORY_BACK;
- mgmt->u.action.u.delba.action_code = WLAN_ACTION_DELBA;
+ mgmt->u.action.u.delba.action_code = ndp ? WLAN_ACTION_NDP_DELBA : WLAN_ACTION_DELBA;
params = (u16)(initiator << 11); /* bit 11 initiator */
params |= (u16)(tid << 12); /* bit 15:12 TID number */
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1902,7 +1902,7 @@
const struct ieee80211_ht_cap *ht_cap_ie,
struct sta_info *sta);
void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
- const u8 *da, u16 tid,
+ const u8 *da, u16 tid, bool ndp,
u16 initiator, u16 reason_code);
int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
enum ieee80211_smps_mode smps, const u8 *da,
@@ -1919,7 +1919,7 @@
void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
u8 dialog_token, u16 timeout,
u16 start_seq_num, u16 ba_policy, u16 tid,
- u16 buf_size, bool tx, bool auto_seq,
+ u16 buf_size, bool tx, bool auto_seq, bool ndp,
const struct ieee80211_addba_ext_ie *addbaext);
void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta,
enum ieee80211_agg_stop_reason reason);
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -1551,14 +1551,17 @@
if (sta) {
switch (mgmt->u.action.u.addba_req.action_code) {
case WLAN_ACTION_ADDBA_REQ:
+ case WLAN_ACTION_NDP_ADDBA_REQ:
ieee80211_process_addba_request(local, sta,
mgmt, len);
break;
case WLAN_ACTION_ADDBA_RESP:
+ case WLAN_ACTION_NDP_ADDBA_RESP:
ieee80211_process_addba_resp(local, sta,
mgmt, len);
break;
case WLAN_ACTION_DELBA:
+ case WLAN_ACTION_NDP_DELBA:
ieee80211_process_delba(sdata, sta,
mgmt, len);
break;
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1389,7 +1389,7 @@
if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK &&
!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) &&
!test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg))
- ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid,
+ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, false,
WLAN_BACK_RECIPIENT,
WLAN_REASON_QSTA_REQUIRE_SETUP);
goto dont_reorder;
@@ -3101,7 +3101,7 @@
if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) &&
!test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg))
- ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid,
+ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, false,
WLAN_BACK_RECIPIENT,
WLAN_REASON_QSTA_REQUIRE_SETUP);
@@ -3526,16 +3526,19 @@
switch (mgmt->u.action.u.addba_req.action_code) {
case WLAN_ACTION_ADDBA_REQ:
+ case WLAN_ACTION_NDP_ADDBA_REQ:
if (len < (IEEE80211_MIN_ACTION_SIZE +
sizeof(mgmt->u.action.u.addba_req)))
goto invalid;
break;
case WLAN_ACTION_ADDBA_RESP:
+ case WLAN_ACTION_NDP_ADDBA_RESP:
if (len < (IEEE80211_MIN_ACTION_SIZE +
sizeof(mgmt->u.action.u.addba_resp)))
goto invalid;
break;
case WLAN_ACTION_DELBA:
+ case WLAN_ACTION_NDP_DELBA:
if (len < (IEEE80211_MIN_ACTION_SIZE +
sizeof(mgmt->u.action.u.delba)))
goto invalid;
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -170,6 +170,7 @@
* @failed_bar_ssn: ssn of the last failed BAR tx attempt
* @bar_pending: BAR needs to be re-sent
* @amsdu: support A-MSDU withing A-MDPU
+ * @ndp: this session is using NDP block ACKs
*
* This structure's lifetime is managed by RCU, assignments to
* the array holding it must hold the aggregation mutex.
@@ -198,6 +199,7 @@
u16 failed_bar_ssn;
bool bar_pending;
bool amsdu;
+ bool ndp;
u8 tid;
};
@@ -225,6 +227,7 @@
* and ssn.
* @removed: this session is removed (but might have been found due to RCU)
* @started: this session has started (head ssn or higher was received)
+ * @ndp: this session is using NDP block ACKs
*
* This structure's lifetime is managed by RCU, assignments to
* the array holding it must hold the aggregation mutex.
@@ -252,7 +255,8 @@
u8 tid;
u8 auto_seq:1,
removed:1,
- started:1;
+ started:1,
+ ndp:1;
};
/**

View File

@@ -255,18 +255,21 @@
&spi2 {
pinctrl-names = "default";
pinctrl-0 = <&spi2_pins>;
address-cells = <1>;
size-cells = <0>;
status = "okay";
slb9670: slb9670@0 {
compatible = "infineon,slb9670";
reg = <0>; /* CE0 */
#address-cells = <1>;
#size-cells = <0>;
spi-cal-enable;
spi-cal-mode = "read-data";
spi-cal-datalen = <2>;
spi-cal-data = /bits/ 8 <0x00 0x1b>;
spi-max-frequency = <40000000>;
mm6108: mm6108@0 {
compatible = "morse,mm610x-spi";
reg = <0>;
reset-gpios = <&pio 31 0>;
power-gpios = <&pio 5 0>,<&pio 0 0>;
spi-irq-gpios = <&pio 30 0>;
status = "okay";
spi-max-frequency = <52000000>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <1>;
};
};
@@ -338,6 +341,18 @@
function = "spi";
groups = "spi2";
};
conf-pu {
pins = "SPI2_CS";
drive-strength = <8>;
mediatek,pull-up-adv = <3>;
};
conf-pd {
pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
drive-strength = <8>;
mediatek,pull-down-adv = <3>;
};
};
uart1_pins: uart1-pins-g1 {

View File

@@ -0,0 +1,349 @@
/dts-v1/;
#include "mt7981.dtsi"
/ {
model = "Emplus WAP588M";
compatible = "emplus,wap588m";
chosen {
bootargs = "console=ttyS0,115200n1 loglevel=8 \
earlycon=uart8250,mmio32,0x11002000";
};
memory {
reg = <0 0x40000000 0 0x10000000>;
};
gpio-keys {
compatible = "gpio-keys";
reset {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&pio 1 GPIO_ACTIVE_LOW>;
};
};
leds {
compatible = "gpio-leds";
power {
label = "power";
gpios = <&pio 11 GPIO_ACTIVE_LOW>;
linux,default-trigger = "timer";
default-state = "on";
};
wifi2g {
label = "wifi2g";
gpios = <&pio 9 GPIO_ACTIVE_LOW>;
linux,default-trigger = "ra0";
};
wifi5g {
label = "wifi5g";
gpios = <&pio 12 GPIO_ACTIVE_LOW>;
linux,default-trigger = "rax0";
};
lan {
label = "lan";
gpios = <&pio 10 GPIO_ACTIVE_LOW>;
linux,default-trigger = "eth0";
};
wan {
label = "wan";
gpios = <&pio 13 GPIO_ACTIVE_LOW>;
linux,default-trigger = "eth1";
};
};
nmbm_spim_nand {
compatible = "generic,nmbm";
#address-cells = <1>;
#size-cells = <1>;
lower-mtd-device = <&spi_nand>;
forced-create;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "BL2";
reg = <0x00000 0x0100000>;
read-only;
};
partition@100000 {
label = "u-boot-env";
reg = <0x0100000 0x0080000>;
};
factory: partition@180000 {
label = "Factory";
reg = <0x180000 0x0200000>;
};
partition@380000 {
label = "FIP";
reg = <0x380000 0x0200000>;
};
partition@580000 {
label = "ubi"; //110MB
reg = <0x580000 0x3700000>;
};
partition@3C80000 {
label = "ubi_1"; //110MB
reg = <0x3C80000 0x3700000>;
};
partition@7380000 {
label = "cert"; //384KB
reg = <0x7380000 0x0060000>;
};
partition@73E0000 {
label = "userconfig"; //640KB
reg = <0x73E0000 0x00a0000>;
};
partition@7480000 {
label = "crashdump"; //384KB
reg = <0x7480000 0x0060000>;
};
};
};
sound_wm8960 {
compatible = "mediatek,mt79xx-wm8960-machine";
mediatek,platform = <&afe>;
audio-routing = "Headphone", "HP_L",
"Headphone", "HP_R",
"LINPUT1", "AMIC",
"RINPUT1", "AMIC";
mediatek,audio-codec = <&wm8960>;
status = "disabled";
};
sound_si3218x {
compatible = "mediatek,mt79xx-si3218x-machine";
mediatek,platform = <&afe>;
mediatek,ext-codec = <&proslic_spi>;
status = "disabled";
};
};
&afe {
pinctrl-names = "default";
pinctrl-0 = <&pcm_pins>;
status = "okay";
};
&i2c0 {
pinctrl-names = "default";
pinctrl-0 = <&i2c_pins>;
status = "disabled";
wm8960: wm8960@1a {
compatible = "wlf,wm8960";
reg = <0x1a>;
};
};
&uart0 {
status = "okay";
};
&watchdog {
status = "okay";
};
&eth {
status = "okay";
gmac0: mac@0 {
compatible = "mediatek,eth-mac";
reg = <0>;
phy-mode = "sgmii";
phy-handle = <&phy1>;
};
gmac1: mac@1 {
compatible = "mediatek,eth-mac";
reg = <1>;
phy-mode = "gmii";
phy-handle = <&phy0>;
};
mdio: mdio-bus {
#address-cells = <1>;
#size-cells = <0>;
// MT7981 internal PHY
phy0: ethernet-phy@0 {
compatible = "ethernet-phy-id03a2.9461";
reg = <0>;
phy-mode = "gmii";
nvmem-cells = <&phy_calibration>;
nvmem-cell-names = "phy-cal-data";
};
// RTL8211FS PHY
phy1: ethernet-phy@1 {
compatible = "ethernet-phy-id001c.c916";
reg = <1>;
reset-gpios = <&pio 39 GPIO_ACTIVE_LOW>;
reset-assert-us = <120000>;
reset-deassert-us = <120000>;
phy-mode = "sgmii";
};
};
};
&hnat {
mtketh-wan = "eth1";
mtketh-lan = "eth0";
mtketh-max-gmac = <2>;
status = "okay";
};
&spi0 {
pinctrl-names = "default";
pinctrl-0 = <&spi0_flash_pins>;
status = "okay";
spi_nand: spi_nand@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "spi-nand";
reg = <0>;
spi-max-frequency = <52000000>;
spi-tx-bus-width = <4>;
spi-rx-bus-width = <4>;
};
};
&spi1 {
pinctrl-names = "default";
pinctrl-0 = <&spic_pins>;
status = "okay";
proslic_spi: proslic_spi@0 {
compatible = "silabs,proslic_spi";
reg = <0>;
spi-max-frequency = <10000000>;
spi-cpha = <1>;
spi-cpol = <1>;
channel_count = <1>;
debug_level = <4>; /* 1 = TRC, 2 = DBG, 4 = ERR */
reset_gpio = <&pio 15 0>;
ig,enable-spi = <1>; /* 1: Enable, 0: Disable */
};
};
&wbsys {
mediatek,mtd-eeprom = <&factory 0x0000>;
status = "okay";
pinctrl-names = "dbdc";
pinctrl-0 = <&wf_dbdc_pins>;
};
&pio {
i2c_pins: i2c-pins-g0 {
mux {
function = "i2c";
groups = "i2c0_0";
};
};
pcm_pins: pcm-pins-g0 {
mux {
function = "pcm";
groups = "pcm";
};
};
pwm0_pin: pwm0-pin-g0 {
mux {
function = "pwm";
groups = "pwm0_0";
};
};
pwm1_pin: pwm1-pin-g0 {
mux {
function = "pwm";
groups = "pwm1_0";
};
};
pwm2_pin: pwm2-pin {
mux {
function = "pwm";
groups = "pwm2";
};
};
spi0_flash_pins: spi0-pins {
mux {
function = "spi";
groups = "spi0", "spi0_wp_hold";
};
conf-pu {
pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
drive-strength = <MTK_DRIVE_8mA>;
bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
};
conf-pd {
pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
drive-strength = <MTK_DRIVE_8mA>;
bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
};
};
spic_pins: spi1-pins {
mux {
function = "spi";
groups = "spi1_1";
};
};
uart1_pins: uart1-pins-g1 {
mux {
function = "uart";
groups = "uart1_1";
};
};
uart2_pins: uart2-pins-g1 {
mux {
function = "uart";
groups = "uart2_1";
};
};
wf_dbdc_pins: wf_dbdc-pins {
mux {
function = "eth";
groups = "wf0_mode1";
};
conf {
pins = "WF_HB1", "WF_HB2", "WF_HB3", "WF_HB4",
"WF_HB0", "WF_HB0_B", "WF_HB5", "WF_HB6",
"WF_HB7", "WF_HB8", "WF_HB9", "WF_HB10",
"WF_TOP_CLK", "WF_TOP_DATA", "WF_XO_REQ",
"WF_CBA_RESETB", "WF_DIG_RESETB";
drive-strength = <MTK_DRIVE_4mA>;
};
};
};
&xhci {
mediatek,u3p-dis-msk = <0x0>;
phys = <&u2port0 PHY_TYPE_USB2>,
<&u3port0 PHY_TYPE_USB3>;
status = "disabled";
};

View File

@@ -307,3 +307,28 @@ define Device/senao_jeap6500
endef
TARGET_DEVICES += senao_jeap6500
DEFAULT_DEVICE_VARS += FIT_KEY_DIR FIT_KEY_NAME
define Device/emplus_wap588m
DEVICE_VENDOR := EMPLUS
DEVICE_MODEL := WAP588M
DEVICE_DTS := mt7981-emplus-wap588m
DEVICE_DTS_DIR := $(DTS_DIR)/mediatek
SUPPORTED_DEVICES := emplus,wap588m
DEVICE_PACKAGES := kmod-mt7981-firmware kmod-mt7915e uboot-envtools -procd-ujail
UBINIZE_OPTS := -E 5
BLOCKSIZE := 128k
PAGESIZE := 2048
IMAGE_SIZE := 65536k
KERNEL_IN_UBI := 1
FIT_KEY_DIR := $(DTS_DIR)/mediatek/keys/emplus_wap588m
FIT_KEY_NAME := fit_key
IMAGES += factory.bin
IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
KERNEL = kernel-bin | lzma | \
fit-sign lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
KERNEL_INITRAMFS = kernel-bin | lzma | \
fit-sign lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd
endef
TARGET_DEVICES += emplus_wap588m
DEFAULT_DEVICE_VARS += FIT_KEY_DIR FIT_KEY_NAME

View File

@@ -18,6 +18,7 @@ case "$board" in
edgecore,eap111|\
edgecore,eap112|\
senao,iap2300m|\
emplus,wap588m|\
senao,jeap6500)
ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x20000" "0x20000"
;;

View File

@@ -2,13 +2,13 @@ REQUIRE_IMAGE_METADATA=1
senao_swap_active_fw() {
echo "Doing swap active_fw" > /dev/console
tmp_active_fw=$(fw_printenv -n active_fw)
tmp_active_fw=$(fw_printenv | grep active_fw | awk -F= {'print $2'})
if [ $tmp_active_fw == "0" ]; then
fw_setenv active_fw 1
fw_setenv mtdparts nmbm0:1024k\(bl2\),512k\(u-boot-env\),2048k\(factory\),2048k\(fip\),112640k\(ubi_1\),112640k\(ubi\),384k\(cert\),640k\(userconfig\),384k\(crashdump\)
fw_setenv mtdparts nmbm0:1024k\(bl2\),512k\(u-boot-env\),2048k\(factory\),2048k\(fip\),56320k\(ubi_1\),56320k\(ubi\),384k\(cert\),640k\(userconfig\),384k\(crashdump\)
else
fw_setenv active_fw 0
fw_setenv mtdparts nmbm0:1024k\(bl2\),512k\(u-boot-env\),2048k\(factory\),2048k\(fip\),112640k\(ubi\),112640k\(ubi_1\),384k\(cert\),640k\(userconfig\),384k\(crashdump\)
fw_setenv mtdparts nmbm0:1024k\(bl2\),512k\(u-boot-env\),2048k\(factory\),2048k\(fip\),56320k\(ubi\),56320k\(ubi_1\),384k\(cert\),640k\(userconfig\),384k\(crashdump\)
fi
}
@@ -47,6 +47,7 @@ platform_do_upgrade() {
nand_do_upgrade "$1"
;;
senao,iap2300m|\
emplus,wap588m|\
senao,jeap6500)
CI_UBIPART="ubi_1"
nand_do_upgrade "$1"
@@ -68,6 +69,7 @@ platform_check_image() {
edgecore,eap111|\
edgecore,eap112|\
senao,iap2300m|\
emplus,wap588m|\
senao,jeap6500)
nand_do_platform_check "$board" "$1"
return $?

View File

@@ -0,0 +1,125 @@
MORSE MICRO
BINARY DISTRIBUTION LICENSE AGREEMENT
1. Parties.
This Software License Agreement (SLA) is between Morse Micro Pty. Ltd. and the
user of the Software set forth (“you”, “user”, “customer”), and is effective as
of the date of first access or download of the software by you. Morse Micro is
licensing this software to you free of charge upon the condition that you
accept all the terms of this SLA and only use this Software in conjunction with
Morse Micro products. ANY USE, REPRODUCTION, OR DISTRIBUTION OF THE SOFTWARE
CONSTITUTES YOUR ACCEPTANCE OF THIS AGREEMENT.
2. Definitions.
"Software" means any binary or source code that you have received from Morse
Micro or its authorized licensees and/or those portions of such software
produced by Programs code within the Software, as well as any other machine
readable materials (including, but not limited to, libraries, source files,
header files, and data files), any updates or error corrections provided by
Morse Micro, and any user manuals, programming guides and other documentation
provided to you by Morse Micro under this SLA.
3. License and Restrictions.
Morse Micro grants you a non-exclusive, non-transferable, limited license
without license fees to:
a. use the software solely with a hardware product that includes one of the
Morse Micro Wi-Fi HaLow chips, including
wireless modules or evaluation kits;
b. to reproduce and distribute the Software complete, unmodified, and as
provided by Morse Micro, solely for use with a hardware product that
includes one of the Morse Micro Wi-Fi HaLow chips, including wireless
modules or evaluation kits.
4. Reservation of Rights.
You should distribute Software with a copy of this SLA. Software is
copyrighted. Title to Software and all associated intellectual property rights
is retained by Morse Micro. Except as expressly provided herein, no license or
right, express or implied, is hereby conveyed or granted to you by Morse Micro.
You must retain all copyright notices on all Software, derivative works and
documentation. The intellectual property and proprietary rights of whatever
nature in the Software and derivative works are and will remain the exclusive
property of Morse Micro or its suppliers. Nothing in this Agreement should be
construed as transferring any aspects of such rights to you or any third party.
Morse Micro and its suppliers reserve any and all rights not expressly granted
in this Agreement. You may not sell, assign, sublicense, lease, or otherwise
transfer any part of this license. You must not:
a. use, license, sell or otherwise distribute the Software except as
provided in this SLA;
b. attempt to modify in any way, reverse engineer, decompile or disassemble
any portion of the Software;
c. use the Software or other material in violation of any applicable law or
regulation, including but not limited to any regulatory agency.
5. Ownership.
The Software is licensed and not sold. Title to and ownership of the Software,
including all intellectual property rights thereto, and any portion thereof
remain with Morse Micro or its licensors. You hereby covenant that you will not
assert any claim that the Software created by or for Morse Micro infringe any
intellectual property right owned or controlled by you.
6. Termination.
This SLA will terminate immediately without notice from Morse Micro if you fail
to comply with any of its provisions, including the export laws provisions and
Section 10 that may govern the export of the Software from certain
jurisdictions, including technical data.
7. Disclaimer and Limitation of Liability.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MORSE MICRO
FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING WITHOUT
LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE OR NON-INFRINGEMENT. IN NO EVENT SHALL MORSE MICRO BE LIABLE FOR ANY
INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR DAMAGES
FOR LOSS OF PROFITS, REVENUE, DATA OR DATA USE, INCURRED BY YOU OR ANY THIRD
PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT, EVEN IF MORSE MICRO HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE SOFTWARE IS NOT INTENDED FOR
USE IN ENVIRONMENTS OR APPLICATIONS WHERE EXTRAORDINARILY HIGH LEVELS OF
QUALITY, RELIABILITY, AND FAILURE TOLERANCE ARE DEMANDED, AND/OR WHERE A
MALFUNCTION OR FAILURE COULD LEAD TO SIGNIFICANT HARM TO LIFE, HEALTH,
PROPERTY, OR RESULT IN SEVERE SOCIETAL REPERCUSSIONS ("CRITICAL APPLICATIONS").
CRITICAL APPLICATIONS ENCOMPASS, BUT ARE NOT LIMITED TO, EQUIPMENT UTILIZED IN
NUCLEAR FACILITIES, AVIATION AND SPACE EQUIPMENT, MEDICAL DEVICES, AUTOMOTIVE,
TRAIN, MARINE, AND OTHER TRANSPORTATION EQUIPMENT, DEVICES INVOLVED IN
CONTROLLING COMBUSTION OR EXPLOSIONS, SAFETY DEVICES, ELEVATORS AND ESCALATORS,
DEVICES ASSOCIATED WITH ELECTRIC POWER, AND EQUIPMENT USED IN FINANCE-RELATED
FIELDS.
8. Survival.
Sections 4, 5, 6, 7 and 10 will survive termination or expiration of this SLA.
9. Privacy.
Some features of the Software, if activated, may transmit a limited amount of
data to Morse Micro (or its service provider) about the status of the system
before a crash event. Morse Micro does not associate the data with personally
identifiable information.
10. Export Laws.
YOU UNDERSTAND AND AGREE THAT THE SOFTWARE IS SUBJECT TO ALL APPLICABLE EXPORT-
RELATED LAWS AND REGULATIONS AND THAT YOU MAY NOT EXPORT, RE-EXPORT OR TRANSFER
THE SOFTWARE OR ANY DIRECT PRODUCT OF THE SOFTWARE EXCEPT AS PERMITTED UNDER
THOSE LAWS. WITHOUT LIMITING THE FOREGOING, EXPORT, RE-EXPORT, OR TRANSFER OF
THE SOFTWARE TO CUBA, IRAN, NORTH KOREA, SUDAN, AND SYRIA IS PROHIBITED.
11. Governing Law.
The laws of New South Wales, Australia, govern all matters arising out of or
relating to this SLA without giving effect to any conflict of law principles.
If any provision of this SLA is held to be unenforceable, this SLA will remain
in effect with the provision omitted, unless omission would frustrate the
intent of the parties, in which case this Agreement will immediately terminate.
12. Entire Agreement.
This Agreement constitutes the entire agreement between the parties and
supersedes all prior and contemporaneous agreements, proposals or
representations, written or oral, concerning its subject matter. No
modification, amendment, or waiver of any provision of this Agreement will be
effective unless in writing and either signed or accepted electronically by the
party against whom the modification, amendment or waiver is to be asserted. A
waiver of any breach under this Agreement does not constitute a waiver of any
other breach or future breach.
MORSE MICRO

View File

@@ -0,0 +1,86 @@
#
# Copyright 2022 Morse Micro
#
# This is free software, licensed under the MIT License.
#
# This package installs Morse Micro board configuration binaries, which are
# distributed under the Morse Micro Binary Distribution License.
# This license is available in LICENSE.binaries.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=morse-board-config
PKG_RELEASE=6
PKG_VERSION:=rel_1_12_4_2024_Jun_11
PKG_SOURCE:=morsemicro-bcf-rel_1_12_4_2024_Jun_11.tar
PKG_SOURCE_URL:=https://github.com/MorseMicro/bcf_binaries/releases/download/v1.12.4/
PKG_HASH:=e403764730aa149e78874135da154bab2a24574308d3f2df88c9b4c125766ae3
PKG_MAINTAINER:=Morse Micro <info@morsemicro.com>
PKG_BUILD_PARALLEL:=1
RSTRIP:=:
include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/package.mk
define Package/morse-board-config
SECTION:=firmware
CATEGORY:=Firmware
URL:=$(PKG_SOURCE_URL)
TITLE:=Morse Micro WIFI HaLow Board Config File
PROVIDES:=morse-board-config
endef
define Package/morse-board-config-hotplug-model
SECTION:=firmware
CATEGORY:=Firmware
TITLE:=Hotplug scripts for module type reporting
DEPENDS:=+morse-board-config
endef
define Package/morse-board-config-hotplug-model/description
When enabled, a hotplug script will be installed to
append a relevant module type suffix based on the value
programmed into the Morse chips OTP bits.
endef
TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
define Build/Compile
endef
define Package/morse-board-config/install
$(INSTALL_DIR) $(1)/usr/share/morse-bcf
$(INSTALL_DIR) $(1)/lib/firmware/morse
$(INSTALL_DATA) $(PKG_BUILD_DIR)/lib/firmware/morse/* $(1)/lib/firmware/morse/
# Install all files from override folder, including failsafe.
$(INSTALL_DATA) ./files/lib/firmware/morse/* $(1)/lib/firmware/morse/
ifeq ($(CONFIG_TARGET_PROFILE), "DEVICE_edgecore_eap112")
ln -s /lib/firmware/morse/bcf_edgecore_eap112_fcc.bin $(1)/lib/firmware/morse/bcf_default.bin
else
# Link the failsafe bcf by default so userspace can query the driver.
ln -s /lib/firmware/morse/bcf_failsafe.bin $(1)/lib/firmware/morse/bcf_default.bin
endif
# Create symlinks for the production programmed otp devices
while IFS=, read -r board_type suffix serial; do \
ln -s /lib/firmware/morse/bcf_$$$${serial}.bin $(1)/lib/firmware/morse/bcf_boardtype_$$$${board_type}.bin; \
done < ./files/usr/share/morse-bcf/db.txt
$(INSTALL_DATA) ./files/usr/share/morse-bcf/db.txt $(1)/usr/share/morse-bcf/db.txt
endef
define Package/morse-board-config-hotplug-model/install
$(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211
$(INSTALL_DATA) ./files/etc/hotplug.d/ieee80211/20-module-type $(1)/etc/hotplug.d/ieee80211/20-module-type
endef
$(eval $(call BuildPackage,morse-board-config))
$(eval $(call BuildPackage,morse-board-config-hotplug-model))

View File

@@ -0,0 +1,19 @@
#!/bin/sh
[ "${ACTION}" = "add" ] && {
basename "$(readlink -f "/sys/${DEVPATH}/device/driver")" | grep '^morse_' || return;
board_type=$(printf "%04x" "$(cat /sys/${DEVPATH}/device/board_type)");
# Avoid mutating model information when OTP is not burnt, ie 0000.
[ "$board_type" = "0000" ] && return;
module_id=$(awk -F, '$1==b{print toupper($2)}' b="$board_type" /usr/share/morse-bcf/db.txt)
model=$(cat /tmp/sysinfo/model)
# Don't append a module id if that module id already exists in the model
[ "${model%-"$module_id"}" != "${model}" ] && return;
echo "$model-$module_id" > /tmp/sysinfo/model
}

View File

@@ -0,0 +1 @@
0801,05us,mf08651_us

View File

@@ -0,0 +1,183 @@
#
# Copyright 2022 Morse Micro
#
# This is free software, licensed under the GPL 2 license.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=morse_driver
PKG_RELEASE=3
PKG_VERSION:=1.11.4
PKG_LICENSE:=GPLv2
PKG_LICENSE_FILES:=LICENSE
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/morse_driver.git
PKG_HASH:=159d018a92e0cf742795ed49bd94fb6ed324163012bb91c2a2e4e0f6037bbf23
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=b2ab42a5f22527422adf6afab73f2d019c16f162
PKG_MAINTAINER:=Morse Micro
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/package.mk
DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc)
define KernelPackage/morse
SUBMENU:=Wireless Drivers
TITLE:=Morse Micro WIFI HaLow driver
DEPENDS:= +kmod-mmc +kmod-mac80211 +kmod-trelay +kmod-lib-crc7 +morse-fw +morse-board-config
FILES:=\
$(PKG_BUILD_DIR)/morse.ko \
$(PKG_BUILD_DIR)/dot11ah/dot11ah.ko
AUTOLOAD:=$(call AutoProbe,morse)
MODPARAMS.morse:=country=US
PROVIDES:=kmod-morse
endef
define KernelPackage/morse/config
config MORSE_SDIO
bool "SDIO support "
default n
depends on PACKAGE_kmod-morse
config MORSE_SPI
bool "SPI support "
default y
depends on PACKAGE_kmod-morse
config MORSE_USER_ACCESS
bool "User space access support "
default y
depends on PACKAGE_kmod-morse
config MORSE_VENDOR_COMMAND
bool "Vendor command support "
default y
depends on PACKAGE_kmod-morse
config MORSE_MONITOR
bool "Monitor mode support "
default n
depends on PACKAGE_kmod-morse
config MORSE_DEBUG
bool "Enable debug "
default n
depends on PACKAGE_kmod-morse
help
Compiles the driver with debug info and some additional debug features.
config MORSE_DEBUG_LOGGING
bool "Enable debug logging"
default n
depends on PACKAGE_kmod-morse
select KERNEL_DYNAMIC_DEBUG_CORE
help
Enables debug level logging from the driver. Logging must be enabled at run time.
There may be a binary size and performance impact when this is y.
config MORSE_RC
bool "Enable MMRC (Morse Micro Rate Control) "
default y
depends on PACKAGE_kmod-morse
config MORSE_SDIO_ALIGNMENT
int "Required alignment for bulk SDIO reads/writes"
default 2
range 2 8
depends on MORSE_SDIO
help
Number of bytes to align data buffers for bulk SDIO transactions. Some hosts have
specific alignment requirements for DMA, use this setting to
adjust the alignment required.
Must be a power of 2.
endef
ifeq ($(CONFIG_MORSE_SDIO),y)
NOSTDINC_FLAGS += -DCONFIG_MORSE_SDIO
MORSE_MAKEDEFS += CONFIG_MORSE_SDIO=y
endif
ifeq ($(CONFIG_MORSE_SPI),y)
MORSE_MAKEDEFS += CONFIG_MORSE_SPI=y
endif
ifeq ($(CONFIG_MORSE_USER_ACCESS),y)
NOSTDINC_FLAGS += -DCONFIG_MORSE_USER_ACCESS
MORSE_MAKEDEFS += CONFIG_MORSE_USER_ACCESS=y
endif
ifeq ($(CONFIG_MORSE_VENDOR_COMMAND),y)
NOSTDINC_FLAGS += -DCONFIG_MORSE_VENDOR_COMMAND
MORSE_MAKEDEFS += CONFIG_MORSE_VENDOR_COMMAND=y
endif
ifeq ($(CONFIG_MORSE_MONITOR),y)
NOSTDINC_FLAGS += -DCONFIG_MORSE_MONITOR
MORSE_MAKEDEFS += CONFIG_MORSE_MONITOR=y
endif
ifeq ($(CONFIG_MORSE_DEBUG),y)
# This DEBUG (used by the driver Makefile) should not be confused with
# -DDEBUG (used by the kernel build system).
MORSE_MAKEDEFS += DEBUG=y
MORSE_MAKEDEFS += CONFIG_MORSE_DEBUGFS=y
MORSE_MAKEDEFS += CONFIG_MORSE_ENABLE_TEST_MODES=y
else
MORSE_MAKEDEFS += DEBUG=n
endif
ifeq ($(CONFIG_MORSE_RC),y)
NOSTDINC_FLAGS += -DCONFIG_MORSE_RC
MORSE_MAKEDEFS += CONFIG_MORSE_RC=y
endif
MORSE_MAKEDEFS += \
MORSE_VERSION=0-$(PKG_VERSION) \
KERNEL_SRC=$(LINUX_DIR) \
CONFIG_MORSE_SDIO_ALIGNMENT=$(CONFIG_MORSE_SDIO_ALIGNMENT) \
CONFIG_BACKPORT_VERSION=v5.18.1
# This refers to the version of mac80211 backported to OpenWrt
# Occasionally patches are required to remove some parts of the driver
# as OpenWrt may sometimes pull in further patches from later kernel versions
# than that of the mac80211 backport.
NOSTDINC_FLAGS = \
-I$(PKG_BUILD_DIR) \
-I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
-I$(STAGING_DIR)/usr/include/mac80211-backport \
-I$(STAGING_DIR)/usr/include/mac80211/uapi \
-I$(STAGING_DIR)/usr/include/mac80211 \
-include backport/autoconf.h \
-include backport/backport.h
ifeq ($(CONFIG_MORSE_DEBUG_LOGGING),y)
NOSTDINC_FLAGS += -DDYNAMIC_DEBUG_MODULE
NOSTDINC_FLAGS += -DDEBUG
endif
MORSE_MAKEDEFS += CONFIG_WLAN_VENDOR_MORSE=m
MORSE_MAKEDEFS += V=1
NOSTDINC_FLAGS += -DMORSE_TRACE_PATH=.
include $(INCLUDE_DIR)/kernel-defaults.mk
define Build/Compile
$(MAKE) $(MORSE_MAKEDEFS) $(PKG_JOBS) -C "$(LINUX_DIR)" \
$(KERNEL_MAKE_FLAGS) \
M="$(PKG_BUILD_DIR)" \
NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
modules
endef
$(eval $(call KernelPackage,morse))

View File

@@ -0,0 +1,15 @@
--- a/watchdog.c
+++ b/watchdog.c
@@ -54,12 +54,7 @@ static enum hrtimer_restart morse_watchd
static void watchdog_timer_start(struct morse *mors)
{
ktime_t interval = ktime_set(mors->watchdog.interval_secs, 0);
-
-#if defined(MAC80211_BACKPORT_VERSION_CODE) && (KERNEL_VERSION(4, 10, 0) <= MAC80211_VERSION_CODE)
- hrtimer_start(&mors->watchdog.timer, interval.tv64, HRTIMER_MODE_REL);
-#else
hrtimer_start(&mors->watchdog.timer, interval, HRTIMER_MODE_REL);
-#endif
}
int morse_watchdog_start(struct morse *mors)

View File

@@ -0,0 +1,60 @@
--- a/spi.c
+++ b/spi.c
@@ -175,10 +175,12 @@ static int morse_spi_setup(struct spi_de
spi->bits_per_word = 8;
spi->max_speed_hz = max_speed_hz;
+#if 0
if (spi->max_speed_hz > MAX_SPI_CLK_SPEED) {
dev_err(&spi->dev, "SPI clocks above 50MHz are not supported by Morse chip\n");
return -EPERM;
}
+#endif
ret = spi_setup(spi);
if (ret < 0) {
@@ -432,7 +434,7 @@ static u8 *morse_spi_find_data_ack(struc
{
u8 *cp = data;
- while (cp < end && *cp == 0xff)
+ while (cp < end && (SPI_MMC_RESPONSE_CODE(*cp) != SPI_RESPONSE_ACCEPTED))
cp++;
if (cp == end)
@@ -529,13 +531,10 @@ static int morse_spi_cmd53_read(struct m
cp += 4;
if (!block) {
- /* Scale bytes delay to block */
- u32 extra_bytes = (count * mspi->inter_block_delay_bytes) / MMC_SPI_BLOCKSIZE;
-
/* Allow 4 bytes for CRC and another 10 bytes for start block token & chip delays
* (usually comes in 2).
*/
- data_size = count + 4 + 4 + extra_bytes;
+ data_size = count + 4 + 4 + mspi->inter_block_delay_bytes;
if (is_rk3288)
/* Short transactions are sometimes delayed. These extra bytes give enough
* cycles to receive all the data. This could be optimised to a lower
@@ -601,6 +600,7 @@ static int morse_spi_cmd53_write(struct
u8 *resp;
u8 *end;
u8 *ack = cp;
+ u8 *test_ack;
u32 data_size;
int i;
@@ -656,10 +656,11 @@ static int morse_spi_cmd53_write(struct
/* crc */
*cp = (crc & 0xFF00) >> 8;
*(cp + 1) = (crc & 0xFF);
+ test_ack = cp + 2;
cp += sizeof(crc);
/* Allow more bytes for status and chip processing (depends on CLK) */
- cp += block ? mspi->inter_block_delay_bytes : 4;
+ cp += mspi->inter_block_delay_bytes;
}
/* Do the actual transfer */

View File

@@ -0,0 +1,13 @@
Index: morse_driver-rel_1_12_3_2024_May_23/sdio.c
===================================================================
--- morse_driver-rel_1_12_3_2024_May_23.orig/sdio.c
+++ morse_driver-rel_1_12_3_2024_May_23/sdio.c
@@ -572,7 +572,7 @@ static int morse_sdio_reset(int reset_pi
sdio_claim_host(func);
sdio_disable_func(func);
-#if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE
+#if KERNEL_VERSION(5, 18, 0) > MAC80211_VERSION_CODE
mmc_hw_reset(func->card->host);
#else
mmc_hw_reset(func->card);

View File

@@ -0,0 +1,160 @@
From 9ebc9a01e90f65f058ed21d3190800dc130b6ef4 Mon Sep 17 00:00:00 2001
From: Arien Judge <arien.judge@morsemicro.com>
Date: Wed, 28 Feb 2024 13:29:28 +1100
Subject: [PATCH] sysfs: add sysfs to export board type as a device attribute
The driver reads the board type from OTP to decide which bcf file to load,
but doesn't report this information anywhere useful.
Read the value read from OTP as a sysfs device attribute to allow userspace
applications to reliably report the module type on chip.
Opted for creating a proper sysfs device attribute here instead of using
debugfs as we shouldn't expect user tooling to have such a hard dependency
cache board id on firmware init for sysfs reporting
---
Makefile | 1 +
firmware.c | 3 +++
mac.c | 6 ++++++
morse.h | 1 +
sysfs.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
sysfs.h | 9 +++++++++
6 files changed, 66 insertions(+)
create mode 100644 sysfs.c
create mode 100644 sysfs.h
Index: morse_driver-rel_1_12_3_2024_May_23/Makefile
===================================================================
--- morse_driver-rel_1_12_3_2024_May_23.orig/Makefile
+++ morse_driver-rel_1_12_3_2024_May_23/Makefile
@@ -96,6 +96,7 @@ endif
obj-$(CONFIG_WLAN_VENDOR_MORSE) += morse.o dot11ah/
morse-y = mac.o
+morse-y += sysfs.o
morse-y += init.o
morse-y += skbq.o
morse-y += debug.o
Index: morse_driver-rel_1_12_3_2024_May_23/firmware.c
===================================================================
--- morse_driver-rel_1_12_3_2024_May_23.orig/firmware.c
+++ morse_driver-rel_1_12_3_2024_May_23/firmware.c
@@ -881,6 +881,9 @@ int morse_firmware_init(struct morse *mo
if (mors->cfg->get_board_type && enable_otp_check)
board_id = mors->cfg->get_board_type(mors);
+ /* store the board id for sysfs reporting. Propagate the error */
+ mors->board_id = board_id;
+
if (strlen(board_config_file) > 0) {
n = snprintf(bcf_path, sizeof(bcf_path), "%s/%s", MORSE_FW_DIR, board_config_file);
} else if (strlen(mors->board_serial) > 0) {
Index: morse_driver-rel_1_12_3_2024_May_23/mac.c
===================================================================
--- morse_driver-rel_1_12_3_2024_May_23.orig/mac.c
+++ morse_driver-rel_1_12_3_2024_May_23/mac.c
@@ -14,6 +14,7 @@
#include "mac.h"
#include "s1g_ies.h"
#include "bus.h"
+#include "sysfs.h"
#include "debug.h"
#include "command.h"
#include "vendor.h"
@@ -6422,6 +6423,10 @@ int morse_mac_register(struct morse *mor
INIT_WORK(&mors->driver_restart, morse_mac_restart_work);
INIT_WORK(&mors->health_check, morse_health_check_work);
+ ret = morse_sysfs_init(mors);
+ if (ret)
+ MORSE_ERR(mors, "Unable to initialise sysfs\n");
+
ret = morse_init_debug(mors);
if (ret)
MORSE_ERR(mors, "Unable to create debugfs files\n");
@@ -6593,6 +6598,7 @@ static void morse_mac_deinit(struct mors
void morse_mac_unregister(struct morse *mors)
{
+ morse_sysfs_free(mors);
morse_deinit_debug(mors);
morse_ps_disable(mors);
Index: morse_driver-rel_1_12_3_2024_May_23/morse.h
===================================================================
--- morse_driver-rel_1_12_3_2024_May_23.orig/morse.h
+++ morse_driver-rel_1_12_3_2024_May_23/morse.h
@@ -979,6 +979,7 @@ struct morse {
struct morse_debug debug;
char *board_serial;
+ int board_id;
/* Stored Channel Information, sta_type, enc_mode, RAW */
struct morse_custom_configs custom_configs;
Index: morse_driver-rel_1_12_3_2024_May_23/sysfs.c
===================================================================
--- /dev/null
+++ morse_driver-rel_1_12_3_2024_May_23/sysfs.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2024 Morse Micro
+ *
+ */
+
+#include <linux/sysfs.h>
+#include "morse.h"
+#include "sysfs.h"
+#include "debug.h"
+
+static ssize_t board_type_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct morse *mors = dev_get_drvdata(dev);
+
+ if (!mors)
+ return -EINVAL;
+
+ if (mors->board_id < 0)
+ return mors->board_id;
+
+#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE
+ return sysfs_emit(buf, "%d\n", mors->board_id);
+#else
+ return snprintf(buf, PAGE_SIZE, "%d\n", mors->board_id);
+#endif
+}
+
+static DEVICE_ATTR_RO(board_type);
+
+int morse_sysfs_init(struct morse *mors)
+{
+ int ret;
+
+ ret = device_create_file(mors->dev, &dev_attr_board_type);
+ if (ret < 0)
+ MORSE_ERR(mors, "failed to create sysfs file board_type");
+
+ return ret;
+}
+
+void morse_sysfs_free(struct morse *mors)
+{
+ device_remove_file(mors->dev, &dev_attr_board_type);
+}
Index: morse_driver-rel_1_12_3_2024_May_23/sysfs.h
===================================================================
--- /dev/null
+++ morse_driver-rel_1_12_3_2024_May_23/sysfs.h
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2024 Morse Micro
+ *
+ */
+
+#pragma once
+
+int morse_sysfs_init(struct morse *mors);
+void morse_sysfs_free(struct morse *mors);

View File

@@ -0,0 +1,13 @@
--- a/sdio.c
+++ b/sdio.c
@@ -587,9 +587,5 @@ static int morse_sdio_reset(int reset_pi
sdio_claim_host(func);
sdio_disable_func(func);
-#if KERNEL_VERSION(5, 18, 0) > MAC80211_VERSION_CODE
mmc_hw_reset(func->card->host);
-#else
- mmc_hw_reset(func->card);
-#endif
sdio_enable_func(func);
sdio_release_host(func);

View File

@@ -0,0 +1,73 @@
--- a/spi.c 2025-01-10 18:08:57.753837165 +0800
+++ b/spi.c 2025-01-13 14:17:01.746850459 +0800
@@ -1057,7 +1057,7 @@ static irqreturn_t morse_spi_irq_handler
struct morse *mors = spi_get_drvdata(mspi->spi);
MORSE_WARN_ON(FEATURE_ID_SPI, !mors);
- if (irq == gpio_to_irq(mors->cfg->mm_spi_irq_gpio)) {
+
/*
* If we are using edge interrupts, we need to continuously service the IRQ until
* either the chip has cleared all its IRQ bits, or the pin goes high again.
@@ -1067,8 +1067,7 @@ static irqreturn_t morse_spi_irq_handler
} while (spi_use_edge_irq && ret && !gpio_get_value(mors->cfg->mm_spi_irq_gpio));
return IRQ_HANDLED;
- }
- return IRQ_NONE;
+
}
static void morse_spi_enable_irq(struct morse_spi *mspi)
@@ -1311,10 +1310,15 @@ static int morse_spi_probe(struct spi_de
ret = morse_spi_cmd(mspi, SD_IO_MORSE_INIT, 0x00000000);
if (!ret)
break;
- pr_info("%s: SD_IO_RESET\n", __func__);
+ MORSE_DBG(mors, "%s: SD_IO_RESET\n", __func__);
morse_spi_cmd(mspi, SD_IO_RESET, 0x00000000);
}
+ if (ret) {
+ MORSE_SPI_ERR(mors, "failed initialise SPI: %d\n", ret);
+ goto err_cfg;
+ }
+
ret = morse_chip_cfg_detect_and_init(mors, mors_chip_series);
if (ret) {
MORSE_SPI_ERR(mors, "morse_chip_cfg_detect_and_init failed: %d\n", ret);
@@ -1327,7 +1331,11 @@ static int morse_spi_probe(struct spi_de
mors->cfg->mm_ps_gpios_supported = true;
ret = morse_spi_reg32_read(mors, MORSE_REG_CHIP_ID(mors), &mors->chip_id);
- if (!ret) {
+ if (ret) {
+ MORSE_SPI_ERR(mors, "failed to read chip id: %d\n", ret);
+ goto err_cfg;
+ }
+
/* Find out if the chip id matches our records */
if (!morse_hw_is_valid_chip_id(mors->chip_id, mors->cfg->valid_chip_ids)) {
MORSE_SPI_ERR(mors, "%s Morse chip (ChipId=0x%x) not supported\n",
@@ -1357,9 +1365,6 @@ static int morse_spi_probe(struct spi_de
mspi->inter_block_delay_bytes);
}
}
- } else {
- goto err_cfg;
- }
MORSE_SPI_INFO(mors, "Morse Micro SPI device found, chip ID=0x%04x\n", mors->chip_id);
MORSE_SPI_INFO(mors, "Board serial: %s\n", mors->board_serial);
@@ -1442,6 +1447,11 @@ static int morse_spi_probe(struct spi_de
#ifdef CONFIG_MORSE_ENABLE_TEST_MODES
if (test_mode == MORSE_CONFIG_TEST_MODE_BUS)
ret = morse_bus_test(mors, "SPI");
+
+ if (test_mode == MORSE_CONFIG_TEST_MODE_BUS_PROFILE) {
+ morse_bus_throughput_profiler(mors);
+ morse_spi_disable_irq(mspi);
+ }
#endif
return ret;

View File

@@ -0,0 +1,125 @@
MORSE MICRO
BINARY DISTRIBUTION LICENSE AGREEMENT
1. Parties.
This Software License Agreement (SLA) is between Morse Micro Pty. Ltd. and the
user of the Software set forth (“you”, “user”, “customer”), and is effective as
of the date of first access or download of the software by you. Morse Micro is
licensing this software to you free of charge upon the condition that you
accept all the terms of this SLA and only use this Software in conjunction with
Morse Micro products. ANY USE, REPRODUCTION, OR DISTRIBUTION OF THE SOFTWARE
CONSTITUTES YOUR ACCEPTANCE OF THIS AGREEMENT.
2. Definitions.
"Software" means any binary or source code that you have received from Morse
Micro or its authorized licensees and/or those portions of such software
produced by Programs code within the Software, as well as any other machine
readable materials (including, but not limited to, libraries, source files,
header files, and data files), any updates or error corrections provided by
Morse Micro, and any user manuals, programming guides and other documentation
provided to you by Morse Micro under this SLA.
3. License and Restrictions.
Morse Micro grants you a non-exclusive, non-transferable, limited license
without license fees to:
a. use the software solely with a hardware product that includes one of the
Morse Micro Wi-Fi HaLow chips, including
wireless modules or evaluation kits;
b. to reproduce and distribute the Software complete, unmodified, and as
provided by Morse Micro, solely for use with a hardware product that
includes one of the Morse Micro Wi-Fi HaLow chips, including wireless
modules or evaluation kits.
4. Reservation of Rights.
You should distribute Software with a copy of this SLA. Software is
copyrighted. Title to Software and all associated intellectual property rights
is retained by Morse Micro. Except as expressly provided herein, no license or
right, express or implied, is hereby conveyed or granted to you by Morse Micro.
You must retain all copyright notices on all Software, derivative works and
documentation. The intellectual property and proprietary rights of whatever
nature in the Software and derivative works are and will remain the exclusive
property of Morse Micro or its suppliers. Nothing in this Agreement should be
construed as transferring any aspects of such rights to you or any third party.
Morse Micro and its suppliers reserve any and all rights not expressly granted
in this Agreement. You may not sell, assign, sublicense, lease, or otherwise
transfer any part of this license. You must not:
a. use, license, sell or otherwise distribute the Software except as
provided in this SLA;
b. attempt to modify in any way, reverse engineer, decompile or disassemble
any portion of the Software;
c. use the Software or other material in violation of any applicable law or
regulation, including but not limited to any regulatory agency.
5. Ownership.
The Software is licensed and not sold. Title to and ownership of the Software,
including all intellectual property rights thereto, and any portion thereof
remain with Morse Micro or its licensors. You hereby covenant that you will not
assert any claim that the Software created by or for Morse Micro infringe any
intellectual property right owned or controlled by you.
6. Termination.
This SLA will terminate immediately without notice from Morse Micro if you fail
to comply with any of its provisions, including the export laws provisions and
Section 10 that may govern the export of the Software from certain
jurisdictions, including technical data.
7. Disclaimer and Limitation of Liability.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MORSE MICRO
FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING WITHOUT
LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE OR NON-INFRINGEMENT. IN NO EVENT SHALL MORSE MICRO BE LIABLE FOR ANY
INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR DAMAGES
FOR LOSS OF PROFITS, REVENUE, DATA OR DATA USE, INCURRED BY YOU OR ANY THIRD
PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT, EVEN IF MORSE MICRO HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE SOFTWARE IS NOT INTENDED FOR
USE IN ENVIRONMENTS OR APPLICATIONS WHERE EXTRAORDINARILY HIGH LEVELS OF
QUALITY, RELIABILITY, AND FAILURE TOLERANCE ARE DEMANDED, AND/OR WHERE A
MALFUNCTION OR FAILURE COULD LEAD TO SIGNIFICANT HARM TO LIFE, HEALTH,
PROPERTY, OR RESULT IN SEVERE SOCIETAL REPERCUSSIONS ("CRITICAL APPLICATIONS").
CRITICAL APPLICATIONS ENCOMPASS, BUT ARE NOT LIMITED TO, EQUIPMENT UTILIZED IN
NUCLEAR FACILITIES, AVIATION AND SPACE EQUIPMENT, MEDICAL DEVICES, AUTOMOTIVE,
TRAIN, MARINE, AND OTHER TRANSPORTATION EQUIPMENT, DEVICES INVOLVED IN
CONTROLLING COMBUSTION OR EXPLOSIONS, SAFETY DEVICES, ELEVATORS AND ESCALATORS,
DEVICES ASSOCIATED WITH ELECTRIC POWER, AND EQUIPMENT USED IN FINANCE-RELATED
FIELDS.
8. Survival.
Sections 4, 5, 6, 7 and 10 will survive termination or expiration of this SLA.
9. Privacy.
Some features of the Software, if activated, may transmit a limited amount of
data to Morse Micro (or its service provider) about the status of the system
before a crash event. Morse Micro does not associate the data with personally
identifiable information.
10. Export Laws.
YOU UNDERSTAND AND AGREE THAT THE SOFTWARE IS SUBJECT TO ALL APPLICABLE EXPORT-
RELATED LAWS AND REGULATIONS AND THAT YOU MAY NOT EXPORT, RE-EXPORT OR TRANSFER
THE SOFTWARE OR ANY DIRECT PRODUCT OF THE SOFTWARE EXCEPT AS PERMITTED UNDER
THOSE LAWS. WITHOUT LIMITING THE FOREGOING, EXPORT, RE-EXPORT, OR TRANSFER OF
THE SOFTWARE TO CUBA, IRAN, NORTH KOREA, SUDAN, AND SYRIA IS PROHIBITED.
11. Governing Law.
The laws of New South Wales, Australia, govern all matters arising out of or
relating to this SLA without giving effect to any conflict of law principles.
If any provision of this SLA is held to be unenforceable, this SLA will remain
in effect with the provision omitted, unless omission would frustrate the
intent of the parties, in which case this Agreement will immediately terminate.
12. Entire Agreement.
This Agreement constitutes the entire agreement between the parties and
supersedes all prior and contemporaneous agreements, proposals or
representations, written or oral, concerning its subject matter. No
modification, amendment, or waiver of any provision of this Agreement will be
effective unless in writing and either signed or accepted electronically by the
party against whom the modification, amendment or waiver is to be asserted. A
waiver of any breach under this Agreement does not constitute a waiver of any
other breach or future breach.
MORSE MICRO

View File

@@ -0,0 +1,53 @@
#
# Copyright 2022 Morse Micro
#
# This is free software, licensed under the MIT License.
#
# This package installs Morse Micro firmware binaries, which are
# distributed under the Morse Micro Binary Distribution License.
# This license is available in LICENSE.binaries.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=morse-fw
PKG_RELEASE=2
PKG_VERSION:=rel_1_11_4_2024_Jul_09
PKG_SOURCE:=morsemicro-fw-rel_1_11_4_2024_Jul_09.tar
PKG_SOURCE_URL:=https://github.com/MorseMicro/firmware_binaries/releases/download/v1.11.4/
PKG_HASH:=6df1e39655278adf140776b3e76b8faced41828a9d482363aed0795e96f5d241
PKG_MAINTAINER:=Morse Micro <info@morsemicro.com>
PKG_BUILD_PARALLEL:=1
RSTRIP:=:
include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/package.mk
define Package/morse-fw
SECTION:=firmware
CATEGORY:=Firmware
URL:=$(PKG_SOURCE_URL)
TITLE:=Morse Micro WIFI HaLow firmware
PROVIDES:=morse-fw
endef
TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
define Build/Compile
endef
define Package/morse-fw/install
$(INSTALL_DIR) $(1)/lib/firmware/morse/.
if [ -e ./files/lib/firmware/morse/mm6108.bin ]; then \
$(INSTALL_DATA) ./files/lib/firmware/morse/mm6108.bin $(1)/lib/firmware/morse/; \
else \
$(INSTALL_DATA) $(PKG_BUILD_DIR)/lib/firmware/morse/mm6108.bin $(1)/lib/firmware/morse/; \
fi
endef
$(eval $(call BuildPackage,morse-fw))

View File

@@ -0,0 +1,68 @@
#
# Copyright 2023 Morse Micro
#
# This is free software, licensed under the 3-Clause BSD License.
#
# Because the contents of morse_regdb are private, this package does
# some tricky things to _avoid_ downloading under normal circumstances,
# instead using a cached file stored in this repository. If you'd like
# to regenerate the cached file, do:
#
# make package/morse-regdb/clean package/morse-regdb/download package/morse-regdb/compile V=sc REGENERATE=1
#
include $(TOPDIR)/rules.mk
PKG_NAME:=morse-regdb
PKG_RELEASE:=1
PKG_BUILD_DEPENDS:=python3/host
PKG_SOURCE_VERSION:=v2.1.1
PKG_SOURCE_URL:=https://github.com/MorseMicro/morse_regdb.git
PKG_SOURCE_PROTO:=git
PKG_MIRROR_HASH:=0d074d2810f520c138427ab63ce0b8ab61f0f073cf7cd91177ad840a3322540a
PKG_VERSION:=$(PKG_SOURCE_VERSION)
include $(INCLUDE_DIR)/package.mk
# Skip download unless REGENERATE is on.
# This must occur after including package.mk, as PKG_SKIP_DOWNLOAD is defined there.
PKG_SKIP_DOWNLOAD=$(USE_SOURCE_DIR)$(USE_GIT_TREE)$(USE_GIT_SRC_CHECKOUT)$(if $(REGENERATE),,1)
define Package/morse-regdb
SECTION:=net
CATEGORY:=Network
TITLE:=Regulatory data for 802.11ah
URL:=https://bitbucket.org/morsemicro/morse_regdb/src/master/
PKGARCH:=all
endef
define Package/morse-regdb/description
Regulatory data for 802.11ah in a csv.
endef
define Build/Prepare
$(if $(REGENERATE),$(call Build/Prepare/Default))
endef
define Build/Compile
$(if $(REGENERATE),
mkdir -p artefacts
python3 $(PKG_BUILD_DIR)/regdbconverter.py -v -f csv $(PKG_BUILD_DIR)/regdb_Sub-1_GHz.tsv > artefacts/repo_channels.csv
)
mkdir -p $(PKG_BUILD_DIR)/artefacts
# Mash the 5g shim channels in.
python3 add_5g_shim_channels.py < artefacts/repo_channels.csv > $(PKG_BUILD_DIR)/artefacts/channels.csv
endef
define Package/morse-regdb/install
$(INSTALL_DIR) $(1)/usr/share/morse-regdb
$(INSTALL_DATA) $(PKG_BUILD_DIR)/artefacts/* $(1)/usr/share/morse-regdb
# Make channels.csv accessible from the web.
$(INSTALL_DIR) $(1)/www
ln -sf /usr/share/morse-regdb/channels.csv $(1)/www/halow-channels.csv
endef
$(eval $(call BuildPackage,morse-regdb))

View File

@@ -0,0 +1,88 @@
#!/usr/bin/env python3
import csv
import sys
# Fake 5g channels reported by netlink instead of 1g channels.
S1G_TO_5G= {
1: 132,
2: 134,
3: 136,
4: 'NA',
5: 36,
6: 38,
7: 40,
8: 42,
9: 44,
10: 46,
11: 48,
12: 50,
13: 52,
14: 54,
15: 56,
16: 58,
17: 60,
18: 62,
19: 64,
20: 'NA',
21: 100,
22: 102,
23: 104,
24: 106,
25: 108,
26: 110,
27: 112,
28: 114,
29: 116,
30: 118,
31: 120,
32: 122,
33: 124,
34: 126,
35: 128,
36: 'NA',
37: 149,
38: 151,
39: 153,
40: 155,
41: 157,
42: 159,
43: 161,
44: 163,
45: 165,
46: 167,
47: 169,
48: 171,
49: 173,
50: 175,
51: 177,
}
# Japanese channels are... different.
JAPAN_S1G_TO_5G = {
9: 108,
13: 36,
15: 40,
17: 44,
19: 48,
21: 64,
2: 38,
6: 46,
4: 54,
8: 62,
36: 42,
38: 58,
}
dr = csv.DictReader(sys.stdin)
dw = csv.DictWriter(sys.stdout, dr.fieldnames + ['5g_chan'], lineterminator='\n')
dw.writeheader()
for row in dr:
m = JAPAN_S1G_TO_5G if row['country_code'] == 'JP' else S1G_TO_5G
row['5g_chan'] = m.get(int(row['s1g_chan']))
assert row['5g_chan'], f'Missing 5G chan map for Channel {row["s1g_chan"]} in {row["country_code"]}'
dw.writerow(row)

View File

@@ -0,0 +1,473 @@
country_code,bw,s1g_chan,s1g_op_class,global_op_class,centre_freq_mhz,duty_cycle_ap,duty_cycle_sta,country,tx_power_max,duty_cycle_omit_ctrl_resp,pkt_spacing_ms,airtime_min_ms,airtime_max_ms,usable_banff_c
AL,1,1,6,66,863.5,10.0,2.8,Albania,16.13,False,0.0,0.0,0.0,1
AL,1,3,6,66,864.5,10.0,2.8,Albania,16.13,False,0.0,0.0,0.0,1
AL,1,5,6,66,865.5,10.0,2.8,Albania,16.13,False,0.0,0.0,0.0,1
AL,1,7,6,66,866.5,10.0,2.8,Albania,16.13,False,0.0,0.0,0.0,1
AL,1,9,6,66,867.5,10.0,2.8,Albania,16.13,False,0.0,0.0,0.0,1
AR,1,27,1,68,915.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,29,1,68,916.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,31,1,68,917.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,33,1,68,918.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,35,1,68,919.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,37,1,68,920.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,39,1,68,921.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,41,1,68,922.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,43,1,68,923.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,45,1,68,924.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,47,1,68,925.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,49,1,68,926.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,1,51,1,68,927.5,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,2,30,2,69,917.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,2,34,2,69,919.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,2,38,2,69,921.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,2,42,2,69,923.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,2,46,2,69,925.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,2,50,2,69,927.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,4,32,3,70,918.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,4,40,3,70,922.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,4,48,3,70,926.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AR,8,44,4,71,924.0,100.0,100.0,Argentina,36.0,False,0.0,0.0,0.0,1
AT,1,1,6,66,863.5,10.0,2.8,Austria,16.13,False,0.0,0.0,0.0,1
AT,1,3,6,66,864.5,10.0,2.8,Austria,16.13,False,0.0,0.0,0.0,1
AT,1,5,6,66,865.5,10.0,2.8,Austria,16.13,False,0.0,0.0,0.0,1
AT,1,7,6,66,866.5,10.0,2.8,Austria,16.13,False,0.0,0.0,0.0,1
AT,1,9,6,66,867.5,10.0,2.8,Austria,16.13,False,0.0,0.0,0.0,1
AU,1,27,22,68,915.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,29,22,68,916.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,31,22,68,917.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,33,22,68,918.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,35,22,68,919.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,37,22,68,920.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,39,22,68,921.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,41,22,68,922.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,43,22,68,923.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,45,22,68,924.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,47,22,68,925.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,49,22,68,926.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,1,51,22,68,927.5,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,2,30,23,69,917.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,2,34,23,69,919.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,2,38,23,69,921.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,2,42,23,69,923.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,2,46,23,69,925.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,2,50,23,69,927.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,4,32,24,70,918.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,4,40,24,70,922.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,4,48,24,70,926.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
AU,8,44,25,71,924.0,100.0,100.0,Australia,30.0,False,0.0,0.0,0.0,1
BA,1,1,6,66,863.5,10.0,2.8,Bosnia and Herzegovina,16.13,False,0.0,0.0,0.0,1
BA,1,3,6,66,864.5,10.0,2.8,Bosnia and Herzegovina,16.13,False,0.0,0.0,0.0,1
BA,1,5,6,66,865.5,10.0,2.8,Bosnia and Herzegovina,16.13,False,0.0,0.0,0.0,1
BA,1,7,6,66,866.5,10.0,2.8,Bosnia and Herzegovina,16.13,False,0.0,0.0,0.0,1
BA,1,9,6,66,867.5,10.0,2.8,Bosnia and Herzegovina,16.13,False,0.0,0.0,0.0,1
BE,1,1,6,66,863.5,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,3,6,66,864.5,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,5,6,66,865.5,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,7,6,66,866.5,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,9,6,66,867.5,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,31,30,77,916.9,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,33,30,77,917.9,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BE,1,35,30,77,918.9,10.0,2.8,Belgium,16.13,False,0.0,0.0,0.0,1
BG,1,1,6,66,863.5,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BG,1,3,6,66,864.5,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BG,1,5,6,66,865.5,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BG,1,7,6,66,866.5,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BG,1,9,6,66,867.5,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BG,1,33,30,77,917.9,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BG,1,35,30,77,918.9,10.0,2.8,Bulgaria,16.13,False,0.0,0.0,0.0,1
BR,1,1,1,68,902.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,0
BR,1,3,1,68,903.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,5,1,68,904.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,7,1,68,905.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,9,1,68,906.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,2,2,69,903.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,0
BR,2,6,2,69,905.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,27,1,68,915.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,29,1,68,916.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,31,1,68,917.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,33,1,68,918.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,35,1,68,919.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,37,1,68,920.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,39,1,68,921.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,41,1,68,922.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,43,1,68,923.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,45,1,68,924.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,47,1,68,925.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,49,1,68,926.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,1,51,1,68,927.5,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,30,2,69,917.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,34,2,69,919.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,38,2,69,921.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,42,2,69,923.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,46,2,69,925.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,2,50,2,69,927.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,4,32,3,70,918.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,4,40,3,70,922.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,4,48,3,70,926.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
BR,8,44,4,71,924.0,100.0,100.0,Brazil,36.0,False,0.0,0.0,0.0,1
CA,1,1,1,68,902.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,0
CA,1,3,1,68,903.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,5,1,68,904.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,7,1,68,905.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,9,1,68,906.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,11,1,68,907.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,13,1,68,908.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,15,1,68,909.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,17,1,68,910.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,19,1,68,911.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,21,1,68,912.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,23,1,68,913.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,25,1,68,914.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,27,1,68,915.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,29,1,68,916.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,31,1,68,917.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,33,1,68,918.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,35,1,68,919.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,37,1,68,920.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,39,1,68,921.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,41,1,68,922.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,43,1,68,923.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,45,1,68,924.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,47,1,68,925.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,49,1,68,926.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,1,51,1,68,927.5,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,2,2,69,903.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,0
CA,2,6,2,69,905.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,10,2,69,907.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,14,2,69,909.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,18,2,69,911.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,22,2,69,913.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,26,2,69,915.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,30,2,69,917.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,34,2,69,919.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,38,2,69,921.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,42,2,69,923.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,46,2,69,925.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,2,50,2,69,927.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,4,8,3,70,906.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,4,16,3,70,910.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,4,24,3,70,914.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,4,32,3,70,918.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,4,40,3,70,922.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,4,48,3,70,926.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,8,12,4,71,908.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,8,28,4,71,916.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CA,8,44,4,71,924.0,100.0,100.0,Canada,36.0,False,0.0,0.0,0.0,1
CH,1,1,6,66,863.5,10.0,2.8,Switzerland,16.13,False,0.0,0.0,0.0,1
CH,1,3,6,66,864.5,10.0,2.8,Switzerland,16.13,False,0.0,0.0,0.0,1
CH,1,5,6,66,865.5,10.0,2.8,Switzerland,16.13,False,0.0,0.0,0.0,1
CH,1,7,6,66,866.5,10.0,2.8,Switzerland,16.13,False,0.0,0.0,0.0,1
CH,1,9,6,66,867.5,10.0,2.8,Switzerland,16.13,False,0.0,0.0,0.0,1
CY,1,1,6,66,863.5,10.0,2.8,Cypress,16.13,False,0.0,0.0,0.0,1
CY,1,3,6,66,864.5,10.0,2.8,Cypress,16.13,False,0.0,0.0,0.0,1
CY,1,5,6,66,865.5,10.0,2.8,Cypress,16.13,False,0.0,0.0,0.0,1
CY,1,7,6,66,866.5,10.0,2.8,Cypress,16.13,False,0.0,0.0,0.0,1
CY,1,9,6,66,867.5,10.0,2.8,Cypress,16.13,False,0.0,0.0,0.0,1
CZ,1,1,6,66,863.5,10.0,2.8,Czech Republic,16.13,False,0.0,0.0,0.0,1
CZ,1,3,6,66,864.5,10.0,2.8,Czech Republic,16.13,False,0.0,0.0,0.0,1
CZ,1,5,6,66,865.5,10.0,2.8,Czech Republic,16.13,False,0.0,0.0,0.0,1
CZ,1,7,6,66,866.5,10.0,2.8,Czech Republic,16.13,False,0.0,0.0,0.0,1
CZ,1,9,6,66,867.5,10.0,2.8,Czech Republic,16.13,False,0.0,0.0,0.0,1
DD,1,1,6,66,863.5,10.0,2.8,Germany,16.13,False,0.0,0.0,0.0,1
DD,1,3,6,66,864.5,10.0,2.8,Germany,16.13,False,0.0,0.0,0.0,1
DD,1,5,6,66,865.5,10.0,2.8,Germany,16.13,False,0.0,0.0,0.0,1
DD,1,7,6,66,866.5,10.0,2.8,Germany,16.13,False,0.0,0.0,0.0,1
DD,1,9,6,66,867.5,10.0,2.8,Germany,16.13,False,0.0,0.0,0.0,1
DK,1,1,6,66,863.5,10.0,2.8,Denmark,16.13,False,0.0,0.0,0.0,1
DK,1,3,6,66,864.5,10.0,2.8,Denmark,16.13,False,0.0,0.0,0.0,1
DK,1,5,6,66,865.5,10.0,2.8,Denmark,16.13,False,0.0,0.0,0.0,1
DK,1,7,6,66,866.5,10.0,2.8,Denmark,16.13,False,0.0,0.0,0.0,1
DK,1,9,6,66,867.5,10.0,2.8,Denmark,16.13,False,0.0,0.0,0.0,1
EE,1,1,6,66,863.5,10.0,2.8,Estonia,16.13,False,0.0,0.0,0.0,1
EE,1,3,6,66,864.5,10.0,2.8,Estonia,16.13,False,0.0,0.0,0.0,1
EE,1,5,6,66,865.5,10.0,2.8,Estonia,16.13,False,0.0,0.0,0.0,1
EE,1,7,6,66,866.5,10.0,2.8,Estonia,16.13,False,0.0,0.0,0.0,1
EE,1,9,6,66,867.5,10.0,2.8,Estonia,16.13,False,0.0,0.0,0.0,1
ES,1,1,6,66,863.5,10.0,2.8,Spain,16.13,False,0.0,0.0,0.0,1
ES,1,3,6,66,864.5,10.0,2.8,Spain,16.13,False,0.0,0.0,0.0,1
ES,1,5,6,66,865.5,10.0,2.8,Spain,16.13,False,0.0,0.0,0.0,1
ES,1,7,6,66,866.5,10.0,2.8,Spain,16.13,False,0.0,0.0,0.0,1
ES,1,9,6,66,867.5,10.0,2.8,Spain,16.13,False,0.0,0.0,0.0,1
EU,1,1,6,66,863.5,10.0,2.8,EU,16.13,False,0.0,0.0,0.0,1
EU,1,3,6,66,864.5,10.0,2.8,EU,16.13,False,0.0,0.0,0.0,1
EU,1,5,6,66,865.5,10.0,2.8,EU,16.13,False,0.0,0.0,0.0,1
EU,1,7,6,66,866.5,10.0,2.8,EU,16.13,False,0.0,0.0,0.0,1
EU,1,9,6,66,867.5,10.0,2.8,EU,16.13,False,0.0,0.0,0.0,1
FI,1,1,6,66,863.5,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FI,1,3,6,66,864.5,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FI,1,5,6,66,865.5,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FI,1,7,6,66,866.5,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FI,1,9,6,66,867.5,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FI,1,33,30,77,917.9,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FI,1,35,30,77,918.9,10.0,2.8,Finland,16.13,False,0.0,0.0,0.0,1
FL,1,1,6,66,863.5,10.0,2.8,Liechtenstein,16.13,False,0.0,0.0,0.0,1
FL,1,3,6,66,864.5,10.0,2.8,Liechtenstein,16.13,False,0.0,0.0,0.0,1
FL,1,5,6,66,865.5,10.0,2.8,Liechtenstein,16.13,False,0.0,0.0,0.0,1
FL,1,7,6,66,866.5,10.0,2.8,Liechtenstein,16.13,False,0.0,0.0,0.0,1
FL,1,9,6,66,867.5,10.0,2.8,Liechtenstein,16.13,False,0.0,0.0,0.0,1
FR,1,1,6,66,863.5,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
FR,1,3,6,66,864.5,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
FR,1,5,6,66,865.5,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
FR,1,7,6,66,866.5,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
FR,1,9,6,66,867.5,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
FR,1,33,30,77,917.9,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
FR,1,35,30,77,918.9,10.0,2.8,France,16.13,False,0.0,0.0,0.0,1
GR,1,1,6,66,863.5,10.0,2.8,Greece,16.13,False,0.0,0.0,0.0,1
GR,1,3,6,66,864.5,10.0,2.8,Greece,16.13,False,0.0,0.0,0.0,1
GR,1,5,6,66,865.5,10.0,2.8,Greece,16.13,False,0.0,0.0,0.0,1
GR,1,7,6,66,866.5,10.0,2.8,Greece,16.13,False,0.0,0.0,0.0,1
GR,1,9,6,66,867.5,10.0,2.8,Greece,16.13,False,0.0,0.0,0.0,1
HR,1,1,6,66,863.5,10.0,2.8,Croatia,16.13,False,0.0,0.0,0.0,1
HR,1,3,6,66,864.5,10.0,2.8,Croatia,16.13,False,0.0,0.0,0.0,1
HR,1,5,6,66,865.5,10.0,2.8,Croatia,16.13,False,0.0,0.0,0.0,1
HR,1,7,6,66,866.5,10.0,2.8,Croatia,16.13,False,0.0,0.0,0.0,1
HR,1,9,6,66,867.5,10.0,2.8,Croatia,16.13,False,0.0,0.0,0.0,1
HU,1,1,6,66,863.5,10.0,2.8,Hungary,16.13,False,0.0,0.0,0.0,1
HU,1,3,6,66,864.5,10.0,2.8,Hungary,16.13,False,0.0,0.0,0.0,1
HU,1,5,6,66,865.5,10.0,2.8,Hungary,16.13,False,0.0,0.0,0.0,1
HU,1,7,6,66,866.5,10.0,2.8,Hungary,16.13,False,0.0,0.0,0.0,1
HU,1,9,6,66,867.5,10.0,2.8,Hungary,16.13,False,0.0,0.0,0.0,1
IE,1,1,6,66,863.5,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,3,6,66,864.5,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,5,6,66,865.5,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,7,6,66,866.5,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,9,6,66,867.5,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,31,30,77,916.9,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,33,30,77,917.9,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IE,1,35,30,77,918.9,10.0,2.8,Ireland,16.13,False,0.0,0.0,0.0,1
IN,1,5,6,66,865.5,10.0,2.8,India,16.13,False,0.0,0.0,0.0,1
IN,1,7,6,66,866.5,10.0,2.8,India,16.13,False,0.0,0.0,0.0,1
IN,1,9,6,66,867.5,10.0,2.8,India,16.13,False,0.0,0.0,0.0,1
IS,1,1,6,66,863.5,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,3,6,66,864.5,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,5,6,66,865.5,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,7,6,66,866.5,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,9,6,66,867.5,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,31,30,77,916.9,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,33,30,77,917.9,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IS,1,35,30,77,918.9,10.0,2.8,Iceland,16.13,False,0.0,0.0,0.0,1
IT,1,1,6,66,863.5,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
IT,1,3,6,66,864.5,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
IT,1,5,6,66,865.5,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
IT,1,7,6,66,866.5,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
IT,1,9,6,66,867.5,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
IT,1,33,30,77,917.9,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
IT,1,35,30,77,918.9,10.0,2.8,Italy,16.13,False,0.0,0.0,0.0,1
JP,1,9,8,73,921.0,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,1,13,8,73,923.0,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,1,15,8,73,924.0,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,1,17,8,73,925.0,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,1,19,8,73,926.0,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,1,21,8,73,927.0,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,2,2,9,64,923.5,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,2,4,10,64,924.5,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,2,6,9,64,925.5,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,2,8,10,64,926.5,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,4,36,11,65,924.5,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
JP,4,38,12,65,925.5,10.0,10.0,Japan,16.0,True,2.0,2.0,100.0,1
KE,1,1,6,66,863.5,10.0,2.8,Kenya,16.13,False,0.0,0.0,0.0,1
KE,1,3,6,66,864.5,10.0,2.8,Kenya,16.13,False,0.0,0.0,0.0,1
KE,1,5,6,66,865.5,10.0,2.8,Kenya,16.13,False,0.0,0.0,0.0,1
KE,1,7,6,66,866.5,10.0,2.8,Kenya,16.13,False,0.0,0.0,0.0,1
KE,1,9,6,66,867.5,10.0,2.8,Kenya,16.13,False,0.0,0.0,0.0,1
KR,1,1,14,74,918.0,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,1,3,14,74,919.0,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,1,5,14,74,920.0,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,1,7,14,74,921.0,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,1,9,14,74,922.0,100.0,100.0,South Korea,10.0,False,50.0,0.0,4000.0,1
KR,1,11,14,74,923.0,100.0,100.0,South Korea,10.0,False,50.0,0.0,4000.0,1
KR,2,2,15,75,918.5,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,2,6,15,75,920.5,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,2,10,15,75,922.5,100.0,100.0,South Korea,10.0,False,50.0,0.0,4000.0,1
KR,4,8,16,76,921.5,100.0,100.0,South Korea,4.77,False,50.0,0.0,4000.0,1
KR,1,18,14,74,926.5,100.0,100.0,South Korea,17.0,False,0.264,0.0,220.0,0
KR,1,20,14,74,927.5,100.0,100.0,South Korea,17.0,False,0.264,0.0,220.0,0
KR,1,22,14,74,928.5,100.0,100.0,South Korea,17.0,False,0.264,0.0,220.0,0
KR,1,24,14,74,929.5,100.0,100.0,South Korea,17.0,False,0.264,0.0,220.0,0
KR,2,19,15,75,927.0,100.0,100.0,South Korea,20.0,False,0.264,0.0,220.0,0
KR,2,23,15,75,929.0,100.0,100.0,South Korea,20.0,False,0.264,0.0,220.0,0
LT,1,1,6,66,863.5,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,3,6,66,864.5,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,5,6,66,865.5,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,7,6,66,866.5,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,9,6,66,867.5,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,31,30,77,916.9,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,33,30,77,917.9,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LT,1,35,30,77,918.9,10.0,2.8,Lithuania,16.13,False,0.0,0.0,0.0,1
LU,1,1,6,66,863.5,10.0,2.8,Luxembourg,16.13,False,0.0,0.0,0.0,1
LU,1,3,6,66,864.5,10.0,2.8,Luxembourg,16.13,False,0.0,0.0,0.0,1
LU,1,5,6,66,865.5,10.0,2.8,Luxembourg,16.13,False,0.0,0.0,0.0,1
LU,1,7,6,66,866.5,10.0,2.8,Luxembourg,16.13,False,0.0,0.0,0.0,1
LU,1,9,6,66,867.5,10.0,2.8,Luxembourg,16.13,False,0.0,0.0,0.0,1
LV,1,1,6,66,863.5,10.0,2.8,Latvia,16.13,False,0.0,0.0,0.0,1
LV,1,3,6,66,864.5,10.0,2.8,Latvia,16.13,False,0.0,0.0,0.0,1
LV,1,5,6,66,865.5,10.0,2.8,Latvia,16.13,False,0.0,0.0,0.0,1
LV,1,7,6,66,866.5,10.0,2.8,Latvia,16.13,False,0.0,0.0,0.0,1
LV,1,9,6,66,867.5,10.0,2.8,Latvia,16.13,False,0.0,0.0,0.0,1
MD,1,1,6,66,863.5,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,3,6,66,864.5,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,5,6,66,865.5,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,7,6,66,866.5,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,9,6,66,867.5,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,31,30,77,916.9,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,33,30,77,917.9,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MD,1,35,30,77,918.9,10.0,2.8,Moldova,16.13,False,0.0,0.0,0.0,1
MK,1,1,6,66,863.5,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,3,6,66,864.5,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,5,6,66,865.5,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,7,6,66,866.5,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,9,6,66,867.5,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,31,30,77,916.9,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,33,30,77,917.9,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MK,1,35,30,77,918.9,10.0,2.8,North Macedonia,16.13,False,0.0,0.0,0.0,1
MT,1,1,6,66,863.5,10.0,2.8,Malta,16.13,False,0.0,0.0,0.0,1
MT,1,3,6,66,864.5,10.0,2.8,Malta,16.13,False,0.0,0.0,0.0,1
MT,1,5,6,66,865.5,10.0,2.8,Malta,16.13,False,0.0,0.0,0.0,1
MT,1,7,6,66,866.5,10.0,2.8,Malta,16.13,False,0.0,0.0,0.0,1
MT,1,9,6,66,867.5,10.0,2.8,Malta,16.13,False,0.0,0.0,0.0,1
NL,1,1,6,66,863.5,10.0,2.8,Netherlands,16.13,False,0.0,0.0,0.0,1
NL,1,3,6,66,864.5,10.0,2.8,Netherlands,16.13,False,0.0,0.0,0.0,1
NL,1,5,6,66,865.5,10.0,2.8,Netherlands,16.13,False,0.0,0.0,0.0,1
NL,1,7,6,66,866.5,10.0,2.8,Netherlands,16.13,False,0.0,0.0,0.0,1
NL,1,9,6,66,867.5,10.0,2.8,Netherlands,16.13,False,0.0,0.0,0.0,1
NO,1,1,6,66,863.5,10.0,2.8,Norway,16.13,False,0.0,0.0,0.0,1
NO,1,3,6,66,864.5,10.0,2.8,Norway,16.13,False,0.0,0.0,0.0,1
NO,1,5,6,66,865.5,10.0,2.8,Norway,16.13,False,0.0,0.0,0.0,1
NO,1,7,6,66,866.5,10.0,2.8,Norway,16.13,False,0.0,0.0,0.0,1
NO,1,9,6,66,867.5,10.0,2.8,Norway,16.13,False,0.0,0.0,0.0,1
NZ,1,27,26,68,915.5,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,1,29,26,68,916.5,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,1,31,26,68,917.5,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,1,33,26,68,918.5,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,1,35,26,68,919.5,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,1,37,26,68,920.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,39,26,68,921.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,41,26,68,922.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,43,26,68,923.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,45,26,68,924.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,47,26,68,925.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,49,26,68,926.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,1,51,26,68,927.5,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,2,30,27,69,917.0,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,2,34,27,69,919.0,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,2,38,27,69,921.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,2,42,27,69,923.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,2,46,27,69,925.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,2,50,27,69,927.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,4,32,28,70,918.0,100.0,100.0,New Zealand,30.0,False,0.0,0.0,0.0,1
NZ,4,40,28,70,922.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,4,48,28,70,926.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
NZ,8,44,29,71,924.0,100.0,100.0,New Zealand,36.0,False,0.0,0.0,0.0,1
PL,1,1,6,66,863.5,10.0,2.8,Poland,16.13,False,0.0,0.0,0.0,1
PL,1,3,6,66,864.5,10.0,2.8,Poland,16.13,False,0.0,0.0,0.0,1
PL,1,5,6,66,865.5,10.0,2.8,Poland,16.13,False,0.0,0.0,0.0,1
PL,1,7,6,66,866.5,10.0,2.8,Poland,16.13,False,0.0,0.0,0.0,1
PL,1,9,6,66,867.5,10.0,2.8,Poland,16.13,False,0.0,0.0,0.0,1
PT,1,1,6,66,863.5,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,3,6,66,864.5,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,5,6,66,865.5,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,7,6,66,866.5,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,9,6,66,867.5,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,31,30,77,916.9,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,33,30,77,917.9,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
PT,1,35,30,77,918.9,10.0,2.8,Portugal,16.13,False,0.0,0.0,0.0,1
RO,1,1,6,66,863.5,10.0,2.8,Romania,16.13,False,0.0,0.0,0.0,1
RO,1,3,6,66,864.5,10.0,2.8,Romania,16.13,False,0.0,0.0,0.0,1
RO,1,5,6,66,865.5,10.0,2.8,Romania,16.13,False,0.0,0.0,0.0,1
RO,1,7,6,66,866.5,10.0,2.8,Romania,16.13,False,0.0,0.0,0.0,1
RO,1,9,6,66,867.5,10.0,2.8,Romania,16.13,False,0.0,0.0,0.0,1
SE,1,1,6,66,863.5,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,3,6,66,864.5,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,5,6,66,865.5,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,7,6,66,866.5,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,9,6,66,867.5,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,31,30,77,916.9,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,33,30,77,917.9,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SE,1,35,30,77,918.9,10.0,2.8,Sweden,16.13,False,0.0,0.0,0.0,1
SG,1,7,17,66,866.5,2.77,2.77,Singapore,29.14,False,100.0,0.0,1000.0,1
SG,1,9,17,66,867.5,2.77,2.77,Singapore,29.14,False,100.0,0.0,1000.0,1
SG,1,11,17,66,868.5,2.77,2.77,Singapore,29.14,False,100.0,0.0,1000.0,1
SG,2,10,19,67,868.0,2.77,2.77,Singapore,29.14,False,100.0,0.0,1000.0,1
SG,1,37,18,68,920.5,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,1,39,18,68,921.5,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,1,41,18,68,922.5,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,1,43,18,68,923.5,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,1,45,18,68,924.5,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,2,38,20,69,921.0,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,2,42,20,69,923.0,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SG,4,40,21,70,922.0,100.0,100.0,Singapore,22.15,False,0.0,0.0,0.0,1
SI,1,1,6,66,863.5,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,3,6,66,864.5,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,5,6,66,865.5,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,7,6,66,866.5,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,9,6,66,867.5,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,31,30,77,916.9,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,33,30,77,917.9,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SI,1,35,30,77,918.9,10.0,2.8,Slovenia,16.13,False,0.0,0.0,0.0,1
SK,1,1,6,66,863.5,10.0,2.8,Slovakia,16.13,False,0.0,0.0,0.0,1
SK,1,3,6,66,864.5,10.0,2.8,Slovakia,16.13,False,0.0,0.0,0.0,1
SK,1,5,6,66,865.5,10.0,2.8,Slovakia,16.13,False,0.0,0.0,0.0,1
SK,1,7,6,66,866.5,10.0,2.8,Slovakia,16.13,False,0.0,0.0,0.0,1
SK,1,9,6,66,867.5,10.0,2.8,Slovakia,16.13,False,0.0,0.0,0.0,1
TR,1,1,6,66,863.5,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
TR,1,3,6,66,864.5,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
TR,1,5,6,66,865.5,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
TR,1,7,6,66,866.5,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
TR,1,9,6,66,867.5,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
TR,1,33,30,77,917.9,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
TR,1,35,30,77,918.9,10.0,2.8,Turkey,16.13,False,0.0,0.0,0.0,1
UK,1,1,6,66,863.5,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
UK,1,3,6,66,864.5,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
UK,1,5,6,66,865.5,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
UK,1,7,6,66,866.5,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
UK,1,9,6,66,867.5,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
UK,1,33,30,77,917.9,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
UK,1,35,30,77,918.9,10.0,2.8,United Kingdom,16.13,False,0.0,0.0,0.0,1
US,1,1,1,68,902.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,0
US,1,3,1,68,903.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,5,1,68,904.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,7,1,68,905.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,9,1,68,906.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,11,1,68,907.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,13,1,68,908.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,15,1,68,909.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,17,1,68,910.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,19,1,68,911.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,21,1,68,912.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,23,1,68,913.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,25,1,68,914.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,27,1,68,915.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,29,1,68,916.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,31,1,68,917.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,33,1,68,918.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,35,1,68,919.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,37,1,68,920.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,39,1,68,921.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,41,1,68,922.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,43,1,68,923.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,45,1,68,924.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,47,1,68,925.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,49,1,68,926.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,1,51,1,68,927.5,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,2,2,69,903.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,0
US,2,6,2,69,905.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,10,2,69,907.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,14,2,69,909.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,18,2,69,911.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,22,2,69,913.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,26,2,69,915.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,30,2,69,917.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,34,2,69,919.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,38,2,69,921.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,42,2,69,923.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,46,2,69,925.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,2,50,2,69,927.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,4,8,3,70,906.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,4,16,3,70,910.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,4,24,3,70,914.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,4,32,3,70,918.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,4,40,3,70,922.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,4,48,3,70,926.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,8,12,4,71,908.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,8,28,4,71,916.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
US,8,44,4,71,924.0,100.0,100.0,USA,36.0,False,0.0,0.0,0.0,1
1 country_code bw s1g_chan s1g_op_class global_op_class centre_freq_mhz duty_cycle_ap duty_cycle_sta country tx_power_max duty_cycle_omit_ctrl_resp pkt_spacing_ms airtime_min_ms airtime_max_ms usable_banff_c
2 AL 1 1 6 66 863.5 10.0 2.8 Albania 16.13 False 0.0 0.0 0.0 1
3 AL 1 3 6 66 864.5 10.0 2.8 Albania 16.13 False 0.0 0.0 0.0 1
4 AL 1 5 6 66 865.5 10.0 2.8 Albania 16.13 False 0.0 0.0 0.0 1
5 AL 1 7 6 66 866.5 10.0 2.8 Albania 16.13 False 0.0 0.0 0.0 1
6 AL 1 9 6 66 867.5 10.0 2.8 Albania 16.13 False 0.0 0.0 0.0 1
7 AR 1 27 1 68 915.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
8 AR 1 29 1 68 916.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
9 AR 1 31 1 68 917.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
10 AR 1 33 1 68 918.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
11 AR 1 35 1 68 919.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
12 AR 1 37 1 68 920.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
13 AR 1 39 1 68 921.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
14 AR 1 41 1 68 922.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
15 AR 1 43 1 68 923.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
16 AR 1 45 1 68 924.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
17 AR 1 47 1 68 925.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
18 AR 1 49 1 68 926.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
19 AR 1 51 1 68 927.5 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
20 AR 2 30 2 69 917.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
21 AR 2 34 2 69 919.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
22 AR 2 38 2 69 921.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
23 AR 2 42 2 69 923.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
24 AR 2 46 2 69 925.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
25 AR 2 50 2 69 927.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
26 AR 4 32 3 70 918.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
27 AR 4 40 3 70 922.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
28 AR 4 48 3 70 926.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
29 AR 8 44 4 71 924.0 100.0 100.0 Argentina 36.0 False 0.0 0.0 0.0 1
30 AT 1 1 6 66 863.5 10.0 2.8 Austria 16.13 False 0.0 0.0 0.0 1
31 AT 1 3 6 66 864.5 10.0 2.8 Austria 16.13 False 0.0 0.0 0.0 1
32 AT 1 5 6 66 865.5 10.0 2.8 Austria 16.13 False 0.0 0.0 0.0 1
33 AT 1 7 6 66 866.5 10.0 2.8 Austria 16.13 False 0.0 0.0 0.0 1
34 AT 1 9 6 66 867.5 10.0 2.8 Austria 16.13 False 0.0 0.0 0.0 1
35 AU 1 27 22 68 915.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
36 AU 1 29 22 68 916.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
37 AU 1 31 22 68 917.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
38 AU 1 33 22 68 918.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
39 AU 1 35 22 68 919.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
40 AU 1 37 22 68 920.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
41 AU 1 39 22 68 921.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
42 AU 1 41 22 68 922.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
43 AU 1 43 22 68 923.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
44 AU 1 45 22 68 924.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
45 AU 1 47 22 68 925.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
46 AU 1 49 22 68 926.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
47 AU 1 51 22 68 927.5 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
48 AU 2 30 23 69 917.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
49 AU 2 34 23 69 919.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
50 AU 2 38 23 69 921.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
51 AU 2 42 23 69 923.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
52 AU 2 46 23 69 925.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
53 AU 2 50 23 69 927.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
54 AU 4 32 24 70 918.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
55 AU 4 40 24 70 922.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
56 AU 4 48 24 70 926.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
57 AU 8 44 25 71 924.0 100.0 100.0 Australia 30.0 False 0.0 0.0 0.0 1
58 BA 1 1 6 66 863.5 10.0 2.8 Bosnia and Herzegovina 16.13 False 0.0 0.0 0.0 1
59 BA 1 3 6 66 864.5 10.0 2.8 Bosnia and Herzegovina 16.13 False 0.0 0.0 0.0 1
60 BA 1 5 6 66 865.5 10.0 2.8 Bosnia and Herzegovina 16.13 False 0.0 0.0 0.0 1
61 BA 1 7 6 66 866.5 10.0 2.8 Bosnia and Herzegovina 16.13 False 0.0 0.0 0.0 1
62 BA 1 9 6 66 867.5 10.0 2.8 Bosnia and Herzegovina 16.13 False 0.0 0.0 0.0 1
63 BE 1 1 6 66 863.5 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
64 BE 1 3 6 66 864.5 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
65 BE 1 5 6 66 865.5 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
66 BE 1 7 6 66 866.5 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
67 BE 1 9 6 66 867.5 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
68 BE 1 31 30 77 916.9 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
69 BE 1 33 30 77 917.9 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
70 BE 1 35 30 77 918.9 10.0 2.8 Belgium 16.13 False 0.0 0.0 0.0 1
71 BG 1 1 6 66 863.5 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
72 BG 1 3 6 66 864.5 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
73 BG 1 5 6 66 865.5 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
74 BG 1 7 6 66 866.5 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
75 BG 1 9 6 66 867.5 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
76 BG 1 33 30 77 917.9 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
77 BG 1 35 30 77 918.9 10.0 2.8 Bulgaria 16.13 False 0.0 0.0 0.0 1
78 BR 1 1 1 68 902.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 0
79 BR 1 3 1 68 903.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
80 BR 1 5 1 68 904.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
81 BR 1 7 1 68 905.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
82 BR 1 9 1 68 906.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
83 BR 2 2 2 69 903.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 0
84 BR 2 6 2 69 905.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
85 BR 1 27 1 68 915.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
86 BR 1 29 1 68 916.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
87 BR 1 31 1 68 917.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
88 BR 1 33 1 68 918.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
89 BR 1 35 1 68 919.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
90 BR 1 37 1 68 920.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
91 BR 1 39 1 68 921.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
92 BR 1 41 1 68 922.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
93 BR 1 43 1 68 923.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
94 BR 1 45 1 68 924.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
95 BR 1 47 1 68 925.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
96 BR 1 49 1 68 926.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
97 BR 1 51 1 68 927.5 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
98 BR 2 30 2 69 917.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
99 BR 2 34 2 69 919.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
100 BR 2 38 2 69 921.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
101 BR 2 42 2 69 923.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
102 BR 2 46 2 69 925.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
103 BR 2 50 2 69 927.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
104 BR 4 32 3 70 918.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
105 BR 4 40 3 70 922.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
106 BR 4 48 3 70 926.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
107 BR 8 44 4 71 924.0 100.0 100.0 Brazil 36.0 False 0.0 0.0 0.0 1
108 CA 1 1 1 68 902.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 0
109 CA 1 3 1 68 903.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
110 CA 1 5 1 68 904.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
111 CA 1 7 1 68 905.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
112 CA 1 9 1 68 906.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
113 CA 1 11 1 68 907.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
114 CA 1 13 1 68 908.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
115 CA 1 15 1 68 909.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
116 CA 1 17 1 68 910.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
117 CA 1 19 1 68 911.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
118 CA 1 21 1 68 912.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
119 CA 1 23 1 68 913.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
120 CA 1 25 1 68 914.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
121 CA 1 27 1 68 915.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
122 CA 1 29 1 68 916.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
123 CA 1 31 1 68 917.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
124 CA 1 33 1 68 918.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
125 CA 1 35 1 68 919.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
126 CA 1 37 1 68 920.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
127 CA 1 39 1 68 921.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
128 CA 1 41 1 68 922.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
129 CA 1 43 1 68 923.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
130 CA 1 45 1 68 924.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
131 CA 1 47 1 68 925.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
132 CA 1 49 1 68 926.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
133 CA 1 51 1 68 927.5 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
134 CA 2 2 2 69 903.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 0
135 CA 2 6 2 69 905.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
136 CA 2 10 2 69 907.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
137 CA 2 14 2 69 909.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
138 CA 2 18 2 69 911.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
139 CA 2 22 2 69 913.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
140 CA 2 26 2 69 915.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
141 CA 2 30 2 69 917.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
142 CA 2 34 2 69 919.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
143 CA 2 38 2 69 921.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
144 CA 2 42 2 69 923.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
145 CA 2 46 2 69 925.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
146 CA 2 50 2 69 927.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
147 CA 4 8 3 70 906.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
148 CA 4 16 3 70 910.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
149 CA 4 24 3 70 914.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
150 CA 4 32 3 70 918.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
151 CA 4 40 3 70 922.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
152 CA 4 48 3 70 926.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
153 CA 8 12 4 71 908.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
154 CA 8 28 4 71 916.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
155 CA 8 44 4 71 924.0 100.0 100.0 Canada 36.0 False 0.0 0.0 0.0 1
156 CH 1 1 6 66 863.5 10.0 2.8 Switzerland 16.13 False 0.0 0.0 0.0 1
157 CH 1 3 6 66 864.5 10.0 2.8 Switzerland 16.13 False 0.0 0.0 0.0 1
158 CH 1 5 6 66 865.5 10.0 2.8 Switzerland 16.13 False 0.0 0.0 0.0 1
159 CH 1 7 6 66 866.5 10.0 2.8 Switzerland 16.13 False 0.0 0.0 0.0 1
160 CH 1 9 6 66 867.5 10.0 2.8 Switzerland 16.13 False 0.0 0.0 0.0 1
161 CY 1 1 6 66 863.5 10.0 2.8 Cypress 16.13 False 0.0 0.0 0.0 1
162 CY 1 3 6 66 864.5 10.0 2.8 Cypress 16.13 False 0.0 0.0 0.0 1
163 CY 1 5 6 66 865.5 10.0 2.8 Cypress 16.13 False 0.0 0.0 0.0 1
164 CY 1 7 6 66 866.5 10.0 2.8 Cypress 16.13 False 0.0 0.0 0.0 1
165 CY 1 9 6 66 867.5 10.0 2.8 Cypress 16.13 False 0.0 0.0 0.0 1
166 CZ 1 1 6 66 863.5 10.0 2.8 Czech Republic 16.13 False 0.0 0.0 0.0 1
167 CZ 1 3 6 66 864.5 10.0 2.8 Czech Republic 16.13 False 0.0 0.0 0.0 1
168 CZ 1 5 6 66 865.5 10.0 2.8 Czech Republic 16.13 False 0.0 0.0 0.0 1
169 CZ 1 7 6 66 866.5 10.0 2.8 Czech Republic 16.13 False 0.0 0.0 0.0 1
170 CZ 1 9 6 66 867.5 10.0 2.8 Czech Republic 16.13 False 0.0 0.0 0.0 1
171 DD 1 1 6 66 863.5 10.0 2.8 Germany 16.13 False 0.0 0.0 0.0 1
172 DD 1 3 6 66 864.5 10.0 2.8 Germany 16.13 False 0.0 0.0 0.0 1
173 DD 1 5 6 66 865.5 10.0 2.8 Germany 16.13 False 0.0 0.0 0.0 1
174 DD 1 7 6 66 866.5 10.0 2.8 Germany 16.13 False 0.0 0.0 0.0 1
175 DD 1 9 6 66 867.5 10.0 2.8 Germany 16.13 False 0.0 0.0 0.0 1
176 DK 1 1 6 66 863.5 10.0 2.8 Denmark 16.13 False 0.0 0.0 0.0 1
177 DK 1 3 6 66 864.5 10.0 2.8 Denmark 16.13 False 0.0 0.0 0.0 1
178 DK 1 5 6 66 865.5 10.0 2.8 Denmark 16.13 False 0.0 0.0 0.0 1
179 DK 1 7 6 66 866.5 10.0 2.8 Denmark 16.13 False 0.0 0.0 0.0 1
180 DK 1 9 6 66 867.5 10.0 2.8 Denmark 16.13 False 0.0 0.0 0.0 1
181 EE 1 1 6 66 863.5 10.0 2.8 Estonia 16.13 False 0.0 0.0 0.0 1
182 EE 1 3 6 66 864.5 10.0 2.8 Estonia 16.13 False 0.0 0.0 0.0 1
183 EE 1 5 6 66 865.5 10.0 2.8 Estonia 16.13 False 0.0 0.0 0.0 1
184 EE 1 7 6 66 866.5 10.0 2.8 Estonia 16.13 False 0.0 0.0 0.0 1
185 EE 1 9 6 66 867.5 10.0 2.8 Estonia 16.13 False 0.0 0.0 0.0 1
186 ES 1 1 6 66 863.5 10.0 2.8 Spain 16.13 False 0.0 0.0 0.0 1
187 ES 1 3 6 66 864.5 10.0 2.8 Spain 16.13 False 0.0 0.0 0.0 1
188 ES 1 5 6 66 865.5 10.0 2.8 Spain 16.13 False 0.0 0.0 0.0 1
189 ES 1 7 6 66 866.5 10.0 2.8 Spain 16.13 False 0.0 0.0 0.0 1
190 ES 1 9 6 66 867.5 10.0 2.8 Spain 16.13 False 0.0 0.0 0.0 1
191 EU 1 1 6 66 863.5 10.0 2.8 EU 16.13 False 0.0 0.0 0.0 1
192 EU 1 3 6 66 864.5 10.0 2.8 EU 16.13 False 0.0 0.0 0.0 1
193 EU 1 5 6 66 865.5 10.0 2.8 EU 16.13 False 0.0 0.0 0.0 1
194 EU 1 7 6 66 866.5 10.0 2.8 EU 16.13 False 0.0 0.0 0.0 1
195 EU 1 9 6 66 867.5 10.0 2.8 EU 16.13 False 0.0 0.0 0.0 1
196 FI 1 1 6 66 863.5 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
197 FI 1 3 6 66 864.5 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
198 FI 1 5 6 66 865.5 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
199 FI 1 7 6 66 866.5 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
200 FI 1 9 6 66 867.5 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
201 FI 1 33 30 77 917.9 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
202 FI 1 35 30 77 918.9 10.0 2.8 Finland 16.13 False 0.0 0.0 0.0 1
203 FL 1 1 6 66 863.5 10.0 2.8 Liechtenstein 16.13 False 0.0 0.0 0.0 1
204 FL 1 3 6 66 864.5 10.0 2.8 Liechtenstein 16.13 False 0.0 0.0 0.0 1
205 FL 1 5 6 66 865.5 10.0 2.8 Liechtenstein 16.13 False 0.0 0.0 0.0 1
206 FL 1 7 6 66 866.5 10.0 2.8 Liechtenstein 16.13 False 0.0 0.0 0.0 1
207 FL 1 9 6 66 867.5 10.0 2.8 Liechtenstein 16.13 False 0.0 0.0 0.0 1
208 FR 1 1 6 66 863.5 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
209 FR 1 3 6 66 864.5 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
210 FR 1 5 6 66 865.5 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
211 FR 1 7 6 66 866.5 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
212 FR 1 9 6 66 867.5 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
213 FR 1 33 30 77 917.9 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
214 FR 1 35 30 77 918.9 10.0 2.8 France 16.13 False 0.0 0.0 0.0 1
215 GR 1 1 6 66 863.5 10.0 2.8 Greece 16.13 False 0.0 0.0 0.0 1
216 GR 1 3 6 66 864.5 10.0 2.8 Greece 16.13 False 0.0 0.0 0.0 1
217 GR 1 5 6 66 865.5 10.0 2.8 Greece 16.13 False 0.0 0.0 0.0 1
218 GR 1 7 6 66 866.5 10.0 2.8 Greece 16.13 False 0.0 0.0 0.0 1
219 GR 1 9 6 66 867.5 10.0 2.8 Greece 16.13 False 0.0 0.0 0.0 1
220 HR 1 1 6 66 863.5 10.0 2.8 Croatia 16.13 False 0.0 0.0 0.0 1
221 HR 1 3 6 66 864.5 10.0 2.8 Croatia 16.13 False 0.0 0.0 0.0 1
222 HR 1 5 6 66 865.5 10.0 2.8 Croatia 16.13 False 0.0 0.0 0.0 1
223 HR 1 7 6 66 866.5 10.0 2.8 Croatia 16.13 False 0.0 0.0 0.0 1
224 HR 1 9 6 66 867.5 10.0 2.8 Croatia 16.13 False 0.0 0.0 0.0 1
225 HU 1 1 6 66 863.5 10.0 2.8 Hungary 16.13 False 0.0 0.0 0.0 1
226 HU 1 3 6 66 864.5 10.0 2.8 Hungary 16.13 False 0.0 0.0 0.0 1
227 HU 1 5 6 66 865.5 10.0 2.8 Hungary 16.13 False 0.0 0.0 0.0 1
228 HU 1 7 6 66 866.5 10.0 2.8 Hungary 16.13 False 0.0 0.0 0.0 1
229 HU 1 9 6 66 867.5 10.0 2.8 Hungary 16.13 False 0.0 0.0 0.0 1
230 IE 1 1 6 66 863.5 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
231 IE 1 3 6 66 864.5 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
232 IE 1 5 6 66 865.5 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
233 IE 1 7 6 66 866.5 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
234 IE 1 9 6 66 867.5 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
235 IE 1 31 30 77 916.9 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
236 IE 1 33 30 77 917.9 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
237 IE 1 35 30 77 918.9 10.0 2.8 Ireland 16.13 False 0.0 0.0 0.0 1
238 IN 1 5 6 66 865.5 10.0 2.8 India 16.13 False 0.0 0.0 0.0 1
239 IN 1 7 6 66 866.5 10.0 2.8 India 16.13 False 0.0 0.0 0.0 1
240 IN 1 9 6 66 867.5 10.0 2.8 India 16.13 False 0.0 0.0 0.0 1
241 IS 1 1 6 66 863.5 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
242 IS 1 3 6 66 864.5 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
243 IS 1 5 6 66 865.5 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
244 IS 1 7 6 66 866.5 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
245 IS 1 9 6 66 867.5 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
246 IS 1 31 30 77 916.9 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
247 IS 1 33 30 77 917.9 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
248 IS 1 35 30 77 918.9 10.0 2.8 Iceland 16.13 False 0.0 0.0 0.0 1
249 IT 1 1 6 66 863.5 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
250 IT 1 3 6 66 864.5 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
251 IT 1 5 6 66 865.5 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
252 IT 1 7 6 66 866.5 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
253 IT 1 9 6 66 867.5 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
254 IT 1 33 30 77 917.9 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
255 IT 1 35 30 77 918.9 10.0 2.8 Italy 16.13 False 0.0 0.0 0.0 1
256 JP 1 9 8 73 921.0 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
257 JP 1 13 8 73 923.0 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
258 JP 1 15 8 73 924.0 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
259 JP 1 17 8 73 925.0 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
260 JP 1 19 8 73 926.0 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
261 JP 1 21 8 73 927.0 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
262 JP 2 2 9 64 923.5 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
263 JP 2 4 10 64 924.5 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
264 JP 2 6 9 64 925.5 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
265 JP 2 8 10 64 926.5 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
266 JP 4 36 11 65 924.5 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
267 JP 4 38 12 65 925.5 10.0 10.0 Japan 16.0 True 2.0 2.0 100.0 1
268 KE 1 1 6 66 863.5 10.0 2.8 Kenya 16.13 False 0.0 0.0 0.0 1
269 KE 1 3 6 66 864.5 10.0 2.8 Kenya 16.13 False 0.0 0.0 0.0 1
270 KE 1 5 6 66 865.5 10.0 2.8 Kenya 16.13 False 0.0 0.0 0.0 1
271 KE 1 7 6 66 866.5 10.0 2.8 Kenya 16.13 False 0.0 0.0 0.0 1
272 KE 1 9 6 66 867.5 10.0 2.8 Kenya 16.13 False 0.0 0.0 0.0 1
273 KR 1 1 14 74 918.0 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
274 KR 1 3 14 74 919.0 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
275 KR 1 5 14 74 920.0 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
276 KR 1 7 14 74 921.0 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
277 KR 1 9 14 74 922.0 100.0 100.0 South Korea 10.0 False 50.0 0.0 4000.0 1
278 KR 1 11 14 74 923.0 100.0 100.0 South Korea 10.0 False 50.0 0.0 4000.0 1
279 KR 2 2 15 75 918.5 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
280 KR 2 6 15 75 920.5 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
281 KR 2 10 15 75 922.5 100.0 100.0 South Korea 10.0 False 50.0 0.0 4000.0 1
282 KR 4 8 16 76 921.5 100.0 100.0 South Korea 4.77 False 50.0 0.0 4000.0 1
283 KR 1 18 14 74 926.5 100.0 100.0 South Korea 17.0 False 0.264 0.0 220.0 0
284 KR 1 20 14 74 927.5 100.0 100.0 South Korea 17.0 False 0.264 0.0 220.0 0
285 KR 1 22 14 74 928.5 100.0 100.0 South Korea 17.0 False 0.264 0.0 220.0 0
286 KR 1 24 14 74 929.5 100.0 100.0 South Korea 17.0 False 0.264 0.0 220.0 0
287 KR 2 19 15 75 927.0 100.0 100.0 South Korea 20.0 False 0.264 0.0 220.0 0
288 KR 2 23 15 75 929.0 100.0 100.0 South Korea 20.0 False 0.264 0.0 220.0 0
289 LT 1 1 6 66 863.5 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
290 LT 1 3 6 66 864.5 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
291 LT 1 5 6 66 865.5 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
292 LT 1 7 6 66 866.5 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
293 LT 1 9 6 66 867.5 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
294 LT 1 31 30 77 916.9 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
295 LT 1 33 30 77 917.9 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
296 LT 1 35 30 77 918.9 10.0 2.8 Lithuania 16.13 False 0.0 0.0 0.0 1
297 LU 1 1 6 66 863.5 10.0 2.8 Luxembourg 16.13 False 0.0 0.0 0.0 1
298 LU 1 3 6 66 864.5 10.0 2.8 Luxembourg 16.13 False 0.0 0.0 0.0 1
299 LU 1 5 6 66 865.5 10.0 2.8 Luxembourg 16.13 False 0.0 0.0 0.0 1
300 LU 1 7 6 66 866.5 10.0 2.8 Luxembourg 16.13 False 0.0 0.0 0.0 1
301 LU 1 9 6 66 867.5 10.0 2.8 Luxembourg 16.13 False 0.0 0.0 0.0 1
302 LV 1 1 6 66 863.5 10.0 2.8 Latvia 16.13 False 0.0 0.0 0.0 1
303 LV 1 3 6 66 864.5 10.0 2.8 Latvia 16.13 False 0.0 0.0 0.0 1
304 LV 1 5 6 66 865.5 10.0 2.8 Latvia 16.13 False 0.0 0.0 0.0 1
305 LV 1 7 6 66 866.5 10.0 2.8 Latvia 16.13 False 0.0 0.0 0.0 1
306 LV 1 9 6 66 867.5 10.0 2.8 Latvia 16.13 False 0.0 0.0 0.0 1
307 MD 1 1 6 66 863.5 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
308 MD 1 3 6 66 864.5 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
309 MD 1 5 6 66 865.5 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
310 MD 1 7 6 66 866.5 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
311 MD 1 9 6 66 867.5 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
312 MD 1 31 30 77 916.9 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
313 MD 1 33 30 77 917.9 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
314 MD 1 35 30 77 918.9 10.0 2.8 Moldova 16.13 False 0.0 0.0 0.0 1
315 MK 1 1 6 66 863.5 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
316 MK 1 3 6 66 864.5 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
317 MK 1 5 6 66 865.5 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
318 MK 1 7 6 66 866.5 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
319 MK 1 9 6 66 867.5 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
320 MK 1 31 30 77 916.9 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
321 MK 1 33 30 77 917.9 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
322 MK 1 35 30 77 918.9 10.0 2.8 North Macedonia 16.13 False 0.0 0.0 0.0 1
323 MT 1 1 6 66 863.5 10.0 2.8 Malta 16.13 False 0.0 0.0 0.0 1
324 MT 1 3 6 66 864.5 10.0 2.8 Malta 16.13 False 0.0 0.0 0.0 1
325 MT 1 5 6 66 865.5 10.0 2.8 Malta 16.13 False 0.0 0.0 0.0 1
326 MT 1 7 6 66 866.5 10.0 2.8 Malta 16.13 False 0.0 0.0 0.0 1
327 MT 1 9 6 66 867.5 10.0 2.8 Malta 16.13 False 0.0 0.0 0.0 1
328 NL 1 1 6 66 863.5 10.0 2.8 Netherlands 16.13 False 0.0 0.0 0.0 1
329 NL 1 3 6 66 864.5 10.0 2.8 Netherlands 16.13 False 0.0 0.0 0.0 1
330 NL 1 5 6 66 865.5 10.0 2.8 Netherlands 16.13 False 0.0 0.0 0.0 1
331 NL 1 7 6 66 866.5 10.0 2.8 Netherlands 16.13 False 0.0 0.0 0.0 1
332 NL 1 9 6 66 867.5 10.0 2.8 Netherlands 16.13 False 0.0 0.0 0.0 1
333 NO 1 1 6 66 863.5 10.0 2.8 Norway 16.13 False 0.0 0.0 0.0 1
334 NO 1 3 6 66 864.5 10.0 2.8 Norway 16.13 False 0.0 0.0 0.0 1
335 NO 1 5 6 66 865.5 10.0 2.8 Norway 16.13 False 0.0 0.0 0.0 1
336 NO 1 7 6 66 866.5 10.0 2.8 Norway 16.13 False 0.0 0.0 0.0 1
337 NO 1 9 6 66 867.5 10.0 2.8 Norway 16.13 False 0.0 0.0 0.0 1
338 NZ 1 27 26 68 915.5 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
339 NZ 1 29 26 68 916.5 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
340 NZ 1 31 26 68 917.5 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
341 NZ 1 33 26 68 918.5 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
342 NZ 1 35 26 68 919.5 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
343 NZ 1 37 26 68 920.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
344 NZ 1 39 26 68 921.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
345 NZ 1 41 26 68 922.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
346 NZ 1 43 26 68 923.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
347 NZ 1 45 26 68 924.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
348 NZ 1 47 26 68 925.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
349 NZ 1 49 26 68 926.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
350 NZ 1 51 26 68 927.5 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
351 NZ 2 30 27 69 917.0 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
352 NZ 2 34 27 69 919.0 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
353 NZ 2 38 27 69 921.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
354 NZ 2 42 27 69 923.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
355 NZ 2 46 27 69 925.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
356 NZ 2 50 27 69 927.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
357 NZ 4 32 28 70 918.0 100.0 100.0 New Zealand 30.0 False 0.0 0.0 0.0 1
358 NZ 4 40 28 70 922.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
359 NZ 4 48 28 70 926.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
360 NZ 8 44 29 71 924.0 100.0 100.0 New Zealand 36.0 False 0.0 0.0 0.0 1
361 PL 1 1 6 66 863.5 10.0 2.8 Poland 16.13 False 0.0 0.0 0.0 1
362 PL 1 3 6 66 864.5 10.0 2.8 Poland 16.13 False 0.0 0.0 0.0 1
363 PL 1 5 6 66 865.5 10.0 2.8 Poland 16.13 False 0.0 0.0 0.0 1
364 PL 1 7 6 66 866.5 10.0 2.8 Poland 16.13 False 0.0 0.0 0.0 1
365 PL 1 9 6 66 867.5 10.0 2.8 Poland 16.13 False 0.0 0.0 0.0 1
366 PT 1 1 6 66 863.5 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
367 PT 1 3 6 66 864.5 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
368 PT 1 5 6 66 865.5 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
369 PT 1 7 6 66 866.5 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
370 PT 1 9 6 66 867.5 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
371 PT 1 31 30 77 916.9 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
372 PT 1 33 30 77 917.9 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
373 PT 1 35 30 77 918.9 10.0 2.8 Portugal 16.13 False 0.0 0.0 0.0 1
374 RO 1 1 6 66 863.5 10.0 2.8 Romania 16.13 False 0.0 0.0 0.0 1
375 RO 1 3 6 66 864.5 10.0 2.8 Romania 16.13 False 0.0 0.0 0.0 1
376 RO 1 5 6 66 865.5 10.0 2.8 Romania 16.13 False 0.0 0.0 0.0 1
377 RO 1 7 6 66 866.5 10.0 2.8 Romania 16.13 False 0.0 0.0 0.0 1
378 RO 1 9 6 66 867.5 10.0 2.8 Romania 16.13 False 0.0 0.0 0.0 1
379 SE 1 1 6 66 863.5 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
380 SE 1 3 6 66 864.5 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
381 SE 1 5 6 66 865.5 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
382 SE 1 7 6 66 866.5 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
383 SE 1 9 6 66 867.5 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
384 SE 1 31 30 77 916.9 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
385 SE 1 33 30 77 917.9 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
386 SE 1 35 30 77 918.9 10.0 2.8 Sweden 16.13 False 0.0 0.0 0.0 1
387 SG 1 7 17 66 866.5 2.77 2.77 Singapore 29.14 False 100.0 0.0 1000.0 1
388 SG 1 9 17 66 867.5 2.77 2.77 Singapore 29.14 False 100.0 0.0 1000.0 1
389 SG 1 11 17 66 868.5 2.77 2.77 Singapore 29.14 False 100.0 0.0 1000.0 1
390 SG 2 10 19 67 868.0 2.77 2.77 Singapore 29.14 False 100.0 0.0 1000.0 1
391 SG 1 37 18 68 920.5 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
392 SG 1 39 18 68 921.5 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
393 SG 1 41 18 68 922.5 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
394 SG 1 43 18 68 923.5 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
395 SG 1 45 18 68 924.5 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
396 SG 2 38 20 69 921.0 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
397 SG 2 42 20 69 923.0 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
398 SG 4 40 21 70 922.0 100.0 100.0 Singapore 22.15 False 0.0 0.0 0.0 1
399 SI 1 1 6 66 863.5 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
400 SI 1 3 6 66 864.5 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
401 SI 1 5 6 66 865.5 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
402 SI 1 7 6 66 866.5 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
403 SI 1 9 6 66 867.5 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
404 SI 1 31 30 77 916.9 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
405 SI 1 33 30 77 917.9 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
406 SI 1 35 30 77 918.9 10.0 2.8 Slovenia 16.13 False 0.0 0.0 0.0 1
407 SK 1 1 6 66 863.5 10.0 2.8 Slovakia 16.13 False 0.0 0.0 0.0 1
408 SK 1 3 6 66 864.5 10.0 2.8 Slovakia 16.13 False 0.0 0.0 0.0 1
409 SK 1 5 6 66 865.5 10.0 2.8 Slovakia 16.13 False 0.0 0.0 0.0 1
410 SK 1 7 6 66 866.5 10.0 2.8 Slovakia 16.13 False 0.0 0.0 0.0 1
411 SK 1 9 6 66 867.5 10.0 2.8 Slovakia 16.13 False 0.0 0.0 0.0 1
412 TR 1 1 6 66 863.5 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
413 TR 1 3 6 66 864.5 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
414 TR 1 5 6 66 865.5 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
415 TR 1 7 6 66 866.5 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
416 TR 1 9 6 66 867.5 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
417 TR 1 33 30 77 917.9 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
418 TR 1 35 30 77 918.9 10.0 2.8 Turkey 16.13 False 0.0 0.0 0.0 1
419 UK 1 1 6 66 863.5 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
420 UK 1 3 6 66 864.5 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
421 UK 1 5 6 66 865.5 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
422 UK 1 7 6 66 866.5 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
423 UK 1 9 6 66 867.5 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
424 UK 1 33 30 77 917.9 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
425 UK 1 35 30 77 918.9 10.0 2.8 United Kingdom 16.13 False 0.0 0.0 0.0 1
426 US 1 1 1 68 902.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 0
427 US 1 3 1 68 903.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
428 US 1 5 1 68 904.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
429 US 1 7 1 68 905.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
430 US 1 9 1 68 906.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
431 US 1 11 1 68 907.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
432 US 1 13 1 68 908.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
433 US 1 15 1 68 909.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
434 US 1 17 1 68 910.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
435 US 1 19 1 68 911.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
436 US 1 21 1 68 912.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
437 US 1 23 1 68 913.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
438 US 1 25 1 68 914.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
439 US 1 27 1 68 915.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
440 US 1 29 1 68 916.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
441 US 1 31 1 68 917.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
442 US 1 33 1 68 918.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
443 US 1 35 1 68 919.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
444 US 1 37 1 68 920.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
445 US 1 39 1 68 921.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
446 US 1 41 1 68 922.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
447 US 1 43 1 68 923.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
448 US 1 45 1 68 924.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
449 US 1 47 1 68 925.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
450 US 1 49 1 68 926.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
451 US 1 51 1 68 927.5 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
452 US 2 2 2 69 903.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 0
453 US 2 6 2 69 905.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
454 US 2 10 2 69 907.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
455 US 2 14 2 69 909.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
456 US 2 18 2 69 911.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
457 US 2 22 2 69 913.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
458 US 2 26 2 69 915.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
459 US 2 30 2 69 917.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
460 US 2 34 2 69 919.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
461 US 2 38 2 69 921.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
462 US 2 42 2 69 923.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
463 US 2 46 2 69 925.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
464 US 2 50 2 69 927.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
465 US 4 8 3 70 906.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
466 US 4 16 3 70 910.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
467 US 4 24 3 70 914.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
468 US 4 32 3 70 918.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
469 US 4 40 3 70 922.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
470 US 4 48 3 70 926.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
471 US 8 12 4 71 908.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
472 US 8 28 4 71 916.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1
473 US 8 44 4 71 924.0 100.0 100.0 USA 36.0 False 0.0 0.0 0.0 1

View File

@@ -0,0 +1,36 @@
From 6c0733b125434b846bec2a744a812c890c82518d Mon Sep 17 00:00:00 2001
From: Takura Mapani <takura.mapani@morsemicro.com>
Date: Tue, 19 Sep 2023 03:25:45 +0000
Subject: [PATCH] Merged in APP-1819_add_usable_by_bannf_column (pull request
#17)
APP-1819 add a new column usable bannfC for the csv output
* added new column usable bannfC for the csv output
Approved-by: Arien Judge
Approved-by: David Goodall
Approved-by: Matthew Forgie
Approved-by: Thomas Flynn
Approved-by: Matt Jervis
---
regdbconverter.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/regdbconverter.py b/regdbconverter.py
index 883f281..4bd44b1 100755
--- a/regdbconverter.py
+++ b/regdbconverter.py
@@ -311,7 +311,7 @@ def _output_channels_python(channels, out_file, args):
def _output_channels_csv(channels, out_file, args):
fields = ['country_code', 'bw', 's1g_chan', 's1g_op_class', 'global_op_class', 'centre_freq_mhz', 'duty_cycle_ap', 'duty_cycle_sta',
- 'country', 'tx_power_max', 'duty_cycle_omit_ctrl_resp', 'pkt_spacing_ms', 'airtime_min_ms', 'airtime_max_ms']
+ 'country', 'tx_power_max', 'duty_cycle_omit_ctrl_resp', 'pkt_spacing_ms', 'airtime_min_ms', 'airtime_max_ms', 'usable_banff_c']
dw = DictWriter(out_file, fields, extrasaction='ignore', lineterminator='\n')
dw.writeheader()
--
2.25.1

View File

@@ -0,0 +1,41 @@
#
# Copyright 2022 Morse Micro
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=netifd-morse
PKG_RELEASE=1
PKG_LICENSE:=GPLv2
PKG_LICENSE_FILES:=
PKG_MAINTAINER:=Morse Micro <info@morsemicro.com>
include $(INCLUDE_DIR)/package.mk
define Package/netifd-morse
SECTION:=net
CATEGORY:=Network
TITLE:=Morse Micro HaLow support for netifd
DEPENDS:= netifd \
+@BUSYBOX_CONFIG_USLEEP +@BUSYBOX_CONFIG_BASE64 +@BUSYBOX_CONFIG_XXD \
+kmod-morse +kmod-cfg80211 \
+morse-regdb +wpa_event_listener +wpa_supplicant_s1g +hostapd_s1g +morsecli
endef
define Build/Compile
endef
define Package/netifd-morse/install
$(INSTALL_DIR) $(1)/lib/
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_DIR) $(1)/etc/init.d
$(CP) ./lib/* $(1)/lib/
$(INSTALL_BIN) ./etc/init.d/halow-gpio-reset $(1)/etc/init.d/
endef
$(eval $(call BuildPackage,netifd-morse))

View File

@@ -0,0 +1,28 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org
START=09
. /lib/functions.sh
. /lib/functions/uci-defaults.sh
. /lib/functions/system.sh
boot() {
. /lib/functions.sh
. /lib/functions/uci-defaults.sh
. /lib/functions/system.sh
board=$(board_name)
case "$board" in
edgecore,eap112)
echo 486 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio486/direction
echo 0 > /sys/class/gpio/gpio486/value
sleep 1
echo "in" > /sys/class/gpio/gpio486/direction
echo 486 > /sys/class/gpio/unexport
esac
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,161 @@
kill_wait()
{
local names=$*
local count=30
for pid in $(pidof $names)
do
kill $pid &> /dev/null
done
while pidof $names &> /dev/null;
do
usleep 100000
let "count--"
if [ $count -eq 0 ]
then
echo "$names failed to terminate normally, force quitting" >&2
kill -9 $(pidof $names)
return 1
fi
done
return 0
}
_list_phy_interfaces() {
local phy="$1"
if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then
ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null;
else
ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g'
fi
}
list_phy_interfaces() {
local phy="$1"
for dev in $(_list_phy_interfaces "$phy"); do
readlink "/sys/class/net/${dev}/phy80211" | grep -q "/${phy}\$" || continue
done
}
num_test()
{
case $1 in
''|*[!0-9]*)
return 1
;;
*)
;;
esac
return 0
}
_get_regulatory() {
local _mode=$1
local _country=$2
local _channel=$3
local _op_class=$4
local dc_min="0.01"
local dc_max="100.00"
local cc; local bw; local l_op; local g_op;
local freq; local dc_ap; local dc_sta;
oIFS=$IFS
HEADER=1
while IFS=, read -r cc bw ch l_op g_op freq remainder; do
if [ $HEADER = 1 ]; then
HEADER=0
continue
fi
num_test $bw
[ $? -eq 1 ] && continue
num_test $ch
[ $? -eq 1 ] && continue
num_test $l_op
[ $? -eq 1 ] && continue
num_test $g_op
[ $? -eq 1 ] && continue
if [ "$cc" == "$_country" ] && [ "$ch" -eq "$_channel" ]; then
if [ -z "$_op_class" ]; then
halow_bw=$bw
center_freq=$freq
# If you didn't pass op_class, set it from this data.
op_class="$g_op"
IFS=$oIFS
return 0;
elif [ "$l_op" -eq "$_op_class" ] || [ "$g_op" -eq "$_op_class" ]; then
halow_bw=$bw
center_freq=$freq
IFS=$oIFS
return 0;
fi
fi
done < /usr/share/morse-regdb/channels.csv
IFS=$oIFS
return 1;
}
morse_find_ifname()
{
for file in "/sys/class/net/wlan"*;
do
if [ -d "$file"/device/morse ]
then
ifname=$(basename $file)
break
fi
done
}
# this function checks if an macaddr is burnt into the device.
# if so, returns it, otherwise returns an empty string
morse_get_chip_macaddr()
{
ifname=
morse_find_ifname
local state=$(cat /sys/class/net/${ifname}/operstate 2>/dev/null)
[ $? -ne 0 ] && return
if [ "$state" == "down" ]; then
ip link set ${ifname} up
[ $? -ne 0 ] && return
fi
local chip_macaddr="$(morse_cli -i ${ifname} macaddr 2>/dev/null)"
[ $? -ne 0 ] && printf ""
chip_macaddr=${chip_macaddr##"Chip MAC address: "}
#make sure (using regex) that the we got a macaddr
if [[ "$chip_macaddr" =~ ^\([0-9A-Fa-f]{2}[:]\){5}\([0-9A-Fa-f]{2}\)$ ]]; then
[ "$chip_macaddr" = "00:00:00:00:00:00" ] && printf "" || printf "$chip_macaddr"
else
printf ""
fi
if [ "$state" == "down" ]; then
ip link set ${ifname} down
fi
}
update_dpp_qrcode()
{
local uci_changes_path="$(mktemp -d)"
local private_key_path=$1
#remove ':' from the macaddress
local mac_address=$(echo "$2" | sed -r 's/://g')
#generate the public key string from the private key.
#unfortunately, there is no way to quiet the 'read EC key' messages without redirecting stderr.
local pubkey=$(openssl ec -in $private_key_path -pubout -conv_form compressed -outform DER 2> /dev/null | hexdump -e '16/1 "%02x " "\n"' | xxd -r -p | base64 -w0)
#save qrcode string into /www
qrencode --inline --8bit --type=SVG --output=/tmp/dpp_qrcode.svg "DPP:V:2;M:$mac_address;K:$pubkey;;"
#only write if necessary
if ! cmp -s /tmp/dpp_qrcode.svg /www/dpp_qrcode.svg; then
cp /tmp/dpp_qrcode.svg /www/dpp_qrcode.svg
fi
rm /tmp/dpp_qrcode.svg
}

View File

@@ -0,0 +1,111 @@
#!/bin/sh
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
. /lib/netifd/netifd-wireless.sh
. /etc/diag.sh
#returns 0 if config is complete
is_config_complete()
{
[ -z "$encryption" ] && return 1
#if encryption is sae, check if we have psk
if [ "$encryption" = "sae" ]; then
[ -z "$psk" ] && return 1
fi
#check if we have ssid
[ -z "$ssid" ] && return 1
return 0
}
get_uci_section()
{
local target_iface=$1
local dpp_wifi_iface=
check_interface() {
json_get_vars section ifname
[ "$ifname" = "$target_iface" ] && [ -n "$section" ] && [ -z "$dpp_wifi_iface" ] && dpp_wifi_iface=$section
}
wireless_status=$(ubus call network.wireless status)
json_init
json_load "$wireless_status"
json_get_keys radios
for radio in $radios; do
json_select $radio
for_each_interface "sta" check_interface
json_select ..
done
echo "$dpp_wifi_iface"
}
save_and_reload()
{
logger "Saving Received AP Credentials."
local uci_section=$(get_uci_section $iface_name)
if [ -z "$uci_section" ]; then
logger "FATAL: unable to find the correct wifi interface in configs."
exit 0
fi
uci set wireless.$uci_section.encryption="$encryption"
#if encryption is sae, check if we have psk
if [ "$encryption" = "sae" ]; then
uci set wireless.$uci_section.key="$psk"
fi
uci set wireless.$uci_section.ssid="$ssid"
uci set wireless.$uci_section.dpp='0'
uci commit
ubus call service event "{ \"type\": \"config.change\", \"data\": { \"package\": \"wireless\" }}"
}
# Do not name 'config'; will clash with uci functions.
do_config() {
# convert password from hex string to string.
psk="$(echo "$psk" | xxd -r -p)"
# if the file contains all the necessary stuff, then save and reload.
is_config_complete && save_and_reload
}
failed() {
set_state dpp_failed
}
finished() {
set_state done
}
started() {
set_state dpp_started
}
case "$1" in
config)
do_config
;;
failed)
failed
;;
finished)
finished
;;
started)
started
;;
*)
echo "Usage: $0 {config|failed|finished|started}"
exit 1
;;
esac

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,139 @@
#!/bin/sh
# This script is copied and modified from
# package/kernel/mac80211/files/lib/wifi/mac80211.sh
# and modified (simplified) to work with morse devices.
append DRIVERS "morse"
# Find and set $phy for this $device (a wifi-device section name)
lookup_phy() {
[ -n "$phy" ] && {
[ -d /sys/class/ieee80211/$phy ] && return
}
local devpath
config_get devpath "$device" path
[ -n "$devpath" ] && {
phy="$(iwinfo dot11ah phyname "path=$devpath")"
[ -n "$phy" ] && return
}
local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
[ -n "$macaddr" ] && {
for _phy in /sys/class/ieee80211/*; do
[ -e "$_phy" ] || continue
[ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
phy="${_phy##*/}"
return
done
}
phy=
return
}
# Find and save the phy and macaddr for this $device (a wifi-device section name)
find_morse_phy() {
local device="$1"
config_get phy "$device" phy
lookup_phy
[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
echo "PHY for wifi device $1 not found"
return 1
}
config_set "$device" phy "$phy"
config_get macaddr "$device" macaddr
[ -z "$macaddr" ] && {
config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
}
return 0
}
# Set found=1 if the $phy for this $device (a wifi-device section name) is the same as $dev
check_morse_device() {
config_get phy "$1" phy
[ -z "$phy" ] && {
find_morse_phy "$1" >/dev/null || return 0
config_get phy "$1" phy
}
[ "$phy" = "$dev" ] && found=1
}
detect_morse() {
devidx=0
config_load wireless
while :; do
config_get type "radio$devidx" type
[ -n "$type" ] || break
devidx=$(($devidx + 1))
done
for _dev in /sys/class/ieee80211/*; do
[ -e "$_dev" ] || continue
# Only configure morse devices.
basename "$(readlink -f "$_dev/device/driver/")" | grep '^morse_' || continue
dev="${_dev##*/}"
# Skip already configured devices.
# The path or macaddr are used to find the corresponding phy.
found=0
config_foreach check_morse_device wifi-device
[ "$found" -gt 0 ] && continue
path="$(iwinfo dot11ah path "$dev")"
if [ -n "$path" ]; then
dev_id="set wireless.radio${devidx}.path='$path'"
else
dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
fi
uci -q batch <<-EOF
set wireless.radio${devidx}=wifi-device
set wireless.radio${devidx}.type=morse
${dev_id}
set wireless.radio${devidx}.band=s1g
set wireless.radio${devidx}.hwmode=11ah
set wireless.radio${devidx}.reconf=0
set wireless.radio${devidx}.disabled=1
set wireless.default_radio${devidx}=wifi-iface
set wireless.default_radio${devidx}.mode=ap
set wireless.default_radio${devidx}.wds=1
set wireless.default_radio${devidx}.device=radio${devidx}
set wireless.default_radio${devidx}.network=lan
set wireless.default_radio${devidx}.ssid=MorseMicro
set wireless.default_radio${devidx}.encryption=sae
set wireless.default_radio${devidx}.key=12345678
EOF
board=$(board_name)
case "$board" in
morse,ekh01-03 |\
morse,ekh03v3)
bcf=bcf_mf08551.bin
;;
morse,ekh01v1)
bcf=bcf_mf03120.bin
;;
morse,ekh01v2)
bcf=bcf_mf08251.bin
;;
morse,ekh04v4)
bcf=bcf_ekh04_v4.bin
;;
esac
[ -n "${bcf}" ] && uci -q set wireless.radio${devidx}.bcf="${bcf}"
uci -q commit wireless
devidx=$(($devidx + 1))
done
}

View File

@@ -0,0 +1,17 @@
if PACKAGE_hostapd_s1g
config MORSE_HOSTAPD_S1G_EAP
bool
default n
prompt "Enable Extensible Authentication Protocol (EAP) support"
config MORSE_HOSTAPD_S1G_ACS
bool
default n
prompt "Enable automatic channel selection (ACS) support"
help
This will allow hostapd to pick the channel automatically when channel is set
to "acs_survey" or "0". Eventually, other ACS algorithms can be added in
similar way.
endif

View File

@@ -0,0 +1,167 @@
#
# Copyright 2022 Morse Micro
#
# This is free software, licensed under the 3-Clause BSD License.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=hostapd_s1g
PKG_RELEASE=2
PKG_VERSION:=1.12.4
PKG_LICENSE:=BSD-3-Clause
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/hostap.git
PKG_HASH:=a2f17ce3d2fe25d45cc2d6869e9ea644bcac441ec9b541972034768d4fc63608
PKG_SOURCE_PROTO:=git
PKG_MAINTAINER:=Morse Micro <info@morsemicro.com>
PKG_BUILD_PARALLEL:=1
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_kmod-morse \
CONFIG_PACKAGE_kmod-cfg80211 \
CONFIG_PACKAGE_hostapd \
CONFIG_PACKAGE_hostapd-basic \
CONFIG_PACKAGE_hostapd-mini \
CONFIG_WPA_RFKILL_SUPPORT \
CONFIG_DRIVER_WEXT_SUPPORT \
CONFIG_DRIVER_11N_SUPPORT \
CONFIG_DRIVER_11AC_SUPPORT \
CONFIG_DRIVER_11AX_SUPPORT \
CONFIG_WPA_ENABLE_WEP
include $(INCLUDE_DIR)/package.mk
MAKE_FLAGS += \
MORSEHOSTAPD_VERSION_STRING=$(PKG_VERSION)
MMHOSTAPD_CONFIG_ENABLE = \
CONFIG_INTERNAL_LIBTOMMATH \
CONFIG_DEBUG_FILE \
CONFIG_DEBUG_SYSLOG \
CONFIG_PMKSA_CACHE_EXTERNAL \
CONFIG_SAE \
CONFIG_TESTING_OPTIONS \
CONFIG_WNM \
CONFIG_DRIVER_ACS \
CONFIG_DRIVER_HOSTAP \
CONFIG_DRIVER_NL80211 \
CONFIG_HS20 \
CONFIG_IEEE80211AC \
CONFIG_IEEE80211N \
CONFIG_IEEE80211AH \
CONFIG_IEEE80211R \
CONFIG_INTERWORKING \
CONFIG_FULL_DYNAMIC_VLAN \
CONFIG_VLAN_NETLINK \
CONFIG_OWE \
CONFIG_LIBNL32 \
CONFIG_DPP \
CONFIG_DPP2 \
CONFIG_WPS
MMHOSTAPD_CONFIG_SET = \
NEED_LINUX_IOCTL \
CONFIG_DPP \
CONFIG_SAE
MMHOSTAPD_CONFIG_DISABLE = \
CONFIG_DRIVER_NONE \
CONFIG_DRIVER_RTW \
CONFIG_DRIVER_WIRED
MMHOSTAPD_CONFIG_EDITS += 's/\#\(CONFIG_TLS=openssl\)/\1/'
ifeq ($(CONFIG_MORSE_HOSTAPD_S1G_ACS),y)
MMHOSTAPD_CONFIG_ENABLE += CONFIG_ACS
endif
ifeq ($(CONFIG_MORSE_HOSTAPD_S1G_EAP),y)
MMHOSTAPD_CONFIG_ENABLE += \
CONFIG_EAP \
CONFIG_RADIUS_SERVER \
CONFIG_TLSV1
else
MMHOSTAPD_CONFIG_DISABLE += CONFIG_HOSTAPD_EAP
MMHOSTAPD_CONFIG_ENABLE += \
CONFIG_NO_ACCOUNTING \
CONFIG_NO_RADIUS
endif
define Package/hostapd_s1g
SECTION:=net
CATEGORY:=Network
SUBMENU:=WirelessAPD
TITLE:=Morse Micro HaLow hostapd
DEPENDS:= +kmod-morse +libnl +libopenssl +libubus
USERID:=network=101:network=101
PROVIDES:=hostapd_s1g
endef
define Package/hostapd_s1g/description
This package contains a full featured Morse Micro patched
Authenticator.
endef
define Package/hostapd_s1g/config
source "$(SOURCE)/Config.in"
endef
MMHOSTAPD_CONFIG = $(PKG_BUILD_DIR)/hostapd/.config
define Build/Prepare
$(call Build/Prepare/Default)
$(CP) $(PKG_BUILD_DIR)/hostapd/defconfig $(MMHOSTAPD_CONFIG)
sed -i $(patsubst %,-e 's/^#\(%\)/\1/',$(MMHOSTAPD_CONFIG_ENABLE)) \
$(patsubst %,-e 's/^\(%\)/#\1/',$(MMHOSTAPD_CONFIG_DISABLE)) \
$(patsubst %,-e '1i%=y',$(MMHOSTAPD_CONFIG_SET)) \
$(patsubst %,-e %,$(MMHOSTAPD_CONFIG_EDITS)) \
$(MMHOSTAPD_CONFIG)
endef
TARGET_CPPFLAGS := \
-I$(STAGING_DIR)/usr/include/libnl3 \
-I$(PKG_BUILD_DIR)/src/crypto \
$(TARGET_CPPFLAGS) \
-DCONFIG_LIBNL20 \
-D_GNU_SOURCE
TARGET_LDFLAGS += -lnl-3 -lnl-genl-3 -lnl-route-3
TARGET_LDFLAGS += -lm -lpthread -lcrypto -lssl
TARGET_LDFLAGS += -lrt
TARGET_LDFLAGS_C += -lrt
define Build/RunMake
CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \
$(TARGET_CONFIGURE_OPTS) \
$(DRIVER_MAKEOPTS) \
LIBS="$(TARGET_LDFLAGS)" \
LIBS_c="$(TARGET_LDFLAGS_C)" \
AR="$(TARGET_CROSS)gcc-ar" \
BCHECK= \
$(2)
endef
define Build/Compile
+$(call Build/RunMake,hostapd, \
hostapd_s1g hostapd_cli_s1g \
)
endef
#Ian
define Package/hostapd_s1g/install
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_s1g $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_cli_s1g $(1)/sbin
$(INSTALL_DIR) $(1)/lib/netifd
$(INSTALL_DATA) ./files/lib/netifd/hostapd_s1g.sh $(1)/lib/netifd
endef
$(eval $(call BuildPackage,hostapd_s1g))

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,45 @@
From 5433351ed5ab62c2d4fbd15a2c4d8c4aeacb93dc Mon Sep 17 00:00:00 2001
From: Evan Benn <evan.benn@morsemicro.com>
Date: Thu, 29 Feb 2024 11:09:38 +1100
Subject: [PATCH] APP-2573: Emit a DPP PB_STATUS event when push button starts
---
src/ap/dpp_hostapd.c | 1 +
wpa_supplicant/dpp_supplicant.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c
index b7cca47c714b..3025eef204d2 100644
--- a/src/ap/dpp_hostapd.c
+++ b/src/ap/dpp_hostapd.c
@@ -3960,6 +3960,7 @@ int hostapd_dpp_push_button(struct hostapd_data *hapd, const char *cmd)
eloop_register_timeout(100, 0, hostapd_dpp_push_button_expire,
hapd, NULL);
+ wpa_msg(hapd->msg_ctx, MSG_INFO, DPP_EVENT_PB_STATUS "started");
return 0;
}
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index ab06ff8d32c1..24e4bb3c444d 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -5676,6 +5676,7 @@ static int wpas_dpp_push_button_configurator(struct wpa_supplicant *wpa_s,
eloop_register_timeout(100, 0, wpas_dpp_push_button_expire,
wpa_s, NULL);
+ wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_PB_STATUS "started");
return 0;
}
@@ -5749,6 +5750,7 @@ int wpas_dpp_push_button(struct wpa_supplicant *wpa_s, const char *cmd)
wpa_supplicant_req_scan(wpa_s, 0, 0);
res = 0;
+ wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_PB_STATUS "started");
out:
/* If push button mode failed to start, restart the chirp forever timer */
--
2.42.0.530.g692be87cbba5

View File

@@ -0,0 +1,90 @@
From 25631fa387af430b8d7f03302218c66dc161cc6f Mon Sep 17 00:00:00 2001
From: Andrew Pope <andrew.pope@morsemicro.com>
Date: Tue, 4 Jun 2024 23:12:37 +0000
Subject: [PATCH] Merged in SW-11943-dpp-does-not-associate-in-us-regdom (pull
request #213)
SW-11943: DPP does not associate in US regdom
Two problems contributed to the originally reported issue:
1. The DPP-PB state machine function will unconditionally cancel any pending off-channel actions - even if the DPP PB discovery phase is over. To fix this, avoid unconditionally completing offchannel actions from DPP-PB state machine function if DPP PB discovery phase is over.
2. Logic around PKEX retries will manually attempt to complete the exchange on adjacent non-S1G channels. These retries inevitably fail, leading to a quicker collapse of the PKEX exchange attempts and eventual downgrade from v2 to v1 (bad). To fix this, remove non-S1G frequency hopping logic from DPP PB discovery and PKEX exchange phases.
Approved-by: Neville Young
Approved-by: Simon Wadsworth
Approved-by: Ayman Grais
Approved-by: James Herbert
---
src/ap/dpp_hostapd.c | 6 ++++++
wpa_supplicant/dpp_supplicant.c | 17 +++++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c
index b7cca47c7..282581fe5 100644
--- a/src/ap/dpp_hostapd.c
+++ b/src/ap/dpp_hostapd.c
@@ -260,6 +260,12 @@ static int hostapd_dpp_allow_ir(struct hostapd_data *hapd, unsigned int freq)
static int hostapd_dpp_pkex_next_channel(struct hostapd_data *hapd,
struct dpp_pkex *pkex)
{
+ /* Following logic is not S1G compatible. Attempting PKEX on non-adjacent S1G channels
+ * results in guaranteed failure.
+ */
+ if (hapd->iconf->ieee80211ah)
+ return -1;
+
if (pkex->freq == 2437)
pkex->freq = 5745;
else if (pkex->freq == 5745)
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index ab06ff8d3..e90e4a163 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -2840,6 +2840,12 @@ static int wpas_dpp_allow_ir(struct wpa_supplicant *wpa_s, unsigned int freq)
static int wpas_dpp_pkex_next_channel(struct wpa_supplicant *wpa_s,
struct dpp_pkex *pkex)
{
+#if defined(CONFIG_IEEE80211AH)
+ /* Following logic is not S1G compatible. Attempting PKEX on non-adjacent S1G channels
+ * results in guaranteed failure.
+ */
+ return -1;
+#endif
if (pkex->freq == 2437)
pkex->freq = 5745;
else if (pkex->freq == 5745)
@@ -5113,10 +5119,16 @@ static int * wpas_dpp_presence_ann_channels(struct wpa_supplicant *wpa_s,
if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_RADAR))
continue;
+#if defined(CONFIG_IEEE80211AH)
+ /* Adding channels 44 and 149 at end of scan list is not required
+ * for HaLow
+ */
+#else
if (chan->freq == 5220)
chan44 = 1;
if (chan->freq == 5745)
chan149 = 1;
+#endif
/* Morse - All 5GHz channels that are mapped to 1 MHz and 2 MHz.
* Channels that aren't relevant to a regulatory domain will be
@@ -5573,9 +5585,10 @@ static void wpas_dpp_pb_next(void *eloop_ctx, void *timeout_ctx)
if (!wpa_s->dpp_pb_freqs)
return;
- os_get_reltime(&now);
- offchannel_send_action_done(wpa_s);
+ if (!wpa_s->dpp_pb_discovery_done)
+ offchannel_send_action_done(wpa_s);
+ os_get_reltime(&now);
if (os_reltime_expired(&now, &wpa_s->dpp_pb_time, 100)) {
wpa_printf(MSG_DEBUG, "DPP: Push button wait time expired");
wpas_dpp_push_button_stop(wpa_s);
--
2.25.1

View File

@@ -0,0 +1,35 @@
From 591ec24748525171d5647d2a35cd1da1445e7a0b Mon Sep 17 00:00:00 2001
From: James Haggerty <james.haggerty@morsemicro.com>
Date: Fri, 26 Jul 2024 09:55:03 +1000
Subject: [PATCH] Hack out channel 50 (and typo for 51)
If we use these channels on a board with those channels disabled,
the DPP presence announcement fails.
This is rubbish: see SW-12450
---
wpa_supplicant/dpp_supplicant.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index 09f8ceb07..46e4add95 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -5199,12 +5199,12 @@ static int * wpas_dpp_presence_ann_channels(struct wpa_supplicant *wpa_s,
static const int s1g_chirp_channels[] = {
/* 2MHz channels */
5190, 5230, 5270, 5310, 5510, 5550,
- 5630, 5670, 5755, 5795, 5835, 5875,
+ 5630, 5670, 5755, 5795, 5835,
/* 1MHz channels */
5660, 5680, 5180, 5200, 5240, 5260,
5280, 5300, 5320, 5500, 5520, 5540,
5560, 5580, 5600, 5620, 5640, 5765,
- 5785, 5805, 5825, 5845, 5865, 5855
+ 5785, 5805, 5825, 5845, 5865
};
if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_RADAR))
--
2.25.1

View File

@@ -0,0 +1,73 @@
# SPDX-License-Identifier: GPL-2.0-only
#
#The mesh11sd dameon is designed in such a way that all configuration done to 11s mesh can be directly set to the
#mac80211 via iw utility and does not require any re-configuration of interfaces. Considering the MorseMicro design and
#implementation of 802.11s mesh, most of the configuration needs to be applied to the wpa_supplicant.conf which requires
#re-configuration of the interface.
#Thus we need a reload_service section to mesh11sd that will re-configure wifi via wifi down and up.
#
#Openwrt provided Mesh11sd package is found in: https://github.com/openwrt/routing/tree/master/mesh11sd
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
# Copyright (C) 2022 BlueWave Projects and Services <licence@blue-wave.net>
#
include $(TOPDIR)/rules.mk
PKG_NAME:=morse_mesh11sd
PKG_VERSION:=1.2.0
PKG_RELEASE:=$(AUTORELEASE)
PKG_MAINTAINER:=Rob White <rob@blue-wave.net>
PKG_LICENSE:=GPL-2.0-or-later
PKG_LICENSE_FILES:=LICENSE
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/opennds/mesh11sd/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=b719eaacf63eb3684d0cd6a026f4357a4f400f2339f5d5a6cf74ba3744fe30d8
PKG_BUILD_DIR:=$(BUILD_DIR)/mesh11sd-$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk
define Package/morse_mesh11sd
SUBMENU:=Captive Portals
SECTION:=net
CATEGORY:=Network
TITLE:=Dynamic 802.11s Mesh Configuration Daemon
PKGARCH:=all
URL:=https://github.com/opennds/mesh11sd
PROVIDES:=mesh11sd
endef
define Package/morse_mesh11sd/description
Mesh11sd is a dynamic parameter configuration daemon for 802.11s mesh networks.
It was originally designed to leverage 802.11s mesh networking at Captive Portal venues.
This is the open source version and it enables easy and automated mesh network operation with multiple mesh nodes.
It allows all mesh parameters supported by the wireless driver to be set in the uci config file.
Settings take effect immediately without having to restart the wireless network.
Default settings give rapid and reliable layer 2 mesh convergence.
Without mesh11sd, many mesh parameters cannot be set in the uci wireless config file as the mesh interface must be up before the parameters can be set.
Some of those that are supported, would fail to be implemented when the network is (re)started resulting in errors or dropped nodes.
The mesh11sd daemon dynamically checks configured parameters and sets them as required.
This version does not require a Captive Portal to be running.
The modified morse_mesh11sd would allow reconfiguring the wpa supplicant everytime there is 11sMesh config modification.
endef
define Package/morse_mesh11sd/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mesh11sd $(1)/usr/sbin
$(INSTALL_CONF) ./files/etc/config/mesh11sd $(1)/etc/config/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linux_openwrt/mesh11sd/files/etc/init.d/mesh11sd $(1)/etc/init.d/
endef
define Package/morse_mesh11sd/conffiles
/etc/config/mesh11sd
endef
define Build/Compile
endef
$(eval $(call BuildPackage,morse_mesh11sd))

View File

@@ -0,0 +1,28 @@
config mesh11sd 'setup'
option debuglevel '1'
option checkinterval '10'
option interface_timeout '10'
option enabled '0'
config mesh11sd 'mesh_params'
option mesh_fwding '1'
option mesh_max_peer_links '10'
option mesh_rssi_threshold '-85'
option mesh_ttl '31'
option mesh_hwmp_rootmode '0'
option mesh_gate_announcements '0'
config mesh11sd 'mbca'
option mbca_config '1'
option mesh_beacon_timing_report_int '10'
option mbss_start_scan_duration_ms '2048'
option mbca_min_beacon_gap_ms '25'
option mbca_tbtt_adj_interval_sec '60'
config mesh11sd 'mesh_beaconless'
option mesh_beacon_less_mode '0'
config mesh11sd 'mesh_dynamic_peering'
option enabled '0'
option mesh_rssi_margin '5'
option mesh_blacklist_timeout '60'

View File

@@ -0,0 +1,16 @@
Index: mesh11sd-1.2.0/linux_openwrt/mesh11sd/files/etc/init.d/mesh11sd
===================================================================
--- mesh11sd-1.2.0.orig/linux_openwrt/mesh11sd/files/etc/init.d/mesh11sd
+++ mesh11sd-1.2.0/linux_openwrt/mesh11sd/files/etc/init.d/mesh11sd
@@ -11,3 +11,11 @@ start_service() {
procd_close_instance
}
+reload_service() {
+ wifi down
+ sleep 5
+ wifi up
+}
+service_triggers() {
+ procd_add_reload_trigger "mesh11sd"
+}

View File

@@ -0,0 +1,107 @@
# Description: The Mesh11sd daemon expects the mesh interface name to follow the format 'mesh<index>'.
# If it doesn't find this format, it attempts to set it in the UCI wireless configuration.
# However, when operating in other modes such as AP, STA, or Ad-Hoc, the script was patched to remove
# the mesh interface name from UCI. This process can lead to a race condition between the UI and Mesh11sd,
# resulting in stale interface name values.
# This patch resolves the issue by removing the setting of the interface name from the script, as it is
# now managed through the UI, ensuring consistency and eliminating the race condition.
--- a/src/mesh11sd
+++ b/src/mesh11sd
@@ -387,45 +387,45 @@ elif [ "$1" = "daemon" ]; then
if [ $mode -eq 5 ]; then
# startup=4, statusmode=0, enabled=1
+ syslogmessage="mesh11sd v$version has started: mesh management mode $mode"
startup=0
statusmode=0
mode=1
- syslogmessage="mesh11sd v$version has started: mesh management mode $mode"
elif [ $mode -eq 4 ]; then
# startup=4, statusmode=0, enabled=0
+ syslogmessage="mesh11sd v$version has started: mesh status mode $mode"
startup=0
statusmode=2
mode=0
- syslogmessage="mesh11sd v$version has started: mesh status mode $mode"
elif [ $mode -eq 3 ]; then
# startup=0, statusmode=2, enabled=1
+ syslogmessage="mesh11sd v$version has started: mesh management mode $mode"
startup=0
statusmode=0
mode=1
- syslogmessage="mesh11sd v$version has started: mesh management mode $mode"
elif [ $mode -eq 2 ]; then
# startup=0, statusmode=2, enabled=0
+ syslogmessage="mesh11sd v$version has started: mesh status mode $mode"
startup=0
statusmode=2
mode=0
- syslogmessage="mesh11sd v$version has started: mesh status mode $mode"
elif [ $mode -eq 1 ]; then
# startup=0, statusmode=0, enabled=1
+ syslogmessage="mesh11sd v$version has started, mesh management mode $mode"
startup=0
statusmode=0
mode=1
- syslogmessage="mesh11sd v$version has started, mesh management mode $mode"
elif [ $mode -eq 0 ]; then
# startup=0, statusmode=0, enabled=0
+ syslogmessage="mesh11sd v$version has started: mesh status mode $mode"
startup=0
statusmode=2
mode=0
- syslogmessage="mesh11sd v$version has started: mesh status mode $mode"
fi
if [ $mode -ne $lastmode ]; then
@@ -441,26 +441,6 @@ elif [ "$1" = "daemon" ]; then
meshconfigs=$(uci show wireless 2> /dev/null | grep "mode='mesh'" | awk -F ".mode='mesh'" '{printf "%s " $1}')
if [ ! -z "$meshconfigs" ]; then
- for meshconfig in $meshconfigs; do
- ifname=$(uci get $meshconfig.ifname 2> /dev/null)
-
- if [ -z "$ifname" ] || [ "$ifname" != "mesh$meshindex" ]; then
- # No interface name in config, so add one
- ucibatch="set $meshconfig.ifname='mesh$meshindex'"
- echo "$ucibatch" | uci batch
- changed=1
- syslogmessage="Setting mesh interface name to [ mesh$meshindex ]"
- write_to_syslog
- fi
- meshindex=$(($meshindex+1))
- done
-
- if [ "$changed" -eq 1 ]; then
- changed=0
- restart_mesh
- continue
- fi
-
# get a list of interfaces
get_mesh_iflist
@@ -482,13 +462,13 @@ elif [ "$1" = "daemon" ]; then
# this is not a mesh interface
continue
else
- # Check if this interface has a uci ifname
- uciname=$(uci show wireless | grep "ifname='$iface'" | awk -F "." '{printf "wireless.%s" $2}')
+ # Check if this interface mode is 'mesh'
+ uciname=$(uci show wireless | grep "mode='mesh'" | awk -F "." '{printf "wireless.%s" $2}')
if [ -z "$uciname" ]; then
- # Error - No interface name in config, we should have added one
+ # Error - No interface with mode as mesh
debugtype="err"
- syslogmessage="Error getting mesh interface name"
+ syslogmessage="Error getting mesh interface section"
write_to_syslog
continue
fi

View File

@@ -0,0 +1,49 @@
#
# Copyright 2023 Morse Micro
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=morsecli
PKG_RELEASE=5
PKG_VERSION:=1.12.4
PKG_LICENSE:=GPLv2
PKG_LICENSE_FILES:=
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/morse_cli.git
PKG_HASH:=04c88a3aea99082a29eb1f84a9b62dcbb85980fa040e0e34901c1826f33ae74c
PKG_SOURCE_PROTO:=git
PKG_MAINTAINER:=Morse Micro <info@morsemicro.com>
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/morsecli
SECTION:=utils
CATEGORY:=Network
TITLE:=Morse Micro WIFI HaLow driver command line tool
DEPENDS:= +kmod-morse +libnl
FILES:=\
$(PKG_BUILD_DIR)/morse_cli
PROVIDES:=morsectrl
endef
MAKE_FLAGS += \
MORSECTRL_VERSION_STRING=$(PKG_VERSION) \
CONFIG_MORSE_TRANS_NL80211=1 \
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/libnl3
define Package/morsecli/install
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/morse_cli $(1)/sbin/
endef
$(eval $(call BuildPackage,morsecli))

View File

@@ -0,0 +1,33 @@
#
# Copyright 2023 Morse Micro
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=wpa_event_listener
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define Package/wpa_event_listener
SECTION:=utils
CATEGORY:=Base system
TITLE:= WPA supplicant s1g event listener
MAINTAINER:=Morse Micro
DEPENDS:= wpa_supplicant_s1g +libwpa_client
endef
define Package/wpa_event_listener/description
A Daemon to listen to wpa supplicant s1g events.
endef
define Package/wpa_event_listener/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpa_event_listener $(1)/usr/sbin
endef
$(eval $(call BuildPackage,wpa_event_listener))

View File

@@ -0,0 +1,24 @@
#
# Copyright (C) 2023-2024 Morse Micro Pty Ltd. All rights reserved
#
APP=wpa_event_listener
LDFLAGS+=-lwpa_client -lubox
ODIR=build
_OBJ = wpa_event_listener.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c
mkdir $(ODIR) -p
$(CC) -c -o $@ $< $(CFLAGS)
$(APP): $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
.PHONY: clean
clean:
rm -rf $(ODIR) $(APP)

View File

@@ -0,0 +1,401 @@
/*
* copyright (C) 2023-2024 Morse Micro Pty Ltd. All rights reserved.
*/
#include <dirent.h>
#include <errno.h>
#include <libubox/uloop.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#include <wpa_ctrl.h>
#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant_s1g"
#define wpa_el_version "V1.0.0"
enum event_value_types {
TYPE_CONF_RECEIVED,
TYPE_ENCRYPTION,
TYPE_SSID,
TYPE_PSK,
TYPE_CONNECTOR,
TYPE_C_SIGN_KEY,
TYPE_PP_KEY,
TYPE_NET_ACCESS_KEY,
TYPE_CTRL_EVENT_TERMINATING,
TYPE_PB_RESULT,
TYPE_PB_STATUS,
};
struct event {
const char *const event_title;
const enum event_value_types event_type;
};
/* dpp connector, c-sign-key, pp-key and net access key will be received after
* qrcode provisionning but they are ignored by now.
*/
static struct event interresting_events[] = {
{"DPP-CONF-RECEIVED", TYPE_CONF_RECEIVED},
{"DPP-CONFOBJ-AKM", TYPE_ENCRYPTION},
{"DPP-CONFOBJ-SSID", TYPE_SSID},
{"DPP-CONFOBJ-PASS", TYPE_PSK},
// { "DPP-CONNECTOR" , TYPE_CONNECTOR },
// { "DPP-C-SIGN-KEY" , TYPE_C_SIGN_KEY },
// { "DPP-PP-KEY" , TYPE_PP_KEY },
// { "DPP-NET-ACCESS-KEY" , TYPE_NET_ACCESS_KEY },
{"DPP-PB-STATUS", TYPE_PB_STATUS},
{"DPP-PB-RESULT", TYPE_PB_RESULT},
{"CTRL-EVENT-TERMINATING", TYPE_CTRL_EVENT_TERMINATING},
};
static struct {
char *encryption;
char *ssid;
char *psk;
// char* connector;
// char* c_sign_key;
// char* pp_key;
// char* net_access_key;
} cached_confs;
static struct wpa_ctrl *ctrl_conn;
static struct uloop_fd listener;
static void led_timeout_cb(struct uloop_timeout*);
static struct uloop_timeout led_timeout = {
.cb = led_timeout_cb,
};
static void led_failed_cb(struct uloop_timeout *);
static struct uloop_timeout failed_timeout = {
.cb = led_failed_cb,
};
static char *ctrl_ifname = NULL;
static char *action_script = NULL;
static const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
static const char *pid_file = NULL;
static int exit_on_config_receive = 1;
void cache_received_confs(char **config, const char *const value) {
// check if the config is already allocated.
if (*config)
free(*config);
*config = strdup(value);
}
void clean_pointer(char **ptr) {
if (*ptr) {
free(*ptr);
*ptr = NULL;
}
}
void clear_cached_confs() {
clean_pointer(&cached_confs.encryption);
clean_pointer(&cached_confs.ssid);
clean_pointer(&cached_confs.psk);
}
void clear_env() {
unsetenv("iface_name");
unsetenv("encryption");
unsetenv("ssid");
unsetenv("psk");
}
void apply_cached_confs() {
// make sure that all needed configs are cached.
if (!cached_confs.encryption || !cached_confs.ssid || !cached_confs.psk)
return;
printf("Configs: \n");
printf(" encryption: %s\n", cached_confs.encryption);
printf(" ssid: %s\n", cached_confs.ssid);
printf(" psk: %s\n", cached_confs.psk);
pid_t pid = 0;
// only fork if we don't want to exit after receiving configs.
if (exit_on_config_receive == 0) {
pid = fork();
if (pid == -1) {
printf("Unable to fork action script\n");
return;
}
// forked process will have pid=0.
if (pid > 0)
return;
}
setenv("iface_name", ctrl_ifname, 1);
setenv("encryption", cached_confs.encryption, 1);
setenv("ssid", cached_confs.ssid, 1);
setenv("psk", cached_confs.psk, 1);
if (execl(action_script, action_script, "config", (char *)NULL) == -1) {
perror("Could not execv");
clear_env();
return;
}
clear_env();
}
void call_action_script(const char *arg) {
pid_t pid = fork();
if (pid == -1) {
printf("Unable to fork action script");
return;
}
if (pid > 0) {
int status;
waitpid(pid, &status, 0);
} else if (execl(action_script, action_script, arg, (char *)NULL) == -1) {
perror("Could not execv");
exit(1);
}
}
static void led_timeout_cb(struct uloop_timeout *t) {
printf("led timeout\n");
call_action_script("finished");
}
static void led_finished() {
// Stop the blink.
printf("Stopping led blink\n");
uloop_timeout_cancel(&led_timeout);
call_action_script("finished");
}
static void led_failed_cb(struct uloop_timeout *t) {
// Start the fail blink with a short timeout.
printf("Starting led fail blink\n");
uloop_timeout_set(&led_timeout, 5000);
call_action_script("failed");
}
static void led_failed() {
// Issue the failed command after a small delay. This is because
// wpa_supplicant emits back to back failed and started events when a
// dpp_push_button occurs while another is still running, so save some time
// for led_started to cancel the failed_timeout.
uloop_timeout_set(&failed_timeout, 1000);
}
static void led_started() {
// Start the blink. Set a long timeout for the blink in case we don't see hostapd PB_RESULT event.
printf("Starting led blink\n");
uloop_timeout_cancel(&failed_timeout);
uloop_timeout_set(&led_timeout, 120000);
call_action_script("started");
}
static void message_process(char *const message) {
const int good_events_count = sizeof(interresting_events) / sizeof(struct event);
for (int i = 0; i < good_events_count; i++) {
char *ptr = strstr(message, interresting_events[i].event_title);
if (ptr) {
const char *const value = ptr + strlen(interresting_events[i].event_title) +
1; // 1 for the space between title and value
switch (interresting_events[i].event_type) {
case TYPE_CONF_RECEIVED:
clear_cached_confs();
break;
case TYPE_ENCRYPTION:
cache_received_confs(&cached_confs.encryption, value);
break;
case TYPE_SSID:
cache_received_confs(&cached_confs.ssid, value);
break;
case TYPE_PSK:
cache_received_confs(&cached_confs.psk, value);
break;
case TYPE_PB_RESULT:
// AP side we wont have confs, so apply_cached_confs does nothing.
if (strstr(value, "success")) {
led_finished();
apply_cached_confs();
clear_cached_confs();
} else if (strstr(value, "failed")) {
led_failed();
}
break;
case TYPE_PB_STATUS:
if (strcmp(value, "started") == 0) {
led_started();
}
break;
case TYPE_CTRL_EVENT_TERMINATING:
printf("Connection to wpa_supplicant lost - exiting\n");
uloop_end();
break;
default:
break;
}
return;
}
}
}
static void listener_cb(struct uloop_fd *fd, unsigned int events) {
while (wpa_ctrl_pending(ctrl_conn) > 0) {
char buf[4096];
size_t len = sizeof(buf) - 1;
if (wpa_ctrl_recv(ctrl_conn, buf, &len) == 0) {
buf[len] = '\0';
printf("New Message:%s\n", buf);
message_process(buf);
} else {
printf("Could not read pending message.\n");
break;
}
}
if (wpa_ctrl_pending(ctrl_conn) < 0) {
printf("Connection to wpa_supplicant lost - exiting\n");
uloop_end();
}
}
static char *wpa_cli_get_default_ifname(void) {
char *ifname = NULL;
struct dirent *dent;
DIR *dir = opendir(ctrl_iface_dir);
if (!dir) {
return NULL;
}
while ((dent = readdir(dir))) {
#ifdef _DIRENT_HAVE_D_TYPE
/*
* Skip the file if it is not a socket. Also accept
* DT_UNKNOWN (0) in case the C library or underlying
* file system does not support d_type.
*/
if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
continue;
#endif /* _DIRENT_HAVE_D_TYPE */
/* Skip current/previous directory and special P2P Device
* interfaces. */
if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0 ||
strncmp(dent->d_name, "p2p-dev-", 8) == 0)
continue;
printf("Selected interface '%s'\n", dent->d_name);
ifname = strdup(dent->d_name);
break;
}
closedir(dir);
return ifname;
}
static void usage(void) {
printf("wpa_event_listener [-p<path to ctrl socket dir>] -i<ifname> [-hvBN] "
"-a<action file> \\\n"
" [-P<pid file>] "
"\\\n"
" "
" -h = help (show this usage text)\n"
" -v = shown version information\n"
" -N = No Exit: don't exit after the configs are received.\n"
" -a = run in daemon mode executing the action file based on "
"events from\n"
" -B = run a daemon in the background\n"
" default path: " CONFIG_CTRL_IFACE_DIR "\n"
" default interface: first interface found in socket path\n");
}
int main(int argc, char *argv[]) {
int c;
int daemonize = 0;
for (;;) {
c = getopt(argc, argv, "a:Bg:G:hNi:p:P:rs:v");
if (c < 0)
break;
switch (c) {
case 'a':
action_script = optarg;
break;
case 'B':
daemonize = 1;
break;
case 'h':
usage();
return 0;
case 'v':
printf("%s\n", wpa_el_version);
return 0;
case 'i':
ctrl_ifname = strdup(optarg);
break;
case 'p':
ctrl_iface_dir = optarg;
break;
case 'P':
pid_file = optarg;
break;
case 'N':
printf("No exit after receive config.\n");
exit_on_config_receive = 0;
break;
default:
usage();
return -1;
}
}
if (ctrl_ifname == NULL)
ctrl_ifname = wpa_cli_get_default_ifname();
if (ctrl_ifname == NULL) {
printf("No WPA supplicant ctrl interface found.\n");
return -1;
}
if (daemonize) {
if (!action_script) {
printf("Daemonizing requires an action script.\n");
return -1;
}
if (daemon(0, 0)) {
perror("daemon");
return -1;
}
if (pid_file) {
FILE *f = fopen(pid_file, "w");
if (f) {
fprintf(f, "%u\n", getpid());
fclose(f);
}
}
}
char *path = malloc(strlen(ctrl_iface_dir) + strlen(ctrl_ifname) + 2);
sprintf(path, "%s/%s", ctrl_iface_dir, ctrl_ifname);
if (!(ctrl_conn = wpa_ctrl_open(path))) {
printf("unable to open control interface on %s.\n", path);
return -1;
}
uloop_init();
if (wpa_ctrl_attach(ctrl_conn) == 0) {
listener.cb = listener_cb;
listener.fd = wpa_ctrl_get_fd(ctrl_conn);
uloop_fd_add(&listener, ULOOP_READ);
listener_cb(NULL, 0);
} else {
printf("Failed to attach to wpa_supplicant.\n");
wpa_ctrl_close(ctrl_conn);
return -1;
}
uloop_run();
printf("Exiting\n");
if (pid_file)
remove(pid_file);
return 0;
}

View File

@@ -0,0 +1,13 @@
if PACKAGE_wpa_supplicant_s1g
config MORSE_WPA_SUPPLICANT_S1G_MESH_NETWORKING
bool
default n
prompt "Enable mesh networking support"
config MORSE_WPA_SUPPLICANT_S1G_EAP
bool
default n
prompt "Enable Extensible Authentication Protocol (EAP) support"
endif

View File

@@ -0,0 +1,178 @@
#
# Copyright 2022 Morse Micro
#
# This is free software, licensed under the 3-Clause BSD License.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=wpa_supplicant_s1g
PKG_RELEASE=2
PKG_VERSION:=1.12.4
PKG_LICENSE:=BSD-3-Clause
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/hostap.git
PKG_HASH:=c342d1489d03363b79b5b4e185ccbceca53aab9e634daefb81180ad1012b77b7
PKG_SOURCE_PROTO:=git
PKG_MAINTAINER:=Morse Micro <info@morsemicro.com>
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
MAKE_FLAGS += \
MORSEWPA_SUPPLICANT_VERSION_STRING=$(PKG_VERSION)
# Add support for simple background scan
MMWPA_SUPPLICANT_CONFIG_SET = \
CONFIG_UBUS
MMWPA_SUPPLICANT_CONFIG_ENABLE = \
CONFIG_IEEE80211AC \
CONFIG_IEEE80211N \
CONFIG_IEEE80211R \
CONFIG_INTERNAL_LIBTOMMATH \
CONFIG_DEBUG_FILE \
CONFIG_MATCH_IFACE \
CONFIG_LIBNL32 \
CONFIG_DRIVER_WEXT \
CONFIG_DRIVER_NL80211 \
CONFIG_DRIVER_WIRED \
CONFIG_IEEE8021X_EAPOL \
CONFIG_WPS \
CONFIG_PKCS12 \
CONFIG_CTRL_IFACE \
CONFIG_READLINE \
CONFIG_IEEE80211W \
CONFIG_INTERNAL_LIBTOMMATH_FAST \
CONFIG_CTRL_IFACE_DBUS_INTRO \
CONFIG_DEBUG_SYSLOG \
CONFIG_INTERWORKING \
CONFIG_HS20 \
CONFIG_MATCH_IFACE \
CONFIG_AP \
CONFIG_P2P \
CONFIG_IBSS_RSN \
CONFIG_OWE \
CONFIG_DPP \
CONFIG_SAE \
CONFIG_TESTING_OPTIONS \
CONFIG_PMKSA_CACHE_EXTERNAL \
CONFIG_WNM
MMWPA_SUPPLICANT_CONFIG_DISABLE = \
CONFIG_BGSCAN_SIMPLE \
CONFIG_SMARTCARD \
CONFIG_CTRL_IFACE_DBUS_NEW \
CONFIG_CTRL_IFACE_DBUS_INTRO \
CONFIG_READLINE
MMWPA_SUPPLICANT_CONFIG_EDITS += 's/\#\(CONFIG_TLS=openssl\)/\1/'
ifeq ($(CONFIG_MORSE_WPA_SUPPLICANT_S1G_MESH_NETWORKING),y)
MMWPA_SUPPLICANT_CONFIG_ENABLE += CONFIG_MESH
endif
ifeq ($(CONFIG_MORSE_WPA_SUPPLICANT_S1G_EAP),y)
MMWPA_SUPPLICANT_CONFIG_ENABLE += \
CONFIG_EAP_PEAP \
CONFIG_EAP_MD5 \
CONFIG_EAP_MSCHAPV2 \
CONFIG_EAP_TLS \
CONFIG_EAP_TTLS \
CONFIG_EAP_GTC \
CONFIG_EAP_PWD
endif
define Package/wpa_supplicant_s1g
SECTION:=net
CATEGORY:=Network
SUBMENU:=WirelessAPD
TITLE:=Morse Micro HaLow wpa_supplicant
DEPENDS:= +kmod-morse +libnl +libopenssl +libubus
USERID:=network=101:network=101
PROVIDES:=wpa_supplicant_s1g
endef
define Package/libwpa_client
SECTION:=net
CATEGORY:=Network
SUBMENU:=WirelessAPD
TITLE:=libwpa_client
DEPENDS:=wpa_supplicant_s1g
endef
define Package/libwpa_client/description
wpa_supplicant_s1g client liberary
endef
define Package/wpa_supplicant_s1g/config
source "$(SOURCE)/Config.in"
endef
MMWPA_SUPPLICANT_CONFIG = $(PKG_BUILD_DIR)/wpa_supplicant/.config
define Build/Prepare
$(call Build/Prepare/Default)
$(CP) $(PKG_BUILD_DIR)/wpa_supplicant/defconfig $(MMWPA_SUPPLICANT_CONFIG)
sed -i $(patsubst %,-e 's/^#\(%\)/\1/',$(MMWPA_SUPPLICANT_CONFIG_ENABLE)) \
$(patsubst %,-e 's/^\(%\)/#\1/',$(MMWPA_SUPPLICANT_CONFIG_DISABLE)) \
$(patsubst %,-e '1i%=y',$(MMWPA_SUPPLICANT_CONFIG_SET)) \
$(patsubst %,-e %,$(MMWPA_SUPPLICANT_CONFIG_EDITS)) \
$(MMWPA_SUPPLICANT_CONFIG)
endef
TARGET_CPPFLAGS := \
-I$(STAGING_DIR)/usr/include/libnl3 \
-I$(PKG_BUILD_DIR)/src/crypto \
$(TARGET_CPPFLAGS) \
-DCONFIG_LIBNL20 \
-D_GNU_SOURCE
TARGET_LDFLAGS += -lnl-3 -lnl-genl-3 -lnl-route-3
TARGET_LDFLAGS += -lm -lpthread -lcrypto -lssl
define Build/RunMake
CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \
$(TARGET_CONFIGURE_OPTS) \
$(DRIVER_MAKEOPTS) \
LIBS="$(TARGET_LDFLAGS)" \
LIBS_c="$(TARGET_LDFLAGS_C)" \
AR="$(TARGET_CROSS)gcc-ar" \
BCHECK= \
$(2)
endef
define Build/Compile
+$(call Build/RunMake,wpa_supplicant, \
wpa_supplicant_s1g wpa_cli_s1g \
)
+$(call Build/RunMake,wpa_supplicant, libwpa_client.so)
endef
define Package/wpa_supplicant_s1g/install
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant_s1g $(1)/sbin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpa_supplicant/wpa_cli_s1g $(1)/sbin/
endef
define Package/libwpa_client/install
$(INSTALL_DIR) $(1)/usr/lib/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpa_supplicant/libwpa_client.so $(1)/usr/lib/
endef
define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/lib/
$(INSTALL_DIR) $(1)/usr/include/
$(CP) $(PKG_BUILD_DIR)/wpa_supplicant/libwpa_client.so $(1)/usr/lib/
$(CP) $(PKG_BUILD_DIR)/src/common/wpa_ctrl.h $(1)/usr/include/wpa_ctrl.h
endef
$(eval $(call BuildPackage,wpa_supplicant_s1g))
$(eval $(call BuildPackage,libwpa_client))

View File

@@ -0,0 +1,45 @@
From 5433351ed5ab62c2d4fbd15a2c4d8c4aeacb93dc Mon Sep 17 00:00:00 2001
From: Evan Benn <evan.benn@morsemicro.com>
Date: Thu, 29 Feb 2024 11:09:38 +1100
Subject: [PATCH] APP-2573: Emit a DPP PB_STATUS event when push button starts
---
src/ap/dpp_hostapd.c | 1 +
wpa_supplicant/dpp_supplicant.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c
index b7cca47c714b..3025eef204d2 100644
--- a/src/ap/dpp_hostapd.c
+++ b/src/ap/dpp_hostapd.c
@@ -3960,6 +3960,7 @@ int hostapd_dpp_push_button(struct hostapd_data *hapd, const char *cmd)
eloop_register_timeout(100, 0, hostapd_dpp_push_button_expire,
hapd, NULL);
+ wpa_msg(hapd->msg_ctx, MSG_INFO, DPP_EVENT_PB_STATUS "started");
return 0;
}
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index ab06ff8d32c1..24e4bb3c444d 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -5676,6 +5676,7 @@ static int wpas_dpp_push_button_configurator(struct wpa_supplicant *wpa_s,
eloop_register_timeout(100, 0, wpas_dpp_push_button_expire,
wpa_s, NULL);
+ wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_PB_STATUS "started");
return 0;
}
@@ -5749,6 +5750,7 @@ int wpas_dpp_push_button(struct wpa_supplicant *wpa_s, const char *cmd)
wpa_supplicant_req_scan(wpa_s, 0, 0);
res = 0;
+ wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_PB_STATUS "started");
out:
/* If push button mode failed to start, restart the chirp forever timer */
--
2.42.0.530.g692be87cbba5

View File

@@ -0,0 +1,90 @@
From 25631fa387af430b8d7f03302218c66dc161cc6f Mon Sep 17 00:00:00 2001
From: Andrew Pope <andrew.pope@morsemicro.com>
Date: Tue, 4 Jun 2024 23:12:37 +0000
Subject: [PATCH] Merged in SW-11943-dpp-does-not-associate-in-us-regdom (pull
request #213)
SW-11943: DPP does not associate in US regdom
Two problems contributed to the originally reported issue:
1. The DPP-PB state machine function will unconditionally cancel any pending off-channel actions - even if the DPP PB discovery phase is over. To fix this, avoid unconditionally completing offchannel actions from DPP-PB state machine function if DPP PB discovery phase is over.
2. Logic around PKEX retries will manually attempt to complete the exchange on adjacent non-S1G channels. These retries inevitably fail, leading to a quicker collapse of the PKEX exchange attempts and eventual downgrade from v2 to v1 (bad). To fix this, remove non-S1G frequency hopping logic from DPP PB discovery and PKEX exchange phases.
Approved-by: Neville Young
Approved-by: Simon Wadsworth
Approved-by: Ayman Grais
Approved-by: James Herbert
---
src/ap/dpp_hostapd.c | 6 ++++++
wpa_supplicant/dpp_supplicant.c | 17 +++++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c
index b7cca47c7..282581fe5 100644
--- a/src/ap/dpp_hostapd.c
+++ b/src/ap/dpp_hostapd.c
@@ -260,6 +260,12 @@ static int hostapd_dpp_allow_ir(struct hostapd_data *hapd, unsigned int freq)
static int hostapd_dpp_pkex_next_channel(struct hostapd_data *hapd,
struct dpp_pkex *pkex)
{
+ /* Following logic is not S1G compatible. Attempting PKEX on non-adjacent S1G channels
+ * results in guaranteed failure.
+ */
+ if (hapd->iconf->ieee80211ah)
+ return -1;
+
if (pkex->freq == 2437)
pkex->freq = 5745;
else if (pkex->freq == 5745)
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index ab06ff8d3..e90e4a163 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -2840,6 +2840,12 @@ static int wpas_dpp_allow_ir(struct wpa_supplicant *wpa_s, unsigned int freq)
static int wpas_dpp_pkex_next_channel(struct wpa_supplicant *wpa_s,
struct dpp_pkex *pkex)
{
+#if defined(CONFIG_IEEE80211AH)
+ /* Following logic is not S1G compatible. Attempting PKEX on non-adjacent S1G channels
+ * results in guaranteed failure.
+ */
+ return -1;
+#endif
if (pkex->freq == 2437)
pkex->freq = 5745;
else if (pkex->freq == 5745)
@@ -5113,10 +5119,16 @@ static int * wpas_dpp_presence_ann_channels(struct wpa_supplicant *wpa_s,
if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_RADAR))
continue;
+#if defined(CONFIG_IEEE80211AH)
+ /* Adding channels 44 and 149 at end of scan list is not required
+ * for HaLow
+ */
+#else
if (chan->freq == 5220)
chan44 = 1;
if (chan->freq == 5745)
chan149 = 1;
+#endif
/* Morse - All 5GHz channels that are mapped to 1 MHz and 2 MHz.
* Channels that aren't relevant to a regulatory domain will be
@@ -5573,9 +5585,10 @@ static void wpas_dpp_pb_next(void *eloop_ctx, void *timeout_ctx)
if (!wpa_s->dpp_pb_freqs)
return;
- os_get_reltime(&now);
- offchannel_send_action_done(wpa_s);
+ if (!wpa_s->dpp_pb_discovery_done)
+ offchannel_send_action_done(wpa_s);
+ os_get_reltime(&now);
if (os_reltime_expired(&now, &wpa_s->dpp_pb_time, 100)) {
wpa_printf(MSG_DEBUG, "DPP: Push button wait time expired");
wpas_dpp_push_button_stop(wpa_s);
--
2.25.1

View File

@@ -0,0 +1,35 @@
From 591ec24748525171d5647d2a35cd1da1445e7a0b Mon Sep 17 00:00:00 2001
From: James Haggerty <james.haggerty@morsemicro.com>
Date: Fri, 26 Jul 2024 09:55:03 +1000
Subject: [PATCH] Hack out channel 50 (and typo for 51)
If we use these channels on a board with those channels disabled,
the DPP presence announcement fails.
This is rubbish: see SW-12450
---
wpa_supplicant/dpp_supplicant.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index 09f8ceb07..46e4add95 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -5199,12 +5199,12 @@ static int * wpas_dpp_presence_ann_channels(struct wpa_supplicant *wpa_s,
static const int s1g_chirp_channels[] = {
/* 2MHz channels */
5190, 5230, 5270, 5310, 5510, 5550,
- 5630, 5670, 5755, 5795, 5835, 5875,
+ 5630, 5670, 5755, 5795, 5835,
/* 1MHz channels */
5660, 5680, 5180, 5200, 5240, 5260,
5280, 5300, 5320, 5500, 5520, 5540,
5560, 5580, 5600, 5620, 5640, 5765,
- 5785, 5805, 5825, 5845, 5865, 5855
+ 5785, 5805, 5825, 5845, 5865
};
if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_RADAR))
--
2.25.1

View File

@@ -48,6 +48,11 @@ $(call Package/ath12k-wifi-default)
TITLE:=board-2.bin for RAP7710c_341x
endef
define Package/ath12k-wifi-sonicfi-rap750e-h
$(call Package/ath12k-wifi-default)
TITLE:=board-2.bin for RAP750e_h
endef
define Package/ath12k-wifi-sonicfi-rap750w-311a
$(call Package/ath12k-wifi-default)
TITLE:=board-2.bin for RAP750W_311a
@@ -95,6 +100,15 @@ define Package/ath12k-wifi-sonicfi-rap7110c-341x/install
$(INSTALL_DATA) ./board-2.bin.rap7110c_341x.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin
endef
define Package/ath12k-wifi-sonicfi-rap750e-h/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN6432/hw1.0/
$(INSTALL_DATA) ./board-2.bin.rap750e_h.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin
$(INSTALL_DATA) ./board-2.bin.rap750e_h.QCN6432 $(1)/lib/firmware/ath12k/QCN6432/hw1.0/board-2.bin
# $(INSTALL_DATA) ./ipq5332_qcn6432.regdb $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/regdb.bin
$(INSTALL_DATA) ./ipq5332_qcn6432.regdb $(1)/lib/firmware/ath12k/QCN6432/hw1.0/regdb.bin
endef
define Package/ath12k-wifi-sonicfi-rap750w-311a/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN6432/hw1.0/
@@ -138,6 +152,7 @@ endef
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189))
$(eval $(call BuildPackage,ath12k-wifi-edgecore-eap105))
$(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap7110c-341x))
$(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap750e-h))
$(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap750w-311a))
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189w))
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189h))

Binary file not shown.

Binary file not shown.

View File

@@ -14,6 +14,7 @@ sercomm,ap72tip)
ucidef_set_led_netdev "wan_act" "wan_act" "yellow:phy" "eth0" "rx tx"
;;
sonicfi,rap7110c-341x|\
sonicfi,rap750e-h|\
sonicfi,rap750w-311a)
ucidef_set_led_default "power" "POWER" "pwm:blue" "on"
;;

View File

@@ -18,7 +18,8 @@ ipq53xx_setup_interfaces()
sonicfi,rap750w-311a)
ucidef_set_interfaces_lan_wan "eth1" "eth0"
;;
sonicfi,rap7110c-341x)
sonicfi,rap7110c-341x|\
sonicfi,rap750e-h)
ucidef_set_interfaces_lan_wan "" "eth0"
;;
cig,wf189w)
@@ -66,11 +67,13 @@ qcom_setup_macs()
wan_mac=$(cat /sys/class/net/eth0/address)
lan_mac=$(macaddr_add "$wan_mac" 1)
;;
sonicfi,rap7110c-341x)
sonicfi,rap7110c-341x|\
sonicfi,rap750e-h)
wan_mac=$(cat /sys/class/net/eth0/address)
ucidef_set_wireless_macaddr_base 2g $(macaddr_add "$wan_mac" 1)
ucidef_set_wireless_macaddr_base 5g $(macaddr_add "$wan_mac" 2)
ucidef_set_wireless_macaddr_base 6g $(macaddr_add "$wan_mac" 3)
[ "$board" = "sonicfi,rap7110c-34x" ] &&
ucidef_set_wireless_macaddr_base 6g $(macaddr_add "$wan_mac" 3)
;;
sonicfi,rap750w-311a)
wan_mac=$(cat /sys/class/net/eth0/address)

View File

@@ -38,8 +38,9 @@ ath12k/IPQ5332/hw1.0/caldata.bin)
sonicfi,rap7110c-341x)
caldata_extract_mmc "0:ART" 0x1000 0xF800
;;
sonicfi,rap750e-h|\
sonicfi,rap750w-311a)
caldata_extract "0:ART" 0x1000 0xf800
caldata_extract "0:ART" 0x1000 0xf800
;;
esac
;;
@@ -58,6 +59,7 @@ ath12k/QCN92XX/hw1.0/cal-pci-0001:01:00.0.bin)
;;
ath12k/QCN6432/hw1.0/caldata_1.bin)
case "$board" in
sonicfi,rap750e-h|\
sonicfi,rap750w-311a)
caldata_extract "0:ART" 0x12800 0x18800
;;

View File

@@ -114,8 +114,9 @@ platform_do_upgrade() {
;;
sonicfi,rap7110c-341x)
sonicfi_dualimage_check
emmc_do_upgrade $1 $1
emmc_do_upgrade "$1"
;;
sonicfi,rap750e-h|\
sonicfi,rap750w-311a)
sonicfi_dualimage_check
nand_upgrade_tar "$1"

View File

@@ -18,6 +18,21 @@
model = "CIG WF189";
compatible = "cig,wf189", "qcom,ipq5332-ap-mi01.6", "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;

View File

@@ -0,0 +1,687 @@
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
* IPQ5332 RDP477 board device tree source
*
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/dts-v1/;
#include "ipq5332.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
#include "ipq5332-default-memory.dtsi"
/ {
model = "SONICFI RAP750E-H";
compatible = "sonicfi,rap750e-h","qcom,ipq5332-ap-mi01.3-c2", "qcom,ipq5332";
#ifdef __IPQ_MEM_PROFILE_512_MB__
/* 512M Memory Layout for IPQ5332 + QCN6432
* +==========+==============+========================+
* | | | |
* | Region | Start Offset | Size |
* | | | |
* +---------+--------------+-------------------------+
* | Q6 | | |
* | code/ | 0x4A900000 | 20MB |
* | data | | |
* +---------+--------------+-------------------------+
* | IPQ5332 | | |
* | data | 0x4BD00000 | 17MB |
* +---------+--------------+-------------------------+
* | IPQ5332 | | |
* | M3 Dump | 0x4CE00000 | 1MB |
* +---------+--------------+-------------------------+
* | IPQ5332 | | |
* | QDSS | 0x4CF00000 | 1MB |
* +---------+--------------+-------------------------+
* |IPQ5332 | | |
* | CALDB | 0x4D000000 | 3MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | data | 0x4D300000 | 16MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | M3 Dump | 0x4E300000 | 1MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | QDSS | 0x4E400000 | 1MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | CALDB | 0x4E500000 | 5MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* |MEM_HOLE | 0x4EA00000 | 5MB |
* +---------+--------------+-------------------------+
* | | | |
* | MLO | 0x4EF00000 | 17MB |
* +==================================================+
* | |
* | |
* | |
* | Rest of memory for Linux |
* | |
* | |
* | |
* +==================================================+
*/
reserved-memory {
/delete-node/ m3_dump@4cc00000;
/delete-node/ q6_etr_dump@1;
/delete-node/ mlo_global_mem_0@0x4db00000;
/delete-node/ wcnss@4a900000;
/delete-node/ q6_caldb_region@4ce00000;
q6_mem_regions: q6_mem_regions@4A900000 {
no-map;
reg = <0x0 0x4A900000 0x0 0x4600000>;
};
q6_code_data: q6_code_data@4A900000 {
no-map;
reg = <0x0 0x4A900000 0x0 0x1400000>;
};
q6_ipq5332_data: q6_ipq5332_data@4BD00000 {
no-map;
reg = <0x0 0x4BD00000 0x0 0x1100000>;
};
m3_dump: m3_dump@4CE00000 {
no-map;
reg = <0x0 0x4CE00000 0x0 0x100000>;
};
q6_etr_region: q6_etr_dump@4CF00000 {
no-map;
reg = <0x0 0x4CF00000 0x0 0x100000>;
};
q6_ipq5332_caldb: q6_ipq5332_caldb@4D000000 {
no-map;
reg = <0x0 0x4D000000 0x0 0x300000>;
};
q6_qcn6432_data_1: q6_qcn6432_data_1@4D300000 {
no-map;
reg = <0x0 0x4D300000 0x0 0x1000000>;
};
m3_dump_qcn6432_1: m3_dump_qcn6432_1@4E300000 {
no-map;
reg = <0x0 0x4E300000 0x0 0x100000>;
};
q6_qcn6432_etr_1: q6_qcn6432_etr_1@4E400000 {
no-map;
reg = <0x0 0x4E400000 0x0 0x100000>;
};
q6_qcn6432_caldb_1: q6_qcn6432_caldb_1@4E500000 {
no-map;
reg = <0x0 0x4E500000 0x0 0x500000>;
};
mlo_global_mem0: mlo_global_mem_0@4EF00000 {
no-map;
reg = <0x0 0x4EF00000 0x0 0x1100000>;
};
};
#else
/* 1G Memory Layout for IPQ5332 + QCN6432
* +==========+==============+========================+
* | | | |
* | Region | Start Offset | Size |
* | | | |
* +---------+--------------+-------------------------+
* | Q6 | | |
* | code/ | 0x4A900000 | 20MB |
* | data | | |
* +---------+--------------+-------------------------+
* | IPQ5332 | | |
* | data | 0x4BD00000 | 21MB |
* +---------+--------------+-------------------------+
* | IPQ5332 | | |
* | M3 Dump | 0x4D200000 | 1MB |
* +---------+--------------+-------------------------+
* | IPQ5332 | | |
* | QDSS | 0x4D300000 | 1MB |
* +---------+--------------+-------------------------+
* |IPQ5332 | | |
* | CALDB | 0x4D400000 | 5MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | data | 0x4D900000 | 21MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | M3 Dump | 0x4EE00000 | 1MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | QDSS | 0x4EF00000 | 1MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* | CALDB | 0x4F000000 | 5MB |
* +---------+--------------+-------------------------+
* |QCN6432_1| | |
* |MEM_HOLE | 0x4F500000 | 5MB |
* +---------+--------------+-------------------------+
* | | | |
* | MLO | 0x4FA00000 | 17MB |
* +==================================================+
* | |
* | |
* | |
* | Rest of memory for Linux |
* | |
* | |
* | |
* +==================================================+
*/
reserved-memory {
/delete-node/ m3_dump@4cc00000;
/delete-node/ q6_etr_dump@1;
/delete-node/ mlo_global_mem_0@0x4db00000;
/delete-node/ wcnss@4a900000;
/delete-node/ q6_caldb_region@4ce00000;
q6_mem_regions: q6_mem_regions@4A900000 {
no-map;
reg = <0x0 0x4A900000 0x0 0x5100000>;
};
q6_code_data: q6_code_data@4A900000 {
no-map;
reg = <0x0 0x4A900000 0x0 0x1400000>;
};
q6_ipq5332_data: q6_ipq5332_data@4BD00000 {
no-map;
reg = <0x0 0x4BD00000 0x0 0x1500000>;
};
m3_dump: m3_dump@4D200000 {
no-map;
reg = <0x0 0x4D200000 0x0 0x100000>;
};
q6_etr_region: q6_etr_dump@4D300000 {
no-map;
reg = <0x0 0x4D300000 0x0 0x100000>;
};
q6_ipq5332_caldb: q6_ipq5332_caldb@4D400000 {
no-map;
reg = <0x0 0x4D400000 0x0 0x500000>;
};
q6_qcn6432_data_1: q6_qcn6432_data_1@4D900000 {
no-map;
reg = <0x0 0x4D900000 0x0 0x1500000>;
};
m3_dump_qcn6432_1: m3_dump_qcn6432_1@4EE00000 {
no-map;
reg = <0x0 0x4EE00000 0x0 0x100000>;
};
q6_qcn6432_etr_1: q6_qcn6432_etr_1@4EF00000 {
no-map;
reg = <0x0 0x4EF00000 0x0 0x100000>;
};
q6_qcn6432_caldb_1: q6_qcn6432_caldb_1@4F000000 {
no-map;
reg = <0x0 0x4F000000 0x0 0x500000>;
};
mlo_global_mem0: mlo_global_mem_0@4FA00000 {
no-map;
reg = <0x0 0x4FA00000 0x0 0x1100000>;
};
};
#endif
aliases {
serial0 = &blsp1_uart0;
serial1 = &blsp1_uart1;
ethernet0 = "/soc/dp1";
//ethernet1 = "/soc/dp2";
led-boot = &led_power;
led-failsafe = &led_power;
led-running = &led_power;
led-upgrade = &led_power;
};
chosen {
stdout-path = "serial0";
};
soc@0 {
mdio:mdio@90000 {
pinctrl-0 = <&mdio1_pins>;
pinctrl-names = "default";
/*gpio26 for manhattan reset*/
phy-reset-gpio = <&tlmm 26 GPIO_ACTIVE_LOW>;
status = "okay";
phy0: ethernet-phy@0 {
reg = <16>;
};
};
gpio_keys {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
status = "okay";
button@1 {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&tlmm 24 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
pwmleds {
compatible = "pwm-leds";
red {
label = "pwm:red";
pwms = <&pwm 2 1250000>;
max-brightness = <255>;
linux,default-trigger = "none";
};
green {
label = "pwm:green";
pwms = <&pwm 3 1250000>;
max-brightness = <255>;
linux,default-trigger = "none";
};
led_power: blue {
label = "pwm:blue";
pwms = <&pwm 1 1250000>;
max-brightness = <255>;
linux,default-trigger = "none";
};
white {
label = "pwm:white";
pwms = <&pwm 0 1250000>;
max-brightness = <255>;
linux,default-trigger = "none";
};
};
ess-instance {
num_devices = <0x1>;
ess-switch@3a000000 {
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
switch_lan_bmp = <0x4>; /* lan port bitmap */
switch_wan_bmp = <0x0>; /* wan port bitmap */
switch_mac_mode = <0xff>; /* mac mode for uniphy instance0*/
switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/
switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/
qcom,port_phyinfo {
port@1 {
port_id = <2>;
phy_address = <16>;
};
};
};
};
dp1 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <2>;
reg = <0x3a504000 0x4000>;
qcom,mactype = <1>;
local-mac-address = [000000000000];
mdio-bus = <&mdio>;
qcom,phy-mdio-addr = <16>;
qcom,link-poll = <1>;
phy-mode = "sgmii";
};
/* EDMA host driver configuration for the board */
edma@3ab00000 {
qcom,txdesc-ring-start = <4>; /* Tx desc ring start ID */
qcom,txdesc-rings = <12>; /* Total number of Tx desc rings to be provisioned */
qcom,mht-txdesc-rings = <8>; /* Extra Tx desc rings to be provisioned for MHT SW ports */
qcom,txcmpl-ring-start = <4>; /* Tx complete ring start ID */
qcom,txcmpl-rings = <12>; /* Total number of Tx complete rings to be provisioned */
qcom,mht-txcmpl-rings = <8>; /* Extra Tx complete rings to be provisioned for mht sw ports. */
qcom,rxfill-ring-start = <4>; /* Rx fill ring start ID */
qcom,rxfill-rings = <4>; /* Total number of Rx fill rings to be provisioned */
qcom,rxdesc-ring-start = <12>; /* Rx desc ring start ID */
qcom,rxdesc-rings = <4>; /* Total number of Rx desc rings to be provisioned */
qcom,rx-page-mode = <0>; /* Rx fill ring page mode */
qcom,tx-map-priority-level = <1>; /* Tx priority level per port */
qcom,rx-map-priority-level = <1>; /* Rx priority level per core */
qcom,ppeds-num = <2>; /* Number of PPEDS nodes */
/* PPE-DS node format: <Rx-fill Tx-cmpl Rx Tx Queue-base Queue-count> */
qcom,ppeds-map = <1 1 1 1 32 8>, /* PPEDS Node#0 ring and queue map */
<2 2 2 2 40 8>; /* PPEDS Node#1 ring and queue map */
qcom,txdesc-map = <8 9 10 11>, /* Port0 per-core Tx ring map */
<12 13 14 15>, /* MHT-Port1 per-core Tx ring map */
<4 5 6 7>, /* MHT-Port2 per-core Tx ring map/packets from vp*/
<16 17 18 19>, /* MHT-Port3 per-core Tx ring map */
<20 21 22 23>; /* MHT-Port4 per-core Tx ring map */
qcom,txdesc-fc-grp-map = <1 2 3 4 5>; /* Per GMAC flow control group map */
qcom,rxfill-map = <4 5 6 7>; /* Per-core Rx fill ring map */
qcom,rxdesc-map = <12 13 14 15>; /* Per-core Rx desc ring map */
qcom,rx-queue-start = <0>; /* Rx queue start */
qcom,rx-ring-queue-map = <0 8 16 24>, /* Priority 0 queues per-core Rx ring map */
<1 9 17 25>, /* Priority 1 queues per-core Rx ring map */
<2 10 18 26>, /* Priority 2 queues per-core Rx ring map */
<3 11 19 27>, /* Priority 3 queues per-core Rx ring map */
<4 12 20 28>, /* Priority 4 queues per-core Rx ring map */
<5 13 21 29>, /* Priority 5 queues per-core Rx ring map */
<6 14 22 30>, /* Priority 6 queues per-core Rx ring map */
<7 15 23 31>; /* Priority 7 queues per-core Rx ring map */
interrupts = <0 163 4>, /* Tx complete ring id #4 IRQ info */
<0 164 4>, /* Tx complete ring id #5 IRQ info */
<0 165 4>, /* Tx complete ring id #6 IRQ info */
<0 166 4>, /* Tx complete ring id #7 IRQ info */
<0 167 4>, /* Tx complete ring id #8 IRQ info */
<0 168 4>, /* Tx complete ring id #9 IRQ info */
<0 169 4>, /* Tx complete ring id #10 IRQ info */
<0 170 4>, /* Tx complete ring id #11 IRQ info */
<0 171 4>, /* Tx complete ring id #12 IRQ info */
<0 172 4>, /* Tx complete ring id #13 IRQ info */
<0 173 4>, /* Tx complete ring id #14 IRQ info */
<0 174 4>, /* Tx complete ring id #15 IRQ info */
<0 139 4>, /* Rx desc ring id #12 IRQ info */
<0 140 4>, /* Rx desc ring id #13 IRQ info */
<0 141 4>, /* Rx desc ring id #14 IRQ info */
<0 142 4>, /* Rx desc ring id #15 IRQ info */
<0 191 4>, /* Misc error IRQ info */
<0 160 4>, /* PPEDS Node #1(TxComp ring id #1) TxComplete IRQ info */
<0 128 4>, /* PPEDS Node #1(Rx Desc ring id #1) Rx Desc IRQ info */
<0 152 4>, /* PPEDS Node #1(RxFill Desc ring id #1) Rx Fill IRQ info */
<0 161 4>, /* PPEDS Node #2(TxComp ring id #2) TxComplete IRQ info */
<0 129 4>, /* PPEDS Node #2(Rx Desc ring id #2) Rx Desc IRQ info */
<0 153 4>, /* PPEDS Node #2(RxFill Desc ring id #2) Rx Fill IRQ info */
<0 175 4>, /* MHT port Tx complete ring id #16 IRQ info */
<0 176 4>, /* MHT port Tx complete ring id #17 IRQ info */
<0 177 4>, /* MHT port Tx complete ring id #18 IRQ info */
<0 178 4>, /* MHT port Tx complete ring id #19 IRQ info */
<0 179 4>, /* MHT port Tx complete ring id #20 IRQ info */
<0 180 4>, /* MHT port Tx complete ring id #21 IRQ info */
<0 181 4>, /* MHT port Tx complete ring id #22 IRQ info */
<0 182 4>; /* MHT port Tx complete ring id #23 IRQ info */
};
wsi: wsi {
id = <0>;
num_chip = <2>;
status = "okay";
chip_info = <0 1 1>,
<1 1 0>;
};
q6v5_wcss: remoteproc@d100000 {
boot-args = <0x1 0x4 0x3 0x0 0x26 0x2>;
memory-region = <&q6_mem_regions>;
q6_wcss_pd1: remoteproc_pd1 {
status = "okay";
};
q6_wcss_pd2: remoteproc_pd2 {
compatible = "qcom,ipq5332-wcss-pcie-mpd";
firmware = "IPQ5332/q6_fw2.mdt";
m3_firmware = "qcn6432/iu_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";
status = "okay";
};
};
};
};
&blsp1_uart0 {
pinctrl-0 = <&serial_0_pins>;
pinctrl-names = "default";
status = "okay";
};
/*
&blsp1_uart1 {
pinctrl-0 = <&serial_1_pins>;
pinctrl-names = "default";
status = "disabled";
};
*/
&blsp1_i2c1 {
clock-frequency = <400000>;
pinctrl-0 = <&i2c_1_pins>;
pinctrl-names = "default";
status = "okay";
};
&blsp1_spi0 {
status = "disabled";
};
&sdhc {
bus-width = <4>;
max-frequency = <192000000>;
mmc-ddr-1_8v;
mmc-hs200-1_8v;
non-removable;
pinctrl-0 = <&sdc_default_state>;
pinctrl-names = "default";
status = "disabled";
};
&sleep_clk {
clock-frequency = <32000>;
};
&xo {
clock-frequency = <24000000>;
};
&qpic_bam {
status = "okay";
};
&qpic_nand {
pinctrl-0 = <&qspi_default_state>;
pinctrl-names = "default";
status = "okay";
nandcs@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;
nand-ecc-strength = <8>;
nand-ecc-step-size = <512>;
nand-bus-width = <8>;
};
};
/* PINCTRL */
&tlmm {
qspi_default_state: qspi-default-state {
qspi_clock {
pins = "gpio13";
function = "qspi_clk";
drive-strength = <8>;
bias-pull-down;
};
qspi_cs {
pins = "gpio12";
function = "qspi_cs";
drive-strength = <8>;
bias-pull-up;
};
qspi_data {
pins = "gpio8", "gpio9", "gpio10", "gpio11";
function = "qspi_data";
drive-strength = <8>;
bias-pull-down;
};
};
pwm_pins: pwm_pinmux {
/* PWM LED GREEN */
mux_1 {
pins = "gpio43";
function = "pwm0";
drive-strength = <8>;
};
/* PWM LED BLUE */
mux_2 {
pins = "gpio45";
function = "pwm0";
drive-strength = <8>;
};
/* PWM LED RED */
mux_3 {
pins = "gpio44";
function = "pwm0";
drive-strength = <8>;
};
/* PWM LED WHITE */
mux_4 {
pins = "gpio46";
function = "pwm0";
drive-strength = <8>;
};
};
/*
serial_1_pins: serial1-pinmux {
pins = "gpio33", "gpio34", "gpio35", "gpio36";
function = "blsp1_uart2";
drive-strength = <8>;
bias-pull-up;
};
*/
i2c_1_pins: i2c-1-state {
pins = "gpio29", "gpio30";
function = "blsp1_i2c0";
drive-strength = <8>;
bias-pull-up;
};
/*
gpio_leds_default: gpio-leds-default-state {
pins = "gpio36";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
*/
button_pins: button-state {
pins = "gpio24";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
sdc_default_state: sdc-default-state {
clk-pins {
pins = "gpio13";
function = "sdc_clk";
drive-strength = <8>;
bias-disable;
};
cmd-pins {
pins = "gpio12";
function = "sdc_cmd";
drive-strength = <8>;
bias-pull-up;
};
data-pins {
pins = "gpio8", "gpio9", "gpio10", "gpio11";
function = "sdc_data";
drive-strength = <8>;
bias-pull-up;
};
};
};
&license_manager {
status = "okay";
};
&usb3 {
qcom,select-utmi-as-pipe-clk;
status = "disabled";
};
&pwm {
pinctrl-0 = <&pwm_pins>;
used-pwm-indices = <1>, <1>, <1>, <1>;
pinctrl-names = "default";
status = "okay";
};
&hs_m31phy_0 {
status = "okay";
};
&wifi0 {
qcom,multipd_arch;
qcom,rproc = <&q6_wcss_pd1>;
qcom,rproc_rpd = <&q6v5_wcss>;
qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
qcom,bdf-addr = <0x4BD00000 0x4BD00000 0x0 0x0 0x0 0x0>;
qcom,caldb-addr = <0x4D400000 0x4D000000 0x0 0x0 0x0 0x0>;
#ifdef __IPQ_MEM_PROFILE_512_MB__
qcom,tgt-mem-mode = <1>;
qcom,caldb-size = <0x300000>;
#else
qcom,tgt-mem-mode = <0>;
qcom,caldb-size = <0x500000>;
#endif
qcom,board_id = <0x1b>;
memory-region = <&q6_ipq5332_data>;
qcom,wsi = <&wsi>;
qcom,wsi_index = <0>;
status = "okay";
};
&wifi1 {
qcom,multipd_arch;
qcom,rproc = <&q6_wcss_pd2>;
qcom,rproc_rpd = <&q6v5_wcss>;
qcom,userpd-subsys-name = "q6v5_wcss_userpd2";
qcom,bdf-addr = <0x4D900000 0x4D300000 0x0 0x0 0x0 0x0>;
qcom,caldb-addr = <0x4F000000 0x4E500000 0x0 0x0 0x0 0x0>;
qcom,umac-irq-reset-addr = <0x20000884>;
qcom,caldb-size = <0x500000>;
#ifdef __IPQ_MEM_PROFILE_512_MB__
qcom,tgt-mem-mode = <1>;
#else
qcom,tgt-mem-mode = <0>;
#endif
qcom,board_id = <0x060>;
memory-region = <&q6_qcn6432_data_1>;
qcom,wsi = <&wsi>;
qcom,wsi_index = <1>;
status = "okay";
interrupts = <GIC_SPI 33 IRQ_TYPE_EDGE_RISING>;
interrupt-names = "umac_reset";
};

View File

@@ -1,72 +1,27 @@
# CONFIG_32BIT is not set
CONFIG_64BIT=y
# CONFIG_ACPI is not set
# CONFIG_ARCH_BCM_IPROC is not set
# CONFIG_ARCH_EXYNOS7 is not set
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
# CONFIG_ARCH_LAYERSCAPE is not set
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
# CONFIG_ARCH_SEATTLE is not set
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
# CONFIG_ARCH_SPRD is not set
# CONFIG_ARCH_STRATIX10 is not set
# CONFIG_ARCH_THUNDER is not set
CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
CONFIG_ARCH_WANT_FRAME_POINTERS=y
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
# CONFIG_ARCH_XGENE is not set
# CONFIG_ARCH_ZYNQMP is not set
CONFIG_ARM64=y
# CONFIG_ARM64_16K_PAGES is not set
CONFIG_ARM64_4K_PAGES=y
# CONFIG_ARM64_64K_PAGES is not set
# CONFIG_ARM64_CRYPTO is not set
# CONFIG_ARM64_ERRATUM_819472 is not set
# CONFIG_ARM64_ERRATUM_824069 is not set
# CONFIG_ARM64_ERRATUM_826319 is not set
# CONFIG_ARM64_ERRATUM_827319 is not set
# CONFIG_ARM64_ERRATUM_832075 is not set
# CONFIG_ARM64_ERRATUM_843419 is not set
# CONFIG_ARM64_ERRATUM_845719 is not set
CONFIG_ARM64_CRYPTO=y
CONFIG_ARM64_HW_AFDBM=y
# CONFIG_ARM64_LSE_ATOMICS is not set
CONFIG_ARM64_PAN=y
# CONFIG_ARM64_PTDUMP is not set
# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
CONFIG_ARM64_VA_BITS=39
CONFIG_ARM64_VA_BITS_39=y
# CONFIG_ARM64_VA_BITS_48 is not set
# CONFIG_ARMV8_DEPRECATED is not set
# CONFIG_CAVIUM_ERRATUM_22375 is not set
# CONFIG_CAVIUM_ERRATUM_23154 is not set
# CONFIG_CAVIUM_ERRATUM_27456 is not set
# CONFIG_COMMON_CLK_VERSATILE is not set
CONFIG_COMMON_CLK_XGENE=y
CONFIG_COMPAT=y
CONFIG_COMPAT_BINFMT_ELF=y
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
# CONFIG_DEBUG_ALIGN_RODATA is not set
CONFIG_FRAME_WARN=2048
# CONFIG_GPIO_XGENE is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_I2C_CADENCE is not set
# CONFIG_KASAN is not set
CONFIG_CRYPTO_AES_ARM64_CE=y
# CONFIG_INITRAMFS_PRESERVE_MTIME is not set
# CONFIG_KVM is not set
# CONFIG_NET_VENDOR_CAVIUM is not set
# CONFIG_PCI_HISI is not set
CONFIG_PHYS_ADDR_T_64BIT=y
# CONFIG_PHY_XGENE is not set
# CONFIG_POWER_RESET_XGENE is not set
CONFIG_QCOM_SCM_64=y
# CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is not set
# CONFIG_RTC_DRV_EFI is not set
CONFIG_SPARSEMEM=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_VIRTUALIZATION=y
CONFIG_ARM64_CRYPTO=y
CONFIG_CRYPTO_AES_ARM64_CE=y

View File

@@ -65,6 +65,20 @@ define Device/sonicfi_rap7110c_341x
endef
TARGET_DEVICES += sonicfi_rap7110c_341x
define Device/sonicfi_rap750e_h
DEVICE_TITLE := SONICFI RAP750E-H
DEVICE_DTS := ipq5332-sonicfi-rap750e-h
DEVICE_DTS_DIR := ../dts
DEVICE_DTS_CONFIG := config@mi01.3-c2
SUPPORTED_DEVICES := sonicfi,rap750e-h
IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand
IMAGE/nand-factory.ubi := append-ubi
DEVICE_PACKAGES := ath12k-wifi-sonicfi-rap750e-h ath12k-firmware-ipq5332-peb -ath12k-firmware-qcn92xx
endef
TARGET_DEVICES += sonicfi_rap750e_h
define Device/sonicfi_rap750w_311a
DEVICE_TITLE := SONICFI RAP750W-311A
DEVICE_DTS := ipq5332-sonicfi-rap750w-311a

View File

@@ -88,6 +88,7 @@ yuncore,fap655)
;;
senao,iap2300m|\
senao,iap4300m|\
emplus,wap588m|\
senao,jeap6500)
PART_NAME=ubi
;;

View File

@@ -12,6 +12,7 @@ define Package/cloud_discovery
SECTION:=ucentral
CATEGORY:=uCentral
TITLE:=TIP cloud_discovery
DEPENDS:=+libest
endef
Build/Compile=

View File

@@ -572,6 +572,7 @@ function channel_optimize() {
let radio_iface = {};
let htmode = {};
let radio_band = {};
let radio_disabled = {};
let acs_exclude_dfs = {};
let channel_config = {};
let selected_channels = {};
@@ -604,11 +605,13 @@ function channel_optimize() {
// get wireless interface uci config from "ubus call network.wireless status"
let wireless_status = global.ubus.conn.call('network.wireless', 'status');
radio_iface[j] = wireless_status[radio_id].interfaces[0].ifname;
radio_disabled[j] = wireless_status[radio_id].disabled;
radio_band[j] = wireless_status[radio_id].config.band;
if (radio_iface[j] == null) {
if (radio_disabled[j] == true) {
radio_iface[j] = 'radio ' + radio_band[j];
} else {
radio_iface[j] = wireless_status[radio_id].interfaces[0].ifname;
}
// check wlan interface status

View File

@@ -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:=280d87658fa36c1d5d6852dcb8203042eba6bbc9101ac317a2088e2dd68249da
PKG_MIRROR_HASH:=4788da65803c8674c5d983b2be6d50960708d7adb1bd86cbf62a763b88a1f6d8
PKG_SOURCE_PROTO:=git
PKG_SOURCE_DATE:=2025-01-27
PKG_SOURCE_VERSION:=52afdf8f1d1cb8445b6b56eba3768d0edffa63e1
PKG_SOURCE_VERSION:=6faaa1f655e3fbf4b5f915c9782634a5a89c2be7
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
PKG_LICENSE:=BSD-3-Clause

File diff suppressed because it is too large Load Diff

View File

@@ -7,6 +7,8 @@ image: bin/targets/mediatek/mt7981/openwrt-mediatek-mt7981-edgecore_eap112-squas
feeds:
- name: mediatek
path: ../../feeds/mediatek-sdk
- name: morse
path: ../../feeds/morse
packages:
- mediatek
- kmod-i2c-core
@@ -31,6 +33,15 @@ packages:
- wwan
- dbus
- i2c-tools
- kmod-morse
- morse-fw
- morsecli
- hostapd_s1g
- wpa_supplicant_s1g
- netifd-morse
- morse_mesh11sd
- wpa_event_listener
- morse-regdb
include:
- ucentral-ap
diffconfig: |

942
profiles/emplus_wap588m.yml Normal file
View File

@@ -0,0 +1,942 @@
---
profile: emplus_wap588m
target: mediatek
subtarget: mt7981
description: Build image for the EMPLUS WAP588M
image: bin/targets/mediatek/mt7981/openwrt-mediatek-mt7981-emplus_wap588m-squashfs-sysupgrade.bin
feeds:
- name: mediatek
path: ../../feeds/mediatek-sdk
packages:
- mediatek
include:
- ucentral-ap
diffconfig: |
CONFIG_BUSYBOX_CUSTOM=y
CONFIG_BUSYBOX_DEFAULT_HAVE_DOT_CONFIG=y
# CONFIG_BUSYBOX_DEFAULT_DESKTOP is not set
# CONFIG_BUSYBOX_DEFAULT_EXTRA_COMPAT is not set
CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0
# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG is not set
CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0
# CONFIG_BUSYBOX_DEFAULT_FEATURE_KMSG_SYSLOG is not set
CONFIG_BUSYBOX_CONFIG_HAVE_DOT_CONFIG=y
#
# Settings
#
# CONFIG_BUSYBOX_CONFIG_DESKTOP is not set
# CONFIG_BUSYBOX_CONFIG_EXTRA_COMPAT is not set
# CONFIG_BUSYBOX_CONFIG_FEDORA_COMPAT is not set
CONFIG_BUSYBOX_CONFIG_INCLUDE_SUSv2=y
CONFIG_BUSYBOX_CONFIG_LONG_OPTS=y
CONFIG_BUSYBOX_CONFIG_SHOW_USAGE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VERBOSE_USAGE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_COMPRESS_USAGE is not set
CONFIG_BUSYBOX_CONFIG_LFS=y
# CONFIG_BUSYBOX_CONFIG_PAM is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_DEVPTS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_UTMP is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_PIDFILE=y
CONFIG_BUSYBOX_CONFIG_PID_FILE_PATH="/var/run"
# CONFIG_BUSYBOX_CONFIG_BUSYBOX is not set
# CONFIG_BUSYBOX_CONFIG_INSTALL_NO_USR is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SUID is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_APPLETS=y
CONFIG_BUSYBOX_CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe"
# CONFIG_BUSYBOX_CONFIG_SELINUX is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_CLEAN_UP is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG_INFO is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG=y
#
# Build Options
#
# CONFIG_BUSYBOX_CONFIG_STATIC is not set
# CONFIG_BUSYBOX_CONFIG_PIE is not set
# CONFIG_BUSYBOX_CONFIG_NOMMU is not set
CONFIG_BUSYBOX_CONFIG_CROSS_COMPILER_PREFIX=""
CONFIG_BUSYBOX_CONFIG_SYSROOT=""
CONFIG_BUSYBOX_CONFIG_EXTRA_CFLAGS=""
CONFIG_BUSYBOX_CONFIG_EXTRA_LDFLAGS=""
CONFIG_BUSYBOX_CONFIG_EXTRA_LDLIBS=""
# CONFIG_BUSYBOX_CONFIG_USE_PORTABLE_CODE is not set
# CONFIG_BUSYBOX_CONFIG_STACK_OPTIMIZATION_386 is not set
# CONFIG_BUSYBOX_CONFIG_STATIC_LIBGCC is not set
#
# Installation Options ("make install" behavior)
#
CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_SYMLINKS=y
# CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_HARDLINKS is not set
# CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
# CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_DONT is not set
CONFIG_BUSYBOX_CONFIG_PREFIX="./_install"
#
# Debugging Options
#
# CONFIG_BUSYBOX_CONFIG_DEBUG is not set
# CONFIG_BUSYBOX_CONFIG_DEBUG_SANITIZE is not set
# CONFIG_BUSYBOX_CONFIG_UNIT_TEST is not set
# CONFIG_BUSYBOX_CONFIG_WERROR is not set
# CONFIG_BUSYBOX_CONFIG_WARN_SIMPLE_MSG is not set
CONFIG_BUSYBOX_CONFIG_NO_DEBUG_LIB=y
# CONFIG_BUSYBOX_CONFIG_DMALLOC is not set
# CONFIG_BUSYBOX_CONFIG_EFENCE is not set
#
# Library Tuning
#
# CONFIG_BUSYBOX_CONFIG_FEATURE_USE_BSS_TAIL is not set
# CONFIG_BUSYBOX_CONFIG_FLOAT_DURATION is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_RTMINMAX is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
CONFIG_BUSYBOX_CONFIG_PASSWORD_MINLEN=6
CONFIG_BUSYBOX_CONFIG_MD5_SMALL=1
CONFIG_BUSYBOX_CONFIG_SHA1_SMALL=3
CONFIG_BUSYBOX_CONFIG_SHA1_HWACCEL=y
CONFIG_BUSYBOX_CONFIG_SHA256_HWACCEL=y
CONFIG_BUSYBOX_CONFIG_SHA3_SMALL=1
CONFIG_BUSYBOX_CONFIG_FEATURE_NON_POSIX_CP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_USE_SENDFILE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_COPYBUF_KB=4
CONFIG_BUSYBOX_CONFIG_MONOTONIC_SYSCALL=y
CONFIG_BUSYBOX_CONFIG_IOCTL_HEX2STR_ERROR=y
CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING=y
CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_MAX_LEN=512
# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_VI is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_HISTORY=256
# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_SAVEHISTORY is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_REVERSE_SEARCH is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_TAB_COMPLETION=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_USERNAME_COMPLETION is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_WINCH is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set
# CONFIG_BUSYBOX_CONFIG_LOCALE_SUPPORT is not set
# CONFIG_BUSYBOX_CONFIG_UNICODE_SUPPORT is not set
# CONFIG_BUSYBOX_CONFIG_LOOP_CONFIGURE is not set
# CONFIG_BUSYBOX_CONFIG_NO_LOOP_CONFIGURE is not set
CONFIG_BUSYBOX_CONFIG_TRY_LOOP_CONFIGURE=y
# end of Settings
#
# Applets
#
#
# Archival Utilities
#
# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_XZ is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_LZMA is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_BZ2 is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_GZ=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_Z is not set
# CONFIG_BUSYBOX_CONFIG_AR is not set
# CONFIG_BUSYBOX_CONFIG_UNCOMPRESS is not set
CONFIG_BUSYBOX_CONFIG_GUNZIP=y
CONFIG_BUSYBOX_CONFIG_ZCAT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_GUNZIP_LONG_OPTIONS is not set
# CONFIG_BUSYBOX_CONFIG_BUNZIP2 is not set
# CONFIG_BUSYBOX_CONFIG_BZCAT is not set
# CONFIG_BUSYBOX_CONFIG_UNLZMA is not set
# CONFIG_BUSYBOX_CONFIG_LZCAT is not set
# CONFIG_BUSYBOX_CONFIG_LZMA is not set
# CONFIG_BUSYBOX_CONFIG_UNXZ is not set
# CONFIG_BUSYBOX_CONFIG_XZCAT is not set
# CONFIG_BUSYBOX_CONFIG_XZ is not set
# CONFIG_BUSYBOX_CONFIG_BZIP2 is not set
# CONFIG_BUSYBOX_CONFIG_CPIO is not set
# CONFIG_BUSYBOX_CONFIG_DPKG is not set
# CONFIG_BUSYBOX_CONFIG_DPKG_DEB is not set
CONFIG_BUSYBOX_CONFIG_GZIP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set
CONFIG_BUSYBOX_CONFIG_GZIP_FAST=0
# CONFIG_BUSYBOX_CONFIG_FEATURE_GZIP_LEVELS is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_GZIP_DECOMPRESS=y
# CONFIG_BUSYBOX_CONFIG_LZOP is not set
# CONFIG_BUSYBOX_CONFIG_UNLZOP is not set
# CONFIG_BUSYBOX_CONFIG_LZOPCAT is not set
# CONFIG_BUSYBOX_CONFIG_RPM is not set
# CONFIG_BUSYBOX_CONFIG_RPM2CPIO is not set
CONFIG_BUSYBOX_CONFIG_TAR=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_LONG_OPTIONS is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_CREATE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_AUTODETECT is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_FROM=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_UNAME_GNAME is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set
# CONFIG_BUSYBOX_CONFIG_UNZIP is not set
# end of Archival Utilities
#
# Coreutils
#
# CONFIG_BUSYBOX_CONFIG_FEATURE_VERBOSE is not set
#
# Common options for date and touch
#
#
# Common options for cp and mv
#
CONFIG_BUSYBOX_CONFIG_FEATURE_PRESERVE_HARDLINKS=y
#
# Common options for df, du, ls
#
CONFIG_BUSYBOX_CONFIG_FEATURE_HUMAN_READABLE=y
CONFIG_BUSYBOX_CONFIG_BASENAME=y
CONFIG_BUSYBOX_CONFIG_CAT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_CATN is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_CATV is not set
CONFIG_BUSYBOX_CONFIG_CHGRP=y
CONFIG_BUSYBOX_CONFIG_CHMOD=y
CONFIG_BUSYBOX_CONFIG_CHOWN=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set
CONFIG_BUSYBOX_CONFIG_CHROOT=y
# CONFIG_BUSYBOX_CONFIG_CKSUM is not set
# CONFIG_BUSYBOX_CONFIG_CRC32 is not set
# CONFIG_BUSYBOX_CONFIG_COMM is not set
CONFIG_BUSYBOX_CONFIG_CP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_CP_LONG_OPTIONS is not set
CONFIG_BUSYBOX_CONFIG_CUT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_CUT_REGEX is not set
CONFIG_BUSYBOX_CONFIG_DATE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_ISOFMT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_NANO is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_COMPAT is not set
CONFIG_BUSYBOX_CONFIG_DD=y
CONFIG_BUSYBOX_CONFIG_FEATURE_DD_SIGNAL_HANDLING=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_DD_IBS_OBS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_DD_STATUS is not set
CONFIG_BUSYBOX_CONFIG_DF=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_DF_FANCY is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SKIP_ROOTFS is not set
CONFIG_BUSYBOX_CONFIG_DIRNAME=y
# CONFIG_BUSYBOX_CONFIG_DOS2UNIX is not set
# CONFIG_BUSYBOX_CONFIG_UNIX2DOS is not set
CONFIG_BUSYBOX_CONFIG_DU=y
CONFIG_BUSYBOX_CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
CONFIG_BUSYBOX_CONFIG_ECHO=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_ECHO=y
CONFIG_BUSYBOX_CONFIG_ENV=y
# CONFIG_BUSYBOX_CONFIG_EXPAND is not set
# CONFIG_BUSYBOX_CONFIG_UNEXPAND is not set
CONFIG_BUSYBOX_CONFIG_EXPR=y
CONFIG_BUSYBOX_CONFIG_EXPR_MATH_SUPPORT_64=y
# CONFIG_BUSYBOX_CONFIG_FACTOR is not set
CONFIG_BUSYBOX_CONFIG_FALSE=y
# CONFIG_BUSYBOX_CONFIG_FOLD is not set
CONFIG_BUSYBOX_CONFIG_HEAD=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_HEAD=y
# CONFIG_BUSYBOX_CONFIG_HOSTID is not set
CONFIG_BUSYBOX_CONFIG_ID=y
# CONFIG_BUSYBOX_CONFIG_GROUPS is not set
# CONFIG_BUSYBOX_CONFIG_INSTALL is not set
# CONFIG_BUSYBOX_CONFIG_LINK is not set
CONFIG_BUSYBOX_CONFIG_LN=y
# CONFIG_BUSYBOX_CONFIG_LOGNAME is not set
CONFIG_BUSYBOX_CONFIG_LS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_FILETYPES=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_FOLLOWLINKS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_RECURSIVE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_WIDTH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_SORTFILES=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_TIMESTAMPS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_USERNAME=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_COLOR=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y
CONFIG_BUSYBOX_CONFIG_MD5SUM=y
# CONFIG_BUSYBOX_CONFIG_SHA1SUM is not set
CONFIG_BUSYBOX_CONFIG_SHA256SUM=y
# CONFIG_BUSYBOX_CONFIG_SHA512SUM is not set
# CONFIG_BUSYBOX_CONFIG_SHA3SUM is not set
#
# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum
#
CONFIG_BUSYBOX_CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
CONFIG_BUSYBOX_CONFIG_MKDIR=y
CONFIG_BUSYBOX_CONFIG_MKFIFO=y
CONFIG_BUSYBOX_CONFIG_MKNOD=y
CONFIG_BUSYBOX_CONFIG_MKTEMP=y
CONFIG_BUSYBOX_CONFIG_MV=y
CONFIG_BUSYBOX_CONFIG_NICE=y
# CONFIG_BUSYBOX_CONFIG_NL is not set
# CONFIG_BUSYBOX_CONFIG_NOHUP is not set
# CONFIG_BUSYBOX_CONFIG_NPROC is not set
# CONFIG_BUSYBOX_CONFIG_OD is not set
# CONFIG_BUSYBOX_CONFIG_PASTE is not set
# CONFIG_BUSYBOX_CONFIG_PRINTENV is not set
CONFIG_BUSYBOX_CONFIG_PRINTF=y
CONFIG_BUSYBOX_CONFIG_PWD=y
CONFIG_BUSYBOX_CONFIG_READLINK=y
CONFIG_BUSYBOX_CONFIG_FEATURE_READLINK_FOLLOW=y
# CONFIG_BUSYBOX_CONFIG_REALPATH is not set
CONFIG_BUSYBOX_CONFIG_RM=y
CONFIG_BUSYBOX_CONFIG_RMDIR=y
CONFIG_BUSYBOX_CONFIG_SEQ=y
# CONFIG_BUSYBOX_CONFIG_SHRED is not set
# CONFIG_BUSYBOX_CONFIG_SHUF is not set
CONFIG_BUSYBOX_CONFIG_SLEEP=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_SLEEP=y
CONFIG_BUSYBOX_CONFIG_SORT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SORT_BIG is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set
# CONFIG_BUSYBOX_CONFIG_SPLIT is not set
# CONFIG_BUSYBOX_CONFIG_STAT is not set
# CONFIG_BUSYBOX_CONFIG_STTY is not set
# CONFIG_BUSYBOX_CONFIG_SUM is not set
CONFIG_BUSYBOX_CONFIG_SYNC=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SYNC_FANCY is not set
CONFIG_BUSYBOX_CONFIG_FSYNC=y
# CONFIG_BUSYBOX_CONFIG_TAC is not set
CONFIG_BUSYBOX_CONFIG_TAIL=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_TAIL=y
CONFIG_BUSYBOX_CONFIG_TEE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
CONFIG_BUSYBOX_CONFIG_TEST=y
CONFIG_BUSYBOX_CONFIG_TEST1=y
CONFIG_BUSYBOX_CONFIG_TEST2=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TEST_64=y
# CONFIG_BUSYBOX_CONFIG_TIMEOUT is not set
CONFIG_BUSYBOX_CONFIG_TOUCH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TOUCH_SUSV3=y
CONFIG_BUSYBOX_CONFIG_TR=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TR_CLASSES is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_TR_EQUIV is not set
CONFIG_BUSYBOX_CONFIG_TRUE=y
# CONFIG_BUSYBOX_CONFIG_TRUNCATE is not set
# CONFIG_BUSYBOX_CONFIG_TSORT is not set
# CONFIG_BUSYBOX_CONFIG_TTY is not set
CONFIG_BUSYBOX_CONFIG_UNAME=y
CONFIG_BUSYBOX_CONFIG_UNAME_OSNAME="GNU/Linux"
# CONFIG_BUSYBOX_CONFIG_BB_ARCH is not set
CONFIG_BUSYBOX_CONFIG_UNIQ=y
# CONFIG_BUSYBOX_CONFIG_UNLINK is not set
# CONFIG_BUSYBOX_CONFIG_USLEEP is not set
# CONFIG_BUSYBOX_CONFIG_UUDECODE is not set
# CONFIG_BUSYBOX_CONFIG_BASE32 is not set
# CONFIG_BUSYBOX_CONFIG_BASE64 is not set
# CONFIG_BUSYBOX_CONFIG_UUENCODE is not set
CONFIG_BUSYBOX_CONFIG_WC=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_WC_LARGE is not set
# CONFIG_BUSYBOX_CONFIG_WHOAMI is not set
CONFIG_BUSYBOX_CONFIG_YES=y
# end of Coreutils
#
# Console Utilities
#
# CONFIG_BUSYBOX_CONFIG_CHVT is not set
CONFIG_BUSYBOX_CONFIG_CLEAR=y
# CONFIG_BUSYBOX_CONFIG_DEALLOCVT is not set
# CONFIG_BUSYBOX_CONFIG_DUMPKMAP is not set
# CONFIG_BUSYBOX_CONFIG_FGCONSOLE is not set
# CONFIG_BUSYBOX_CONFIG_KBD_MODE is not set
# CONFIG_BUSYBOX_CONFIG_LOADFONT is not set
# CONFIG_BUSYBOX_CONFIG_SETFONT is not set
# CONFIG_BUSYBOX_CONFIG_LOADKMAP is not set
# CONFIG_BUSYBOX_CONFIG_OPENVT is not set
CONFIG_BUSYBOX_CONFIG_RESET=y
CONFIG_BUSYBOX_CONFIG_RESIZE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_RESIZE_PRINT is not set
# CONFIG_BUSYBOX_CONFIG_SETCONSOLE is not set
# CONFIG_BUSYBOX_CONFIG_SETKEYCODES is not set
# CONFIG_BUSYBOX_CONFIG_SETLOGCONS is not set
# CONFIG_BUSYBOX_CONFIG_SHOWKEY is not set
# end of Console Utilities
#
# Debian Utilities
#
# CONFIG_BUSYBOX_CONFIG_PIPE_PROGRESS is not set
# CONFIG_BUSYBOX_CONFIG_RUN_PARTS is not set
CONFIG_BUSYBOX_CONFIG_START_STOP_DAEMON=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set
CONFIG_BUSYBOX_CONFIG_WHICH=y
# end of Debian Utilities
#
# klibc-utils
#
# CONFIG_BUSYBOX_CONFIG_MINIPS is not set
# CONFIG_BUSYBOX_CONFIG_NUKE is not set
# CONFIG_BUSYBOX_CONFIG_RESUME is not set
# CONFIG_BUSYBOX_CONFIG_RUN_INIT is not set
# end of klibc-utils
#
# Editors
#
CONFIG_BUSYBOX_CONFIG_AWK=y
CONFIG_BUSYBOX_CONFIG_FEATURE_AWK_LIBM=y
CONFIG_BUSYBOX_CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y
CONFIG_BUSYBOX_CONFIG_CMP=y
# CONFIG_BUSYBOX_CONFIG_DIFF is not set
# CONFIG_BUSYBOX_CONFIG_ED is not set
# CONFIG_BUSYBOX_CONFIG_PATCH is not set
CONFIG_BUSYBOX_CONFIG_SED=y
CONFIG_BUSYBOX_CONFIG_VI=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_MAX_LEN=1024
# CONFIG_BUSYBOX_CONFIG_FEATURE_VI_8BIT is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_COLON=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_VI_COLON_EXPAND is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_YANKMARK=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_SEARCH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_USE_SIGNALS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_DOT_CMD=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_READONLY=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_SETOPTS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_SET=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_WIN_RESIZE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_VI_ASK_TERMINAL=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_VI_UNDO is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_VI_VERBOSE_STATUS is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_ALLOW_EXEC=y
# end of Editors
#
# Finding Utilities
#
CONFIG_BUSYBOX_CONFIG_FIND=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PRINT0=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MTIME=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_ATIME is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_CTIME is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MMIN=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_AMIN is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_CMIN is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PERM=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_TYPE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EXECUTABLE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_XDEV=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MAXDEPTH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_NEWER=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_INUM is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_SAMEFILE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EXEC=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EXEC_PLUS is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_USER=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_GROUP=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_NOT=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_DEPTH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PAREN=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_SIZE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PRUNE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_QUIT is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_DELETE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EMPTY is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PATH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_REGEX=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_LINKS is not set
CONFIG_BUSYBOX_CONFIG_GREP=y
CONFIG_BUSYBOX_CONFIG_EGREP=y
CONFIG_BUSYBOX_CONFIG_FGREP=y
CONFIG_BUSYBOX_CONFIG_FEATURE_GREP_CONTEXT=y
CONFIG_BUSYBOX_CONFIG_XARGS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y
CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE is not set
# end of Finding Utilities
#
# Init Utilities
#
# CONFIG_BUSYBOX_CONFIG_BOOTCHARTD is not set
CONFIG_BUSYBOX_CONFIG_HALT=y
CONFIG_BUSYBOX_CONFIG_POWEROFF=y
CONFIG_BUSYBOX_CONFIG_REBOOT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_WAIT_FOR_INIT is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_CALL_TELINIT is not set
# CONFIG_BUSYBOX_CONFIG_INIT is not set
# CONFIG_BUSYBOX_CONFIG_LINUXRC is not set
# end of Init Utilities
#
# Login/Password Management Utilities
#
CONFIG_BUSYBOX_CONFIG_FEATURE_SHADOWPASSWDS=y
# CONFIG_BUSYBOX_CONFIG_USE_BB_PWD_GRP is not set
# CONFIG_BUSYBOX_CONFIG_USE_BB_CRYPT is not set
# CONFIG_BUSYBOX_CONFIG_ADD_SHELL is not set
# CONFIG_BUSYBOX_CONFIG_REMOVE_SHELL is not set
# CONFIG_BUSYBOX_CONFIG_ADDGROUP is not set
# CONFIG_BUSYBOX_CONFIG_ADDUSER is not set
# CONFIG_BUSYBOX_CONFIG_CHPASSWD is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5"
# CONFIG_BUSYBOX_CONFIG_CRYPTPW is not set
# CONFIG_BUSYBOX_CONFIG_MKPASSWD is not set
# CONFIG_BUSYBOX_CONFIG_DELUSER is not set
# CONFIG_BUSYBOX_CONFIG_DELGROUP is not set
# CONFIG_BUSYBOX_CONFIG_GETTY is not set
CONFIG_BUSYBOX_CONFIG_LOGIN=y
# CONFIG_BUSYBOX_CONFIG_LOGIN_SESSION_AS_CHILD is not set
# CONFIG_BUSYBOX_CONFIG_LOGIN_SCRIPTS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_NOLOGIN is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SECURETTY is not set
CONFIG_BUSYBOX_CONFIG_PASSWD=y
CONFIG_BUSYBOX_CONFIG_FEATURE_PASSWD_WEAK_CHECK=y
# CONFIG_BUSYBOX_CONFIG_SU is not set
# CONFIG_BUSYBOX_CONFIG_SULOGIN is not set
# CONFIG_BUSYBOX_CONFIG_VLOCK is not set
# end of Login/Password Management Utilities
#
# Linux Ext2 FS Progs
#
# CONFIG_BUSYBOX_CONFIG_CHATTR is not set
# CONFIG_BUSYBOX_CONFIG_FSCK is not set
# CONFIG_BUSYBOX_CONFIG_LSATTR is not set
# CONFIG_BUSYBOX_CONFIG_TUNE2FS is not set
# end of Linux Ext2 FS Progs
#
# Linux Module Utilities
#
# CONFIG_BUSYBOX_CONFIG_MODPROBE_SMALL is not set
# CONFIG_BUSYBOX_CONFIG_DEPMOD is not set
# CONFIG_BUSYBOX_CONFIG_INSMOD is not set
# CONFIG_BUSYBOX_CONFIG_LSMOD is not set
# CONFIG_BUSYBOX_CONFIG_MODINFO is not set
# CONFIG_BUSYBOX_CONFIG_MODPROBE is not set
# CONFIG_BUSYBOX_CONFIG_RMMOD is not set
#
# Options common to multiple modutils
#
# end of Linux Module Utilities
#
# Linux System Utilities
#
# CONFIG_BUSYBOX_CONFIG_ACPID is not set
# CONFIG_BUSYBOX_CONFIG_BLKDISCARD is not set
# CONFIG_BUSYBOX_CONFIG_BLKID is not set
# CONFIG_BUSYBOX_CONFIG_BLOCKDEV is not set
# CONFIG_BUSYBOX_CONFIG_CAL is not set
# CONFIG_BUSYBOX_CONFIG_CHRT is not set
CONFIG_BUSYBOX_CONFIG_DMESG=y
CONFIG_BUSYBOX_CONFIG_FEATURE_DMESG_PRETTY=y
# CONFIG_BUSYBOX_CONFIG_EJECT is not set
# CONFIG_BUSYBOX_CONFIG_FALLOCATE is not set
# CONFIG_BUSYBOX_CONFIG_FATATTR is not set
# CONFIG_BUSYBOX_CONFIG_FBSET is not set
# CONFIG_BUSYBOX_CONFIG_FDFORMAT is not set
# CONFIG_BUSYBOX_CONFIG_FDISK is not set
# CONFIG_BUSYBOX_CONFIG_FINDFS is not set
CONFIG_BUSYBOX_CONFIG_FLOCK=y
# CONFIG_BUSYBOX_CONFIG_FDFLUSH is not set
# CONFIG_BUSYBOX_CONFIG_FREERAMDISK is not set
# CONFIG_BUSYBOX_CONFIG_FSCK_MINIX is not set
# CONFIG_BUSYBOX_CONFIG_FSFREEZE is not set
# CONFIG_BUSYBOX_CONFIG_FSTRIM is not set
# CONFIG_BUSYBOX_CONFIG_GETOPT is not set
CONFIG_BUSYBOX_CONFIG_HEXDUMP=y
# CONFIG_BUSYBOX_CONFIG_HD is not set
# CONFIG_BUSYBOX_CONFIG_XXD is not set
CONFIG_BUSYBOX_CONFIG_HWCLOCK=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set
# CONFIG_BUSYBOX_CONFIG_IONICE is not set
# CONFIG_BUSYBOX_CONFIG_IPCRM is not set
# CONFIG_BUSYBOX_CONFIG_IPCS is not set
# CONFIG_BUSYBOX_CONFIG_LOSETUP is not set
# CONFIG_BUSYBOX_CONFIG_LSPCI is not set
# CONFIG_BUSYBOX_CONFIG_LSUSB is not set
# CONFIG_BUSYBOX_CONFIG_MDEV is not set
# CONFIG_BUSYBOX_CONFIG_MESG is not set
# CONFIG_BUSYBOX_CONFIG_MKE2FS is not set
# CONFIG_BUSYBOX_CONFIG_MKFS_EXT2 is not set
# CONFIG_BUSYBOX_CONFIG_MKFS_MINIX is not set
# CONFIG_BUSYBOX_CONFIG_MKFS_REISER is not set
# CONFIG_BUSYBOX_CONFIG_MKDOSFS is not set
# CONFIG_BUSYBOX_CONFIG_MKFS_VFAT is not set
CONFIG_BUSYBOX_CONFIG_MKSWAP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_MKSWAP_UUID is not set
# CONFIG_BUSYBOX_CONFIG_MORE is not set
CONFIG_BUSYBOX_CONFIG_MOUNT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_FAKE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_VERBOSE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_HELPERS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_LABEL is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_NFS is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_CIFS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_FLAGS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_FSTAB=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_OTHERTAB is not set
# CONFIG_BUSYBOX_CONFIG_MOUNTPOINT is not set
# CONFIG_BUSYBOX_CONFIG_NSENTER is not set
CONFIG_BUSYBOX_CONFIG_PIVOT_ROOT=y
# CONFIG_BUSYBOX_CONFIG_RDATE is not set
# CONFIG_BUSYBOX_CONFIG_RDEV is not set
# CONFIG_BUSYBOX_CONFIG_READPROFILE is not set
# CONFIG_BUSYBOX_CONFIG_RENICE is not set
# CONFIG_BUSYBOX_CONFIG_REV is not set
# CONFIG_BUSYBOX_CONFIG_RTCWAKE is not set
# CONFIG_BUSYBOX_CONFIG_SCRIPT is not set
# CONFIG_BUSYBOX_CONFIG_SCRIPTREPLAY is not set
# CONFIG_BUSYBOX_CONFIG_SETARCH is not set
# CONFIG_BUSYBOX_CONFIG_LINUX32 is not set
# CONFIG_BUSYBOX_CONFIG_LINUX64 is not set
# CONFIG_BUSYBOX_CONFIG_SETPRIV is not set
# CONFIG_BUSYBOX_CONFIG_SETSID is not set
CONFIG_BUSYBOX_CONFIG_SWAPON=y
CONFIG_BUSYBOX_CONFIG_FEATURE_SWAPON_DISCARD=y
CONFIG_BUSYBOX_CONFIG_FEATURE_SWAPON_PRI=y
CONFIG_BUSYBOX_CONFIG_SWAPOFF=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SWAPONOFF_LABEL is not set
CONFIG_BUSYBOX_CONFIG_SWITCH_ROOT=y
CONFIG_BUSYBOX_CONFIG_TASKSET=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TASKSET_FANCY=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TASKSET_CPULIST=y
# CONFIG_BUSYBOX_CONFIG_UEVENT is not set
CONFIG_BUSYBOX_CONFIG_UMOUNT=y
CONFIG_BUSYBOX_CONFIG_FEATURE_UMOUNT_ALL=y
# CONFIG_BUSYBOX_CONFIG_UNSHARE is not set
#
# Common options for mount/umount
#
CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_LOOP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_MTAB_SUPPORT is not set
# CONFIG_BUSYBOX_CONFIG_VOLUMEID is not set
# end of Linux System Utilities
#
# Miscellaneous Utilities
#
# CONFIG_BUSYBOX_CONFIG_ADJTIMEX is not set
# CONFIG_BUSYBOX_CONFIG_ASCII is not set
# CONFIG_BUSYBOX_CONFIG_BBCONFIG is not set
# CONFIG_BUSYBOX_CONFIG_BC is not set
# CONFIG_BUSYBOX_CONFIG_DC is not set
# CONFIG_BUSYBOX_CONFIG_BEEP is not set
# CONFIG_BUSYBOX_CONFIG_CHAT is not set
# CONFIG_BUSYBOX_CONFIG_CONSPY is not set
CONFIG_BUSYBOX_CONFIG_CROND=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_D is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_SPECIAL_TIMES is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_DIR="/etc"
CONFIG_BUSYBOX_CONFIG_CRONTAB=y
# CONFIG_BUSYBOX_CONFIG_DEVFSD is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_DEVFS is not set
# CONFIG_BUSYBOX_CONFIG_DEVMEM is not set
# CONFIG_BUSYBOX_CONFIG_FBSPLASH is not set
# CONFIG_BUSYBOX_CONFIG_FLASH_ERASEALL is not set
# CONFIG_BUSYBOX_CONFIG_FLASH_LOCK is not set
# CONFIG_BUSYBOX_CONFIG_FLASH_UNLOCK is not set
# CONFIG_BUSYBOX_CONFIG_FLASHCP is not set
# CONFIG_BUSYBOX_CONFIG_HDPARM is not set
# CONFIG_BUSYBOX_CONFIG_HEXEDIT is not set
# CONFIG_BUSYBOX_CONFIG_I2CGET is not set
# CONFIG_BUSYBOX_CONFIG_I2CSET is not set
# CONFIG_BUSYBOX_CONFIG_I2CDUMP is not set
# CONFIG_BUSYBOX_CONFIG_I2CDETECT is not set
# CONFIG_BUSYBOX_CONFIG_I2CTRANSFER is not set
# CONFIG_BUSYBOX_CONFIG_INOTIFYD is not set
CONFIG_BUSYBOX_CONFIG_LESS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_MAXLINES=9999999
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_BRACKETS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_FLAGS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_TRUNCATE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_MARKS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_REGEXP is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_WINCH is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_DASHCMD is not set
CONFIG_BUSYBOX_CONFIG_LOCK=y
# CONFIG_BUSYBOX_CONFIG_LSSCSI is not set
# CONFIG_BUSYBOX_CONFIG_MAKEDEVS is not set
# CONFIG_BUSYBOX_CONFIG_MAN is not set
# CONFIG_BUSYBOX_CONFIG_MICROCOM is not set
# CONFIG_BUSYBOX_CONFIG_MT is not set
# CONFIG_BUSYBOX_CONFIG_NANDWRITE is not set
# CONFIG_BUSYBOX_CONFIG_NANDDUMP is not set
# CONFIG_BUSYBOX_CONFIG_PARTPROBE is not set
# CONFIG_BUSYBOX_CONFIG_RAIDAUTORUN is not set
# CONFIG_BUSYBOX_CONFIG_READAHEAD is not set
# CONFIG_BUSYBOX_CONFIG_RFKILL is not set
# CONFIG_BUSYBOX_CONFIG_RX is not set
# CONFIG_BUSYBOX_CONFIG_SEEDRNG is not set
# CONFIG_BUSYBOX_CONFIG_SETFATTR is not set
# CONFIG_BUSYBOX_CONFIG_SETSERIAL is not set
CONFIG_BUSYBOX_CONFIG_STRINGS=y
CONFIG_BUSYBOX_CONFIG_TIME=y
# CONFIG_BUSYBOX_CONFIG_TREE is not set
# CONFIG_BUSYBOX_CONFIG_TS is not set
# CONFIG_BUSYBOX_CONFIG_TTYSIZE is not set
# CONFIG_BUSYBOX_CONFIG_UBIATTACH is not set
# CONFIG_BUSYBOX_CONFIG_UBIDETACH is not set
# CONFIG_BUSYBOX_CONFIG_UBIMKVOL is not set
# CONFIG_BUSYBOX_CONFIG_UBIRMVOL is not set
# CONFIG_BUSYBOX_CONFIG_UBIRSVOL is not set
# CONFIG_BUSYBOX_CONFIG_UBIUPDATEVOL is not set
# CONFIG_BUSYBOX_CONFIG_UBIRENAME is not set
# CONFIG_BUSYBOX_CONFIG_VOLNAME is not set
# CONFIG_BUSYBOX_CONFIG_WATCHDOG is not set
# end of Miscellaneous Utilities
#
# Networking Utilities
#
CONFIG_BUSYBOX_CONFIG_FEATURE_IPV6=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_UNIX_LOCAL is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set
CONFIG_BUSYBOX_CONFIG_VERBOSE_RESOLUTION_ERRORS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_ETC_NETWORKS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_ETC_SERVICES is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_HWIB is not set
# CONFIG_BUSYBOX_CONFIG_ARP is not set
# CONFIG_BUSYBOX_CONFIG_ARPING is not set
CONFIG_BUSYBOX_CONFIG_BRCTL=y
CONFIG_BUSYBOX_CONFIG_FEATURE_BRCTL_FANCY=y
CONFIG_BUSYBOX_CONFIG_FEATURE_BRCTL_SHOW=y
# CONFIG_BUSYBOX_CONFIG_DNSD is not set
# CONFIG_BUSYBOX_CONFIG_ETHER_WAKE is not set
# CONFIG_BUSYBOX_CONFIG_FTPD is not set
# CONFIG_BUSYBOX_CONFIG_FTPGET is not set
# CONFIG_BUSYBOX_CONFIG_FTPPUT is not set
# CONFIG_BUSYBOX_CONFIG_HOSTNAME is not set
# CONFIG_BUSYBOX_CONFIG_DNSDOMAINNAME is not set
# CONFIG_BUSYBOX_CONFIG_HTTPD is not set
CONFIG_BUSYBOX_CONFIG_IFCONFIG=y
CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_STATUS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_SLIP is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_HW=y
CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y
# CONFIG_BUSYBOX_CONFIG_IFENSLAVE is not set
# CONFIG_BUSYBOX_CONFIG_IFPLUGD is not set
# CONFIG_BUSYBOX_CONFIG_IFUP is not set
# CONFIG_BUSYBOX_CONFIG_IFDOWN is not set
# CONFIG_BUSYBOX_CONFIG_INETD is not set
CONFIG_BUSYBOX_CONFIG_IP=y
# CONFIG_BUSYBOX_CONFIG_IPADDR is not set
# CONFIG_BUSYBOX_CONFIG_IPLINK is not set
# CONFIG_BUSYBOX_CONFIG_IPROUTE is not set
# CONFIG_BUSYBOX_CONFIG_IPTUNNEL is not set
# CONFIG_BUSYBOX_CONFIG_IPRULE is not set
# CONFIG_BUSYBOX_CONFIG_IPNEIGH is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ADDRESS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_IP_LINK=y
CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ROUTE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2"
# CONFIG_BUSYBOX_CONFIG_FEATURE_IP_TUNNEL is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_IP_RULE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_IP_NEIGH=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set
# CONFIG_BUSYBOX_CONFIG_IPCALC is not set
# CONFIG_BUSYBOX_CONFIG_FAKEIDENTD is not set
# CONFIG_BUSYBOX_CONFIG_NAMEIF is not set
# CONFIG_BUSYBOX_CONFIG_NBDCLIENT is not set
CONFIG_BUSYBOX_CONFIG_NC=y
# CONFIG_BUSYBOX_CONFIG_NETCAT is not set
# CONFIG_BUSYBOX_CONFIG_NC_SERVER is not set
# CONFIG_BUSYBOX_CONFIG_NC_EXTRA is not set
# CONFIG_BUSYBOX_CONFIG_NC_110_COMPAT is not set
CONFIG_BUSYBOX_CONFIG_NETMSG=y
CONFIG_BUSYBOX_CONFIG_NETSTAT=y
CONFIG_BUSYBOX_CONFIG_FEATURE_NETSTAT_WIDE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_NETSTAT_PRG=y
CONFIG_BUSYBOX_CONFIG_NSLOOKUP=y
CONFIG_BUSYBOX_CONFIG_FEATURE_NSLOOKUP_BIG=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS is not set
CONFIG_BUSYBOX_CONFIG_NTPD=y
CONFIG_BUSYBOX_CONFIG_FEATURE_NTPD_SERVER=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_NTPD_CONF is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_NTP_AUTH is not set
CONFIG_BUSYBOX_CONFIG_PING=y
CONFIG_BUSYBOX_CONFIG_PING6=y
CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_PING=y
# CONFIG_BUSYBOX_CONFIG_PSCAN is not set
CONFIG_BUSYBOX_CONFIG_ROUTE=y
# CONFIG_BUSYBOX_CONFIG_SLATTACH is not set
# CONFIG_BUSYBOX_CONFIG_SSL_CLIENT is not set
# CONFIG_BUSYBOX_CONFIG_TC is not set
# CONFIG_BUSYBOX_CONFIG_TCPSVD is not set
# CONFIG_BUSYBOX_CONFIG_UDPSVD is not set
# CONFIG_BUSYBOX_CONFIG_TELNET is not set
# CONFIG_BUSYBOX_CONFIG_TELNETD is not set
CONFIG_BUSYBOX_CONFIG_TFTP=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_PROGRESS_BAR=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_HPA_COMPAT is not set
# CONFIG_BUSYBOX_CONFIG_TFTPD is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_GET=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_PUT=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TFTP_BLOCKSIZE is not set
# CONFIG_BUSYBOX_CONFIG_TFTP_DEBUG is not set
# CONFIG_BUSYBOX_CONFIG_TLS is not set
CONFIG_BUSYBOX_CONFIG_TRACEROUTE=y
CONFIG_BUSYBOX_CONFIG_TRACEROUTE6=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TRACEROUTE_VERBOSE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set
# CONFIG_BUSYBOX_CONFIG_TUNCTL is not set
# CONFIG_BUSYBOX_CONFIG_VCONFIG is not set
# CONFIG_BUSYBOX_CONFIG_WGET is not set
# CONFIG_BUSYBOX_CONFIG_WHOIS is not set
# CONFIG_BUSYBOX_CONFIG_ZCIP is not set
# CONFIG_BUSYBOX_CONFIG_UDHCPD is not set
# CONFIG_BUSYBOX_CONFIG_DUMPLEASES is not set
# CONFIG_BUSYBOX_CONFIG_DHCPRELAY is not set
CONFIG_BUSYBOX_CONFIG_UDHCPC=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCPC_ARPING is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set
CONFIG_BUSYBOX_CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
# CONFIG_BUSYBOX_CONFIG_UDHCPC6 is not set
#
# Common options for DHCP applets
#
CONFIG_BUSYBOX_CONFIG_UDHCPC_DEFAULT_INTERFACE=""
# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCP_PORT is not set
CONFIG_BUSYBOX_CONFIG_UDHCP_DEBUG=0
CONFIG_BUSYBOX_CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCP_RFC3397=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCP_8021Q is not set
# end of Networking Utilities
#
# Print Utilities
#
# CONFIG_BUSYBOX_CONFIG_LPD is not set
# CONFIG_BUSYBOX_CONFIG_LPR is not set
# CONFIG_BUSYBOX_CONFIG_LPQ is not set
# end of Print Utilities
#
# Mail Utilities
#
# CONFIG_BUSYBOX_CONFIG_MAKEMIME is not set
# CONFIG_BUSYBOX_CONFIG_POPMAILDIR is not set
# CONFIG_BUSYBOX_CONFIG_REFORMIME is not set
# CONFIG_BUSYBOX_CONFIG_SENDMAIL is not set
# end of Mail Utilities
#
# Process Utilities
#
CONFIG_BUSYBOX_CONFIG_FEATURE_FAST_TOP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SHOW_THREADS is not set
CONFIG_BUSYBOX_CONFIG_FREE=y
# CONFIG_BUSYBOX_CONFIG_FUSER is not set
# CONFIG_BUSYBOX_CONFIG_IOSTAT is not set
CONFIG_BUSYBOX_CONFIG_KILL=y
CONFIG_BUSYBOX_CONFIG_KILLALL=y
# CONFIG_BUSYBOX_CONFIG_KILLALL5 is not set
# CONFIG_BUSYBOX_CONFIG_LSOF is not set
# CONFIG_BUSYBOX_CONFIG_MPSTAT is not set
# CONFIG_BUSYBOX_CONFIG_NMETER is not set
CONFIG_BUSYBOX_CONFIG_PGREP=y
# CONFIG_BUSYBOX_CONFIG_PKILL is not set
CONFIG_BUSYBOX_CONFIG_PIDOF=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_PIDOF_SINGLE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_PIDOF_OMIT is not set
# CONFIG_BUSYBOX_CONFIG_PMAP is not set
# CONFIG_BUSYBOX_CONFIG_POWERTOP is not set
CONFIG_BUSYBOX_CONFIG_PS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_PS_WIDE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_PS_LONG is not set
# CONFIG_BUSYBOX_CONFIG_PSTREE is not set
# CONFIG_BUSYBOX_CONFIG_PWDX is not set
# CONFIG_BUSYBOX_CONFIG_SMEMCAP is not set
CONFIG_BUSYBOX_CONFIG_BB_SYSCTL=y
CONFIG_BUSYBOX_CONFIG_TOP=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_INTERACTIVE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_SMP_CPU is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_DECIMALS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_SMP_PROCESS is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_TOPMEM is not set
CONFIG_BUSYBOX_CONFIG_UPTIME=y
# CONFIG_BUSYBOX_CONFIG_WATCH is not set
# end of Process Utilities
#
# Runit Utilities
#
# CONFIG_BUSYBOX_CONFIG_CHPST is not set
# CONFIG_BUSYBOX_CONFIG_SETUIDGID is not set
# CONFIG_BUSYBOX_CONFIG_ENVUIDGID is not set
# CONFIG_BUSYBOX_CONFIG_ENVDIR is not set
# CONFIG_BUSYBOX_CONFIG_SOFTLIMIT is not set
# CONFIG_BUSYBOX_CONFIG_RUNSV is not set
# CONFIG_BUSYBOX_CONFIG_RUNSVDIR is not set
# CONFIG_BUSYBOX_CONFIG_SV is not set
# CONFIG_BUSYBOX_CONFIG_SVC is not set
# CONFIG_BUSYBOX_CONFIG_SVOK is not set
# CONFIG_BUSYBOX_CONFIG_SVLOGD is not set
# end of Runit Utilities
#
# Shells
#
CONFIG_BUSYBOX_CONFIG_SH_IS_ASH=y
# CONFIG_BUSYBOX_CONFIG_SH_IS_HUSH is not set
# CONFIG_BUSYBOX_CONFIG_SH_IS_NONE is not set
# CONFIG_BUSYBOX_CONFIG_BASH_IS_ASH is not set
# CONFIG_BUSYBOX_CONFIG_BASH_IS_HUSH is not set
CONFIG_BUSYBOX_CONFIG_BASH_IS_NONE=y
CONFIG_BUSYBOX_CONFIG_SHELL_ASH=y
CONFIG_BUSYBOX_CONFIG_ASH=y
# CONFIG_BUSYBOX_CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set
CONFIG_BUSYBOX_CONFIG_ASH_INTERNAL_GLOB=y
CONFIG_BUSYBOX_CONFIG_ASH_BASH_COMPAT=y
# CONFIG_BUSYBOX_CONFIG_ASH_BASH_SOURCE_CURDIR is not set
# CONFIG_BUSYBOX_CONFIG_ASH_BASH_NOT_FOUND_HOOK is not set
CONFIG_BUSYBOX_CONFIG_ASH_JOB_CONTROL=y
CONFIG_BUSYBOX_CONFIG_ASH_ALIAS=y
CONFIG_BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT=y
CONFIG_BUSYBOX_CONFIG_ASH_EXPAND_PRMT=y
# CONFIG_BUSYBOX_CONFIG_ASH_IDLE_TIMEOUT is not set
# CONFIG_BUSYBOX_CONFIG_ASH_MAIL is not set
CONFIG_BUSYBOX_CONFIG_ASH_ECHO=y
CONFIG_BUSYBOX_CONFIG_ASH_PRINTF=y
CONFIG_BUSYBOX_CONFIG_ASH_TEST=y
# CONFIG_BUSYBOX_CONFIG_ASH_SLEEP is not set
# CONFIG_BUSYBOX_CONFIG_ASH_HELP is not set
CONFIG_BUSYBOX_CONFIG_ASH_GETOPTS=y
CONFIG_BUSYBOX_CONFIG_ASH_CMDCMD=y
# CONFIG_BUSYBOX_CONFIG_CTTYHACK is not set
# CONFIG_BUSYBOX_CONFIG_HUSH is not set
# CONFIG_BUSYBOX_CONFIG_SHELL_HUSH is not set
#
# Options common to all shells
#
CONFIG_BUSYBOX_CONFIG_FEATURE_SH_MATH=y
CONFIG_BUSYBOX_CONFIG_FEATURE_SH_MATH_64=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_MATH_BASE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_EXTRA_QUIET is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_STANDALONE is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_SH_NOFORK=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_READ_FRAC is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_HISTFILESIZE is not set
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS is not set
# end of Shells
#
# System Logging Utilities
#
# CONFIG_BUSYBOX_CONFIG_KLOGD is not set
CONFIG_BUSYBOX_CONFIG_LOGGER=y
# CONFIG_BUSYBOX_CONFIG_LOGREAD is not set
# CONFIG_BUSYBOX_CONFIG_SYSLOGD is not set
# end of System Logging Utilities

16
profiles/sonicfi_rap750e-h.yml Executable file
View File

@@ -0,0 +1,16 @@
---
profile: sonicfi_rap750e_h
target: ipq53xx
subtarget: generic
description: Build image for the SONICFI RAP750E-H
image: bin/targets/ipq53xx/generic/openwrt-ipq53xx-sonicfi_rap750e_h-squashfs-sysupgrade.tar
feeds:
- name: qca
path: ../../feeds/qca-wifi-7
include:
- ucentral-ap
packages:
- ipq53xx
- qca-ssdk-shell
diffconfig: |
CONFIG_KERNEL_IPQ_MEM_PROFILE=512