diff options
| author | Rafał Miłecki <zajec5@gmail.com> | 2011-05-17 20:06:43 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2011-06-01 15:10:58 -0400 |
| commit | 24ca39d67968c42d377abc122f6dca635ebcdb79 (patch) | |
| tree | eed68c18adb198c5030e35e24aef5b9c4e623748 /drivers | |
| parent | 79d2232fed23e8e0d1b11abe2f9b78fb09084506 (diff) | |
b43: bus: abstract bus and core operations
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/wireless/b43/b43.h | 23 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/bus.c | 31 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/bus.h | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/main.c | 22 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/rfkill.c | 9 |
5 files changed, 77 insertions, 16 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 3378d93cc33d..0a3c7012901b 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -881,6 +881,29 @@ static inline enum ieee80211_band b43_current_band(struct b43_wl *wl) | |||
| 881 | return wl->hw->conf.channel->band; | 881 | return wl->hw->conf.channel->band; |
| 882 | } | 882 | } |
| 883 | 883 | ||
| 884 | static inline int b43_bus_may_powerdown(struct b43_wldev *wldev) | ||
| 885 | { | ||
| 886 | return wldev->dev->bus_may_powerdown(wldev->dev); | ||
| 887 | } | ||
| 888 | static inline int b43_bus_powerup(struct b43_wldev *wldev, bool dynamic_pctl) | ||
| 889 | { | ||
| 890 | return wldev->dev->bus_powerup(wldev->dev, dynamic_pctl); | ||
| 891 | } | ||
| 892 | static inline int b43_device_is_enabled(struct b43_wldev *wldev) | ||
| 893 | { | ||
| 894 | return wldev->dev->device_is_enabled(wldev->dev); | ||
| 895 | } | ||
| 896 | static inline void b43_device_enable(struct b43_wldev *wldev, | ||
| 897 | u32 core_specific_flags) | ||
| 898 | { | ||
| 899 | wldev->dev->device_enable(wldev->dev, core_specific_flags); | ||
| 900 | } | ||
| 901 | static inline void b43_device_disable(struct b43_wldev *wldev, | ||
| 902 | u32 core_specific_flags) | ||
| 903 | { | ||
| 904 | wldev->dev->device_disable(wldev->dev, core_specific_flags); | ||
| 905 | } | ||
| 906 | |||
| 884 | static inline u16 b43_read16(struct b43_wldev *dev, u16 offset) | 907 | static inline u16 b43_read16(struct b43_wldev *dev, u16 offset) |
| 885 | { | 908 | { |
| 886 | return dev->dev->read16(dev->dev, offset); | 909 | return dev->dev->read16(dev->dev, offset); |
diff --git a/drivers/net/wireless/b43/bus.c b/drivers/net/wireless/b43/bus.c index f897b7054a0a..6c63aecd6ab4 100644 --- a/drivers/net/wireless/b43/bus.c +++ b/drivers/net/wireless/b43/bus.c | |||
| @@ -25,6 +25,31 @@ | |||
| 25 | 25 | ||
| 26 | 26 | ||
| 27 | /* SSB */ | 27 | /* SSB */ |
| 28 | |||
| 29 | static inline int b43_bus_ssb_bus_may_powerdown(struct b43_bus_dev *dev) | ||
| 30 | { | ||
| 31 | return ssb_bus_may_powerdown(dev->sdev->bus); | ||
| 32 | } | ||
| 33 | static inline int b43_bus_ssb_bus_powerup(struct b43_bus_dev *dev, | ||
| 34 | bool dynamic_pctl) | ||
| 35 | { | ||
| 36 | return ssb_bus_powerup(dev->sdev->bus, dynamic_pctl); | ||
| 37 | } | ||
| 38 | static inline int b43_bus_ssb_device_is_enabled(struct b43_bus_dev *dev) | ||
| 39 | { | ||
| 40 | return ssb_device_is_enabled(dev->sdev); | ||
| 41 | } | ||
| 42 | static inline void b43_bus_ssb_device_enable(struct b43_bus_dev *dev, | ||
| 43 | u32 core_specific_flags) | ||
| 44 | { | ||
| 45 | ssb_device_enable(dev->sdev, core_specific_flags); | ||
| 46 | } | ||
| 47 | static inline void b43_bus_ssb_device_disable(struct b43_bus_dev *dev, | ||
| 48 | u32 core_specific_flags) | ||
| 49 | { | ||
| 50 | ssb_device_disable(dev->sdev, core_specific_flags); | ||
| 51 | } | ||
| 52 | |||
| 28 | static inline u16 b43_bus_ssb_read16(struct b43_bus_dev *dev, u16 offset) | 53 | static inline u16 b43_bus_ssb_read16(struct b43_bus_dev *dev, u16 offset) |
| 29 | { | 54 | { |
| 30 | return ssb_read16(dev->sdev, offset); | 55 | return ssb_read16(dev->sdev, offset); |
| @@ -63,6 +88,12 @@ struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev) | |||
| 63 | dev->bus_type = B43_BUS_SSB; | 88 | dev->bus_type = B43_BUS_SSB; |
| 64 | dev->sdev = sdev; | 89 | dev->sdev = sdev; |
| 65 | 90 | ||
| 91 | dev->bus_may_powerdown = b43_bus_ssb_bus_may_powerdown; | ||
| 92 | dev->bus_powerup = b43_bus_ssb_bus_powerup; | ||
| 93 | dev->device_is_enabled = b43_bus_ssb_device_is_enabled; | ||
| 94 | dev->device_enable = b43_bus_ssb_device_enable; | ||
| 95 | dev->device_disable = b43_bus_ssb_device_disable; | ||
| 96 | |||
| 66 | dev->read16 = b43_bus_ssb_read16; | 97 | dev->read16 = b43_bus_ssb_read16; |
| 67 | dev->read32 = b43_bus_ssb_read32; | 98 | dev->read32 = b43_bus_ssb_read32; |
| 68 | dev->write16 = b43_bus_ssb_write16; | 99 | dev->write16 = b43_bus_ssb_write16; |
diff --git a/drivers/net/wireless/b43/bus.h b/drivers/net/wireless/b43/bus.h index e88b4494beaa..fd88e2b121a0 100644 --- a/drivers/net/wireless/b43/bus.h +++ b/drivers/net/wireless/b43/bus.h | |||
| @@ -11,6 +11,14 @@ struct b43_bus_dev { | |||
| 11 | struct ssb_device *sdev; | 11 | struct ssb_device *sdev; |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | int (*bus_may_powerdown)(struct b43_bus_dev *dev); | ||
| 15 | int (*bus_powerup)(struct b43_bus_dev *dev, bool dynamic_pctl); | ||
| 16 | int (*device_is_enabled)(struct b43_bus_dev *dev); | ||
| 17 | void (*device_enable)(struct b43_bus_dev *dev, | ||
| 18 | u32 core_specific_flags); | ||
| 19 | void (*device_disable)(struct b43_bus_dev *dev, | ||
| 20 | u32 core_specific_flags); | ||
| 21 | |||
| 14 | u16 (*read16)(struct b43_bus_dev *dev, u16 offset); | 22 | u16 (*read16)(struct b43_bus_dev *dev, u16 offset); |
| 15 | u32 (*read32)(struct b43_bus_dev *dev, u16 offset); | 23 | u32 (*read32)(struct b43_bus_dev *dev, u16 offset); |
| 16 | void (*write16)(struct b43_bus_dev *dev, u16 offset, u16 value); | 24 | void (*write16)(struct b43_bus_dev *dev, u16 offset, u16 value); |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index e80aaef63180..bb82ddfa44f8 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -1152,7 +1152,7 @@ static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, u32 flags) | |||
| 1152 | flags |= B43_TMSLOW_PHYRESET; | 1152 | flags |= B43_TMSLOW_PHYRESET; |
| 1153 | if (dev->phy.type == B43_PHYTYPE_N) | 1153 | if (dev->phy.type == B43_PHYTYPE_N) |
| 1154 | flags |= B43_TMSLOW_PHY_BANDWIDTH_20MHZ; /* Make 20 MHz def */ | 1154 | flags |= B43_TMSLOW_PHY_BANDWIDTH_20MHZ; /* Make 20 MHz def */ |
| 1155 | ssb_device_enable(dev->sdev, flags); | 1155 | b43_device_enable(dev, flags); |
| 1156 | msleep(2); /* Wait for the PLL to turn on. */ | 1156 | msleep(2); /* Wait for the PLL to turn on. */ |
| 1157 | 1157 | ||
| 1158 | /* Now take the PHY out of Reset again */ | 1158 | /* Now take the PHY out of Reset again */ |
| @@ -4310,8 +4310,8 @@ static void b43_wireless_core_exit(struct b43_wldev *dev) | |||
| 4310 | dev->wl->current_beacon = NULL; | 4310 | dev->wl->current_beacon = NULL; |
| 4311 | } | 4311 | } |
| 4312 | 4312 | ||
| 4313 | ssb_device_disable(dev->sdev, 0); | 4313 | b43_device_disable(dev, 0); |
| 4314 | ssb_bus_may_powerdown(dev->sdev->bus); | 4314 | b43_bus_may_powerdown(dev); |
| 4315 | } | 4315 | } |
| 4316 | 4316 | ||
| 4317 | /* Initialize a wireless core */ | 4317 | /* Initialize a wireless core */ |
| @@ -4326,10 +4326,10 @@ static int b43_wireless_core_init(struct b43_wldev *dev) | |||
| 4326 | 4326 | ||
| 4327 | B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT); | 4327 | B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT); |
| 4328 | 4328 | ||
| 4329 | err = ssb_bus_powerup(bus, 0); | 4329 | err = b43_bus_powerup(dev, 0); |
| 4330 | if (err) | 4330 | if (err) |
| 4331 | goto out; | 4331 | goto out; |
| 4332 | if (!ssb_device_is_enabled(dev->sdev)) { | 4332 | if (!b43_device_is_enabled(dev)) { |
| 4333 | tmp = phy->gmode ? B43_TMSLOW_GMODE : 0; | 4333 | tmp = phy->gmode ? B43_TMSLOW_GMODE : 0; |
| 4334 | b43_wireless_core_reset(dev, tmp); | 4334 | b43_wireless_core_reset(dev, tmp); |
| 4335 | } | 4335 | } |
| @@ -4414,7 +4414,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev) | |||
| 4414 | b43_set_synth_pu_delay(dev, 1); | 4414 | b43_set_synth_pu_delay(dev, 1); |
| 4415 | b43_bluetooth_coext_enable(dev); | 4415 | b43_bluetooth_coext_enable(dev); |
| 4416 | 4416 | ||
| 4417 | ssb_bus_powerup(bus, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)); | 4417 | b43_bus_powerup(dev, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)); |
| 4418 | b43_upload_card_macaddress(dev); | 4418 | b43_upload_card_macaddress(dev); |
| 4419 | b43_security_init(dev); | 4419 | b43_security_init(dev); |
| 4420 | 4420 | ||
| @@ -4431,7 +4431,7 @@ out: | |||
| 4431 | err_chip_exit: | 4431 | err_chip_exit: |
| 4432 | b43_chip_exit(dev); | 4432 | b43_chip_exit(dev); |
| 4433 | err_busdown: | 4433 | err_busdown: |
| 4434 | ssb_bus_may_powerdown(bus); | 4434 | b43_bus_may_powerdown(dev); |
| 4435 | B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT); | 4435 | B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT); |
| 4436 | return err; | 4436 | return err; |
| 4437 | } | 4437 | } |
| @@ -4750,7 +4750,7 @@ static int b43_wireless_core_attach(struct b43_wldev *dev) | |||
| 4750 | * that in core_init(), too. | 4750 | * that in core_init(), too. |
| 4751 | */ | 4751 | */ |
| 4752 | 4752 | ||
| 4753 | err = ssb_bus_powerup(bus, 0); | 4753 | err = b43_bus_powerup(dev, 0); |
| 4754 | if (err) { | 4754 | if (err) { |
| 4755 | b43err(wl, "Bus powerup failed\n"); | 4755 | b43err(wl, "Bus powerup failed\n"); |
| 4756 | goto out; | 4756 | goto out; |
| @@ -4832,8 +4832,8 @@ static int b43_wireless_core_attach(struct b43_wldev *dev) | |||
| 4832 | INIT_WORK(&dev->restart_work, b43_chip_reset); | 4832 | INIT_WORK(&dev->restart_work, b43_chip_reset); |
| 4833 | 4833 | ||
| 4834 | dev->phy.ops->switch_analog(dev, 0); | 4834 | dev->phy.ops->switch_analog(dev, 0); |
| 4835 | ssb_device_disable(dev->sdev, 0); | 4835 | b43_device_disable(dev, 0); |
| 4836 | ssb_bus_may_powerdown(bus); | 4836 | b43_bus_may_powerdown(dev); |
| 4837 | 4837 | ||
| 4838 | out: | 4838 | out: |
| 4839 | return err; | 4839 | return err; |
| @@ -4841,7 +4841,7 @@ out: | |||
| 4841 | err_phy_free: | 4841 | err_phy_free: |
| 4842 | b43_phy_free(dev); | 4842 | b43_phy_free(dev); |
| 4843 | err_powerdown: | 4843 | err_powerdown: |
| 4844 | ssb_bus_may_powerdown(bus); | 4844 | b43_bus_may_powerdown(dev); |
| 4845 | return err; | 4845 | return err; |
| 4846 | } | 4846 | } |
| 4847 | 4847 | ||
diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c index a617efe38289..59c3afe047af 100644 --- a/drivers/net/wireless/b43/rfkill.c +++ b/drivers/net/wireless/b43/rfkill.c | |||
| @@ -37,17 +37,16 @@ void b43_rfkill_poll(struct ieee80211_hw *hw) | |||
| 37 | { | 37 | { |
| 38 | struct b43_wl *wl = hw_to_b43_wl(hw); | 38 | struct b43_wl *wl = hw_to_b43_wl(hw); |
| 39 | struct b43_wldev *dev = wl->current_dev; | 39 | struct b43_wldev *dev = wl->current_dev; |
| 40 | struct ssb_bus *bus = dev->sdev->bus; | ||
| 41 | bool enabled; | 40 | bool enabled; |
| 42 | bool brought_up = false; | 41 | bool brought_up = false; |
| 43 | 42 | ||
| 44 | mutex_lock(&wl->mutex); | 43 | mutex_lock(&wl->mutex); |
| 45 | if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) { | 44 | if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) { |
| 46 | if (ssb_bus_powerup(bus, 0)) { | 45 | if (b43_bus_powerup(dev, 0)) { |
| 47 | mutex_unlock(&wl->mutex); | 46 | mutex_unlock(&wl->mutex); |
| 48 | return; | 47 | return; |
| 49 | } | 48 | } |
| 50 | ssb_device_enable(dev->sdev, 0); | 49 | b43_device_enable(dev, 0); |
| 51 | brought_up = true; | 50 | brought_up = true; |
| 52 | } | 51 | } |
| 53 | 52 | ||
| @@ -63,8 +62,8 @@ void b43_rfkill_poll(struct ieee80211_hw *hw) | |||
| 63 | } | 62 | } |
| 64 | 63 | ||
| 65 | if (brought_up) { | 64 | if (brought_up) { |
| 66 | ssb_device_disable(dev->sdev, 0); | 65 | b43_device_disable(dev, 0); |
| 67 | ssb_bus_may_powerdown(bus); | 66 | b43_bus_may_powerdown(dev); |
| 68 | } | 67 | } |
| 69 | 68 | ||
| 70 | mutex_unlock(&wl->mutex); | 69 | mutex_unlock(&wl->mutex); |
