|
@@ -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,24 +1592,27 @@ static void handle_irq_beacon(struct b43_wldev *dev)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!beacon0_valid) {
|
|
|
|
- if (!wl->beacon0_uploaded) {
|
|
|
|
- b43_write_beacon_template(dev, 0x68, 0x18);
|
|
|
|
- b43_write_probe_resp_template(dev, 0x268, 0x4A,
|
|
|
|
- &__b43_ratetable[3]);
|
|
|
|
- wl->beacon0_uploaded = 1;
|
|
|
|
- }
|
|
|
|
|
|
+ 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_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) {
|
|
|
|
- if (!wl->beacon1_uploaded) {
|
|
|
|
- b43_write_beacon_template(dev, 0x468, 0x1A);
|
|
|
|
- wl->beacon1_uploaded = 1;
|
|
|
|
|
|
+ } else {
|
|
|
|
+ if (!beacon0_valid) {
|
|
|
|
+ b43_upload_beacon0(dev);
|
|
|
|
+ cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
|
|
|
+ cmd |= B43_MACCMD_BEACON0_VALID;
|
|
|
|
+ b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
|
|
|
+ } else if (!beacon1_valid) {
|
|
|
|
+ b43_upload_beacon1(dev);
|
|
|
|
+ cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
|
|
|
+ cmd |= B43_MACCMD_BEACON1_VALID;
|
|
|
|
+ b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
|
}
|
|
}
|
|
- cmd = b43_read32(dev, B43_MMIO_MACCMD);
|
|
|
|
- cmd |= B43_MACCMD_BEACON1_VALID;
|
|
|
|
- b43_write32(dev, B43_MMIO_MACCMD, cmd);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -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. */
|