Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1beee8dc authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (26 commits)
  llc: Fix double accounting of received packets
  netfilter: nf_conntrack_expect: fix error path unwind in nf_conntrack_expect_init()
  bluetooth: fix locking bug in the rfcomm socket cleanup handling
  mac80211: fix alignment issue with compare_ether_addr()
  mac80211: Fix for NULL pointer dereference in sta_info_get()
  mac80211: fix a typo in ieee80211_handle_filtered_frame comment
  rndis_wlan: add missing range check for power_output modparam
  iwlwifi: fix rate scale TLC column selection bug
  iwlwifi: fix exit from stay_in_table state
  rndis_wlan: Make connections to TKIP PSK networks work
  mac80211 : Fixes the status message for iwconfig
  rt2x00: Use atomic interface iteration in irq context
  rt2x00: Reset antenna RSSI after switch
  rt2x00: Don't count retries as failure
  rt2x00: Fix memleak in tx() path
  mac80211: reorder channel and freq reporting in wext scan report
  b43: Fix controller restart crash
  mac80211: fix ieee80211_rx_bss_put/get imbalance
  net/mac80211: always true conditionals
  b43: Upload both beacon templates on initial load
  ...
parents 9db8ee3d 3446b9d5
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -737,6 +737,7 @@ struct b43_wl {
	struct ieee80211_tx_control beacon_txctl;
	struct ieee80211_tx_control beacon_txctl;
	bool beacon0_uploaded;
	bool beacon0_uploaded;
	bool beacon1_uploaded;
	bool beacon1_uploaded;
	bool beacon_templates_virgin; /* Never wrote the templates? */
	struct work_struct beacon_update_trigger;
	struct work_struct beacon_update_trigger;


	/* The current QOS parameters for the 4 queues.
	/* The current QOS parameters for the 4 queues.
+54 −16
Original line number Original line Diff line number Diff line
@@ -1544,6 +1544,30 @@ static void b43_write_probe_resp_template(struct b43_wldev *dev,
	kfree(probe_resp_data);
	kfree(probe_resp_data);
}
}


static void b43_upload_beacon0(struct b43_wldev *dev)
{
	struct b43_wl *wl = dev->wl;

	if (wl->beacon0_uploaded)
		return;
	b43_write_beacon_template(dev, 0x68, 0x18);
	/* FIXME: Probe resp upload doesn't really belong here,
	 *        but we don't use that feature anyway. */
	b43_write_probe_resp_template(dev, 0x268, 0x4A,
				      &__b43_ratetable[3]);
	wl->beacon0_uploaded = 1;
}

static void b43_upload_beacon1(struct b43_wldev *dev)
{
	struct b43_wl *wl = dev->wl;

	if (wl->beacon1_uploaded)
		return;
	b43_write_beacon_template(dev, 0x468, 0x1A);
	wl->beacon1_uploaded = 1;
}

static void handle_irq_beacon(struct b43_wldev *dev)
static void handle_irq_beacon(struct b43_wldev *dev)
{
{
	struct b43_wl *wl = dev->wl;
	struct b43_wl *wl = dev->wl;
@@ -1568,26 +1592,29 @@ static void handle_irq_beacon(struct b43_wldev *dev)
		return;
		return;
	}
	}


	if (unlikely(wl->beacon_templates_virgin)) {
		/* We never uploaded a beacon before.
		 * Upload both templates now, but only mark one valid. */
		wl->beacon_templates_virgin = 0;
		b43_upload_beacon0(dev);
		b43_upload_beacon1(dev);
		cmd = b43_read32(dev, B43_MMIO_MACCMD);
		cmd |= B43_MACCMD_BEACON0_VALID;
		b43_write32(dev, B43_MMIO_MACCMD, cmd);
	} else {
		if (!beacon0_valid) {
		if (!beacon0_valid) {
		if (!wl->beacon0_uploaded) {
			b43_upload_beacon0(dev);
			b43_write_beacon_template(dev, 0x68, 0x18);
			b43_write_probe_resp_template(dev, 0x268, 0x4A,
						      &__b43_ratetable[3]);
			wl->beacon0_uploaded = 1;
		}
			cmd = b43_read32(dev, B43_MMIO_MACCMD);
			cmd = b43_read32(dev, B43_MMIO_MACCMD);
			cmd |= B43_MACCMD_BEACON0_VALID;
			cmd |= B43_MACCMD_BEACON0_VALID;
			b43_write32(dev, B43_MMIO_MACCMD, cmd);
			b43_write32(dev, B43_MMIO_MACCMD, cmd);
		} else if (!beacon1_valid) {
		} else if (!beacon1_valid) {
		if (!wl->beacon1_uploaded) {
			b43_upload_beacon1(dev);
			b43_write_beacon_template(dev, 0x468, 0x1A);
			wl->beacon1_uploaded = 1;
		}
			cmd = b43_read32(dev, B43_MMIO_MACCMD);
			cmd = b43_read32(dev, B43_MMIO_MACCMD);
			cmd |= B43_MACCMD_BEACON1_VALID;
			cmd |= B43_MACCMD_BEACON1_VALID;
			b43_write32(dev, B43_MMIO_MACCMD, cmd);
			b43_write32(dev, B43_MMIO_MACCMD, cmd);
		}
		}
	}
	}
}


