Quellcode durchsuchen

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6

David S. Miller vor 16 Jahren
Ursprung
Commit
775d8d9315

+ 90 - 20
drivers/net/wireless/ar9170/usb.c

@@ -623,6 +623,39 @@ static int ar9170_usb_open(struct ar9170 *ar)
 	return 0;
 	return 0;
 }
 }
 
 
+static int ar9170_usb_init_device(struct ar9170_usb *aru)
+{
+	int err;
+
+	err = ar9170_usb_alloc_rx_irq_urb(aru);
+	if (err)
+		goto err_out;
+
+	err = ar9170_usb_alloc_rx_bulk_urbs(aru);
+	if (err)
+		goto err_unrx;
+
+	err = ar9170_usb_upload_firmware(aru);
+	if (err) {
+		err = ar9170_echo_test(&aru->common, 0x60d43110);
+		if (err) {
+			/* force user invention, by disabling the device */
+			err = usb_driver_set_configuration(aru->udev, -1);
+			dev_err(&aru->udev->dev, "device is in a bad state. "
+						 "please reconnect it!\n");
+			goto err_unrx;
+		}
+	}
+
+	return 0;
+
+err_unrx:
+	ar9170_usb_cancel_urbs(aru);
+
+err_out:
+	return err;
+}
+
 static int ar9170_usb_probe(struct usb_interface *intf,
 static int ar9170_usb_probe(struct usb_interface *intf,
 			const struct usb_device_id *id)
 			const struct usb_device_id *id)
 {
 {
@@ -658,32 +691,16 @@ static int ar9170_usb_probe(struct usb_interface *intf,
 
 
 	err = ar9170_usb_reset(aru);
 	err = ar9170_usb_reset(aru);
 	if (err)
 	if (err)
-		goto err_unlock;
+		goto err_freehw;
 
 
 	err = ar9170_usb_request_firmware(aru);
 	err = ar9170_usb_request_firmware(aru);
 	if (err)
 	if (err)
-		goto err_unlock;
+		goto err_freehw;
 
 
-	err = ar9170_usb_alloc_rx_irq_urb(aru);
+	err = ar9170_usb_init_device(aru);
 	if (err)
 	if (err)
 		goto err_freefw;
 		goto err_freefw;
 
 
-	err = ar9170_usb_alloc_rx_bulk_urbs(aru);
-	if (err)
-		goto err_unrx;
-
-	err = ar9170_usb_upload_firmware(aru);
-	if (err) {
-		err = ar9170_echo_test(&aru->common, 0x60d43110);
-		if (err) {
-			/* force user invention, by disabling the device */
-			err = usb_driver_set_configuration(aru->udev, -1);
-			dev_err(&aru->udev->dev, "device is in a bad state. "
-						 "please reconnect it!\n");
-			goto err_unrx;
-		}
-	}
-
 	err = ar9170_usb_open(ar);
 	err = ar9170_usb_open(ar);
 	if (err)
 	if (err)
 		goto err_unrx;
 		goto err_unrx;
@@ -703,7 +720,7 @@ err_freefw:
 	release_firmware(aru->init_values);
 	release_firmware(aru->init_values);
 	release_firmware(aru->firmware);
 	release_firmware(aru->firmware);
 
 
-err_unlock:
+err_freehw:
 	usb_set_intfdata(intf, NULL);
 	usb_set_intfdata(intf, NULL);
 	usb_put_dev(udev);
 	usb_put_dev(udev);
 	ieee80211_free_hw(ar->hw);
 	ieee80211_free_hw(ar->hw);
@@ -730,12 +747,65 @@ static void ar9170_usb_disconnect(struct usb_interface *intf)
 	ieee80211_free_hw(aru->common.hw);
 	ieee80211_free_hw(aru->common.hw);
 }
 }
 
 
+#ifdef CONFIG_PM
+static int ar9170_suspend(struct usb_interface *intf,
+			  pm_message_t  message)
+{
+	struct ar9170_usb *aru = usb_get_intfdata(intf);
+
+	if (!aru)
+		return -ENODEV;
+
+	aru->common.state = AR9170_IDLE;
+	ar9170_usb_cancel_urbs(aru);
+
+	return 0;
+}
+
+static int ar9170_resume(struct usb_interface *intf)
+{
+	struct ar9170_usb *aru = usb_get_intfdata(intf);
+	int err;
+
+	if (!aru)
+		return -ENODEV;
+
+	usb_unpoison_anchored_urbs(&aru->rx_submitted);
+	usb_unpoison_anchored_urbs(&aru->tx_submitted);
+
+	/*
+	 * FIXME: firmware upload will fail on resume.
+	 * but this is better than a hang!
+	 */
+
+	err = ar9170_usb_init_device(aru);
+	if (err)
+		goto err_unrx;
+
+	err = ar9170_usb_open(&aru->common);
+	if (err)
+		goto err_unrx;
+
+	return 0;
+
+err_unrx:
+	aru->common.state = AR9170_IDLE;
+	ar9170_usb_cancel_urbs(aru);
+
+	return err;
+}
+#endif /* CONFIG_PM */
+
 static struct usb_driver ar9170_driver = {
 static struct usb_driver ar9170_driver = {
 	.name = "ar9170usb",
 	.name = "ar9170usb",
 	.probe = ar9170_usb_probe,
 	.probe = ar9170_usb_probe,
 	.disconnect = ar9170_usb_disconnect,
 	.disconnect = ar9170_usb_disconnect,
 	.id_table = ar9170_usb_ids,
 	.id_table = ar9170_usb_ids,
 	.soft_unbind = 1,
 	.soft_unbind = 1,
+#ifdef CONFIG_PM
+	.suspend = ar9170_suspend,
+	.resume = ar9170_resume,
+#endif /* CONFIG_PM */
 };
 };
 
 
 static int __init ar9170_init(void)
 static int __init ar9170_init(void)

+ 1 - 1
drivers/net/wireless/iwlwifi/iwl3945-base.c

@@ -4075,7 +4075,7 @@ static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 	if (!static_key) {
 	if (!static_key) {
 		sta_id = iwl3945_hw_find_station(priv, addr);
 		sta_id = iwl3945_hw_find_station(priv, addr);
 		if (sta_id == IWL_INVALID_STATION) {
 		if (sta_id == IWL_INVALID_STATION) {
-			IWL_DEBUG_MAC80211(priv, "leave - %pMnot in station map.\n",
+			IWL_DEBUG_MAC80211(priv, "leave - %pM not in station map.\n",
 					    addr);
 					    addr);
 			return -EINVAL;
 			return -EINVAL;
 		}
 		}

+ 2 - 2
drivers/net/wireless/mwl8k.c

@@ -3720,12 +3720,12 @@ err_free_reg:
 	return rc;
 	return rc;
 }
 }
 
 
-static void __devexit mwl8k_remove(struct pci_dev *pdev)
+static void __devexit mwl8k_shutdown(struct pci_dev *pdev)
 {
 {
 	printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__);
 	printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__);
 }
 }
 
 
