.. | .. |
---|
1607 | 1607 | static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv) |
---|
1608 | 1608 | { |
---|
1609 | 1609 | struct device *dev = &priv->udev->dev; |
---|
1610 | | - u32 val32, bonding; |
---|
| 1610 | + u32 val32, bonding, sys_cfg; |
---|
1611 | 1611 | u16 val16; |
---|
1612 | 1612 | |
---|
1613 | | - val32 = rtl8xxxu_read32(priv, REG_SYS_CFG); |
---|
1614 | | - priv->chip_cut = (val32 & SYS_CFG_CHIP_VERSION_MASK) >> |
---|
| 1613 | + sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG); |
---|
| 1614 | + priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >> |
---|
1615 | 1615 | SYS_CFG_CHIP_VERSION_SHIFT; |
---|
1616 | | - if (val32 & SYS_CFG_TRP_VAUX_EN) { |
---|
| 1616 | + if (sys_cfg & SYS_CFG_TRP_VAUX_EN) { |
---|
1617 | 1617 | dev_info(dev, "Unsupported test chip\n"); |
---|
1618 | 1618 | return -ENOTSUPP; |
---|
1619 | 1619 | } |
---|
1620 | 1620 | |
---|
1621 | | - if (val32 & SYS_CFG_BT_FUNC) { |
---|
| 1621 | + if (sys_cfg & SYS_CFG_BT_FUNC) { |
---|
1622 | 1622 | if (priv->chip_cut >= 3) { |
---|
1623 | 1623 | sprintf(priv->chip_name, "8723BU"); |
---|
1624 | 1624 | priv->rtl_chip = RTL8723B; |
---|
.. | .. |
---|
1640 | 1640 | if (val32 & MULTI_GPS_FUNC_EN) |
---|
1641 | 1641 | priv->has_gps = 1; |
---|
1642 | 1642 | priv->is_multi_func = 1; |
---|
1643 | | - } else if (val32 & SYS_CFG_TYPE_ID) { |
---|
| 1643 | + } else if (sys_cfg & SYS_CFG_TYPE_ID) { |
---|
1644 | 1644 | bonding = rtl8xxxu_read32(priv, REG_HPON_FSM); |
---|
1645 | 1645 | bonding &= HPON_FSM_BONDING_MASK; |
---|
1646 | 1646 | if (priv->fops->tx_desc_size == |
---|
.. | .. |
---|
1688 | 1688 | case RTL8188E: |
---|
1689 | 1689 | case RTL8192E: |
---|
1690 | 1690 | case RTL8723B: |
---|
1691 | | - switch (val32 & SYS_CFG_VENDOR_EXT_MASK) { |
---|
| 1691 | + switch (sys_cfg & SYS_CFG_VENDOR_EXT_MASK) { |
---|
1692 | 1692 | case SYS_CFG_VENDOR_ID_TSMC: |
---|
1693 | 1693 | sprintf(priv->chip_vendor, "TSMC"); |
---|
1694 | 1694 | break; |
---|
.. | .. |
---|
1705 | 1705 | } |
---|
1706 | 1706 | break; |
---|
1707 | 1707 | default: |
---|
1708 | | - if (val32 & SYS_CFG_VENDOR_ID) { |
---|
| 1708 | + if (sys_cfg & SYS_CFG_VENDOR_ID) { |
---|
1709 | 1709 | sprintf(priv->chip_vendor, "UMC"); |
---|
1710 | 1710 | priv->vendor_umc = 1; |
---|
1711 | 1711 | } else { |
---|
.. | .. |
---|
4045 | 4045 | RCR_ACCEPT_MGMT_FRAME | RCR_HTC_LOC_CTRL | |
---|
4046 | 4046 | RCR_APPEND_PHYSTAT | RCR_APPEND_ICV | RCR_APPEND_MIC; |
---|
4047 | 4047 | rtl8xxxu_write32(priv, REG_RCR, val32); |
---|
| 4048 | + priv->regrcr = val32; |
---|
4048 | 4049 | |
---|
4049 | 4050 | /* |
---|
4050 | 4051 | * Accept all multicast |
---|
.. | .. |
---|
4369 | 4370 | void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv, |
---|
4370 | 4371 | u8 macid, bool connect) |
---|
4371 | 4372 | { |
---|
4372 | | -#ifdef RTL8XXXU_GEN2_REPORT_CONNECT |
---|
4373 | 4373 | /* |
---|
4374 | | - * Barry Day reports this causes issues with 8192eu and 8723bu |
---|
4375 | | - * devices reconnecting. The reason for this is unclear, but |
---|
4376 | | - * until it is better understood, leave the code in place but |
---|
4377 | | - * disabled, so it is not lost. |
---|
| 4374 | + * The firmware turns on the rate control when it knows it's |
---|
| 4375 | + * connected to a network. |
---|
4378 | 4376 | */ |
---|
4379 | 4377 | struct h2c_cmd h2c; |
---|
4380 | 4378 | |
---|
.. | .. |
---|
4387 | 4385 | h2c.media_status_rpt.parm &= ~BIT(0); |
---|
4388 | 4386 | |
---|
4389 | 4387 | rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt)); |
---|
4390 | | -#endif |
---|
4391 | 4388 | } |
---|
4392 | 4389 | |
---|
4393 | 4390 | void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv) |
---|
.. | .. |
---|
5188 | 5185 | pending = priv->rx_urb_pending_count; |
---|
5189 | 5186 | } else { |
---|
5190 | 5187 | skb = (struct sk_buff *)rx_urb->urb.context; |
---|
5191 | | - dev_kfree_skb(skb); |
---|
| 5188 | + dev_kfree_skb_irq(skb); |
---|
5192 | 5189 | usb_free_urb(&rx_urb->urb); |
---|
5193 | 5190 | } |
---|
5194 | 5191 | |
---|
.. | .. |
---|
5495 | 5492 | btcoex = &priv->bt_coex; |
---|
5496 | 5493 | rarpt = &priv->ra_report; |
---|
5497 | 5494 | |
---|
5498 | | - if (priv->rf_paths > 1) |
---|
5499 | | - goto out; |
---|
5500 | | - |
---|
5501 | 5495 | while (!skb_queue_empty(&priv->c2hcmd_queue)) { |
---|
5502 | 5496 | spin_lock_irqsave(&priv->c2hcmd_lock, flags); |
---|
5503 | 5497 | skb = __skb_dequeue(&priv->c2hcmd_queue); |
---|
.. | .. |
---|
5520 | 5514 | rarpt->txrate.flags = 0; |
---|
5521 | 5515 | rate = c2h->ra_report.rate; |
---|
5522 | 5516 | sgi = c2h->ra_report.sgi; |
---|
5523 | | - bw = c2h->ra_report.bw; |
---|
5524 | 5517 | |
---|
5525 | 5518 | if (rate < DESC_RATE_MCS0) { |
---|
5526 | 5519 | rarpt->txrate.legacy = |
---|
.. | .. |
---|
5537 | 5530 | RATE_INFO_FLAGS_SHORT_GI; |
---|
5538 | 5531 | } |
---|
5539 | 5532 | |
---|
5540 | | - if (bw == RATE_INFO_BW_20) |
---|
5541 | | - rarpt->txrate.bw |= RATE_INFO_BW_20; |
---|
| 5533 | + if (skb->len >= offsetofend(typeof(*c2h), ra_report.bw)) { |
---|
| 5534 | + if (c2h->ra_report.bw == RTL8XXXU_CHANNEL_WIDTH_40) |
---|
| 5535 | + bw = RATE_INFO_BW_40; |
---|
| 5536 | + else |
---|
| 5537 | + bw = RATE_INFO_BW_20; |
---|
| 5538 | + rarpt->txrate.bw = bw; |
---|
| 5539 | + } |
---|
5542 | 5540 | } |
---|
5543 | 5541 | bit_rate = cfg80211_calculate_bitrate(&rarpt->txrate); |
---|
5544 | 5542 | rarpt->bit_rate = bit_rate; |
---|
.. | .. |
---|
5547 | 5545 | default: |
---|
5548 | 5546 | break; |
---|
5549 | 5547 | } |
---|
5550 | | - } |
---|
5551 | 5548 | |
---|
5552 | | -out: |
---|
5553 | | - dev_kfree_skb(skb); |
---|
| 5549 | + dev_kfree_skb(skb); |
---|
| 5550 | + } |
---|
5554 | 5551 | } |
---|
5555 | 5552 | |
---|
5556 | 5553 | static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv, |
---|
.. | .. |
---|
5912 | 5909 | { |
---|
5913 | 5910 | struct rtl8xxxu_priv *priv = hw->priv; |
---|
5914 | 5911 | struct device *dev = &priv->udev->dev; |
---|
5915 | | - u16 val16; |
---|
5916 | 5912 | int ret = 0, channel; |
---|
5917 | 5913 | bool ht40; |
---|
5918 | 5914 | |
---|
.. | .. |
---|
5921 | 5917 | "%s: channel: %i (changed %08x chandef.width %02x)\n", |
---|
5922 | 5918 | __func__, hw->conf.chandef.chan->hw_value, |
---|
5923 | 5919 | changed, hw->conf.chandef.width); |
---|
5924 | | - |
---|
5925 | | - if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) { |
---|
5926 | | - val16 = ((hw->conf.long_frame_max_tx_count << |
---|
5927 | | - RETRY_LIMIT_LONG_SHIFT) & RETRY_LIMIT_LONG_MASK) | |
---|
5928 | | - ((hw->conf.short_frame_max_tx_count << |
---|
5929 | | - RETRY_LIMIT_SHORT_SHIFT) & RETRY_LIMIT_SHORT_MASK); |
---|
5930 | | - rtl8xxxu_write16(priv, REG_RETRY_LIMIT, val16); |
---|
5931 | | - } |
---|
5932 | 5920 | |
---|
5933 | 5921 | if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { |
---|
5934 | 5922 | switch (hw->conf.chandef.width) { |
---|
.. | .. |
---|
6012 | 6000 | unsigned int *total_flags, u64 multicast) |
---|
6013 | 6001 | { |
---|
6014 | 6002 | struct rtl8xxxu_priv *priv = hw->priv; |
---|
6015 | | - u32 rcr = rtl8xxxu_read32(priv, REG_RCR); |
---|
| 6003 | + u32 rcr = priv->regrcr; |
---|
6016 | 6004 | |
---|
6017 | 6005 | dev_dbg(&priv->udev->dev, "%s: changed_flags %08x, total_flags %08x\n", |
---|
6018 | 6006 | __func__, changed_flags, *total_flags); |
---|
.. | .. |
---|
6058 | 6046 | */ |
---|
6059 | 6047 | |
---|
6060 | 6048 | rtl8xxxu_write32(priv, REG_RCR, rcr); |
---|
| 6049 | + priv->regrcr = rcr; |
---|
6061 | 6050 | |
---|
6062 | 6051 | *total_flags &= (FIF_ALLMULTI | FIF_FCSFAIL | FIF_BCN_PRBRESP_PROMISC | |
---|
6063 | 6052 | FIF_CONTROL | FIF_OTHER_BSS | FIF_PSPOLL | |
---|