dect
/
linux-2.6
Archived
13
0
Fork 0

Merge branch 'master' of ssh://infradead/~/public_git/wireless into for-davem

This commit is contained in:
John W. Linville 2011-09-20 09:19:14 -04:00
commit eebb6fb4ae
10 changed files with 98 additions and 59 deletions

View File

@ -72,9 +72,15 @@ static struct usb_device_id btusb_table[] = {
/* Apple MacBookAir3,1, MacBookAir3,2 */ /* Apple MacBookAir3,1, MacBookAir3,2 */
{ USB_DEVICE(0x05ac, 0x821b) }, { USB_DEVICE(0x05ac, 0x821b) },
/* Apple MacBookAir4,1 */
{ USB_DEVICE(0x05ac, 0x821f) },
/* Apple MacBookPro8,2 */ /* Apple MacBookPro8,2 */
{ USB_DEVICE(0x05ac, 0x821a) }, { USB_DEVICE(0x05ac, 0x821a) },
/* Apple MacMini5,1 */
{ USB_DEVICE(0x05ac, 0x8281) },
/* AVM BlueFRITZ! USB v2.0 */ /* AVM BlueFRITZ! USB v2.0 */
{ USB_DEVICE(0x057c, 0x3800) }, { USB_DEVICE(0x057c, 0x3800) },

View File

@ -124,6 +124,13 @@ static long st_receive(void *priv_data, struct sk_buff *skb)
/* ------- Interfaces to HCI layer ------ */ /* ------- Interfaces to HCI layer ------ */
/* protocol structure registered with shared transport */ /* protocol structure registered with shared transport */
static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = { static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = {
{
.chnl_id = HCI_EVENT_PKT, /* HCI Events */
.hdr_len = sizeof(struct hci_event_hdr),
.offset_len_in_hdr = offsetof(struct hci_event_hdr, plen),
.len_size = 1, /* sizeof(plen) in struct hci_event_hdr */
.reserve = 8,
},
{ {
.chnl_id = HCI_ACLDATA_PKT, /* ACL */ .chnl_id = HCI_ACLDATA_PKT, /* ACL */
.hdr_len = sizeof(struct hci_acl_hdr), .hdr_len = sizeof(struct hci_acl_hdr),
@ -138,13 +145,6 @@ static struct st_proto_s ti_st_proto[MAX_BT_CHNL_IDS] = {
.len_size = 1, /* sizeof(dlen) in struct hci_sco_hdr */ .len_size = 1, /* sizeof(dlen) in struct hci_sco_hdr */
.reserve = 8, .reserve = 8,
}, },
{
.chnl_id = HCI_EVENT_PKT, /* HCI Events */
.hdr_len = sizeof(struct hci_event_hdr),
.offset_len_in_hdr = offsetof(struct hci_event_hdr, plen),
.len_size = 1, /* sizeof(plen) in struct hci_event_hdr */
.reserve = 8,
},
}; };
/* Called from HCI core to initialize the device */ /* Called from HCI core to initialize the device */
@ -240,7 +240,7 @@ static int ti_st_close(struct hci_dev *hdev)
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
return 0; return 0;
for (i = 0; i < MAX_BT_CHNL_IDS; i++) { for (i = MAX_BT_CHNL_IDS-1; i >= 0; i--) {
err = st_unregister(&ti_st_proto[i]); err = st_unregister(&ti_st_proto[i]);
if (err) if (err)
BT_ERR("st_unregister(%d) failed with error %d", BT_ERR("st_unregister(%d) failed with error %d",

View File

@ -1632,7 +1632,8 @@ static void handle_irq_beacon(struct b43_wldev *dev)
u32 cmd, beacon0_valid, beacon1_valid; u32 cmd, beacon0_valid, beacon1_valid;
if (!b43_is_mode(wl, NL80211_IFTYPE_AP) && if (!b43_is_mode(wl, NL80211_IFTYPE_AP) &&
!b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT)) !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) &&
!b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
return; return;
/* This is the bottom half of the asynchronous beacon update. */ /* This is the bottom half of the asynchronous beacon update. */

View File

@ -1901,17 +1901,19 @@ static void ipw2100_down(struct ipw2100_priv *priv)
/* Called by register_netdev() */ /* Called by register_netdev() */
static int ipw2100_net_init(struct net_device *dev) static int ipw2100_net_init(struct net_device *dev)
{
struct ipw2100_priv *priv = libipw_priv(dev);
return ipw2100_up(priv, 1);
}
static int ipw2100_wdev_init(struct net_device *dev)
{ {
struct ipw2100_priv *priv = libipw_priv(dev); struct ipw2100_priv *priv = libipw_priv(dev);
const struct libipw_geo *geo = libipw_get_geo(priv->ieee); const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
struct wireless_dev *wdev = &priv->ieee->wdev; struct wireless_dev *wdev = &priv->ieee->wdev;
int ret;
int i; int i;
ret = ipw2100_up(priv, 1);
if (ret)
return ret;
memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
/* fill-out priv->ieee->bg_band */ /* fill-out priv->ieee->bg_band */
@ -6350,9 +6352,13 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
"Error calling register_netdev.\n"); "Error calling register_netdev.\n");
goto fail; goto fail;
} }
registered = 1;
err = ipw2100_wdev_init(dev);
if (err)
goto fail;
mutex_lock(&priv->action_mutex); mutex_lock(&priv->action_mutex);
registered = 1;
IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev)); IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
@ -6389,7 +6395,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
fail_unlock: fail_unlock:
mutex_unlock(&priv->action_mutex); mutex_unlock(&priv->action_mutex);
wiphy_unregister(priv->ieee->wdev.wiphy);
kfree(priv->ieee->bg_band.channels);
fail: fail:
if (dev) { if (dev) {
if (registered) if (registered)

View File

@ -11424,17 +11424,24 @@ static void ipw_bg_down(struct work_struct *work)
/* Called by register_netdev() */ /* Called by register_netdev() */
static int ipw_net_init(struct net_device *dev) static int ipw_net_init(struct net_device *dev)
{
int rc = 0;
struct ipw_priv *priv = libipw_priv(dev);
mutex_lock(&priv->mutex);
if (ipw_up(priv))
rc = -EIO;
mutex_unlock(&priv->mutex);
return rc;
}
static int ipw_wdev_init(struct net_device *dev)
{ {
int i, rc = 0; int i, rc = 0;
struct ipw_priv *priv = libipw_priv(dev); struct ipw_priv *priv = libipw_priv(dev);
const struct libipw_geo *geo = libipw_get_geo(priv->ieee); const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
struct wireless_dev *wdev = &priv->ieee->wdev; struct wireless_dev *wdev = &priv->ieee->wdev;
mutex_lock(&priv->mutex);
if (ipw_up(priv)) {
rc = -EIO;
goto out;
}
memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
@ -11519,13 +11526,9 @@ static int ipw_net_init(struct net_device *dev)
set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);
/* With that information in place, we can now register the wiphy... */ /* With that information in place, we can now register the wiphy... */
if (wiphy_register(wdev->wiphy)) { if (wiphy_register(wdev->wiphy))
rc = -EIO; rc = -EIO;
goto out;
}
out: out:
mutex_unlock(&priv->mutex);
return rc; return rc;
} }
@ -11832,14 +11835,22 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
goto out_remove_sysfs; goto out_remove_sysfs;
} }
err = ipw_wdev_init(net_dev);
if (err) {
IPW_ERROR("failed to register wireless device\n");
goto out_unregister_netdev;
}
#ifdef CONFIG_IPW2200_PROMISCUOUS #ifdef CONFIG_IPW2200_PROMISCUOUS
if (rtap_iface) { if (rtap_iface) {
err = ipw_prom_alloc(priv); err = ipw_prom_alloc(priv);
if (err) { if (err) {
IPW_ERROR("Failed to register promiscuous network " IPW_ERROR("Failed to register promiscuous network "
"device (error %d).\n", err); "device (error %d).\n", err);
unregister_netdev(priv->net_dev); wiphy_unregister(priv->ieee->wdev.wiphy);
goto out_remove_sysfs; kfree(priv->ieee->a_band.channels);
kfree(priv->ieee->bg_band.channels);
goto out_unregister_netdev;
} }
} }
#endif #endif
@ -11851,6 +11862,8 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
return 0; return 0;
out_unregister_netdev:
unregister_netdev(priv->net_dev);
out_remove_sysfs: out_remove_sysfs:
sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
out_release_irq: out_release_irq:

