H A D | sdio.c | 188 static struct bus_request *ath6kl_sdio_alloc_busreq(struct ath6kl_sdio *ar_sdio) ath6kl_sdio_alloc_busreq() argument 192 spin_lock_bh(&ar_sdio->lock); ath6kl_sdio_alloc_busreq() 194 if (list_empty(&ar_sdio->bus_req_freeq)) { ath6kl_sdio_alloc_busreq() 195 spin_unlock_bh(&ar_sdio->lock); ath6kl_sdio_alloc_busreq() 199 bus_req = list_first_entry(&ar_sdio->bus_req_freeq, ath6kl_sdio_alloc_busreq() 203 spin_unlock_bh(&ar_sdio->lock); ath6kl_sdio_alloc_busreq() 210 static void ath6kl_sdio_free_bus_req(struct ath6kl_sdio *ar_sdio, ath6kl_sdio_free_bus_req() argument 216 spin_lock_bh(&ar_sdio->lock); ath6kl_sdio_free_bus_req() 217 list_add_tail(&bus_req->list, &ar_sdio->bus_req_freeq); ath6kl_sdio_free_bus_req() 218 spin_unlock_bh(&ar_sdio->lock); ath6kl_sdio_free_bus_req() 258 static int ath6kl_sdio_scat_rw(struct ath6kl_sdio *ar_sdio, ath6kl_sdio_scat_rw() argument 275 status = ath6kl_sdio_io(ar_sdio->func, scat_req->req, ath6kl_sdio_scat_rw() 302 ath6kl_sdio_set_cmd53_arg(&cmd.arg, rw, ar_sdio->func->num, ath6kl_sdio_scat_rw() 312 sdio_claim_host(ar_sdio->func); ath6kl_sdio_scat_rw() 314 mmc_set_data_timeout(&data, ar_sdio->func->card); ath6kl_sdio_scat_rw() 323 mmc_wait_for_req(ar_sdio->func->card->host, &mmc_req); ath6kl_sdio_scat_rw() 325 sdio_release_host(ar_sdio->func); ath6kl_sdio_scat_rw() 337 scat_req->complete(ar_sdio->ar->htc_target, scat_req); ath6kl_sdio_scat_rw() 342 static int ath6kl_sdio_alloc_prep_scat_req(struct ath6kl_sdio *ar_sdio, ath6kl_sdio_alloc_prep_scat_req() argument 386 bus_req = ath6kl_sdio_alloc_busreq(ar_sdio); ath6kl_sdio_alloc_prep_scat_req() 401 hif_scatter_req_add(ar_sdio->ar, s_req); ath6kl_sdio_alloc_prep_scat_req() 410 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_read_write_sync() local 419 if (!ar_sdio->dma_buffer) ath6kl_sdio_read_write_sync() 421 mutex_lock(&ar_sdio->dma_buffer_mutex); ath6kl_sdio_read_write_sync() 422 tbuf = ar_sdio->dma_buffer; ath6kl_sdio_read_write_sync() 432 ret = ath6kl_sdio_io(ar_sdio->func, request, addr, tbuf, len); ath6kl_sdio_read_write_sync() 437 mutex_unlock(&ar_sdio->dma_buffer_mutex); ath6kl_sdio_read_write_sync() 442 static void __ath6kl_sdio_write_async(struct ath6kl_sdio *ar_sdio, __ath6kl_sdio_write_async() argument 446 ath6kl_sdio_scat_rw(ar_sdio, req); __ath6kl_sdio_write_async() 451 status = ath6kl_sdio_read_write_sync(ar_sdio->ar, req->address, __ath6kl_sdio_write_async() 455 ath6kl_sdio_free_bus_req(ar_sdio, req); __ath6kl_sdio_write_async() 462 struct ath6kl_sdio *ar_sdio; ath6kl_sdio_write_async_work() local 465 ar_sdio = container_of(work, struct ath6kl_sdio, wr_async_work); ath6kl_sdio_write_async_work() 467 spin_lock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_write_async_work() 468 list_for_each_entry_safe(req, tmp_req, &ar_sdio->wr_asyncq, list) { ath6kl_sdio_write_async_work() 470 spin_unlock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_write_async_work() 471 __ath6kl_sdio_write_async(ar_sdio, req); ath6kl_sdio_write_async_work() 472 spin_lock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_write_async_work() 474 spin_unlock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_write_async_work() 480 struct ath6kl_sdio *ar_sdio; ath6kl_sdio_irq_handler() local 484 ar_sdio = sdio_get_drvdata(func); ath6kl_sdio_irq_handler() 485 atomic_set(&ar_sdio->irq_handling, 1); ath6kl_sdio_irq_handler() 490 sdio_release_host(ar_sdio->func); ath6kl_sdio_irq_handler() 492 status = ath6kl_hif_intr_bh_handler(ar_sdio->ar); ath6kl_sdio_irq_handler() 493 sdio_claim_host(ar_sdio->func); ath6kl_sdio_irq_handler() 495 atomic_set(&ar_sdio->irq_handling, 0); ath6kl_sdio_irq_handler() 496 wake_up(&ar_sdio->irq_wq); ath6kl_sdio_irq_handler() 503 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_power_on() local 504 struct sdio_func *func = ar_sdio->func; ath6kl_sdio_power_on() 507 if (!ar_sdio->is_disabled) ath6kl_sdio_power_on() 529 ar_sdio->is_disabled = false; ath6kl_sdio_power_on() 536 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_power_off() local 539 if (ar_sdio->is_disabled) ath6kl_sdio_power_off() 545 sdio_claim_host(ar_sdio->func); ath6kl_sdio_power_off() 546 ret = sdio_disable_func(ar_sdio->func); ath6kl_sdio_power_off() 547 sdio_release_host(ar_sdio->func); ath6kl_sdio_power_off() 552 ar_sdio->is_disabled = true; ath6kl_sdio_power_off() 561 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_write_async() local 564 bus_req = ath6kl_sdio_alloc_busreq(ar_sdio); ath6kl_sdio_write_async() 575 spin_lock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_write_async() 576 list_add_tail(&bus_req->list, &ar_sdio->wr_asyncq); ath6kl_sdio_write_async() 577 spin_unlock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_write_async() 578 queue_work(ar->ath6kl_wq, &ar_sdio->wr_async_work); ath6kl_sdio_write_async() 585 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_irq_enable() local 588 sdio_claim_host(ar_sdio->func); ath6kl_sdio_irq_enable() 591 ret = sdio_claim_irq(ar_sdio->func, ath6kl_sdio_irq_handler); ath6kl_sdio_irq_enable() 595 sdio_release_host(ar_sdio->func); ath6kl_sdio_irq_enable() 600 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_is_on_irq() local 602 return !atomic_read(&ar_sdio->irq_handling); ath6kl_sdio_is_on_irq() 607 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_irq_disable() local 610 sdio_claim_host(ar_sdio->func); ath6kl_sdio_irq_disable() 612 if (atomic_read(&ar_sdio->irq_handling)) { ath6kl_sdio_irq_disable() 613 sdio_release_host(ar_sdio->func); ath6kl_sdio_irq_disable() 615 ret = wait_event_interruptible(ar_sdio->irq_wq, ath6kl_sdio_irq_disable() 620 sdio_claim_host(ar_sdio->func); ath6kl_sdio_irq_disable() 623 ret = sdio_release_irq(ar_sdio->func); ath6kl_sdio_irq_disable() 627 sdio_release_host(ar_sdio->func); ath6kl_sdio_irq_disable() 632 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_scatter_req_get() local 635 spin_lock_bh(&ar_sdio->scat_lock); ath6kl_sdio_scatter_req_get() 637 if (!list_empty(&ar_sdio->scat_req)) { ath6kl_sdio_scatter_req_get() 638 node = list_first_entry(&ar_sdio->scat_req, ath6kl_sdio_scatter_req_get() 642 node->scat_q_depth = get_queue_depth(&ar_sdio->scat_req); ath6kl_sdio_scatter_req_get() 645 spin_unlock_bh(&ar_sdio->scat_lock); ath6kl_sdio_scatter_req_get() 653 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_scatter_req_add() local 655 spin_lock_bh(&ar_sdio->scat_lock); ath6kl_sdio_scatter_req_add() 657 list_add_tail(&s_req->list, &ar_sdio->scat_req); ath6kl_sdio_scatter_req_add() 659 spin_unlock_bh(&ar_sdio->scat_lock); ath6kl_sdio_scatter_req_add() 666 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_async_rw_scatter() local 678 status = ath6kl_sdio_scat_rw(ar_sdio, scat_req->busrequest); ath6kl_sdio_async_rw_scatter() 680 spin_lock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_async_rw_scatter() 681 list_add_tail(&scat_req->busrequest->list, &ar_sdio->wr_asyncq); ath6kl_sdio_async_rw_scatter() 682 spin_unlock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_async_rw_scatter() 683 queue_work(ar->ath6kl_wq, &ar_sdio->wr_async_work); ath6kl_sdio_async_rw_scatter() 692 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_cleanup_scatter() local 696 spin_lock_bh(&ar_sdio->scat_lock); ath6kl_sdio_cleanup_scatter() 697 list_for_each_entry_safe(s_req, tmp_req, &ar_sdio->scat_req, list) { ath6kl_sdio_cleanup_scatter() 699 spin_unlock_bh(&ar_sdio->scat_lock); ath6kl_sdio_cleanup_scatter() 707 ath6kl_sdio_free_bus_req(ar_sdio, s_req->busrequest); ath6kl_sdio_cleanup_scatter() 712 spin_lock_bh(&ar_sdio->scat_lock); ath6kl_sdio_cleanup_scatter() 714 spin_unlock_bh(&ar_sdio->scat_lock); ath6kl_sdio_cleanup_scatter() 720 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_enable_scatter() local 725 if (ar_sdio->scatter_enabled) ath6kl_sdio_enable_scatter() 728 ar_sdio->scatter_enabled = true; ath6kl_sdio_enable_scatter() 731 if (ar_sdio->func->card->host->max_segs < MAX_SCATTER_ENTRIES_PER_REQ) { ath6kl_sdio_enable_scatter() 733 ar_sdio->func->card->host->max_segs, ath6kl_sdio_enable_scatter() 739 ret = ath6kl_sdio_alloc_prep_scat_req(ar_sdio, ath6kl_sdio_enable_scatter() 759 ret = ath6kl_sdio_alloc_prep_scat_req(ar_sdio, ath6kl_sdio_enable_scatter() 783 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_config() local 784 struct sdio_func *func = ar_sdio->func; ath6kl_sdio_config() 789 if ((ar_sdio->id->device & MANUFACTURER_ID_ATH6KL_BASE_MASK) >= ath6kl_sdio_config() 822 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_set_sdio_pm_caps() local 823 struct sdio_func *func = ar_sdio->func; ath6kl_set_sdio_pm_caps() 851 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_suspend() local 852 struct sdio_func *func = ar_sdio->func; ath6kl_sdio_suspend() 1212 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); ath6kl_sdio_stop() local 1218 cancel_work_sync(&ar_sdio->wr_async_work); ath6kl_sdio_stop() 1220 spin_lock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_stop() 1222 list_for_each_entry_safe(req, tmp_req, &ar_sdio->wr_asyncq, list) { ath6kl_sdio_stop() 1228 req->scat_req->complete(ar_sdio->ar->htc_target, ath6kl_sdio_stop() 1232 ath6kl_sdio_free_bus_req(ar_sdio, req); ath6kl_sdio_stop() 1237 spin_unlock_bh(&ar_sdio->wr_async_lock); ath6kl_sdio_stop() 1239 WARN_ON(get_queue_depth(&ar_sdio->scat_req) != 4); ath6kl_sdio_stop() 1298 struct ath6kl_sdio *ar_sdio; ath6kl_sdio_probe() local 1307 ar_sdio = kzalloc(sizeof(struct ath6kl_sdio), GFP_KERNEL); ath6kl_sdio_probe() 1308 if (!ar_sdio) ath6kl_sdio_probe() 1311 ar_sdio->dma_buffer = kzalloc(HIF_DMA_BUFFER_SIZE, GFP_KERNEL); ath6kl_sdio_probe() 1312 if (!ar_sdio->dma_buffer) { ath6kl_sdio_probe() 1317 ar_sdio->func = func; ath6kl_sdio_probe() 1318 sdio_set_drvdata(func, ar_sdio); ath6kl_sdio_probe() 1320 ar_sdio->id = id; ath6kl_sdio_probe() 1321 ar_sdio->is_disabled = true; ath6kl_sdio_probe() 1323 spin_lock_init(&ar_sdio->lock); ath6kl_sdio_probe() 1324 spin_lock_init(&ar_sdio->scat_lock); ath6kl_sdio_probe() 1325 spin_lock_init(&ar_sdio->wr_async_lock); ath6kl_sdio_probe() 1326 mutex_init(&ar_sdio->dma_buffer_mutex); ath6kl_sdio_probe() 1328 INIT_LIST_HEAD(&ar_sdio->scat_req); ath6kl_sdio_probe() 1329 INIT_LIST_HEAD(&ar_sdio->bus_req_freeq); ath6kl_sdio_probe() 1330 INIT_LIST_HEAD(&ar_sdio->wr_asyncq); ath6kl_sdio_probe() 1332 INIT_WORK(&ar_sdio->wr_async_work, ath6kl_sdio_write_async_work); ath6kl_sdio_probe() 1334 init_waitqueue_head(&ar_sdio->irq_wq); ath6kl_sdio_probe() 1337 ath6kl_sdio_free_bus_req(ar_sdio, &ar_sdio->bus_req[count]); ath6kl_sdio_probe() 1339 ar = ath6kl_core_create(&ar_sdio->func->dev); ath6kl_sdio_probe() 1346 ar_sdio->ar = ar; ath6kl_sdio_probe() 1348 ar->hif_priv = ar_sdio; ath6kl_sdio_probe() 1369 ath6kl_core_destroy(ar_sdio->ar); ath6kl_sdio_probe() 1371 kfree(ar_sdio->dma_buffer); ath6kl_sdio_probe() 1373 kfree(ar_sdio); ath6kl_sdio_probe() 1380 struct ath6kl_sdio *ar_sdio; ath6kl_sdio_remove() local 1386 ar_sdio = sdio_get_drvdata(func); ath6kl_sdio_remove() 1388 ath6kl_stop_txrx(ar_sdio->ar); ath6kl_sdio_remove() 1389 cancel_work_sync(&ar_sdio->wr_async_work); ath6kl_sdio_remove() 1391 ath6kl_core_cleanup(ar_sdio->ar); ath6kl_sdio_remove() 1392 ath6kl_core_destroy(ar_sdio->ar); ath6kl_sdio_remove() 1394 kfree(ar_sdio->dma_buffer); ath6kl_sdio_remove() 1395 kfree(ar_sdio); ath6kl_sdio_remove()
|