diff options
| author | Yaroslav Tykhiy <ytykhiy@gmail.com> | 2005-01-26 13:44:47 +0000 |
|---|---|---|
| committer | Yaroslav Tykhiy <ytykhiy@gmail.com> | 2005-01-26 13:44:47 +0000 |
| commit | c96a57bbf570520ab0cf0f3a0209a88caa066874 (patch) | |
| tree | 671c7589938950cdf9de5fe63cda87d795990e72 | |
| parent | 22e556d59c7aa697192b8401c9e4912e4f146989 (diff) | |
Notes
| -rw-r--r-- | sys/dev/em/if_em.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/sys/dev/em/if_em.c b/sys/dev/em/if_em.c index 36fadddfdb35f..296c765df2c95 100644 --- a/sys/dev/em/if_em.c +++ b/sys/dev/em/if_em.c @@ -163,6 +163,7 @@ static void em_print_link_status(struct adapter *); static int em_get_buf(int i, struct adapter *, struct mbuf *); static void em_enable_vlans(struct adapter *); +static void em_disable_vlans(struct adapter *); static int em_encap(struct adapter *, struct mbuf **); static void em_smartspeed(struct adapter *); static int em_82547_fifo_workaround(struct adapter *, int); @@ -1511,11 +1512,9 @@ em_set_promisc(struct adapter * adapter) { u_int32_t reg_rctl; - u_int32_t ctrl; struct ifnet *ifp = &adapter->interface_data.ac_if; reg_rctl = E1000_READ_REG(&adapter->hw, RCTL); - ctrl = E1000_READ_REG(&adapter->hw, CTRL); if (ifp->if_flags & IFF_PROMISC) { reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); @@ -1524,8 +1523,8 @@ em_set_promisc(struct adapter * adapter) * This enables bridging of vlan tagged frames to occur * and also allows vlan tags to be seen in tcpdump */ - ctrl &= ~E1000_CTRL_VME; - E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); + if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) + em_disable_vlans(adapter); adapter->em_insert_vlan_header = 1; } else if (ifp->if_flags & IFF_ALLMULTI) { reg_rctl |= E1000_RCTL_MPE; @@ -1542,6 +1541,7 @@ static void em_disable_promisc(struct adapter * adapter) { u_int32_t reg_rctl; + struct ifnet *ifp = &adapter->interface_data.ac_if; reg_rctl = E1000_READ_REG(&adapter->hw, RCTL); @@ -1549,7 +1549,8 @@ em_disable_promisc(struct adapter * adapter) reg_rctl &= (~E1000_RCTL_MPE); E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl); - em_enable_vlans(adapter); + if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) + em_enable_vlans(adapter); adapter->em_insert_vlan_header = 0; return; @@ -2985,6 +2986,18 @@ em_enable_vlans(struct adapter *adapter) } static void +em_disable_vlans(struct adapter *adapter) +{ + uint32_t ctrl; + + ctrl = E1000_READ_REG(&adapter->hw, CTRL); + ctrl &= ~E1000_CTRL_VME; + E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); + + return; +} + +static void em_enable_intr(struct adapter * adapter) { E1000_WRITE_REG(&adapter->hw, IMS, (IMS_ENABLE_MASK)); |
