Commit 867ba964 authored by Sergey Matyukevich's avatar Sergey Matyukevich Committed by Kalle Valo

qtnfmac: skb2rbd_attach cleanup

Update PCIE_HDP_TX_HOST_Q_WR_PTR register in skb2rbd_attach as a part of
procedure of passing new Rx buffer to hardware. Sync up all the the
qtnf_rx_bd descriptor updates before passing Rx buffer to hardware.
Signed-off-by: default avatarSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent c58730ca
...@@ -411,11 +411,6 @@ static int alloc_bd_table(struct qtnf_pcie_bus_priv *priv) ...@@ -411,11 +411,6 @@ static int alloc_bd_table(struct qtnf_pcie_bus_priv *priv)
writel(priv->rx_bd_num | (sizeof(struct qtnf_rx_bd)) << 16, writel(priv->rx_bd_num | (sizeof(struct qtnf_rx_bd)) << 16,
PCIE_HDP_TX_HOST_Q_SZ_CTRL(priv->pcie_reg_base)); PCIE_HDP_TX_HOST_Q_SZ_CTRL(priv->pcie_reg_base));
priv->hw_txproc_wr_ptr = priv->rx_bd_num - rx_bd_reserved_param;
writel(priv->hw_txproc_wr_ptr,
PCIE_HDP_TX_HOST_Q_WR_PTR(priv->pcie_reg_base));
pr_debug("RX descriptor table: vaddr=0x%p paddr=%pad\n", vaddr, &paddr); pr_debug("RX descriptor table: vaddr=0x%p paddr=%pad\n", vaddr, &paddr);
priv->rx_bd_index = 0; priv->rx_bd_index = 0;
...@@ -423,7 +418,7 @@ static int alloc_bd_table(struct qtnf_pcie_bus_priv *priv) ...@@ -423,7 +418,7 @@ static int alloc_bd_table(struct qtnf_pcie_bus_priv *priv)
return 0; return 0;
} }
static int skb2rbd_attach(struct qtnf_pcie_bus_priv *priv, u16 rx_bd_index) static int skb2rbd_attach(struct qtnf_pcie_bus_priv *priv, u16 index)
{ {
struct qtnf_rx_bd *rxbd; struct qtnf_rx_bd *rxbd;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -431,13 +426,12 @@ static int skb2rbd_attach(struct qtnf_pcie_bus_priv *priv, u16 rx_bd_index) ...@@ -431,13 +426,12 @@ static int skb2rbd_attach(struct qtnf_pcie_bus_priv *priv, u16 rx_bd_index)
skb = __netdev_alloc_skb_ip_align(NULL, SKB_BUF_SIZE, GFP_ATOMIC); skb = __netdev_alloc_skb_ip_align(NULL, SKB_BUF_SIZE, GFP_ATOMIC);
if (!skb) { if (!skb) {
priv->rx_skb[rx_bd_index] = NULL; priv->rx_skb[index] = NULL;
return -ENOMEM; return -ENOMEM;
} }
priv->rx_skb[rx_bd_index] = skb; priv->rx_skb[index] = skb;
rxbd = &priv->rx_bd_vbase[index];
rxbd = &priv->rx_bd_vbase[rx_bd_index];
paddr = pci_map_single(priv->pdev, skb->data, paddr = pci_map_single(priv->pdev, skb->data,
SKB_BUF_SIZE, PCI_DMA_FROMDEVICE); SKB_BUF_SIZE, PCI_DMA_FROMDEVICE);
...@@ -446,17 +440,20 @@ static int skb2rbd_attach(struct qtnf_pcie_bus_priv *priv, u16 rx_bd_index) ...@@ -446,17 +440,20 @@ static int skb2rbd_attach(struct qtnf_pcie_bus_priv *priv, u16 rx_bd_index)
return -ENOMEM; return -ENOMEM;
} }
writel(QTN_HOST_LO32(paddr),
PCIE_HDP_HHBM_BUF_PTR(priv->pcie_reg_base));
writel(QTN_HOST_HI32(paddr),
PCIE_HDP_HHBM_BUF_PTR_H(priv->pcie_reg_base));
/* keep rx skb paddrs in rx buffer descriptors for cleanup purposes */ /* keep rx skb paddrs in rx buffer descriptors for cleanup purposes */
rxbd->addr = cpu_to_le32(QTN_HOST_LO32(paddr)); rxbd->addr = cpu_to_le32(QTN_HOST_LO32(paddr));
rxbd->addr_h = cpu_to_le32(QTN_HOST_HI32(paddr)); rxbd->addr_h = cpu_to_le32(QTN_HOST_HI32(paddr));
rxbd->info = 0x0; rxbd->info = 0x0;
/* sync up all descriptor updates */
wmb();
writel(QTN_HOST_HI32(paddr),
PCIE_HDP_HHBM_BUF_PTR_H(priv->pcie_reg_base));
writel(QTN_HOST_LO32(paddr),
PCIE_HDP_HHBM_BUF_PTR(priv->pcie_reg_base));
writel(index, PCIE_HDP_TX_HOST_Q_WR_PTR(priv->pcie_reg_base));
return 0; return 0;
} }
...@@ -787,8 +784,6 @@ static int qtnf_rx_poll(struct napi_struct *napi, int budget) ...@@ -787,8 +784,6 @@ static int qtnf_rx_poll(struct napi_struct *napi, int budget)
break; break;
} }
writel(priv->hw_txproc_wr_ptr,
PCIE_HDP_TX_HOST_Q_WR_PTR(priv->pcie_reg_base));
} }
if (processed < budget) { if (processed < budget) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment