Commit dc02c706 authored by Malcolm Priestley's avatar Malcolm Priestley Committed by Ben Hutchings

staging: rtl8192e: rtl92e_fill_tx_desc fix write to mapped out memory.

commit baabd567 upstream.

The driver attempts to alter memory that is mapped to PCI device.

This is because tx_fwinfo_8190pci points to skb->data

Move the pci_map_single to when completed buffer is ready to be mapped with
psdec is empty to drop on mapping error.
Signed-off-by: default avatarMalcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 58feb727
...@@ -1172,8 +1172,7 @@ void rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc, ...@@ -1172,8 +1172,7 @@ void rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc,
struct cb_desc *cb_desc, struct sk_buff *skb) struct cb_desc *cb_desc, struct sk_buff *skb)
{ {
struct r8192_priv *priv = rtllib_priv(dev); struct r8192_priv *priv = rtllib_priv(dev);
dma_addr_t mapping = pci_map_single(priv->pdev, skb->data, skb->len, dma_addr_t mapping;
PCI_DMA_TODEVICE);
struct tx_fwinfo_8190pci *pTxFwInfo = NULL; struct tx_fwinfo_8190pci *pTxFwInfo = NULL;
pTxFwInfo = (struct tx_fwinfo_8190pci *)skb->data; pTxFwInfo = (struct tx_fwinfo_8190pci *)skb->data;
memset(pTxFwInfo, 0, sizeof(struct tx_fwinfo_8190pci)); memset(pTxFwInfo, 0, sizeof(struct tx_fwinfo_8190pci));
...@@ -1184,8 +1183,6 @@ void rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc, ...@@ -1184,8 +1183,6 @@ void rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc,
pTxFwInfo->TxRate, pTxFwInfo->TxRate,
cb_desc); cb_desc);
if (pci_dma_mapping_error(priv->pdev, mapping))
RT_TRACE(COMP_ERR, "DMA Mapping error\n");
if (cb_desc->bAMPDUEnable) { if (cb_desc->bAMPDUEnable) {
pTxFwInfo->AllowAggregation = 1; pTxFwInfo->AllowAggregation = 1;
pTxFwInfo->RxMF = cb_desc->ampdu_factor; pTxFwInfo->RxMF = cb_desc->ampdu_factor;
...@@ -1220,6 +1217,14 @@ void rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc, ...@@ -1220,6 +1217,14 @@ void rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc,
} }
memset((u8 *)pdesc, 0, 12); memset((u8 *)pdesc, 0, 12);
mapping = pci_map_single(priv->pdev, skb->data, skb->len,
PCI_DMA_TODEVICE);
if (pci_dma_mapping_error(priv->pdev, mapping)) {
RT_TRACE(COMP_ERR, "DMA Mapping error\n");
return;
}
pdesc->LINIP = 0; pdesc->LINIP = 0;
pdesc->CmdInit = 1; pdesc->CmdInit = 1;
pdesc->Offset = sizeof(struct tx_fwinfo_8190pci) + 8; pdesc->Offset = sizeof(struct tx_fwinfo_8190pci) + 8;
......
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