static void b43_beacon_update_trigger_work(struct work_struct *work)
static void b43_beacon_update_trigger_work(struct work_struct *work)
{
{
@@ -4073,6 +4100,9 @@ static int b43_op_start(struct ieee80211_hw *hw)
	wl->filter_flags = 0;
	wl->filter_flags = 0;
	wl->radiotap_enabled = 0;
	wl->radiotap_enabled = 0;
	b43_qos_clear(wl);
	b43_qos_clear(wl);
	wl->beacon0_uploaded = 0;
	wl->beacon1_uploaded = 0;
	wl->beacon_templates_virgin = 1;


	/* First register RFkill.
	/* First register RFkill.
	 * LEDs that are registered later depend on it. */
	 * LEDs that are registered later depend on it. */
@@ -4242,6 +4272,8 @@ static void b43_chip_reset(struct work_struct *work)
		}
		}
	}
	}
out:
out:
	if (err)
		wl->current_dev = NULL; /* Failed to init the dev. */
	mutex_unlock(&wl->mutex);
	mutex_unlock(&wl->mutex);
	if (err)
	if (err)
		b43err(wl, "Controller restart FAILED\n");
		b43err(wl, "Controller restart FAILED\n");
@@ -4382,9 +4414,11 @@ static void b43_one_core_detach(struct ssb_device *dev)
	struct b43_wldev *wldev;
	struct b43_wldev *wldev;
	struct b43_wl *wl;
	struct b43_wl *wl;


	/* Do not cancel ieee80211-workqueue based work here.
	 * See comment in b43_remove(). */

	wldev = ssb_get_drvdata(dev);
	wldev = ssb_get_drvdata(dev);
	wl = wldev->wl;
	wl = wldev->wl;
	cancel_work_sync(&wldev->restart_work);
	b43_debugfs_remove_device(wldev);
	b43_debugfs_remove_device(wldev);
	b43_wireless_core_detach(wldev);
	b43_wireless_core_detach(wldev);
	list_del(&wldev->list);
	list_del(&wldev->list);
@@ -4569,6 +4603,10 @@ static void b43_remove(struct ssb_device *dev)
	struct b43_wl *wl = ssb_get_devtypedata(dev);
	struct b43_wl *wl = ssb_get_devtypedata(dev);
	struct b43_wldev *wldev = ssb_get_drvdata(dev);
	struct b43_wldev *wldev = ssb_get_drvdata(dev);


	/* We must cancel any work here before unregistering from ieee80211,
	 * as the ieee80211 unreg will destroy the workqueue. */
	cancel_work_sync(&wldev->restart_work);

	B43_WARN_ON(!wl);
	B43_WARN_ON(!wl);
	if (wl->current_dev == wldev)
	if (wl->current_dev == wldev)
		ieee80211_unregister_hw(wl->hw);
		ieee80211_unregister_hw(wl->hw);
+1 −2
Original line number Original line Diff line number Diff line
@@ -1162,7 +1162,6 @@ static s32 rs_get_best_rate(struct iwl_priv *priv,


			/* Higher rate not available, use the original */
			/* Higher rate not available, use the original */
			} else {
			} else {
				new_rate = rate;
				break;
				break;
			}
			}
		}
		}
@@ -2009,7 +2008,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
	 * 2)  Not just finishing up a search
	 * 2)  Not just finishing up a search
	 * 3)  Allowing a new search
	 * 3)  Allowing a new search
	 */
	 */
	if (!update_lq && !done_search && !lq_sta->stay_in_tbl) {
	if (!update_lq && !done_search && !lq_sta->stay_in_tbl && window->counter) {
		/* Save current throughput to compare with "search" throughput*/
		/* Save current throughput to compare with "search" throughput*/
		lq_sta->last_tpt = current_tpt;
		lq_sta->last_tpt = current_tpt;


+63 −2
Original line number Original line Diff line number Diff line
@@ -116,6 +116,7 @@ MODULE_PARM_DESC(workaround_interval,
#define OID_802_11_ENCRYPTION_STATUS		ccpu2(0x0d01011b)
#define OID_802_11_ENCRYPTION_STATUS		ccpu2(0x0d01011b)
#define OID_802_11_ADD_KEY			ccpu2(0x0d01011d)
#define OID_802_11_ADD_KEY			ccpu2(0x0d01011d)
#define OID_802_11_REMOVE_KEY			ccpu2(0x0d01011e)
#define OID_802_11_REMOVE_KEY			ccpu2(0x0d01011e)
#define OID_802_11_ASSOCIATION_INFORMATION	ccpu2(0x0d01011f)
#define OID_802_11_PMKID			ccpu2(0x0d010123)
#define OID_802_11_PMKID			ccpu2(0x0d010123)
#define OID_802_11_NETWORK_TYPES_SUPPORTED	ccpu2(0x0d010203)
#define OID_802_11_NETWORK_TYPES_SUPPORTED	ccpu2(0x0d010203)
#define OID_802_11_NETWORK_TYPE_IN_USE		ccpu2(0x0d010204)
#define OID_802_11_NETWORK_TYPE_IN_USE		ccpu2(0x0d010204)
@@ -271,6 +272,26 @@ struct ndis_config_param {
	__le32 value_length;
	__le32 value_length;
} __attribute__((packed));
} __attribute__((packed));


struct ndis_80211_assoc_info {
	__le32 length;
	__le16 req_ies;
	struct req_ie {
		__le16 capa;
		__le16 listen_interval;
		u8 cur_ap_address[6];
	} req_ie;
	__le32 req_ie_length;
	__le32 offset_req_ies;
	__le16 resp_ies;
	struct resp_ie {
		__le16 capa;
		__le16 status_code;
		__le16 assoc_id;
	} resp_ie;
	__le32 resp_ie_length;
	__le32 offset_resp_ies;
} __attribute__((packed));

/* these have to match what is in wpa_supplicant */
/* these have to match what is in wpa_supplicant */
enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP };
enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP };
enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP,
enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP,
@@ -674,6 +695,12 @@ static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN])
	return ret;
	return ret;
}
}


