diff options
author | Ivo van Doorn <IvDoorn@gmail.com> | 2008-06-03 12:58:56 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-06-14 12:17:55 -0400 |
commit | 2b08da3fb595432f87b5206c1c77dcb72300cacf (patch) | |
tree | b165baf29c47a5e58ac7f9d755942aca5d519614 /drivers/net/wireless/rt2x00/rt2500usb.c | |
parent | 9dad92b9ba49eaab72513d821ae43298bcf93b90 (diff) |
rt2x00: Cleanup/optimize set_state() function callback function
* Reduce goto usage
* Mark if-statements which are true on hardware error unlikely()
* Cleanup debug messages
This makes the code look nicer and be better optimized since
the chance of hardware errors should be very small.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index cca1504550dc..a46e4a6eba96 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -847,25 +847,32 @@ static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev) | |||
847 | return 0; | 847 | return 0; |
848 | } | 848 | } |
849 | 849 | ||
850 | static int rt2500usb_init_bbp(struct rt2x00_dev *rt2x00dev) | 850 | static int rt2500usb_wait_bbp_ready(struct rt2x00_dev *rt2x00dev) |
851 | { | 851 | { |
852 | unsigned int i; | 852 | unsigned int i; |
853 | u16 eeprom; | ||
854 | u8 value; | 853 | u8 value; |
855 | u8 reg_id; | ||
856 | 854 | ||
857 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | 855 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { |
858 | rt2500usb_bbp_read(rt2x00dev, 0, &value); | 856 | rt2500usb_bbp_read(rt2x00dev, 0, &value); |
859 | if ((value != 0xff) && (value != 0x00)) | 857 | if ((value != 0xff) && (value != 0x00)) |
860 | goto continue_csr_init; | 858 | return 0; |
861 | NOTICE(rt2x00dev, "Waiting for BBP register.\n"); | ||
862 | udelay(REGISTER_BUSY_DELAY); | 859 | udelay(REGISTER_BUSY_DELAY); |
863 | } | 860 | } |
864 | 861 | ||
865 | ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); | 862 | ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); |
866 | return -EACCES; | 863 | return -EACCES; |
864 | } | ||
865 | |||
866 | static int rt2500usb_init_bbp(struct rt2x00_dev *rt2x00dev) | ||
867 | { | ||
868 | unsigned int i; | ||
869 | u16 eeprom; | ||
870 | u8 value; | ||
871 | u8 reg_id; | ||
872 | |||
873 | if (unlikely(rt2500usb_wait_bbp_ready(rt2x00dev))) | ||
874 | return -EACCES; | ||
867 | 875 | ||
868 | continue_csr_init: | ||
869 | rt2500usb_bbp_write(rt2x00dev, 3, 0x02); | 876 | rt2500usb_bbp_write(rt2x00dev, 3, 0x02); |
870 | rt2500usb_bbp_write(rt2x00dev, 4, 0x19); | 877 | rt2500usb_bbp_write(rt2x00dev, 4, 0x19); |
871 | rt2500usb_bbp_write(rt2x00dev, 14, 0x1c); | 878 | rt2500usb_bbp_write(rt2x00dev, 14, 0x1c); |
@@ -921,7 +928,8 @@ static void rt2500usb_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
921 | 928 | ||
922 | rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); | 929 | rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); |
923 | rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, | 930 | rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, |
924 | state == STATE_RADIO_RX_OFF); | 931 | (state == STATE_RADIO_RX_OFF) || |
932 | (state == STATE_RADIO_RX_OFF_LINK)); | ||
925 | rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); | 933 | rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); |
926 | } | 934 | } |
927 | 935 | ||
@@ -930,11 +938,9 @@ static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
930 | /* | 938 | /* |
931 | * Initialize all registers. | 939 | * Initialize all registers. |
932 | */ | 940 | */ |
933 | if (rt2500usb_init_registers(rt2x00dev) || | 941 | if (unlikely(rt2500usb_init_registers(rt2x00dev) || |
934 | rt2500usb_init_bbp(rt2x00dev)) { | 942 | rt2500usb_init_bbp(rt2x00dev))) |
935 | ERROR(rt2x00dev, "Register initialization failed.\n"); | ||
936 | return -EIO; | 943 | return -EIO; |
937 | } | ||
938 | 944 | ||
939 | return 0; | 945 | return 0; |
940 | } | 946 | } |
@@ -987,10 +993,6 @@ static int rt2500usb_set_state(struct rt2x00_dev *rt2x00dev, | |||
987 | msleep(30); | 993 | msleep(30); |
988 | } | 994 | } |
989 | 995 | ||
990 | NOTICE(rt2x00dev, "Device failed to enter state %d, " | ||
991 | "current device state: bbp %d and rf %d.\n", | ||
992 | state, bbp_state, rf_state); | ||
993 | |||
994 | return -EBUSY; | 996 | return -EBUSY; |
995 | } | 997 | } |
996 | 998 | ||
@@ -1008,11 +1010,13 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1008 | break; | 1010 | break; |
1009 | case STATE_RADIO_RX_ON: | 1011 | case STATE_RADIO_RX_ON: |
1010 | case STATE_RADIO_RX_ON_LINK: | 1012 | case STATE_RADIO_RX_ON_LINK: |
1011 | rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | ||
1012 | break; | ||
1013 | case STATE_RADIO_RX_OFF: | 1013 | case STATE_RADIO_RX_OFF: |
1014 | case STATE_RADIO_RX_OFF_LINK: | 1014 | case STATE_RADIO_RX_OFF_LINK: |
1015 | rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | 1015 | rt2500usb_toggle_rx(rt2x00dev, state); |
1016 | break; | ||
1017 | case STATE_RADIO_IRQ_ON: | ||
1018 | case STATE_RADIO_IRQ_OFF: | ||
1019 | /* No support, but no error either */ | ||
1016 | break; | 1020 | break; |
1017 | case STATE_DEEP_SLEEP: | 1021 | case STATE_DEEP_SLEEP: |
1018 | case STATE_SLEEP: | 1022 | case STATE_SLEEP: |
@@ -1025,6 +1029,10 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1025 | break; | 1029 | break; |
1026 | } | 1030 | } |
1027 | 1031 | ||
1032 | if (unlikely(retval)) | ||
1033 | ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n", | ||
1034 | state, retval); | ||
1035 | |||
1028 | return retval; | 1036 | return retval; |
1029 | } | 1037 | } |
1030 | 1038 | ||