3 * Common code for mac80211 Prism54 drivers
5 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
6 * Copyright (c) 2007, Christian Lamparter <chunkeey@web.de>
8 * Based on the islsm (softmac prism54) driver, which is:
9 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
16 #include <linux/init.h>
17 #include <linux/firmware.h>
18 #include <linux/etherdevice.h>
20 #include <net/mac80211.h>
23 #include "p54common.h"
25 MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
26 MODULE_DESCRIPTION("Softmac Prism54 common code");
27 MODULE_LICENSE("GPL");
28 MODULE_ALIAS("prism54common");
30 void p54_parse_firmware(struct ieee80211_hw
*dev
, const struct firmware
*fw
)
32 struct p54_common
*priv
= dev
->priv
;
33 struct bootrec_exp_if
*exp_if
;
34 struct bootrec
*bootrec
;
35 u32
*data
= (u32
*)fw
->data
;
36 u32
*end_data
= (u32
*)fw
->data
+ (fw
->size
>> 2);
37 u8
*fw_version
= NULL
;
44 while (data
< end_data
&& *data
)
47 while (data
< end_data
&& !*data
)
50 bootrec
= (struct bootrec
*) data
;
52 while (bootrec
->data
<= end_data
&&
53 (bootrec
->data
+ (len
= le32_to_cpu(bootrec
->len
))) <= end_data
) {
54 u32 code
= le32_to_cpu(bootrec
->code
);
56 case BR_CODE_COMPONENT_ID
:
57 switch (be32_to_cpu(*bootrec
->data
)) {
59 printk(KERN_INFO
"p54: FreeMAC firmware\n");
62 printk(KERN_INFO
"p54: LM20 firmware\n");
65 printk(KERN_INFO
"p54: LM86 firmware\n");
68 printk(KERN_INFO
"p54: LM87 firmware - not supported yet!\n");
71 printk(KERN_INFO
"p54: unknown firmware\n");
75 case BR_CODE_COMPONENT_VERSION
:
76 /* 24 bytes should be enough for all firmwares */
77 if (strnlen((unsigned char*)bootrec
->data
, 24) < 24)
78 fw_version
= (unsigned char*)bootrec
->data
;
81 priv
->rx_start
= le32_to_cpu(bootrec
->data
[1]);
82 /* FIXME add sanity checking */
83 priv
->rx_end
= le32_to_cpu(bootrec
->data
[2]) - 0x3500;
85 case BR_CODE_EXPOSED_IF
:
86 exp_if
= (struct bootrec_exp_if
*) bootrec
->data
;
87 for (i
= 0; i
< (len
* sizeof(*exp_if
) / 4); i
++)
88 if (exp_if
[i
].if_id
== 0x1a)
89 priv
->fw_var
= le16_to_cpu(exp_if
[i
].variant
);
91 case BR_CODE_DEPENDENT_IF
:
93 case BR_CODE_END_OF_BRA
:
94 case LEGACY_BR_CODE_END_OF_BRA
:
100 bootrec
= (struct bootrec
*)&bootrec
->data
[len
];
104 printk(KERN_INFO
"p54: FW rev %s - Softmac protocol %x.%x\n",
105 fw_version
, priv
->fw_var
>> 8, priv
->fw_var
& 0xff);
107 if (priv
->fw_var
>= 0x300) {
108 /* Firmware supports QoS, use it! */
109 priv
->tx_stats
.data
[0].limit
= 3;
110 priv
->tx_stats
.data
[1].limit
= 4;
111 priv
->tx_stats
.data
[2].limit
= 3;
112 priv
->tx_stats
.data
[3].limit
= 1;
116 EXPORT_SYMBOL_GPL(p54_parse_firmware
);
118 static int p54_convert_rev0_to_rev1(struct ieee80211_hw
*dev
,
119 struct pda_pa_curve_data
*curve_data
)
121 struct p54_common
*priv
= dev
->priv
;
122 struct pda_pa_curve_data_sample_rev1
*rev1
;
123 struct pda_pa_curve_data_sample_rev0
*rev0
;
124 size_t cd_len
= sizeof(*curve_data
) +
125 (curve_data
->points_per_channel
*sizeof(*rev1
) + 2) *
126 curve_data
->channels
;
128 void *source
, *target
;
130 priv
->curve_data
= kmalloc(cd_len
, GFP_KERNEL
);
131 if (!priv
->curve_data
)
134 memcpy(priv
->curve_data
, curve_data
, sizeof(*curve_data
));
135 source
= curve_data
->data
;
136 target
= priv
->curve_data
->data
;
137 for (i
= 0; i
< curve_data
->channels
; i
++) {
138 __le16
*freq
= source
;
139 source
+= sizeof(__le16
);
140 *((__le16
*)target
) = *freq
;
141 target
+= sizeof(__le16
);
142 for (j
= 0; j
< curve_data
->points_per_channel
; j
++) {
146 rev1
->rf_power
= rev0
->rf_power
;
147 rev1
->pa_detector
= rev0
->pa_detector
;
148 rev1
->data_64qam
= rev0
->pcv
;
149 /* "invent" the points for the other modulations */
150 #define SUB(x,y) (u8)((x) - (y)) > (x) ? 0 : (x) - (y)
151 rev1
->data_16qam
= SUB(rev0
->pcv
, 12);
152 rev1
->data_qpsk
= SUB(rev1
->data_16qam
, 12);
153 rev1
->data_bpsk
= SUB(rev1
->data_qpsk
, 12);
154 rev1
->data_barker
= SUB(rev1
->data_bpsk
, 14);
156 target
+= sizeof(*rev1
);
157 source
+= sizeof(*rev0
);
164 int p54_parse_eeprom(struct ieee80211_hw
*dev
, void *eeprom
, int len
)
166 struct p54_common
*priv
= dev
->priv
;
167 struct eeprom_pda_wrap
*wrap
= NULL
;
168 struct pda_entry
*entry
;
170 unsigned int data_len
, entry_len
;
174 wrap
= (struct eeprom_pda_wrap
*) eeprom
;
175 entry
= (void *)wrap
->data
+ wrap
->len
;
177 i
+= le16_to_cpu(entry
->len
)*2;
179 entry_len
= le16_to_cpu(entry
->len
);
180 data_len
= ((entry_len
- 1) << 1);
181 switch (le16_to_cpu(entry
->code
)) {
182 case PDR_MAC_ADDRESS
:
183 SET_IEEE80211_PERM_ADDR(dev
, entry
->data
);
185 case PDR_PRISM_PA_CAL_OUTPUT_POWER_LIMITS
:
191 if (2 + entry
->data
[1]*sizeof(*priv
->output_limit
) > data_len
) {
196 priv
->output_limit
= kmalloc(entry
->data
[1] *
197 sizeof(*priv
->output_limit
), GFP_KERNEL
);
199 if (!priv
->output_limit
) {
204 memcpy(priv
->output_limit
, &entry
->data
[2],
205 entry
->data
[1]*sizeof(*priv
->output_limit
));
206 priv
->output_limit_len
= entry
->data
[1];
208 case PDR_PRISM_PA_CAL_CURVE_DATA
:
209 if (data_len
< sizeof(struct pda_pa_curve_data
)) {
214 if (((struct pda_pa_curve_data
*)entry
->data
)->cal_method_rev
) {
215 priv
->curve_data
= kmalloc(data_len
, GFP_KERNEL
);
216 if (!priv
->curve_data
) {
221 memcpy(priv
->curve_data
, entry
->data
, data_len
);
223 err
= p54_convert_rev0_to_rev1(dev
, (struct pda_pa_curve_data
*)entry
->data
);
229 case PDR_PRISM_ZIF_TX_IQ_CALIBRATION
:
230 priv
->iq_autocal
= kmalloc(data_len
, GFP_KERNEL
);
231 if (!priv
->iq_autocal
) {
236 memcpy(priv
->iq_autocal
, entry
->data
, data_len
);
237 priv
->iq_autocal_len
= data_len
/ sizeof(struct pda_iq_autocal_entry
);
239 case PDR_INTERFACE_LIST
:
241 while ((u8
*)tmp
< entry
->data
+ data_len
) {
242 struct bootrec_exp_if
*exp_if
= tmp
;
243 if (le16_to_cpu(exp_if
->if_id
) == 0xF)
244 priv
->rxhw
= exp_if
->variant
& cpu_to_le16(0x07);
245 tmp
+= sizeof(struct bootrec_exp_if
);
248 case PDR_HARDWARE_PLATFORM_COMPONENT_ID
:
249 priv
->version
= *(u8
*)(entry
->data
+ 1);
256 entry
= (void *)entry
+ (entry_len
+ 1)*2;
261 if (!priv
->iq_autocal
|| !priv
->output_limit
|| !priv
->curve_data
) {
262 printk(KERN_ERR
"p54: not all required entries found in eeprom!\n");
270 if (priv
->iq_autocal
) {
271 kfree(priv
->iq_autocal
);
272 priv
->iq_autocal
= NULL
;
275 if (priv
->output_limit
) {
276 kfree(priv
->output_limit
);
277 priv
->output_limit
= NULL
;
280 if (priv
->curve_data
) {
281 kfree(priv
->curve_data
);
282 priv
->curve_data
= NULL
;
285 printk(KERN_ERR
"p54: eeprom parse failed!\n");
288 EXPORT_SYMBOL_GPL(p54_parse_eeprom
);
290 void p54_fill_eeprom_readback(struct p54_control_hdr
*hdr
)
292 struct p54_eeprom_lm86
*eeprom_hdr
;
294 hdr
->magic1
= cpu_to_le16(0x8000);
295 hdr
->len
= cpu_to_le16(sizeof(*eeprom_hdr
) + 0x2000);
296 hdr
->type
= cpu_to_le16(P54_CONTROL_TYPE_EEPROM_READBACK
);
297 hdr
->retry1
= hdr
->retry2
= 0;
298 eeprom_hdr
= (struct p54_eeprom_lm86
*) hdr
->data
;
299 eeprom_hdr
->offset
= 0x0;
300 eeprom_hdr
->len
= cpu_to_le16(0x2000);
302 EXPORT_SYMBOL_GPL(p54_fill_eeprom_readback
);
304 static void p54_rx_data(struct ieee80211_hw
*dev
, struct sk_buff
*skb
)
306 struct p54_rx_hdr
*hdr
= (struct p54_rx_hdr
*) skb
->data
;
307 struct ieee80211_rx_status rx_status
= {0};
308 u16 freq
= le16_to_cpu(hdr
->freq
);
310 rx_status
.ssi
= hdr
->rssi
;
311 rx_status
.rate
= hdr
->rate
& 0x1f; /* report short preambles & CCK too */
312 rx_status
.channel
= freq
== 2484 ? 14 : (freq
- 2407)/5;
313 rx_status
.freq
= freq
;
314 rx_status
.phymode
= MODE_IEEE80211G
;
315 rx_status
.antenna
= hdr
->antenna
;
316 rx_status
.mactime
= le64_to_cpu(hdr
->timestamp
);
318 skb_pull(skb
, sizeof(*hdr
));
319 skb_trim(skb
, le16_to_cpu(hdr
->len
));
321 ieee80211_rx_irqsafe(dev
, skb
, &rx_status
);
324 static void inline p54_wake_free_queues(struct ieee80211_hw
*dev
)
326 struct p54_common
*priv
= dev
->priv
;
329 /* ieee80211_start_queues is great if all queues are really empty.
330 * But, what if some are full? */
332 for (i
= 0; i
< dev
->queues
; i
++)
333 if (priv
->tx_stats
.data
[i
].len
< priv
->tx_stats
.data
[i
].limit
)
334 ieee80211_wake_queue(dev
, i
);
337 static void p54_rx_frame_sent(struct ieee80211_hw
*dev
, struct sk_buff
*skb
)
339 struct p54_common
*priv
= dev
->priv
;
340 struct p54_control_hdr
*hdr
= (struct p54_control_hdr
*) skb
->data
;
341 struct p54_frame_sent_hdr
*payload
= (struct p54_frame_sent_hdr
*) hdr
->data
;
342 struct sk_buff
*entry
= (struct sk_buff
*) priv
->tx_queue
.next
;
343 u32 addr
= le32_to_cpu(hdr
->req_id
) - 0x70;
344 struct memrecord
*range
= NULL
;
346 u32 last_addr
= priv
->rx_start
;
348 while (entry
!= (struct sk_buff
*)&priv
->tx_queue
) {
349 range
= (struct memrecord
*)&entry
->cb
;
350 if (range
->start_addr
== addr
) {
351 struct ieee80211_tx_status status
= {{0}};
352 struct p54_control_hdr
*entry_hdr
;
353 struct p54_tx_control_allocdata
*entry_data
;
356 if (entry
->next
!= (struct sk_buff
*)&priv
->tx_queue
)
357 freed
= ((struct memrecord
*)&entry
->next
->cb
)->start_addr
- last_addr
;
359 freed
= priv
->rx_end
- last_addr
;
361 last_addr
= range
->end_addr
;
362 __skb_unlink(entry
, &priv
->tx_queue
);
363 if (!range
->control
) {
367 memcpy(&status
.control
, range
->control
,
368 sizeof(status
.control
));
369 kfree(range
->control
);
370 priv
->tx_stats
.data
[status
.control
.queue
].len
--;
372 entry_hdr
= (struct p54_control_hdr
*) entry
->data
;
373 entry_data
= (struct p54_tx_control_allocdata
*) entry_hdr
->data
;
374 if ((entry_hdr
->magic1
& cpu_to_le16(0x4000)) != 0)
375 pad
= entry_data
->align
[0];
377 if (!status
.control
.flags
& IEEE80211_TXCTL_NO_ACK
) {
378 if (!(payload
->status
& 0x01))
379 status
.flags
|= IEEE80211_TX_STATUS_ACK
;
381 status
.excessive_retries
= 1;
383 status
.retry_count
= payload
->retries
- 1;
384 status
.ack_signal
= le16_to_cpu(payload
->ack_rssi
);
385 skb_pull(entry
, sizeof(*hdr
) + pad
+ sizeof(*entry_data
));
386 ieee80211_tx_status_irqsafe(dev
, entry
, &status
);
389 last_addr
= range
->end_addr
;
393 if (freed
>= IEEE80211_MAX_RTS_THRESHOLD
+ 0x170 +
394 sizeof(struct p54_control_hdr
))
395 p54_wake_free_queues(dev
);
398 static void p54_rx_control(struct ieee80211_hw
*dev
, struct sk_buff
*skb
)
400 struct p54_control_hdr
*hdr
= (struct p54_control_hdr
*) skb
->data
;
402 switch (le16_to_cpu(hdr
->type
)) {
403 case P54_CONTROL_TYPE_TXDONE
:
404 p54_rx_frame_sent(dev
, skb
);
406 case P54_CONTROL_TYPE_BBP
:
409 printk(KERN_DEBUG
"%s: not handling 0x%02x type control frame\n",
410 wiphy_name(dev
->wiphy
), le16_to_cpu(hdr
->type
));
415 /* returns zero if skb can be reused */
416 int p54_rx(struct ieee80211_hw
*dev
, struct sk_buff
*skb
)
418 u8 type
= le16_to_cpu(*((__le16
*)skb
->data
)) >> 8;
422 p54_rx_data(dev
, skb
);
425 /* TODO: do something better... but then again, I've never seen this happen */
426 printk(KERN_ERR
"%s: Received fault. Probably need to restart hardware now..\n",
427 wiphy_name(dev
->wiphy
));
430 p54_rx_control(dev
, skb
);
433 printk(KERN_ERR
"%s: unknown frame RXed (0x%02x)\n",
434 wiphy_name(dev
->wiphy
), type
);
439 EXPORT_SYMBOL_GPL(p54_rx
);
442 * So, the firmware is somewhat stupid and doesn't know what places in its
443 * memory incoming data should go to. By poking around in the firmware, we
444 * can find some unused memory to upload our packets to. However, data that we
445 * want the card to TX needs to stay intact until the card has told us that
446 * it is done with it. This function finds empty places we can upload to and
447 * marks allocated areas as reserved if necessary. p54_rx_frame_sent frees
450 static void p54_assign_address(struct ieee80211_hw
*dev
, struct sk_buff
*skb
,
451 struct p54_control_hdr
*data
, u32 len
,
452 struct ieee80211_tx_control
*control
)
454 struct p54_common
*priv
= dev
->priv
;
455 struct sk_buff
*entry
= priv
->tx_queue
.next
;
456 struct sk_buff
*target_skb
= NULL
;
457 struct memrecord
*range
;
458 u32 last_addr
= priv
->rx_start
;
459 u32 largest_hole
= 0;
460 u32 target_addr
= priv
->rx_start
;
463 len
= (len
+ 0x170 + 3) & ~0x3; /* 0x70 headroom, 0x100 tailroom */
465 spin_lock_irqsave(&priv
->tx_queue
.lock
, flags
);
466 left
= skb_queue_len(&priv
->tx_queue
);
469 range
= (struct memrecord
*)&entry
->cb
;
470 hole_size
= range
->start_addr
- last_addr
;
471 if (!target_skb
&& hole_size
>= len
) {
472 target_skb
= entry
->prev
;
474 target_addr
= last_addr
;
476 largest_hole
= max(largest_hole
, hole_size
);
477 last_addr
= range
->end_addr
;
480 if (!target_skb
&& priv
->rx_end
- last_addr
>= len
) {
481 target_skb
= priv
->tx_queue
.prev
;
482 largest_hole
= max(largest_hole
, priv
->rx_end
- last_addr
- len
);
483 if (!skb_queue_empty(&priv
->tx_queue
)) {
484 range
= (struct memrecord
*)&target_skb
->cb
;
485 target_addr
= range
->end_addr
;
488 largest_hole
= max(largest_hole
, priv
->rx_end
- last_addr
);
491 range
= (struct memrecord
*)&skb
->cb
;
492 range
->start_addr
= target_addr
;
493 range
->end_addr
= target_addr
+ len
;
494 range
->control
= control
;
495 __skb_queue_after(&priv
->tx_queue
, target_skb
, skb
);
496 if (largest_hole
< IEEE80211_MAX_RTS_THRESHOLD
+ 0x170 +
497 sizeof(struct p54_control_hdr
))
498 ieee80211_stop_queues(dev
);
500 spin_unlock_irqrestore(&priv
->tx_queue
.lock
, flags
);
502 data
->req_id
= cpu_to_le32(target_addr
+ 0x70);
505 static int p54_tx(struct ieee80211_hw
*dev
, struct sk_buff
*skb
,
506 struct ieee80211_tx_control
*control
)
508 struct ieee80211_tx_queue_stats_data
*current_queue
;
509 struct p54_common
*priv
= dev
->priv
;
510 struct p54_control_hdr
*hdr
;
511 struct p54_tx_control_allocdata
*txhdr
;
512 struct ieee80211_tx_control
*control_copy
;
516 current_queue
= &priv
->tx_stats
.data
[control
->queue
];
517 if (unlikely(current_queue
->len
> current_queue
->limit
))
518 return NETDEV_TX_BUSY
;
519 current_queue
->len
++;
520 current_queue
->count
++;
521 if (current_queue
->len
== current_queue
->limit
)
522 ieee80211_stop_queue(dev
, control
->queue
);
524 padding
= (unsigned long)(skb
->data
- (sizeof(*hdr
) + sizeof(*txhdr
))) & 3;
527 control_copy
= kmalloc(sizeof(*control
), GFP_ATOMIC
);
529 memcpy(control_copy
, control
, sizeof(*control
));
531 txhdr
= (struct p54_tx_control_allocdata
*)
532 skb_push(skb
, sizeof(*txhdr
) + padding
);
533 hdr
= (struct p54_control_hdr
*) skb_push(skb
, sizeof(*hdr
));
536 hdr
->magic1
= cpu_to_le16(0x4010);
538 hdr
->magic1
= cpu_to_le16(0x0010);
539 hdr
->len
= cpu_to_le16(len
);
540 hdr
->type
= (control
->flags
& IEEE80211_TXCTL_NO_ACK
) ? 0 : cpu_to_le16(1);
541 hdr
->retry1
= hdr
->retry2
= control
->retry_limit
;
542 p54_assign_address(dev
, skb
, hdr
, skb
->len
, control_copy
);
544 memset(txhdr
->wep_key
, 0x0, 16);
548 /* TODO: add support for alternate retry TX rates */
549 rate
= control
->tx_rate
;
550 if (control
->flags
& IEEE80211_TXCTL_USE_RTS_CTS
)
552 else if (control
->flags
& IEEE80211_TXCTL_USE_CTS_PROTECT
)
554 memset(txhdr
->rateset
, rate
, 8);
555 txhdr
->wep_key_present
= 0;
556 txhdr
->wep_key_len
= 0;
557 txhdr
->frame_type
= cpu_to_le32(control
->queue
+ 4);
559 txhdr
->antenna
= (control
->antenna_sel_tx
== 0) ?
560 2 : control
->antenna_sel_tx
- 1;
561 txhdr
->output_power
= 0x7f; // HW Maximum
562 txhdr
->magic5
= (control
->flags
& IEEE80211_TXCTL_NO_ACK
) ?
563 0 : ((rate
> 0x3) ? cpu_to_le32(0x33) : cpu_to_le32(0x23));
565 txhdr
->align
[0] = padding
;
567 priv
->tx(dev
, hdr
, skb
->len
, 0);
571 static int p54_set_filter(struct ieee80211_hw
*dev
, u16 filter_type
,
572 const u8
*dst
, const u8
*src
, u8 antenna
,
573 u32 magic3
, u32 magic8
, u32 magic9
)
575 struct p54_common
*priv
= dev
->priv
;
576 struct p54_control_hdr
*hdr
;
577 struct p54_tx_control_filter
*filter
;
579 hdr
= kzalloc(sizeof(*hdr
) + sizeof(*filter
) +
580 priv
->tx_hdr_len
, GFP_ATOMIC
);
584 hdr
= (void *)hdr
+ priv
->tx_hdr_len
;
586 filter
= (struct p54_tx_control_filter
*) hdr
->data
;
587 hdr
->magic1
= cpu_to_le16(0x8001);
588 hdr
->len
= cpu_to_le16(sizeof(*filter
));
589 p54_assign_address(dev
, NULL
, hdr
, sizeof(*hdr
) + sizeof(*filter
), NULL
);
590 hdr
->type
= cpu_to_le16(P54_CONTROL_TYPE_FILTER_SET
);
592 filter
->filter_type
= cpu_to_le16(filter_type
);
593 memcpy(filter
->dst
, dst
, ETH_ALEN
);
595 memset(filter
->src
, ~0, ETH_ALEN
);
597 memcpy(filter
->src
, src
, ETH_ALEN
);
598 filter
->antenna
= antenna
;
599 filter
->magic3
= cpu_to_le32(magic3
);
600 filter
->rx_addr
= cpu_to_le32(priv
->rx_end
);
601 filter
->max_rx
= cpu_to_le16(0x0620); /* FIXME: for usb ver 1.. maybe */
602 filter
->rxhw
= priv
->rxhw
;
603 filter
->magic8
= cpu_to_le16(magic8
);
604 filter
->magic9
= cpu_to_le16(magic9
);
606 priv
->tx(dev
, hdr
, sizeof(*hdr
) + sizeof(*filter
), 1);
610 static int p54_set_freq(struct ieee80211_hw
*dev
, __le16 freq
)
612 struct p54_common
*priv
= dev
->priv
;
613 struct p54_control_hdr
*hdr
;
614 struct p54_tx_control_channel
*chan
;
616 size_t payload_len
= sizeof(*chan
) + sizeof(u32
)*2 +
617 sizeof(*chan
->curve_data
) *
618 priv
->curve_data
->points_per_channel
;
621 hdr
= kzalloc(sizeof(*hdr
) + payload_len
+
622 priv
->tx_hdr_len
, GFP_KERNEL
);
626 hdr
= (void *)hdr
+ priv
->tx_hdr_len
;
628 chan
= (struct p54_tx_control_channel
*) hdr
->data
;
630 hdr
->magic1
= cpu_to_le16(0x8001);
631 hdr
->len
= cpu_to_le16(sizeof(*chan
));
632 hdr
->type
= cpu_to_le16(P54_CONTROL_TYPE_CHANNEL_CHANGE
);
633 p54_assign_address(dev
, NULL
, hdr
, sizeof(*hdr
) + payload_len
, NULL
);
635 chan
->magic1
= cpu_to_le16(0x1);
636 chan
->magic2
= cpu_to_le16(0x0);
638 for (i
= 0; i
< priv
->iq_autocal_len
; i
++) {
639 if (priv
->iq_autocal
[i
].freq
!= freq
)
642 memcpy(&chan
->iq_autocal
, &priv
->iq_autocal
[i
],
643 sizeof(*priv
->iq_autocal
));
646 if (i
== priv
->iq_autocal_len
)
649 for (i
= 0; i
< priv
->output_limit_len
; i
++) {
650 if (priv
->output_limit
[i
].freq
!= freq
)
653 chan
->val_barker
= 0x38;
654 chan
->val_bpsk
= priv
->output_limit
[i
].val_bpsk
;
655 chan
->val_qpsk
= priv
->output_limit
[i
].val_qpsk
;
656 chan
->val_16qam
= priv
->output_limit
[i
].val_16qam
;
657 chan
->val_64qam
= priv
->output_limit
[i
].val_64qam
;
660 if (i
== priv
->output_limit_len
)
663 chan
->pa_points_per_curve
= priv
->curve_data
->points_per_channel
;
665 entry
= priv
->curve_data
->data
;
666 for (i
= 0; i
< priv
->curve_data
->channels
; i
++) {
667 if (*((__le16
*)entry
) != freq
) {
668 entry
+= sizeof(__le16
);
669 entry
+= sizeof(struct pda_pa_curve_data_sample_rev1
) *
670 chan
->pa_points_per_curve
;
674 entry
+= sizeof(__le16
);
675 memcpy(chan
->curve_data
, entry
, sizeof(*chan
->curve_data
) *
676 chan
->pa_points_per_curve
);
680 memcpy(hdr
->data
+ payload_len
- 4, &chan
->val_bpsk
, 4);
682 priv
->tx(dev
, hdr
, sizeof(*hdr
) + payload_len
, 1);
686 printk(KERN_ERR
"%s: frequency change failed\n", wiphy_name(dev
->wiphy
));
691 static int p54_set_leds(struct ieee80211_hw
*dev
, int mode
, int link
, int act
)
693 struct p54_common
*priv
= dev
->priv
;
694 struct p54_control_hdr
*hdr
;
695 struct p54_tx_control_led
*led
;
697 hdr
= kzalloc(sizeof(*hdr
) + sizeof(*led
) +
698 priv
->tx_hdr_len
, GFP_KERNEL
);
702 hdr
= (void *)hdr
+ priv
->tx_hdr_len
;
703 hdr
->magic1
= cpu_to_le16(0x8001);
704 hdr
->len
= cpu_to_le16(sizeof(*led
));
705 hdr
->type
= cpu_to_le16(P54_CONTROL_TYPE_LED
);
706 p54_assign_address(dev
, NULL
, hdr
, sizeof(*hdr
) + sizeof(*led
), NULL
);
708 led
= (struct p54_tx_control_led
*) hdr
->data
;
709 led
->mode
= cpu_to_le16(mode
);
710 led
->led_permanent
= cpu_to_le16(link
);
711 led
->led_temporary
= cpu_to_le16(act
);
712 led
->duration
= cpu_to_le16(1000);
714 priv
->tx(dev
, hdr
, sizeof(*hdr
) + sizeof(*led
), 1);
719 #define P54_SET_QUEUE(queue, ai_fs, cw_min, cw_max, burst) \
721 queue.aifs = cpu_to_le16(ai_fs); \
722 queue.cwmin = cpu_to_le16(cw_min); \
723 queue.cwmax = cpu_to_le16(cw_max); \
724 queue.txop = (burst == 0) ? \
725 0 : cpu_to_le16((burst * 100) / 32 + 1); \
728 static void p54_init_vdcf(struct ieee80211_hw
*dev
)
730 struct p54_common
*priv
= dev
->priv
;
731 struct p54_control_hdr
*hdr
;
732 struct p54_tx_control_vdcf
*vdcf
;
734 /* all USB V1 adapters need a extra headroom */
735 hdr
= (void *)priv
->cached_vdcf
+ priv
->tx_hdr_len
;
736 hdr
->magic1
= cpu_to_le16(0x8001);
737 hdr
->len
= cpu_to_le16(sizeof(*vdcf
));
738 hdr
->type
= cpu_to_le16(P54_CONTROL_TYPE_DCFINIT
);
739 hdr
->req_id
= cpu_to_le32(priv
->rx_start
);
741 vdcf
= (struct p54_tx_control_vdcf
*) hdr
->data
;
743 P54_SET_QUEUE(vdcf
->queue
[0], 0x0002, 0x0003, 0x0007, 0x000f);
744 P54_SET_QUEUE(vdcf
->queue
[1], 0x0002, 0x0007, 0x000f, 0x001e);
745 P54_SET_QUEUE(vdcf
->queue
[2], 0x0002, 0x000f, 0x03ff, 0x0014);
746 P54_SET_QUEUE(vdcf
->queue
[3], 0x0007, 0x000f, 0x03ff, 0x0000);
749 static void p54_set_vdcf(struct ieee80211_hw
*dev
)
751 struct p54_common
*priv
= dev
->priv
;
752 struct p54_control_hdr
*hdr
;
753 struct p54_tx_control_vdcf
*vdcf
;
755 hdr
= (void *)priv
->cached_vdcf
+ priv
->tx_hdr_len
;
757 p54_assign_address(dev
, NULL
, hdr
, sizeof(*hdr
) + sizeof(*vdcf
), NULL
);
759 vdcf
= (struct p54_tx_control_vdcf
*) hdr
->data
;
761 if (dev
->conf
.flags
& IEEE80211_CONF_SHORT_SLOT_TIME
) {
771 /* (see prism54/isl_oid.h for further details) */
772 vdcf
->frameburst
= cpu_to_le16(0);
774 priv
->tx(dev
, hdr
, sizeof(*hdr
) + sizeof(*vdcf
), 0);
777 static int p54_start(struct ieee80211_hw
*dev
)
779 struct p54_common
*priv
= dev
->priv
;
782 err
= priv
->open(dev
);
784 priv
->mode
= IEEE80211_IF_TYPE_MNTR
;
789 static void p54_stop(struct ieee80211_hw
*dev
)
791 struct p54_common
*priv
= dev
->priv
;
793 while ((skb
= skb_dequeue(&priv
->tx_queue
))) {
794 struct memrecord
*range
= (struct memrecord
*)&skb
->cb
;
796 kfree(range
->control
);
800 priv
->mode
= IEEE80211_IF_TYPE_INVALID
;
803 static int p54_add_interface(struct ieee80211_hw
*dev
,
804 struct ieee80211_if_init_conf
*conf
)
806 struct p54_common
*priv
= dev
->priv
;
808 if (priv
->mode
!= IEEE80211_IF_TYPE_MNTR
)
811 switch (conf
->type
) {
812 case IEEE80211_IF_TYPE_STA
:
813 priv
->mode
= conf
->type
;
819 memcpy(priv
->mac_addr
, conf
->mac_addr
, ETH_ALEN
);
821 p54_set_filter(dev
, 0, priv
->mac_addr
, NULL
, 0, 1, 0, 0xF642);
822 p54_set_filter(dev
, 0, priv
->mac_addr
, NULL
, 1, 0, 0, 0xF642);
824 switch (conf
->type
) {
825 case IEEE80211_IF_TYPE_STA
:
826 p54_set_filter(dev
, 1, priv
->mac_addr
, NULL
, 0, 0x15F, 0x1F4, 0);
829 BUG(); /* impossible */
833 p54_set_leds(dev
, 1, 0, 0);
838 static void p54_remove_interface(struct ieee80211_hw
*dev
,
839 struct ieee80211_if_init_conf
*conf
)
841 struct p54_common
*priv
= dev
->priv
;
842 priv
->mode
= IEEE80211_IF_TYPE_MNTR
;
843 memset(priv
->mac_addr
, 0, ETH_ALEN
);
844 p54_set_filter(dev
, 0, priv
->mac_addr
, NULL
, 2, 0, 0, 0);
847 static int p54_config(struct ieee80211_hw
*dev
, struct ieee80211_conf
*conf
)
851 ret
= p54_set_freq(dev
, cpu_to_le16(conf
->freq
));
856 static int p54_config_interface(struct ieee80211_hw
*dev
, int if_id
,
857 struct ieee80211_if_conf
*conf
)
859 struct p54_common
*priv
= dev
->priv
;
861 p54_set_filter(dev
, 0, priv
->mac_addr
, conf
->bssid
, 0, 1, 0, 0xF642);
862 p54_set_filter(dev
, 0, priv
->mac_addr
, conf
->bssid
, 2, 0, 0, 0);
863 p54_set_leds(dev
, 1, !is_multicast_ether_addr(conf
->bssid
), 0);
864 memcpy(priv
->bssid
, conf
->bssid
, ETH_ALEN
);
868 static void p54_configure_filter(struct ieee80211_hw
*dev
,
869 unsigned int changed_flags
,
870 unsigned int *total_flags
,
871 int mc_count
, struct dev_mc_list
*mclist
)
873 struct p54_common
*priv
= dev
->priv
;
875 *total_flags
&= FIF_BCN_PRBRESP_PROMISC
;
877 if (changed_flags
& FIF_BCN_PRBRESP_PROMISC
) {
878 if (*total_flags
& FIF_BCN_PRBRESP_PROMISC
)
879 p54_set_filter(dev
, 0, priv
->mac_addr
,
882 p54_set_filter(dev
, 0, priv
->mac_addr
,
883 priv
->bssid
, 2, 0, 0, 0);
887 static int p54_conf_tx(struct ieee80211_hw
*dev
, int queue
,
888 const struct ieee80211_tx_queue_params
*params
)
890 struct p54_common
*priv
= dev
->priv
;
891 struct p54_tx_control_vdcf
*vdcf
;
893 vdcf
= (struct p54_tx_control_vdcf
*)(((struct p54_control_hdr
*)
894 ((void *)priv
->cached_vdcf
+ priv
->tx_hdr_len
))->data
);
896 if ((params
) && !((queue
< 0) || (queue
> 4))) {
897 P54_SET_QUEUE(vdcf
->queue
[queue
], params
->aifs
,
898 params
->cw_min
, params
->cw_max
, params
->burst_time
);
907 static int p54_get_stats(struct ieee80211_hw
*dev
,
908 struct ieee80211_low_level_stats
*stats
)
914 static int p54_get_tx_stats(struct ieee80211_hw
*dev
,
915 struct ieee80211_tx_queue_stats
*stats
)
917 struct p54_common
*priv
= dev
->priv
;
920 for (i
= 0; i
< dev
->queues
; i
++)
921 memcpy(&stats
->data
[i
], &priv
->tx_stats
.data
[i
],
922 sizeof(stats
->data
[i
]));
927 static const struct ieee80211_ops p54_ops
= {
931 .add_interface
= p54_add_interface
,
932 .remove_interface
= p54_remove_interface
,
933 .config
= p54_config
,
934 .config_interface
= p54_config_interface
,
935 .configure_filter
= p54_configure_filter
,
936 .conf_tx
= p54_conf_tx
,
937 .get_stats
= p54_get_stats
,
938 .get_tx_stats
= p54_get_tx_stats
941 struct ieee80211_hw
*p54_init_common(size_t priv_data_len
)
943 struct ieee80211_hw
*dev
;
944 struct p54_common
*priv
;
947 dev
= ieee80211_alloc_hw(priv_data_len
, &p54_ops
);
952 priv
->mode
= IEEE80211_IF_TYPE_INVALID
;
953 skb_queue_head_init(&priv
->tx_queue
);
954 memcpy(priv
->channels
, p54_channels
, sizeof(p54_channels
));
955 memcpy(priv
->rates
, p54_rates
, sizeof(p54_rates
));
956 priv
->modes
[1].mode
= MODE_IEEE80211B
;
957 priv
->modes
[1].num_rates
= 4;
958 priv
->modes
[1].rates
= priv
->rates
;
959 priv
->modes
[1].num_channels
= ARRAY_SIZE(p54_channels
);
960 priv
->modes
[1].channels
= priv
->channels
;
961 priv
->modes
[0].mode
= MODE_IEEE80211G
;
962 priv
->modes
[0].num_rates
= ARRAY_SIZE(p54_rates
);
963 priv
->modes
[0].rates
= priv
->rates
;
964 priv
->modes
[0].num_channels
= ARRAY_SIZE(p54_channels
);
965 priv
->modes
[0].channels
= priv
->channels
;
966 dev
->flags
= IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING
| /* not sure */
967 IEEE80211_HW_RX_INCLUDES_FCS
;
968 dev
->channel_change_time
= 1000; /* TODO: find actual value */
971 priv
->tx_stats
.data
[0].limit
= 5;
974 dev
->extra_tx_headroom
= sizeof(struct p54_control_hdr
) + 4 +
975 sizeof(struct p54_tx_control_allocdata
);
977 priv
->cached_vdcf
= kzalloc(sizeof(struct p54_tx_control_vdcf
) +
978 priv
->tx_hdr_len
+ sizeof(struct p54_control_hdr
), GFP_KERNEL
);
980 if (!priv
->cached_vdcf
) {
981 ieee80211_free_hw(dev
);
987 for (i
= 0; i
< 2; i
++) {
988 if (ieee80211_register_hwmode(dev
, &priv
->modes
[i
])) {
989 kfree(priv
->cached_vdcf
);
990 ieee80211_free_hw(dev
);
997 EXPORT_SYMBOL_GPL(p54_init_common
);
999 void p54_free_common(struct ieee80211_hw
*dev
)
1001 struct p54_common
*priv
= dev
->priv
;
1002 kfree(priv
->iq_autocal
);
1003 kfree(priv
->output_limit
);
1004 kfree(priv
->curve_data
);
1005 kfree(priv
->cached_vdcf
);
1007 EXPORT_SYMBOL_GPL(p54_free_common
);
1009 static int __init
p54_init(void)
1014 static void __exit
p54_exit(void)
1018 module_init(p54_init
);
1019 module_exit(p54_exit
);