@@ -4031,124 +4031,156 @@ static int ixgbe_write_mc_addr_list(struct net_device *netdev)
4031
4031
#ifdef CONFIG_PCI_IOV
4032
4032
void ixgbe_full_sync_mac_table (struct ixgbe_adapter * adapter )
4033
4033
{
4034
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [0 ];
4034
4035
struct ixgbe_hw * hw = & adapter -> hw ;
4035
4036
int i ;
4036
- for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ ) {
4037
- if (adapter -> mac_table [i ].state & IXGBE_MAC_STATE_IN_USE )
4038
- hw -> mac .ops .set_rar (hw , i , adapter -> mac_table [i ].addr ,
4039
- adapter -> mac_table [i ].queue ,
4037
+
4038
+ for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ , mac_table ++ ) {
4039
+ mac_table -> state &= ~IXGBE_MAC_STATE_MODIFIED ;
4040
+
4041
+ if (mac_table -> state & IXGBE_MAC_STATE_IN_USE )
4042
+ hw -> mac .ops .set_rar (hw , i ,
4043
+ mac_table -> addr ,
4044
+ mac_table -> pool ,
4040
4045
IXGBE_RAH_AV );
4041
4046
else
4042
4047
hw -> mac .ops .clear_rar (hw , i );
4043
-
4044
- adapter -> mac_table [i ].state &= ~(IXGBE_MAC_STATE_MODIFIED );
4045
4048
}
4046
4049
}
4047
- #endif
4048
4050
4051
+ #endif
4049
4052
static void ixgbe_sync_mac_table (struct ixgbe_adapter * adapter )
4050
4053
{
4054
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [0 ];
4051
4055
struct ixgbe_hw * hw = & adapter -> hw ;
4052
4056
int i ;
4053
- for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ ) {
4054
- if (adapter -> mac_table [i ].state & IXGBE_MAC_STATE_MODIFIED ) {
4055
- if (adapter -> mac_table [i ].state &
4056
- IXGBE_MAC_STATE_IN_USE )
4057
- hw -> mac .ops .set_rar (hw , i ,
4058
- adapter -> mac_table [i ].addr ,
4059
- adapter -> mac_table [i ].queue ,
4060
- IXGBE_RAH_AV );
4061
- else
4062
- hw -> mac .ops .clear_rar (hw , i );
4063
4057
4064
- adapter -> mac_table [i ].state &=
4065
- ~(IXGBE_MAC_STATE_MODIFIED );
4066
- }
4058
+ for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ , mac_table ++ ) {
4059
+ if (!(mac_table -> state & IXGBE_MAC_STATE_MODIFIED ))
4060
+ continue ;
4061
+
4062
+ mac_table -> state &= ~IXGBE_MAC_STATE_MODIFIED ;
4063
+
4064
+ if (mac_table -> state & IXGBE_MAC_STATE_IN_USE )
4065
+ hw -> mac .ops .set_rar (hw , i ,
4066
+ mac_table -> addr ,
4067
+ mac_table -> pool ,
4068
+ IXGBE_RAH_AV );
4069
+ else
4070
+ hw -> mac .ops .clear_rar (hw , i );
4067
4071
}
4068
4072
}
4069
4073
4070
4074
static void ixgbe_flush_sw_mac_table (struct ixgbe_adapter * adapter )
4071
4075
{
4072
- int i ;
4076
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [ 0 ] ;
4073
4077
struct ixgbe_hw * hw = & adapter -> hw ;
4078
+ int i ;
4074
4079
4075
- for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ ) {
4076
- adapter -> mac_table [i ].state |= IXGBE_MAC_STATE_MODIFIED ;
4077
- adapter -> mac_table [i ].state &= ~IXGBE_MAC_STATE_IN_USE ;
4078
- eth_zero_addr (adapter -> mac_table [i ].addr );
4079
- adapter -> mac_table [i ].queue = 0 ;
4080
+ for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ , mac_table ++ ) {
4081
+ mac_table -> state |= IXGBE_MAC_STATE_MODIFIED ;
4082
+ mac_table -> state &= ~IXGBE_MAC_STATE_IN_USE ;
4080
4083
}
4084
+
4081
4085
ixgbe_sync_mac_table (adapter );
4082
4086
}
4083
4087
4084
- static int ixgbe_available_rars (struct ixgbe_adapter * adapter )
4088
+ static int ixgbe_available_rars (struct ixgbe_adapter * adapter , u16 pool )
4085
4089
{
4090
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [0 ];
4086
4091
struct ixgbe_hw * hw = & adapter -> hw ;
4087
4092
int i , count = 0 ;
4088
4093
4089
- for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ ) {
4090
- if (adapter -> mac_table [i ].state == 0 )
4091
- count ++ ;
4094
+ for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ , mac_table ++ ) {
4095
+ /* do not count default RAR as available */
4096
+ if (mac_table -> state & IXGBE_MAC_STATE_DEFAULT )
4097
+ continue ;
4098
+
4099
+ /* only count unused and addresses that belong to us */
4100
+ if (mac_table -> state & IXGBE_MAC_STATE_IN_USE ) {
4101
+ if (mac_table -> pool != pool )
4102
+ continue ;
4103
+ }
4104
+
4105
+ count ++ ;
4092
4106
}
4107
+
4093
4108
return count ;
4094
4109
}
4095
4110
4096
4111
/* this function destroys the first RAR entry */
4097
- static void ixgbe_mac_set_default_filter (struct ixgbe_adapter * adapter ,
4098
- u8 * addr )
4112
+ static void ixgbe_mac_set_default_filter (struct ixgbe_adapter * adapter )
4099
4113
{
4114
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [0 ];
4100
4115
struct ixgbe_hw * hw = & adapter -> hw ;
4101
4116
4102
- memcpy (& adapter -> mac_table [ 0 ]. addr , addr , ETH_ALEN );
4103
- adapter -> mac_table [ 0 ]. queue = VMDQ_P (0 );
4104
- adapter -> mac_table [ 0 ]. state = ( IXGBE_MAC_STATE_DEFAULT |
4105
- IXGBE_MAC_STATE_IN_USE ) ;
4106
- hw -> mac . ops . set_rar ( hw , 0 , adapter -> mac_table [ 0 ]. addr ,
4107
- adapter -> mac_table [ 0 ]. queue ,
4117
+ memcpy (& mac_table -> addr , hw -> mac . addr , ETH_ALEN );
4118
+ mac_table -> pool = VMDQ_P (0 );
4119
+
4120
+ mac_table -> state = IXGBE_MAC_STATE_DEFAULT | IXGBE_MAC_STATE_IN_USE ;
4121
+
4122
+ hw -> mac . ops . set_rar ( hw , 0 , mac_table -> addr , mac_table -> pool ,
4108
4123
IXGBE_RAH_AV );
4109
4124
}
4110
4125
4111
- int ixgbe_add_mac_filter (struct ixgbe_adapter * adapter , u8 * addr , u16 queue )
4126
+ int ixgbe_add_mac_filter (struct ixgbe_adapter * adapter ,
4127
+ const u8 * addr , u16 pool )
4112
4128
{
4129
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [0 ];
4113
4130
struct ixgbe_hw * hw = & adapter -> hw ;
4114
4131
int i ;
4115
4132
4116
4133
if (is_zero_ether_addr (addr ))
4117
4134
return - EINVAL ;
4118
4135
4119
- for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ ) {
4120
- if (adapter -> mac_table [ i ]. state & IXGBE_MAC_STATE_IN_USE )
4136
+ for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ , mac_table ++ ) {
4137
+ if (mac_table -> state & IXGBE_MAC_STATE_IN_USE )
4121
4138
continue ;
4122
- adapter -> mac_table [i ].state |= (IXGBE_MAC_STATE_MODIFIED |
4123
- IXGBE_MAC_STATE_IN_USE );
4124
- ether_addr_copy (adapter -> mac_table [i ].addr , addr );
4125
- adapter -> mac_table [i ].queue = queue ;
4139
+
4140
+ ether_addr_copy (mac_table -> addr , addr );
4141
+ mac_table -> pool = pool ;
4142
+
4143
+ mac_table -> state |= IXGBE_MAC_STATE_MODIFIED |
4144
+ IXGBE_MAC_STATE_IN_USE ;
4145
+
4126
4146
ixgbe_sync_mac_table (adapter );
4147
+
4127
4148
return i ;
4128
4149
}
4150
+
4129
4151
return - ENOMEM ;
4130
4152
}
4131
4153
4132
- int ixgbe_del_mac_filter (struct ixgbe_adapter * adapter , u8 * addr , u16 queue )
4154
+ int ixgbe_del_mac_filter (struct ixgbe_adapter * adapter ,
4155
+ const u8 * addr , u16 pool )
4133
4156
{
4134
- /* search table for addr, if found, set to 0 and sync */
4135
- int i ;
4157
+ struct ixgbe_mac_addr * mac_table = & adapter -> mac_table [0 ];
4136
4158
struct ixgbe_hw * hw = & adapter -> hw ;
4159
+ int i ;
4137
4160
4138
4161
if (is_zero_ether_addr (addr ))
4139
4162
return - EINVAL ;
4140
4163
4141
- for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ ) {
4142
- if (ether_addr_equal (addr , adapter -> mac_table [i ].addr ) &&
4143
- adapter -> mac_table [i ].queue == queue ) {
4144
- adapter -> mac_table [i ].state |= IXGBE_MAC_STATE_MODIFIED ;
4145
- adapter -> mac_table [i ].state &= ~IXGBE_MAC_STATE_IN_USE ;
4146
- eth_zero_addr (adapter -> mac_table [i ].addr );
4147
- adapter -> mac_table [i ].queue = 0 ;
4148
- ixgbe_sync_mac_table (adapter );
4149
- return 0 ;
4150
- }
4164
+ /* search table for addr, if found clear IN_USE flag and sync */
4165
+ for (i = 0 ; i < hw -> mac .num_rar_entries ; i ++ , mac_table ++ ) {
4166
+ /* we can only delete an entry if it is in use */
4167
+ if (!(mac_table -> state & IXGBE_MAC_STATE_IN_USE ))
4168
+ continue ;
4169
+ /* we only care about entries that belong to the given pool */
4170
+ if (mac_table -> pool != pool )
4171
+ continue ;
4172
+ /* we only care about a specific MAC address */
4173
+ if (!ether_addr_equal (addr , mac_table -> addr ))
4174
+ continue ;
4175
+
4176
+ mac_table -> state |= IXGBE_MAC_STATE_MODIFIED ;
4177
+ mac_table -> state &= ~IXGBE_MAC_STATE_IN_USE ;
4178
+
4179
+ ixgbe_sync_mac_table (adapter );
4180
+
4181
+ return 0 ;
4151
4182
}
4183
+
4152
4184
return - ENOMEM ;
4153
4185
}
4154
4186
/**
@@ -4166,7 +4198,7 @@ static int ixgbe_write_uc_addr_list(struct net_device *netdev, int vfn)
4166
4198
int count = 0 ;
4167
4199
4168
4200
/* return ENOMEM indicating insufficient memory for addresses */
4169
- if (netdev_uc_count (netdev ) > ixgbe_available_rars (adapter ))
4201
+ if (netdev_uc_count (netdev ) > ixgbe_available_rars (adapter , vfn ))
4170
4202
return - ENOMEM ;
4171
4203
4172
4204
if (!netdev_uc_empty (netdev )) {
@@ -5039,7 +5071,6 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
5039
5071
struct ixgbe_hw * hw = & adapter -> hw ;
5040
5072
struct net_device * netdev = adapter -> netdev ;
5041
5073
int err ;
5042
- u8 old_addr [ETH_ALEN ];
5043
5074
5044
5075
if (ixgbe_removed (hw -> hw_addr ))
5045
5076
return ;
@@ -5076,9 +5107,8 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
5076
5107
5077
5108
clear_bit (__IXGBE_IN_SFP_INIT , & adapter -> state );
5078
5109
/* do not flush user set addresses */
5079
- memcpy (old_addr , & adapter -> mac_table [0 ].addr , netdev -> addr_len );
5080
5110
ixgbe_flush_sw_mac_table (adapter );
5081
- ixgbe_mac_set_default_filter (adapter , old_addr );
5111
+ ixgbe_mac_set_default_filter (adapter );
5082
5112
5083
5113
/* update SAN MAC vmdq pool selection */
5084
5114
if (hw -> mac .san_mac_rar_index )
@@ -7656,17 +7686,16 @@ static int ixgbe_set_mac(struct net_device *netdev, void *p)
7656
7686
struct ixgbe_adapter * adapter = netdev_priv (netdev );
7657
7687
struct ixgbe_hw * hw = & adapter -> hw ;
7658
7688
struct sockaddr * addr = p ;
7659
- int ret ;
7660
7689
7661
7690
if (!is_valid_ether_addr (addr -> sa_data ))
7662
7691
return - EADDRNOTAVAIL ;
7663
7692
7664
- ixgbe_del_mac_filter (adapter , hw -> mac .addr , VMDQ_P (0 ));
7665
7693
memcpy (netdev -> dev_addr , addr -> sa_data , netdev -> addr_len );
7666
7694
memcpy (hw -> mac .addr , addr -> sa_data , netdev -> addr_len );
7667
7695
7668
- ret = ixgbe_add_mac_filter (adapter , hw -> mac .addr , VMDQ_P (0 ));
7669
- return ret > 0 ? 0 : ret ;
7696
+ ixgbe_mac_set_default_filter (adapter );
7697
+
7698
+ return 0 ;
7670
7699
}
7671
7700
7672
7701
static int
@@ -8867,7 +8896,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
8867
8896
goto err_sw_init ;
8868
8897
}
8869
8898
8870
- ixgbe_mac_set_default_filter (adapter , hw -> mac . perm_addr );
8899
+ ixgbe_mac_set_default_filter (adapter );
8871
8900
8872
8901
setup_timer (& adapter -> service_timer , & ixgbe_service_timer ,
8873
8902
(unsigned long ) adapter );
0 commit comments