david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Fixed receive instability by not enabling interrupts. duh.

I have successfully booted DOS via iSCSI and PXELINUX via TFTP with this
version of the e1000 driver.
This commit is contained in:
Marty Connor 2007-11-20 21:33:42 -05:00
parent 645a752bc2
commit 2d60a3963f
2 changed files with 27 additions and 19 deletions

View File

@ -130,10 +130,11 @@ e1000_sw_init ( struct e1000_adapter *adapter )
adapter->rx_int_delay = 0;
adapter->rx_abs_int_delay = 0;
adapter->rx_buffer_len = 1600;
adapter->rx_ps_bsize0 = E1000_RXBUFFER_128;
hw->max_frame_size = 1600;
hw->min_frame_size = ETH_ZLEN;
adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
adapter->rx_ps_bsize0 = E1000_RXBUFFER_128;
hw->max_frame_size = MAXIMUM_ETHERNET_VLAN_SIZE +
ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
/* identify the MAC */
@ -170,7 +171,6 @@ e1000_sw_init ( struct e1000_adapter *adapter )
hw->master_slave = E1000_MASTER_SLAVE;
}
/* Explicitly disable IRQ since the NIC can be in any state. */
e1000_irq_disable ( adapter );
return 0;
@ -370,7 +370,7 @@ e1000_setup_rx_resources ( struct e1000_adapter *adapter )
for ( i = 0; i < NUM_RX_DESC; i++ ) {
adapter->rx_iobuf[i] = alloc_iob ( 1600 );
adapter->rx_iobuf[i] = alloc_iob ( MAXIMUM_ETHERNET_VLAN_SIZE );
/* If unable to allocate all iobufs, free any that
* were successfully allocated, and return an error
@ -386,6 +386,7 @@ e1000_setup_rx_resources ( struct e1000_adapter *adapter )
( i * sizeof ( *adapter->rx_base ) );
rx_curr_desc->buffer_addr = virt_to_bus ( adapter->rx_iobuf[i]->data );
DBG ( "i = %d rx_curr_desc->buffer_addr = %#16llx\n",
i, rx_curr_desc->buffer_addr );
@ -571,22 +572,23 @@ static void
e1000_close ( struct net_device *netdev )
{
struct e1000_adapter *adapter = netdev_priv ( netdev );
struct e1000_hw *hw = &adapter->hw;
uint32_t rctl;
uint32_t icr;
DBG ( "e1000_close\n" );
/* disable receives */
rctl = E1000_READ_REG ( &adapter->hw, RCTL );
E1000_WRITE_REG ( &adapter->hw, RCTL, rctl & ~E1000_RCTL_EN );
E1000_WRITE_FLUSH ( &adapter->hw );
/* Acknowledge interrupts */
icr = E1000_READ_REG ( &adapter->hw, ICR );
icr = E1000_READ_REG ( hw, ICR );
e1000_irq_disable ( adapter );
e1000_reset_hw ( &adapter->hw );
/* disable receives */
rctl = E1000_READ_REG ( hw, RCTL );
E1000_WRITE_REG ( hw, RCTL, rctl & ~E1000_RCTL_EN );
E1000_WRITE_FLUSH ( hw );
e1000_reset_hw ( hw );
e1000_free_tx_resources ( adapter );
e1000_free_rx_resources ( adapter );
@ -678,6 +680,7 @@ e1000_poll ( struct net_device *netdev )
struct e1000_tx_desc *tx_curr_desc;
struct e1000_rx_desc *rx_curr_desc;
uint32_t i;
uint64_t tmp_buffer_addr;
#if 0
DBG ( "e1000_poll\n" );
@ -776,9 +779,9 @@ e1000_poll ( struct net_device *netdev )
netdev_rx ( netdev, rx_iob );
}
tmp_buffer_addr = rx_curr_desc->buffer_addr;
memset ( rx_curr_desc, 0, sizeof ( *rx_curr_desc ) );
rx_curr_desc->buffer_addr = virt_to_bus ( adapter->rx_iobuf[adapter->rx_tail]->data );
rx_curr_desc->buffer_addr = tmp_buffer_addr;
E1000_WRITE_REG ( hw, RDT, adapter->rx_tail );
@ -876,7 +879,6 @@ e1000_probe ( struct pci_device *pdev,
err = -EIO;
adapter->hw.hw_addr = ioremap ( mmio_start, mmio_len );
DBG ( "adapter->hw.hw_addr: %p\n", adapter->hw.hw_addr );
if ( ! adapter->hw.hw_addr )
@ -989,6 +991,11 @@ e1000_remove ( struct pci_device *pdev )
DBG ( "e1000_remove\n" );
if ( adapter->hw.flash_address )
iounmap ( adapter->hw.flash_address );
if ( adapter->hw.hw_addr )
iounmap ( adapter->hw.hw_addr );
unregister_netdev ( netdev );
e1000_reset_hw ( &adapter->hw );
netdev_nullify ( netdev );
@ -1030,8 +1037,6 @@ e1000_open ( struct net_device *netdev )
DBG ( "RXDCTL: %#08lx\n", E1000_READ_REG ( &adapter->hw, RXDCTL ) );
e1000_irq_enable ( adapter );
return 0;
err_setup_rx:
@ -1064,7 +1069,7 @@ e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
pci_read_config_word(adapter->pdev, cap_offset + reg, value);
return E1000_SUCCESS;
return 0;
}
void

View File

@ -78,6 +78,9 @@ struct e1000_adapter;
#define E1000_FC_PAUSE_TIME 0x0680 /* 858 usec */
/* this is the size past which hardware will drop packets when setting LPE=0 */
#define MAXIMUM_ETHERNET_VLAN_SIZE 1522
/* How many Tx Descriptors do we need to call netif_wake_queue ? */
#define E1000_TX_QUEUE_WAKE 16
/* How many Rx Buffers do we bundle into one write to the hardware ? */