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 "%.19s - %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 = bitmap_zalloc(priv->rx_keycache_size, in p54_parse_firmware()
178 if (!priv->used_rxkeys) in p54_parse_firmware()
179 return -ENOMEM; in p54_parse_firmware()
196 if (unlikely(skb_queue_len(&priv->tx_pending) > 64)) in p54_alloc_skb()
199 skb = __dev_alloc_skb(priv->tx_hdr_len + frame_len, memflags); in p54_alloc_skb()
202 skb_reserve(skb, priv->tx_hdr_len); in p54_alloc_skb()
205 hdr->flags = cpu_to_le16(hdr_flags); in p54_alloc_skb()
206 hdr->len = cpu_to_le16(payload_len); in p54_alloc_skb()
207 hdr->type = cpu_to_le16(type); in p54_alloc_skb()
208 hdr->tries = hdr->rts_tries = 0; in p54_alloc_skb()
221 if (priv->fw_var >= 0x509) in p54_download_eeprom()
230 return -ENOMEM; in p54_download_eeprom()
232 mutex_lock(&priv->eeprom_mutex); in p54_download_eeprom()
233 priv->eeprom = buf; in p54_download_eeprom()
236 if (priv->fw_var < 0x509) { in p54_download_eeprom()
237 eeprom_hdr->v1.offset = cpu_to_le16(offset); in p54_download_eeprom()
238 eeprom_hdr->v1.len = cpu_to_le16(len); in p54_download_eeprom()
240 eeprom_hdr->v2.offset = cpu_to_le32(offset); in p54_download_eeprom()
241 eeprom_hdr->v2.len = cpu_to_le16(len); in p54_download_eeprom()
242 eeprom_hdr->v2.magic2 = 0xf; in p54_download_eeprom()
243 memcpy(eeprom_hdr->v2.magic, (const char *)"LOCK", 4); in p54_download_eeprom()
249 &priv->eeprom_comp, HZ); in p54_download_eeprom()
251 wiphy_err(priv->hw->wiphy, in p54_download_eeprom()
253 ret = -EBUSY; in p54_download_eeprom()
255 priv->eeprom = NULL; in p54_download_eeprom()
256 mutex_unlock(&priv->eeprom_mutex); in p54_download_eeprom()
268 return -ENOMEM; in p54_update_beacon_tim()
271 tim->count = 1; in p54_update_beacon_tim()
272 tim->entry[0] = cpu_to_le16(set ? (aid | 0x8000) : aid); in p54_update_beacon_tim()
285 return -ENOMEM; in p54_sta_unlock()
288 memcpy(sta->addr, addr, ETH_ALEN); in p54_sta_unlock()
299 if (unlikely(_req_id < priv->rx_start || _req_id > priv->rx_end)) in p54_tx_cancel()
300 return -EINVAL; in p54_tx_cancel()
305 return -ENOMEM; in p54_tx_cancel()
308 cancel->req_id = req_id; in p54_tx_cancel()
317 u16 mode; in p54_setup_mac() local
322 return -ENOMEM; in p54_setup_mac()
325 if (!(priv->hw->conf.flags & IEEE80211_CONF_IDLE)) { in p54_setup_mac()
326 switch (priv->mode) { in p54_setup_mac()
328 mode = P54_FILTER_TYPE_STATION; in p54_setup_mac()
331 mode = P54_FILTER_TYPE_AP; in p54_setup_mac()
335 mode = P54_FILTER_TYPE_IBSS; in p54_setup_mac()
338 mode = P54_FILTER_TYPE_PROMISCUOUS; in p54_setup_mac()
341 mode = P54_FILTER_TYPE_HIBERNATE; in p54_setup_mac()
347 * STSW45X0C LMAC API - page 12 in p54_setup_mac()
349 if (priv->filter_flags & FIF_OTHER_BSS && in p54_setup_mac()
350 (mode != P54_FILTER_TYPE_PROMISCUOUS)) in p54_setup_mac()
351 mode |= P54_FILTER_TYPE_TRANSPARENT; in p54_setup_mac()
353 mode = P54_FILTER_TYPE_HIBERNATE; in p54_setup_mac()
356 setup->mac_mode = cpu_to_le16(mode); in p54_setup_mac()
357 memcpy(setup->mac_addr, priv->mac_addr, ETH_ALEN); in p54_setup_mac()
358 memcpy(setup->bssid, priv->bssid, ETH_ALEN); in p54_setup_mac()
359 setup->rx_antenna = 2 & priv->rx_diversity_mask; /* automatic */ in p54_setup_mac()
360 setup->rx_align = 0; in p54_setup_mac()
361 if (priv->fw_var < 0x500) { in p54_setup_mac()
362 setup->v1.basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_setup_mac()
363 memset(setup->v1.rts_rates, 0, 8); in p54_setup_mac()
364 setup->v1.rx_addr = cpu_to_le32(priv->rx_end); in p54_setup_mac()
365 setup->v1.max_rx = cpu_to_le16(priv->rx_mtu); in p54_setup_mac()
366 setup->v1.rxhw = cpu_to_le16(priv->rxhw); in p54_setup_mac()
367 setup->v1.wakeup_timer = cpu_to_le16(priv->wakeup_timer); in p54_setup_mac()
368 setup->v1.unalloc0 = cpu_to_le16(0); in p54_setup_mac()
370 setup->v2.rx_addr = cpu_to_le32(priv->rx_end); in p54_setup_mac()
371 setup->v2.max_rx = cpu_to_le16(priv->rx_mtu); in p54_setup_mac()
372 setup->v2.rxhw = cpu_to_le16(priv->rxhw); in p54_setup_mac()
373 setup->v2.timer = cpu_to_le16(priv->wakeup_timer); in p54_setup_mac()
374 setup->v2.truncate = cpu_to_le16(48896); in p54_setup_mac()
375 setup->v2.basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_setup_mac()
376 setup->v2.sbss_offset = 0; in p54_setup_mac()
377 setup->v2.mcast_window = 0; in p54_setup_mac()
378 setup->v2.rx_rssi_threshold = 0; in p54_setup_mac()
379 setup->v2.rx_ed_threshold = 0; in p54_setup_mac()
380 setup->v2.ref_clock = cpu_to_le32(644245094); in p54_setup_mac()
381 setup->v2.lpf_bandwidth = cpu_to_le16(65535); in p54_setup_mac()
382 setup->v2.osc_start_delay = cpu_to_le16(65535); in p54_setup_mac()
385 priv->phy_idle = mode == P54_FILTER_TYPE_HIBERNATE; in p54_setup_mac()
389 int p54_scan(struct p54_common *priv, u16 mode, u16 dwell) in p54_scan() argument
401 __le16 freq = cpu_to_le16(priv->hw->conf.chandef.chan->center_freq); in p54_scan()
408 return -ENOMEM; in p54_scan()
411 memset(head->scan_params, 0, sizeof(head->scan_params)); in p54_scan()
412 head->mode = cpu_to_le16(mode); in p54_scan()
413 head->dwell = cpu_to_le16(dwell); in p54_scan()
414 head->freq = freq; in p54_scan()
416 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
422 for (i = 0; i < priv->iq_autocal_len; i++) { in p54_scan()
423 if (priv->iq_autocal[i].freq != freq) in p54_scan()
426 memcpy(iq_autocal, &priv->iq_autocal[i].params, in p54_scan()
430 if (i == priv->iq_autocal_len) in p54_scan()
433 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) in p54_scan()
434 body = skb_put(skb, sizeof(body->longbow)); in p54_scan()
436 body = skb_put(skb, sizeof(body->normal)); in p54_scan()
438 for (i = 0; i < priv->output_limit->entries; i++) { in p54_scan()
439 __le16 *entry_freq = (void *) (priv->output_limit->data + in p54_scan()
440 priv->output_limit->entry_size * i); in p54_scan()
445 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
446 memcpy(&body->longbow.power_limits, in p54_scan()
448 priv->output_limit->entry_size); in p54_scan()
453 body->normal.val_barker = 0x38; in p54_scan()
454 body->normal.val_bpsk = body->normal.dup_bpsk = in p54_scan()
455 limits->val_bpsk; in p54_scan()
456 body->normal.val_qpsk = body->normal.dup_qpsk = in p54_scan()
457 limits->val_qpsk; in p54_scan()
458 body->normal.val_16qam = body->normal.dup_16qam = in p54_scan()
459 limits->val_16qam; in p54_scan()
460 body->normal.val_64qam = body->normal.dup_64qam = in p54_scan()
461 limits->val_64qam; in p54_scan()
465 if (i == priv->output_limit->entries) in p54_scan()
468 entry = (void *)(priv->curve_data->data + priv->curve_data->offset); in p54_scan()
469 for (i = 0; i < priv->curve_data->entries; i++) { in p54_scan()
471 entry += priv->curve_data->entry_size; in p54_scan()
475 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
476 memcpy(&body->longbow.curve_data, in p54_scan()
478 priv->curve_data->entry_size); in p54_scan()
480 struct p54_scan_body *chan = &body->normal; in p54_scan()
482 (void *) priv->curve_data->data; in p54_scan()
485 chan->pa_points_per_curve = 8; in p54_scan()
486 memset(chan->curve_data, 0, sizeof(chan->curve_data)); in p54_scan()
487 memcpy(chan->curve_data, entry, in p54_scan()
489 min((u8)8, curve_data->points_per_channel)); in p54_scan()
493 if (i == priv->curve_data->entries) in p54_scan()
496 if ((priv->fw_var >= 0x500) && (priv->fw_var < 0x509)) { in p54_scan()
498 rate->basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_scan()
499 for (i = 0; i < sizeof(rate->rts_rates); i++) in p54_scan()
500 rate->rts_rates[i] = i; in p54_scan()
505 rssi->mul = cpu_to_le16(rssi_data->mul); in p54_scan()
506 rssi->add = cpu_to_le16(rssi_data->add); in p54_scan()
507 if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { in p54_scan()
510 rssi->mul = cpu_to_le16(rssi_data->longbow_unkn); in p54_scan()
511 rssi->add = cpu_to_le16(rssi_data->longbow_unk2); in p54_scan()
514 if (priv->fw_var >= 0x509) { in p54_scan()
516 rate->basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); in p54_scan()
517 for (i = 0; i < sizeof(rate->rts_rates); i++) in p54_scan()
518 rate->rts_rates[i] = i; in p54_scan()
521 hdr = (struct p54_hdr *) skb->data; in p54_scan()
522 hdr->len = cpu_to_le16(skb->len - sizeof(*hdr)); in p54_scan()
525 priv->cur_rssi = rssi_data; in p54_scan()
529 wiphy_err(priv->hw->wiphy, "frequency change to channel %d failed.\n", in p54_scan()
531 priv->hw->conf.chandef.chan->center_freq)); in p54_scan()
534 return -EINVAL; in p54_scan()
545 return -ENOMEM; in p54_set_leds()
548 led->flags = cpu_to_le16(0x0003); in p54_set_leds()
549 led->mask[0] = led->mask[1] = cpu_to_le16(priv->softled_state); in p54_set_leds()
550 led->delay[0] = cpu_to_le16(1); in p54_set_leds()
551 led->delay[1] = cpu_to_le16(0); in p54_set_leds()
565 return -ENOMEM; in p54_set_edcf()
568 if (priv->use_short_slot) { in p54_set_edcf()
569 edcf->slottime = 9; in p54_set_edcf()
570 edcf->sifs = 0x10; in p54_set_edcf()
571 edcf->eofpad = 0x00; in p54_set_edcf()
573 edcf->slottime = 20; in p54_set_edcf()
574 edcf->sifs = 0x0a; in p54_set_edcf()
575 edcf->eofpad = 0x06; in p54_set_edcf()
579 * formula from 802.11-2007 17.3.8.6. in p54_set_edcf()
581 rtd = 3 * priv->coverage_class; in p54_set_edcf()
582 edcf->slottime += rtd; in p54_set_edcf()
583 edcf->round_trip_delay = cpu_to_le16(rtd); in p54_set_edcf()
585 edcf->frameburst = cpu_to_le16(0); in p54_set_edcf()
586 edcf->flags = 0; in p54_set_edcf()
587 memset(edcf->mapping, 0, sizeof(edcf->mapping)); in p54_set_edcf()
588 memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); in p54_set_edcf()
598 u16 mode; in p54_set_ps() local
600 if (priv->hw->conf.flags & IEEE80211_CONF_PS && in p54_set_ps()
601 !priv->powersave_override) in p54_set_ps()
602 mode = P54_PSM | P54_PSM_BEACON_TIMEOUT | P54_PSM_DTIM | in p54_set_ps()
605 mode = P54_PSM_CAM; in p54_set_ps()
610 return -ENOMEM; in p54_set_ps()
613 psm->mode = cpu_to_le16(mode); in p54_set_ps()
614 psm->aid = cpu_to_le16(priv->aid); in p54_set_ps()
615 for (i = 0; i < ARRAY_SIZE(psm->intervals); i++) { in p54_set_ps()
616 psm->intervals[i].interval = in p54_set_ps()
617 cpu_to_le16(priv->hw->conf.listen_interval); in p54_set_ps()
618 psm->intervals[i].periods = cpu_to_le16(1); in p54_set_ps()
621 psm->beacon_rssi_skip_max = 200; in p54_set_ps()
622 psm->rssi_delta_threshold = 0; in p54_set_ps()
623 psm->nr = 1; in p54_set_ps()
624 psm->exclude[0] = WLAN_EID_TIM; in p54_set_ps()
627 priv->phy_ps = mode != P54_PSM_CAM; in p54_set_ps()
639 return -ENOMEM; in p54_init_xbow_synth()
642 xbow->magic1 = cpu_to_le16(0x1); in p54_init_xbow_synth()
643 xbow->magic2 = cpu_to_le16(0x2); in p54_init_xbow_synth()
644 xbow->freq = cpu_to_le16(5390); in p54_init_xbow_synth()
645 memset(xbow->padding, 0, sizeof(xbow->padding)); in p54_init_xbow_synth()
659 return -ENOMEM; in p54_upload_key()
662 rxkey->entry = slot; in p54_upload_key()
663 rxkey->key_id = idx; in p54_upload_key()
664 rxkey->key_type = algo; in p54_upload_key()
666 memcpy(rxkey->mac, addr, ETH_ALEN); in p54_upload_key()
668 eth_broadcast_addr(rxkey->mac); in p54_upload_key()
673 rxkey->key_len = min_t(u8, 16, len); in p54_upload_key()
674 memcpy(rxkey->key, key, rxkey->key_len); in p54_upload_key()
678 rxkey->key_len = 24; in p54_upload_key()
679 memcpy(rxkey->key, key, 16); in p54_upload_key()
680 memcpy(&(rxkey->key[16]), &(key in p54_upload_key()
685 rxkey->key_len = 0; in p54_upload_key()
686 memset(rxkey->key, 0, sizeof(rxkey->key)); in p54_upload_key()
690 wiphy_err(priv->hw->wiphy, in p54_upload_key()
693 return -EINVAL; in p54_upload_key()
710 return -ENOMEM; in p54_fetch_statistics()
718 * Instead the extra frame length -which will hold the results later- in p54_fetch_statistics()
723 p54info = (void *) txinfo->rate_driver_data; in p54_fetch_statistics()
724 p54info->extra_len = sizeof(struct p54_statistics); in p54_fetch_statistics()
739 return -ENOMEM; in p54_set_groupfilter()
743 on = !(priv->filter_flags & FIF_ALLMULTI) && in p54_set_groupfilter()
744 (priv->mc_maclist_num > 0 && in p54_set_groupfilter()
745 priv->mc_maclist_num <= MC_FILTER_ADDRESS_NUM); in p54_set_groupfilter()
748 grp->filter_enable = cpu_to_le16(1); in p54_set_groupfilter()
749 grp->num_address = cpu_to_le16(priv->mc_maclist_num); in p54_set_groupfilter()
750 memcpy(grp->mac_list, priv->mc_maclist, sizeof(grp->mac_list)); in p54_set_groupfilter()
752 grp->filter_enable = cpu_to_le16(0); in p54_set_groupfilter()
753 grp->num_address = cpu_to_le16(0); in p54_set_groupfilter()
754 memset(grp->mac_list, 0, sizeof(grp->mac_list)); in p54_set_groupfilter()