|
@@ -54,8 +54,7 @@ static const u8 ac_to_hwq[] = {
|
|
|
BK_QUEUE
|
|
|
};
|
|
|
|
|
|
-static u8 _rtl_mac_to_hwqueue(struct ieee80211_hw *hw,
|
|
|
- struct sk_buff *skb)
|
|
|
+static u8 _rtl_mac_to_hwqueue(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
{
|
|
|
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
|
|
__le16 fc = rtl_get_fc(skb);
|
|
@@ -104,20 +103,18 @@ static void _rtl_pci_update_default_setting(struct ieee80211_hw *hw)
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
- /*
|
|
|
- * Always enable ASPM and Clock Req
|
|
|
+ /* Always enable ASPM and Clock Req
|
|
|
* from initialization to halt.
|
|
|
- * */
|
|
|
+ */
|
|
|
ppsc->reg_rfps_level &= ~(RT_RF_LPS_LEVEL_ASPM);
|
|
|
ppsc->reg_rfps_level |= (RT_RF_PS_LEVEL_ALWAYS_ASPM |
|
|
|
RT_RF_OFF_LEVL_CLK_REQ);
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
- /*
|
|
|
- * Always enable ASPM without Clock Req
|
|
|
+ /* Always enable ASPM without Clock Req
|
|
|
* from initialization to halt.
|
|
|
- * */
|
|
|
+ */
|
|
|
ppsc->reg_rfps_level &= ~(RT_RF_LPS_LEVEL_ASPM |
|
|
|
RT_RF_OFF_LEVL_CLK_REQ);
|
|
|
ppsc->reg_rfps_level |= RT_RF_PS_LEVEL_ALWAYS_ASPM;
|
|
@@ -146,32 +143,19 @@ static void _rtl_pci_update_default_setting(struct ieee80211_hw *hw)
|
|
|
|
|
|
/*Set HW definition to determine if it supports ASPM. */
|
|
|
switch (rtlpci->const_support_pciaspm) {
|
|
|
- case 0:{
|
|
|
- /*Not support ASPM. */
|
|
|
- bool support_aspm = false;
|
|
|
- ppsc->support_aspm = support_aspm;
|
|
|
- break;
|
|
|
- }
|
|
|
- case 1:{
|
|
|
- /*Support ASPM. */
|
|
|
- bool support_aspm = true;
|
|
|
- bool support_backdoor = true;
|
|
|
- ppsc->support_aspm = support_aspm;
|
|
|
-
|
|
|
- /*if (priv->oem_id == RT_CID_TOSHIBA &&
|
|
|
- !priv->ndis_adapter.amd_l1_patch)
|
|
|
- support_backdoor = false; */
|
|
|
-
|
|
|
- ppsc->support_backdoor = support_backdoor;
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
+ case 0:
|
|
|
+ /*Not support ASPM. */
|
|
|
+ ppsc->support_aspm = false;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ /*Support ASPM. */
|
|
|
+ ppsc->support_aspm = true;
|
|
|
+ ppsc->support_backdoor = true;
|
|
|
+ break;
|
|
|
case 2:
|
|
|
/*ASPM value set by chipset. */
|
|
|
- if (pcibridge_vendor == PCI_BRIDGE_VENDOR_INTEL) {
|
|
|
- bool support_aspm = true;
|
|
|
- ppsc->support_aspm = support_aspm;
|
|
|
- }
|
|
|
+ if (pcibridge_vendor == PCI_BRIDGE_VENDOR_INTEL)
|
|
|
+ ppsc->support_aspm = true;
|
|
|
break;
|
|
|
default:
|
|
|
pr_err("switch case %#x not processed\n",
|
|
@@ -180,10 +164,11 @@ static void _rtl_pci_update_default_setting(struct ieee80211_hw *hw)
|
|
|
}
|
|
|
|
|
|
/* toshiba aspm issue, toshiba will set aspm selfly
|
|
|
- * so we should not set aspm in driver */
|
|
|
+ * so we should not set aspm in driver
|
|
|
+ */
|
|
|
pci_read_config_byte(rtlpci->pdev, 0x80, &init_aspm);
|
|
|
if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8192SE &&
|
|
|
- init_aspm == 0x43)
|
|
|
+ init_aspm == 0x43)
|
|
|
ppsc->support_aspm = false;
|
|
|
}
|
|
|
|
|
@@ -263,8 +248,7 @@ static void rtl_pci_disable_aspm(struct ieee80211_hw *hw)
|
|
|
udelay(50);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- *Enable RTL8192SE ASPM & Enable Pci Bridge ASPM for
|
|
|
+/*Enable RTL8192SE ASPM & Enable Pci Bridge ASPM for
|
|
|
*power saving We should follow the sequence to enable
|
|
|
*RTL8192SE first then enable Pci Bridge ASPM
|
|
|
*or the system will show bluescreen.
|
|
@@ -334,7 +318,7 @@ static bool rtl_pci_get_amd_l1_patch(struct ieee80211_hw *hw)
|
|
|
|
|
|
bool status = false;
|
|
|
u8 offset_e0;
|
|
|
- unsigned offset_e4;
|
|
|
+ unsigned int offset_e4;
|
|
|
|
|
|
pci_write_config_byte(rtlpci->pdev, 0xe0, 0xa0);
|
|
|
|
|
@@ -369,12 +353,12 @@ static bool rtl_pci_check_buddy_priv(struct ieee80211_hw *hw,
|
|
|
"tpcipriv->ndis_adapter.funcnumber %x\n",
|
|
|
tpcipriv->ndis_adapter.funcnumber);
|
|
|
|
|
|
- if ((pcipriv->ndis_adapter.busnumber ==
|
|
|
- tpcipriv->ndis_adapter.busnumber) &&
|
|
|
- (pcipriv->ndis_adapter.devnumber ==
|
|
|
- tpcipriv->ndis_adapter.devnumber) &&
|
|
|
- (pcipriv->ndis_adapter.funcnumber !=
|
|
|
- tpcipriv->ndis_adapter.funcnumber)) {
|
|
|
+ if (pcipriv->ndis_adapter.busnumber ==
|
|
|
+ tpcipriv->ndis_adapter.busnumber &&
|
|
|
+ pcipriv->ndis_adapter.devnumber ==
|
|
|
+ tpcipriv->ndis_adapter.devnumber &&
|
|
|
+ pcipriv->ndis_adapter.funcnumber !=
|
|
|
+ tpcipriv->ndis_adapter.funcnumber) {
|
|
|
find_buddy_priv = true;
|
|
|
break;
|
|
|
}
|
|
@@ -407,7 +391,7 @@ static void rtl_pci_get_linkcontrol_field(struct ieee80211_hw *hw)
|
|
|
}
|
|
|
|
|
|
static void rtl_pci_parse_configuration(struct pci_dev *pdev,
|
|
|
- struct ieee80211_hw *hw)
|
|
|
+ struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
|
|
@@ -441,7 +425,6 @@ static void rtl_pci_init_aspm(struct ieee80211_hw *hw)
|
|
|
rtl_pci_enable_aspm(hw);
|
|
|
RT_SET_PS_LEVEL(ppsc, RT_RF_PS_LEVEL_ALWAYS_ASPM);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static void _rtl_pci_io_handler_init(struct device *dev,
|
|
@@ -458,11 +441,11 @@ static void _rtl_pci_io_handler_init(struct device *dev,
|
|
|
rtlpriv->io.read8_sync = pci_read8_sync;
|
|
|
rtlpriv->io.read16_sync = pci_read16_sync;
|
|
|
rtlpriv->io.read32_sync = pci_read32_sync;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static bool _rtl_update_earlymode_info(struct ieee80211_hw *hw,
|
|
|
- struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc, u8 tid)
|
|
|
+ struct sk_buff *skb,
|
|
|
+ struct rtl_tcb_desc *tcb_desc, u8 tid)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
@@ -520,13 +503,15 @@ static void _rtl_pci_tx_chk_waitq(struct ieee80211_hw *hw)
|
|
|
(rtlpriv->buddy_priv &&
|
|
|
rtlpriv->buddy_priv->easy_concurrent_ctl.switch_in_process)))
|
|
|
return;
|
|
|
- /* we juse use em for BE/BK/VI/VO */
|
|
|
+ /* we just use em for BE/BK/VI/VO */
|
|
|
for (tid = 7; tid >= 0; tid--) {
|
|
|
u8 hw_queue = ac_to_hwq[rtl_tid_to_ac(tid)];
|
|
|
struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
|
|
|
+
|
|
|
while (!mac->act_scanning &&
|
|
|
rtlpriv->psc.rfpwr_state == ERFON) {
|
|
|
struct rtl_tcb_desc tcb_desc;
|
|
|
+
|
|
|
memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
|
|
|
|
|
|
spin_lock_bh(&rtlpriv->locks.waitq_lock);
|
|
@@ -541,7 +526,8 @@ static void _rtl_pci_tx_chk_waitq(struct ieee80211_hw *hw)
|
|
|
spin_unlock_bh(&rtlpriv->locks.waitq_lock);
|
|
|
|
|
|
/* Some macaddr can't do early mode. like
|
|
|
- * multicast/broadcast/no_qos data */
|
|
|
+ * multicast/broadcast/no_qos data
|
|
|
+ */
|
|
|
info = IEEE80211_SKB_CB(skb);
|
|
|
if (info->flags & IEEE80211_TX_CTL_AMPDU)
|
|
|
_rtl_update_earlymode_info(hw, skb,
|
|
@@ -552,7 +538,6 @@ static void _rtl_pci_tx_chk_waitq(struct ieee80211_hw *hw)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
@@ -603,7 +588,6 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
|
|
|
if (prio == TXCMD_QUEUE) {
|
|
|
dev_kfree_skb(skb);
|
|
|
goto tx_status_ok;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/* for sw LPS, just after NULL skb send out, we can
|
|
@@ -643,15 +627,12 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
|
|
|
ieee80211_tx_status_irqsafe(hw, skb);
|
|
|
|
|
|
if ((ring->entries - skb_queue_len(&ring->queue)) <= 4) {
|
|
|
-
|
|
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
|
|
|
"more desc left, wake skb_queue@%d, ring->idx = %d, skb_queue_len = 0x%x\n",
|
|
|
prio, ring->idx,
|
|
|
skb_queue_len(&ring->queue));
|
|
|
|
|
|
- ieee80211_wake_queue(hw,
|
|
|
- skb_get_queue_mapping
|
|
|
- (skb));
|
|
|
+ ieee80211_wake_queue(hw, skb_get_queue_mapping(skb));
|
|
|
}
|
|
|
tx_status_ok:
|
|
|
skb = NULL;
|
|
@@ -659,7 +640,7 @@ tx_status_ok:
|
|
|
|
|
|
if (((rtlpriv->link_info.num_rx_inperiod +
|
|
|
rtlpriv->link_info.num_tx_inperiod) > 8) ||
|
|
|
- (rtlpriv->link_info.num_rx_inperiod > 2))
|
|
|
+ rtlpriv->link_info.num_rx_inperiod > 2)
|
|
|
rtl_lps_leave(hw);
|
|
|
}
|
|
|
|
|
@@ -817,7 +798,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|
|
new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
|
|
|
if (unlikely(!new_skb))
|
|
|
goto no_new;
|
|
|
- memset(&rx_status , 0 , sizeof(rx_status));
|
|
|
+ memset(&rx_status, 0, sizeof(rx_status));
|
|
|
rtlpriv->cfg->ops->query_rx_desc(hw, &stats,
|
|
|
&rx_status, (u8 *)pdesc, skb);
|
|
|
|
|
@@ -847,12 +828,11 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|
|
/* handle command packet here */
|
|
|
if (rtlpriv->cfg->ops->rx_command_packet &&
|
|
|
rtlpriv->cfg->ops->rx_command_packet(hw, &stats, skb)) {
|
|
|
- dev_kfree_skb_any(skb);
|
|
|
- goto new_trx_end;
|
|
|
+ dev_kfree_skb_any(skb);
|
|
|
+ goto new_trx_end;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * NOTICE This can not be use for mac80211,
|
|
|
+ /* NOTICE This can not be use for mac80211,
|
|
|
* this is done in mac80211 code,
|
|
|
* if done here sec DHCP will fail
|
|
|
* skb_trim(skb, skb->len - 4);
|
|
@@ -889,9 +869,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|
|
/* for sw lps */
|
|
|
rtl_swlps_beacon(hw, (void *)skb->data, skb->len);
|
|
|
rtl_recognize_peer(hw, (void *)skb->data, skb->len);
|
|
|
- if ((rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP) &&
|
|
|
- (rtlpriv->rtlhal.current_bandtype ==
|
|
|
- BAND_ON_2_4G) &&
|
|
|
+ if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP &&
|
|
|
+ rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G &&
|
|
|
(ieee80211_is_beacon(fc) ||
|
|
|
ieee80211_is_probe_resp(fc))) {
|
|
|
dev_kfree_skb_any(skb);
|
|
@@ -913,7 +892,7 @@ new_trx_end:
|
|
|
}
|
|
|
if (((rtlpriv->link_info.num_rx_inperiod +
|
|
|
rtlpriv->link_info.num_tx_inperiod) > 8) ||
|
|
|
- (rtlpriv->link_info.num_rx_inperiod > 2))
|
|
|
+ rtlpriv->link_info.num_rx_inperiod > 2)
|
|
|
rtl_lps_leave(hw);
|
|
|
skb = new_skb;
|
|
|
no_new:
|
|
@@ -947,35 +926,34 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
|
|
|
unsigned long flags;
|
|
|
u32 inta = 0;
|
|
|
u32 intb = 0;
|
|
|
+ u32 intc = 0;
|
|
|
+ u32 intd = 0;
|
|
|
irqreturn_t ret = IRQ_HANDLED;
|
|
|
|
|
|
if (rtlpci->irq_enabled == 0)
|
|
|
return ret;
|
|
|
|
|
|
- spin_lock_irqsave(&rtlpriv->locks.irq_th_lock , flags);
|
|
|
+ spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
|
|
|
rtlpriv->cfg->ops->disable_interrupt(hw);
|
|
|
|
|
|
/*read ISR: 4/8bytes */
|
|
|
- rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb);
|
|
|
+ rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb, &intc, &intd);
|
|
|
|
|
|
- /*Shared IRQ or HW disappared */
|
|
|
+ /*Shared IRQ or HW disappeared */
|
|
|
if (!inta || inta == 0xffff)
|
|
|
goto done;
|
|
|
|
|
|
/*<1> beacon related */
|
|
|
- if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK]) {
|
|
|
+ if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK])
|
|
|
RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
|
|
|
"beacon ok interrupt!\n");
|
|
|
- }
|
|
|
|
|
|
- if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_TBDER])) {
|
|
|
+ if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_TBDER]))
|
|
|
RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
|
|
|
"beacon err interrupt!\n");
|
|
|
- }
|
|
|
|
|
|
- if (inta & rtlpriv->cfg->maps[RTL_IMR_BDOK]) {
|
|
|
+ if (inta & rtlpriv->cfg->maps[RTL_IMR_BDOK])
|
|
|
RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "beacon interrupt!\n");
|
|
|
- }
|
|
|
|
|
|
if (inta & rtlpriv->cfg->maps[RTL_IMR_BCNINT]) {
|
|
|
RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
|
|
@@ -1031,6 +1009,16 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
|
|
|
_rtl_pci_tx_isr(hw, VO_QUEUE);
|
|
|
}
|
|
|
|
|
|
+ if (rtlhal->hw_type == HARDWARE_TYPE_RTL8822BE) {
|
|
|
+ if (intd & rtlpriv->cfg->maps[RTL_IMR_H2CDOK]) {
|
|
|
+ rtlpriv->link_info.num_tx_inperiod++;
|
|
|
+
|
|
|
+ RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
|
|
|
+ "H2C TX OK interrupt!\n");
|
|
|
+ _rtl_pci_tx_isr(hw, H2C_QUEUE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) {
|
|
|
if (inta & rtlpriv->cfg->maps[RTL_IMR_COMDOK]) {
|
|
|
rtlpriv->link_info.num_tx_inperiod++;
|
|
@@ -1130,7 +1118,7 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
|
|
|
|
|
|
/*NB: the beacon data buffer must be 32-bit aligned. */
|
|
|
pskb = ieee80211_beacon_get(hw, mac->vif);
|
|
|
- if (pskb == NULL)
|
|
|
+ if (!pskb)
|
|
|
return;
|
|
|
hdr = rtl_get_hdr(pskb);
|
|
|
info = IEEE80211_SKB_CB(pskb);
|
|
@@ -1152,7 +1140,6 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
|
|
|
rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, true, HW_DESC_OWN,
|
|
|
&temp_one);
|
|
|
}
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
|
|
@@ -1165,14 +1152,15 @@ static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
|
|
|
|
|
|
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192EE)
|
|
|
desc_num = TX_DESC_NUM_92E;
|
|
|
+ else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8822BE)
|
|
|
+ desc_num = TX_DESC_NUM_8822B;
|
|
|
else
|
|
|
desc_num = RT_TXDESC_NUM;
|
|
|
|
|
|
for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
|
|
|
rtlpci->txringcount[i] = desc_num;
|
|
|
|
|
|
- /*
|
|
|
- *we just alloc 2 desc for beacon queue,
|
|
|
+ /*we just alloc 2 desc for beacon queue,
|
|
|
*because we just need first desc in hw beacon.
|
|
|
*/
|
|
|
rtlpci->txringcount[BEACON_QUEUE] = 2;
|
|
@@ -1189,7 +1177,7 @@ static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
|
|
|
}
|
|
|
|
|
|
static void _rtl_pci_init_struct(struct ieee80211_hw *hw,
|
|
|
- struct pci_dev *pdev)
|
|
|
+ struct pci_dev *pdev)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
|
@@ -1361,7 +1349,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
|
|
|
}
|
|
|
|
|
|
static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
|
|
|
- unsigned int prio)
|
|
|
+ unsigned int prio)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
|
@@ -1378,8 +1366,7 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
|
|
|
entry = (u8 *)(&ring->desc[ring->idx]);
|
|
|
|
|
|
pci_unmap_single(rtlpci->pdev,
|
|
|
- rtlpriv->cfg->
|
|
|
- ops->get_desc(hw, (u8 *)entry,
|
|
|
+ rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
|
|
|
true,
|
|
|
HW_DESC_TXBUFF_ADDR),
|
|
|
skb->len, PCI_DMA_TODEVICE);
|
|
@@ -1451,8 +1438,7 @@ static int _rtl_pci_init_trx_ring(struct ieee80211_hw *hw)
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) {
|
|
|
- ret = _rtl_pci_init_tx_ring(hw, i,
|
|
|
- rtlpci->txringcount[i]);
|
|
|
+ ret = _rtl_pci_init_tx_ring(hw, i, rtlpci->txringcount[i]);
|
|
|
if (ret)
|
|
|
goto err_free_rings;
|
|
|
}
|
|
@@ -1500,7 +1486,7 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
|
|
|
/* force the rx_ring[RX_MPDU_QUEUE/
|
|
|
* RX_CMD_QUEUE].idx to the first one
|
|
|
*new trx flow, do nothing
|
|
|
- */
|
|
|
+ */
|
|
|
if (!rtlpriv->use_new_trx_flow &&
|
|
|
rtlpci->rx_ring[rxring_idx].desc) {
|
|
|
struct rtl_rx_desc *entry = NULL;
|
|
@@ -1510,8 +1496,8 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
|
|
|
entry = &rtlpci->rx_ring[rxring_idx].desc[i];
|
|
|
bufferaddress =
|
|
|
rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
|
|
|
- false , HW_DESC_RXBUFF_ADDR);
|
|
|
- memset((u8 *)entry , 0 ,
|
|
|
+ false, HW_DESC_RXBUFF_ADDR);
|
|
|
+ memset((u8 *)entry, 0,
|
|
|
sizeof(*rtlpci->rx_ring
|
|
|
[rxring_idx].desc));/*clear one entry*/
|
|
|
if (rtlpriv->use_new_trx_flow) {
|
|
@@ -1540,8 +1526,7 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
|
|
|
rtlpci->rx_ring[rxring_idx].idx = 0;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- *after reset, release previous pending packet,
|
|
|
+ /*after reset, release previous pending packet,
|
|
|
*and force the tx idx to the first one
|
|
|
*/
|
|
|
spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
|
|
@@ -1642,7 +1627,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
|
|
|
|
|
|
if (rtlpriv->psc.sw_ps_enabled) {
|
|
|
if (ieee80211_is_data(fc) && !ieee80211_is_nullfunc(fc) &&
|
|
|
- !ieee80211_has_pm(fc))
|
|
|
+ !ieee80211_has_pm(fc))
|
|
|
hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
|
|
|
}
|
|
|
|
|
@@ -1674,7 +1659,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
|
|
|
own = (u8)rtlpriv->cfg->ops->get_desc(hw, (u8 *)pdesc,
|
|
|
true, HW_DESC_OWN);
|
|
|
|
|
|
- if ((own == 1) && (hw_queue != BEACON_QUEUE)) {
|
|
|
+ if (own == 1 && hw_queue != BEACON_QUEUE) {
|
|
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
|
|
|
"No more TX desc@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%x\n",
|
|
|
hw_queue, ring->idx, idx,
|
|
@@ -1688,11 +1673,10 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
|
|
|
|
|
|
if (rtlpriv->cfg->ops->get_available_desc &&
|
|
|
rtlpriv->cfg->ops->get_available_desc(hw, hw_queue) == 0) {
|
|
|
- RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
|
|
|
- "get_available_desc fail\n");
|
|
|
- spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock,
|
|
|
- flags);
|
|
|
- return skb->len;
|
|
|
+ RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
|
|
|
+ "get_available_desc fail\n");
|
|
|
+ spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
|
|
|
+ return skb->len;
|
|
|
}
|
|
|
|
|
|
if (ieee80211_is_data(fc))
|
|
@@ -1751,7 +1735,7 @@ static void rtl_pci_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
|
|
|
ring = &pcipriv->dev.tx_ring[queue_id];
|
|
|
queue_len = skb_queue_len(&ring->queue);
|
|
|
if (queue_len == 0 || queue_id == BEACON_QUEUE ||
|
|
|
- queue_id == TXCMD_QUEUE) {
|
|
|
+ queue_id == TXCMD_QUEUE) {
|
|
|
queue_id--;
|
|
|
continue;
|
|
|
} else {
|
|
@@ -1761,7 +1745,7 @@ static void rtl_pci_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
|
|
|
|
|
|
/* we just wait 1s for all queues */
|
|
|
if (rtlpriv->psc.rfpwr_state == ERFOFF ||
|
|
|
- is_hal_stop(rtlhal) || i >= 200)
|
|
|
+ is_hal_stop(rtlhal) || i >= 200)
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -1779,7 +1763,6 @@ static void rtl_pci_deinit(struct ieee80211_hw *hw)
|
|
|
|
|
|
flush_workqueue(rtlpriv->works.rtl_wq);
|
|
|
destroy_workqueue(rtlpriv->works.rtl_wq);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static int rtl_pci_init(struct ieee80211_hw *hw, struct pci_dev *pdev)
|
|
@@ -1837,7 +1820,7 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
|
|
|
|
|
|
rtlpci->up_first_time = false;
|
|
|
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "rtl_pci_start OK\n");
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%s OK\n", __func__);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1848,13 +1831,12 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
|
|
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
|
|
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
|
|
unsigned long flags;
|
|
|
- u8 RFInProgressTimeOut = 0;
|
|
|
+ u8 rf_timeout = 0;
|
|
|
|
|
|
if (rtlpriv->cfg->ops->get_btc_status())
|
|
|
rtlpriv->btcoexist.btc_ops->btc_halt_notify();
|
|
|
|
|
|
- /*
|
|
|
- *should be before disable interrupt&adapter
|
|
|
+ /*should be before disable interrupt&adapter
|
|
|
*and will do it immediately.
|
|
|
*/
|
|
|
set_hal_stop(rtlhal);
|
|
@@ -1866,12 +1848,12 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
|
|
spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags);
|
|
|
while (ppsc->rfchange_inprogress) {
|
|
|
spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flags);
|
|
|
- if (RFInProgressTimeOut > 100) {
|
|
|
+ if (rf_timeout > 100) {
|
|
|
spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags);
|
|
|
break;
|
|
|
}
|
|
|
mdelay(1);
|
|
|
- RFInProgressTimeOut++;
|
|
|
+ rf_timeout++;
|
|
|
spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags);
|
|
|
}
|
|
|
ppsc->rfchange_inprogress = true;
|
|
@@ -1891,7 +1873,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
|
|
}
|
|
|
|
|
|
static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
|
|
- struct ieee80211_hw *hw)
|
|
|
+ struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
|
|
@@ -1946,13 +1928,12 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
|
|
venderid, deviceid);
|
|
|
rtlhal->hw_type = HARDWARE_TYPE_RTL8192SE;
|
|
|
break;
|
|
|
-
|
|
|
}
|
|
|
} else if (deviceid == RTL_PCI_8723AE_DID) {
|
|
|
rtlhal->hw_type = HARDWARE_TYPE_RTL8723AE;
|
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
|
|
|
- "8723AE PCI-E is found - "
|
|
|
- "vid/did=%x/%x\n", venderid, deviceid);
|
|
|
+ "8723AE PCI-E is found - vid/did=%x/%x\n",
|
|
|
+ venderid, deviceid);
|
|
|
} else if (deviceid == RTL_PCI_8192CET_DID ||
|
|
|
deviceid == RTL_PCI_8192CE_DID ||
|
|
|
deviceid == RTL_PCI_8191CE_DID ||
|
|
@@ -1972,21 +1953,26 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
"Find adapter, Hardware type is 8188EE\n");
|
|
|
} else if (deviceid == RTL_PCI_8723BE_DID) {
|
|
|
- rtlhal->hw_type = HARDWARE_TYPE_RTL8723BE;
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
|
|
|
- "Find adapter, Hardware type is 8723BE\n");
|
|
|
+ rtlhal->hw_type = HARDWARE_TYPE_RTL8723BE;
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
+ "Find adapter, Hardware type is 8723BE\n");
|
|
|
} else if (deviceid == RTL_PCI_8192EE_DID) {
|
|
|
- rtlhal->hw_type = HARDWARE_TYPE_RTL8192EE;
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
|
|
|
- "Find adapter, Hardware type is 8192EE\n");
|
|
|
+ rtlhal->hw_type = HARDWARE_TYPE_RTL8192EE;
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
+ "Find adapter, Hardware type is 8192EE\n");
|
|
|
} else if (deviceid == RTL_PCI_8821AE_DID) {
|
|
|
- rtlhal->hw_type = HARDWARE_TYPE_RTL8821AE;
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
|
|
|
- "Find adapter, Hardware type is 8821AE\n");
|
|
|
+ rtlhal->hw_type = HARDWARE_TYPE_RTL8821AE;
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
+ "Find adapter, Hardware type is 8821AE\n");
|
|
|
} else if (deviceid == RTL_PCI_8812AE_DID) {
|
|
|
- rtlhal->hw_type = HARDWARE_TYPE_RTL8812AE;
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
|
|
|
- "Find adapter, Hardware type is 8812AE\n");
|
|
|
+ rtlhal->hw_type = HARDWARE_TYPE_RTL8812AE;
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
+ "Find adapter, Hardware type is 8812AE\n");
|
|
|
+ } else if (deviceid == RTL_PCI_8822BE_DID) {
|
|
|
+ rtlhal->hw_type = HARDWARE_TYPE_RTL8822BE;
|
|
|
+ rtlhal->bandset = BAND_ON_BOTH;
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
+ "Find adapter, Hardware type is 8822BE\n");
|
|
|
} else {
|
|
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
|
|
|
"Err: Unknown device - vid/did=%x/%x\n",
|
|
@@ -2014,11 +2000,17 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* 92ee use new trx flow */
|
|
|
- if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192EE)
|
|
|
+ switch (rtlhal->hw_type) {
|
|
|
+ case HARDWARE_TYPE_RTL8192EE:
|
|
|
+ case HARDWARE_TYPE_RTL8822BE:
|
|
|
+ /* use new trx flow */
|
|
|
rtlpriv->use_new_trx_flow = true;
|
|
|
- else
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
rtlpriv->use_new_trx_flow = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
/*find bus info */
|
|
|
pcipriv->ndis_adapter.busnumber = pdev->bus->number;
|
|
@@ -2109,7 +2101,7 @@ static int rtl_pci_intr_mode_msi(struct ieee80211_hw *hw)
|
|
|
|
|
|
rtlpci->using_msi = true;
|
|
|
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT|COMP_INTR, DBG_DMESG,
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT | COMP_INTR, DBG_DMESG,
|
|
|
"MSI Interrupt Mode!\n");
|
|
|
return 0;
|
|
|
}
|
|
@@ -2127,7 +2119,7 @@ static int rtl_pci_intr_mode_legacy(struct ieee80211_hw *hw)
|
|
|
return ret;
|
|
|
|
|
|
rtlpci->using_msi = false;
|
|
|
- RT_TRACE(rtlpriv, COMP_INIT|COMP_INTR, DBG_DMESG,
|
|
|
+ RT_TRACE(rtlpriv, COMP_INIT | COMP_INTR, DBG_DMESG,
|
|
|
"Pin-based Interrupt Mode!\n");
|
|
|
return 0;
|
|
|
}
|
|
@@ -2164,7 +2156,7 @@ static void platform_enable_dma64(struct pci_dev *pdev, bool dma64)
|
|
|
}
|
|
|
|
|
|
int rtl_pci_probe(struct pci_dev *pdev,
|
|
|
- const struct pci_device_id *id)
|
|
|
+ const struct pci_device_id *id)
|
|
|
{
|
|
|
struct ieee80211_hw *hw = NULL;
|
|
|
|
|
@@ -2343,7 +2335,6 @@ fail1:
|
|
|
pci_disable_device(pdev);
|
|
|
|
|
|
return err;
|
|
|
-
|
|
|
}
|
|
|
EXPORT_SYMBOL(rtl_pci_probe);
|
|
|
|
|
@@ -2402,20 +2393,20 @@ EXPORT_SYMBOL(rtl_pci_disconnect);
|
|
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
|
/***************************************
|
|
|
-kernel pci power state define:
|
|
|
-PCI_D0 ((pci_power_t __force) 0)
|
|
|
-PCI_D1 ((pci_power_t __force) 1)
|
|
|
-PCI_D2 ((pci_power_t __force) 2)
|
|
|
-PCI_D3hot ((pci_power_t __force) 3)
|
|
|
-PCI_D3cold ((pci_power_t __force) 4)
|
|
|
-PCI_UNKNOWN ((pci_power_t __force) 5)
|
|
|
-
|
|
|
-This function is called when system
|
|
|
-goes into suspend state mac80211 will
|
|
|
-call rtl_mac_stop() from the mac80211
|
|
|
-suspend function first, So there is
|
|
|
-no need to call hw_disable here.
|
|
|
-****************************************/
|
|
|
+ * kernel pci power state define:
|
|
|
+ * PCI_D0 ((pci_power_t __force) 0)
|
|
|
+ * PCI_D1 ((pci_power_t __force) 1)
|
|
|
+ * PCI_D2 ((pci_power_t __force) 2)
|
|
|
+ * PCI_D3hot ((pci_power_t __force) 3)
|
|
|
+ * PCI_D3cold ((pci_power_t __force) 4)
|
|
|
+ * PCI_UNKNOWN ((pci_power_t __force) 5)
|
|
|
+
|
|
|
+ * This function is called when system
|
|
|
+ * goes into suspend state mac80211 will
|
|
|
+ * call rtl_mac_stop() from the mac80211
|
|
|
+ * suspend function first, So there is
|
|
|
+ * no need to call hw_disable here.
|
|
|
+ ****************************************/
|
|
|
int rtl_pci_suspend(struct device *dev)
|
|
|
{
|
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|