diff options
author | Pavel Belous <pavel.belous@aquantia.com> | 2017-02-20 14:36:47 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-02-20 17:11:09 -0500 |
commit | 55629109d934b2c1b25457424fa72eb94e8c2a26 (patch) | |
tree | b6dc9303b82ca88a5ede3ac5b0ce93de76d06920 | |
parent | df9000ef9609c8a5e57783d0667ba7f39f52ed1e (diff) |
net: ethernet: aquantia: Call netdev_register after all initialized.
netdev_register should be called when everything is initialized.
Also we should use net_device->reg_state field instead own
"is_ndev_registered" flag to avoid any race.
Signed-off-by: Pavel Belous <pavel.belous@aquantia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h | 1 |
2 files changed, 5 insertions, 6 deletions
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index a8a27c5e8aeb..bce312a26e7c 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c | |||
@@ -261,16 +261,16 @@ int aq_nic_ndev_register(struct aq_nic_s *self) | |||
261 | ether_addr_copy(self->ndev->dev_addr, mac_addr_permanent); | 261 | ether_addr_copy(self->ndev->dev_addr, mac_addr_permanent); |
262 | } | 262 | } |
263 | #endif | 263 | #endif |
264 | err = register_netdev(self->ndev); | ||
265 | if (err < 0) | ||
266 | goto err_exit; | ||
267 | 264 | ||
268 | self->is_ndev_registered = true; | ||
269 | netif_carrier_off(self->ndev); | 265 | netif_carrier_off(self->ndev); |
270 | 266 | ||
271 | for (i = AQ_CFG_VECS_MAX; i--;) | 267 | for (i = AQ_CFG_VECS_MAX; i--;) |
272 | aq_nic_ndev_queue_stop(self, i); | 268 | aq_nic_ndev_queue_stop(self, i); |
273 | 269 | ||
270 | err = register_netdev(self->ndev); | ||
271 | if (err < 0) | ||
272 | goto err_exit; | ||
273 | |||
274 | err_exit: | 274 | err_exit: |
275 | return err; | 275 | return err; |
276 | } | 276 | } |
@@ -293,7 +293,7 @@ void aq_nic_ndev_free(struct aq_nic_s *self) | |||
293 | if (!self->ndev) | 293 | if (!self->ndev) |
294 | goto err_exit; | 294 | goto err_exit; |
295 | 295 | ||
296 | if (self->is_ndev_registered) | 296 | if (self->ndev->reg_state == NETREG_REGISTERED) |
297 | unregister_netdev(self->ndev); | 297 | unregister_netdev(self->ndev); |
298 | 298 | ||
299 | if (self->aq_hw) | 299 | if (self->aq_hw) |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h index f81738a71c42..e7d2711dc165 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic_internal.h | |||
@@ -22,7 +22,6 @@ struct aq_nic_s { | |||
22 | unsigned int aq_vecs; | 22 | unsigned int aq_vecs; |
23 | unsigned int packet_filter; | 23 | unsigned int packet_filter; |
24 | unsigned int power_state; | 24 | unsigned int power_state; |
25 | bool is_ndev_registered; | ||
26 | u8 port; | 25 | u8 port; |
27 | struct aq_hw_ops aq_hw_ops; | 26 | struct aq_hw_ops aq_hw_ops; |
28 | struct aq_hw_caps_s aq_hw_caps; | 27 | struct aq_hw_caps_s aq_hw_caps; |