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

1 // SPDX-License-Identifier: GPL-2.0-only
13 * Hin-Tak Leung <htl10@users.sourceforge.net>
38 MODULE_AUTHOR("Hin-Tak Leung <htl10@users.sourceforge.net>");
118 kfree(urb->context); in rtl8187_iowrite_async_cb()
142 dr = &buf->dr; in rtl8187_iowrite_async()
144 dr->bRequestType = RTL8187_REQT_WRITE; in rtl8187_iowrite_async()
145 dr->bRequest = RTL8187_REQ_SET_REG; in rtl8187_iowrite_async()
146 dr->wValue = addr; in rtl8187_iowrite_async()
147 dr->wIndex = 0; in rtl8187_iowrite_async()
148 dr->wLength = cpu_to_le16(len); in rtl8187_iowrite_async()
152 usb_fill_control_urb(urb, priv->udev, usb_sndctrlpipe(priv->udev, 0), in rtl8187_iowrite_async()
155 usb_anchor_urb(urb, &priv->anchored); in rtl8187_iowrite_async()
175 struct rtl8187_priv *priv = dev->priv; in rtl8187_write_phy()
180 rtl818x_iowrite8(priv, &priv->map->PHY[3], (data >> 24) & 0xFF); in rtl8187_write_phy()
181 rtl818x_iowrite8(priv, &priv->map->PHY[2], (data >> 16) & 0xFF); in rtl8187_write_phy()
182 rtl818x_iowrite8(priv, &priv->map->PHY[1], (data >> 8) & 0xFF); in rtl8187_write_phy()
183 rtl818x_iowrite8(priv, &priv->map->PHY[0], data & 0xFF); in rtl8187_write_phy()
188 struct sk_buff *skb = (struct sk_buff *)urb->context; in rtl8187_tx_cb()
190 struct ieee80211_hw *hw = info->rate_driver_data[0]; in rtl8187_tx_cb()
191 struct rtl8187_priv *priv = hw->priv; in rtl8187_tx_cb()
193 skb_pull(skb, priv->is_rtl8187b ? sizeof(struct rtl8187b_tx_hdr) : in rtl8187_tx_cb()
197 if (!(urb->status) && !(info->flags & IEEE80211_TX_CTL_NO_ACK)) { in rtl8187_tx_cb()
198 if (priv->is_rtl8187b) { in rtl8187_tx_cb()
199 skb_queue_tail(&priv->b_tx_status.queue, skb); in rtl8187_tx_cb()
202 while (skb_queue_len(&priv->b_tx_status.queue) > 5) { in rtl8187_tx_cb()
205 dev_dbg(&priv->udev->dev, in rtl8187_tx_cb()
208 old_skb = skb_dequeue(&priv->b_tx_status.queue); in rtl8187_tx_cb()
213 info->flags |= IEEE80211_TX_STAT_ACK; in rtl8187_tx_cb()
216 if (priv->is_rtl8187b) in rtl8187_tx_cb()
222 skb_queue_tail(&priv->b_tx_status.queue, skb); in rtl8187_tx_cb()
223 ieee80211_queue_delayed_work(hw, &priv->work, 0); in rtl8187_tx_cb()
231 struct rtl8187_priv *priv = dev->priv; in rtl8187_tx()
233 struct ieee80211_hdr *tx_hdr = (struct ieee80211_hdr *)(skb->data); in rtl8187_tx()
247 flags = skb->len; in rtl8187_tx()
250 flags |= ieee80211_get_tx_rate(dev, info)->hw_value << 24; in rtl8187_tx()
251 if (ieee80211_has_morefrags(tx_hdr->frame_control)) in rtl8187_tx()
254 /* HW will perform RTS-CTS when only RTS flags is set. in rtl8187_tx()
255 * HW will perform CTS-to-self when both RTS and CTS flags are set. in rtl8187_tx()
256 * RTS rate and RTS duration will be used also for CTS-to-self. in rtl8187_tx()
258 if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) { in rtl8187_tx()
260 flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19; in rtl8187_tx()
261 rts_dur = ieee80211_rts_duration(dev, priv->vif, in rtl8187_tx()
262 skb->len, info); in rtl8187_tx()
263 } else if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { in rtl8187_tx()
265 flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19; in rtl8187_tx()
266 rts_dur = ieee80211_ctstoself_duration(dev, priv->vif, in rtl8187_tx()
267 skb->len, info); in rtl8187_tx()
270 if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { in rtl8187_tx()
271 if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) in rtl8187_tx()
272 priv->seqno += 0x10; in rtl8187_tx()
273 tx_hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); in rtl8187_tx()
274 tx_hdr->seq_ctrl |= cpu_to_le16(priv->seqno); in rtl8187_tx()
277 if (!priv->is_rtl8187b) { in rtl8187_tx()
279 hdr->flags = cpu_to_le32(flags); in rtl8187_tx()
280 hdr->len = 0; in rtl8187_tx()
281 hdr->rts_duration = rts_dur; in rtl8187_tx()
282 hdr->retry = cpu_to_le32((info->control.rates[0].count - 1) << 8); in rtl8187_tx()
289 u16 fc = le16_to_cpu(tx_hdr->frame_control); in rtl8187_tx()
295 hdr->flags = cpu_to_le32(flags); in rtl8187_tx()
296 hdr->rts_duration = rts_dur; in rtl8187_tx()
297 hdr->retry = cpu_to_le32((info->control.rates[0].count - 1) << 8); in rtl8187_tx()
298 hdr->tx_duration = in rtl8187_tx()
299 ieee80211_generic_frame_duration(dev, priv->vif, in rtl8187_tx()
300 info->band, in rtl8187_tx()
301 skb->len, txrate); in rtl8187_tx()
310 info->rate_driver_data[0] = dev; in rtl8187_tx()
311 info->rate_driver_data[1] = urb; in rtl8187_tx()
313 usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep), in rtl8187_tx()
314 buf, skb->len, rtl8187_tx_cb, skb); in rtl8187_tx()
315 urb->transfer_flags |= URB_ZERO_PACKET; in rtl8187_tx()
316 usb_anchor_urb(urb, &priv->anchored); in rtl8187_tx()
327 struct sk_buff *skb = (struct sk_buff *)urb->context; in rtl8187_rx_cb()
328 struct rtl8187_rx_info *info = (struct rtl8187_rx_info *)skb->cb; in rtl8187_rx_cb()
329 struct ieee80211_hw *dev = info->dev; in rtl8187_rx_cb()
330 struct rtl8187_priv *priv = dev->priv; in rtl8187_rx_cb()
336 spin_lock_irqsave(&priv->rx_queue.lock, f); in rtl8187_rx_cb()
337 __skb_unlink(skb, &priv->rx_queue); in rtl8187_rx_cb()
338 spin_unlock_irqrestore(&priv->rx_queue.lock, f); in rtl8187_rx_cb()
339 skb_put(skb, urb->actual_length); in rtl8187_rx_cb()
341 if (unlikely(urb->status)) { in rtl8187_rx_cb()
346 if (!priv->is_rtl8187b) { in rtl8187_rx_cb()
348 (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); in rtl8187_rx_cb()
349 flags = le32_to_cpu(hdr->flags); in rtl8187_rx_cb()
354 signal = -4 - ((27 * hdr->agc) >> 6); in rtl8187_rx_cb()
355 rx_status.antenna = (hdr->signal >> 7) & 1; in rtl8187_rx_cb()
356 rx_status.mactime = le64_to_cpu(hdr->mac_time); in rtl8187_rx_cb()
359 (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); in rtl8187_rx_cb()
372 flags = le32_to_cpu(hdr->flags); in rtl8187_rx_cb()
373 signal = 14 - hdr->agc / 2; in rtl8187_rx_cb()
374 rx_status.antenna = (hdr->rssi >> 7) & 1; in rtl8187_rx_cb()
375 rx_status.mactime = le64_to_cpu(hdr->mac_time); in rtl8187_rx_cb()
379 priv->signal = signal; in rtl8187_rx_cb()
383 rx_status.freq = dev->conf.chandef.chan->center_freq; in rtl8187_rx_cb()
384 rx_status.band = dev->conf.chandef.chan->band; in rtl8187_rx_cb()
399 info = (struct rtl8187_rx_info *)skb->cb; in rtl8187_rx_cb()
400 info->urb = urb; in rtl8187_rx_cb()
401 info->dev = dev; in rtl8187_rx_cb()
402 urb->transfer_buffer = skb_tail_pointer(skb); in rtl8187_rx_cb()
403 urb->context = skb; in rtl8187_rx_cb()
404 skb_queue_tail(&priv->rx_queue, skb); in rtl8187_rx_cb()
406 usb_anchor_urb(urb, &priv->anchored); in rtl8187_rx_cb()
409 skb_unlink(skb, &priv->rx_queue); in rtl8187_rx_cb()
416 struct rtl8187_priv *priv = dev->priv; in rtl8187_init_urbs()
422 while (skb_queue_len(&priv->rx_queue) < 32) { in rtl8187_init_urbs()
425 ret = -ENOMEM; in rtl8187_init_urbs()
430 ret = -ENOMEM; in rtl8187_init_urbs()
433 usb_fill_bulk_urb(entry, priv->udev, in rtl8187_init_urbs()
434 usb_rcvbulkpipe(priv->udev, in rtl8187_init_urbs()
435 priv->is_rtl8187b ? 3 : 1), in rtl8187_init_urbs()
438 info = (struct rtl8187_rx_info *)skb->cb; in rtl8187_init_urbs()
439 info->urb = entry; in rtl8187_init_urbs()
440 info->dev = dev; in rtl8187_init_urbs()
441 skb_queue_tail(&priv->rx_queue, skb); in rtl8187_init_urbs()
442 usb_anchor_urb(entry, &priv->anchored); in rtl8187_init_urbs()
445 skb_unlink(skb, &priv->rx_queue); in rtl8187_init_urbs()
456 usb_kill_anchored_urbs(&priv->anchored); in rtl8187_init_urbs()
462 struct ieee80211_hw *hw = (struct ieee80211_hw *)urb->context; in rtl8187b_status_cb()
463 struct rtl8187_priv *priv = hw->priv; in rtl8187b_status_cb()
467 if (unlikely(urb->status)) in rtl8187b_status_cb()
474 * - 0 indicates tx beacon interrupt in rtl8187b_status_cb()
475 * - 1 indicates tx close descriptor in rtl8187b_status_cb()
494 val = le64_to_cpu(priv->b_tx_status.buf); in rtl8187b_status_cb()
508 spin_lock_irqsave(&priv->b_tx_status.queue.lock, flags); in rtl8187b_status_cb()
510 skb_queue_reverse_walk(&priv->b_tx_status.queue, iter) { in rtl8187b_status_cb()
511 ieee80211hdr = (struct ieee80211_hdr *)iter->data; in rtl8187b_status_cb()
523 if ((le16_to_cpu(ieee80211hdr->seq_ctrl) in rtl8187b_status_cb()
532 __skb_unlink(skb, &priv->b_tx_status.queue); in rtl8187b_status_cb()
534 info->flags |= IEEE80211_TX_STAT_ACK; in rtl8187b_status_cb()
535 info->status.rates[0].count = pkt_rc + 1; in rtl8187b_status_cb()
539 spin_unlock_irqrestore(&priv->b_tx_status.queue.lock, flags); in rtl8187b_status_cb()
542 usb_anchor_urb(urb, &priv->anchored); in rtl8187b_status_cb()
549 struct rtl8187_priv *priv = dev->priv; in rtl8187b_init_status_urb()
555 return -ENOMEM; in rtl8187b_init_status_urb()
557 usb_fill_bulk_urb(entry, priv->udev, usb_rcvbulkpipe(priv->udev, 9), in rtl8187b_init_status_urb()
558 &priv->b_tx_status.buf, sizeof(priv->b_tx_status.buf), in rtl8187b_init_status_urb()
561 usb_anchor_urb(entry, &priv->anchored); in rtl8187b_init_status_urb()
575 if (!priv->is_rtl8187b) { in rtl8187_set_anaparam()
595 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, in rtl8187_set_anaparam()
597 reg = rtl818x_ioread8(priv, &priv->map->CONFIG3); in rtl8187_set_anaparam()
599 rtl818x_iowrite8(priv, &priv->map->CONFIG3, reg); in rtl8187_set_anaparam()
600 rtl818x_iowrite32(priv, &priv->map->ANAPARAM, anaparam); in rtl8187_set_anaparam()
601 rtl818x_iowrite32(priv, &priv->map->ANAPARAM2, anaparam2); in rtl8187_set_anaparam()
602 if (priv->is_rtl8187b) in rtl8187_set_anaparam()
603 rtl818x_iowrite8(priv, &priv->map->ANAPARAM3A, anaparam3); in rtl8187_set_anaparam()
605 rtl818x_iowrite8(priv, &priv->map->CONFIG3, reg); in rtl8187_set_anaparam()
606 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, in rtl8187_set_anaparam()
612 struct rtl8187_priv *priv = dev->priv; in rtl8187_cmd_reset()
616 reg = rtl818x_ioread8(priv, &priv->map->CMD); in rtl8187_cmd_reset()
619 rtl818x_iowrite8(priv, &priv->map->CMD, reg); in rtl8187_cmd_reset()
624 if (!(rtl818x_ioread8(priv, &priv->map->CMD) & in rtl8187_cmd_reset()
627 } while (--i); in rtl8187_cmd_reset()
630 wiphy_err(dev->wiphy, "Reset timeout!\n"); in rtl8187_cmd_reset()
631 return -ETIMEDOUT; in rtl8187_cmd_reset()
635 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_LOAD); in rtl8187_cmd_reset()
640 if (!(rtl818x_ioread8(priv, &priv->map->EEPROM_CMD) & in rtl8187_cmd_reset()
643 } while (--i); in rtl8187_cmd_reset()
646 wiphy_err(dev->wiphy, "eeprom reset timeout!\n"); in rtl8187_cmd_reset()
647 return -ETIMEDOUT; in rtl8187_cmd_reset()
655 struct rtl8187_priv *priv = dev->priv; in rtl8187_init_hw()
662 rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0); in rtl8187_init_hw()
677 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0); in rtl8187_init_hw()
678 rtl818x_iowrite8(priv, &priv->map->GPIO0, 0); in rtl8187_init_hw()
680 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8)); in rtl8187_init_hw()
681 rtl818x_iowrite8(priv, &priv->map->GPIO0, 1); in rtl8187_init_hw()
682 rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0); in rtl8187_init_hw()
684 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); in rtl8187_init_hw()
687 reg = rtl818x_ioread8(priv, &priv->map->CONFIG1); in rtl8187_init_hw()
690 rtl818x_iowrite8(priv, &priv->map->CONFIG1, reg); in rtl8187_init_hw()
692 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); in rtl8187_init_hw()
694 rtl818x_iowrite32(priv, &priv->map->INT_TIMEOUT, 0); in rtl8187_init_hw()
695 rtl818x_iowrite8(priv, &priv->map->WPA_CONF, 0); in rtl8187_init_hw()
696 rtl818x_iowrite8(priv, &priv->map->RATE_FALLBACK, 0); in rtl8187_init_hw()
699 rtl818x_iowrite8(priv, &priv->map->RESP_RATE, (8 << 4) | 0); in rtl8187_init_hw()
700 rtl818x_iowrite16(priv, &priv->map->BRSR, 0x01F3); in rtl8187_init_hw()
703 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0); in rtl8187_init_hw()
704 rtl818x_iowrite8(priv, &priv->map->GPIO0, 0); in rtl8187_init_hw()
707 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8)); in rtl8187_init_hw()
708 rtl818x_iowrite8(priv, &priv->map->GPIO0, 0x20); in rtl8187_init_hw()
709 rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0); in rtl8187_init_hw()
710 rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x80); in rtl8187_init_hw()
711 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0x80); in rtl8187_init_hw()
712 rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, 0x80); in rtl8187_init_hw()
715 rtl818x_iowrite32(priv, &priv->map->RF_TIMING, 0x000a8008); in rtl8187_init_hw()
716 rtl818x_iowrite16(priv, &priv->map->BRSR, 0xFFFF); in rtl8187_init_hw()
717 rtl818x_iowrite32(priv, &priv->map->RF_PARA, 0x00100044); in rtl8187_init_hw()
718 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, in rtl8187_init_hw()
720 rtl818x_iowrite8(priv, &priv->map->CONFIG3, 0x44); in rtl8187_init_hw()
721 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, in rtl8187_init_hw()
723 rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, 0x1FF7); in rtl8187_init_hw()
726 priv->rf->init(dev); in rtl8187_init_hw()
728 rtl818x_iowrite16(priv, &priv->map->BRSR, 0x01F3); in rtl8187_init_hw()
729 reg = rtl818x_ioread8(priv, &priv->map->PGSELECT) & ~1; in rtl8187_init_hw()
730 rtl818x_iowrite8(priv, &priv->map->PGSELECT, reg | 1); in rtl8187_init_hw()
732 rtl818x_iowrite8(priv, &priv->map->TALLY_SEL, 0x80); in rtl8187_init_hw()
734 rtl818x_iowrite8(priv, &priv->map->PGSELECT, reg); in rtl8187_init_hw()
771 struct rtl8187_priv *priv = dev->priv; in rtl8187b_init_hw()
795 reg = rtl818x_ioread8(priv, &priv->map->CW_CONF); in rtl8187b_init_hw()
797 rtl818x_iowrite8(priv, &priv->map->CW_CONF, reg); in rtl8187b_init_hw()
799 /* Auto Rate Fallback Register (ARFR): 1M-54M setting */ in rtl8187b_init_hw()
805 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, in rtl8187b_init_hw()
807 reg = rtl818x_ioread8(priv, &priv->map->CONFIG1); in rtl8187b_init_hw()
808 rtl818x_iowrite8(priv, &priv->map->CONFIG1, (reg & 0x3F) | 0x80); in rtl8187b_init_hw()
809 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, in rtl8187b_init_hw()
812 rtl818x_iowrite8(priv, &priv->map->WPA_CONF, 0); in rtl8187b_init_hw()
821 rtl818x_iowrite16(priv, &priv->map->TID_AC_MAP, 0xFA50); in rtl8187b_init_hw()
822 rtl818x_iowrite16(priv, &priv->map->INT_MIG, 0); in rtl8187b_init_hw()
828 rtl818x_iowrite32(priv, &priv->map->RF_TIMING, 0x00004001); in rtl8187b_init_hw()
833 rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x0480); in rtl8187b_init_hw()
834 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0x2488); in rtl8187b_init_hw()
835 rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, 0x1FFF); in rtl8187b_init_hw()
838 priv->rf->init(dev); in rtl8187b_init_hw()
841 rtl818x_iowrite8(priv, &priv->map->CMD, reg); in rtl8187b_init_hw()
842 rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0xFFFF); in rtl8187b_init_hw()
866 rtl818x_iowrite32(priv, &priv->map->HSSI_PARA, 0x0600321B); in rtl8187b_init_hw()
870 priv->slot_time = 0x9; in rtl8187b_init_hw()
871 priv->aifsn[0] = 2; /* AIFSN[AC_VO] */ in rtl8187b_init_hw()
872 priv->aifsn[1] = 2; /* AIFSN[AC_VI] */ in rtl8187b_init_hw()
873 priv->aifsn[2] = 7; /* AIFSN[AC_BK] */ in rtl8187b_init_hw()
874 priv->aifsn[3] = 3; /* AIFSN[AC_BE] */ in rtl8187b_init_hw()
875 rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0); in rtl8187b_init_hw()
878 rtl818x_iowrite8(priv, &priv->map->MSR, RTL818X_MSR_ENEDCA); in rtl8187b_init_hw()
895 struct ieee80211_hw *dev = priv->dev; in rtl8187_work()
901 mutex_lock(&priv->conf_mutex); in rtl8187_work()
903 length = skb_queue_len(&priv->b_tx_status.queue); in rtl8187_work()
908 avg_retry = (tmp - retry) / length; in rtl8187_work()
909 while (skb_queue_len(&priv->b_tx_status.queue) > 0) { in rtl8187_work()
912 old_skb = skb_dequeue(&priv->b_tx_status.queue); in rtl8187_work()
914 info->status.rates[0].count = avg_retry + 1; in rtl8187_work()
915 if (info->status.rates[0].count > RETRY_COUNT) in rtl8187_work()
916 info->flags &= ~IEEE80211_TX_STAT_ACK; in rtl8187_work()
920 mutex_unlock(&priv->conf_mutex); in rtl8187_work()
925 struct rtl8187_priv *priv = dev->priv; in rtl8187_start()
929 mutex_lock(&priv->conf_mutex); in rtl8187_start()
931 ret = (!priv->is_rtl8187b) ? rtl8187_init_hw(dev) : in rtl8187_start()
936 init_usb_anchor(&priv->anchored); in rtl8187_start()
937 priv->dev = dev; in rtl8187_start()
939 if (priv->is_rtl8187b) { in rtl8187_start()
949 priv->rx_conf = reg; in rtl8187_start()
950 rtl818x_iowrite32(priv, &priv->map->RX_CONF, reg); in rtl8187_start()
952 reg = rtl818x_ioread8(priv, &priv->map->TX_AGC_CTL); in rtl8187_start()
956 rtl818x_iowrite8(priv, &priv->map->TX_AGC_CTL, reg); in rtl8187_start()
958 rtl818x_iowrite32(priv, &priv->map->TX_CONF, in rtl8187_start()
961 (RETRY_COUNT << 8 /* short retry limit */) | in rtl8187_start()
962 (RETRY_COUNT << 0 /* long retry limit */) | in rtl8187_start()
969 usb_kill_anchored_urbs(&priv->anchored); in rtl8187_start()
973 rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0xFFFF); in rtl8187_start()
975 rtl818x_iowrite32(priv, &priv->map->MAR[0], ~0); in rtl8187_start()
976 rtl818x_iowrite32(priv, &priv->map->MAR[1], ~0); in rtl8187_start()
992 priv->rx_conf = reg; in rtl8187_start()
993 rtl818x_iowrite32(priv, &priv->map->RX_CONF, reg); in rtl8187_start()
995 reg = rtl818x_ioread8(priv, &priv->map->CW_CONF); in rtl8187_start()
998 rtl818x_iowrite8(priv, &priv->map->CW_CONF, reg); in rtl8187_start()
1000 reg = rtl818x_ioread8(priv, &priv->map->TX_AGC_CTL); in rtl8187_start()
1004 rtl818x_iowrite8(priv, &priv->map->TX_AGC_CTL, reg); in rtl8187_start()
1009 rtl818x_iowrite32(priv, &priv->map->TX_CONF, reg); in rtl8187_start()
1011 reg = rtl818x_ioread8(priv, &priv->map->CMD); in rtl8187_start()
1014 rtl818x_iowrite8(priv, &priv->map->CMD, reg); in rtl8187_start()
1015 INIT_DELAYED_WORK(&priv->work, rtl8187_work); in rtl8187_start()
1018 mutex_unlock(&priv->conf_mutex); in rtl8187_start()
1024 struct rtl8187_priv *priv = dev->priv; in rtl8187_stop()
1028 mutex_lock(&priv->conf_mutex); in rtl8187_stop()
1029 rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0); in rtl8187_stop()
1031 reg = rtl818x_ioread8(priv, &priv->map->CMD); in rtl8187_stop()
1034 rtl818x_iowrite8(priv, &priv->map->CMD, reg); in rtl8187_stop()
1036 priv->rf->stop(dev); in rtl8187_stop()
1039 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); in rtl8187_stop()
1040 reg = rtl818x_ioread8(priv, &priv->map->CONFIG4); in rtl8187_stop()
1041 rtl818x_iowrite8(priv, &priv->map->CONFIG4, reg | RTL818X_CONFIG4_VCOOFF); in rtl8187_stop()
1042 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); in rtl8187_stop()
1044 while ((skb = skb_dequeue(&priv->b_tx_status.queue))) in rtl8187_stop()
1047 usb_kill_anchored_urbs(&priv->anchored); in rtl8187_stop()
1048 mutex_unlock(&priv->conf_mutex); in rtl8187_stop()
1050 if (!priv->is_rtl8187b) in rtl8187_stop()
1051 cancel_delayed_work_sync(&priv->work); in rtl8187_stop()
1056 struct rtl8187_priv *priv = dev->priv; in rtl8187_get_tsf()
1058 return rtl818x_ioread32(priv, &priv->map->TSFT[0]) | in rtl8187_get_tsf()
1059 (u64)(rtl818x_ioread32(priv, &priv->map->TSFT[1])) << 32; in rtl8187_get_tsf()
1069 struct ieee80211_hw *dev = vif_priv->dev; in rtl8187_beacon_work()
1086 mgmt = (struct ieee80211_mgmt *)skb->data; in rtl8187_beacon_work()
1087 mgmt->u.beacon.timestamp = cpu_to_le64(rtl8187_get_tsf(dev, vif)); in rtl8187_beacon_work()
1099 schedule_delayed_work(&vif_priv->beacon_work, in rtl8187_beacon_work()
1100 usecs_to_jiffies(1024 * vif->bss_conf.beacon_int)); in rtl8187_beacon_work()
1107 struct rtl8187_priv *priv = dev->priv; in rtl8187_add_interface()
1110 int ret = -EOPNOTSUPP; in rtl8187_add_interface()
1112 mutex_lock(&priv->conf_mutex); in rtl8187_add_interface()
1113 if (priv->vif) in rtl8187_add_interface()
1116 switch (vif->type) { in rtl8187_add_interface()
1125 priv->vif = vif; in rtl8187_add_interface()
1128 vif_priv = (struct rtl8187_vif *)&vif->drv_priv; in rtl8187_add_interface()
1129 vif_priv->dev = dev; in rtl8187_add_interface()
1130 INIT_DELAYED_WORK(&vif_priv->beacon_work, rtl8187_beacon_work); in rtl8187_add_interface()
1131 vif_priv->enable_beacon = false; in rtl8187_add_interface()
1134 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); in rtl8187_add_interface()
1136 rtl818x_iowrite8(priv, &priv->map->MAC[i], in rtl8187_add_interface()
1137 ((u8 *)vif->addr)[i]); in rtl8187_add_interface()
1138 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); in rtl8187_add_interface()
1141 mutex_unlock(&priv->conf_mutex); in rtl8187_add_interface()
1148 struct rtl8187_priv *priv = dev->priv; in rtl8187_remove_interface()
1149 mutex_lock(&priv->conf_mutex); in rtl8187_remove_interface()
1150 priv->vif = NULL; in rtl8187_remove_interface()
1151 mutex_unlock(&priv->conf_mutex); in rtl8187_remove_interface()
1156 struct rtl8187_priv *priv = dev->priv; in rtl8187_config()
1157 struct ieee80211_conf *conf = &dev->conf; in rtl8187_config()
1160 mutex_lock(&priv->conf_mutex); in rtl8187_config()
1161 reg = rtl818x_ioread32(priv, &priv->map->TX_CONF); in rtl8187_config()
1166 rtl818x_iowrite32(priv, &priv->map->TX_CONF, in rtl8187_config()
1168 priv->rf->set_chan(dev, conf); in rtl8187_config()
1170 rtl818x_iowrite32(priv, &priv->map->TX_CONF, reg); in rtl8187_config()
1172 rtl818x_iowrite16(priv, &priv->map->ATIM_WND, 2); in rtl8187_config()
1173 rtl818x_iowrite16(priv, &priv->map->ATIMTR_INTERVAL, 100); in rtl8187_config()
1174 rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL, 100); in rtl8187_config()
1175 rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL_TIME, 100); in rtl8187_config()
1176 mutex_unlock(&priv->conf_mutex); in rtl8187_config()
1196 if (priv->is_rtl8187b) { in rtl8187_conf_erp()
1202 priv->slot_time = 0x9; in rtl8187_conf_erp()
1206 priv->slot_time = 0x14; in rtl8187_conf_erp()
1210 rtl818x_iowrite8(priv, &priv->map->SIFS, 0x22); in rtl8187_conf_erp()
1211 rtl818x_iowrite8(priv, &priv->map->SLOT, priv->slot_time); in rtl8187_conf_erp()
1212 rtl818x_iowrite8(priv, &priv->map->DIFS, difs); in rtl8187_conf_erp()
1218 rtl818x_iowrite8(priv, (u8 *)&priv->map->BRSR + 1, eifs); in rtl8187_conf_erp()
1230 rtl818x_iowrite8(priv, &priv->map->CARRIER_SENSE_COUNTER, in rtl8187_conf_erp()
1235 priv->aifsn[queue] * priv->slot_time + in rtl8187_conf_erp()
1238 rtl818x_iowrite8(priv, &priv->map->SIFS, 0x22); in rtl8187_conf_erp()
1240 rtl818x_iowrite8(priv, &priv->map->SLOT, 0x9); in rtl8187_conf_erp()
1241 rtl818x_iowrite8(priv, &priv->map->DIFS, 0x14); in rtl8187_conf_erp()
1242 rtl818x_iowrite8(priv, &priv->map->EIFS, 91 - 0x14); in rtl8187_conf_erp()
1244 rtl818x_iowrite8(priv, &priv->map->SLOT, 0x14); in rtl8187_conf_erp()
1245 rtl818x_iowrite8(priv, &priv->map->DIFS, 0x24); in rtl8187_conf_erp()
1246 rtl818x_iowrite8(priv, &priv->map->EIFS, 91 - 0x24); in rtl8187_conf_erp()
1256 struct rtl8187_priv *priv = dev->priv; in rtl8187_bss_info_changed()
1261 vif_priv = (struct rtl8187_vif *)&vif->drv_priv; in rtl8187_bss_info_changed()
1264 mutex_lock(&priv->conf_mutex); in rtl8187_bss_info_changed()
1266 rtl818x_iowrite8(priv, &priv->map->BSSID[i], in rtl8187_bss_info_changed()
1267 info->bssid[i]); in rtl8187_bss_info_changed()
1269 if (priv->is_rtl8187b) in rtl8187_bss_info_changed()
1274 if (is_valid_ether_addr(info->bssid)) { in rtl8187_bss_info_changed()
1275 if (vif->type == NL80211_IFTYPE_ADHOC) in rtl8187_bss_info_changed()
1283 rtl818x_iowrite8(priv, &priv->map->MSR, reg); in rtl8187_bss_info_changed()
1285 mutex_unlock(&priv->conf_mutex); in rtl8187_bss_info_changed()
1289 rtl8187_conf_erp(priv, info->use_short_slot, in rtl8187_bss_info_changed()
1290 info->use_short_preamble); in rtl8187_bss_info_changed()
1293 vif_priv->enable_beacon = info->enable_beacon; in rtl8187_bss_info_changed()
1296 cancel_delayed_work_sync(&vif_priv->beacon_work); in rtl8187_bss_info_changed()
1297 if (vif_priv->enable_beacon) in rtl8187_bss_info_changed()
1298 schedule_work(&vif_priv->beacon_work.work); in rtl8187_bss_info_changed()
1314 struct rtl8187_priv *priv = dev->priv; in rtl8187_configure_filter()
1317 priv->rx_conf ^= RTL818X_RX_CONF_FCS; in rtl8187_configure_filter()
1319 priv->rx_conf ^= RTL818X_RX_CONF_CTRL; in rtl8187_configure_filter()
1322 priv->rx_conf |= RTL818X_RX_CONF_MONITOR; in rtl8187_configure_filter()
1324 priv->rx_conf &= ~RTL818X_RX_CONF_MONITOR; in rtl8187_configure_filter()
1328 if (priv->rx_conf & RTL818X_RX_CONF_FCS) in rtl8187_configure_filter()
1330 if (priv->rx_conf & RTL818X_RX_CONF_CTRL) in rtl8187_configure_filter()
1332 if (priv->rx_conf & RTL818X_RX_CONF_MONITOR) { in rtl8187_configure_filter()
1337 rtl818x_iowrite32_async(priv, &priv->map->RX_CONF, priv->rx_conf); in rtl8187_configure_filter()
1345 struct rtl8187_priv *priv = dev->priv; in rtl8187_conf_tx()
1349 return -EINVAL; in rtl8187_conf_tx()
1351 cw_min = fls(params->cw_min); in rtl8187_conf_tx()
1352 cw_max = fls(params->cw_max); in rtl8187_conf_tx()
1354 if (priv->is_rtl8187b) { in rtl8187_conf_tx()
1355 priv->aifsn[queue] = params->aifs; in rtl8187_conf_tx()
1359 * - TXOP limit field, bit offset = 16 in rtl8187_conf_tx()
1360 * - ECWmax, bit offset = 12 in rtl8187_conf_tx()
1361 * - ECWmin, bit offset = 8 in rtl8187_conf_tx()
1362 * - AIFS, bit offset = 0 in rtl8187_conf_tx()
1365 (params->txop << 16) | (cw_max << 12) | in rtl8187_conf_tx()
1366 (cw_min << 8) | (params->aifs * in rtl8187_conf_tx()
1367 priv->slot_time + SIFS_TIME)); in rtl8187_conf_tx()
1370 return -EINVAL; in rtl8187_conf_tx()
1372 rtl818x_iowrite8(priv, &priv->map->CW_VAL, in rtl8187_conf_tx()
1397 struct ieee80211_hw *dev = eeprom->data; in rtl8187_eeprom_register_read()
1398 struct rtl8187_priv *priv = dev->priv; in rtl8187_eeprom_register_read()
1399 u8 reg = rtl818x_ioread8(priv, &priv->map->EEPROM_CMD); in rtl8187_eeprom_register_read()
1401 eeprom->reg_data_in = reg & RTL818X_EEPROM_CMD_WRITE; in rtl8187_eeprom_register_read()
1402 eeprom->reg_data_out = reg & RTL818X_EEPROM_CMD_READ; in rtl8187_eeprom_register_read()
1403 eeprom->reg_data_clock = reg & RTL818X_EEPROM_CMD_CK; in rtl8187_eeprom_register_read()
1404 eeprom->reg_chip_select = reg & RTL818X_EEPROM_CMD_CS; in rtl8187_eeprom_register_read()
1409 struct ieee80211_hw *dev = eeprom->data; in rtl8187_eeprom_register_write()
1410 struct rtl8187_priv *priv = dev->priv; in rtl8187_eeprom_register_write()
1413 if (eeprom->reg_data_in) in rtl8187_eeprom_register_write()
1415 if (eeprom->reg_data_out) in rtl8187_eeprom_register_write()
1417 if (eeprom->reg_data_clock) in rtl8187_eeprom_register_write()
1419 if (eeprom->reg_chip_select) in rtl8187_eeprom_register_write()
1422 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, reg); in rtl8187_eeprom_register_write()
1436 u16 product_id = le16_to_cpu(udev->descriptor.idProduct); in rtl8187_probe()
1442 printk(KERN_ERR "rtl8187: ieee80211 alloc failed\n"); in rtl8187_probe()
1443 return -ENOMEM; in rtl8187_probe()
1446 priv = dev->priv; in rtl8187_probe()
1447 priv->is_rtl8187b = (id->driver_info == DEVICE_RTL8187B); in rtl8187_probe()
1450 priv->io_dmabuf = kmalloc(sizeof(*priv->io_dmabuf), GFP_KERNEL); in rtl8187_probe()
1451 if (!priv->io_dmabuf) { in rtl8187_probe()
1452 err = -ENOMEM; in rtl8187_probe()
1455 mutex_init(&priv->io_mutex); in rtl8187_probe()
1456 mutex_init(&priv->conf_mutex); in rtl8187_probe()
1458 SET_IEEE80211_DEV(dev, &intf->dev); in rtl8187_probe()
1460 priv->udev = udev; in rtl8187_probe()
1464 skb_queue_head_init(&priv->rx_queue); in rtl8187_probe()
1466 BUILD_BUG_ON(sizeof(priv->channels) != sizeof(rtl818x_channels)); in rtl8187_probe()
1467 BUILD_BUG_ON(sizeof(priv->rates) != sizeof(rtl818x_rates)); in rtl8187_probe()
1469 memcpy(priv->channels, rtl818x_channels, sizeof(rtl818x_channels)); in rtl8187_probe()
1470 memcpy(priv->rates, rtl818x_rates, sizeof(rtl818x_rates)); in rtl8187_probe()
1471 priv->map = (struct rtl818x_csr *)0xFF00; in rtl8187_probe()
1473 priv->band.band = NL80211_BAND_2GHZ; in rtl8187_probe()
1474 priv->band.channels = priv->channels; in rtl8187_probe()
1475 priv->band.n_channels = ARRAY_SIZE(rtl818x_channels); in rtl8187_probe()
1476 priv->band.bitrates = priv->rates; in rtl8187_probe()
1477 priv->band.n_bitrates = ARRAY_SIZE(rtl818x_rates); in rtl8187_probe()
1478 dev->wiphy->bands[NL80211_BAND_2GHZ] = &priv->band; in rtl8187_probe()
1484 /* Initialize rate-control variables */ in rtl8187_probe()
1485 dev->max_rates = 1; in rtl8187_probe()
1486 dev->max_rate_tries = RETRY_COUNT; in rtl8187_probe()
1491 if (rtl818x_ioread32(priv, &priv->map->RX_CONF) & (1 << 6)) in rtl8187_probe()
1496 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); in rtl8187_probe()
1508 channel = priv->channels; in rtl8187_probe()
1523 &priv->txpwr_base); in rtl8187_probe()
1525 reg = rtl818x_ioread8(priv, &priv->map->PGSELECT) & ~1; in rtl8187_probe()
1526 rtl818x_iowrite8(priv, &priv->map->PGSELECT, reg | 1); in rtl8187_probe()
1527 /* 0 means asic B-cut, we should use SW 3 wire in rtl8187_probe()
1528 * bit-by-bit banging for radio. 1 means we can use in rtl8187_probe()
1530 priv->asic_rev = rtl818x_ioread8(priv, (u8 *)0xFFFE) & 0x3; in rtl8187_probe()
1531 rtl818x_iowrite8(priv, &priv->map->PGSELECT, reg); in rtl8187_probe()
1532 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); in rtl8187_probe()
1534 if (!priv->is_rtl8187b) { in rtl8187_probe()
1536 reg32 = rtl818x_ioread32(priv, &priv->map->TX_CONF); in rtl8187_probe()
1543 priv->is_rtl8187b = 1; in rtl8187_probe()
1544 priv->hw_rev = RTL8187BvB; in rtl8187_probe()
1557 /*if (priv->asic_rev == 0) { in rtl8187_probe()
1560 priv->asic_rev = 1; in rtl8187_probe()
1565 priv->hw_rev = RTL8187BvB; in rtl8187_probe()
1569 priv->hw_rev = RTL8187BvD; in rtl8187_probe()
1573 priv->hw_rev = RTL8187BvE; in rtl8187_probe()
1577 priv->hw_rev = RTL8187BvB; in rtl8187_probe()
1581 if (!priv->is_rtl8187b) { in rtl8187_probe()
1602 priv->rfkill_mask = RFKILL_MASK_8187_89_97; in rtl8187_probe()
1606 priv->rfkill_mask = RFKILL_MASK_8198; in rtl8187_probe()
1608 dev->vif_data_size = sizeof(struct rtl8187_vif); in rtl8187_probe()
1609 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in rtl8187_probe()
1612 wiphy_ext_feature_set(dev->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in rtl8187_probe()
1614 if ((id->driver_info == DEVICE_RTL8187) && priv->is_rtl8187b) in rtl8187_probe()
1618 priv->rf = rtl8187_detect_rf(dev); in rtl8187_probe()
1619 dev->extra_tx_headroom = (!priv->is_rtl8187b) ? in rtl8187_probe()
1622 if (!priv->is_rtl8187b) in rtl8187_probe()
1623 dev->queues = 1; in rtl8187_probe()
1625 dev->queues = 4; in rtl8187_probe()
1632 skb_queue_head_init(&priv->b_tx_status.queue); in rtl8187_probe()
1634 wiphy_info(dev->wiphy, "hwaddr %pM, %s V%d + %s, rfkill mask %d\n", in rtl8187_probe()
1635 mac_addr, chip_name, priv->asic_rev, priv->rf->name, in rtl8187_probe()
1636 priv->rfkill_mask); in rtl8187_probe()
1648 kfree(priv->io_dmabuf); in rtl8187_probe()
1670 priv = dev->priv; in rtl8187_disconnect()
1671 usb_reset_device(priv->udev); in rtl8187_disconnect()
1673 kfree(priv->io_dmabuf); in rtl8187_disconnect()