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

Commit e81a7bd5 authored by Tomas Vanek's avatar Tomas Vanek Committed by John W. Linville
Browse files

zd1211rw: firmware needs duration_id set to zero for non-pspoll frames

Some devices (iwl5100) cannot connect to zd1211rw based AP. It appears that
zd1211 firmware messes up duration_id field if it is not set to zero by driver.

Sniffing traffic shows that zd1211 is transmitting frames with duration_id bits
14 and 15 set and other bits appearing random. Setting duration_id at driver to
zero results zd1211 outputting sane duration_id. This means that firmware is
setting correct values itself and expects duration_id to be zero in first
place.

Looking at vendor driver shows that only PSPoll frames have duration_id set by
driver, for other frames duration_id left zero.

Original bug-report and attached patch at:
  http://sourceforge.net/mailarchive/message.php?msg_id=28759111



Reported-by: default avatarTomas Vanek <Tomas.Vanek@fbl.cz>
[modified original patch from bug-report, added check for pspoll frame]
Signed-off-by: default avatarJussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2e6b4119
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -866,6 +866,14 @@ static int fill_ctrlset(struct zd_mac *mac,

	ZD_ASSERT(frag_len <= 0xffff);

	/*
	 * Firmware computes the duration itself (for all frames except PSPoll)
	 * and needs the field set to 0 at input, otherwise firmware messes up
	 * duration_id and sets bits 14 and 15 on.
	 */
	if (!ieee80211_is_pspoll(hdr->frame_control))
		hdr->duration_id = 0;

	txrate = ieee80211_get_tx_rate(mac->hw, info);

	cs->modulation = txrate->hw_value;