From 9dd8eff3da331b795ab6879a6b3a8b88d5adf658 Mon Sep 17 00:00:00 2001 From: Roland Vossen Date: Tue, 13 Sep 2011 09:49:53 +0200 Subject: [PATCH] staging: brcm80211: separated public from private ioctl functions net_device ioctl handler was called both by the OS as by the driver itself. Split the ioctl handler into two functions to make code paths more clear. Reviewed-by: Arend van Spriel Reviewed-by: Franky Lin Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman --- drivers/staging/brcm80211/brcmfmac/dhd.h | 2 ++ .../staging/brcm80211/brcmfmac/dhd_linux.c | 24 ++++++++++++------- .../staging/brcm80211/brcmfmac/wl_cfg80211.c | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/staging/brcm80211/brcmfmac/dhd.h b/drivers/staging/brcm80211/brcmfmac/dhd.h index 9f84837cb54..93a1bfc85c3 100644 --- a/drivers/staging/brcm80211/brcmfmac/dhd.h +++ b/drivers/staging/brcm80211/brcmfmac/dhd.h @@ -715,6 +715,8 @@ extern struct brcmf_pub *brcmf_attach(struct brcmf_bus *bus, extern int brcmf_net_attach(struct brcmf_pub *drvr, int idx); extern int brcmf_netdev_wait_pend8021x(struct net_device *dev); +extern int brcmf_netdev_ioctl_priv(struct net_device *net, struct ifreq *ifr); + /* Indication from bus module regarding removal/absence of dongle */ extern void brcmf_detach(struct brcmf_pub *drvr); diff --git a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c index cfdd64590d9..4bc231e5e5d 100644 --- a/drivers/staging/brcm80211/brcmfmac/dhd_linux.c +++ b/drivers/staging/brcm80211/brcmfmac/dhd_linux.c @@ -950,13 +950,7 @@ static int brcmf_netdev_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) { struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(net); - struct brcmf_c_ioctl ioc; - int bcmerror = 0; - int buflen = 0; - void *buf = NULL; - uint driver = 0; int ifidx; - bool is_set_key_cmd; ifidx = brcmf_net2idx(drvr_priv, net); brcmf_dbg(TRACE, "ifidx %d, cmd 0x%04x\n", ifidx, cmd); @@ -967,8 +961,22 @@ static int brcmf_netdev_ioctl_entry(struct net_device *net, struct ifreq *ifr, if (cmd == SIOCETHTOOL) return brcmf_ethtool(drvr_priv, ifr->ifr_data); - if (cmd != SIOCDEVPRIVATE) - return -EOPNOTSUPP; + return -EOPNOTSUPP; +} + +/* called only from within this driver, handles cmd == SIOCDEVPRIVATE */ +int brcmf_netdev_ioctl_priv(struct net_device *net, struct ifreq *ifr) +{ + struct brcmf_c_ioctl ioc; + int bcmerror = 0; + int buflen = 0; + void *buf = NULL; + uint driver = 0; + bool is_set_key_cmd; + struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(net); + int ifidx; + + ifidx = brcmf_net2idx(drvr_priv, net); memset(&ioc, 0, sizeof(ioc)); diff --git a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c index 198f0cc1ebe..3fa0c1b8990 100644 --- a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c @@ -286,7 +286,7 @@ brcmf_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len) fs = get_fs(); set_fs(get_ds()); - err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); + err = brcmf_netdev_ioctl_priv(dev, &ifr); set_fs(fs); return err; -- 2.46.0