Browse Source

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 <arend@broadcom.com>
Reviewed-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Roland Vossen <rvossen@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Roland Vossen 14 years ago
parent
commit
9dd8eff3da

+ 2 - 0
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);
 

+ 16 - 8
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));
 

+ 1 - 1
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;