diff options
author | Evgeny Egorochkin <phreedom@yandex.ru> | 2013-09-26 11:42:21 +0300 |
---|---|---|
committer | Evgeny Egorochkin <phreedom@yandex.ru> | 2013-09-26 11:44:01 +0300 |
commit | 0072786c84beef130412f873e987b46e33f68755 (patch) | |
tree | 21e9802be8107670f7235066390e58f4f277e9b4 /pkgs/os-specific/linux | |
parent | 8f7545c45b0f48313e122fef16de4a5900b9cb7e (diff) |
broadcom-sta driver: packaged 6.* branch. In theory it is supposed to supercede 5.* but we'll test and
see.
Diffstat (limited to 'pkgs/os-specific/linux')
-rw-r--r-- | pkgs/os-specific/linux/broadcom-sta-v6/default.nix | 49 | ||||
-rw-r--r-- | pkgs/os-specific/linux/broadcom-sta-v6/license.patch | 13 | ||||
-rw-r--r-- | pkgs/os-specific/linux/broadcom-sta-v6/linux-recent.patch | 126 |
3 files changed, 188 insertions, 0 deletions
diff --git a/pkgs/os-specific/linux/broadcom-sta-v6/default.nix b/pkgs/os-specific/linux/broadcom-sta-v6/default.nix new file mode 100644 index 0000000000000..db4337c0ff287 --- /dev/null +++ b/pkgs/os-specific/linux/broadcom-sta-v6/default.nix @@ -0,0 +1,49 @@ +{ stdenv, fetchurl, kernelDev }: +let + version = "6_30_223_141"; +in +stdenv.mkDerivation { + name = "broadcom-sta-${version}-${kernelDev.version}"; + + src = if stdenv.system == "i686-linux" then ( + fetchurl { + url = "http://www.broadcom.com/docs/linux_sta/hybrid-v35-nodebug-pcoem-${version}.tar.gz"; + sha256 = "19wra62dpm0x0byksh871yxr128b4v13kzkzqv56igjfpzv36z6m"; + } ) else ( + fetchurl { + url = "http://www.broadcom.com/docs/linux_sta/hybrid-v35_64-nodebug-pcoem-${version}.tar.gz"; + sha256 = "0jlvch7d3khmmg5kp80x4ka33hidj8yykqjcqq6j56z2g6wb4dsz"; + } + ); + + buildInputs = [ kernelDev ]; + patches = [ + ./linux-recent.patch + ./license.patch + ]; + + makeFlags = "KBASE=${kernelDev}/lib/modules/${kernelDev.modDirVersion}"; + + unpackPhase = '' + sourceRoot=broadcom-sta + mkdir "$sourceRoot" + tar xvf "$src" -C "$sourceRoot" + ''; + + installPhase = + '' + binDir="$out/lib/modules/${kernelDev.modDirVersion}/kernel/net/wireless/" + docDir="$out/share/doc/broadcom-sta/" + mkdir -p "$binDir" "$docDir" + cp wl.ko "$binDir" + cp lib/LICENSE.txt "$docDir" + ''; + + meta = { + description = "Kernel module driver for some Broadcom's wireless cards"; + homepage = http://www.broadcom.com/support/802.11/linux_sta.php; + license = "unfree-redistributable"; + maintainers = with stdenv.lib.maintainers; [ phreedom vcunat ]; + platforms = stdenv.lib.platforms.linux; + }; +} diff --git a/pkgs/os-specific/linux/broadcom-sta-v6/license.patch b/pkgs/os-specific/linux/broadcom-sta-v6/license.patch new file mode 100644 index 0000000000000..aebb463651959 --- /dev/null +++ b/pkgs/os-specific/linux/broadcom-sta-v6/license.patch @@ -0,0 +1,13 @@ +diff -Naur hybrid-portsrc-x86_32-v5_10_91_9.orig/src/wl/sys/wl_linux.c hybrid-portsrc-x86_32-v5_10_91_9/src/wl/sys/wl_linux.c +--- hybrid-portsrc-x86_32-v5_10_91_9.orig/src/wl/sys/wl_linux.c 2009-04-23 02:48:59.000000000 +0900 ++++ hybrid-portsrc-x86_32-v5_10_91_9/src/wl/sys/wl_linux.c 2009-05-08 00:48:20.000000000 +0900 +@@ -171,6 +171,8 @@ + static void wl_free_if(wl_info_t *wl, wl_if_t *wlif); + static void wl_get_driver_info(struct net_device *dev, struct ethtool_drvinfo *info); + ++MODULE_LICENSE("MIXED/Proprietary"); ++ + #if defined(WL_CONFIG_RFKILL) + #include <linux/rfkill.h> + static int wl_init_rfkill(wl_info_t *wl); + diff --git a/pkgs/os-specific/linux/broadcom-sta-v6/linux-recent.patch b/pkgs/os-specific/linux/broadcom-sta-v6/linux-recent.patch new file mode 100644 index 0000000000000..97a331a2bd739 --- /dev/null +++ b/pkgs/os-specific/linux/broadcom-sta-v6/linux-recent.patch @@ -0,0 +1,126 @@ +--- a/src/wl/sys/wl_linux.c 2013-08-01 08:52:22.000000000 +0200 ++++ b/src/wl/sys/wl_linux.c 2013-09-13 14:25:36.463020788 +0200 +@@ -910,7 +910,11 @@ + pci_set_drvdata(pdev, NULL); + } + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) + static struct pci_driver wl_pci_driver = { ++#else ++static struct pci_driver wl_pci_driver __refdata = { ++#endif + name: "wl", + probe: wl_pci_probe, + suspend: wl_suspend, +@@ -3235,7 +3239,7 @@ + void + wl_tkip_printstats(wl_info_t *wl, bool group_key) + { +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) && LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) + char debug_buf[512]; + int idx; + if (wl->tkipmodops) { +@@ -3408,6 +3412,7 @@ + return 0; + } + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) + static int + wl_proc_read(char *buffer, char **start, off_t offset, int length, int *eof, void *data) + { +@@ -3462,19 +3467,90 @@ + return length; + } + ++#else ++ ++static int ++wl_proc_read(struct seq_file *seq, void *offset) ++{ ++ wl_info_t * wl = (wl_info_t *)seq->private; ++ int bcmerror, to_user; ++ ++ WL_LOCK(wl); ++ bcmerror = wlc_ioctl(wl->wlc, WLC_GET_MONITOR, &to_user, sizeof(int), NULL); ++ WL_UNLOCK(wl); ++ ++ seq_printf(seq, "%d\n", to_user); ++ return bcmerror; ++} ++ ++static ssize_t wl_proc_write(struct file *file, const char __user *buff, ++ size_t length, loff_t *ppos) ++{ ++ struct seq_file *seq = file->private_data; ++ wl_info_t * wl = (wl_info_t *)seq->private; ++ int bcmerror, from_user = 0; ++ ++ if (length != 1) { ++ WL_ERROR(("%s: Invalid data length\n", __FUNCTION__)); ++ return -EIO; ++ } ++ ++ if (copy_from_user(&from_user, buff, 1)) { ++ WL_ERROR(("%s: copy from user failed\n", __FUNCTION__)); ++ return -EFAULT; ++ } ++ ++ if (from_user >= 0x30) ++ from_user -= 0x30; ++ ++ WL_LOCK(wl); ++ bcmerror = wlc_ioctl(wl->wlc, WLC_SET_MONITOR, &from_user, sizeof(int), NULL); ++ WL_UNLOCK(wl); ++ ++ if (bcmerror < 0) { ++ WL_ERROR(("%s: SET_MONITOR failed with %d\n", __FUNCTION__, bcmerror)); ++ return -EIO; ++ } ++ *ppos += length; ++ return length; ++} ++ ++static int wl_proc_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, wl_proc_read, PDE_DATA(inode)); ++} ++ ++static const struct file_operations wl_proc_fops = { ++ .owner = THIS_MODULE, ++ .open = wl_proc_open, ++ .read = seq_read, ++ .write = wl_proc_write, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++#endif ++ + static int + wl_reg_proc_entry(wl_info_t *wl) + { + char tmp[32]; + sprintf(tmp, "%s%d", HYBRID_PROC, wl->pub->unit); +- if ((wl->proc_entry = create_proc_entry(tmp, 0644, NULL)) == NULL) { ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) ++ wl->proc_entry = create_proc_entry(tmp, 0644, NULL); ++ if (wl->proc_entry) { ++ wl->proc_entry->read_proc = wl_proc_read; ++ wl->proc_entry->write_proc = wl_proc_write; ++ wl->proc_entry->data = wl; ++ } ++#else ++ wl->proc_entry = proc_create_data(tmp, 0644, NULL, &wl_proc_fops, wl); ++#endif ++ if (!wl->proc_entry) { + WL_ERROR(("%s: create_proc_entry %s failed\n", __FUNCTION__, tmp)); + ASSERT(0); + return -1; + } +- wl->proc_entry->read_proc = wl_proc_read; +- wl->proc_entry->write_proc = wl_proc_write; +- wl->proc_entry->data = wl; + return 0; + } + #ifdef WLOFFLD |