summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/intel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/net/intel.c')
-rw-r--r--src/drivers/net/intel.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/src/drivers/net/intel.c b/src/drivers/net/intel.c
index d9b8b46b7..83492961f 100644
--- a/src/drivers/net/intel.c
+++ b/src/drivers/net/intel.c
@@ -32,7 +32,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
-#include <ipxe/malloc.h>
+#include <ipxe/dma.h>
#include <ipxe/pci.h>
#include <ipxe/profile.h>
#include "intel.h"
@@ -504,7 +504,8 @@ int intel_create_ring ( struct intel_nic *intel, struct intel_ring *ring ) {
* prevent any possible page-crossing errors due to hardware
* errata.
*/
- ring->desc = malloc_dma ( ring->len, ring->len );
+ ring->desc = dma_alloc ( intel->dma, &ring->map, ring->len,
+ ring->len );
if ( ! ring->desc )
return -ENOMEM;
@@ -512,7 +513,7 @@ int intel_create_ring ( struct intel_nic *intel, struct intel_ring *ring ) {
memset ( ring->desc, 0, ring->len );
/* Program ring address */
- address = virt_to_bus ( ring->desc );
+ address = dma ( &ring->map, ring->desc );
writel ( ( address & 0xffffffffUL ),
( intel->regs + ring->reg + INTEL_xDBAL ) );
if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) {
@@ -534,9 +535,9 @@ int intel_create_ring ( struct intel_nic *intel, struct intel_ring *ring ) {
dctl |= INTEL_xDCTL_ENABLE;
writel ( dctl, intel->regs + ring->reg + INTEL_xDCTL );
- DBGC ( intel, "INTEL %p ring %05x is at [%08llx,%08llx)\n",
- intel, ring->reg, ( ( unsigned long long ) address ),
- ( ( unsigned long long ) address + ring->len ) );
+ DBGC ( intel, "INTEL %p ring %05x is at [%08lx,%08lx)\n",
+ intel, ring->reg, virt_to_phys ( ring->desc ),
+ ( virt_to_phys ( ring->desc ) + ring->len ) );
return 0;
}
@@ -553,7 +554,7 @@ void intel_destroy_ring ( struct intel_nic *intel, struct intel_ring *ring ) {
intel_reset_ring ( intel, ring->reg );
/* Free descriptor ring */
- free_dma ( ring->desc, ring->len );
+ dma_free ( &ring->map, ring->desc, ring->len );
ring->desc = NULL;
ring->prod = 0;
ring->cons = 0;
@@ -569,14 +570,13 @@ void intel_refill_rx ( struct intel_nic *intel ) {
struct io_buffer *iobuf;
unsigned int rx_idx;
unsigned int rx_tail;
- physaddr_t address;
unsigned int refilled = 0;
/* Refill ring */
while ( ( intel->rx.prod - intel->rx.cons ) < INTEL_RX_FILL ) {
/* Allocate I/O buffer */
- iobuf = alloc_iob ( INTEL_RX_MAX_LEN );
+ iobuf = alloc_rx_iob ( INTEL_RX_MAX_LEN, intel->dma );
if ( ! iobuf ) {
/* Wait for next refill */
break;
@@ -587,16 +587,15 @@ void intel_refill_rx ( struct intel_nic *intel ) {
rx = &intel->rx.desc[rx_idx];
/* Populate receive descriptor */
- address = virt_to_bus ( iobuf->data );
- intel->rx.describe ( rx, address, 0 );
+ intel->rx.describe ( rx, iob_dma ( iobuf ), 0 );
/* Record I/O buffer */
assert ( intel->rx_iobuf[rx_idx] == NULL );
intel->rx_iobuf[rx_idx] = iobuf;
- DBGC2 ( intel, "INTEL %p RX %d is [%llx,%llx)\n", intel, rx_idx,
- ( ( unsigned long long ) address ),
- ( ( unsigned long long ) address + INTEL_RX_MAX_LEN ) );
+ DBGC2 ( intel, "INTEL %p RX %d is [%lx,%lx)\n",
+ intel, rx_idx, virt_to_phys ( iobuf->data ),
+ ( virt_to_phys ( iobuf->data ) + INTEL_RX_MAX_LEN ) );
refilled++;
}
@@ -619,9 +618,10 @@ void intel_refill_rx ( struct intel_nic *intel ) {
void intel_empty_rx ( struct intel_nic *intel ) {
unsigned int i;
+ /* Discard unused receive buffers */
for ( i = 0 ; i < INTEL_NUM_RX_DESC ; i++ ) {
if ( intel->rx_iobuf[i] )
- free_iob ( intel->rx_iobuf[i] );
+ free_rx_iob ( intel->rx_iobuf[i] );
intel->rx_iobuf[i] = NULL;
}
}
@@ -742,7 +742,6 @@ int intel_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
struct intel_descriptor *tx;
unsigned int tx_idx;
unsigned int tx_tail;
- physaddr_t address;
size_t len;
/* Get next transmit descriptor */
@@ -755,9 +754,8 @@ int intel_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
tx = &intel->tx.desc[tx_idx];
/* Populate transmit descriptor */
- address = virt_to_bus ( iobuf->data );
len = iob_len ( iobuf );
- intel->tx.describe ( tx, address, len );
+ intel->tx.describe ( tx, iob_dma ( iobuf ), len );
wmb();
/* Notify card that there are packets ready to transmit */
@@ -766,9 +764,9 @@ int intel_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
profile_stop ( &intel_vm_tx_profiler );
profile_exclude ( &intel_vm_tx_profiler );
- DBGC2 ( intel, "INTEL %p TX %d is [%llx,%llx)\n", intel, tx_idx,
- ( ( unsigned long long ) address ),
- ( ( unsigned long long ) address + len ) );
+ DBGC2 ( intel, "INTEL %p TX %d is [%lx,%lx)\n",
+ intel, tx_idx, virt_to_phys ( iobuf->data ),
+ ( virt_to_phys ( iobuf->data ) + len ) );
return 0;
}
@@ -959,12 +957,17 @@ static int intel_probe ( struct pci_device *pci ) {
adjust_pci_device ( pci );
/* Map registers */
- intel->regs = ioremap ( pci->membase, INTEL_BAR_SIZE );
+ intel->regs = pci_ioremap ( pci, pci->membase, INTEL_BAR_SIZE );
if ( ! intel->regs ) {
rc = -ENODEV;
goto err_ioremap;
}
+ /* Configure DMA */
+ intel->dma = &pci->dma;
+ dma_set_mask_64bit ( intel->dma );
+ netdev->dma = intel->dma;
+
/* Reset the NIC */
if ( ( rc = intel_reset ( intel ) ) != 0 )
goto err_reset;