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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77#define DRIVER_NAME "orinoco"
78
79#include <linux/module.h>
80#include <linux/kernel.h>
81#include <linux/slab.h>
82#include <linux/init.h>
83#include <linux/delay.h>
84#include <linux/device.h>
85#include <linux/netdevice.h>
86#include <linux/etherdevice.h>
87#include <linux/suspend.h>
88#include <linux/if_arp.h>
89#include <linux/wireless.h>
90#include <linux/ieee80211.h>
91#include <net/iw_handler.h>
92#include <net/cfg80211.h>
93
94#include "hermes_rid.h"
95#include "hermes_dld.h"
96#include "hw.h"
97#include "scan.h"
98#include "mic.h"
99#include "fw.h"
100#include "wext.h"
101#include "cfg.h"
102#include "main.h"
103
104#include "orinoco.h"
105
106
107
108
109
110MODULE_AUTHOR("Pavel Roskin <proski@gnu.org> & "
111 "David Gibson <hermes@gibson.dropbear.id.au>");
112MODULE_DESCRIPTION("Driver for Lucent Orinoco, Prism II based "
113 "and similar wireless cards");
114MODULE_LICENSE("Dual MPL/GPL");
115
116
117#ifdef ORINOCO_DEBUG
118int orinoco_debug = ORINOCO_DEBUG;
119EXPORT_SYMBOL(orinoco_debug);
120module_param(orinoco_debug, int, 0644);
121MODULE_PARM_DESC(orinoco_debug, "Debug level");
122#endif
123
124static bool suppress_linkstatus;
125module_param(suppress_linkstatus, bool, 0644);
126MODULE_PARM_DESC(suppress_linkstatus, "Don't log link status changes");
127
128static int ignore_disconnect;
129module_param(ignore_disconnect, int, 0644);
130MODULE_PARM_DESC(ignore_disconnect,
131 "Don't report lost link to the network layer");
132
133int force_monitor;
134module_param(force_monitor, int, 0644);
135MODULE_PARM_DESC(force_monitor, "Allow monitor mode for all firmware versions");
136
137
138
139
140
141
142static const u8 encaps_hdr[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
143#define ENCAPS_OVERHEAD (sizeof(encaps_hdr) + 2)
144
145#define ORINOCO_MIN_MTU 256
146#define ORINOCO_MAX_MTU (IEEE80211_MAX_DATA_LEN - ENCAPS_OVERHEAD)
147
148#define MAX_IRQLOOPS_PER_IRQ 10
149#define MAX_IRQLOOPS_PER_JIFFY (20000 / HZ)
150
151
152
153
154#define DUMMY_FID 0xFFFF
155
156
157
158#define MAX_MULTICAST(priv) (HERMES_MAX_MULTICAST)
159
160#define ORINOCO_INTEN (HERMES_EV_RX | HERMES_EV_ALLOC \
161 | HERMES_EV_TX | HERMES_EV_TXEXC \
162 | HERMES_EV_WTERR | HERMES_EV_INFO \
163 | HERMES_EV_INFDROP)
164
165
166
167
168
169
170struct hermes_txexc_data {
171 struct hermes_tx_descriptor desc;
172 __le16 frame_ctl;
173 __le16 duration_id;
174 u8 addr1[ETH_ALEN];
175} __packed;
176
177
178struct hermes_rx_descriptor {
179
180 __le16 status;
181 __le32 time;
182 u8 silence;
183 u8 signal;
184 u8 rate;
185 u8 rxflow;
186 __le32 reserved;
187
188
189 __le16 frame_ctl;
190 __le16 duration_id;
191 u8 addr1[ETH_ALEN];
192 u8 addr2[ETH_ALEN];
193 u8 addr3[ETH_ALEN];
194 __le16 seq_ctl;
195 u8 addr4[ETH_ALEN];
196
197
198 __le16 data_len;
199} __packed;
200
201struct orinoco_rx_data {
202 struct hermes_rx_descriptor *desc;
203 struct sk_buff *skb;
204 struct list_head list;
205};
206
207struct orinoco_scan_data {
208 void *buf;
209 size_t len;
210 int type;
211 struct list_head list;
212};
213
214
215
216
217
218static int __orinoco_set_multicast_list(struct net_device *dev);
219static int __orinoco_up(struct orinoco_private *priv);
220static int __orinoco_down(struct orinoco_private *priv);
221static int __orinoco_commit(struct orinoco_private *priv);
222
223
224
225
226
227void set_port_type(struct orinoco_private *priv)
228{
229 switch (priv->iw_mode) {
230 case NL80211_IFTYPE_STATION:
231 priv->port_type = 1;
232 priv->createibss = 0;
233 break;
234 case NL80211_IFTYPE_ADHOC:
235 if (priv->prefer_port3) {
236 priv->port_type = 3;
237 priv->createibss = 0;
238 } else {
239 priv->port_type = priv->ibss_port;
240 priv->createibss = 1;
241 }
242 break;
243 case NL80211_IFTYPE_MONITOR:
244 priv->port_type = 3;
245 priv->createibss = 0;
246 break;
247 default:
248 printk(KERN_ERR "%s: Invalid priv->iw_mode in set_port_type()\n",
249 priv->ndev->name);
250 }
251}
252
253
254
255
256
257int orinoco_open(struct net_device *dev)
258{
259 struct orinoco_private *priv = ndev_priv(dev);
260 unsigned long flags;
261 int err;
262
263 if (orinoco_lock(priv, &flags) != 0)
264 return -EBUSY;
265
266 err = __orinoco_up(priv);
267
268 if (!err)
269 priv->open = 1;
270
271 orinoco_unlock(priv, &flags);
272
273 return err;
274}
275EXPORT_SYMBOL(orinoco_open);
276
277int orinoco_stop(struct net_device *dev)
278{
279 struct orinoco_private *priv = ndev_priv(dev);
280 int err = 0;
281
282
283
284
285 orinoco_lock_irq(priv);
286
287 priv->open = 0;
288
289 err = __orinoco_down(priv);
290
291 orinoco_unlock_irq(priv);
292
293 return err;
294}
295EXPORT_SYMBOL(orinoco_stop);
296
297struct net_device_stats *orinoco_get_stats(struct net_device *dev)
298{
299 struct orinoco_private *priv = ndev_priv(dev);
300
301 return &priv->stats;
302}
303EXPORT_SYMBOL(orinoco_get_stats);
304
305void orinoco_set_multicast_list(struct net_device *dev)
306{
307 struct orinoco_private *priv = ndev_priv(dev);
308 unsigned long flags;
309
310 if (orinoco_lock(priv, &flags) != 0) {
311 printk(KERN_DEBUG "%s: orinoco_set_multicast_list() "
312 "called when hw_unavailable\n", dev->name);
313 return;
314 }
315
316 __orinoco_set_multicast_list(dev);
317 orinoco_unlock(priv, &flags);
318}
319EXPORT_SYMBOL(orinoco_set_multicast_list);
320
321int orinoco_change_mtu(struct net_device *dev, int new_mtu)
322{
323 struct orinoco_private *priv = ndev_priv(dev);
324
325 if ((new_mtu < ORINOCO_MIN_MTU) || (new_mtu > ORINOCO_MAX_MTU))
326 return -EINVAL;
327
328
329 if ((new_mtu + ENCAPS_OVERHEAD + sizeof(struct ieee80211_hdr)) >
330 (priv->nicbuf_size - ETH_HLEN))
331 return -EINVAL;
332
333 dev->mtu = new_mtu;
334
335 return 0;
336}
337EXPORT_SYMBOL(orinoco_change_mtu);
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367int orinoco_process_xmit_skb(struct sk_buff *skb,
368 struct net_device *dev,
369 struct orinoco_private *priv,
370 int *tx_control,
371 u8 *mic_buf)
372{
373 struct orinoco_tkip_key *key;
374 struct ethhdr *eh;
375 int do_mic;
376
377 key = (struct orinoco_tkip_key *) priv->keys[priv->tx_key].key;
378
379 do_mic = ((priv->encode_alg == ORINOCO_ALG_TKIP) &&
380 (key != NULL));
381
382 if (do_mic)
383 *tx_control |= (priv->tx_key << HERMES_MIC_KEY_ID_SHIFT) |
384 HERMES_TXCTRL_MIC;
385
386 eh = (struct ethhdr *)skb->data;
387
388
389 if (ntohs(eh->h_proto) > ETH_DATA_LEN) {
390 struct header_struct {
391 struct ethhdr eth;
392 u8 encap[6];
393 } __packed hdr;
394 int len = skb->len + sizeof(encaps_hdr) - (2 * ETH_ALEN);
395
396 if (skb_headroom(skb) < ENCAPS_OVERHEAD) {
397 if (net_ratelimit())
398 printk(KERN_ERR
399 "%s: Not enough headroom for 802.2 headers %d\n",
400 dev->name, skb_headroom(skb));
401 return -ENOMEM;
402 }
403
404
405 memcpy(&hdr.eth, eh, 2 * ETH_ALEN);
406 hdr.eth.h_proto = htons(len);
407 memcpy(hdr.encap, encaps_hdr, sizeof(encaps_hdr));
408
409
410 eh = (struct ethhdr *) skb_push(skb, ENCAPS_OVERHEAD);
411 memcpy(eh, &hdr, sizeof(hdr));
412 }
413
414
415 if (do_mic) {
416 size_t len = skb->len - ETH_HLEN;
417 u8 *mic = &mic_buf[0];
418
419
420
421 if (skb->len % 2) {
422 *mic = skb->data[skb->len - 1];
423 mic++;
424 }
425
426 orinoco_mic(priv->tx_tfm_mic, key->tx_mic,
427 eh->h_dest, eh->h_source, 0 ,
428 skb->data + ETH_HLEN,
429 len, mic);
430 }
431
432 return 0;
433}
434EXPORT_SYMBOL(orinoco_process_xmit_skb);
435
436static netdev_tx_t orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
437{
438 struct orinoco_private *priv = ndev_priv(dev);
439 struct net_device_stats *stats = &priv->stats;
440 struct hermes *hw = &priv->hw;
441 int err = 0;
442 u16 txfid = priv->txfid;
443 int tx_control;
444 unsigned long flags;
445 u8 mic_buf[MICHAEL_MIC_LEN + 1];
446
447 if (!netif_running(dev)) {
448 printk(KERN_ERR "%s: Tx on stopped device!\n",
449 dev->name);
450 return NETDEV_TX_BUSY;
451 }
452
453 if (netif_queue_stopped(dev)) {
454 printk(KERN_DEBUG "%s: Tx while transmitter busy!\n",
455 dev->name);
456 return NETDEV_TX_BUSY;
457 }
458
459 if (orinoco_lock(priv, &flags) != 0) {
460 printk(KERN_ERR "%s: orinoco_xmit() called while hw_unavailable\n",
461 dev->name);
462 return NETDEV_TX_BUSY;
463 }
464
465 if (!netif_carrier_ok(dev) ||
466 (priv->iw_mode == NL80211_IFTYPE_MONITOR)) {
467
468
469
470 goto drop;
471 }
472
473
474 if (skb->len < ETH_HLEN)
475 goto drop;
476
477 tx_control = HERMES_TXCTRL_TX_OK | HERMES_TXCTRL_TX_EX;
478
479 err = orinoco_process_xmit_skb(skb, dev, priv, &tx_control,
480 &mic_buf[0]);
481 if (err)
482 goto drop;
483
484 if (priv->has_alt_txcntl) {
485
486
487
488
489 char desc[HERMES_802_3_OFFSET];
490 __le16 *txcntl = (__le16 *) &desc[HERMES_TXCNTL2_OFFSET];
491
492 memset(&desc, 0, sizeof(desc));
493
494 *txcntl = cpu_to_le16(tx_control);
495 err = hw->ops->bap_pwrite(hw, USER_BAP, &desc, sizeof(desc),
496 txfid, 0);
497 if (err) {
498 if (net_ratelimit())
499 printk(KERN_ERR "%s: Error %d writing Tx "
500 "descriptor to BAP\n", dev->name, err);
501 goto busy;
502 }
503 } else {
504 struct hermes_tx_descriptor desc;
505
506 memset(&desc, 0, sizeof(desc));
507
508 desc.tx_control = cpu_to_le16(tx_control);
509 err = hw->ops->bap_pwrite(hw, USER_BAP, &desc, sizeof(desc),
510 txfid, 0);
511 if (err) {
512 if (net_ratelimit())
513 printk(KERN_ERR "%s: Error %d writing Tx "
514 "descriptor to BAP\n", dev->name, err);
515 goto busy;
516 }
517
518
519
520
521 hermes_clear_words(hw, HERMES_DATA0,
522 HERMES_802_3_OFFSET - HERMES_802_11_OFFSET);
523 }
524
525 err = hw->ops->bap_pwrite(hw, USER_BAP, skb->data, skb->len,
526 txfid, HERMES_802_3_OFFSET);
527 if (err) {
528 printk(KERN_ERR "%s: Error %d writing packet to BAP\n",
529 dev->name, err);
530 goto busy;
531 }
532
533 if (tx_control & HERMES_TXCTRL_MIC) {
534 size_t offset = HERMES_802_3_OFFSET + skb->len;
535 size_t len = MICHAEL_MIC_LEN;
536
537 if (offset % 2) {
538 offset--;
539 len++;
540 }
541 err = hw->ops->bap_pwrite(hw, USER_BAP, &mic_buf[0], len,
542 txfid, offset);
543 if (err) {
544 printk(KERN_ERR "%s: Error %d writing MIC to BAP\n",
545 dev->name, err);
546 goto busy;
547 }
548 }
549
550
551 netif_stop_queue(dev);
552
553 err = hw->ops->cmd_wait(hw, HERMES_CMD_TX | HERMES_CMD_RECL,
554 txfid, NULL);
555 if (err) {
556 netif_start_queue(dev);
557 if (net_ratelimit())
558 printk(KERN_ERR "%s: Error %d transmitting packet\n",
559 dev->name, err);
560 goto busy;
561 }
562
563 stats->tx_bytes += HERMES_802_3_OFFSET + skb->len;
564 goto ok;
565
566 drop:
567 stats->tx_errors++;
568 stats->tx_dropped++;
569
570 ok:
571 orinoco_unlock(priv, &flags);
572 dev_kfree_skb(skb);
573 return NETDEV_TX_OK;
574
575 busy:
576 if (err == -EIO)
577 schedule_work(&priv->reset_work);
578 orinoco_unlock(priv, &flags);
579 return NETDEV_TX_BUSY;
580}
581
582static void __orinoco_ev_alloc(struct net_device *dev, struct hermes *hw)
583{
584 struct orinoco_private *priv = ndev_priv(dev);
585 u16 fid = hermes_read_regn(hw, ALLOCFID);
586
587 if (fid != priv->txfid) {
588 if (fid != DUMMY_FID)
589 printk(KERN_WARNING "%s: Allocate event on unexpected fid (%04X)\n",
590 dev->name, fid);
591 return;
592 }
593
594 hermes_write_regn(hw, ALLOCFID, DUMMY_FID);
595}
596
597static void __orinoco_ev_tx(struct net_device *dev, struct hermes *hw)
598{
599 struct orinoco_private *priv = ndev_priv(dev);
600 struct net_device_stats *stats = &priv->stats;
601
602 stats->tx_packets++;
603
604 netif_wake_queue(dev);
605
606 hermes_write_regn(hw, TXCOMPLFID, DUMMY_FID);
607}
608
609static void __orinoco_ev_txexc(struct net_device *dev, struct hermes *hw)
610{
611 struct orinoco_private *priv = ndev_priv(dev);
612 struct net_device_stats *stats = &priv->stats;
613 u16 fid = hermes_read_regn(hw, TXCOMPLFID);
614 u16 status;
615 struct hermes_txexc_data hdr;
616 int err = 0;
617
618 if (fid == DUMMY_FID)
619 return;
620
621
622 err = hw->ops->bap_pread(hw, IRQ_BAP, &hdr,
623 sizeof(struct hermes_txexc_data),
624 fid, 0);
625
626 hermes_write_regn(hw, TXCOMPLFID, DUMMY_FID);
627 stats->tx_errors++;
628
629 if (err) {
630 printk(KERN_WARNING "%s: Unable to read descriptor on Tx error "
631 "(FID=%04X error %d)\n",
632 dev->name, fid, err);
633 return;
634 }
635
636 DEBUG(1, "%s: Tx error, err %d (FID=%04X)\n", dev->name,
637 err, fid);
638
639
640
641
642
643 status = le16_to_cpu(hdr.desc.status);
644 if (status & (HERMES_TXSTAT_RETRYERR | HERMES_TXSTAT_AGEDERR)) {
645 union iwreq_data wrqu;
646
647
648
649
650
651
652
653
654
655 memcpy(wrqu.addr.sa_data, hdr.addr1, ETH_ALEN);
656 wrqu.addr.sa_family = ARPHRD_ETHER;
657
658
659 wireless_send_event(dev, IWEVTXDROP, &wrqu, NULL);
660 }
661
662 netif_wake_queue(dev);
663}
664
665void orinoco_tx_timeout(struct net_device *dev)
666{
667 struct orinoco_private *priv = ndev_priv(dev);
668 struct net_device_stats *stats = &priv->stats;
669 struct hermes *hw = &priv->hw;
670
671 printk(KERN_WARNING "%s: Tx timeout! "
672 "ALLOCFID=%04x, TXCOMPLFID=%04x, EVSTAT=%04x\n",
673 dev->name, hermes_read_regn(hw, ALLOCFID),
674 hermes_read_regn(hw, TXCOMPLFID), hermes_read_regn(hw, EVSTAT));
675
676 stats->tx_errors++;
677
678 schedule_work(&priv->reset_work);
679}
680EXPORT_SYMBOL(orinoco_tx_timeout);
681
682
683
684
685
686
687
688static inline int is_ethersnap(void *_hdr)
689{
690 u8 *hdr = _hdr;
691
692
693
694
695
696
697 return (memcmp(hdr, &encaps_hdr, 5) == 0)
698 && ((hdr[5] == 0x00) || (hdr[5] == 0xf8));
699}
700
701static inline void orinoco_spy_gather(struct net_device *dev, u_char *mac,
702 int level, int noise)
703{
704 struct iw_quality wstats;
705 wstats.level = level - 0x95;
706 wstats.noise = noise - 0x95;
707 wstats.qual = (level > noise) ? (level - noise) : 0;
708 wstats.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
709
710 wireless_spy_update(dev, mac, &wstats);
711}
712
713static void orinoco_stat_gather(struct net_device *dev,
714 struct sk_buff *skb,
715 struct hermes_rx_descriptor *desc)
716{
717 struct orinoco_private *priv = ndev_priv(dev);
718
719
720
721
722
723
724
725
726
727
728
729 if (SPY_NUMBER(priv)) {
730 orinoco_spy_gather(dev, skb_mac_header(skb) + ETH_ALEN,
731 desc->signal, desc->silence);
732 }
733}
734
735
736
737
738
739
740
741
742
743
744
745static void orinoco_rx_monitor(struct net_device *dev, u16 rxfid,
746 struct hermes_rx_descriptor *desc)
747{
748 u32 hdrlen = 30;
749 u32 datalen = 0;
750 u16 fc;
751 int err;
752 int len;
753 struct sk_buff *skb;
754 struct orinoco_private *priv = ndev_priv(dev);
755 struct net_device_stats *stats = &priv->stats;
756 struct hermes *hw = &priv->hw;
757
758 len = le16_to_cpu(desc->data_len);
759
760
761 fc = le16_to_cpu(desc->frame_ctl);
762 switch (fc & IEEE80211_FCTL_FTYPE) {
763 case IEEE80211_FTYPE_DATA:
764 if ((fc & IEEE80211_FCTL_TODS)
765 && (fc & IEEE80211_FCTL_FROMDS))
766 hdrlen = 30;
767 else
768 hdrlen = 24;
769 datalen = len;
770 break;
771 case IEEE80211_FTYPE_MGMT:
772 hdrlen = 24;
773 datalen = len;
774 break;
775 case IEEE80211_FTYPE_CTL:
776 switch (fc & IEEE80211_FCTL_STYPE) {
777 case IEEE80211_STYPE_PSPOLL:
778 case IEEE80211_STYPE_RTS:
779 case IEEE80211_STYPE_CFEND:
780 case IEEE80211_STYPE_CFENDACK:
781 hdrlen = 16;
782 break;
783 case IEEE80211_STYPE_CTS:
784 case IEEE80211_STYPE_ACK:
785 hdrlen = 10;
786 break;
787 }
788 break;
789 default:
790
791 break;
792 }
793
794
795 if (datalen > IEEE80211_MAX_DATA_LEN + 12) {
796 printk(KERN_DEBUG "%s: oversized monitor frame, "
797 "data length = %d\n", dev->name, datalen);
798 stats->rx_length_errors++;
799 goto update_stats;
800 }
801
802 skb = dev_alloc_skb(hdrlen + datalen);
803 if (!skb) {
804 printk(KERN_WARNING "%s: Cannot allocate skb for monitor frame\n",
805 dev->name);
806 goto update_stats;
807 }
808
809
810 memcpy(skb_put(skb, hdrlen), &(desc->frame_ctl), hdrlen);
811 skb_reset_mac_header(skb);
812
813
814 if (datalen > 0) {
815 err = hw->ops->bap_pread(hw, IRQ_BAP, skb_put(skb, datalen),
816 ALIGN(datalen, 2), rxfid,
817 HERMES_802_2_OFFSET);
818 if (err) {
819 printk(KERN_ERR "%s: error %d reading monitor frame\n",
820 dev->name, err);
821 goto drop;
822 }
823 }
824
825 skb->dev = dev;
826 skb->ip_summed = CHECKSUM_NONE;
827 skb->pkt_type = PACKET_OTHERHOST;
828 skb->protocol = cpu_to_be16(ETH_P_802_2);
829
830 stats->rx_packets++;
831 stats->rx_bytes += skb->len;
832
833 netif_rx(skb);
834 return;
835
836 drop:
837 dev_kfree_skb_irq(skb);
838 update_stats:
839 stats->rx_errors++;
840 stats->rx_dropped++;
841}
842
843void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw)
844{
845 struct orinoco_private *priv = ndev_priv(dev);
846 struct net_device_stats *stats = &priv->stats;
847 struct iw_statistics *wstats = &priv->wstats;
848 struct sk_buff *skb = NULL;
849 u16 rxfid, status;
850 int length;
851 struct hermes_rx_descriptor *desc;
852 struct orinoco_rx_data *rx_data;
853 int err;
854
855 desc = kmalloc(sizeof(*desc), GFP_ATOMIC);
856 if (!desc) {
857 printk(KERN_WARNING
858 "%s: Can't allocate space for RX descriptor\n",
859 dev->name);
860 goto update_stats;
861 }
862
863 rxfid = hermes_read_regn(hw, RXFID);
864
865 err = hw->ops->bap_pread(hw, IRQ_BAP, desc, sizeof(*desc),
866 rxfid, 0);
867 if (err) {
868 printk(KERN_ERR "%s: error %d reading Rx descriptor. "
869 "Frame dropped.\n", dev->name, err);
870 goto update_stats;
871 }
872
873 status = le16_to_cpu(desc->status);
874
875 if (status & HERMES_RXSTAT_BADCRC) {
876 DEBUG(1, "%s: Bad CRC on Rx. Frame dropped.\n",
877 dev->name);
878 stats->rx_crc_errors++;
879 goto update_stats;
880 }
881
882
883 if (priv->iw_mode == NL80211_IFTYPE_MONITOR) {
884 orinoco_rx_monitor(dev, rxfid, desc);
885 goto out;
886 }
887
888 if (status & HERMES_RXSTAT_UNDECRYPTABLE) {
889 DEBUG(1, "%s: Undecryptable frame on Rx. Frame dropped.\n",
890 dev->name);
891 wstats->discard.code++;
892 goto update_stats;
893 }
894
895 length = le16_to_cpu(desc->data_len);
896
897
898 if (length < 3) {
899
900
901
902 goto out;
903 }
904 if (length > IEEE80211_MAX_DATA_LEN) {
905 printk(KERN_WARNING "%s: Oversized frame received (%d bytes)\n",
906 dev->name, length);
907 stats->rx_length_errors++;
908 goto update_stats;
909 }
910
911
912
913 if (status & HERMES_RXSTAT_MIC)
914 length += MICHAEL_MIC_LEN;
915
916
917
918
919
920
921 skb = dev_alloc_skb(length + ETH_HLEN + 2 + 1);
922 if (!skb) {
923 printk(KERN_WARNING "%s: Can't allocate skb for Rx\n",
924 dev->name);
925 goto update_stats;
926 }
927
928
929
930
931 skb_reserve(skb, ETH_HLEN + 2);
932
933 err = hw->ops->bap_pread(hw, IRQ_BAP, skb_put(skb, length),
934 ALIGN(length, 2), rxfid,
935 HERMES_802_2_OFFSET);
936 if (err) {
937 printk(KERN_ERR "%s: error %d reading frame. "
938 "Frame dropped.\n", dev->name, err);
939 goto drop;
940 }
941
942
943 rx_data = kzalloc(sizeof(*rx_data), GFP_ATOMIC);
944 if (!rx_data)
945 goto drop;
946
947 rx_data->desc = desc;
948 rx_data->skb = skb;
949 list_add_tail(&rx_data->list, &priv->rx_list);
950 tasklet_schedule(&priv->rx_tasklet);
951
952 return;
953
954drop:
955 dev_kfree_skb_irq(skb);
956update_stats:
957 stats->rx_errors++;
958 stats->rx_dropped++;
959out:
960 kfree(desc);
961}
962EXPORT_SYMBOL(__orinoco_ev_rx);
963
964static void orinoco_rx(struct net_device *dev,
965 struct hermes_rx_descriptor *desc,
966 struct sk_buff *skb)
967{
968 struct orinoco_private *priv = ndev_priv(dev);
969 struct net_device_stats *stats = &priv->stats;
970 u16 status, fc;
971 int length;
972 struct ethhdr *hdr;
973
974 status = le16_to_cpu(desc->status);
975 length = le16_to_cpu(desc->data_len);
976 fc = le16_to_cpu(desc->frame_ctl);
977
978
979 if (status & HERMES_RXSTAT_MIC) {
980 struct orinoco_tkip_key *key;
981 int key_id = ((status & HERMES_RXSTAT_MIC_KEY_ID) >>
982 HERMES_MIC_KEY_ID_SHIFT);
983 u8 mic[MICHAEL_MIC_LEN];
984 u8 *rxmic;
985 u8 *src = (fc & IEEE80211_FCTL_FROMDS) ?
986 desc->addr3 : desc->addr2;
987
988
989 rxmic = skb->data + skb->len - MICHAEL_MIC_LEN;
990
991 skb_trim(skb, skb->len - MICHAEL_MIC_LEN);
992 length -= MICHAEL_MIC_LEN;
993
994 key = (struct orinoco_tkip_key *) priv->keys[key_id].key;
995
996 if (!key) {
997 printk(KERN_WARNING "%s: Received encrypted frame from "
998 "%pM using key %i, but key is not installed\n",
999 dev->name, src, key_id);
1000 goto drop;
1001 }
1002
1003 orinoco_mic(priv->rx_tfm_mic, key->rx_mic, desc->addr1, src,
1004 0,
1005 skb->data, skb->len, &mic[0]);
1006
1007 if (memcmp(mic, rxmic,
1008 MICHAEL_MIC_LEN)) {
1009 union iwreq_data wrqu;
1010 struct iw_michaelmicfailure wxmic;
1011
1012 printk(KERN_WARNING "%s: "
1013 "Invalid Michael MIC in data frame from %pM, "
1014 "using key %i\n",
1015 dev->name, src, key_id);
1016
1017
1018
1019
1020 memset(&wxmic, 0, sizeof(wxmic));
1021 wxmic.flags = key_id & IW_MICFAILURE_KEY_ID;
1022 wxmic.flags |= (desc->addr1[0] & 1) ?
1023 IW_MICFAILURE_GROUP : IW_MICFAILURE_PAIRWISE;
1024 wxmic.src_addr.sa_family = ARPHRD_ETHER;
1025 memcpy(wxmic.src_addr.sa_data, src, ETH_ALEN);
1026
1027 (void) orinoco_hw_get_tkip_iv(priv, key_id,
1028 &wxmic.tsc[0]);
1029
1030 memset(&wrqu, 0, sizeof(wrqu));
1031 wrqu.data.length = sizeof(wxmic);
1032 wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu,
1033 (char *) &wxmic);
1034
1035 goto drop;
1036 }
1037 }
1038
1039
1040
1041
1042
1043
1044 if (length >= ENCAPS_OVERHEAD &&
1045 (((status & HERMES_RXSTAT_MSGTYPE) == HERMES_RXSTAT_1042) ||
1046 ((status & HERMES_RXSTAT_MSGTYPE) == HERMES_RXSTAT_TUNNEL) ||
1047 is_ethersnap(skb->data))) {
1048
1049
1050
1051 hdr = (struct ethhdr *)skb_push(skb,
1052 ETH_HLEN - ENCAPS_OVERHEAD);
1053 } else {
1054
1055 hdr = (struct ethhdr *)skb_push(skb, ETH_HLEN);
1056 hdr->h_proto = htons(length);
1057 }
1058 memcpy(hdr->h_dest, desc->addr1, ETH_ALEN);
1059 if (fc & IEEE80211_FCTL_FROMDS)
1060 memcpy(hdr->h_source, desc->addr3, ETH_ALEN);
1061 else
1062 memcpy(hdr->h_source, desc->addr2, ETH_ALEN);
1063
1064 skb->protocol = eth_type_trans(skb, dev);
1065 skb->ip_summed = CHECKSUM_NONE;
1066 if (fc & IEEE80211_FCTL_TODS)
1067 skb->pkt_type = PACKET_OTHERHOST;
1068
1069
1070 orinoco_stat_gather(dev, skb, desc);
1071
1072
1073 netif_rx(skb);
1074 stats->rx_packets++;
1075 stats->rx_bytes += length;
1076
1077 return;
1078
1079 drop:
1080 dev_kfree_skb(skb);
1081 stats->rx_errors++;
1082 stats->rx_dropped++;
1083}
1084
1085static void orinoco_rx_isr_tasklet(unsigned long data)
1086{
1087 struct orinoco_private *priv = (struct orinoco_private *) data;
1088 struct net_device *dev = priv->ndev;
1089 struct orinoco_rx_data *rx_data, *temp;
1090 struct hermes_rx_descriptor *desc;
1091 struct sk_buff *skb;
1092 unsigned long flags;
1093
1094
1095
1096
1097
1098
1099
1100 if (orinoco_lock(priv, &flags) != 0)
1101 return;
1102
1103
1104 list_for_each_entry_safe(rx_data, temp, &priv->rx_list, list) {
1105 desc = rx_data->desc;
1106 skb = rx_data->skb;
1107 list_del(&rx_data->list);
1108 kfree(rx_data);
1109
1110 orinoco_rx(dev, desc, skb);
1111
1112 kfree(desc);
1113 }
1114
1115 orinoco_unlock(priv, &flags);
1116}
1117
1118
1119
1120
1121
1122static void print_linkstatus(struct net_device *dev, u16 status)
1123{
1124 char *s;
1125
1126 if (suppress_linkstatus)
1127 return;
1128
1129 switch (status) {
1130 case HERMES_LINKSTATUS_NOT_CONNECTED:
1131 s = "Not Connected";
1132 break;
1133 case HERMES_LINKSTATUS_CONNECTED:
1134 s = "Connected";
1135 break;
1136 case HERMES_LINKSTATUS_DISCONNECTED:
1137 s = "Disconnected";
1138 break;
1139 case HERMES_LINKSTATUS_AP_CHANGE:
1140 s = "AP Changed";
1141 break;
1142 case HERMES_LINKSTATUS_AP_OUT_OF_RANGE:
1143 s = "AP Out of Range";
1144 break;
1145 case HERMES_LINKSTATUS_AP_IN_RANGE:
1146 s = "AP In Range";
1147 break;
1148 case HERMES_LINKSTATUS_ASSOC_FAILED:
1149 s = "Association Failed";
1150 break;
1151 default:
1152 s = "UNKNOWN";
1153 }
1154
1155 printk(KERN_DEBUG "%s: New link status: %s (%04x)\n",
1156 dev->name, s, status);
1157}
1158
1159
1160static void orinoco_join_ap(struct work_struct *work)
1161{
1162 struct orinoco_private *priv =
1163 container_of(work, struct orinoco_private, join_work);
1164 struct net_device *dev = priv->ndev;
1165 struct hermes *hw = &priv->hw;
1166 int err;
1167 unsigned long flags;
1168 struct join_req {
1169 u8 bssid[ETH_ALEN];
1170 __le16 channel;
1171 } __packed req;
1172 const int atom_len = offsetof(struct prism2_scan_apinfo, atim);
1173 struct prism2_scan_apinfo *atom = NULL;
1174 int offset = 4;
1175 int found = 0;
1176 u8 *buf;
1177 u16 len;
1178
1179
1180 buf = kmalloc(MAX_SCAN_LEN, GFP_KERNEL);
1181 if (!buf)
1182 return;
1183
1184 if (orinoco_lock(priv, &flags) != 0)
1185 goto fail_lock;
1186
1187
1188 if (!priv->bssid_fixed)
1189 goto out;
1190
1191 if (strlen(priv->desired_essid) == 0)
1192 goto out;
1193
1194
1195 err = hw->ops->read_ltv(hw, USER_BAP,
1196 HERMES_RID_SCANRESULTSTABLE,
1197 MAX_SCAN_LEN, &len, buf);
1198 if (err) {
1199 printk(KERN_ERR "%s: Cannot read scan results\n",
1200 dev->name);
1201 goto out;
1202 }
1203
1204 len = HERMES_RECLEN_TO_BYTES(len);
1205
1206
1207
1208 for (; offset + atom_len <= len; offset += atom_len) {
1209 atom = (struct prism2_scan_apinfo *) (buf + offset);
1210 if (memcmp(&atom->bssid, priv->desired_bssid, ETH_ALEN) == 0) {
1211 found = 1;
1212 break;
1213 }
1214 }
1215
1216 if (!found) {
1217 DEBUG(1, "%s: Requested AP not found in scan results\n",
1218 dev->name);
1219 goto out;
1220 }
1221
1222 memcpy(req.bssid, priv->desired_bssid, ETH_ALEN);
1223 req.channel = atom->channel;
1224 err = HERMES_WRITE_RECORD(hw, USER_BAP, HERMES_RID_CNFJOINREQUEST,
1225 &req);
1226 if (err)
1227 printk(KERN_ERR "%s: Error issuing join request\n", dev->name);
1228
1229 out:
1230 orinoco_unlock(priv, &flags);
1231
1232 fail_lock:
1233 kfree(buf);
1234}
1235
1236
1237static void orinoco_send_bssid_wevent(struct orinoco_private *priv)
1238{
1239 struct net_device *dev = priv->ndev;
1240 struct hermes *hw = &priv->hw;
1241 union iwreq_data wrqu;
1242 int err;
1243
1244 err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENTBSSID,
1245 ETH_ALEN, NULL, wrqu.ap_addr.sa_data);
1246 if (err != 0)
1247 return;
1248
1249 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1250
1251
1252 wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
1253}
1254
1255static void orinoco_send_assocreqie_wevent(struct orinoco_private *priv)
1256{
1257 struct net_device *dev = priv->ndev;
1258 struct hermes *hw = &priv->hw;
1259 union iwreq_data wrqu;
1260 int err;
1261 u8 buf[88];
1262 u8 *ie;
1263
1264 if (!priv->has_wpa)
1265 return;
1266
1267 err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_ASSOC_REQ_INFO,
1268 sizeof(buf), NULL, &buf);
1269 if (err != 0)
1270 return;
1271
1272 ie = orinoco_get_wpa_ie(buf, sizeof(buf));
1273 if (ie) {
1274 int rem = sizeof(buf) - (ie - &buf[0]);
1275 wrqu.data.length = ie[1] + 2;
1276 if (wrqu.data.length > rem)
1277 wrqu.data.length = rem;
1278
1279 if (wrqu.data.length)
1280
1281 wireless_send_event(dev, IWEVASSOCREQIE, &wrqu, ie);
1282 }
1283}
1284
1285static void orinoco_send_assocrespie_wevent(struct orinoco_private *priv)
1286{
1287 struct net_device *dev = priv->ndev;
1288 struct hermes *hw = &priv->hw;
1289 union iwreq_data wrqu;
1290 int err;
1291 u8 buf[88];
1292 u8 *ie;
1293
1294 if (!priv->has_wpa)
1295 return;
1296
1297 err = hw->ops->read_ltv(hw, USER_BAP,
1298 HERMES_RID_CURRENT_ASSOC_RESP_INFO,
1299 sizeof(buf), NULL, &buf);
1300 if (err != 0)
1301 return;
1302
1303 ie = orinoco_get_wpa_ie(buf, sizeof(buf));
1304 if (ie) {
1305 int rem = sizeof(buf) - (ie - &buf[0]);
1306 wrqu.data.length = ie[1] + 2;
1307 if (wrqu.data.length > rem)
1308 wrqu.data.length = rem;
1309
1310 if (wrqu.data.length)
1311
1312 wireless_send_event(dev, IWEVASSOCRESPIE, &wrqu, ie);
1313 }
1314}
1315
1316static void orinoco_send_wevents(struct work_struct *work)
1317{
1318 struct orinoco_private *priv =
1319 container_of(work, struct orinoco_private, wevent_work);
1320 unsigned long flags;
1321
1322 if (orinoco_lock(priv, &flags) != 0)
1323 return;
1324
1325 orinoco_send_assocreqie_wevent(priv);
1326 orinoco_send_assocrespie_wevent(priv);
1327 orinoco_send_bssid_wevent(priv);
1328
1329 orinoco_unlock(priv, &flags);
1330}
1331
1332static void qbuf_scan(struct orinoco_private *priv, void *buf,
1333 int len, int type)
1334{
1335 struct orinoco_scan_data *sd;
1336 unsigned long flags;
1337
1338 sd = kmalloc(sizeof(*sd), GFP_ATOMIC);
1339 if (!sd) {
1340 printk(KERN_ERR "%s: failed to alloc memory\n", __func__);
1341 return;
1342 }
1343 sd->buf = buf;
1344 sd->len = len;
1345 sd->type = type;
1346
1347 spin_lock_irqsave(&priv->scan_lock, flags);
1348 list_add_tail(&sd->list, &priv->scan_list);
1349 spin_unlock_irqrestore(&priv->scan_lock, flags);
1350
1351 schedule_work(&priv->process_scan);
1352}
1353
1354static void qabort_scan(struct orinoco_private *priv)
1355{
1356 struct orinoco_scan_data *sd;
1357 unsigned long flags;
1358
1359 sd = kmalloc(sizeof(*sd), GFP_ATOMIC);
1360 if (!sd) {
1361 printk(KERN_ERR "%s: failed to alloc memory\n", __func__);
1362 return;
1363 }
1364 sd->len = -1;
1365
1366 spin_lock_irqsave(&priv->scan_lock, flags);
1367 list_add_tail(&sd->list, &priv->scan_list);
1368 spin_unlock_irqrestore(&priv->scan_lock, flags);
1369
1370 schedule_work(&priv->process_scan);
1371}
1372
1373static void orinoco_process_scan_results(struct work_struct *work)
1374{
1375 struct orinoco_private *priv =
1376 container_of(work, struct orinoco_private, process_scan);
1377 struct orinoco_scan_data *sd, *temp;
1378 unsigned long flags;
1379 void *buf;
1380 int len;
1381 int type;
1382
1383 spin_lock_irqsave(&priv->scan_lock, flags);
1384 list_for_each_entry_safe(sd, temp, &priv->scan_list, list) {
1385
1386 buf = sd->buf;
1387 len = sd->len;
1388 type = sd->type;
1389
1390 list_del(&sd->list);
1391 spin_unlock_irqrestore(&priv->scan_lock, flags);
1392 kfree(sd);
1393
1394 if (len > 0) {
1395 if (type == HERMES_INQ_CHANNELINFO)
1396 orinoco_add_extscan_result(priv, buf, len);
1397 else
1398 orinoco_add_hostscan_results(priv, buf, len);
1399
1400 kfree(buf);
1401 } else {
1402
1403 orinoco_scan_done(priv, (len < 0));
1404 }
1405
1406 spin_lock_irqsave(&priv->scan_lock, flags);
1407 }
1408 spin_unlock_irqrestore(&priv->scan_lock, flags);
1409}
1410
1411void __orinoco_ev_info(struct net_device *dev, struct hermes *hw)
1412{
1413 struct orinoco_private *priv = ndev_priv(dev);
1414 u16 infofid;
1415 struct {
1416 __le16 len;
1417 __le16 type;
1418 } __packed info;
1419 int len, type;
1420 int err;
1421
1422
1423
1424
1425
1426 infofid = hermes_read_regn(hw, INFOFID);
1427
1428
1429 err = hw->ops->bap_pread(hw, IRQ_BAP, &info, sizeof(info),
1430 infofid, 0);
1431 if (err) {
1432 printk(KERN_ERR "%s: error %d reading info frame. "
1433 "Frame dropped.\n", dev->name, err);
1434 return;
1435 }
1436
1437 len = HERMES_RECLEN_TO_BYTES(le16_to_cpu(info.len));
1438 type = le16_to_cpu(info.type);
1439
1440 switch (type) {
1441 case HERMES_INQ_TALLIES: {
1442 struct hermes_tallies_frame tallies;
1443 struct iw_statistics *wstats = &priv->wstats;
1444
1445 if (len > sizeof(tallies)) {
1446 printk(KERN_WARNING "%s: Tallies frame too long (%d bytes)\n",
1447 dev->name, len);
1448 len = sizeof(tallies);
1449 }
1450
1451 err = hw->ops->bap_pread(hw, IRQ_BAP, &tallies, len,
1452 infofid, sizeof(info));
1453 if (err)
1454 break;
1455
1456
1457
1458 wstats->discard.code +=
1459 le16_to_cpu(tallies.RxWEPUndecryptable);
1460 if (len == sizeof(tallies))
1461 wstats->discard.code +=
1462 le16_to_cpu(tallies.RxDiscards_WEPICVError) +
1463 le16_to_cpu(tallies.RxDiscards_WEPExcluded);
1464 wstats->discard.misc +=
1465 le16_to_cpu(tallies.TxDiscardsWrongSA);
1466 wstats->discard.fragment +=
1467 le16_to_cpu(tallies.RxMsgInBadMsgFragments);
1468 wstats->discard.retries +=
1469 le16_to_cpu(tallies.TxRetryLimitExceeded);
1470
1471 }
1472 break;
1473 case HERMES_INQ_LINKSTATUS: {
1474 struct hermes_linkstatus linkstatus;
1475 u16 newstatus;
1476 int connected;
1477
1478 if (priv->iw_mode == NL80211_IFTYPE_MONITOR)
1479 break;
1480
1481 if (len != sizeof(linkstatus)) {
1482 printk(KERN_WARNING "%s: Unexpected size for linkstatus frame (%d bytes)\n",
1483 dev->name, len);
1484 break;
1485 }
1486
1487 err = hw->ops->bap_pread(hw, IRQ_BAP, &linkstatus, len,
1488 infofid, sizeof(info));
1489 if (err)
1490 break;
1491 newstatus = le16_to_cpu(linkstatus.linkstatus);
1492
1493
1494
1495 if (newstatus == HERMES_LINKSTATUS_AP_OUT_OF_RANGE &&
1496 priv->firmware_type == FIRMWARE_TYPE_SYMBOL &&
1497 priv->has_hostscan && priv->scan_request) {
1498 hermes_inquire(hw, HERMES_INQ_HOSTSCAN_SYMBOL);
1499 break;
1500 }
1501
1502 connected = (newstatus == HERMES_LINKSTATUS_CONNECTED)
1503 || (newstatus == HERMES_LINKSTATUS_AP_CHANGE)
1504 || (newstatus == HERMES_LINKSTATUS_AP_IN_RANGE);
1505
1506 if (connected)
1507 netif_carrier_on(dev);
1508 else if (!ignore_disconnect)
1509 netif_carrier_off(dev);
1510
1511 if (newstatus != priv->last_linkstatus) {
1512 priv->last_linkstatus = newstatus;
1513 print_linkstatus(dev, newstatus);
1514
1515
1516
1517
1518 schedule_work(&priv->wevent_work);
1519 }
1520 }
1521 break;
1522 case HERMES_INQ_SCAN:
1523 if (!priv->scan_request && priv->bssid_fixed &&
1524 priv->firmware_type == FIRMWARE_TYPE_INTERSIL) {
1525 schedule_work(&priv->join_work);
1526 break;
1527 }
1528
1529 case HERMES_INQ_HOSTSCAN:
1530 case HERMES_INQ_HOSTSCAN_SYMBOL: {
1531
1532
1533 unsigned char *buf;
1534
1535
1536 if (len > 4096) {
1537 printk(KERN_WARNING "%s: Scan results too large (%d bytes)\n",
1538 dev->name, len);
1539 qabort_scan(priv);
1540 break;
1541 }
1542
1543
1544 buf = kmalloc(len, GFP_ATOMIC);
1545 if (buf == NULL) {
1546
1547 qabort_scan(priv);
1548 break;
1549 }
1550
1551
1552 err = hw->ops->bap_pread(hw, IRQ_BAP, (void *) buf, len,
1553 infofid, sizeof(info));
1554 if (err) {
1555 kfree(buf);
1556 qabort_scan(priv);
1557 break;
1558 }
1559
1560#ifdef ORINOCO_DEBUG
1561 {
1562 int i;
1563 printk(KERN_DEBUG "Scan result [%02X", buf[0]);
1564 for (i = 1; i < (len * 2); i++)
1565 printk(":%02X", buf[i]);
1566 printk("]\n");
1567 }
1568#endif
1569
1570 qbuf_scan(priv, buf, len, type);
1571 }
1572 break;
1573 case HERMES_INQ_CHANNELINFO:
1574 {
1575 struct agere_ext_scan_info *bss;
1576
1577 if (!priv->scan_request) {
1578 printk(KERN_DEBUG "%s: Got chaninfo without scan, "
1579 "len=%d\n", dev->name, len);
1580 break;
1581 }
1582
1583
1584 if (len == 0) {
1585 qbuf_scan(priv, NULL, len, type);
1586 break;
1587 }
1588
1589
1590 else if (len < (offsetof(struct agere_ext_scan_info,
1591 data) + 2)) {
1592
1593
1594 printk(KERN_WARNING
1595 "%s: Ext scan results too short (%d bytes)\n",
1596 dev->name, len);
1597 break;
1598 }
1599
1600 bss = kmalloc(len, GFP_ATOMIC);
1601 if (bss == NULL)
1602 break;
1603
1604
1605 err = hw->ops->bap_pread(hw, IRQ_BAP, (void *) bss, len,
1606 infofid, sizeof(info));
1607 if (err)
1608 kfree(bss);
1609 else
1610 qbuf_scan(priv, bss, len, type);
1611
1612 break;
1613 }
1614 case HERMES_INQ_SEC_STAT_AGERE:
1615
1616
1617 if (priv->firmware_type == FIRMWARE_TYPE_AGERE)
1618 break;
1619
1620 default:
1621 printk(KERN_DEBUG "%s: Unknown information frame received: "
1622 "type 0x%04x, length %d\n", dev->name, type, len);
1623
1624 break;
1625 }
1626}
1627EXPORT_SYMBOL(__orinoco_ev_info);
1628
1629static void __orinoco_ev_infdrop(struct net_device *dev, struct hermes *hw)
1630{
1631 if (net_ratelimit())
1632 printk(KERN_DEBUG "%s: Information frame lost.\n", dev->name);
1633}
1634
1635
1636
1637
1638
1639static int __orinoco_up(struct orinoco_private *priv)
1640{
1641 struct net_device *dev = priv->ndev;
1642 struct hermes *hw = &priv->hw;
1643 int err;
1644
1645 netif_carrier_off(dev);
1646
1647 err = __orinoco_commit(priv);
1648 if (err) {
1649 printk(KERN_ERR "%s: Error %d configuring card\n",
1650 dev->name, err);
1651 return err;
1652 }
1653
1654
1655 hermes_set_irqmask(hw, ORINOCO_INTEN);
1656 err = hermes_enable_port(hw, 0);
1657 if (err) {
1658 printk(KERN_ERR "%s: Error %d enabling MAC port\n",
1659 dev->name, err);
1660 return err;
1661 }
1662
1663 netif_start_queue(dev);
1664
1665 return 0;
1666}
1667
1668static int __orinoco_down(struct orinoco_private *priv)
1669{
1670 struct net_device *dev = priv->ndev;
1671 struct hermes *hw = &priv->hw;
1672 int err;
1673
1674 netif_stop_queue(dev);
1675
1676 if (!priv->hw_unavailable) {
1677 if (!priv->broken_disableport) {
1678 err = hermes_disable_port(hw, 0);
1679 if (err) {
1680
1681
1682
1683 printk(KERN_WARNING "%s: Error %d disabling MAC port\n",
1684 dev->name, err);
1685 priv->broken_disableport = 1;
1686 }
1687 }
1688 hermes_set_irqmask(hw, 0);
1689 hermes_write_regn(hw, EVACK, 0xffff);
1690 }
1691
1692 orinoco_scan_done(priv, true);
1693
1694
1695 netif_carrier_off(dev);
1696 priv->last_linkstatus = 0xffff;
1697
1698 return 0;
1699}
1700
1701static int orinoco_reinit_firmware(struct orinoco_private *priv)
1702{
1703 struct hermes *hw = &priv->hw;
1704 int err;
1705
1706 err = hw->ops->init(hw);
1707 if (priv->do_fw_download && !err) {
1708 err = orinoco_download(priv);
1709 if (err)
1710 priv->do_fw_download = 0;
1711 }
1712 if (!err)
1713 err = orinoco_hw_allocate_fid(priv);
1714
1715 return err;
1716}
1717
1718static int
1719__orinoco_set_multicast_list(struct net_device *dev)
1720{
1721 struct orinoco_private *priv = ndev_priv(dev);
1722 int err = 0;
1723 int promisc, mc_count;
1724
1725
1726
1727 if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) ||
1728 (netdev_mc_count(dev) > MAX_MULTICAST(priv))) {
1729 promisc = 1;
1730 mc_count = 0;
1731 } else {
1732 promisc = 0;
1733 mc_count = netdev_mc_count(dev);
1734 }
1735
1736 err = __orinoco_hw_set_multicast_list(priv, dev, mc_count, promisc);
1737
1738 return err;
1739}
1740
1741
1742
1743void orinoco_reset(struct work_struct *work)
1744{
1745 struct orinoco_private *priv =
1746 container_of(work, struct orinoco_private, reset_work);
1747 struct net_device *dev = priv->ndev;
1748 struct hermes *hw = &priv->hw;
1749 int err;
1750 unsigned long flags;
1751
1752 if (orinoco_lock(priv, &flags) != 0)
1753
1754
1755
1756 return;
1757
1758 netif_stop_queue(dev);
1759
1760
1761
1762 hermes_set_irqmask(hw, 0);
1763 hermes_write_regn(hw, EVACK, 0xffff);
1764
1765 priv->hw_unavailable++;
1766 priv->last_linkstatus = 0xffff;
1767 netif_carrier_off(dev);
1768
1769 orinoco_unlock(priv, &flags);
1770
1771
1772 orinoco_scan_done(priv, true);
1773
1774 if (priv->hard_reset) {
1775 err = (*priv->hard_reset)(priv);
1776 if (err) {
1777 printk(KERN_ERR "%s: orinoco_reset: Error %d "
1778 "performing hard reset\n", dev->name, err);
1779 goto disable;
1780 }
1781 }
1782
1783 err = orinoco_reinit_firmware(priv);
1784 if (err) {
1785 printk(KERN_ERR "%s: orinoco_reset: Error %d re-initializing firmware\n",
1786 dev->name, err);
1787 goto disable;
1788 }
1789
1790
1791 orinoco_lock_irq(priv);
1792
1793 priv->hw_unavailable--;
1794
1795
1796
1797 if (priv->open && (!priv->hw_unavailable)) {
1798 err = __orinoco_up(priv);
1799 if (err) {
1800 printk(KERN_ERR "%s: orinoco_reset: Error %d reenabling card\n",
1801 dev->name, err);
1802 } else
1803 dev->trans_start = jiffies;
1804 }
1805
1806 orinoco_unlock_irq(priv);
1807
1808 return;
1809 disable:
1810 hermes_set_irqmask(hw, 0);
1811 netif_device_detach(dev);
1812 printk(KERN_ERR "%s: Device has been disabled!\n", dev->name);
1813}
1814
1815static int __orinoco_commit(struct orinoco_private *priv)
1816{
1817 struct net_device *dev = priv->ndev;
1818 int err = 0;
1819
1820
1821
1822
1823
1824 priv->tkip_cm_active = 0;
1825
1826 err = orinoco_hw_program_rids(priv);
1827
1828
1829 (void) __orinoco_set_multicast_list(dev);
1830
1831 return err;
1832}
1833
1834
1835
1836
1837int orinoco_commit(struct orinoco_private *priv)
1838{
1839 struct net_device *dev = priv->ndev;
1840 struct hermes *hw = &priv->hw;
1841 int err;
1842
1843 if (priv->broken_disableport) {
1844 schedule_work(&priv->reset_work);
1845 return 0;
1846 }
1847
1848 err = hermes_disable_port(hw, 0);
1849 if (err) {
1850 printk(KERN_WARNING "%s: Unable to disable port "
1851 "while reconfiguring card\n", dev->name);
1852 priv->broken_disableport = 1;
1853 goto out;
1854 }
1855
1856 err = __orinoco_commit(priv);
1857 if (err) {
1858 printk(KERN_WARNING "%s: Unable to reconfigure card\n",
1859 dev->name);
1860 goto out;
1861 }
1862
1863 err = hermes_enable_port(hw, 0);
1864 if (err) {
1865 printk(KERN_WARNING "%s: Unable to enable port while reconfiguring card\n",
1866 dev->name);
1867 goto out;
1868 }
1869
1870 out:
1871 if (err) {
1872 printk(KERN_WARNING "%s: Resetting instead...\n", dev->name);
1873 schedule_work(&priv->reset_work);
1874 err = 0;
1875 }
1876 return err;
1877}
1878
1879
1880
1881
1882
1883static void __orinoco_ev_tick(struct net_device *dev, struct hermes *hw)
1884{
1885 printk(KERN_DEBUG "%s: TICK\n", dev->name);
1886}
1887
1888static void __orinoco_ev_wterr(struct net_device *dev, struct hermes *hw)
1889{
1890
1891
1892 printk(KERN_DEBUG "%s: MAC controller error (WTERR). Ignoring.\n",
1893 dev->name);
1894}
1895
1896irqreturn_t orinoco_interrupt(int irq, void *dev_id)
1897{
1898 struct orinoco_private *priv = dev_id;
1899 struct net_device *dev = priv->ndev;
1900 struct hermes *hw = &priv->hw;
1901 int count = MAX_IRQLOOPS_PER_IRQ;
1902 u16 evstat, events;
1903
1904
1905
1906
1907
1908
1909 static int last_irq_jiffy;
1910 static int loops_this_jiffy;
1911 unsigned long flags;
1912
1913 if (orinoco_lock(priv, &flags) != 0) {
1914
1915
1916 return IRQ_HANDLED;
1917 }
1918
1919 evstat = hermes_read_regn(hw, EVSTAT);
1920 events = evstat & hw->inten;
1921 if (!events) {
1922 orinoco_unlock(priv, &flags);
1923 return IRQ_NONE;
1924 }
1925
1926 if (jiffies != last_irq_jiffy)
1927 loops_this_jiffy = 0;
1928 last_irq_jiffy = jiffies;
1929
1930 while (events && count--) {
1931 if (++loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY) {
1932 printk(KERN_WARNING "%s: IRQ handler is looping too "
1933 "much! Resetting.\n", dev->name);
1934
1935 hermes_set_irqmask(hw, 0);
1936 schedule_work(&priv->reset_work);
1937 break;
1938 }
1939
1940
1941 if (!hermes_present(hw)) {
1942 DEBUG(0, "orinoco_interrupt(): card removed\n");
1943 break;
1944 }
1945
1946 if (events & HERMES_EV_TICK)
1947 __orinoco_ev_tick(dev, hw);
1948 if (events & HERMES_EV_WTERR)
1949 __orinoco_ev_wterr(dev, hw);
1950 if (events & HERMES_EV_INFDROP)
1951 __orinoco_ev_infdrop(dev, hw);
1952 if (events & HERMES_EV_INFO)
1953 __orinoco_ev_info(dev, hw);
1954 if (events & HERMES_EV_RX)
1955 __orinoco_ev_rx(dev, hw);
1956 if (events & HERMES_EV_TXEXC)
1957 __orinoco_ev_txexc(dev, hw);
1958 if (events & HERMES_EV_TX)
1959 __orinoco_ev_tx(dev, hw);
1960 if (events & HERMES_EV_ALLOC)
1961 __orinoco_ev_alloc(dev, hw);
1962
1963 hermes_write_regn(hw, EVACK, evstat);
1964
1965 evstat = hermes_read_regn(hw, EVSTAT);
1966 events = evstat & hw->inten;
1967 }
1968
1969 orinoco_unlock(priv, &flags);
1970 return IRQ_HANDLED;
1971}
1972EXPORT_SYMBOL(orinoco_interrupt);
1973
1974
1975
1976
1977#if defined(CONFIG_PM_SLEEP) && !defined(CONFIG_HERMES_CACHE_FW_ON_INIT)
1978static int orinoco_pm_notifier(struct notifier_block *notifier,
1979 unsigned long pm_event,
1980 void *unused)
1981{
1982 struct orinoco_private *priv = container_of(notifier,
1983 struct orinoco_private,
1984 pm_notifier);
1985
1986
1987
1988
1989
1990 if (!priv->do_fw_download)
1991 return NOTIFY_DONE;
1992
1993 switch (pm_event) {
1994 case PM_HIBERNATION_PREPARE:
1995 case PM_SUSPEND_PREPARE:
1996 orinoco_cache_fw(priv, 0);
1997 break;
1998
1999 case PM_POST_RESTORE:
2000
2001
2002 case PM_POST_HIBERNATION:
2003 case PM_POST_SUSPEND:
2004 orinoco_uncache_fw(priv);
2005 break;
2006
2007 case PM_RESTORE_PREPARE:
2008 default:
2009 break;
2010 }
2011
2012 return NOTIFY_DONE;
2013}
2014
2015static void orinoco_register_pm_notifier(struct orinoco_private *priv)
2016{
2017 priv->pm_notifier.notifier_call = orinoco_pm_notifier;
2018 register_pm_notifier(&priv->pm_notifier);
2019}
2020
2021static void orinoco_unregister_pm_notifier(struct orinoco_private *priv)
2022{
2023 unregister_pm_notifier(&priv->pm_notifier);
2024}
2025#else
2026#define orinoco_register_pm_notifier(priv) do { } while (0)
2027#define orinoco_unregister_pm_notifier(priv) do { } while (0)
2028#endif
2029
2030
2031
2032
2033
2034int orinoco_init(struct orinoco_private *priv)
2035{
2036 struct device *dev = priv->dev;
2037 struct wiphy *wiphy = priv_to_wiphy(priv);
2038 struct hermes *hw = &priv->hw;
2039 int err = 0;
2040
2041
2042
2043 priv->nicbuf_size = IEEE80211_MAX_FRAME_LEN + ETH_HLEN;
2044
2045
2046 err = hw->ops->init(hw);
2047 if (err != 0) {
2048 dev_err(dev, "Failed to initialize firmware (err = %d)\n",
2049 err);
2050 goto out;
2051 }
2052
2053 err = determine_fw_capabilities(priv, wiphy->fw_version,
2054 sizeof(wiphy->fw_version),
2055 &wiphy->hw_version);
2056 if (err != 0) {
2057 dev_err(dev, "Incompatible firmware, aborting\n");
2058 goto out;
2059 }
2060
2061 if (priv->do_fw_download) {
2062#ifdef CONFIG_HERMES_CACHE_FW_ON_INIT
2063 orinoco_cache_fw(priv, 0);
2064#endif
2065
2066 err = orinoco_download(priv);
2067 if (err)
2068 priv->do_fw_download = 0;
2069
2070
2071 err = determine_fw_capabilities(priv, wiphy->fw_version,
2072 sizeof(wiphy->fw_version),
2073 &wiphy->hw_version);
2074 if (err != 0) {
2075 dev_err(dev, "Incompatible firmware, aborting\n");
2076 goto out;
2077 }
2078 }
2079
2080 if (priv->has_port3)
2081 dev_info(dev, "Ad-hoc demo mode supported\n");
2082 if (priv->has_ibss)
2083 dev_info(dev, "IEEE standard IBSS ad-hoc mode supported\n");
2084 if (priv->has_wep)
2085 dev_info(dev, "WEP supported, %s-bit key\n",
2086 priv->has_big_wep ? "104" : "40");
2087 if (priv->has_wpa) {
2088 dev_info(dev, "WPA-PSK supported\n");
2089 if (orinoco_mic_init(priv)) {
2090 dev_err(dev, "Failed to setup MIC crypto algorithm. "
2091 "Disabling WPA support\n");
2092 priv->has_wpa = 0;
2093 }
2094 }
2095
2096 err = orinoco_hw_read_card_settings(priv, wiphy->perm_addr);
2097 if (err)
2098 goto out;
2099
2100 err = orinoco_hw_allocate_fid(priv);
2101 if (err) {
2102 dev_err(dev, "Failed to allocate NIC buffer!\n");
2103 goto out;
2104 }
2105
2106
2107 priv->iw_mode = NL80211_IFTYPE_STATION;
2108
2109 priv->prefer_port3 = priv->has_port3 && (!priv->has_ibss);
2110 set_port_type(priv);
2111 priv->channel = 0;
2112
2113 priv->promiscuous = 0;
2114 priv->encode_alg = ORINOCO_ALG_NONE;
2115 priv->tx_key = 0;
2116 priv->wpa_enabled = 0;
2117 priv->tkip_cm_active = 0;
2118 priv->key_mgmt = 0;
2119 priv->wpa_ie_len = 0;
2120 priv->wpa_ie = NULL;
2121
2122 if (orinoco_wiphy_register(wiphy)) {
2123 err = -ENODEV;
2124 goto out;
2125 }
2126
2127
2128
2129 orinoco_lock_irq(priv);
2130 priv->hw_unavailable--;
2131 orinoco_unlock_irq(priv);
2132
2133 dev_dbg(dev, "Ready\n");
2134
2135 out:
2136 return err;
2137}
2138EXPORT_SYMBOL(orinoco_init);
2139
2140static const struct net_device_ops orinoco_netdev_ops = {
2141 .ndo_open = orinoco_open,
2142 .ndo_stop = orinoco_stop,
2143 .ndo_start_xmit = orinoco_xmit,
2144 .ndo_set_rx_mode = orinoco_set_multicast_list,
2145 .ndo_change_mtu = orinoco_change_mtu,
2146 .ndo_set_mac_address = eth_mac_addr,
2147 .ndo_validate_addr = eth_validate_addr,
2148 .ndo_tx_timeout = orinoco_tx_timeout,
2149 .ndo_get_stats = orinoco_get_stats,
2150};
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177struct orinoco_private
2178*alloc_orinocodev(int sizeof_card,
2179 struct device *device,
2180 int (*hard_reset)(struct orinoco_private *),
2181 int (*stop_fw)(struct orinoco_private *, int))
2182{
2183 struct orinoco_private *priv;
2184 struct wiphy *wiphy;
2185
2186
2187
2188
2189
2190 wiphy = wiphy_new(&orinoco_cfg_ops,
2191 sizeof(struct orinoco_private) + sizeof_card);
2192 if (!wiphy)
2193 return NULL;
2194
2195 priv = wiphy_priv(wiphy);
2196 priv->dev = device;
2197
2198 if (sizeof_card)
2199 priv->card = (void *)((unsigned long)priv
2200 + sizeof(struct orinoco_private));
2201 else
2202 priv->card = NULL;
2203
2204 orinoco_wiphy_init(wiphy);
2205
2206#ifdef WIRELESS_SPY
2207 priv->wireless_data.spy_data = &priv->spy_data;
2208#endif
2209
2210
2211 priv->hard_reset = hard_reset;
2212 priv->stop_fw = stop_fw;
2213
2214 spin_lock_init(&priv->lock);
2215 priv->open = 0;
2216 priv->hw_unavailable = 1;
2217
2218
2219 INIT_WORK(&priv->reset_work, orinoco_reset);
2220 INIT_WORK(&priv->join_work, orinoco_join_ap);
2221 INIT_WORK(&priv->wevent_work, orinoco_send_wevents);
2222
2223 INIT_LIST_HEAD(&priv->rx_list);
2224 tasklet_init(&priv->rx_tasklet, orinoco_rx_isr_tasklet,
2225 (unsigned long) priv);
2226
2227 spin_lock_init(&priv->scan_lock);
2228 INIT_LIST_HEAD(&priv->scan_list);
2229 INIT_WORK(&priv->process_scan, orinoco_process_scan_results);
2230
2231 priv->last_linkstatus = 0xffff;
2232
2233#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
2234 priv->cached_pri_fw = NULL;
2235 priv->cached_fw = NULL;
2236#endif
2237
2238
2239 orinoco_register_pm_notifier(priv);
2240
2241 return priv;
2242}
2243EXPORT_SYMBOL(alloc_orinocodev);
2244
2245
2246
2247
2248
2249
2250
2251
2252int orinoco_if_add(struct orinoco_private *priv,
2253 unsigned long base_addr,
2254 unsigned int irq,
2255 const struct net_device_ops *ops)
2256{
2257 struct wiphy *wiphy = priv_to_wiphy(priv);
2258 struct wireless_dev *wdev;
2259 struct net_device *dev;
2260 int ret;
2261
2262 dev = alloc_etherdev(sizeof(struct wireless_dev));
2263
2264 if (!dev)
2265 return -ENOMEM;
2266
2267
2268 wdev = netdev_priv(dev);
2269 wdev->wiphy = wiphy;
2270 wdev->iftype = NL80211_IFTYPE_STATION;
2271
2272
2273 dev->ieee80211_ptr = wdev;
2274 dev->watchdog_timeo = HZ;
2275 dev->wireless_handlers = &orinoco_handler_def;
2276#ifdef WIRELESS_SPY
2277 dev->wireless_data = &priv->wireless_data;
2278#endif
2279
2280 if (ops)
2281 dev->netdev_ops = ops;
2282 else
2283 dev->netdev_ops = &orinoco_netdev_ops;
2284
2285
2286
2287
2288 dev->needed_headroom = ENCAPS_OVERHEAD;
2289
2290 netif_carrier_off(dev);
2291
2292 memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN);
2293 memcpy(dev->perm_addr, wiphy->perm_addr, ETH_ALEN);
2294
2295 dev->base_addr = base_addr;
2296 dev->irq = irq;
2297
2298 SET_NETDEV_DEV(dev, priv->dev);
2299 ret = register_netdev(dev);
2300 if (ret)
2301 goto fail;
2302
2303 priv->ndev = dev;
2304
2305
2306 dev_dbg(priv->dev, "Registerred interface %s.\n", dev->name);
2307
2308 return 0;
2309
2310 fail:
2311 free_netdev(dev);
2312 return ret;
2313}
2314EXPORT_SYMBOL(orinoco_if_add);
2315
2316void orinoco_if_del(struct orinoco_private *priv)
2317{
2318 struct net_device *dev = priv->ndev;
2319
2320 unregister_netdev(dev);
2321 free_netdev(dev);
2322}
2323EXPORT_SYMBOL(orinoco_if_del);
2324
2325void free_orinocodev(struct orinoco_private *priv)
2326{
2327 struct wiphy *wiphy = priv_to_wiphy(priv);
2328 struct orinoco_rx_data *rx_data, *temp;
2329 struct orinoco_scan_data *sd, *sdtemp;
2330
2331 wiphy_unregister(wiphy);
2332
2333
2334
2335
2336 tasklet_kill(&priv->rx_tasklet);
2337
2338
2339 list_for_each_entry_safe(rx_data, temp, &priv->rx_list, list) {
2340 list_del(&rx_data->list);
2341
2342 dev_kfree_skb(rx_data->skb);
2343 kfree(rx_data->desc);
2344 kfree(rx_data);
2345 }
2346
2347 cancel_work_sync(&priv->process_scan);
2348
2349 list_for_each_entry_safe(sd, sdtemp, &priv->scan_list, list) {
2350 list_del(&sd->list);
2351
2352 if ((sd->len > 0) && sd->buf)
2353 kfree(sd->buf);
2354 kfree(sd);
2355 }
2356
2357 orinoco_unregister_pm_notifier(priv);
2358 orinoco_uncache_fw(priv);
2359
2360 priv->wpa_ie_len = 0;
2361 kfree(priv->wpa_ie);
2362 orinoco_mic_free(priv);
2363 wiphy_free(wiphy);
2364}
2365EXPORT_SYMBOL(free_orinocodev);
2366
2367int orinoco_up(struct orinoco_private *priv)
2368{
2369 struct net_device *dev = priv->ndev;
2370 unsigned long flags;
2371 int err;
2372
2373 priv->hw.ops->lock_irqsave(&priv->lock, &flags);
2374
2375 err = orinoco_reinit_firmware(priv);
2376 if (err) {
2377 printk(KERN_ERR "%s: Error %d re-initializing firmware\n",
2378 dev->name, err);
2379 goto exit;
2380 }
2381
2382 netif_device_attach(dev);
2383 priv->hw_unavailable--;
2384
2385 if (priv->open && !priv->hw_unavailable) {
2386 err = __orinoco_up(priv);
2387 if (err)
2388 printk(KERN_ERR "%s: Error %d restarting card\n",
2389 dev->name, err);
2390 }
2391
2392exit:
2393 priv->hw.ops->unlock_irqrestore(&priv->lock, &flags);
2394
2395 return 0;
2396}
2397EXPORT_SYMBOL(orinoco_up);
2398
2399void orinoco_down(struct orinoco_private *priv)
2400{
2401 struct net_device *dev = priv->ndev;
2402 unsigned long flags;
2403 int err;
2404
2405 priv->hw.ops->lock_irqsave(&priv->lock, &flags);
2406 err = __orinoco_down(priv);
2407 if (err)
2408 printk(KERN_WARNING "%s: Error %d downing interface\n",
2409 dev->name, err);
2410
2411 netif_device_detach(dev);
2412 priv->hw_unavailable++;
2413 priv->hw.ops->unlock_irqrestore(&priv->lock, &flags);
2414}
2415EXPORT_SYMBOL(orinoco_down);
2416
2417
2418
2419
2420
2421
2422
2423static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION
2424 " (David Gibson <hermes@gibson.dropbear.id.au>, "
2425 "Pavel Roskin <proski@gnu.org>, et al)";
2426
2427static int __init init_orinoco(void)
2428{
2429 printk(KERN_DEBUG "%s\n", version);
2430 return 0;
2431}
2432
2433static void __exit exit_orinoco(void)
2434{
2435}
2436
2437module_init(init_orinoco);
2438module_exit(exit_orinoco);
2439