diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2014-03-04 17:53:47 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-03-06 14:29:56 -0500 |
commit | f3355dd9f7c261d2a3e505ba5c62ffe3cd4df97a (patch) | |
tree | beea2255a875b3917b3df64ec42585c2ffae6c93 /drivers/net/wireless/rtlwifi/pci.c | |
parent | 997bc71a3601b25dbbe3ac75b77b4f49582c0ae5 (diff) |
rtlwifi: rtl8192ce: rtl8192cu: rtl8192de: rtl8192se: rtl8723ae: rtl8723be: rtl8188eu: Modify for new API
The addition of a driver for the RTL8821AE requires a new API for the
fill_tx_desc() and set_desc() callback routines. This commit makes the
appropriate modifications in all the other drivers.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/pci.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/pci.c | 64 |
1 files changed, 38 insertions, 26 deletions
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 257726860a43..f26f4ffc771d 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -811,19 +811,19 @@ done: | |||
811 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) | 811 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) |
812 | return; | 812 | return; |
813 | tmp_one = 1; | 813 | tmp_one = 1; |
814 | rtlpriv->cfg->ops->set_desc((u8 *) pdesc, false, | 814 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false, |
815 | HW_DESC_RXBUFF_ADDR, | 815 | HW_DESC_RXBUFF_ADDR, |
816 | (u8 *)&bufferaddress); | 816 | (u8 *)&bufferaddress); |
817 | rtlpriv->cfg->ops->set_desc((u8 *)pdesc, false, | 817 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false, |
818 | HW_DESC_RXPKT_LEN, | 818 | HW_DESC_RXPKT_LEN, |
819 | (u8 *)&rtlpci->rxbuffersize); | 819 | (u8 *)&rtlpci->rxbuffersize); |
820 | 820 | ||
821 | if (index == rtlpci->rxringcount - 1) | 821 | if (index == rtlpci->rxringcount - 1) |
822 | rtlpriv->cfg->ops->set_desc((u8 *)pdesc, false, | 822 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false, |
823 | HW_DESC_RXERO, | 823 | HW_DESC_RXERO, |
824 | &tmp_one); | 824 | &tmp_one); |
825 | 825 | ||
826 | rtlpriv->cfg->ops->set_desc((u8 *)pdesc, false, HW_DESC_RXOWN, | 826 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false, HW_DESC_RXOWN, |
827 | &tmp_one); | 827 | &tmp_one); |
828 | 828 | ||
829 | index = (index + 1) % rtlpci->rxringcount; | 829 | index = (index + 1) % rtlpci->rxringcount; |
@@ -983,6 +983,8 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) | |||
983 | struct sk_buff *pskb = NULL; | 983 | struct sk_buff *pskb = NULL; |
984 | struct rtl_tx_desc *pdesc = NULL; | 984 | struct rtl_tx_desc *pdesc = NULL; |
985 | struct rtl_tcb_desc tcb_desc; | 985 | struct rtl_tcb_desc tcb_desc; |
986 | /*This is for new trx flow*/ | ||
987 | struct rtl_tx_buffer_desc *pbuffer_desc = NULL; | ||
986 | u8 temp_one = 1; | 988 | u8 temp_one = 1; |
987 | 989 | ||
988 | memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); | 990 | memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); |
@@ -1004,11 +1006,12 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) | |||
1004 | info = IEEE80211_SKB_CB(pskb); | 1006 | info = IEEE80211_SKB_CB(pskb); |
1005 | pdesc = &ring->desc[0]; | 1007 | pdesc = &ring->desc[0]; |
1006 | rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *) pdesc, | 1008 | rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *) pdesc, |
1007 | info, NULL, pskb, BEACON_QUEUE, &tcb_desc); | 1009 | (u8 *)pbuffer_desc, info, NULL, pskb, |
1010 | BEACON_QUEUE, &tcb_desc); | ||
1008 | 1011 | ||
1009 | __skb_queue_tail(&ring->queue, pskb); | 1012 | __skb_queue_tail(&ring->queue, pskb); |
1010 | 1013 | ||
1011 | rtlpriv->cfg->ops->set_desc((u8 *) pdesc, true, HW_DESC_OWN, | 1014 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, true, HW_DESC_OWN, |
1012 | &temp_one); | 1015 | &temp_one); |
1013 | 1016 | ||
1014 | return; | 1017 | return; |
@@ -1113,7 +1116,7 @@ static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw, | |||
1113 | ((i + 1) % entries) * | 1116 | ((i + 1) % entries) * |
1114 | sizeof(*ring); | 1117 | sizeof(*ring); |
1115 | 1118 | ||
1116 | rtlpriv->cfg->ops->set_desc((u8 *)&(ring[i]), | 1119 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)&(ring[i]), |
1117 | true, HW_DESC_TX_NEXTDESC_ADDR, | 1120 | true, HW_DESC_TX_NEXTDESC_ADDR, |
1118 | (u8 *)&nextdescaddress); | 1121 | (u8 *)&nextdescaddress); |
1119 | } | 1122 | } |
@@ -1188,19 +1191,19 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw) | |||
1188 | dev_kfree_skb_any(skb); | 1191 | dev_kfree_skb_any(skb); |
1189 | return 1; | 1192 | return 1; |
1190 | } | 1193 | } |
1191 | rtlpriv->cfg->ops->set_desc((u8 *)entry, false, | 1194 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, |
1192 | HW_DESC_RXBUFF_ADDR, | 1195 | HW_DESC_RXBUFF_ADDR, |
1193 | (u8 *)&bufferaddress); | 1196 | (u8 *)&bufferaddress); |
1194 | rtlpriv->cfg->ops->set_desc((u8 *)entry, false, | 1197 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, |
1195 | HW_DESC_RXPKT_LEN, | 1198 | HW_DESC_RXPKT_LEN, |
1196 | (u8 *)&rtlpci-> | 1199 | (u8 *)&rtlpci-> |
1197 | rxbuffersize); | 1200 | rxbuffersize); |
1198 | rtlpriv->cfg->ops->set_desc((u8 *) entry, false, | 1201 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, |
1199 | HW_DESC_RXOWN, | 1202 | HW_DESC_RXOWN, |
1200 | &tmp_one); | 1203 | &tmp_one); |
1201 | } | 1204 | } |
1202 | 1205 | ||
1203 | rtlpriv->cfg->ops->set_desc((u8 *) entry, false, | 1206 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, |
1204 | HW_DESC_RXERO, &tmp_one); | 1207 | HW_DESC_RXERO, &tmp_one); |
1205 | } | 1208 | } |
1206 | return 0; | 1209 | return 0; |
@@ -1331,7 +1334,7 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw) | |||
1331 | 1334 | ||
1332 | for (i = 0; i < rtlpci->rxringcount; i++) { | 1335 | for (i = 0; i < rtlpci->rxringcount; i++) { |
1333 | entry = &rtlpci->rx_ring[rx_queue_idx].desc[i]; | 1336 | entry = &rtlpci->rx_ring[rx_queue_idx].desc[i]; |
1334 | rtlpriv->cfg->ops->set_desc((u8 *) entry, | 1337 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, |
1335 | false, | 1338 | false, |
1336 | HW_DESC_RXOWN, | 1339 | HW_DESC_RXOWN, |
1337 | &tmp_one); | 1340 | &tmp_one); |
@@ -1424,6 +1427,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, | |||
1424 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1427 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1425 | struct rtl8192_tx_ring *ring; | 1428 | struct rtl8192_tx_ring *ring; |
1426 | struct rtl_tx_desc *pdesc; | 1429 | struct rtl_tx_desc *pdesc; |
1430 | struct rtl_tx_buffer_desc *ptx_bd_desc = NULL; | ||
1427 | u8 idx; | 1431 | u8 idx; |
1428 | u8 hw_queue = _rtl_mac_to_hwqueue(hw, skb); | 1432 | u8 hw_queue = _rtl_mac_to_hwqueue(hw, skb); |
1429 | unsigned long flags; | 1433 | unsigned long flags; |
@@ -1464,17 +1468,22 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, | |||
1464 | idx = 0; | 1468 | idx = 0; |
1465 | 1469 | ||
1466 | pdesc = &ring->desc[idx]; | 1470 | pdesc = &ring->desc[idx]; |
1467 | own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) pdesc, | 1471 | if (rtlpriv->use_new_trx_flow) { |
1468 | true, HW_DESC_OWN); | 1472 | ptx_bd_desc = &ring->buffer_desc[idx]; |
1473 | } else { | ||
1474 | own = (u8) rtlpriv->cfg->ops->get_desc((u8 *)pdesc, | ||
1475 | true, HW_DESC_OWN); | ||
1469 | 1476 | ||
1470 | if ((own == 1) && (hw_queue != BEACON_QUEUE)) { | 1477 | if ((own == 1) && (hw_queue != BEACON_QUEUE)) { |
1471 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, | 1478 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, |
1472 | "No more TX desc@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%d\n", | 1479 | "No more TX desc@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%d\n", |
1473 | hw_queue, ring->idx, idx, | 1480 | hw_queue, ring->idx, idx, |
1474 | skb_queue_len(&ring->queue)); | 1481 | skb_queue_len(&ring->queue)); |
1475 | 1482 | ||
1476 | spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); | 1483 | spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, |
1477 | return skb->len; | 1484 | flags); |
1485 | return skb->len; | ||
1486 | } | ||
1478 | } | 1487 | } |
1479 | 1488 | ||
1480 | if (ieee80211_is_data_qos(fc)) { | 1489 | if (ieee80211_is_data_qos(fc)) { |
@@ -1494,17 +1503,20 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, | |||
1494 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_TX); | 1503 | rtlpriv->cfg->ops->led_control(hw, LED_CTL_TX); |
1495 | 1504 | ||
1496 | rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *)pdesc, | 1505 | rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *)pdesc, |
1497 | info, sta, skb, hw_queue, ptcb_desc); | 1506 | (u8 *)ptx_bd_desc, info, sta, skb, hw_queue, ptcb_desc); |
1498 | 1507 | ||
1499 | __skb_queue_tail(&ring->queue, skb); | 1508 | __skb_queue_tail(&ring->queue, skb); |
1500 | 1509 | ||
1501 | rtlpriv->cfg->ops->set_desc((u8 *)pdesc, true, | 1510 | if (rtlpriv->use_new_trx_flow) { |
1502 | HW_DESC_OWN, &temp_one); | 1511 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, true, |
1503 | 1512 | HW_DESC_OWN, (u8 *)&hw_queue); | |
1513 | } else { | ||
1514 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, true, | ||
1515 | HW_DESC_OWN, (u8 *)&temp_one); | ||
1516 | } | ||
1504 | 1517 | ||
1505 | if ((ring->entries - skb_queue_len(&ring->queue)) < 2 && | 1518 | if ((ring->entries - skb_queue_len(&ring->queue)) < 2 && |
1506 | hw_queue != BEACON_QUEUE) { | 1519 | hw_queue != BEACON_QUEUE) { |
1507 | |||
1508 | RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, | 1520 | RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, |
1509 | "less desc left, stop skb_queue@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%d\n", | 1521 | "less desc left, stop skb_queue@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%d\n", |
1510 | hw_queue, ring->idx, idx, | 1522 | hw_queue, ring->idx, idx, |