52 #include <linux/module.h>
53 #include <linux/kernel.h>
54 #include <linux/sched.h>
55 #include <linux/types.h>
57 #include <linux/slab.h>
60 #include <linux/netdevice.h>
62 #include <linux/if_arp.h>
63 #include <linux/wireless.h>
66 #include <linux/if_ether.h>
68 #include <linux/bitops.h>
70 #include <asm/byteorder.h>
73 #include <linux/ethtool.h>
94 static void p80211netdev_rx_bh(
unsigned long arg);
100 static int p80211knetdev_stop(
netdevice_t *netdev);
101 static int p80211knetdev_hard_start_xmit(
struct sk_buff *
skb,
107 static void p80211knetdev_tx_timeout(
netdevice_t *netdev);
188 result = wlandev->
open(wlandev);
190 netif_start_queue(wlandev->
netdev);
218 result = wlandev->
close(wlandev);
220 netif_stop_queue(wlandev->
netdev);
243 tasklet_schedule(&wlandev->
rx_bh);
259 static void p80211netdev_rx_bh(
unsigned long arg)
277 skb_reset_mac_header(skb);
290 if (p80211_rx_typedrop(wlandev, fc)) {
303 if (!(hdr->
a1[0] & 0x01)) {
311 (wlandev, wlandev->
ethconv, skb) == 0) {
319 pr_debug(
"p80211_to_ether failed.\n");
345 static int p80211knetdev_hard_start_xmit(
struct sk_buff *skb,
365 if (netif_queue_stopped(netdev)) {
366 pr_debug(
"called when queue stopped.\n");
371 netif_stop_queue(netdev);
385 netif_start_queue(wlandev->
netdev);
387 "Tx attempt prior to association, frame dropped.\n");
409 pr_debug(
"ether_to_80211(%d) failed.\n",
431 netif_wake_queue(wlandev->
netdev);
433 }
else if (txresult == 1) {
435 pr_debug(
"txframe success, no more bufs\n");
439 }
else if (txresult == 2) {
441 pr_debug(
"txframe returned alloc_fail\n");
445 pr_debug(
"txframe returned full or busy\n");
451 if ((p80211_wep.data) && (p80211_wep.data != skb->
data))
473 static void p80211knetdev_set_multicast_list(
netdevice_t *dev)
486 static int p80211netdev_ethtool(
wlandevice_t *wlandev,
void __user *useraddr)
493 memset(&edata, 0,
sizeof(edata));
565 pr_debug(
"rx'd ioctl, cmd=%d, len=%d\n", cmd, req->
len);
570 p80211netdev_ethtool(wlandev, (
void __user *)ifr->ifr_data);
599 ((
void __user *)req->
data, msgbuf, req->
len)) {
647 if (netif_running(dev))
651 mibattr = &dot11req.mibattribute;
653 resultcode = &dot11req.resultcode;
665 mibattr->len =
sizeof(mibattr->data);
669 macaddr->
len =
sizeof(macaddr->
data);
676 resultcode->
len =
sizeof(resultcode->
data);
677 resultcode->
data = 0;
687 "Low-level driver failed dot11req_mibset(dot11MACAddress).\n");
697 static int wlan_change_mtu(
netdevice_t *dev,
int new_mtu)
701 if ((new_mtu < 68) || (new_mtu > (2312 - 20 - 8)))
710 .ndo_init = p80211knetdev_init,
711 .ndo_open = p80211knetdev_open,
712 .ndo_stop = p80211knetdev_stop,
713 .ndo_get_stats = p80211knetdev_get_stats,
714 .ndo_start_xmit = p80211knetdev_hard_start_xmit,
715 .ndo_set_rx_mode = p80211knetdev_set_multicast_list,
716 .ndo_do_ioctl = p80211knetdev_do_ioctl,
717 .ndo_set_mac_address = p80211knetdev_set_mac_address,
718 .ndo_tx_timeout = p80211knetdev_tx_timeout,
719 .ndo_change_mtu = wlan_change_mtu,
759 skb_queue_head_init(&wlandev->
nsd_rxq);
761 p80211netdev_rx_bh, (
unsigned long)wlandev);
773 if (netdev ==
NULL) {
781 wdev = netdev_priv(netdev);
786 netif_stop_queue(netdev);
819 wdev = netdev_priv(wlandev->
netdev);
915 netif_stop_queue(wlandev->
netdev);
950 pr_debug(
"rx_typedrop : ftype=%d fstype=%d.\n", ftype, fstype);
964 wlandev->
rx.assocreq++;
968 wlandev->
rx.assocresp++;
972 wlandev->
rx.reassocreq++;
976 wlandev->
rx.reassocresp++;
980 wlandev->
rx.probereq++;
984 wlandev->
rx.proberesp++;
988 wlandev->
rx.beacon++;
996 wlandev->
rx.disassoc++;
1000 wlandev->
rx.authen++;
1004 wlandev->
rx.deauthen++;
1008 wlandev->
rx.mgmt_unknown++;
1026 wlandev->
rx.pspoll++;
1042 wlandev->
rx.cfend++;
1046 wlandev->
rx.cfendcfack++;
1050 wlandev->
rx.ctl_unknown++;
1061 wlandev->
rx.dataonly++;
1064 wlandev->
rx.data_cfack++;
1067 wlandev->
rx.data_cfpoll++;
1070 wlandev->
rx.data__cfack_cfpoll++;
1078 wlandev->
rx.cfack++;
1082 wlandev->
rx.cfpoll++;
1085 pr_debug(
"rx'd data:cfack_cfpoll\n");
1086 wlandev->
rx.cfack_cfpoll++;
1090 wlandev->
rx.data_unknown++;
1099 static void p80211knetdev_tx_timeout(
netdevice_t *netdev)
1108 netif_wake_queue(wlandev->
netdev);