View File

@ -2140,7 +2140,12 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
IEEE80211_HW_SPECTRUM_MGMT | IEEE80211_HW_SPECTRUM_MGMT |
IEEE80211_HW_REPORTS_TX_ACK_STATUS; IEEE80211_HW_REPORTS_TX_ACK_STATUS;
/*
* Including the following line will crash some AP's. This
* workaround removes the stimulus which causes the crash until
* the AP software can be fixed.
hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF; hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
*/
hw->flags |= IEEE80211_HW_SUPPORTS_PS | hw->flags |= IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_SUPPORTS_DYNAMIC_PS; IEEE80211_HW_SUPPORTS_DYNAMIC_PS;

View File

@ -3697,14 +3697,15 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg); rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg);
/* Apparently the data is read from end to start */ /* Apparently the data is read from end to start */
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, &reg);
(u32 *)&rt2x00dev->eeprom[i]); /* The returned value is in CPU order, but eeprom is le */
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, rt2x00dev->eeprom[i] = cpu_to_le32(reg);
(u32 *)&rt2x00dev->eeprom[i + 2]); rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, &reg);
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, *(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
(u32 *)&rt2x00dev->eeprom[i + 4]); rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, &reg);
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, *(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg);
(u32 *)&rt2x00dev->eeprom[i + 6]); rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, &reg);
*(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);
mutex_unlock(&rt2x00dev->csr_mutex); mutex_unlock(&rt2x00dev->csr_mutex);
} }
@ -3870,19 +3871,23 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
return -ENODEV; return -ENODEV;
} }
if (!rt2x00_rf(rt2x00dev, RF2820) && switch (rt2x00dev->chip.rf) {
!rt2x00_rf(rt2x00dev, RF2850) && case RF2820:
!rt2x00_rf(rt2x00dev, RF2720) && case RF2850:
!rt2x00_rf(rt2x00dev, RF2750) && case RF2720:
!rt2x00_rf(rt2x00dev, RF3020) && case RF2750:
!rt2x00_rf(rt2x00dev, RF2020) && case RF3020:
!rt2x00_rf(rt2x00dev, RF3021) && case RF2020:
!rt2x00_rf(rt2x00dev, RF3022) && case RF3021:
!rt2x00_rf(rt2x00dev, RF3052) && case RF3022:
!rt2x00_rf(rt2x00dev, RF3320) && case RF3052:
!rt2x00_rf(rt2x00dev, RF5370) && case RF3320:
!rt2x00_rf(rt2x00dev, RF5390)) { case RF5370:
ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); case RF5390:
break;
default:
ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
rt2x00dev->chip.rf);
return -ENODEV; return -ENODEV;
} }

