|
@@ -512,15 +512,15 @@ il_led_cmd(struct il_priv *il, unsigned long on, unsigned long off)
|
|
|
}
|
|
|
|
|
|
D_LED("Led blink time compensation=%u\n",
|
|
|
- il->cfg->base_params->led_compensation);
|
|
|
+ il->cfg->led_compensation);
|
|
|
led_cmd.on =
|
|
|
il_blink_compensation(il, on,
|
|
|
- il->cfg->base_params->led_compensation);
|
|
|
+ il->cfg->led_compensation);
|
|
|
led_cmd.off =
|
|
|
il_blink_compensation(il, off,
|
|
|
- il->cfg->base_params->led_compensation);
|
|
|
+ il->cfg->led_compensation);
|
|
|
|
|
|
- ret = il->cfg->ops->led->cmd(il, &led_cmd);
|
|
|
+ ret = il->ops->led->cmd(il, &led_cmd);
|
|
|
if (!ret) {
|
|
|
il->blink_on = on;
|
|
|
il->blink_off = off;
|
|
@@ -691,7 +691,7 @@ il_eeprom_verify_signature(struct il_priv *il)
|
|
|
const u8 *
|
|
|
il_eeprom_query_addr(const struct il_priv *il, size_t offset)
|
|
|
{
|
|
|
- BUG_ON(offset >= il->cfg->base_params->eeprom_size);
|
|
|
+ BUG_ON(offset >= il->cfg->eeprom_size);
|
|
|
return &il->eeprom[offset];
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_eeprom_query_addr);
|
|
@@ -722,7 +722,7 @@ il_eeprom_init(struct il_priv *il)
|
|
|
u16 addr;
|
|
|
|
|
|
/* allocate eeprom */
|
|
|
- sz = il->cfg->base_params->eeprom_size;
|
|
|
+ sz = il->cfg->eeprom_size;
|
|
|
D_EEPROM("NVM size = %d\n", sz);
|
|
|
il->eeprom = kzalloc(sz, GFP_KERNEL);
|
|
|
if (!il->eeprom) {
|
|
@@ -731,7 +731,7 @@ il_eeprom_init(struct il_priv *il)
|
|
|
}
|
|
|
e = (__le16 *) il->eeprom;
|
|
|
|
|
|
- il->cfg->ops->lib->apm_ops.init(il);
|
|
|
+ il->ops->lib->apm_ops.init(il);
|
|
|
|
|
|
ret = il_eeprom_verify_signature(il);
|
|
|
if (ret < 0) {
|
|
@@ -741,7 +741,7 @@ il_eeprom_init(struct il_priv *il)
|
|
|
}
|
|
|
|
|
|
/* Make sure driver (instead of uCode) is allowed to read EEPROM */
|
|
|
- ret = il->cfg->ops->lib->eeprom_ops.acquire_semaphore(il);
|
|
|
+ ret = il->ops->lib->eeprom_ops.acquire_semaphore(il);
|
|
|
if (ret < 0) {
|
|
|
IL_ERR("Failed to acquire EEPROM semaphore.\n");
|
|
|
ret = -ENOENT;
|
|
@@ -773,7 +773,7 @@ il_eeprom_init(struct il_priv *il)
|
|
|
|
|
|
ret = 0;
|
|
|
done:
|
|
|
- il->cfg->ops->lib->eeprom_ops.release_semaphore(il);
|
|
|
+ il->ops->lib->eeprom_ops.release_semaphore(il);
|
|
|
|
|
|
err:
|
|
|
if (ret)
|
|
@@ -800,7 +800,7 @@ il_init_band_reference(const struct il_priv *il, int eep_band,
|
|
|
const u8 **eeprom_ch_idx)
|
|
|
{
|
|
|
u32 offset =
|
|
|
- il->cfg->ops->lib->eeprom_ops.regulatory_bands[eep_band - 1];
|
|
|
+ il->ops->lib->eeprom_ops.regulatory_bands[eep_band - 1];
|
|
|
switch (eep_band) {
|
|
|
case 1: /* 2.4GHz band */
|
|
|
*eeprom_ch_count = ARRAY_SIZE(il_eeprom_band_1);
|
|
@@ -1001,9 +1001,9 @@ il_init_channel_map(struct il_priv *il)
|
|
|
}
|
|
|
|
|
|
/* Check if we do have HT40 channels */
|
|
|
- if (il->cfg->ops->lib->eeprom_ops.regulatory_bands[5] ==
|
|
|
+ if (il->ops->lib->eeprom_ops.regulatory_bands[5] ==
|
|
|
EEPROM_REGULATORY_BAND_NO_HT40 &&
|
|
|
- il->cfg->ops->lib->eeprom_ops.regulatory_bands[6] ==
|
|
|
+ il->ops->lib->eeprom_ops.regulatory_bands[6] ==
|
|
|
EEPROM_REGULATORY_BAND_NO_HT40)
|
|
|
return 0;
|
|
|
|
|
@@ -1158,9 +1158,9 @@ il_power_set_mode(struct il_priv *il, struct il_powertable_cmd *cmd, bool force)
|
|
|
if (!(cmd->flags & IL_POWER_DRIVER_ALLOW_SLEEP_MSK))
|
|
|
clear_bit(S_POWER_PMI, &il->status);
|
|
|
|
|
|
- if (il->cfg->ops->lib->update_chain_flags && update_chains)
|
|
|
- il->cfg->ops->lib->update_chain_flags(il);
|
|
|
- else if (il->cfg->ops->lib->update_chain_flags)
|
|
|
+ if (il->ops->lib->update_chain_flags && update_chains)
|
|
|
+ il->ops->lib->update_chain_flags(il);
|
|
|
+ else if (il->ops->lib->update_chain_flags)
|
|
|
D_POWER("Cannot update the power, chain noise "
|
|
|
"calibration running: %d\n",
|
|
|
il->chain_noise_data.state);
|
|
@@ -1442,7 +1442,6 @@ u16
|
|
|
il_get_passive_dwell_time(struct il_priv *il, enum ieee80211_band band,
|
|
|
struct ieee80211_vif *vif)
|
|
|
{
|
|
|
- struct il_rxon_context *ctx = &il->ctx;
|
|
|
u16 value;
|
|
|
|
|
|
u16 passive =
|
|
@@ -1457,7 +1456,7 @@ il_get_passive_dwell_time(struct il_priv *il, enum ieee80211_band band,
|
|
|
* dwell time to be 98% of the smallest beacon interval
|
|
|
* (minus 2 * channel tune time)
|
|
|
*/
|
|
|
- value = ctx->vif ? ctx->vif->bss_conf.beacon_int : 0;
|
|
|
+ value = il->vif ? il->vif->bss_conf.beacon_int : 0;
|
|
|
if (value > IL_PASSIVE_DWELL_BASE || !value)
|
|
|
value = IL_PASSIVE_DWELL_BASE;
|
|
|
value = (value * 98) / 100 - IL_CHANNEL_TUNE_TIME * 2;
|
|
@@ -1486,7 +1485,7 @@ il_scan_initiate(struct il_priv *il, struct ieee80211_vif *vif)
|
|
|
|
|
|
lockdep_assert_held(&il->mutex);
|
|
|
|
|
|
- if (WARN_ON(!il->cfg->ops->utils->request_scan))
|
|
|
+ if (WARN_ON(!il->ops->utils->request_scan))
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
cancel_delayed_work(&il->scan_check);
|
|
@@ -1511,7 +1510,7 @@ il_scan_initiate(struct il_priv *il, struct ieee80211_vif *vif)
|
|
|
set_bit(S_SCANNING, &il->status);
|
|
|
il->scan_start = jiffies;
|
|
|
|
|
|
- ret = il->cfg->ops->utils->request_scan(il, vif);
|
|
|
+ ret = il->ops->utils->request_scan(il, vif);
|
|
|
if (ret) {
|
|
|
clear_bit(S_SCANNING, &il->status);
|
|
|
return ret;
|
|
@@ -1673,7 +1672,7 @@ out_settings:
|
|
|
il_power_set_mode(il, &il->power_data.sleep_cmd_next, false);
|
|
|
il_set_tx_power(il, il->tx_power_next, false);
|
|
|
|
|
|
- il->cfg->ops->utils->post_scan(il);
|
|
|
+ il->ops->utils->post_scan(il);
|
|
|
|
|
|
out:
|
|
|
mutex_unlock(&il->mutex);
|
|
@@ -1815,7 +1814,7 @@ il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags)
|
|
|
might_sleep();
|
|
|
}
|
|
|
|
|
|
- cmd.len = il->cfg->ops->utils->build_addsta_hcmd(sta, data);
|
|
|
+ cmd.len = il->ops->utils->build_addsta_hcmd(sta, data);
|
|
|
ret = il_send_cmd(il, &cmd);
|
|
|
|
|
|
if (ret || (flags & CMD_ASYNC))
|
|
@@ -1832,8 +1831,7 @@ il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags)
|
|
|
EXPORT_SYMBOL(il_send_add_sta);
|
|
|
|
|
|
static void
|
|
|
-il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta,
|
|
|
- struct il_rxon_context *ctx)
|
|
|
+il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta)
|
|
|
{
|
|
|
struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
|
|
|
__le32 sta_flags;
|
|
@@ -1874,7 +1872,7 @@ il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta,
|
|
|
cpu_to_le32((u32) sta_ht_inf->
|
|
|
ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS);
|
|
|
|
|
|
- if (il_is_ht40_tx_allowed(il, ctx, &sta->ht_cap))
|
|
|
+ if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
|
|
|
sta_flags |= STA_FLG_HT40_EN_MSK;
|
|
|
else
|
|
|
sta_flags &= ~STA_FLG_HT40_EN_MSK;
|
|
@@ -1890,8 +1888,8 @@ done:
|
|
|
* should be called with sta_lock held
|
|
|
*/
|
|
|
u8
|
|
|
-il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- const u8 *addr, bool is_ap, struct ieee80211_sta *sta)
|
|
|
+il_prep_station(struct il_priv *il, const u8 *addr, bool is_ap,
|
|
|
+ struct ieee80211_sta *sta)
|
|
|
{
|
|
|
struct il_station_entry *station;
|
|
|
int i;
|
|
@@ -1899,9 +1897,9 @@ il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
u16 rate;
|
|
|
|
|
|
if (is_ap)
|
|
|
- sta_id = ctx->ap_sta_id;
|
|
|
+ sta_id = IL_AP_ID;
|
|
|
else if (is_broadcast_ether_addr(addr))
|
|
|
- sta_id = ctx->bcast_sta_id;
|
|
|
+ sta_id = il->hw_params.bcast_id;
|
|
|
else
|
|
|
for (i = IL_STA_ID; i < il->hw_params.max_stations; i++) {
|
|
|
if (!compare_ether_addr
|
|
@@ -1950,22 +1948,14 @@ il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
memcpy(station->sta.sta.addr, addr, ETH_ALEN);
|
|
|
station->sta.mode = 0;
|
|
|
station->sta.sta.sta_id = sta_id;
|
|
|
- station->sta.station_flags = ctx->station_flags;
|
|
|
- station->ctxid = ctx->ctxid;
|
|
|
-
|
|
|
- if (sta) {
|
|
|
- struct il_station_priv_common *sta_priv;
|
|
|
-
|
|
|
- sta_priv = (void *)sta->drv_priv;
|
|
|
- sta_priv->ctx = ctx;
|
|
|
- }
|
|
|
+ station->sta.station_flags = 0;
|
|
|
|
|
|
/*
|
|
|
* OK to call unconditionally, since local stations (IBSS BSSID
|
|
|
* STA and broadcast STA) pass in a NULL sta, and mac80211
|
|
|
* doesn't allow HT IBSS.
|
|
|
*/
|
|
|
- il_set_ht_add_station(il, sta_id, sta, ctx);
|
|
|
+ il_set_ht_add_station(il, sta_id, sta);
|
|
|
|
|
|
/* 3945 only */
|
|
|
rate = (il->band == IEEE80211_BAND_5GHZ) ? RATE_6M_PLCP : RATE_1M_PLCP;
|
|
@@ -1983,9 +1973,8 @@ EXPORT_SYMBOL_GPL(il_prep_station);
|
|
|
* il_add_station_common -
|
|
|
*/
|
|
|
int
|
|
|
-il_add_station_common(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- const u8 *addr, bool is_ap, struct ieee80211_sta *sta,
|
|
|
- u8 *sta_id_r)
|
|
|
+il_add_station_common(struct il_priv *il, const u8 *addr, bool is_ap,
|
|
|
+ struct ieee80211_sta *sta, u8 *sta_id_r)
|
|
|
{
|
|
|
unsigned long flags_spin;
|
|
|
int ret = 0;
|
|
@@ -1994,7 +1983,7 @@ il_add_station_common(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
|
|
|
*sta_id_r = 0;
|
|
|
spin_lock_irqsave(&il->sta_lock, flags_spin);
|
|
|
- sta_id = il_prep_station(il, ctx, addr, is_ap, sta);
|
|
|
+ sta_id = il_prep_station(il, addr, is_ap, sta);
|
|
|
if (sta_id == IL_INVALID_STATION) {
|
|
|
IL_ERR("Unable to prepare station %pM for addition\n", addr);
|
|
|
spin_unlock_irqrestore(&il->sta_lock, flags_spin);
|
|
@@ -2181,7 +2170,7 @@ EXPORT_SYMBOL_GPL(il_remove_station);
|
|
|
* the ucode, e.g. unassociated RXON.
|
|
|
*/
|
|
|
void
|
|
|
-il_clear_ucode_stations(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_clear_ucode_stations(struct il_priv *il)
|
|
|
{
|
|
|
int i;
|
|
|
unsigned long flags_spin;
|
|
@@ -2191,9 +2180,6 @@ il_clear_ucode_stations(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
|
|
|
spin_lock_irqsave(&il->sta_lock, flags_spin);
|
|
|
for (i = 0; i < il->hw_params.max_stations; i++) {
|
|
|
- if (ctx && ctx->ctxid != il->stations[i].ctxid)
|
|
|
- continue;
|
|
|
-
|
|
|
if (il->stations[i].used & IL_STA_UCODE_ACTIVE) {
|
|
|
D_INFO("Clearing ucode active for station %d\n", i);
|
|
|
il->stations[i].used &= ~IL_STA_UCODE_ACTIVE;
|
|
@@ -2216,7 +2202,7 @@ EXPORT_SYMBOL(il_clear_ucode_stations);
|
|
|
* Function sleeps.
|
|
|
*/
|
|
|
void
|
|
|
-il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_restore_stations(struct il_priv *il)
|
|
|
{
|
|
|
struct il_addsta_cmd sta_cmd;
|
|
|
struct il_link_quality_cmd lq;
|
|
@@ -2234,8 +2220,6 @@ il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
D_ASSOC("Restoring all known stations ... start.\n");
|
|
|
spin_lock_irqsave(&il->sta_lock, flags_spin);
|
|
|
for (i = 0; i < il->hw_params.max_stations; i++) {
|
|
|
- if (ctx->ctxid != il->stations[i].ctxid)
|
|
|
- continue;
|
|
|
if ((il->stations[i].used & IL_STA_DRIVER_ACTIVE) &&
|
|
|
!(il->stations[i].used & IL_STA_UCODE_ACTIVE)) {
|
|
|
D_ASSOC("Restoring sta %pM\n",
|
|
@@ -2273,7 +2257,7 @@ il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
* current LQ command
|
|
|
*/
|
|
|
if (send_lq)
|
|
|
- il_send_lq_cmd(il, ctx, &lq, CMD_SYNC, true);
|
|
|
+ il_send_lq_cmd(il, &lq, CMD_SYNC, true);
|
|
|
spin_lock_irqsave(&il->sta_lock, flags_spin);
|
|
|
il->stations[i].used &= ~IL_STA_UCODE_INPROGRESS;
|
|
|
}
|
|
@@ -2353,15 +2337,14 @@ il_dump_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq)
|
|
|
* RXON flags are updated and when LQ command is updated.
|
|
|
*/
|
|
|
static bool
|
|
|
-il_is_lq_table_valid(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- struct il_link_quality_cmd *lq)
|
|
|
+il_is_lq_table_valid(struct il_priv *il, struct il_link_quality_cmd *lq)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- if (ctx->ht.enabled)
|
|
|
+ if (il->ht.enabled)
|
|
|
return true;
|
|
|
|
|
|
- D_INFO("Channel %u is not an HT channel\n", ctx->active.channel);
|
|
|
+ D_INFO("Channel %u is not an HT channel\n", il->active.channel);
|
|
|
for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
|
|
|
if (le32_to_cpu(lq->rs_table[i].rate_n_flags) & RATE_MCS_HT_MSK) {
|
|
|
D_INFO("idx %d of LQ expects HT channel\n", i);
|
|
@@ -2382,8 +2365,8 @@ il_is_lq_table_valid(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
* progress.
|
|
|
*/
|
|
|
int
|
|
|
-il_send_lq_cmd(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- struct il_link_quality_cmd *lq, u8 flags, bool init)
|
|
|
+il_send_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq,
|
|
|
+ u8 flags, bool init)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
unsigned long flags_spin;
|
|
@@ -2408,7 +2391,7 @@ il_send_lq_cmd(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
il_dump_lq_cmd(il, lq);
|
|
|
BUG_ON(init && (cmd.flags & CMD_ASYNC));
|
|
|
|
|
|
- if (il_is_lq_table_valid(il, ctx, lq))
|
|
|
+ if (il_is_lq_table_valid(il, lq))
|
|
|
ret = il_send_cmd(il, &cmd);
|
|
|
else
|
|
|
ret = -EINVAL;
|
|
@@ -2648,7 +2631,7 @@ il_set_decrypted_flag(struct il_priv *il, struct ieee80211_hdr *hdr,
|
|
|
* All contexts have the same setting here due to it being
|
|
|
* a module parameter, so OK to check any context.
|
|
|
*/
|
|
|
- if (il->ctx.active.filter_flags & RXON_FILTER_DIS_DECRYPT_MSK)
|
|
|
+ if (il->active.filter_flags & RXON_FILTER_DIS_DECRYPT_MSK)
|
|
|
return 0;
|
|
|
|
|
|
if (!(fc & IEEE80211_FCTL_PROTECTED))
|
|
@@ -2739,7 +2722,7 @@ il_tx_queue_unmap(struct il_priv *il, int txq_id)
|
|
|
return;
|
|
|
|
|
|
while (q->write_ptr != q->read_ptr) {
|
|
|
- il->cfg->ops->lib->txq_free_tfd(il, txq);
|
|
|
+ il->ops->lib->txq_free_tfd(il, txq);
|
|
|
q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd);
|
|
|
}
|
|
|
}
|
|
@@ -2772,8 +2755,8 @@ il_tx_queue_free(struct il_priv *il, int txq_id)
|
|
|
txq->tfds, txq->q.dma_addr);
|
|
|
|
|
|
/* De-alloc array of per-TFD driver data */
|
|
|
- kfree(txq->txb);
|
|
|
- txq->txb = NULL;
|
|
|
+ kfree(txq->skbs);
|
|
|
+ txq->skbs = NULL;
|
|
|
|
|
|
/* deallocate arrays */
|
|
|
kfree(txq->cmd);
|
|
@@ -2947,23 +2930,21 @@ il_tx_queue_alloc(struct il_priv *il, struct il_tx_queue *txq, u32 id)
|
|
|
/* Driver ilate data, only for Tx (not command) queues,
|
|
|
* not shared with device. */
|
|
|
if (id != il->cmd_queue) {
|
|
|
- txq->txb = kcalloc(TFD_QUEUE_SIZE_MAX, sizeof(txq->txb[0]),
|
|
|
- GFP_KERNEL);
|
|
|
- if (!txq->txb) {
|
|
|
- IL_ERR("kmalloc for auxiliary BD "
|
|
|
- "structures failed\n");
|
|
|
+ txq->skbs = kcalloc(TFD_QUEUE_SIZE_MAX, sizeof(struct skb *),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!txq->skbs) {
|
|
|
+ IL_ERR("Fail to alloc skbs\n");
|
|
|
goto error;
|
|
|
}
|
|
|
- } else {
|
|
|
- txq->txb = NULL;
|
|
|
- }
|
|
|
+ } else
|
|
|
+ txq->skbs = NULL;
|
|
|
|
|
|
/* Circular buffer of transmit frame descriptors (TFDs),
|
|
|
* shared with device */
|
|
|
txq->tfds =
|
|
|
dma_alloc_coherent(dev, tfd_sz, &txq->q.dma_addr, GFP_KERNEL);
|
|
|
if (!txq->tfds) {
|
|
|
- IL_ERR("pci_alloc_consistent(%zd) failed\n", tfd_sz);
|
|
|
+ IL_ERR("Fail to alloc TFDs\n");
|
|
|
goto error;
|
|
|
}
|
|
|
txq->q.id = id;
|
|
@@ -2971,8 +2952,8 @@ il_tx_queue_alloc(struct il_priv *il, struct il_tx_queue *txq, u32 id)
|
|
|
return 0;
|
|
|
|
|
|
error:
|
|
|
- kfree(txq->txb);
|
|
|
- txq->txb = NULL;
|
|
|
+ kfree(txq->skbs);
|
|
|
+ txq->skbs = NULL;
|
|
|
|
|
|
return -ENOMEM;
|
|
|
}
|
|
@@ -3041,7 +3022,7 @@ il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
|
|
|
il_queue_init(il, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id);
|
|
|
|
|
|
/* Tell device where to find queue */
|
|
|
- il->cfg->ops->lib->txq_init(il, txq);
|
|
|
+ il->ops->lib->txq_init(il, txq);
|
|
|
|
|
|
return 0;
|
|
|
err:
|
|
@@ -3072,7 +3053,7 @@ il_tx_queue_reset(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
|
|
|
il_queue_init(il, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id);
|
|
|
|
|
|
/* Tell device where to find queue */
|
|
|
- il->cfg->ops->lib->txq_init(il, txq);
|
|
|
+ il->ops->lib->txq_init(il, txq);
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_tx_queue_reset);
|
|
|
|
|
@@ -3100,7 +3081,7 @@ il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd)
|
|
|
u32 idx;
|
|
|
u16 fix_size;
|
|
|
|
|
|
- cmd->len = il->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len);
|
|
|
+ cmd->len = il->ops->utils->get_hcmd_size(cmd->id, cmd->len);
|
|
|
fix_size = (u16) (cmd->len + sizeof(out_cmd->hdr));
|
|
|
|
|
|
/* If any of the command structures end up being larger than
|
|
@@ -3179,9 +3160,9 @@ il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd)
|
|
|
#endif
|
|
|
txq->need_update = 1;
|
|
|
|
|
|
- if (il->cfg->ops->lib->txq_update_byte_cnt_tbl)
|
|
|
+ if (il->ops->lib->txq_update_byte_cnt_tbl)
|
|
|
/* Set up entry in queue's byte count circular buffer */
|
|
|
- il->cfg->ops->lib->txq_update_byte_cnt_tbl(il, txq, 0);
|
|
|
+ il->ops->lib->txq_update_byte_cnt_tbl(il, txq, 0);
|
|
|
|
|
|
phys_addr =
|
|
|
pci_map_single(il->pci_dev, &out_cmd->hdr, fix_size,
|
|
@@ -3189,8 +3170,8 @@ il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd)
|
|
|
dma_unmap_addr_set(out_meta, mapping, phys_addr);
|
|
|
dma_unmap_len_set(out_meta, len, fix_size);
|
|
|
|
|
|
- il->cfg->ops->lib->txq_attach_buf_to_tfd(il, txq, phys_addr, fix_size,
|
|
|
- 1, U32_PAD(cmd->len));
|
|
|
+ il->ops->lib->txq_attach_buf_to_tfd(il, txq, phys_addr, fix_size, 1,
|
|
|
+ U32_PAD(cmd->len));
|
|
|
|
|
|
/* Increment and update queue's write idx */
|
|
|
q->write_ptr = il_queue_inc_wrap(q->write_ptr, q->n_bd);
|
|
@@ -3332,30 +3313,6 @@ EXPORT_SYMBOL(il_debug_level);
|
|
|
const u8 il_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
|
|
EXPORT_SYMBOL(il_bcast_addr);
|
|
|
|
|
|
-/* This function both allocates and initializes hw and il. */
|
|
|
-struct ieee80211_hw *
|
|
|
-il_alloc_all(struct il_cfg *cfg)
|
|
|
-{
|
|
|
- struct il_priv *il;
|
|
|
- /* mac80211 allocates memory for this device instance, including
|
|
|
- * space for this driver's ilate structure */
|
|
|
- struct ieee80211_hw *hw;
|
|
|
-
|
|
|
- hw = ieee80211_alloc_hw(sizeof(struct il_priv),
|
|
|
- cfg->ops->ieee80211_ops);
|
|
|
- if (hw == NULL) {
|
|
|
- pr_err("%s: Can not allocate network device\n", cfg->name);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- il = hw->priv;
|
|
|
- il->hw = hw;
|
|
|
-
|
|
|
-out:
|
|
|
- return hw;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(il_alloc_all);
|
|
|
-
|
|
|
#define MAX_BIT_RATE_40_MHZ 150 /* Mbps */
|
|
|
#define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
|
|
|
static void
|
|
@@ -3562,10 +3519,9 @@ il_is_channel_extension(struct il_priv *il, enum ieee80211_band band,
|
|
|
}
|
|
|
|
|
|
bool
|
|
|
-il_is_ht40_tx_allowed(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- struct ieee80211_sta_ht_cap *ht_cap)
|
|
|
+il_is_ht40_tx_allowed(struct il_priv *il, struct ieee80211_sta_ht_cap *ht_cap)
|
|
|
{
|
|
|
- if (!ctx->ht.enabled || !ctx->ht.is_40mhz)
|
|
|
+ if (!il->ht.enabled || !il->ht.is_40mhz)
|
|
|
return false;
|
|
|
|
|
|
/*
|
|
@@ -3581,8 +3537,8 @@ il_is_ht40_tx_allowed(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
#endif
|
|
|
|
|
|
return il_is_channel_extension(il, il->band,
|
|
|
- le16_to_cpu(ctx->staging.channel),
|
|
|
- ctx->ht.extension_chan_offset);
|
|
|
+ le16_to_cpu(il->staging.channel),
|
|
|
+ il->ht.extension_chan_offset);
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_is_ht40_tx_allowed);
|
|
|
|
|
@@ -3621,22 +3577,22 @@ il_adjust_beacon_interval(u16 beacon_val, u16 max_beacon_val)
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-il_send_rxon_timing(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_send_rxon_timing(struct il_priv *il)
|
|
|
{
|
|
|
u64 tsf;
|
|
|
s32 interval_tm, rem;
|
|
|
struct ieee80211_conf *conf = NULL;
|
|
|
u16 beacon_int;
|
|
|
- struct ieee80211_vif *vif = ctx->vif;
|
|
|
+ struct ieee80211_vif *vif = il->vif;
|
|
|
|
|
|
conf = &il->hw->conf;
|
|
|
|
|
|
lockdep_assert_held(&il->mutex);
|
|
|
|
|
|
- memset(&ctx->timing, 0, sizeof(struct il_rxon_time_cmd));
|
|
|
+ memset(&il->timing, 0, sizeof(struct il_rxon_time_cmd));
|
|
|
|
|
|
- ctx->timing.timestamp = cpu_to_le64(il->timestamp);
|
|
|
- ctx->timing.listen_interval = cpu_to_le16(conf->listen_interval);
|
|
|
+ il->timing.timestamp = cpu_to_le64(il->timestamp);
|
|
|
+ il->timing.listen_interval = cpu_to_le16(conf->listen_interval);
|
|
|
|
|
|
beacon_int = vif ? vif->bss_conf.beacon_int : 0;
|
|
|
|
|
@@ -3644,36 +3600,35 @@ il_send_rxon_timing(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
* TODO: For IBSS we need to get atim_win from mac80211,
|
|
|
* for now just always use 0
|
|
|
*/
|
|
|
- ctx->timing.atim_win = 0;
|
|
|
+ il->timing.atim_win = 0;
|
|
|
|
|
|
beacon_int =
|
|
|
il_adjust_beacon_interval(beacon_int,
|
|
|
il->hw_params.max_beacon_itrvl *
|
|
|
TIME_UNIT);
|
|
|
- ctx->timing.beacon_interval = cpu_to_le16(beacon_int);
|
|
|
+ il->timing.beacon_interval = cpu_to_le16(beacon_int);
|
|
|
|
|
|
tsf = il->timestamp; /* tsf is modifed by do_div: copy it */
|
|
|
interval_tm = beacon_int * TIME_UNIT;
|
|
|
rem = do_div(tsf, interval_tm);
|
|
|
- ctx->timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
|
|
|
+ il->timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
|
|
|
|
|
|
- ctx->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ? : 1) : 1;
|
|
|
+ il->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ? : 1) : 1;
|
|
|
|
|
|
D_ASSOC("beacon interval %d beacon timer %d beacon tim %d\n",
|
|
|
- le16_to_cpu(ctx->timing.beacon_interval),
|
|
|
- le32_to_cpu(ctx->timing.beacon_init_val),
|
|
|
- le16_to_cpu(ctx->timing.atim_win));
|
|
|
+ le16_to_cpu(il->timing.beacon_interval),
|
|
|
+ le32_to_cpu(il->timing.beacon_init_val),
|
|
|
+ le16_to_cpu(il->timing.atim_win));
|
|
|
|
|
|
- return il_send_cmd_pdu(il, ctx->rxon_timing_cmd, sizeof(ctx->timing),
|
|
|
- &ctx->timing);
|
|
|
+ return il_send_cmd_pdu(il, C_RXON_TIMING, sizeof(il->timing),
|
|
|
+ &il->timing);
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_send_rxon_timing);
|
|
|
|
|
|
void
|
|
|
-il_set_rxon_hwcrypto(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- int hw_decrypt)
|
|
|
+il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt)
|
|
|
{
|
|
|
- struct il_rxon_cmd *rxon = &ctx->staging;
|
|
|
+ struct il_rxon_cmd *rxon = &il->staging;
|
|
|
|
|
|
if (hw_decrypt)
|
|
|
rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK;
|
|
@@ -3685,9 +3640,9 @@ EXPORT_SYMBOL(il_set_rxon_hwcrypto);
|
|
|
|
|
|
/* validate RXON structure is valid */
|
|
|
int
|
|
|
-il_check_rxon_cmd(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_check_rxon_cmd(struct il_priv *il)
|
|
|
{
|
|
|
- struct il_rxon_cmd *rxon = &ctx->staging;
|
|
|
+ struct il_rxon_cmd *rxon = &il->staging;
|
|
|
bool error = false;
|
|
|
|
|
|
if (rxon->flags & RXON_FLG_BAND_24G_MSK) {
|
|
@@ -3765,10 +3720,10 @@ EXPORT_SYMBOL(il_check_rxon_cmd);
|
|
|
* a new tune (full RXON command, rather than RXON_ASSOC cmd) is required.
|
|
|
*/
|
|
|
int
|
|
|
-il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_full_rxon_required(struct il_priv *il)
|
|
|
{
|
|
|
- const struct il_rxon_cmd *staging = &ctx->staging;
|
|
|
- const struct il_rxon_cmd *active = &ctx->active;
|
|
|
+ const struct il_rxon_cmd *staging = &il->staging;
|
|
|
+ const struct il_rxon_cmd *active = &il->active;
|
|
|
|
|
|
#define CHK(cond) \
|
|
|
if ((cond)) { \
|
|
@@ -3785,7 +3740,7 @@ il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
}
|
|
|
|
|
|
/* These items are only settable from the full RXON command */
|
|
|
- CHK(!il_is_associated_ctx(ctx));
|
|
|
+ CHK(!il_is_associated(il));
|
|
|
CHK(compare_ether_addr(staging->bssid_addr, active->bssid_addr));
|
|
|
CHK(compare_ether_addr(staging->node_addr, active->node_addr));
|
|
|
CHK(compare_ether_addr
|
|
@@ -3819,13 +3774,13 @@ il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
EXPORT_SYMBOL(il_full_rxon_required);
|
|
|
|
|
|
u8
|
|
|
-il_get_lowest_plcp(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_get_lowest_plcp(struct il_priv *il)
|
|
|
{
|
|
|
/*
|
|
|
* Assign the lowest rate -- should really get this from
|
|
|
* the beacon skb from mac80211.
|
|
|
*/
|
|
|
- if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK)
|
|
|
+ if (il->staging.flags & RXON_FLG_BAND_24G_MSK)
|
|
|
return RATE_1M_PLCP;
|
|
|
else
|
|
|
return RATE_6M_PLCP;
|
|
@@ -3833,12 +3788,11 @@ il_get_lowest_plcp(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
EXPORT_SYMBOL(il_get_lowest_plcp);
|
|
|
|
|
|
static void
|
|
|
-_il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
|
|
|
- struct il_rxon_context *ctx)
|
|
|
+_il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf)
|
|
|
{
|
|
|
- struct il_rxon_cmd *rxon = &ctx->staging;
|
|
|
+ struct il_rxon_cmd *rxon = &il->staging;
|
|
|
|
|
|
- if (!ctx->ht.enabled) {
|
|
|
+ if (!il->ht.enabled) {
|
|
|
rxon->flags &=
|
|
|
~(RXON_FLG_CHANNEL_MODE_MSK |
|
|
|
RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK | RXON_FLG_HT40_PROT_MSK
|
|
@@ -3847,19 +3801,19 @@ _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
|
|
|
}
|
|
|
|
|
|
rxon->flags |=
|
|
|
- cpu_to_le32(ctx->ht.protection << RXON_FLG_HT_OPERATING_MODE_POS);
|
|
|
+ cpu_to_le32(il->ht.protection << RXON_FLG_HT_OPERATING_MODE_POS);
|
|
|
|
|
|
/* Set up channel bandwidth:
|
|
|
* 20 MHz only, 20/40 mixed or pure 40 if ht40 ok */
|
|
|
/* clear the HT channel mode before set the mode */
|
|
|
rxon->flags &=
|
|
|
~(RXON_FLG_CHANNEL_MODE_MSK | RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK);
|
|
|
- if (il_is_ht40_tx_allowed(il, ctx, NULL)) {
|
|
|
+ if (il_is_ht40_tx_allowed(il, NULL)) {
|
|
|
/* pure ht40 */
|
|
|
- if (ctx->ht.protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) {
|
|
|
+ if (il->ht.protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) {
|
|
|
rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40;
|
|
|
/* Note: control channel is opposite of extension channel */
|
|
|
- switch (ctx->ht.extension_chan_offset) {
|
|
|
+ switch (il->ht.extension_chan_offset) {
|
|
|
case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
|
|
|
rxon->flags &=
|
|
|
~RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK;
|
|
@@ -3870,7 +3824,7 @@ _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
|
|
|
}
|
|
|
} else {
|
|
|
/* Note: control channel is opposite of extension channel */
|
|
|
- switch (ctx->ht.extension_chan_offset) {
|
|
|
+ switch (il->ht.extension_chan_offset) {
|
|
|
case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
|
|
|
rxon->flags &=
|
|
|
~(RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK);
|
|
@@ -3891,18 +3845,18 @@ _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
|
|
|
rxon->flags |= RXON_FLG_CHANNEL_MODE_LEGACY;
|
|
|
}
|
|
|
|
|
|
- if (il->cfg->ops->hcmd->set_rxon_chain)
|
|
|
- il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
|
|
|
+ if (il->ops->hcmd->set_rxon_chain)
|
|
|
+ il->ops->hcmd->set_rxon_chain(il);
|
|
|
|
|
|
D_ASSOC("rxon flags 0x%X operation mode :0x%X "
|
|
|
"extension channel offset 0x%x\n", le32_to_cpu(rxon->flags),
|
|
|
- ctx->ht.protection, ctx->ht.extension_chan_offset);
|
|
|
+ il->ht.protection, il->ht.extension_chan_offset);
|
|
|
}
|
|
|
|
|
|
void
|
|
|
il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf)
|
|
|
{
|
|
|
- _il_set_rxon_ht(il, ht_conf, &il->ctx);
|
|
|
+ _il_set_rxon_ht(il, ht_conf);
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_set_rxon_ht);
|
|
|
|
|
@@ -3925,7 +3879,7 @@ il_get_single_channel_number(struct il_priv *il, enum ieee80211_band band)
|
|
|
|
|
|
for (i = min; i < max; i++) {
|
|
|
channel = il->channel_info[i].channel;
|
|
|
- if (channel == le16_to_cpu(il->ctx.staging.channel))
|
|
|
+ if (channel == le16_to_cpu(il->staging.channel))
|
|
|
continue;
|
|
|
|
|
|
ch_info = il_get_channel_info(il, band, channel);
|
|
@@ -3945,20 +3899,19 @@ EXPORT_SYMBOL(il_get_single_channel_number);
|
|
|
* in the staging RXON flag structure based on the ch->band
|
|
|
*/
|
|
|
int
|
|
|
-il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch,
|
|
|
- struct il_rxon_context *ctx)
|
|
|
+il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch)
|
|
|
{
|
|
|
enum ieee80211_band band = ch->band;
|
|
|
u16 channel = ch->hw_value;
|
|
|
|
|
|
- if (le16_to_cpu(ctx->staging.channel) == channel && il->band == band)
|
|
|
+ if (le16_to_cpu(il->staging.channel) == channel && il->band == band)
|
|
|
return 0;
|
|
|
|
|
|
- ctx->staging.channel = cpu_to_le16(channel);
|
|
|
+ il->staging.channel = cpu_to_le16(channel);
|
|
|
if (band == IEEE80211_BAND_5GHZ)
|
|
|
- ctx->staging.flags &= ~RXON_FLG_BAND_24G_MSK;
|
|
|
+ il->staging.flags &= ~RXON_FLG_BAND_24G_MSK;
|
|
|
else
|
|
|
- ctx->staging.flags |= RXON_FLG_BAND_24G_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_BAND_24G_MSK;
|
|
|
|
|
|
il->band = band;
|
|
|
|
|
@@ -3969,24 +3922,24 @@ il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch,
|
|
|
EXPORT_SYMBOL(il_set_rxon_channel);
|
|
|
|
|
|
void
|
|
|
-il_set_flags_for_band(struct il_priv *il, struct il_rxon_context *ctx,
|
|
|
- enum ieee80211_band band, struct ieee80211_vif *vif)
|
|
|
+il_set_flags_for_band(struct il_priv *il, enum ieee80211_band band,
|
|
|
+ struct ieee80211_vif *vif)
|
|
|
{
|
|
|
if (band == IEEE80211_BAND_5GHZ) {
|
|
|
- ctx->staging.flags &=
|
|
|
+ il->staging.flags &=
|
|
|
~(RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK |
|
|
|
RXON_FLG_CCK_MSK);
|
|
|
- ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
|
|
|
} else {
|
|
|
/* Copied from il_post_associate() */
|
|
|
if (vif && vif->bss_conf.use_short_slot)
|
|
|
- ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
|
|
|
else
|
|
|
- ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
|
|
|
+ il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
|
|
|
|
|
|
- ctx->staging.flags |= RXON_FLG_BAND_24G_MSK;
|
|
|
- ctx->staging.flags |= RXON_FLG_AUTO_DETECT_MSK;
|
|
|
- ctx->staging.flags &= ~RXON_FLG_CCK_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_BAND_24G_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_AUTO_DETECT_MSK;
|
|
|
+ il->staging.flags &= ~RXON_FLG_CCK_MSK;
|
|
|
}
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_set_flags_for_band);
|
|
@@ -3995,69 +3948,60 @@ EXPORT_SYMBOL(il_set_flags_for_band);
|
|
|
* initialize rxon structure with default values from eeprom
|
|
|
*/
|
|
|
void
|
|
|
-il_connection_init_rx_config(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_connection_init_rx_config(struct il_priv *il)
|
|
|
{
|
|
|
const struct il_channel_info *ch_info;
|
|
|
|
|
|
- memset(&ctx->staging, 0, sizeof(ctx->staging));
|
|
|
-
|
|
|
- if (!ctx->vif) {
|
|
|
- ctx->staging.dev_type = ctx->unused_devtype;
|
|
|
- } else
|
|
|
- switch (ctx->vif->type) {
|
|
|
-
|
|
|
- case NL80211_IFTYPE_STATION:
|
|
|
- ctx->staging.dev_type = ctx->station_devtype;
|
|
|
- ctx->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
|
|
|
- break;
|
|
|
-
|
|
|
- case NL80211_IFTYPE_ADHOC:
|
|
|
- ctx->staging.dev_type = ctx->ibss_devtype;
|
|
|
- ctx->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
- ctx->staging.filter_flags =
|
|
|
- RXON_FILTER_BCON_AWARE_MSK |
|
|
|
- RXON_FILTER_ACCEPT_GRP_MSK;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- IL_ERR("Unsupported interface type %d\n",
|
|
|
- ctx->vif->type);
|
|
|
- break;
|
|
|
- }
|
|
|
+ memset(&il->staging, 0, sizeof(il->staging));
|
|
|
+
|
|
|
+ if (!il->vif) {
|
|
|
+ il->staging.dev_type = RXON_DEV_TYPE_ESS;
|
|
|
+ } else if (il->vif->type == NL80211_IFTYPE_STATION) {
|
|
|
+ il->staging.dev_type = RXON_DEV_TYPE_ESS;
|
|
|
+ il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
|
|
|
+ } else if (il->vif->type == NL80211_IFTYPE_ADHOC) {
|
|
|
+ il->staging.dev_type = RXON_DEV_TYPE_IBSS;
|
|
|
+ il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
+ il->staging.filter_flags =
|
|
|
+ RXON_FILTER_BCON_AWARE_MSK | RXON_FILTER_ACCEPT_GRP_MSK;
|
|
|
+ } else {
|
|
|
+ IL_ERR("Unsupported interface type %d\n", il->vif->type);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
#if 0
|
|
|
/* TODO: Figure out when short_preamble would be set and cache from
|
|
|
* that */
|
|
|
if (!hw_to_local(il->hw)->short_preamble)
|
|
|
- ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
+ il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
else
|
|
|
- ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
#endif
|
|
|
|
|
|
ch_info =
|
|
|
- il_get_channel_info(il, il->band, le16_to_cpu(ctx->active.channel));
|
|
|
+ il_get_channel_info(il, il->band, le16_to_cpu(il->active.channel));
|
|
|
|
|
|
if (!ch_info)
|
|
|
ch_info = &il->channel_info[0];
|
|
|
|
|
|
- ctx->staging.channel = cpu_to_le16(ch_info->channel);
|
|
|
+ il->staging.channel = cpu_to_le16(ch_info->channel);
|
|
|
il->band = ch_info->band;
|
|
|
|
|
|
- il_set_flags_for_band(il, ctx, il->band, ctx->vif);
|
|
|
+ il_set_flags_for_band(il, il->band, il->vif);
|
|
|
|
|
|
- ctx->staging.ofdm_basic_rates =
|
|
|
+ il->staging.ofdm_basic_rates =
|
|
|
(IL_OFDM_RATES_MASK >> IL_FIRST_OFDM_RATE) & 0xFF;
|
|
|
- ctx->staging.cck_basic_rates =
|
|
|
+ il->staging.cck_basic_rates =
|
|
|
(IL_CCK_RATES_MASK >> IL_FIRST_CCK_RATE) & 0xF;
|
|
|
|
|
|
/* clear both MIX and PURE40 mode flag */
|
|
|
- ctx->staging.flags &=
|
|
|
+ il->staging.flags &=
|
|
|
~(RXON_FLG_CHANNEL_MODE_MIXED | RXON_FLG_CHANNEL_MODE_PURE_40);
|
|
|
- if (ctx->vif)
|
|
|
- memcpy(ctx->staging.node_addr, ctx->vif->addr, ETH_ALEN);
|
|
|
+ if (il->vif)
|
|
|
+ memcpy(il->staging.node_addr, il->vif->addr, ETH_ALEN);
|
|
|
|
|
|
- ctx->staging.ofdm_ht_single_stream_basic_rates = 0xff;
|
|
|
- ctx->staging.ofdm_ht_dual_stream_basic_rates = 0xff;
|
|
|
+ il->staging.ofdm_ht_single_stream_basic_rates = 0xff;
|
|
|
+ il->staging.ofdm_ht_dual_stream_basic_rates = 0xff;
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_connection_init_rx_config);
|
|
|
|
|
@@ -4084,10 +4028,10 @@ il_set_rate(struct il_priv *il)
|
|
|
|
|
|
D_RATE("Set active_rate = %0x\n", il->active_rate);
|
|
|
|
|
|
- il->ctx.staging.cck_basic_rates =
|
|
|
+ il->staging.cck_basic_rates =
|
|
|
(IL_CCK_BASIC_RATES_MASK >> IL_FIRST_CCK_RATE) & 0xF;
|
|
|
|
|
|
- il->ctx.staging.ofdm_basic_rates =
|
|
|
+ il->staging.ofdm_basic_rates =
|
|
|
(IL_OFDM_BASIC_RATES_MASK >> IL_FIRST_OFDM_RATE) & 0xFF;
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_set_rate);
|
|
@@ -4095,13 +4039,11 @@ EXPORT_SYMBOL(il_set_rate);
|
|
|
void
|
|
|
il_chswitch_done(struct il_priv *il, bool is_success)
|
|
|
{
|
|
|
- struct il_rxon_context *ctx = &il->ctx;
|
|
|
-
|
|
|
if (test_bit(S_EXIT_PENDING, &il->status))
|
|
|
return;
|
|
|
|
|
|
if (test_and_clear_bit(S_CHANNEL_SWITCH_PENDING, &il->status))
|
|
|
- ieee80211_chswitch_done(ctx->vif, is_success);
|
|
|
+ ieee80211_chswitch_done(il->vif, is_success);
|
|
|
}
|
|
|
EXPORT_SYMBOL(il_chswitch_done);
|
|
|
|
|
@@ -4110,16 +4052,14 @@ il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb)
|
|
|
{
|
|
|
struct il_rx_pkt *pkt = rxb_addr(rxb);
|
|
|
struct il_csa_notification *csa = &(pkt->u.csa_notif);
|
|
|
-
|
|
|
- struct il_rxon_context *ctx = &il->ctx;
|
|
|
- struct il_rxon_cmd *rxon = (void *)&ctx->active;
|
|
|
+ struct il_rxon_cmd *rxon = (void *)&il->active;
|
|
|
|
|
|
if (!test_bit(S_CHANNEL_SWITCH_PENDING, &il->status))
|
|
|
return;
|
|
|
|
|
|
if (!le32_to_cpu(csa->status) && csa->channel == il->switch_channel) {
|
|
|
rxon->channel = csa->channel;
|
|
|
- ctx->staging.channel = csa->channel;
|
|
|
+ il->staging.channel = csa->channel;
|
|
|
D_11H("CSA notif: channel %d\n", le16_to_cpu(csa->channel));
|
|
|
il_chswitch_done(il, true);
|
|
|
} else {
|
|
@@ -4132,9 +4072,9 @@ EXPORT_SYMBOL(il_hdl_csa);
|
|
|
|
|
|
#ifdef CONFIG_IWLEGACY_DEBUG
|
|
|
void
|
|
|
-il_print_rx_config_cmd(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_print_rx_config_cmd(struct il_priv *il)
|
|
|
{
|
|
|
- struct il_rxon_cmd *rxon = &ctx->staging;
|
|
|
+ struct il_rxon_cmd *rxon = &il->staging;
|
|
|
|
|
|
D_RADIO("RX CONFIG:\n");
|
|
|
il_print_hex_dump(il, IL_DL_RADIO, (u8 *) rxon, sizeof(*rxon));
|
|
@@ -4164,12 +4104,12 @@ il_irq_handle_error(struct il_priv *il)
|
|
|
|
|
|
IL_ERR("Loaded firmware version: %s\n", il->hw->wiphy->fw_version);
|
|
|
|
|
|
- il->cfg->ops->lib->dump_nic_error_log(il);
|
|
|
- if (il->cfg->ops->lib->dump_fh)
|
|
|
- il->cfg->ops->lib->dump_fh(il, NULL, false);
|
|
|
+ il->ops->lib->dump_nic_error_log(il);
|
|
|
+ if (il->ops->lib->dump_fh)
|
|
|
+ il->ops->lib->dump_fh(il, NULL, false);
|
|
|
#ifdef CONFIG_IWLEGACY_DEBUG
|
|
|
if (il_get_debug_level(il) & IL_DL_FW_ERRORS)
|
|
|
- il_print_rx_config_cmd(il, &il->ctx);
|
|
|
+ il_print_rx_config_cmd(il);
|
|
|
#endif
|
|
|
|
|
|
wake_up(&il->wait_command_queue);
|
|
@@ -4276,7 +4216,7 @@ il_apm_init(struct il_priv *il)
|
|
|
* If not (unlikely), enable L0S, so there is at least some
|
|
|
* power savings, even without L1.
|
|
|
*/
|
|
|
- if (il->cfg->base_params->set_l0s) {
|
|
|
+ if (il->cfg->set_l0s) {
|
|
|
lctl = il_pcie_link_ctl(il);
|
|
|
if ((lctl & PCI_CFG_LINK_CTRL_VAL_L1_EN) ==
|
|
|
PCI_CFG_LINK_CTRL_VAL_L1_EN) {
|
|
@@ -4293,9 +4233,9 @@ il_apm_init(struct il_priv *il)
|
|
|
}
|
|
|
|
|
|
/* Configure analog phase-lock-loop before activating to D0A */
|
|
|
- if (il->cfg->base_params->pll_cfg_val)
|
|
|
+ if (il->cfg->pll_cfg_val)
|
|
|
il_set_bit(il, CSR_ANA_PLL_CFG,
|
|
|
- il->cfg->base_params->pll_cfg_val);
|
|
|
+ il->cfg->pll_cfg_val);
|
|
|
|
|
|
/*
|
|
|
* Set "initialization complete" bit to move adapter from
|
|
@@ -4325,7 +4265,7 @@ il_apm_init(struct il_priv *il)
|
|
|
* do not disable clocks. This preserves any hardware bits already
|
|
|
* set by default in "CLK_CTRL_REG" after reset.
|
|
|
*/
|
|
|
- if (il->cfg->base_params->use_bsm)
|
|
|
+ if (il->cfg->use_bsm)
|
|
|
il_wr_prph(il, APMG_CLK_EN_REG,
|
|
|
APMG_CLK_VAL_DMA_CLK_RQT | APMG_CLK_VAL_BSM_CLK_RQT);
|
|
|
else
|
|
@@ -4347,14 +4287,13 @@ il_set_tx_power(struct il_priv *il, s8 tx_power, bool force)
|
|
|
int ret;
|
|
|
s8 prev_tx_power;
|
|
|
bool defer;
|
|
|
- struct il_rxon_context *ctx = &il->ctx;
|
|
|
|
|
|
lockdep_assert_held(&il->mutex);
|
|
|
|
|
|
if (il->tx_power_user_lmt == tx_power && !force)
|
|
|
return 0;
|
|
|
|
|
|
- if (!il->cfg->ops->lib->send_tx_power)
|
|
|
+ if (!il->ops->lib->send_tx_power)
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
/* 0 dBm mean 1 milliwatt */
|
|
@@ -4378,7 +4317,7 @@ il_set_tx_power(struct il_priv *il, s8 tx_power, bool force)
|
|
|
|
|
|
/* do not set tx power when scanning or channel changing */
|
|
|
defer = test_bit(S_SCANNING, &il->status) ||
|
|
|
- memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging));
|
|
|
+ memcmp(&il->active, &il->staging, sizeof(il->staging));
|
|
|
if (defer && !force) {
|
|
|
D_INFO("Deferring tx power set\n");
|
|
|
return 0;
|
|
@@ -4387,7 +4326,7 @@ il_set_tx_power(struct il_priv *il, s8 tx_power, bool force)
|
|
|
prev_tx_power = il->tx_power_user_lmt;
|
|
|
il->tx_power_user_lmt = tx_power;
|
|
|
|
|
|
- ret = il->cfg->ops->lib->send_tx_power(il);
|
|
|
+ ret = il->ops->lib->send_tx_power(il);
|
|
|
|
|
|
/* if fail to set tx_power, restore the orig. tx power */
|
|
|
if (ret) {
|
|
@@ -4505,15 +4444,15 @@ il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
|
|
|
|
|
|
spin_lock_irqsave(&il->lock, flags);
|
|
|
|
|
|
- il->ctx.qos_data.def_qos_parm.ac[q].cw_min =
|
|
|
+ il->qos_data.def_qos_parm.ac[q].cw_min =
|
|
|
cpu_to_le16(params->cw_min);
|
|
|
- il->ctx.qos_data.def_qos_parm.ac[q].cw_max =
|
|
|
+ il->qos_data.def_qos_parm.ac[q].cw_max =
|
|
|
cpu_to_le16(params->cw_max);
|
|
|
- il->ctx.qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
|
|
|
- il->ctx.qos_data.def_qos_parm.ac[q].edca_txop =
|
|
|
+ il->qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
|
|
|
+ il->qos_data.def_qos_parm.ac[q].edca_txop =
|
|
|
cpu_to_le16((params->txop * 32));
|
|
|
|
|
|
- il->ctx.qos_data.def_qos_parm.ac[q].reserved1 = 0;
|
|
|
+ il->qos_data.def_qos_parm.ac[q].reserved1 = 0;
|
|
|
|
|
|
spin_unlock_irqrestore(&il->lock, flags);
|
|
|
|
|
@@ -4532,50 +4471,21 @@ il_mac_tx_last_beacon(struct ieee80211_hw *hw)
|
|
|
EXPORT_SYMBOL_GPL(il_mac_tx_last_beacon);
|
|
|
|
|
|
static int
|
|
|
-il_set_mode(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
-{
|
|
|
- il_connection_init_rx_config(il, ctx);
|
|
|
-
|
|
|
- if (il->cfg->ops->hcmd->set_rxon_chain)
|
|
|
- il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
|
|
|
-
|
|
|
- return il_commit_rxon(il, ctx);
|
|
|
-}
|
|
|
-
|
|
|
-static int
|
|
|
-il_setup_interface(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_set_mode(struct il_priv *il)
|
|
|
{
|
|
|
- struct ieee80211_vif *vif = ctx->vif;
|
|
|
- int err;
|
|
|
-
|
|
|
- lockdep_assert_held(&il->mutex);
|
|
|
-
|
|
|
- /*
|
|
|
- * This variable will be correct only when there's just
|
|
|
- * a single context, but all code using it is for hardware
|
|
|
- * that supports only one context.
|
|
|
- */
|
|
|
- il->iw_mode = vif->type;
|
|
|
+ il_connection_init_rx_config(il);
|
|
|
|
|
|
- ctx->is_active = true;
|
|
|
+ if (il->ops->hcmd->set_rxon_chain)
|
|
|
+ il->ops->hcmd->set_rxon_chain(il);
|
|
|
|
|
|
- err = il_set_mode(il, ctx);
|
|
|
- if (err) {
|
|
|
- if (!ctx->always_active)
|
|
|
- ctx->is_active = false;
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return il_commit_rxon(il);
|
|
|
}
|
|
|
|
|
|
int
|
|
|
il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
{
|
|
|
struct il_priv *il = hw->priv;
|
|
|
- struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
|
|
|
int err;
|
|
|
- u32 modes;
|
|
|
|
|
|
D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
|
|
|
|
|
@@ -4587,25 +4497,17 @@ il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- /* check if busy context is exclusive */
|
|
|
- if (il->ctx.vif &&
|
|
|
- (il->ctx.exclusive_interface_modes & BIT(il->ctx.vif->type))) {
|
|
|
- err = -EINVAL;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- modes = il->ctx.interface_modes | il->ctx.exclusive_interface_modes;
|
|
|
- if (!(modes & BIT(vif->type))) {
|
|
|
+ if (il->vif) {
|
|
|
err = -EOPNOTSUPP;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- vif_priv->ctx = &il->ctx;
|
|
|
- il->ctx.vif = vif;
|
|
|
+ il->vif = vif;
|
|
|
+ il->iw_mode = vif->type;
|
|
|
|
|
|
- err = il_setup_interface(il, &il->ctx);
|
|
|
+ err = il_set_mode(il);
|
|
|
if (err) {
|
|
|
- il->ctx.vif = NULL;
|
|
|
+ il->vif = NULL;
|
|
|
il->iw_mode = NL80211_IFTYPE_STATION;
|
|
|
}
|
|
|
|
|
@@ -4621,8 +4523,6 @@ static void
|
|
|
il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif,
|
|
|
bool mode_change)
|
|
|
{
|
|
|
- struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
|
|
|
-
|
|
|
lockdep_assert_held(&il->mutex);
|
|
|
|
|
|
if (il->scan_vif == vif) {
|
|
@@ -4630,25 +4530,22 @@ il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif,
|
|
|
il_force_scan_end(il);
|
|
|
}
|
|
|
|
|
|
- if (!mode_change) {
|
|
|
- il_set_mode(il, ctx);
|
|
|
- if (!ctx->always_active)
|
|
|
- ctx->is_active = false;
|
|
|
- }
|
|
|
+ if (!mode_change)
|
|
|
+ il_set_mode(il);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
void
|
|
|
il_mac_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
{
|
|
|
struct il_priv *il = hw->priv;
|
|
|
- struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
|
|
|
|
|
|
D_MAC80211("enter\n");
|
|
|
|
|
|
mutex_lock(&il->mutex);
|
|
|
|
|
|
- WARN_ON(ctx->vif != vif);
|
|
|
- ctx->vif = NULL;
|
|
|
+ WARN_ON(il->vif != vif);
|
|
|
+ il->vif = NULL;
|
|
|
|
|
|
il_teardown_interface(il, vif, false);
|
|
|
|
|
@@ -4666,7 +4563,7 @@ il_alloc_txq_mem(struct il_priv *il)
|
|
|
if (!il->txq)
|
|
|
il->txq =
|
|
|
kzalloc(sizeof(struct il_tx_queue) *
|
|
|
- il->cfg->base_params->num_of_queues, GFP_KERNEL);
|
|
|
+ il->cfg->num_of_queues, GFP_KERNEL);
|
|
|
if (!il->txq) {
|
|
|
IL_ERR("Not enough memory for txq\n");
|
|
|
return -ENOMEM;
|
|
@@ -4987,15 +4884,14 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
enum nl80211_iftype newtype, bool newp2p)
|
|
|
{
|
|
|
struct il_priv *il = hw->priv;
|
|
|
- struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
|
|
|
- u32 modes;
|
|
|
int err;
|
|
|
|
|
|
- newtype = ieee80211_iftype_p2p(newtype, newp2p);
|
|
|
+ if (newp2p)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
|
|
mutex_lock(&il->mutex);
|
|
|
|
|
|
- if (!ctx->vif || !il_is_ready_rf(il)) {
|
|
|
+ if (!il->vif || !il_is_ready_rf(il)) {
|
|
|
/*
|
|
|
* Huh? But wait ... this can maybe happen when
|
|
|
* we're in the middle of a firmware restart!
|
|
@@ -5004,23 +4900,11 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- modes = ctx->interface_modes | ctx->exclusive_interface_modes;
|
|
|
- if (!(modes & BIT(newtype))) {
|
|
|
- err = -EOPNOTSUPP;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- if ((il->ctx.exclusive_interface_modes & BIT(il->ctx.vif->type)) ||
|
|
|
- (il->ctx.exclusive_interface_modes & BIT(newtype))) {
|
|
|
- err = -EINVAL;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
/* success */
|
|
|
il_teardown_interface(il, vif, true);
|
|
|
vif->type = newtype;
|
|
|
- vif->p2p = newp2p;
|
|
|
- err = il_setup_interface(il, ctx);
|
|
|
+ vif->p2p = false;
|
|
|
+ err = il_set_mode(il);
|
|
|
WARN_ON(err);
|
|
|
/*
|
|
|
* We've switched internally, but submitting to the
|
|
@@ -5056,11 +4940,11 @@ il_check_stuck_queue(struct il_priv *il, int cnt)
|
|
|
|
|
|
timeout =
|
|
|
txq->time_stamp +
|
|
|
- msecs_to_jiffies(il->cfg->base_params->wd_timeout);
|
|
|
+ msecs_to_jiffies(il->cfg->wd_timeout);
|
|
|
|
|
|
if (time_after(jiffies, timeout)) {
|
|
|
IL_ERR("Queue %d stuck for %u ms.\n", q->id,
|
|
|
- il->cfg->base_params->wd_timeout);
|
|
|
+ il->cfg->wd_timeout);
|
|
|
ret = il_force_reset(il, false);
|
|
|
return (ret == -EAGAIN) ? 0 : 1;
|
|
|
}
|
|
@@ -5088,7 +4972,7 @@ il_bg_watchdog(unsigned long data)
|
|
|
if (test_bit(S_EXIT_PENDING, &il->status))
|
|
|
return;
|
|
|
|
|
|
- timeout = il->cfg->base_params->wd_timeout;
|
|
|
+ timeout = il->cfg->wd_timeout;
|
|
|
if (timeout == 0)
|
|
|
return;
|
|
|
|
|
@@ -5115,7 +4999,7 @@ EXPORT_SYMBOL(il_bg_watchdog);
|
|
|
void
|
|
|
il_setup_watchdog(struct il_priv *il)
|
|
|
{
|
|
|
- unsigned int timeout = il->cfg->base_params->wd_timeout;
|
|
|
+ unsigned int timeout = il->cfg->wd_timeout;
|
|
|
|
|
|
if (timeout)
|
|
|
mod_timer(&il->watchdog,
|
|
@@ -5252,28 +5136,25 @@ EXPORT_SYMBOL(il_pm_ops);
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
static void
|
|
|
-il_update_qos(struct il_priv *il, struct il_rxon_context *ctx)
|
|
|
+il_update_qos(struct il_priv *il)
|
|
|
{
|
|
|
if (test_bit(S_EXIT_PENDING, &il->status))
|
|
|
return;
|
|
|
|
|
|
- if (!ctx->is_active)
|
|
|
- return;
|
|
|
+ il->qos_data.def_qos_parm.qos_flags = 0;
|
|
|
|
|
|
- ctx->qos_data.def_qos_parm.qos_flags = 0;
|
|
|
-
|
|
|
- if (ctx->qos_data.qos_active)
|
|
|
- ctx->qos_data.def_qos_parm.qos_flags |=
|
|
|
+ if (il->qos_data.qos_active)
|
|
|
+ il->qos_data.def_qos_parm.qos_flags |=
|
|
|
QOS_PARAM_FLG_UPDATE_EDCA_MSK;
|
|
|
|
|
|
- if (ctx->ht.enabled)
|
|
|
- ctx->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
|
|
|
+ if (il->ht.enabled)
|
|
|
+ il->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
|
|
|
|
|
|
D_QOS("send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
|
|
- ctx->qos_data.qos_active, ctx->qos_data.def_qos_parm.qos_flags);
|
|
|
+ il->qos_data.qos_active, il->qos_data.def_qos_parm.qos_flags);
|
|
|
|
|
|
- il_send_cmd_pdu_async(il, ctx->qos_cmd, sizeof(struct il_qosparam_cmd),
|
|
|
- &ctx->qos_data.def_qos_parm, NULL);
|
|
|
+ il_send_cmd_pdu_async(il, C_QOS_PARAM, sizeof(struct il_qosparam_cmd),
|
|
|
+ &il->qos_data.def_qos_parm, NULL);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -5287,14 +5168,13 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
|
|
|
struct ieee80211_conf *conf = &hw->conf;
|
|
|
struct ieee80211_channel *channel = conf->channel;
|
|
|
struct il_ht_config *ht_conf = &il->current_ht_config;
|
|
|
- struct il_rxon_context *ctx = &il->ctx;
|
|
|
unsigned long flags = 0;
|
|
|
int ret = 0;
|
|
|
u16 ch;
|
|
|
int scan_active = 0;
|
|
|
bool ht_changed = false;
|
|
|
|
|
|
- if (WARN_ON(!il->cfg->ops->legacy))
|
|
|
+ if (WARN_ON(!il->ops->legacy))
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
mutex_lock(&il->mutex);
|
|
@@ -5319,8 +5199,8 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
|
|
|
* set up the SM PS mode to OFF if an HT channel is
|
|
|
* configured.
|
|
|
*/
|
|
|
- if (il->cfg->ops->hcmd->set_rxon_chain)
|
|
|
- il->cfg->ops->hcmd->set_rxon_chain(il, &il->ctx);
|
|
|
+ if (il->ops->hcmd->set_rxon_chain)
|
|
|
+ il->ops->hcmd->set_rxon_chain(il);
|
|
|
}
|
|
|
|
|
|
/* during scanning mac80211 will delay channel setting until
|
|
@@ -5349,48 +5229,48 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
|
|
|
spin_lock_irqsave(&il->lock, flags);
|
|
|
|
|
|
/* Configure HT40 channels */
|
|
|
- if (ctx->ht.enabled != conf_is_ht(conf)) {
|
|
|
- ctx->ht.enabled = conf_is_ht(conf);
|
|
|
+ if (il->ht.enabled != conf_is_ht(conf)) {
|
|
|
+ il->ht.enabled = conf_is_ht(conf);
|
|
|
ht_changed = true;
|
|
|
}
|
|
|
- if (ctx->ht.enabled) {
|
|
|
+ if (il->ht.enabled) {
|
|
|
if (conf_is_ht40_minus(conf)) {
|
|
|
- ctx->ht.extension_chan_offset =
|
|
|
+ il->ht.extension_chan_offset =
|
|
|
IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
|
|
- ctx->ht.is_40mhz = true;
|
|
|
+ il->ht.is_40mhz = true;
|
|
|
} else if (conf_is_ht40_plus(conf)) {
|
|
|
- ctx->ht.extension_chan_offset =
|
|
|
+ il->ht.extension_chan_offset =
|
|
|
IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
|
|
- ctx->ht.is_40mhz = true;
|
|
|
+ il->ht.is_40mhz = true;
|
|
|
} else {
|
|
|
- ctx->ht.extension_chan_offset =
|
|
|
+ il->ht.extension_chan_offset =
|
|
|
IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
|
|
- ctx->ht.is_40mhz = false;
|
|
|
+ il->ht.is_40mhz = false;
|
|
|
}
|
|
|
} else
|
|
|
- ctx->ht.is_40mhz = false;
|
|
|
+ il->ht.is_40mhz = false;
|
|
|
|
|
|
/*
|
|
|
* Default to no protection. Protection mode will
|
|
|
* later be set from BSS config in il_ht_conf
|
|
|
*/
|
|
|
- ctx->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
|
|
|
+ il->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
|
|
|
|
|
|
/* if we are switching from ht to 2.4 clear flags
|
|
|
* from any ht related info since 2.4 does not
|
|
|
* support ht */
|
|
|
- if ((le16_to_cpu(ctx->staging.channel) != ch))
|
|
|
- ctx->staging.flags = 0;
|
|
|
+ if ((le16_to_cpu(il->staging.channel) != ch))
|
|
|
+ il->staging.flags = 0;
|
|
|
|
|
|
- il_set_rxon_channel(il, channel, ctx);
|
|
|
+ il_set_rxon_channel(il, channel);
|
|
|
il_set_rxon_ht(il, ht_conf);
|
|
|
|
|
|
- il_set_flags_for_band(il, ctx, channel->band, ctx->vif);
|
|
|
+ il_set_flags_for_band(il, channel->band, il->vif);
|
|
|
|
|
|
spin_unlock_irqrestore(&il->lock, flags);
|
|
|
|
|
|
- if (il->cfg->ops->legacy->update_bcast_stations)
|
|
|
- ret = il->cfg->ops->legacy->update_bcast_stations(il);
|
|
|
+ if (il->ops->legacy->update_bcast_stations)
|
|
|
+ ret = il->ops->legacy->update_bcast_stations(il);
|
|
|
|
|
|
set_ch_out:
|
|
|
/* The list of supported rates and rate mask can be different
|
|
@@ -5420,12 +5300,12 @@ set_ch_out:
|
|
|
if (scan_active)
|
|
|
goto out;
|
|
|
|
|
|
- if (memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging)))
|
|
|
- il_commit_rxon(il, ctx);
|
|
|
+ if (memcmp(&il->active, &il->staging, sizeof(il->staging)))
|
|
|
+ il_commit_rxon(il);
|
|
|
else
|
|
|
D_INFO("Not re-sending same RXON configuration.\n");
|
|
|
if (ht_changed)
|
|
|
- il_update_qos(il, ctx);
|
|
|
+ il_update_qos(il);
|
|
|
|
|
|
out:
|
|
|
D_MAC80211("leave\n");
|
|
@@ -5439,9 +5319,8 @@ il_mac_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
{
|
|
|
struct il_priv *il = hw->priv;
|
|
|
unsigned long flags;
|
|
|
- struct il_rxon_context *ctx = &il->ctx;
|
|
|
|
|
|
- if (WARN_ON(!il->cfg->ops->legacy))
|
|
|
+ if (WARN_ON(!il->ops->legacy))
|
|
|
return;
|
|
|
|
|
|
mutex_lock(&il->mutex);
|
|
@@ -5473,8 +5352,8 @@ il_mac_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
/* we are restarting association process
|
|
|
* clear RXON_FILTER_ASSOC_MSK bit
|
|
|
*/
|
|
|
- ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
- il_commit_rxon(il, ctx);
|
|
|
+ il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
+ il_commit_rxon(il);
|
|
|
|
|
|
il_set_rate(il);
|
|
|
|
|
@@ -5490,16 +5369,15 @@ il_ht_conf(struct il_priv *il, struct ieee80211_vif *vif)
|
|
|
struct il_ht_config *ht_conf = &il->current_ht_config;
|
|
|
struct ieee80211_sta *sta;
|
|
|
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
|
|
|
- struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
|
|
|
|
|
|
D_ASSOC("enter:\n");
|
|
|
|
|
|
- if (!ctx->ht.enabled)
|
|
|
+ if (!il->ht.enabled)
|
|
|
return;
|
|
|
|
|
|
- ctx->ht.protection =
|
|
|
+ il->ht.protection =
|
|
|
bss_conf->ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION;
|
|
|
- ctx->ht.non_gf_sta_present =
|
|
|
+ il->ht.non_gf_sta_present =
|
|
|
!!(bss_conf->
|
|
|
ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
|
|
|
|
|
@@ -5548,16 +5426,14 @@ il_ht_conf(struct il_priv *il, struct ieee80211_vif *vif)
|
|
|
static inline void
|
|
|
il_set_no_assoc(struct il_priv *il, struct ieee80211_vif *vif)
|
|
|
{
|
|
|
- struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
|
|
|
-
|
|
|
/*
|
|
|
* inform the ucode that there is no longer an
|
|
|
* association and that no more packets should be
|
|
|
* sent
|
|
|
*/
|
|
|
- ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
- ctx->staging.assoc_id = 0;
|
|
|
- il_commit_rxon(il, ctx);
|
|
|
+ il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
+ il->staging.assoc_id = 0;
|
|
|
+ il_commit_rxon(il);
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -5575,8 +5451,8 @@ il_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
|
|
|
lockdep_assert_held(&il->mutex);
|
|
|
|
|
|
- if (!il->beacon_ctx) {
|
|
|
- IL_ERR("update beacon but no beacon context!\n");
|
|
|
+ if (!il->beacon_enabled) {
|
|
|
+ IL_ERR("update beacon with no beaconing enabled\n");
|
|
|
dev_kfree_skb(skb);
|
|
|
return;
|
|
|
}
|
|
@@ -5599,7 +5475,7 @@ il_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- il->cfg->ops->legacy->post_associate(il);
|
|
|
+ il->ops->legacy->post_associate(il);
|
|
|
}
|
|
|
|
|
|
void
|
|
@@ -5607,10 +5483,9 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
struct ieee80211_bss_conf *bss_conf, u32 changes)
|
|
|
{
|
|
|
struct il_priv *il = hw->priv;
|
|
|
- struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
|
|
|
int ret;
|
|
|
|
|
|
- if (WARN_ON(!il->cfg->ops->legacy))
|
|
|
+ if (WARN_ON(!il->ops->legacy))
|
|
|
return;
|
|
|
|
|
|
D_MAC80211("changes = 0x%X\n", changes);
|
|
@@ -5626,21 +5501,17 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(&il->lock, flags);
|
|
|
- ctx->qos_data.qos_active = bss_conf->qos;
|
|
|
- il_update_qos(il, ctx);
|
|
|
+ il->qos_data.qos_active = bss_conf->qos;
|
|
|
+ il_update_qos(il);
|
|
|
spin_unlock_irqrestore(&il->lock, flags);
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
|
|
- /*
|
|
|
- * the add_interface code must make sure we only ever
|
|
|
- * have a single interface that could be beaconing at
|
|
|
- * any time.
|
|
|
- */
|
|
|
+ /* FIXME: can we remove beacon_enabled ? */
|
|
|
if (vif->bss_conf.enable_beacon)
|
|
|
- il->beacon_ctx = ctx;
|
|
|
+ il->beacon_enabled = true;
|
|
|
else
|
|
|
- il->beacon_ctx = NULL;
|
|
|
+ il->beacon_enabled = false;
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_BSSID) {
|
|
@@ -5660,13 +5531,13 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
|
|
|
/* mac80211 only sets assoc when in STATION mode */
|
|
|
if (vif->type == NL80211_IFTYPE_ADHOC || bss_conf->assoc) {
|
|
|
- memcpy(ctx->staging.bssid_addr, bss_conf->bssid,
|
|
|
+ memcpy(il->staging.bssid_addr, bss_conf->bssid,
|
|
|
ETH_ALEN);
|
|
|
|
|
|
/* currently needed in a few places */
|
|
|
memcpy(il->bssid, bss_conf->bssid, ETH_ALEN);
|
|
|
} else {
|
|
|
- ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
+ il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -5682,21 +5553,21 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
if (changes & BSS_CHANGED_ERP_PREAMBLE) {
|
|
|
D_MAC80211("ERP_PREAMBLE %d\n", bss_conf->use_short_preamble);
|
|
|
if (bss_conf->use_short_preamble)
|
|
|
- ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
else
|
|
|
- ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
+ il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_ERP_CTS_PROT) {
|
|
|
D_MAC80211("ERP_CTS %d\n", bss_conf->use_cts_prot);
|
|
|
if (bss_conf->use_cts_prot && il->band != IEEE80211_BAND_5GHZ)
|
|
|
- ctx->staging.flags |= RXON_FLG_TGG_PROTECT_MSK;
|
|
|
+ il->staging.flags |= RXON_FLG_TGG_PROTECT_MSK;
|
|
|
else
|
|
|
- ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
|
|
|
+ il->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
|
|
|
if (bss_conf->use_cts_prot)
|
|
|
- ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
|
|
|
+ il->staging.flags |= RXON_FLG_SELF_CTS_EN;
|
|
|
else
|
|
|
- ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
|
|
|
+ il->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_BASIC_RATES) {
|
|
@@ -5706,12 +5577,12 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
* like this here:
|
|
|
*
|
|
|
if (A-band)
|
|
|
- ctx->staging.ofdm_basic_rates =
|
|
|
+ il->staging.ofdm_basic_rates =
|
|
|
bss_conf->basic_rates;
|
|
|
else
|
|
|
- ctx->staging.ofdm_basic_rates =
|
|
|
+ il->staging.ofdm_basic_rates =
|
|
|
bss_conf->basic_rates >> 4;
|
|
|
- ctx->staging.cck_basic_rates =
|
|
|
+ il->staging.cck_basic_rates =
|
|
|
bss_conf->basic_rates & 0xF;
|
|
|
*/
|
|
|
}
|
|
@@ -5719,8 +5590,8 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
if (changes & BSS_CHANGED_HT) {
|
|
|
il_ht_conf(il, vif);
|
|
|
|
|
|
- if (il->cfg->ops->hcmd->set_rxon_chain)
|
|
|
- il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
|
|
|
+ if (il->ops->hcmd->set_rxon_chain)
|
|
|
+ il->ops->hcmd->set_rxon_chain(il);
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_ASSOC) {
|
|
@@ -5729,36 +5600,35 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
il->timestamp = bss_conf->timestamp;
|
|
|
|
|
|
if (!il_is_rfkill(il))
|
|
|
- il->cfg->ops->legacy->post_associate(il);
|
|
|
+ il->ops->legacy->post_associate(il);
|
|
|
} else
|
|
|
il_set_no_assoc(il, vif);
|
|
|
}
|
|
|
|
|
|
- if (changes && il_is_associated_ctx(ctx) && bss_conf->aid) {
|
|
|
+ if (changes && il_is_associated(il) && bss_conf->aid) {
|
|
|
D_MAC80211("Changes (%#x) while associated\n", changes);
|
|
|
- ret = il_send_rxon_assoc(il, ctx);
|
|
|
+ ret = il_send_rxon_assoc(il);
|
|
|
if (!ret) {
|
|
|
/* Sync active_rxon with latest change. */
|
|
|
- memcpy((void *)&ctx->active, &ctx->staging,
|
|
|
+ memcpy((void *)&il->active, &il->staging,
|
|
|
sizeof(struct il_rxon_cmd));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
|
|
if (vif->bss_conf.enable_beacon) {
|
|
|
- memcpy(ctx->staging.bssid_addr, bss_conf->bssid,
|
|
|
+ memcpy(il->staging.bssid_addr, bss_conf->bssid,
|
|
|
ETH_ALEN);
|
|
|
memcpy(il->bssid, bss_conf->bssid, ETH_ALEN);
|
|
|
- il->cfg->ops->legacy->config_ap(il);
|
|
|
+ il->ops->legacy->config_ap(il);
|
|
|
} else
|
|
|
il_set_no_assoc(il, vif);
|
|
|
}
|
|
|
|
|
|
if (changes & BSS_CHANGED_IBSS) {
|
|
|
ret =
|
|
|
- il->cfg->ops->legacy->manage_ibss_station(il, vif,
|
|
|
- bss_conf->
|
|
|
- ibss_joined);
|
|
|
+ il->ops->legacy->manage_ibss_station(il, vif,
|
|
|
+ bss_conf->ibss_joined);
|
|
|
if (ret)
|
|
|
IL_ERR("failed to %s IBSS station %pM\n",
|
|
|
bss_conf->ibss_joined ? "add" : "remove",
|