1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/kernel.h>
28#include <linux/module.h>
29#include <linux/slab.h>
30#include <linux/pci.h>
31#include <linux/dma-mapping.h>
32#include <linux/delay.h>
33#include <linux/sched.h>
34#include <linux/skbuff.h>
35#include <linux/netdevice.h>
36#include <linux/firmware.h>
37#include <linux/etherdevice.h>
38#include <asm/unaligned.h>
39#include <net/mac80211.h>
40
41#include "common.h"
42#include "3945.h"
43
44
45static int
46il3945_send_led_cmd(struct il_priv *il, struct il_led_cmd *led_cmd)
47{
48 struct il_host_cmd cmd = {
49 .id = C_LEDS,
50 .len = sizeof(struct il_led_cmd),
51 .data = led_cmd,
52 .flags = CMD_ASYNC,
53 .callback = NULL,
54 };
55
56 return il_send_cmd(il, &cmd);
57}
58
59#define IL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np) \
60 [RATE_##r##M_IDX] = { RATE_##r##M_PLCP, \
61 RATE_##r##M_IEEE, \
62 RATE_##ip##M_IDX, \
63 RATE_##in##M_IDX, \
64 RATE_##rp##M_IDX, \
65 RATE_##rn##M_IDX, \
66 RATE_##pp##M_IDX, \
67 RATE_##np##M_IDX, \
68 RATE_##r##M_IDX_TBL, \
69 RATE_##ip##M_IDX_TBL }
70
71
72
73
74
75
76
77
78
79const struct il3945_rate_info il3945_rates[RATE_COUNT_3945] = {
80 IL_DECLARE_RATE_INFO(1, INV, 2, INV, 2, INV, 2),
81 IL_DECLARE_RATE_INFO(2, 1, 5, 1, 5, 1, 5),
82 IL_DECLARE_RATE_INFO(5, 2, 6, 2, 11, 2, 11),
83 IL_DECLARE_RATE_INFO(11, 9, 12, 5, 12, 5, 18),
84 IL_DECLARE_RATE_INFO(6, 5, 9, 5, 11, 5, 11),
85 IL_DECLARE_RATE_INFO(9, 6, 11, 5, 11, 5, 11),
86 IL_DECLARE_RATE_INFO(12, 11, 18, 11, 18, 11, 18),
87 IL_DECLARE_RATE_INFO(18, 12, 24, 12, 24, 11, 24),
88 IL_DECLARE_RATE_INFO(24, 18, 36, 18, 36, 18, 36),
89 IL_DECLARE_RATE_INFO(36, 24, 48, 24, 48, 24, 48),
90 IL_DECLARE_RATE_INFO(48, 36, 54, 36, 54, 36, 54),
91 IL_DECLARE_RATE_INFO(54, 48, INV, 48, INV, 48, INV),
92};
93
94static inline u8
95il3945_get_prev_ieee_rate(u8 rate_idx)
96{
97 u8 rate = il3945_rates[rate_idx].prev_ieee;
98
99 if (rate == RATE_INVALID)
100 rate = rate_idx;
101 return rate;
102}
103
104
105#define IL_EVT_DISABLE (0)
106#define IL_EVT_DISABLE_SIZE (1532/32)
107
108
109
110
111
112
113
114
115
116
117void
118il3945_disable_events(struct il_priv *il)
119{
120 int i;
121 u32 base;
122 u32 disable_ptr;
123 u32 array_size;
124 static const u32 evt_disable[IL_EVT_DISABLE_SIZE] = {
125 0x00000000,
126 0x00000000,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x00000000,
140 0x00000000,
141 0x00000000,
142 0x00000000,
143 0x00000000,
144 0x00000000,
145 0x00000000,
146 0x00000000,
147 0x00000000,
148 0x00000000,
149 0x00000000,
150 0x00000000,
151 0x00000000,
152 0x00000000,
153 0x00000000,
154 0x00000000,
155 0x00000000,
156 0x00000000,
157 0x00000000,
158 0x00000000,
159 0x00000000,
160 0x00000000,
161 0x00000000,
162 0x00000000,
163 0x00000000,
164 0x00000000,
165 0x00000000,
166 0x00000000,
167 0x00000000,
168 0x00000000,
169 0x00000000,
170 0x00000000,
171 0x00000000,
172 };
173
174 base = le32_to_cpu(il->card_alive.log_event_table_ptr);
175 if (!il3945_hw_valid_rtc_data_addr(base)) {
176 IL_ERR("Invalid event log pointer 0x%08X\n", base);
177 return;
178 }
179
180 disable_ptr = il_read_targ_mem(il, base + (4 * sizeof(u32)));
181 array_size = il_read_targ_mem(il, base + (5 * sizeof(u32)));
182
183 if (IL_EVT_DISABLE && array_size == IL_EVT_DISABLE_SIZE) {
184 D_INFO("Disabling selected uCode log events at 0x%x\n",
185 disable_ptr);
186 for (i = 0; i < IL_EVT_DISABLE_SIZE; i++)
187 il_write_targ_mem(il, disable_ptr + (i * sizeof(u32)),
188 evt_disable[i]);
189
190 } else {
191 D_INFO("Selected uCode log events may be disabled\n");
192 D_INFO(" by writing \"1\"s into disable bitmap\n");
193 D_INFO(" in SRAM at 0x%x, size %d u32s\n", disable_ptr,
194 array_size);
195 }
196
197}
198
199static int
200il3945_hwrate_to_plcp_idx(u8 plcp)
201{
202 int idx;
203
204 for (idx = 0; idx < RATE_COUNT_3945; idx++)
205 if (il3945_rates[idx].plcp == plcp)
206 return idx;
207 return -1;
208}
209
210#ifdef CONFIG_IWLEGACY_DEBUG
211#define TX_STATUS_ENTRY(x) case TX_3945_STATUS_FAIL_ ## x: return #x
212
213static const char *
214il3945_get_tx_fail_reason(u32 status)
215{
216 switch (status & TX_STATUS_MSK) {
217 case TX_3945_STATUS_SUCCESS:
218 return "SUCCESS";
219 TX_STATUS_ENTRY(SHORT_LIMIT);
220 TX_STATUS_ENTRY(LONG_LIMIT);
221 TX_STATUS_ENTRY(FIFO_UNDERRUN);
222 TX_STATUS_ENTRY(MGMNT_ABORT);
223 TX_STATUS_ENTRY(NEXT_FRAG);
224 TX_STATUS_ENTRY(LIFE_EXPIRE);
225 TX_STATUS_ENTRY(DEST_PS);
226 TX_STATUS_ENTRY(ABORTED);
227 TX_STATUS_ENTRY(BT_RETRY);
228 TX_STATUS_ENTRY(STA_INVALID);
229 TX_STATUS_ENTRY(FRAG_DROPPED);
230 TX_STATUS_ENTRY(TID_DISABLE);
231 TX_STATUS_ENTRY(FRAME_FLUSHED);
232 TX_STATUS_ENTRY(INSUFFICIENT_CF_POLL);
233 TX_STATUS_ENTRY(TX_LOCKED);
234 TX_STATUS_ENTRY(NO_BEACON_ON_RADAR);
235 }
236
237 return "UNKNOWN";
238}
239#else
240static inline const char *
241il3945_get_tx_fail_reason(u32 status)
242{
243 return "";
244}
245#endif
246
247
248
249
250
251
252int
253il3945_rs_next_rate(struct il_priv *il, int rate)
254{
255 int next_rate = il3945_get_prev_ieee_rate(rate);
256
257 switch (il->band) {
258 case NL80211_BAND_5GHZ:
259 if (rate == RATE_12M_IDX)
260 next_rate = RATE_9M_IDX;
261 else if (rate == RATE_6M_IDX)
262 next_rate = RATE_6M_IDX;
263 break;
264 case NL80211_BAND_2GHZ:
265 if (!(il->_3945.sta_supp_rates & IL_OFDM_RATES_MASK) &&
266 il_is_associated(il)) {
267 if (rate == RATE_11M_IDX)
268 next_rate = RATE_5M_IDX;
269 }
270 break;
271
272 default:
273 break;
274 }
275
276 return next_rate;
277}
278
279
280
281
282
283
284
285
286static void
287il3945_tx_queue_reclaim(struct il_priv *il, int txq_id, int idx)
288{
289 struct il_tx_queue *txq = &il->txq[txq_id];
290 struct il_queue *q = &txq->q;
291 struct sk_buff *skb;
292
293 BUG_ON(txq_id == IL39_CMD_QUEUE_NUM);
294
295 for (idx = il_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx;
296 q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd)) {
297
298 skb = txq->skbs[txq->q.read_ptr];
299 ieee80211_tx_status_irqsafe(il->hw, skb);
300 txq->skbs[txq->q.read_ptr] = NULL;
301 il->ops->txq_free_tfd(il, txq);
302 }
303
304 if (il_queue_space(q) > q->low_mark && txq_id >= 0 &&
305 txq_id != IL39_CMD_QUEUE_NUM && il->mac80211_registered)
306 il_wake_queue(il, txq);
307}
308
309
310
311
312static void
313il3945_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb)
314{
315 struct il_rx_pkt *pkt = rxb_addr(rxb);
316 u16 sequence = le16_to_cpu(pkt->hdr.sequence);
317 int txq_id = SEQ_TO_QUEUE(sequence);
318 int idx = SEQ_TO_IDX(sequence);
319 struct il_tx_queue *txq = &il->txq[txq_id];
320 struct ieee80211_tx_info *info;
321 struct il3945_tx_resp *tx_resp = (void *)&pkt->u.raw[0];
322 u32 status = le32_to_cpu(tx_resp->status);
323 int rate_idx;
324 int fail;
325
326 if (idx >= txq->q.n_bd || il_queue_used(&txq->q, idx) == 0) {
327 IL_ERR("Read idx for DMA queue txq_id (%d) idx %d "
328 "is out of range [0-%d] %d %d\n", txq_id, idx,
329 txq->q.n_bd, txq->q.write_ptr, txq->q.read_ptr);
330 return;
331 }
332
333
334
335
336
337
338
339
340 if (unlikely((status & TX_STATUS_MSK) == TX_STATUS_FAIL_PASSIVE_NO_RX) &&
341 il->iw_mode == NL80211_IFTYPE_STATION) {
342 il_stop_queues_by_reason(il, IL_STOP_REASON_PASSIVE);
343 D_INFO("Stopped queues - RX waiting on passive channel\n");
344 }
345
346 txq->time_stamp = jiffies;
347 info = IEEE80211_SKB_CB(txq->skbs[txq->q.read_ptr]);
348 ieee80211_tx_info_clear_status(info);
349
350
351 rate_idx = il3945_hwrate_to_plcp_idx(tx_resp->rate);
352 if (info->band == NL80211_BAND_5GHZ)
353 rate_idx -= IL_FIRST_OFDM_RATE;
354
355 fail = tx_resp->failure_frame;
356
357 info->status.rates[0].idx = rate_idx;
358 info->status.rates[0].count = fail + 1;
359
360
361 info->flags |=
362 ((status & TX_STATUS_MSK) ==
363 TX_STATUS_SUCCESS) ? IEEE80211_TX_STAT_ACK : 0;
364
365 D_TX("Tx queue %d Status %s (0x%08x) plcp rate %d retries %d\n", txq_id,
366 il3945_get_tx_fail_reason(status), status, tx_resp->rate,
367 tx_resp->failure_frame);
368
369 D_TX_REPLY("Tx queue reclaim %d\n", idx);
370 il3945_tx_queue_reclaim(il, txq_id, idx);
371
372 if (status & TX_ABORT_REQUIRED_MSK)
373 IL_ERR("TODO: Implement Tx ABORT REQUIRED!!!\n");
374}
375
376
377
378
379
380
381
382
383#ifdef CONFIG_IWLEGACY_DEBUGFS
384static void
385il3945_accumulative_stats(struct il_priv *il, __le32 * stats)
386{
387 int i;
388 __le32 *prev_stats;
389 u32 *accum_stats;
390 u32 *delta, *max_delta;
391
392 prev_stats = (__le32 *) &il->_3945.stats;
393 accum_stats = (u32 *) &il->_3945.accum_stats;
394 delta = (u32 *) &il->_3945.delta_stats;
395 max_delta = (u32 *) &il->_3945.max_delta;
396
397 for (i = sizeof(__le32); i < sizeof(struct il3945_notif_stats);
398 i +=
399 sizeof(__le32), stats++, prev_stats++, delta++, max_delta++,
400 accum_stats++) {
401 if (le32_to_cpu(*stats) > le32_to_cpu(*prev_stats)) {
402 *delta =
403 (le32_to_cpu(*stats) - le32_to_cpu(*prev_stats));
404 *accum_stats += *delta;
405 if (*delta > *max_delta)
406 *max_delta = *delta;
407 }
408 }
409
410
411 il->_3945.accum_stats.general.temperature =
412 il->_3945.stats.general.temperature;
413 il->_3945.accum_stats.general.ttl_timestamp =
414 il->_3945.stats.general.ttl_timestamp;
415}
416#endif
417
418void
419il3945_hdl_stats(struct il_priv *il, struct il_rx_buf *rxb)
420{
421 struct il_rx_pkt *pkt = rxb_addr(rxb);
422
423 D_RX("Statistics notification received (%d vs %d).\n",
424 (int)sizeof(struct il3945_notif_stats),
425 le32_to_cpu(pkt->len_n_flags) & IL_RX_FRAME_SIZE_MSK);
426#ifdef CONFIG_IWLEGACY_DEBUGFS
427 il3945_accumulative_stats(il, (__le32 *) &pkt->u.raw);
428#endif
429
430 memcpy(&il->_3945.stats, pkt->u.raw, sizeof(il->_3945.stats));
431}
432
433void
434il3945_hdl_c_stats(struct il_priv *il, struct il_rx_buf *rxb)
435{
436 struct il_rx_pkt *pkt = rxb_addr(rxb);
437 __le32 *flag = (__le32 *) &pkt->u.raw;
438
439 if (le32_to_cpu(*flag) & UCODE_STATS_CLEAR_MSK) {
440#ifdef CONFIG_IWLEGACY_DEBUGFS
441 memset(&il->_3945.accum_stats, 0,
442 sizeof(struct il3945_notif_stats));
443 memset(&il->_3945.delta_stats, 0,
444 sizeof(struct il3945_notif_stats));
445 memset(&il->_3945.max_delta, 0,
446 sizeof(struct il3945_notif_stats));
447#endif
448 D_RX("Statistics have been cleared\n");
449 }
450 il3945_hdl_stats(il, rxb);
451}
452
453
454
455
456
457
458
459
460static int
461il3945_is_network_packet(struct il_priv *il, struct ieee80211_hdr *header)
462{
463
464
465 switch (il->iw_mode) {
466 case NL80211_IFTYPE_ADHOC:
467
468 return ether_addr_equal_64bits(header->addr3, il->bssid);
469 case NL80211_IFTYPE_STATION:
470
471 return ether_addr_equal_64bits(header->addr2, il->bssid);
472 default:
473 return 1;
474 }
475}
476
477#define SMALL_PACKET_SIZE 256
478
479static void
480il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb,
481 struct ieee80211_rx_status *stats)
482{
483 struct il_rx_pkt *pkt = rxb_addr(rxb);
484 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)IL_RX_DATA(pkt);
485 struct il3945_rx_frame_hdr *rx_hdr = IL_RX_HDR(pkt);
486 struct il3945_rx_frame_end *rx_end = IL_RX_END(pkt);
487 u32 len = le16_to_cpu(rx_hdr->len);
488 struct sk_buff *skb;
489 __le16 fc = hdr->frame_control;
490 u32 fraglen = PAGE_SIZE << il->hw_params.rx_page_order;
491
492
493 if (unlikely(len + IL39_RX_FRAME_SIZE > fraglen)) {
494 D_DROP("Corruption detected!\n");
495 return;
496 }
497
498
499 if (unlikely(!il->is_open)) {
500 D_DROP("Dropping packet while interface is not open.\n");
501 return;
502 }
503
504 if (unlikely(test_bit(IL_STOP_REASON_PASSIVE, &il->stop_reason))) {
505 il_wake_queues_by_reason(il, IL_STOP_REASON_PASSIVE);
506 D_INFO("Woke queues - frame received on passive channel\n");
507 }
508
509 skb = dev_alloc_skb(SMALL_PACKET_SIZE);
510 if (!skb) {
511 IL_ERR("dev_alloc_skb failed\n");
512 return;
513 }
514
515 if (!il3945_mod_params.sw_crypto)
516 il_set_decrypted_flag(il, (struct ieee80211_hdr *)pkt,
517 le32_to_cpu(rx_end->status), stats);
518
519
520
521
522 if (len <= SMALL_PACKET_SIZE) {
523 skb_put_data(skb, rx_hdr->payload, len);
524 } else {
525 skb_add_rx_frag(skb, 0, rxb->page,
526 (void *)rx_hdr->payload - (void *)pkt, len,
527 fraglen);
528 il->alloc_rxb_page--;
529 rxb->page = NULL;
530 }
531 il_update_stats(il, false, fc, len);
532 memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
533
534 ieee80211_rx(il->hw, skb);
535}
536
537#define IL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
538
539static void
540il3945_hdl_rx(struct il_priv *il, struct il_rx_buf *rxb)
541{
542 struct ieee80211_hdr *header;
543 struct ieee80211_rx_status rx_status = {};
544 struct il_rx_pkt *pkt = rxb_addr(rxb);
545 struct il3945_rx_frame_stats *rx_stats = IL_RX_STATS(pkt);
546 struct il3945_rx_frame_hdr *rx_hdr = IL_RX_HDR(pkt);
547 struct il3945_rx_frame_end *rx_end = IL_RX_END(pkt);
548 u16 rx_stats_sig_avg __maybe_unused = le16_to_cpu(rx_stats->sig_avg);
549 u16 rx_stats_noise_diff __maybe_unused =
550 le16_to_cpu(rx_stats->noise_diff);
551 u8 network_packet;
552
553 rx_status.flag = 0;
554 rx_status.mactime = le64_to_cpu(rx_end->timestamp);
555 rx_status.band =
556 (rx_hdr->
557 phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? NL80211_BAND_2GHZ :
558 NL80211_BAND_5GHZ;
559 rx_status.freq =
560 ieee80211_channel_to_frequency(le16_to_cpu(rx_hdr->channel),
561 rx_status.band);
562
563 rx_status.rate_idx = il3945_hwrate_to_plcp_idx(rx_hdr->rate);
564 if (rx_status.band == NL80211_BAND_5GHZ)
565 rx_status.rate_idx -= IL_FIRST_OFDM_RATE;
566
567 rx_status.antenna =
568 (le16_to_cpu(rx_hdr->phy_flags) & RX_RES_PHY_FLAGS_ANTENNA_MSK) >>
569 4;
570
571
572 if (rx_hdr->phy_flags & RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK)
573 rx_status.enc_flags |= RX_ENC_FLAG_SHORTPRE;
574
575 if ((unlikely(rx_stats->phy_count > 20))) {
576 D_DROP("dsp size out of range [0,20]: %d\n",
577 rx_stats->phy_count);
578 return;
579 }
580
581 if (!(rx_end->status & RX_RES_STATUS_NO_CRC32_ERROR) ||
582 !(rx_end->status & RX_RES_STATUS_NO_RXE_OVERFLOW)) {
583 D_RX("Bad CRC or FIFO: 0x%08X.\n", rx_end->status);
584 return;
585 }
586
587
588 rx_status.signal = rx_stats->rssi - IL39_RSSI_OFFSET;
589
590 D_STATS("Rssi %d sig_avg %d noise_diff %d\n", rx_status.signal,
591 rx_stats_sig_avg, rx_stats_noise_diff);
592
593 header = (struct ieee80211_hdr *)IL_RX_DATA(pkt);
594
595 network_packet = il3945_is_network_packet(il, header);
596
597 D_STATS("[%c] %d RSSI:%d Signal:%u, Rate:%u\n",
598 network_packet ? '*' : ' ', le16_to_cpu(rx_hdr->channel),
599 rx_status.signal, rx_status.signal, rx_status.rate_idx);
600
601 if (network_packet) {
602 il->_3945.last_beacon_time =
603 le32_to_cpu(rx_end->beacon_timestamp);
604 il->_3945.last_tsf = le64_to_cpu(rx_end->timestamp);
605 il->_3945.last_rx_rssi = rx_status.signal;
606 }
607
608 il3945_pass_packet_to_mac80211(il, rxb, &rx_status);
609}
610
611int
612il3945_hw_txq_attach_buf_to_tfd(struct il_priv *il, struct il_tx_queue *txq,
613 dma_addr_t addr, u16 len, u8 reset, u8 pad)
614{
615 int count;
616 struct il_queue *q;
617 struct il3945_tfd *tfd, *tfd_tmp;
618
619 q = &txq->q;
620 tfd_tmp = (struct il3945_tfd *)txq->tfds;
621 tfd = &tfd_tmp[q->write_ptr];
622
623 if (reset)
624 memset(tfd, 0, sizeof(*tfd));
625
626 count = TFD_CTL_COUNT_GET(le32_to_cpu(tfd->control_flags));
627
628 if (count >= NUM_TFD_CHUNKS || count < 0) {
629 IL_ERR("Error can not send more than %d chunks\n",
630 NUM_TFD_CHUNKS);
631 return -EINVAL;
632 }
633
634 tfd->tbs[count].addr = cpu_to_le32(addr);
635 tfd->tbs[count].len = cpu_to_le32(len);
636
637 count++;
638
639 tfd->control_flags =
640 cpu_to_le32(TFD_CTL_COUNT_SET(count) | TFD_CTL_PAD_SET(pad));
641
642 return 0;
643}
644
645
646
647
648
649
650void
651il3945_hw_txq_free_tfd(struct il_priv *il, struct il_tx_queue *txq)
652{
653 struct il3945_tfd *tfd_tmp = (struct il3945_tfd *)txq->tfds;
654 int idx = txq->q.read_ptr;
655 struct il3945_tfd *tfd = &tfd_tmp[idx];
656 struct pci_dev *dev = il->pci_dev;
657 int i;
658 int counter;
659
660
661 counter = TFD_CTL_COUNT_GET(le32_to_cpu(tfd->control_flags));
662 if (counter > NUM_TFD_CHUNKS) {
663 IL_ERR("Too many chunks: %i\n", counter);
664
665 return;
666 }
667
668
669 if (counter)
670 pci_unmap_single(dev, dma_unmap_addr(&txq->meta[idx], mapping),
671 dma_unmap_len(&txq->meta[idx], len),
672 PCI_DMA_TODEVICE);
673
674
675
676 for (i = 1; i < counter; i++)
677 pci_unmap_single(dev, le32_to_cpu(tfd->tbs[i].addr),
678 le32_to_cpu(tfd->tbs[i].len),
679 PCI_DMA_TODEVICE);
680
681
682 if (txq->skbs) {
683 struct sk_buff *skb = txq->skbs[txq->q.read_ptr];
684
685
686 if (skb) {
687 dev_kfree_skb_any(skb);
688 txq->skbs[txq->q.read_ptr] = NULL;
689 }
690 }
691}
692
693
694
695
696
697void
698il3945_hw_build_tx_cmd_rate(struct il_priv *il, struct il_device_cmd *cmd,
699 struct ieee80211_tx_info *info,
700 struct ieee80211_hdr *hdr, int sta_id)
701{
702 u16 hw_value = ieee80211_get_tx_rate(il->hw, info)->hw_value;
703 u16 rate_idx = min(hw_value & 0xffff, RATE_COUNT_3945 - 1);
704 u16 rate_mask;
705 int rate;
706 const u8 rts_retry_limit = 7;
707 u8 data_retry_limit;
708 __le32 tx_flags;
709 __le16 fc = hdr->frame_control;
710 struct il3945_tx_cmd *tx_cmd = (struct il3945_tx_cmd *)cmd->cmd.payload;
711
712 rate = il3945_rates[rate_idx].plcp;
713 tx_flags = tx_cmd->tx_flags;
714
715
716
717 rate_mask = RATES_MASK_3945;
718
719
720 if (ieee80211_is_probe_resp(fc))
721 data_retry_limit = 3;
722 else
723 data_retry_limit = IL_DEFAULT_TX_RETRY;
724 tx_cmd->data_retry_limit = data_retry_limit;
725
726 tx_cmd->rts_retry_limit = min(data_retry_limit, rts_retry_limit);
727
728 tx_cmd->rate = rate;
729 tx_cmd->tx_flags = tx_flags;
730
731
732 tx_cmd->supp_rates[0] =
733 ((rate_mask & IL_OFDM_RATES_MASK) >> IL_FIRST_OFDM_RATE) & 0xFF;
734
735
736 tx_cmd->supp_rates[1] = (rate_mask & 0xF);
737
738 D_RATE("Tx sta id: %d, rate: %d (plcp), flags: 0x%4X "
739 "cck/ofdm mask: 0x%x/0x%x\n", sta_id, tx_cmd->rate,
740 le32_to_cpu(tx_cmd->tx_flags), tx_cmd->supp_rates[1],
741 tx_cmd->supp_rates[0]);
742}
743
744static u8
745il3945_sync_sta(struct il_priv *il, int sta_id, u16 tx_rate)
746{
747 unsigned long flags_spin;
748 struct il_station_entry *station;
749
750 if (sta_id == IL_INVALID_STATION)
751 return IL_INVALID_STATION;
752
753 spin_lock_irqsave(&il->sta_lock, flags_spin);
754 station = &il->stations[sta_id];
755
756 station->sta.sta.modify_mask = STA_MODIFY_TX_RATE_MSK;
757 station->sta.rate_n_flags = cpu_to_le16(tx_rate);
758 station->sta.mode = STA_CONTROL_MODIFY_MSK;
759 il_send_add_sta(il, &station->sta, CMD_ASYNC);
760 spin_unlock_irqrestore(&il->sta_lock, flags_spin);
761
762 D_RATE("SCALE sync station %d to rate %d\n", sta_id, tx_rate);
763 return sta_id;
764}
765
766static void
767il3945_set_pwr_vmain(struct il_priv *il)
768{
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784 il_set_bits_mask_prph(il, APMG_PS_CTRL_REG,
785 APMG_PS_CTRL_VAL_PWR_SRC_VMAIN,
786 ~APMG_PS_CTRL_MSK_PWR_SRC);
787
788 _il_poll_bit(il, CSR_GPIO_IN, CSR_GPIO_IN_VAL_VMAIN_PWR_SRC,
789 CSR_GPIO_IN_BIT_AUX_POWER, 5000);
790}
791
792static int
793il3945_rx_init(struct il_priv *il, struct il_rx_queue *rxq)
794{
795 il_wr(il, FH39_RCSR_RBD_BASE(0), rxq->bd_dma);
796 il_wr(il, FH39_RCSR_RPTR_ADDR(0), rxq->rb_stts_dma);
797 il_wr(il, FH39_RCSR_WPTR(0), 0);
798 il_wr(il, FH39_RCSR_CONFIG(0),
799 FH39_RCSR_RX_CONFIG_REG_VAL_DMA_CHNL_EN_ENABLE |
800 FH39_RCSR_RX_CONFIG_REG_VAL_RDRBD_EN_ENABLE |
801 FH39_RCSR_RX_CONFIG_REG_BIT_WR_STTS_EN |
802 FH39_RCSR_RX_CONFIG_REG_VAL_MAX_FRAG_SIZE_128 | (RX_QUEUE_SIZE_LOG
803 <<
804 FH39_RCSR_RX_CONFIG_REG_POS_RBDC_SIZE)
805 | FH39_RCSR_RX_CONFIG_REG_VAL_IRQ_DEST_INT_HOST | (1 <<
806 FH39_RCSR_RX_CONFIG_REG_POS_IRQ_RBTH)
807 | FH39_RCSR_RX_CONFIG_REG_VAL_MSG_MODE_FH);
808
809
810 il_rd(il, FH39_RSSR_CTRL);
811
812 return 0;
813}
814
815static int
816il3945_tx_reset(struct il_priv *il)
817{
818
819 il_wr_prph(il, ALM_SCD_MODE_REG, 0x2);
820
821
822 il_wr_prph(il, ALM_SCD_ARASTAT_REG, 0x01);
823
824
825 il_wr_prph(il, ALM_SCD_TXFACT_REG, 0x3f);
826
827 il_wr_prph(il, ALM_SCD_SBYP_MODE_1_REG, 0x010000);
828 il_wr_prph(il, ALM_SCD_SBYP_MODE_2_REG, 0x030002);
829 il_wr_prph(il, ALM_SCD_TXF4MF_REG, 0x000004);
830 il_wr_prph(il, ALM_SCD_TXF5MF_REG, 0x000005);
831
832 il_wr(il, FH39_TSSR_CBB_BASE, il->_3945.shared_phys);
833
834 il_wr(il, FH39_TSSR_MSG_CONFIG,
835 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TXPD_ON |
836 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_TXPD_ON |
837 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_MAX_FRAG_SIZE_128B |
838 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TFD_ON |
839 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_CBB_ON |
840 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RSP_WAIT_TH |
841 FH39_TSSR_TX_MSG_CONFIG_REG_VAL_RSP_WAIT_TH);
842
843 return 0;
844}
845
846
847
848
849
850
851static int
852il3945_txq_ctx_reset(struct il_priv *il)
853{
854 int rc, txq_id;
855
856 il3945_hw_txq_ctx_free(il);
857
858
859 rc = il_alloc_txq_mem(il);
860 if (rc)
861 return rc;
862
863
864 rc = il3945_tx_reset(il);
865 if (rc)
866 goto error;
867
868
869 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) {
870 rc = il_tx_queue_init(il, txq_id);
871 if (rc) {
872 IL_ERR("Tx %d queue init failed\n", txq_id);
873 goto error;
874 }
875 }
876
877 return rc;
878
879error:
880 il3945_hw_txq_ctx_free(il);
881 return rc;
882}
883
884
885
886
887
888
889static int
890il3945_apm_init(struct il_priv *il)
891{
892 int ret = il_apm_init(il);
893
894
895 il_wr_prph(il, APMG_RTC_INT_MSK_REG, 0x0);
896 il_wr_prph(il, APMG_RTC_INT_STT_REG, 0xFFFFFFFF);
897
898
899 il_set_bits_prph(il, APMG_PS_CTRL_REG, APMG_PS_CTRL_VAL_RESET_REQ);
900 udelay(5);
901 il_clear_bits_prph(il, APMG_PS_CTRL_REG, APMG_PS_CTRL_VAL_RESET_REQ);
902
903 return ret;
904}
905
906static void
907il3945_nic_config(struct il_priv *il)
908{
909 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
910 unsigned long flags;
911 u8 rev_id = il->pci_dev->revision;
912
913 spin_lock_irqsave(&il->lock, flags);
914
915
916 D_INFO("HW Revision ID = 0x%X\n", rev_id);
917
918 if (rev_id & PCI_CFG_REV_ID_BIT_RTP)
919 D_INFO("RTP type\n");
920 else if (rev_id & PCI_CFG_REV_ID_BIT_BASIC_SKU) {
921 D_INFO("3945 RADIO-MB type\n");
922 il_set_bit(il, CSR_HW_IF_CONFIG_REG,
923 CSR39_HW_IF_CONFIG_REG_BIT_3945_MB);
924 } else {
925 D_INFO("3945 RADIO-MM type\n");
926 il_set_bit(il, CSR_HW_IF_CONFIG_REG,
927 CSR39_HW_IF_CONFIG_REG_BIT_3945_MM);
928 }
929
930 if (EEPROM_SKU_CAP_OP_MODE_MRC == eeprom->sku_cap) {
931 D_INFO("SKU OP mode is mrc\n");
932 il_set_bit(il, CSR_HW_IF_CONFIG_REG,
933 CSR39_HW_IF_CONFIG_REG_BIT_SKU_MRC);
934 } else
935 D_INFO("SKU OP mode is basic\n");
936
937 if ((eeprom->board_revision & 0xF0) == 0xD0) {
938 D_INFO("3945ABG revision is 0x%X\n", eeprom->board_revision);
939 il_set_bit(il, CSR_HW_IF_CONFIG_REG,
940 CSR39_HW_IF_CONFIG_REG_BIT_BOARD_TYPE);
941 } else {
942 D_INFO("3945ABG revision is 0x%X\n", eeprom->board_revision);
943 il_clear_bit(il, CSR_HW_IF_CONFIG_REG,
944 CSR39_HW_IF_CONFIG_REG_BIT_BOARD_TYPE);
945 }
946
947 if (eeprom->almgor_m_version <= 1) {
948 il_set_bit(il, CSR_HW_IF_CONFIG_REG,
949 CSR39_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_A);
950 D_INFO("Card M type A version is 0x%X\n",
951 eeprom->almgor_m_version);
952 } else {
953 D_INFO("Card M type B version is 0x%X\n",
954 eeprom->almgor_m_version);
955 il_set_bit(il, CSR_HW_IF_CONFIG_REG,
956 CSR39_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_B);
957 }
958 spin_unlock_irqrestore(&il->lock, flags);
959
960 if (eeprom->sku_cap & EEPROM_SKU_CAP_SW_RF_KILL_ENABLE)
961 D_RF_KILL("SW RF KILL supported in EEPROM.\n");
962
963 if (eeprom->sku_cap & EEPROM_SKU_CAP_HW_RF_KILL_ENABLE)
964 D_RF_KILL("HW RF KILL supported in EEPROM.\n");
965}
966
967int
968il3945_hw_nic_init(struct il_priv *il)
969{
970 int rc;
971 unsigned long flags;
972 struct il_rx_queue *rxq = &il->rxq;
973
974 spin_lock_irqsave(&il->lock, flags);
975 il3945_apm_init(il);
976 spin_unlock_irqrestore(&il->lock, flags);
977
978 il3945_set_pwr_vmain(il);
979 il3945_nic_config(il);
980
981
982 if (!rxq->bd) {
983 rc = il_rx_queue_alloc(il);
984 if (rc) {
985 IL_ERR("Unable to initialize Rx queue\n");
986 return -ENOMEM;
987 }
988 } else
989 il3945_rx_queue_reset(il, rxq);
990
991 il3945_rx_replenish(il);
992
993 il3945_rx_init(il, rxq);
994
995
996
997
998
999
1000 il_wr(il, FH39_RCSR_WPTR(0), rxq->write & ~7);
1001
1002 rc = il3945_txq_ctx_reset(il);
1003 if (rc)
1004 return rc;
1005
1006 set_bit(S_INIT, &il->status);
1007
1008 return 0;
1009}
1010
1011
1012
1013
1014
1015
1016void
1017il3945_hw_txq_ctx_free(struct il_priv *il)
1018{
1019 int txq_id;
1020
1021
1022 if (il->txq) {
1023 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++)
1024 if (txq_id == IL39_CMD_QUEUE_NUM)
1025 il_cmd_queue_free(il);
1026 else
1027 il_tx_queue_free(il, txq_id);
1028 }
1029
1030
1031 il_free_txq_mem(il);
1032}
1033
1034void
1035il3945_hw_txq_ctx_stop(struct il_priv *il)
1036{
1037 int txq_id;
1038
1039
1040 _il_wr_prph(il, ALM_SCD_MODE_REG, 0);
1041 _il_wr_prph(il, ALM_SCD_TXFACT_REG, 0);
1042
1043
1044 for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) {
1045 _il_wr(il, FH39_TCSR_CONFIG(txq_id), 0x0);
1046 _il_poll_bit(il, FH39_TSSR_TX_STATUS,
1047 FH39_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(txq_id),
1048 FH39_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(txq_id),
1049 1000);
1050 }
1051}
1052
1053
1054
1055
1056
1057static int
1058il3945_hw_reg_adjust_power_by_temp(int new_reading, int old_reading)
1059{
1060 return (new_reading - old_reading) * (-11) / 100;
1061}
1062
1063
1064
1065
1066static inline int
1067il3945_hw_reg_temp_out_of_range(int temperature)
1068{
1069 return (temperature < -260 || temperature > 25) ? 1 : 0;
1070}
1071
1072int
1073il3945_hw_get_temperature(struct il_priv *il)
1074{
1075 return _il_rd(il, CSR_UCODE_DRV_GP2);
1076}
1077
1078
1079
1080
1081
1082static int
1083il3945_hw_reg_txpower_get_temperature(struct il_priv *il)
1084{
1085 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
1086 int temperature;
1087
1088 temperature = il3945_hw_get_temperature(il);
1089
1090
1091
1092 D_INFO("Temperature: %d\n", temperature + IL_TEMP_CONVERT);
1093
1094
1095 if (il3945_hw_reg_temp_out_of_range(temperature)) {
1096 IL_ERR("Error bad temperature value %d\n", temperature);
1097
1098
1099
1100 if (il->last_temperature > 100)
1101 temperature = eeprom->groups[2].temperature;
1102 else
1103 temperature = il->last_temperature;
1104 }
1105
1106 return temperature;
1107}
1108
1109
1110
1111
1112#define IL_TEMPERATURE_LIMIT_TIMER 6
1113
1114
1115
1116
1117
1118
1119
1120static int
1121il3945_is_temp_calib_needed(struct il_priv *il)
1122{
1123 int temp_diff;
1124
1125 il->temperature = il3945_hw_reg_txpower_get_temperature(il);
1126 temp_diff = il->temperature - il->last_temperature;
1127
1128
1129 if (temp_diff < 0) {
1130 D_POWER("Getting cooler, delta %d,\n", temp_diff);
1131 temp_diff = -temp_diff;
1132 } else if (temp_diff == 0)
1133 D_POWER("Same temp,\n");
1134 else
1135 D_POWER("Getting warmer, delta %d,\n", temp_diff);
1136
1137
1138 if (temp_diff < IL_TEMPERATURE_LIMIT_TIMER) {
1139 D_POWER("Timed thermal calib not needed\n");
1140 return 0;
1141 }
1142
1143 D_POWER("Timed thermal calib needed\n");
1144
1145
1146
1147 il->last_temperature = il->temperature;
1148 return 1;
1149}
1150
1151#define IL_MAX_GAIN_ENTRIES 78
1152#define IL_CCK_FROM_OFDM_POWER_DIFF -5
1153#define IL_CCK_FROM_OFDM_IDX_DIFF (10)
1154
1155
1156
1157static struct il3945_tx_power power_gain_table[2][IL_MAX_GAIN_ENTRIES] = {
1158 {
1159 {251, 127},
1160 {251, 127},
1161 {251, 127},
1162 {251, 127},
1163 {251, 125},
1164 {251, 110},
1165 {251, 105},
1166 {251, 98},
1167 {187, 125},
1168 {187, 115},
1169 {187, 108},
1170 {187, 99},
1171 {243, 119},
1172 {243, 111},
1173 {243, 105},
1174 {243, 97},
1175 {243, 92},
1176 {211, 106},
1177 {211, 100},
1178 {179, 120},
1179 {179, 113},
1180 {179, 107},
1181 {147, 125},
1182 {147, 119},
1183 {147, 112},
1184 {147, 106},
1185 {147, 101},
1186 {147, 97},
1187 {147, 91},
1188 {115, 107},
1189 {235, 121},
1190 {235, 115},
1191 {235, 109},
1192 {203, 127},
1193 {203, 121},
1194 {203, 115},
1195 {203, 108},
1196 {203, 102},
1197 {203, 96},
1198 {203, 92},
1199 {171, 110},
1200 {171, 104},
1201 {171, 98},
1202 {139, 116},
1203 {227, 125},
1204 {227, 119},
1205 {227, 113},
1206 {227, 107},
1207 {227, 101},
1208 {227, 96},
1209 {195, 113},
1210 {195, 106},
1211 {195, 102},
1212 {195, 95},
1213 {163, 113},
1214 {163, 106},
1215 {163, 102},
1216 {163, 95},
1217 {131, 113},
1218 {131, 106},
1219 {131, 102},
1220 {131, 95},
1221 {99, 113},
1222 {99, 106},
1223 {99, 102},
1224 {99, 95},
1225 {67, 113},
1226 {67, 106},
1227 {67, 102},
1228 {67, 95},
1229 {35, 113},
1230 {35, 106},
1231 {35, 102},
1232 {35, 95},
1233 {3, 113},
1234 {3, 106},
1235 {3, 102},
1236 {3, 95}
1237 },
1238 {
1239 {251, 127},
1240 {251, 120},
1241 {251, 114},
1242 {219, 119},
1243 {219, 101},
1244 {187, 113},
1245 {187, 102},
1246 {155, 114},
1247 {155, 103},
1248 {123, 117},
1249 {123, 107},
1250 {123, 99},
1251 {123, 92},
1252 {91, 108},
1253 {59, 125},
1254 {59, 118},
1255 {59, 109},
1256 {59, 102},
1257 {59, 96},
1258 {59, 90},
1259 {27, 104},
1260 {27, 98},
1261 {27, 92},
1262 {115, 118},
1263 {115, 111},
1264 {115, 104},
1265 {83, 126},
1266 {83, 121},
1267 {83, 113},
1268 {83, 105},
1269 {83, 99},
1270 {51, 118},
1271 {51, 111},
1272 {51, 104},
1273 {51, 98},
1274 {19, 116},
1275 {19, 109},
1276 {19, 102},
1277 {19, 98},
1278 {19, 93},
1279 {171, 113},
1280 {171, 107},
1281 {171, 99},
1282 {139, 120},
1283 {139, 113},
1284 {139, 107},
1285 {139, 99},
1286 {107, 120},
1287 {107, 113},
1288 {107, 107},
1289 {107, 99},
1290 {75, 120},
1291 {75, 113},
1292 {75, 107},
1293 {75, 99},
1294 {43, 120},
1295 {43, 113},
1296 {43, 107},
1297 {43, 99},
1298 {11, 120},
1299 {11, 113},
1300 {11, 107},
1301 {11, 99},
1302 {131, 107},
1303 {131, 99},
1304 {99, 120},
1305 {99, 113},
1306 {99, 107},
1307 {99, 99},
1308 {67, 120},
1309 {67, 113},
1310 {67, 107},
1311 {67, 99},
1312 {35, 120},
1313 {35, 113},
1314 {35, 107},
1315 {35, 99},
1316 {3, 120}
1317 }
1318};
1319
1320static inline u8
1321il3945_hw_reg_fix_power_idx(int idx)
1322{
1323 if (idx < 0)
1324 return 0;
1325 if (idx >= IL_MAX_GAIN_ENTRIES)
1326 return IL_MAX_GAIN_ENTRIES - 1;
1327 return (u8) idx;
1328}
1329
1330
1331#define REG_RECALIB_PERIOD (60)
1332
1333
1334
1335
1336
1337
1338
1339static void
1340il3945_hw_reg_set_scan_power(struct il_priv *il, u32 scan_tbl_idx, s32 rate_idx,
1341 const s8 *clip_pwrs,
1342 struct il_channel_info *ch_info, int band_idx)
1343{
1344 struct il3945_scan_power_info *scan_power_info;
1345 s8 power;
1346 u8 power_idx;
1347
1348 scan_power_info = &ch_info->scan_pwr_info[scan_tbl_idx];
1349
1350
1351
1352
1353 power = min(ch_info->scan_power, clip_pwrs[RATE_6M_IDX_TBL]);
1354
1355 power = min(power, il->tx_power_user_lmt);
1356 scan_power_info->requested_power = power;
1357
1358
1359
1360
1361
1362
1363 power_idx =
1364 ch_info->power_info[rate_idx].power_table_idx - (power -
1365 ch_info->
1366 power_info
1367 [RATE_6M_IDX_TBL].
1368 requested_power) *
1369 2;
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381 power_idx = il3945_hw_reg_fix_power_idx(power_idx);
1382
1383 scan_power_info->power_table_idx = power_idx;
1384 scan_power_info->tpc.tx_gain =
1385 power_gain_table[band_idx][power_idx].tx_gain;
1386 scan_power_info->tpc.dsp_atten =
1387 power_gain_table[band_idx][power_idx].dsp_atten;
1388}
1389
1390
1391
1392
1393
1394
1395
1396static int
1397il3945_send_tx_power(struct il_priv *il)
1398{
1399 int rate_idx, i;
1400 const struct il_channel_info *ch_info = NULL;
1401 struct il3945_txpowertable_cmd txpower = {
1402 .channel = il->active.channel,
1403 };
1404 u16 chan;
1405
1406 if (WARN_ONCE
1407 (test_bit(S_SCAN_HW, &il->status),
1408 "TX Power requested while scanning!\n"))
1409 return -EAGAIN;
1410
1411 chan = le16_to_cpu(il->active.channel);
1412
1413 txpower.band = (il->band == NL80211_BAND_5GHZ) ? 0 : 1;
1414 ch_info = il_get_channel_info(il, il->band, chan);
1415 if (!ch_info) {
1416 IL_ERR("Failed to get channel info for channel %d [%d]\n", chan,
1417 il->band);
1418 return -EINVAL;
1419 }
1420
1421 if (!il_is_channel_valid(ch_info)) {
1422 D_POWER("Not calling TX_PWR_TBL_CMD on " "non-Tx channel.\n");
1423 return 0;
1424 }
1425
1426
1427
1428 for (rate_idx = IL_FIRST_OFDM_RATE, i = 0;
1429 rate_idx <= IL39_LAST_OFDM_RATE; rate_idx++, i++) {
1430
1431 txpower.power[i].tpc = ch_info->power_info[i].tpc;
1432 txpower.power[i].rate = il3945_rates[rate_idx].plcp;
1433
1434 D_POWER("ch %d:%d rf %d dsp %3d rate code 0x%02x\n",
1435 le16_to_cpu(txpower.channel), txpower.band,
1436 txpower.power[i].tpc.tx_gain,
1437 txpower.power[i].tpc.dsp_atten, txpower.power[i].rate);
1438 }
1439
1440 for (rate_idx = IL_FIRST_CCK_RATE; rate_idx <= IL_LAST_CCK_RATE;
1441 rate_idx++, i++) {
1442 txpower.power[i].tpc = ch_info->power_info[i].tpc;
1443 txpower.power[i].rate = il3945_rates[rate_idx].plcp;
1444
1445 D_POWER("ch %d:%d rf %d dsp %3d rate code 0x%02x\n",
1446 le16_to_cpu(txpower.channel), txpower.band,
1447 txpower.power[i].tpc.tx_gain,
1448 txpower.power[i].tpc.dsp_atten, txpower.power[i].rate);
1449 }
1450
1451 return il_send_cmd_pdu(il, C_TX_PWR_TBL,
1452 sizeof(struct il3945_txpowertable_cmd),
1453 &txpower);
1454
1455}
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473static int
1474il3945_hw_reg_set_new_power(struct il_priv *il, struct il_channel_info *ch_info)
1475{
1476 struct il3945_channel_power_info *power_info;
1477 int power_changed = 0;
1478 int i;
1479 const s8 *clip_pwrs;
1480 int power;
1481
1482
1483 clip_pwrs = il->_3945.clip_groups[ch_info->group_idx].clip_powers;
1484
1485
1486 power_info = ch_info->power_info;
1487
1488
1489 for (i = RATE_6M_IDX_TBL; i <= RATE_54M_IDX_TBL; i++, ++power_info) {
1490 int delta_idx;
1491
1492
1493 power = min(ch_info->curr_txpow, clip_pwrs[i]);
1494 if (power == power_info->requested_power)
1495 continue;
1496
1497
1498
1499 delta_idx = (power - power_info->requested_power) * 2;
1500 power_info->base_power_idx -= delta_idx;
1501
1502
1503 power_info->requested_power = power;
1504
1505 power_changed = 1;
1506 }
1507
1508
1509
1510 if (power_changed) {
1511 power =
1512 ch_info->power_info[RATE_12M_IDX_TBL].requested_power +
1513 IL_CCK_FROM_OFDM_POWER_DIFF;
1514
1515
1516 for (i = RATE_1M_IDX_TBL; i <= RATE_11M_IDX_TBL; i++) {
1517 power_info->requested_power = power;
1518 power_info->base_power_idx =
1519 ch_info->power_info[RATE_12M_IDX_TBL].
1520 base_power_idx + IL_CCK_FROM_OFDM_IDX_DIFF;
1521 ++power_info;
1522 }
1523 }
1524
1525 return 0;
1526}
1527
1528
1529
1530
1531
1532
1533
1534
1535static int
1536il3945_hw_reg_get_ch_txpower_limit(struct il_channel_info *ch_info)
1537{
1538 s8 max_power;
1539
1540#if 0
1541
1542 if (ch_info->tgd_data.max_power != 0)
1543 max_power =
1544 min(ch_info->tgd_data.max_power,
1545 ch_info->eeprom.max_power_avg);
1546
1547
1548 else
1549#endif
1550 max_power = ch_info->eeprom.max_power_avg;
1551
1552 return min(max_power, ch_info->max_power_avg);
1553}
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565static int
1566il3945_hw_reg_comp_txpower_temp(struct il_priv *il)
1567{
1568 struct il_channel_info *ch_info = NULL;
1569 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
1570 int delta_idx;
1571 const s8 *clip_pwrs;
1572 u8 a_band;
1573 u8 rate_idx;
1574 u8 scan_tbl_idx;
1575 u8 i;
1576 int ref_temp;
1577 int temperature = il->temperature;
1578
1579 if (il->disable_tx_power_cal || test_bit(S_SCANNING, &il->status)) {
1580
1581 return 0;
1582 }
1583
1584 for (i = 0; i < il->channel_count; i++) {
1585 ch_info = &il->channel_info[i];
1586 a_band = il_is_channel_a_band(ch_info);
1587
1588
1589 ref_temp = (s16) eeprom->groups[ch_info->group_idx].temperature;
1590
1591
1592
1593 delta_idx =
1594 il3945_hw_reg_adjust_power_by_temp(temperature, ref_temp);
1595
1596
1597 for (rate_idx = 0; rate_idx < RATE_COUNT_3945; rate_idx++) {
1598 int power_idx =
1599 ch_info->power_info[rate_idx].base_power_idx;
1600
1601
1602 power_idx += delta_idx;
1603
1604
1605 power_idx = il3945_hw_reg_fix_power_idx(power_idx);
1606 ch_info->power_info[rate_idx].power_table_idx =
1607 (u8) power_idx;
1608 ch_info->power_info[rate_idx].tpc =
1609 power_gain_table[a_band][power_idx];
1610 }
1611
1612
1613 clip_pwrs =
1614 il->_3945.clip_groups[ch_info->group_idx].clip_powers;
1615
1616
1617 for (scan_tbl_idx = 0; scan_tbl_idx < IL_NUM_SCAN_RATES;
1618 scan_tbl_idx++) {
1619 s32 actual_idx =
1620 (scan_tbl_idx ==
1621 0) ? RATE_1M_IDX_TBL : RATE_6M_IDX_TBL;
1622 il3945_hw_reg_set_scan_power(il, scan_tbl_idx,
1623 actual_idx, clip_pwrs,
1624 ch_info, a_band);
1625 }
1626 }
1627
1628
1629 return il->ops->send_tx_power(il);
1630}
1631
1632int
1633il3945_hw_reg_set_txpower(struct il_priv *il, s8 power)
1634{
1635 struct il_channel_info *ch_info;
1636 s8 max_power;
1637 u8 i;
1638
1639 if (il->tx_power_user_lmt == power) {
1640 D_POWER("Requested Tx power same as current " "limit: %ddBm.\n",
1641 power);
1642 return 0;
1643 }
1644
1645 D_POWER("Setting upper limit clamp to %ddBm.\n", power);
1646 il->tx_power_user_lmt = power;
1647
1648
1649
1650 for (i = 0; i < il->channel_count; i++) {
1651 ch_info = &il->channel_info[i];
1652
1653
1654
1655 max_power = il3945_hw_reg_get_ch_txpower_limit(ch_info);
1656 max_power = min(power, max_power);
1657 if (max_power != ch_info->curr_txpow) {
1658 ch_info->curr_txpow = max_power;
1659
1660
1661 il3945_hw_reg_set_new_power(il, ch_info);
1662 }
1663 }
1664
1665
1666
1667 il3945_is_temp_calib_needed(il);
1668 il3945_hw_reg_comp_txpower_temp(il);
1669
1670 return 0;
1671}
1672
1673static int
1674il3945_send_rxon_assoc(struct il_priv *il)
1675{
1676 int rc = 0;
1677 struct il_rx_pkt *pkt;
1678 struct il3945_rxon_assoc_cmd rxon_assoc;
1679 struct il_host_cmd cmd = {
1680 .id = C_RXON_ASSOC,
1681 .len = sizeof(rxon_assoc),
1682 .flags = CMD_WANT_SKB,
1683 .data = &rxon_assoc,
1684 };
1685 const struct il_rxon_cmd *rxon1 = &il->staging;
1686 const struct il_rxon_cmd *rxon2 = &il->active;
1687
1688 if (rxon1->flags == rxon2->flags &&
1689 rxon1->filter_flags == rxon2->filter_flags &&
1690 rxon1->cck_basic_rates == rxon2->cck_basic_rates &&
1691 rxon1->ofdm_basic_rates == rxon2->ofdm_basic_rates) {
1692 D_INFO("Using current RXON_ASSOC. Not resending.\n");
1693 return 0;
1694 }
1695
1696 rxon_assoc.flags = il->staging.flags;
1697 rxon_assoc.filter_flags = il->staging.filter_flags;
1698 rxon_assoc.ofdm_basic_rates = il->staging.ofdm_basic_rates;
1699 rxon_assoc.cck_basic_rates = il->staging.cck_basic_rates;
1700 rxon_assoc.reserved = 0;
1701
1702 rc = il_send_cmd_sync(il, &cmd);
1703 if (rc)
1704 return rc;
1705
1706 pkt = (struct il_rx_pkt *)cmd.reply_page;
1707 if (pkt->hdr.flags & IL_CMD_FAILED_MSK) {
1708 IL_ERR("Bad return from C_RXON_ASSOC command\n");
1709 rc = -EIO;
1710 }
1711
1712 il_free_pages(il, cmd.reply_page);
1713
1714 return rc;
1715}
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725int
1726il3945_commit_rxon(struct il_priv *il)
1727{
1728
1729 struct il3945_rxon_cmd *active_rxon = (void *)&il->active;
1730 struct il3945_rxon_cmd *staging_rxon = (void *)&il->staging;
1731 int rc = 0;
1732 bool new_assoc = !!(staging_rxon->filter_flags & RXON_FILTER_ASSOC_MSK);
1733
1734 if (test_bit(S_EXIT_PENDING, &il->status))
1735 return -EINVAL;
1736
1737 if (!il_is_alive(il))
1738 return -1;
1739
1740
1741 staging_rxon->flags |= RXON_FLG_TSF2HOST_MSK;
1742
1743
1744 staging_rxon->flags &= ~(RXON_FLG_DIS_DIV_MSK | RXON_FLG_ANT_SEL_MSK);
1745 staging_rxon->flags |= il3945_get_antenna_flags(il);
1746
1747 rc = il_check_rxon_cmd(il);
1748 if (rc) {
1749 IL_ERR("Invalid RXON configuration. Not committing.\n");
1750 return -EINVAL;
1751 }
1752
1753
1754
1755
1756 if (!il_full_rxon_required(il)) {
1757 rc = il_send_rxon_assoc(il);
1758 if (rc) {
1759 IL_ERR("Error setting RXON_ASSOC "
1760 "configuration (%d).\n", rc);
1761 return rc;
1762 }
1763
1764 memcpy(active_rxon, staging_rxon, sizeof(*active_rxon));
1765
1766
1767
1768
1769 il_set_tx_power(il, il->tx_power_next, false);
1770 return 0;
1771 }
1772
1773
1774
1775
1776
1777 if (il_is_associated(il) && new_assoc) {
1778 D_INFO("Toggling associated bit on current RXON\n");
1779 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
1780
1781
1782
1783
1784
1785 active_rxon->reserved4 = 0;
1786 active_rxon->reserved5 = 0;
1787 rc = il_send_cmd_pdu(il, C_RXON, sizeof(struct il3945_rxon_cmd),
1788 &il->active);
1789
1790
1791
1792 if (rc) {
1793 active_rxon->filter_flags |= RXON_FILTER_ASSOC_MSK;
1794 IL_ERR("Error clearing ASSOC_MSK on current "
1795 "configuration (%d).\n", rc);
1796 return rc;
1797 }
1798 il_clear_ucode_stations(il);
1799 il_restore_stations(il);
1800 }
1801
1802 D_INFO("Sending RXON\n" "* with%s RXON_FILTER_ASSOC_MSK\n"
1803 "* channel = %d\n" "* bssid = %pM\n", (new_assoc ? "" : "out"),
1804 le16_to_cpu(staging_rxon->channel), staging_rxon->bssid_addr);
1805
1806
1807
1808
1809
1810 staging_rxon->reserved4 = 0;
1811 staging_rxon->reserved5 = 0;
1812
1813 il_set_rxon_hwcrypto(il, !il3945_mod_params.sw_crypto);
1814
1815
1816 rc = il_send_cmd_pdu(il, C_RXON, sizeof(struct il3945_rxon_cmd),
1817 staging_rxon);
1818 if (rc) {
1819 IL_ERR("Error setting new configuration (%d).\n", rc);
1820 return rc;
1821 }
1822
1823 memcpy(active_rxon, staging_rxon, sizeof(*active_rxon));
1824
1825 if (!new_assoc) {
1826 il_clear_ucode_stations(il);
1827 il_restore_stations(il);
1828 }
1829
1830
1831
1832 rc = il_set_tx_power(il, il->tx_power_next, true);
1833 if (rc) {
1834 IL_ERR("Error setting Tx power (%d).\n", rc);
1835 return rc;
1836 }
1837
1838
1839 rc = il3945_init_hw_rate_table(il);
1840 if (rc) {
1841 IL_ERR("Error setting HW rate table: %02X\n", rc);
1842 return -EIO;
1843 }
1844
1845 return 0;
1846}
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858void
1859il3945_reg_txpower_periodic(struct il_priv *il)
1860{
1861
1862
1863 if (!il3945_is_temp_calib_needed(il))
1864 goto reschedule;
1865
1866
1867
1868
1869 il3945_hw_reg_comp_txpower_temp(il);
1870
1871reschedule:
1872 queue_delayed_work(il->workqueue, &il->_3945.thermal_periodic,
1873 REG_RECALIB_PERIOD * HZ);
1874}
1875
1876static void
1877il3945_bg_reg_txpower_periodic(struct work_struct *work)
1878{
1879 struct il_priv *il = container_of(work, struct il_priv,
1880 _3945.thermal_periodic.work);
1881
1882 mutex_lock(&il->mutex);
1883 if (test_bit(S_EXIT_PENDING, &il->status) || il->txq == NULL)
1884 goto out;
1885
1886 il3945_reg_txpower_periodic(il);
1887out:
1888 mutex_unlock(&il->mutex);
1889}
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901static u16
1902il3945_hw_reg_get_ch_grp_idx(struct il_priv *il,
1903 const struct il_channel_info *ch_info)
1904{
1905 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
1906 struct il3945_eeprom_txpower_group *ch_grp = &eeprom->groups[0];
1907 u8 group;
1908 u16 group_idx = 0;
1909 u8 grp_channel;
1910
1911
1912 if (il_is_channel_a_band(ch_info)) {
1913 for (group = 1; group < 5; group++) {
1914 grp_channel = ch_grp[group].group_channel;
1915 if (ch_info->channel <= grp_channel) {
1916 group_idx = group;
1917 break;
1918 }
1919 }
1920
1921 if (group == 5)
1922 group_idx = 4;
1923 } else
1924 group_idx = 0;
1925
1926 D_POWER("Chnl %d mapped to grp %d\n", ch_info->channel, group_idx);
1927 return group_idx;
1928}
1929
1930
1931
1932
1933
1934
1935
1936static int
1937il3945_hw_reg_get_matched_power_idx(struct il_priv *il, s8 requested_power,
1938 s32 setting_idx, s32 *new_idx)
1939{
1940 const struct il3945_eeprom_txpower_group *chnl_grp = NULL;
1941 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
1942 s32 idx0, idx1;
1943 s32 power = 2 * requested_power;
1944 s32 i;
1945 const struct il3945_eeprom_txpower_sample *samples;
1946 s32 gains0, gains1;
1947 s32 res;
1948 s32 denominator;
1949
1950 chnl_grp = &eeprom->groups[setting_idx];
1951 samples = chnl_grp->samples;
1952 for (i = 0; i < 5; i++) {
1953 if (power == samples[i].power) {
1954 *new_idx = samples[i].gain_idx;
1955 return 0;
1956 }
1957 }
1958
1959 if (power > samples[1].power) {
1960 idx0 = 0;
1961 idx1 = 1;
1962 } else if (power > samples[2].power) {
1963 idx0 = 1;
1964 idx1 = 2;
1965 } else if (power > samples[3].power) {
1966 idx0 = 2;
1967 idx1 = 3;
1968 } else {
1969 idx0 = 3;
1970 idx1 = 4;
1971 }
1972
1973 denominator = (s32) samples[idx1].power - (s32) samples[idx0].power;
1974 if (denominator == 0)
1975 return -EINVAL;
1976 gains0 = (s32) samples[idx0].gain_idx * (1 << 19);
1977 gains1 = (s32) samples[idx1].gain_idx * (1 << 19);
1978 res =
1979 gains0 + (gains1 - gains0) * ((s32) power -
1980 (s32) samples[idx0].power) /
1981 denominator + (1 << 18);
1982 *new_idx = res >> 19;
1983 return 0;
1984}
1985
1986static void
1987il3945_hw_reg_init_channel_groups(struct il_priv *il)
1988{
1989 u32 i;
1990 s32 rate_idx;
1991 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
1992 const struct il3945_eeprom_txpower_group *group;
1993
1994 D_POWER("Initializing factory calib info from EEPROM\n");
1995
1996 for (i = 0; i < IL_NUM_TX_CALIB_GROUPS; i++) {
1997 s8 *clip_pwrs;
1998 s8 satur_pwr;
1999 group = &eeprom->groups[i];
2000
2001
2002 if (group->saturation_power < 40) {
2003 IL_WARN("Error: saturation power is %d, "
2004 "less than minimum expected 40\n",
2005 group->saturation_power);
2006 return;
2007 }
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018 clip_pwrs = (s8 *) il->_3945.clip_groups[i].clip_powers;
2019
2020
2021 satur_pwr = (s8) (group->saturation_power >> 1);
2022
2023
2024 for (rate_idx = 0; rate_idx < RATE_COUNT_3945;
2025 rate_idx++, clip_pwrs++) {
2026 switch (rate_idx) {
2027 case RATE_36M_IDX_TBL:
2028 if (i == 0)
2029 *clip_pwrs = satur_pwr;
2030 else
2031 *clip_pwrs = satur_pwr - 5;
2032 break;
2033 case RATE_48M_IDX_TBL:
2034 if (i == 0)
2035 *clip_pwrs = satur_pwr - 7;
2036 else
2037 *clip_pwrs = satur_pwr - 10;
2038 break;
2039 case RATE_54M_IDX_TBL:
2040 if (i == 0)
2041 *clip_pwrs = satur_pwr - 9;
2042 else
2043 *clip_pwrs = satur_pwr - 12;
2044 break;
2045 default:
2046 *clip_pwrs = satur_pwr;
2047 break;
2048 }
2049 }
2050 }
2051}
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068int
2069il3945_txpower_set_from_eeprom(struct il_priv *il)
2070{
2071 struct il_channel_info *ch_info = NULL;
2072 struct il3945_channel_power_info *pwr_info;
2073 struct il3945_eeprom *eeprom = (struct il3945_eeprom *)il->eeprom;
2074 int delta_idx;
2075 u8 rate_idx;
2076 u8 scan_tbl_idx;
2077 const s8 *clip_pwrs;
2078 u8 gain, dsp_atten;
2079 s8 power;
2080 u8 pwr_idx, base_pwr_idx, a_band;
2081 u8 i;
2082 int temperature;
2083
2084
2085
2086 temperature = il3945_hw_reg_txpower_get_temperature(il);
2087 il->last_temperature = temperature;
2088
2089 il3945_hw_reg_init_channel_groups(il);
2090
2091
2092 for (i = 0, ch_info = il->channel_info; i < il->channel_count;
2093 i++, ch_info++) {
2094 a_band = il_is_channel_a_band(ch_info);
2095 if (!il_is_channel_valid(ch_info))
2096 continue;
2097
2098
2099 ch_info->group_idx = il3945_hw_reg_get_ch_grp_idx(il, ch_info);
2100
2101
2102 clip_pwrs =
2103 il->_3945.clip_groups[ch_info->group_idx].clip_powers;
2104
2105
2106
2107 delta_idx =
2108 il3945_hw_reg_adjust_power_by_temp(temperature,
2109 eeprom->groups[ch_info->
2110 group_idx].
2111 temperature);
2112
2113 D_POWER("Delta idx for channel %d: %d [%d]\n", ch_info->channel,
2114 delta_idx, temperature + IL_TEMP_CONVERT);
2115
2116
2117 for (rate_idx = 0; rate_idx < IL_OFDM_RATES; rate_idx++) {
2118 s32 uninitialized_var(power_idx);
2119 int rc;
2120
2121
2122
2123 s8 pwr = min(ch_info->max_power_avg,
2124 clip_pwrs[rate_idx]);
2125
2126 pwr_info = &ch_info->power_info[rate_idx];
2127
2128
2129
2130 rc = il3945_hw_reg_get_matched_power_idx(il, pwr,
2131 ch_info->
2132 group_idx,
2133 &power_idx);
2134 if (rc) {
2135 IL_ERR("Invalid power idx\n");
2136 return rc;
2137 }
2138 pwr_info->base_power_idx = (u8) power_idx;
2139
2140
2141 power_idx += delta_idx;
2142
2143
2144 power_idx = il3945_hw_reg_fix_power_idx(power_idx);
2145
2146
2147 pwr_info->requested_power = pwr;
2148 pwr_info->power_table_idx = (u8) power_idx;
2149 pwr_info->tpc.tx_gain =
2150 power_gain_table[a_band][power_idx].tx_gain;
2151 pwr_info->tpc.dsp_atten =
2152 power_gain_table[a_band][power_idx].dsp_atten;
2153 }
2154
2155
2156 pwr_info = &ch_info->power_info[RATE_12M_IDX_TBL];
2157 power = pwr_info->requested_power + IL_CCK_FROM_OFDM_POWER_DIFF;
2158 pwr_idx = pwr_info->power_table_idx + IL_CCK_FROM_OFDM_IDX_DIFF;
2159 base_pwr_idx =
2160 pwr_info->base_power_idx + IL_CCK_FROM_OFDM_IDX_DIFF;
2161
2162
2163 pwr_idx = il3945_hw_reg_fix_power_idx(pwr_idx);
2164 gain = power_gain_table[a_band][pwr_idx].tx_gain;
2165 dsp_atten = power_gain_table[a_band][pwr_idx].dsp_atten;
2166
2167
2168
2169
2170 for (rate_idx = 0; rate_idx < IL_CCK_RATES; rate_idx++) {
2171 pwr_info =
2172 &ch_info->power_info[rate_idx + IL_OFDM_RATES];
2173 pwr_info->requested_power = power;
2174 pwr_info->power_table_idx = pwr_idx;
2175 pwr_info->base_power_idx = base_pwr_idx;
2176 pwr_info->tpc.tx_gain = gain;
2177 pwr_info->tpc.dsp_atten = dsp_atten;
2178 }
2179
2180
2181 for (scan_tbl_idx = 0; scan_tbl_idx < IL_NUM_SCAN_RATES;
2182 scan_tbl_idx++) {
2183 s32 actual_idx =
2184 (scan_tbl_idx ==
2185 0) ? RATE_1M_IDX_TBL : RATE_6M_IDX_TBL;
2186 il3945_hw_reg_set_scan_power(il, scan_tbl_idx,
2187 actual_idx, clip_pwrs,
2188 ch_info, a_band);
2189 }
2190 }
2191
2192 return 0;
2193}
2194
2195int
2196il3945_hw_rxq_stop(struct il_priv *il)
2197{
2198 int ret;
2199
2200 _il_wr(il, FH39_RCSR_CONFIG(0), 0);
2201 ret = _il_poll_bit(il, FH39_RSSR_STATUS,
2202 FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
2203 FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
2204 1000);
2205 if (ret < 0)
2206 IL_ERR("Can't stop Rx DMA.\n");
2207
2208 return 0;
2209}
2210
2211int
2212il3945_hw_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq)
2213{
2214 int txq_id = txq->q.id;
2215
2216 struct il3945_shared *shared_data = il->_3945.shared_virt;
2217
2218 shared_data->tx_base_ptr[txq_id] = cpu_to_le32((u32) txq->q.dma_addr);
2219
2220 il_wr(il, FH39_CBCC_CTRL(txq_id), 0);
2221 il_wr(il, FH39_CBCC_BASE(txq_id), 0);
2222
2223 il_wr(il, FH39_TCSR_CONFIG(txq_id),
2224 FH39_TCSR_TX_CONFIG_REG_VAL_CIRQ_RTC_NOINT |
2225 FH39_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_TXF |
2226 FH39_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_IFTFD |
2227 FH39_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL |
2228 FH39_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE);
2229
2230
2231 _il_rd(il, FH39_TSSR_CBB_BASE);
2232
2233 return 0;
2234}
2235
2236
2237
2238
2239static u16
2240il3945_get_hcmd_size(u8 cmd_id, u16 len)
2241{
2242 switch (cmd_id) {
2243 case C_RXON:
2244 return sizeof(struct il3945_rxon_cmd);
2245 case C_POWER_TBL:
2246 return sizeof(struct il3945_powertable_cmd);
2247 default:
2248 return len;
2249 }
2250}
2251
2252static u16
2253il3945_build_addsta_hcmd(const struct il_addsta_cmd *cmd, u8 * data)
2254{
2255 struct il3945_addsta_cmd *addsta = (struct il3945_addsta_cmd *)data;
2256 addsta->mode = cmd->mode;
2257 memcpy(&addsta->sta, &cmd->sta, sizeof(struct sta_id_modify));
2258 memcpy(&addsta->key, &cmd->key, sizeof(struct il4965_keyinfo));
2259 addsta->station_flags = cmd->station_flags;
2260 addsta->station_flags_msk = cmd->station_flags_msk;
2261 addsta->tid_disable_tx = cpu_to_le16(0);
2262 addsta->rate_n_flags = cmd->rate_n_flags;
2263 addsta->add_immediate_ba_tid = cmd->add_immediate_ba_tid;
2264 addsta->remove_immediate_ba_tid = cmd->remove_immediate_ba_tid;
2265 addsta->add_immediate_ba_ssn = cmd->add_immediate_ba_ssn;
2266
2267 return (u16) sizeof(struct il3945_addsta_cmd);
2268}
2269
2270static int
2271il3945_add_bssid_station(struct il_priv *il, const u8 * addr, u8 * sta_id_r)
2272{
2273 int ret;
2274 u8 sta_id;
2275 unsigned long flags;
2276
2277 if (sta_id_r)
2278 *sta_id_r = IL_INVALID_STATION;
2279
2280 ret = il_add_station_common(il, addr, 0, NULL, &sta_id);
2281 if (ret) {
2282 IL_ERR("Unable to add station %pM\n", addr);
2283 return ret;
2284 }
2285
2286 if (sta_id_r)
2287 *sta_id_r = sta_id;
2288
2289 spin_lock_irqsave(&il->sta_lock, flags);
2290 il->stations[sta_id].used |= IL_STA_LOCAL;
2291 spin_unlock_irqrestore(&il->sta_lock, flags);
2292
2293 return 0;
2294}
2295
2296static int
2297il3945_manage_ibss_station(struct il_priv *il, struct ieee80211_vif *vif,
2298 bool add)
2299{
2300 struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
2301 int ret;
2302
2303 if (add) {
2304 ret =
2305 il3945_add_bssid_station(il, vif->bss_conf.bssid,
2306 &vif_priv->ibss_bssid_sta_id);
2307 if (ret)
2308 return ret;
2309
2310 il3945_sync_sta(il, vif_priv->ibss_bssid_sta_id,
2311 (il->band ==
2312 NL80211_BAND_5GHZ) ? RATE_6M_PLCP :
2313 RATE_1M_PLCP);
2314 il3945_rate_scale_init(il->hw, vif_priv->ibss_bssid_sta_id);
2315
2316 return 0;
2317 }
2318
2319 return il_remove_station(il, vif_priv->ibss_bssid_sta_id,
2320 vif->bss_conf.bssid);
2321}
2322
2323
2324
2325
2326int
2327il3945_init_hw_rate_table(struct il_priv *il)
2328{
2329 int rc, i, idx, prev_idx;
2330 struct il3945_rate_scaling_cmd rate_cmd = {
2331 .reserved = {0, 0, 0},
2332 };
2333 struct il3945_rate_scaling_info *table = rate_cmd.table;
2334
2335 for (i = 0; i < ARRAY_SIZE(il3945_rates); i++) {
2336 idx = il3945_rates[i].table_rs_idx;
2337
2338 table[idx].rate_n_flags = cpu_to_le16(il3945_rates[i].plcp);
2339 table[idx].try_cnt = il->retry_rate;
2340 prev_idx = il3945_get_prev_ieee_rate(i);
2341 table[idx].next_rate_idx = il3945_rates[prev_idx].table_rs_idx;
2342 }
2343
2344 switch (il->band) {
2345 case NL80211_BAND_5GHZ:
2346 D_RATE("Select A mode rate scale\n");
2347
2348
2349 for (i = RATE_1M_IDX_TBL; i <= RATE_11M_IDX_TBL; i++)
2350 table[i].next_rate_idx =
2351 il3945_rates[IL_FIRST_OFDM_RATE].table_rs_idx;
2352
2353
2354 table[RATE_12M_IDX_TBL].next_rate_idx = RATE_9M_IDX_TBL;
2355
2356
2357 table[RATE_6M_IDX_TBL].next_rate_idx =
2358 il3945_rates[IL_FIRST_OFDM_RATE].table_rs_idx;
2359 break;
2360
2361 case NL80211_BAND_2GHZ:
2362 D_RATE("Select B/G mode rate scale\n");
2363
2364
2365
2366 if (!(il->_3945.sta_supp_rates & IL_OFDM_RATES_MASK) &&
2367 il_is_associated(il)) {
2368
2369 idx = IL_FIRST_CCK_RATE;
2370 for (i = RATE_6M_IDX_TBL; i <= RATE_54M_IDX_TBL; i++)
2371 table[i].next_rate_idx =
2372 il3945_rates[idx].table_rs_idx;
2373
2374 idx = RATE_11M_IDX_TBL;
2375
2376 table[idx].next_rate_idx = RATE_5M_IDX_TBL;
2377 }
2378 break;
2379
2380 default:
2381 WARN_ON(1);
2382 break;
2383 }
2384
2385
2386 rate_cmd.table_id = 0;
2387 rc = il_send_cmd_pdu(il, C_RATE_SCALE, sizeof(rate_cmd), &rate_cmd);
2388 if (rc)
2389 return rc;
2390
2391
2392 rate_cmd.table_id = 1;
2393 return il_send_cmd_pdu(il, C_RATE_SCALE, sizeof(rate_cmd), &rate_cmd);
2394}
2395
2396
2397int
2398il3945_hw_set_hw_params(struct il_priv *il)
2399{
2400 memset((void *)&il->hw_params, 0, sizeof(struct il_hw_params));
2401
2402 il->_3945.shared_virt =
2403 dma_alloc_coherent(&il->pci_dev->dev, sizeof(struct il3945_shared),
2404 &il->_3945.shared_phys, GFP_KERNEL);
2405 if (!il->_3945.shared_virt)
2406 return -ENOMEM;
2407
2408 il->hw_params.bcast_id = IL3945_BROADCAST_ID;
2409
2410
2411 il->hw_params.max_txq_num = il->cfg->num_of_queues;
2412
2413 il->hw_params.tfd_size = sizeof(struct il3945_tfd);
2414 il->hw_params.rx_page_order = get_order(IL_RX_BUF_SIZE_3K);
2415 il->hw_params.max_rxq_size = RX_QUEUE_SIZE;
2416 il->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG;
2417 il->hw_params.max_stations = IL3945_STATION_COUNT;
2418
2419 il->sta_key_max_num = STA_KEY_MAX_NUM;
2420
2421 il->hw_params.rx_wrt_ptr_reg = FH39_RSCSR_CHNL0_WPTR;
2422 il->hw_params.max_beacon_itrvl = IL39_MAX_UCODE_BEACON_INTERVAL;
2423 il->hw_params.beacon_time_tsf_bits = IL3945_EXT_BEACON_TIME_POS;
2424
2425 return 0;
2426}
2427
2428unsigned int
2429il3945_hw_get_beacon_cmd(struct il_priv *il, struct il3945_frame *frame,
2430 u8 rate)
2431{
2432 struct il3945_tx_beacon_cmd *tx_beacon_cmd;
2433 unsigned int frame_size;
2434
2435 tx_beacon_cmd = (struct il3945_tx_beacon_cmd *)&frame->u;
2436 memset(tx_beacon_cmd, 0, sizeof(*tx_beacon_cmd));
2437
2438 tx_beacon_cmd->tx.sta_id = il->hw_params.bcast_id;
2439 tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
2440
2441 frame_size =
2442 il3945_fill_beacon_frame(il, tx_beacon_cmd->frame,
2443 sizeof(frame->u) - sizeof(*tx_beacon_cmd));
2444
2445 BUG_ON(frame_size > MAX_MPDU_SIZE);
2446 tx_beacon_cmd->tx.len = cpu_to_le16((u16) frame_size);
2447
2448 tx_beacon_cmd->tx.rate = rate;
2449 tx_beacon_cmd->tx.tx_flags =
2450 (TX_CMD_FLG_SEQ_CTL_MSK | TX_CMD_FLG_TSF_MSK);
2451
2452
2453 tx_beacon_cmd->tx.supp_rates[0] =
2454 (IL_OFDM_BASIC_RATES_MASK >> IL_FIRST_OFDM_RATE) & 0xFF;
2455
2456 tx_beacon_cmd->tx.supp_rates[1] = (IL_CCK_BASIC_RATES_MASK & 0xF);
2457
2458 return sizeof(struct il3945_tx_beacon_cmd) + frame_size;
2459}
2460
2461void
2462il3945_hw_handler_setup(struct il_priv *il)
2463{
2464 il->handlers[C_TX] = il3945_hdl_tx;
2465 il->handlers[N_3945_RX] = il3945_hdl_rx;
2466}
2467
2468void
2469il3945_hw_setup_deferred_work(struct il_priv *il)
2470{
2471 INIT_DELAYED_WORK(&il->_3945.thermal_periodic,
2472 il3945_bg_reg_txpower_periodic);
2473}
2474
2475void
2476il3945_hw_cancel_deferred_work(struct il_priv *il)
2477{
2478 cancel_delayed_work(&il->_3945.thermal_periodic);
2479}
2480
2481
2482static int
2483il3945_verify_bsm(struct il_priv *il)
2484{
2485 __le32 *image = il->ucode_boot.v_addr;
2486 u32 len = il->ucode_boot.len;
2487 u32 reg;
2488 u32 val;
2489
2490 D_INFO("Begin verify bsm\n");
2491
2492
2493 val = il_rd_prph(il, BSM_WR_DWCOUNT_REG);
2494 for (reg = BSM_SRAM_LOWER_BOUND; reg < BSM_SRAM_LOWER_BOUND + len;
2495 reg += sizeof(u32), image++) {
2496 val = il_rd_prph(il, reg);
2497 if (val != le32_to_cpu(*image)) {
2498 IL_ERR("BSM uCode verification failed at "
2499 "addr 0x%08X+%u (of %u), is 0x%x, s/b 0x%x\n",
2500 BSM_SRAM_LOWER_BOUND, reg - BSM_SRAM_LOWER_BOUND,
2501 len, val, le32_to_cpu(*image));
2502 return -EIO;
2503 }
2504 }
2505
2506 D_INFO("BSM bootstrap uCode image OK\n");
2507
2508 return 0;
2509}
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525static int
2526il3945_eeprom_acquire_semaphore(struct il_priv *il)
2527{
2528 _il_clear_bit(il, CSR_EEPROM_GP, CSR_EEPROM_GP_IF_OWNER_MSK);
2529 return 0;
2530}
2531
2532static void
2533il3945_eeprom_release_semaphore(struct il_priv *il)
2534{
2535 return;
2536}
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570static int
2571il3945_load_bsm(struct il_priv *il)
2572{
2573 __le32 *image = il->ucode_boot.v_addr;
2574 u32 len = il->ucode_boot.len;
2575 dma_addr_t pinst;
2576 dma_addr_t pdata;
2577 u32 inst_len;
2578 u32 data_len;
2579 int rc;
2580 int i;
2581 u32 done;
2582 u32 reg_offset;
2583
2584 D_INFO("Begin load bsm\n");
2585
2586
2587 if (len > IL39_MAX_BSM_SIZE)
2588 return -EINVAL;
2589
2590
2591
2592
2593
2594
2595 pinst = il->ucode_init.p_addr;
2596 pdata = il->ucode_init_data.p_addr;
2597 inst_len = il->ucode_init.len;
2598 data_len = il->ucode_init_data.len;
2599
2600 il_wr_prph(il, BSM_DRAM_INST_PTR_REG, pinst);
2601 il_wr_prph(il, BSM_DRAM_DATA_PTR_REG, pdata);
2602 il_wr_prph(il, BSM_DRAM_INST_BYTECOUNT_REG, inst_len);
2603 il_wr_prph(il, BSM_DRAM_DATA_BYTECOUNT_REG, data_len);
2604
2605
2606 for (reg_offset = BSM_SRAM_LOWER_BOUND;
2607 reg_offset < BSM_SRAM_LOWER_BOUND + len;
2608 reg_offset += sizeof(u32), image++)
2609 _il_wr_prph(il, reg_offset, le32_to_cpu(*image));
2610
2611 rc = il3945_verify_bsm(il);
2612 if (rc)
2613 return rc;
2614
2615
2616 il_wr_prph(il, BSM_WR_MEM_SRC_REG, 0x0);
2617 il_wr_prph(il, BSM_WR_MEM_DST_REG, IL39_RTC_INST_LOWER_BOUND);
2618 il_wr_prph(il, BSM_WR_DWCOUNT_REG, len / sizeof(u32));
2619
2620
2621
2622 il_wr_prph(il, BSM_WR_CTRL_REG, BSM_WR_CTRL_REG_BIT_START);
2623
2624
2625 for (i = 0; i < 100; i++) {
2626 done = il_rd_prph(il, BSM_WR_CTRL_REG);
2627 if (!(done & BSM_WR_CTRL_REG_BIT_START))
2628 break;
2629 udelay(10);
2630 }
2631 if (i < 100)
2632 D_INFO("BSM write complete, poll %d iterations\n", i);
2633 else {
2634 IL_ERR("BSM write did not complete!\n");
2635 return -EIO;
2636 }
2637
2638
2639
2640 il_wr_prph(il, BSM_WR_CTRL_REG, BSM_WR_CTRL_REG_BIT_START_EN);
2641
2642 return 0;
2643}
2644
2645const struct il_ops il3945_ops = {
2646 .txq_attach_buf_to_tfd = il3945_hw_txq_attach_buf_to_tfd,
2647 .txq_free_tfd = il3945_hw_txq_free_tfd,
2648 .txq_init = il3945_hw_tx_queue_init,
2649 .load_ucode = il3945_load_bsm,
2650 .dump_nic_error_log = il3945_dump_nic_error_log,
2651 .apm_init = il3945_apm_init,
2652 .send_tx_power = il3945_send_tx_power,
2653 .is_valid_rtc_data_addr = il3945_hw_valid_rtc_data_addr,
2654 .eeprom_acquire_semaphore = il3945_eeprom_acquire_semaphore,
2655 .eeprom_release_semaphore = il3945_eeprom_release_semaphore,
2656
2657 .rxon_assoc = il3945_send_rxon_assoc,
2658 .commit_rxon = il3945_commit_rxon,
2659
2660 .get_hcmd_size = il3945_get_hcmd_size,
2661 .build_addsta_hcmd = il3945_build_addsta_hcmd,
2662 .request_scan = il3945_request_scan,
2663 .post_scan = il3945_post_scan,
2664
2665 .post_associate = il3945_post_associate,
2666 .config_ap = il3945_config_ap,
2667 .manage_ibss_station = il3945_manage_ibss_station,
2668
2669 .send_led_cmd = il3945_send_led_cmd,
2670};
2671
2672static const struct il_cfg il3945_bg_cfg = {
2673 .name = "3945BG",
2674 .fw_name_pre = IL3945_FW_PRE,
2675 .ucode_api_max = IL3945_UCODE_API_MAX,
2676 .ucode_api_min = IL3945_UCODE_API_MIN,
2677 .sku = IL_SKU_G,
2678 .eeprom_ver = EEPROM_3945_EEPROM_VERSION,
2679 .mod_params = &il3945_mod_params,
2680 .led_mode = IL_LED_BLINK,
2681
2682 .eeprom_size = IL3945_EEPROM_IMG_SIZE,
2683 .num_of_queues = IL39_NUM_QUEUES,
2684 .pll_cfg_val = CSR39_ANA_PLL_CFG_VAL,
2685 .set_l0s = false,
2686 .use_bsm = true,
2687 .led_compensation = 64,
2688 .wd_timeout = IL_DEF_WD_TIMEOUT,
2689
2690 .regulatory_bands = {
2691 EEPROM_REGULATORY_BAND_1_CHANNELS,
2692 EEPROM_REGULATORY_BAND_2_CHANNELS,
2693 EEPROM_REGULATORY_BAND_3_CHANNELS,
2694 EEPROM_REGULATORY_BAND_4_CHANNELS,
2695 EEPROM_REGULATORY_BAND_5_CHANNELS,
2696 EEPROM_REGULATORY_BAND_NO_HT40,
2697 EEPROM_REGULATORY_BAND_NO_HT40,
2698 },
2699};
2700
2701static const struct il_cfg il3945_abg_cfg = {
2702 .name = "3945ABG",
2703 .fw_name_pre = IL3945_FW_PRE,
2704 .ucode_api_max = IL3945_UCODE_API_MAX,
2705 .ucode_api_min = IL3945_UCODE_API_MIN,
2706 .sku = IL_SKU_A | IL_SKU_G,
2707 .eeprom_ver = EEPROM_3945_EEPROM_VERSION,
2708 .mod_params = &il3945_mod_params,
2709 .led_mode = IL_LED_BLINK,
2710
2711 .eeprom_size = IL3945_EEPROM_IMG_SIZE,
2712 .num_of_queues = IL39_NUM_QUEUES,
2713 .pll_cfg_val = CSR39_ANA_PLL_CFG_VAL,
2714 .set_l0s = false,
2715 .use_bsm = true,
2716 .led_compensation = 64,
2717 .wd_timeout = IL_DEF_WD_TIMEOUT,
2718
2719 .regulatory_bands = {
2720 EEPROM_REGULATORY_BAND_1_CHANNELS,
2721 EEPROM_REGULATORY_BAND_2_CHANNELS,
2722 EEPROM_REGULATORY_BAND_3_CHANNELS,
2723 EEPROM_REGULATORY_BAND_4_CHANNELS,
2724 EEPROM_REGULATORY_BAND_5_CHANNELS,
2725 EEPROM_REGULATORY_BAND_NO_HT40,
2726 EEPROM_REGULATORY_BAND_NO_HT40,
2727 },
2728};
2729
2730const struct pci_device_id il3945_hw_card_ids[] = {
2731 {IL_PCI_DEVICE(0x4222, 0x1005, il3945_bg_cfg)},
2732 {IL_PCI_DEVICE(0x4222, 0x1034, il3945_bg_cfg)},
2733 {IL_PCI_DEVICE(0x4222, 0x1044, il3945_bg_cfg)},
2734 {IL_PCI_DEVICE(0x4227, 0x1014, il3945_bg_cfg)},
2735 {IL_PCI_DEVICE(0x4222, PCI_ANY_ID, il3945_abg_cfg)},
2736 {IL_PCI_DEVICE(0x4227, PCI_ANY_ID, il3945_abg_cfg)},
2737 {0}
2738};
2739
2740MODULE_DEVICE_TABLE(pci, il3945_hw_card_ids);
2741