diff options
author | David Woodhouse <dwmw2@infradead.org> | 2007-12-09 16:22:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 15:06:27 -0800 |
commit | d9268fb9a124d067cf93710a85bb6c158d131c97 (patch) | |
tree | 2a7c28fe0f1e78c1445a569042298c4c87f160c5 /drivers/net/wireless/libertas/main.c | |
parent | 198cefb9320ea0aa1be43a93b398435447583081 (diff) |
libertas: stop using ieee80211 for radiotap device
There seems to be no point in doing it as an ieee80211 device instead of
a normal netdev, and when we override its ->priv and then call
free_ieee80211() it has a distressing tendency to crash horribly.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas/main.c')
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 5c8cb0079d4..55dce8dbd0d 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c @@ -1448,7 +1448,7 @@ static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev) { struct lbs_private *priv = dev->priv; - return &priv->ieee->stats; + return &priv->stats; } @@ -1457,42 +1457,36 @@ void lbs_remove_rtap(struct lbs_private *priv) if (priv->rtap_net_dev == NULL) return; unregister_netdev(priv->rtap_net_dev); - free_ieee80211(priv->rtap_net_dev); + free_netdev(priv->rtap_net_dev); priv->rtap_net_dev = NULL; } int lbs_add_rtap(struct lbs_private *priv) { int rc = 0; + struct net_device *rtap_dev; if (priv->rtap_net_dev) return -EPERM; - priv->rtap_net_dev = alloc_ieee80211(0); - if (priv->rtap_net_dev == NULL) + rtap_dev = alloc_netdev(0, "rtap%d", ether_setup); + if (rtap_dev == NULL) return -ENOMEM; + rtap_dev->type = ARPHRD_IEEE80211_RADIOTAP; + rtap_dev->open = lbs_rtap_open; + rtap_dev->stop = lbs_rtap_stop; + rtap_dev->get_stats = lbs_rtap_get_stats; + rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit; + rtap_dev->set_multicast_list = lbs_set_multicast_list; + rtap_dev->priv = priv; - priv->ieee = netdev_priv(priv->rtap_net_dev); - - strcpy(priv->rtap_net_dev->name, "rtap%d"); - - priv->rtap_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; - priv->rtap_net_dev->open = lbs_rtap_open; - priv->rtap_net_dev->stop = lbs_rtap_stop; - priv->rtap_net_dev->get_stats = lbs_rtap_get_stats; - priv->rtap_net_dev->hard_start_xmit = lbs_rtap_hard_start_xmit; - priv->rtap_net_dev->set_multicast_list = lbs_set_multicast_list; - priv->rtap_net_dev->priv = priv; - - priv->ieee->iw_mode = IW_MODE_MONITOR; - - rc = register_netdev(priv->rtap_net_dev); + rc = register_netdev(rtap_dev); if (rc) { - free_ieee80211(priv->rtap_net_dev); - priv->rtap_net_dev = NULL; + free_netdev(rtap_dev); return rc; } + priv->rtap_net_dev = rtap_dev; return 0; } |