/* It is the caller's responsibility to free the pointer returned here */ staticstruct iwl_mcc_update_resp_v8 *
iwl_mld_copy_mcc_resp(conststruct iwl_rx_packet *pkt)
{ conststruct iwl_mcc_update_resp_v8 *mcc_resp_v8 = (constvoid *)pkt->data; int n_channels = __le32_to_cpu(mcc_resp_v8->n_channels); struct iwl_mcc_update_resp_v8 *resp_cp; int notif_len = struct_size(resp_cp, channels, n_channels);
if (iwl_rx_packet_payload_len(pkt) != notif_len) return ERR_PTR(-EINVAL);
resp_cp = kmemdup(mcc_resp_v8, notif_len, GFP_KERNEL); if (!resp_cp) return ERR_PTR(-ENOMEM);
return resp_cp;
}
/* It is the caller's responsibility to free the pointer returned here */ staticstruct iwl_mcc_update_resp_v8 *
iwl_mld_update_mcc(struct iwl_mld *mld, constchar *alpha2, enum iwl_mcc_source src_id)
{ struct iwl_mcc_update_cmd mcc_update_cmd = {
.mcc = cpu_to_le16(alpha2[0] << 8 | alpha2[1]),
.source_id = (u8)src_id,
}; struct iwl_mcc_update_resp_v8 *resp_cp; struct iwl_rx_packet *pkt; struct iwl_host_cmd cmd = {
.id = MCC_UPDATE_CMD,
.flags = CMD_WANT_SKB,
.data = { &mcc_update_cmd },
.len[0] = sizeof(mcc_update_cmd),
}; int ret;
u16 mcc;
IWL_DEBUG_LAR(mld, "send MCC update to FW with '%c%c' src = %d\n",
alpha2[0], alpha2[1], src_id);
ret = iwl_mld_send_cmd(mld, &cmd); if (ret) return ERR_PTR(ret);
pkt = cmd.resp_pkt;
resp_cp = iwl_mld_copy_mcc_resp(pkt); if (IS_ERR(resp_cp)) gotoexit;
mcc = le16_to_cpu(resp_cp->mcc);
IWL_FW_CHECK(mld, !mcc, "mcc can't be 0: %d\n", mcc);
if (IS_ERR(regd)) {
IWL_DEBUG_LAR(mld, "Could not get parse update from FW %ld\n",
PTR_ERR(regd)); goto out;
}
IWL_DEBUG_LAR(mld, "setting alpha2 from FW to %s (0x%x, 0x%x) src=%d\n",
regd->alpha2, regd->alpha2[0],
regd->alpha2[1], resp->source_id);
mld->mcc_src = resp->source_id;
/* FM is the earliest supported and later always do puncturing */ if (CSR_HW_RFID_TYPE(mld->trans->info.hw_rf_id) == IWL_CFG_RF_TYPE_FM) { if (!iwl_puncturing_is_allowed_in_bios(mld->bios_enable_puncturing,
le16_to_cpu(resp->mcc)))
ieee80211_hw_set(mld->hw, DISALLOW_PUNCTURING); else
__clear_bit(IEEE80211_HW_DISALLOW_PUNCTURING,
mld->hw->flags);
}
out:
kfree(resp); return regd;
}
/* It is the caller's responsibility to free the pointer returned here */ staticstruct ieee80211_regdomain *
iwl_mld_get_current_regdomain(struct iwl_mld *mld, bool *changed)
{ return iwl_mld_get_regdomain(mld, "ZZ",
MCC_SOURCE_GET_CURRENT, changed);
}
if (changed)
regulatory_set_wiphy_regd(mld->hw->wiphy, regd);
kfree(regd);
}
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.2Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.