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