1 /* 2 * This file is part of wlcore 3 * 4 * Copyright (C) 2008-2010 Nokia Corporation 5 * Copyright (C) 2011-2013 Texas Instruments Inc. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * version 2 as published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 19 * 02110-1301 USA 20 * 21 */ 22 23 #include <linux/module.h> 24 #include <linux/firmware.h> 25 #include <linux/etherdevice.h> 26 #include <linux/vmalloc.h> 27 #include <linux/interrupt.h> 28 #include <linux/irq.h> 29 #include <linux/pm_runtime.h> 30 #include <linux/pm_wakeirq.h> 31 32 #include "wlcore.h" 33 #include "debug.h" 34 #include "wl12xx_80211.h" 35 #include "io.h" 36 #include "tx.h" 37 #include "ps.h" 38 #include "init.h" 39 #include "debugfs.h" 40 #include "testmode.h" 41 #include "vendor_cmd.h" 42 #include "scan.h" 43 #include "hw_ops.h" 44 #include "sysfs.h" 45 46 #define WL1271_BOOT_RETRIES 3 47 #define WL1271_SUSPEND_SLEEP 100 48 #define WL1271_WAKEUP_TIMEOUT 500 49 50 static char *fwlog_param; 51 static int fwlog_mem_blocks = -1; 52 static int bug_on_recovery = -1; 53 static int no_recovery = -1; 54 55 static void __wl1271_op_remove_interface(struct wl1271 *wl, 56 struct ieee80211_vif *vif, 57 bool reset_tx_queues); 58 static void wlcore_op_stop_locked(struct wl1271 *wl); 59 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif); 60 61 static int wl12xx_set_authorized(struct wl1271 *wl, struct wl12xx_vif *wlvif) 62 { 63 int ret; 64 65 if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS)) 66 return -EINVAL; 67 68 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 69 return 0; 70 71 if (test_and_set_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags)) 72 return 0; 73 74 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wlvif->sta.hlid); 75 if (ret < 0) 76 return ret; 77 78 wl1271_info("Association completed."); 79 return 0; 80 } 81 82 static void wl1271_reg_notify(struct wiphy *wiphy, 83 struct regulatory_request *request) 84 { 85 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); 86 struct wl1271 *wl = hw->priv; 87 88 /* copy the current dfs region */ 89 if (request) 90 wl->dfs_region = request->dfs_region; 91 92 wlcore_regdomain_config(wl); 93 } 94 95 static int wl1271_set_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif, 96 bool enable) 97 { 98 int ret = 0; 99 100 /* we should hold wl->mutex */ 101 ret = wl1271_acx_ps_rx_streaming(wl, wlvif, enable); 102 if (ret < 0) 103 goto out; 104 105 if (enable) 106 set_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags); 107 else 108 clear_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags); 109 out: 110 return ret; 111 } 112 113 /* 114 * this function is being called when the rx_streaming interval 115 * has beed changed or rx_streaming should be disabled 116 */ 117 int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif) 118 { 119 int ret = 0; 120 int period = wl->conf.rx_streaming.interval; 121 122 /* don't reconfigure if rx_streaming is disabled */ 123 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags)) 124 goto out; 125 126 /* reconfigure/disable according to new streaming_period */ 127 if (period && 128 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) && 129 (wl->conf.rx_streaming.always || 130 test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))) 131 ret = wl1271_set_rx_streaming(wl, wlvif, true); 132 else { 133 ret = wl1271_set_rx_streaming(wl, wlvif, false); 134 /* don't cancel_work_sync since we might deadlock */ 135 del_timer_sync(&wlvif->rx_streaming_timer); 136 } 137 out: 138 return ret; 139 } 140 141 static void wl1271_rx_streaming_enable_work(struct work_struct *work) 142 { 143 int ret; 144 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif, 145 rx_streaming_enable_work); 146 struct wl1271 *wl = wlvif->wl; 147 148 mutex_lock(&wl->mutex); 149 150 if (test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags) || 151 !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) || 152 (!wl->conf.rx_streaming.always && 153 !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))) 154 goto out; 155 156 if (!wl->conf.rx_streaming.interval) 157 goto out; 158 159 ret = pm_runtime_get_sync(wl->dev); 160 if (ret < 0) { 161 pm_runtime_put_noidle(wl->dev); 162 goto out; 163 } 164 165 ret = wl1271_set_rx_streaming(wl, wlvif, true); 166 if (ret < 0) 167 goto out_sleep; 168 169 /* stop it after some time of inactivity */ 170 mod_timer(&wlvif->rx_streaming_timer, 171 jiffies + msecs_to_jiffies(wl->conf.rx_streaming.duration)); 172 173 out_sleep: 174 pm_runtime_mark_last_busy(wl->dev); 175 pm_runtime_put_autosuspend(wl->dev); 176 out: 177 mutex_unlock(&wl->mutex); 178 } 179 180 static void wl1271_rx_streaming_disable_work(struct work_struct *work) 181 { 182 int ret; 183 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif, 184 rx_streaming_disable_work); 185 struct wl1271 *wl = wlvif->wl; 186 187 mutex_lock(&wl->mutex); 188 189 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags)) 190 goto out; 191 192 ret = pm_runtime_get_sync(wl->dev); 193 if (ret < 0) { 194 pm_runtime_put_noidle(wl->dev); 195 goto out; 196 } 197 198 ret = wl1271_set_rx_streaming(wl, wlvif, false); 199 if (ret) 200 goto out_sleep; 201 202 out_sleep: 203 pm_runtime_mark_last_busy(wl->dev); 204 pm_runtime_put_autosuspend(wl->dev); 205 out: 206 mutex_unlock(&wl->mutex); 207 } 208 209 static void wl1271_rx_streaming_timer(struct timer_list *t) 210 { 211 struct wl12xx_vif *wlvif = from_timer(wlvif, t, rx_streaming_timer); 212 struct wl1271 *wl = wlvif->wl; 213 ieee80211_queue_work(wl->hw, &wlvif->rx_streaming_disable_work); 214 } 215 216 /* wl->mutex must be taken */ 217 void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl) 218 { 219 /* if the watchdog is not armed, don't do anything */ 220 if (wl->tx_allocated_blocks == 0) 221 return; 222 223 cancel_delayed_work(&wl->tx_watchdog_work); 224 ieee80211_queue_delayed_work(wl->hw, &wl->tx_watchdog_work, 225 msecs_to_jiffies(wl->conf.tx.tx_watchdog_timeout)); 226 } 227 228 static void wlcore_rc_update_work(struct work_struct *work) 229 { 230 int ret; 231 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif, 232 rc_update_work); 233 struct wl1271 *wl = wlvif->wl; 234 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 235 236 mutex_lock(&wl->mutex); 237 238 if (unlikely(wl->state != WLCORE_STATE_ON)) 239 goto out; 240 241 ret = pm_runtime_get_sync(wl->dev); 242 if (ret < 0) { 243 pm_runtime_put_noidle(wl->dev); 244 goto out; 245 } 246 247 if (ieee80211_vif_is_mesh(vif)) { 248 ret = wl1271_acx_set_ht_capabilities(wl, &wlvif->rc_ht_cap, 249 true, wlvif->sta.hlid); 250 if (ret < 0) 251 goto out_sleep; 252 } else { 253 wlcore_hw_sta_rc_update(wl, wlvif); 254 } 255 256 out_sleep: 257 pm_runtime_mark_last_busy(wl->dev); 258 pm_runtime_put_autosuspend(wl->dev); 259 out: 260 mutex_unlock(&wl->mutex); 261 } 262 263 static void wl12xx_tx_watchdog_work(struct work_struct *work) 264 { 265 struct delayed_work *dwork; 266 struct wl1271 *wl; 267 268 dwork = to_delayed_work(work); 269 wl = container_of(dwork, struct wl1271, tx_watchdog_work); 270 271 mutex_lock(&wl->mutex); 272 273 if (unlikely(wl->state != WLCORE_STATE_ON)) 274 goto out; 275 276 /* Tx went out in the meantime - everything is ok */ 277 if (unlikely(wl->tx_allocated_blocks == 0)) 278 goto out; 279 280 /* 281 * if a ROC is in progress, we might not have any Tx for a long 282 * time (e.g. pending Tx on the non-ROC channels) 283 */ 284 if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) { 285 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to ROC", 286 wl->conf.tx.tx_watchdog_timeout); 287 wl12xx_rearm_tx_watchdog_locked(wl); 288 goto out; 289 } 290 291 /* 292 * if a scan is in progress, we might not have any Tx for a long 293 * time 294 */ 295 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) { 296 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to scan", 297 wl->conf.tx.tx_watchdog_timeout); 298 wl12xx_rearm_tx_watchdog_locked(wl); 299 goto out; 300 } 301 302 /* 303 * AP might cache a frame for a long time for a sleeping station, 304 * so rearm the timer if there's an AP interface with stations. If 305 * Tx is genuinely stuck we will most hopefully discover it when all 306 * stations are removed due to inactivity. 307 */ 308 if (wl->active_sta_count) { 309 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms. AP has " 310 " %d stations", 311 wl->conf.tx.tx_watchdog_timeout, 312 wl->active_sta_count); 313 wl12xx_rearm_tx_watchdog_locked(wl); 314 goto out; 315 } 316 317 wl1271_error("Tx stuck (in FW) for %d ms. Starting recovery", 318 wl->conf.tx.tx_watchdog_timeout); 319 wl12xx_queue_recovery_work(wl); 320 321 out: 322 mutex_unlock(&wl->mutex); 323 } 324 325 static void wlcore_adjust_conf(struct wl1271 *wl) 326 { 327 328 if (fwlog_param) { 329 if (!strcmp(fwlog_param, "continuous")) { 330 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS; 331 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_HOST; 332 } else if (!strcmp(fwlog_param, "dbgpins")) { 333 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS; 334 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_DBG_PINS; 335 } else if (!strcmp(fwlog_param, "disable")) { 336 wl->conf.fwlog.mem_blocks = 0; 337 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_NONE; 338 } else { 339 wl1271_error("Unknown fwlog parameter %s", fwlog_param); 340 } 341 } 342 343 if (bug_on_recovery != -1) 344 wl->conf.recovery.bug_on_recovery = (u8) bug_on_recovery; 345 346 if (no_recovery != -1) 347 wl->conf.recovery.no_recovery = (u8) no_recovery; 348 } 349 350 static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl, 351 struct wl12xx_vif *wlvif, 352 u8 hlid, u8 tx_pkts) 353 { 354 bool fw_ps; 355 356 fw_ps = test_bit(hlid, &wl->ap_fw_ps_map); 357 358 /* 359 * Wake up from high level PS if the STA is asleep with too little 360 * packets in FW or if the STA is awake. 361 */ 362 if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS) 363 wl12xx_ps_link_end(wl, wlvif, hlid); 364 365 /* 366 * Start high-level PS if the STA is asleep with enough blocks in FW. 367 * Make an exception if this is the only connected link. In this 368 * case FW-memory congestion is less of a problem. 369 * Note that a single connected STA means 2*ap_count + 1 active links, 370 * since we must account for the global and broadcast AP links 371 * for each AP. The "fw_ps" check assures us the other link is a STA 372 * connected to the AP. Otherwise the FW would not set the PSM bit. 373 */ 374 else if (wl->active_link_count > (wl->ap_count*2 + 1) && fw_ps && 375 tx_pkts >= WL1271_PS_STA_MAX_PACKETS) 376 wl12xx_ps_link_start(wl, wlvif, hlid, true); 377 } 378 379 static void wl12xx_irq_update_links_status(struct wl1271 *wl, 380 struct wl12xx_vif *wlvif, 381 struct wl_fw_status *status) 382 { 383 unsigned long cur_fw_ps_map; 384 u8 hlid; 385 386 cur_fw_ps_map = status->link_ps_bitmap; 387 if (wl->ap_fw_ps_map != cur_fw_ps_map) { 388 wl1271_debug(DEBUG_PSM, 389 "link ps prev 0x%lx cur 0x%lx changed 0x%lx", 390 wl->ap_fw_ps_map, cur_fw_ps_map, 391 wl->ap_fw_ps_map ^ cur_fw_ps_map); 392 393 wl->ap_fw_ps_map = cur_fw_ps_map; 394 } 395 396 for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links) 397 wl12xx_irq_ps_regulate_link(wl, wlvif, hlid, 398 wl->links[hlid].allocated_pkts); 399 } 400 401 static int wlcore_fw_status(struct wl1271 *wl, struct wl_fw_status *status) 402 { 403 struct wl12xx_vif *wlvif; 404 u32 old_tx_blk_count = wl->tx_blocks_available; 405 int avail, freed_blocks; 406 int i; 407 int ret; 408 struct wl1271_link *lnk; 409 410 ret = wlcore_raw_read_data(wl, REG_RAW_FW_STATUS_ADDR, 411 wl->raw_fw_status, 412 wl->fw_status_len, false); 413 if (ret < 0) 414 return ret; 415 416 wlcore_hw_convert_fw_status(wl, wl->raw_fw_status, wl->fw_status); 417 418 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, " 419 "drv_rx_counter = %d, tx_results_counter = %d)", 420 status->intr, 421 status->fw_rx_counter, 422 status->drv_rx_counter, 423 status->tx_results_counter); 424 425 for (i = 0; i < NUM_TX_QUEUES; i++) { 426 /* prevent wrap-around in freed-packets counter */ 427 wl->tx_allocated_pkts[i] -= 428 (status->counters.tx_released_pkts[i] - 429 wl->tx_pkts_freed[i]) & 0xff; 430 431 wl->tx_pkts_freed[i] = status->counters.tx_released_pkts[i]; 432 } 433 434 435 for_each_set_bit(i, wl->links_map, wl->num_links) { 436 u8 diff; 437 lnk = &wl->links[i]; 438 439 /* prevent wrap-around in freed-packets counter */ 440 diff = (status->counters.tx_lnk_free_pkts[i] - 441 lnk->prev_freed_pkts) & 0xff; 442 443 if (diff == 0) 444 continue; 445 446 lnk->allocated_pkts -= diff; 447 lnk->prev_freed_pkts = status->counters.tx_lnk_free_pkts[i]; 448 449 /* accumulate the prev_freed_pkts counter */ 450 lnk->total_freed_pkts += diff; 451 } 452 453 /* prevent wrap-around in total blocks counter */ 454 if (likely(wl->tx_blocks_freed <= status->total_released_blks)) 455 freed_blocks = status->total_released_blks - 456 wl->tx_blocks_freed; 457 else 458 freed_blocks = 0x100000000LL - wl->tx_blocks_freed + 459 status->total_released_blks; 460 461 wl->tx_blocks_freed = status->total_released_blks; 462 463 wl->tx_allocated_blocks -= freed_blocks; 464 465 /* 466 * If the FW freed some blocks: 467 * If we still have allocated blocks - re-arm the timer, Tx is 468 * not stuck. Otherwise, cancel the timer (no Tx currently). 469 */ 470 if (freed_blocks) { 471 if (wl->tx_allocated_blocks) 472 wl12xx_rearm_tx_watchdog_locked(wl); 473 else 474 cancel_delayed_work(&wl->tx_watchdog_work); 475 } 476 477 avail = status->tx_total - wl->tx_allocated_blocks; 478 479 /* 480 * The FW might change the total number of TX memblocks before 481 * we get a notification about blocks being released. Thus, the 482 * available blocks calculation might yield a temporary result 483 * which is lower than the actual available blocks. Keeping in 484 * mind that only blocks that were allocated can be moved from 485 * TX to RX, tx_blocks_available should never decrease here. 486 */ 487 wl->tx_blocks_available = max((int)wl->tx_blocks_available, 488 avail); 489 490 /* if more blocks are available now, tx work can be scheduled */ 491 if (wl->tx_blocks_available > old_tx_blk_count) 492 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags); 493 494 /* for AP update num of allocated TX blocks per link and ps status */ 495 wl12xx_for_each_wlvif_ap(wl, wlvif) { 496 wl12xx_irq_update_links_status(wl, wlvif, status); 497 } 498 499 /* update the host-chipset time offset */ 500 wl->time_offset = (ktime_get_boot_ns() >> 10) - 501 (s64)(status->fw_localtime); 502 503 wl->fw_fast_lnk_map = status->link_fast_bitmap; 504 505 return 0; 506 } 507 508 static void wl1271_flush_deferred_work(struct wl1271 *wl) 509 { 510 struct sk_buff *skb; 511 512 /* Pass all received frames to the network stack */ 513 while ((skb = skb_dequeue(&wl->deferred_rx_queue))) 514 ieee80211_rx_ni(wl->hw, skb); 515 516 /* Return sent skbs to the network stack */ 517 while ((skb = skb_dequeue(&wl->deferred_tx_queue))) 518 ieee80211_tx_status_ni(wl->hw, skb); 519 } 520 521 static void wl1271_netstack_work(struct work_struct *work) 522 { 523 struct wl1271 *wl = 524 container_of(work, struct wl1271, netstack_work); 525 526 do { 527 wl1271_flush_deferred_work(wl); 528 } while (skb_queue_len(&wl->deferred_rx_queue)); 529 } 530 531 #define WL1271_IRQ_MAX_LOOPS 256 532 533 static int wlcore_irq_locked(struct wl1271 *wl) 534 { 535 int ret = 0; 536 u32 intr; 537 int loopcount = WL1271_IRQ_MAX_LOOPS; 538 bool done = false; 539 unsigned int defer_count; 540 unsigned long flags; 541 542 /* 543 * In case edge triggered interrupt must be used, we cannot iterate 544 * more than once without introducing race conditions with the hardirq. 545 */ 546 if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) 547 loopcount = 1; 548 549 wl1271_debug(DEBUG_IRQ, "IRQ work"); 550 551 if (unlikely(wl->state != WLCORE_STATE_ON)) 552 goto out; 553 554 ret = pm_runtime_get_sync(wl->dev); 555 if (ret < 0) { 556 pm_runtime_put_noidle(wl->dev); 557 goto out; 558 } 559 560 while (!done && loopcount--) { 561 /* 562 * In order to avoid a race with the hardirq, clear the flag 563 * before acknowledging the chip. 564 */ 565 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags); 566 smp_mb__after_atomic(); 567 568 ret = wlcore_fw_status(wl, wl->fw_status); 569 if (ret < 0) 570 goto out; 571 572 wlcore_hw_tx_immediate_compl(wl); 573 574 intr = wl->fw_status->intr; 575 intr &= WLCORE_ALL_INTR_MASK; 576 if (!intr) { 577 done = true; 578 continue; 579 } 580 581 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) { 582 wl1271_error("HW watchdog interrupt received! starting recovery."); 583 wl->watchdog_recovery = true; 584 ret = -EIO; 585 586 /* restarting the chip. ignore any other interrupt. */ 587 goto out; 588 } 589 590 if (unlikely(intr & WL1271_ACX_SW_INTR_WATCHDOG)) { 591 wl1271_error("SW watchdog interrupt received! " 592 "starting recovery."); 593 wl->watchdog_recovery = true; 594 ret = -EIO; 595 596 /* restarting the chip. ignore any other interrupt. */ 597 goto out; 598 } 599 600 if (likely(intr & WL1271_ACX_INTR_DATA)) { 601 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA"); 602 603 ret = wlcore_rx(wl, wl->fw_status); 604 if (ret < 0) 605 goto out; 606 607 /* Check if any tx blocks were freed */ 608 spin_lock_irqsave(&wl->wl_lock, flags); 609 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) && 610 wl1271_tx_total_queue_count(wl) > 0) { 611 spin_unlock_irqrestore(&wl->wl_lock, flags); 612 /* 613 * In order to avoid starvation of the TX path, 614 * call the work function directly. 615 */ 616 ret = wlcore_tx_work_locked(wl); 617 if (ret < 0) 618 goto out; 619 } else { 620 spin_unlock_irqrestore(&wl->wl_lock, flags); 621 } 622 623 /* check for tx results */ 624 ret = wlcore_hw_tx_delayed_compl(wl); 625 if (ret < 0) 626 goto out; 627 628 /* Make sure the deferred queues don't get too long */ 629 defer_count = skb_queue_len(&wl->deferred_tx_queue) + 630 skb_queue_len(&wl->deferred_rx_queue); 631 if (defer_count > WL1271_DEFERRED_QUEUE_LIMIT) 632 wl1271_flush_deferred_work(wl); 633 } 634 635 if (intr & WL1271_ACX_INTR_EVENT_A) { 636 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A"); 637 ret = wl1271_event_handle(wl, 0); 638 if (ret < 0) 639 goto out; 640 } 641 642 if (intr & WL1271_ACX_INTR_EVENT_B) { 643 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B"); 644 ret = wl1271_event_handle(wl, 1); 645 if (ret < 0) 646 goto out; 647 } 648 649 if (intr & WL1271_ACX_INTR_INIT_COMPLETE) 650 wl1271_debug(DEBUG_IRQ, 651 "WL1271_ACX_INTR_INIT_COMPLETE"); 652 653 if (intr & WL1271_ACX_INTR_HW_AVAILABLE) 654 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE"); 655 } 656 657 pm_runtime_mark_last_busy(wl->dev); 658 pm_runtime_put_autosuspend(wl->dev); 659 660 out: 661 return ret; 662 } 663 664 static irqreturn_t wlcore_irq(int irq, void *cookie) 665 { 666 int ret; 667 unsigned long flags; 668 struct wl1271 *wl = cookie; 669 670 /* complete the ELP completion */ 671 spin_lock_irqsave(&wl->wl_lock, flags); 672 set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags); 673 if (wl->elp_compl) { 674 complete(wl->elp_compl); 675 wl->elp_compl = NULL; 676 } 677 678 if (test_bit(WL1271_FLAG_SUSPENDED, &wl->flags)) { 679 /* don't enqueue a work right now. mark it as pending */ 680 set_bit(WL1271_FLAG_PENDING_WORK, &wl->flags); 681 wl1271_debug(DEBUG_IRQ, "should not enqueue work"); 682 disable_irq_nosync(wl->irq); 683 pm_wakeup_event(wl->dev, 0); 684 spin_unlock_irqrestore(&wl->wl_lock, flags); 685 return IRQ_HANDLED; 686 } 687 spin_unlock_irqrestore(&wl->wl_lock, flags); 688 689 /* TX might be handled here, avoid redundant work */ 690 set_bit(WL1271_FLAG_TX_PENDING, &wl->flags); 691 cancel_work_sync(&wl->tx_work); 692 693 mutex_lock(&wl->mutex); 694 695 ret = wlcore_irq_locked(wl); 696 if (ret) 697 wl12xx_queue_recovery_work(wl); 698 699 spin_lock_irqsave(&wl->wl_lock, flags); 700 /* In case TX was not handled here, queue TX work */ 701 clear_bit(WL1271_FLAG_TX_PENDING, &wl->flags); 702 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) && 703 wl1271_tx_total_queue_count(wl) > 0) 704 ieee80211_queue_work(wl->hw, &wl->tx_work); 705 spin_unlock_irqrestore(&wl->wl_lock, flags); 706 707 mutex_unlock(&wl->mutex); 708 709 return IRQ_HANDLED; 710 } 711 712 struct vif_counter_data { 713 u8 counter; 714 715 struct ieee80211_vif *cur_vif; 716 bool cur_vif_running; 717 }; 718 719 static void wl12xx_vif_count_iter(void *data, u8 *mac, 720 struct ieee80211_vif *vif) 721 { 722 struct vif_counter_data *counter = data; 723 724 counter->counter++; 725 if (counter->cur_vif == vif) 726 counter->cur_vif_running = true; 727 } 728 729 /* caller must not hold wl->mutex, as it might deadlock */ 730 static void wl12xx_get_vif_count(struct ieee80211_hw *hw, 731 struct ieee80211_vif *cur_vif, 732 struct vif_counter_data *data) 733 { 734 memset(data, 0, sizeof(*data)); 735 data->cur_vif = cur_vif; 736 737 ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL, 738 wl12xx_vif_count_iter, data); 739 } 740 741 static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt) 742 { 743 const struct firmware *fw; 744 const char *fw_name; 745 enum wl12xx_fw_type fw_type; 746 int ret; 747 748 if (plt) { 749 fw_type = WL12XX_FW_TYPE_PLT; 750 fw_name = wl->plt_fw_name; 751 } else { 752 /* 753 * we can't call wl12xx_get_vif_count() here because 754 * wl->mutex is taken, so use the cached last_vif_count value 755 */ 756 if (wl->last_vif_count > 1 && wl->mr_fw_name) { 757 fw_type = WL12XX_FW_TYPE_MULTI; 758 fw_name = wl->mr_fw_name; 759 } else { 760 fw_type = WL12XX_FW_TYPE_NORMAL; 761 fw_name = wl->sr_fw_name; 762 } 763 } 764 765 if (wl->fw_type == fw_type) 766 return 0; 767 768 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name); 769 770 ret = request_firmware(&fw, fw_name, wl->dev); 771 772 if (ret < 0) { 773 wl1271_error("could not get firmware %s: %d", fw_name, ret); 774 return ret; 775 } 776 777 if (fw->size % 4) { 778 wl1271_error("firmware size is not multiple of 32 bits: %zu", 779 fw->size); 780 ret = -EILSEQ; 781 goto out; 782 } 783 784 vfree(wl->fw); 785 wl->fw_type = WL12XX_FW_TYPE_NONE; 786 wl->fw_len = fw->size; 787 wl->fw = vmalloc(wl->fw_len); 788 789 if (!wl->fw) { 790 wl1271_error("could not allocate memory for the firmware"); 791 ret = -ENOMEM; 792 goto out; 793 } 794 795 memcpy(wl->fw, fw->data, wl->fw_len); 796 ret = 0; 797 wl->fw_type = fw_type; 798 out: 799 release_firmware(fw); 800 801 return ret; 802 } 803 804 void wl12xx_queue_recovery_work(struct wl1271 *wl) 805 { 806 /* Avoid a recursive recovery */ 807 if (wl->state == WLCORE_STATE_ON) { 808 WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, 809 &wl->flags)); 810 811 wl->state = WLCORE_STATE_RESTARTING; 812 set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags); 813 ieee80211_queue_work(wl->hw, &wl->recovery_work); 814 } 815 } 816 817 size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen) 818 { 819 size_t len; 820 821 /* Make sure we have enough room */ 822 len = min_t(size_t, maxlen, PAGE_SIZE - wl->fwlog_size); 823 824 /* Fill the FW log file, consumed by the sysfs fwlog entry */ 825 memcpy(wl->fwlog + wl->fwlog_size, memblock, len); 826 wl->fwlog_size += len; 827 828 return len; 829 } 830 831 static void wl12xx_read_fwlog_panic(struct wl1271 *wl) 832 { 833 u32 end_of_log = 0; 834 int error; 835 836 if (wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED) 837 return; 838 839 wl1271_info("Reading FW panic log"); 840 841 /* 842 * Make sure the chip is awake and the logger isn't active. 843 * Do not send a stop fwlog command if the fw is hanged or if 844 * dbgpins are used (due to some fw bug). 845 */ 846 error = pm_runtime_get_sync(wl->dev); 847 if (error < 0) { 848 pm_runtime_put_noidle(wl->dev); 849 return; 850 } 851 if (!wl->watchdog_recovery && 852 wl->conf.fwlog.output != WL12XX_FWLOG_OUTPUT_DBG_PINS) 853 wl12xx_cmd_stop_fwlog(wl); 854 855 /* Traverse the memory blocks linked list */ 856 do { 857 end_of_log = wlcore_event_fw_logger(wl); 858 if (end_of_log == 0) { 859 msleep(100); 860 end_of_log = wlcore_event_fw_logger(wl); 861 } 862 } while (end_of_log != 0); 863 } 864 865 static void wlcore_save_freed_pkts(struct wl1271 *wl, struct wl12xx_vif *wlvif, 866 u8 hlid, struct ieee80211_sta *sta) 867 { 868 struct wl1271_station *wl_sta; 869 u32 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING; 870 871 wl_sta = (void *)sta->drv_priv; 872 wl_sta->total_freed_pkts = wl->links[hlid].total_freed_pkts; 873 874 /* 875 * increment the initial seq number on recovery to account for 876 * transmitted packets that we haven't yet got in the FW status 877 */ 878 if (wlvif->encryption_type == KEY_GEM) 879 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM; 880 881 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) 882 wl_sta->total_freed_pkts += sqn_recovery_padding; 883 } 884 885 static void wlcore_save_freed_pkts_addr(struct wl1271 *wl, 886 struct wl12xx_vif *wlvif, 887 u8 hlid, const u8 *addr) 888 { 889 struct ieee80211_sta *sta; 890 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 891 892 if (WARN_ON(hlid == WL12XX_INVALID_LINK_ID || 893 is_zero_ether_addr(addr))) 894 return; 895 896 rcu_read_lock(); 897 sta = ieee80211_find_sta(vif, addr); 898 if (sta) 899 wlcore_save_freed_pkts(wl, wlvif, hlid, sta); 900 rcu_read_unlock(); 901 } 902 903 static void wlcore_print_recovery(struct wl1271 *wl) 904 { 905 u32 pc = 0; 906 u32 hint_sts = 0; 907 int ret; 908 909 wl1271_info("Hardware recovery in progress. FW ver: %s", 910 wl->chip.fw_ver_str); 911 912 /* change partitions momentarily so we can read the FW pc */ 913 ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]); 914 if (ret < 0) 915 return; 916 917 ret = wlcore_read_reg(wl, REG_PC_ON_RECOVERY, &pc); 918 if (ret < 0) 919 return; 920 921 ret = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR, &hint_sts); 922 if (ret < 0) 923 return; 924 925 wl1271_info("pc: 0x%x, hint_sts: 0x%08x count: %d", 926 pc, hint_sts, ++wl->recovery_count); 927 928 wlcore_set_partition(wl, &wl->ptable[PART_WORK]); 929 } 930 931 932 static void wl1271_recovery_work(struct work_struct *work) 933 { 934 struct wl1271 *wl = 935 container_of(work, struct wl1271, recovery_work); 936 struct wl12xx_vif *wlvif; 937 struct ieee80211_vif *vif; 938 int error; 939 940 mutex_lock(&wl->mutex); 941 942 if (wl->state == WLCORE_STATE_OFF || wl->plt) 943 goto out_unlock; 944 945 error = pm_runtime_get_sync(wl->dev); 946 if (error < 0) { 947 wl1271_warning("Enable for recovery failed"); 948 pm_runtime_put_noidle(wl->dev); 949 } 950 wlcore_disable_interrupts_nosync(wl); 951 952 if (!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)) { 953 if (wl->conf.fwlog.output == WL12XX_FWLOG_OUTPUT_HOST) 954 wl12xx_read_fwlog_panic(wl); 955 wlcore_print_recovery(wl); 956 } 957 958 BUG_ON(wl->conf.recovery.bug_on_recovery && 959 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)); 960 961 clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags); 962 963 if (wl->conf.recovery.no_recovery) { 964 wl1271_info("No recovery (chosen on module load). Fw will remain stuck."); 965 goto out_unlock; 966 } 967 968 /* Prevent spurious TX during FW restart */ 969 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART); 970 971 /* reboot the chipset */ 972 while (!list_empty(&wl->wlvif_list)) { 973 wlvif = list_first_entry(&wl->wlvif_list, 974 struct wl12xx_vif, list); 975 vif = wl12xx_wlvif_to_vif(wlvif); 976 977 if (wlvif->bss_type == BSS_TYPE_STA_BSS && 978 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) { 979 wlcore_save_freed_pkts_addr(wl, wlvif, wlvif->sta.hlid, 980 vif->bss_conf.bssid); 981 } 982 983 __wl1271_op_remove_interface(wl, vif, false); 984 } 985 986 wlcore_op_stop_locked(wl); 987 pm_runtime_mark_last_busy(wl->dev); 988 pm_runtime_put_autosuspend(wl->dev); 989 990 ieee80211_restart_hw(wl->hw); 991 992 /* 993 * Its safe to enable TX now - the queues are stopped after a request 994 * to restart the HW. 995 */ 996 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART); 997 998 out_unlock: 999 wl->watchdog_recovery = false; 1000 clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags); 1001 mutex_unlock(&wl->mutex); 1002 } 1003 1004 static int wlcore_fw_wakeup(struct wl1271 *wl) 1005 { 1006 return wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP); 1007 } 1008 1009 static int wl1271_setup(struct wl1271 *wl) 1010 { 1011 wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL); 1012 if (!wl->raw_fw_status) 1013 goto err; 1014 1015 wl->fw_status = kzalloc(sizeof(*wl->fw_status), GFP_KERNEL); 1016 if (!wl->fw_status) 1017 goto err; 1018 1019 wl->tx_res_if = kzalloc(sizeof(*wl->tx_res_if), GFP_KERNEL); 1020 if (!wl->tx_res_if) 1021 goto err; 1022 1023 return 0; 1024 err: 1025 kfree(wl->fw_status); 1026 kfree(wl->raw_fw_status); 1027 return -ENOMEM; 1028 } 1029 1030 static int wl12xx_set_power_on(struct wl1271 *wl) 1031 { 1032 int ret; 1033 1034 msleep(WL1271_PRE_POWER_ON_SLEEP); 1035 ret = wl1271_power_on(wl); 1036 if (ret < 0) 1037 goto out; 1038 msleep(WL1271_POWER_ON_SLEEP); 1039 wl1271_io_reset(wl); 1040 wl1271_io_init(wl); 1041 1042 ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]); 1043 if (ret < 0) 1044 goto fail; 1045 1046 /* ELP module wake up */ 1047 ret = wlcore_fw_wakeup(wl); 1048 if (ret < 0) 1049 goto fail; 1050 1051 out: 1052 return ret; 1053 1054 fail: 1055 wl1271_power_off(wl); 1056 return ret; 1057 } 1058 1059 static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt) 1060 { 1061 int ret = 0; 1062 1063 ret = wl12xx_set_power_on(wl); 1064 if (ret < 0) 1065 goto out; 1066 1067 /* 1068 * For wl127x based devices we could use the default block 1069 * size (512 bytes), but due to a bug in the sdio driver, we 1070 * need to set it explicitly after the chip is powered on. To 1071 * simplify the code and since the performance impact is 1072 * negligible, we use the same block size for all different 1073 * chip types. 1074 * 1075 * Check if the bus supports blocksize alignment and, if it 1076 * doesn't, make sure we don't have the quirk. 1077 */ 1078 if (!wl1271_set_block_size(wl)) 1079 wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN; 1080 1081 /* TODO: make sure the lower driver has set things up correctly */ 1082 1083 ret = wl1271_setup(wl); 1084 if (ret < 0) 1085 goto out; 1086 1087 ret = wl12xx_fetch_firmware(wl, plt); 1088 if (ret < 0) 1089 goto out; 1090 1091 out: 1092 return ret; 1093 } 1094 1095 int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode) 1096 { 1097 int retries = WL1271_BOOT_RETRIES; 1098 struct wiphy *wiphy = wl->hw->wiphy; 1099 1100 static const char* const PLT_MODE[] = { 1101 "PLT_OFF", 1102 "PLT_ON", 1103 "PLT_FEM_DETECT", 1104 "PLT_CHIP_AWAKE" 1105 }; 1106 1107 int ret; 1108 1109 mutex_lock(&wl->mutex); 1110 1111 wl1271_notice("power up"); 1112 1113 if (wl->state != WLCORE_STATE_OFF) { 1114 wl1271_error("cannot go into PLT state because not " 1115 "in off state: %d", wl->state); 1116 ret = -EBUSY; 1117 goto out; 1118 } 1119 1120 /* Indicate to lower levels that we are now in PLT mode */ 1121 wl->plt = true; 1122 wl->plt_mode = plt_mode; 1123 1124 while (retries) { 1125 retries--; 1126 ret = wl12xx_chip_wakeup(wl, true); 1127 if (ret < 0) 1128 goto power_off; 1129 1130 if (plt_mode != PLT_CHIP_AWAKE) { 1131 ret = wl->ops->plt_init(wl); 1132 if (ret < 0) 1133 goto power_off; 1134 } 1135 1136 wl->state = WLCORE_STATE_ON; 1137 wl1271_notice("firmware booted in PLT mode %s (%s)", 1138 PLT_MODE[plt_mode], 1139 wl->chip.fw_ver_str); 1140 1141 /* update hw/fw version info in wiphy struct */ 1142 wiphy->hw_version = wl->chip.id; 1143 strncpy(wiphy->fw_version, wl->chip.fw_ver_str, 1144 sizeof(wiphy->fw_version)); 1145 1146 goto out; 1147 1148 power_off: 1149 wl1271_power_off(wl); 1150 } 1151 1152 wl->plt = false; 1153 wl->plt_mode = PLT_OFF; 1154 1155 wl1271_error("firmware boot in PLT mode failed despite %d retries", 1156 WL1271_BOOT_RETRIES); 1157 out: 1158 mutex_unlock(&wl->mutex); 1159 1160 return ret; 1161 } 1162 1163 int wl1271_plt_stop(struct wl1271 *wl) 1164 { 1165 int ret = 0; 1166 1167 wl1271_notice("power down"); 1168 1169 /* 1170 * Interrupts must be disabled before setting the state to OFF. 1171 * Otherwise, the interrupt handler might be called and exit without 1172 * reading the interrupt status. 1173 */ 1174 wlcore_disable_interrupts(wl); 1175 mutex_lock(&wl->mutex); 1176 if (!wl->plt) { 1177 mutex_unlock(&wl->mutex); 1178 1179 /* 1180 * This will not necessarily enable interrupts as interrupts 1181 * may have been disabled when op_stop was called. It will, 1182 * however, balance the above call to disable_interrupts(). 1183 */ 1184 wlcore_enable_interrupts(wl); 1185 1186 wl1271_error("cannot power down because not in PLT " 1187 "state: %d", wl->state); 1188 ret = -EBUSY; 1189 goto out; 1190 } 1191 1192 mutex_unlock(&wl->mutex); 1193 1194 wl1271_flush_deferred_work(wl); 1195 cancel_work_sync(&wl->netstack_work); 1196 cancel_work_sync(&wl->recovery_work); 1197 cancel_delayed_work_sync(&wl->tx_watchdog_work); 1198 1199 mutex_lock(&wl->mutex); 1200 wl1271_power_off(wl); 1201 wl->flags = 0; 1202 wl->sleep_auth = WL1271_PSM_ILLEGAL; 1203 wl->state = WLCORE_STATE_OFF; 1204 wl->plt = false; 1205 wl->plt_mode = PLT_OFF; 1206 wl->rx_counter = 0; 1207 mutex_unlock(&wl->mutex); 1208 1209 out: 1210 return ret; 1211 } 1212 1213 static void wl1271_op_tx(struct ieee80211_hw *hw, 1214 struct ieee80211_tx_control *control, 1215 struct sk_buff *skb) 1216 { 1217 struct wl1271 *wl = hw->priv; 1218 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1219 struct ieee80211_vif *vif = info->control.vif; 1220 struct wl12xx_vif *wlvif = NULL; 1221 unsigned long flags; 1222 int q, mapping; 1223 u8 hlid; 1224 1225 if (!vif) { 1226 wl1271_debug(DEBUG_TX, "DROP skb with no vif"); 1227 ieee80211_free_txskb(hw, skb); 1228 return; 1229 } 1230 1231 wlvif = wl12xx_vif_to_data(vif); 1232 mapping = skb_get_queue_mapping(skb); 1233 q = wl1271_tx_get_queue(mapping); 1234 1235 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb, control->sta); 1236 1237 spin_lock_irqsave(&wl->wl_lock, flags); 1238 1239 /* 1240 * drop the packet if the link is invalid or the queue is stopped 1241 * for any reason but watermark. Watermark is a "soft"-stop so we 1242 * allow these packets through. 1243 */ 1244 if (hlid == WL12XX_INVALID_LINK_ID || 1245 (!test_bit(hlid, wlvif->links_map)) || 1246 (wlcore_is_queue_stopped_locked(wl, wlvif, q) && 1247 !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q, 1248 WLCORE_QUEUE_STOP_REASON_WATERMARK))) { 1249 wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q); 1250 ieee80211_free_txskb(hw, skb); 1251 goto out; 1252 } 1253 1254 wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d len %d", 1255 hlid, q, skb->len); 1256 skb_queue_tail(&wl->links[hlid].tx_queue[q], skb); 1257 1258 wl->tx_queue_count[q]++; 1259 wlvif->tx_queue_count[q]++; 1260 1261 /* 1262 * The workqueue is slow to process the tx_queue and we need stop 1263 * the queue here, otherwise the queue will get too long. 1264 */ 1265 if (wlvif->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK && 1266 !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q, 1267 WLCORE_QUEUE_STOP_REASON_WATERMARK)) { 1268 wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q); 1269 wlcore_stop_queue_locked(wl, wlvif, q, 1270 WLCORE_QUEUE_STOP_REASON_WATERMARK); 1271 } 1272 1273 /* 1274 * The chip specific setup must run before the first TX packet - 1275 * before that, the tx_work will not be initialized! 1276 */ 1277 1278 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) && 1279 !test_bit(WL1271_FLAG_TX_PENDING, &wl->flags)) 1280 ieee80211_queue_work(wl->hw, &wl->tx_work); 1281 1282 out: 1283 spin_unlock_irqrestore(&wl->wl_lock, flags); 1284 } 1285 1286 int wl1271_tx_dummy_packet(struct wl1271 *wl) 1287 { 1288 unsigned long flags; 1289 int q; 1290 1291 /* no need to queue a new dummy packet if one is already pending */ 1292 if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) 1293 return 0; 1294 1295 q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet)); 1296 1297 spin_lock_irqsave(&wl->wl_lock, flags); 1298 set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags); 1299 wl->tx_queue_count[q]++; 1300 spin_unlock_irqrestore(&wl->wl_lock, flags); 1301 1302 /* The FW is low on RX memory blocks, so send the dummy packet asap */ 1303 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) 1304 return wlcore_tx_work_locked(wl); 1305 1306 /* 1307 * If the FW TX is busy, TX work will be scheduled by the threaded 1308 * interrupt handler function 1309 */ 1310 return 0; 1311 } 1312 1313 /* 1314 * The size of the dummy packet should be at least 1400 bytes. However, in 1315 * order to minimize the number of bus transactions, aligning it to 512 bytes 1316 * boundaries could be beneficial, performance wise 1317 */ 1318 #define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512)) 1319 1320 static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl) 1321 { 1322 struct sk_buff *skb; 1323 struct ieee80211_hdr_3addr *hdr; 1324 unsigned int dummy_packet_size; 1325 1326 dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE - 1327 sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr); 1328 1329 skb = dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE); 1330 if (!skb) { 1331 wl1271_warning("Failed to allocate a dummy packet skb"); 1332 return NULL; 1333 } 1334 1335 skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr)); 1336 1337 hdr = skb_put_zero(skb, sizeof(*hdr)); 1338 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA | 1339 IEEE80211_STYPE_NULLFUNC | 1340 IEEE80211_FCTL_TODS); 1341 1342 skb_put_zero(skb, dummy_packet_size); 1343 1344 /* Dummy packets require the TID to be management */ 1345 skb->priority = WL1271_TID_MGMT; 1346 1347 /* Initialize all fields that might be used */ 1348 skb_set_queue_mapping(skb, 0); 1349 memset(IEEE80211_SKB_CB(skb), 0, sizeof(struct ieee80211_tx_info)); 1350 1351 return skb; 1352 } 1353 1354 1355 static int 1356 wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p) 1357 { 1358 int num_fields = 0, in_field = 0, fields_size = 0; 1359 int i, pattern_len = 0; 1360 1361 if (!p->mask) { 1362 wl1271_warning("No mask in WoWLAN pattern"); 1363 return -EINVAL; 1364 } 1365 1366 /* 1367 * The pattern is broken up into segments of bytes at different offsets 1368 * that need to be checked by the FW filter. Each segment is called 1369 * a field in the FW API. We verify that the total number of fields 1370 * required for this pattern won't exceed FW limits (8) 1371 * as well as the total fields buffer won't exceed the FW limit. 1372 * Note that if there's a pattern which crosses Ethernet/IP header 1373 * boundary a new field is required. 1374 */ 1375 for (i = 0; i < p->pattern_len; i++) { 1376 if (test_bit(i, (unsigned long *)p->mask)) { 1377 if (!in_field) { 1378 in_field = 1; 1379 pattern_len = 1; 1380 } else { 1381 if (i == WL1271_RX_FILTER_ETH_HEADER_SIZE) { 1382 num_fields++; 1383 fields_size += pattern_len + 1384 RX_FILTER_FIELD_OVERHEAD; 1385 pattern_len = 1; 1386 } else 1387 pattern_len++; 1388 } 1389 } else { 1390 if (in_field) { 1391 in_field = 0; 1392 fields_size += pattern_len + 1393 RX_FILTER_FIELD_OVERHEAD; 1394 num_fields++; 1395 } 1396 } 1397 } 1398 1399 if (in_field) { 1400 fields_size += pattern_len + RX_FILTER_FIELD_OVERHEAD; 1401 num_fields++; 1402 } 1403 1404 if (num_fields > WL1271_RX_FILTER_MAX_FIELDS) { 1405 wl1271_warning("RX Filter too complex. Too many segments"); 1406 return -EINVAL; 1407 } 1408 1409 if (fields_size > WL1271_RX_FILTER_MAX_FIELDS_SIZE) { 1410 wl1271_warning("RX filter pattern is too big"); 1411 return -E2BIG; 1412 } 1413 1414 return 0; 1415 } 1416 1417 struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void) 1418 { 1419 return kzalloc(sizeof(struct wl12xx_rx_filter), GFP_KERNEL); 1420 } 1421 1422 void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter) 1423 { 1424 int i; 1425 1426 if (filter == NULL) 1427 return; 1428 1429 for (i = 0; i < filter->num_fields; i++) 1430 kfree(filter->fields[i].pattern); 1431 1432 kfree(filter); 1433 } 1434 1435 int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter, 1436 u16 offset, u8 flags, 1437 const u8 *pattern, u8 len) 1438 { 1439 struct wl12xx_rx_filter_field *field; 1440 1441 if (filter->num_fields == WL1271_RX_FILTER_MAX_FIELDS) { 1442 wl1271_warning("Max fields per RX filter. can't alloc another"); 1443 return -EINVAL; 1444 } 1445 1446 field = &filter->fields[filter->num_fields]; 1447 1448 field->pattern = kzalloc(len, GFP_KERNEL); 1449 if (!field->pattern) { 1450 wl1271_warning("Failed to allocate RX filter pattern"); 1451 return -ENOMEM; 1452 } 1453 1454 filter->num_fields++; 1455 1456 field->offset = cpu_to_le16(offset); 1457 field->flags = flags; 1458 field->len = len; 1459 memcpy(field->pattern, pattern, len); 1460 1461 return 0; 1462 } 1463 1464 int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter) 1465 { 1466 int i, fields_size = 0; 1467 1468 for (i = 0; i < filter->num_fields; i++) 1469 fields_size += filter->fields[i].len + 1470 sizeof(struct wl12xx_rx_filter_field) - 1471 sizeof(u8 *); 1472 1473 return fields_size; 1474 } 1475 1476 void wl1271_rx_filter_flatten_fields(struct wl12xx_rx_filter *filter, 1477 u8 *buf) 1478 { 1479 int i; 1480 struct wl12xx_rx_filter_field *field; 1481 1482 for (i = 0; i < filter->num_fields; i++) { 1483 field = (struct wl12xx_rx_filter_field *)buf; 1484 1485 field->offset = filter->fields[i].offset; 1486 field->flags = filter->fields[i].flags; 1487 field->len = filter->fields[i].len; 1488 1489 memcpy(&field->pattern, filter->fields[i].pattern, field->len); 1490 buf += sizeof(struct wl12xx_rx_filter_field) - 1491 sizeof(u8 *) + field->len; 1492 } 1493 } 1494 1495 /* 1496 * Allocates an RX filter returned through f 1497 * which needs to be freed using rx_filter_free() 1498 */ 1499 static int 1500 wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p, 1501 struct wl12xx_rx_filter **f) 1502 { 1503 int i, j, ret = 0; 1504 struct wl12xx_rx_filter *filter; 1505 u16 offset; 1506 u8 flags, len; 1507 1508 filter = wl1271_rx_filter_alloc(); 1509 if (!filter) { 1510 wl1271_warning("Failed to alloc rx filter"); 1511 ret = -ENOMEM; 1512 goto err; 1513 } 1514 1515 i = 0; 1516 while (i < p->pattern_len) { 1517 if (!test_bit(i, (unsigned long *)p->mask)) { 1518 i++; 1519 continue; 1520 } 1521 1522 for (j = i; j < p->pattern_len; j++) { 1523 if (!test_bit(j, (unsigned long *)p->mask)) 1524 break; 1525 1526 if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE && 1527 j >= WL1271_RX_FILTER_ETH_HEADER_SIZE) 1528 break; 1529 } 1530 1531 if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE) { 1532 offset = i; 1533 flags = WL1271_RX_FILTER_FLAG_ETHERNET_HEADER; 1534 } else { 1535 offset = i - WL1271_RX_FILTER_ETH_HEADER_SIZE; 1536 flags = WL1271_RX_FILTER_FLAG_IP_HEADER; 1537 } 1538 1539 len = j - i; 1540 1541 ret = wl1271_rx_filter_alloc_field(filter, 1542 offset, 1543 flags, 1544 &p->pattern[i], len); 1545 if (ret) 1546 goto err; 1547 1548 i = j; 1549 } 1550 1551 filter->action = FILTER_SIGNAL; 1552 1553 *f = filter; 1554 return 0; 1555 1556 err: 1557 wl1271_rx_filter_free(filter); 1558 *f = NULL; 1559 1560 return ret; 1561 } 1562 1563 static int wl1271_configure_wowlan(struct wl1271 *wl, 1564 struct cfg80211_wowlan *wow) 1565 { 1566 int i, ret; 1567 1568 if (!wow || wow->any || !wow->n_patterns) { 1569 ret = wl1271_acx_default_rx_filter_enable(wl, 0, 1570 FILTER_SIGNAL); 1571 if (ret) 1572 goto out; 1573 1574 ret = wl1271_rx_filter_clear_all(wl); 1575 if (ret) 1576 goto out; 1577 1578 return 0; 1579 } 1580 1581 if (WARN_ON(wow->n_patterns > WL1271_MAX_RX_FILTERS)) 1582 return -EINVAL; 1583 1584 /* Validate all incoming patterns before clearing current FW state */ 1585 for (i = 0; i < wow->n_patterns; i++) { 1586 ret = wl1271_validate_wowlan_pattern(&wow->patterns[i]); 1587 if (ret) { 1588 wl1271_warning("Bad wowlan pattern %d", i); 1589 return ret; 1590 } 1591 } 1592 1593 ret = wl1271_acx_default_rx_filter_enable(wl, 0, FILTER_SIGNAL); 1594 if (ret) 1595 goto out; 1596 1597 ret = wl1271_rx_filter_clear_all(wl); 1598 if (ret) 1599 goto out; 1600 1601 /* Translate WoWLAN patterns into filters */ 1602 for (i = 0; i < wow->n_patterns; i++) { 1603 struct cfg80211_pkt_pattern *p; 1604 struct wl12xx_rx_filter *filter = NULL; 1605 1606 p = &wow->patterns[i]; 1607 1608 ret = wl1271_convert_wowlan_pattern_to_rx_filter(p, &filter); 1609 if (ret) { 1610 wl1271_warning("Failed to create an RX filter from " 1611 "wowlan pattern %d", i); 1612 goto out; 1613 } 1614 1615 ret = wl1271_rx_filter_enable(wl, i, 1, filter); 1616 1617 wl1271_rx_filter_free(filter); 1618 if (ret) 1619 goto out; 1620 } 1621 1622 ret = wl1271_acx_default_rx_filter_enable(wl, 1, FILTER_DROP); 1623 1624 out: 1625 return ret; 1626 } 1627 1628 static int wl1271_configure_suspend_sta(struct wl1271 *wl, 1629 struct wl12xx_vif *wlvif, 1630 struct cfg80211_wowlan *wow) 1631 { 1632 int ret = 0; 1633 1634 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 1635 goto out; 1636 1637 ret = wl1271_configure_wowlan(wl, wow); 1638 if (ret < 0) 1639 goto out; 1640 1641 if ((wl->conf.conn.suspend_wake_up_event == 1642 wl->conf.conn.wake_up_event) && 1643 (wl->conf.conn.suspend_listen_interval == 1644 wl->conf.conn.listen_interval)) 1645 goto out; 1646 1647 ret = wl1271_acx_wake_up_conditions(wl, wlvif, 1648 wl->conf.conn.suspend_wake_up_event, 1649 wl->conf.conn.suspend_listen_interval); 1650 1651 if (ret < 0) 1652 wl1271_error("suspend: set wake up conditions failed: %d", ret); 1653 out: 1654 return ret; 1655 1656 } 1657 1658 static int wl1271_configure_suspend_ap(struct wl1271 *wl, 1659 struct wl12xx_vif *wlvif, 1660 struct cfg80211_wowlan *wow) 1661 { 1662 int ret = 0; 1663 1664 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) 1665 goto out; 1666 1667 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true); 1668 if (ret < 0) 1669 goto out; 1670 1671 ret = wl1271_configure_wowlan(wl, wow); 1672 if (ret < 0) 1673 goto out; 1674 1675 out: 1676 return ret; 1677 1678 } 1679 1680 static int wl1271_configure_suspend(struct wl1271 *wl, 1681 struct wl12xx_vif *wlvif, 1682 struct cfg80211_wowlan *wow) 1683 { 1684 if (wlvif->bss_type == BSS_TYPE_STA_BSS) 1685 return wl1271_configure_suspend_sta(wl, wlvif, wow); 1686 if (wlvif->bss_type == BSS_TYPE_AP_BSS) 1687 return wl1271_configure_suspend_ap(wl, wlvif, wow); 1688 return 0; 1689 } 1690 1691 static void wl1271_configure_resume(struct wl1271 *wl, struct wl12xx_vif *wlvif) 1692 { 1693 int ret = 0; 1694 bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS; 1695 bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS; 1696 1697 if ((!is_ap) && (!is_sta)) 1698 return; 1699 1700 if ((is_sta && !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) || 1701 (is_ap && !test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))) 1702 return; 1703 1704 wl1271_configure_wowlan(wl, NULL); 1705 1706 if (is_sta) { 1707 if ((wl->conf.conn.suspend_wake_up_event == 1708 wl->conf.conn.wake_up_event) && 1709 (wl->conf.conn.suspend_listen_interval == 1710 wl->conf.conn.listen_interval)) 1711 return; 1712 1713 ret = wl1271_acx_wake_up_conditions(wl, wlvif, 1714 wl->conf.conn.wake_up_event, 1715 wl->conf.conn.listen_interval); 1716 1717 if (ret < 0) 1718 wl1271_error("resume: wake up conditions failed: %d", 1719 ret); 1720 1721 } else if (is_ap) { 1722 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false); 1723 } 1724 } 1725 1726 static int __maybe_unused wl1271_op_suspend(struct ieee80211_hw *hw, 1727 struct cfg80211_wowlan *wow) 1728 { 1729 struct wl1271 *wl = hw->priv; 1730 struct wl12xx_vif *wlvif; 1731 unsigned long flags; 1732 int ret; 1733 1734 wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow); 1735 WARN_ON(!wow); 1736 1737 /* we want to perform the recovery before suspending */ 1738 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) { 1739 wl1271_warning("postponing suspend to perform recovery"); 1740 return -EBUSY; 1741 } 1742 1743 wl1271_tx_flush(wl); 1744 1745 mutex_lock(&wl->mutex); 1746 1747 ret = pm_runtime_get_sync(wl->dev); 1748 if (ret < 0) { 1749 pm_runtime_put_noidle(wl->dev); 1750 mutex_unlock(&wl->mutex); 1751 return ret; 1752 } 1753 1754 wl->wow_enabled = true; 1755 wl12xx_for_each_wlvif(wl, wlvif) { 1756 if (wlcore_is_p2p_mgmt(wlvif)) 1757 continue; 1758 1759 ret = wl1271_configure_suspend(wl, wlvif, wow); 1760 if (ret < 0) { 1761 mutex_unlock(&wl->mutex); 1762 wl1271_warning("couldn't prepare device to suspend"); 1763 return ret; 1764 } 1765 } 1766 1767 /* disable fast link flow control notifications from FW */ 1768 ret = wlcore_hw_interrupt_notify(wl, false); 1769 if (ret < 0) 1770 goto out_sleep; 1771 1772 /* if filtering is enabled, configure the FW to drop all RX BA frames */ 1773 ret = wlcore_hw_rx_ba_filter(wl, 1774 !!wl->conf.conn.suspend_rx_ba_activity); 1775 if (ret < 0) 1776 goto out_sleep; 1777 1778 out_sleep: 1779 pm_runtime_put_noidle(wl->dev); 1780 mutex_unlock(&wl->mutex); 1781 1782 if (ret < 0) { 1783 wl1271_warning("couldn't prepare device to suspend"); 1784 return ret; 1785 } 1786 1787 /* flush any remaining work */ 1788 wl1271_debug(DEBUG_MAC80211, "flushing remaining works"); 1789 1790 flush_work(&wl->tx_work); 1791 1792 /* 1793 * Cancel the watchdog even if above tx_flush failed. We will detect 1794 * it on resume anyway. 1795 */ 1796 cancel_delayed_work(&wl->tx_watchdog_work); 1797 1798 /* 1799 * set suspended flag to avoid triggering a new threaded_irq 1800 * work. 1801 */ 1802 spin_lock_irqsave(&wl->wl_lock, flags); 1803 set_bit(WL1271_FLAG_SUSPENDED, &wl->flags); 1804 spin_unlock_irqrestore(&wl->wl_lock, flags); 1805 1806 return pm_runtime_force_suspend(wl->dev); 1807 } 1808 1809 static int __maybe_unused wl1271_op_resume(struct ieee80211_hw *hw) 1810 { 1811 struct wl1271 *wl = hw->priv; 1812 struct wl12xx_vif *wlvif; 1813 unsigned long flags; 1814 bool run_irq_work = false, pending_recovery; 1815 int ret; 1816 1817 wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d", 1818 wl->wow_enabled); 1819 WARN_ON(!wl->wow_enabled); 1820 1821 ret = pm_runtime_force_resume(wl->dev); 1822 if (ret < 0) { 1823 wl1271_error("ELP wakeup failure!"); 1824 goto out_sleep; 1825 } 1826 1827 /* 1828 * re-enable irq_work enqueuing, and call irq_work directly if 1829 * there is a pending work. 1830 */ 1831 spin_lock_irqsave(&wl->wl_lock, flags); 1832 clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags); 1833 if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags)) 1834 run_irq_work = true; 1835 spin_unlock_irqrestore(&wl->wl_lock, flags); 1836 1837 mutex_lock(&wl->mutex); 1838 1839 /* test the recovery flag before calling any SDIO functions */ 1840 pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, 1841 &wl->flags); 1842 1843 if (run_irq_work) { 1844 wl1271_debug(DEBUG_MAC80211, 1845 "run postponed irq_work directly"); 1846 1847 /* don't talk to the HW if recovery is pending */ 1848 if (!pending_recovery) { 1849 ret = wlcore_irq_locked(wl); 1850 if (ret) 1851 wl12xx_queue_recovery_work(wl); 1852 } 1853 1854 wlcore_enable_interrupts(wl); 1855 } 1856 1857 if (pending_recovery) { 1858 wl1271_warning("queuing forgotten recovery on resume"); 1859 ieee80211_queue_work(wl->hw, &wl->recovery_work); 1860 goto out_sleep; 1861 } 1862 1863 ret = pm_runtime_get_sync(wl->dev); 1864 if (ret < 0) { 1865 pm_runtime_put_noidle(wl->dev); 1866 goto out; 1867 } 1868 1869 wl12xx_for_each_wlvif(wl, wlvif) { 1870 if (wlcore_is_p2p_mgmt(wlvif)) 1871 continue; 1872 1873 wl1271_configure_resume(wl, wlvif); 1874 } 1875 1876 ret = wlcore_hw_interrupt_notify(wl, true); 1877 if (ret < 0) 1878 goto out_sleep; 1879 1880 /* if filtering is enabled, configure the FW to drop all RX BA frames */ 1881 ret = wlcore_hw_rx_ba_filter(wl, false); 1882 if (ret < 0) 1883 goto out_sleep; 1884 1885 out_sleep: 1886 pm_runtime_mark_last_busy(wl->dev); 1887 pm_runtime_put_autosuspend(wl->dev); 1888 1889 out: 1890 wl->wow_enabled = false; 1891 1892 /* 1893 * Set a flag to re-init the watchdog on the first Tx after resume. 1894 * That way we avoid possible conditions where Tx-complete interrupts 1895 * fail to arrive and we perform a spurious recovery. 1896 */ 1897 set_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags); 1898 mutex_unlock(&wl->mutex); 1899 1900 return 0; 1901 } 1902 1903 static int wl1271_op_start(struct ieee80211_hw *hw) 1904 { 1905 wl1271_debug(DEBUG_MAC80211, "mac80211 start"); 1906 1907 /* 1908 * We have to delay the booting of the hardware because 1909 * we need to know the local MAC address before downloading and 1910 * initializing the firmware. The MAC address cannot be changed 1911 * after boot, and without the proper MAC address, the firmware 1912 * will not function properly. 1913 * 1914 * The MAC address is first known when the corresponding interface 1915 * is added. That is where we will initialize the hardware. 1916 */ 1917 1918 return 0; 1919 } 1920 1921 static void wlcore_op_stop_locked(struct wl1271 *wl) 1922 { 1923 int i; 1924 1925 if (wl->state == WLCORE_STATE_OFF) { 1926 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, 1927 &wl->flags)) 1928 wlcore_enable_interrupts(wl); 1929 1930 return; 1931 } 1932 1933 /* 1934 * this must be before the cancel_work calls below, so that the work 1935 * functions don't perform further work. 1936 */ 1937 wl->state = WLCORE_STATE_OFF; 1938 1939 /* 1940 * Use the nosync variant to disable interrupts, so the mutex could be 1941 * held while doing so without deadlocking. 1942 */ 1943 wlcore_disable_interrupts_nosync(wl); 1944 1945 mutex_unlock(&wl->mutex); 1946 1947 wlcore_synchronize_interrupts(wl); 1948 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) 1949 cancel_work_sync(&wl->recovery_work); 1950 wl1271_flush_deferred_work(wl); 1951 cancel_delayed_work_sync(&wl->scan_complete_work); 1952 cancel_work_sync(&wl->netstack_work); 1953 cancel_work_sync(&wl->tx_work); 1954 cancel_delayed_work_sync(&wl->tx_watchdog_work); 1955 1956 /* let's notify MAC80211 about the remaining pending TX frames */ 1957 mutex_lock(&wl->mutex); 1958 wl12xx_tx_reset(wl); 1959 1960 wl1271_power_off(wl); 1961 /* 1962 * In case a recovery was scheduled, interrupts were disabled to avoid 1963 * an interrupt storm. Now that the power is down, it is safe to 1964 * re-enable interrupts to balance the disable depth 1965 */ 1966 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) 1967 wlcore_enable_interrupts(wl); 1968 1969 wl->band = NL80211_BAND_2GHZ; 1970 1971 wl->rx_counter = 0; 1972 wl->power_level = WL1271_DEFAULT_POWER_LEVEL; 1973 wl->channel_type = NL80211_CHAN_NO_HT; 1974 wl->tx_blocks_available = 0; 1975 wl->tx_allocated_blocks = 0; 1976 wl->tx_results_count = 0; 1977 wl->tx_packets_count = 0; 1978 wl->time_offset = 0; 1979 wl->ap_fw_ps_map = 0; 1980 wl->ap_ps_map = 0; 1981 wl->sleep_auth = WL1271_PSM_ILLEGAL; 1982 memset(wl->roles_map, 0, sizeof(wl->roles_map)); 1983 memset(wl->links_map, 0, sizeof(wl->links_map)); 1984 memset(wl->roc_map, 0, sizeof(wl->roc_map)); 1985 memset(wl->session_ids, 0, sizeof(wl->session_ids)); 1986 memset(wl->rx_filter_enabled, 0, sizeof(wl->rx_filter_enabled)); 1987 wl->active_sta_count = 0; 1988 wl->active_link_count = 0; 1989 1990 /* The system link is always allocated */ 1991 wl->links[WL12XX_SYSTEM_HLID].allocated_pkts = 0; 1992 wl->links[WL12XX_SYSTEM_HLID].prev_freed_pkts = 0; 1993 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map); 1994 1995 /* 1996 * this is performed after the cancel_work calls and the associated 1997 * mutex_lock, so that wl1271_op_add_interface does not accidentally 1998 * get executed before all these vars have been reset. 1999 */ 2000 wl->flags = 0; 2001 2002 wl->tx_blocks_freed = 0; 2003 2004 for (i = 0; i < NUM_TX_QUEUES; i++) { 2005 wl->tx_pkts_freed[i] = 0; 2006 wl->tx_allocated_pkts[i] = 0; 2007 } 2008 2009 wl1271_debugfs_reset(wl); 2010 2011 kfree(wl->raw_fw_status); 2012 wl->raw_fw_status = NULL; 2013 kfree(wl->fw_status); 2014 wl->fw_status = NULL; 2015 kfree(wl->tx_res_if); 2016 wl->tx_res_if = NULL; 2017 kfree(wl->target_mem_map); 2018 wl->target_mem_map = NULL; 2019 2020 /* 2021 * FW channels must be re-calibrated after recovery, 2022 * save current Reg-Domain channel configuration and clear it. 2023 */ 2024 memcpy(wl->reg_ch_conf_pending, wl->reg_ch_conf_last, 2025 sizeof(wl->reg_ch_conf_pending)); 2026 memset(wl->reg_ch_conf_last, 0, sizeof(wl->reg_ch_conf_last)); 2027 } 2028 2029 static void wlcore_op_stop(struct ieee80211_hw *hw) 2030 { 2031 struct wl1271 *wl = hw->priv; 2032 2033 wl1271_debug(DEBUG_MAC80211, "mac80211 stop"); 2034 2035 mutex_lock(&wl->mutex); 2036 2037 wlcore_op_stop_locked(wl); 2038 2039 mutex_unlock(&wl->mutex); 2040 } 2041 2042 static void wlcore_channel_switch_work(struct work_struct *work) 2043 { 2044 struct delayed_work *dwork; 2045 struct wl1271 *wl; 2046 struct ieee80211_vif *vif; 2047 struct wl12xx_vif *wlvif; 2048 int ret; 2049 2050 dwork = to_delayed_work(work); 2051 wlvif = container_of(dwork, struct wl12xx_vif, channel_switch_work); 2052 wl = wlvif->wl; 2053 2054 wl1271_info("channel switch failed (role_id: %d).", wlvif->role_id); 2055 2056 mutex_lock(&wl->mutex); 2057 2058 if (unlikely(wl->state != WLCORE_STATE_ON)) 2059 goto out; 2060 2061 /* check the channel switch is still ongoing */ 2062 if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) 2063 goto out; 2064 2065 vif = wl12xx_wlvif_to_vif(wlvif); 2066 ieee80211_chswitch_done(vif, false); 2067 2068 ret = pm_runtime_get_sync(wl->dev); 2069 if (ret < 0) { 2070 pm_runtime_put_noidle(wl->dev); 2071 goto out; 2072 } 2073 2074 wl12xx_cmd_stop_channel_switch(wl, wlvif); 2075 2076 pm_runtime_mark_last_busy(wl->dev); 2077 pm_runtime_put_autosuspend(wl->dev); 2078 out: 2079 mutex_unlock(&wl->mutex); 2080 } 2081 2082 static void wlcore_connection_loss_work(struct work_struct *work) 2083 { 2084 struct delayed_work *dwork; 2085 struct wl1271 *wl; 2086 struct ieee80211_vif *vif; 2087 struct wl12xx_vif *wlvif; 2088 2089 dwork = to_delayed_work(work); 2090 wlvif = container_of(dwork, struct wl12xx_vif, connection_loss_work); 2091 wl = wlvif->wl; 2092 2093 wl1271_info("Connection loss work (role_id: %d).", wlvif->role_id); 2094 2095 mutex_lock(&wl->mutex); 2096 2097 if (unlikely(wl->state != WLCORE_STATE_ON)) 2098 goto out; 2099 2100 /* Call mac80211 connection loss */ 2101 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 2102 goto out; 2103 2104 vif = wl12xx_wlvif_to_vif(wlvif); 2105 ieee80211_connection_loss(vif); 2106 out: 2107 mutex_unlock(&wl->mutex); 2108 } 2109 2110 static void wlcore_pending_auth_complete_work(struct work_struct *work) 2111 { 2112 struct delayed_work *dwork; 2113 struct wl1271 *wl; 2114 struct wl12xx_vif *wlvif; 2115 unsigned long time_spare; 2116 int ret; 2117 2118 dwork = to_delayed_work(work); 2119 wlvif = container_of(dwork, struct wl12xx_vif, 2120 pending_auth_complete_work); 2121 wl = wlvif->wl; 2122 2123 mutex_lock(&wl->mutex); 2124 2125 if (unlikely(wl->state != WLCORE_STATE_ON)) 2126 goto out; 2127 2128 /* 2129 * Make sure a second really passed since the last auth reply. Maybe 2130 * a second auth reply arrived while we were stuck on the mutex. 2131 * Check for a little less than the timeout to protect from scheduler 2132 * irregularities. 2133 */ 2134 time_spare = jiffies + 2135 msecs_to_jiffies(WLCORE_PEND_AUTH_ROC_TIMEOUT - 50); 2136 if (!time_after(time_spare, wlvif->pending_auth_reply_time)) 2137 goto out; 2138 2139 ret = pm_runtime_get_sync(wl->dev); 2140 if (ret < 0) { 2141 pm_runtime_put_noidle(wl->dev); 2142 goto out; 2143 } 2144 2145 /* cancel the ROC if active */ 2146 wlcore_update_inconn_sta(wl, wlvif, NULL, false); 2147 2148 pm_runtime_mark_last_busy(wl->dev); 2149 pm_runtime_put_autosuspend(wl->dev); 2150 out: 2151 mutex_unlock(&wl->mutex); 2152 } 2153 2154 static int wl12xx_allocate_rate_policy(struct wl1271 *wl, u8 *idx) 2155 { 2156 u8 policy = find_first_zero_bit(wl->rate_policies_map, 2157 WL12XX_MAX_RATE_POLICIES); 2158 if (policy >= WL12XX_MAX_RATE_POLICIES) 2159 return -EBUSY; 2160 2161 __set_bit(policy, wl->rate_policies_map); 2162 *idx = policy; 2163 return 0; 2164 } 2165 2166 static void wl12xx_free_rate_policy(struct wl1271 *wl, u8 *idx) 2167 { 2168 if (WARN_ON(*idx >= WL12XX_MAX_RATE_POLICIES)) 2169 return; 2170 2171 __clear_bit(*idx, wl->rate_policies_map); 2172 *idx = WL12XX_MAX_RATE_POLICIES; 2173 } 2174 2175 static int wlcore_allocate_klv_template(struct wl1271 *wl, u8 *idx) 2176 { 2177 u8 policy = find_first_zero_bit(wl->klv_templates_map, 2178 WLCORE_MAX_KLV_TEMPLATES); 2179 if (policy >= WLCORE_MAX_KLV_TEMPLATES) 2180 return -EBUSY; 2181 2182 __set_bit(policy, wl->klv_templates_map); 2183 *idx = policy; 2184 return 0; 2185 } 2186 2187 static void wlcore_free_klv_template(struct wl1271 *wl, u8 *idx) 2188 { 2189 if (WARN_ON(*idx >= WLCORE_MAX_KLV_TEMPLATES)) 2190 return; 2191 2192 __clear_bit(*idx, wl->klv_templates_map); 2193 *idx = WLCORE_MAX_KLV_TEMPLATES; 2194 } 2195 2196 static u8 wl12xx_get_role_type(struct wl1271 *wl, struct wl12xx_vif *wlvif) 2197 { 2198 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 2199 2200 switch (wlvif->bss_type) { 2201 case BSS_TYPE_AP_BSS: 2202 if (wlvif->p2p) 2203 return WL1271_ROLE_P2P_GO; 2204 else if (ieee80211_vif_is_mesh(vif)) 2205 return WL1271_ROLE_MESH_POINT; 2206 else 2207 return WL1271_ROLE_AP; 2208 2209 case BSS_TYPE_STA_BSS: 2210 if (wlvif->p2p) 2211 return WL1271_ROLE_P2P_CL; 2212 else 2213 return WL1271_ROLE_STA; 2214 2215 case BSS_TYPE_IBSS: 2216 return WL1271_ROLE_IBSS; 2217 2218 default: 2219 wl1271_error("invalid bss_type: %d", wlvif->bss_type); 2220 } 2221 return WL12XX_INVALID_ROLE_TYPE; 2222 } 2223 2224 static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif) 2225 { 2226 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 2227 int i; 2228 2229 /* clear everything but the persistent data */ 2230 memset(wlvif, 0, offsetof(struct wl12xx_vif, persistent)); 2231 2232 switch (ieee80211_vif_type_p2p(vif)) { 2233 case NL80211_IFTYPE_P2P_CLIENT: 2234 wlvif->p2p = 1; 2235 /* fall-through */ 2236 case NL80211_IFTYPE_STATION: 2237 case NL80211_IFTYPE_P2P_DEVICE: 2238 wlvif->bss_type = BSS_TYPE_STA_BSS; 2239 break; 2240 case NL80211_IFTYPE_ADHOC: 2241 wlvif->bss_type = BSS_TYPE_IBSS; 2242 break; 2243 case NL80211_IFTYPE_P2P_GO: 2244 wlvif->p2p = 1; 2245 /* fall-through */ 2246 case NL80211_IFTYPE_AP: 2247 case NL80211_IFTYPE_MESH_POINT: 2248 wlvif->bss_type = BSS_TYPE_AP_BSS; 2249 break; 2250 default: 2251 wlvif->bss_type = MAX_BSS_TYPE; 2252 return -EOPNOTSUPP; 2253 } 2254 2255 wlvif->role_id = WL12XX_INVALID_ROLE_ID; 2256 wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID; 2257 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID; 2258 2259 if (wlvif->bss_type == BSS_TYPE_STA_BSS || 2260 wlvif->bss_type == BSS_TYPE_IBSS) { 2261 /* init sta/ibss data */ 2262 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID; 2263 wl12xx_allocate_rate_policy(wl, &wlvif->sta.basic_rate_idx); 2264 wl12xx_allocate_rate_policy(wl, &wlvif->sta.ap_rate_idx); 2265 wl12xx_allocate_rate_policy(wl, &wlvif->sta.p2p_rate_idx); 2266 wlcore_allocate_klv_template(wl, &wlvif->sta.klv_template_id); 2267 wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC; 2268 wlvif->basic_rate = CONF_TX_RATE_MASK_BASIC; 2269 wlvif->rate_set = CONF_TX_RATE_MASK_BASIC; 2270 } else { 2271 /* init ap data */ 2272 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID; 2273 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID; 2274 wl12xx_allocate_rate_policy(wl, &wlvif->ap.mgmt_rate_idx); 2275 wl12xx_allocate_rate_policy(wl, &wlvif->ap.bcast_rate_idx); 2276 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++) 2277 wl12xx_allocate_rate_policy(wl, 2278 &wlvif->ap.ucast_rate_idx[i]); 2279 wlvif->basic_rate_set = CONF_TX_ENABLED_RATES; 2280 /* 2281 * TODO: check if basic_rate shouldn't be 2282 * wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); 2283 * instead (the same thing for STA above). 2284 */ 2285 wlvif->basic_rate = CONF_TX_ENABLED_RATES; 2286 /* TODO: this seems to be used only for STA, check it */ 2287 wlvif->rate_set = CONF_TX_ENABLED_RATES; 2288 } 2289 2290 wlvif->bitrate_masks[NL80211_BAND_2GHZ] = wl->conf.tx.basic_rate; 2291 wlvif->bitrate_masks[NL80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5; 2292 wlvif->beacon_int = WL1271_DEFAULT_BEACON_INT; 2293 2294 /* 2295 * mac80211 configures some values globally, while we treat them 2296 * per-interface. thus, on init, we have to copy them from wl 2297 */ 2298 wlvif->band = wl->band; 2299 wlvif->channel = wl->channel; 2300 wlvif->power_level = wl->power_level; 2301 wlvif->channel_type = wl->channel_type; 2302 2303 INIT_WORK(&wlvif->rx_streaming_enable_work, 2304 wl1271_rx_streaming_enable_work); 2305 INIT_WORK(&wlvif->rx_streaming_disable_work, 2306 wl1271_rx_streaming_disable_work); 2307 INIT_WORK(&wlvif->rc_update_work, wlcore_rc_update_work); 2308 INIT_DELAYED_WORK(&wlvif->channel_switch_work, 2309 wlcore_channel_switch_work); 2310 INIT_DELAYED_WORK(&wlvif->connection_loss_work, 2311 wlcore_connection_loss_work); 2312 INIT_DELAYED_WORK(&wlvif->pending_auth_complete_work, 2313 wlcore_pending_auth_complete_work); 2314 INIT_LIST_HEAD(&wlvif->list); 2315 2316 timer_setup(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer, 0); 2317 return 0; 2318 } 2319 2320 static int wl12xx_init_fw(struct wl1271 *wl) 2321 { 2322 int retries = WL1271_BOOT_RETRIES; 2323 bool booted = false; 2324 struct wiphy *wiphy = wl->hw->wiphy; 2325 int ret; 2326 2327 while (retries) { 2328 retries--; 2329 ret = wl12xx_chip_wakeup(wl, false); 2330 if (ret < 0) 2331 goto power_off; 2332 2333 ret = wl->ops->boot(wl); 2334 if (ret < 0) 2335 goto power_off; 2336 2337 ret = wl1271_hw_init(wl); 2338 if (ret < 0) 2339 goto irq_disable; 2340 2341 booted = true; 2342 break; 2343 2344 irq_disable: 2345 mutex_unlock(&wl->mutex); 2346 /* Unlocking the mutex in the middle of handling is 2347 inherently unsafe. In this case we deem it safe to do, 2348 because we need to let any possibly pending IRQ out of 2349 the system (and while we are WLCORE_STATE_OFF the IRQ 2350 work function will not do anything.) Also, any other 2351 possible concurrent operations will fail due to the 2352 current state, hence the wl1271 struct should be safe. */ 2353 wlcore_disable_interrupts(wl); 2354 wl1271_flush_deferred_work(wl); 2355 cancel_work_sync(&wl->netstack_work); 2356 mutex_lock(&wl->mutex); 2357 power_off: 2358 wl1271_power_off(wl); 2359 } 2360 2361 if (!booted) { 2362 wl1271_error("firmware boot failed despite %d retries", 2363 WL1271_BOOT_RETRIES); 2364 goto out; 2365 } 2366 2367 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str); 2368 2369 /* update hw/fw version info in wiphy struct */ 2370 wiphy->hw_version = wl->chip.id; 2371 strncpy(wiphy->fw_version, wl->chip.fw_ver_str, 2372 sizeof(wiphy->fw_version)); 2373 2374 /* 2375 * Now we know if 11a is supported (info from the NVS), so disable 2376 * 11a channels if not supported 2377 */ 2378 if (!wl->enable_11a) 2379 wiphy->bands[NL80211_BAND_5GHZ]->n_channels = 0; 2380 2381 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported", 2382 wl->enable_11a ? "" : "not "); 2383 2384 wl->state = WLCORE_STATE_ON; 2385 out: 2386 return ret; 2387 } 2388 2389 static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif) 2390 { 2391 return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID; 2392 } 2393 2394 /* 2395 * Check whether a fw switch (i.e. moving from one loaded 2396 * fw to another) is needed. This function is also responsible 2397 * for updating wl->last_vif_count, so it must be called before 2398 * loading a non-plt fw (so the correct fw (single-role/multi-role) 2399 * will be used). 2400 */ 2401 static bool wl12xx_need_fw_change(struct wl1271 *wl, 2402 struct vif_counter_data vif_counter_data, 2403 bool add) 2404 { 2405 enum wl12xx_fw_type current_fw = wl->fw_type; 2406 u8 vif_count = vif_counter_data.counter; 2407 2408 if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags)) 2409 return false; 2410 2411 /* increase the vif count if this is a new vif */ 2412 if (add && !vif_counter_data.cur_vif_running) 2413 vif_count++; 2414 2415 wl->last_vif_count = vif_count; 2416 2417 /* no need for fw change if the device is OFF */ 2418 if (wl->state == WLCORE_STATE_OFF) 2419 return false; 2420 2421 /* no need for fw change if a single fw is used */ 2422 if (!wl->mr_fw_name) 2423 return false; 2424 2425 if (vif_count > 1 && current_fw == WL12XX_FW_TYPE_NORMAL) 2426 return true; 2427 if (vif_count <= 1 && current_fw == WL12XX_FW_TYPE_MULTI) 2428 return true; 2429 2430 return false; 2431 } 2432 2433 /* 2434 * Enter "forced psm". Make sure the sta is in psm against the ap, 2435 * to make the fw switch a bit more disconnection-persistent. 2436 */ 2437 static void wl12xx_force_active_psm(struct wl1271 *wl) 2438 { 2439 struct wl12xx_vif *wlvif; 2440 2441 wl12xx_for_each_wlvif_sta(wl, wlvif) { 2442 wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE); 2443 } 2444 } 2445 2446 struct wlcore_hw_queue_iter_data { 2447 unsigned long hw_queue_map[BITS_TO_LONGS(WLCORE_NUM_MAC_ADDRESSES)]; 2448 /* current vif */ 2449 struct ieee80211_vif *vif; 2450 /* is the current vif among those iterated */ 2451 bool cur_running; 2452 }; 2453 2454 static void wlcore_hw_queue_iter(void *data, u8 *mac, 2455 struct ieee80211_vif *vif) 2456 { 2457 struct wlcore_hw_queue_iter_data *iter_data = data; 2458 2459 if (vif->type == NL80211_IFTYPE_P2P_DEVICE || 2460 WARN_ON_ONCE(vif->hw_queue[0] == IEEE80211_INVAL_HW_QUEUE)) 2461 return; 2462 2463 if (iter_data->cur_running || vif == iter_data->vif) { 2464 iter_data->cur_running = true; 2465 return; 2466 } 2467 2468 __set_bit(vif->hw_queue[0] / NUM_TX_QUEUES, iter_data->hw_queue_map); 2469 } 2470 2471 static int wlcore_allocate_hw_queue_base(struct wl1271 *wl, 2472 struct wl12xx_vif *wlvif) 2473 { 2474 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 2475 struct wlcore_hw_queue_iter_data iter_data = {}; 2476 int i, q_base; 2477 2478 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { 2479 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE; 2480 return 0; 2481 } 2482 2483 iter_data.vif = vif; 2484 2485 /* mark all bits taken by active interfaces */ 2486 ieee80211_iterate_active_interfaces_atomic(wl->hw, 2487 IEEE80211_IFACE_ITER_RESUME_ALL, 2488 wlcore_hw_queue_iter, &iter_data); 2489 2490 /* the current vif is already running in mac80211 (resume/recovery) */ 2491 if (iter_data.cur_running) { 2492 wlvif->hw_queue_base = vif->hw_queue[0]; 2493 wl1271_debug(DEBUG_MAC80211, 2494 "using pre-allocated hw queue base %d", 2495 wlvif->hw_queue_base); 2496 2497 /* interface type might have changed type */ 2498 goto adjust_cab_queue; 2499 } 2500 2501 q_base = find_first_zero_bit(iter_data.hw_queue_map, 2502 WLCORE_NUM_MAC_ADDRESSES); 2503 if (q_base >= WLCORE_NUM_MAC_ADDRESSES) 2504 return -EBUSY; 2505 2506 wlvif->hw_queue_base = q_base * NUM_TX_QUEUES; 2507 wl1271_debug(DEBUG_MAC80211, "allocating hw queue base: %d", 2508 wlvif->hw_queue_base); 2509 2510 for (i = 0; i < NUM_TX_QUEUES; i++) { 2511 wl->queue_stop_reasons[wlvif->hw_queue_base + i] = 0; 2512 /* register hw queues in mac80211 */ 2513 vif->hw_queue[i] = wlvif->hw_queue_base + i; 2514 } 2515 2516 adjust_cab_queue: 2517 /* the last places are reserved for cab queues per interface */ 2518 if (wlvif->bss_type == BSS_TYPE_AP_BSS) 2519 vif->cab_queue = NUM_TX_QUEUES * WLCORE_NUM_MAC_ADDRESSES + 2520 wlvif->hw_queue_base / NUM_TX_QUEUES; 2521 else 2522 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE; 2523 2524 return 0; 2525 } 2526 2527 static int wl1271_op_add_interface(struct ieee80211_hw *hw, 2528 struct ieee80211_vif *vif) 2529 { 2530 struct wl1271 *wl = hw->priv; 2531 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 2532 struct vif_counter_data vif_count; 2533 int ret = 0; 2534 u8 role_type; 2535 2536 if (wl->plt) { 2537 wl1271_error("Adding Interface not allowed while in PLT mode"); 2538 return -EBUSY; 2539 } 2540 2541 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | 2542 IEEE80211_VIF_SUPPORTS_UAPSD | 2543 IEEE80211_VIF_SUPPORTS_CQM_RSSI; 2544 2545 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM", 2546 ieee80211_vif_type_p2p(vif), vif->addr); 2547 2548 wl12xx_get_vif_count(hw, vif, &vif_count); 2549 2550 mutex_lock(&wl->mutex); 2551 2552 /* 2553 * in some very corner case HW recovery scenarios its possible to 2554 * get here before __wl1271_op_remove_interface is complete, so 2555 * opt out if that is the case. 2556 */ 2557 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) || 2558 test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) { 2559 ret = -EBUSY; 2560 goto out; 2561 } 2562 2563 2564 ret = wl12xx_init_vif_data(wl, vif); 2565 if (ret < 0) 2566 goto out; 2567 2568 wlvif->wl = wl; 2569 role_type = wl12xx_get_role_type(wl, wlvif); 2570 if (role_type == WL12XX_INVALID_ROLE_TYPE) { 2571 ret = -EINVAL; 2572 goto out; 2573 } 2574 2575 ret = wlcore_allocate_hw_queue_base(wl, wlvif); 2576 if (ret < 0) 2577 goto out; 2578 2579 /* 2580 * TODO: after the nvs issue will be solved, move this block 2581 * to start(), and make sure here the driver is ON. 2582 */ 2583 if (wl->state == WLCORE_STATE_OFF) { 2584 /* 2585 * we still need this in order to configure the fw 2586 * while uploading the nvs 2587 */ 2588 memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN); 2589 2590 ret = wl12xx_init_fw(wl); 2591 if (ret < 0) 2592 goto out; 2593 } 2594 2595 /* 2596 * Call runtime PM only after possible wl12xx_init_fw() above 2597 * is done. Otherwise we do not have interrupts enabled. 2598 */ 2599 ret = pm_runtime_get_sync(wl->dev); 2600 if (ret < 0) { 2601 pm_runtime_put_noidle(wl->dev); 2602 goto out_unlock; 2603 } 2604 2605 if (wl12xx_need_fw_change(wl, vif_count, true)) { 2606 wl12xx_force_active_psm(wl); 2607 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags); 2608 mutex_unlock(&wl->mutex); 2609 wl1271_recovery_work(&wl->recovery_work); 2610 return 0; 2611 } 2612 2613 if (!wlcore_is_p2p_mgmt(wlvif)) { 2614 ret = wl12xx_cmd_role_enable(wl, vif->addr, 2615 role_type, &wlvif->role_id); 2616 if (ret < 0) 2617 goto out; 2618 2619 ret = wl1271_init_vif_specific(wl, vif); 2620 if (ret < 0) 2621 goto out; 2622 2623 } else { 2624 ret = wl12xx_cmd_role_enable(wl, vif->addr, WL1271_ROLE_DEVICE, 2625 &wlvif->dev_role_id); 2626 if (ret < 0) 2627 goto out; 2628 2629 /* needed mainly for configuring rate policies */ 2630 ret = wl1271_sta_hw_init(wl, wlvif); 2631 if (ret < 0) 2632 goto out; 2633 } 2634 2635 list_add(&wlvif->list, &wl->wlvif_list); 2636 set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags); 2637 2638 if (wlvif->bss_type == BSS_TYPE_AP_BSS) 2639 wl->ap_count++; 2640 else 2641 wl->sta_count++; 2642 out: 2643 pm_runtime_mark_last_busy(wl->dev); 2644 pm_runtime_put_autosuspend(wl->dev); 2645 out_unlock: 2646 mutex_unlock(&wl->mutex); 2647 2648 return ret; 2649 } 2650 2651 static void __wl1271_op_remove_interface(struct wl1271 *wl, 2652 struct ieee80211_vif *vif, 2653 bool reset_tx_queues) 2654 { 2655 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 2656 int i, ret; 2657 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS); 2658 2659 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface"); 2660 2661 if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) 2662 return; 2663 2664 /* because of hardware recovery, we may get here twice */ 2665 if (wl->state == WLCORE_STATE_OFF) 2666 return; 2667 2668 wl1271_info("down"); 2669 2670 if (wl->scan.state != WL1271_SCAN_STATE_IDLE && 2671 wl->scan_wlvif == wlvif) { 2672 struct cfg80211_scan_info info = { 2673 .aborted = true, 2674 }; 2675 2676 /* 2677 * Rearm the tx watchdog just before idling scan. This 2678 * prevents just-finished scans from triggering the watchdog 2679 */ 2680 wl12xx_rearm_tx_watchdog_locked(wl); 2681 2682 wl->scan.state = WL1271_SCAN_STATE_IDLE; 2683 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch)); 2684 wl->scan_wlvif = NULL; 2685 wl->scan.req = NULL; 2686 ieee80211_scan_completed(wl->hw, &info); 2687 } 2688 2689 if (wl->sched_vif == wlvif) 2690 wl->sched_vif = NULL; 2691 2692 if (wl->roc_vif == vif) { 2693 wl->roc_vif = NULL; 2694 ieee80211_remain_on_channel_expired(wl->hw); 2695 } 2696 2697 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) { 2698 /* disable active roles */ 2699 ret = pm_runtime_get_sync(wl->dev); 2700 if (ret < 0) { 2701 pm_runtime_put_noidle(wl->dev); 2702 goto deinit; 2703 } 2704 2705 if (wlvif->bss_type == BSS_TYPE_STA_BSS || 2706 wlvif->bss_type == BSS_TYPE_IBSS) { 2707 if (wl12xx_dev_role_started(wlvif)) 2708 wl12xx_stop_dev(wl, wlvif); 2709 } 2710 2711 if (!wlcore_is_p2p_mgmt(wlvif)) { 2712 ret = wl12xx_cmd_role_disable(wl, &wlvif->role_id); 2713 if (ret < 0) 2714 goto deinit; 2715 } else { 2716 ret = wl12xx_cmd_role_disable(wl, &wlvif->dev_role_id); 2717 if (ret < 0) 2718 goto deinit; 2719 } 2720 2721 pm_runtime_mark_last_busy(wl->dev); 2722 pm_runtime_put_autosuspend(wl->dev); 2723 } 2724 deinit: 2725 wl12xx_tx_reset_wlvif(wl, wlvif); 2726 2727 /* clear all hlids (except system_hlid) */ 2728 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID; 2729 2730 if (wlvif->bss_type == BSS_TYPE_STA_BSS || 2731 wlvif->bss_type == BSS_TYPE_IBSS) { 2732 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID; 2733 wl12xx_free_rate_policy(wl, &wlvif->sta.basic_rate_idx); 2734 wl12xx_free_rate_policy(wl, &wlvif->sta.ap_rate_idx); 2735 wl12xx_free_rate_policy(wl, &wlvif->sta.p2p_rate_idx); 2736 wlcore_free_klv_template(wl, &wlvif->sta.klv_template_id); 2737 } else { 2738 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID; 2739 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID; 2740 wl12xx_free_rate_policy(wl, &wlvif->ap.mgmt_rate_idx); 2741 wl12xx_free_rate_policy(wl, &wlvif->ap.bcast_rate_idx); 2742 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++) 2743 wl12xx_free_rate_policy(wl, 2744 &wlvif->ap.ucast_rate_idx[i]); 2745 wl1271_free_ap_keys(wl, wlvif); 2746 } 2747 2748 dev_kfree_skb(wlvif->probereq); 2749 wlvif->probereq = NULL; 2750 if (wl->last_wlvif == wlvif) 2751 wl->last_wlvif = NULL; 2752 list_del(&wlvif->list); 2753 memset(wlvif->ap.sta_hlid_map, 0, sizeof(wlvif->ap.sta_hlid_map)); 2754 wlvif->role_id = WL12XX_INVALID_ROLE_ID; 2755 wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID; 2756 2757 if (is_ap) 2758 wl->ap_count--; 2759 else 2760 wl->sta_count--; 2761 2762 /* 2763 * Last AP, have more stations. Configure sleep auth according to STA. 2764 * Don't do thin on unintended recovery. 2765 */ 2766 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) && 2767 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)) 2768 goto unlock; 2769 2770 if (wl->ap_count == 0 && is_ap) { 2771 /* mask ap events */ 2772 wl->event_mask &= ~wl->ap_event_mask; 2773 wl1271_event_unmask(wl); 2774 } 2775 2776 if (wl->ap_count == 0 && is_ap && wl->sta_count) { 2777 u8 sta_auth = wl->conf.conn.sta_sleep_auth; 2778 /* Configure for power according to debugfs */ 2779 if (sta_auth != WL1271_PSM_ILLEGAL) 2780 wl1271_acx_sleep_auth(wl, sta_auth); 2781 /* Configure for ELP power saving */ 2782 else 2783 wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP); 2784 } 2785 2786 unlock: 2787 mutex_unlock(&wl->mutex); 2788 2789 del_timer_sync(&wlvif->rx_streaming_timer); 2790 cancel_work_sync(&wlvif->rx_streaming_enable_work); 2791 cancel_work_sync(&wlvif->rx_streaming_disable_work); 2792 cancel_work_sync(&wlvif->rc_update_work); 2793 cancel_delayed_work_sync(&wlvif->connection_loss_work); 2794 cancel_delayed_work_sync(&wlvif->channel_switch_work); 2795 cancel_delayed_work_sync(&wlvif->pending_auth_complete_work); 2796 2797 mutex_lock(&wl->mutex); 2798 } 2799 2800 static void wl1271_op_remove_interface(struct ieee80211_hw *hw, 2801 struct ieee80211_vif *vif) 2802 { 2803 struct wl1271 *wl = hw->priv; 2804 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 2805 struct wl12xx_vif *iter; 2806 struct vif_counter_data vif_count; 2807 2808 wl12xx_get_vif_count(hw, vif, &vif_count); 2809 mutex_lock(&wl->mutex); 2810 2811 if (wl->state == WLCORE_STATE_OFF || 2812 !test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) 2813 goto out; 2814 2815 /* 2816 * wl->vif can be null here if someone shuts down the interface 2817 * just when hardware recovery has been started. 2818 */ 2819 wl12xx_for_each_wlvif(wl, iter) { 2820 if (iter != wlvif) 2821 continue; 2822 2823 __wl1271_op_remove_interface(wl, vif, true); 2824 break; 2825 } 2826 WARN_ON(iter != wlvif); 2827 if (wl12xx_need_fw_change(wl, vif_count, false)) { 2828 wl12xx_force_active_psm(wl); 2829 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags); 2830 wl12xx_queue_recovery_work(wl); 2831 } 2832 out: 2833 mutex_unlock(&wl->mutex); 2834 } 2835 2836 static int wl12xx_op_change_interface(struct ieee80211_hw *hw, 2837 struct ieee80211_vif *vif, 2838 enum nl80211_iftype new_type, bool p2p) 2839 { 2840 struct wl1271 *wl = hw->priv; 2841 int ret; 2842 2843 set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags); 2844 wl1271_op_remove_interface(hw, vif); 2845 2846 vif->type = new_type; 2847 vif->p2p = p2p; 2848 ret = wl1271_op_add_interface(hw, vif); 2849 2850 clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags); 2851 return ret; 2852 } 2853 2854 static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif) 2855 { 2856 int ret; 2857 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS); 2858 2859 /* 2860 * One of the side effects of the JOIN command is that is clears 2861 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated 2862 * to a WPA/WPA2 access point will therefore kill the data-path. 2863 * Currently the only valid scenario for JOIN during association 2864 * is on roaming, in which case we will also be given new keys. 2865 * Keep the below message for now, unless it starts bothering 2866 * users who really like to roam a lot :) 2867 */ 2868 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 2869 wl1271_info("JOIN while associated."); 2870 2871 /* clear encryption type */ 2872 wlvif->encryption_type = KEY_NONE; 2873 2874 if (is_ibss) 2875 ret = wl12xx_cmd_role_start_ibss(wl, wlvif); 2876 else { 2877 if (wl->quirks & WLCORE_QUIRK_START_STA_FAILS) { 2878 /* 2879 * TODO: this is an ugly workaround for wl12xx fw 2880 * bug - we are not able to tx/rx after the first 2881 * start_sta, so make dummy start+stop calls, 2882 * and then call start_sta again. 2883 * this should be fixed in the fw. 2884 */ 2885 wl12xx_cmd_role_start_sta(wl, wlvif); 2886 wl12xx_cmd_role_stop_sta(wl, wlvif); 2887 } 2888 2889 ret = wl12xx_cmd_role_start_sta(wl, wlvif); 2890 } 2891 2892 return ret; 2893 } 2894 2895 static int wl1271_ssid_set(struct wl12xx_vif *wlvif, struct sk_buff *skb, 2896 int offset) 2897 { 2898 u8 ssid_len; 2899 const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset, 2900 skb->len - offset); 2901 2902 if (!ptr) { 2903 wl1271_error("No SSID in IEs!"); 2904 return -ENOENT; 2905 } 2906 2907 ssid_len = ptr[1]; 2908 if (ssid_len > IEEE80211_MAX_SSID_LEN) { 2909 wl1271_error("SSID is too long!"); 2910 return -EINVAL; 2911 } 2912 2913 wlvif->ssid_len = ssid_len; 2914 memcpy(wlvif->ssid, ptr+2, ssid_len); 2915 return 0; 2916 } 2917 2918 static int wlcore_set_ssid(struct wl1271 *wl, struct wl12xx_vif *wlvif) 2919 { 2920 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 2921 struct sk_buff *skb; 2922 int ieoffset; 2923 2924 /* we currently only support setting the ssid from the ap probe req */ 2925 if (wlvif->bss_type != BSS_TYPE_STA_BSS) 2926 return -EINVAL; 2927 2928 skb = ieee80211_ap_probereq_get(wl->hw, vif); 2929 if (!skb) 2930 return -EINVAL; 2931 2932 ieoffset = offsetof(struct ieee80211_mgmt, 2933 u.probe_req.variable); 2934 wl1271_ssid_set(wlvif, skb, ieoffset); 2935 dev_kfree_skb(skb); 2936 2937 return 0; 2938 } 2939 2940 static int wlcore_set_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif, 2941 struct ieee80211_bss_conf *bss_conf, 2942 u32 sta_rate_set) 2943 { 2944 int ieoffset; 2945 int ret; 2946 2947 wlvif->aid = bss_conf->aid; 2948 wlvif->channel_type = cfg80211_get_chandef_type(&bss_conf->chandef); 2949 wlvif->beacon_int = bss_conf->beacon_int; 2950 wlvif->wmm_enabled = bss_conf->qos; 2951 2952 set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags); 2953 2954 /* 2955 * with wl1271, we don't need to update the 2956 * beacon_int and dtim_period, because the firmware 2957 * updates it by itself when the first beacon is 2958 * received after a join. 2959 */ 2960 ret = wl1271_cmd_build_ps_poll(wl, wlvif, wlvif->aid); 2961 if (ret < 0) 2962 return ret; 2963 2964 /* 2965 * Get a template for hardware connection maintenance 2966 */ 2967 dev_kfree_skb(wlvif->probereq); 2968 wlvif->probereq = wl1271_cmd_build_ap_probe_req(wl, 2969 wlvif, 2970 NULL); 2971 ieoffset = offsetof(struct ieee80211_mgmt, 2972 u.probe_req.variable); 2973 wl1271_ssid_set(wlvif, wlvif->probereq, ieoffset); 2974 2975 /* enable the connection monitoring feature */ 2976 ret = wl1271_acx_conn_monit_params(wl, wlvif, true); 2977 if (ret < 0) 2978 return ret; 2979 2980 /* 2981 * The join command disable the keep-alive mode, shut down its process, 2982 * and also clear the template config, so we need to reset it all after 2983 * the join. The acx_aid starts the keep-alive process, and the order 2984 * of the commands below is relevant. 2985 */ 2986 ret = wl1271_acx_keep_alive_mode(wl, wlvif, true); 2987 if (ret < 0) 2988 return ret; 2989 2990 ret = wl1271_acx_aid(wl, wlvif, wlvif->aid); 2991 if (ret < 0) 2992 return ret; 2993 2994 ret = wl12xx_cmd_build_klv_null_data(wl, wlvif); 2995 if (ret < 0) 2996 return ret; 2997 2998 ret = wl1271_acx_keep_alive_config(wl, wlvif, 2999 wlvif->sta.klv_template_id, 3000 ACX_KEEP_ALIVE_TPL_VALID); 3001 if (ret < 0) 3002 return ret; 3003 3004 /* 3005 * The default fw psm configuration is AUTO, while mac80211 default 3006 * setting is off (ACTIVE), so sync the fw with the correct value. 3007 */ 3008 ret = wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE); 3009 if (ret < 0) 3010 return ret; 3011 3012 if (sta_rate_set) { 3013 wlvif->rate_set = 3014 wl1271_tx_enabled_rates_get(wl, 3015 sta_rate_set, 3016 wlvif->band); 3017 ret = wl1271_acx_sta_rate_policies(wl, wlvif); 3018 if (ret < 0) 3019 return ret; 3020 } 3021 3022 return ret; 3023 } 3024 3025 static int wlcore_unset_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif) 3026 { 3027 int ret; 3028 bool sta = wlvif->bss_type == BSS_TYPE_STA_BSS; 3029 3030 /* make sure we are connected (sta) joined */ 3031 if (sta && 3032 !test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 3033 return false; 3034 3035 /* make sure we are joined (ibss) */ 3036 if (!sta && 3037 test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) 3038 return false; 3039 3040 if (sta) { 3041 /* use defaults when not associated */ 3042 wlvif->aid = 0; 3043 3044 /* free probe-request template */ 3045 dev_kfree_skb(wlvif->probereq); 3046 wlvif->probereq = NULL; 3047 3048 /* disable connection monitor features */ 3049 ret = wl1271_acx_conn_monit_params(wl, wlvif, false); 3050 if (ret < 0) 3051 return ret; 3052 3053 /* Disable the keep-alive feature */ 3054 ret = wl1271_acx_keep_alive_mode(wl, wlvif, false); 3055 if (ret < 0) 3056 return ret; 3057 3058 /* disable beacon filtering */ 3059 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false); 3060 if (ret < 0) 3061 return ret; 3062 } 3063 3064 if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) { 3065 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 3066 3067 wl12xx_cmd_stop_channel_switch(wl, wlvif); 3068 ieee80211_chswitch_done(vif, false); 3069 cancel_delayed_work(&wlvif->channel_switch_work); 3070 } 3071 3072 /* invalidate keep-alive template */ 3073 wl1271_acx_keep_alive_config(wl, wlvif, 3074 wlvif->sta.klv_template_id, 3075 ACX_KEEP_ALIVE_TPL_INVALID); 3076 3077 return 0; 3078 } 3079 3080 static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif) 3081 { 3082 wlvif->basic_rate_set = wlvif->bitrate_masks[wlvif->band]; 3083 wlvif->rate_set = wlvif->basic_rate_set; 3084 } 3085 3086 static void wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif, 3087 bool idle) 3088 { 3089 bool cur_idle = !test_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags); 3090 3091 if (idle == cur_idle) 3092 return; 3093 3094 if (idle) { 3095 clear_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags); 3096 } else { 3097 /* The current firmware only supports sched_scan in idle */ 3098 if (wl->sched_vif == wlvif) 3099 wl->ops->sched_scan_stop(wl, wlvif); 3100 3101 set_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags); 3102 } 3103 } 3104 3105 static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif, 3106 struct ieee80211_conf *conf, u32 changed) 3107 { 3108 int ret; 3109 3110 if (wlcore_is_p2p_mgmt(wlvif)) 3111 return 0; 3112 3113 if (conf->power_level != wlvif->power_level) { 3114 ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level); 3115 if (ret < 0) 3116 return ret; 3117 3118 wlvif->power_level = conf->power_level; 3119 } 3120 3121 return 0; 3122 } 3123 3124 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed) 3125 { 3126 struct wl1271 *wl = hw->priv; 3127 struct wl12xx_vif *wlvif; 3128 struct ieee80211_conf *conf = &hw->conf; 3129 int ret = 0; 3130 3131 wl1271_debug(DEBUG_MAC80211, "mac80211 config psm %s power %d %s" 3132 " changed 0x%x", 3133 conf->flags & IEEE80211_CONF_PS ? "on" : "off", 3134 conf->power_level, 3135 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use", 3136 changed); 3137 3138 mutex_lock(&wl->mutex); 3139 3140 if (changed & IEEE80211_CONF_CHANGE_POWER) 3141 wl->power_level = conf->power_level; 3142 3143 if (unlikely(wl->state != WLCORE_STATE_ON)) 3144 goto out; 3145 3146 ret = pm_runtime_get_sync(wl->dev); 3147 if (ret < 0) { 3148 pm_runtime_put_noidle(wl->dev); 3149 goto out; 3150 } 3151 3152 /* configure each interface */ 3153 wl12xx_for_each_wlvif(wl, wlvif) { 3154 ret = wl12xx_config_vif(wl, wlvif, conf, changed); 3155 if (ret < 0) 3156 goto out_sleep; 3157 } 3158 3159 out_sleep: 3160 pm_runtime_mark_last_busy(wl->dev); 3161 pm_runtime_put_autosuspend(wl->dev); 3162 3163 out: 3164 mutex_unlock(&wl->mutex); 3165 3166 return ret; 3167 } 3168 3169 struct wl1271_filter_params { 3170 bool enabled; 3171 int mc_list_length; 3172 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN]; 3173 }; 3174 3175 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, 3176 struct netdev_hw_addr_list *mc_list) 3177 { 3178 struct wl1271_filter_params *fp; 3179 struct netdev_hw_addr *ha; 3180 3181 fp = kzalloc(sizeof(*fp), GFP_ATOMIC); 3182 if (!fp) { 3183 wl1271_error("Out of memory setting filters."); 3184 return 0; 3185 } 3186 3187 /* update multicast filtering parameters */ 3188 fp->mc_list_length = 0; 3189 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) { 3190 fp->enabled = false; 3191 } else { 3192 fp->enabled = true; 3193 netdev_hw_addr_list_for_each(ha, mc_list) { 3194 memcpy(fp->mc_list[fp->mc_list_length], 3195 ha->addr, ETH_ALEN); 3196 fp->mc_list_length++; 3197 } 3198 } 3199 3200 return (u64)(unsigned long)fp; 3201 } 3202 3203 #define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \ 3204 FIF_FCSFAIL | \ 3205 FIF_BCN_PRBRESP_PROMISC | \ 3206 FIF_CONTROL | \ 3207 FIF_OTHER_BSS) 3208 3209 static void wl1271_op_configure_filter(struct ieee80211_hw *hw, 3210 unsigned int changed, 3211 unsigned int *total, u64 multicast) 3212 { 3213 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast; 3214 struct wl1271 *wl = hw->priv; 3215 struct wl12xx_vif *wlvif; 3216 3217 int ret; 3218 3219 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x" 3220 " total %x", changed, *total); 3221 3222 mutex_lock(&wl->mutex); 3223 3224 *total &= WL1271_SUPPORTED_FILTERS; 3225 changed &= WL1271_SUPPORTED_FILTERS; 3226 3227 if (unlikely(wl->state != WLCORE_STATE_ON)) 3228 goto out; 3229 3230 ret = pm_runtime_get_sync(wl->dev); 3231 if (ret < 0) { 3232 pm_runtime_put_noidle(wl->dev); 3233 goto out; 3234 } 3235 3236 wl12xx_for_each_wlvif(wl, wlvif) { 3237 if (wlcore_is_p2p_mgmt(wlvif)) 3238 continue; 3239 3240 if (wlvif->bss_type != BSS_TYPE_AP_BSS) { 3241 if (*total & FIF_ALLMULTI) 3242 ret = wl1271_acx_group_address_tbl(wl, wlvif, 3243 false, 3244 NULL, 0); 3245 else if (fp) 3246 ret = wl1271_acx_group_address_tbl(wl, wlvif, 3247 fp->enabled, 3248 fp->mc_list, 3249 fp->mc_list_length); 3250 if (ret < 0) 3251 goto out_sleep; 3252 } 3253 3254 /* 3255 * If interface in AP mode and created with allmulticast then disable 3256 * the firmware filters so that all multicast packets are passed 3257 * This is mandatory for MDNS based discovery protocols 3258 */ 3259 if (wlvif->bss_type == BSS_TYPE_AP_BSS) { 3260 if (*total & FIF_ALLMULTI) { 3261 ret = wl1271_acx_group_address_tbl(wl, wlvif, 3262 false, 3263 NULL, 0); 3264 if (ret < 0) 3265 goto out_sleep; 3266 } 3267 } 3268 } 3269 3270 /* 3271 * the fw doesn't provide an api to configure the filters. instead, 3272 * the filters configuration is based on the active roles / ROC 3273 * state. 3274 */ 3275 3276 out_sleep: 3277 pm_runtime_mark_last_busy(wl->dev); 3278 pm_runtime_put_autosuspend(wl->dev); 3279 3280 out: 3281 mutex_unlock(&wl->mutex); 3282 kfree(fp); 3283 } 3284 3285 static int wl1271_record_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif, 3286 u8 id, u8 key_type, u8 key_size, 3287 const u8 *key, u8 hlid, u32 tx_seq_32, 3288 u16 tx_seq_16) 3289 { 3290 struct wl1271_ap_key *ap_key; 3291 int i; 3292 3293 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id); 3294 3295 if (key_size > MAX_KEY_SIZE) 3296 return -EINVAL; 3297 3298 /* 3299 * Find next free entry in ap_keys. Also check we are not replacing 3300 * an existing key. 3301 */ 3302 for (i = 0; i < MAX_NUM_KEYS; i++) { 3303 if (wlvif->ap.recorded_keys[i] == NULL) 3304 break; 3305 3306 if (wlvif->ap.recorded_keys[i]->id == id) { 3307 wl1271_warning("trying to record key replacement"); 3308 return -EINVAL; 3309 } 3310 } 3311 3312 if (i == MAX_NUM_KEYS) 3313 return -EBUSY; 3314 3315 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL); 3316 if (!ap_key) 3317 return -ENOMEM; 3318 3319 ap_key->id = id; 3320 ap_key->key_type = key_type; 3321 ap_key->key_size = key_size; 3322 memcpy(ap_key->key, key, key_size); 3323 ap_key->hlid = hlid; 3324 ap_key->tx_seq_32 = tx_seq_32; 3325 ap_key->tx_seq_16 = tx_seq_16; 3326 3327 wlvif->ap.recorded_keys[i] = ap_key; 3328 return 0; 3329 } 3330 3331 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif) 3332 { 3333 int i; 3334 3335 for (i = 0; i < MAX_NUM_KEYS; i++) { 3336 kfree(wlvif->ap.recorded_keys[i]); 3337 wlvif->ap.recorded_keys[i] = NULL; 3338 } 3339 } 3340 3341 static int wl1271_ap_init_hwenc(struct wl1271 *wl, struct wl12xx_vif *wlvif) 3342 { 3343 int i, ret = 0; 3344 struct wl1271_ap_key *key; 3345 bool wep_key_added = false; 3346 3347 for (i = 0; i < MAX_NUM_KEYS; i++) { 3348 u8 hlid; 3349 if (wlvif->ap.recorded_keys[i] == NULL) 3350 break; 3351 3352 key = wlvif->ap.recorded_keys[i]; 3353 hlid = key->hlid; 3354 if (hlid == WL12XX_INVALID_LINK_ID) 3355 hlid = wlvif->ap.bcast_hlid; 3356 3357 ret = wl1271_cmd_set_ap_key(wl, wlvif, KEY_ADD_OR_REPLACE, 3358 key->id, key->key_type, 3359 key->key_size, key->key, 3360 hlid, key->tx_seq_32, 3361 key->tx_seq_16); 3362 if (ret < 0) 3363 goto out; 3364 3365 if (key->key_type == KEY_WEP) 3366 wep_key_added = true; 3367 } 3368 3369 if (wep_key_added) { 3370 ret = wl12xx_cmd_set_default_wep_key(wl, wlvif->default_key, 3371 wlvif->ap.bcast_hlid); 3372 if (ret < 0) 3373 goto out; 3374 } 3375 3376 out: 3377 wl1271_free_ap_keys(wl, wlvif); 3378 return ret; 3379 } 3380 3381 static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif, 3382 u16 action, u8 id, u8 key_type, 3383 u8 key_size, const u8 *key, u32 tx_seq_32, 3384 u16 tx_seq_16, struct ieee80211_sta *sta) 3385 { 3386 int ret; 3387 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS); 3388 3389 if (is_ap) { 3390 struct wl1271_station *wl_sta; 3391 u8 hlid; 3392 3393 if (sta) { 3394 wl_sta = (struct wl1271_station *)sta->drv_priv; 3395 hlid = wl_sta->hlid; 3396 } else { 3397 hlid = wlvif->ap.bcast_hlid; 3398 } 3399 3400 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) { 3401 /* 3402 * We do not support removing keys after AP shutdown. 3403 * Pretend we do to make mac80211 happy. 3404 */ 3405 if (action != KEY_ADD_OR_REPLACE) 3406 return 0; 3407 3408 ret = wl1271_record_ap_key(wl, wlvif, id, 3409 key_type, key_size, 3410 key, hlid, tx_seq_32, 3411 tx_seq_16); 3412 } else { 3413 ret = wl1271_cmd_set_ap_key(wl, wlvif, action, 3414 id, key_type, key_size, 3415 key, hlid, tx_seq_32, 3416 tx_seq_16); 3417 } 3418 3419 if (ret < 0) 3420 return ret; 3421 } else { 3422 const u8 *addr; 3423 static const u8 bcast_addr[ETH_ALEN] = { 3424 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 3425 }; 3426 3427 addr = sta ? sta->addr : bcast_addr; 3428 3429 if (is_zero_ether_addr(addr)) { 3430 /* We dont support TX only encryption */ 3431 return -EOPNOTSUPP; 3432 } 3433 3434 /* The wl1271 does not allow to remove unicast keys - they 3435 will be cleared automatically on next CMD_JOIN. Ignore the 3436 request silently, as we dont want the mac80211 to emit 3437 an error message. */ 3438 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr)) 3439 return 0; 3440 3441 /* don't remove key if hlid was already deleted */ 3442 if (action == KEY_REMOVE && 3443 wlvif->sta.hlid == WL12XX_INVALID_LINK_ID) 3444 return 0; 3445 3446 ret = wl1271_cmd_set_sta_key(wl, wlvif, action, 3447 id, key_type, key_size, 3448 key, addr, tx_seq_32, 3449 tx_seq_16); 3450 if (ret < 0) 3451 return ret; 3452 3453 } 3454 3455 return 0; 3456 } 3457 3458 static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 3459 struct ieee80211_vif *vif, 3460 struct ieee80211_sta *sta, 3461 struct ieee80211_key_conf *key_conf) 3462 { 3463 struct wl1271 *wl = hw->priv; 3464 int ret; 3465 bool might_change_spare = 3466 key_conf->cipher == WL1271_CIPHER_SUITE_GEM || 3467 key_conf->cipher == WLAN_CIPHER_SUITE_TKIP; 3468 3469 if (might_change_spare) { 3470 /* 3471 * stop the queues and flush to ensure the next packets are 3472 * in sync with FW spare block accounting 3473 */ 3474 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK); 3475 wl1271_tx_flush(wl); 3476 } 3477 3478 mutex_lock(&wl->mutex); 3479 3480 if (unlikely(wl->state != WLCORE_STATE_ON)) { 3481 ret = -EAGAIN; 3482 goto out_wake_queues; 3483 } 3484 3485 ret = pm_runtime_get_sync(wl->dev); 3486 if (ret < 0) { 3487 pm_runtime_put_noidle(wl->dev); 3488 goto out_wake_queues; 3489 } 3490 3491 ret = wlcore_hw_set_key(wl, cmd, vif, sta, key_conf); 3492 3493 pm_runtime_mark_last_busy(wl->dev); 3494 pm_runtime_put_autosuspend(wl->dev); 3495 3496 out_wake_queues: 3497 if (might_change_spare) 3498 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK); 3499 3500 mutex_unlock(&wl->mutex); 3501 3502 return ret; 3503 } 3504 3505 int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd, 3506 struct ieee80211_vif *vif, 3507 struct ieee80211_sta *sta, 3508 struct ieee80211_key_conf *key_conf) 3509 { 3510 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3511 int ret; 3512 u32 tx_seq_32 = 0; 3513 u16 tx_seq_16 = 0; 3514 u8 key_type; 3515 u8 hlid; 3516 3517 wl1271_debug(DEBUG_MAC80211, "mac80211 set key"); 3518 3519 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta); 3520 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x", 3521 key_conf->cipher, key_conf->keyidx, 3522 key_conf->keylen, key_conf->flags); 3523 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen); 3524 3525 if (wlvif->bss_type == BSS_TYPE_AP_BSS) 3526 if (sta) { 3527 struct wl1271_station *wl_sta = (void *)sta->drv_priv; 3528 hlid = wl_sta->hlid; 3529 } else { 3530 hlid = wlvif->ap.bcast_hlid; 3531 } 3532 else 3533 hlid = wlvif->sta.hlid; 3534 3535 if (hlid != WL12XX_INVALID_LINK_ID) { 3536 u64 tx_seq = wl->links[hlid].total_freed_pkts; 3537 tx_seq_32 = WL1271_TX_SECURITY_HI32(tx_seq); 3538 tx_seq_16 = WL1271_TX_SECURITY_LO16(tx_seq); 3539 } 3540 3541 switch (key_conf->cipher) { 3542 case WLAN_CIPHER_SUITE_WEP40: 3543 case WLAN_CIPHER_SUITE_WEP104: 3544 key_type = KEY_WEP; 3545 3546 key_conf->hw_key_idx = key_conf->keyidx; 3547 break; 3548 case WLAN_CIPHER_SUITE_TKIP: 3549 key_type = KEY_TKIP; 3550 key_conf->hw_key_idx = key_conf->keyidx; 3551 break; 3552 case WLAN_CIPHER_SUITE_CCMP: 3553 key_type = KEY_AES; 3554 key_conf->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE; 3555 break; 3556 case WL1271_CIPHER_SUITE_GEM: 3557 key_type = KEY_GEM; 3558 break; 3559 default: 3560 wl1271_error("Unknown key algo 0x%x", key_conf->cipher); 3561 3562 return -EOPNOTSUPP; 3563 } 3564 3565 switch (cmd) { 3566 case SET_KEY: 3567 ret = wl1271_set_key(wl, wlvif, KEY_ADD_OR_REPLACE, 3568 key_conf->keyidx, key_type, 3569 key_conf->keylen, key_conf->key, 3570 tx_seq_32, tx_seq_16, sta); 3571 if (ret < 0) { 3572 wl1271_error("Could not add or replace key"); 3573 return ret; 3574 } 3575 3576 /* 3577 * reconfiguring arp response if the unicast (or common) 3578 * encryption key type was changed 3579 */ 3580 if (wlvif->bss_type == BSS_TYPE_STA_BSS && 3581 (sta || key_type == KEY_WEP) && 3582 wlvif->encryption_type != key_type) { 3583 wlvif->encryption_type = key_type; 3584 ret = wl1271_cmd_build_arp_rsp(wl, wlvif); 3585 if (ret < 0) { 3586 wl1271_warning("build arp rsp failed: %d", ret); 3587 return ret; 3588 } 3589 } 3590 break; 3591 3592 case DISABLE_KEY: 3593 ret = wl1271_set_key(wl, wlvif, KEY_REMOVE, 3594 key_conf->keyidx, key_type, 3595 key_conf->keylen, key_conf->key, 3596 0, 0, sta); 3597 if (ret < 0) { 3598 wl1271_error("Could not remove key"); 3599 return ret; 3600 } 3601 break; 3602 3603 default: 3604 wl1271_error("Unsupported key cmd 0x%x", cmd); 3605 return -EOPNOTSUPP; 3606 } 3607 3608 return ret; 3609 } 3610 EXPORT_SYMBOL_GPL(wlcore_set_key); 3611 3612 static void wl1271_op_set_default_key_idx(struct ieee80211_hw *hw, 3613 struct ieee80211_vif *vif, 3614 int key_idx) 3615 { 3616 struct wl1271 *wl = hw->priv; 3617 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3618 int ret; 3619 3620 wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d", 3621 key_idx); 3622 3623 /* we don't handle unsetting of default key */ 3624 if (key_idx == -1) 3625 return; 3626 3627 mutex_lock(&wl->mutex); 3628 3629 if (unlikely(wl->state != WLCORE_STATE_ON)) { 3630 ret = -EAGAIN; 3631 goto out_unlock; 3632 } 3633 3634 ret = pm_runtime_get_sync(wl->dev); 3635 if (ret < 0) { 3636 pm_runtime_put_noidle(wl->dev); 3637 goto out_unlock; 3638 } 3639 3640 wlvif->default_key = key_idx; 3641 3642 /* the default WEP key needs to be configured at least once */ 3643 if (wlvif->encryption_type == KEY_WEP) { 3644 ret = wl12xx_cmd_set_default_wep_key(wl, 3645 key_idx, 3646 wlvif->sta.hlid); 3647 if (ret < 0) 3648 goto out_sleep; 3649 } 3650 3651 out_sleep: 3652 pm_runtime_mark_last_busy(wl->dev); 3653 pm_runtime_put_autosuspend(wl->dev); 3654 3655 out_unlock: 3656 mutex_unlock(&wl->mutex); 3657 } 3658 3659 void wlcore_regdomain_config(struct wl1271 *wl) 3660 { 3661 int ret; 3662 3663 if (!(wl->quirks & WLCORE_QUIRK_REGDOMAIN_CONF)) 3664 return; 3665 3666 mutex_lock(&wl->mutex); 3667 3668 if (unlikely(wl->state != WLCORE_STATE_ON)) 3669 goto out; 3670 3671 ret = pm_runtime_get_sync(wl->dev); 3672 if (ret < 0) 3673 goto out; 3674 3675 ret = wlcore_cmd_regdomain_config_locked(wl); 3676 if (ret < 0) { 3677 wl12xx_queue_recovery_work(wl); 3678 goto out; 3679 } 3680 3681 pm_runtime_mark_last_busy(wl->dev); 3682 pm_runtime_put_autosuspend(wl->dev); 3683 out: 3684 mutex_unlock(&wl->mutex); 3685 } 3686 3687 static int wl1271_op_hw_scan(struct ieee80211_hw *hw, 3688 struct ieee80211_vif *vif, 3689 struct ieee80211_scan_request *hw_req) 3690 { 3691 struct cfg80211_scan_request *req = &hw_req->req; 3692 struct wl1271 *wl = hw->priv; 3693 int ret; 3694 u8 *ssid = NULL; 3695 size_t len = 0; 3696 3697 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan"); 3698 3699 if (req->n_ssids) { 3700 ssid = req->ssids[0].ssid; 3701 len = req->ssids[0].ssid_len; 3702 } 3703 3704 mutex_lock(&wl->mutex); 3705 3706 if (unlikely(wl->state != WLCORE_STATE_ON)) { 3707 /* 3708 * We cannot return -EBUSY here because cfg80211 will expect 3709 * a call to ieee80211_scan_completed if we do - in this case 3710 * there won't be any call. 3711 */ 3712 ret = -EAGAIN; 3713 goto out; 3714 } 3715 3716 ret = pm_runtime_get_sync(wl->dev); 3717 if (ret < 0) { 3718 pm_runtime_put_noidle(wl->dev); 3719 goto out; 3720 } 3721 3722 /* fail if there is any role in ROC */ 3723 if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) { 3724 /* don't allow scanning right now */ 3725 ret = -EBUSY; 3726 goto out_sleep; 3727 } 3728 3729 ret = wlcore_scan(hw->priv, vif, ssid, len, req); 3730 out_sleep: 3731 pm_runtime_mark_last_busy(wl->dev); 3732 pm_runtime_put_autosuspend(wl->dev); 3733 out: 3734 mutex_unlock(&wl->mutex); 3735 3736 return ret; 3737 } 3738 3739 static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw, 3740 struct ieee80211_vif *vif) 3741 { 3742 struct wl1271 *wl = hw->priv; 3743 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3744 struct cfg80211_scan_info info = { 3745 .aborted = true, 3746 }; 3747 int ret; 3748 3749 wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan"); 3750 3751 mutex_lock(&wl->mutex); 3752 3753 if (unlikely(wl->state != WLCORE_STATE_ON)) 3754 goto out; 3755 3756 if (wl->scan.state == WL1271_SCAN_STATE_IDLE) 3757 goto out; 3758 3759 ret = pm_runtime_get_sync(wl->dev); 3760 if (ret < 0) { 3761 pm_runtime_put_noidle(wl->dev); 3762 goto out; 3763 } 3764 3765 if (wl->scan.state != WL1271_SCAN_STATE_DONE) { 3766 ret = wl->ops->scan_stop(wl, wlvif); 3767 if (ret < 0) 3768 goto out_sleep; 3769 } 3770 3771 /* 3772 * Rearm the tx watchdog just before idling scan. This 3773 * prevents just-finished scans from triggering the watchdog 3774 */ 3775 wl12xx_rearm_tx_watchdog_locked(wl); 3776 3777 wl->scan.state = WL1271_SCAN_STATE_IDLE; 3778 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch)); 3779 wl->scan_wlvif = NULL; 3780 wl->scan.req = NULL; 3781 ieee80211_scan_completed(wl->hw, &info); 3782 3783 out_sleep: 3784 pm_runtime_mark_last_busy(wl->dev); 3785 pm_runtime_put_autosuspend(wl->dev); 3786 out: 3787 mutex_unlock(&wl->mutex); 3788 3789 cancel_delayed_work_sync(&wl->scan_complete_work); 3790 } 3791 3792 static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw, 3793 struct ieee80211_vif *vif, 3794 struct cfg80211_sched_scan_request *req, 3795 struct ieee80211_scan_ies *ies) 3796 { 3797 struct wl1271 *wl = hw->priv; 3798 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3799 int ret; 3800 3801 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start"); 3802 3803 mutex_lock(&wl->mutex); 3804 3805 if (unlikely(wl->state != WLCORE_STATE_ON)) { 3806 ret = -EAGAIN; 3807 goto out; 3808 } 3809 3810 ret = pm_runtime_get_sync(wl->dev); 3811 if (ret < 0) { 3812 pm_runtime_put_noidle(wl->dev); 3813 goto out; 3814 } 3815 3816 ret = wl->ops->sched_scan_start(wl, wlvif, req, ies); 3817 if (ret < 0) 3818 goto out_sleep; 3819 3820 wl->sched_vif = wlvif; 3821 3822 out_sleep: 3823 pm_runtime_mark_last_busy(wl->dev); 3824 pm_runtime_put_autosuspend(wl->dev); 3825 out: 3826 mutex_unlock(&wl->mutex); 3827 return ret; 3828 } 3829 3830 static int wl1271_op_sched_scan_stop(struct ieee80211_hw *hw, 3831 struct ieee80211_vif *vif) 3832 { 3833 struct wl1271 *wl = hw->priv; 3834 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3835 int ret; 3836 3837 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop"); 3838 3839 mutex_lock(&wl->mutex); 3840 3841 if (unlikely(wl->state != WLCORE_STATE_ON)) 3842 goto out; 3843 3844 ret = pm_runtime_get_sync(wl->dev); 3845 if (ret < 0) { 3846 pm_runtime_put_noidle(wl->dev); 3847 goto out; 3848 } 3849 3850 wl->ops->sched_scan_stop(wl, wlvif); 3851 3852 pm_runtime_mark_last_busy(wl->dev); 3853 pm_runtime_put_autosuspend(wl->dev); 3854 out: 3855 mutex_unlock(&wl->mutex); 3856 3857 return 0; 3858 } 3859 3860 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value) 3861 { 3862 struct wl1271 *wl = hw->priv; 3863 int ret = 0; 3864 3865 mutex_lock(&wl->mutex); 3866 3867 if (unlikely(wl->state != WLCORE_STATE_ON)) { 3868 ret = -EAGAIN; 3869 goto out; 3870 } 3871 3872 ret = pm_runtime_get_sync(wl->dev); 3873 if (ret < 0) { 3874 pm_runtime_put_noidle(wl->dev); 3875 goto out; 3876 } 3877 3878 ret = wl1271_acx_frag_threshold(wl, value); 3879 if (ret < 0) 3880 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret); 3881 3882 pm_runtime_mark_last_busy(wl->dev); 3883 pm_runtime_put_autosuspend(wl->dev); 3884 3885 out: 3886 mutex_unlock(&wl->mutex); 3887 3888 return ret; 3889 } 3890 3891 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value) 3892 { 3893 struct wl1271 *wl = hw->priv; 3894 struct wl12xx_vif *wlvif; 3895 int ret = 0; 3896 3897 mutex_lock(&wl->mutex); 3898 3899 if (unlikely(wl->state != WLCORE_STATE_ON)) { 3900 ret = -EAGAIN; 3901 goto out; 3902 } 3903 3904 ret = pm_runtime_get_sync(wl->dev); 3905 if (ret < 0) { 3906 pm_runtime_put_noidle(wl->dev); 3907 goto out; 3908 } 3909 3910 wl12xx_for_each_wlvif(wl, wlvif) { 3911 ret = wl1271_acx_rts_threshold(wl, wlvif, value); 3912 if (ret < 0) 3913 wl1271_warning("set rts threshold failed: %d", ret); 3914 } 3915 pm_runtime_mark_last_busy(wl->dev); 3916 pm_runtime_put_autosuspend(wl->dev); 3917 3918 out: 3919 mutex_unlock(&wl->mutex); 3920 3921 return ret; 3922 } 3923 3924 static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset) 3925 { 3926 int len; 3927 const u8 *next, *end = skb->data + skb->len; 3928 u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset, 3929 skb->len - ieoffset); 3930 if (!ie) 3931 return; 3932 len = ie[1] + 2; 3933 next = ie + len; 3934 memmove(ie, next, end - next); 3935 skb_trim(skb, skb->len - len); 3936 } 3937 3938 static void wl12xx_remove_vendor_ie(struct sk_buff *skb, 3939 unsigned int oui, u8 oui_type, 3940 int ieoffset) 3941 { 3942 int len; 3943 const u8 *next, *end = skb->data + skb->len; 3944 u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type, 3945 skb->data + ieoffset, 3946 skb->len - ieoffset); 3947 if (!ie) 3948 return; 3949 len = ie[1] + 2; 3950 next = ie + len; 3951 memmove(ie, next, end - next); 3952 skb_trim(skb, skb->len - len); 3953 } 3954 3955 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates, 3956 struct ieee80211_vif *vif) 3957 { 3958 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3959 struct sk_buff *skb; 3960 int ret; 3961 3962 skb = ieee80211_proberesp_get(wl->hw, vif); 3963 if (!skb) 3964 return -EOPNOTSUPP; 3965 3966 ret = wl1271_cmd_template_set(wl, wlvif->role_id, 3967 CMD_TEMPL_AP_PROBE_RESPONSE, 3968 skb->data, 3969 skb->len, 0, 3970 rates); 3971 dev_kfree_skb(skb); 3972 3973 if (ret < 0) 3974 goto out; 3975 3976 wl1271_debug(DEBUG_AP, "probe response updated"); 3977 set_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags); 3978 3979 out: 3980 return ret; 3981 } 3982 3983 static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl, 3984 struct ieee80211_vif *vif, 3985 u8 *probe_rsp_data, 3986 size_t probe_rsp_len, 3987 u32 rates) 3988 { 3989 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3990 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 3991 u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE]; 3992 int ssid_ie_offset, ie_offset, templ_len; 3993 const u8 *ptr; 3994 3995 /* no need to change probe response if the SSID is set correctly */ 3996 if (wlvif->ssid_len > 0) 3997 return wl1271_cmd_template_set(wl, wlvif->role_id, 3998 CMD_TEMPL_AP_PROBE_RESPONSE, 3999 probe_rsp_data, 4000 probe_rsp_len, 0, 4001 rates); 4002 4003 if (probe_rsp_len + bss_conf->ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) { 4004 wl1271_error("probe_rsp template too big"); 4005 return -EINVAL; 4006 } 4007 4008 /* start searching from IE offset */ 4009 ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable); 4010 4011 ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset, 4012 probe_rsp_len - ie_offset); 4013 if (!ptr) { 4014 wl1271_error("No SSID in beacon!"); 4015 return -EINVAL; 4016 } 4017 4018 ssid_ie_offset = ptr - probe_rsp_data; 4019 ptr += (ptr[1] + 2); 4020 4021 memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset); 4022 4023 /* insert SSID from bss_conf */ 4024 probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID; 4025 probe_rsp_templ[ssid_ie_offset + 1] = bss_conf->ssid_len; 4026 memcpy(probe_rsp_templ + ssid_ie_offset + 2, 4027 bss_conf->ssid, bss_conf->ssid_len); 4028 templ_len = ssid_ie_offset + 2 + bss_conf->ssid_len; 4029 4030 memcpy(probe_rsp_templ + ssid_ie_offset + 2 + bss_conf->ssid_len, 4031 ptr, probe_rsp_len - (ptr - probe_rsp_data)); 4032 templ_len += probe_rsp_len - (ptr - probe_rsp_data); 4033 4034 return wl1271_cmd_template_set(wl, wlvif->role_id, 4035 CMD_TEMPL_AP_PROBE_RESPONSE, 4036 probe_rsp_templ, 4037 templ_len, 0, 4038 rates); 4039 } 4040 4041 static int wl1271_bss_erp_info_changed(struct wl1271 *wl, 4042 struct ieee80211_vif *vif, 4043 struct ieee80211_bss_conf *bss_conf, 4044 u32 changed) 4045 { 4046 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4047 int ret = 0; 4048 4049 if (changed & BSS_CHANGED_ERP_SLOT) { 4050 if (bss_conf->use_short_slot) 4051 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_SHORT); 4052 else 4053 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_LONG); 4054 if (ret < 0) { 4055 wl1271_warning("Set slot time failed %d", ret); 4056 goto out; 4057 } 4058 } 4059 4060 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 4061 if (bss_conf->use_short_preamble) 4062 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_SHORT); 4063 else 4064 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_LONG); 4065 } 4066 4067 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 4068 if (bss_conf->use_cts_prot) 4069 ret = wl1271_acx_cts_protect(wl, wlvif, 4070 CTSPROTECT_ENABLE); 4071 else 4072 ret = wl1271_acx_cts_protect(wl, wlvif, 4073 CTSPROTECT_DISABLE); 4074 if (ret < 0) { 4075 wl1271_warning("Set ctsprotect failed %d", ret); 4076 goto out; 4077 } 4078 } 4079 4080 out: 4081 return ret; 4082 } 4083 4084 static int wlcore_set_beacon_template(struct wl1271 *wl, 4085 struct ieee80211_vif *vif, 4086 bool is_ap) 4087 { 4088 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4089 struct ieee80211_hdr *hdr; 4090 u32 min_rate; 4091 int ret; 4092 int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable); 4093 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif); 4094 u16 tmpl_id; 4095 4096 if (!beacon) { 4097 ret = -EINVAL; 4098 goto out; 4099 } 4100 4101 wl1271_debug(DEBUG_MASTER, "beacon updated"); 4102 4103 ret = wl1271_ssid_set(wlvif, beacon, ieoffset); 4104 if (ret < 0) { 4105 dev_kfree_skb(beacon); 4106 goto out; 4107 } 4108 min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); 4109 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON : 4110 CMD_TEMPL_BEACON; 4111 ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id, 4112 beacon->data, 4113 beacon->len, 0, 4114 min_rate); 4115 if (ret < 0) { 4116 dev_kfree_skb(beacon); 4117 goto out; 4118 } 4119 4120 wlvif->wmm_enabled = 4121 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 4122 WLAN_OUI_TYPE_MICROSOFT_WMM, 4123 beacon->data + ieoffset, 4124 beacon->len - ieoffset); 4125 4126 /* 4127 * In case we already have a probe-resp beacon set explicitly 4128 * by usermode, don't use the beacon data. 4129 */ 4130 if (test_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags)) 4131 goto end_bcn; 4132 4133 /* remove TIM ie from probe response */ 4134 wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset); 4135 4136 /* 4137 * remove p2p ie from probe response. 4138 * the fw reponds to probe requests that don't include 4139 * the p2p ie. probe requests with p2p ie will be passed, 4140 * and will be responded by the supplicant (the spec 4141 * forbids including the p2p ie when responding to probe 4142 * requests that didn't include it). 4143 */ 4144 wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA, 4145 WLAN_OUI_TYPE_WFA_P2P, ieoffset); 4146 4147 hdr = (struct ieee80211_hdr *) beacon->data; 4148 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 4149 IEEE80211_STYPE_PROBE_RESP); 4150 if (is_ap) 4151 ret = wl1271_ap_set_probe_resp_tmpl_legacy(wl, vif, 4152 beacon->data, 4153 beacon->len, 4154 min_rate); 4155 else 4156 ret = wl1271_cmd_template_set(wl, wlvif->role_id, 4157 CMD_TEMPL_PROBE_RESPONSE, 4158 beacon->data, 4159 beacon->len, 0, 4160 min_rate); 4161 end_bcn: 4162 dev_kfree_skb(beacon); 4163 if (ret < 0) 4164 goto out; 4165 4166 out: 4167 return ret; 4168 } 4169 4170 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl, 4171 struct ieee80211_vif *vif, 4172 struct ieee80211_bss_conf *bss_conf, 4173 u32 changed) 4174 { 4175 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4176 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS); 4177 int ret = 0; 4178 4179 if (changed & BSS_CHANGED_BEACON_INT) { 4180 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d", 4181 bss_conf->beacon_int); 4182 4183 wlvif->beacon_int = bss_conf->beacon_int; 4184 } 4185 4186 if ((changed & BSS_CHANGED_AP_PROBE_RESP) && is_ap) { 4187 u32 rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); 4188 4189 wl1271_ap_set_probe_resp_tmpl(wl, rate, vif); 4190 } 4191 4192 if (changed & BSS_CHANGED_BEACON) { 4193 ret = wlcore_set_beacon_template(wl, vif, is_ap); 4194 if (ret < 0) 4195 goto out; 4196 4197 if (test_and_clear_bit(WLVIF_FLAG_BEACON_DISABLED, 4198 &wlvif->flags)) { 4199 ret = wlcore_hw_dfs_master_restart(wl, wlvif); 4200 if (ret < 0) 4201 goto out; 4202 } 4203 } 4204 out: 4205 if (ret != 0) 4206 wl1271_error("beacon info change failed: %d", ret); 4207 return ret; 4208 } 4209 4210 /* AP mode changes */ 4211 static void wl1271_bss_info_changed_ap(struct wl1271 *wl, 4212 struct ieee80211_vif *vif, 4213 struct ieee80211_bss_conf *bss_conf, 4214 u32 changed) 4215 { 4216 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4217 int ret = 0; 4218 4219 if (changed & BSS_CHANGED_BASIC_RATES) { 4220 u32 rates = bss_conf->basic_rates; 4221 4222 wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates, 4223 wlvif->band); 4224 wlvif->basic_rate = wl1271_tx_min_rate_get(wl, 4225 wlvif->basic_rate_set); 4226 4227 ret = wl1271_init_ap_rates(wl, wlvif); 4228 if (ret < 0) { 4229 wl1271_error("AP rate policy change failed %d", ret); 4230 goto out; 4231 } 4232 4233 ret = wl1271_ap_init_templates(wl, vif); 4234 if (ret < 0) 4235 goto out; 4236 4237 /* No need to set probe resp template for mesh */ 4238 if (!ieee80211_vif_is_mesh(vif)) { 4239 ret = wl1271_ap_set_probe_resp_tmpl(wl, 4240 wlvif->basic_rate, 4241 vif); 4242 if (ret < 0) 4243 goto out; 4244 } 4245 4246 ret = wlcore_set_beacon_template(wl, vif, true); 4247 if (ret < 0) 4248 goto out; 4249 } 4250 4251 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed); 4252 if (ret < 0) 4253 goto out; 4254 4255 if (changed & BSS_CHANGED_BEACON_ENABLED) { 4256 if (bss_conf->enable_beacon) { 4257 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) { 4258 ret = wl12xx_cmd_role_start_ap(wl, wlvif); 4259 if (ret < 0) 4260 goto out; 4261 4262 ret = wl1271_ap_init_hwenc(wl, wlvif); 4263 if (ret < 0) 4264 goto out; 4265 4266 set_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags); 4267 wl1271_debug(DEBUG_AP, "started AP"); 4268 } 4269 } else { 4270 if (test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) { 4271 /* 4272 * AP might be in ROC in case we have just 4273 * sent auth reply. handle it. 4274 */ 4275 if (test_bit(wlvif->role_id, wl->roc_map)) 4276 wl12xx_croc(wl, wlvif->role_id); 4277 4278 ret = wl12xx_cmd_role_stop_ap(wl, wlvif); 4279 if (ret < 0) 4280 goto out; 4281 4282 clear_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags); 4283 clear_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, 4284 &wlvif->flags); 4285 wl1271_debug(DEBUG_AP, "stopped AP"); 4286 } 4287 } 4288 } 4289 4290 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed); 4291 if (ret < 0) 4292 goto out; 4293 4294 /* Handle HT information change */ 4295 if ((changed & BSS_CHANGED_HT) && 4296 (bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) { 4297 ret = wl1271_acx_set_ht_information(wl, wlvif, 4298 bss_conf->ht_operation_mode); 4299 if (ret < 0) { 4300 wl1271_warning("Set ht information failed %d", ret); 4301 goto out; 4302 } 4303 } 4304 4305 out: 4306 return; 4307 } 4308 4309 static int wlcore_set_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif, 4310 struct ieee80211_bss_conf *bss_conf, 4311 u32 sta_rate_set) 4312 { 4313 u32 rates; 4314 int ret; 4315 4316 wl1271_debug(DEBUG_MAC80211, 4317 "changed_bssid: %pM, aid: %d, bcn_int: %d, brates: 0x%x sta_rate_set: 0x%x", 4318 bss_conf->bssid, bss_conf->aid, 4319 bss_conf->beacon_int, 4320 bss_conf->basic_rates, sta_rate_set); 4321 4322 wlvif->beacon_int = bss_conf->beacon_int; 4323 rates = bss_conf->basic_rates; 4324 wlvif->basic_rate_set = 4325 wl1271_tx_enabled_rates_get(wl, rates, 4326 wlvif->band); 4327 wlvif->basic_rate = 4328 wl1271_tx_min_rate_get(wl, 4329 wlvif->basic_rate_set); 4330 4331 if (sta_rate_set) 4332 wlvif->rate_set = 4333 wl1271_tx_enabled_rates_get(wl, 4334 sta_rate_set, 4335 wlvif->band); 4336 4337 /* we only support sched_scan while not connected */ 4338 if (wl->sched_vif == wlvif) 4339 wl->ops->sched_scan_stop(wl, wlvif); 4340 4341 ret = wl1271_acx_sta_rate_policies(wl, wlvif); 4342 if (ret < 0) 4343 return ret; 4344 4345 ret = wl12xx_cmd_build_null_data(wl, wlvif); 4346 if (ret < 0) 4347 return ret; 4348 4349 ret = wl1271_build_qos_null_data(wl, wl12xx_wlvif_to_vif(wlvif)); 4350 if (ret < 0) 4351 return ret; 4352 4353 wlcore_set_ssid(wl, wlvif); 4354 4355 set_bit(WLVIF_FLAG_IN_USE, &wlvif->flags); 4356 4357 return 0; 4358 } 4359 4360 static int wlcore_clear_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif) 4361 { 4362 int ret; 4363 4364 /* revert back to minimum rates for the current band */ 4365 wl1271_set_band_rate(wl, wlvif); 4366 wlvif->basic_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); 4367 4368 ret = wl1271_acx_sta_rate_policies(wl, wlvif); 4369 if (ret < 0) 4370 return ret; 4371 4372 if (wlvif->bss_type == BSS_TYPE_STA_BSS && 4373 test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags)) { 4374 ret = wl12xx_cmd_role_stop_sta(wl, wlvif); 4375 if (ret < 0) 4376 return ret; 4377 } 4378 4379 clear_bit(WLVIF_FLAG_IN_USE, &wlvif->flags); 4380 return 0; 4381 } 4382 /* STA/IBSS mode changes */ 4383 static void wl1271_bss_info_changed_sta(struct wl1271 *wl, 4384 struct ieee80211_vif *vif, 4385 struct ieee80211_bss_conf *bss_conf, 4386 u32 changed) 4387 { 4388 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4389 bool do_join = false; 4390 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS); 4391 bool ibss_joined = false; 4392 u32 sta_rate_set = 0; 4393 int ret; 4394 struct ieee80211_sta *sta; 4395 bool sta_exists = false; 4396 struct ieee80211_sta_ht_cap sta_ht_cap; 4397 4398 if (is_ibss) { 4399 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, 4400 changed); 4401 if (ret < 0) 4402 goto out; 4403 } 4404 4405 if (changed & BSS_CHANGED_IBSS) { 4406 if (bss_conf->ibss_joined) { 4407 set_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags); 4408 ibss_joined = true; 4409 } else { 4410 wlcore_unset_assoc(wl, wlvif); 4411 wl12xx_cmd_role_stop_sta(wl, wlvif); 4412 } 4413 } 4414 4415 if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined) 4416 do_join = true; 4417 4418 /* Need to update the SSID (for filtering etc) */ 4419 if ((changed & BSS_CHANGED_BEACON) && ibss_joined) 4420 do_join = true; 4421 4422 if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) { 4423 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s", 4424 bss_conf->enable_beacon ? "enabled" : "disabled"); 4425 4426 do_join = true; 4427 } 4428 4429 if (changed & BSS_CHANGED_IDLE && !is_ibss) 4430 wl1271_sta_handle_idle(wl, wlvif, bss_conf->idle); 4431 4432 if (changed & BSS_CHANGED_CQM) { 4433 bool enable = false; 4434 if (bss_conf->cqm_rssi_thold) 4435 enable = true; 4436 ret = wl1271_acx_rssi_snr_trigger(wl, wlvif, enable, 4437 bss_conf->cqm_rssi_thold, 4438 bss_conf->cqm_rssi_hyst); 4439 if (ret < 0) 4440 goto out; 4441 wlvif->rssi_thold = bss_conf->cqm_rssi_thold; 4442 } 4443 4444 if (changed & (BSS_CHANGED_BSSID | BSS_CHANGED_HT | 4445 BSS_CHANGED_ASSOC)) { 4446 rcu_read_lock(); 4447 sta = ieee80211_find_sta(vif, bss_conf->bssid); 4448 if (sta) { 4449 u8 *rx_mask = sta->ht_cap.mcs.rx_mask; 4450 4451 /* save the supp_rates of the ap */ 4452 sta_rate_set = sta->supp_rates[wlvif->band]; 4453 if (sta->ht_cap.ht_supported) 4454 sta_rate_set |= 4455 (rx_mask[0] << HW_HT_RATES_OFFSET) | 4456 (rx_mask[1] << HW_MIMO_RATES_OFFSET); 4457 sta_ht_cap = sta->ht_cap; 4458 sta_exists = true; 4459 } 4460 4461 rcu_read_unlock(); 4462 } 4463 4464 if (changed & BSS_CHANGED_BSSID) { 4465 if (!is_zero_ether_addr(bss_conf->bssid)) { 4466 ret = wlcore_set_bssid(wl, wlvif, bss_conf, 4467 sta_rate_set); 4468 if (ret < 0) 4469 goto out; 4470 4471 /* Need to update the BSSID (for filtering etc) */ 4472 do_join = true; 4473 } else { 4474 ret = wlcore_clear_bssid(wl, wlvif); 4475 if (ret < 0) 4476 goto out; 4477 } 4478 } 4479 4480 if (changed & BSS_CHANGED_IBSS) { 4481 wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d", 4482 bss_conf->ibss_joined); 4483 4484 if (bss_conf->ibss_joined) { 4485 u32 rates = bss_conf->basic_rates; 4486 wlvif->basic_rate_set = 4487 wl1271_tx_enabled_rates_get(wl, rates, 4488 wlvif->band); 4489 wlvif->basic_rate = 4490 wl1271_tx_min_rate_get(wl, 4491 wlvif->basic_rate_set); 4492 4493 /* by default, use 11b + OFDM rates */ 4494 wlvif->rate_set = CONF_TX_IBSS_DEFAULT_RATES; 4495 ret = wl1271_acx_sta_rate_policies(wl, wlvif); 4496 if (ret < 0) 4497 goto out; 4498 } 4499 } 4500 4501 if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) { 4502 /* enable beacon filtering */ 4503 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true); 4504 if (ret < 0) 4505 goto out; 4506 } 4507 4508 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed); 4509 if (ret < 0) 4510 goto out; 4511 4512 if (do_join) { 4513 ret = wlcore_join(wl, wlvif); 4514 if (ret < 0) { 4515 wl1271_warning("cmd join failed %d", ret); 4516 goto out; 4517 } 4518 } 4519 4520 if (changed & BSS_CHANGED_ASSOC) { 4521 if (bss_conf->assoc) { 4522 ret = wlcore_set_assoc(wl, wlvif, bss_conf, 4523 sta_rate_set); 4524 if (ret < 0) 4525 goto out; 4526 4527 if (test_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags)) 4528 wl12xx_set_authorized(wl, wlvif); 4529 } else { 4530 wlcore_unset_assoc(wl, wlvif); 4531 } 4532 } 4533 4534 if (changed & BSS_CHANGED_PS) { 4535 if ((bss_conf->ps) && 4536 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) && 4537 !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) { 4538 int ps_mode; 4539 char *ps_mode_str; 4540 4541 if (wl->conf.conn.forced_ps) { 4542 ps_mode = STATION_POWER_SAVE_MODE; 4543 ps_mode_str = "forced"; 4544 } else { 4545 ps_mode = STATION_AUTO_PS_MODE; 4546 ps_mode_str = "auto"; 4547 } 4548 4549 wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str); 4550 4551 ret = wl1271_ps_set_mode(wl, wlvif, ps_mode); 4552 if (ret < 0) 4553 wl1271_warning("enter %s ps failed %d", 4554 ps_mode_str, ret); 4555 } else if (!bss_conf->ps && 4556 test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) { 4557 wl1271_debug(DEBUG_PSM, "auto ps disabled"); 4558 4559 ret = wl1271_ps_set_mode(wl, wlvif, 4560 STATION_ACTIVE_MODE); 4561 if (ret < 0) 4562 wl1271_warning("exit auto ps failed %d", ret); 4563 } 4564 } 4565 4566 /* Handle new association with HT. Do this after join. */ 4567 if (sta_exists) { 4568 bool enabled = 4569 bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT; 4570 4571 ret = wlcore_hw_set_peer_cap(wl, 4572 &sta_ht_cap, 4573 enabled, 4574 wlvif->rate_set, 4575 wlvif->sta.hlid); 4576 if (ret < 0) { 4577 wl1271_warning("Set ht cap failed %d", ret); 4578 goto out; 4579 4580 } 4581 4582 if (enabled) { 4583 ret = wl1271_acx_set_ht_information(wl, wlvif, 4584 bss_conf->ht_operation_mode); 4585 if (ret < 0) { 4586 wl1271_warning("Set ht information failed %d", 4587 ret); 4588 goto out; 4589 } 4590 } 4591 } 4592 4593 /* Handle arp filtering. Done after join. */ 4594 if ((changed & BSS_CHANGED_ARP_FILTER) || 4595 (!is_ibss && (changed & BSS_CHANGED_QOS))) { 4596 __be32 addr = bss_conf->arp_addr_list[0]; 4597 wlvif->sta.qos = bss_conf->qos; 4598 WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS); 4599 4600 if (bss_conf->arp_addr_cnt == 1 && bss_conf->assoc) { 4601 wlvif->ip_addr = addr; 4602 /* 4603 * The template should have been configured only upon 4604 * association. however, it seems that the correct ip 4605 * isn't being set (when sending), so we have to 4606 * reconfigure the template upon every ip change. 4607 */ 4608 ret = wl1271_cmd_build_arp_rsp(wl, wlvif); 4609 if (ret < 0) { 4610 wl1271_warning("build arp rsp failed: %d", ret); 4611 goto out; 4612 } 4613 4614 ret = wl1271_acx_arp_ip_filter(wl, wlvif, 4615 (ACX_ARP_FILTER_ARP_FILTERING | 4616 ACX_ARP_FILTER_AUTO_ARP), 4617 addr); 4618 } else { 4619 wlvif->ip_addr = 0; 4620 ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr); 4621 } 4622 4623 if (ret < 0) 4624 goto out; 4625 } 4626 4627 out: 4628 return; 4629 } 4630 4631 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, 4632 struct ieee80211_vif *vif, 4633 struct ieee80211_bss_conf *bss_conf, 4634 u32 changed) 4635 { 4636 struct wl1271 *wl = hw->priv; 4637 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4638 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS); 4639 int ret; 4640 4641 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info role %d changed 0x%x", 4642 wlvif->role_id, (int)changed); 4643 4644 /* 4645 * make sure to cancel pending disconnections if our association 4646 * state changed 4647 */ 4648 if (!is_ap && (changed & BSS_CHANGED_ASSOC)) 4649 cancel_delayed_work_sync(&wlvif->connection_loss_work); 4650 4651 if (is_ap && (changed & BSS_CHANGED_BEACON_ENABLED) && 4652 !bss_conf->enable_beacon) 4653 wl1271_tx_flush(wl); 4654 4655 mutex_lock(&wl->mutex); 4656 4657 if (unlikely(wl->state != WLCORE_STATE_ON)) 4658 goto out; 4659 4660 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))) 4661 goto out; 4662 4663 ret = pm_runtime_get_sync(wl->dev); 4664 if (ret < 0) { 4665 pm_runtime_put_noidle(wl->dev); 4666 goto out; 4667 } 4668 4669 if ((changed & BSS_CHANGED_TXPOWER) && 4670 bss_conf->txpower != wlvif->power_level) { 4671 4672 ret = wl1271_acx_tx_power(wl, wlvif, bss_conf->txpower); 4673 if (ret < 0) 4674 goto out; 4675 4676 wlvif->power_level = bss_conf->txpower; 4677 } 4678 4679 if (is_ap) 4680 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed); 4681 else 4682 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed); 4683 4684 pm_runtime_mark_last_busy(wl->dev); 4685 pm_runtime_put_autosuspend(wl->dev); 4686 4687 out: 4688 mutex_unlock(&wl->mutex); 4689 } 4690 4691 static int wlcore_op_add_chanctx(struct ieee80211_hw *hw, 4692 struct ieee80211_chanctx_conf *ctx) 4693 { 4694 wl1271_debug(DEBUG_MAC80211, "mac80211 add chanctx %d (type %d)", 4695 ieee80211_frequency_to_channel(ctx->def.chan->center_freq), 4696 cfg80211_get_chandef_type(&ctx->def)); 4697 return 0; 4698 } 4699 4700 static void wlcore_op_remove_chanctx(struct ieee80211_hw *hw, 4701 struct ieee80211_chanctx_conf *ctx) 4702 { 4703 wl1271_debug(DEBUG_MAC80211, "mac80211 remove chanctx %d (type %d)", 4704 ieee80211_frequency_to_channel(ctx->def.chan->center_freq), 4705 cfg80211_get_chandef_type(&ctx->def)); 4706 } 4707 4708 static void wlcore_op_change_chanctx(struct ieee80211_hw *hw, 4709 struct ieee80211_chanctx_conf *ctx, 4710 u32 changed) 4711 { 4712 struct wl1271 *wl = hw->priv; 4713 struct wl12xx_vif *wlvif; 4714 int ret; 4715 int channel = ieee80211_frequency_to_channel( 4716 ctx->def.chan->center_freq); 4717 4718 wl1271_debug(DEBUG_MAC80211, 4719 "mac80211 change chanctx %d (type %d) changed 0x%x", 4720 channel, cfg80211_get_chandef_type(&ctx->def), changed); 4721 4722 mutex_lock(&wl->mutex); 4723 4724 ret = pm_runtime_get_sync(wl->dev); 4725 if (ret < 0) { 4726 pm_runtime_put_noidle(wl->dev); 4727 goto out; 4728 } 4729 4730 wl12xx_for_each_wlvif(wl, wlvif) { 4731 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 4732 4733 rcu_read_lock(); 4734 if (rcu_access_pointer(vif->chanctx_conf) != ctx) { 4735 rcu_read_unlock(); 4736 continue; 4737 } 4738 rcu_read_unlock(); 4739 4740 /* start radar if needed */ 4741 if (changed & IEEE80211_CHANCTX_CHANGE_RADAR && 4742 wlvif->bss_type == BSS_TYPE_AP_BSS && 4743 ctx->radar_enabled && !wlvif->radar_enabled && 4744 ctx->def.chan->dfs_state == NL80211_DFS_USABLE) { 4745 wl1271_debug(DEBUG_MAC80211, "Start radar detection"); 4746 wlcore_hw_set_cac(wl, wlvif, true); 4747 wlvif->radar_enabled = true; 4748 } 4749 } 4750 4751 pm_runtime_mark_last_busy(wl->dev); 4752 pm_runtime_put_autosuspend(wl->dev); 4753 out: 4754 mutex_unlock(&wl->mutex); 4755 } 4756 4757 static int wlcore_op_assign_vif_chanctx(struct ieee80211_hw *hw, 4758 struct ieee80211_vif *vif, 4759 struct ieee80211_chanctx_conf *ctx) 4760 { 4761 struct wl1271 *wl = hw->priv; 4762 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4763 int channel = ieee80211_frequency_to_channel( 4764 ctx->def.chan->center_freq); 4765 int ret = -EINVAL; 4766 4767 wl1271_debug(DEBUG_MAC80211, 4768 "mac80211 assign chanctx (role %d) %d (type %d) (radar %d dfs_state %d)", 4769 wlvif->role_id, channel, 4770 cfg80211_get_chandef_type(&ctx->def), 4771 ctx->radar_enabled, ctx->def.chan->dfs_state); 4772 4773 mutex_lock(&wl->mutex); 4774 4775 if (unlikely(wl->state != WLCORE_STATE_ON)) 4776 goto out; 4777 4778 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))) 4779 goto out; 4780 4781 ret = pm_runtime_get_sync(wl->dev); 4782 if (ret < 0) { 4783 pm_runtime_put_noidle(wl->dev); 4784 goto out; 4785 } 4786 4787 wlvif->band = ctx->def.chan->band; 4788 wlvif->channel = channel; 4789 wlvif->channel_type = cfg80211_get_chandef_type(&ctx->def); 4790 4791 /* update default rates according to the band */ 4792 wl1271_set_band_rate(wl, wlvif); 4793 4794 if (ctx->radar_enabled && 4795 ctx->def.chan->dfs_state == NL80211_DFS_USABLE) { 4796 wl1271_debug(DEBUG_MAC80211, "Start radar detection"); 4797 wlcore_hw_set_cac(wl, wlvif, true); 4798 wlvif->radar_enabled = true; 4799 } 4800 4801 pm_runtime_mark_last_busy(wl->dev); 4802 pm_runtime_put_autosuspend(wl->dev); 4803 out: 4804 mutex_unlock(&wl->mutex); 4805 4806 return 0; 4807 } 4808 4809 static void wlcore_op_unassign_vif_chanctx(struct ieee80211_hw *hw, 4810 struct ieee80211_vif *vif, 4811 struct ieee80211_chanctx_conf *ctx) 4812 { 4813 struct wl1271 *wl = hw->priv; 4814 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4815 int ret; 4816 4817 wl1271_debug(DEBUG_MAC80211, 4818 "mac80211 unassign chanctx (role %d) %d (type %d)", 4819 wlvif->role_id, 4820 ieee80211_frequency_to_channel(ctx->def.chan->center_freq), 4821 cfg80211_get_chandef_type(&ctx->def)); 4822 4823 wl1271_tx_flush(wl); 4824 4825 mutex_lock(&wl->mutex); 4826 4827 if (unlikely(wl->state != WLCORE_STATE_ON)) 4828 goto out; 4829 4830 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))) 4831 goto out; 4832 4833 ret = pm_runtime_get_sync(wl->dev); 4834 if (ret < 0) { 4835 pm_runtime_put_noidle(wl->dev); 4836 goto out; 4837 } 4838 4839 if (wlvif->radar_enabled) { 4840 wl1271_debug(DEBUG_MAC80211, "Stop radar detection"); 4841 wlcore_hw_set_cac(wl, wlvif, false); 4842 wlvif->radar_enabled = false; 4843 } 4844 4845 pm_runtime_mark_last_busy(wl->dev); 4846 pm_runtime_put_autosuspend(wl->dev); 4847 out: 4848 mutex_unlock(&wl->mutex); 4849 } 4850 4851 static int __wlcore_switch_vif_chan(struct wl1271 *wl, 4852 struct wl12xx_vif *wlvif, 4853 struct ieee80211_chanctx_conf *new_ctx) 4854 { 4855 int channel = ieee80211_frequency_to_channel( 4856 new_ctx->def.chan->center_freq); 4857 4858 wl1271_debug(DEBUG_MAC80211, 4859 "switch vif (role %d) %d -> %d chan_type: %d", 4860 wlvif->role_id, wlvif->channel, channel, 4861 cfg80211_get_chandef_type(&new_ctx->def)); 4862 4863 if (WARN_ON_ONCE(wlvif->bss_type != BSS_TYPE_AP_BSS)) 4864 return 0; 4865 4866 WARN_ON(!test_bit(WLVIF_FLAG_BEACON_DISABLED, &wlvif->flags)); 4867 4868 if (wlvif->radar_enabled) { 4869 wl1271_debug(DEBUG_MAC80211, "Stop radar detection"); 4870 wlcore_hw_set_cac(wl, wlvif, false); 4871 wlvif->radar_enabled = false; 4872 } 4873 4874 wlvif->band = new_ctx->def.chan->band; 4875 wlvif->channel = channel; 4876 wlvif->channel_type = cfg80211_get_chandef_type(&new_ctx->def); 4877 4878 /* start radar if needed */ 4879 if (new_ctx->radar_enabled) { 4880 wl1271_debug(DEBUG_MAC80211, "Start radar detection"); 4881 wlcore_hw_set_cac(wl, wlvif, true); 4882 wlvif->radar_enabled = true; 4883 } 4884 4885 return 0; 4886 } 4887 4888 static int 4889 wlcore_op_switch_vif_chanctx(struct ieee80211_hw *hw, 4890 struct ieee80211_vif_chanctx_switch *vifs, 4891 int n_vifs, 4892 enum ieee80211_chanctx_switch_mode mode) 4893 { 4894 struct wl1271 *wl = hw->priv; 4895 int i, ret; 4896 4897 wl1271_debug(DEBUG_MAC80211, 4898 "mac80211 switch chanctx n_vifs %d mode %d", 4899 n_vifs, mode); 4900 4901 mutex_lock(&wl->mutex); 4902 4903 ret = pm_runtime_get_sync(wl->dev); 4904 if (ret < 0) { 4905 pm_runtime_put_noidle(wl->dev); 4906 goto out; 4907 } 4908 4909 for (i = 0; i < n_vifs; i++) { 4910 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vifs[i].vif); 4911 4912 ret = __wlcore_switch_vif_chan(wl, wlvif, vifs[i].new_ctx); 4913 if (ret) 4914 goto out_sleep; 4915 } 4916 out_sleep: 4917 pm_runtime_mark_last_busy(wl->dev); 4918 pm_runtime_put_autosuspend(wl->dev); 4919 out: 4920 mutex_unlock(&wl->mutex); 4921 4922 return 0; 4923 } 4924 4925 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, 4926 struct ieee80211_vif *vif, u16 queue, 4927 const struct ieee80211_tx_queue_params *params) 4928 { 4929 struct wl1271 *wl = hw->priv; 4930 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4931 u8 ps_scheme; 4932 int ret = 0; 4933 4934 if (wlcore_is_p2p_mgmt(wlvif)) 4935 return 0; 4936 4937 mutex_lock(&wl->mutex); 4938 4939 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue); 4940 4941 if (params->uapsd) 4942 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER; 4943 else 4944 ps_scheme = CONF_PS_SCHEME_LEGACY; 4945 4946 if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) 4947 goto out; 4948 4949 ret = pm_runtime_get_sync(wl->dev); 4950 if (ret < 0) { 4951 pm_runtime_put_noidle(wl->dev); 4952 goto out; 4953 } 4954 4955 /* 4956 * the txop is confed in units of 32us by the mac80211, 4957 * we need us 4958 */ 4959 ret = wl1271_acx_ac_cfg(wl, wlvif, wl1271_tx_get_queue(queue), 4960 params->cw_min, params->cw_max, 4961 params->aifs, params->txop << 5); 4962 if (ret < 0) 4963 goto out_sleep; 4964 4965 ret = wl1271_acx_tid_cfg(wl, wlvif, wl1271_tx_get_queue(queue), 4966 CONF_CHANNEL_TYPE_EDCF, 4967 wl1271_tx_get_queue(queue), 4968 ps_scheme, CONF_ACK_POLICY_LEGACY, 4969 0, 0); 4970 4971 out_sleep: 4972 pm_runtime_mark_last_busy(wl->dev); 4973 pm_runtime_put_autosuspend(wl->dev); 4974 4975 out: 4976 mutex_unlock(&wl->mutex); 4977 4978 return ret; 4979 } 4980 4981 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw, 4982 struct ieee80211_vif *vif) 4983 { 4984 4985 struct wl1271 *wl = hw->priv; 4986 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 4987 u64 mactime = ULLONG_MAX; 4988 int ret; 4989 4990 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf"); 4991 4992 mutex_lock(&wl->mutex); 4993 4994 if (unlikely(wl->state != WLCORE_STATE_ON)) 4995 goto out; 4996 4997 ret = pm_runtime_get_sync(wl->dev); 4998 if (ret < 0) { 4999 pm_runtime_put_noidle(wl->dev); 5000 goto out; 5001 } 5002 5003 ret = wl12xx_acx_tsf_info(wl, wlvif, &mactime); 5004 if (ret < 0) 5005 goto out_sleep; 5006 5007 out_sleep: 5008 pm_runtime_mark_last_busy(wl->dev); 5009 pm_runtime_put_autosuspend(wl->dev); 5010 5011 out: 5012 mutex_unlock(&wl->mutex); 5013 return mactime; 5014 } 5015 5016 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx, 5017 struct survey_info *survey) 5018 { 5019 struct ieee80211_conf *conf = &hw->conf; 5020 5021 if (idx != 0) 5022 return -ENOENT; 5023 5024 survey->channel = conf->chandef.chan; 5025 survey->filled = 0; 5026 return 0; 5027 } 5028 5029 static int wl1271_allocate_sta(struct wl1271 *wl, 5030 struct wl12xx_vif *wlvif, 5031 struct ieee80211_sta *sta) 5032 { 5033 struct wl1271_station *wl_sta; 5034 int ret; 5035 5036 5037 if (wl->active_sta_count >= wl->max_ap_stations) { 5038 wl1271_warning("could not allocate HLID - too much stations"); 5039 return -EBUSY; 5040 } 5041 5042 wl_sta = (struct wl1271_station *)sta->drv_priv; 5043 ret = wl12xx_allocate_link(wl, wlvif, &wl_sta->hlid); 5044 if (ret < 0) { 5045 wl1271_warning("could not allocate HLID - too many links"); 5046 return -EBUSY; 5047 } 5048 5049 /* use the previous security seq, if this is a recovery/resume */ 5050 wl->links[wl_sta->hlid].total_freed_pkts = wl_sta->total_freed_pkts; 5051 5052 set_bit(wl_sta->hlid, wlvif->ap.sta_hlid_map); 5053 memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN); 5054 wl->active_sta_count++; 5055 return 0; 5056 } 5057 5058 void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid) 5059 { 5060 if (!test_bit(hlid, wlvif->ap.sta_hlid_map)) 5061 return; 5062 5063 clear_bit(hlid, wlvif->ap.sta_hlid_map); 5064 __clear_bit(hlid, &wl->ap_ps_map); 5065 __clear_bit(hlid, &wl->ap_fw_ps_map); 5066 5067 /* 5068 * save the last used PN in the private part of iee80211_sta, 5069 * in case of recovery/suspend 5070 */ 5071 wlcore_save_freed_pkts_addr(wl, wlvif, hlid, wl->links[hlid].addr); 5072 5073 wl12xx_free_link(wl, wlvif, &hlid); 5074 wl->active_sta_count--; 5075 5076 /* 5077 * rearm the tx watchdog when the last STA is freed - give the FW a 5078 * chance to return STA-buffered packets before complaining. 5079 */ 5080 if (wl->active_sta_count == 0) 5081 wl12xx_rearm_tx_watchdog_locked(wl); 5082 } 5083 5084 static int wl12xx_sta_add(struct wl1271 *wl, 5085 struct wl12xx_vif *wlvif, 5086 struct ieee80211_sta *sta) 5087 { 5088 struct wl1271_station *wl_sta; 5089 int ret = 0; 5090 u8 hlid; 5091 5092 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid); 5093 5094 ret = wl1271_allocate_sta(wl, wlvif, sta); 5095 if (ret < 0) 5096 return ret; 5097 5098 wl_sta = (struct wl1271_station *)sta->drv_priv; 5099 hlid = wl_sta->hlid; 5100 5101 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid); 5102 if (ret < 0) 5103 wl1271_free_sta(wl, wlvif, hlid); 5104 5105 return ret; 5106 } 5107 5108 static int wl12xx_sta_remove(struct wl1271 *wl, 5109 struct wl12xx_vif *wlvif, 5110 struct ieee80211_sta *sta) 5111 { 5112 struct wl1271_station *wl_sta; 5113 int ret = 0, id; 5114 5115 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid); 5116 5117 wl_sta = (struct wl1271_station *)sta->drv_priv; 5118 id = wl_sta->hlid; 5119 if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map))) 5120 return -EINVAL; 5121 5122 ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid); 5123 if (ret < 0) 5124 return ret; 5125 5126 wl1271_free_sta(wl, wlvif, wl_sta->hlid); 5127 return ret; 5128 } 5129 5130 static void wlcore_roc_if_possible(struct wl1271 *wl, 5131 struct wl12xx_vif *wlvif) 5132 { 5133 if (find_first_bit(wl->roc_map, 5134 WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) 5135 return; 5136 5137 if (WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID)) 5138 return; 5139 5140 wl12xx_roc(wl, wlvif, wlvif->role_id, wlvif->band, wlvif->channel); 5141 } 5142 5143 /* 5144 * when wl_sta is NULL, we treat this call as if coming from a 5145 * pending auth reply. 5146 * wl->mutex must be taken and the FW must be awake when the call 5147 * takes place. 5148 */ 5149 void wlcore_update_inconn_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, 5150 struct wl1271_station *wl_sta, bool in_conn) 5151 { 5152 if (in_conn) { 5153 if (WARN_ON(wl_sta && wl_sta->in_connection)) 5154 return; 5155 5156 if (!wlvif->ap_pending_auth_reply && 5157 !wlvif->inconn_count) 5158 wlcore_roc_if_possible(wl, wlvif); 5159 5160 if (wl_sta) { 5161 wl_sta->in_connection = true; 5162 wlvif->inconn_count++; 5163 } else { 5164 wlvif->ap_pending_auth_reply = true; 5165 } 5166 } else { 5167 if (wl_sta && !wl_sta->in_connection) 5168 return; 5169 5170 if (WARN_ON(!wl_sta && !wlvif->ap_pending_auth_reply)) 5171 return; 5172 5173 if (WARN_ON(wl_sta && !wlvif->inconn_count)) 5174 return; 5175 5176 if (wl_sta) { 5177 wl_sta->in_connection = false; 5178 wlvif->inconn_count--; 5179 } else { 5180 wlvif->ap_pending_auth_reply = false; 5181 } 5182 5183 if (!wlvif->inconn_count && !wlvif->ap_pending_auth_reply && 5184 test_bit(wlvif->role_id, wl->roc_map)) 5185 wl12xx_croc(wl, wlvif->role_id); 5186 } 5187 } 5188 5189 static int wl12xx_update_sta_state(struct wl1271 *wl, 5190 struct wl12xx_vif *wlvif, 5191 struct ieee80211_sta *sta, 5192 enum ieee80211_sta_state old_state, 5193 enum ieee80211_sta_state new_state) 5194 { 5195 struct wl1271_station *wl_sta; 5196 bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS; 5197 bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS; 5198 int ret; 5199 5200 wl_sta = (struct wl1271_station *)sta->drv_priv; 5201 5202 /* Add station (AP mode) */ 5203 if (is_ap && 5204 old_state == IEEE80211_STA_NOTEXIST && 5205 new_state == IEEE80211_STA_NONE) { 5206 ret = wl12xx_sta_add(wl, wlvif, sta); 5207 if (ret) 5208 return ret; 5209 5210 wlcore_update_inconn_sta(wl, wlvif, wl_sta, true); 5211 } 5212 5213 /* Remove station (AP mode) */ 5214 if (is_ap && 5215 old_state == IEEE80211_STA_NONE && 5216 new_state == IEEE80211_STA_NOTEXIST) { 5217 /* must not fail */ 5218 wl12xx_sta_remove(wl, wlvif, sta); 5219 5220 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false); 5221 } 5222 5223 /* Authorize station (AP mode) */ 5224 if (is_ap && 5225 new_state == IEEE80211_STA_AUTHORIZED) { 5226 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wl_sta->hlid); 5227 if (ret < 0) 5228 return ret; 5229 5230 /* reconfigure rates */ 5231 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, wl_sta->hlid); 5232 if (ret < 0) 5233 return ret; 5234 5235 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true, 5236 wl_sta->hlid); 5237 if (ret) 5238 return ret; 5239 5240 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false); 5241 } 5242 5243 /* Authorize station */ 5244 if (is_sta && 5245 new_state == IEEE80211_STA_AUTHORIZED) { 5246 set_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags); 5247 ret = wl12xx_set_authorized(wl, wlvif); 5248 if (ret) 5249 return ret; 5250 } 5251 5252 if (is_sta && 5253 old_state == IEEE80211_STA_AUTHORIZED && 5254 new_state == IEEE80211_STA_ASSOC) { 5255 clear_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags); 5256 clear_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags); 5257 } 5258 5259 /* save seq number on disassoc (suspend) */ 5260 if (is_sta && 5261 old_state == IEEE80211_STA_ASSOC && 5262 new_state == IEEE80211_STA_AUTH) { 5263 wlcore_save_freed_pkts(wl, wlvif, wlvif->sta.hlid, sta); 5264 wlvif->total_freed_pkts = 0; 5265 } 5266 5267 /* restore seq number on assoc (resume) */ 5268 if (is_sta && 5269 old_state == IEEE80211_STA_AUTH && 5270 new_state == IEEE80211_STA_ASSOC) { 5271 wlvif->total_freed_pkts = wl_sta->total_freed_pkts; 5272 } 5273 5274 /* clear ROCs on failure or authorization */ 5275 if (is_sta && 5276 (new_state == IEEE80211_STA_AUTHORIZED || 5277 new_state == IEEE80211_STA_NOTEXIST)) { 5278 if (test_bit(wlvif->role_id, wl->roc_map)) 5279 wl12xx_croc(wl, wlvif->role_id); 5280 } 5281 5282 if (is_sta && 5283 old_state == IEEE80211_STA_NOTEXIST && 5284 new_state == IEEE80211_STA_NONE) { 5285 if (find_first_bit(wl->roc_map, 5286 WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES) { 5287 WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID); 5288 wl12xx_roc(wl, wlvif, wlvif->role_id, 5289 wlvif->band, wlvif->channel); 5290 } 5291 } 5292 return 0; 5293 } 5294 5295 static int wl12xx_op_sta_state(struct ieee80211_hw *hw, 5296 struct ieee80211_vif *vif, 5297 struct ieee80211_sta *sta, 5298 enum ieee80211_sta_state old_state, 5299 enum ieee80211_sta_state new_state) 5300 { 5301 struct wl1271 *wl = hw->priv; 5302 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5303 int ret; 5304 5305 wl1271_debug(DEBUG_MAC80211, "mac80211 sta %d state=%d->%d", 5306 sta->aid, old_state, new_state); 5307 5308 mutex_lock(&wl->mutex); 5309 5310 if (unlikely(wl->state != WLCORE_STATE_ON)) { 5311 ret = -EBUSY; 5312 goto out; 5313 } 5314 5315 ret = pm_runtime_get_sync(wl->dev); 5316 if (ret < 0) { 5317 pm_runtime_put_noidle(wl->dev); 5318 goto out; 5319 } 5320 5321 ret = wl12xx_update_sta_state(wl, wlvif, sta, old_state, new_state); 5322 5323 pm_runtime_mark_last_busy(wl->dev); 5324 pm_runtime_put_autosuspend(wl->dev); 5325 out: 5326 mutex_unlock(&wl->mutex); 5327 if (new_state < old_state) 5328 return 0; 5329 return ret; 5330 } 5331 5332 static int wl1271_op_ampdu_action(struct ieee80211_hw *hw, 5333 struct ieee80211_vif *vif, 5334 struct ieee80211_ampdu_params *params) 5335 { 5336 struct wl1271 *wl = hw->priv; 5337 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5338 int ret; 5339 u8 hlid, *ba_bitmap; 5340 struct ieee80211_sta *sta = params->sta; 5341 enum ieee80211_ampdu_mlme_action action = params->action; 5342 u16 tid = params->tid; 5343 u16 *ssn = ¶ms->ssn; 5344 5345 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action, 5346 tid); 5347 5348 /* sanity check - the fields in FW are only 8bits wide */ 5349 if (WARN_ON(tid > 0xFF)) 5350 return -ENOTSUPP; 5351 5352 mutex_lock(&wl->mutex); 5353 5354 if (unlikely(wl->state != WLCORE_STATE_ON)) { 5355 ret = -EAGAIN; 5356 goto out; 5357 } 5358 5359 if (wlvif->bss_type == BSS_TYPE_STA_BSS) { 5360 hlid = wlvif->sta.hlid; 5361 } else if (wlvif->bss_type == BSS_TYPE_AP_BSS) { 5362 struct wl1271_station *wl_sta; 5363 5364 wl_sta = (struct wl1271_station *)sta->drv_priv; 5365 hlid = wl_sta->hlid; 5366 } else { 5367 ret = -EINVAL; 5368 goto out; 5369 } 5370 5371 ba_bitmap = &wl->links[hlid].ba_bitmap; 5372 5373 ret = pm_runtime_get_sync(wl->dev); 5374 if (ret < 0) { 5375 pm_runtime_put_noidle(wl->dev); 5376 goto out; 5377 } 5378 5379 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d", 5380 tid, action); 5381 5382 switch (action) { 5383 case IEEE80211_AMPDU_RX_START: 5384 if (!wlvif->ba_support || !wlvif->ba_allowed) { 5385 ret = -ENOTSUPP; 5386 break; 5387 } 5388 5389 if (wl->ba_rx_session_count >= wl->ba_rx_session_count_max) { 5390 ret = -EBUSY; 5391 wl1271_error("exceeded max RX BA sessions"); 5392 break; 5393 } 5394 5395 if (*ba_bitmap & BIT(tid)) { 5396 ret = -EINVAL; 5397 wl1271_error("cannot enable RX BA session on active " 5398 "tid: %d", tid); 5399 break; 5400 } 5401 5402 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true, 5403 hlid, 5404 params->buf_size); 5405 5406 if (!ret) { 5407 *ba_bitmap |= BIT(tid); 5408 wl->ba_rx_session_count++; 5409 } 5410 break; 5411 5412 case IEEE80211_AMPDU_RX_STOP: 5413 if (!(*ba_bitmap & BIT(tid))) { 5414 /* 5415 * this happens on reconfig - so only output a debug 5416 * message for now, and don't fail the function. 5417 */ 5418 wl1271_debug(DEBUG_MAC80211, 5419 "no active RX BA session on tid: %d", 5420 tid); 5421 ret = 0; 5422 break; 5423 } 5424 5425 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false, 5426 hlid, 0); 5427 if (!ret) { 5428 *ba_bitmap &= ~BIT(tid); 5429 wl->ba_rx_session_count--; 5430 } 5431 break; 5432 5433 /* 5434 * The BA initiator session management in FW independently. 5435 * Falling break here on purpose for all TX APDU commands. 5436 */ 5437 case IEEE80211_AMPDU_TX_START: 5438 case IEEE80211_AMPDU_TX_STOP_CONT: 5439 case IEEE80211_AMPDU_TX_STOP_FLUSH: 5440 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 5441 case IEEE80211_AMPDU_TX_OPERATIONAL: 5442 ret = -EINVAL; 5443 break; 5444 5445 default: 5446 wl1271_error("Incorrect ampdu action id=%x\n", action); 5447 ret = -EINVAL; 5448 } 5449 5450 pm_runtime_mark_last_busy(wl->dev); 5451 pm_runtime_put_autosuspend(wl->dev); 5452 5453 out: 5454 mutex_unlock(&wl->mutex); 5455 5456 return ret; 5457 } 5458 5459 static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw, 5460 struct ieee80211_vif *vif, 5461 const struct cfg80211_bitrate_mask *mask) 5462 { 5463 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5464 struct wl1271 *wl = hw->priv; 5465 int i, ret = 0; 5466 5467 wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x", 5468 mask->control[NL80211_BAND_2GHZ].legacy, 5469 mask->control[NL80211_BAND_5GHZ].legacy); 5470 5471 mutex_lock(&wl->mutex); 5472 5473 for (i = 0; i < WLCORE_NUM_BANDS; i++) 5474 wlvif->bitrate_masks[i] = 5475 wl1271_tx_enabled_rates_get(wl, 5476 mask->control[i].legacy, 5477 i); 5478 5479 if (unlikely(wl->state != WLCORE_STATE_ON)) 5480 goto out; 5481 5482 if (wlvif->bss_type == BSS_TYPE_STA_BSS && 5483 !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) { 5484 5485 ret = pm_runtime_get_sync(wl->dev); 5486 if (ret < 0) { 5487 pm_runtime_put_noidle(wl->dev); 5488 goto out; 5489 } 5490 5491 wl1271_set_band_rate(wl, wlvif); 5492 wlvif->basic_rate = 5493 wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); 5494 ret = wl1271_acx_sta_rate_policies(wl, wlvif); 5495 5496 pm_runtime_mark_last_busy(wl->dev); 5497 pm_runtime_put_autosuspend(wl->dev); 5498 } 5499 out: 5500 mutex_unlock(&wl->mutex); 5501 5502 return ret; 5503 } 5504 5505 static void wl12xx_op_channel_switch(struct ieee80211_hw *hw, 5506 struct ieee80211_vif *vif, 5507 struct ieee80211_channel_switch *ch_switch) 5508 { 5509 struct wl1271 *wl = hw->priv; 5510 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5511 int ret; 5512 5513 wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch"); 5514 5515 wl1271_tx_flush(wl); 5516 5517 mutex_lock(&wl->mutex); 5518 5519 if (unlikely(wl->state == WLCORE_STATE_OFF)) { 5520 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) 5521 ieee80211_chswitch_done(vif, false); 5522 goto out; 5523 } else if (unlikely(wl->state != WLCORE_STATE_ON)) { 5524 goto out; 5525 } 5526 5527 ret = pm_runtime_get_sync(wl->dev); 5528 if (ret < 0) { 5529 pm_runtime_put_noidle(wl->dev); 5530 goto out; 5531 } 5532 5533 /* TODO: change mac80211 to pass vif as param */ 5534 5535 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) { 5536 unsigned long delay_usec; 5537 5538 ret = wl->ops->channel_switch(wl, wlvif, ch_switch); 5539 if (ret) 5540 goto out_sleep; 5541 5542 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags); 5543 5544 /* indicate failure 5 seconds after channel switch time */ 5545 delay_usec = ieee80211_tu_to_usec(wlvif->beacon_int) * 5546 ch_switch->count; 5547 ieee80211_queue_delayed_work(hw, &wlvif->channel_switch_work, 5548 usecs_to_jiffies(delay_usec) + 5549 msecs_to_jiffies(5000)); 5550 } 5551 5552 out_sleep: 5553 pm_runtime_mark_last_busy(wl->dev); 5554 pm_runtime_put_autosuspend(wl->dev); 5555 5556 out: 5557 mutex_unlock(&wl->mutex); 5558 } 5559 5560 static const void *wlcore_get_beacon_ie(struct wl1271 *wl, 5561 struct wl12xx_vif *wlvif, 5562 u8 eid) 5563 { 5564 int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable); 5565 struct sk_buff *beacon = 5566 ieee80211_beacon_get(wl->hw, wl12xx_wlvif_to_vif(wlvif)); 5567 5568 if (!beacon) 5569 return NULL; 5570 5571 return cfg80211_find_ie(eid, 5572 beacon->data + ieoffset, 5573 beacon->len - ieoffset); 5574 } 5575 5576 static int wlcore_get_csa_count(struct wl1271 *wl, struct wl12xx_vif *wlvif, 5577 u8 *csa_count) 5578 { 5579 const u8 *ie; 5580 const struct ieee80211_channel_sw_ie *ie_csa; 5581 5582 ie = wlcore_get_beacon_ie(wl, wlvif, WLAN_EID_CHANNEL_SWITCH); 5583 if (!ie) 5584 return -EINVAL; 5585 5586 ie_csa = (struct ieee80211_channel_sw_ie *)&ie[2]; 5587 *csa_count = ie_csa->count; 5588 5589 return 0; 5590 } 5591 5592 static void wlcore_op_channel_switch_beacon(struct ieee80211_hw *hw, 5593 struct ieee80211_vif *vif, 5594 struct cfg80211_chan_def *chandef) 5595 { 5596 struct wl1271 *wl = hw->priv; 5597 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5598 struct ieee80211_channel_switch ch_switch = { 5599 .block_tx = true, 5600 .chandef = *chandef, 5601 }; 5602 int ret; 5603 5604 wl1271_debug(DEBUG_MAC80211, 5605 "mac80211 channel switch beacon (role %d)", 5606 wlvif->role_id); 5607 5608 ret = wlcore_get_csa_count(wl, wlvif, &ch_switch.count); 5609 if (ret < 0) { 5610 wl1271_error("error getting beacon (for CSA counter)"); 5611 return; 5612 } 5613 5614 mutex_lock(&wl->mutex); 5615 5616 if (unlikely(wl->state != WLCORE_STATE_ON)) { 5617 ret = -EBUSY; 5618 goto out; 5619 } 5620 5621 ret = pm_runtime_get_sync(wl->dev); 5622 if (ret < 0) { 5623 pm_runtime_put_noidle(wl->dev); 5624 goto out; 5625 } 5626 5627 ret = wl->ops->channel_switch(wl, wlvif, &ch_switch); 5628 if (ret) 5629 goto out_sleep; 5630 5631 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags); 5632 5633 out_sleep: 5634 pm_runtime_mark_last_busy(wl->dev); 5635 pm_runtime_put_autosuspend(wl->dev); 5636 out: 5637 mutex_unlock(&wl->mutex); 5638 } 5639 5640 static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 5641 u32 queues, bool drop) 5642 { 5643 struct wl1271 *wl = hw->priv; 5644 5645 wl1271_tx_flush(wl); 5646 } 5647 5648 static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw, 5649 struct ieee80211_vif *vif, 5650 struct ieee80211_channel *chan, 5651 int duration, 5652 enum ieee80211_roc_type type) 5653 { 5654 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5655 struct wl1271 *wl = hw->priv; 5656 int channel, active_roc, ret = 0; 5657 5658 channel = ieee80211_frequency_to_channel(chan->center_freq); 5659 5660 wl1271_debug(DEBUG_MAC80211, "mac80211 roc %d (%d)", 5661 channel, wlvif->role_id); 5662 5663 mutex_lock(&wl->mutex); 5664 5665 if (unlikely(wl->state != WLCORE_STATE_ON)) 5666 goto out; 5667 5668 /* return EBUSY if we can't ROC right now */ 5669 active_roc = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES); 5670 if (wl->roc_vif || active_roc < WL12XX_MAX_ROLES) { 5671 wl1271_warning("active roc on role %d", active_roc); 5672 ret = -EBUSY; 5673 goto out; 5674 } 5675 5676 ret = pm_runtime_get_sync(wl->dev); 5677 if (ret < 0) { 5678 pm_runtime_put_noidle(wl->dev); 5679 goto out; 5680 } 5681 5682 ret = wl12xx_start_dev(wl, wlvif, chan->band, channel); 5683 if (ret < 0) 5684 goto out_sleep; 5685 5686 wl->roc_vif = vif; 5687 ieee80211_queue_delayed_work(hw, &wl->roc_complete_work, 5688 msecs_to_jiffies(duration)); 5689 out_sleep: 5690 pm_runtime_mark_last_busy(wl->dev); 5691 pm_runtime_put_autosuspend(wl->dev); 5692 out: 5693 mutex_unlock(&wl->mutex); 5694 return ret; 5695 } 5696 5697 static int __wlcore_roc_completed(struct wl1271 *wl) 5698 { 5699 struct wl12xx_vif *wlvif; 5700 int ret; 5701 5702 /* already completed */ 5703 if (unlikely(!wl->roc_vif)) 5704 return 0; 5705 5706 wlvif = wl12xx_vif_to_data(wl->roc_vif); 5707 5708 if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) 5709 return -EBUSY; 5710 5711 ret = wl12xx_stop_dev(wl, wlvif); 5712 if (ret < 0) 5713 return ret; 5714 5715 wl->roc_vif = NULL; 5716 5717 return 0; 5718 } 5719 5720 static int wlcore_roc_completed(struct wl1271 *wl) 5721 { 5722 int ret; 5723 5724 wl1271_debug(DEBUG_MAC80211, "roc complete"); 5725 5726 mutex_lock(&wl->mutex); 5727 5728 if (unlikely(wl->state != WLCORE_STATE_ON)) { 5729 ret = -EBUSY; 5730 goto out; 5731 } 5732 5733 ret = pm_runtime_get_sync(wl->dev); 5734 if (ret < 0) { 5735 pm_runtime_put_noidle(wl->dev); 5736 goto out; 5737 } 5738 5739 ret = __wlcore_roc_completed(wl); 5740 5741 pm_runtime_mark_last_busy(wl->dev); 5742 pm_runtime_put_autosuspend(wl->dev); 5743 out: 5744 mutex_unlock(&wl->mutex); 5745 5746 return ret; 5747 } 5748 5749 static void wlcore_roc_complete_work(struct work_struct *work) 5750 { 5751 struct delayed_work *dwork; 5752 struct wl1271 *wl; 5753 int ret; 5754 5755 dwork = to_delayed_work(work); 5756 wl = container_of(dwork, struct wl1271, roc_complete_work); 5757 5758 ret = wlcore_roc_completed(wl); 5759 if (!ret) 5760 ieee80211_remain_on_channel_expired(wl->hw); 5761 } 5762 5763 static int wlcore_op_cancel_remain_on_channel(struct ieee80211_hw *hw) 5764 { 5765 struct wl1271 *wl = hw->priv; 5766 5767 wl1271_debug(DEBUG_MAC80211, "mac80211 croc"); 5768 5769 /* TODO: per-vif */ 5770 wl1271_tx_flush(wl); 5771 5772 /* 5773 * we can't just flush_work here, because it might deadlock 5774 * (as we might get called from the same workqueue) 5775 */ 5776 cancel_delayed_work_sync(&wl->roc_complete_work); 5777 wlcore_roc_completed(wl); 5778 5779 return 0; 5780 } 5781 5782 static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw, 5783 struct ieee80211_vif *vif, 5784 struct ieee80211_sta *sta, 5785 u32 changed) 5786 { 5787 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5788 5789 wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update"); 5790 5791 if (!(changed & IEEE80211_RC_BW_CHANGED)) 5792 return; 5793 5794 /* this callback is atomic, so schedule a new work */ 5795 wlvif->rc_update_bw = sta->bandwidth; 5796 memcpy(&wlvif->rc_ht_cap, &sta->ht_cap, sizeof(sta->ht_cap)); 5797 ieee80211_queue_work(hw, &wlvif->rc_update_work); 5798 } 5799 5800 static void wlcore_op_sta_statistics(struct ieee80211_hw *hw, 5801 struct ieee80211_vif *vif, 5802 struct ieee80211_sta *sta, 5803 struct station_info *sinfo) 5804 { 5805 struct wl1271 *wl = hw->priv; 5806 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 5807 s8 rssi_dbm; 5808 int ret; 5809 5810 wl1271_debug(DEBUG_MAC80211, "mac80211 get_rssi"); 5811 5812 mutex_lock(&wl->mutex); 5813 5814 if (unlikely(wl->state != WLCORE_STATE_ON)) 5815 goto out; 5816 5817 ret = pm_runtime_get_sync(wl->dev); 5818 if (ret < 0) { 5819 pm_runtime_put_noidle(wl->dev); 5820 goto out_sleep; 5821 } 5822 5823 ret = wlcore_acx_average_rssi(wl, wlvif, &rssi_dbm); 5824 if (ret < 0) 5825 goto out_sleep; 5826 5827 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 5828 sinfo->signal = rssi_dbm; 5829 5830 out_sleep: 5831 pm_runtime_mark_last_busy(wl->dev); 5832 pm_runtime_put_autosuspend(wl->dev); 5833 5834 out: 5835 mutex_unlock(&wl->mutex); 5836 } 5837 5838 static u32 wlcore_op_get_expected_throughput(struct ieee80211_hw *hw, 5839 struct ieee80211_sta *sta) 5840 { 5841 struct wl1271_station *wl_sta = (struct wl1271_station *)sta->drv_priv; 5842 struct wl1271 *wl = hw->priv; 5843 u8 hlid = wl_sta->hlid; 5844 5845 /* return in units of Kbps */ 5846 return (wl->links[hlid].fw_rate_mbps * 1000); 5847 } 5848 5849 static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw) 5850 { 5851 struct wl1271 *wl = hw->priv; 5852 bool ret = false; 5853 5854 mutex_lock(&wl->mutex); 5855 5856 if (unlikely(wl->state != WLCORE_STATE_ON)) 5857 goto out; 5858 5859 /* packets are considered pending if in the TX queue or the FW */ 5860 ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0); 5861 out: 5862 mutex_unlock(&wl->mutex); 5863 5864 return ret; 5865 } 5866 5867 /* can't be const, mac80211 writes to this */ 5868 static struct ieee80211_rate wl1271_rates[] = { 5869 { .bitrate = 10, 5870 .hw_value = CONF_HW_BIT_RATE_1MBPS, 5871 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, }, 5872 { .bitrate = 20, 5873 .hw_value = CONF_HW_BIT_RATE_2MBPS, 5874 .hw_value_short = CONF_HW_BIT_RATE_2MBPS, 5875 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 5876 { .bitrate = 55, 5877 .hw_value = CONF_HW_BIT_RATE_5_5MBPS, 5878 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS, 5879 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 5880 { .bitrate = 110, 5881 .hw_value = CONF_HW_BIT_RATE_11MBPS, 5882 .hw_value_short = CONF_HW_BIT_RATE_11MBPS, 5883 .flags = IEEE80211_RATE_SHORT_PREAMBLE }, 5884 { .bitrate = 60, 5885 .hw_value = CONF_HW_BIT_RATE_6MBPS, 5886 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, }, 5887 { .bitrate = 90, 5888 .hw_value = CONF_HW_BIT_RATE_9MBPS, 5889 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, }, 5890 { .bitrate = 120, 5891 .hw_value = CONF_HW_BIT_RATE_12MBPS, 5892 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, }, 5893 { .bitrate = 180, 5894 .hw_value = CONF_HW_BIT_RATE_18MBPS, 5895 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, }, 5896 { .bitrate = 240, 5897 .hw_value = CONF_HW_BIT_RATE_24MBPS, 5898 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, }, 5899 { .bitrate = 360, 5900 .hw_value = CONF_HW_BIT_RATE_36MBPS, 5901 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, }, 5902 { .bitrate = 480, 5903 .hw_value = CONF_HW_BIT_RATE_48MBPS, 5904 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, }, 5905 { .bitrate = 540, 5906 .hw_value = CONF_HW_BIT_RATE_54MBPS, 5907 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, }, 5908 }; 5909 5910 /* can't be const, mac80211 writes to this */ 5911 static struct ieee80211_channel wl1271_channels[] = { 5912 { .hw_value = 1, .center_freq = 2412, .max_power = WLCORE_MAX_TXPWR }, 5913 { .hw_value = 2, .center_freq = 2417, .max_power = WLCORE_MAX_TXPWR }, 5914 { .hw_value = 3, .center_freq = 2422, .max_power = WLCORE_MAX_TXPWR }, 5915 { .hw_value = 4, .center_freq = 2427, .max_power = WLCORE_MAX_TXPWR }, 5916 { .hw_value = 5, .center_freq = 2432, .max_power = WLCORE_MAX_TXPWR }, 5917 { .hw_value = 6, .center_freq = 2437, .max_power = WLCORE_MAX_TXPWR }, 5918 { .hw_value = 7, .center_freq = 2442, .max_power = WLCORE_MAX_TXPWR }, 5919 { .hw_value = 8, .center_freq = 2447, .max_power = WLCORE_MAX_TXPWR }, 5920 { .hw_value = 9, .center_freq = 2452, .max_power = WLCORE_MAX_TXPWR }, 5921 { .hw_value = 10, .center_freq = 2457, .max_power = WLCORE_MAX_TXPWR }, 5922 { .hw_value = 11, .center_freq = 2462, .max_power = WLCORE_MAX_TXPWR }, 5923 { .hw_value = 12, .center_freq = 2467, .max_power = WLCORE_MAX_TXPWR }, 5924 { .hw_value = 13, .center_freq = 2472, .max_power = WLCORE_MAX_TXPWR }, 5925 { .hw_value = 14, .center_freq = 2484, .max_power = WLCORE_MAX_TXPWR }, 5926 }; 5927 5928 /* can't be const, mac80211 writes to this */ 5929 static struct ieee80211_supported_band wl1271_band_2ghz = { 5930 .channels = wl1271_channels, 5931 .n_channels = ARRAY_SIZE(wl1271_channels), 5932 .bitrates = wl1271_rates, 5933 .n_bitrates = ARRAY_SIZE(wl1271_rates), 5934 }; 5935 5936 /* 5 GHz data rates for WL1273 */ 5937 static struct ieee80211_rate wl1271_rates_5ghz[] = { 5938 { .bitrate = 60, 5939 .hw_value = CONF_HW_BIT_RATE_6MBPS, 5940 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, }, 5941 { .bitrate = 90, 5942 .hw_value = CONF_HW_BIT_RATE_9MBPS, 5943 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, }, 5944 { .bitrate = 120, 5945 .hw_value = CONF_HW_BIT_RATE_12MBPS, 5946 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, }, 5947 { .bitrate = 180, 5948 .hw_value = CONF_HW_BIT_RATE_18MBPS, 5949 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, }, 5950 { .bitrate = 240, 5951 .hw_value = CONF_HW_BIT_RATE_24MBPS, 5952 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, }, 5953 { .bitrate = 360, 5954 .hw_value = CONF_HW_BIT_RATE_36MBPS, 5955 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, }, 5956 { .bitrate = 480, 5957 .hw_value = CONF_HW_BIT_RATE_48MBPS, 5958 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, }, 5959 { .bitrate = 540, 5960 .hw_value = CONF_HW_BIT_RATE_54MBPS, 5961 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, }, 5962 }; 5963 5964 /* 5 GHz band channels for WL1273 */ 5965 static struct ieee80211_channel wl1271_channels_5ghz[] = { 5966 { .hw_value = 8, .center_freq = 5040, .max_power = WLCORE_MAX_TXPWR }, 5967 { .hw_value = 12, .center_freq = 5060, .max_power = WLCORE_MAX_TXPWR }, 5968 { .hw_value = 16, .center_freq = 5080, .max_power = WLCORE_MAX_TXPWR }, 5969 { .hw_value = 34, .center_freq = 5170, .max_power = WLCORE_MAX_TXPWR }, 5970 { .hw_value = 36, .center_freq = 5180, .max_power = WLCORE_MAX_TXPWR }, 5971 { .hw_value = 38, .center_freq = 5190, .max_power = WLCORE_MAX_TXPWR }, 5972 { .hw_value = 40, .center_freq = 5200, .max_power = WLCORE_MAX_TXPWR }, 5973 { .hw_value = 42, .center_freq = 5210, .max_power = WLCORE_MAX_TXPWR }, 5974 { .hw_value = 44, .center_freq = 5220, .max_power = WLCORE_MAX_TXPWR }, 5975 { .hw_value = 46, .center_freq = 5230, .max_power = WLCORE_MAX_TXPWR }, 5976 { .hw_value = 48, .center_freq = 5240, .max_power = WLCORE_MAX_TXPWR }, 5977 { .hw_value = 52, .center_freq = 5260, .max_power = WLCORE_MAX_TXPWR }, 5978 { .hw_value = 56, .center_freq = 5280, .max_power = WLCORE_MAX_TXPWR }, 5979 { .hw_value = 60, .center_freq = 5300, .max_power = WLCORE_MAX_TXPWR }, 5980 { .hw_value = 64, .center_freq = 5320, .max_power = WLCORE_MAX_TXPWR }, 5981 { .hw_value = 100, .center_freq = 5500, .max_power = WLCORE_MAX_TXPWR }, 5982 { .hw_value = 104, .center_freq = 5520, .max_power = WLCORE_MAX_TXPWR }, 5983 { .hw_value = 108, .center_freq = 5540, .max_power = WLCORE_MAX_TXPWR }, 5984 { .hw_value = 112, .center_freq = 5560, .max_power = WLCORE_MAX_TXPWR }, 5985 { .hw_value = 116, .center_freq = 5580, .max_power = WLCORE_MAX_TXPWR }, 5986 { .hw_value = 120, .center_freq = 5600, .max_power = WLCORE_MAX_TXPWR }, 5987 { .hw_value = 124, .center_freq = 5620, .max_power = WLCORE_MAX_TXPWR }, 5988 { .hw_value = 128, .center_freq = 5640, .max_power = WLCORE_MAX_TXPWR }, 5989 { .hw_value = 132, .center_freq = 5660, .max_power = WLCORE_MAX_TXPWR }, 5990 { .hw_value = 136, .center_freq = 5680, .max_power = WLCORE_MAX_TXPWR }, 5991 { .hw_value = 140, .center_freq = 5700, .max_power = WLCORE_MAX_TXPWR }, 5992 { .hw_value = 149, .center_freq = 5745, .max_power = WLCORE_MAX_TXPWR }, 5993 { .hw_value = 153, .center_freq = 5765, .max_power = WLCORE_MAX_TXPWR }, 5994 { .hw_value = 157, .center_freq = 5785, .max_power = WLCORE_MAX_TXPWR }, 5995 { .hw_value = 161, .center_freq = 5805, .max_power = WLCORE_MAX_TXPWR }, 5996 { .hw_value = 165, .center_freq = 5825, .max_power = WLCORE_MAX_TXPWR }, 5997 }; 5998 5999 static struct ieee80211_supported_band wl1271_band_5ghz = { 6000 .channels = wl1271_channels_5ghz, 6001 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz), 6002 .bitrates = wl1271_rates_5ghz, 6003 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz), 6004 }; 6005 6006 static const struct ieee80211_ops wl1271_ops = { 6007 .start = wl1271_op_start, 6008 .stop = wlcore_op_stop, 6009 .add_interface = wl1271_op_add_interface, 6010 .remove_interface = wl1271_op_remove_interface, 6011 .change_interface = wl12xx_op_change_interface, 6012 #ifdef CONFIG_PM 6013 .suspend = wl1271_op_suspend, 6014 .resume = wl1271_op_resume, 6015 #endif 6016 .config = wl1271_op_config, 6017 .prepare_multicast = wl1271_op_prepare_multicast, 6018 .configure_filter = wl1271_op_configure_filter, 6019 .tx = wl1271_op_tx, 6020 .set_key = wlcore_op_set_key, 6021 .hw_scan = wl1271_op_hw_scan, 6022 .cancel_hw_scan = wl1271_op_cancel_hw_scan, 6023 .sched_scan_start = wl1271_op_sched_scan_start, 6024 .sched_scan_stop = wl1271_op_sched_scan_stop, 6025 .bss_info_changed = wl1271_op_bss_info_changed, 6026 .set_frag_threshold = wl1271_op_set_frag_threshold, 6027 .set_rts_threshold = wl1271_op_set_rts_threshold, 6028 .conf_tx = wl1271_op_conf_tx, 6029 .get_tsf = wl1271_op_get_tsf, 6030 .get_survey = wl1271_op_get_survey, 6031 .sta_state = wl12xx_op_sta_state, 6032 .ampdu_action = wl1271_op_ampdu_action, 6033 .tx_frames_pending = wl1271_tx_frames_pending, 6034 .set_bitrate_mask = wl12xx_set_bitrate_mask, 6035 .set_default_unicast_key = wl1271_op_set_default_key_idx, 6036 .channel_switch = wl12xx_op_channel_switch, 6037 .channel_switch_beacon = wlcore_op_channel_switch_beacon, 6038 .flush = wlcore_op_flush, 6039 .remain_on_channel = wlcore_op_remain_on_channel, 6040 .cancel_remain_on_channel = wlcore_op_cancel_remain_on_channel, 6041 .add_chanctx = wlcore_op_add_chanctx, 6042 .remove_chanctx = wlcore_op_remove_chanctx, 6043 .change_chanctx = wlcore_op_change_chanctx, 6044 .assign_vif_chanctx = wlcore_op_assign_vif_chanctx, 6045 .unassign_vif_chanctx = wlcore_op_unassign_vif_chanctx, 6046 .switch_vif_chanctx = wlcore_op_switch_vif_chanctx, 6047 .sta_rc_update = wlcore_op_sta_rc_update, 6048 .sta_statistics = wlcore_op_sta_statistics, 6049 .get_expected_throughput = wlcore_op_get_expected_throughput, 6050 CFG80211_TESTMODE_CMD(wl1271_tm_cmd) 6051 }; 6052 6053 6054 u8 wlcore_rate_to_idx(struct wl1271 *wl, u8 rate, enum nl80211_band band) 6055 { 6056 u8 idx; 6057 6058 BUG_ON(band >= 2); 6059 6060 if (unlikely(rate >= wl->hw_tx_rate_tbl_size)) { 6061 wl1271_error("Illegal RX rate from HW: %d", rate); 6062 return 0; 6063 } 6064 6065 idx = wl->band_rate_to_idx[band][rate]; 6066 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) { 6067 wl1271_error("Unsupported RX rate from HW: %d", rate); 6068 return 0; 6069 } 6070 6071 return idx; 6072 } 6073 6074 static void wl12xx_derive_mac_addresses(struct wl1271 *wl, u32 oui, u32 nic) 6075 { 6076 int i; 6077 6078 wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x", 6079 oui, nic); 6080 6081 if (nic + WLCORE_NUM_MAC_ADDRESSES - wl->num_mac_addr > 0xffffff) 6082 wl1271_warning("NIC part of the MAC address wraps around!"); 6083 6084 for (i = 0; i < wl->num_mac_addr; i++) { 6085 wl->addresses[i].addr[0] = (u8)(oui >> 16); 6086 wl->addresses[i].addr[1] = (u8)(oui >> 8); 6087 wl->addresses[i].addr[2] = (u8) oui; 6088 wl->addresses[i].addr[3] = (u8)(nic >> 16); 6089 wl->addresses[i].addr[4] = (u8)(nic >> 8); 6090 wl->addresses[i].addr[5] = (u8) nic; 6091 nic++; 6092 } 6093 6094 /* we may be one address short at the most */ 6095 WARN_ON(wl->num_mac_addr + 1 < WLCORE_NUM_MAC_ADDRESSES); 6096 6097 /* 6098 * turn on the LAA bit in the first address and use it as 6099 * the last address. 6100 */ 6101 if (wl->num_mac_addr < WLCORE_NUM_MAC_ADDRESSES) { 6102 int idx = WLCORE_NUM_MAC_ADDRESSES - 1; 6103 memcpy(&wl->addresses[idx], &wl->addresses[0], 6104 sizeof(wl->addresses[0])); 6105 /* LAA bit */ 6106 wl->addresses[idx].addr[0] |= BIT(1); 6107 } 6108 6109 wl->hw->wiphy->n_addresses = WLCORE_NUM_MAC_ADDRESSES; 6110 wl->hw->wiphy->addresses = wl->addresses; 6111 } 6112 6113 static int wl12xx_get_hw_info(struct wl1271 *wl) 6114 { 6115 int ret; 6116 6117 ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &wl->chip.id); 6118 if (ret < 0) 6119 goto out; 6120 6121 wl->fuse_oui_addr = 0; 6122 wl->fuse_nic_addr = 0; 6123 6124 ret = wl->ops->get_pg_ver(wl, &wl->hw_pg_ver); 6125 if (ret < 0) 6126 goto out; 6127 6128 if (wl->ops->get_mac) 6129 ret = wl->ops->get_mac(wl); 6130 6131 out: 6132 return ret; 6133 } 6134 6135 static int wl1271_register_hw(struct wl1271 *wl) 6136 { 6137 int ret; 6138 u32 oui_addr = 0, nic_addr = 0; 6139 struct platform_device *pdev = wl->pdev; 6140 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev); 6141 6142 if (wl->mac80211_registered) 6143 return 0; 6144 6145 if (wl->nvs_len >= 12) { 6146 /* NOTE: The wl->nvs->nvs element must be first, in 6147 * order to simplify the casting, we assume it is at 6148 * the beginning of the wl->nvs structure. 6149 */ 6150 u8 *nvs_ptr = (u8 *)wl->nvs; 6151 6152 oui_addr = 6153 (nvs_ptr[11] << 16) + (nvs_ptr[10] << 8) + nvs_ptr[6]; 6154 nic_addr = 6155 (nvs_ptr[5] << 16) + (nvs_ptr[4] << 8) + nvs_ptr[3]; 6156 } 6157 6158 /* if the MAC address is zeroed in the NVS derive from fuse */ 6159 if (oui_addr == 0 && nic_addr == 0) { 6160 oui_addr = wl->fuse_oui_addr; 6161 /* fuse has the BD_ADDR, the WLAN addresses are the next two */ 6162 nic_addr = wl->fuse_nic_addr + 1; 6163 } 6164 6165 if (oui_addr == 0xdeadbe && nic_addr == 0xef0000) { 6166 wl1271_warning("Detected unconfigured mac address in nvs, derive from fuse instead."); 6167 if (!strcmp(pdev_data->family->name, "wl18xx")) { 6168 wl1271_warning("This default nvs file can be removed from the file system"); 6169 } else { 6170 wl1271_warning("Your device performance is not optimized."); 6171 wl1271_warning("Please use the calibrator tool to configure your device."); 6172 } 6173 6174 if (wl->fuse_oui_addr == 0 && wl->fuse_nic_addr == 0) { 6175 wl1271_warning("Fuse mac address is zero. using random mac"); 6176 /* Use TI oui and a random nic */ 6177 oui_addr = WLCORE_TI_OUI_ADDRESS; 6178 nic_addr = get_random_int(); 6179 } else { 6180 oui_addr = wl->fuse_oui_addr; 6181 /* fuse has the BD_ADDR, the WLAN addresses are the next two */ 6182 nic_addr = wl->fuse_nic_addr + 1; 6183 } 6184 } 6185 6186 wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr); 6187 6188 ret = ieee80211_register_hw(wl->hw); 6189 if (ret < 0) { 6190 wl1271_error("unable to register mac80211 hw: %d", ret); 6191 goto out; 6192 } 6193 6194 wl->mac80211_registered = true; 6195 6196 wl1271_debugfs_init(wl); 6197 6198 wl1271_notice("loaded"); 6199 6200 out: 6201 return ret; 6202 } 6203 6204 static void wl1271_unregister_hw(struct wl1271 *wl) 6205 { 6206 if (wl->plt) 6207 wl1271_plt_stop(wl); 6208 6209 ieee80211_unregister_hw(wl->hw); 6210 wl->mac80211_registered = false; 6211 6212 } 6213 6214 static int wl1271_init_ieee80211(struct wl1271 *wl) 6215 { 6216 int i; 6217 static const u32 cipher_suites[] = { 6218 WLAN_CIPHER_SUITE_WEP40, 6219 WLAN_CIPHER_SUITE_WEP104, 6220 WLAN_CIPHER_SUITE_TKIP, 6221 WLAN_CIPHER_SUITE_CCMP, 6222 WL1271_CIPHER_SUITE_GEM, 6223 }; 6224 6225 /* The tx descriptor buffer */ 6226 wl->hw->extra_tx_headroom = sizeof(struct wl1271_tx_hw_descr); 6227 6228 if (wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) 6229 wl->hw->extra_tx_headroom += WL1271_EXTRA_SPACE_TKIP; 6230 6231 /* unit us */ 6232 /* FIXME: find a proper value */ 6233 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval; 6234 6235 ieee80211_hw_set(wl->hw, SUPPORT_FAST_XMIT); 6236 ieee80211_hw_set(wl->hw, CHANCTX_STA_CSA); 6237 ieee80211_hw_set(wl->hw, QUEUE_CONTROL); 6238 ieee80211_hw_set(wl->hw, TX_AMPDU_SETUP_IN_HW); 6239 ieee80211_hw_set(wl->hw, AMPDU_AGGREGATION); 6240 ieee80211_hw_set(wl->hw, AP_LINK_PS); 6241 ieee80211_hw_set(wl->hw, SPECTRUM_MGMT); 6242 ieee80211_hw_set(wl->hw, REPORTS_TX_ACK_STATUS); 6243 ieee80211_hw_set(wl->hw, CONNECTION_MONITOR); 6244 ieee80211_hw_set(wl->hw, HAS_RATE_CONTROL); 6245 ieee80211_hw_set(wl->hw, SUPPORTS_DYNAMIC_PS); 6246 ieee80211_hw_set(wl->hw, SIGNAL_DBM); 6247 ieee80211_hw_set(wl->hw, SUPPORTS_PS); 6248 ieee80211_hw_set(wl->hw, SUPPORTS_TX_FRAG); 6249 6250 wl->hw->wiphy->cipher_suites = cipher_suites; 6251 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); 6252 6253 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 6254 BIT(NL80211_IFTYPE_AP) | 6255 BIT(NL80211_IFTYPE_P2P_DEVICE) | 6256 BIT(NL80211_IFTYPE_P2P_CLIENT) | 6257 #ifdef CONFIG_MAC80211_MESH 6258 BIT(NL80211_IFTYPE_MESH_POINT) | 6259 #endif 6260 BIT(NL80211_IFTYPE_P2P_GO); 6261 6262 wl->hw->wiphy->max_scan_ssids = 1; 6263 wl->hw->wiphy->max_sched_scan_ssids = 16; 6264 wl->hw->wiphy->max_match_sets = 16; 6265 /* 6266 * Maximum length of elements in scanning probe request templates 6267 * should be the maximum length possible for a template, without 6268 * the IEEE80211 header of the template 6269 */ 6270 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE - 6271 sizeof(struct ieee80211_header); 6272 6273 wl->hw->wiphy->max_sched_scan_reqs = 1; 6274 wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE - 6275 sizeof(struct ieee80211_header); 6276 6277 wl->hw->wiphy->max_remain_on_channel_duration = 30000; 6278 6279 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD | 6280 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | 6281 WIPHY_FLAG_HAS_CHANNEL_SWITCH; 6282 6283 wl->hw->wiphy->features |= NL80211_FEATURE_AP_SCAN; 6284 6285 /* make sure all our channels fit in the scanned_ch bitmask */ 6286 BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) + 6287 ARRAY_SIZE(wl1271_channels_5ghz) > 6288 WL1271_MAX_CHANNELS); 6289 /* 6290 * clear channel flags from the previous usage 6291 * and restore max_power & max_antenna_gain values. 6292 */ 6293 for (i = 0; i < ARRAY_SIZE(wl1271_channels); i++) { 6294 wl1271_band_2ghz.channels[i].flags = 0; 6295 wl1271_band_2ghz.channels[i].max_power = WLCORE_MAX_TXPWR; 6296 wl1271_band_2ghz.channels[i].max_antenna_gain = 0; 6297 } 6298 6299 for (i = 0; i < ARRAY_SIZE(wl1271_channels_5ghz); i++) { 6300 wl1271_band_5ghz.channels[i].flags = 0; 6301 wl1271_band_5ghz.channels[i].max_power = WLCORE_MAX_TXPWR; 6302 wl1271_band_5ghz.channels[i].max_antenna_gain = 0; 6303 } 6304 6305 /* 6306 * We keep local copies of the band structs because we need to 6307 * modify them on a per-device basis. 6308 */ 6309 memcpy(&wl->bands[NL80211_BAND_2GHZ], &wl1271_band_2ghz, 6310 sizeof(wl1271_band_2ghz)); 6311 memcpy(&wl->bands[NL80211_BAND_2GHZ].ht_cap, 6312 &wl->ht_cap[NL80211_BAND_2GHZ], 6313 sizeof(*wl->ht_cap)); 6314 memcpy(&wl->bands[NL80211_BAND_5GHZ], &wl1271_band_5ghz, 6315 sizeof(wl1271_band_5ghz)); 6316 memcpy(&wl->bands[NL80211_BAND_5GHZ].ht_cap, 6317 &wl->ht_cap[NL80211_BAND_5GHZ], 6318 sizeof(*wl->ht_cap)); 6319 6320 wl->hw->wiphy->bands[NL80211_BAND_2GHZ] = 6321 &wl->bands[NL80211_BAND_2GHZ]; 6322 wl->hw->wiphy->bands[NL80211_BAND_5GHZ] = 6323 &wl->bands[NL80211_BAND_5GHZ]; 6324 6325 /* 6326 * allow 4 queues per mac address we support + 6327 * 1 cab queue per mac + one global offchannel Tx queue 6328 */ 6329 wl->hw->queues = (NUM_TX_QUEUES + 1) * WLCORE_NUM_MAC_ADDRESSES + 1; 6330 6331 /* the last queue is the offchannel queue */ 6332 wl->hw->offchannel_tx_hw_queue = wl->hw->queues - 1; 6333 wl->hw->max_rates = 1; 6334 6335 wl->hw->wiphy->reg_notifier = wl1271_reg_notify; 6336 6337 /* the FW answers probe-requests in AP-mode */ 6338 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD; 6339 wl->hw->wiphy->probe_resp_offload = 6340 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | 6341 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 | 6342 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P; 6343 6344 /* allowed interface combinations */ 6345 wl->hw->wiphy->iface_combinations = wl->iface_combinations; 6346 wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations; 6347 6348 /* register vendor commands */ 6349 wlcore_set_vendor_commands(wl->hw->wiphy); 6350 6351 SET_IEEE80211_DEV(wl->hw, wl->dev); 6352 6353 wl->hw->sta_data_size = sizeof(struct wl1271_station); 6354 wl->hw->vif_data_size = sizeof(struct wl12xx_vif); 6355 6356 wl->hw->max_rx_aggregation_subframes = wl->conf.ht.rx_ba_win_size; 6357 6358 return 0; 6359 } 6360 6361 struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size, u32 aggr_buf_size, 6362 u32 mbox_size) 6363 { 6364 struct ieee80211_hw *hw; 6365 struct wl1271 *wl; 6366 int i, j, ret; 6367 unsigned int order; 6368 6369 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops); 6370 if (!hw) { 6371 wl1271_error("could not alloc ieee80211_hw"); 6372 ret = -ENOMEM; 6373 goto err_hw_alloc; 6374 } 6375 6376 wl = hw->priv; 6377 memset(wl, 0, sizeof(*wl)); 6378 6379 wl->priv = kzalloc(priv_size, GFP_KERNEL); 6380 if (!wl->priv) { 6381 wl1271_error("could not alloc wl priv"); 6382 ret = -ENOMEM; 6383 goto err_priv_alloc; 6384 } 6385 6386 INIT_LIST_HEAD(&wl->wlvif_list); 6387 6388 wl->hw = hw; 6389 6390 /* 6391 * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS. 6392 * we don't allocate any additional resource here, so that's fine. 6393 */ 6394 for (i = 0; i < NUM_TX_QUEUES; i++) 6395 for (j = 0; j < WLCORE_MAX_LINKS; j++) 6396 skb_queue_head_init(&wl->links[j].tx_queue[i]); 6397 6398 skb_queue_head_init(&wl->deferred_rx_queue); 6399 skb_queue_head_init(&wl->deferred_tx_queue); 6400 6401 INIT_WORK(&wl->netstack_work, wl1271_netstack_work); 6402 INIT_WORK(&wl->tx_work, wl1271_tx_work); 6403 INIT_WORK(&wl->recovery_work, wl1271_recovery_work); 6404 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work); 6405 INIT_DELAYED_WORK(&wl->roc_complete_work, wlcore_roc_complete_work); 6406 INIT_DELAYED_WORK(&wl->tx_watchdog_work, wl12xx_tx_watchdog_work); 6407 6408 wl->freezable_wq = create_freezable_workqueue("wl12xx_wq"); 6409 if (!wl->freezable_wq) { 6410 ret = -ENOMEM; 6411 goto err_hw; 6412 } 6413 6414 wl->channel = 0; 6415 wl->rx_counter = 0; 6416 wl->power_level = WL1271_DEFAULT_POWER_LEVEL; 6417 wl->band = NL80211_BAND_2GHZ; 6418 wl->channel_type = NL80211_CHAN_NO_HT; 6419 wl->flags = 0; 6420 wl->sg_enabled = true; 6421 wl->sleep_auth = WL1271_PSM_ILLEGAL; 6422 wl->recovery_count = 0; 6423 wl->hw_pg_ver = -1; 6424 wl->ap_ps_map = 0; 6425 wl->ap_fw_ps_map = 0; 6426 wl->quirks = 0; 6427 wl->system_hlid = WL12XX_SYSTEM_HLID; 6428 wl->active_sta_count = 0; 6429 wl->active_link_count = 0; 6430 wl->fwlog_size = 0; 6431 6432 /* The system link is always allocated */ 6433 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map); 6434 6435 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map)); 6436 for (i = 0; i < wl->num_tx_desc; i++) 6437 wl->tx_frames[i] = NULL; 6438 6439 spin_lock_init(&wl->wl_lock); 6440 6441 wl->state = WLCORE_STATE_OFF; 6442 wl->fw_type = WL12XX_FW_TYPE_NONE; 6443 mutex_init(&wl->mutex); 6444 mutex_init(&wl->flush_mutex); 6445 init_completion(&wl->nvs_loading_complete); 6446 6447 order = get_order(aggr_buf_size); 6448 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order); 6449 if (!wl->aggr_buf) { 6450 ret = -ENOMEM; 6451 goto err_wq; 6452 } 6453 wl->aggr_buf_size = aggr_buf_size; 6454 6455 wl->dummy_packet = wl12xx_alloc_dummy_packet(wl); 6456 if (!wl->dummy_packet) { 6457 ret = -ENOMEM; 6458 goto err_aggr; 6459 } 6460 6461 /* Allocate one page for the FW log */ 6462 wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL); 6463 if (!wl->fwlog) { 6464 ret = -ENOMEM; 6465 goto err_dummy_packet; 6466 } 6467 6468 wl->mbox_size = mbox_size; 6469 wl->mbox = kmalloc(wl->mbox_size, GFP_KERNEL | GFP_DMA); 6470 if (!wl->mbox) { 6471 ret = -ENOMEM; 6472 goto err_fwlog; 6473 } 6474 6475 wl->buffer_32 = kmalloc(sizeof(*wl->buffer_32), GFP_KERNEL); 6476 if (!wl->buffer_32) { 6477 ret = -ENOMEM; 6478 goto err_mbox; 6479 } 6480 6481 return hw; 6482 6483 err_mbox: 6484 kfree(wl->mbox); 6485 6486 err_fwlog: 6487 free_page((unsigned long)wl->fwlog); 6488 6489 err_dummy_packet: 6490 dev_kfree_skb(wl->dummy_packet); 6491 6492 err_aggr: 6493 free_pages((unsigned long)wl->aggr_buf, order); 6494 6495 err_wq: 6496 destroy_workqueue(wl->freezable_wq); 6497 6498 err_hw: 6499 wl1271_debugfs_exit(wl); 6500 kfree(wl->priv); 6501 6502 err_priv_alloc: 6503 ieee80211_free_hw(hw); 6504 6505 err_hw_alloc: 6506 6507 return ERR_PTR(ret); 6508 } 6509 EXPORT_SYMBOL_GPL(wlcore_alloc_hw); 6510 6511 int wlcore_free_hw(struct wl1271 *wl) 6512 { 6513 /* Unblock any fwlog readers */ 6514 mutex_lock(&wl->mutex); 6515 wl->fwlog_size = -1; 6516 mutex_unlock(&wl->mutex); 6517 6518 wlcore_sysfs_free(wl); 6519 6520 kfree(wl->buffer_32); 6521 kfree(wl->mbox); 6522 free_page((unsigned long)wl->fwlog); 6523 dev_kfree_skb(wl->dummy_packet); 6524 free_pages((unsigned long)wl->aggr_buf, get_order(wl->aggr_buf_size)); 6525 6526 wl1271_debugfs_exit(wl); 6527 6528 vfree(wl->fw); 6529 wl->fw = NULL; 6530 wl->fw_type = WL12XX_FW_TYPE_NONE; 6531 kfree(wl->nvs); 6532 wl->nvs = NULL; 6533 6534 kfree(wl->raw_fw_status); 6535 kfree(wl->fw_status); 6536 kfree(wl->tx_res_if); 6537 destroy_workqueue(wl->freezable_wq); 6538 6539 kfree(wl->priv); 6540 ieee80211_free_hw(wl->hw); 6541 6542 return 0; 6543 } 6544 EXPORT_SYMBOL_GPL(wlcore_free_hw); 6545 6546 #ifdef CONFIG_PM 6547 static const struct wiphy_wowlan_support wlcore_wowlan_support = { 6548 .flags = WIPHY_WOWLAN_ANY, 6549 .n_patterns = WL1271_MAX_RX_FILTERS, 6550 .pattern_min_len = 1, 6551 .pattern_max_len = WL1271_RX_FILTER_MAX_PATTERN_SIZE, 6552 }; 6553 #endif 6554 6555 static irqreturn_t wlcore_hardirq(int irq, void *cookie) 6556 { 6557 return IRQ_WAKE_THREAD; 6558 } 6559 6560 static void wlcore_nvs_cb(const struct firmware *fw, void *context) 6561 { 6562 struct wl1271 *wl = context; 6563 struct platform_device *pdev = wl->pdev; 6564 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev); 6565 struct resource *res; 6566 6567 int ret; 6568 irq_handler_t hardirq_fn = NULL; 6569 6570 if (fw) { 6571 wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL); 6572 if (!wl->nvs) { 6573 wl1271_error("Could not allocate nvs data"); 6574 goto out; 6575 } 6576 wl->nvs_len = fw->size; 6577 } else if (pdev_data->family->nvs_name) { 6578 wl1271_debug(DEBUG_BOOT, "Could not get nvs file %s", 6579 pdev_data->family->nvs_name); 6580 wl->nvs = NULL; 6581 wl->nvs_len = 0; 6582 } else { 6583 wl->nvs = NULL; 6584 wl->nvs_len = 0; 6585 } 6586 6587 ret = wl->ops->setup(wl); 6588 if (ret < 0) 6589 goto out_free_nvs; 6590 6591 BUG_ON(wl->num_tx_desc > WLCORE_MAX_TX_DESCRIPTORS); 6592 6593 /* adjust some runtime configuration parameters */ 6594 wlcore_adjust_conf(wl); 6595 6596 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 6597 if (!res) { 6598 wl1271_error("Could not get IRQ resource"); 6599 goto out_free_nvs; 6600 } 6601 6602 wl->irq = res->start; 6603 wl->irq_flags = res->flags & IRQF_TRIGGER_MASK; 6604 wl->if_ops = pdev_data->if_ops; 6605 6606 if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) 6607 hardirq_fn = wlcore_hardirq; 6608 else 6609 wl->irq_flags |= IRQF_ONESHOT; 6610 6611 ret = wl12xx_set_power_on(wl); 6612 if (ret < 0) 6613 goto out_free_nvs; 6614 6615 ret = wl12xx_get_hw_info(wl); 6616 if (ret < 0) { 6617 wl1271_error("couldn't get hw info"); 6618 wl1271_power_off(wl); 6619 goto out_free_nvs; 6620 } 6621 6622 ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq, 6623 wl->irq_flags, pdev->name, wl); 6624 if (ret < 0) { 6625 wl1271_error("interrupt configuration failed"); 6626 wl1271_power_off(wl); 6627 goto out_free_nvs; 6628 } 6629 6630 #ifdef CONFIG_PM 6631 device_init_wakeup(wl->dev, true); 6632 6633 ret = enable_irq_wake(wl->irq); 6634 if (!ret) { 6635 wl->irq_wake_enabled = true; 6636 if (pdev_data->pwr_in_suspend) 6637 wl->hw->wiphy->wowlan = &wlcore_wowlan_support; 6638 } 6639 6640 res = platform_get_resource(pdev, IORESOURCE_IRQ, 1); 6641 if (res) { 6642 wl->wakeirq = res->start; 6643 wl->wakeirq_flags = res->flags & IRQF_TRIGGER_MASK; 6644 ret = dev_pm_set_dedicated_wake_irq(wl->dev, wl->wakeirq); 6645 if (ret) 6646 wl->wakeirq = -ENODEV; 6647 } else { 6648 wl->wakeirq = -ENODEV; 6649 } 6650 #endif 6651 disable_irq(wl->irq); 6652 wl1271_power_off(wl); 6653 6654 ret = wl->ops->identify_chip(wl); 6655 if (ret < 0) 6656 goto out_irq; 6657 6658 ret = wl1271_init_ieee80211(wl); 6659 if (ret) 6660 goto out_irq; 6661 6662 ret = wl1271_register_hw(wl); 6663 if (ret) 6664 goto out_irq; 6665 6666 ret = wlcore_sysfs_init(wl); 6667 if (ret) 6668 goto out_unreg; 6669 6670 wl->initialized = true; 6671 goto out; 6672 6673 out_unreg: 6674 wl1271_unregister_hw(wl); 6675 6676 out_irq: 6677 if (wl->wakeirq >= 0) 6678 dev_pm_clear_wake_irq(wl->dev); 6679 device_init_wakeup(wl->dev, false); 6680 free_irq(wl->irq, wl); 6681 6682 out_free_nvs: 6683 kfree(wl->nvs); 6684 6685 out: 6686 release_firmware(fw); 6687 complete_all(&wl->nvs_loading_complete); 6688 } 6689 6690 static int __maybe_unused wlcore_runtime_suspend(struct device *dev) 6691 { 6692 struct wl1271 *wl = dev_get_drvdata(dev); 6693 struct wl12xx_vif *wlvif; 6694 int error; 6695 6696 /* We do not enter elp sleep in PLT mode */ 6697 if (wl->plt) 6698 return 0; 6699 6700 /* Nothing to do if no ELP mode requested */ 6701 if (wl->sleep_auth != WL1271_PSM_ELP) 6702 return 0; 6703 6704 wl12xx_for_each_wlvif(wl, wlvif) { 6705 if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) && 6706 test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags)) 6707 return -EBUSY; 6708 } 6709 6710 wl1271_debug(DEBUG_PSM, "chip to elp"); 6711 error = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP); 6712 if (error < 0) { 6713 wl12xx_queue_recovery_work(wl); 6714 6715 return error; 6716 } 6717 6718 set_bit(WL1271_FLAG_IN_ELP, &wl->flags); 6719 6720 return 0; 6721 } 6722 6723 static int __maybe_unused wlcore_runtime_resume(struct device *dev) 6724 { 6725 struct wl1271 *wl = dev_get_drvdata(dev); 6726 DECLARE_COMPLETION_ONSTACK(compl); 6727 unsigned long flags; 6728 int ret; 6729 unsigned long start_time = jiffies; 6730 bool pending = false; 6731 bool recovery = false; 6732 6733 /* Nothing to do if no ELP mode requested */ 6734 if (!test_bit(WL1271_FLAG_IN_ELP, &wl->flags)) 6735 return 0; 6736 6737 wl1271_debug(DEBUG_PSM, "waking up chip from elp"); 6738 6739 spin_lock_irqsave(&wl->wl_lock, flags); 6740 if (test_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags)) 6741 pending = true; 6742 else 6743 wl->elp_compl = &compl; 6744 spin_unlock_irqrestore(&wl->wl_lock, flags); 6745 6746 ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP); 6747 if (ret < 0) { 6748 recovery = true; 6749 goto err; 6750 } 6751 6752 if (!pending) { 6753 ret = wait_for_completion_timeout(&compl, 6754 msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT)); 6755 if (ret == 0) { 6756 wl1271_warning("ELP wakeup timeout!"); 6757 6758 /* Return no error for runtime PM for recovery */ 6759 ret = 0; 6760 recovery = true; 6761 goto err; 6762 } 6763 } 6764 6765 clear_bit(WL1271_FLAG_IN_ELP, &wl->flags); 6766 6767 wl1271_debug(DEBUG_PSM, "wakeup time: %u ms", 6768 jiffies_to_msecs(jiffies - start_time)); 6769 6770 return 0; 6771 6772 err: 6773 spin_lock_irqsave(&wl->wl_lock, flags); 6774 wl->elp_compl = NULL; 6775 spin_unlock_irqrestore(&wl->wl_lock, flags); 6776 6777 if (recovery) { 6778 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags); 6779 wl12xx_queue_recovery_work(wl); 6780 } 6781 6782 return ret; 6783 } 6784 6785 static const struct dev_pm_ops wlcore_pm_ops = { 6786 SET_RUNTIME_PM_OPS(wlcore_runtime_suspend, 6787 wlcore_runtime_resume, 6788 NULL) 6789 }; 6790 6791 int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev) 6792 { 6793 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev); 6794 const char *nvs_name; 6795 int ret = 0; 6796 6797 if (!wl->ops || !wl->ptable || !pdev_data) 6798 return -EINVAL; 6799 6800 wl->dev = &pdev->dev; 6801 wl->pdev = pdev; 6802 platform_set_drvdata(pdev, wl); 6803 6804 if (pdev_data->family && pdev_data->family->nvs_name) { 6805 nvs_name = pdev_data->family->nvs_name; 6806 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, 6807 nvs_name, &pdev->dev, GFP_KERNEL, 6808 wl, wlcore_nvs_cb); 6809 if (ret < 0) { 6810 wl1271_error("request_firmware_nowait failed for %s: %d", 6811 nvs_name, ret); 6812 complete_all(&wl->nvs_loading_complete); 6813 } 6814 } else { 6815 wlcore_nvs_cb(NULL, wl); 6816 } 6817 6818 wl->dev->driver->pm = &wlcore_pm_ops; 6819 pm_runtime_set_autosuspend_delay(wl->dev, 50); 6820 pm_runtime_use_autosuspend(wl->dev); 6821 pm_runtime_enable(wl->dev); 6822 6823 return ret; 6824 } 6825 EXPORT_SYMBOL_GPL(wlcore_probe); 6826 6827 int wlcore_remove(struct platform_device *pdev) 6828 { 6829 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev); 6830 struct wl1271 *wl = platform_get_drvdata(pdev); 6831 int error; 6832 6833 error = pm_runtime_get_sync(wl->dev); 6834 if (error < 0) 6835 dev_warn(wl->dev, "PM runtime failed: %i\n", error); 6836 6837 wl->dev->driver->pm = NULL; 6838 6839 if (pdev_data->family && pdev_data->family->nvs_name) 6840 wait_for_completion(&wl->nvs_loading_complete); 6841 if (!wl->initialized) 6842 return 0; 6843 6844 if (wl->wakeirq >= 0) { 6845 dev_pm_clear_wake_irq(wl->dev); 6846 wl->wakeirq = -ENODEV; 6847 } 6848 6849 device_init_wakeup(wl->dev, false); 6850 6851 if (wl->irq_wake_enabled) 6852 disable_irq_wake(wl->irq); 6853 6854 wl1271_unregister_hw(wl); 6855 6856 pm_runtime_put_sync(wl->dev); 6857 pm_runtime_dont_use_autosuspend(wl->dev); 6858 pm_runtime_disable(wl->dev); 6859 6860 free_irq(wl->irq, wl); 6861 wlcore_free_hw(wl); 6862 6863 return 0; 6864 } 6865 EXPORT_SYMBOL_GPL(wlcore_remove); 6866 6867 u32 wl12xx_debug_level = DEBUG_NONE; 6868 EXPORT_SYMBOL_GPL(wl12xx_debug_level); 6869 module_param_named(debug_level, wl12xx_debug_level, uint, 0600); 6870 MODULE_PARM_DESC(debug_level, "wl12xx debugging level"); 6871 6872 module_param_named(fwlog, fwlog_param, charp, 0); 6873 MODULE_PARM_DESC(fwlog, 6874 "FW logger options: continuous, dbgpins or disable"); 6875 6876 module_param(fwlog_mem_blocks, int, 0600); 6877 MODULE_PARM_DESC(fwlog_mem_blocks, "fwlog mem_blocks"); 6878 6879 module_param(bug_on_recovery, int, 0600); 6880 MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery"); 6881 6882 module_param(no_recovery, int, 0600); 6883 MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck."); 6884 6885 MODULE_LICENSE("GPL"); 6886 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 6887 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>"); 6888