Re: [PATCH] b43: Add Soft-MAC SDIO device support
On Thursday 10 September 2009 23:23:19 Gábor Stefanik wrote: On Thu, Sep 10, 2009 at 7:34 PM, Michael Buesch m...@bu3sch.de wrote: From: Albert Herranz albert_herr...@yahoo.es This adds support for Soft-MAC SDIO devices to b43. The driver still lacks some fixes for SDIO devices, so it's currently marked as BROKEN. Is it actually completely broken; or already testable, just incomplete? incomplete -- Greetings, Michael. ___ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
[PATCH] b43: Add Soft-MAC SDIO device support
From: Albert Herranz albert_herr...@yahoo.es This adds support for Soft-MAC SDIO devices to b43. The driver still lacks some fixes for SDIO devices, so it's currently marked as BROKEN. Signed-off-by: Albert Herranz albert_herr...@yahoo.es Signed-off-by: Michael Buesch m...@bu3sch.de --- Depends on the SSB SDIO patch. Index: wireless-testing/drivers/net/wireless/b43/Kconfig === --- wireless-testing.orig/drivers/net/wireless/b43/Kconfig 2009-09-10 19:23:09.0 +0200 +++ wireless-testing/drivers/net/wireless/b43/Kconfig 2009-09-10 19:33:24.0 +0200 @@ -61,11 +61,28 @@ config B43_PCMCIA If unsure, say N. +config B43_SDIO + bool Broadcom 43xx SDIO device support (EXPERIMENTAL) + depends on B43 SSB_SDIOHOST_POSSIBLE EXPERIMENTAL BROKEN + select SSB_SDIOHOST + ---help--- + Broadcom 43xx device support for Soft-MAC SDIO devices. + + With this config option you can drive Soft-MAC b43 cards with a + Secure Digital I/O interface. + This includes the WLAN daughter card found on the Nintendo Wii + video game console. + Note that this does not support Broadcom 43xx Full-MAC devices. + + It's safe to select Y here, even if you don't have a B43 SDIO device. + + If unsure, say N. + # Data transfers to the device via PIO -# This is only needed on PCMCIA devices. All others can do DMA properly. +# This is only needed on PCMCIA and SDIO devices. All others can do DMA properly. config B43_PIO bool - depends on B43 (B43_PCMCIA || B43_FORCE_PIO) + depends on B43 (B43_SDIO || B43_PCMCIA || B43_FORCE_PIO) select SSB_BLOCKIO default y Index: wireless-testing/drivers/net/wireless/b43/Makefile === --- wireless-testing.orig/drivers/net/wireless/b43/Makefile 2009-09-10 19:23:09.0 +0200 +++ wireless-testing/drivers/net/wireless/b43/Makefile 2009-09-10 19:23:20.0 +0200 @@ -16,6 +16,7 @@ b43-$(CONFIG_B43_PIO) += pio.o b43-y += rfkill.o b43-$(CONFIG_B43_LEDS) += leds.o b43-$(CONFIG_B43_PCMCIA) += pcmcia.o +b43-$(CONFIG_B43_SDIO) += sdio.o b43-$(CONFIG_B43_DEBUG)+= debugfs.o obj-$(CONFIG_B43) += b43.o Index: wireless-testing/drivers/net/wireless/b43/main.c === --- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-09-10 19:23:09.0 +0200 +++ wireless-testing/drivers/net/wireless/b43/main.c2009-09-10 19:23:20.0 +0200 @@ -8,6 +8,9 @@ Copyright (c) 2005 Danny van Dyk kugelf...@gentoo.org Copyright (c) 2005 Andreas Jaggi andreas.ja...@waterwave.ch + SDIO support + Copyright (c) 2009 Albert Herranz albert_herr...@yahoo.es + Some parts of the code in this file are derived from the ipw2200 driver Copyright(c) 2003 - 2004 Intel Corporation. @@ -53,6 +56,8 @@ #include xmit.h #include lo.h #include pcmcia.h +#include sdio.h +#include linux/mmc/sdio_func.h MODULE_DESCRIPTION(Broadcom B43 wireless driver); MODULE_AUTHOR(Martin Langer); @@ -1587,7 +1592,7 @@ static void b43_beacon_update_trigger_wo mutex_lock(wl-mutex); dev = wl-current_dev; if (likely(dev (b43_status(dev) = B43_STAT_INITIALIZED))) { - if (0 /*FIXME dev-dev-bus-bustype == SSB_BUSTYPE_SDIO*/) { + if (dev-dev-bus-bustype == SSB_BUSTYPE_SDIO) { /* wl-mutex is enough. */ b43_do_beacon_update_trigger_work(dev); mmiowb(); @@ -1905,6 +1910,27 @@ static irqreturn_t b43_interrupt_handler return ret; } +/* SDIO interrupt handler. This runs in process context. */ +static void b43_sdio_interrupt_handler(struct b43_wldev *dev) +{ + struct b43_wl *wl = dev-wl; + struct sdio_func *func = dev-dev-bus-host_sdio; + irqreturn_t ret; + + if (unlikely(b43_status(dev) B43_STAT_STARTED)) + return; + + mutex_lock(wl-mutex); + sdio_release_host(func); + + ret = b43_do_interrupt(dev); + if (ret == IRQ_WAKE_THREAD) + b43_do_interrupt_thread(dev); + + sdio_claim_host(func); + mutex_unlock(wl-mutex); +} + void b43_do_release_fw(struct b43_firmware_file *fw) { release_firmware(fw-data); @@ -3828,7 +3854,7 @@ redo: /* Disable interrupts on the device. */ b43_set_status(dev, B43_STAT_INITIALIZED); - if (0 /*FIXME dev-dev-bus-bustype == SSB_BUSTYPE_SDIO*/) { + if (dev-dev-bus-bustype == SSB_BUSTYPE_SDIO) { /* wl-mutex is locked. That is enough. */ b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0); b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */ @@ -3858,7 +3884,10 @@ redo:
Re: [PATCH] b43: Add Soft-MAC SDIO device support
On Thu, Sep 10, 2009 at 7:34 PM, Michael Buesch m...@bu3sch.de wrote: From: Albert Herranz albert_herr...@yahoo.es This adds support for Soft-MAC SDIO devices to b43. The driver still lacks some fixes for SDIO devices, so it's currently marked as BROKEN. Is it actually completely broken; or already testable, just incomplete? Signed-off-by: Albert Herranz albert_herr...@yahoo.es Signed-off-by: Michael Buesch m...@bu3sch.de --- Depends on the SSB SDIO patch. Index: wireless-testing/drivers/net/wireless/b43/Kconfig === --- wireless-testing.orig/drivers/net/wireless/b43/Kconfig 2009-09-10 19:23:09.0 +0200 +++ wireless-testing/drivers/net/wireless/b43/Kconfig 2009-09-10 19:33:24.0 +0200 @@ -61,11 +61,28 @@ config B43_PCMCIA If unsure, say N. +config B43_SDIO + bool Broadcom 43xx SDIO device support (EXPERIMENTAL) + depends on B43 SSB_SDIOHOST_POSSIBLE EXPERIMENTAL BROKEN + select SSB_SDIOHOST + ---help--- + Broadcom 43xx device support for Soft-MAC SDIO devices. + + With this config option you can drive Soft-MAC b43 cards with a + Secure Digital I/O interface. + This includes the WLAN daughter card found on the Nintendo Wii + video game console. + Note that this does not support Broadcom 43xx Full-MAC devices. + + It's safe to select Y here, even if you don't have a B43 SDIO device. + + If unsure, say N. + # Data transfers to the device via PIO -# This is only needed on PCMCIA devices. All others can do DMA properly. +# This is only needed on PCMCIA and SDIO devices. All others can do DMA properly. config B43_PIO bool - depends on B43 (B43_PCMCIA || B43_FORCE_PIO) + depends on B43 (B43_SDIO || B43_PCMCIA || B43_FORCE_PIO) select SSB_BLOCKIO default y Index: wireless-testing/drivers/net/wireless/b43/Makefile === --- wireless-testing.orig/drivers/net/wireless/b43/Makefile 2009-09-10 19:23:09.0 +0200 +++ wireless-testing/drivers/net/wireless/b43/Makefile 2009-09-10 19:23:20.0 +0200 @@ -16,6 +16,7 @@ b43-$(CONFIG_B43_PIO) += pio.o b43-y += rfkill.o b43-$(CONFIG_B43_LEDS) += leds.o b43-$(CONFIG_B43_PCMCIA) += pcmcia.o +b43-$(CONFIG_B43_SDIO) += sdio.o b43-$(CONFIG_B43_DEBUG) += debugfs.o obj-$(CONFIG_B43) += b43.o Index: wireless-testing/drivers/net/wireless/b43/main.c === --- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-09-10 19:23:09.0 +0200 +++ wireless-testing/drivers/net/wireless/b43/main.c 2009-09-10 19:23:20.0 +0200 @@ -8,6 +8,9 @@ Copyright (c) 2005 Danny van Dyk kugelf...@gentoo.org Copyright (c) 2005 Andreas Jaggi andreas.ja...@waterwave.ch + SDIO support + Copyright (c) 2009 Albert Herranz albert_herr...@yahoo.es + Some parts of the code in this file are derived from the ipw2200 driver Copyright(c) 2003 - 2004 Intel Corporation. @@ -53,6 +56,8 @@ #include xmit.h #include lo.h #include pcmcia.h +#include sdio.h +#include linux/mmc/sdio_func.h MODULE_DESCRIPTION(Broadcom B43 wireless driver); MODULE_AUTHOR(Martin Langer); @@ -1587,7 +1592,7 @@ static void b43_beacon_update_trigger_wo mutex_lock(wl-mutex); dev = wl-current_dev; if (likely(dev (b43_status(dev) = B43_STAT_INITIALIZED))) { - if (0 /*FIXME dev-dev-bus-bustype == SSB_BUSTYPE_SDIO*/) { + if (dev-dev-bus-bustype == SSB_BUSTYPE_SDIO) { /* wl-mutex is enough. */ b43_do_beacon_update_trigger_work(dev); mmiowb(); @@ -1905,6 +1910,27 @@ static irqreturn_t b43_interrupt_handler return ret; } +/* SDIO interrupt handler. This runs in process context. */ +static void b43_sdio_interrupt_handler(struct b43_wldev *dev) +{ + struct b43_wl *wl = dev-wl; + struct sdio_func *func = dev-dev-bus-host_sdio; + irqreturn_t ret; + + if (unlikely(b43_status(dev) B43_STAT_STARTED)) + return; + + mutex_lock(wl-mutex); + sdio_release_host(func); + + ret = b43_do_interrupt(dev); + if (ret == IRQ_WAKE_THREAD) + b43_do_interrupt_thread(dev); + + sdio_claim_host(func); + mutex_unlock(wl-mutex); +} + void b43_do_release_fw(struct b43_firmware_file *fw) { release_firmware(fw-data); @@ -3828,7 +3854,7 @@ redo: /* Disable interrupts on the device. */ b43_set_status(dev, B43_STAT_INITIALIZED); - if (0 /*FIXME dev-dev-bus-bustype == SSB_BUSTYPE_SDIO*/) { + if (dev-dev-bus-bustype ==