aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/cavium/thunder/nic.h1
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_main.c14
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h b/drivers/net/ethernet/cavium/thunder/nic.h
index a3b43e50a576..dda8a02b7322 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -263,6 +263,7 @@ struct nicvf {
263 bool pf_acked; 263 bool pf_acked;
264 bool pf_nacked; 264 bool pf_nacked;
265 bool bgx_stats_acked; 265 bool bgx_stats_acked;
266 bool set_mac_pending;
266} ____cacheline_aligned_in_smp; 267} ____cacheline_aligned_in_smp;
267 268
268/* PF <--> VF Mailbox communication 269/* PF <--> VF Mailbox communication
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 02da802d3288..8b119a035b7e 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -201,7 +201,9 @@ static void nicvf_handle_mbx_intr(struct nicvf *nic)
201 nic->vf_id = mbx.nic_cfg.vf_id & 0x7F; 201 nic->vf_id = mbx.nic_cfg.vf_id & 0x7F;
202 nic->tns_mode = mbx.nic_cfg.tns_mode & 0x7F; 202 nic->tns_mode = mbx.nic_cfg.tns_mode & 0x7F;
203 nic->node = mbx.nic_cfg.node_id; 203 nic->node = mbx.nic_cfg.node_id;
204 ether_addr_copy(nic->netdev->dev_addr, mbx.nic_cfg.mac_addr); 204 if (!nic->set_mac_pending)
205 ether_addr_copy(nic->netdev->dev_addr,
206 mbx.nic_cfg.mac_addr);
205 nic->link_up = false; 207 nic->link_up = false;
206 nic->duplex = 0; 208 nic->duplex = 0;
207 nic->speed = 0; 209 nic->speed = 0;
@@ -941,6 +943,11 @@ int nicvf_open(struct net_device *netdev)
941 nicvf_hw_set_mac_addr(nic, netdev); 943 nicvf_hw_set_mac_addr(nic, netdev);
942 } 944 }
943 945
946 if (nic->set_mac_pending) {
947 nic->set_mac_pending = false;
948 nicvf_hw_set_mac_addr(nic, netdev);
949 }
950
944 /* Init tasklet for handling Qset err interrupt */ 951 /* Init tasklet for handling Qset err interrupt */
945 tasklet_init(&nic->qs_err_task, nicvf_handle_qs_err, 952 tasklet_init(&nic->qs_err_task, nicvf_handle_qs_err,
946 (unsigned long)nic); 953 (unsigned long)nic);
@@ -1040,9 +1047,12 @@ static int nicvf_set_mac_address(struct net_device *netdev, void *p)
1040 1047
1041 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); 1048 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
1042 1049
1043 if (nic->msix_enabled) 1050 if (nic->msix_enabled) {
1044 if (nicvf_hw_set_mac_addr(nic, netdev)) 1051 if (nicvf_hw_set_mac_addr(nic, netdev))
1045 return -EBUSY; 1052 return -EBUSY;
1053 } else {
1054 nic->set_mac_pending = true;
1055 }
1046 1056
1047 return 0; 1057 return 0;
1048} 1058}