summaryrefslogtreecommitdiff
path: root/package/kernel/mac80211/patches/315-ssb-pick-PCMCIA-host-code-support-from-b43-driver.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/315-ssb-pick-PCMCIA-host-code-support-from-b43-driver.patch')
-rw-r--r--package/kernel/mac80211/patches/315-ssb-pick-PCMCIA-host-code-support-from-b43-driver.patch485
1 files changed, 0 insertions, 485 deletions
diff --git a/package/kernel/mac80211/patches/315-ssb-pick-PCMCIA-host-code-support-from-b43-driver.patch b/package/kernel/mac80211/patches/315-ssb-pick-PCMCIA-host-code-support-from-b43-driver.patch
deleted file mode 100644
index 64601dd..0000000
--- a/package/kernel/mac80211/patches/315-ssb-pick-PCMCIA-host-code-support-from-b43-driver.patch
+++ /dev/null
@@ -1,485 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Thu, 15 Oct 2015 07:23:25 +0200
-Subject: [PATCH] ssb: pick PCMCIA host code support from b43 driver
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-ssb bus can be found on various "host" devices like PCI/PCMCIA/SDIO.
-Every ssb bus contains cores AKA devices.
-The main idea is to have ssb driver scan/initialize bus and register
-ready-to-use cores. This way ssb drivers can operate on a single core
-mostly ignoring underlaying details.
-
-For some reason PCMCIA support was split between ssb and b43. We got
-PCMCIA host device probing in b43, then bus scanning in ssb and then
-wireless core probing back in b43. The truth is it's very unlikely we
-will ever see PCMCIA ssb device with no 802.11 core but I still don't
-see any advantage of the current architecture.
-
-With proposed change we get the same functionality with a simpler
-architecture, less Kconfig symbols, one killed EXPORT and hopefully
-cleaner b43. Since b43 supports both: ssb & bcma I prefer to keep ssb
-specific code in ssb driver.
-
-This mostly moves code from b43's pcmcia.c to bridge_pcmcia_80211.c. We
-already use similar solution with b43_pci_bridge.c. I didn't use "b43"
-in name of this new file as in theory any driver can operate on wireless
-core.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- delete mode 100644 drivers/net/wireless/b43/pcmcia.c
- delete mode 100644 drivers/net/wireless/b43/pcmcia.h
- create mode 100644 drivers/ssb/bridge_pcmcia_80211.c
-
---- a/drivers/net/wireless/b43/Kconfig
-+++ b/drivers/net/wireless/b43/Kconfig
-@@ -72,26 +72,6 @@ config B43_PCICORE_AUTOSELECT
- select SSB_DRIVER_PCICORE
- default y
-
--config B43_PCMCIA
-- bool "Broadcom 43xx PCMCIA device support"
-- depends on B43 && B43_SSB && SSB_PCMCIAHOST_POSSIBLE
-- select SSB_PCMCIAHOST
-- ---help---
-- Broadcom 43xx PCMCIA device support.
--
-- Support for 16bit PCMCIA devices.
-- Please note that most PC-CARD devices are _NOT_ 16bit PCMCIA
-- devices, but 32bit CardBUS devices. CardBUS devices are supported
-- out of the box by b43.
--
-- With this config option you can drive b43 cards in
-- CompactFlash formfactor in a PCMCIA adaptor.
-- CF b43 cards can sometimes be found in handheld PCs.
--
-- It's safe to select Y here, even if you don't have a B43 PCMCIA device.
--
-- If unsure, say N.
--
- config B43_SDIO
- bool "Broadcom 43xx SDIO device support"
- depends on B43 && B43_SSB && SSB_SDIOHOST_POSSIBLE
---- a/drivers/net/wireless/b43/Makefile
-+++ b/drivers/net/wireless/b43/Makefile
-@@ -21,7 +21,6 @@ b43-y += pio.o
- b43-y += rfkill.o
- b43-y += ppr.o
- b43-$(CPTCFG_B43_LEDS) += leds.o
--b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o
- b43-$(CPTCFG_B43_SDIO) += sdio.o
- b43-$(CPTCFG_B43_DEBUG) += debugfs.o
-
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -56,7 +56,6 @@
- #include "sysfs.h"
- #include "xmit.h"
- #include "lo.h"
--#include "pcmcia.h"
- #include "sdio.h"
- #include <linux/mmc/sdio_func.h>
-
-@@ -5850,12 +5849,9 @@ static int __init b43_init(void)
- int err;
-
- b43_debugfs_init();
-- err = b43_pcmcia_init();
-- if (err)
-- goto err_dfs_exit;
- err = b43_sdio_init();
- if (err)
-- goto err_pcmcia_exit;
-+ goto err_dfs_exit;
- #ifdef CPTCFG_B43_BCMA
- err = bcma_driver_register(&b43_bcma_driver);
- if (err)
-@@ -5878,8 +5874,6 @@ err_bcma_driver_exit:
- err_sdio_exit:
- #endif
- b43_sdio_exit();
--err_pcmcia_exit:
-- b43_pcmcia_exit();
- err_dfs_exit:
- b43_debugfs_exit();
- return err;
-@@ -5894,7 +5888,6 @@ static void __exit b43_exit(void)
- bcma_driver_unregister(&b43_bcma_driver);
- #endif
- b43_sdio_exit();
-- b43_pcmcia_exit();
- b43_debugfs_exit();
- }
-
---- a/drivers/net/wireless/b43/pcmcia.h
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#ifndef B43_PCMCIA_H_
--#define B43_PCMCIA_H_
--
--#ifdef CPTCFG_B43_PCMCIA
--
--int b43_pcmcia_init(void);
--void b43_pcmcia_exit(void);
--
--#else /* CPTCFG_B43_PCMCIA */
--
--static inline int b43_pcmcia_init(void)
--{
-- return 0;
--}
--static inline void b43_pcmcia_exit(void)
--{
--}
--
--#endif /* CPTCFG_B43_PCMCIA */
--#endif /* B43_PCMCIA_H_ */
---- a/drivers/ssb/Makefile
-+++ b/drivers/ssb/Makefile
-@@ -5,7 +5,7 @@ ssb-$(CPTCFG_SSB_SPROM) += sprom.o
-
- # host support
- ssb-$(CPTCFG_SSB_PCIHOST) += pci.o pcihost_wrapper.o
--ssb-$(CPTCFG_SSB_PCMCIAHOST) += pcmcia.o
-+ssb-$(CPTCFG_SSB_PCMCIAHOST) += pcmcia.o bridge_pcmcia_80211.o
- ssb-$(CPTCFG_SSB_SDIOHOST) += sdio.o
-
- # built-in drivers
---- /dev/null
-+++ b/drivers/ssb/bridge_pcmcia_80211.c
-@@ -0,0 +1,128 @@
-+/*
-+ * Broadcom 43xx PCMCIA-SSB bridge module
-+ *
-+ * Copyright (c) 2007 Michael Buesch <m@bues.ch>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include <linux/ssb/ssb.h>
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+
-+#include <pcmcia/cistpl.h>
-+#include <pcmcia/ciscode.h>
-+#include <pcmcia/ds.h>
-+#include <pcmcia/cisreg.h>
-+
-+#include "ssb_private.h"
-+
-+static const struct pcmcia_device_id ssb_host_pcmcia_tbl[] = {
-+ PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448),
-+ PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476),
-+ PCMCIA_DEVICE_NULL,
-+};
-+
-+MODULE_DEVICE_TABLE(pcmcia, ssb_host_pcmcia_tbl);
-+
-+static int ssb_host_pcmcia_probe(struct pcmcia_device *dev)
-+{
-+ struct ssb_bus *ssb;
-+ int err = -ENOMEM;
-+ int res = 0;
-+
-+ ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
-+ if (!ssb)
-+ goto out_error;
-+
-+ err = -ENODEV;
-+
-+ dev->config_flags |= CONF_ENABLE_IRQ;
-+
-+ dev->resource[2]->flags |= WIN_ENABLE | WIN_DATA_WIDTH_16 |
-+ WIN_USE_WAIT;
-+ dev->resource[2]->start = 0;
-+ dev->resource[2]->end = SSB_CORE_SIZE;
-+ res = pcmcia_request_window(dev, dev->resource[2], 250);
-+ if (res != 0)
-+ goto err_kfree_ssb;
-+
-+ res = pcmcia_map_mem_page(dev, dev->resource[2], 0);
-+ if (res != 0)
-+ goto err_disable;
-+
-+ if (!dev->irq)
-+ goto err_disable;
-+
-+ res = pcmcia_enable_device(dev);
-+ if (res != 0)
-+ goto err_disable;
-+
-+ err = ssb_bus_pcmciabus_register(ssb, dev, dev->resource[2]->start);
-+ if (err)
-+ goto err_disable;
-+ dev->priv = ssb;
-+
-+ return 0;
-+
-+err_disable:
-+ pcmcia_disable_device(dev);
-+err_kfree_ssb:
-+ kfree(ssb);
-+out_error:
-+ ssb_err("Initialization failed (%d, %d)\n", res, err);
-+ return err;
-+}
-+
-+static void ssb_host_pcmcia_remove(struct pcmcia_device *dev)
-+{
-+ struct ssb_bus *ssb = dev->priv;
-+
-+ ssb_bus_unregister(ssb);
-+ pcmcia_disable_device(dev);
-+ kfree(ssb);
-+ dev->priv = NULL;
-+}
-+
-+#ifdef CPTCFG_PM
-+static int ssb_host_pcmcia_suspend(struct pcmcia_device *dev)
-+{
-+ struct ssb_bus *ssb = dev->priv;
-+
-+ return ssb_bus_suspend(ssb);
-+}
-+
-+static int ssb_host_pcmcia_resume(struct pcmcia_device *dev)
-+{
-+ struct ssb_bus *ssb = dev->priv;
-+
-+ return ssb_bus_resume(ssb);
-+}
-+#else /* CPTCFG_PM */
-+# define ssb_host_pcmcia_suspend NULL
-+# define ssb_host_pcmcia_resume NULL
-+#endif /* CPTCFG_PM */
-+
-+static struct pcmcia_driver ssb_host_pcmcia_driver = {
-+ .owner = THIS_MODULE,
-+ .name = "ssb-pcmcia",
-+ .id_table = ssb_host_pcmcia_tbl,
-+ .probe = ssb_host_pcmcia_probe,
-+ .remove = ssb_host_pcmcia_remove,
-+ .suspend = ssb_host_pcmcia_suspend,
-+ .resume = ssb_host_pcmcia_resume,
-+};
-+
-+/*
-+ * These are not module init/exit functions!
-+ * The module_pcmcia_driver() helper cannot be used here.
-+ */
-+int ssb_host_pcmcia_init(void)
-+{
-+ return pcmcia_register_driver(&ssb_host_pcmcia_driver);
-+}
-+
-+void ssb_host_pcmcia_exit(void)
-+{
-+ pcmcia_unregister_driver(&ssb_host_pcmcia_driver);
-+}
---- a/drivers/ssb/main.c
-+++ b/drivers/ssb/main.c
-@@ -906,7 +906,6 @@ int ssb_bus_pcmciabus_register(struct ss
-
- return err;
- }
--EXPORT_SYMBOL(ssb_bus_pcmciabus_register);
- #endif /* CPTCFG_SSB_PCMCIAHOST */
-
- #ifdef CPTCFG_SSB_SDIOHOST
-@@ -1474,6 +1473,12 @@ static int __init ssb_modinit(void)
- /* don't fail SSB init because of this */
- err = 0;
- }
-+ err = ssb_host_pcmcia_init();
-+ if (err) {
-+ ssb_err("PCMCIA host initialization failed\n");
-+ /* don't fail SSB init because of this */
-+ err = 0;
-+ }
- err = ssb_gige_init();
- if (err) {
- ssb_err("SSB Broadcom Gigabit Ethernet driver initialization failed\n");
-@@ -1491,6 +1496,7 @@ fs_initcall(ssb_modinit);
- static void __exit ssb_modexit(void)
- {
- ssb_gige_exit();
-+ ssb_host_pcmcia_exit();
- b43_pci_ssb_bridge_exit();
- bus_unregister(&ssb_bustype);
- }
---- a/drivers/ssb/ssb_private.h
-+++ b/drivers/ssb/ssb_private.h
-@@ -94,6 +94,8 @@ extern int ssb_pcmcia_get_invariants(str
- extern int ssb_pcmcia_hardware_setup(struct ssb_bus *bus);
- extern void ssb_pcmcia_exit(struct ssb_bus *bus);
- extern int ssb_pcmcia_init(struct ssb_bus *bus);
-+extern int ssb_host_pcmcia_init(void);
-+extern void ssb_host_pcmcia_exit(void);
- extern const struct ssb_bus_ops ssb_pcmcia_ops;
- #else /* CPTCFG_SSB_PCMCIAHOST */
- static inline int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
-@@ -117,6 +119,13 @@ static inline int ssb_pcmcia_init(struct
- {
- return 0;
- }
-+static inline int ssb_host_pcmcia_init(void)
-+{
-+ return 0;
-+}
-+static inline void ssb_host_pcmcia_exit(void)
-+{
-+}
- #endif /* CPTCFG_SSB_PCMCIAHOST */
-
- /* sdio.c */
---- a/drivers/net/wireless/b43/pcmcia.c
-+++ /dev/null
-@@ -1,145 +0,0 @@
--/*
--
-- Broadcom B43 wireless driver
--
-- Copyright (c) 2007 Michael Buesch <m@bues.ch>
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; see the file COPYING. If not, write to
-- the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
-- Boston, MA 02110-1301, USA.
--
--*/
--
--#include "pcmcia.h"
--
--#include <linux/ssb/ssb.h>
--#include <linux/slab.h>
--#include <linux/module.h>
--
--#include <pcmcia/cistpl.h>
--#include <pcmcia/ciscode.h>
--#include <pcmcia/ds.h>
--#include <pcmcia/cisreg.h>
--
--
--static const struct pcmcia_device_id b43_pcmcia_tbl[] = {
-- PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448),
-- PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476),
-- PCMCIA_DEVICE_NULL,
--};
--
--MODULE_DEVICE_TABLE(pcmcia, b43_pcmcia_tbl);
--
--#ifdef CONFIG_PM
--static int b43_pcmcia_suspend(struct pcmcia_device *dev)
--{
-- struct ssb_bus *ssb = dev->priv;
--
-- return ssb_bus_suspend(ssb);
--}
--
--static int b43_pcmcia_resume(struct pcmcia_device *dev)
--{
-- struct ssb_bus *ssb = dev->priv;
--
-- return ssb_bus_resume(ssb);
--}
--#else /* CONFIG_PM */
--# define b43_pcmcia_suspend NULL
--# define b43_pcmcia_resume NULL
--#endif /* CONFIG_PM */
--
--static int b43_pcmcia_probe(struct pcmcia_device *dev)
--{
-- struct ssb_bus *ssb;
-- int err = -ENOMEM;
-- int res = 0;
--
-- ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
-- if (!ssb)
-- goto out_error;
--
-- err = -ENODEV;
--
-- dev->config_flags |= CONF_ENABLE_IRQ;
--
-- dev->resource[2]->flags |= WIN_ENABLE | WIN_DATA_WIDTH_16 |
-- WIN_USE_WAIT;
-- dev->resource[2]->start = 0;
-- dev->resource[2]->end = SSB_CORE_SIZE;
-- res = pcmcia_request_window(dev, dev->resource[2], 250);
-- if (res != 0)
-- goto err_kfree_ssb;
--
-- res = pcmcia_map_mem_page(dev, dev->resource[2], 0);
-- if (res != 0)
-- goto err_disable;
--
-- if (!dev->irq)
-- goto err_disable;
--
-- res = pcmcia_enable_device(dev);
-- if (res != 0)
-- goto err_disable;
--
-- err = ssb_bus_pcmciabus_register(ssb, dev, dev->resource[2]->start);
-- if (err)
-- goto err_disable;
-- dev->priv = ssb;
--
-- return 0;
--
--err_disable:
-- pcmcia_disable_device(dev);
--err_kfree_ssb:
-- kfree(ssb);
--out_error:
-- printk(KERN_ERR "b43-pcmcia: Initialization failed (%d, %d)\n",
-- res, err);
-- return err;
--}
--
--static void b43_pcmcia_remove(struct pcmcia_device *dev)
--{
-- struct ssb_bus *ssb = dev->priv;
--
-- ssb_bus_unregister(ssb);
-- pcmcia_disable_device(dev);
-- kfree(ssb);
-- dev->priv = NULL;
--}
--
--static struct pcmcia_driver b43_pcmcia_driver = {
-- .owner = THIS_MODULE,
-- .name = "b43-pcmcia",
-- .id_table = b43_pcmcia_tbl,
-- .probe = b43_pcmcia_probe,
-- .remove = b43_pcmcia_remove,
-- .suspend = b43_pcmcia_suspend,
-- .resume = b43_pcmcia_resume,
--};
--
--/*
-- * These are not module init/exit functions!
-- * The module_pcmcia_driver() helper cannot be used here.
-- */
--int b43_pcmcia_init(void)
--{
-- return pcmcia_register_driver(&b43_pcmcia_driver);
--}
--
--void b43_pcmcia_exit(void)
--{
-- pcmcia_unregister_driver(&b43_pcmcia_driver);
--}