diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 885844c1a3c3..972b5a5c3864 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -69,14 +69,14 @@ static void rt2500pci_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
69 | { | 69 | { |
70 | u32 reg; | 70 | u32 reg; |
71 | 71 | ||
72 | mutex_lock(&rt2x00dev->csr_mutex); | ||
73 | |||
72 | /* | 74 | /* |
73 | * Wait until the BBP becomes ready. | 75 | * Wait until the BBP becomes ready. |
74 | */ | 76 | */ |
75 | reg = rt2500pci_bbp_check(rt2x00dev); | 77 | reg = rt2500pci_bbp_check(rt2x00dev); |
76 | if (rt2x00_get_field32(reg, BBPCSR_BUSY)) { | 78 | if (rt2x00_get_field32(reg, BBPCSR_BUSY)) |
77 | ERROR(rt2x00dev, "BBPCSR register busy. Write failed.\n"); | 79 | goto exit_fail; |
78 | return; | ||
79 | } | ||
80 | 80 | ||
81 | /* | 81 | /* |
82 | * Write the data into the BBP. | 82 | * Write the data into the BBP. |
@@ -88,6 +88,15 @@ static void rt2500pci_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
88 | rt2x00_set_field32(®, BBPCSR_WRITE_CONTROL, 1); | 88 | rt2x00_set_field32(®, BBPCSR_WRITE_CONTROL, 1); |
89 | 89 | ||
90 | rt2x00pci_register_write(rt2x00dev, BBPCSR, reg); | 90 | rt2x00pci_register_write(rt2x00dev, BBPCSR, reg); |
91 | |||
92 | mutex_unlock(&rt2x00dev->csr_mutex); | ||
93 | |||
94 | return; | ||
95 | |||
96 | exit_fail: | ||
97 | mutex_unlock(&rt2x00dev->csr_mutex); | ||
98 | |||
99 | ERROR(rt2x00dev, "BBPCSR register busy. Write failed.\n"); | ||
91 | } | 100 | } |
92 | 101 | ||
93 | static void rt2500pci_bbp_read(struct rt2x00_dev *rt2x00dev, | 102 | static void rt2500pci_bbp_read(struct rt2x00_dev *rt2x00dev, |
@@ -95,14 +104,14 @@ static void rt2500pci_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
95 | { | 104 | { |
96 | u32 reg; | 105 | u32 reg; |
97 | 106 | ||
107 | mutex_lock(&rt2x00dev->csr_mutex); | ||
108 | |||
98 | /* | 109 | /* |
99 | * Wait until the BBP becomes ready. | 110 | * Wait until the BBP becomes ready. |
100 | */ | 111 | */ |
101 | reg = rt2500pci_bbp_check(rt2x00dev); | 112 | reg = rt2500pci_bbp_check(rt2x00dev); |
102 | if (rt2x00_get_field32(reg, BBPCSR_BUSY)) { | 113 | if (rt2x00_get_field32(reg, BBPCSR_BUSY)) |
103 | ERROR(rt2x00dev, "BBPCSR register busy. Read failed.\n"); | 114 | goto exit_fail; |
104 | return; | ||
105 | } | ||
106 | 115 | ||
107 | /* | 116 | /* |
108 | * Write the request into the BBP. | 117 | * Write the request into the BBP. |
@@ -118,13 +127,20 @@ static void rt2500pci_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
118 | * Wait until the BBP becomes ready. | 127 | * Wait until the BBP becomes ready. |
119 | */ | 128 | */ |
120 | reg = rt2500pci_bbp_check(rt2x00dev); | 129 | reg = rt2500pci_bbp_check(rt2x00dev); |
121 | if (rt2x00_get_field32(reg, BBPCSR_BUSY)) { | 130 | if (rt2x00_get_field32(reg, BBPCSR_BUSY)) |
122 | ERROR(rt2x00dev, "BBPCSR register busy. Read failed.\n"); | 131 | goto exit_fail; |
123 | *value = 0xff; | ||
124 | return; | ||
125 | } | ||
126 | 132 | ||
127 | *value = rt2x00_get_field32(reg, BBPCSR_VALUE); | 133 | *value = rt2x00_get_field32(reg, BBPCSR_VALUE); |
134 | |||
135 | mutex_unlock(&rt2x00dev->csr_mutex); | ||
136 | |||
137 | return; | ||
138 | |||
139 | exit_fail: | ||
140 | mutex_unlock(&rt2x00dev->csr_mutex); | ||
141 | |||
142 | ERROR(rt2x00dev, "BBPCSR register busy. Read failed.\n"); | ||
143 | *value = 0xff; | ||
128 | } | 144 | } |
129 | 145 | ||
130 | static void rt2500pci_rf_write(struct rt2x00_dev *rt2x00dev, | 146 | static void rt2500pci_rf_write(struct rt2x00_dev *rt2x00dev, |
@@ -136,6 +152,8 @@ static void rt2500pci_rf_write(struct rt2x00_dev *rt2x00dev, | |||
136 | if (!word) | 152 | if (!word) |
137 | return; | 153 | return; |
138 | 154 | ||
155 | mutex_lock(&rt2x00dev->csr_mutex); | ||
156 | |||
139 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | 157 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { |
140 | rt2x00pci_register_read(rt2x00dev, RFCSR, ®); | 158 | rt2x00pci_register_read(rt2x00dev, RFCSR, ®); |
141 | if (!rt2x00_get_field32(reg, RFCSR_BUSY)) | 159 | if (!rt2x00_get_field32(reg, RFCSR_BUSY)) |
@@ -143,6 +161,7 @@ static void rt2500pci_rf_write(struct rt2x00_dev *rt2x00dev, | |||
143 | udelay(REGISTER_BUSY_DELAY); | 161 | udelay(REGISTER_BUSY_DELAY); |
144 | } | 162 | } |
145 | 163 | ||
164 | mutex_unlock(&rt2x00dev->csr_mutex); | ||
146 | ERROR(rt2x00dev, "RFCSR register busy. Write failed.\n"); | 165 | ERROR(rt2x00dev, "RFCSR register busy. Write failed.\n"); |
147 | return; | 166 | return; |
148 | 167 | ||
@@ -155,6 +174,8 @@ rf_write: | |||
155 | 174 | ||
156 | rt2x00pci_register_write(rt2x00dev, RFCSR, reg); | 175 | rt2x00pci_register_write(rt2x00dev, RFCSR, reg); |
157 | rt2x00_rf_write(rt2x00dev, word, value); | 176 | rt2x00_rf_write(rt2x00dev, word, value); |
177 | |||
178 | mutex_unlock(&rt2x00dev->csr_mutex); | ||
158 | } | 179 | } |
159 | 180 | ||
160 | static void rt2500pci_eepromregister_read(struct eeprom_93cx6 *eeprom) | 181 | static void rt2500pci_eepromregister_read(struct eeprom_93cx6 *eeprom) |