static int get_association_info(struct usbnet *usbdev,
			struct ndis_80211_assoc_info *info, int len)
{
	return rndis_query_oid(usbdev, OID_802_11_ASSOCIATION_INFORMATION,
				info, &len);
}


static int is_associated(struct usbnet *usbdev)
static int is_associated(struct usbnet *usbdev)
{
{
@@ -2182,11 +2209,40 @@ static void rndis_wext_worker(struct work_struct *work)
	struct usbnet *usbdev = priv->usbdev;
	struct usbnet *usbdev = priv->usbdev;
	union iwreq_data evt;
	union iwreq_data evt;
	unsigned char bssid[ETH_ALEN];
	unsigned char bssid[ETH_ALEN];
	int ret;
	struct ndis_80211_assoc_info *info;
	int assoc_size = sizeof(*info) + IW_CUSTOM_MAX + 32;
	int ret, offset;


	if (test_and_clear_bit(WORK_CONNECTION_EVENT, &priv->work_pending)) {
	if (test_and_clear_bit(WORK_CONNECTION_EVENT, &priv->work_pending)) {
		ret = get_bssid(usbdev, bssid);
		info = kzalloc(assoc_size, GFP_KERNEL);
		if (!info)
			goto get_bssid;

		/* Get association info IEs from device and send them back to
		 * userspace. */
		ret = get_association_info(usbdev, info, assoc_size);
		if (!ret) {
			evt.data.length = le32_to_cpu(info->req_ie_length);
			if (evt.data.length > 0) {
				offset = le32_to_cpu(info->offset_req_ies);
				wireless_send_event(usbdev->net,
					IWEVASSOCREQIE, &evt,
					(char *)info + offset);
			}

			evt.data.length = le32_to_cpu(info->resp_ie_length);
			if (evt.data.length > 0) {
				offset = le32_to_cpu(info->offset_resp_ies);
				wireless_send_event(usbdev->net,
					IWEVASSOCRESPIE, &evt,
					(char *)info + offset);
			}
		}

		kfree(info);


get_bssid:
		ret = get_bssid(usbdev, bssid);
		if (!ret) {
		if (!ret) {
			evt.data.flags = 0;
			evt.data.flags = 0;
			evt.data.length = 0;
			evt.data.length = 0;
@@ -2414,6 +2470,11 @@ static int bcm4320_early_init(struct usbnet *dev)
	else if (priv->param_power_save > 2)
	else if (priv->param_power_save > 2)
		priv->param_power_save = 2;
		priv->param_power_save = 2;


	if (priv->param_power_output < 0)
		priv->param_power_output = 0;
	else if (priv->param_power_output > 3)
		priv->param_power_output = 3;

	if (priv->param_roamtrigger < -80)
	if (priv->param_roamtrigger < -80)
		priv->param_roamtrigger = -80;
		priv->param_roamtrigger = -80;
	else if (priv->param_roamtrigger > -60)
	else if (priv->param_roamtrigger > -60)
+5 −0
Original line number Original line Diff line number Diff line
@@ -328,6 +328,11 @@ static inline int rt2x00_get_link_ant_rssi(struct link *link)
	return DEFAULT_RSSI;
	return DEFAULT_RSSI;
}
}


static inline void rt2x00_reset_link_ant_rssi(struct link *link)
{
	link->ant.rssi_ant = 0;
}

static inline int rt2x00_get_link_ant_rssi_history(struct link *link,
static inline int rt2x00_get_link_ant_rssi_history(struct link *link,
						   enum antenna ant)
						   enum antenna ant)
{
{
Loading