提交 775d8d93 编写于 作者: D David S. Miller
...@@ -623,6 +623,39 @@ static int ar9170_usb_open(struct ar9170 *ar) ...@@ -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, ...@@ -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 @@ static int ar9170_usb_probe(struct usb_interface *intf, ...@@ -703,7 +720,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,
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) ...@@ -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)
......
...@@ -4075,7 +4075,7 @@ static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -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;
} }
......
...@@ -3720,12 +3720,12 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev, ...@@ -3720,12 +3720,12 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev,
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;
......
...@@ -2543,8 +2543,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) ...@@ -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;
......
...@@ -369,8 +369,6 @@ int rt2x00pci_suspend(struct pci_dev *pci_dev, pm_message_t state) ...@@ -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) ...@@ -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) ...@@ -390,20 +387,7 @@ int rt2x00pci_resume(struct pci_dev *pci_dev)
return -EIO; return -EIO;
} }
retval = rt2x00pci_alloc_reg(rt2x00dev); return rt2x00lib_resume(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;
} }
EXPORT_SYMBOL_GPL(rt2x00pci_resume); EXPORT_SYMBOL_GPL(rt2x00pci_resume);
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
......
...@@ -702,8 +702,6 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state) ...@@ -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) ...@@ -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); return rt2x00lib_resume(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;
} }
EXPORT_SYMBOL_GPL(rt2x00usb_resume); EXPORT_SYMBOL_GPL(rt2x00usb_resume);
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
......
...@@ -202,10 +202,3 @@ config MAC80211_DEBUG_COUNTERS ...@@ -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.
...@@ -1366,7 +1366,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, ...@@ -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) ...@@ -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 */
......
...@@ -3334,7 +3334,7 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, ...@@ -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, ...@@ -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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册