From dfc16895b91a25a81e207ad658404bc49d25fee2 Mon Sep 17 00:00:00 2001
From: Kevin Mihelich <kevin@plugapps.com>
Date: Sun, 6 Feb 2011 13:38:16 -0500
Subject: [PATCH] ndiswrapper and madwifi

---
 core/ndiswrapper/PKGBUILD            | 41 ++++++++++++
 core/ndiswrapper/kernel-2.6.35.patch | 98 ++++++++++++++++++++++++++++
 core/ndiswrapper/kernel-2.6.36.patch | 27 ++++++++
 core/ndiswrapper/ndiswrapper.install | 23 +++++++
 extra/madwifi/PKGBUILD               | 45 +++++++++++++
 extra/madwifi/kernel-2.6.30.patch    | 14 ++++
 extra/madwifi/madwifi-ng.install     | 14 ++++
 7 files changed, 262 insertions(+)
 create mode 100644 core/ndiswrapper/PKGBUILD
 create mode 100644 core/ndiswrapper/kernel-2.6.35.patch
 create mode 100644 core/ndiswrapper/kernel-2.6.36.patch
 create mode 100644 core/ndiswrapper/ndiswrapper.install
 create mode 100644 extra/madwifi/PKGBUILD
 create mode 100644 extra/madwifi/kernel-2.6.30.patch
 create mode 100644 extra/madwifi/madwifi-ng.install

