diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000/e1000_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 0e9aec8f6917..4348b6fd44fa 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |||
| @@ -164,6 +164,8 @@ static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, | |||
| 164 | static bool e1000_vlan_used(struct e1000_adapter *adapter); | 164 | static bool e1000_vlan_used(struct e1000_adapter *adapter); |
| 165 | static void e1000_vlan_mode(struct net_device *netdev, | 165 | static void e1000_vlan_mode(struct net_device *netdev, |
| 166 | netdev_features_t features); | 166 | netdev_features_t features); |
| 167 | static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, | ||
| 168 | bool filter_on); | ||
| 167 | static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid); | 169 | static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid); |
| 168 | static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); | 170 | static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); |
| 169 | static void e1000_restore_vlan(struct e1000_adapter *adapter); | 171 | static void e1000_restore_vlan(struct e1000_adapter *adapter); |
| @@ -215,7 +217,8 @@ MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver"); | |||
| 215 | MODULE_LICENSE("GPL"); | 217 | MODULE_LICENSE("GPL"); |
| 216 | MODULE_VERSION(DRV_VERSION); | 218 | MODULE_VERSION(DRV_VERSION); |
| 217 | 219 | ||
| 218 | static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE; | 220 | #define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK) |
| 221 | static int debug = -1; | ||
| 219 | module_param(debug, int, 0); | 222 | module_param(debug, int, 0); |
| 220 | MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); | 223 | MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); |
| 221 | 224 | ||
| @@ -979,7 +982,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 979 | adapter = netdev_priv(netdev); | 982 | adapter = netdev_priv(netdev); |
| 980 | adapter->netdev = netdev; | 983 | adapter->netdev = netdev; |
| 981 | adapter->pdev = pdev; | 984 | adapter->pdev = pdev; |
| 982 | adapter->msg_enable = (1 << debug) - 1; | 985 | adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); |
| 983 | adapter->bars = bars; | 986 | adapter->bars = bars; |
| 984 | adapter->need_ioport = need_ioport; | 987 | adapter->need_ioport = need_ioport; |
| 985 | 988 | ||
| @@ -1214,7 +1217,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 1214 | if (err) | 1217 | if (err) |
| 1215 | goto err_register; | 1218 | goto err_register; |
| 1216 | 1219 | ||
| 1217 | e1000_vlan_mode(netdev, netdev->features); | 1220 | e1000_vlan_filter_on_off(adapter, false); |
| 1218 | 1221 | ||
| 1219 | /* print bus type/speed/width info */ | 1222 | /* print bus type/speed/width info */ |
| 1220 | e_info(probe, "(PCI%s:%dMHz:%d-bit) %pM\n", | 1223 | e_info(probe, "(PCI%s:%dMHz:%d-bit) %pM\n", |
| @@ -4770,6 +4773,22 @@ static bool e1000_vlan_used(struct e1000_adapter *adapter) | |||
| 4770 | return false; | 4773 | return false; |
| 4771 | } | 4774 | } |
| 4772 | 4775 | ||
| 4776 | static void __e1000_vlan_mode(struct e1000_adapter *adapter, | ||
| 4777 | netdev_features_t features) | ||
| 4778 | { | ||
| 4779 | struct e1000_hw *hw = &adapter->hw; | ||
| 4780 | u32 ctrl; | ||
| 4781 | |||
| 4782 | ctrl = er32(CTRL); | ||
| 4783 | if (features & NETIF_F_HW_VLAN_RX) { | ||
| 4784 | /* enable VLAN tag insert/strip */ | ||
| 4785 | ctrl |= E1000_CTRL_VME; | ||
| 4786 | } else { | ||
| 4787 | /* disable VLAN tag insert/strip */ | ||
| 4788 | ctrl &= ~E1000_CTRL_VME; | ||
| 4789 | } | ||
| 4790 | ew32(CTRL, ctrl); | ||
| 4791 | } | ||
| 4773 | static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, | 4792 | static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, |
| 4774 | bool filter_on) | 4793 | bool filter_on) |
| 4775 | { | 4794 | { |
| @@ -4779,6 +4798,7 @@ static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, | |||
| 4779 | if (!test_bit(__E1000_DOWN, &adapter->flags)) | 4798 | if (!test_bit(__E1000_DOWN, &adapter->flags)) |
| 4780 | e1000_irq_disable(adapter); | 4799 | e1000_irq_disable(adapter); |
| 4781 | 4800 | ||
| 4801 | __e1000_vlan_mode(adapter, adapter->netdev->features); | ||
| 4782 | if (filter_on) { | 4802 | if (filter_on) { |
| 4783 | /* enable VLAN receive filtering */ | 4803 | /* enable VLAN receive filtering */ |
| 4784 | rctl = er32(RCTL); | 4804 | rctl = er32(RCTL); |
| @@ -4799,24 +4819,14 @@ static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, | |||
| 4799 | } | 4819 | } |
| 4800 | 4820 | ||
| 4801 | static void e1000_vlan_mode(struct net_device *netdev, | 4821 | static void e1000_vlan_mode(struct net_device *netdev, |
| 4802 | netdev_features_t features) | 4822 | netdev_features_t features) |
| 4803 | { | 4823 | { |
| 4804 | struct e1000_adapter *adapter = netdev_priv(netdev); | 4824 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 4805 | struct e1000_hw *hw = &adapter->hw; | ||
| 4806 | u32 ctrl; | ||
| 4807 | 4825 | ||
| 4808 | if (!test_bit(__E1000_DOWN, &adapter->flags)) | 4826 | if (!test_bit(__E1000_DOWN, &adapter->flags)) |
| 4809 | e1000_irq_disable(adapter); | 4827 | e1000_irq_disable(adapter); |
| 4810 | 4828 | ||
| 4811 | ctrl = er32(CTRL); | 4829 | __e1000_vlan_mode(adapter, features); |
| 4812 | if (features & NETIF_F_HW_VLAN_RX) { | ||
| 4813 | /* enable VLAN tag insert/strip */ | ||
| 4814 | ctrl |= E1000_CTRL_VME; | ||
| 4815 | } else { | ||
| 4816 | /* disable VLAN tag insert/strip */ | ||
| 4817 | ctrl &= ~E1000_CTRL_VME; | ||
| 4818 | } | ||
| 4819 | ew32(CTRL, ctrl); | ||
| 4820 | 4830 | ||
| 4821 | if (!test_bit(__E1000_DOWN, &adapter->flags)) | 4831 | if (!test_bit(__E1000_DOWN, &adapter->flags)) |
| 4822 | e1000_irq_enable(adapter); | 4832 | e1000_irq_enable(adapter); |
