Ticket #4361: otus-support.diff

File otus-support.diff, 10.2 KB (added by Will Dyson <will.dyson@…>, 7 years ago)

Repost as plain text patch

  • new file package/ar9170/Makefile

    This package adds a driver for the USB chipset AR9170 from Atheros (aka UB81, UB82). It depends on the patch in ticket 4360 (update mac80211 to compat-wireless-2.6.old) for kernel < 2.6.27 Compiles fine and loads in the kernel on a WGT634U with 2.6.25
    
    Signed-off-by: Joerg Albert <jal2 at gmx.de>
    ---
    
     package/ar9170/Makefile                            |   94 +++++++++
     .../patches/100-backport_to_compat_old.patch       |  203 ++++++++++++++++++++
     2 files changed, 297 insertions(+), 0 deletions(-)
     create mode 100644 package/ar9170/Makefile
     create mode 100644 package/ar9170/patches/100-backport_to_compat_old.patch
    
    
    diff --git a/package/ar9170/Makefile b/package/ar9170/Makefile
    new file mode 100644
    index 0000000..ed8a2de
    - +  
     1# 
     2# Copyright (C) 2008 OpenWrt.org 
     3# 
     4# This is free software, licensed under the GNU General Public License v2. 
     5# See /LICENSE for more information. 
     6# 
     7# $Id$ 
     8 
     9include $(TOPDIR)/rules.mk 
     10include $(INCLUDE_DIR)/kernel.mk 
     11 
     12PKG_NAME:=kmod-ar9170 
     13#PKG_REV:=06609c7644e6770056405b09ff095689d79b4c30 
     14PKG_REV:=06609c7644e6 
     15PKG_VERSION:=20081120_$(PKG_REV) 
     16PKG_RELEASE:=1 
     17 
     18PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 
     19PKG_SOURCE_URL:=http://www.kernel.org/pub/scm/linux/kernel/git/jberg/ar9170.git 
     20PKG_SOURCE_PROTO:=git 
     21PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) 
     22PKG_SOURCE_VERSION:=$(PKG_REV) 
     23PKG_BUILD_DEPENDS:=mac80211 
     24 
     25include $(INCLUDE_DIR)/package.mk 
     26 
     27define KernelPackage/ar9170 
     28  SUBMENU:=Wireless Drivers 
     29  TITLE:=Atheros UB81/UB82 (802.11abgn) USB WLAN stick support 
     30  DEPENDS:=+kmod-mac80211 @USB_SUPPORT 
     31  FILES:=$(PKG_BUILD_DIR)/ar9170.$(LINUX_KMOD_SUFFIX) 
     32# load it after all usb hcd (40,50) 
     33  AUTOLOAD:=$(call AutoLoad,51,ar9170) 
     34endef 
     35 
     36define KernelPackage/ar9170/description 
     37Kernel module for Atheros UB81/UB82 based USB WLAN sticks (802.11abgn) 
     38endef 
     39 
     40FW_PART1:=ar9170-1.fw 
     41FW_PART2:=ar9170-2.fw 
     42FW_SUBDIR:=linux-firmware 
     43FW_ARCHIVE:=linux-firmware.tar.gz 
     44define Download/firmware 
     45# that's the archive file name created in trunk/dl/ from this download 
     46# containing the whole git snapshot 
     47  FILE:=$(FW_ARCHIVE) 
     48  PROTO:=git 
     49  SUBDIR:=$(FW_SUBDIR) 
     50  VERSION:=b66ece11531cc7043bd25dd963c8a58d8d5da2f5 
     51# use http: instead of git: for all users behind restrictive firewalls ... 
     52  URL:=http://www.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git 
     53#  MD5SUM:=bebf8de7bf0aa8ae3eb395cc6be2e762 
     54endef 
     55$(eval $(call Download,firmware)) 
     56 
     57PKG_EXTRA_KCONFIG:= CONFIG_AR9170=m 
     58 
     59PKG_EXTRA_CFLAGS:= \ 
     60        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \ 
     61        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \ 
     62 
     63EXTRA_KCONFIG:= \ 
     64        CONFIG_AR9170=m 
     65 
     66EXTRA_CFLAGS:= \ 
     67        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ 
     68        $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ 
     69 
     70MAKE_OPTS:= \ 
     71        ARCH="$(LINUX_KARCH)" \ 
     72        CROSS_COMPILE="$(TARGET_CROSS)" \ 
     73        SUBDIRS="$(PKG_BUILD_DIR)" \ 
     74        EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ 
     75        LINUXINCLUDE="-I$(STAGING_DIR)/usr/include/mac80211 -I$(LINUX_DIR)/include -include linux/autoconf.h" \ 
     76        $(EXTRA_KCONFIG) 
     77 
     78define Build/Configure 
     79endef 
     80 
     81define Build/Compile 
     82        $(MAKE) -C "$(LINUX_DIR)" \ 
     83                $(MAKE_OPTS) \ 
     84                modules 
     85endef 
     86 
     87define KernelPackage/ar9170/install 
     88        $(INSTALL_DIR) $(1)/lib/firmware 
     89        tar xzf "$(DL_DIR)/$(FW_ARCHIVE)" -C "$(PKG_BUILD_DIR)" --strip 1 $(FW_SUBDIR)/$(FW_PART1) $(FW_SUBDIR)/$(FW_PART2) 
     90        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(FW_PART1) $(1)/lib/firmware 
     91        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(FW_PART2) $(1)/lib/firmware 
     92endef 
     93 
     94$(eval $(call KernelPackage,ar9170)) 
  • new file package/ar9170/patches/100-backport_to_compat_old.patch

    diff --git a/package/ar9170/patches/100-backport_to_compat_old.patch b/package/ar9170/patches/100-backport_to_compat_old.patch
    new file mode 100644
    index 0000000..0dab364
    - +  
     1diff --git a/mac.c b/mac.c 
     2index a8289e6..c3a6123 100644 
     3--- a/mac.c 
     4+++ b/mac.c 
     5@@ -195,7 +195,10 @@ int ar9170_set_operating_mode(struct ar9170 *ar) 
     6                        break; 
     7                } 
     8  
     9+/* jal: no idea where to get the DTIM period from in compat-wireless-old */ 
     10+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) 
     11                v |= ar->vif->bss_conf.dtim_period << 16; 
     12+#endif 
     13        } 
     14  
     15        ar9170_regwrite_begin(ar); 
     16diff --git a/main.c b/main.c 
     17index f392ddb..8d01523 100644 
     18--- a/main.c 
     19+++ b/main.c 
     20@@ -267,7 +267,12 @@ static void tx_urb_complete(struct urb *urb) 
     21        struct sk_buff *skb = (void *)urb->context; 
     22 /* 
     23        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     24-       struct ar9170 *ar = info->rate_driver_data[0]; 
     25+       struct ar9170 *ar =  
     26+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) 
     27+                            info->driver_data[0]; 
     28+#else 
     29+                            info->rate_driver_data[0]; 
     30+#endif 
     31  */ 
     32  
     33        /* 
     34@@ -327,6 +332,80 @@ int ar9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) 
     35        if (info->flags & IEEE80211_TX_CTL_AMPDU) 
     36                txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_AGGR); 
     37  
     38+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) 
     39+       if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) 
     40+               txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_PROT_CTS); 
     41+       else if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) 
     42+               txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_PROT_RTS); 
     43+ 
     44+       if (info->flags & IEEE80211_TX_CTL_GREEN_FIELD) 
     45+               txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_GREENFIELD); 
     46+ 
     47+       if (info->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE) 
     48+               txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_SHORT_PREAMBLE); 
     49+ 
     50+       if (info->flags & IEEE80211_TX_CTL_40_MHZ_WIDTH) 
     51+               txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_BW_40MHZ); 
     52+       /* this works because 40 MHz is 2 and dup is 3 */ 
     53+       if (info->flags & IEEE80211_TX_CTL_DUP_DATA) 
     54+               txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_BW_40MHZ_DUP); 
     55+ 
     56+       if (info->flags & IEEE80211_TX_CTL_SHORT_GI) 
     57+               txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_SHORT_GI); 
     58+ 
     59+       if (info->flags & IEEE80211_TX_CTL_OFDM_HT) { 
     60+               u32 r = info->tx_rate_idx; /* Is this correct? */ 
     61+               u8 *txpower; 
     62+               r <<= AR9170_TX_PHY_MCS_SHIFT; 
     63+               if (WARN_ON(r & ~AR9170_TX_PHY_MCS_MASK)) 
     64+                       goto free; 
     65+               txc->phy_control |= cpu_to_le32(r & AR9170_TX_PHY_MCS_MASK); 
     66+               txc->phy_control |= cpu_to_le32(AR9170_TX_PHY_MOD_HT); 
     67+ 
     68+               if (info->flags & IEEE80211_TX_CTL_40_MHZ_WIDTH) { 
     69+                       if (info->band == IEEE80211_BAND_5GHZ) 
     70+                               txpower = ar->power_5G_ht40; 
     71+                       else 
     72+                               txpower = ar->power_2G_ht40; 
     73+               } else { 
     74+                       if (info->band == IEEE80211_BAND_5GHZ) 
     75+                               txpower = ar->power_5G_ht20; 
     76+                       else 
     77+                               txpower = ar->power_2G_ht20; 
     78+               } 
     79+ 
     80+               power = txpower[info->tx_rate_idx & 7]; 
     81+       } else { 
     82+               u8 *txpower; 
     83+               u32 mod; 
     84+               u32 phyrate; 
     85+               u8 idx = info->tx_rate_idx; 
     86+ 
     87+               if (info->band != IEEE80211_BAND_2GHZ) { 
     88+                       idx += 4; 
     89+                       txpower = ar->power_5G_leg; 
     90+                       mod = AR9170_TX_PHY_MOD_OFDM; 
     91+               } else { 
     92+                       if (idx < 4) { 
     93+                               txpower = ar->power_2G_cck; 
     94+                               mod = AR9170_TX_PHY_MOD_CCK; 
     95+                       } else { 
     96+                               mod = AR9170_TX_PHY_MOD_OFDM; 
     97+                               txpower = ar->power_2G_ofdm; 
     98+                       } 
     99+               } 
     100+ 
     101+               rate = &__ar9170_ratetable[idx]; 
     102+ 
     103+               phyrate = rate->hw_value & 0xF; 
     104+               power = txpower[(rate->hw_value & 0x30) >> 4]; 
     105+               phyrate <<= AR9170_TX_PHY_MCS_SHIFT; 
     106+ 
     107+               txc->phy_control |= cpu_to_le32(mod); 
     108+               txc->phy_control |= cpu_to_le32(phyrate); 
     109+       } 
     110+ 
     111+#else 
     112        if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) 
     113                txc->mac_control |= cpu_to_le16(AR9170_TX_MAC_PROT_CTS); 
     114        else if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) 
     115@@ -398,7 +477,7 @@ int ar9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) 
     116                txc->phy_control |= cpu_to_le32(mod); 
     117                txc->phy_control |= cpu_to_le32(phyrate); 
     118        } 
     119- 
     120+#endif 
     121        power <<= AR9170_TX_PHY_TX_PWR_SHIFT; 
     122        power &= AR9170_TX_PHY_TX_PWR_MASK; 
     123        txc->phy_control |= cpu_to_le32(power); 
     124@@ -419,8 +498,11 @@ int ar9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) 
     125        if (!urb) 
     126                goto free; 
     127  
     128+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) 
     129+       info->driver_data[0] = ar; 
     130+#else 
     131        info->rate_driver_data[0] = ar; 
     132- 
     133+#endif 
     134        usb_fill_bulk_urb(urb, ar->udev, 
     135                          usb_sndbulkpipe(ar->udev, AR9170_EP_TX), 
     136                          skb->data, skb->len, tx_urb_complete, skb); 
     137@@ -516,6 +598,32 @@ static void ar9170_op_remove_interface(struct ieee80211_hw *hw, 
     138        mutex_unlock(&ar->mutex); 
     139 } 
     140  
     141+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) 
     142+static int ar9170_op_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf) 
     143+{ 
     144+       struct ar9170 *ar = hw->priv; 
     145+       int err = 0; 
     146+ 
     147+       mutex_lock(&ar->mutex); 
     148+ 
     149+       err = ar9170_set_operating_mode(ar); 
     150+       if (err) 
     151+               goto out; 
     152+ 
     153+       err = ar9170_set_channel(ar, hw->conf.channel, 
     154+                                AR9170_RFI_NONE, AR9170_BW_20); 
     155+       if (err) 
     156+               goto out; 
     157+       /* adjust slot time for 5 GHz */ 
     158+       if (hw->conf.channel->band == IEEE80211_BAND_5GHZ) 
     159+               err = ar9170_write_reg(ar, AR9170_MAC_REG_SLOT_TIME, 
     160+                                              9 << 10); 
     161+ 
     162+ out: 
     163+       mutex_unlock(&ar->mutex); 
     164+       return err; 
     165+} 
     166+#else 
     167 static int ar9170_op_config(struct ieee80211_hw *hw, u32 changed) 
     168 { 
     169        struct ar9170 *ar = hw->priv; 
     170@@ -569,6 +677,7 @@ static int ar9170_op_config(struct ieee80211_hw *hw, u32 changed) 
     171  
     172        return err; 
     173 } 
     174+#endif /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) */ 
     175  
     176 static int ar9170_op_config_interface(struct ieee80211_hw *hw, 
     177                                      struct ieee80211_vif *vif, 
     178@@ -672,6 +781,7 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw, 
     179        queue_work(ar->hw->workqueue, &ar->filter_config_work); 
     180 } 
     181  
     182+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) 
     183 static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw, 
     184                                       struct ieee80211_vif *vif, 
     185                                       struct ieee80211_bss_conf *bss_conf, 
     186@@ -721,6 +831,7 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw, 
     187  
     188        WARN_ON(err); 
     189 } 
     190+#endif 
     191  
     192 static int ar9170_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 
     193                          const u8 *local_address, const u8 *address, 
     194@@ -842,7 +953,9 @@ static const struct ieee80211_ops ar9170_ops = { 
     195        .config                 = ar9170_op_config, 
     196        .config_interface       = ar9170_op_config_interface, 
     197        .configure_filter       = ar9170_op_configure_filter, 
     198+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) 
     199        .bss_info_changed       = ar9170_op_bss_info_changed, 
     200+#endif 
     201        .set_key                = ar9170_set_key, 
     202 }; 
     203