Lines Matching +full:mode +full:- +full:normal
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Copyright (c) 2007-2009, Christian Lamparter <chunkeey@web.de>
10 * - the islsm (softmac prism54) driver, which is:
11 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
12 * - stlc45xx driver
13 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
29 struct p54_common *priv = dev->priv; in p54_parse_firmware()
32 u32 *data = (u32 *)fw->data; in p54_parse_firmware()
33 u32 *end_data = (u32 *)fw->data + (fw->size >> 2); in p54_parse_firmware()
39 if (priv->rx_start) in p54_parse_firmware()
50 while (bootrec->data <= end_data && (bootrec->data + in p54_parse_firmware()
51 (len = le32_to_cpu(bootrec->len))) <= end_data) { in p54_parse_firmware()
52 u32 code = le32_to_cpu(bootrec->code); in p54_parse_firmware()
55 priv->fw_interface = be32_to_cpup((__be32 *) in p54_parse_firmware()
56 bootrec->data); in p54_parse_firmware()
57 switch (priv->fw_interface) { in p54_parse_firmware()
61 char *iftype = (char *)bootrec->data; in p54_parse_firmware()
62 wiphy_info(priv->hw->wiphy, in p54_parse_firmware()
69 wiphy_err(priv->hw->wiphy, in p54_parse_firmware()
71 return -ENODEV; in p54_parse_firmware()
76 if (strnlen((unsigned char *) bootrec->data, 24) < 24) in p54_parse_firmware()
77 fw_version = (unsigned char *) bootrec->data; in p54_parse_firmware()
81 (struct bootrec_desc *)bootrec->data; in p54_parse_firmware()
82 priv->rx_start = le32_to_cpu(desc->rx_start); in p54_parse_firmware()
84 priv->rx_end = le32_to_cpu(desc->rx_end) - 0x3500; in p54_parse_firmware()
85 priv->headroom = desc->headroom; in p54_parse_firmware()
86 priv->tailroom = desc->tailroom; in p54_parse_firmware()
87 priv->privacy_caps = desc->privacy_caps; in p54_parse_firmware()
88 priv->rx_keycache_size = desc->rx_keycache_size; in p54_parse_firmware()
89 if (le32_to_cpu(bootrec->len) == 11) in p54_parse_firmware()
90 priv->rx_mtu = le16_to_cpu(desc->rx_mtu); in p54_parse_firmware()
92 priv->rx_mtu = (size_t) in p54_parse_firmware()
93 0x620 - priv->tx_hdr_len; in p54_parse_firmware()
94 maxlen = priv->tx_hdr_len + /* USB devices */ in p54_parse_firmware()
98 if (priv->rx_mtu > maxlen && PAGE_SIZE == 4096) { in p54_parse_firmware()
100 "to %d\n", priv->rx_mtu, maxlen); in p54_parse_firmware()
101 priv->rx_mtu = maxlen; in p54_parse_firmware()
106 exp_if = (struct exp_if *) bootrec->data; in p54_parse_firmware()
109 priv->fw_var = le16_to_cpu(exp_if[i].variant); in p54_parse_firmware()
120 bootrec = (struct bootrec *)&bootrec->data[len]; in p54_parse_firmware()
124 wiphy_info(priv->hw->wiphy, in p54_parse_firmware()
125 "FW rev %s - Softmac protocol %x.%x\n", in p54_parse_firmware()
126 fw_version, priv->fw_var >> 8, priv->fw_var & 0xff); in p54_parse_firmware()
127 snprintf(dev->wiphy->fw_version, sizeof(dev->wiphy->fw_version), in p54_parse_firmware()
128 "%s - %x.%x", fw_version, in p54_parse_firmware()
129 priv->fw_var >> 8, priv->fw_var & 0xff); in p54_parse_firmware()
132 if (priv->fw_var < 0x500) in p54_parse_firmware()
133 wiphy_info(priv->hw->wiphy, in p54_parse_firmware()
138 if (priv->fw_var >= 0x300) { in p54_parse_firmware()
141 if (priv->fw_var >= 0x500) { in p54_parse_firmware()
142 priv->tx_stats[P54_QUEUE_AC_VO].limit = 16; in p54_parse_firmware()
143 priv->tx_stats[P54_QUEUE_AC_VI].limit = 16; in p54_parse_firmware()
144 priv->tx_stats[P54_QUEUE_AC_BE].limit = 16; in p54_parse_firmware()
145 priv->tx_stats[P54_QUEUE_AC_BK].limit = 16; in p54_parse_firmware()
147 priv->tx_stats[P54_QUEUE_AC_VO].limit = 3; in p54_parse_firmware()
148 priv->tx_stats[P54_QUEUE_AC_VI].limit = 4; in p54_parse_firmware()
149 priv->tx_stats[P54_QUEUE_AC_BE].limit = 3; in p54_parse_firmware()
150 priv->tx_stats[P54_QUEUE_AC_BK].limit = 2; in p54_parse_firmware()
152 priv->hw->queues = P54_QUEUE_AC_NUM; in p54_parse_firmware()
155 wiphy_info(priv->hw->wiphy, in p54_parse_firmware()
157 (priv->privacy_caps & BR_DESC_PRIV_CAP_WEP) ? "YES" : "no", in p54_parse_firmware()
158 (priv->privacy_caps & in p54_parse_firmware()
161 (priv->privacy_caps & BR_DESC_PRIV_CAP_AESCCMP) in p54_parse_firmware()
164 if (priv->rx_keycache_size) { in p54_parse_firmware()
168 * The firmware provides at most 255 (0 - 254) slots in p54_parse_firmware()
176 priv->used_rxkeys = kcalloc(BITS_TO_LONGS(priv->rx_keycache_size), in p54_parse_firmware()
180 if (!priv->used_rxkeys) in p54_parse_firmware()
181 return -ENOMEM; in p54_parse_firmware()
198 if (unlikely(skb_queue_len(&priv->tx_pending) > 64)) in p54_alloc_skb()
201 skb = __dev_alloc_skb(priv->tx_hdr_len + frame_len, memflags); in p54_alloc_skb()
204 skb_reserve(skb, priv->tx_hdr_len); in p54_alloc_skb()
207 hdr->flags = cpu_to_le16(hdr_flags); in p54_alloc_skb()
208 hdr->len = cpu_to_le16(payload_len); in p54_alloc_skb()
209 hdr->type = cpu_to_le16(type); in p54_alloc_skb()
210 hdr->tries = hdr->rts_tries = 0; in p54_alloc_skb()
223 if (priv->fw_var >= 0x509) in p54_download_eeprom()
232 return -ENOMEM; in p54_download_eeprom()
234 mutex_lock(&priv->eeprom_mutex); in p54_download_eeprom()
235 priv->eeprom = buf; in p54_download_eeprom()
238 if (priv->fw_var < 0x509) { in p54_download_eeprom()
239 eeprom_hdr->v1.offset = cpu_to_le16(offset); in p54_download_eeprom()
240 eeprom_hdr->v1.len = cpu_to_le16(len); in p54_download_eeprom()
242 eeprom_hdr->v2.offset = cpu_to_le32(offset); in p54_download_eeprom()
243 eeprom_hdr->v2.len = cpu_to_le16(len); in p54_download_eeprom()
244 eeprom_hdr->v2.magic2 = 0xf; in p54_download_eeprom()
245 memcpy(eeprom_hdr->v2.magic, (const char *)"LOCK", 4); in p54_download_eeprom()
251 &priv->eeprom_comp, HZ); in p54_download_eeprom()
253 wiphy_err(priv->hw->wiphy, in p54_download_eeprom()
255 ret = -EBUSY; in p54_download_eeprom()
257 priv->eeprom = NULL; in p54_download_eeprom()
258 mutex_unlock(&priv->eeprom_mutex); in p54_download_eeprom()
270 return -ENOMEM; in p54_update_beacon_tim()
273 tim->count = 1; in p54_update_beacon_tim()
274 tim->entry[0] = cpu_to_le16(set ? (aid | 0x8000) : aid); in p54_update_beacon_tim()
287 return -ENOMEM; in p54_sta_unlock()
290 memcpy(sta->addr, addr, ETH_ALEN); in p54_sta_unlock()
301 if (unlikely(_req_id < priv->rx_start || _req_id > priv->rx_end)) in p54_tx_cancel()
302 return -EINVAL; in p54_tx_cancel()
307 return -ENOMEM; in p54_tx_cancel()
310 cancel->req_id = req_id; in p54_tx_cancel()
319 u16 mode; in p54_setup_mac() local
324 return -ENOMEM; in p54_setup_mac()
327 if (!(priv->hw->conf.flags & IEEE80211_CONF_IDLE)) { in p54_setup_mac()
328 switch (priv->mode) { in p54_setup_mac()
330 mode = P54_FILTER_TYPE_STATION; in p54_setup_mac()
333 mode = P54_FILTER_TYPE_AP; in p54_setup_mac()
337 mode = P54_FILTER_TYPE_IBSS; in p54_setup_mac()
340 mode = P54_FILTER_TYPE_PROMISCUOUS; in p54_setup_mac()
343 mode = P54_FILTER_TYPE_HIBERNATE; in p54_setup_mac()
349 * STSW45X0C LMAC API - page 12 in p54_setup_mac()
351 if (priv->filter_flags & FIF_OTHER_BSS && in p54_setup_mac()
352 (mode != P54_FILTER_TYPE_PROMISCUOUS)) in p54_setup_mac()
353 mode |= P54_FILTER_TYPE_TRANSPARENT; in p54_setup_mac()
355 mode = P54_FILTER_TYPE_HIBERNATE; in p54_setup_mac()
358 setup->mac_mode = cpu_to_le16(mode); in p54_setup_mac()
359 memcpy(setup->mac_addr, priv->mac_addr, ETH_ALEN); in p54_setup_mac()
360 memcpy(setup->bssid, priv->bssid, ETH_ALEN); in p54_setup_mac()
361 setup->rx_antenna = 2 & priv->rx_diversity_mask; /* automatic */ in p54_setup_mac()
362 setup->rx_align = 0; in p54_setup_mac()
363 if (priv->fw_var < 0x500) { in p54_setup_mac()
364 setup->v1.basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_setup_mac()
365 memset(setup->v1.rts_rates, 0, 8); in p54_setup_mac()
366 setup->v1.rx_addr = cpu_to_le32(priv->rx_end); in p54_setup_mac()
367 setup->v1.max_rx = cpu_to_le16(priv->rx_mtu); in p54_setup_mac()
368 setup->v1.rxhw = cpu_to_le16(priv->rxhw); in p54_setup_mac()
369 setup->v1.wakeup_timer = cpu_to_le16(priv->wakeup_timer); in p54_setup_mac()
370 setup->v1.unalloc0 = cpu_to_le16(0); in p54_setup_mac()
372 setup->v2.rx_addr = cpu_to_le32(priv->rx_end); in p54_setup_mac()
373 setup->v2.max_rx = cpu_to_le16(priv->rx_mtu); in p54_setup_mac()
374 setup->v2.rxhw = cpu_to_le16(priv->rxhw); in p54_setup_mac()
375 setup->v2.timer = cpu_to_le16(priv->wakeup_timer); in p54_setup_mac()
376 setup->v2.truncate = cpu_to_le16(48896); in p54_setup_mac()
377 setup->v2.basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_setup_mac()
378 setup->v2.sbss_offset = 0; in p54_setup_mac()
379 setup->v2.mcast_window = 0; in p54_setup_mac()
380 setup->v2.rx_rssi_threshold = 0; in p54_setup_mac()
381 setup->v2.rx_ed_threshold = 0; in p54_setup_mac()
382 setup->v2.ref_clock = cpu_to_le32(644245094); in p54_setup_mac()
383 setup->v2.lpf_bandwidth = cpu_to_le16(65535); in p54_setup_mac()
384 setup->v2.osc_start_delay = cpu_to_le16(65535); in p54_setup_mac()
387 priv->phy_idle = mode == P54_FILTER_TYPE_HIBERNATE; in p54_setup_mac()
391 int p54_scan(struct p54_common *priv, u16 mode, u16 dwell) in p54_scan() argument
403 __le16 freq = cpu_to_le16(priv->hw->conf.chandef.chan->center_freq); in p54_scan()
410 return -ENOMEM; in p54_scan()
413 memset(head->scan_params, 0, sizeof(head->scan_params)); in p54_scan()
414 head->mode = cpu_to_le16(mode); in p54_scan()
415 head->dwell = cpu_to_le16(dwell); in p54_scan()
416 head->freq = freq; in p54_scan()
418 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
424 for (i = 0; i < priv->iq_autocal_len; i++) { in p54_scan()
425 if (priv->iq_autocal[i].freq != freq) in p54_scan()
428 memcpy(iq_autocal, &priv->iq_autocal[i].params, in p54_scan()
432 if (i == priv->iq_autocal_len) in p54_scan()
435 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) in p54_scan()
436 body = skb_put(skb, sizeof(body->longbow)); in p54_scan()
438 body = skb_put(skb, sizeof(body->normal)); in p54_scan()
440 for (i = 0; i < priv->output_limit->entries; i++) { in p54_scan()
441 __le16 *entry_freq = (void *) (priv->output_limit->data + in p54_scan()
442 priv->output_limit->entry_size * i); in p54_scan()
447 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
448 memcpy(&body->longbow.power_limits, in p54_scan()
450 priv->output_limit->entry_size); in p54_scan()
455 body->normal.val_barker = 0x38; in p54_scan()
456 body->normal.val_bpsk = body->normal.dup_bpsk = in p54_scan()
457 limits->val_bpsk; in p54_scan()
458 body->normal.val_qpsk = body->normal.dup_qpsk = in p54_scan()
459 limits->val_qpsk; in p54_scan()
460 body->normal.val_16qam = body->normal.dup_16qam = in p54_scan()
461 limits->val_16qam; in p54_scan()
462 body->normal.val_64qam = body->normal.dup_64qam = in p54_scan()
463 limits->val_64qam; in p54_scan()
467 if (i == priv->output_limit->entries) in p54_scan()
470 entry = (void *)(priv->curve_data->data + priv->curve_data->offset); in p54_scan()
471 for (i = 0; i < priv->curve_data->entries; i++) { in p54_scan()
473 entry += priv->curve_data->entry_size; in p54_scan()
477 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
478 memcpy(&body->longbow.curve_data, in p54_scan()
480 priv->curve_data->entry_size); in p54_scan()
482 struct p54_scan_body *chan = &body->normal; in p54_scan()
484 (void *) priv->curve_data->data; in p54_scan()
487 chan->pa_points_per_curve = 8; in p54_scan()
488 memset(chan->curve_data, 0, sizeof(chan->curve_data)); in p54_scan()
489 memcpy(chan->curve_data, entry, in p54_scan()
491 min((u8)8, curve_data->points_per_channel)); in p54_scan()
495 if (i == priv->curve_data->entries) in p54_scan()
498 if ((priv->fw_var >= 0x500) && (priv->fw_var < 0x509)) { in p54_scan()
500 rate->basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_scan()
501 for (i = 0; i < sizeof(rate->rts_rates); i++) in p54_scan()
502 rate->rts_rates[i] = i; in p54_scan()
507 rssi->mul = cpu_to_le16(rssi_data->mul); in p54_scan()
508 rssi->add = cpu_to_le16(rssi_data->add); in p54_scan()
509 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
512 rssi->mul = cpu_to_le16(rssi_data->longbow_unkn); in p54_scan()
513 rssi->add = cpu_to_le16(rssi_data->longbow_unk2); in p54_scan()
516 if (priv->fw_var >= 0x509) { in p54_scan()
518 rate->basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_scan()
519 for (i = 0; i < sizeof(rate->rts_rates); i++) in p54_scan()
520 rate->rts_rates[i] = i; in p54_scan()
523 hdr = (struct p54_hdr *) skb->data; in p54_scan()
524 hdr->len = cpu_to_le16(skb->len - sizeof(*hdr)); in p54_scan()
527 priv->cur_rssi = rssi_data; in p54_scan()
531 wiphy_err(priv->hw->wiphy, "frequency change to channel %d failed.\n", in p54_scan()
533 priv->hw->conf.chandef.chan->center_freq)); in p54_scan()
536 return -EINVAL; in p54_scan()
547 return -ENOMEM; in p54_set_leds()
550 led->flags = cpu_to_le16(0x0003); in p54_set_leds()
551 led->mask[0] = led->mask[1] = cpu_to_le16(priv->softled_state); in p54_set_leds()
552 led->delay[0] = cpu_to_le16(1); in p54_set_leds()
553 led->delay[1] = cpu_to_le16(0); in p54_set_leds()
567 return -ENOMEM; in p54_set_edcf()
570 if (priv->use_short_slot) { in p54_set_edcf()
571 edcf->slottime = 9; in p54_set_edcf()
572 edcf->sifs = 0x10; in p54_set_edcf()
573 edcf->eofpad = 0x00; in p54_set_edcf()
575 edcf->slottime = 20; in p54_set_edcf()
576 edcf->sifs = 0x0a; in p54_set_edcf()
577 edcf->eofpad = 0x06; in p54_set_edcf()
581 * formula from 802.11-2007 17.3.8.6. in p54_set_edcf()
583 rtd = 3 * priv->coverage_class; in p54_set_edcf()
584 edcf->slottime += rtd; in p54_set_edcf()
585 edcf->round_trip_delay = cpu_to_le16(rtd); in p54_set_edcf()
587 edcf->frameburst = cpu_to_le16(0); in p54_set_edcf()
588 edcf->flags = 0; in p54_set_edcf()
589 memset(edcf->mapping, 0, sizeof(edcf->mapping)); in p54_set_edcf()
590 memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); in p54_set_edcf()
600 u16 mode; in p54_set_ps() local
602 if (priv->hw->conf.flags & IEEE80211_CONF_PS && in p54_set_ps()
603 !priv->powersave_override) in p54_set_ps()
604 mode = P54_PSM | P54_PSM_BEACON_TIMEOUT | P54_PSM_DTIM | in p54_set_ps()
607 mode = P54_PSM_CAM; in p54_set_ps()
612 return -ENOMEM; in p54_set_ps()
615 psm->mode = cpu_to_le16(mode); in p54_set_ps()
616 psm->aid = cpu_to_le16(priv->aid); in p54_set_ps()
617 for (i = 0; i < ARRAY_SIZE(psm->intervals); i++) { in p54_set_ps()
618 psm->intervals[i].interval = in p54_set_ps()
619 cpu_to_le16(priv->hw->conf.listen_interval); in p54_set_ps()
620 psm->intervals[i].periods = cpu_to_le16(1); in p54_set_ps()
623 psm->beacon_rssi_skip_max = 200; in p54_set_ps()
624 psm->rssi_delta_threshold = 0; in p54_set_ps()
625 psm->nr = 1; in p54_set_ps()
626 psm->exclude[0] = WLAN_EID_TIM; in p54_set_ps()
629 priv->phy_ps = mode != P54_PSM_CAM; in p54_set_ps()
641 return -ENOMEM; in p54_init_xbow_synth()
644 xbow->magic1 = cpu_to_le16(0x1); in p54_init_xbow_synth()
645 xbow->magic2 = cpu_to_le16(0x2); in p54_init_xbow_synth()
646 xbow->freq = cpu_to_le16(5390); in p54_init_xbow_synth()
647 memset(xbow->padding, 0, sizeof(xbow->padding)); in p54_init_xbow_synth()
661 return -ENOMEM; in p54_upload_key()
664 rxkey->entry = slot; in p54_upload_key()
665 rxkey->key_id = idx; in p54_upload_key()
666 rxkey->key_type = algo; in p54_upload_key()
668 memcpy(rxkey->mac, addr, ETH_ALEN); in p54_upload_key()
670 eth_broadcast_addr(rxkey->mac); in p54_upload_key()
675 rxkey->key_len = min_t(u8, 16, len); in p54_upload_key()
676 memcpy(rxkey->key, key, rxkey->key_len); in p54_upload_key()
680 rxkey->key_len = 24; in p54_upload_key()
681 memcpy(rxkey->key, key, 16); in p54_upload_key()
682 memcpy(&(rxkey->key[16]), &(key in p54_upload_key()
687 rxkey->key_len = 0; in p54_upload_key()
688 memset(rxkey->key, 0, sizeof(rxkey->key)); in p54_upload_key()
692 wiphy_err(priv->hw->wiphy, in p54_upload_key()
695 return -EINVAL; in p54_upload_key()
712 return -ENOMEM; in p54_fetch_statistics()
720 * Instead the extra frame length -which will hold the results later- in p54_fetch_statistics()
725 p54info = (void *) txinfo->rate_driver_data; in p54_fetch_statistics()
726 p54info->extra_len = sizeof(struct p54_statistics); in p54_fetch_statistics()
741 return -ENOMEM; in p54_set_groupfilter()
745 on = !(priv->filter_flags & FIF_ALLMULTI) && in p54_set_groupfilter()
746 (priv->mc_maclist_num > 0 && in p54_set_groupfilter()
747 priv->mc_maclist_num <= MC_FILTER_ADDRESS_NUM); in p54_set_groupfilter()
750 grp->filter_enable = cpu_to_le16(1); in p54_set_groupfilter()
751 grp->num_address = cpu_to_le16(priv->mc_maclist_num); in p54_set_groupfilter()
752 memcpy(grp->mac_list, priv->mc_maclist, sizeof(grp->mac_list)); in p54_set_groupfilter()
754 grp->filter_enable = cpu_to_le16(0); in p54_set_groupfilter()
755 grp->num_address = cpu_to_le16(0); in p54_set_groupfilter()
756 memset(grp->mac_list, 0, sizeof(grp->mac_list)); in p54_set_groupfilter()