atl1c:add pci map direction in atl1c_buffer flags
add pci map direction in atl1c_buffer flags, it is used when call pci_unmap apis. Signed-off-by: Jie Yang <jie.yang@atheros.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
b38310e99e
commit
4b45e3424e
@@ -479,6 +479,9 @@ struct atl1c_buffer {
|
|||||||
#define ATL1C_PCIMAP_PAGE 0x0008
|
#define ATL1C_PCIMAP_PAGE 0x0008
|
||||||
#define ATL1C_PCIMAP_TYPE_MASK 0x000C
|
#define ATL1C_PCIMAP_TYPE_MASK 0x000C
|
||||||
|
|
||||||
|
#define ATL1C_PCIMAP_TODEVICE 0x0010
|
||||||
|
#define ATL1C_PCIMAP_FROMDEVICE 0x0020
|
||||||
|
#define ATL1C_PCIMAP_DIRECTION_MASK 0x0030
|
||||||
dma_addr_t dma;
|
dma_addr_t dma;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -487,9 +490,11 @@ struct atl1c_buffer {
|
|||||||
((buff)->flags) |= (state); \
|
((buff)->flags) |= (state); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define ATL1C_SET_PCIMAP_TYPE(buff, type) do { \
|
#define ATL1C_SET_PCIMAP_TYPE(buff, type, direction) do { \
|
||||||
((buff)->flags) &= ~ATL1C_PCIMAP_TYPE_MASK; \
|
((buff)->flags) &= ~ATL1C_PCIMAP_TYPE_MASK; \
|
||||||
((buff)->flags) |= (type); \
|
((buff)->flags) |= (type); \
|
||||||
|
((buff)->flags) &= ~ATL1C_PCIMAP_DIRECTION_MASK; \
|
||||||
|
((buff)->flags) |= (direction); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* transimit packet descriptor (tpd) ring */
|
/* transimit packet descriptor (tpd) ring */
|
||||||
|
@@ -713,15 +713,21 @@ static int __devinit atl1c_sw_init(struct atl1c_adapter *adapter)
|
|||||||
static inline void atl1c_clean_buffer(struct pci_dev *pdev,
|
static inline void atl1c_clean_buffer(struct pci_dev *pdev,
|
||||||
struct atl1c_buffer *buffer_info, int in_irq)
|
struct atl1c_buffer *buffer_info, int in_irq)
|
||||||
{
|
{
|
||||||
|
u16 pci_driection;
|
||||||
if (buffer_info->flags & ATL1C_BUFFER_FREE)
|
if (buffer_info->flags & ATL1C_BUFFER_FREE)
|
||||||
return;
|
return;
|
||||||
if (buffer_info->dma) {
|
if (buffer_info->dma) {
|
||||||
|
if (buffer_info->flags & ATL1C_PCIMAP_FROMDEVICE)
|
||||||
|
pci_driection = PCI_DMA_FROMDEVICE;
|
||||||
|
else
|
||||||
|
pci_driection = PCI_DMA_TODEVICE;
|
||||||
|
|
||||||
if (buffer_info->flags & ATL1C_PCIMAP_SINGLE)
|
if (buffer_info->flags & ATL1C_PCIMAP_SINGLE)
|
||||||
pci_unmap_single(pdev, buffer_info->dma,
|
pci_unmap_single(pdev, buffer_info->dma,
|
||||||
buffer_info->length, PCI_DMA_TODEVICE);
|
buffer_info->length, pci_driection);
|
||||||
else if (buffer_info->flags & ATL1C_PCIMAP_PAGE)
|
else if (buffer_info->flags & ATL1C_PCIMAP_PAGE)
|
||||||
pci_unmap_page(pdev, buffer_info->dma,
|
pci_unmap_page(pdev, buffer_info->dma,
|
||||||
buffer_info->length, PCI_DMA_TODEVICE);
|
buffer_info->length, pci_driection);
|
||||||
}
|
}
|
||||||
if (buffer_info->skb) {
|
if (buffer_info->skb) {
|
||||||
if (in_irq)
|
if (in_irq)
|
||||||
@@ -1606,7 +1612,8 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, const int ringid
|
|||||||
buffer_info->dma = pci_map_single(pdev, vir_addr,
|
buffer_info->dma = pci_map_single(pdev, vir_addr,
|
||||||
buffer_info->length,
|
buffer_info->length,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE);
|
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||||
|
ATL1C_PCIMAP_FROMDEVICE);
|
||||||
rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
|
rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||||
rfd_next_to_use = next_next;
|
rfd_next_to_use = next_next;
|
||||||
if (++next_next == rfd_ring->count)
|
if (++next_next == rfd_ring->count)
|
||||||
@@ -1967,7 +1974,8 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
|||||||
buffer_info->dma = pci_map_single(adapter->pdev,
|
buffer_info->dma = pci_map_single(adapter->pdev,
|
||||||
skb->data, hdr_len, PCI_DMA_TODEVICE);
|
skb->data, hdr_len, PCI_DMA_TODEVICE);
|
||||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE);
|
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||||
|
ATL1C_PCIMAP_TODEVICE);
|
||||||
mapped_len += map_len;
|
mapped_len += map_len;
|
||||||
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||||
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
||||||
@@ -1988,7 +1996,8 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
|||||||
pci_map_single(adapter->pdev, skb->data + mapped_len,
|
pci_map_single(adapter->pdev, skb->data + mapped_len,
|
||||||
buffer_info->length, PCI_DMA_TODEVICE);
|
buffer_info->length, PCI_DMA_TODEVICE);
|
||||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE);
|
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||||
|
ATL1C_PCIMAP_TODEVICE);
|
||||||
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||||
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
||||||
}
|
}
|
||||||
@@ -2009,7 +2018,8 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
|||||||
buffer_info->length,
|
buffer_info->length,
|
||||||
PCI_DMA_TODEVICE);
|
PCI_DMA_TODEVICE);
|
||||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_PAGE);
|
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_PAGE,
|
||||||
|
ATL1C_PCIMAP_TODEVICE);
|
||||||
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||||
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user