diff options
| author | <jgarzik@pretzel.yyz.us> | 2005-05-25 13:57:15 -0400 | 
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-05-25 13:57:15 -0400 | 
| commit | 09e62666d8a6312426f96bf483cdb003bde556fe (patch) | |
| tree | 1ecb7fd093169fb77d7cd5925bc214fd6c6d82e4 | |
| parent | 34812c9e188b47b1d6c9fff8ba530e6f2365ebc4 (diff) | |
| parent | ac79c82e793bc2440c4765e5eb1b834d2c18edf2 (diff) | |
Automatic merge of /spare/repo/netdev-2.6 branch ixgb
| -rw-r--r-- | drivers/net/ixgb/ixgb.h | 2 | ||||
| -rw-r--r-- | drivers/net/ixgb/ixgb_ee.c | 24 | ||||
| -rw-r--r-- | drivers/net/ixgb/ixgb_ethtool.c | 4 | ||||
| -rw-r--r-- | drivers/net/ixgb/ixgb_main.c | 153 | ||||
| -rw-r--r-- | drivers/net/ixgb/ixgb_osdep.h | 3 | 
5 files changed, 70 insertions, 116 deletions
| diff --git a/drivers/net/ixgb/ixgb.h b/drivers/net/ixgb/ixgb.h index 26c4f15f7fc0..f8d3385c7842 100644 --- a/drivers/net/ixgb/ixgb.h +++ b/drivers/net/ixgb/ixgb.h | |||
| @@ -110,7 +110,7 @@ struct ixgb_adapter; | |||
| 110 | #define IXGB_TX_QUEUE_WAKE 16 | 110 | #define IXGB_TX_QUEUE_WAKE 16 | 
| 111 | 111 | ||
| 112 | /* How many Rx Buffers do we bundle into one write to the hardware ? */ | 112 | /* How many Rx Buffers do we bundle into one write to the hardware ? */ | 
| 113 | #define IXGB_RX_BUFFER_WRITE 16 /* Must be power of 2 */ | 113 | #define IXGB_RX_BUFFER_WRITE 4 /* Must be power of 2 */ | 
| 114 | 114 | ||
| 115 | /* only works for sizes that are powers of 2 */ | 115 | /* only works for sizes that are powers of 2 */ | 
| 116 | #define IXGB_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1))) | 116 | #define IXGB_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1))) | 
| diff --git a/drivers/net/ixgb/ixgb_ee.c b/drivers/net/ixgb/ixgb_ee.c index 653e99f919ce..3aae110c5560 100644 --- a/drivers/net/ixgb/ixgb_ee.c +++ b/drivers/net/ixgb/ixgb_ee.c | |||
| @@ -411,7 +411,7 @@ ixgb_write_eeprom(struct ixgb_hw *hw, uint16_t offset, uint16_t data) | |||
| 411 | ixgb_cleanup_eeprom(hw); | 411 | ixgb_cleanup_eeprom(hw); | 
| 412 | 412 | ||
| 413 | /* clear the init_ctrl_reg_1 to signify that the cache is invalidated */ | 413 | /* clear the init_ctrl_reg_1 to signify that the cache is invalidated */ | 
| 414 | ee_map->init_ctrl_reg_1 = EEPROM_ICW1_SIGNATURE_CLEAR; | 414 | ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR); | 
| 415 | 415 | ||
| 416 | return; | 416 | return; | 
| 417 | } | 417 | } | 
| @@ -483,7 +483,7 @@ ixgb_get_eeprom_data(struct ixgb_hw *hw) | |||
| 483 | DEBUGOUT("ixgb_ee: Checksum invalid.\n"); | 483 | DEBUGOUT("ixgb_ee: Checksum invalid.\n"); | 
| 484 | /* clear the init_ctrl_reg_1 to signify that the cache is | 484 | /* clear the init_ctrl_reg_1 to signify that the cache is | 
| 485 | * invalidated */ | 485 | * invalidated */ | 
| 486 | ee_map->init_ctrl_reg_1 = EEPROM_ICW1_SIGNATURE_CLEAR; | 486 | ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR); | 
| 487 | return (FALSE); | 487 | return (FALSE); | 
| 488 | } | 488 | } | 
| 489 | 489 | ||
| @@ -579,7 +579,7 @@ ixgb_get_ee_compatibility(struct ixgb_hw *hw) | |||
| 579 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 579 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 580 | 580 | ||
| 581 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 581 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 582 | return(ee_map->compatibility); | 582 | return (le16_to_cpu(ee_map->compatibility)); | 
| 583 | 583 | ||
| 584 | return(0); | 584 | return(0); | 
| 585 | } | 585 | } | 
| @@ -616,7 +616,7 @@ ixgb_get_ee_init_ctrl_reg_1(struct ixgb_hw *hw) | |||
| 616 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 616 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 617 | 617 | ||
| 618 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 618 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 619 | return(ee_map->init_ctrl_reg_1); | 619 | return (le16_to_cpu(ee_map->init_ctrl_reg_1)); | 
| 620 | 620 | ||
| 621 | return(0); | 621 | return(0); | 
| 622 | } | 622 | } | 
| @@ -635,7 +635,7 @@ ixgb_get_ee_init_ctrl_reg_2(struct ixgb_hw *hw) | |||
| 635 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 635 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 636 | 636 | ||
| 637 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 637 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 638 | return(ee_map->init_ctrl_reg_2); | 638 | return (le16_to_cpu(ee_map->init_ctrl_reg_2)); | 
| 639 | 639 | ||
| 640 | return(0); | 640 | return(0); | 
| 641 | } | 641 | } | 
| @@ -654,7 +654,7 @@ ixgb_get_ee_subsystem_id(struct ixgb_hw *hw) | |||
| 654 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 654 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 655 | 655 | ||
| 656 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 656 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 657 | return(ee_map->subsystem_id); | 657 | return (le16_to_cpu(ee_map->subsystem_id)); | 
| 658 | 658 | ||
| 659 | return(0); | 659 | return(0); | 
| 660 | } | 660 | } | 
| @@ -673,7 +673,7 @@ ixgb_get_ee_subvendor_id(struct ixgb_hw *hw) | |||
| 673 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 673 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 674 | 674 | ||
| 675 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 675 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 676 | return(ee_map->subvendor_id); | 676 | return (le16_to_cpu(ee_map->subvendor_id)); | 
| 677 | 677 | ||
| 678 | return(0); | 678 | return(0); | 
| 679 | } | 679 | } | 
| @@ -692,7 +692,7 @@ ixgb_get_ee_device_id(struct ixgb_hw *hw) | |||
| 692 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 692 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 693 | 693 | ||
| 694 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 694 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 695 | return(ee_map->device_id); | 695 | return (le16_to_cpu(ee_map->device_id)); | 
| 696 | 696 | ||
| 697 | return(0); | 697 | return(0); | 
| 698 | } | 698 | } | 
| @@ -711,7 +711,7 @@ ixgb_get_ee_vendor_id(struct ixgb_hw *hw) | |||
| 711 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 711 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 712 | 712 | ||
| 713 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 713 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 714 | return(ee_map->vendor_id); | 714 | return (le16_to_cpu(ee_map->vendor_id)); | 
| 715 | 715 | ||
| 716 | return(0); | 716 | return(0); | 
| 717 | } | 717 | } | 
| @@ -730,7 +730,7 @@ ixgb_get_ee_swdpins_reg(struct ixgb_hw *hw) | |||
| 730 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 730 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 731 | 731 | ||
| 732 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 732 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 733 | return(ee_map->swdpins_reg); | 733 | return (le16_to_cpu(ee_map->swdpins_reg)); | 
| 734 | 734 | ||
| 735 | return(0); | 735 | return(0); | 
| 736 | } | 736 | } | 
| @@ -749,7 +749,7 @@ ixgb_get_ee_d3_power(struct ixgb_hw *hw) | |||
| 749 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 749 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 750 | 750 | ||
| 751 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 751 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 752 | return(ee_map->d3_power); | 752 | return (le16_to_cpu(ee_map->d3_power)); | 
| 753 | 753 | ||
| 754 | return(0); | 754 | return(0); | 
| 755 | } | 755 | } | 
| @@ -768,7 +768,7 @@ ixgb_get_ee_d0_power(struct ixgb_hw *hw) | |||
| 768 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 768 | struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom; | 
| 769 | 769 | ||
| 770 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 770 | if(ixgb_check_and_get_eeprom_data(hw) == TRUE) | 
| 771 | return(ee_map->d0_power); | 771 | return (le16_to_cpu(ee_map->d0_power)); | 
| 772 | 772 | ||
| 773 | return(0); | 773 | return(0); | 
| 774 | } | 774 | } | 
| diff --git a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c index aea10e8aaa72..3fa113854eeb 100644 --- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c | |||
| @@ -252,7 +252,9 @@ ixgb_get_regs(struct net_device *netdev, | |||
| 252 | uint32_t *reg_start = reg; | 252 | uint32_t *reg_start = reg; | 
| 253 | uint8_t i; | 253 | uint8_t i; | 
| 254 | 254 | ||
| 255 | regs->version = (adapter->hw.device_id << 16) | adapter->hw.subsystem_id; | 255 | /* the 1 (one) below indicates an attempt at versioning, if the | 
| 256 | * interface in ethtool or the driver this 1 should be incremented */ | ||
| 257 | regs->version = (1<<24) | hw->revision_id << 16 | hw->device_id; | ||
| 256 | 258 | ||
| 257 | /* General Registers */ | 259 | /* General Registers */ | 
| 258 | *reg++ = IXGB_READ_REG(hw, CTRL0); /* 0 */ | 260 | *reg++ = IXGB_READ_REG(hw, CTRL0); /* 0 */ | 
| diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 7d26623d8592..35f6a7c271a2 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
| @@ -47,7 +47,7 @@ char ixgb_driver_string[] = "Intel(R) PRO/10GbE Network Driver"; | |||
| 47 | #else | 47 | #else | 
| 48 | #define DRIVERNAPI "-NAPI" | 48 | #define DRIVERNAPI "-NAPI" | 
| 49 | #endif | 49 | #endif | 
| 50 | char ixgb_driver_version[] = "1.0.90-k2"DRIVERNAPI; | 50 | char ixgb_driver_version[] = "1.0.95-k2"DRIVERNAPI; | 
| 51 | char ixgb_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; | 51 | char ixgb_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; | 
| 52 | 52 | ||
| 53 | /* ixgb_pci_tbl - PCI Device ID Table | 53 | /* ixgb_pci_tbl - PCI Device ID Table | 
| @@ -103,6 +103,7 @@ static int ixgb_change_mtu(struct net_device *netdev, int new_mtu); | |||
| 103 | static int ixgb_set_mac(struct net_device *netdev, void *p); | 103 | static int ixgb_set_mac(struct net_device *netdev, void *p); | 
| 104 | static irqreturn_t ixgb_intr(int irq, void *data, struct pt_regs *regs); | 104 | static irqreturn_t ixgb_intr(int irq, void *data, struct pt_regs *regs); | 
| 105 | static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter); | 105 | static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter); | 
| 106 | |||
| 106 | #ifdef CONFIG_IXGB_NAPI | 107 | #ifdef CONFIG_IXGB_NAPI | 
| 107 | static int ixgb_clean(struct net_device *netdev, int *budget); | 108 | static int ixgb_clean(struct net_device *netdev, int *budget); | 
| 108 | static boolean_t ixgb_clean_rx_irq(struct ixgb_adapter *adapter, | 109 | static boolean_t ixgb_clean_rx_irq(struct ixgb_adapter *adapter, | 
| @@ -120,33 +121,20 @@ static void ixgb_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid); | |||
| 120 | static void ixgb_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid); | 121 | static void ixgb_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid); | 
| 121 | static void ixgb_restore_vlan(struct ixgb_adapter *adapter); | 122 | static void ixgb_restore_vlan(struct ixgb_adapter *adapter); | 
| 122 | 123 | ||
| 123 | static int ixgb_notify_reboot(struct notifier_block *, unsigned long event, | ||
| 124 | void *ptr); | ||
| 125 | static int ixgb_suspend(struct pci_dev *pdev, uint32_t state); | ||
| 126 | |||
| 127 | #ifdef CONFIG_NET_POLL_CONTROLLER | 124 | #ifdef CONFIG_NET_POLL_CONTROLLER | 
| 128 | /* for netdump / net console */ | 125 | /* for netdump / net console */ | 
| 129 | static void ixgb_netpoll(struct net_device *dev); | 126 | static void ixgb_netpoll(struct net_device *dev); | 
| 130 | #endif | 127 | #endif | 
| 131 | 128 | ||
| 132 | struct notifier_block ixgb_notifier_reboot = { | ||
| 133 | .notifier_call = ixgb_notify_reboot, | ||
| 134 | .next = NULL, | ||
| 135 | .priority = 0 | ||
| 136 | }; | ||
| 137 | |||
| 138 | /* Exported from other modules */ | 129 | /* Exported from other modules */ | 
| 139 | 130 | ||
| 140 | extern void ixgb_check_options(struct ixgb_adapter *adapter); | 131 | extern void ixgb_check_options(struct ixgb_adapter *adapter); | 
| 141 | 132 | ||
| 142 | static struct pci_driver ixgb_driver = { | 133 | static struct pci_driver ixgb_driver = { | 
| 143 | .name = ixgb_driver_name, | 134 | .name = ixgb_driver_name, | 
| 144 | .id_table = ixgb_pci_tbl, | 135 | .id_table = ixgb_pci_tbl, | 
| 145 | .probe = ixgb_probe, | 136 | .probe = ixgb_probe, | 
| 146 | .remove = __devexit_p(ixgb_remove), | 137 | .remove = __devexit_p(ixgb_remove), | 
| 147 | /* Power Managment Hooks */ | ||
| 148 | .suspend = NULL, | ||
| 149 | .resume = NULL | ||
| 150 | }; | 138 | }; | 
| 151 | 139 | ||
| 152 | MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>"); | 140 | MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>"); | 
| @@ -169,17 +157,12 @@ MODULE_LICENSE("GPL"); | |||
| 169 | static int __init | 157 | static int __init | 
| 170 | ixgb_init_module(void) | 158 | ixgb_init_module(void) | 
| 171 | { | 159 | { | 
| 172 | int ret; | ||
| 173 | printk(KERN_INFO "%s - version %s\n", | 160 | printk(KERN_INFO "%s - version %s\n", | 
| 174 | ixgb_driver_string, ixgb_driver_version); | 161 | ixgb_driver_string, ixgb_driver_version); | 
| 175 | 162 | ||
| 176 | printk(KERN_INFO "%s\n", ixgb_copyright); | 163 | printk(KERN_INFO "%s\n", ixgb_copyright); | 
| 177 | 164 | ||
| 178 | ret = pci_module_init(&ixgb_driver); | 165 | return pci_module_init(&ixgb_driver); | 
| 179 | if(ret >= 0) { | ||
| 180 | register_reboot_notifier(&ixgb_notifier_reboot); | ||
| 181 | } | ||
| 182 | return ret; | ||
| 183 | } | 166 | } | 
| 184 | 167 | ||
| 185 | module_init(ixgb_init_module); | 168 | module_init(ixgb_init_module); | 
| @@ -194,7 +177,6 @@ module_init(ixgb_init_module); | |||
| 194 | static void __exit | 177 | static void __exit | 
| 195 | ixgb_exit_module(void) | 178 | ixgb_exit_module(void) | 
| 196 | { | 179 | { | 
| 197 | unregister_reboot_notifier(&ixgb_notifier_reboot); | ||
| 198 | pci_unregister_driver(&ixgb_driver); | 180 | pci_unregister_driver(&ixgb_driver); | 
| 199 | } | 181 | } | 
| 200 | 182 | ||
| @@ -224,8 +206,8 @@ ixgb_irq_enable(struct ixgb_adapter *adapter) | |||
| 224 | { | 206 | { | 
| 225 | if(atomic_dec_and_test(&adapter->irq_sem)) { | 207 | if(atomic_dec_and_test(&adapter->irq_sem)) { | 
| 226 | IXGB_WRITE_REG(&adapter->hw, IMS, | 208 | IXGB_WRITE_REG(&adapter->hw, IMS, | 
| 227 | IXGB_INT_RXT0 | IXGB_INT_RXDMT0 | IXGB_INT_TXDW | | 209 | IXGB_INT_RXT0 | IXGB_INT_RXDMT0 | IXGB_INT_TXDW | | 
| 228 | IXGB_INT_RXO | IXGB_INT_LSC); | 210 | IXGB_INT_LSC); | 
| 229 | IXGB_WRITE_FLUSH(&adapter->hw); | 211 | IXGB_WRITE_FLUSH(&adapter->hw); | 
| 230 | } | 212 | } | 
| 231 | } | 213 | } | 
| @@ -1209,10 +1191,10 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
| 1209 | | IXGB_CONTEXT_DESC_CMD_TSE | 1191 | | IXGB_CONTEXT_DESC_CMD_TSE | 
| 1210 | | IXGB_CONTEXT_DESC_CMD_IP | 1192 | | IXGB_CONTEXT_DESC_CMD_IP | 
| 1211 | | IXGB_CONTEXT_DESC_CMD_TCP | 1193 | | IXGB_CONTEXT_DESC_CMD_TCP | 
| 1212 | | IXGB_CONTEXT_DESC_CMD_RS | ||
| 1213 | | IXGB_CONTEXT_DESC_CMD_IDE | 1194 | | IXGB_CONTEXT_DESC_CMD_IDE | 
| 1214 | | (skb->len - (hdr_len))); | 1195 | | (skb->len - (hdr_len))); | 
| 1215 | 1196 | ||
| 1197 | |||
| 1216 | if(++i == adapter->tx_ring.count) i = 0; | 1198 | if(++i == adapter->tx_ring.count) i = 0; | 
| 1217 | adapter->tx_ring.next_to_use = i; | 1199 | adapter->tx_ring.next_to_use = i; | 
| 1218 | 1200 | ||
| @@ -1247,8 +1229,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
| 1247 | context_desc->mss = 0; | 1229 | context_desc->mss = 0; | 
| 1248 | context_desc->cmd_type_len = | 1230 | context_desc->cmd_type_len = | 
| 1249 | cpu_to_le32(IXGB_CONTEXT_DESC_TYPE | 1231 | cpu_to_le32(IXGB_CONTEXT_DESC_TYPE | 
| 1250 | | IXGB_TX_DESC_CMD_RS | 1232 | | IXGB_TX_DESC_CMD_IDE); | 
| 1251 | | IXGB_TX_DESC_CMD_IDE); | ||
| 1252 | 1233 | ||
| 1253 | if(++i == adapter->tx_ring.count) i = 0; | 1234 | if(++i == adapter->tx_ring.count) i = 0; | 
| 1254 | adapter->tx_ring.next_to_use = i; | 1235 | adapter->tx_ring.next_to_use = i; | 
| @@ -1273,6 +1254,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, | |||
| 1273 | 1254 | ||
| 1274 | unsigned int nr_frags = skb_shinfo(skb)->nr_frags; | 1255 | unsigned int nr_frags = skb_shinfo(skb)->nr_frags; | 
| 1275 | unsigned int f; | 1256 | unsigned int f; | 
| 1257 | |||
| 1276 | len -= skb->data_len; | 1258 | len -= skb->data_len; | 
| 1277 | 1259 | ||
| 1278 | i = tx_ring->next_to_use; | 1260 | i = tx_ring->next_to_use; | 
| @@ -1526,14 +1508,33 @@ ixgb_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 1526 | void | 1508 | void | 
| 1527 | ixgb_update_stats(struct ixgb_adapter *adapter) | 1509 | ixgb_update_stats(struct ixgb_adapter *adapter) | 
| 1528 | { | 1510 | { | 
| 1511 | struct net_device *netdev = adapter->netdev; | ||
| 1512 | |||
| 1513 | if((netdev->flags & IFF_PROMISC) || (netdev->flags & IFF_ALLMULTI) || | ||
| 1514 | (netdev->mc_count > IXGB_MAX_NUM_MULTICAST_ADDRESSES)) { | ||
| 1515 | u64 multi = IXGB_READ_REG(&adapter->hw, MPRCL); | ||
| 1516 | u32 bcast_l = IXGB_READ_REG(&adapter->hw, BPRCL); | ||
| 1517 | u32 bcast_h = IXGB_READ_REG(&adapter->hw, BPRCH); | ||
| 1518 | u64 bcast = ((u64)bcast_h << 32) | bcast_l; | ||
| 1519 | |||
| 1520 | multi |= ((u64)IXGB_READ_REG(&adapter->hw, MPRCH) << 32); | ||
| 1521 | /* fix up multicast stats by removing broadcasts */ | ||
| 1522 | multi -= bcast; | ||
| 1523 | |||
| 1524 | adapter->stats.mprcl += (multi & 0xFFFFFFFF); | ||
| 1525 | adapter->stats.mprch += (multi >> 32); | ||
| 1526 | adapter->stats.bprcl += bcast_l; | ||
| 1527 | adapter->stats.bprch += bcast_h; | ||
| 1528 | } else { | ||
| 1529 | adapter->stats.mprcl += IXGB_READ_REG(&adapter->hw, MPRCL); | ||
| 1530 | adapter->stats.mprch += IXGB_READ_REG(&adapter->hw, MPRCH); | ||
| 1531 | adapter->stats.bprcl += IXGB_READ_REG(&adapter->hw, BPRCL); | ||
| 1532 | adapter->stats.bprch += IXGB_READ_REG(&adapter->hw, BPRCH); | ||
| 1533 | } | ||
| 1529 | adapter->stats.tprl += IXGB_READ_REG(&adapter->hw, TPRL); | 1534 | adapter->stats.tprl += IXGB_READ_REG(&adapter->hw, TPRL); | 
| 1530 | adapter->stats.tprh += IXGB_READ_REG(&adapter->hw, TPRH); | 1535 | adapter->stats.tprh += IXGB_READ_REG(&adapter->hw, TPRH); | 
| 1531 | adapter->stats.gprcl += IXGB_READ_REG(&adapter->hw, GPRCL); | 1536 | adapter->stats.gprcl += IXGB_READ_REG(&adapter->hw, GPRCL); | 
| 1532 | adapter->stats.gprch += IXGB_READ_REG(&adapter->hw, GPRCH); | 1537 | adapter->stats.gprch += IXGB_READ_REG(&adapter->hw, GPRCH); | 
| 1533 | adapter->stats.bprcl += IXGB_READ_REG(&adapter->hw, BPRCL); | ||
| 1534 | adapter->stats.bprch += IXGB_READ_REG(&adapter->hw, BPRCH); | ||
| 1535 | adapter->stats.mprcl += IXGB_READ_REG(&adapter->hw, MPRCL); | ||
| 1536 | adapter->stats.mprch += IXGB_READ_REG(&adapter->hw, MPRCH); | ||
| 1537 | adapter->stats.uprcl += IXGB_READ_REG(&adapter->hw, UPRCL); | 1538 | adapter->stats.uprcl += IXGB_READ_REG(&adapter->hw, UPRCL); | 
| 1538 | adapter->stats.uprch += IXGB_READ_REG(&adapter->hw, UPRCH); | 1539 | adapter->stats.uprch += IXGB_READ_REG(&adapter->hw, UPRCH); | 
| 1539 | adapter->stats.vprcl += IXGB_READ_REG(&adapter->hw, VPRCL); | 1540 | adapter->stats.vprcl += IXGB_READ_REG(&adapter->hw, VPRCL); | 
| @@ -1823,7 +1824,6 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1823 | struct pci_dev *pdev = adapter->pdev; | 1824 | struct pci_dev *pdev = adapter->pdev; | 
| 1824 | struct ixgb_rx_desc *rx_desc, *next_rxd; | 1825 | struct ixgb_rx_desc *rx_desc, *next_rxd; | 
| 1825 | struct ixgb_buffer *buffer_info, *next_buffer, *next2_buffer; | 1826 | struct ixgb_buffer *buffer_info, *next_buffer, *next2_buffer; | 
| 1826 | struct sk_buff *skb, *next_skb; | ||
| 1827 | uint32_t length; | 1827 | uint32_t length; | 
| 1828 | unsigned int i, j; | 1828 | unsigned int i, j; | 
| 1829 | boolean_t cleaned = FALSE; | 1829 | boolean_t cleaned = FALSE; | 
| @@ -1833,6 +1833,8 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1833 | buffer_info = &rx_ring->buffer_info[i]; | 1833 | buffer_info = &rx_ring->buffer_info[i]; | 
| 1834 | 1834 | ||
| 1835 | while(rx_desc->status & IXGB_RX_DESC_STATUS_DD) { | 1835 | while(rx_desc->status & IXGB_RX_DESC_STATUS_DD) { | 
| 1836 | struct sk_buff *skb, *next_skb; | ||
| 1837 | u8 status; | ||
| 1836 | 1838 | ||
| 1837 | #ifdef CONFIG_IXGB_NAPI | 1839 | #ifdef CONFIG_IXGB_NAPI | 
| 1838 | if(*work_done >= work_to_do) | 1840 | if(*work_done >= work_to_do) | 
| @@ -1840,7 +1842,9 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1840 | 1842 | ||
| 1841 | (*work_done)++; | 1843 | (*work_done)++; | 
| 1842 | #endif | 1844 | #endif | 
| 1845 | status = rx_desc->status; | ||
| 1843 | skb = buffer_info->skb; | 1846 | skb = buffer_info->skb; | 
| 1847 | |||
| 1844 | prefetch(skb->data); | 1848 | prefetch(skb->data); | 
| 1845 | 1849 | ||
| 1846 | if(++i == rx_ring->count) i = 0; | 1850 | if(++i == rx_ring->count) i = 0; | 
| @@ -1855,7 +1859,6 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1855 | next_skb = next_buffer->skb; | 1859 | next_skb = next_buffer->skb; | 
| 1856 | prefetch(next_skb); | 1860 | prefetch(next_skb); | 
| 1857 | 1861 | ||
| 1858 | |||
| 1859 | cleaned = TRUE; | 1862 | cleaned = TRUE; | 
| 1860 | 1863 | ||
| 1861 | pci_unmap_single(pdev, | 1864 | pci_unmap_single(pdev, | 
| @@ -1865,7 +1868,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1865 | 1868 | ||
| 1866 | length = le16_to_cpu(rx_desc->length); | 1869 | length = le16_to_cpu(rx_desc->length); | 
| 1867 | 1870 | ||
| 1868 | if(unlikely(!(rx_desc->status & IXGB_RX_DESC_STATUS_EOP))) { | 1871 | if(unlikely(!(status & IXGB_RX_DESC_STATUS_EOP))) { | 
| 1869 | 1872 | ||
| 1870 | /* All receives must fit into a single buffer */ | 1873 | /* All receives must fit into a single buffer */ | 
| 1871 | 1874 | ||
| @@ -1873,12 +1876,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1873 | "length<%x>\n", length); | 1876 | "length<%x>\n", length); | 
| 1874 | 1877 | ||
| 1875 | dev_kfree_skb_irq(skb); | 1878 | dev_kfree_skb_irq(skb); | 
| 1876 | rx_desc->status = 0; | 1879 | goto rxdesc_done; | 
| 1877 | buffer_info->skb = NULL; | ||
| 1878 | |||
| 1879 | rx_desc = next_rxd; | ||
| 1880 | buffer_info = next_buffer; | ||
| 1881 | continue; | ||
| 1882 | } | 1880 | } | 
| 1883 | 1881 | ||
| 1884 | if (unlikely(rx_desc->errors | 1882 | if (unlikely(rx_desc->errors | 
| @@ -1887,12 +1885,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1887 | IXGB_RX_DESC_ERRORS_RXE))) { | 1885 | IXGB_RX_DESC_ERRORS_RXE))) { | 
| 1888 | 1886 | ||
| 1889 | dev_kfree_skb_irq(skb); | 1887 | dev_kfree_skb_irq(skb); | 
| 1890 | rx_desc->status = 0; | 1888 | goto rxdesc_done; | 
| 1891 | buffer_info->skb = NULL; | ||
| 1892 | |||
| 1893 | rx_desc = next_rxd; | ||
| 1894 | buffer_info = next_buffer; | ||
| 1895 | continue; | ||
| 1896 | } | 1889 | } | 
| 1897 | 1890 | ||
| 1898 | /* Good Receive */ | 1891 | /* Good Receive */ | 
| @@ -1903,7 +1896,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1903 | 1896 | ||
| 1904 | skb->protocol = eth_type_trans(skb, netdev); | 1897 | skb->protocol = eth_type_trans(skb, netdev); | 
| 1905 | #ifdef CONFIG_IXGB_NAPI | 1898 | #ifdef CONFIG_IXGB_NAPI | 
| 1906 | if(adapter->vlgrp && (rx_desc->status & IXGB_RX_DESC_STATUS_VP)) { | 1899 | if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) { | 
| 1907 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 1900 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 
| 1908 | le16_to_cpu(rx_desc->special) & | 1901 | le16_to_cpu(rx_desc->special) & | 
| 1909 | IXGB_RX_DESC_SPECIAL_VLAN_MASK); | 1902 | IXGB_RX_DESC_SPECIAL_VLAN_MASK); | 
| @@ -1911,7 +1904,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1911 | netif_receive_skb(skb); | 1904 | netif_receive_skb(skb); | 
| 1912 | } | 1905 | } | 
| 1913 | #else /* CONFIG_IXGB_NAPI */ | 1906 | #else /* CONFIG_IXGB_NAPI */ | 
| 1914 | if(adapter->vlgrp && (rx_desc->status & IXGB_RX_DESC_STATUS_VP)) { | 1907 | if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) { | 
| 1915 | vlan_hwaccel_rx(skb, adapter->vlgrp, | 1908 | vlan_hwaccel_rx(skb, adapter->vlgrp, | 
| 1916 | le16_to_cpu(rx_desc->special) & | 1909 | le16_to_cpu(rx_desc->special) & | 
| 1917 | IXGB_RX_DESC_SPECIAL_VLAN_MASK); | 1910 | IXGB_RX_DESC_SPECIAL_VLAN_MASK); | 
| @@ -1921,9 +1914,12 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) | |||
| 1921 | #endif /* CONFIG_IXGB_NAPI */ | 1914 | #endif /* CONFIG_IXGB_NAPI */ | 
| 1922 | netdev->last_rx = jiffies; | 1915 | netdev->last_rx = jiffies; | 
| 1923 | 1916 | ||
| 1917 | rxdesc_done: | ||
| 1918 | /* clean up descriptor, might be written over by hw */ | ||
| 1924 | rx_desc->status = 0; | 1919 | rx_desc->status = 0; | 
| 1925 | buffer_info->skb = NULL; | 1920 | buffer_info->skb = NULL; | 
| 1926 | 1921 | ||
| 1922 | /* use prefetched values */ | ||
| 1927 | rx_desc = next_rxd; | 1923 | rx_desc = next_rxd; | 
| 1928 | buffer_info = next_buffer; | 1924 | buffer_info = next_buffer; | 
| 1929 | } | 1925 | } | 
| @@ -1959,8 +1955,8 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter) | |||
| 1959 | 1955 | ||
| 1960 | num_group_tail_writes = IXGB_RX_BUFFER_WRITE; | 1956 | num_group_tail_writes = IXGB_RX_BUFFER_WRITE; | 
| 1961 | 1957 | ||
| 1962 | /* leave one descriptor unused */ | 1958 | /* leave three descriptors unused */ | 
| 1963 | while(--cleancount > 0) { | 1959 | while(--cleancount > 2) { | 
| 1964 | rx_desc = IXGB_RX_DESC(*rx_ring, i); | 1960 | rx_desc = IXGB_RX_DESC(*rx_ring, i); | 
| 1965 | 1961 | ||
| 1966 | skb = dev_alloc_skb(adapter->rx_buffer_len + NET_IP_ALIGN); | 1962 | skb = dev_alloc_skb(adapter->rx_buffer_len + NET_IP_ALIGN); | 
| @@ -1987,6 +1983,10 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter) | |||
| 1987 | PCI_DMA_FROMDEVICE); | 1983 | PCI_DMA_FROMDEVICE); | 
| 1988 | 1984 | ||
| 1989 | rx_desc->buff_addr = cpu_to_le64(buffer_info->dma); | 1985 | rx_desc->buff_addr = cpu_to_le64(buffer_info->dma); | 
| 1986 | /* guarantee DD bit not set now before h/w gets descriptor | ||
| 1987 | * this is the rest of the workaround for h/w double | ||
| 1988 | * writeback. */ | ||
| 1989 | rx_desc->status = 0; | ||
| 1990 | 1990 | ||
| 1991 | if((i & ~(num_group_tail_writes- 1)) == i) { | 1991 | if((i & ~(num_group_tail_writes- 1)) == i) { | 
| 1992 | /* Force memory writes to complete before letting h/w | 1992 | /* Force memory writes to complete before letting h/w | 
| @@ -2099,54 +2099,6 @@ ixgb_restore_vlan(struct ixgb_adapter *adapter) | |||
| 2099 | } | 2099 | } | 
| 2100 | } | 2100 | } | 
| 2101 | 2101 | ||
| 2102 | /** | ||
| 2103 | * ixgb_notify_reboot - handles OS notification of reboot event. | ||
| 2104 | * @param nb notifier block, unused | ||
| 2105 | * @param event Event being passed to driver to act upon | ||
| 2106 | * @param p A pointer to our net device | ||
| 2107 | **/ | ||
| 2108 | static int | ||
| 2109 | ixgb_notify_reboot(struct notifier_block *nb, unsigned long event, void *p) | ||
| 2110 | { | ||
| 2111 | struct pci_dev *pdev = NULL; | ||
| 2112 | |||
| 2113 | switch(event) { | ||
| 2114 | case SYS_DOWN: | ||
| 2115 | case SYS_HALT: | ||
| 2116 | case SYS_POWER_OFF: | ||
| 2117 | while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) { | ||
| 2118 | if (pci_dev_driver(pdev) == &ixgb_driver) | ||
| 2119 | ixgb_suspend(pdev, 3); | ||
| 2120 | } | ||
| 2121 | } | ||
| 2122 | return NOTIFY_DONE; | ||
| 2123 | } | ||
| 2124 | |||
| 2125 | /** | ||
| 2126 | * ixgb_suspend - driver suspend function called from notify. | ||
| 2127 | * @param pdev pci driver structure used for passing to | ||
| 2128 | * @param state power state to enter | ||
| 2129 | **/ | ||
| 2130 | static int | ||
| 2131 | ixgb_suspend(struct pci_dev *pdev, uint32_t state) | ||
| 2132 | { | ||
| 2133 | struct net_device *netdev = pci_get_drvdata(pdev); | ||
| 2134 | struct ixgb_adapter *adapter = netdev->priv; | ||
| 2135 | |||
| 2136 | netif_device_detach(netdev); | ||
| 2137 | |||
| 2138 | if(netif_running(netdev)) | ||
| 2139 | ixgb_down(adapter, TRUE); | ||
| 2140 | |||
| 2141 | pci_save_state(pdev); | ||
| 2142 | |||
| 2143 | state = (state > 0) ? 3 : 0; | ||
| 2144 | pci_set_power_state(pdev, state); | ||
| 2145 | msec_delay(200); | ||
| 2146 | |||
| 2147 | return 0; | ||
| 2148 | } | ||
| 2149 | |||
| 2150 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2102 | #ifdef CONFIG_NET_POLL_CONTROLLER | 
| 2151 | /* | 2103 | /* | 
| 2152 | * Polling 'interrupt' - used by things like netconsole to send skbs | 2104 | * Polling 'interrupt' - used by things like netconsole to send skbs | 
| @@ -2157,6 +2109,7 @@ ixgb_suspend(struct pci_dev *pdev, uint32_t state) | |||
| 2157 | static void ixgb_netpoll(struct net_device *dev) | 2109 | static void ixgb_netpoll(struct net_device *dev) | 
| 2158 | { | 2110 | { | 
| 2159 | struct ixgb_adapter *adapter = dev->priv; | 2111 | struct ixgb_adapter *adapter = dev->priv; | 
| 2112 | |||
| 2160 | disable_irq(adapter->pdev->irq); | 2113 | disable_irq(adapter->pdev->irq); | 
| 2161 | ixgb_intr(adapter->pdev->irq, dev, NULL); | 2114 | ixgb_intr(adapter->pdev->irq, dev, NULL); | 
| 2162 | enable_irq(adapter->pdev->irq); | 2115 | enable_irq(adapter->pdev->irq); | 
| diff --git a/drivers/net/ixgb/ixgb_osdep.h b/drivers/net/ixgb/ixgb_osdep.h index 9eba92891901..dba20481ee80 100644 --- a/drivers/net/ixgb/ixgb_osdep.h +++ b/drivers/net/ixgb/ixgb_osdep.h | |||
| @@ -45,8 +45,7 @@ | |||
| 45 | /* Don't mdelay in interrupt context! */ \ | 45 | /* Don't mdelay in interrupt context! */ \ | 
| 46 | BUG(); \ | 46 | BUG(); \ | 
| 47 | } else { \ | 47 | } else { \ | 
| 48 | set_current_state(TASK_UNINTERRUPTIBLE); \ | 48 | msleep(x); \ | 
| 49 | schedule_timeout((x * HZ)/1000 + 2); \ | ||
| 50 | } } while(0) | 49 | } } while(0) | 
| 51 | #endif | 50 | #endif | 
| 52 | 51 | ||
