12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013 |
-
-
- FILE_LICENCE ( GPL2_ONLY );
-
- #include "igb.h"
-
-
-
-
- int32_t igb_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
- {
- struct igb_adapter *adapter = hw->back;
- uint16_t cap_offset;
-
- #define PCI_CAP_ID_EXP 0x10
- cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
- if (!cap_offset)
- return -E1000_ERR_CONFIG;
-
- pci_read_config_word(adapter->pdev, cap_offset + reg, value);
-
- return E1000_SUCCESS;
- }
-
-
- int32_t igb_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
- {
- struct igb_adapter *adapter = hw->back;
- u16 cap_offset;
-
- cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
- if (!cap_offset)
- return -E1000_ERR_CONFIG;
-
- pci_write_config_word(adapter->pdev, cap_offset + reg, *value);
-
- return E1000_SUCCESS;
- }
-
-
- static void igb_irq_disable(struct igb_adapter *adapter)
- {
- struct e1000_hw *hw = &adapter->hw;
-
- E1000_WRITE_REG(hw, E1000_IAM, 0);
- E1000_WRITE_REG(hw, E1000_IMC, ~0);
- E1000_WRITE_FLUSH(hw);
- }
-
-
- static void igb_irq_enable(struct igb_adapter *adapter)
- {
- struct e1000_hw *hw = &adapter->hw;
-
- E1000_WRITE_REG(hw, E1000_IMS, IMS_ENABLE_MASK);
- E1000_WRITE_REG(hw, E1000_IAM, IMS_ENABLE_MASK);
- E1000_WRITE_FLUSH(hw);
- }
-
-
- void igb_get_hw_control(struct igb_adapter *adapter)
- {
- struct e1000_hw *hw = &adapter->hw;
- u32 ctrl_ext;
-
-
- ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
- E1000_WRITE_REG(hw, E1000_CTRL_EXT,
- ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
- }
-
-
- void igb_reset(struct igb_adapter *adapter)
- {
- struct e1000_hw *hw = &adapter->hw;
-
- struct e1000_mac_info *mac = &hw->mac;
- struct e1000_fc_info *fc = &hw->fc;
- u32 pba = 0;
- u16 hwm;
-
-
-
- switch (mac->type) {
- case e1000_82576:
- pba = E1000_READ_REG(hw, E1000_RXPBS);
- pba &= E1000_RXPBS_SIZE_MASK_82576;
- break;
- case e1000_82575:
- default:
- pba = E1000_PBA_34K;
- break;
- }
-
-
-
-
- #define min(a,b) (((a)<(b))?(a):(b))
- hwm = min(((pba << 10) * 9 / 10),
- ((pba << 10) - 2 * adapter->max_frame_size));
-
- if (mac->type < e1000_82576) {
- fc->high_water = hwm & 0xFFF8;
- fc->low_water = fc->high_water - 8;
- } else {
- fc->high_water = hwm & 0xFFF0;
- fc->low_water = fc->high_water - 16;
- }
- fc->pause_time = 0xFFFF;
- fc->send_xon = 1;
- fc->current_mode = fc->requested_mode;
-
-
- igb_reset_hw(hw);
- E1000_WRITE_REG(hw, E1000_WUC, 0);
-
- if (igb_init_hw(hw)) {
- DBG ("Hardware Error\n");
- }
-
- igb_get_phy_info(hw);
- }
-
-
- int igb_sw_init(struct igb_adapter *adapter)
- {
- struct e1000_hw *hw = &adapter->hw;
- struct pci_device *pdev = adapter->pdev;
-
-
-
- hw->vendor_id = pdev->vendor;
- hw->device_id = pdev->device;
-
- pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id);
-
- pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
-
- adapter->max_frame_size = MAXIMUM_ETHERNET_VLAN_SIZE + ETH_HLEN + ETH_FCS_LEN;
- adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
-
-
- if (igb_setup_init_funcs(hw, TRUE)) {
- DBG ("Hardware Initialization Failure\n");
- return -EIO;
- }
-
-
- igb_irq_disable(adapter);
-
- return 0;
- }
-
-
-
-
- static int igb_setup_tx_resources ( struct igb_adapter *adapter )
- {
- DBG ( "igb_setup_tx_resources\n" );
-
-
-
-
- adapter->tx_base =
- malloc_dma ( adapter->tx_ring_size, adapter->tx_ring_size );
-
- if ( ! adapter->tx_base ) {
- return -ENOMEM;
- }
-
- memset ( adapter->tx_base, 0, adapter->tx_ring_size );
-
- DBG ( "adapter->tx_base = %#08lx\n", virt_to_bus ( adapter->tx_base ) );
-
- return 0;
- }
-
-
- static void igb_process_tx_packets ( struct net_device *netdev )
- {
- struct igb_adapter *adapter = netdev_priv ( netdev );
- uint32_t i;
- uint32_t tx_status;
- struct e1000_tx_desc *tx_curr_desc;
-
-
-
- DBG ( "process_tx_packets: tx_head = %d, tx_tail = %d\n", adapter->tx_head,
- adapter->tx_tail );
-
- while ( ( i = adapter->tx_head ) != adapter->tx_tail ) {
-
- tx_curr_desc = ( void * ) ( adapter->tx_base ) +
- ( i * sizeof ( *adapter->tx_base ) );
-
- tx_status = tx_curr_desc->upper.data;
-
- DBG ( " tx_curr_desc = %#08lx\n", virt_to_bus ( tx_curr_desc ) );
- DBG ( " tx_status = %#08x\n", tx_status );
-
-
- if ( ! ( tx_status & E1000_TXD_STAT_DD ) )
- break;
-
- DBG ( "Sent packet. tx_head: %d tx_tail: %d tx_status: %#08x\n",
- adapter->tx_head, adapter->tx_tail, tx_status );
-
- if ( tx_status & ( E1000_TXD_STAT_EC | E1000_TXD_STAT_LC |
- E1000_TXD_STAT_TU ) ) {
- netdev_tx_complete_err ( netdev, adapter->tx_iobuf[i], -EINVAL );
- DBG ( "Error transmitting packet, tx_status: %#08x\n",
- tx_status );
- } else {
- netdev_tx_complete ( netdev, adapter->tx_iobuf[i] );
- DBG ( "Success transmitting packet, tx_status: %#08x\n",
- tx_status );
- }
-
-
-
- adapter->tx_fill_ctr--;
- memset ( tx_curr_desc, 0, sizeof ( *tx_curr_desc ) );
-
- adapter->tx_head = ( adapter->tx_head + 1 ) % NUM_TX_DESC;
- }
- }
-
- static void igb_free_tx_resources ( struct igb_adapter *adapter )
- {
- DBG ( "igb_free_tx_resources\n" );
-
- free_dma ( adapter->tx_base, adapter->tx_ring_size );
- }
-
-
- static void igb_configure_tx ( struct igb_adapter *adapter )
- {
- struct e1000_hw *hw = &adapter->hw;
- u32 tctl, txdctl;
-
- DBG ( "igb_configure_tx\n" );
-
-
- tctl = E1000_READ_REG ( hw, E1000_TCTL );
- E1000_WRITE_REG ( hw, E1000_TCTL, tctl & ~E1000_TCTL_EN );
- E1000_WRITE_FLUSH(hw);
- mdelay(10);
-
- E1000_WRITE_REG ( hw, E1000_TDBAH(0), 0 );
- E1000_WRITE_REG ( hw, E1000_TDBAL(0), virt_to_bus ( adapter->tx_base ) );
- E1000_WRITE_REG ( hw, E1000_TDLEN(0), adapter->tx_ring_size );
-
- DBG ( "E1000_TDBAL(0): %#08x\n", E1000_READ_REG ( hw, E1000_TDBAL(0) ) );
- DBG ( "E1000_TDLEN(0): %d\n", E1000_READ_REG ( hw, E1000_TDLEN(0) ) );
-
-
- E1000_WRITE_REG ( hw, E1000_TDH(0), 0 );
- E1000_WRITE_REG ( hw, E1000_TDT(0), 0 );
-
- adapter->tx_head = 0;
- adapter->tx_tail = 0;
- adapter->tx_fill_ctr = 0;
-
- txdctl = E1000_READ_REG ( hw, E1000_TXDCTL(0) );
- txdctl |= E1000_TXDCTL_QUEUE_ENABLE;
- E1000_WRITE_REG ( hw, E1000_TXDCTL(0), txdctl );
-
-
- adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
-
-
- adapter->txd_cmd |= E1000_TXD_CMD_RS;
-
-
- tctl &= ~E1000_TCTL_CT;
- tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
- (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
-
- igb_config_collision_dist(hw);
-
-
- tctl |= E1000_TCTL_EN;
- E1000_WRITE_REG(hw, E1000_TCTL, tctl);
- E1000_WRITE_FLUSH(hw);
- }
-
-
-
- static void igb_free_rx_resources ( struct igb_adapter *adapter )
- {
- int i;
-
- DBG ( "igb_free_rx_resources\n" );
-
- free_dma ( adapter->rx_base, adapter->rx_ring_size );
-
- for ( i = 0; i < NUM_RX_DESC; i++ ) {
- free_iob ( adapter->rx_iobuf[i] );
- }
- }
-
-
- static int igb_refill_rx_ring ( struct igb_adapter *adapter )
- {
- int i, rx_curr;
- int rc = 0;
- struct e1000_rx_desc *rx_curr_desc;
- struct e1000_hw *hw = &adapter->hw;
- struct io_buffer *iob;
-
- DBGP ("igb_refill_rx_ring\n");
-
- for ( i = 0; i < NUM_RX_DESC; i++ ) {
- rx_curr = ( ( adapter->rx_curr + i ) % NUM_RX_DESC );
- rx_curr_desc = adapter->rx_base + rx_curr;
-
- if ( rx_curr_desc->status & E1000_RXD_STAT_DD )
- continue;
-
- if ( adapter->rx_iobuf[rx_curr] != NULL )
- continue;
-
- DBG2 ( "Refilling rx desc %d\n", rx_curr );
-
- iob = alloc_iob ( MAXIMUM_ETHERNET_VLAN_SIZE );
- adapter->rx_iobuf[rx_curr] = iob;
-
- if ( ! iob ) {
- DBG ( "alloc_iob failed\n" );
- rc = -ENOMEM;
- break;
- } else {
- rx_curr_desc->buffer_addr = virt_to_bus ( iob->data );
-
- E1000_WRITE_REG ( hw, E1000_RDT(0), rx_curr );
- }
- }
- return rc;
- }
-
-
- static int igb_setup_rx_resources ( struct igb_adapter *adapter )
- {
- int i, rc = 0;
-
- DBGP ( "igb_setup_rx_resources\n" );
-
-
-
-
- adapter->rx_base =
- malloc_dma ( adapter->rx_ring_size, adapter->rx_ring_size );
-
- if ( ! adapter->rx_base ) {
- return -ENOMEM;
- }
- memset ( adapter->rx_base, 0, adapter->rx_ring_size );
-
- for ( i = 0; i < NUM_RX_DESC; i++ ) {
-
- adapter->rx_iobuf[i] = NULL;
- }
-
-
- rc = igb_refill_rx_ring ( adapter );
- if ( rc < 0 )
- igb_free_rx_resources ( adapter );
-
- return rc;
- }
-
-
- static void igb_configure_rx ( struct igb_adapter *adapter )
- {
- struct e1000_hw *hw = &adapter->hw;
- uint32_t rctl, rxdctl, rxcsum, mrqc;
-
- DBGP ( "igb_configure_rx\n" );
-
-
- rctl = E1000_READ_REG ( hw, E1000_RCTL );
- E1000_WRITE_REG ( hw, E1000_RCTL, rctl & ~E1000_RCTL_EN );
- E1000_WRITE_FLUSH(hw);
- mdelay(10);
-
- adapter->rx_curr = 0;
-
-
-
-
- E1000_WRITE_REG ( hw, E1000_RDBAL(0), virt_to_bus ( adapter->rx_base ) );
- E1000_WRITE_REG ( hw, E1000_RDBAH(0), 0 );
- E1000_WRITE_REG ( hw, E1000_RDLEN(0), adapter->rx_ring_size );
-
- E1000_WRITE_REG ( hw, E1000_RDH(0), 0 );
- E1000_WRITE_REG ( hw, E1000_RDT(0), 0 );
-
- DBG ( "E1000_RDBAL(0): %#08x\n", E1000_READ_REG ( hw, E1000_RDBAL(0) ) );
- DBG ( "E1000_RDLEN(0): %d\n", E1000_READ_REG ( hw, E1000_RDLEN(0) ) );
- DBG ( "E1000_RCTL: %#08x\n", E1000_READ_REG ( hw, E1000_RCTL ) );
-
- rxdctl = E1000_READ_REG ( hw, E1000_RXDCTL(0) );
- rxdctl |= E1000_RXDCTL_QUEUE_ENABLE;
- rxdctl &= 0xFFF00000;
- rxdctl |= IGB_RX_PTHRESH;
- rxdctl |= IGB_RX_HTHRESH << 8;
- rxdctl |= IGB_RX_WTHRESH << 16;
- E1000_WRITE_REG ( hw, E1000_RXDCTL(0), rxdctl );
- E1000_WRITE_FLUSH ( hw );
-
- rxcsum = E1000_READ_REG(hw, E1000_RXCSUM);
- rxcsum &= ~( E1000_RXCSUM_TUOFL | E1000_RXCSUM_IPPCSE );
- E1000_WRITE_REG ( hw, E1000_RXCSUM, 0 );
-
-
-
- mrqc = E1000_MRQC_ENABLE_VMDQ;
- E1000_WRITE_REG ( hw, E1000_MRQC, mrqc );
-
-
- rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC);
-
-
- rctl |= E1000_RCTL_SZ_2048;
-
-
- rctl |= E1000_RCTL_BAM | E1000_RCTL_MPE | E1000_RCTL_UPE;
-
-
- rctl |= E1000_RCTL_SBP;
-
-
- rctl |= E1000_RCTL_LPE;
-
-
- rctl |= E1000_RCTL_SECRC;
-
-
- rctl |= E1000_RCTL_EN;
- E1000_WRITE_REG(hw, E1000_RCTL, rctl);
- E1000_WRITE_FLUSH(hw);
-
-
-
- E1000_WRITE_REG ( hw, E1000_RDT(0), NUM_RX_DESC - 1 );
-
- DBG ( "RDBAH: %#08x\n", E1000_READ_REG ( hw, E1000_RDBAH(0) ) );
- DBG ( "RDBAL: %#08x\n", E1000_READ_REG ( hw, E1000_RDBAL(0) ) );
- DBG ( "RDLEN: %d\n", E1000_READ_REG ( hw, E1000_RDLEN(0) ) );
- DBG ( "RCTL: %#08x\n", E1000_READ_REG ( hw, E1000_RCTL ) );
- }
-
-
- static void igb_process_rx_packets ( struct net_device *netdev )
- {
- struct igb_adapter *adapter = netdev_priv ( netdev );
- uint32_t i;
- uint32_t rx_status;
- uint32_t rx_len;
- uint32_t rx_err;
- struct e1000_rx_desc *rx_curr_desc;
-
- DBGP ( "igb_process_rx_packets\n" );
-
-
-
- while ( 1 ) {
-
- i = adapter->rx_curr;
-
- rx_curr_desc = ( void * ) ( adapter->rx_base ) +
- ( i * sizeof ( *adapter->rx_base ) );
- rx_status = rx_curr_desc->status;
-
- DBG2 ( "Before DD Check RX_status: %#08x\n", rx_status );
-
- if ( ! ( rx_status & E1000_RXD_STAT_DD ) )
- break;
-
- if ( adapter->rx_iobuf[i] == NULL )
- break;
-
- DBG ( "E1000_RCTL = %#08x\n", E1000_READ_REG ( &adapter->hw, E1000_RCTL ) );
-
- rx_len = rx_curr_desc->length;
-
- DBG ( "Received packet, rx_curr: %d rx_status: %#08x rx_len: %d\n",
- i, rx_status, rx_len );
-
- rx_err = rx_curr_desc->errors;
-
- iob_put ( adapter->rx_iobuf[i], rx_len );
-
- if ( rx_err & E1000_RXD_ERR_FRAME_ERR_MASK ) {
-
- netdev_rx_err ( netdev, adapter->rx_iobuf[i], -EINVAL );
- DBG ( "igb_process_rx_packets: Corrupted packet received!"
- " rx_err: %#08x\n", rx_err );
- } else {
-
- netdev_rx ( netdev, adapter->rx_iobuf[i] );
- }
- adapter->rx_iobuf[i] = NULL;
-
- memset ( rx_curr_desc, 0, sizeof ( *rx_curr_desc ) );
-
- adapter->rx_curr = ( adapter->rx_curr + 1 ) % NUM_RX_DESC;
- }
- }
-
-
-
-
- static void igb_close ( struct net_device *netdev )
- {
- struct igb_adapter *adapter = netdev_priv ( netdev );
- struct e1000_hw *hw = &adapter->hw;
- uint32_t rctl;
- uint32_t icr;
-
- DBGP ( "igb_close\n" );
-
-
- icr = E1000_READ_REG ( hw, E1000_ICR );
-
- igb_irq_disable ( adapter );
-
-
- rctl = E1000_READ_REG ( hw, E1000_RCTL );
- E1000_WRITE_REG ( hw, E1000_RCTL, rctl & ~E1000_RCTL_EN );
- E1000_WRITE_FLUSH(hw);
-
- igb_reset ( adapter );
-
- igb_free_tx_resources ( adapter );
- igb_free_rx_resources ( adapter );
- }
-
-
- static int igb_transmit ( struct net_device *netdev, struct io_buffer *iobuf )
- {
- struct igb_adapter *adapter = netdev_priv( netdev );
- struct e1000_hw *hw = &adapter->hw;
- uint32_t tx_curr = adapter->tx_tail;
- struct e1000_tx_desc *tx_curr_desc;
-
- DBGP ("igb_transmit\n");
-
- if ( adapter->tx_fill_ctr == NUM_TX_DESC ) {
- DBG ("TX overflow\n");
- return -ENOBUFS;
- }
-
-
-
- adapter->tx_iobuf[tx_curr] = iobuf;
-
- tx_curr_desc = ( void * ) ( adapter->tx_base ) +
- ( tx_curr * sizeof ( *adapter->tx_base ) );
-
- DBG ( "tx_curr_desc = %#08lx\n", virt_to_bus ( tx_curr_desc ) );
- DBG ( "tx_curr_desc + 16 = %#08lx\n", virt_to_bus ( tx_curr_desc ) + 16 );
- DBG ( "iobuf->data = %#08lx\n", virt_to_bus ( iobuf->data ) );
-
-
-
- tx_curr_desc->buffer_addr = virt_to_bus ( iobuf->data );
- tx_curr_desc->upper.data = 0;
- tx_curr_desc->lower.data = adapter->txd_cmd | iob_len ( iobuf );
-
- DBG ( "TX fill: %d tx_curr: %d addr: %#08lx len: %zd\n", adapter->tx_fill_ctr,
- tx_curr, virt_to_bus ( iobuf->data ), iob_len ( iobuf ) );
-
-
- adapter->tx_tail = ( adapter->tx_tail + 1 ) % NUM_TX_DESC;
- adapter->tx_fill_ctr++;
-
-
-
- E1000_WRITE_REG ( hw, E1000_TDT(0), adapter->tx_tail );
- E1000_WRITE_FLUSH(hw);
-
- return 0;
- }
-
-
- static void igb_poll ( struct net_device *netdev )
- {
- struct igb_adapter *adapter = netdev_priv( netdev );
- struct e1000_hw *hw = &adapter->hw;
-
- uint32_t icr;
-
- DBGP ( "igb_poll\n" );
-
-
- icr = E1000_READ_REG ( hw, E1000_ICR );
- if ( ! icr )
- return;
-
- DBG ( "igb_poll: intr_status = %#08x\n", icr );
-
- igb_process_tx_packets ( netdev );
-
- igb_process_rx_packets ( netdev );
-
- igb_refill_rx_ring(adapter);
- }
-
-
- static void igb_irq ( struct net_device *netdev, int enable )
- {
- struct igb_adapter *adapter = netdev_priv ( netdev );
-
- DBGP ( "igb_irq\n" );
-
- if ( enable ) {
- igb_irq_enable ( adapter );
- } else {
- igb_irq_disable ( adapter );
- }
- }
-
- static struct net_device_operations igb_operations;
-
-
- int igb_probe ( struct pci_device *pdev,
- const struct pci_device_id *ent __unused)
- {
- int i, err;
- struct net_device *netdev;
- struct igb_adapter *adapter;
- unsigned long mmio_start, mmio_len;
- struct e1000_hw *hw;
-
- DBGP ( "igb_probe\n" );
-
- err = -ENOMEM;
-
-
-
- netdev = alloc_etherdev ( sizeof ( struct igb_adapter ) );
- if ( ! netdev ) {
- DBG ( "err_alloc_etherdev\n" );
- goto err_alloc_etherdev;
- }
-
-
-
- netdev_init ( netdev, &igb_operations );
-
-
- pci_set_drvdata ( pdev, netdev );
- netdev->dev = &pdev->dev;
-
-
- adapter = netdev_priv ( netdev );
- memset ( adapter, 0, ( sizeof ( *adapter ) ) );
-
- adapter->pdev = pdev;
-
- adapter->ioaddr = pdev->ioaddr;
- adapter->hw.io_base = pdev->ioaddr;
-
- hw = &adapter->hw;
- hw->vendor_id = pdev->vendor;
- hw->device_id = pdev->device;
-
- adapter->irqno = pdev->irq;
- adapter->netdev = netdev;
- adapter->hw.back = adapter;
-
- adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
- adapter->max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN;
-
- adapter->tx_ring_size = sizeof ( *adapter->tx_base ) * NUM_TX_DESC;
- adapter->rx_ring_size = sizeof ( *adapter->rx_base ) * NUM_RX_DESC;
-
-
- adjust_pci_device ( pdev );
-
- err = -EIO;
-
- mmio_start = pci_bar_start ( pdev, PCI_BASE_ADDRESS_0 );
- mmio_len = pci_bar_size ( pdev, PCI_BASE_ADDRESS_0 );
-
- DBG ( "mmio_start: %#08lx\n", mmio_start );
- DBG ( "mmio_len: %#08lx\n", mmio_len );
-
- 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 ) {
- DBG ( "err_ioremap\n" );
- goto err_ioremap;
- }
-
-
- err = igb_sw_init ( adapter );
- if (err) {
- DBG ( "err_sw_init\n" );
- goto err_sw_init;
- }
-
- igb_get_bus_info(hw);
-
-
- if (adapter->hw.phy.media_type == e1000_media_type_copper) {
- adapter->hw.phy.mdix = AUTO_ALL_MODES;
- adapter->hw.phy.disable_polarity_correction = 0;
- adapter->hw.phy.ms_type = e1000_ms_hw_default;
- }
-
- DBG ( "adapter->hw.mac.type: %#08x\n", adapter->hw.mac.type );
-
-
- adapter->hw.mac.autoneg = 1;
- adapter->fc_autoneg = 1;
- adapter->hw.phy.autoneg_wait_to_complete = true;
- adapter->hw.mac.adaptive_ifs = true;
- adapter->hw.fc.requested_mode = e1000_fc_default;
- adapter->hw.fc.current_mode = e1000_fc_default;
-
- igb_validate_mdi_setting(hw);
-
-
-
- igb_reset_hw(hw);
-
-
-
- for (i = 0;; i++) {
- if (igb_validate_nvm_checksum(&adapter->hw) >= 0)
- break;
- if (i == 2) {
- err = -EIO;
- DBG ( "The NVM Checksum Is Not Valid\n" );
- DBG ( "err_eeprom\n" );
- goto err_eeprom;
- }
- }
-
-
- if ( igb_read_mac_addr ( &adapter->hw ) ) {
- DBG ( "EEPROM Read Error\n" );
- }
-
- memcpy ( netdev->hw_addr, adapter->hw.mac.perm_addr, ETH_ALEN );
-
-
- igb_reset ( adapter );
-
-
-
- igb_get_hw_control(adapter);
-
- if ( ( err = register_netdev ( netdev ) ) != 0) {
- DBG ( "err_register\n" );
- goto err_register;
- }
-
-
- netdev_link_up ( netdev );
-
- for (i = 0; i < 6; i++) {
- DBG ("%02x%s", netdev->ll_addr[i], i == 5 ? "\n" : ":");
- }
-
- DBG ( "igb_probe succeeded!\n" );
-
-
- return 0;
-
-
- err_register:
- err_eeprom:
- err_sw_init:
- iounmap ( adapter->hw.hw_addr );
- err_ioremap:
- netdev_put ( netdev );
- err_alloc_etherdev:
- return err;
- }
-
-
- void igb_remove ( struct pci_device *pdev )
- {
- struct net_device *netdev = pci_get_drvdata ( pdev );
- struct igb_adapter *adapter = netdev_priv ( netdev );
-
- DBGP ( "igb_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 );
- igb_reset ( adapter );
- netdev_nullify ( netdev );
- netdev_put ( netdev );
- }
-
-
- static int igb_open ( struct net_device *netdev )
- {
- struct igb_adapter *adapter = netdev_priv(netdev);
- int err;
-
- DBGP ( "igb_open\n" );
-
-
- err = igb_setup_tx_resources ( adapter );
- if ( err ) {
- DBG ( "Error setting up TX resources!\n" );
- goto err_setup_tx;
- }
-
-
- err = igb_setup_rx_resources ( adapter );
- if ( err ) {
- DBG ( "Error setting up RX resources!\n" );
- goto err_setup_rx;
- }
-
- igb_configure_tx ( adapter );
-
- igb_configure_rx ( adapter );
-
- DBG ( "E1000_RXDCTL(0): %#08x\n", E1000_READ_REG ( &adapter->hw, E1000_RXDCTL(0) ) );
-
- return 0;
-
- err_setup_rx:
- DBG ( "err_setup_rx\n" );
- igb_free_tx_resources ( adapter );
- err_setup_tx:
- DBG ( "err_setup_tx\n" );
- igb_reset ( adapter );
-
- return err;
- }
-
-
- static struct net_device_operations igb_operations = {
- .open = igb_open,
- .close = igb_close,
- .transmit = igb_transmit,
- .poll = igb_poll,
- .irq = igb_irq,
- };
|