diff options
| author | Arend Van Spriel <arend.vanspriel@broadcom.com> | 2016-09-19 07:09:55 -0400 |
|---|---|---|
| committer | Kalle Valo <kvalo@codeaurora.org> | 2016-09-26 13:35:54 -0400 |
| commit | 8fa5fdec09cd379c9ecb8972f344f8f308e0ccf3 (patch) | |
| tree | 1ebcf46a022cfb84a92c9d2cd3d3173df08e12e6 | |
| parent | 26305d3d7298d1ddf8fd4ce95a382aa90534f0a3 (diff) | |
brcmfmac: remove worker from .ndo_set_mac_address() callback
As it turns out there is no need to use a worker for the callback
because it is not called from atomic context.
Reported-by: Dan Williams <dcbw@redhat.com>
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
| -rw-r--r-- | drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 39 | ||||
| -rw-r--r-- | drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | 2 |
2 files changed, 13 insertions, 28 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index 65e8c8766441..3f6a58035077 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | |||
| @@ -136,27 +136,6 @@ static void _brcmf_set_multicast_list(struct work_struct *work) | |||
| 136 | err); | 136 | err); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | static void | ||
| 140 | _brcmf_set_mac_address(struct work_struct *work) | ||
| 141 | { | ||
| 142 | struct brcmf_if *ifp; | ||
| 143 | s32 err; | ||
| 144 | |||
| 145 | ifp = container_of(work, struct brcmf_if, setmacaddr_work); | ||
| 146 | |||
| 147 | brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx); | ||
| 148 | |||
| 149 | err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr, | ||
| 150 | ETH_ALEN); | ||
| 151 | if (err < 0) { | ||
| 152 | brcmf_err("Setting cur_etheraddr failed, %d\n", err); | ||
| 153 | } else { | ||
| 154 | brcmf_dbg(TRACE, "MAC address updated to %pM\n", | ||
| 155 | ifp->mac_addr); | ||
| 156 | memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN); | ||
| 157 | } | ||
| 158 | } | ||
| 159 | |||
| 160 | #if IS_ENABLED(CONFIG_IPV6) | 139 | #if IS_ENABLED(CONFIG_IPV6) |
| 161 | static void _brcmf_update_ndtable(struct work_struct *work) | 140 | static void _brcmf_update_ndtable(struct work_struct *work) |
| 162 | { | 141 | { |
| @@ -190,10 +169,20 @@ static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr) | |||
| 190 | { | 169 | { |
| 191 | struct brcmf_if *ifp = netdev_priv(ndev); | 170 | struct brcmf_if *ifp = netdev_priv(ndev); |
| 192 | struct sockaddr *sa = (struct sockaddr *)addr; | 171 | struct sockaddr *sa = (struct sockaddr *)addr; |
| 172 | int err; | ||
| 193 | 173 | ||
| 194 | memcpy(&ifp->mac_addr, sa->sa_data, ETH_ALEN); | 174 | brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx); |
| 195 | schedule_work(&ifp->setmacaddr_work); | 175 | |
| 196 | return 0; | 176 | err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", sa->sa_data, |
| 177 | ETH_ALEN); | ||
| 178 | if (err < 0) { | ||
| 179 | brcmf_err("Setting cur_etheraddr failed, %d\n", err); | ||
| 180 | } else { | ||
| 181 | brcmf_dbg(TRACE, "updated to %pM\n", sa->sa_data); | ||
| 182 | memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN); | ||
| 183 | memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN); | ||
| 184 | } | ||
| 185 | return err; | ||
| 197 | } | 186 | } |
| 198 | 187 | ||
| 199 | static void brcmf_netdev_set_multicast_list(struct net_device *ndev) | 188 | static void brcmf_netdev_set_multicast_list(struct net_device *ndev) |
| @@ -525,7 +514,6 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked) | |||
| 525 | /* set the mac address */ | 514 | /* set the mac address */ |
| 526 | memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN); | 515 | memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN); |
| 527 | 516 | ||
| 528 | INIT_WORK(&ifp->setmacaddr_work, _brcmf_set_mac_address); | ||
| 529 | INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list); | 517 | INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list); |
| 530 | INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable); | 518 | INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable); |
| 531 | 519 | ||
| @@ -730,7 +718,6 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, | |||
| 730 | } | 718 | } |
| 731 | 719 | ||
| 732 | if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { | 720 | if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { |
| 733 | cancel_work_sync(&ifp->setmacaddr_work); | ||
| 734 | cancel_work_sync(&ifp->multicast_work); | 721 | cancel_work_sync(&ifp->multicast_work); |
| 735 | cancel_work_sync(&ifp->ndoffload_work); | 722 | cancel_work_sync(&ifp->ndoffload_work); |
| 736 | } | 723 | } |
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h index 8fa34cad5a96..8a810bb24a11 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | |||
| @@ -176,7 +176,6 @@ enum brcmf_netif_stop_reason { | |||
| 176 | * @vif: points to cfg80211 specific interface information. | 176 | * @vif: points to cfg80211 specific interface information. |
| 177 | * @ndev: associated network device. | 177 | * @ndev: associated network device. |
| 178 | * @stats: interface specific network statistics. | 178 | * @stats: interface specific network statistics. |
| 179 | * @setmacaddr_work: worker object for setting mac address. | ||
| 180 | * @multicast_work: worker object for multicast provisioning. | 179 | * @multicast_work: worker object for multicast provisioning. |
| 181 | * @ndoffload_work: worker object for neighbor discovery offload configuration. | 180 | * @ndoffload_work: worker object for neighbor discovery offload configuration. |
| 182 | * @fws_desc: interface specific firmware-signalling descriptor. | 181 | * @fws_desc: interface specific firmware-signalling descriptor. |
| @@ -193,7 +192,6 @@ struct brcmf_if { | |||
| 193 | struct brcmf_cfg80211_vif *vif; | 192 | struct brcmf_cfg80211_vif *vif; |
| 194 | struct net_device *ndev; | 193 | struct net_device *ndev; |
| 195 | struct net_device_stats stats; | 194 | struct net_device_stats stats; |
| 196 | struct work_struct setmacaddr_work; | ||
| 197 | struct work_struct multicast_work; | 195 | struct work_struct multicast_work; |
| 198 | struct work_struct ndoffload_work; | 196 | struct work_struct ndoffload_work; |
| 199 | struct brcmf_fws_mac_descriptor *fws_desc; | 197 | struct brcmf_fws_mac_descriptor *fws_desc; |
