aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorIvo van Doorn <IvDoorn@gmail.com>2008-06-03 12:58:56 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-06-14 12:17:55 -0400
commit2b08da3fb595432f87b5206c1c77dcb72300cacf (patch)
treeb165baf29c47a5e58ac7f9d755942aca5d519614 /drivers/net
parent9dad92b9ba49eaab72513d821ae43298bcf93b90 (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')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c56
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c56
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c44
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c3
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c61
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c49
6 files changed, 140 insertions, 129 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 900140d3b304..cfb720f35b2c 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -781,25 +781,32 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev)
781 return 0; 781 return 0;
782} 782}
783 783
784static int rt2400pci_init_bbp(struct rt2x00_dev *rt2x00dev) 784static int rt2400pci_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
785{ 785{
786 unsigned int i; 786 unsigned int i;
787 u16 eeprom;
788 u8 reg_id;
789 u8 value; 787 u8 value;
790 788
791 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 789 for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
792 rt2400pci_bbp_read(rt2x00dev, 0, &value); 790 rt2400pci_bbp_read(rt2x00dev, 0, &value);
793 if ((value != 0xff) && (value != 0x00)) 791 if ((value != 0xff) && (value != 0x00))
794 goto continue_csr_init; 792 return 0;
795 NOTICE(rt2x00dev, "Waiting for BBP register.\n");
796 udelay(REGISTER_BUSY_DELAY); 793 udelay(REGISTER_BUSY_DELAY);
797 } 794 }
798 795
799 ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); 796 ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
800 return -EACCES; 797 return -EACCES;
798}
799
800static int rt2400pci_init_bbp(struct rt2x00_dev *rt2x00dev)
801{
802 unsigned int i;
803 u16 eeprom;
804 u8 reg_id;
805 u8 value;
806
807 if (unlikely(rt2400pci_wait_bbp_ready(rt2x00dev)))
808 return -EACCES;
801 809
802continue_csr_init:
803 rt2400pci_bbp_write(rt2x00dev, 1, 0x00); 810 rt2400pci_bbp_write(rt2x00dev, 1, 0x00);
804 rt2400pci_bbp_write(rt2x00dev, 3, 0x27); 811 rt2400pci_bbp_write(rt2x00dev, 3, 0x27);
805 rt2400pci_bbp_write(rt2x00dev, 4, 0x08); 812 rt2400pci_bbp_write(rt2x00dev, 4, 0x08);
@@ -838,7 +845,8 @@ static void rt2400pci_toggle_rx(struct rt2x00_dev *rt2x00dev,
838 845
839 rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg); 846 rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
840 rt2x00_set_field32(&reg, RXCSR0_DISABLE_RX, 847 rt2x00_set_field32(&reg, RXCSR0_DISABLE_RX,
841 state == STATE_RADIO_RX_OFF); 848 (state == STATE_RADIO_RX_OFF) ||
849 (state == STATE_RADIO_RX_OFF_LINK));
842 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); 850 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
843} 851}
844 852
@@ -875,17 +883,10 @@ static int rt2400pci_enable_radio(struct rt2x00_dev *rt2x00dev)
875 /* 883 /*
876 * Initialize all registers. 884 * Initialize all registers.
877 */ 885 */
878 if (rt2400pci_init_queues(rt2x00dev) || 886 if (unlikely(rt2400pci_init_queues(rt2x00dev) ||
879 rt2400pci_init_registers(rt2x00dev) || 887 rt2400pci_init_registers(rt2x00dev) ||
880 rt2400pci_init_bbp(rt2x00dev)) { 888 rt2400pci_init_bbp(rt2x00dev)))
881 ERROR(rt2x00dev, "Register initialization failed.\n");
882 return -EIO; 889 return -EIO;
883 }
884
885 /*
886 * Enable interrupts.
887 */
888 rt2400pci_toggle_irq(rt2x00dev, STATE_RADIO_IRQ_ON);
889 890
890 return 0; 891 return 0;
891} 892}
@@ -907,11 +908,6 @@ static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev)
907 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg); 908 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg);
908 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1); 909 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1);
909 rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); 910 rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
910
911 /*
912 * Disable interrupts.
913 */
914 rt2400pci_toggle_irq(rt2x00dev, STATE_RADIO_IRQ_OFF);
915} 911}
916 912
917static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev, 913static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
@@ -946,10 +942,6 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
946 msleep(10); 942 msleep(10);
947 } 943 }
948 944
949 NOTICE(rt2x00dev, "Device failed to enter state %d, "
950 "current device state: bbp %d and rf %d.\n",
951 state, bbp_state, rf_state);
952
953 return -EBUSY; 945 return -EBUSY;
954} 946}
955 947
@@ -967,11 +959,13 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev,
967 break; 959 break;
968 case STATE_RADIO_RX_ON: 960 case STATE_RADIO_RX_ON:
969 case STATE_RADIO_RX_ON_LINK: 961 case STATE_RADIO_RX_ON_LINK:
970 rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
971 break;
972 case STATE_RADIO_RX_OFF: 962 case STATE_RADIO_RX_OFF:
973 case STATE_RADIO_RX_OFF_LINK: 963 case STATE_RADIO_RX_OFF_LINK:
974 rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); 964 rt2400pci_toggle_rx(rt2x00dev, state);
965 break;
966 case STATE_RADIO_IRQ_ON:
967 case STATE_RADIO_IRQ_OFF:
968 rt2400pci_toggle_irq(rt2x00dev, state);
975 break; 969 break;
976 case STATE_DEEP_SLEEP: 970 case STATE_DEEP_SLEEP:
977 case STATE_SLEEP: 971 case STATE_SLEEP:
@@ -984,6 +978,10 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev,
984 break; 978 break;
985 } 979 }
986 980
981 if (unlikely(retval))
982 ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
983 state, retval);
984
987 return retval; 985 return retval;
988} 986}
989 987
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 673350953b89..b08932d7bf20 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -924,25 +924,32 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev)
924 return 0; 924 return 0;
925} 925}
926 926
927static int rt2500pci_init_bbp(struct rt2x00_dev *rt2x00dev) 927static int rt2500pci_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
928{ 928{
929 unsigned int i; 929 unsigned int i;
930 u16 eeprom;
931 u8 reg_id;
932 u8 value; 930 u8 value;
933 931
934 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 932 for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
935 rt2500pci_bbp_read(rt2x00dev, 0, &value); 933 rt2500pci_bbp_read(rt2x00dev, 0, &value);
936 if ((value != 0xff) && (value != 0x00)) 934 if ((value != 0xff) && (value != 0x00))
937 goto continue_csr_init; 935 return 0;
938 NOTICE(rt2x00dev, "Waiting for BBP register.\n");
939 udelay(REGISTER_BUSY_DELAY); 936 udelay(REGISTER_BUSY_DELAY);
940 } 937 }
941 938
942 ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); 939 ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
943 return -EACCES; 940 return -EACCES;
941}
942
943static int rt2500pci_init_bbp(struct rt2x00_dev *rt2x00dev)
944{
945 unsigned int i;
946 u16 eeprom;
947 u8 reg_id;
948 u8 value;
949
950 if (unlikely(rt2500pci_wait_bbp_ready(rt2x00dev)))
951 return -EACCES;
944 952
945continue_csr_init:
946 rt2500pci_bbp_write(rt2x00dev, 3, 0x02); 953 rt2500pci_bbp_write(rt2x00dev, 3, 0x02);
947 rt2500pci_bbp_write(rt2x00dev, 4, 0x19); 954 rt2500pci_bbp_write(rt2x00dev, 4, 0x19);
948 rt2500pci_bbp_write(rt2x00dev, 14, 0x1c); 955 rt2500pci_bbp_write(rt2x00dev, 14, 0x1c);
@@ -997,7 +1004,8 @@ static void rt2500pci_toggle_rx(struct rt2x00_dev *rt2x00dev,
997 1004
998 rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg); 1005 rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
999 rt2x00_set_field32(&reg, RXCSR0_DISABLE_RX, 1006 rt2x00_set_field32(&reg, RXCSR0_DISABLE_RX,
1000 state == STATE_RADIO_RX_OFF); 1007 (state == STATE_RADIO_RX_OFF) ||
1008 (state == STATE_RADIO_RX_OFF_LINK));
1001 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); 1009 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
1002} 1010}
1003 1011
@@ -1034,17 +1042,10 @@ static int rt2500pci_enable_radio(struct rt2x00_dev *rt2x00dev)
1034 /* 1042 /*
1035 * Initialize all registers. 1043 * Initialize all registers.
1036 */ 1044 */
1037 if (rt2500pci_init_queues(rt2x00dev) || 1045 if (unlikely(rt2500pci_init_queues(rt2x00dev) ||
1038 rt2500pci_init_registers(rt2x00dev) || 1046 rt2500pci_init_registers(rt2x00dev) ||
1039 rt2500pci_init_bbp(rt2x00dev)) { 1047 rt2500pci_init_bbp(rt2x00dev)))
1040 ERROR(rt2x00dev, "Register initialization failed.\n");
1041 return -EIO; 1048 return -EIO;
1042 }
1043
1044 /*
1045 * Enable interrupts.
1046 */
1047 rt2500pci_toggle_irq(rt2x00dev, STATE_RADIO_IRQ_ON);
1048 1049
1049 return 0; 1050 return 0;
1050} 1051}
@@ -1066,11 +1067,6 @@ static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev)
1066 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg); 1067 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg);
1067 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1); 1068 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1);
1068 rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); 1069 rt2x00pci_register_write(rt2x00dev, TXCSR0, reg);
1069
1070 /*
1071 * Disable interrupts.
1072 */
1073 rt2500pci_toggle_irq(rt2x00dev, STATE_RADIO_IRQ_OFF);
1074} 1070}
1075 1071
1076static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev, 1072static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
@@ -1105,10 +1101,6 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
1105 msleep(10); 1101 msleep(10);
1106 } 1102 }
1107 1103
1108 NOTICE(rt2x00dev, "Device failed to enter state %d, "
1109 "current device state: bbp %d and rf %d.\n",
1110 state, bbp_state, rf_state);
1111
1112 return -EBUSY; 1104 return -EBUSY;
1113} 1105}
1114 1106
@@ -1126,11 +1118,13 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev,
1126 break; 1118 break;
1127 case STATE_RADIO_RX_ON: 1119 case STATE_RADIO_RX_ON:
1128 case STATE_RADIO_RX_ON_LINK: 1120 case STATE_RADIO_RX_ON_LINK:
1129 rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
1130 break;
1131 case STATE_RADIO_RX_OFF: 1121 case STATE_RADIO_RX_OFF:
1132 case STATE_RADIO_RX_OFF_LINK: 1122 case STATE_RADIO_RX_OFF_LINK:
1133 rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); 1123 rt2500pci_toggle_rx(rt2x00dev, state);
1124 break;
1125 case STATE_RADIO_IRQ_ON:
1126 case STATE_RADIO_IRQ_OFF:
1127 rt2500pci_toggle_irq(rt2x00dev, state);
1134 break; 1128 break;
1135 case STATE_DEEP_SLEEP: 1129 case STATE_DEEP_SLEEP:
1136 case STATE_SLEEP: 1130 case STATE_SLEEP:
@@ -1143,6 +1137,10 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev,
1143 break; 1137 break;
1144 } 1138 }
1145 1139
1140 if (unlikely(retval))
1141 ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
1142 state, retval);
1143
1146 return retval; 1144 return retval;
1147} 1145}
1148 1146
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
850static int rt2500usb_init_bbp(struct rt2x00_dev *rt2x00dev) 850static 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
866static 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
868continue_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, &reg); 929 rt2500usb_register_read(rt2x00dev, TXRX_CSR2, &reg);
923 rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 930 rt2x00_set_field16(&reg, 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
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index dc5ab90a52c3..48f4aec1a4d9 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -112,6 +112,8 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
112 if (status) 112 if (status)
113 return status; 113 return status;
114 114
115 rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_ON);
116
115 rt2x00leds_led_radio(rt2x00dev, true); 117 rt2x00leds_led_radio(rt2x00dev, true);
116 rt2x00led_led_activity(rt2x00dev, true); 118 rt2x00led_led_activity(rt2x00dev, true);
117 119
@@ -157,6 +159,7 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
157 * Disable radio. 159 * Disable radio.
158 */ 160 */
159 rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_OFF); 161 rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_OFF);
162 rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_OFF);
160 rt2x00led_led_activity(rt2x00dev, false); 163 rt2x00led_led_activity(rt2x00dev, false);
161 rt2x00leds_led_radio(rt2x00dev, false); 164 rt2x00leds_led_radio(rt2x00dev, false);
162} 165}
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index e13ed5ced26e..4658dbd7ef63 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1270,25 +1270,32 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev)
1270 return 0; 1270 return 0;
1271} 1271}
1272 1272
1273static int rt61pci_init_bbp(struct rt2x00_dev *rt2x00dev) 1273static int rt61pci_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
1274{ 1274{
1275 unsigned int i; 1275 unsigned int i;
1276 u16 eeprom;
1277 u8 reg_id;
1278 u8 value; 1276 u8 value;
1279 1277
1280 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 1278 for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
1281 rt61pci_bbp_read(rt2x00dev, 0, &value); 1279 rt61pci_bbp_read(rt2x00dev, 0, &value);
1282 if ((value != 0xff) && (value != 0x00)) 1280 if ((value != 0xff) && (value != 0x00))
1283 goto continue_csr_init; 1281 return 0;
1284 NOTICE(rt2x00dev, "Waiting for BBP register.\n");
1285 udelay(REGISTER_BUSY_DELAY); 1282 udelay(REGISTER_BUSY_DELAY);
1286 } 1283 }
1287 1284
1288 ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); 1285 ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
1289 return -EACCES; 1286 return -EACCES;
1287}
1288
1289static int rt61pci_init_bbp(struct rt2x00_dev *rt2x00dev)
1290{
1291 unsigned int i;
1292 u16 eeprom;
1293 u8 reg_id;
1294 u8 value;
1295
1296 if (unlikely(rt61pci_wait_bbp_ready(rt2x00dev)))
1297 return -EACCES;
1290 1298
1291continue_csr_init:
1292 rt61pci_bbp_write(rt2x00dev, 3, 0x00); 1299 rt61pci_bbp_write(rt2x00dev, 3, 0x00);
1293 rt61pci_bbp_write(rt2x00dev, 15, 0x30); 1300 rt61pci_bbp_write(rt2x00dev, 15, 0x30);
1294 rt61pci_bbp_write(rt2x00dev, 21, 0xc8); 1301 rt61pci_bbp_write(rt2x00dev, 21, 0xc8);
@@ -1337,7 +1344,8 @@ static void rt61pci_toggle_rx(struct rt2x00_dev *rt2x00dev,
1337 1344
1338 rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, &reg); 1345 rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, &reg);
1339 rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX, 1346 rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX,
1340 state == STATE_RADIO_RX_OFF); 1347 (state == STATE_RADIO_RX_OFF) ||
1348 (state == STATE_RADIO_RX_OFF_LINK));
1341 rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg); 1349 rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg);
1342} 1350}
1343 1351
@@ -1389,17 +1397,10 @@ static int rt61pci_enable_radio(struct rt2x00_dev *rt2x00dev)
1389 /* 1397 /*
1390 * Initialize all registers. 1398 * Initialize all registers.
1391 */ 1399 */
1392 if (rt61pci_init_queues(rt2x00dev) || 1400 if (unlikely(rt61pci_init_queues(rt2x00dev) ||
1393 rt61pci_init_registers(rt2x00dev) || 1401 rt61pci_init_registers(rt2x00dev) ||
1394 rt61pci_init_bbp(rt2x00dev)) { 1402 rt61pci_init_bbp(rt2x00dev)))
1395 ERROR(rt2x00dev, "Register initialization failed.\n");
1396 return -EIO; 1403 return -EIO;
1397 }
1398
1399 /*
1400 * Enable interrupts.
1401 */
1402 rt61pci_toggle_irq(rt2x00dev, STATE_RADIO_IRQ_ON);
1403 1404
1404 /* 1405 /*
1405 * Enable RX. 1406 * Enable RX.
@@ -1431,11 +1432,6 @@ static void rt61pci_disable_radio(struct rt2x00_dev *rt2x00dev)
1431 rt2x00_set_field32(&reg, TX_CNTL_CSR_ABORT_TX_AC2, 1); 1432 rt2x00_set_field32(&reg, TX_CNTL_CSR_ABORT_TX_AC2, 1);
1432 rt2x00_set_field32(&reg, TX_CNTL_CSR_ABORT_TX_AC3, 1); 1433 rt2x00_set_field32(&reg, TX_CNTL_CSR_ABORT_TX_AC3, 1);
1433 rt2x00pci_register_write(rt2x00dev, TX_CNTL_CSR, reg); 1434 rt2x00pci_register_write(rt2x00dev, TX_CNTL_CSR, reg);
1434
1435 /*
1436 * Disable interrupts.
1437 */
1438 rt61pci_toggle_irq(rt2x00dev, STATE_RADIO_IRQ_OFF);
1439} 1435}
1440 1436
1441static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state) 1437static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
@@ -1443,7 +1439,6 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
1443 u32 reg; 1439 u32 reg;
1444 unsigned int i; 1440 unsigned int i;
1445 char put_to_sleep; 1441 char put_to_sleep;
1446 char current_state;
1447 1442
1448 put_to_sleep = (state != STATE_AWAKE); 1443 put_to_sleep = (state != STATE_AWAKE);
1449 1444
@@ -1459,16 +1454,12 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
1459 */ 1454 */
1460 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 1455 for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
1461 rt2x00pci_register_read(rt2x00dev, MAC_CSR12, &reg); 1456 rt2x00pci_register_read(rt2x00dev, MAC_CSR12, &reg);
1462 current_state = 1457 state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
1463 rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE); 1458 if (state == !put_to_sleep)
1464 if (current_state == !put_to_sleep)
1465 return 0; 1459 return 0;
1466 msleep(10); 1460 msleep(10);
1467 } 1461 }
1468 1462
1469 NOTICE(rt2x00dev, "Device failed to enter state %d, "
1470 "current device state %d.\n", !put_to_sleep, current_state);
1471
1472 return -EBUSY; 1463 return -EBUSY;
1473} 1464}
1474 1465
@@ -1486,11 +1477,13 @@ static int rt61pci_set_device_state(struct rt2x00_dev *rt2x00dev,
1486 break; 1477 break;
1487 case STATE_RADIO_RX_ON: 1478 case STATE_RADIO_RX_ON:
1488 case STATE_RADIO_RX_ON_LINK: 1479 case STATE_RADIO_RX_ON_LINK:
1489 rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
1490 break;
1491 case STATE_RADIO_RX_OFF: 1480 case STATE_RADIO_RX_OFF:
1492 case STATE_RADIO_RX_OFF_LINK: 1481 case STATE_RADIO_RX_OFF_LINK:
1493 rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); 1482 rt61pci_toggle_rx(rt2x00dev, state);
1483 break;
1484 case STATE_RADIO_IRQ_ON:
1485 case STATE_RADIO_IRQ_OFF:
1486 rt61pci_toggle_irq(rt2x00dev, state);
1494 break; 1487 break;
1495 case STATE_DEEP_SLEEP: 1488 case STATE_DEEP_SLEEP:
1496 case STATE_SLEEP: 1489 case STATE_SLEEP:
@@ -1503,6 +1496,10 @@ static int rt61pci_set_device_state(struct rt2x00_dev *rt2x00dev,
1503 break; 1496 break;
1504 } 1497 }
1505 1498
1499 if (unlikely(retval))
1500 ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
1501 state, retval);
1502
1506 return retval; 1503 return retval;
1507} 1504}
1508 1505
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 26c2e0a1a308..aabdc67c8555 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1084,25 +1084,32 @@ static int rt73usb_init_registers(struct rt2x00_dev *rt2x00dev)
1084 return 0; 1084 return 0;
1085} 1085}
1086 1086
1087static int rt73usb_init_bbp(struct rt2x00_dev *rt2x00dev) 1087static int rt73usb_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
1088{ 1088{
1089 unsigned int i; 1089 unsigned int i;
1090 u16 eeprom;
1091 u8 reg_id;
1092 u8 value; 1090 u8 value;
1093 1091
1094 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 1092 for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
1095 rt73usb_bbp_read(rt2x00dev, 0, &value); 1093 rt73usb_bbp_read(rt2x00dev, 0, &value);
1096 if ((value != 0xff) && (value != 0x00)) 1094 if ((value != 0xff) && (value != 0x00))
1097 goto continue_csr_init; 1095 return 0;
1098 NOTICE(rt2x00dev, "Waiting for BBP register.\n");
1099 udelay(REGISTER_BUSY_DELAY); 1096 udelay(REGISTER_BUSY_DELAY);
1100 } 1097 }
1101 1098
1102 ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); 1099 ERROR(rt2x00dev, "BBP register access failed, aborting.\n");
1103 return -EACCES; 1100 return -EACCES;
1101}
1102
1103static int rt73usb_init_bbp(struct rt2x00_dev *rt2x00dev)
1104{
1105 unsigned int i;
1106 u16 eeprom;
1107 u8 reg_id;
1108 u8 value;
1109
1110 if (unlikely(rt73usb_wait_bbp_ready(rt2x00dev)))
1111 return -EACCES;
1104 1112
1105continue_csr_init:
1106 rt73usb_bbp_write(rt2x00dev, 3, 0x80); 1113 rt73usb_bbp_write(rt2x00dev, 3, 0x80);
1107 rt73usb_bbp_write(rt2x00dev, 15, 0x30); 1114 rt73usb_bbp_write(rt2x00dev, 15, 0x30);
1108 rt73usb_bbp_write(rt2x00dev, 21, 0xc8); 1115 rt73usb_bbp_write(rt2x00dev, 21, 0xc8);
@@ -1152,7 +1159,8 @@ static void rt73usb_toggle_rx(struct rt2x00_dev *rt2x00dev,
1152 1159
1153 rt73usb_register_read(rt2x00dev, TXRX_CSR0, &reg); 1160 rt73usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
1154 rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX, 1161 rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX,
1155 state == STATE_RADIO_RX_OFF); 1162 (state == STATE_RADIO_RX_OFF) ||
1163 (state == STATE_RADIO_RX_OFF_LINK));
1156 rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg); 1164 rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg);
1157} 1165}
1158 1166
@@ -1161,11 +1169,9 @@ static int rt73usb_enable_radio(struct rt2x00_dev *rt2x00dev)
1161 /* 1169 /*
1162 * Initialize all registers. 1170 * Initialize all registers.
1163 */ 1171 */
1164 if (rt73usb_init_registers(rt2x00dev) || 1172 if (unlikely(rt73usb_init_registers(rt2x00dev) ||
1165 rt73usb_init_bbp(rt2x00dev)) { 1173 rt73usb_init_bbp(rt2x00dev)))
1166 ERROR(rt2x00dev, "Register initialization failed.\n");
1167 return -EIO; 1174 return -EIO;
1168 }
1169 1175
1170 return 0; 1176 return 0;
1171} 1177}
@@ -1187,7 +1193,6 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
1187 u32 reg; 1193 u32 reg;
1188 unsigned int i; 1194 unsigned int i;
1189 char put_to_sleep; 1195 char put_to_sleep;
1190 char current_state;
1191 1196
1192 put_to_sleep = (state != STATE_AWAKE); 1197 put_to_sleep = (state != STATE_AWAKE);
1193 1198
@@ -1203,16 +1208,12 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
1203 */ 1208 */
1204 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 1209 for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
1205 rt73usb_register_read(rt2x00dev, MAC_CSR12, &reg); 1210 rt73usb_register_read(rt2x00dev, MAC_CSR12, &reg);
1206 current_state = 1211 state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
1207 rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE); 1212 if (state == !put_to_sleep)
1208 if (current_state == !put_to_sleep)
1209 return 0; 1213 return 0;
1210 msleep(10); 1214 msleep(10);
1211 } 1215 }
1212 1216
1213 NOTICE(rt2x00dev, "Device failed to enter state %d, "
1214 "current device state %d.\n", !put_to_sleep, current_state);
1215
1216 return -EBUSY; 1217 return -EBUSY;
1217} 1218}
1218 1219
@@ -1230,11 +1231,13 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev,
1230 break; 1231 break;
1231 case STATE_RADIO_RX_ON: 1232 case STATE_RADIO_RX_ON:
1232 case STATE_RADIO_RX_ON_LINK: 1233 case STATE_RADIO_RX_ON_LINK:
1233 rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
1234 break;
1235 case STATE_RADIO_RX_OFF: 1234 case STATE_RADIO_RX_OFF:
1236 case STATE_RADIO_RX_OFF_LINK: 1235 case STATE_RADIO_RX_OFF_LINK:
1237 rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); 1236 rt73usb_toggle_rx(rt2x00dev, state);
1237 break;
1238 case STATE_RADIO_IRQ_ON:
1239 case STATE_RADIO_IRQ_OFF:
1240 /* No support, but no error either */
1238 break; 1241 break;
1239 case STATE_DEEP_SLEEP: 1242 case STATE_DEEP_SLEEP:
1240 case STATE_SLEEP: 1243 case STATE_SLEEP:
@@ -1247,6 +1250,10 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev,
1247 break; 1250 break;
1248 } 1251 }
1249 1252
1253 if (unlikely(retval))
1254 ERROR(rt2x00dev, "Device failed to enter state %d (%d).\n",
1255 state, retval);
1256
1250 return retval; 1257 return retval;
1251} 1258}
1252 1259