⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e1000_main.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
	if(adapter->hw.mac_type == e1000_82547) {		adapter->tx_fifo_head = 0;		adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;		adapter->tx_fifo_size =			(E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;		atomic_set(&adapter->tx_fifo_stall, 0);	}	E1000_WRITE_REG(&adapter->hw, PBA, pba);	/* flow control settings */	adapter->hw.fc_high_water = (pba << E1000_PBA_BYTES_SHIFT) -				    fc_high_water_mark;	adapter->hw.fc_low_water = (pba << E1000_PBA_BYTES_SHIFT) -				   fc_low_water_mark;	adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;	adapter->hw.fc_send_xon = 1;	adapter->hw.fc = adapter->hw.original_fc;	/* Allow time for pending master requests to run */	e1000_reset_hw(&adapter->hw);	if(adapter->hw.mac_type >= e1000_82544)		E1000_WRITE_REG(&adapter->hw, WUC, 0);	if(e1000_init_hw(&adapter->hw))		DPRINTK(PROBE, ERR, "Hardware Error\n");	e1000_update_mng_vlan(adapter);	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */	E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE);	e1000_reset_adaptive(&adapter->hw);	e1000_phy_get_info(&adapter->hw, &adapter->phy_info);	if (adapter->en_mng_pt) {		manc = E1000_READ_REG(&adapter->hw, MANC);		manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);		E1000_WRITE_REG(&adapter->hw, MANC, manc);	}}/** * e1000_probe - Device Initialization Routine * @pdev: PCI device information struct * @ent: entry in e1000_pci_tbl * * Returns 0 on success, negative on failure * * e1000_probe initializes an adapter identified by a pci_dev structure. * The OS initialization, configuring of the adapter private structure, * and a hardware reset occur. **/static int __devinite1000_probe(struct pci_dev *pdev,            const struct pci_device_id *ent){	struct net_device *netdev;	struct e1000_adapter *adapter;	unsigned long mmio_start, mmio_len;	uint32_t ctrl_ext;	uint32_t swsm;	static int cards_found = 0;	int i, err, pci_using_dac;	uint16_t eeprom_data;	uint16_t eeprom_apme_mask = E1000_EEPROM_APME;	if((err = pci_enable_device(pdev)))		return err;	if(!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {		pci_using_dac = 1;	} else {		if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {			E1000_ERR("No usable DMA configuration, aborting\n");			return err;		}		pci_using_dac = 0;	}	if((err = pci_request_regions(pdev, e1000_driver_name)))		return err;	pci_set_master(pdev);	netdev = alloc_etherdev(sizeof(struct e1000_adapter));	if(!netdev) {		err = -ENOMEM;		goto err_alloc_etherdev;	}	SET_MODULE_OWNER(netdev);	SET_NETDEV_DEV(netdev, &pdev->dev);	pci_set_drvdata(pdev, netdev);	adapter = netdev_priv(netdev);	adapter->netdev = netdev;	adapter->pdev = pdev;	adapter->hw.back = adapter;	adapter->msg_enable = (1 << debug) - 1;	mmio_start = pci_resource_start(pdev, BAR_0);	mmio_len = pci_resource_len(pdev, BAR_0);	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);	if(!adapter->hw.hw_addr) {		err = -EIO;		goto err_ioremap;	}	for(i = BAR_1; i <= BAR_5; i++) {		if(pci_resource_len(pdev, i) == 0)			continue;		if(pci_resource_flags(pdev, i) & IORESOURCE_IO) {			adapter->hw.io_base = pci_resource_start(pdev, i);			break;		}	}	netdev->open = &e1000_open;	netdev->stop = &e1000_close;	netdev->hard_start_xmit = &e1000_xmit_frame;	netdev->get_stats = &e1000_get_stats;	netdev->set_multicast_list = &e1000_set_multi;	netdev->set_mac_address = &e1000_set_mac;	netdev->change_mtu = &e1000_change_mtu;	netdev->do_ioctl = &e1000_ioctl;	e1000_set_ethtool_ops(netdev);	netdev->tx_timeout = &e1000_tx_timeout;	netdev->watchdog_timeo = 5 * HZ;#ifdef CONFIG_E1000_NAPI	netdev->poll = &e1000_clean;	netdev->weight = 64;#endif	netdev->vlan_rx_register = e1000_vlan_rx_register;	netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;	netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;#ifdef CONFIG_NET_POLL_CONTROLLER	netdev->poll_controller = e1000_netpoll;#endif	strcpy(netdev->name, pci_name(pdev));	netdev->mem_start = mmio_start;	netdev->mem_end = mmio_start + mmio_len;	netdev->base_addr = adapter->hw.io_base;	adapter->bd_number = cards_found;	/* setup the private structure */	if((err = e1000_sw_init(adapter)))		goto err_sw_init;	if((err = e1000_check_phy_reset_block(&adapter->hw)))		DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");	if(adapter->hw.mac_type >= e1000_82543) {		netdev->features = NETIF_F_SG |				   NETIF_F_HW_CSUM |				   NETIF_F_HW_VLAN_TX |				   NETIF_F_HW_VLAN_RX |				   NETIF_F_HW_VLAN_FILTER;	}#ifdef NETIF_F_TSO	if((adapter->hw.mac_type >= e1000_82544) &&	   (adapter->hw.mac_type != e1000_82547))		netdev->features |= NETIF_F_TSO;#ifdef NETIF_F_TSO_IPV6	if(adapter->hw.mac_type > e1000_82547_rev_2)		netdev->features |= NETIF_F_TSO_IPV6;#endif#endif	if(pci_using_dac)		netdev->features |= NETIF_F_HIGHDMA; 	/* hard_start_xmit is safe against parallel locking */ 	netdev->features |= NETIF_F_LLTX;  	adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);	/* before reading the EEPROM, reset the controller to 	 * put the device in a known good starting state */		e1000_reset_hw(&adapter->hw);	/* make sure the EEPROM is good */	if(e1000_validate_eeprom_checksum(&adapter->hw) < 0) {		DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n");		err = -EIO;		goto err_eeprom;	}	/* copy the MAC address out of the EEPROM */	if(e1000_read_mac_addr(&adapter->hw))		DPRINTK(PROBE, ERR, "EEPROM Read Error\n");	memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);	memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);	if(!is_valid_ether_addr(netdev->perm_addr)) {		DPRINTK(PROBE, ERR, "Invalid MAC Address\n");		err = -EIO;		goto err_eeprom;	}	e1000_read_part_num(&adapter->hw, &(adapter->part_num));	e1000_get_bus_info(&adapter->hw);	init_timer(&adapter->tx_fifo_stall_timer);	adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall;	adapter->tx_fifo_stall_timer.data = (unsigned long) adapter;	init_timer(&adapter->watchdog_timer);	adapter->watchdog_timer.function = &e1000_watchdog;	adapter->watchdog_timer.data = (unsigned long) adapter;	INIT_WORK(&adapter->watchdog_task,		(void (*)(void *))e1000_watchdog_task, adapter);	init_timer(&adapter->phy_info_timer);	adapter->phy_info_timer.function = &e1000_update_phy_info;	adapter->phy_info_timer.data = (unsigned long) adapter;	INIT_WORK(&adapter->tx_timeout_task,		(void (*)(void *))e1000_tx_timeout_task, netdev);	/* we're going to reset, so assume we have no link for now */	netif_carrier_off(netdev);	netif_stop_queue(netdev);	e1000_check_options(adapter);	/* Initial Wake on LAN setting	 * If APM wake is enabled in the EEPROM,	 * enable the ACPI Magic Packet filter	 */	switch(adapter->hw.mac_type) {	case e1000_82542_rev2_0:	case e1000_82542_rev2_1:	case e1000_82543:		break;	case e1000_82544:		e1000_read_eeprom(&adapter->hw,			EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);		eeprom_apme_mask = E1000_EEPROM_82544_APM;		break;	case e1000_82546:	case e1000_82546_rev_3:		if((E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1)		   && (adapter->hw.media_type == e1000_media_type_copper)) {			e1000_read_eeprom(&adapter->hw,				EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);			break;		}		/* Fall Through */	default:		e1000_read_eeprom(&adapter->hw,			EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);		break;	}	if(eeprom_data & eeprom_apme_mask)		adapter->wol |= E1000_WUFC_MAG;	/* reset the hardware with the new settings */	e1000_reset(adapter);	/* Let firmware know the driver has taken over */	switch(adapter->hw.mac_type) {	case e1000_82571:	case e1000_82572:		ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);		E1000_WRITE_REG(&adapter->hw, CTRL_EXT,				ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);		break;	case e1000_82573:		swsm = E1000_READ_REG(&adapter->hw, SWSM);		E1000_WRITE_REG(&adapter->hw, SWSM,				swsm | E1000_SWSM_DRV_LOAD);		break;	default:		break;	}	strcpy(netdev->name, "eth%d");	if((err = register_netdev(netdev)))		goto err_register;	DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");	cards_found++;	return 0;err_register:err_sw_init:err_eeprom:	iounmap(adapter->hw.hw_addr);err_ioremap:	free_netdev(netdev);err_alloc_etherdev:	pci_release_regions(pdev);	return err;}/** * e1000_remove - Device Removal Routine * @pdev: PCI device information struct * * e1000_remove is called by the PCI subsystem to alert the driver * that it should release a PCI device.  The could be caused by a * Hot-Plug event, or because the driver is going to be removed from * memory. **/static void __devexite1000_remove(struct pci_dev *pdev){	struct net_device *netdev = pci_get_drvdata(pdev);	struct e1000_adapter *adapter = netdev_priv(netdev);	uint32_t ctrl_ext;	uint32_t manc, swsm;#ifdef CONFIG_E1000_NAPI	int i;#endif	flush_scheduled_work();	if(adapter->hw.mac_type >= e1000_82540 &&	   adapter->hw.media_type == e1000_media_type_copper) {		manc = E1000_READ_REG(&adapter->hw, MANC);		if(manc & E1000_MANC_SMBUS_EN) {			manc |= E1000_MANC_ARP_EN;			E1000_WRITE_REG(&adapter->hw, MANC, manc);		}	}	switch(adapter->hw.mac_type) {	case e1000_82571:	case e1000_82572:		ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);		E1000_WRITE_REG(&adapter->hw, CTRL_EXT,				ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);		break;	case e1000_82573:		swsm = E1000_READ_REG(&adapter->hw, SWSM);		E1000_WRITE_REG(&adapter->hw, SWSM,				swsm & ~E1000_SWSM_DRV_LOAD);		break;	default:		break;	}	unregister_netdev(netdev);#ifdef CONFIG_E1000_NAPI	for (i = 0; i < adapter->num_queues; i++)		__dev_put(&adapter->polling_netdev[i]);#endif	if(!e1000_check_phy_reset_block(&adapter->hw))		e1000_phy_hw_reset(&adapter->hw);	kfree(adapter->tx_ring);	kfree(adapter->rx_ring);#ifdef CONFIG_E1000_NAPI	kfree(adapter->polling_netdev);#endif	iounmap(adapter->hw.hw_addr);	pci_release_regions(pdev);#ifdef CONFIG_E1000_MQ	free_percpu(adapter->cpu_netdev);	free_percpu(adapter->cpu_tx_ring);#endif	free_netdev(netdev);	pci_disable_device(pdev);}/** * e1000_sw_init - Initialize general software structures (struct e1000_adapter) * @adapter: board private structure to initialize * * e1000_sw_init initializes the Adapter private data structure. * Fields are initialized based on PCI device information and * OS network device settings (MTU size). **/static int __devinite1000_sw_init(struct e1000_adapter *adapter){	struct e1000_hw *hw = &adapter->hw;	struct net_device *netdev = adapter->netdev;	struct pci_dev *pdev = adapter->pdev;#ifdef CONFIG_E1000_NAPI	int i;#endif	/* PCI config space info */	hw->vendor_id = pdev->vendor;	hw->device_id = pdev->device;	hw->subsystem_vendor_id = pdev->subsystem_vendor;	hw->subsystem_id = pdev->subsystem_device;	pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id);	pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);	adapter->rx_buffer_len = E1000_RXBUFFER_2048;	adapter->rx_ps_bsize0 = E1000_RXBUFFER_256;	hw->max_frame_size = netdev->mtu +			     ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;	hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;	/* identify the MAC */	if(e1000_set_mac_type(hw)) {		DPRINTK(PROBE, ERR, "Unknown MAC Type\n");		return -EIO;	}	/* initialize eeprom parameters */	if(e1000_init_eeprom_params(hw)) {		E1000_ERR("EEPROM initialization failed\n");		return -EIO;	}	switch(hw->mac_type) {	default:		break;	case e1000_82541:	case e1000_82547:	case e1000_82541_rev_2:	case e1000_82547_rev_2:		hw->phy_init_script = 1;		break;	}	e1000_set_media_type(hw);	hw->wait_autoneg_complete = FALSE;	hw->tbi_compatibility_en = TRUE;	hw->adaptive_ifs = TRUE;	/* Copper options */	if(hw->media_type == e1000_media_type_copper) {		hw->mdix = AUTO_ALL_MODES;		hw->disable_polarity_correction = FALSE;		hw->master_slave = E1000_MASTER_SLAVE;	}#ifdef CONFIG_E1000_MQ	/* Number of supported queues */	switch (hw->mac_type) {	case e1000_82571:	case e1000_82572:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -