diff --git a/sys/dev/iwm/if_iwm.c b/sys/dev/iwm/if_iwm.c index a6dba2365d28..d01f7bab7834 100644 --- a/sys/dev/iwm/if_iwm.c +++ b/sys/dev/iwm/if_iwm.c @@ -316,7 +316,6 @@ static int iwm_mvm_load_ucode_wait_alive(struct iwm_softc *, enum iwm_ucode_type); static int iwm_run_init_mvm_ucode(struct iwm_softc *, int); static int iwm_rx_addbuf(struct iwm_softc *, int, int); -static int iwm_mvm_calc_rssi(struct iwm_softc *, struct iwm_rx_phy_info *); static int iwm_mvm_get_signal_strength(struct iwm_softc *, struct iwm_rx_phy_info *); static void iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *, @@ -345,7 +344,7 @@ static int iwm_raw_xmit(struct ieee80211_node *, struct mbuf *, static int iwm_mvm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk, uint32_t flags); static int iwm_mvm_send_add_sta_cmd_status(struct iwm_softc *, - struct iwm_mvm_add_sta_cmd_v7 *, + struct iwm_mvm_add_sta_cmd *, int *); static int iwm_mvm_sta_send_to_fw(struct iwm_softc *, struct iwm_node *, int); @@ -867,12 +866,6 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) "section type %d\n", error, tlv_type); } - if (!(sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)) { - device_printf(sc->sc_dev, - "device uses unsupported power ops\n"); - error = ENOTSUP; - } - out: if (error) { fw->fw_status = IWM_FW_STATUS_NONE; @@ -3042,38 +3035,6 @@ iwm_rx_addbuf(struct iwm_softc *sc, int size, int idx) return error; } -/* iwlwifi: mvm/rx.c */ -#define IWM_RSSI_OFFSET 50 -static int -iwm_mvm_calc_rssi(struct iwm_softc *sc, struct iwm_rx_phy_info *phy_info) -{ - int rssi_a, rssi_b, rssi_a_dbm, rssi_b_dbm, max_rssi_dbm; - uint32_t agc_a, agc_b; - uint32_t val; - - val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_AGC_IDX]); - agc_a = (val & IWM_OFDM_AGC_A_MSK) >> IWM_OFDM_AGC_A_POS; - agc_b = (val & IWM_OFDM_AGC_B_MSK) >> IWM_OFDM_AGC_B_POS; - - val = le32toh(phy_info->non_cfg_phy[IWM_RX_INFO_RSSI_AB_IDX]); - rssi_a = (val & IWM_OFDM_RSSI_INBAND_A_MSK) >> IWM_OFDM_RSSI_A_POS; - rssi_b = (val & IWM_OFDM_RSSI_INBAND_B_MSK) >> IWM_OFDM_RSSI_B_POS; - - /* - * dBm = rssi dB - agc dB - constant. - * Higher AGC (higher radio gain) means lower signal. - */ - rssi_a_dbm = rssi_a - IWM_RSSI_OFFSET - agc_a; - rssi_b_dbm = rssi_b - IWM_RSSI_OFFSET - agc_b; - max_rssi_dbm = MAX(rssi_a_dbm, rssi_b_dbm); - - IWM_DPRINTF(sc, IWM_DEBUG_RECV, - "Rssi In A %d B %d Max %d AGCA %d AGCB %d\n", - rssi_a_dbm, rssi_b_dbm, max_rssi_dbm, agc_a, agc_b); - - return max_rssi_dbm; -} - /* iwlwifi: mvm/rx.c */ /* * iwm_mvm_get_signal_strength - use new rx PHY INFO API @@ -3193,17 +3154,7 @@ iwm_mvm_rx_rx_mpdu(struct iwm_softc *sc, struct mbuf *m) goto fail; } - if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_RX_ENERGY_API) { - rssi = iwm_mvm_get_signal_strength(sc, phy_info); - } else { - rssi = iwm_mvm_calc_rssi(sc, phy_info); - } - - /* Note: RSSI is absolute (ie a -ve value) */ - if (rssi < IWM_MIN_DBM) - rssi = IWM_MIN_DBM; - else if (rssi > IWM_MAX_DBM) - rssi = IWM_MAX_DBM; + rssi = iwm_mvm_get_signal_strength(sc, phy_info); /* Map it to relative value */ rssi = rssi - sc->sc_noise; @@ -3882,7 +3833,7 @@ iwm_mvm_flush_tx_path(struct iwm_softc *sc, uint32_t tfd_msk, uint32_t flags) static int iwm_mvm_send_add_sta_cmd_status(struct iwm_softc *sc, - struct iwm_mvm_add_sta_cmd_v7 *cmd, int *status) + struct iwm_mvm_add_sta_cmd *cmd, int *status) { return iwm_mvm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(*cmd), cmd, status); @@ -3892,7 +3843,7 @@ iwm_mvm_send_add_sta_cmd_status(struct iwm_softc *sc, static int iwm_mvm_sta_send_to_fw(struct iwm_softc *sc, struct iwm_node *in, int update) { - struct iwm_mvm_add_sta_cmd_v7 add_sta_cmd; + struct iwm_mvm_add_sta_cmd add_sta_cmd; int ret; uint32_t status; @@ -3950,7 +3901,7 @@ static int iwm_mvm_add_int_sta_common(struct iwm_softc *sc, struct iwm_int_sta *sta, const uint8_t *addr, uint16_t mac_id, uint16_t color) { - struct iwm_mvm_add_sta_cmd_v7 cmd; + struct iwm_mvm_add_sta_cmd cmd; int ret; uint32_t status; diff --git a/sys/dev/iwm/if_iwm_power.c b/sys/dev/iwm/if_iwm_power.c index aca51f89471b..b99d49ed5096 100644 --- a/sys/dev/iwm/if_iwm_power.c +++ b/sys/dev/iwm/if_iwm_power.c @@ -290,9 +290,6 @@ iwm_mvm_power_update_device(struct iwm_softc *sc) .flags = htole16(IWM_DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK), }; - if (!(sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_DEVICE_PS_CMD)) - return 0; - cmd.flags |= htole16(IWM_DEVICE_POWER_FLAGS_CAM_MSK); IWM_DPRINTF(sc, IWM_DEBUG_PWRSAVE | IWM_DEBUG_CMD, "Sending device power command with flags = 0x%X\n", cmd.flags); @@ -322,13 +319,9 @@ iwm_mvm_enable_beacon_filter(struct iwm_softc *sc, struct iwm_node *in) int iwm_mvm_disable_beacon_filter(struct iwm_softc *sc) { - struct iwm_beacon_filter_cmd cmd; + struct iwm_beacon_filter_cmd cmd = {}; int ret; - memset(&cmd, 0, sizeof(cmd)); - if ((sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_BF_UPDATED) == 0) - return 0; - ret = iwm_mvm_beacon_filter_send_cmd(sc, &cmd); if (ret == 0) sc->sc_bf.bf_enabled = 0; diff --git a/sys/dev/iwm/if_iwm_time_event.c b/sys/dev/iwm/if_iwm_time_event.c index 9655c1e9192c..9b3400554fba 100644 --- a/sys/dev/iwm/if_iwm_time_event.c +++ b/sys/dev/iwm/if_iwm_time_event.c @@ -164,77 +164,17 @@ __FBSDID("$FreeBSD$"); #define IWM_MVM_ROC_TE_TYPE_NORMAL IWM_TE_P2P_DEVICE_DISCOVERABLE #define IWM_MVM_ROC_TE_TYPE_MGMT_TX IWM_TE_P2P_CLIENT_ASSOC -/* used to convert from time event API v2 to v1 */ -#define IWM_TE_V2_DEP_POLICY_MSK (IWM_TE_V2_DEP_OTHER | IWM_TE_V2_DEP_TSF |\ - IWM_TE_V2_EVENT_SOCIOPATHIC) -static inline uint16_t -iwm_te_v2_get_notify(uint16_t policy) -{ - return le16toh(policy) & IWM_TE_V2_NOTIF_MSK; -} - -static inline uint16_t -iwm_te_v2_get_dep_policy(uint16_t policy) -{ - return (le16toh(policy) & IWM_TE_V2_DEP_POLICY_MSK) >> - IWM_TE_V2_PLACEMENT_POS; -} - -static inline uint16_t -iwm_te_v2_get_absence(uint16_t policy) -{ - return (le16toh(policy) & IWM_TE_V2_ABSENCE) >> IWM_TE_V2_ABSENCE_POS; -} - -static void -iwm_mvm_te_v2_to_v1(const struct iwm_time_event_cmd_v2 *cmd_v2, - struct iwm_time_event_cmd_v1 *cmd_v1) -{ - cmd_v1->id_and_color = cmd_v2->id_and_color; - cmd_v1->action = cmd_v2->action; - cmd_v1->id = cmd_v2->id; - cmd_v1->apply_time = cmd_v2->apply_time; - cmd_v1->max_delay = cmd_v2->max_delay; - cmd_v1->depends_on = cmd_v2->depends_on; - cmd_v1->interval = cmd_v2->interval; - cmd_v1->duration = cmd_v2->duration; - if (cmd_v2->repeat == IWM_TE_V2_REPEAT_ENDLESS) - cmd_v1->repeat = htole32(IWM_TE_V1_REPEAT_ENDLESS); - else - cmd_v1->repeat = htole32(cmd_v2->repeat); - cmd_v1->max_frags = htole32(cmd_v2->max_frags); - cmd_v1->interval_reciprocal = 0; /* unused */ - - cmd_v1->dep_policy = htole32(iwm_te_v2_get_dep_policy(cmd_v2->policy)); - cmd_v1->is_present = htole32(!iwm_te_v2_get_absence(cmd_v2->policy)); - cmd_v1->notify = htole32(iwm_te_v2_get_notify(cmd_v2->policy)); -} - -static int -iwm_mvm_send_time_event_cmd(struct iwm_softc *sc, - const struct iwm_time_event_cmd_v2 *cmd) -{ - struct iwm_time_event_cmd_v1 cmd_v1; - - if (sc->sc_capaflags & IWM_UCODE_TLV_FLAGS_TIME_EVENT_API_V2) - return iwm_mvm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, - IWM_CMD_SYNC, sizeof(*cmd), cmd); - - iwm_mvm_te_v2_to_v1(cmd, &cmd_v1); - return iwm_mvm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, IWM_CMD_SYNC, - sizeof(cmd_v1), &cmd_v1); -} - static int iwm_mvm_time_event_send_add(struct iwm_softc *sc, struct iwm_node *in, - void *te_data, struct iwm_time_event_cmd_v2 *te_cmd) + void *te_data, struct iwm_time_event_cmd *te_cmd) { int ret; IWM_DPRINTF(sc, IWM_DEBUG_CMD | IWM_DEBUG_RESET, "Add new TE, duration %d TU\n", le32toh(te_cmd->duration)); - ret = iwm_mvm_send_time_event_cmd(sc, te_cmd); + ret = iwm_mvm_send_cmd_pdu(sc, IWM_TIME_EVENT_CMD, IWM_CMD_SYNC, + sizeof(*te_cmd), te_cmd); if (ret) { IWM_DPRINTF(sc, IWM_DEBUG_CMD | IWM_DEBUG_RESET, "%s: Couldn't send IWM_TIME_EVENT_CMD: %d\n", @@ -248,9 +188,7 @@ void iwm_mvm_protect_session(struct iwm_softc *sc, struct iwm_node *in, uint32_t duration, uint32_t max_delay) { - struct iwm_time_event_cmd_v2 time_cmd; - - memset(&time_cmd, 0, sizeof(time_cmd)); + struct iwm_time_event_cmd time_cmd = {}; time_cmd.action = htole32(IWM_FW_CTXT_ACTION_ADD); time_cmd.id_and_color = diff --git a/sys/dev/iwm/if_iwmreg.h b/sys/dev/iwm/if_iwmreg.h index a14a967062bd..b8fc8bfa8207 100644 --- a/sys/dev/iwm/if_iwmreg.h +++ b/sys/dev/iwm/if_iwmreg.h @@ -611,21 +611,12 @@ enum iwm_dtd_diode_reg { * @IWM_UCODE_TLV_FLAGS_UAPSD: This uCode image supports uAPSD * @IWM_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan * offload profile config command. - * @IWM_UCODE_TLV_FLAGS_RX_ENERGY_API: supports rx signal strength api - * @IWM_UCODE_TLV_FLAGS_TIME_EVENT_API_V2: using the new time event API. * @IWM_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six * (rather than two) IPv6 addresses - * @IWM_UCODE_TLV_FLAGS_BF_UPDATED: new beacon filtering API * @IWM_UCODE_TLV_FLAGS_NO_BASIC_SSID: not sending a probe with the SSID element * from the probe request template. - * @IWM_UCODE_TLV_FLAGS_D3_CONTINUITY_API: modified D3 API to allow keeping - * connection when going back to D0 * @IWM_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL: new NS offload (small version) * @IWM_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version) - * @IWM_UCODE_TLV_FLAGS_SCHED_SCAN: this uCode image supports scheduled scan. - * @IWM_UCODE_TLV_FLAGS_STA_KEY_CMD: new ADD_STA and ADD_STA_KEY command API - * @IWM_UCODE_TLV_FLAGS_DEVICE_PS_CMD: support device wide power command - * containing CAM (Continuous Active Mode) indication. * @IWM_UCODE_TLV_FLAGS_P2P_PS: P2P client power save is supported (only on a * single bound interface). * @IWM_UCODE_TLV_FLAGS_UAPSD_SUPPORT: General support for uAPSD @@ -641,20 +632,11 @@ enum iwm_ucode_tlv_flag { IWM_UCODE_TLV_FLAGS_MFP = (1 << 2), IWM_UCODE_TLV_FLAGS_P2P = (1 << 3), IWM_UCODE_TLV_FLAGS_DW_BC_TABLE = (1 << 4), - IWM_UCODE_TLV_FLAGS_NEWBT_COEX = (1 << 5), - IWM_UCODE_TLV_FLAGS_PM_CMD_SUPPORT = (1 << 6), IWM_UCODE_TLV_FLAGS_SHORT_BL = (1 << 7), - IWM_UCODE_TLV_FLAGS_RX_ENERGY_API = (1 << 8), - IWM_UCODE_TLV_FLAGS_TIME_EVENT_API_V2 = (1 << 9), IWM_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS = (1 << 10), - IWM_UCODE_TLV_FLAGS_BF_UPDATED = (1 << 11), IWM_UCODE_TLV_FLAGS_NO_BASIC_SSID = (1 << 12), - IWM_UCODE_TLV_FLAGS_D3_CONTINUITY_API = (1 << 14), IWM_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL = (1 << 15), IWM_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE = (1 << 16), - IWM_UCODE_TLV_FLAGS_SCHED_SCAN = (1 << 17), - IWM_UCODE_TLV_FLAGS_STA_KEY_CMD = (1 << 19), - IWM_UCODE_TLV_FLAGS_DEVICE_PS_CMD = (1 << 20), IWM_UCODE_TLV_FLAGS_P2P_PS = (1 << 21), IWM_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM = (1 << 22), IWM_UCODE_TLV_FLAGS_BSS_P2P_PS_SCM = (1 << 23), @@ -2390,52 +2372,7 @@ enum { IWM_T2_V2_START_IMMEDIATELY = (1 << 11), }; /* IWM_MAC_EVENT_ACTION_API_E_VER_2 */ - -/** - * struct iwm_time_event_cmd_api_v1 - configuring Time Events - * with struct IWM_MAC_TIME_EVENT_DATA_API_S_VER_1 (see also - * with version 2. determined by IWM_UCODE_TLV_FLAGS) - * ( IWM_TIME_EVENT_CMD = 0x29 ) - * @id_and_color: ID and color of the relevant MAC - * @action: action to perform, one of IWM_FW_CTXT_ACTION_* - * @id: this field has two meanings, depending on the action: - * If the action is ADD, then it means the type of event to add. - * For all other actions it is the unique event ID assigned when the - * event was added by the FW. - * @apply_time: When to start the Time Event (in GP2) - * @max_delay: maximum delay to event's start (apply time), in TU - * @depends_on: the unique ID of the event we depend on (if any) - * @interval: interval between repetitions, in TU - * @interval_reciprocal: 2^32 / interval - * @duration: duration of event in TU - * @repeat: how many repetitions to do, can be IWM_TE_REPEAT_ENDLESS - * @dep_policy: one of IWM_TE_V1_INDEPENDENT, IWM_TE_V1_DEP_OTHER, IWM_TE_V1_DEP_TSF - * and IWM_TE_V1_EVENT_SOCIOPATHIC - * @is_present: 0 or 1, are we present or absent during the Time Event - * @max_frags: maximal number of fragments the Time Event can be divided to - * @notify: notifications using IWM_TE_V1_NOTIF_* (whom to notify when) - */ -struct iwm_time_event_cmd_v1 { - /* COMMON_INDEX_HDR_API_S_VER_1 */ - uint32_t id_and_color; - uint32_t action; - uint32_t id; - /* IWM_MAC_TIME_EVENT_DATA_API_S_VER_1 */ - uint32_t apply_time; - uint32_t max_delay; - uint32_t dep_policy; - uint32_t depends_on; - uint32_t is_present; - uint32_t max_frags; - uint32_t interval; - uint32_t interval_reciprocal; - uint32_t duration; - uint32_t repeat; - uint32_t notify; -} __packed; /* IWM_MAC_TIME_EVENT_CMD_API_S_VER_1 */ - - -/* Time event - defines for command API v2 */ +/* Time event - defines for command API */ /* * @IWM_TE_V2_FRAG_NONE: fragmentation of the time event is NOT allowed. @@ -2466,7 +2403,7 @@ enum { #define IWM_TE_V2_PLACEMENT_POS 12 #define IWM_TE_V2_ABSENCE_POS 15 -/* Time event policy values (for time event cmd api v2) +/* Time event policy values * A notification (both event and fragment) includes a status indicating weather * the FW was able to schedule the event or not. For fragment start/end * notification the status is always success. There is no start/end fragment @@ -2512,7 +2449,7 @@ enum { }; /** - * struct iwm_time_event_cmd_api_v2 - configuring Time Events + * struct iwm_time_event_cmd_api - configuring Time Events * with struct IWM_MAC_TIME_EVENT_DATA_API_S_VER_2 (see also * with version 1. determined by IWM_UCODE_TLV_FLAGS) * ( IWM_TIME_EVENT_CMD = 0x29 ) @@ -2535,7 +2472,7 @@ enum { * IWM_TE_EVENT_SOCIOPATHIC * using IWM_TE_ABSENCE and using IWM_TE_NOTIF_* */ -struct iwm_time_event_cmd_v2 { +struct iwm_time_event_cmd { /* COMMON_INDEX_HDR_API_S_VER_1 */ uint32_t id_and_color; uint32_t action; @@ -5690,7 +5627,7 @@ struct iwm_mvm_keyinfo { #define IWM_ADD_STA_BAID_SHIFT 8 /** - * struct iwm_mvm_add_sta_cmd_v7 - Add/modify a station in the fw's sta table. + * struct iwm_mvm_add_sta_cmd - Add/modify a station in the fw's sta table. * ( REPLY_ADD_STA = 0x18 ) * @add_modify: 1: modify existing, 0: add new station * @awake_acs: @@ -5726,7 +5663,7 @@ struct iwm_mvm_keyinfo { * ADD_STA sets up the table entry for one station, either creating a new * entry, or modifying a pre-existing one. */ -struct iwm_mvm_add_sta_cmd_v7 { +struct iwm_mvm_add_sta_cmd { uint8_t add_modify; uint8_t awake_acs; uint16_t tid_disable_tx;