-static void __devexit mwl8k_shutdown(struct pci_dev *pdev)
+static void __devexit mwl8k_remove(struct pci_dev *pdev)
 {
 {
 	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
 	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
 	struct mwl8k_priv *priv;
 	struct mwl8k_priv *priv;

+ 0 - 2
drivers/net/wireless/p54/p54common.c

@@ -2543,8 +2543,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
 	priv->basic_rate_mask = 0x15f;
 	priv->basic_rate_mask = 0x15f;
 	skb_queue_head_init(&priv->tx_queue);
 	skb_queue_head_init(&priv->tx_queue);
 	dev->flags = IEEE80211_HW_RX_INCLUDES_FCS |
 	dev->flags = IEEE80211_HW_RX_INCLUDES_FCS |
-		     IEEE80211_HW_SUPPORTS_PS |
-		     IEEE80211_HW_PS_NULLFUNC_STACK |
 		     IEEE80211_HW_SIGNAL_DBM |
 		     IEEE80211_HW_SIGNAL_DBM |
 		     IEEE80211_HW_NOISE_DBM;
 		     IEEE80211_HW_NOISE_DBM;
 
 

+ 1 - 17
drivers/net/wireless/rt2x00/rt2x00pci.c

@@ -369,8 +369,6 @@ int rt2x00pci_suspend(struct pci_dev *pci_dev, pm_message_t state)
 	if (retval)
 	if (retval)
 		return retval;
 		return retval;
 
 
-	rt2x00pci_free_reg(rt2x00dev);
-
 	pci_save_state(pci_dev);
 	pci_save_state(pci_dev);
 	pci_disable_device(pci_dev);
 	pci_disable_device(pci_dev);
 	return pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
 	return pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
@@ -381,7 +379,6 @@ int rt2x00pci_resume(struct pci_dev *pci_dev)
 {
 {
 	struct ieee80211_hw *hw = pci_get_drvdata(pci_dev);
 	struct ieee80211_hw *hw = pci_get_drvdata(pci_dev);
 	struct rt2x00_dev *rt2x00dev = hw->priv;
 	struct rt2x00_dev *rt2x00dev = hw->priv;
-	int retval;
 
 
 	if (pci_set_power_state(pci_dev, PCI_D0) ||
 	if (pci_set_power_state(pci_dev, PCI_D0) ||
 	    pci_enable_device(pci_dev) ||
 	    pci_enable_device(pci_dev) ||
@@ -390,20 +387,7 @@ int rt2x00pci_resume(struct pci_dev *pci_dev)
 		return -EIO;
 		return -EIO;
 	}
 	}
 
 
-	retval = rt2x00pci_alloc_reg(rt2x00dev);
-	if (retval)
-		return retval;
-
-	retval = rt2x00lib_resume(rt2x00dev);
-	if (retval)
-		goto exit_free_reg;
-
-	return 0;
-
-exit_free_reg:
-	rt2x00pci_free_reg(rt2x00dev);
-
-	return retval;
+	return rt2x00lib_resume(rt2x00dev);
 }
 }
 EXPORT_SYMBOL_GPL(rt2x00pci_resume);
 EXPORT_SYMBOL_GPL(rt2x00pci_resume);
 #endif /* CONFIG_PM */
 #endif /* CONFIG_PM */

+ 1 - 17
drivers/net/wireless/rt2x00/rt2x00usb.c

@@ -702,8 +702,6 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state)
 	if (retval)
 	if (retval)
 		return retval;
 		return retval;
 
 
-	rt2x00usb_free_reg(rt2x00dev);
-
 	/*
 	/*
 	 * Decrease usbdev refcount.
 	 * Decrease usbdev refcount.
 	 */
 	 */
@@ -717,24 +715,10 @@ int rt2x00usb_resume(struct usb_interface *usb_intf)
 {
 {
 	struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);
 	struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);
 	struct rt2x00_dev *rt2x00dev = hw->priv;
 	struct rt2x00_dev *rt2x00dev = hw->priv;
-	int retval;
 
 
 	usb_get_dev(interface_to_usbdev(usb_intf));
 	usb_get_dev(interface_to_usbdev(usb_intf));
 
 
-	retval = rt2x00usb_alloc_reg(rt2x00dev);
-	if (retval)
-		return retval;
-
-	retval = rt2x00lib_resume(rt2x00dev);
-	if (retval)
-		goto exit_free_reg;
-
-	return 0;
-
-exit_free_reg:
-	rt2x00usb_free_reg(rt2x00dev);
-
-	return retval;
+	return rt2x00lib_resume(rt2x00dev);
 }
 }
 EXPORT_SYMBOL_GPL(rt2x00usb_resume);
 EXPORT_SYMBOL_GPL(rt2x00usb_resume);
 #endif /* CONFIG_PM */
 #endif /* CONFIG_PM */

