Wed Oct 18 10:43:32 2017 UTC ()
 Protect ec_multi* with mutex like other MP safe Ethernet drivers.
See if_ether.h rev. 1.66 and related stuff:
http://mail-index.netbsd.org/source-changes/2016/12/28/msg080289.html


(msaitoh)
diff -r1.104 -r1.105 src/sys/dev/pci/ixgbe/ixgbe.c
diff -r1.71 -r1.72 src/sys/dev/pci/ixgbe/ixv.c

cvs diff -r1.104 -r1.105 src/sys/dev/pci/ixgbe/ixgbe.c (expand / switch to unified diff)

--- src/sys/dev/pci/ixgbe/ixgbe.c 2017/10/13 04:52:40 1.104
+++ src/sys/dev/pci/ixgbe/ixgbe.c 2017/10/18 10:43:32 1.105
@@ -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 ************************************************************************/
2719static void 2719static void
2720ixgbe_set_promisc(struct adapter *adapter) 2720ixgbe_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 ************************************************************************/
3897static void 3900static void
3898ixgbe_set_multi(struct adapter *adapter) 3901ixgbe_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;

cvs diff -r1.71 -r1.72 src/sys/dev/pci/ixgbe/ixv.c (expand / switch to unified diff)

--- src/sys/dev/pci/ixgbe/ixv.c 2017/10/13 08:17:44 1.71
+++ src/sys/dev/pci/ixgbe/ixv.c 2017/10/18 10:43:32 1.72
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/*$NetBSD: ixv.c,v 1.71 2017/10/13 08:17:44 msaitoh Exp $*/ 1/*$NetBSD: ixv.c,v 1.72 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
@@ -1038,39 +1038,42 @@ ixv_negotiate_api(struct adapter *adapte @@ -1038,39 +1038,42 @@ ixv_negotiate_api(struct adapter *adapte
1038 * 1038 *
1039 * Called whenever multicast address list is updated. 1039 * Called whenever multicast address list is updated.
1040 ************************************************************************/ 1040 ************************************************************************/
1041static void 1041static void
1042ixv_set_multi(struct adapter *adapter) 1042ixv_set_multi(struct adapter *adapter)
1043{ 1043{
1044 struct ether_multi *enm; 1044 struct ether_multi *enm;
1045 struct ether_multistep step; 1045 struct ether_multistep step;
1046 struct ethercom *ec = &adapter->osdep.ec; 1046 struct ethercom *ec = &adapter->osdep.ec;
1047 u8 mta[MAX_NUM_MULTICAST_ADDRESSES * IXGBE_ETH_LENGTH_OF_ADDRESS]; 1047 u8 mta[MAX_NUM_MULTICAST_ADDRESSES * IXGBE_ETH_LENGTH_OF_ADDRESS];
1048 u8 *update_ptr; 1048 u8 *update_ptr;
1049 int mcnt = 0; 1049 int mcnt = 0;
1050 1050
 1051 KASSERT(mutex_owned(&adapter->core_mtx));
1051 IOCTL_DEBUGOUT("ixv_set_multi: begin"); 1052 IOCTL_DEBUGOUT("ixv_set_multi: begin");
1052 1053
 1054 ETHER_LOCK(ec);
1053 ETHER_FIRST_MULTI(step, ec, enm); 1055 ETHER_FIRST_MULTI(step, ec, enm);
1054 while (enm != NULL) { 1056 while (enm != NULL) {
1055 bcopy(enm->enm_addrlo, 1057 bcopy(enm->enm_addrlo,
1056 &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS], 1058 &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
1057 IXGBE_ETH_LENGTH_OF_ADDRESS); 1059 IXGBE_ETH_LENGTH_OF_ADDRESS);
1058 mcnt++; 1060 mcnt++;
1059 /* XXX This might be required --msaitoh */ 1061 /* XXX This might be required --msaitoh */
1060 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) 1062 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES)
1061 break; 1063 break;
1062 ETHER_NEXT_MULTI(step, enm); 1064 ETHER_NEXT_MULTI(step, enm);
1063 } 1065 }
 1066 ETHER_UNLOCK(ec);
1064 1067
1065 update_ptr = mta; 1068 update_ptr = mta;
1066 1069
1067 adapter->hw.mac.ops.update_mc_addr_list(&adapter->hw, update_ptr, mcnt, 1070 adapter->hw.mac.ops.update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
1068 ixv_mc_array_itr, TRUE); 1071 ixv_mc_array_itr, TRUE);
1069 1072
1070 return; 1073 return;
1071} /* ixv_set_multi */ 1074} /* ixv_set_multi */
1072 1075
1073/************************************************************************ 1076/************************************************************************
1074 * ixv_mc_array_itr 1077 * ixv_mc_array_itr
1075 * 1078 *
1076 * An iterator function needed by the multicast shared code. 1079 * An iterator function needed by the multicast shared code.