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

📄 ixgb_ethtool.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	*reg++ = IXGB_GET_STAT(adapter, gptcl);	/* 104 */	*reg++ = IXGB_GET_STAT(adapter, gptch);	/* 105 */	*reg++ = IXGB_GET_STAT(adapter, bptcl);	/* 106 */	*reg++ = IXGB_GET_STAT(adapter, bptch);	/* 107 */	*reg++ = IXGB_GET_STAT(adapter, mptcl);	/* 108 */	*reg++ = IXGB_GET_STAT(adapter, mptch);	/* 109 */	*reg++ = IXGB_GET_STAT(adapter, uptcl);	/* 110 */	*reg++ = IXGB_GET_STAT(adapter, uptch);	/* 111 */	*reg++ = IXGB_GET_STAT(adapter, vptcl);	/* 112 */	*reg++ = IXGB_GET_STAT(adapter, vptch);	/* 113 */	*reg++ = IXGB_GET_STAT(adapter, jptcl);	/* 114 */	*reg++ = IXGB_GET_STAT(adapter, jptch);	/* 115 */	*reg++ = IXGB_GET_STAT(adapter, gotcl);	/* 116 */	*reg++ = IXGB_GET_STAT(adapter, gotch);	/* 117 */	*reg++ = IXGB_GET_STAT(adapter, totl);	/* 118 */	*reg++ = IXGB_GET_STAT(adapter, toth);	/* 119 */	*reg++ = IXGB_GET_STAT(adapter, dc);	/* 120 */	*reg++ = IXGB_GET_STAT(adapter, plt64c);	/* 121 */	*reg++ = IXGB_GET_STAT(adapter, tsctc);	/* 122 */	*reg++ = IXGB_GET_STAT(adapter, tsctfc);	/* 123 */	*reg++ = IXGB_GET_STAT(adapter, ibic);	/* 124 */	*reg++ = IXGB_GET_STAT(adapter, rfc);	/* 125 */	*reg++ = IXGB_GET_STAT(adapter, lfc);	/* 126 */	*reg++ = IXGB_GET_STAT(adapter, pfrc);	/* 127 */	*reg++ = IXGB_GET_STAT(adapter, pftc);	/* 128 */	*reg++ = IXGB_GET_STAT(adapter, mcfrc);	/* 129 */	*reg++ = IXGB_GET_STAT(adapter, mcftc);	/* 130 */	*reg++ = IXGB_GET_STAT(adapter, xonrxc);	/* 131 */	*reg++ = IXGB_GET_STAT(adapter, xontxc);	/* 132 */	*reg++ = IXGB_GET_STAT(adapter, xoffrxc);	/* 133 */	*reg++ = IXGB_GET_STAT(adapter, xofftxc);	/* 134 */	*reg++ = IXGB_GET_STAT(adapter, rjc);	/* 135 */	regs->len = (reg - reg_start) * sizeof(uint32_t);}static intixgb_get_eeprom_len(struct net_device *netdev){	/* return size in bytes */	return (IXGB_EEPROM_SIZE << 1);}static intixgb_get_eeprom(struct net_device *netdev,		  struct ethtool_eeprom *eeprom, uint8_t *bytes){	struct ixgb_adapter *adapter = netdev_priv(netdev);	struct ixgb_hw *hw = &adapter->hw;	uint16_t *eeprom_buff;	int i, max_len, first_word, last_word;	int ret_val = 0;	if(eeprom->len == 0) {		ret_val = -EINVAL;		goto geeprom_error;	}	eeprom->magic = hw->vendor_id | (hw->device_id << 16);	max_len = ixgb_get_eeprom_len(netdev);	if(eeprom->offset > eeprom->offset + eeprom->len) {		ret_val = -EINVAL;		goto geeprom_error;	}	if((eeprom->offset + eeprom->len) > max_len)		eeprom->len = (max_len - eeprom->offset);	first_word = eeprom->offset >> 1;	last_word = (eeprom->offset + eeprom->len - 1) >> 1;	eeprom_buff = kmalloc(sizeof(uint16_t) *			(last_word - first_word + 1), GFP_KERNEL);	if(!eeprom_buff)		return -ENOMEM;	/* note the eeprom was good because the driver loaded */	for(i = 0; i <= (last_word - first_word); i++) {		eeprom_buff[i] = ixgb_get_eeprom_word(hw, (first_word + i));	}	memcpy(bytes, (uint8_t *)eeprom_buff + (eeprom->offset & 1),			eeprom->len);	kfree(eeprom_buff);geeprom_error:	return ret_val;}static intixgb_set_eeprom(struct net_device *netdev,		  struct ethtool_eeprom *eeprom, uint8_t *bytes){	struct ixgb_adapter *adapter = netdev_priv(netdev);	struct ixgb_hw *hw = &adapter->hw;	uint16_t *eeprom_buff;	void *ptr;	int max_len, first_word, last_word;	uint16_t i;	if(eeprom->len == 0)		return -EINVAL;	if(eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))		return -EFAULT;	max_len = ixgb_get_eeprom_len(netdev);	if(eeprom->offset > eeprom->offset + eeprom->len)		return -EINVAL;	if((eeprom->offset + eeprom->len) > max_len)		eeprom->len = (max_len - eeprom->offset);	first_word = eeprom->offset >> 1;	last_word = (eeprom->offset + eeprom->len - 1) >> 1;	eeprom_buff = kmalloc(max_len, GFP_KERNEL);	if(!eeprom_buff)		return -ENOMEM;	ptr = (void *)eeprom_buff;	if(eeprom->offset & 1) {		/* need read/modify/write of first changed EEPROM word */		/* only the second byte of the word is being modified */		eeprom_buff[0] = ixgb_read_eeprom(hw, first_word);		ptr++;	}	if((eeprom->offset + eeprom->len) & 1) {		/* need read/modify/write of last changed EEPROM word */		/* only the first byte of the word is being modified */		eeprom_buff[last_word - first_word] 			= ixgb_read_eeprom(hw, last_word);	}	memcpy(ptr, bytes, eeprom->len);	for(i = 0; i <= (last_word - first_word); i++)		ixgb_write_eeprom(hw, first_word + i, eeprom_buff[i]);	/* Update the checksum over the first part of the EEPROM if needed */	if(first_word <= EEPROM_CHECKSUM_REG)		ixgb_update_eeprom_checksum(hw);	kfree(eeprom_buff);	return 0;}static voidixgb_get_drvinfo(struct net_device *netdev,		   struct ethtool_drvinfo *drvinfo){	struct ixgb_adapter *adapter = netdev_priv(netdev);	strncpy(drvinfo->driver,  ixgb_driver_name, 32);	strncpy(drvinfo->version, ixgb_driver_version, 32);	strncpy(drvinfo->fw_version, "N/A", 32);	strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);	drvinfo->n_stats = IXGB_STATS_LEN;	drvinfo->regdump_len = ixgb_get_regs_len(netdev);	drvinfo->eedump_len = ixgb_get_eeprom_len(netdev);}static voidixgb_get_ringparam(struct net_device *netdev,		struct ethtool_ringparam *ring){	struct ixgb_adapter *adapter = netdev_priv(netdev);	struct ixgb_desc_ring *txdr = &adapter->tx_ring;	struct ixgb_desc_ring *rxdr = &adapter->rx_ring;	ring->rx_max_pending = MAX_RXD; 	ring->tx_max_pending = MAX_TXD;	ring->rx_mini_max_pending = 0;	ring->rx_jumbo_max_pending = 0;	ring->rx_pending = rxdr->count;	ring->tx_pending = txdr->count;	ring->rx_mini_pending = 0;	ring->rx_jumbo_pending = 0;}static int ixgb_set_ringparam(struct net_device *netdev,		struct ethtool_ringparam *ring){	struct ixgb_adapter *adapter = netdev_priv(netdev);	struct ixgb_desc_ring *txdr = &adapter->tx_ring;	struct ixgb_desc_ring *rxdr = &adapter->rx_ring;	struct ixgb_desc_ring tx_old, tx_new, rx_old, rx_new;	int err;	tx_old = adapter->tx_ring;	rx_old = adapter->rx_ring;	if((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) 		return -EINVAL;	if(netif_running(adapter->netdev))		ixgb_down(adapter,TRUE);	rxdr->count = max(ring->rx_pending,(uint32_t)MIN_RXD);	rxdr->count = min(rxdr->count,(uint32_t)MAX_RXD);	IXGB_ROUNDUP(rxdr->count, IXGB_REQ_RX_DESCRIPTOR_MULTIPLE); 	txdr->count = max(ring->tx_pending,(uint32_t)MIN_TXD);	txdr->count = min(txdr->count,(uint32_t)MAX_TXD);	IXGB_ROUNDUP(txdr->count, IXGB_REQ_TX_DESCRIPTOR_MULTIPLE); 	if(netif_running(adapter->netdev)) {		/* Try to get new resources before deleting old */		if((err = ixgb_setup_rx_resources(adapter)))			goto err_setup_rx;		if((err = ixgb_setup_tx_resources(adapter)))			goto err_setup_tx;		/* save the new, restore the old in order to free it,		 * then restore the new back again */		rx_new = adapter->rx_ring;		tx_new = adapter->tx_ring;		adapter->rx_ring = rx_old;		adapter->tx_ring = tx_old;		ixgb_free_rx_resources(adapter);		ixgb_free_tx_resources(adapter);		adapter->rx_ring = rx_new;		adapter->tx_ring = tx_new;		if((err = ixgb_up(adapter)))			return err;		/* be optimistic about our link, since we were up before */		adapter->link_speed = 10000;		adapter->link_duplex = FULL_DUPLEX;		netif_carrier_on(netdev);		netif_wake_queue(netdev);	}	return 0;err_setup_tx:	ixgb_free_rx_resources(adapter);err_setup_rx:	adapter->rx_ring = rx_old;	adapter->tx_ring = tx_old;	ixgb_up(adapter);	return err;}/* toggle LED 4 times per second = 2 "blinks" per second */#define IXGB_ID_INTERVAL	(HZ/4)/* bit defines for adapter->led_status */#define IXGB_LED_ON		0static voidixgb_led_blink_callback(unsigned long data){	struct ixgb_adapter *adapter = (struct ixgb_adapter *)data;	if(test_and_change_bit(IXGB_LED_ON, &adapter->led_status))		ixgb_led_off(&adapter->hw);	else		ixgb_led_on(&adapter->hw);	mod_timer(&adapter->blink_timer, jiffies + IXGB_ID_INTERVAL);}static intixgb_phys_id(struct net_device *netdev, uint32_t data){	struct ixgb_adapter *adapter = netdev_priv(netdev);	if(!data || data > (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ))		data = (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ);	if(!adapter->blink_timer.function) {		init_timer(&adapter->blink_timer);		adapter->blink_timer.function = ixgb_led_blink_callback;		adapter->blink_timer.data = (unsigned long)adapter;	}	mod_timer(&adapter->blink_timer, jiffies);	if (data)		schedule_timeout_interruptible(data * HZ);	else		schedule_timeout_interruptible(MAX_SCHEDULE_TIMEOUT);	del_timer_sync(&adapter->blink_timer);	ixgb_led_off(&adapter->hw);	clear_bit(IXGB_LED_ON, &adapter->led_status);	return 0;}static int ixgb_get_stats_count(struct net_device *netdev){	return IXGB_STATS_LEN;}static void ixgb_get_ethtool_stats(struct net_device *netdev, 		struct ethtool_stats *stats, uint64_t *data){	struct ixgb_adapter *adapter = netdev_priv(netdev);	int i;	ixgb_update_stats(adapter);	for(i = 0; i < IXGB_STATS_LEN; i++) {		char *p = (char *)adapter+ixgb_gstrings_stats[i].stat_offset;			data[i] = (ixgb_gstrings_stats[i].sizeof_stat == 			sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;	}}static void ixgb_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data){	int i;	switch(stringset) {	case ETH_SS_STATS:		for(i=0; i < IXGB_STATS_LEN; i++) {			memcpy(data + i * ETH_GSTRING_LEN, 			ixgb_gstrings_stats[i].stat_string,			ETH_GSTRING_LEN);		}		break;	}}static struct ethtool_ops ixgb_ethtool_ops = {	.get_settings = ixgb_get_settings,	.set_settings = ixgb_set_settings,	.get_drvinfo = ixgb_get_drvinfo,	.get_regs_len = ixgb_get_regs_len,	.get_regs = ixgb_get_regs,	.get_link = ethtool_op_get_link,	.get_eeprom_len = ixgb_get_eeprom_len,	.get_eeprom = ixgb_get_eeprom,	.set_eeprom = ixgb_set_eeprom,	.get_ringparam = ixgb_get_ringparam,	.set_ringparam = ixgb_set_ringparam,	.get_pauseparam	= ixgb_get_pauseparam,	.set_pauseparam	= ixgb_set_pauseparam,	.get_rx_csum = ixgb_get_rx_csum,	.set_rx_csum = ixgb_set_rx_csum,	.get_tx_csum = ixgb_get_tx_csum,	.set_tx_csum = ixgb_set_tx_csum,	.get_sg	= ethtool_op_get_sg,	.set_sg	= ethtool_op_set_sg,#ifdef NETIF_F_TSO	.get_tso = ethtool_op_get_tso,	.set_tso = ixgb_set_tso,#endif	.get_strings = ixgb_get_strings,	.phys_id = ixgb_phys_id,	.get_stats_count = ixgb_get_stats_count,	.get_ethtool_stats = ixgb_get_ethtool_stats,	.get_perm_addr = ethtool_op_get_perm_addr,};void ixgb_set_ethtool_ops(struct net_device *netdev){	SET_ETHTOOL_OPS(netdev, &ixgb_ethtool_ops);}

⌨️ 快捷键说明

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