diff --git a/core/ndiswrapper/PKGBUILD b/core/ndiswrapper/PKGBUILD
new file mode 100644
index 000000000..4bdb4de52
--- /dev/null
+++ b/core/ndiswrapper/PKGBUILD
@@ -0,0 +1,41 @@
+#$Id: PKGBUILD 105330 2011-01-07 20:49:19Z tpowa $
+#Maintainer: Tobias Powalowski <tpowa@archlinux.org>
+
+# PlugApps: Kevin Mihelich <kevin@plugapps.com>
+#  - remove -ARCH from kernver
+
+plugrel=1
+
+pkgname=ndiswrapper
+_kernver=2.6.37
+pkgver=1.56
+pkgrel=7
+pkgdesc="Module for NDIS (Windows Network Drivers) drivers supplied by vendors. For stock arch 2.6 kernel."
+license=('GPL')
+arch=(i686 x86_64)
+url="http://ndiswrapper.sourceforge.net"
+install="ndiswrapper.install"
+depends=("ndiswrapper-utils=$pkgver" 'kernel26>=2.6.37' 'kernel26<2.6.38')
+makedepends=('kernel26-headers>=2.6.37' 'kernel26-headers<2.6.38')
+source=(http://downloads.sourceforge.net/sourceforge/ndiswrapper/ndiswrapper-$pkgver.tar.gz
+        kernel-2.6.35.patch
+        kernel-2.6.36.patch)
+build()
+{
+  cd $srcdir/ndiswrapper-$pkgver/driver
+  patch -Np2 -i $startdir/kernel-2.6.35.patch
+  patch -Np2 -i $startdir/kernel-2.6.36.patch
+  make KVERS=$_kernver
+  make DESTDIR=$pkgdir KVERS=$_kernver install
+  rm $pkgdir/lib/modules/$_kernver/modules.* #wtf?
+
+  sed -i -e "s/KERNEL_VERSION='.*'/KERNEL_VERSION='${_kernver}'/" $startdir/*.install
+  # move it to correct kernel directory
+  mkdir -p $pkgdir/lib/modules/$_kernver/kernel/drivers/net/wireless/ndiswrapper
+  mv $pkgdir/lib/modules/$_kernver/misc/* $pkgdir/lib/modules/$_kernver/kernel/drivers/net/wireless/ndiswrapper/
+  rm -r $pkgdir/lib/modules/$_kernver/misc/
+}
+
+md5sums=('1431f7ed5f8e92e752d330bbb3aed333'
+         '0a03d613b1fd545a75c5dd1a7c2aaec4'
+         'cc16ed13449f17e90865df688b180b2c')
diff --git a/core/ndiswrapper/kernel-2.6.35.patch b/core/ndiswrapper/kernel-2.6.35.patch
new file mode 100644
index 000000000..1cfdab2d0
--- /dev/null
+++ b/core/ndiswrapper/kernel-2.6.35.patch
@@ -0,0 +1,98 @@
+diff -uNr ndiswrapper-1.56.old/driver/usb.c ndiswrapper-1.56/driver/usb.c
+--- ndiswrapper-1.56.old/driver/usb.c	2010-02-10 18:09:32.000000000 -0800
++++ ndiswrapper-1.56/driver/usb.c	2010-07-25 02:29:25.442145846 -0700
+@@ -191,9 +191,15 @@
+ 	if (wrap_urb->flags & WRAP_URB_COPY_BUFFER) {
+ 		USBTRACE("freeing DMA buffer for URB: %p %p",
+ 			 urb, urb->transfer_buffer);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
+ 		usb_buffer_free(IRP_WRAP_DEVICE(irp)->usb.udev,
++                                urb->transfer_buffer_length,
++                                urb->transfer_buffer, urb->transfer_dma);
++#else
++		usb_free_coherent(IRP_WRAP_DEVICE(irp)->usb.udev,
+ 				urb->transfer_buffer_length,
+ 				urb->transfer_buffer, urb->transfer_dma);
++#endif
+ 	}
+ 	if (urb->setup_packet)
+ 		kfree(urb->setup_packet);
+@@ -303,9 +309,16 @@
+ 			       || PageHighMem(virt_to_page(buf))
+ #endif
+ 		    )) {
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
+ 		urb->transfer_buffer =
+-			usb_buffer_alloc(wd->usb.udev, buf_len, alloc_flags,
++                        usb_buffer_alloc(wd->usb.udev, buf_len, alloc_flags,
++                                         &urb->transfer_dma);
++#else
++		urb->transfer_buffer =
++			usb_alloc_coherent(wd->usb.udev, buf_len, alloc_flags,
+ 					 &urb->transfer_dma);
++#endif
+ 		if (!urb->transfer_buffer) {
+ 			WARNING("couldn't allocate dma buf");
+ 			IoAcquireCancelSpinLock(&irp->cancel_irql);
+diff -uNr ndiswrapper-1.56.old/driver/wrapndis.c ndiswrapper-1.56/driver/wrapndis.c
+--- ndiswrapper-1.56.old/driver/wrapndis.c	2010-02-10 18:09:32.000000000 -0800
++++ ndiswrapper-1.56/driver/wrapndis.c	2010-07-25 02:06:13.184631757 -0700
+@@ -936,6 +936,10 @@
+ 	EXIT2(return);
+ }
+ 
++#ifndef netdev_mc_count
++#define netdev_mc_count(net_dev) net_dev->mc_count
++#endif
++
+ static void set_multicast_list(struct ndis_device *wnd)
+ {
+ 	struct net_device *net_dev;
+@@ -950,20 +954,26 @@
+ 		packet_filter |= NDIS_PACKET_TYPE_PROMISCUOUS |
+ 			NDIS_PACKET_TYPE_ALL_LOCAL;
+ 	} else if (net_dev->flags & IFF_ALLMULTI ||
+-		   net_dev->mc_count > wnd->multicast_size) {
++		   netdev_mc_count(net_dev) > wnd->multicast_size) {
+ 		packet_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
+ 		TRACE2("0x%08x", packet_filter);
+-	} else if (net_dev->mc_count > 0) {
++	} else if (netdev_mc_count(net_dev) > 0) {
+ 		int i, size;
+ 		char *buf;
++#ifndef netdev_for_each_mc_addr
+ 		struct dev_mc_list *mclist;
+-		size = min(wnd->multicast_size, net_dev->mc_count);
+-		TRACE2("%d, %d", wnd->multicast_size, net_dev->mc_count);
++#else
++		struct netdev_hw_addr *mclist;
++#endif
++
++		size = min(wnd->multicast_size, netdev_mc_count(net_dev));
++		TRACE2("%d, %d", wnd->multicast_size, netdev_mc_count(net_dev));
+ 		buf = kmalloc(size * ETH_ALEN, GFP_KERNEL);
+ 		if (!buf) {
+ 			WARNING("couldn't allocate memory");
+ 			EXIT2(return);
+ 		}
++#ifndef netdev_for_each_mc_addr
+ 		mclist = net_dev->mc_list;
+ 		for (i = 0; i < size && mclist; mclist = mclist->next) {
+ 			if (mclist->dmi_addrlen != ETH_ALEN)
+@@ -972,6 +982,15 @@
+ 			TRACE2(MACSTRSEP, MAC2STR(mclist->dmi_addr));
+ 			i++;
+ 		}
++#else
++		i = 0;
++		netdev_for_each_mc_addr(mclist, net_dev){
++                        memcpy(buf + i++ * ETH_ALEN,
++                               mclist->addr, ETH_ALEN);
++                        TRACE2(MACSTRSEP, MAC2STR(mclist->addr));
++
++		}
++#endif
+ 		res = mp_set(wnd, OID_802_3_MULTICAST_LIST, buf, i * ETH_ALEN);
+ 		if (res == NDIS_STATUS_SUCCESS && i > 0)
+ 			packet_filter |= NDIS_PACKET_TYPE_MULTICAST;
diff --git a/core/ndiswrapper/kernel-2.6.36.patch b/core/ndiswrapper/kernel-2.6.36.patch
new file mode 100644
index 000000000..63de30308
--- /dev/null
+++ b/core/ndiswrapper/kernel-2.6.36.patch
@@ -0,0 +1,27 @@
+--- ndiswrapper-1.56.orig/driver/loader.c	2010-02-11 03:09:32.000000000 +0100
++++ ndiswrapper-1.56/driver/loader.c	2010-10-24 01:38:13.000000000 +0200
+@@ -750,13 +750,13 @@
+ }
+ 
+ /* called with loader_mutex is down */
+-static int wrapper_ioctl(struct inode *inode, struct file *file,
++static long wrapper_unlocked_ioctl(struct file *file,
+ 			 unsigned int cmd, unsigned long arg)
+ {
+ 	struct load_driver *load_driver;
+ 	struct load_device load_device;
+ 	struct load_driver_file load_bin_file;
+-	int ret;
++	long ret;
+ 	void __user *addr = (void __user *)arg;
+ 
+ 	ENTER1("cmd: %u", cmd);
+@@ -831,7 +831,7 @@
+ 
+ static struct file_operations wrapper_fops = {
+ 	.owner          = THIS_MODULE,
+-	.ioctl		= wrapper_ioctl,
++	.unlocked_ioctl	= wrapper_unlocked_ioctl,
+ 	.release	= wrapper_ioctl_release,
+ };
+ 
diff --git a/core/ndiswrapper/ndiswrapper.install b/core/ndiswrapper/ndiswrapper.install
new file mode 100644
index 000000000..a0a5acafc
--- /dev/null
+++ b/core/ndiswrapper/ndiswrapper.install
@@ -0,0 +1,23 @@
+# arg 1:  the new package version
+post_install()
+{
+  ndiswrapper -m
+  KERNEL_VERSION='2.6.37-ARCH'
+  depmod -ae $KERNEL_VERSION > /dev/null 2>&1 
+}
+
+# arg 1:  the new package version
+# arg 2:  the old package version
+post_upgrade()
+{
+  ndiswrapper -m
+  KERNEL_VERSION='2.6.37-ARCH'
+  depmod -ae $KERNEL_VERSION > /dev/null 2>&1 
+}
+
+# arg 1:  the old package version
+post_remove()
+{
+  KERNEL_VERSION='2.6.37-ARCH'
+  depmod -ae $KERNEL_VERSION > /dev/null 2>&1
+}
diff --git a/extra/madwifi/PKGBUILD b/extra/madwifi/PKGBUILD
new file mode 100644
index 000000000..6b839b9a0
--- /dev/null
+++ b/extra/madwifi/PKGBUILD
@@ -0,0 +1,45 @@
+# $Id: PKGBUILD 105333 2011-01-07 20:54:16Z tpowa $
+# Originally by kleptophobiac <kleptophobiac@gmail.com>
+# Modified by James Rayner for the repositories <iphitus@gmail.com>
+
+# PlugApps: Kevin Mihelich <kevin@plugapps.com>
+#  - remove -ARCH from kernver
+
+plugrel=1
+
+_kernver=2.6.37
+
+pkgname=madwifi
+pkgver=0.9.4.4133
+pkgrel=4
+pkgdesc="Madwifi drivers for Atheros wireless chipsets. For stock arch 2.6 kernel"
+arch=(i686 x86_64)
+license=('GPL')
+url="http://madwifi-project.org"
+depends=('madwifi-utils' 'kernel26>=2.6.37' 'kernel26<2.6.38')
+makedepends=('kernel26-headers>=2.6.37' 'kernel26-headers<2.6.38')
+makedepends=('sharutils')
+install=madwifi-ng.install
+# subversion source: svn checkout http:/madwifi-project.org/svn/madwifi/trunk madwifi
+source=(ftp://ftp.archlinux.org/other/madwifi/madwifi-${pkgver}.tar.bz2
+	#http://downloads.sourceforge.net/madwifi/madwifi-${pkgver}.tar.gz
+	)
+
+build() {
+  [ "${CARCH}" = "i686" ] && export ARCH=i386
+
+  #cd $startdir/src/$pkgname-$pkgver
+  cd $startdir/src/$pkgname
+  sed -i -e 's/-Werror//g' Makefile.inc
+  make KERNELPATH=/lib/modules/$_kernver/build KERNELRELEASE=$_kernver modules|| return 1
+  make KERNELPATH=/lib/modules/$_kernver/build KERNELRELEASE=$_kernver modules \
+       DESTDIR=$startdir/pkg KERNELRELEASE=$_kernver install-modules
+  sed -i -e "s/KERNEL_VERSION='.*'/KERNEL_VERSION='${_kernver}'/" $startdir/*.install
+
+  # install to wireless kernel directory
+  mkdir -p $startdir/pkg/lib/modules/$_kernver/kernel/drivers/net/wireless/madwifi
+  mv $startdir/pkg/lib/modules/$_kernver/net/* $startdir/pkg/lib/modules/$_kernver/kernel/drivers/net/wireless/madwifi
+  rm -r $startdir/pkg/lib/modules/$_kernver/net/
+}
+
+md5sums=('ca3c3504d000e7b3d7063af46271c932')
diff --git a/extra/madwifi/kernel-2.6.30.patch b/extra/madwifi/kernel-2.6.30.patch
new file mode 100644
index 000000000..f844668de
--- /dev/null
+++ b/extra/madwifi/kernel-2.6.30.patch
@@ -0,0 +1,14 @@
+--- ath/if_athvar.h~	2009-06-13 09:38:53.000000000 +0200
++++ ath/if_athvar.h	2009-06-13 09:38:53.000000000 +0200
+@@ -103,11 +103,6 @@
+ /*
+  * Guess how the interrupt handler should work.
+  */
+-#if !defined(IRQ_NONE)
+-typedef void irqreturn_t;
+-#define	IRQ_NONE
+-#define	IRQ_HANDLED
+-#endif /* !defined(IRQ_NONE) */
+ 
+ #ifndef SET_MODULE_OWNER
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
diff --git a/extra/madwifi/madwifi-ng.install b/extra/madwifi/madwifi-ng.install
new file mode 100644
index 000000000..a6dfd6568
--- /dev/null
+++ b/extra/madwifi/madwifi-ng.install
@@ -0,0 +1,14 @@
+post_install() {
+  KERNEL_VERSION='2.6.37-ARCH'
+  depmod -ae $KERNEL_VERSION > /dev/null 2>&1
+}
+
+post_upgrade() {
+  KERNEL_VERSION='2.6.37-ARCH'
+  depmod -ae $KERNEL_VERSION > /dev/null 2>&1
+}
+
+post_remove() {
+  KERNEL_VERSION='2.6.37-ARCH'
+  depmod -ae $KERNEL_VERSION > /dev/null 2>&1
+}