Lines Matching +full:ieee80211 +full:- +full:freq +full:- +full:limit

1 // SPDX-License-Identifier: GPL-2.0-only
7 * Copyright (c) 2004-2007, Michael Wu <[email protected]>
11 * Much thanks to Infineon-ADMtek for their support of this driver.
76 struct adm8211_priv *priv = eeprom->data; in adm8211_eeprom_register_read()
79 eeprom->reg_data_in = reg & ADM8211_SPR_SDI; in adm8211_eeprom_register_read()
80 eeprom->reg_data_out = reg & ADM8211_SPR_SDO; in adm8211_eeprom_register_read()
81 eeprom->reg_data_clock = reg & ADM8211_SPR_SCLK; in adm8211_eeprom_register_read()
82 eeprom->reg_chip_select = reg & ADM8211_SPR_SCS; in adm8211_eeprom_register_read()
87 struct adm8211_priv *priv = eeprom->data; in adm8211_eeprom_register_write()
90 if (eeprom->reg_data_in) in adm8211_eeprom_register_write()
92 if (eeprom->reg_data_out) in adm8211_eeprom_register_write()
94 if (eeprom->reg_data_clock) in adm8211_eeprom_register_write()
96 if (eeprom->reg_chip_select) in adm8211_eeprom_register_write()
105 struct adm8211_priv *priv = dev->priv; in adm8211_read_eeprom()
116 /* 256 * 16-bit = 512 bytes */ in adm8211_read_eeprom()
120 /* 64 * 16-bit = 128 bytes */ in adm8211_read_eeprom()
125 priv->eeprom_len = words * 2; in adm8211_read_eeprom()
126 priv->eeprom = kmalloc(priv->eeprom_len, GFP_KERNEL); in adm8211_read_eeprom()
127 if (!priv->eeprom) in adm8211_read_eeprom()
128 return -ENOMEM; in adm8211_read_eeprom()
130 eeprom_93cx6_multiread(&eeprom, 0, (__le16 *)priv->eeprom, words); in adm8211_read_eeprom()
132 cr49 = le16_to_cpu(priv->eeprom->cr49); in adm8211_read_eeprom()
133 priv->rf_type = (cr49 >> 3) & 0x7; in adm8211_read_eeprom()
134 switch (priv->rf_type) { in adm8211_read_eeprom()
143 if (priv->pdev->revision < ADM8211_REV_CA) in adm8211_read_eeprom()
144 priv->rf_type = ADM8211_TYPE_RFMD; in adm8211_read_eeprom()
146 priv->rf_type = ADM8211_TYPE_AIROHA; in adm8211_read_eeprom()
149 pci_name(priv->pdev), (cr49 >> 3) & 0x7); in adm8211_read_eeprom()
152 priv->bbp_type = cr49 & 0x7; in adm8211_read_eeprom()
153 switch (priv->bbp_type) { in adm8211_read_eeprom()
161 if (priv->pdev->revision < ADM8211_REV_CA) in adm8211_read_eeprom()
162 priv->bbp_type = ADM8211_TYPE_RFMD; in adm8211_read_eeprom()
164 priv->bbp_type = ADM8211_TYPE_ADMTEK; in adm8211_read_eeprom()
167 pci_name(priv->pdev), cr49 >> 3); in adm8211_read_eeprom()
170 if (priv->eeprom->country_code >= ARRAY_SIZE(cranges)) { in adm8211_read_eeprom()
172 pci_name(priv->pdev), priv->eeprom->country_code); in adm8211_read_eeprom()
176 chan_range = cranges[priv->eeprom->country_code]; in adm8211_read_eeprom()
178 printk(KERN_DEBUG "%s (adm8211): Channel range: %d - %d\n", in adm8211_read_eeprom()
179 pci_name(priv->pdev), (int)chan_range.min, (int)chan_range.max); in adm8211_read_eeprom()
181 BUILD_BUG_ON(sizeof(priv->channels) != sizeof(adm8211_channels)); in adm8211_read_eeprom()
183 memcpy(priv->channels, adm8211_channels, sizeof(priv->channels)); in adm8211_read_eeprom()
184 priv->band.channels = priv->channels; in adm8211_read_eeprom()
185 priv->band.n_channels = ARRAY_SIZE(adm8211_channels); in adm8211_read_eeprom()
186 priv->band.bitrates = adm8211_rates; in adm8211_read_eeprom()
187 priv->band.n_bitrates = ARRAY_SIZE(adm8211_rates); in adm8211_read_eeprom()
191 priv->channels[i - 1].flags |= IEEE80211_CHAN_DISABLED; in adm8211_read_eeprom()
193 switch (priv->eeprom->specific_bbptype) { in adm8211_read_eeprom()
197 priv->specific_bbptype = priv->eeprom->specific_bbptype; in adm8211_read_eeprom()
201 if (priv->pdev->revision < ADM8211_REV_CA) in adm8211_read_eeprom()
202 priv->specific_bbptype = ADM8211_BBP_RFMD3000; in adm8211_read_eeprom()
204 priv->specific_bbptype = ADM8211_BBP_ADM8011; in adm8211_read_eeprom()
207 pci_name(priv->pdev), priv->eeprom->specific_bbptype); in adm8211_read_eeprom()
210 switch (priv->eeprom->specific_rftype) { in adm8211_read_eeprom()
216 priv->transceiver_type = priv->eeprom->specific_rftype; in adm8211_read_eeprom()
220 if (priv->pdev->revision == ADM8211_REV_BA) in adm8211_read_eeprom()
221 priv->transceiver_type = ADM8211_RFMD2958_RF3000_CONTROL_POWER; in adm8211_read_eeprom()
222 else if (priv->pdev->revision == ADM8211_REV_CA) in adm8211_read_eeprom()
223 priv->transceiver_type = ADM8211_AL2210L; in adm8211_read_eeprom()
224 else if (priv->pdev->revision == ADM8211_REV_AB) in adm8211_read_eeprom()
225 priv->transceiver_type = ADM8211_RFMD2948; in adm8211_read_eeprom()
228 pci_name(priv->pdev), priv->eeprom->specific_rftype); in adm8211_read_eeprom()
234 "Transceiver=%d\n", pci_name(priv->pdev), priv->rf_type, in adm8211_read_eeprom()
235 priv->bbp_type, priv->specific_bbptype, priv->transceiver_type); in adm8211_read_eeprom()
243 struct adm8211_priv *priv = dev->priv; in adm8211_write_sram()
246 (priv->pdev->revision < ADM8211_REV_BA ? in adm8211_write_sram()
260 struct adm8211_priv *priv = dev->priv; in adm8211_write_sram_bytes()
264 if (priv->pdev->revision < ADM8211_REV_BA) { in adm8211_write_sram_bytes()
282 struct adm8211_priv *priv = dev->priv; in adm8211_clear_sram()
295 struct adm8211_priv *priv = dev->priv; in adm8211_get_stats()
297 memcpy(stats, &priv->stats, sizeof(*stats)); in adm8211_get_stats()
304 struct adm8211_priv *priv = dev->priv; in adm8211_interrupt_tci()
307 spin_lock(&priv->lock); in adm8211_interrupt_tci()
309 for (dirty_tx = priv->dirty_tx; priv->cur_tx - dirty_tx; dirty_tx++) { in adm8211_interrupt_tci()
310 unsigned int entry = dirty_tx % priv->tx_ring_size; in adm8211_interrupt_tci()
311 u32 status = le32_to_cpu(priv->tx_ring[entry].status); in adm8211_interrupt_tci()
320 info = &priv->tx_buffers[entry]; in adm8211_interrupt_tci()
321 skb = info->skb; in adm8211_interrupt_tci()
326 dma_unmap_single(&priv->pdev->dev, info->mapping, in adm8211_interrupt_tci()
327 info->skb->len, DMA_TO_DEVICE); in adm8211_interrupt_tci()
332 memcpy(skb_push(skb, info->hdrlen), skb->cb, info->hdrlen); in adm8211_interrupt_tci()
333 if (!(txi->flags & IEEE80211_TX_CTL_NO_ACK) && in adm8211_interrupt_tci()
335 txi->flags |= IEEE80211_TX_STAT_ACK; in adm8211_interrupt_tci()
339 info->skb = NULL; in adm8211_interrupt_tci()
342 if (priv->cur_tx - dirty_tx < priv->tx_ring_size - 2) in adm8211_interrupt_tci()
345 priv->dirty_tx = dirty_tx; in adm8211_interrupt_tci()
346 spin_unlock(&priv->lock); in adm8211_interrupt_tci()
352 struct adm8211_priv *priv = dev->priv; in adm8211_interrupt_rci()
353 unsigned int entry = priv->cur_rx % priv->rx_ring_size; in adm8211_interrupt_rci()
357 unsigned int limit = priv->rx_ring_size; in adm8211_interrupt_rci() local
360 while (!(priv->rx_ring[entry].status & cpu_to_le32(RDES0_STATUS_OWN))) { in adm8211_interrupt_rci()
361 if (!limit--) in adm8211_interrupt_rci()
364 status = le32_to_cpu(priv->rx_ring[entry].status); in adm8211_interrupt_rci()
366 rssi = le32_to_cpu(priv->rx_ring[entry].length) & in adm8211_interrupt_rci()
372 wiphy_debug(dev->wiphy, "frame too long (%d)\n", in adm8211_interrupt_rci()
377 if (!priv->soft_rx_crc && status & RDES0_STATUS_ES) { in adm8211_interrupt_rci()
384 dma_sync_single_for_cpu(&priv->pdev->dev, in adm8211_interrupt_rci()
385 priv->rx_buffers[entry].mapping, in adm8211_interrupt_rci()
389 skb_tail_pointer(priv->rx_buffers[entry].skb), in adm8211_interrupt_rci()
391 dma_sync_single_for_device(&priv->pdev->dev, in adm8211_interrupt_rci()
392 priv->rx_buffers[entry].mapping, in adm8211_interrupt_rci()
399 skb = priv->rx_buffers[entry].skb; in adm8211_interrupt_rci()
401 dma_unmap_single(&priv->pdev->dev, in adm8211_interrupt_rci()
402 priv->rx_buffers[entry].mapping, in adm8211_interrupt_rci()
404 priv->rx_buffers[entry].skb = newskb; in adm8211_interrupt_rci()
405 priv->rx_buffers[entry].mapping = in adm8211_interrupt_rci()
406 dma_map_single(&priv->pdev->dev, in adm8211_interrupt_rci()
410 if (dma_mapping_error(&priv->pdev->dev, in adm8211_interrupt_rci()
411 priv->rx_buffers[entry].mapping)) { in adm8211_interrupt_rci()
412 priv->rx_buffers[entry].skb = NULL; in adm8211_interrupt_rci()
422 priv->rx_ring[entry].buffer1 = in adm8211_interrupt_rci()
423 cpu_to_le32(priv->rx_buffers[entry].mapping); in adm8211_interrupt_rci()
426 priv->rx_ring[entry].status = cpu_to_le32(RDES0_STATUS_OWN | in adm8211_interrupt_rci()
428 priv->rx_ring[entry].length = in adm8211_interrupt_rci()
430 (entry == priv->rx_ring_size - 1 ? in adm8211_interrupt_rci()
436 if (priv->pdev->revision < ADM8211_REV_CA) in adm8211_interrupt_rci()
439 rx_status.signal = 100 - rssi; in adm8211_interrupt_rci()
443 rx_status.freq = adm8211_channels[priv->channel - 1].center_freq; in adm8211_interrupt_rci()
450 entry = (++priv->cur_rx) % priv->rx_ring_size; in adm8211_interrupt_rci()
462 wiphy_debug(dev->wiphy, "%s\n", #x); \ in adm8211_interrupt()
466 struct adm8211_priv *priv = dev->priv; in adm8211_interrupt()
506 struct adm8211_priv *priv = dev->priv; \
525 if (bitbuf & (1 << (bits - i))) \
561 struct adm8211_priv *priv = dev->priv; in adm8211_write_bbp()
570 timeout--; in adm8211_write_bbp()
575 wiphy_debug(dev->wiphy, in adm8211_write_bbp()
578 return -ETIMEDOUT; in adm8211_write_bbp()
581 switch (priv->bbp_type) { in adm8211_write_bbp()
603 timeout--; in adm8211_write_bbp()
610 wiphy_debug(dev->wiphy, in adm8211_write_bbp()
613 return -ETIMEDOUT; in adm8211_write_bbp()
628 struct adm8211_priv *priv = dev->priv; in adm8211_rf_set_channel()
629 u8 ant_power = priv->ant_power > 0x3F ? in adm8211_rf_set_channel()
630 priv->eeprom->antenna_power[chan - 1] : priv->ant_power; in adm8211_rf_set_channel()
631 u8 tx_power = priv->tx_power > 0x3F ? in adm8211_rf_set_channel()
632 priv->eeprom->tx_power[chan - 1] : priv->tx_power; in adm8211_rf_set_channel()
633 u8 lpf_cutoff = priv->lpf_cutoff == 0xFF ? in adm8211_rf_set_channel()
634 priv->eeprom->lpf_cutoff[chan - 1] : priv->lpf_cutoff; in adm8211_rf_set_channel()
635 u8 lnags_thresh = priv->lnags_threshold == 0xFF ? in adm8211_rf_set_channel()
636 priv->eeprom->lnags_threshold[chan - 1] : priv->lnags_threshold; in adm8211_rf_set_channel()
642 switch (priv->transceiver_type) { in adm8211_rf_set_channel()
649 adm8211_rfmd2958_reg5[chan - 1]); in adm8211_rf_set_channel()
651 adm8211_rfmd2958_reg6[chan - 1]); in adm8211_rf_set_channel()
680 wiphy_debug(dev->wiphy, "unsupported transceiver type %d\n", in adm8211_rf_set_channel()
681 priv->transceiver_type); in adm8211_rf_set_channel()
686 if (priv->bbp_type == ADM8211_TYPE_RFMD) { in adm8211_rf_set_channel()
690 if (priv->transceiver_type == ADM8211_RFMD2948) { in adm8211_rf_set_channel()
699 if (priv->transceiver_type == ADM8211_RFMD2958) { in adm8211_rf_set_channel()
703 reg = le16_to_cpu(priv->eeprom->cr49); in adm8211_rf_set_channel()
710 (priv->pdev->revision < ADM8211_REV_CA ? tx_power : 0)); in adm8211_rf_set_channel()
724 if (priv->transceiver_type != ADM8211_RFMD2958) in adm8211_rf_set_channel()
729 adm8211_write_bbp(dev, 0x1c, priv->pdev->revision == ADM8211_REV_BA ? in adm8211_rf_set_channel()
730 priv->eeprom->cr28 : 0); in adm8211_rf_set_channel()
731 adm8211_write_bbp(dev, 0x1d, priv->eeprom->cr29); in adm8211_rf_set_channel()
736 } else if (priv->bbp_type != ADM8211_TYPE_ADMTEK) in adm8211_rf_set_channel()
737 wiphy_debug(dev->wiphy, "unsupported BBP type %d\n", in adm8211_rf_set_channel()
738 priv->bbp_type); in adm8211_rf_set_channel()
753 struct adm8211_priv *priv = dev->priv; in adm8211_update_mode()
757 priv->soft_rx_crc = 0; in adm8211_update_mode()
758 switch (priv->mode) { in adm8211_update_mode()
760 priv->nar &= ~(ADM8211_NAR_PR | ADM8211_NAR_EA); in adm8211_update_mode()
761 priv->nar |= ADM8211_NAR_ST | ADM8211_NAR_SR; in adm8211_update_mode()
764 priv->nar &= ~ADM8211_NAR_PR; in adm8211_update_mode()
765 priv->nar |= ADM8211_NAR_EA | ADM8211_NAR_ST | ADM8211_NAR_SR; in adm8211_update_mode()
768 if (priv->pdev->revision >= ADM8211_REV_BA) in adm8211_update_mode()
769 priv->soft_rx_crc = 1; in adm8211_update_mode()
772 priv->nar &= ~(ADM8211_NAR_EA | ADM8211_NAR_ST); in adm8211_update_mode()
773 priv->nar |= ADM8211_NAR_PR | ADM8211_NAR_SR; in adm8211_update_mode()
782 struct adm8211_priv *priv = dev->priv; in adm8211_hw_init_syn()
784 switch (priv->transceiver_type) { in adm8211_hw_init_syn()
803 (priv->transceiver_type == ADM8211_RFMD2958 ? in adm8211_hw_init_syn()
840 struct adm8211_priv *priv = dev->priv; in adm8211_hw_init_bbp()
844 if (priv->bbp_type == ADM8211_TYPE_INTERSIL) { in adm8211_hw_init_bbp()
848 } else if (priv->bbp_type == ADM8211_TYPE_RFMD || in adm8211_hw_init_bbp()
849 priv->bbp_type == ADM8211_TYPE_ADMTEK) { in adm8211_hw_init_bbp()
851 switch (priv->specific_bbptype) { in adm8211_hw_init_bbp()
869 switch (priv->pdev->revision) { in adm8211_hw_init_bbp()
871 if (priv->transceiver_type == ADM8211_RFMD2958 || in adm8211_hw_init_bbp()
872 priv->transceiver_type == ADM8211_RFMD2958_RF3000_CONTROL_POWER || in adm8211_hw_init_bbp()
873 priv->transceiver_type == ADM8211_RFMD2948) in adm8211_hw_init_bbp()
875 else if (priv->transceiver_type == ADM8211_MAX2820 || in adm8211_hw_init_bbp()
876 priv->transceiver_type == ADM8211_AL2210L) in adm8211_hw_init_bbp()
907 if (priv->bbp_type == ADM8211_TYPE_RFMD) { in adm8211_hw_init_bbp()
923 if (priv->eeprom->major_version < 2) { in adm8211_hw_init_bbp()
927 if (priv->pdev->revision == ADM8211_REV_BA) in adm8211_hw_init_bbp()
928 adm8211_write_bbp(dev, 0x1c, priv->eeprom->cr28); in adm8211_hw_init_bbp()
932 adm8211_write_bbp(dev, 0x1d, priv->eeprom->cr29); in adm8211_hw_init_bbp()
934 } else if (priv->bbp_type == ADM8211_TYPE_ADMTEK) { in adm8211_hw_init_bbp()
941 switch (priv->transceiver_type) { in adm8211_hw_init_bbp()
1032 wiphy_debug(dev->wiphy, "unsupported transceiver %d\n", in adm8211_hw_init_bbp()
1033 priv->transceiver_type); in adm8211_hw_init_bbp()
1037 wiphy_debug(dev->wiphy, "unsupported BBP %d\n", priv->bbp_type); in adm8211_hw_init_bbp()
1052 struct adm8211_priv *priv = dev->priv; in adm8211_set_rate()
1058 if (priv->pdev->revision != ADM8211_REV_BA) { in adm8211_set_rate()
1074 reg = ADM8211_CSR_READ(PLCPHD) & 0x00FFFFFF; /* keep bits 0-23 */ in adm8211_set_rate()
1081 * SRTYLIM = 224 (short retry limit, TX header value is default) */ in adm8211_set_rate()
1089 struct adm8211_priv *priv = dev->priv; in adm8211_hw_init()
1097 if (!pci_set_mwi(priv->pdev)) { in adm8211_hw_init()
1099 pci_read_config_byte(priv->pdev, PCI_CACHE_LINE_SIZE, &cline); in adm8211_hw_init()
1129 * threshold to store-and-forward */ in adm8211_hw_init()
1137 /* 4-bit values: in adm8211_hw_init()
1146 if (priv->pdev->revision < ADM8211_REV_CA) in adm8211_hw_init()
1152 priv->nar = ADM8211_NAR_SF | ADM8211_NAR_PB; in adm8211_hw_init()
1153 ADM8211_CSR_WRITE(NAR, priv->nar); in adm8211_hw_init()
1170 * TUCNT = 0x3ff - Tu counter 1024 us */ in adm8211_hw_init()
1175 if (priv->pdev->revision < ADM8211_REV_CA) in adm8211_hw_init()
1208 /* Clear the missed-packet counter. */ in adm8211_hw_init()
1214 struct adm8211_priv *priv = dev->priv; in adm8211_hw_reset()
1218 /* Power-on issue */ in adm8211_hw_reset()
1226 while ((ADM8211_CSR_READ(PAR) & ADM8211_PAR_SWR) && timeout--) in adm8211_hw_reset()
1230 return -ETIMEDOUT; in adm8211_hw_reset()
1234 if (priv->pdev->revision == ADM8211_REV_BA && in adm8211_hw_reset()
1235 (priv->transceiver_type == ADM8211_RFMD2958_RF3000_CONTROL_POWER || in adm8211_hw_reset()
1236 priv->transceiver_type == ADM8211_RFMD2958)) { in adm8211_hw_reset()
1240 } else if (priv->pdev->revision == ADM8211_REV_CA) { in adm8211_hw_reset()
1260 struct adm8211_priv *priv = dev->priv; in adm8211_get_tsft()
1275 struct adm8211_priv *priv = dev->priv; in adm8211_set_interval()
1278 /* BP (beacon interval) = data->beacon_interval in adm8211_set_interval()
1279 * LI (listen interval) = data->listen_interval (in beacon intervals) */ in adm8211_set_interval()
1286 struct adm8211_priv *priv = dev->priv; in adm8211_set_bssid()
1298 struct adm8211_priv *priv = dev->priv; in adm8211_config()
1299 struct ieee80211_conf *conf = &dev->conf; in adm8211_config()
1301 ieee80211_frequency_to_channel(conf->chandef.chan->center_freq); in adm8211_config()
1303 if (channel != priv->channel) { in adm8211_config()
1304 priv->channel = channel; in adm8211_config()
1305 adm8211_rf_set_channel(dev, priv->channel); in adm8211_config()
1316 struct adm8211_priv *priv = dev->priv; in adm8211_bss_info_changed()
1321 if (!ether_addr_equal(conf->bssid, priv->bssid)) { in adm8211_bss_info_changed()
1322 adm8211_set_bssid(dev, conf->bssid); in adm8211_bss_info_changed()
1323 memcpy(priv->bssid, conf->bssid, ETH_ALEN); in adm8211_bss_info_changed()
1337 bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26; in adm8211_prepare_multicast()
1352 struct adm8211_priv *priv = dev->priv; in adm8211_configure_filter()
1363 priv->nar &= ~ADM8211_NAR_PR; in adm8211_configure_filter()
1364 priv->nar |= ADM8211_NAR_MM; in adm8211_configure_filter()
1367 priv->nar &= ~(ADM8211_NAR_MM | ADM8211_NAR_PR); in adm8211_configure_filter()
1376 if (priv->nar & ADM8211_NAR_PR) in adm8211_configure_filter()
1379 __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, dev->flags); in adm8211_configure_filter()
1384 adm8211_set_bssid(dev, priv->bssid); in adm8211_configure_filter()
1394 struct adm8211_priv *priv = dev->priv; in adm8211_add_interface()
1395 if (priv->mode != NL80211_IFTYPE_MONITOR) in adm8211_add_interface()
1396 return -EOPNOTSUPP; in adm8211_add_interface()
1398 switch (vif->type) { in adm8211_add_interface()
1400 priv->mode = vif->type; in adm8211_add_interface()
1403 return -EOPNOTSUPP; in adm8211_add_interface()
1408 ADM8211_CSR_WRITE(PAR0, le32_to_cpu(*(__le32 *)vif->addr)); in adm8211_add_interface()
1409 ADM8211_CSR_WRITE(PAR1, le16_to_cpu(*(__le16 *)(vif->addr + 4))); in adm8211_add_interface()
1421 struct adm8211_priv *priv = dev->priv; in adm8211_remove_interface()
1422 priv->mode = NL80211_IFTYPE_MONITOR; in adm8211_remove_interface()
1427 struct adm8211_priv *priv = dev->priv; in adm8211_init_rings()
1433 for (i = 0; i < priv->rx_ring_size; i++) { in adm8211_init_rings()
1434 desc = &priv->rx_ring[i]; in adm8211_init_rings()
1435 desc->status = 0; in adm8211_init_rings()
1436 desc->length = cpu_to_le32(RX_PKT_SIZE); in adm8211_init_rings()
1437 priv->rx_buffers[i].skb = NULL; in adm8211_init_rings()
1441 desc->length |= cpu_to_le32(RDES1_CONTROL_RER); in adm8211_init_rings()
1443 for (i = 0; i < priv->rx_ring_size; i++) { in adm8211_init_rings()
1444 desc = &priv->rx_ring[i]; in adm8211_init_rings()
1445 rx_info = &priv->rx_buffers[i]; in adm8211_init_rings()
1447 rx_info->skb = dev_alloc_skb(RX_PKT_SIZE); in adm8211_init_rings()
1448 if (rx_info->skb == NULL) in adm8211_init_rings()
1450 rx_info->mapping = dma_map_single(&priv->pdev->dev, in adm8211_init_rings()
1451 skb_tail_pointer(rx_info->skb), in adm8211_init_rings()
1454 if (dma_mapping_error(&priv->pdev->dev, rx_info->mapping)) { in adm8211_init_rings()
1455 dev_kfree_skb(rx_info->skb); in adm8211_init_rings()
1456 rx_info->skb = NULL; in adm8211_init_rings()
1460 desc->buffer1 = cpu_to_le32(rx_info->mapping); in adm8211_init_rings()
1461 desc->status = cpu_to_le32(RDES0_STATUS_OWN | RDES0_STATUS_SQL); in adm8211_init_rings()
1465 for (i = 0; i < priv->tx_ring_size; i++) { in adm8211_init_rings()
1466 desc = &priv->tx_ring[i]; in adm8211_init_rings()
1467 tx_info = &priv->tx_buffers[i]; in adm8211_init_rings()
1469 tx_info->skb = NULL; in adm8211_init_rings()
1470 tx_info->mapping = 0; in adm8211_init_rings()
1471 desc->status = 0; in adm8211_init_rings()
1473 desc->length = cpu_to_le32(TDES1_CONTROL_TER); in adm8211_init_rings()
1475 priv->cur_rx = priv->cur_tx = priv->dirty_tx = 0; in adm8211_init_rings()
1476 ADM8211_CSR_WRITE(RDB, priv->rx_ring_dma); in adm8211_init_rings()
1477 ADM8211_CSR_WRITE(TDBD, priv->tx_ring_dma); in adm8211_init_rings()
1484 struct adm8211_priv *priv = dev->priv; in adm8211_free_rings()
1487 for (i = 0; i < priv->rx_ring_size; i++) { in adm8211_free_rings()
1488 if (!priv->rx_buffers[i].skb) in adm8211_free_rings()
1491 dma_unmap_single(&priv->pdev->dev, in adm8211_free_rings()
1492 priv->rx_buffers[i].mapping, RX_PKT_SIZE, in adm8211_free_rings()
1495 dev_kfree_skb(priv->rx_buffers[i].skb); in adm8211_free_rings()
1498 for (i = 0; i < priv->tx_ring_size; i++) { in adm8211_free_rings()
1499 if (!priv->tx_buffers[i].skb) in adm8211_free_rings()
1502 dma_unmap_single(&priv->pdev->dev, in adm8211_free_rings()
1503 priv->tx_buffers[i].mapping, in adm8211_free_rings()
1504 priv->tx_buffers[i].skb->len, DMA_TO_DEVICE); in adm8211_free_rings()
1506 dev_kfree_skb(priv->tx_buffers[i].skb); in adm8211_free_rings()
1512 struct adm8211_priv *priv = dev->priv; in adm8211_start()
1518 wiphy_err(dev->wiphy, "hardware reset failed\n"); in adm8211_start()
1524 wiphy_err(dev->wiphy, "failed to initialize rings\n"); in adm8211_start()
1530 adm8211_rf_set_channel(dev, priv->channel); in adm8211_start()
1532 retval = request_irq(priv->pdev->irq, adm8211_interrupt, in adm8211_start()
1535 wiphy_err(dev->wiphy, "failed to register IRQ handler\n"); in adm8211_start()
1542 priv->mode = NL80211_IFTYPE_MONITOR; in adm8211_start()
1555 struct adm8211_priv *priv = dev->priv; in adm8211_stop()
1557 priv->mode = NL80211_IFTYPE_UNSPECIFIED; in adm8211_stop()
1558 priv->nar = 0; in adm8211_stop()
1563 free_irq(priv->pdev->irq, dev); in adm8211_stop()
1587 *dur = (80 * (24 + payload_len) + plcp_signal - 1) in adm8211_calc_durations()
1591 /* 1-2Mbps WLAN: send ACK/CTS at 1Mbps */ in adm8211_calc_durations()
1597 /* 5-11Mbps WLAN: send ACK/CTS at 2Mbps */ in adm8211_calc_durations()
1605 *dur += 3 * (IEEE80211_DUR_DS_LONG_PREAMBLE - in adm8211_calc_durations()
1607 3 * (IEEE80211_DUR_DS_SLOW_PLCPHDR - in adm8211_calc_durations()
1625 struct adm8211_priv *priv = dev->priv; in adm8211_tx_raw()
1631 mapping = dma_map_single(&priv->pdev->dev, skb->data, skb->len, in adm8211_tx_raw()
1633 if (dma_mapping_error(&priv->pdev->dev, mapping)) in adm8211_tx_raw()
1634 return -ENOMEM; in adm8211_tx_raw()
1636 spin_lock_irqsave(&priv->lock, flags); in adm8211_tx_raw()
1638 if (priv->cur_tx - priv->dirty_tx == priv->tx_ring_size / 2) in adm8211_tx_raw()
1643 if (priv->cur_tx - priv->dirty_tx == priv->tx_ring_size - 2) in adm8211_tx_raw()
1646 entry = priv->cur_tx % priv->tx_ring_size; in adm8211_tx_raw()
1648 priv->tx_buffers[entry].skb = skb; in adm8211_tx_raw()
1649 priv->tx_buffers[entry].mapping = mapping; in adm8211_tx_raw()
1650 priv->tx_buffers[entry].hdrlen = hdrlen; in adm8211_tx_raw()
1651 priv->tx_ring[entry].buffer1 = cpu_to_le32(mapping); in adm8211_tx_raw()
1653 if (entry == priv->tx_ring_size - 1) in adm8211_tx_raw()
1655 priv->tx_ring[entry].length = cpu_to_le32(flag | skb->len); in adm8211_tx_raw()
1659 priv->tx_ring[entry].status = cpu_to_le32(flag); in adm8211_tx_raw()
1661 priv->cur_tx++; in adm8211_tx_raw()
1663 spin_unlock_irqrestore(&priv->lock, flags); in adm8211_tx_raw()
1684 rc_flags = info->control.rates[0].flags; in adm8211_tx()
1686 plcp_signal = txrate->bitrate; in adm8211_tx()
1688 hdr = (struct ieee80211_hdr *)skb->data; in adm8211_tx()
1689 hdrlen = ieee80211_hdrlen(hdr->frame_control); in adm8211_tx()
1690 memcpy(skb->cb, skb->data, hdrlen); in adm8211_tx()
1691 hdr = (struct ieee80211_hdr *)skb->cb; in adm8211_tx()
1693 payload_len = skb->len; in adm8211_tx()
1697 memcpy(txhdr->da, ieee80211_get_DA(hdr), ETH_ALEN); in adm8211_tx()
1698 txhdr->signal = plcp_signal; in adm8211_tx()
1699 txhdr->frame_body_size = cpu_to_le16(payload_len); in adm8211_tx()
1700 txhdr->frame_control = hdr->frame_control; in adm8211_tx()
1704 txhdr->frag = cpu_to_le16(0x0FFF); in adm8211_tx()
1707 txhdr->plcp_frag_head_len = cpu_to_le16(plcp); in adm8211_tx()
1708 txhdr->plcp_frag_tail_len = cpu_to_le16(plcp); in adm8211_tx()
1709 txhdr->dur_frag_head = cpu_to_le16(dur); in adm8211_tx()
1710 txhdr->dur_frag_tail = cpu_to_le16(dur); in adm8211_tx()
1712 txhdr->header_control = cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_EXTEND_HEADER); in adm8211_tx()
1715 txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_SHORT_PREAMBLE); in adm8211_tx()
1718 txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_RTS); in adm8211_tx()
1720 txhdr->retry_limit = info->control.rates[0].count; in adm8211_tx()
1730 struct adm8211_priv *priv = dev->priv; in adm8211_alloc_rings()
1733 priv->rx_buffers = kmalloc(sizeof(*priv->rx_buffers) * priv->rx_ring_size + in adm8211_alloc_rings()
1734 sizeof(*priv->tx_buffers) * priv->tx_ring_size, GFP_KERNEL); in adm8211_alloc_rings()
1735 if (!priv->rx_buffers) in adm8211_alloc_rings()
1736 return -ENOMEM; in adm8211_alloc_rings()
1738 priv->tx_buffers = (void *)priv->rx_buffers + in adm8211_alloc_rings()
1739 sizeof(*priv->rx_buffers) * priv->rx_ring_size; in adm8211_alloc_rings()
1742 ring_size = sizeof(struct adm8211_desc) * priv->rx_ring_size + in adm8211_alloc_rings()
1743 sizeof(struct adm8211_desc) * priv->tx_ring_size; in adm8211_alloc_rings()
1744 priv->rx_ring = dma_alloc_coherent(&priv->pdev->dev, ring_size, in adm8211_alloc_rings()
1745 &priv->rx_ring_dma, GFP_KERNEL); in adm8211_alloc_rings()
1747 if (!priv->rx_ring) { in adm8211_alloc_rings()
1748 kfree(priv->rx_buffers); in adm8211_alloc_rings()
1749 priv->rx_buffers = NULL; in adm8211_alloc_rings()
1750 priv->tx_buffers = NULL; in adm8211_alloc_rings()
1751 return -ENOMEM; in adm8211_alloc_rings()
1754 priv->tx_ring = priv->rx_ring + priv->rx_ring_size; in adm8211_alloc_rings()
1755 priv->tx_ring_dma = priv->rx_ring_dma + in adm8211_alloc_rings()
1756 sizeof(struct adm8211_desc) * priv->rx_ring_size; in adm8211_alloc_rings()
1803 err = -ENOMEM; in adm8211_probe()
1813 err = -EINVAL; in adm8211_probe()
1824 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in adm8211_probe()
1835 printk(KERN_ERR "%s (adm8211): ieee80211 alloc failed\n", in adm8211_probe()
1837 err = -ENOMEM; in adm8211_probe()
1840 priv = dev->priv; in adm8211_probe()
1841 priv->pdev = pdev; in adm8211_probe()
1843 spin_lock_init(&priv->lock); in adm8211_probe()
1845 SET_IEEE80211_DEV(dev, &pdev->dev); in adm8211_probe()
1849 priv->map = pci_iomap(pdev, 1, mem_len); in adm8211_probe()
1850 if (!priv->map) in adm8211_probe()
1851 priv->map = pci_iomap(pdev, 0, io_len); in adm8211_probe()
1853 if (!priv->map) { in adm8211_probe()
1856 err = -ENOMEM; in adm8211_probe()
1860 priv->rx_ring_size = rx_ring_size; in adm8211_probe()
1861 priv->tx_ring_size = tx_ring_size; in adm8211_probe()
1881 dev->extra_tx_headroom = sizeof(struct adm8211_tx_hdr); in adm8211_probe()
1882 /* dev->flags = RX_INCLUDES_FCS in promisc mode */ in adm8211_probe()
1884 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); in adm8211_probe()
1886 dev->max_signal = 100; /* FIXME: find better value */ in adm8211_probe()
1888 dev->queues = 1; /* ADM8211C supports more, maybe ADM8211B too */ in adm8211_probe()
1890 priv->retry_limit = 3; in adm8211_probe()
1891 priv->ant_power = 0x40; in adm8211_probe()
1892 priv->tx_power = 0x40; in adm8211_probe()
1893 priv->lpf_cutoff = 0xFF; in adm8211_probe()
1894 priv->lnags_threshold = 0xFF; in adm8211_probe()
1895 priv->mode = NL80211_IFTYPE_UNSPECIFIED; in adm8211_probe()
1897 /* Power-on issue. EEPROM won't read correctly without */ in adm8211_probe()
1898 if (pdev->revision >= ADM8211_REV_BA) { in adm8211_probe()
1913 priv->channel = 1; in adm8211_probe()
1915 dev->wiphy->bands[NL80211_BAND_2GHZ] = &priv->band; in adm8211_probe()
1917 wiphy_ext_feature_set(dev->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in adm8211_probe()
1926 wiphy_info(dev->wiphy, "hwaddr %pM, Rev 0x%02x\n", in adm8211_probe()
1927 dev->wiphy->perm_addr, pdev->revision); in adm8211_probe()
1932 kfree(priv->eeprom); in adm8211_probe()
1935 dma_free_coherent(&pdev->dev, in adm8211_probe()
1936 sizeof(struct adm8211_desc) * priv->rx_ring_size + in adm8211_probe()
1937 sizeof(struct adm8211_desc) * priv->tx_ring_size, in adm8211_probe()
1938 priv->rx_ring, priv->rx_ring_dma); in adm8211_probe()
1939 kfree(priv->rx_buffers); in adm8211_probe()
1942 pci_iounmap(pdev, priv->map); in adm8211_probe()
1966 priv = dev->priv; in adm8211_remove()
1968 dma_free_coherent(&pdev->dev, in adm8211_remove()
1969 sizeof(struct adm8211_desc) * priv->rx_ring_size + in adm8211_remove()
1970 sizeof(struct adm8211_desc) * priv->tx_ring_size, in adm8211_remove()
1971 priv->rx_ring, priv->rx_ring_dma); in adm8211_remove()
1973 kfree(priv->rx_buffers); in adm8211_remove()
1974 kfree(priv->eeprom); in adm8211_remove()
1975 pci_iounmap(pdev, priv->map); in adm8211_remove()