+ 0 - 7
net/mac80211/Kconfig

@@ -202,10 +202,3 @@ config MAC80211_DEBUG_COUNTERS
 	  and show them in debugfs.
 	  and show them in debugfs.
 
 
 	  If unsure, say N.
 	  If unsure, say N.
-
-config MAC80211_VERBOSE_SPECT_MGMT_DEBUG
-	bool "Verbose Spectrum Management (IEEE 802.11h)debugging"
-	depends on MAC80211_DEBUG_MENU
-	---help---
-	  Say Y here to print out verbose Spectrum Management (IEEE 802.11h)
-	  debug messages.

+ 10 - 2
net/mac80211/mlme.c

@@ -1366,7 +1366,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
 
 
 	for (i = 0; i < elems.ext_supp_rates_len; i++) {
 	for (i = 0; i < elems.ext_supp_rates_len; i++) {
 		int rate = (elems.ext_supp_rates[i] & 0x7f) * 5;
 		int rate = (elems.ext_supp_rates[i] & 0x7f) * 5;
-		bool is_basic = !!(elems.supp_rates[i] & 0x80);
+		bool is_basic = !!(elems.ext_supp_rates[i] & 0x80);
 
 
 		if (rate > 110)
 		if (rate > 110)
 			have_higher_than_11mbit = true;
 			have_higher_than_11mbit = true;
@@ -1913,9 +1913,17 @@ static void ieee80211_sta_work(struct work_struct *work)
 
 
 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
 {
 {
-	if (sdata->vif.type == NL80211_IFTYPE_STATION)
+	if (sdata->vif.type == NL80211_IFTYPE_STATION) {
+		/*
+		 * Need to update last_beacon to avoid beacon loss
+		 * test to trigger.
+		 */
+		sdata->u.mgd.last_beacon = jiffies;
+
+
 		queue_work(sdata->local->hw.workqueue,
 		queue_work(sdata->local->hw.workqueue,
 			   &sdata->u.mgd.work);
 			   &sdata->u.mgd.work);
+	}
 }
 }
 
 
 /* interface setup */
 /* interface setup */

+ 2 - 2
net/wireless/nl80211.c

@@ -3334,7 +3334,7 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
 	struct sk_buff *msg;
 	struct sk_buff *msg;
 	void *hdr;
 	void *hdr;
 
 
-	msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
+	msg = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
 	if (!msg)
 	if (!msg)
 		return;
 		return;
 
 
@@ -3353,7 +3353,7 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
 		return;
 		return;
 	}
 	}
 
 
-	genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_KERNEL);
+	genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_ATOMIC);
 	return;
 	return;
 
 
  nla_put_failure:
  nla_put_failure: