| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: ixgbe.c,v 1.104 2017/10/13 04:52:40 msaitoh Exp $ */ | | 1 | /* $NetBSD: ixgbe.c,v 1.105 2017/10/18 10:43:32 msaitoh Exp $ */ |
2 | | | 2 | |
3 | /****************************************************************************** | | 3 | /****************************************************************************** |
4 | | | 4 | |
5 | Copyright (c) 2001-2017, Intel Corporation | | 5 | Copyright (c) 2001-2017, Intel Corporation |
6 | All rights reserved. | | 6 | All rights reserved. |
7 | | | 7 | |
8 | Redistribution and use in source and binary forms, with or without | | 8 | Redistribution and use in source and binary forms, with or without |
9 | modification, are permitted provided that the following conditions are met: | | 9 | modification, are permitted provided that the following conditions are met: |
10 | | | 10 | |
11 | 1. Redistributions of source code must retain the above copyright notice, | | 11 | 1. Redistributions of source code must retain the above copyright notice, |
12 | this list of conditions and the following disclaimer. | | 12 | this list of conditions and the following disclaimer. |
13 | | | 13 | |
14 | 2. Redistributions in binary form must reproduce the above copyright | | 14 | 2. Redistributions in binary form must reproduce the above copyright |
| @@ -2716,38 +2716,41 @@ invalid: | | | @@ -2716,38 +2716,41 @@ invalid: |
2716 | /************************************************************************ | | 2716 | /************************************************************************ |
2717 | * ixgbe_set_promisc | | 2717 | * ixgbe_set_promisc |
2718 | ************************************************************************/ | | 2718 | ************************************************************************/ |
2719 | static void | | 2719 | static void |
2720 | ixgbe_set_promisc(struct adapter *adapter) | | 2720 | ixgbe_set_promisc(struct adapter *adapter) |
2721 | { | | 2721 | { |
2722 | struct ifnet *ifp = adapter->ifp; | | 2722 | struct ifnet *ifp = adapter->ifp; |
2723 | int mcnt = 0; | | 2723 | int mcnt = 0; |
2724 | u32 rctl; | | 2724 | u32 rctl; |
2725 | struct ether_multi *enm; | | 2725 | struct ether_multi *enm; |
2726 | struct ether_multistep step; | | 2726 | struct ether_multistep step; |
2727 | struct ethercom *ec = &adapter->osdep.ec; | | 2727 | struct ethercom *ec = &adapter->osdep.ec; |
2728 | | | 2728 | |
| | | 2729 | KASSERT(mutex_owned(&adapter->core_mtx)); |
2729 | rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); | | 2730 | rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); |
2730 | rctl &= (~IXGBE_FCTRL_UPE); | | 2731 | rctl &= (~IXGBE_FCTRL_UPE); |
2731 | if (ifp->if_flags & IFF_ALLMULTI) | | 2732 | if (ifp->if_flags & IFF_ALLMULTI) |
2732 | mcnt = MAX_NUM_MULTICAST_ADDRESSES; | | 2733 | mcnt = MAX_NUM_MULTICAST_ADDRESSES; |
2733 | else { | | 2734 | else { |
| | | 2735 | ETHER_LOCK(ec); |
2734 | ETHER_FIRST_MULTI(step, ec, enm); | | 2736 | ETHER_FIRST_MULTI(step, ec, enm); |
2735 | while (enm != NULL) { | | 2737 | while (enm != NULL) { |
2736 | if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) | | 2738 | if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) |
2737 | break; | | 2739 | break; |
2738 | mcnt++; | | 2740 | mcnt++; |
2739 | ETHER_NEXT_MULTI(step, enm); | | 2741 | ETHER_NEXT_MULTI(step, enm); |
2740 | } | | 2742 | } |
| | | 2743 | ETHER_UNLOCK(ec); |
2741 | } | | 2744 | } |
2742 | if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) | | 2745 | if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) |
2743 | rctl &= (~IXGBE_FCTRL_MPE); | | 2746 | rctl &= (~IXGBE_FCTRL_MPE); |
2744 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl); | | 2747 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl); |
2745 | | | 2748 | |
2746 | if (ifp->if_flags & IFF_PROMISC) { | | 2749 | if (ifp->if_flags & IFF_PROMISC) { |
2747 | rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); | | 2750 | rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); |
2748 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl); | | 2751 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl); |
2749 | } else if (ifp->if_flags & IFF_ALLMULTI) { | | 2752 | } else if (ifp->if_flags & IFF_ALLMULTI) { |
2750 | rctl |= IXGBE_FCTRL_MPE; | | 2753 | rctl |= IXGBE_FCTRL_MPE; |
2751 | rctl &= ~IXGBE_FCTRL_UPE; | | 2754 | rctl &= ~IXGBE_FCTRL_UPE; |
2752 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl); | | 2755 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl); |
2753 | } | | 2756 | } |
| @@ -3896,46 +3899,49 @@ ixgbe_config_delay_values(struct adapter | | | @@ -3896,46 +3899,49 @@ ixgbe_config_delay_values(struct adapter |
3896 | ************************************************************************/ | | 3899 | ************************************************************************/ |
3897 | static void | | 3900 | static void |
3898 | ixgbe_set_multi(struct adapter *adapter) | | 3901 | ixgbe_set_multi(struct adapter *adapter) |
3899 | { | | 3902 | { |
3900 | struct ixgbe_mc_addr *mta; | | 3903 | struct ixgbe_mc_addr *mta; |
3901 | struct ifnet *ifp = adapter->ifp; | | 3904 | struct ifnet *ifp = adapter->ifp; |
3902 | u8 *update_ptr; | | 3905 | u8 *update_ptr; |
3903 | int mcnt = 0; | | 3906 | int mcnt = 0; |
3904 | u32 fctrl; | | 3907 | u32 fctrl; |
3905 | struct ethercom *ec = &adapter->osdep.ec; | | 3908 | struct ethercom *ec = &adapter->osdep.ec; |
3906 | struct ether_multi *enm; | | 3909 | struct ether_multi *enm; |
3907 | struct ether_multistep step; | | 3910 | struct ether_multistep step; |
3908 | | | 3911 | |
| | | 3912 | KASSERT(mutex_owned(&adapter->core_mtx)); |
3909 | IOCTL_DEBUGOUT("ixgbe_set_multi: begin"); | | 3913 | IOCTL_DEBUGOUT("ixgbe_set_multi: begin"); |
3910 | | | 3914 | |
3911 | mta = adapter->mta; | | 3915 | mta = adapter->mta; |
3912 | bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES); | | 3916 | bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES); |
3913 | | | 3917 | |
3914 | ifp->if_flags &= ~IFF_ALLMULTI; | | 3918 | ifp->if_flags &= ~IFF_ALLMULTI; |
| | | 3919 | ETHER_LOCK(ec); |
3915 | ETHER_FIRST_MULTI(step, ec, enm); | | 3920 | ETHER_FIRST_MULTI(step, ec, enm); |
3916 | while (enm != NULL) { | | 3921 | while (enm != NULL) { |
3917 | if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) || | | 3922 | if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) || |
3918 | (memcmp(enm->enm_addrlo, enm->enm_addrhi, | | 3923 | (memcmp(enm->enm_addrlo, enm->enm_addrhi, |
3919 | ETHER_ADDR_LEN) != 0)) { | | 3924 | ETHER_ADDR_LEN) != 0)) { |
3920 | ifp->if_flags |= IFF_ALLMULTI; | | 3925 | ifp->if_flags |= IFF_ALLMULTI; |
3921 | break; | | 3926 | break; |
3922 | } | | 3927 | } |
3923 | bcopy(enm->enm_addrlo, | | 3928 | bcopy(enm->enm_addrlo, |
3924 | mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS); | | 3929 | mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS); |
3925 | mta[mcnt].vmdq = adapter->pool; | | 3930 | mta[mcnt].vmdq = adapter->pool; |
3926 | mcnt++; | | 3931 | mcnt++; |
3927 | ETHER_NEXT_MULTI(step, enm); | | 3932 | ETHER_NEXT_MULTI(step, enm); |
3928 | } | | 3933 | } |
| | | 3934 | ETHER_UNLOCK(ec); |
3929 | | | 3935 | |
3930 | fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); | | 3936 | fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); |
3931 | fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); | | 3937 | fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); |
3932 | if (ifp->if_flags & IFF_PROMISC) | | 3938 | if (ifp->if_flags & IFF_PROMISC) |
3933 | fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); | | 3939 | fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); |
3934 | else if (ifp->if_flags & IFF_ALLMULTI) { | | 3940 | else if (ifp->if_flags & IFF_ALLMULTI) { |
3935 | fctrl |= IXGBE_FCTRL_MPE; | | 3941 | fctrl |= IXGBE_FCTRL_MPE; |
3936 | } | | 3942 | } |
3937 | | | 3943 | |
3938 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl); | | 3944 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl); |
3939 | | | 3945 | |
3940 | if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) { | | 3946 | if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) { |
3941 | update_ptr = (u8 *)mta; | | 3947 | update_ptr = (u8 *)mta; |