View File

@ -58,8 +58,8 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
if (status) if (status)
return; return;
if (test_bit(HCI_MGMT, &hdev->flags) && if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) test_bit(HCI_MGMT, &hdev->flags))
mgmt_discovering(hdev->id, 0); mgmt_discovering(hdev->id, 0);
hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status);
@ -76,8 +76,8 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
if (status) if (status)
return; return;
if (test_bit(HCI_MGMT, &hdev->flags) && if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) test_bit(HCI_MGMT, &hdev->flags))
mgmt_discovering(hdev->id, 0); mgmt_discovering(hdev->id, 0);
hci_conn_check_pending(hdev); hci_conn_check_pending(hdev);
@ -959,9 +959,8 @@ static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
return; return;
} }
if (test_bit(HCI_MGMT, &hdev->flags) && if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags) &&
!test_and_set_bit(HCI_INQUIRY, test_bit(HCI_MGMT, &hdev->flags))
&hdev->flags))
mgmt_discovering(hdev->id, 1); mgmt_discovering(hdev->id, 1);
} }
@ -1340,8 +1339,8 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff
BT_DBG("%s status %d", hdev->name, status); BT_DBG("%s status %d", hdev->name, status);
if (test_bit(HCI_MGMT, &hdev->flags) && if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) &&
test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) test_bit(HCI_MGMT, &hdev->flags))
mgmt_discovering(hdev->id, 0); mgmt_discovering(hdev->id, 0);
hci_req_complete(hdev, HCI_OP_INQUIRY, status); hci_req_complete(hdev, HCI_OP_INQUIRY, status);

View File

@ -852,6 +852,7 @@ static void handle_channel(struct wiphy *wiphy,
return; return;
} }
chan->beacon_found = false;
chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags); chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
chan->max_antenna_gain = min(chan->orig_mag, chan->max_antenna_gain = min(chan->orig_mag,
(int) MBI_TO_DBI(power_rule->max_antenna_gain)); (int) MBI_TO_DBI(power_rule->max_antenna_gain));

View File

@ -118,6 +118,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
i++, j++) i++, j++)
request->channels[i] = request->channels[i] =
&wdev->wiphy->bands[band]->channels[j]; &wdev->wiphy->bands[band]->channels[j];
request->rates[band] =
(1 << wdev->wiphy->bands[band]->n_bitrates) - 1;
} }
} }
request->n_channels = n_channels; request->n_channels = n_channels;