2 * Linux cfg80211 driver - Dongle Host Driver (DHD) related
4 * $Copyright Open Broadcom Corporation$
6 * $Id: wl_cfg80211.c,v 1.1.4.1.2.14 2011/02/09 01:40:07 Exp $
9 #include <linux/vmalloc.h>
10 #include <net/rtnetlink.h>
13 #include <wldev_common.h>
14 #include <wl_cfg80211.h>
15 #include <dhd_cfg80211.h>
17 #ifdef PKT_FILTER_SUPPORT
18 #include <dngl_stats.h>
22 extern struct bcm_cfg80211 *g_bcm_cfg;
24 #ifdef PKT_FILTER_SUPPORT
25 extern uint dhd_pkt_filter_enable;
26 extern uint dhd_master_mode;
27 extern void dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_mode);
30 static int dhd_dongle_up = FALSE;
32 #include <dngl_stats.h>
36 #include <brcm_nl80211.h>
37 #include <dhd_cfg80211.h>
39 static s32 wl_dongle_up(struct net_device *ndev);
40 static s32 wl_dongle_down(struct net_device *ndev);
43 * Function implementations
46 s32 dhd_cfg80211_init(struct bcm_cfg80211 *cfg)
48 dhd_dongle_up = FALSE;
52 s32 dhd_cfg80211_deinit(struct bcm_cfg80211 *cfg)
54 dhd_dongle_up = FALSE;
58 s32 dhd_cfg80211_down(struct bcm_cfg80211 *cfg)
60 struct net_device *ndev;
65 WL_ERR(("Dongle is already down\n"));
69 ndev = bcmcfg_to_prmry_ndev(cfg);
71 dhd_dongle_up = FALSE;
75 s32 dhd_cfg80211_set_p2p_info(struct bcm_cfg80211 *cfg, int val)
77 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
79 WL_ERR(("Set : op_mode=0x%04x\n", dhd->op_mode));
80 #ifdef ARP_OFFLOAD_SUPPORT
81 if (dhd->arp_version == 1) {
82 /* IF P2P is enabled, disable arpoe */
83 dhd_arp_offload_set(dhd, 0);
84 dhd_arp_offload_enable(dhd, false);
86 #endif /* ARP_OFFLOAD_SUPPORT */
91 s32 dhd_cfg80211_clean_p2p_info(struct bcm_cfg80211 *cfg)
93 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
94 dhd->op_mode &= ~(DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE);
95 WL_ERR(("Clean : op_mode=0x%04x\n", dhd->op_mode));
97 #ifdef ARP_OFFLOAD_SUPPORT
98 if (dhd->arp_version == 1) {
99 /* IF P2P is disabled, enable arpoe back for STA mode. */
100 dhd_arp_offload_set(dhd, dhd_arp_mode);
101 dhd_arp_offload_enable(dhd, true);
103 #endif /* ARP_OFFLOAD_SUPPORT */
108 struct net_device* wl_cfg80211_allocate_if(struct bcm_cfg80211 *cfg, int ifidx, char *name,
109 uint8 *mac, uint8 bssidx)
111 return dhd_allocate_if(cfg->pub, ifidx, name, mac, bssidx, FALSE);
114 int wl_cfg80211_register_if(struct bcm_cfg80211 *cfg, int ifidx, struct net_device* ndev)
116 return dhd_register_if(cfg->pub, ifidx, FALSE);
119 int wl_cfg80211_remove_if(struct bcm_cfg80211 *cfg, int ifidx, struct net_device* ndev)
121 return dhd_remove_if(cfg->pub, ifidx, FALSE);
124 struct net_device * dhd_cfg80211_netdev_free(struct net_device *ndev)
127 if (ndev->ieee80211_ptr) {
128 kfree(ndev->ieee80211_ptr);
129 ndev->ieee80211_ptr = NULL;
138 void dhd_netdev_free(struct net_device *ndev)
141 ndev = dhd_cfg80211_netdev_free(ndev);
148 wl_dongle_up(struct net_device *ndev)
153 err = wldev_ioctl(ndev, WLC_UP, &up, sizeof(up), true);
155 WL_ERR(("WLC_UP error (%d)\n", err));
161 wl_dongle_down(struct net_device *ndev)
166 err = wldev_ioctl(ndev, WLC_DOWN, &down, sizeof(down), true);
168 WL_ERR(("WLC_DOWN error (%d)\n", err));
174 s32 dhd_config_dongle(struct bcm_cfg80211 *cfg)
177 #define DHD_SDALIGN 32
179 struct net_device *ndev;
184 WL_ERR(("Dongle is already up\n"));
188 ndev = bcmcfg_to_prmry_ndev(cfg);
190 err = wl_dongle_up(ndev);
192 WL_ERR(("wl_dongle_up failed\n"));
193 goto default_conf_out;
195 dhd_dongle_up = true;