broadcom 802.11 driver

Broadcom 802.11 Linux STA driver が 5/1に更新されていたようなので入れる。
2.6.29ではそのままコンパイル通らなかったのでパッチを作成した。

diff -ur orig/src/wl/sys/wl_iw.c patched/src/wl/sys/wl_iw.c
--- orig/src/wl/sys/wl_iw.c     2009-04-23 02:46:35.000000000 +0900
+++ patched/src/wl/sys/wl_iw.c  2009-05-11 02:46:01.000000000 +0900
@@ -610,7 +610,11 @@
        char *extra
 )
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl_iw_t *iw = netdev_priv(dev);
+#else
        wl_iw_t *iw = dev->priv;
+#endif
        struct sockaddr *addr = (struct sockaddr *) extra;
        int i;

@@ -635,7 +639,11 @@
        char *extra
 )
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl_iw_t *iw = netdev_priv(dev);
+#else
        wl_iw_t *iw = dev->priv;
+#endif
        struct sockaddr *addr = (struct sockaddr *) extra;
        struct iw_quality *qual = (struct iw_quality *) &addr[iw->spy_num];
        int i;
@@ -1110,7 +1118,11 @@
        char *extra
 )
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl_iw_t *iw = netdev_priv(dev);
+#else
        wl_iw_t *iw = dev->priv;
+#endif

        WL_TRACE(("%s: SIOCSIWNICKN\n", dev->name));

@@ -1134,7 +1146,11 @@
        char *extra
 )
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl_iw_t *iw = netdev_priv(dev);
+#else
        wl_iw_t *iw = dev->priv;
+#endif

        WL_TRACE(("%s: SIOCGIWNICKN\n", dev->name));

@@ -1790,7 +1806,11 @@
        int paramid;
        int paramval;
        int val = 0;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl_iw_t *iw = netdev_priv(dev);
+#else
        wl_iw_t *iw = dev->priv;
+#endif

        WL_TRACE(("%s: SIOCSIWAUTH\n", dev->name));

@@ -1921,7 +1941,11 @@
        int paramid;
        int paramval = 0;
        int val;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl_iw_t *iw = netdev_priv(dev);
+#else
        wl_iw_t *iw = dev->priv;
+#endif

        WL_TRACE(("%s: SIOCGIWAUTH\n", dev->name));

diff -ur orig/src/wl/sys/wl_linux.c patched/src/wl/sys/wl_linux.c
--- orig/src/wl/sys/wl_linux.c  2009-04-23 02:48:59.000000000 +0900
+++ patched/src/wl/sys/wl_linux.c       2009-05-11 02:46:01.000000000 +0900
@@ -53,6 +53,9 @@
 #include <linux/pci_ids.h>
 #define WLC_MAXBSSCFG          1

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+#include <net/lib80211.h>
+#endif
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14)
 #include <net/ieee80211.h>
 #endif
@@ -130,7 +133,11 @@
        u8 rx_hdr[16], tx_hdr[16];
 };

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+#define        WL_DEV_IF(dev)          ((wl_if_t*)netdev_priv(dev))
+#else
 #define        WL_DEV_IF(dev)          ((wl_if_t*)(dev)->priv)
+#endif
 #define        WL_INFO(dev)            ((wl_info_t*)(WL_DEV_IF(dev)->wl))

 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
@@ -282,6 +289,9 @@
        dev = wlif->dev;
        wl->dev = dev;
        wl_if_setup(dev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wlif = netdev_priv(dev);
+#endif

        dev->base_addr = regs;

@@ -359,10 +369,19 @@

 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14)

+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wl->tkipmodops = lib80211_get_crypto_ops("TKIP");
+#else
        wl->tkipmodops = ieee80211_get_crypto_ops("TKIP");
+#endif
        if (wl->tkipmodops == NULL) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+               request_module("lib80211");
+               wl->tkipmodops = lib80211_get_crypto_ops("TKIP");
+#else
                request_module("ieee80211_crypt_tkip");
                wl->tkipmodops = ieee80211_get_crypto_ops("TKIP");
+#endif
        }
 #endif
 #ifdef CONFIG_WIRELESS_EXT
@@ -666,7 +685,11 @@
        }

        if (wl->monitor) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+               wl_free_if(wl, (wl_if_t *)netdev_priv(wl->monitor));
+#else
                wl_free_if(wl, (wl_if_t *)(wl->monitor->priv));
+#endif
                wl->monitor = NULL;
        }

@@ -834,6 +857,9 @@
 #else

        dev = alloc_netdev(0, name, ether_setup);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       wlif = netdev_priv(dev);
+#endif
        if (!dev) {
                MFREE(wl->osh, wlif, sizeof(wl_if_t));
                WL_ERROR(("wl%d: wl_alloc_if: out of memory, alloc_netdev\n",
@@ -847,7 +873,9 @@
        wlif->wl = wl;
        wlif->wlcif = wlcif;
        wlif->subunit = subunit;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
        dev->priv = wlif;
+#endif

        if (iftype != WL_IFTYPE_MON && wl->dev && netif_queue_stopped(wl->dev))
                netif_stop_queue(dev);
diff -ur orig/src/wl/sys/wl_linux.h patched/src/wl/sys/wl_linux.h
--- orig/src/wl/sys/wl_linux.h  2009-04-23 02:49:04.000000000 +0900
+++ patched/src/wl/sys/wl_linux.h       2009-05-11 02:45:04.000000000 +0900
@@ -85,7 +85,11 @@
        bool            resched;
        uint32          pci_psstate[16];
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14)
-       struct ieee80211_crypto_ops *tkipmodops;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
+       struct lib80211_crypto_ops *tkipmodops;
+#else
+       struct ieee80211_crypto_ops *tkipmodops;
+#endif
        struct ieee80211_tkip_data  *tkip_ucast_data;
        struct ieee80211_tkip_data  *tkip_bcast_data;
 #endif