[PATCH] libertas: access mesh_dev more carefully
authorHolger Schurig <hs4233@mail.mn-solutions.de>
Thu, 2 Aug 2007 15:50:12 +0000 (11:50 -0400)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 10 Oct 2007 23:49:50 +0000 (16:49 -0700)
The CF/SDIO firmware doesn't support Mesh, so priv->mesh_dev is
NULL there. Protect all accesses.

Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/join.c
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/scan.c
drivers/net/wireless/libertas/tx.c

index f9799c3b81c20dcf2bbe3f440f803e141474a6a5..da47c225e10170499a8510255c346f3e81355245 100644 (file)
@@ -739,8 +739,10 @@ int libertas_ret_80211_associate(wlan_private * priv,
        netif_carrier_on(priv->dev);
        netif_wake_queue(priv->dev);
 
-       netif_carrier_on(priv->mesh_dev);
-       netif_wake_queue(priv->mesh_dev);
+       if (priv->mesh_dev) {
+               netif_carrier_on(priv->mesh_dev);
+               netif_wake_queue(priv->mesh_dev);
+       }
 
        lbs_deb_join("ASSOC_RESP: Associated \n");
 
@@ -827,8 +829,10 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
        netif_carrier_on(priv->dev);
        netif_wake_queue(priv->dev);
 
-       netif_carrier_on(priv->mesh_dev);
-       netif_wake_queue(priv->mesh_dev);
+       if (priv->mesh_dev) {
+               netif_carrier_on(priv->mesh_dev);
+               netif_wake_queue(priv->mesh_dev);
+       }
 
        memset(&wrqu, 0, sizeof(wrqu));
        memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
index 170dc2394d252a36b90c66382252bd956b7b0058..b4e2cd19c3bce72981526eb6b2603f1929e4007e 100644 (file)
@@ -298,10 +298,12 @@ static int libertas_dev_open(struct net_device *dev)
 
        if (adapter->connect_status == LIBERTAS_CONNECTED) {
                netif_carrier_on(priv->dev);
-               netif_carrier_on(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_carrier_on(priv->mesh_dev);
        } else {
                netif_carrier_off(priv->dev);
-               netif_carrier_off(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_carrier_off(priv->mesh_dev);
        }
 
        lbs_deb_leave(LBS_DEB_NET);
@@ -408,7 +410,8 @@ static int libertas_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        netif_stop_queue(priv->dev);
-       netif_stop_queue(priv->mesh_dev);
+       if (priv->mesh_dev)
+               netif_stop_queue(priv->mesh_dev);
 
        if (libertas_process_tx(priv, skb) == 0)
                dev->trans_start = jiffies;
@@ -474,7 +477,8 @@ static void libertas_tx_timeout(struct net_device *dev)
                        wake_up_interruptible(&priv->waitq);
        } else if (priv->adapter->connect_status == LIBERTAS_CONNECTED) {
                netif_wake_queue(priv->dev);
-               netif_wake_queue(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_wake_queue(priv->mesh_dev);
        }
 
        lbs_deb_leave(LBS_DEB_TX);
@@ -1254,7 +1258,6 @@ int libertas_add_mesh(wlan_private *priv, struct device *dev)
        ret = 0;
        goto done;
 
-
 err_unregister:
        unregister_netdev(mesh_dev);
 
@@ -1454,7 +1457,8 @@ void libertas_interrupt(struct net_device *dev)
        if (priv->adapter->psstate == PS_STATE_SLEEP) {
                priv->adapter->psstate = PS_STATE_AWAKE;
                netif_wake_queue(dev);
-               netif_wake_queue(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_wake_queue(priv->mesh_dev);
        }
 
        wake_up_interruptible(&priv->waitq);
index 683fa1ba5cacda570c5ca99f5a64dd5921ad80cd..7f045ec2441d7823c67ca2fde9ce745fd3e4e1c8 100644 (file)
@@ -793,8 +793,10 @@ int wlan_scan_networks(wlan_private * priv,
        if (!scancurrentchanonly) {
                netif_stop_queue(priv->dev);
                netif_carrier_off(priv->dev);
-               netif_stop_queue(priv->mesh_dev);
-               netif_carrier_off(priv->mesh_dev);
+               if (priv->mesh_dev) {
+                       netif_stop_queue(priv->mesh_dev);
+                       netif_carrier_off(priv->mesh_dev);
+               }
        }
 
        ret = wlan_scan_channel_list(priv,
@@ -820,8 +822,10 @@ int wlan_scan_networks(wlan_private * priv,
        if (priv->adapter->connect_status == LIBERTAS_CONNECTED) {
                netif_carrier_on(priv->dev);
                netif_wake_queue(priv->dev);
-               netif_carrier_on(priv->mesh_dev);
-               netif_wake_queue(priv->mesh_dev);
+               if (priv->mesh_dev) {
+                       netif_carrier_on(priv->mesh_dev);
+                       netif_wake_queue(priv->mesh_dev);
+               }
        }
 
 out:
index c2271020aafeebd5e7c9ad8edb6a8b580df5ec30..7c383014a274e5a290a46494a6a7d022cc33b495 100644 (file)
@@ -159,7 +159,8 @@ done:
                skb_orphan(skb);
                /* stop processing outgoing pkts */
                netif_stop_queue(priv->dev);
-               netif_stop_queue(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_stop_queue(priv->mesh_dev);
                /* freeze any packets already in our queues */
                priv->adapter->TxLockFlag = 1;
        } else {
@@ -198,10 +199,12 @@ static void wlan_tx_queue(wlan_private *priv, struct sk_buff *skb)
        adapter->tx_queue_ps[adapter->tx_queue_idx++] = skb;
        if (adapter->tx_queue_idx == NR_TX_QUEUE) {
                netif_stop_queue(priv->dev);
-               netif_stop_queue(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_stop_queue(priv->mesh_dev);
        } else {
                netif_start_queue(priv->dev);
-               netif_start_queue(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_start_queue(priv->mesh_dev);
        }
 
        spin_unlock(&adapter->txqueue_lock);
@@ -285,7 +288,8 @@ void libertas_send_tx_feedback(wlan_private * priv)
        priv->adapter->TxLockFlag = 0;
        if (priv->adapter->connect_status == LIBERTAS_CONNECTED) {
                netif_wake_queue(priv->dev);
-               netif_wake_queue(priv->mesh_dev);
+               if (priv->mesh_dev)
+                       netif_wake_queue(priv->mesh_dev);
        }
 }
 EXPORT_SYMBOL_GPL(libertas_send_tx_feedback);