Lines Matching +full:pm +full:- +full:alive
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
11 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
22 #include <linux/dma-mapping.h>
41 #include "iwl-spectrum.h"
62 #define DRV_COPYRIGHT "Copyright(c) 2003-2011 Intel Corporation"
79 * il3945_get_antenna_flags - Get antenna flags for RXON command
82 * il->eeprom39 is used to determine if antenna AUX/MAIN are reversed
85 * IL_ANTENNA_DIVERSITY - NIC selects best antenna by itself
86 * IL_ANTENNA_MAIN - Force MAIN antenna
87 * IL_ANTENNA_AUX - Force AUX antenna
92 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom; in il3945_get_antenna_flags()
99 if (eeprom->antenna_switch_type) in il3945_get_antenna_flags()
104 if (eeprom->antenna_switch_type) in il3945_get_antenna_flags()
125 key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); in il3945_set_ccmp_dynamic_key_info()
127 if (sta_id == il->hw_params.bcast_id) in il3945_set_ccmp_dynamic_key_info()
130 keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; in il3945_set_ccmp_dynamic_key_info()
131 keyconf->hw_key_idx = keyconf->keyidx; in il3945_set_ccmp_dynamic_key_info()
134 spin_lock_irqsave(&il->sta_lock, flags); in il3945_set_ccmp_dynamic_key_info()
135 il->stations[sta_id].keyinfo.cipher = keyconf->cipher; in il3945_set_ccmp_dynamic_key_info()
136 il->stations[sta_id].keyinfo.keylen = keyconf->keylen; in il3945_set_ccmp_dynamic_key_info()
137 memcpy(il->stations[sta_id].keyinfo.key, keyconf->key, keyconf->keylen); in il3945_set_ccmp_dynamic_key_info()
139 memcpy(il->stations[sta_id].sta.key.key, keyconf->key, keyconf->keylen); in il3945_set_ccmp_dynamic_key_info()
141 if ((il->stations[sta_id].sta.key. in il3945_set_ccmp_dynamic_key_info()
143 il->stations[sta_id].sta.key.key_offset = in il3945_set_ccmp_dynamic_key_info()
148 WARN(il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, in il3945_set_ccmp_dynamic_key_info()
151 il->stations[sta_id].sta.key.key_flags = key_flags; in il3945_set_ccmp_dynamic_key_info()
152 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; in il3945_set_ccmp_dynamic_key_info()
153 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il3945_set_ccmp_dynamic_key_info()
157 ret = il_send_add_sta(il, &il->stations[sta_id].sta, CMD_ASYNC); in il3945_set_ccmp_dynamic_key_info()
159 spin_unlock_irqrestore(&il->sta_lock, flags); in il3945_set_ccmp_dynamic_key_info()
168 return -EOPNOTSUPP; in il3945_set_tkip_dynamic_key_info()
175 return -EOPNOTSUPP; in il3945_set_wep_dynamic_key_info()
184 spin_lock_irqsave(&il->sta_lock, flags); in il3945_clear_sta_key_info()
185 memset(&il->stations[sta_id].keyinfo, 0, sizeof(struct il_hw_key)); in il3945_clear_sta_key_info()
186 memset(&il->stations[sta_id].sta.key, 0, sizeof(struct il4965_keyinfo)); in il3945_clear_sta_key_info()
187 il->stations[sta_id].sta.key.key_flags = STA_KEY_FLG_NO_ENC; in il3945_clear_sta_key_info()
188 il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; in il3945_clear_sta_key_info()
189 il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; in il3945_clear_sta_key_info()
190 memcpy(&sta_cmd, &il->stations[sta_id].sta, in il3945_clear_sta_key_info()
192 spin_unlock_irqrestore(&il->sta_lock, flags); in il3945_clear_sta_key_info()
204 keyconf->hw_key_idx = HW_KEY_DYNAMIC; in il3945_set_dynamic_key()
206 switch (keyconf->cipher) { in il3945_set_dynamic_key()
218 IL_ERR("Unknown alg: %s alg=%x\n", __func__, keyconf->cipher); in il3945_set_dynamic_key()
219 ret = -EINVAL; in il3945_set_dynamic_key()
223 keyconf->cipher, keyconf->keylen, keyconf->keyidx, sta_id, ret); in il3945_set_dynamic_key()
231 return -EOPNOTSUPP; in il3945_remove_static_key()
237 if (key->cipher == WLAN_CIPHER_SUITE_WEP40 || in il3945_set_static_key()
238 key->cipher == WLAN_CIPHER_SUITE_WEP104) in il3945_set_static_key()
239 return -EOPNOTSUPP; in il3945_set_static_key()
241 IL_ERR("Static key invalid: cipher %x\n", key->cipher); in il3945_set_static_key()
242 return -EINVAL; in il3945_set_static_key()
250 D_INFO("%d frames on pre-allocated heap on clear.\n", il->frames_count); in il3945_clear_free_frames()
252 while (!list_empty(&il->free_frames)) { in il3945_clear_free_frames()
253 element = il->free_frames.next; in il3945_clear_free_frames()
256 il->frames_count--; in il3945_clear_free_frames()
259 if (il->frames_count) { in il3945_clear_free_frames()
261 il->frames_count); in il3945_clear_free_frames()
262 il->frames_count = 0; in il3945_clear_free_frames()
271 if (list_empty(&il->free_frames)) { in il3945_get_free_frame()
278 il->frames_count++; in il3945_get_free_frame()
282 element = il->free_frames.next; in il3945_get_free_frame()
291 list_add(&frame->list, &il->free_frames); in il3945_free_frame()
299 if (!il_is_associated(il) || !il->beacon_skb) in il3945_fill_beacon_frame()
302 if (il->beacon_skb->len > left) in il3945_fill_beacon_frame()
305 memcpy(hdr, il->beacon_skb->data, il->beacon_skb->len); in il3945_fill_beacon_frame()
307 return il->beacon_skb->len; in il3945_fill_beacon_frame()
323 return -ENOMEM; in il3945_send_beacon_cmd()
330 rc = il_send_cmd_pdu(il, C_TX_BEACON, frame_size, &frame->u.cmd[0]); in il3945_send_beacon_cmd()
340 if (il->_3945.shared_virt) in il3945_unset_hw_params()
341 dma_free_coherent(&il->pci_dev->dev, in il3945_unset_hw_params()
343 il->_3945.shared_virt, il->_3945.shared_phys); in il3945_unset_hw_params()
351 struct il3945_tx_cmd *tx_cmd = (struct il3945_tx_cmd *)cmd->cmd.payload; in il3945_build_tx_cmd_hwcrypto()
352 struct il_hw_key *keyinfo = &il->stations[sta_id].keyinfo; in il3945_build_tx_cmd_hwcrypto()
354 tx_cmd->sec_ctl = 0; in il3945_build_tx_cmd_hwcrypto()
356 switch (keyinfo->cipher) { in il3945_build_tx_cmd_hwcrypto()
358 tx_cmd->sec_ctl = TX_CMD_SEC_CCM; in il3945_build_tx_cmd_hwcrypto()
359 memcpy(tx_cmd->key, keyinfo->key, keyinfo->keylen); in il3945_build_tx_cmd_hwcrypto()
367 tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128; in il3945_build_tx_cmd_hwcrypto()
370 tx_cmd->sec_ctl |= in il3945_build_tx_cmd_hwcrypto()
371 TX_CMD_SEC_WEP | (info->control.hw_key-> in il3945_build_tx_cmd_hwcrypto()
375 memcpy(&tx_cmd->key[3], keyinfo->key, keyinfo->keylen); in il3945_build_tx_cmd_hwcrypto()
378 info->control.hw_key->hw_key_idx); in il3945_build_tx_cmd_hwcrypto()
382 IL_ERR("Unknown encode cipher %x\n", keyinfo->cipher); in il3945_build_tx_cmd_hwcrypto()
395 struct il3945_tx_cmd *tx_cmd = (struct il3945_tx_cmd *)cmd->cmd.payload; in il3945_build_tx_cmd_basic()
396 __le32 tx_flags = tx_cmd->tx_flags; in il3945_build_tx_cmd_basic()
397 __le16 fc = hdr->frame_control; in il3945_build_tx_cmd_basic()
399 tx_cmd->stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; in il3945_build_tx_cmd_basic()
400 if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) { in il3945_build_tx_cmd_basic()
405 !(le16_to_cpu(hdr->seq_ctrl) & 0xf)) in il3945_build_tx_cmd_basic()
412 tx_cmd->sta_id = std_id; in il3945_build_tx_cmd_basic()
418 tx_cmd->tid_tspec = qc[0] & 0xf; in il3945_build_tx_cmd_basic()
429 tx_cmd->timeout.pm_frame_timeout = cpu_to_le16(3); in il3945_build_tx_cmd_basic()
431 tx_cmd->timeout.pm_frame_timeout = cpu_to_le16(2); in il3945_build_tx_cmd_basic()
433 tx_cmd->timeout.pm_frame_timeout = 0; in il3945_build_tx_cmd_basic()
436 tx_cmd->driver_txop = 0; in il3945_build_tx_cmd_basic()
437 tx_cmd->tx_flags = tx_flags; in il3945_build_tx_cmd_basic()
438 tx_cmd->next_frame_len = 0; in il3945_build_tx_cmd_basic()
449 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in il3945_tx_skb()
467 spin_lock_irqsave(&il->lock, flags); in il3945_tx_skb()
469 D_DROP("Dropping - RF KILL\n"); in il3945_tx_skb()
473 if ((ieee80211_get_tx_rate(il->hw, info)->hw_value & 0xFF) == in il3945_tx_skb()
479 fc = hdr->frame_control; in il3945_tx_skb()
490 spin_unlock_irqrestore(&il->lock, flags); in il3945_tx_skb()
497 D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1); in il3945_tx_skb()
511 txq = &il->txq[txq_id]; in il3945_tx_skb()
512 q = &txq->q; in il3945_tx_skb()
514 if ((il_queue_space(q) < q->high_mark)) in il3945_tx_skb()
517 spin_lock_irqsave(&il->lock, flags); in il3945_tx_skb()
519 idx = il_get_cmd_idx(q, q->write_ptr, 0); in il3945_tx_skb()
521 txq->skbs[q->write_ptr] = skb; in il3945_tx_skb()
524 out_cmd = txq->cmd[idx]; in il3945_tx_skb()
525 out_meta = &txq->meta[idx]; in il3945_tx_skb()
526 tx_cmd = (struct il3945_tx_cmd *)out_cmd->cmd.payload; in il3945_tx_skb()
527 memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr)); in il3945_tx_skb()
531 * Set up the Tx-command (not MAC!) header. in il3945_tx_skb()
534 * locate the frame within the tx queue and do post-tx processing. in il3945_tx_skb()
536 out_cmd->hdr.cmd = C_TX; in il3945_tx_skb()
537 out_cmd->hdr.sequence = in il3945_tx_skb()
539 (QUEUE_TO_SEQ(txq_id) | IDX_TO_SEQ(q->write_ptr))); in il3945_tx_skb()
542 memcpy(tx_cmd->hdr, hdr, hdr_len); in il3945_tx_skb()
544 if (info->control.hw_key) in il3945_tx_skb()
553 tx_cmd->len = cpu_to_le16((u16) skb->len); in il3945_tx_skb()
555 tx_cmd->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK; in il3945_tx_skb()
556 tx_cmd->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK; in il3945_tx_skb()
574 txcmd_phys = dma_map_single(&il->pci_dev->dev, &out_cmd->hdr, firstlen, in il3945_tx_skb()
576 if (unlikely(dma_mapping_error(&il->pci_dev->dev, txcmd_phys))) in il3945_tx_skb()
581 secondlen = skb->len - hdr_len; in il3945_tx_skb()
583 phys_addr = dma_map_single(&il->pci_dev->dev, skb->data + hdr_len, in il3945_tx_skb()
585 if (unlikely(dma_mapping_error(&il->pci_dev->dev, phys_addr))) in il3945_tx_skb()
591 il->ops->txq_attach_buf_to_tfd(il, txq, txcmd_phys, firstlen, 1, 0); in il3945_tx_skb()
595 il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, secondlen, 0, in il3945_tx_skb()
598 if (!ieee80211_has_morefrags(hdr->frame_control)) { in il3945_tx_skb()
599 txq->need_update = 1; in il3945_tx_skb()
602 txq->need_update = 0; in il3945_tx_skb()
605 il_update_stats(il, true, fc, skb->len); in il3945_tx_skb()
607 D_TX("sequence nr = 0X%x\n", le16_to_cpu(out_cmd->hdr.sequence)); in il3945_tx_skb()
608 D_TX("tx_flags = 0X%x\n", le32_to_cpu(tx_cmd->tx_flags)); in il3945_tx_skb()
610 il_print_hex_dump(il, IL_DL_TX, (u8 *) tx_cmd->hdr, in il3945_tx_skb()
614 q->write_ptr = il_queue_inc_wrap(q->write_ptr, q->n_bd); in il3945_tx_skb()
616 spin_unlock_irqrestore(&il->lock, flags); in il3945_tx_skb()
618 if (il_queue_space(q) < q->high_mark && il->mac80211_registered) { in il3945_tx_skb()
620 spin_lock_irqsave(&il->lock, flags); in il3945_tx_skb()
621 txq->need_update = 1; in il3945_tx_skb()
623 spin_unlock_irqrestore(&il->lock, flags); in il3945_tx_skb()
632 spin_unlock_irqrestore(&il->lock, flags); in il3945_tx_skb()
634 return -1; in il3945_tx_skb()
648 u32 add_time = le64_to_cpu(params->start_time); in il3945_get_measurement()
651 int duration = le16_to_cpu(params->duration); in il3945_get_measurement()
656 le64_to_cpu(params->start_time) - in il3945_get_measurement()
657 il->_3945.last_tsf, in il3945_get_measurement()
658 le16_to_cpu(il->timing.beacon_interval)); in il3945_get_measurement()
667 spectrum.len = cpu_to_le16(cmd.len - sizeof(spectrum.len)); in il3945_get_measurement()
671 il_add_beacon_time(il, il->_3945.last_beacon_time, add_time, in il3945_get_measurement()
672 le16_to_cpu(il->timing.beacon_interval)); in il3945_get_measurement()
677 spectrum.channels[0].channel = params->channel; in il3945_get_measurement()
679 if (il->active.flags & RXON_FLG_BAND_24G_MSK) in il3945_get_measurement()
689 if (pkt->hdr.flags & IL_CMD_FAILED_MSK) { in il3945_get_measurement()
691 rc = -EIO; in il3945_get_measurement()
694 spectrum_resp_status = le16_to_cpu(pkt->u.spectrum.status); in il3945_get_measurement()
697 if (pkt->u.spectrum.id != 0xff) { in il3945_get_measurement()
699 pkt->u.spectrum.id); in il3945_get_measurement()
700 il->measurement_status &= ~MEASUREMENT_READY; in il3945_get_measurement()
702 il->measurement_status |= MEASUREMENT_ACTIVE; in il3945_get_measurement()
707 rc = -EAGAIN; in il3945_get_measurement()
723 palive = &pkt->u.alive_frame; in il3945_hdl_alive()
725 D_INFO("Alive ucode status 0x%08X revision " "0x%01X 0x%01X\n", in il3945_hdl_alive()
726 palive->is_valid, palive->ver_type, palive->ver_subtype); in il3945_hdl_alive()
728 if (palive->ver_subtype == INITIALIZE_SUBTYPE) { in il3945_hdl_alive()
729 D_INFO("Initialization Alive received.\n"); in il3945_hdl_alive()
730 memcpy(&il->card_alive_init, &pkt->u.alive_frame, in il3945_hdl_alive()
732 pwork = &il->init_alive_start; in il3945_hdl_alive()
734 D_INFO("Runtime Alive received.\n"); in il3945_hdl_alive()
735 memcpy(&il->card_alive, &pkt->u.alive_frame, in il3945_hdl_alive()
737 pwork = &il->alive_start; in il3945_hdl_alive()
741 /* We delay the ALIVE response by 5ms to in il3945_hdl_alive()
743 if (palive->is_valid == UCODE_VALID_OK) in il3945_hdl_alive()
744 queue_delayed_work(il->workqueue, pwork, msecs_to_jiffies(5)); in il3945_hdl_alive()
754 D_RX("Received C_ADD_STA: 0x%02X\n", pkt->u.status); in il3945_hdl_add_sta()
761 struct il3945_beacon_notif *beacon = &(pkt->u.beacon_status); in il3945_hdl_beacon()
763 u8 rate = beacon->beacon_notify_hdr.rate; in il3945_hdl_beacon()
766 le32_to_cpu(beacon->beacon_notify_hdr.status) & TX_STATUS_MSK, in il3945_hdl_beacon()
767 beacon->beacon_notify_hdr.failure_frame, in il3945_hdl_beacon()
768 le32_to_cpu(beacon->ibss_mgr_status), in il3945_hdl_beacon()
769 le32_to_cpu(beacon->high_tsf), le32_to_cpu(beacon->low_tsf), rate); in il3945_hdl_beacon()
772 il->ibss_manager = le32_to_cpu(beacon->ibss_mgr_status); in il3945_hdl_beacon()
782 u32 flags = le32_to_cpu(pkt->u.card_state_notif.flags); in il3945_hdl_card_state()
783 unsigned long status = il->status; in il3945_hdl_card_state()
792 set_bit(S_RFKILL, &il->status); in il3945_hdl_card_state()
794 clear_bit(S_RFKILL, &il->status); in il3945_hdl_card_state()
799 test_bit(S_RFKILL, &il->status))) in il3945_hdl_card_state()
800 wiphy_rfkill_set_hw_state(il->hw->wiphy, in il3945_hdl_card_state()
801 test_bit(S_RFKILL, &il->status)); in il3945_hdl_card_state()
803 wake_up(&il->wait_command_queue); in il3945_hdl_card_state()
807 * il3945_setup_handlers - Initialize Rx handler callbacks
818 il->handlers[N_ALIVE] = il3945_hdl_alive; in il3945_setup_handlers()
819 il->handlers[C_ADD_STA] = il3945_hdl_add_sta; in il3945_setup_handlers()
820 il->handlers[N_ERROR] = il_hdl_error; in il3945_setup_handlers()
821 il->handlers[N_CHANNEL_SWITCH] = il_hdl_csa; in il3945_setup_handlers()
822 il->handlers[N_SPECTRUM_MEASUREMENT] = il_hdl_spectrum_measurement; in il3945_setup_handlers()
823 il->handlers[N_PM_SLEEP] = il_hdl_pm_sleep; in il3945_setup_handlers()
824 il->handlers[N_PM_DEBUG_STATS] = il_hdl_pm_debug_stats; in il3945_setup_handlers()
825 il->handlers[N_BEACON] = il3945_hdl_beacon; in il3945_setup_handlers()
832 il->handlers[C_STATS] = il3945_hdl_c_stats; in il3945_setup_handlers()
833 il->handlers[N_STATS] = il3945_hdl_stats; in il3945_setup_handlers()
836 il->handlers[N_CARD_STATE] = il3945_hdl_card_state; in il3945_setup_handlers()
842 /************************** RX-FUNCTIONS ****************************/
854 * to -- the driver can read up to (but not including) this position and get
858 * The WRITE idx maps to the last position the driver has read from -- the
861 * The queue is empty (no good data) if WRITE = READ - 1, and is full if
865 * IDX position, and WRITE to the last (READ - 1 wrapped)
873 * + A list of pre-allocated SKBs is stored in iwl->rxq->rx_free. When
874 * iwl->rxq->free_count drops to or below RX_LOW_WATERMARK, work is scheduled
875 * to replenish the iwl->rxq->rx_free.
877 * iwl->rxq is replenished and the READ IDX is updated (updating the
880 * detached from the iwl->rxq. The driver 'processed' idx is updated.
881 * + The Host/Firmware iwl->rxq is replenished at tasklet time from the rx_free
882 * list. If there are no allocated buffers in iwl->rxq->rx_free, the READ
883 * IDX is not incremented and iwl->status(RX_STALLED) is set. If there
896 * -- enable interrupts --
897 * ISR - il3945_rx() Detach il_rx_bufs from pool up to the
907 * il3945_dma_addr2rbd_ptr - convert a DMA address to a uCode read buffer ptr
916 * il3945_rx_queue_restock - refill RX queue from pre-allocated pool
919 * and we have free pre-allocated buffers, fill the ranks as much
929 struct il_rx_queue *rxq = &il->rxq; in il3945_rx_queue_restock()
934 spin_lock_irqsave(&rxq->lock, flags); in il3945_rx_queue_restock()
935 while (il_rx_queue_space(rxq) > 0 && rxq->free_count) { in il3945_rx_queue_restock()
937 element = rxq->rx_free.next; in il3945_rx_queue_restock()
942 rxq->bd[rxq->write] = in il3945_rx_queue_restock()
943 il3945_dma_addr2rbd_ptr(il, rxb->page_dma); in il3945_rx_queue_restock()
944 rxq->queue[rxq->write] = rxb; in il3945_rx_queue_restock()
945 rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; in il3945_rx_queue_restock()
946 rxq->free_count--; in il3945_rx_queue_restock()
948 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_queue_restock()
949 /* If the pre-allocated buffer pool is dropping low, schedule to in il3945_rx_queue_restock()
951 if (rxq->free_count <= RX_LOW_WATERMARK) in il3945_rx_queue_restock()
952 queue_work(il->workqueue, &il->rx_replenish); in il3945_rx_queue_restock()
956 if (rxq->write_actual != (rxq->write & ~0x7) || in il3945_rx_queue_restock()
957 abs(rxq->write - rxq->read) > 7) { in il3945_rx_queue_restock()
958 spin_lock_irqsave(&rxq->lock, flags); in il3945_rx_queue_restock()
959 rxq->need_update = 1; in il3945_rx_queue_restock()
960 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_queue_restock()
966 * il3945_rx_replenish - Move all used packet from rx_used to rx_free
976 struct il_rx_queue *rxq = &il->rxq; in il3945_rx_allocate()
985 spin_lock_irqsave(&rxq->lock, flags); in il3945_rx_allocate()
986 if (list_empty(&rxq->rx_used)) { in il3945_rx_allocate()
987 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_allocate()
990 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_allocate()
992 if (rxq->free_count > RX_LOW_WATERMARK) in il3945_rx_allocate()
995 if (il->hw_params.rx_page_order > 0) in il3945_rx_allocate()
999 page = alloc_pages(gfp_mask, il->hw_params.rx_page_order); in il3945_rx_allocate()
1003 if (rxq->free_count <= RX_LOW_WATERMARK && in il3945_rx_allocate()
1007 priority, rxq->free_count); in il3945_rx_allocate()
1008 /* We don't reschedule replenish work here -- we will in il3945_rx_allocate()
1016 dma_map_page(&il->pci_dev->dev, page, 0, in il3945_rx_allocate()
1017 PAGE_SIZE << il->hw_params.rx_page_order, in il3945_rx_allocate()
1020 if (unlikely(dma_mapping_error(&il->pci_dev->dev, page_dma))) { in il3945_rx_allocate()
1021 __free_pages(page, il->hw_params.rx_page_order); in il3945_rx_allocate()
1025 spin_lock_irqsave(&rxq->lock, flags); in il3945_rx_allocate()
1027 if (list_empty(&rxq->rx_used)) { in il3945_rx_allocate()
1028 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_allocate()
1029 dma_unmap_page(&il->pci_dev->dev, page_dma, in il3945_rx_allocate()
1030 PAGE_SIZE << il->hw_params.rx_page_order, in il3945_rx_allocate()
1032 __free_pages(page, il->hw_params.rx_page_order); in il3945_rx_allocate()
1036 element = rxq->rx_used.next; in il3945_rx_allocate()
1040 rxb->page = page; in il3945_rx_allocate()
1041 rxb->page_dma = page_dma; in il3945_rx_allocate()
1042 list_add_tail(&rxb->list, &rxq->rx_free); in il3945_rx_allocate()
1043 rxq->free_count++; in il3945_rx_allocate()
1044 il->alloc_rxb_page++; in il3945_rx_allocate()
1046 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_allocate()
1055 spin_lock_irqsave(&rxq->lock, flags); in il3945_rx_queue_reset()
1056 INIT_LIST_HEAD(&rxq->rx_free); in il3945_rx_queue_reset()
1057 INIT_LIST_HEAD(&rxq->rx_used); in il3945_rx_queue_reset()
1062 if (rxq->pool[i].page != NULL) { in il3945_rx_queue_reset()
1063 dma_unmap_page(&il->pci_dev->dev, in il3945_rx_queue_reset()
1064 rxq->pool[i].page_dma, in il3945_rx_queue_reset()
1065 PAGE_SIZE << il->hw_params.rx_page_order, in il3945_rx_queue_reset()
1067 __il_free_pages(il, rxq->pool[i].page); in il3945_rx_queue_reset()
1068 rxq->pool[i].page = NULL; in il3945_rx_queue_reset()
1070 list_add_tail(&rxq->pool[i].list, &rxq->rx_used); in il3945_rx_queue_reset()
1075 rxq->read = rxq->write = 0; in il3945_rx_queue_reset()
1076 rxq->write_actual = 0; in il3945_rx_queue_reset()
1077 rxq->free_count = 0; in il3945_rx_queue_reset()
1078 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_queue_reset()
1089 spin_lock_irqsave(&il->lock, flags); in il3945_rx_replenish()
1091 spin_unlock_irqrestore(&il->lock, flags); in il3945_rx_replenish()
1112 if (rxq->pool[i].page != NULL) { in il3945_rx_queue_free()
1113 dma_unmap_page(&il->pci_dev->dev, in il3945_rx_queue_free()
1114 rxq->pool[i].page_dma, in il3945_rx_queue_free()
1115 PAGE_SIZE << il->hw_params.rx_page_order, in il3945_rx_queue_free()
1117 __il_free_pages(il, rxq->pool[i].page); in il3945_rx_queue_free()
1118 rxq->pool[i].page = NULL; in il3945_rx_queue_free()
1122 dma_free_coherent(&il->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, in il3945_rx_queue_free()
1123 rxq->bd_dma); in il3945_rx_queue_free()
1124 dma_free_coherent(&il->pci_dev->dev, sizeof(struct il_rb_status), in il3945_rx_queue_free()
1125 rxq->rb_stts, rxq->rb_stts_dma); in il3945_rx_queue_free()
1126 rxq->bd = NULL; in il3945_rx_queue_free()
1127 rxq->rb_stts = NULL; in il3945_rx_queue_free()
1131 * il3945_rx_handle - Main entry function for receiving responses from uCode
1133 * Uses the il->handlers callback function array to invoke
1135 * frame-received notifications, and other notifications.
1142 struct il_rx_queue *rxq = &il->rxq; in il3945_rx_handle()
1152 r = le16_to_cpu(rxq->rb_stts->closed_rb_num) & 0x0FFF; in il3945_rx_handle()
1153 i = rxq->read; in il3945_rx_handle()
1156 total_empty = r - rxq->write_actual; in il3945_rx_handle()
1167 rxb = rxq->queue[i]; in il3945_rx_handle()
1171 * routines -- catch it here */ in il3945_rx_handle()
1174 rxq->queue[i] = NULL; in il3945_rx_handle()
1176 dma_unmap_page(&il->pci_dev->dev, rxb->page_dma, in il3945_rx_handle()
1177 PAGE_SIZE << il->hw_params.rx_page_order, in il3945_rx_handle()
1185 if (il->handlers[pkt->hdr.cmd]) { in il3945_rx_handle()
1187 il_get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd); in il3945_rx_handle()
1188 il->isr_stats.handlers[pkt->hdr.cmd]++; in il3945_rx_handle()
1189 il->handlers[pkt->hdr.cmd] (il, rxb); in il3945_rx_handle()
1193 i, il_get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd); in il3945_rx_handle()
1197 * XXX: After here, we should always check rxb->page in il3945_rx_handle()
1207 if (rxb->page) in il3945_rx_handle()
1216 spin_lock_irqsave(&rxq->lock, flags); in il3945_rx_handle()
1217 if (rxb->page != NULL) { in il3945_rx_handle()
1218 rxb->page_dma = in il3945_rx_handle()
1219 dma_map_page(&il->pci_dev->dev, rxb->page, 0, in il3945_rx_handle()
1220 PAGE_SIZE << il->hw_params.rx_page_order, in il3945_rx_handle()
1222 if (unlikely(dma_mapping_error(&il->pci_dev->dev, in il3945_rx_handle()
1223 rxb->page_dma))) { in il3945_rx_handle()
1224 __il_free_pages(il, rxb->page); in il3945_rx_handle()
1225 rxb->page = NULL; in il3945_rx_handle()
1226 list_add_tail(&rxb->list, &rxq->rx_used); in il3945_rx_handle()
1228 list_add_tail(&rxb->list, &rxq->rx_free); in il3945_rx_handle()
1229 rxq->free_count++; in il3945_rx_handle()
1232 list_add_tail(&rxb->list, &rxq->rx_used); in il3945_rx_handle()
1234 spin_unlock_irqrestore(&rxq->lock, flags); in il3945_rx_handle()
1242 rxq->read = i; in il3945_rx_handle()
1250 rxq->read = i; in il3945_rx_handle()
1262 synchronize_irq(il->pci_dev->irq); in il3945_synchronize_irq()
1263 tasklet_kill(&il->irq_tasklet); in il3945_synchronize_irq()
1297 base = le32_to_cpu(il->card_alive.error_event_table_ptr); in il3945_dump_nic_error_log()
1308 IL_ERR("Status: 0x%08lX, count: %d\n", il->status, count); in il3945_dump_nic_error_log()
1324 IL_ERR("%-13s (0x%X) %010u 0x%05X 0x%05X 0x%05X 0x%05X %u\n\n", in il3945_dump_nic_error_log()
1341 spin_lock_irqsave(&il->lock, flags); in il3945_irq_tasklet()
1349 /* Ack/clear/reset pending flow-handler (DMA) interrupts. in il3945_irq_tasklet()
1364 spin_unlock_irqrestore(&il->lock, flags); in il3945_irq_tasklet()
1382 il->isr_stats.hw++; in il3945_irq_tasklet()
1395 il->isr_stats.sch++; in il3945_irq_tasklet()
1398 /* Alive notification via Rx interrupt will do the real work */ in il3945_irq_tasklet()
1400 D_ISR("Alive interrupt\n"); in il3945_irq_tasklet()
1401 il->isr_stats.alive++; in il3945_irq_tasklet()
1412 il->isr_stats.sw++; in il3945_irq_tasklet()
1417 /* uCode wakes up after power-down sleep */ in il3945_irq_tasklet()
1420 il_rx_queue_update_write_ptr(il, &il->rxq); in il3945_irq_tasklet()
1422 spin_lock_irqsave(&il->lock, flags); in il3945_irq_tasklet()
1423 il_txq_update_write_ptr(il, &il->txq[0]); in il3945_irq_tasklet()
1424 il_txq_update_write_ptr(il, &il->txq[1]); in il3945_irq_tasklet()
1425 il_txq_update_write_ptr(il, &il->txq[2]); in il3945_irq_tasklet()
1426 il_txq_update_write_ptr(il, &il->txq[3]); in il3945_irq_tasklet()
1427 il_txq_update_write_ptr(il, &il->txq[4]); in il3945_irq_tasklet()
1428 spin_unlock_irqrestore(&il->lock, flags); in il3945_irq_tasklet()
1430 il->isr_stats.wakeup++; in il3945_irq_tasklet()
1435 * Rx "responses" (frame-received notification), and other in il3945_irq_tasklet()
1439 il->isr_stats.rx++; in il3945_irq_tasklet()
1445 il->isr_stats.tx++; in il3945_irq_tasklet()
1454 il->isr_stats.unhandled++; in il3945_irq_tasklet()
1457 if (inta & ~il->inta_mask) { in il3945_irq_tasklet()
1459 inta & ~il->inta_mask); in il3945_irq_tasklet()
1463 /* Re-enable all interrupts */ in il3945_irq_tasklet()
1464 /* only Re-enable if disabled by irq */ in il3945_irq_tasklet()
1465 if (test_bit(S_INT_ENABLED, &il->status)) in il3945_irq_tasklet()
1502 for (i = 0, added = 0; i < il->scan_request->n_channels; i++) { in il3945_get_channels_for_scan()
1503 chan = il->scan_request->channels[i]; in il3945_get_channels_for_scan()
1505 if (chan->band != band) in il3945_get_channels_for_scan()
1508 scan_ch->channel = chan->hw_value; in il3945_get_channels_for_scan()
1510 ch_info = il_get_channel_info(il, band, scan_ch->channel); in il3945_get_channels_for_scan()
1513 scan_ch->channel); in il3945_get_channels_for_scan()
1517 scan_ch->active_dwell = cpu_to_le16(active_dwell); in il3945_get_channels_for_scan()
1518 scan_ch->passive_dwell = cpu_to_le16(passive_dwell); in il3945_get_channels_for_scan()
1519 /* If passive , set up for auto-switch in il3945_get_channels_for_scan()
1523 (chan->flags & IEEE80211_CHAN_NO_IR)) { in il3945_get_channels_for_scan()
1524 scan_ch->type = 0; /* passive */ in il3945_get_channels_for_scan()
1525 if (IL_UCODE_API(il->ucode_ver) == 1) in il3945_get_channels_for_scan()
1526 scan_ch->active_dwell = in il3945_get_channels_for_scan()
1527 cpu_to_le16(passive_dwell - 1); in il3945_get_channels_for_scan()
1529 scan_ch->type = 1; /* active */ in il3945_get_channels_for_scan()
1536 if (IL_UCODE_API(il->ucode_ver) >= 2) { in il3945_get_channels_for_scan()
1538 scan_ch->type |= IL39_SCAN_PROBE_MASK(n_probes); in il3945_get_channels_for_scan()
1542 if ((scan_ch->type & 1) && n_probes) in il3945_get_channels_for_scan()
1543 scan_ch->type |= IL39_SCAN_PROBE_MASK(n_probes); in il3945_get_channels_for_scan()
1547 scan_ch->tpc.dsp_atten = 110; in il3945_get_channels_for_scan()
1548 /* scan_pwr_info->tpc.dsp_atten; */ in il3945_get_channels_for_scan()
1550 /*scan_pwr_info->tpc.tx_gain; */ in il3945_get_channels_for_scan()
1552 scan_ch->tpc.tx_gain = ((1 << 5) | (3 << 3)) | 3; in il3945_get_channels_for_scan()
1554 scan_ch->tpc.tx_gain = ((1 << 5) | (5 << 3)); in il3945_get_channels_for_scan()
1557 * scan_ch->tpc.tx_gain = ((1 << 5) | (2 << 3)) | 3; in il3945_get_channels_for_scan()
1561 D_SCAN("Scanning %d [%s %d]\n", scan_ch->channel, in il3945_get_channels_for_scan()
1562 (scan_ch->type & 1) ? "ACTIVE" : "PASSIVE", in il3945_get_channels_for_scan()
1563 (scan_ch->type & 1) ? active_dwell : passive_dwell); in il3945_get_channels_for_scan()
1603 il_free_fw_desc(il->pci_dev, &il->ucode_code); in il3945_dealloc_ucode_pci()
1604 il_free_fw_desc(il->pci_dev, &il->ucode_data); in il3945_dealloc_ucode_pci()
1605 il_free_fw_desc(il->pci_dev, &il->ucode_data_backup); in il3945_dealloc_ucode_pci()
1606 il_free_fw_desc(il->pci_dev, &il->ucode_init); in il3945_dealloc_ucode_pci()
1607 il_free_fw_desc(il->pci_dev, &il->ucode_init_data); in il3945_dealloc_ucode_pci()
1608 il_free_fw_desc(il->pci_dev, &il->ucode_boot); in il3945_dealloc_ucode_pci()
1612 * il3945_verify_inst_full - verify runtime uCode image in card vs. host,
1628 for (; len > 0; len -= sizeof(u32), image++) { in il3945_verify_inst_full()
1629 /* read data comes through single port, auto-incr addr */ in il3945_verify_inst_full()
1636 save_len - len, val, le32_to_cpu(*image)); in il3945_verify_inst_full()
1637 rc = -EIO; in il3945_verify_inst_full()
1651 * il3945_verify_inst_sparse - verify runtime uCode image in card vs. host,
1666 /* read data comes through single port, auto-incr addr */ in il3945_verify_inst_sparse()
1677 rc = -EIO; in il3945_verify_inst_sparse()
1688 * il3945_verify_ucode - determine which instruction image is in SRAM,
1699 image = (__le32 *) il->ucode_boot.v_addr; in il3945_verify_ucode()
1700 len = il->ucode_boot.len; in il3945_verify_ucode()
1708 image = (__le32 *) il->ucode_init.v_addr; in il3945_verify_ucode()
1709 len = il->ucode_init.len; in il3945_verify_ucode()
1717 image = (__le32 *) il->ucode_code.v_addr; in il3945_verify_ucode()
1718 len = il->ucode_code.len; in il3945_verify_ucode()
1730 image = (__le32 *) il->ucode_boot.v_addr; in il3945_verify_ucode()
1731 len = il->ucode_boot.len; in il3945_verify_ucode()
1747 return le32_to_cpu(ucode->v1.item); \
1759 return (u8 *) ucode->v1.data; in il3945_ucode_get_data()
1769 * il3945_read_ucode - Read uCode images from disk file.
1771 * Copy into buffers for card to fetch via bus-mastering
1777 int ret = -EINVAL, idx; in il3945_read_ucode()
1780 const char *name_pre = il->cfg->fw_name_pre; in il3945_read_ucode()
1781 const unsigned int api_max = il->cfg->ucode_api_max; in il3945_read_ucode()
1782 const unsigned int api_min = il->cfg->ucode_api_min; in il3945_read_ucode()
1790 for (idx = api_max; idx >= api_min; idx--) { in il3945_read_ucode()
1792 ret = request_firmware(&ucode_raw, buf, &il->pci_dev->dev); in il3945_read_ucode()
1795 if (ret == -ENOENT) in il3945_read_ucode()
1806 "(%zd bytes) from disk\n", buf, ucode_raw->size); in il3945_read_ucode()
1815 if (ucode_raw->size < il3945_ucode_get_header_size(1)) { in il3945_read_ucode()
1817 ret = -EINVAL; in il3945_read_ucode()
1822 ucode = (struct il_ucode_header *)ucode_raw->data; in il3945_read_ucode()
1824 il->ucode_ver = le32_to_cpu(ucode->ver); in il3945_read_ucode()
1825 api_ver = IL_UCODE_API(il->ucode_ver); in il3945_read_ucode()
1841 il->ucode_ver = 0; in il3945_read_ucode()
1842 ret = -EINVAL; in il3945_read_ucode()
1852 IL_UCODE_MAJOR(il->ucode_ver), IL_UCODE_MINOR(il->ucode_ver), in il3945_read_ucode()
1853 IL_UCODE_API(il->ucode_ver), IL_UCODE_SERIAL(il->ucode_ver)); in il3945_read_ucode()
1855 snprintf(il->hw->wiphy->fw_version, sizeof(il->hw->wiphy->fw_version), in il3945_read_ucode()
1856 "%u.%u.%u.%u", IL_UCODE_MAJOR(il->ucode_ver), in il3945_read_ucode()
1857 IL_UCODE_MINOR(il->ucode_ver), IL_UCODE_API(il->ucode_ver), in il3945_read_ucode()
1858 IL_UCODE_SERIAL(il->ucode_ver)); in il3945_read_ucode()
1860 D_INFO("f/w package hdr ucode version raw = 0x%x\n", il->ucode_ver); in il3945_read_ucode()
1868 if (ucode_raw->size != in il3945_read_ucode()
1873 ucode_raw->size); in il3945_read_ucode()
1874 ret = -EINVAL; in il3945_read_ucode()
1881 ret = -EINVAL; in il3945_read_ucode()
1887 ret = -EINVAL; in il3945_read_ucode()
1893 ret = -EINVAL; in il3945_read_ucode()
1899 ret = -EINVAL; in il3945_read_ucode()
1905 ret = -EINVAL; in il3945_read_ucode()
1909 /* Allocate ucode buffers for card's bus-master loading ... */ in il3945_read_ucode()
1913 * 2) backup cache for save/restore during power-downs */ in il3945_read_ucode()
1914 il->ucode_code.len = inst_size; in il3945_read_ucode()
1915 il_alloc_fw_desc(il->pci_dev, &il->ucode_code); in il3945_read_ucode()
1917 il->ucode_data.len = data_size; in il3945_read_ucode()
1918 il_alloc_fw_desc(il->pci_dev, &il->ucode_data); in il3945_read_ucode()
1920 il->ucode_data_backup.len = data_size; in il3945_read_ucode()
1921 il_alloc_fw_desc(il->pci_dev, &il->ucode_data_backup); in il3945_read_ucode()
1923 if (!il->ucode_code.v_addr || !il->ucode_data.v_addr || in il3945_read_ucode()
1924 !il->ucode_data_backup.v_addr) in il3945_read_ucode()
1929 il->ucode_init.len = init_size; in il3945_read_ucode()
1930 il_alloc_fw_desc(il->pci_dev, &il->ucode_init); in il3945_read_ucode()
1932 il->ucode_init_data.len = init_data_size; in il3945_read_ucode()
1933 il_alloc_fw_desc(il->pci_dev, &il->ucode_init_data); in il3945_read_ucode()
1935 if (!il->ucode_init.v_addr || !il->ucode_init_data.v_addr) in il3945_read_ucode()
1941 il->ucode_boot.len = boot_size; in il3945_read_ucode()
1942 il_alloc_fw_desc(il->pci_dev, &il->ucode_boot); in il3945_read_ucode()
1944 if (!il->ucode_boot.v_addr) in il3945_read_ucode()
1948 /* Copy images into buffers for card's bus-master reads ... */ in il3945_read_ucode()
1953 memcpy(il->ucode_code.v_addr, src, len); in il3945_read_ucode()
1957 il->ucode_code.v_addr, (u32) il->ucode_code.p_addr); in il3945_read_ucode()
1963 memcpy(il->ucode_data.v_addr, src, len); in il3945_read_ucode()
1964 memcpy(il->ucode_data_backup.v_addr, src, len); in il3945_read_ucode()
1971 memcpy(il->ucode_init.v_addr, src, len); in il3945_read_ucode()
1979 memcpy(il->ucode_init_data.v_addr, src, len); in il3945_read_ucode()
1986 memcpy(il->ucode_boot.v_addr, src, len); in il3945_read_ucode()
1994 ret = -ENOMEM; in il3945_read_ucode()
2005 * il3945_set_ucode_ptrs - Set uCode address location
2020 pinst = il->ucode_code.p_addr; in il3945_set_ucode_ptrs()
2021 pdata = il->ucode_data_backup.p_addr; in il3945_set_ucode_ptrs()
2026 il_wr_prph(il, BSM_DRAM_DATA_BYTECOUNT_REG, il->ucode_data.len); in il3945_set_ucode_ptrs()
2031 il->ucode_code.len | BSM_DRAM_INST_LOAD); in il3945_set_ucode_ptrs()
2039 * il3945_init_alive_start - Called after N_ALIVE notification received
2048 /* Check alive response for "valid" sign from uCode */ in il3945_init_alive_start()
2049 if (il->card_alive_init.is_valid != UCODE_VALID_OK) { in il3945_init_alive_start()
2052 D_INFO("Initialize Alive failed.\n"); in il3945_init_alive_start()
2058 * "initialize" alive if code weren't properly loaded. */ in il3945_init_alive_start()
2067 * load and launch runtime uCode, which will send us another "Alive" in il3945_init_alive_start()
2069 D_INFO("Initialization Alive received.\n"); in il3945_init_alive_start()
2079 queue_work(il->workqueue, &il->restart); in il3945_init_alive_start()
2083 * il3945_alive_start - called after N_ALIVE notification received
2085 * Alive gets handled by il3945_init_alive_start()).
2093 D_INFO("Runtime Alive received.\n"); in il3945_alive_start()
2095 if (il->card_alive.is_valid != UCODE_VALID_OK) { in il3945_alive_start()
2098 D_INFO("Alive failed.\n"); in il3945_alive_start()
2104 * "runtime" alive if code weren't properly loaded. */ in il3945_alive_start()
2116 clear_bit(S_RFKILL, &il->status); in il3945_alive_start()
2128 set_bit(S_RFKILL, &il->status); in il3945_alive_start()
2130 /* After the ALIVE response, we can send commands to 3945 uCode */ in il3945_alive_start()
2131 set_bit(S_ALIVE, &il->status); in il3945_alive_start()
2139 ieee80211_wake_queues(il->hw); in il3945_alive_start()
2141 il->active_rate = RATES_MASK_3945; in il3945_alive_start()
2147 (struct il3945_rxon_cmd *)(&il->active); in il3945_alive_start()
2149 il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK; in il3945_alive_start()
2150 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il3945_alive_start()
2159 set_bit(S_READY, &il->status); in il3945_alive_start()
2166 D_INFO("ALIVE processing complete.\n"); in il3945_alive_start()
2167 wake_up(&il->wait_command_queue); in il3945_alive_start()
2172 queue_work(il->workqueue, &il->restart); in il3945_alive_start()
2187 exit_pending = test_and_set_bit(S_EXIT_PENDING, &il->status); in __il3945_down()
2191 del_timer_sync(&il->watchdog); in __il3945_down()
2199 wake_up_all(&il->wait_command_queue); in __il3945_down()
2204 clear_bit(S_EXIT_PENDING, &il->status); in __il3945_down()
2206 /* stop and reset the on-board processor */ in __il3945_down()
2210 spin_lock_irqsave(&il->lock, flags); in __il3945_down()
2212 spin_unlock_irqrestore(&il->lock, flags); in __il3945_down()
2215 if (il->mac80211_registered) in __il3945_down()
2216 ieee80211_stop_queues(il->hw); in __il3945_down()
2221 il->status = in __il3945_down()
2222 test_bit(S_RFKILL, &il->status) << S_RFKILL | in __il3945_down()
2223 test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED | in __il3945_down()
2224 test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING; in __il3945_down()
2230 il->status &= in __il3945_down()
2231 test_bit(S_RFKILL, &il->status) << S_RFKILL | in __il3945_down()
2232 test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED | in __il3945_down()
2233 test_bit(S_FW_ERROR, &il->status) << S_FW_ERROR | in __il3945_down()
2234 test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING; in __il3945_down()
2237 * We disabled and synchronized interrupt, and priv->mutex is taken, so in __il3945_down()
2241 spin_lock_irq(&il->reg_lock); in __il3945_down()
2246 /* Power-down device's busmaster DMA clocks */ in __il3945_down()
2252 spin_unlock_irq(&il->reg_lock); in __il3945_down()
2256 memset(&il->card_alive, 0, sizeof(struct il_alive_resp)); in __il3945_down()
2257 dev_kfree_skb(il->beacon_skb); in __il3945_down()
2258 il->beacon_skb = NULL; in __il3945_down()
2267 mutex_lock(&il->mutex); in il3945_down()
2269 mutex_unlock(&il->mutex); in il3945_down()
2282 spin_lock_irqsave(&il->sta_lock, flags); in il3945_alloc_bcast_station()
2286 spin_unlock_irqrestore(&il->sta_lock, flags); in il3945_alloc_bcast_station()
2288 return -EINVAL; in il3945_alloc_bcast_station()
2291 il->stations[sta_id].used |= IL_STA_DRIVER_ACTIVE; in il3945_alloc_bcast_station()
2292 il->stations[sta_id].used |= IL_STA_BCAST; in il3945_alloc_bcast_station()
2293 spin_unlock_irqrestore(&il->sta_lock, flags); in il3945_alloc_bcast_station()
2307 if (test_bit(S_EXIT_PENDING, &il->status)) { in __il3945_up()
2309 return -EIO; in __il3945_up()
2312 if (!il->ucode_data_backup.v_addr || !il->ucode_data.v_addr) { in __il3945_up()
2314 return -EIO; in __il3945_up()
2319 clear_bit(S_RFKILL, &il->status); in __il3945_up()
2321 set_bit(S_RFKILL, &il->status); in __il3945_up()
2322 return -ERFKILL; in __il3945_up()
2346 * This will be used to initialize the on-board processor's in __il3945_up()
2348 memcpy(il->ucode_data_backup.v_addr, il->ucode_data.v_addr, in __il3945_up()
2349 il->ucode_data.len); in __il3945_up()
2352 if (test_bit(S_RFKILL, &il->status)) in __il3945_up()
2360 rc = il->ops->load_ucode(il); in __il3945_up()
2375 set_bit(S_EXIT_PENDING, &il->status); in __il3945_up()
2377 clear_bit(S_EXIT_PENDING, &il->status); in __il3945_up()
2382 return -EIO; in __il3945_up()
2397 mutex_lock(&il->mutex); in il3945_bg_init_alive_start()
2398 if (test_bit(S_EXIT_PENDING, &il->status)) in il3945_bg_init_alive_start()
2403 mutex_unlock(&il->mutex); in il3945_bg_init_alive_start()
2412 mutex_lock(&il->mutex); in il3945_bg_alive_start()
2413 if (test_bit(S_EXIT_PENDING, &il->status) || il->txq == NULL) in il3945_bg_alive_start()
2418 mutex_unlock(&il->mutex); in il3945_bg_alive_start()
2432 bool old_rfkill = test_bit(S_RFKILL, &il->status); in il3945_rfkill_poll()
2438 set_bit(S_RFKILL, &il->status); in il3945_rfkill_poll()
2440 clear_bit(S_RFKILL, &il->status); in il3945_rfkill_poll()
2442 wiphy_rfkill_set_hw_state(il->hw->wiphy, new_rfkill); in il3945_rfkill_poll()
2450 queue_delayed_work(il->workqueue, &il->_3945.rfkill_poll, in il3945_rfkill_poll()
2470 lockdep_assert_held(&il->mutex); in il3945_request_scan()
2472 if (!il->scan_cmd) { in il3945_request_scan()
2473 il->scan_cmd = in il3945_request_scan()
2476 if (!il->scan_cmd) { in il3945_request_scan()
2478 return -ENOMEM; in il3945_request_scan()
2481 scan = il->scan_cmd; in il3945_request_scan()
2484 scan->quiet_plcp_th = IL_PLCP_QUIET_THRESH; in il3945_request_scan()
2485 scan->quiet_time = IL_ACTIVE_QUIET_TIME; in il3945_request_scan()
2495 interval = vif->bss_conf.beacon_int; in il3945_request_scan()
2497 scan->suspend_time = 0; in il3945_request_scan()
2498 scan->max_out_time = cpu_to_le32(200 * 1024); in il3945_request_scan()
2503 * 0-19: beacon interval in usec (time before exec.) in il3945_request_scan()
2504 * 20-23: 0 in il3945_request_scan()
2505 * 24-31: number of beacons (suspend between channels) in il3945_request_scan()
2512 scan->suspend_time = cpu_to_le32(scan_suspend_time); in il3945_request_scan()
2517 if (il->scan_request->n_ssids) { in il3945_request_scan()
2520 for (i = 0; i < il->scan_request->n_ssids; i++) { in il3945_request_scan()
2522 if (!il->scan_request->ssids[i].ssid_len) in il3945_request_scan()
2524 scan->direct_scan[p].id = WLAN_EID_SSID; in il3945_request_scan()
2525 scan->direct_scan[p].len = in il3945_request_scan()
2526 il->scan_request->ssids[i].ssid_len; in il3945_request_scan()
2527 memcpy(scan->direct_scan[p].ssid, in il3945_request_scan()
2528 il->scan_request->ssids[i].ssid, in il3945_request_scan()
2529 il->scan_request->ssids[i].ssid_len); in il3945_request_scan()
2539 scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; in il3945_request_scan()
2540 scan->tx_cmd.sta_id = il->hw_params.bcast_id; in il3945_request_scan()
2541 scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; in il3945_request_scan()
2545 switch (il->scan_band) { in il3945_request_scan()
2547 scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; in il3945_request_scan()
2548 scan->tx_cmd.rate = RATE_1M_PLCP; in il3945_request_scan()
2552 scan->tx_cmd.rate = RATE_6M_PLCP; in il3945_request_scan()
2557 return -EIO; in il3945_request_scan()
2565 scan->good_CRC_th = in il3945_request_scan()
2569 il_fill_probe_req(il, (struct ieee80211_mgmt *)scan->data, in il3945_request_scan()
2570 vif->addr, il->scan_request->ie, in il3945_request_scan()
2571 il->scan_request->ie_len, in il3945_request_scan()
2572 IL_MAX_SCAN_SIZE - sizeof(*scan)); in il3945_request_scan()
2573 scan->tx_cmd.len = cpu_to_le16(len); in il3945_request_scan()
2576 scan->flags |= il3945_get_antenna_flags(il); in il3945_request_scan()
2578 scan->channel_count = in il3945_request_scan()
2580 (void *)&scan->data[len], vif); in il3945_request_scan()
2581 if (scan->channel_count == 0) { in il3945_request_scan()
2582 D_SCAN("channel count %d\n", scan->channel_count); in il3945_request_scan()
2583 return -EIO; in il3945_request_scan()
2587 le16_to_cpu(scan->tx_cmd.len) + in il3945_request_scan()
2588 scan->channel_count * sizeof(struct il3945_scan_channel); in il3945_request_scan()
2590 scan->len = cpu_to_le16(cmd.len); in il3945_request_scan()
2592 set_bit(S_SCAN_HW, &il->status); in il3945_request_scan()
2595 clear_bit(S_SCAN_HW, &il->status); in il3945_request_scan()
2606 if (memcmp(&il->staging, &il->active, sizeof(il->staging))) in il3945_post_scan()
2615 if (test_bit(S_EXIT_PENDING, &il->status)) in il3945_bg_restart()
2618 if (test_and_clear_bit(S_FW_ERROR, &il->status)) { in il3945_bg_restart()
2619 mutex_lock(&il->mutex); in il3945_bg_restart()
2620 il->is_open = 0; in il3945_bg_restart()
2621 mutex_unlock(&il->mutex); in il3945_bg_restart()
2623 ieee80211_restart_hw(il->hw); in il3945_bg_restart()
2627 mutex_lock(&il->mutex); in il3945_bg_restart()
2628 if (test_bit(S_EXIT_PENDING, &il->status)) { in il3945_bg_restart()
2629 mutex_unlock(&il->mutex); in il3945_bg_restart()
2634 mutex_unlock(&il->mutex); in il3945_bg_restart()
2643 mutex_lock(&il->mutex); in il3945_bg_rx_replenish()
2644 if (test_bit(S_EXIT_PENDING, &il->status)) in il3945_bg_rx_replenish()
2649 mutex_unlock(&il->mutex); in il3945_bg_rx_replenish()
2657 if (!il->vif || !il->is_open) in il3945_post_associate()
2660 D_ASSOC("Associated as %d to: %pM\n", il->vif->cfg.aid, in il3945_post_associate()
2661 il->active.bssid_addr); in il3945_post_associate()
2663 if (test_bit(S_EXIT_PENDING, &il->status)) in il3945_post_associate()
2668 il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il3945_post_associate()
2673 IL_WARN("C_RXON_TIMING failed - " "Attempting to continue.\n"); in il3945_post_associate()
2675 il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK; in il3945_post_associate()
2677 il->staging.assoc_id = cpu_to_le16(il->vif->cfg.aid); in il3945_post_associate()
2679 D_ASSOC("assoc id %d beacon interval %d\n", il->vif->cfg.aid, in il3945_post_associate()
2680 il->vif->bss_conf.beacon_int); in il3945_post_associate()
2682 if (il->vif->bss_conf.use_short_preamble) in il3945_post_associate()
2683 il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; in il3945_post_associate()
2685 il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; in il3945_post_associate()
2687 if (il->staging.flags & RXON_FLG_BAND_24G_MSK) { in il3945_post_associate()
2688 if (il->vif->bss_conf.use_short_slot) in il3945_post_associate()
2689 il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; in il3945_post_associate()
2691 il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK; in il3945_post_associate()
2696 switch (il->vif->type) { in il3945_post_associate()
2698 il3945_rate_scale_init(il->hw, IL_AP_ID); in il3945_post_associate()
2705 il->vif->type); in il3945_post_associate()
2721 struct il_priv *il = hw->priv; in il3945_mac_start()
2725 mutex_lock(&il->mutex); in il3945_mac_start()
2728 /* fetch ucode file from disk, alloc and copy to bus-master buffers ... in il3945_mac_start()
2729 * ucode filename and max sizes are card-specific. */ in il3945_mac_start()
2731 if (!il->ucode_code.len) { in il3945_mac_start()
2735 mutex_unlock(&il->mutex); in il3945_mac_start()
2742 mutex_unlock(&il->mutex); in il3945_mac_start()
2751 ret = wait_event_timeout(il->wait_command_queue, in il3945_mac_start()
2752 test_bit(S_READY, &il->status), in il3945_mac_start()
2755 if (!test_bit(S_READY, &il->status)) { in il3945_mac_start()
2758 ret = -ETIMEDOUT; in il3945_mac_start()
2765 cancel_delayed_work(&il->_3945.rfkill_poll); in il3945_mac_start()
2767 il->is_open = 1; in il3945_mac_start()
2772 il->is_open = 0; in il3945_mac_start()
2773 D_MAC80211("leave - failed\n"); in il3945_mac_start()
2780 struct il_priv *il = hw->priv; in il3945_mac_stop()
2784 if (!il->is_open) { in il3945_mac_stop()
2785 D_MAC80211("leave - skip\n"); in il3945_mac_stop()
2789 il->is_open = 0; in il3945_mac_stop()
2793 flush_workqueue(il->workqueue); in il3945_mac_stop()
2796 queue_delayed_work(il->workqueue, &il->_3945.rfkill_poll, in il3945_mac_stop()
2807 struct il_priv *il = hw->priv; in il3945_mac_tx()
2811 D_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, in il3945_mac_tx()
2812 ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); in il3945_mac_tx()
2814 if (il3945_tx_skb(il, control->sta, skb)) in il3945_mac_tx()
2823 struct ieee80211_vif *vif = il->vif; in il3945_config_ap()
2826 if (test_bit(S_EXIT_PENDING, &il->status)) in il3945_config_ap()
2832 /* RXON - unassoc (to set timing command) */ in il3945_config_ap()
2833 il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; in il3945_config_ap()
2839 IL_WARN("C_RXON_TIMING failed - " in il3945_config_ap()
2842 il->staging.assoc_id = 0; in il3945_config_ap()
2844 if (vif->bss_conf.use_short_preamble) in il3945_config_ap()
2845 il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; in il3945_config_ap()
2847 il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; in il3945_config_ap()
2849 if (il->staging.flags & RXON_FLG_BAND_24G_MSK) { in il3945_config_ap()
2850 if (vif->bss_conf.use_short_slot) in il3945_config_ap()
2851 il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; in il3945_config_ap()
2853 il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK; in il3945_config_ap()
2856 il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK; in il3945_config_ap()
2867 struct il_priv *il = hw->priv; in il3945_mac_set_key()
2875 D_MAC80211("leave - hwcrypto disabled\n"); in il3945_mac_set_key()
2876 return -EOPNOTSUPP; in il3945_mac_set_key()
2883 if (vif->type == NL80211_IFTYPE_ADHOC && in il3945_mac_set_key()
2884 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { in il3945_mac_set_key()
2885 D_MAC80211("leave - IBSS RSN\n"); in il3945_mac_set_key()
2886 return -EOPNOTSUPP; in il3945_mac_set_key()
2894 D_MAC80211("leave - station not found\n"); in il3945_mac_set_key()
2895 return -EINVAL; in il3945_mac_set_key()
2899 mutex_lock(&il->mutex); in il3945_mac_set_key()
2918 ret = -EINVAL; in il3945_mac_set_key()
2922 mutex_unlock(&il->mutex); in il3945_mac_set_key()
2931 struct il_priv *il = hw->priv; in il3945_mac_sta_add()
2932 struct il3945_sta_priv *sta_priv = (void *)sta->drv_priv; in il3945_mac_sta_add()
2934 bool is_ap = vif->type == NL80211_IFTYPE_STATION; in il3945_mac_sta_add()
2937 mutex_lock(&il->mutex); in il3945_mac_sta_add()
2938 D_INFO("station %pM\n", sta->addr); in il3945_mac_sta_add()
2939 sta_priv->common.sta_id = IL_INVALID_STATION; in il3945_mac_sta_add()
2941 ret = il_add_station_common(il, sta->addr, is_ap, sta, &sta_id); in il3945_mac_sta_add()
2943 IL_ERR("Unable to add station %pM (%d)\n", sta->addr, ret); in il3945_mac_sta_add()
2945 mutex_unlock(&il->mutex); in il3945_mac_sta_add()
2949 sta_priv->common.sta_id = sta_id; in il3945_mac_sta_add()
2952 D_INFO("Initializing rate scaling for station %pM\n", sta->addr); in il3945_mac_sta_add()
2954 mutex_unlock(&il->mutex); in il3945_mac_sta_add()
2963 struct il_priv *il = hw->priv; in il3945_configure_filter()
2982 mutex_lock(&il->mutex); in il3945_configure_filter()
2984 il->staging.filter_flags &= ~filter_nand; in il3945_configure_filter()
2985 il->staging.filter_flags |= filter_or; in il3945_configure_filter()
2993 mutex_unlock(&il->mutex); in il3945_configure_filter()
3045 il->debug_level = val; in il3945_store_debug_level()
3062 return -EAGAIN; in il3945_show_temperature()
3073 return sprintf(buf, "%d\n", il->tx_power_user_lmt); in il3945_show_tx_power()
3100 return sprintf(buf, "0x%04X\n", il->active.flags); in il3945_show_flags()
3110 mutex_lock(&il->mutex); in il3945_store_flags()
3111 if (le32_to_cpu(il->staging.flags) != flags) { in il3945_store_flags()
3117 il->staging.flags = cpu_to_le32(flags); in il3945_store_flags()
3121 mutex_unlock(&il->mutex); in il3945_store_flags()
3134 return sprintf(buf, "0x%04X\n", le32_to_cpu(il->active.filter_flags)); in il3945_show_filter_flags()
3144 mutex_lock(&il->mutex); in il3945_store_filter_flags()
3145 if (le32_to_cpu(il->staging.filter_flags) != filter_flags) { in il3945_store_filter_flags()
3152 il->staging.filter_flags = cpu_to_le32(filter_flags); in il3945_store_filter_flags()
3156 mutex_unlock(&il->mutex); in il3945_store_filter_flags()
3174 spin_lock_irqsave(&il->lock, flags); in il3945_show_measurement()
3175 if (!(il->measurement_status & MEASUREMENT_READY)) { in il3945_show_measurement()
3176 spin_unlock_irqrestore(&il->lock, flags); in il3945_show_measurement()
3179 memcpy(&measure_report, &il->measure_report, size); in il3945_show_measurement()
3180 il->measurement_status = 0; in il3945_show_measurement()
3181 spin_unlock_irqrestore(&il->lock, flags); in il3945_show_measurement()
3183 while (size && PAGE_SIZE - len) { in il3945_show_measurement()
3185 PAGE_SIZE - len, true); in il3945_show_measurement()
3187 if (PAGE_SIZE - len) in il3945_show_measurement()
3191 size -= min(size, 16U); in il3945_show_measurement()
3203 .channel = le16_to_cpu(il->active.channel), in il3945_store_measurement()
3204 .start_time = cpu_to_le64(il->_3945.last_tsf), in il3945_store_measurement()
3241 il->retry_rate = simple_strtoul(buf, NULL, 0); in il3945_store_retry_rate()
3242 if (il->retry_rate <= 0) in il3945_store_retry_rate()
3243 il->retry_rate = 1; in il3945_store_retry_rate()
3253 return sprintf(buf, "%d", il->retry_rate); in il3945_show_retry_rate()
3274 return -EAGAIN; in il3945_show_antenna()
3310 return -EAGAIN; in il3945_show_status()
3311 return sprintf(buf, "0x%08x\n", (int)il->status); in il3945_show_status()
3340 il->workqueue = create_singlethread_workqueue(DRV_NAME); in il3945_setup_deferred_work()
3341 if (!il->workqueue) in il3945_setup_deferred_work()
3342 return -ENOMEM; in il3945_setup_deferred_work()
3344 init_waitqueue_head(&il->wait_command_queue); in il3945_setup_deferred_work()
3346 INIT_WORK(&il->restart, il3945_bg_restart); in il3945_setup_deferred_work()
3347 INIT_WORK(&il->rx_replenish, il3945_bg_rx_replenish); in il3945_setup_deferred_work()
3348 INIT_DELAYED_WORK(&il->init_alive_start, il3945_bg_init_alive_start); in il3945_setup_deferred_work()
3349 INIT_DELAYED_WORK(&il->alive_start, il3945_bg_alive_start); in il3945_setup_deferred_work()
3350 INIT_DELAYED_WORK(&il->_3945.rfkill_poll, il3945_rfkill_poll); in il3945_setup_deferred_work()
3356 timer_setup(&il->watchdog, il_bg_watchdog, 0); in il3945_setup_deferred_work()
3358 tasklet_setup(&il->irq_tasklet, il3945_irq_tasklet); in il3945_setup_deferred_work()
3368 cancel_delayed_work_sync(&il->init_alive_start); in il3945_cancel_deferred_work()
3369 cancel_delayed_work(&il->alive_start); in il3945_cancel_deferred_work()
3425 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom; in il3945_init_drv()
3427 il->retry_rate = 1; in il3945_init_drv()
3428 il->beacon_skb = NULL; in il3945_init_drv()
3430 spin_lock_init(&il->sta_lock); in il3945_init_drv()
3431 spin_lock_init(&il->hcmd_lock); in il3945_init_drv()
3433 INIT_LIST_HEAD(&il->free_frames); in il3945_init_drv()
3435 mutex_init(&il->mutex); in il3945_init_drv()
3437 il->ieee_channels = NULL; in il3945_init_drv()
3438 il->ieee_rates = NULL; in il3945_init_drv()
3439 il->band = NL80211_BAND_2GHZ; in il3945_init_drv()
3441 il->iw_mode = NL80211_IFTYPE_STATION; in il3945_init_drv()
3442 il->missed_beacon_threshold = IL_MISSED_BEACON_THRESHOLD_DEF; in il3945_init_drv()
3445 il->force_reset.reset_duration = IL_DELAY_NEXT_FORCE_FW_RELOAD; in il3945_init_drv()
3447 if (eeprom->version < EEPROM_3945_EEPROM_VERSION) { in il3945_init_drv()
3449 eeprom->version); in il3945_init_drv()
3450 ret = -EINVAL; in il3945_init_drv()
3461 ret = -EIO; in il3945_init_drv()
3470 il3945_init_hw_rates(il, il->ieee_rates); in il3945_init_drv()
3486 struct ieee80211_hw *hw = il->hw; in il3945_setup_mac()
3488 hw->rate_control_algorithm = "iwl-3945-rs"; in il3945_setup_mac()
3489 hw->sta_data_size = sizeof(struct il3945_sta_priv); in il3945_setup_mac()
3490 hw->vif_data_size = sizeof(struct il_vif_priv); in il3945_setup_mac()
3498 hw->wiphy->interface_modes = in il3945_setup_mac()
3501 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in il3945_setup_mac()
3502 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in il3945_setup_mac()
3505 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; in il3945_setup_mac()
3507 hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945; in il3945_setup_mac()
3508 /* we create the 802.11 header and a zero-length SSID element */ in il3945_setup_mac()
3509 hw->wiphy->max_scan_ie_len = IL3945_MAX_PROBE_REQUEST - 24 - 2; in il3945_setup_mac()
3512 hw->queues = 4; in il3945_setup_mac()
3514 if (il->bands[NL80211_BAND_2GHZ].n_channels) in il3945_setup_mac()
3515 il->hw->wiphy->bands[NL80211_BAND_2GHZ] = in il3945_setup_mac()
3516 &il->bands[NL80211_BAND_2GHZ]; in il3945_setup_mac()
3518 if (il->bands[NL80211_BAND_5GHZ].n_channels) in il3945_setup_mac()
3519 il->hw->wiphy->bands[NL80211_BAND_5GHZ] = in il3945_setup_mac()
3520 &il->bands[NL80211_BAND_5GHZ]; in il3945_setup_mac()
3524 wiphy_ext_feature_set(il->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in il3945_setup_mac()
3526 ret = ieee80211_register_hw(il->hw); in il3945_setup_mac()
3531 il->mac80211_registered = 1; in il3945_setup_mac()
3542 struct il_cfg *cfg = (struct il_cfg *)(ent->driver_data); in il3945_pci_probe()
3552 err = -ENOMEM; in il3945_pci_probe()
3555 il = hw->priv; in il3945_pci_probe()
3556 il->hw = hw; in il3945_pci_probe()
3557 SET_IEEE80211_DEV(hw, &pdev->dev); in il3945_pci_probe()
3559 il->cmd_queue = IL39_CMD_QUEUE_NUM; in il3945_pci_probe()
3562 il->cfg = cfg; in il3945_pci_probe()
3563 il->ops = &il3945_ops; in il3945_pci_probe()
3565 il->debugfs_ops = &il3945_debugfs_ops; in il3945_pci_probe()
3567 il->pci_dev = pdev; in il3945_pci_probe()
3568 il->inta_mask = CSR_INI_SET_MASK; in il3945_pci_probe()
3578 err = -ENODEV; in il3945_pci_probe()
3584 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in il3945_pci_probe()
3598 il->hw_base = pci_ioremap_bar(pdev, 0); in il3945_pci_probe()
3599 if (!il->hw_base) { in il3945_pci_probe()
3600 err = -ENODEV; in il3945_pci_probe()
3606 D_INFO("pci_resource_base = %p\n", il->hw_base); in il3945_pci_probe()
3615 spin_lock_init(&il->reg_lock); in il3945_pci_probe()
3616 spin_lock_init(&il->lock); in il3945_pci_probe()
3619 * stop and reset the on-board processor just in case it is in a in il3945_pci_probe()
3636 eeprom = (struct il3945_eeprom *)il->eeprom; in il3945_pci_probe()
3637 D_INFO("MAC address: %pM\n", eeprom->mac_address); in il3945_pci_probe()
3638 SET_IEEE80211_PERM_ADDR(il->hw, eeprom->mac_address); in il3945_pci_probe()
3643 /* Device-specific setup */ in il3945_pci_probe()
3660 IL_INFO("Detected Intel Wireless WiFi Link %s\n", il->cfg->name); in il3945_pci_probe()
3666 spin_lock_irqsave(&il->lock, flags); in il3945_pci_probe()
3668 spin_unlock_irqrestore(&il->lock, flags); in il3945_pci_probe()
3670 pci_enable_msi(il->pci_dev); in il3945_pci_probe()
3672 err = request_irq(il->pci_dev->irq, il_isr, IRQF_SHARED, DRV_NAME, il); in il3945_pci_probe()
3674 IL_ERR("Error allocating IRQ %d\n", il->pci_dev->irq); in il3945_pci_probe()
3678 err = sysfs_create_group(&pdev->dev.kobj, &il3945_attribute_group); in il3945_pci_probe()
3684 il_set_rxon_channel(il, &il->bands[NL80211_BAND_2GHZ].channels[5]); in il3945_pci_probe()
3705 queue_delayed_work(il->workqueue, &il->_3945.rfkill_poll, 2 * HZ); in il3945_pci_probe()
3710 destroy_workqueue(il->workqueue); in il3945_pci_probe()
3711 il->workqueue = NULL; in il3945_pci_probe()
3713 sysfs_remove_group(&pdev->dev.kobj, &il3945_attribute_group); in il3945_pci_probe()
3715 free_irq(il->pci_dev->irq, il); in il3945_pci_probe()
3717 pci_disable_msi(il->pci_dev); in il3945_pci_probe()
3725 iounmap(il->hw_base); in il3945_pci_probe()
3731 ieee80211_free_hw(il->hw); in il3945_pci_probe()
3749 set_bit(S_EXIT_PENDING, &il->status); in il3945_pci_remove()
3753 if (il->mac80211_registered) { in il3945_pci_remove()
3754 ieee80211_unregister_hw(il->hw); in il3945_pci_remove()
3755 il->mac80211_registered = 0; in il3945_pci_remove()
3772 spin_lock_irqsave(&il->lock, flags); in il3945_pci_remove()
3774 spin_unlock_irqrestore(&il->lock, flags); in il3945_pci_remove()
3778 sysfs_remove_group(&pdev->dev.kobj, &il3945_attribute_group); in il3945_pci_remove()
3780 cancel_delayed_work_sync(&il->_3945.rfkill_poll); in il3945_pci_remove()
3784 if (il->rxq.bd) in il3945_pci_remove()
3785 il3945_rx_queue_free(il, &il->rxq); in il3945_pci_remove()
3793 * il->workqueue... so we can't take down the workqueue in il3945_pci_remove()
3795 destroy_workqueue(il->workqueue); in il3945_pci_remove()
3796 il->workqueue = NULL; in il3945_pci_remove()
3798 free_irq(pdev->irq, il); in il3945_pci_remove()
3801 iounmap(il->hw_base); in il3945_pci_remove()
3807 kfree(il->scan_cmd); in il3945_pci_remove()
3808 dev_kfree_skb(il->beacon_skb); in il3945_pci_remove()
3809 ieee80211_free_hw(il->hw); in il3945_pci_remove()
3823 .driver.pm = IL_LEGACY_PM_OPS,