Commit cfc94b2c9ac603b20db54225408df6ed80188dcd
Exists in
master
and in
7 other branches
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6: firewire: ohci: wait for local CSR lock access to finish firewire: ohci: prevent aliasing of locally handled register addresses firewire: core: fw_iso_resource_manage: return -EBUSY when out of resources firewire: core: fix retries calculation in iso manage_channel() firewire: cdev: fix cut+paste mistake in disclaimer
Showing 4 changed files Side-by-side Diff
drivers/firewire/core-iso.c
... | ... | @@ -190,7 +190,7 @@ |
190 | 190 | for (try = 0; try < 5; try++) { |
191 | 191 | new = allocate ? old - bandwidth : old + bandwidth; |
192 | 192 | if (new < 0 || new > BANDWIDTH_AVAILABLE_INITIAL) |
193 | - break; | |
193 | + return -EBUSY; | |
194 | 194 | |
195 | 195 | data[0] = cpu_to_be32(old); |
196 | 196 | data[1] = cpu_to_be32(new); |
... | ... | @@ -218,7 +218,7 @@ |
218 | 218 | u32 channels_mask, u64 offset, bool allocate, __be32 data[2]) |
219 | 219 | { |
220 | 220 | __be32 c, all, old; |
221 | - int i, retry = 5; | |
221 | + int i, ret = -EIO, retry = 5; | |
222 | 222 | |
223 | 223 | old = all = allocate ? cpu_to_be32(~0) : 0; |
224 | 224 | |
... | ... | @@ -226,6 +226,8 @@ |
226 | 226 | if (!(channels_mask & 1 << i)) |
227 | 227 | continue; |
228 | 228 | |
229 | + ret = -EBUSY; | |
230 | + | |
229 | 231 | c = cpu_to_be32(1 << (31 - i)); |
230 | 232 | if ((old & c) != (all & c)) |
231 | 233 | continue; |
232 | 234 | |
233 | 235 | |
... | ... | @@ -251,12 +253,16 @@ |
251 | 253 | |
252 | 254 | /* 1394-1995 IRM, fall through to retry. */ |
253 | 255 | default: |
254 | - if (retry--) | |
256 | + if (retry) { | |
257 | + retry--; | |
255 | 258 | i--; |
259 | + } else { | |
260 | + ret = -EIO; | |
261 | + } | |
256 | 262 | } |
257 | 263 | } |
258 | 264 | |
259 | - return -EIO; | |
265 | + return ret; | |
260 | 266 | } |
261 | 267 | |
262 | 268 | static void deallocate_channel(struct fw_card *card, int irm_id, |
drivers/firewire/ohci.c
... | ... | @@ -1158,7 +1158,7 @@ |
1158 | 1158 | struct fw_packet *packet, u32 csr) |
1159 | 1159 | { |
1160 | 1160 | struct fw_packet response; |
1161 | - int tcode, length, ext_tcode, sel; | |
1161 | + int tcode, length, ext_tcode, sel, try; | |
1162 | 1162 | __be32 *payload, lock_old; |
1163 | 1163 | u32 lock_arg, lock_data; |
1164 | 1164 | |
1165 | 1165 | |
1166 | 1166 | |
... | ... | @@ -1185,21 +1185,26 @@ |
1185 | 1185 | reg_write(ohci, OHCI1394_CSRCompareData, lock_arg); |
1186 | 1186 | reg_write(ohci, OHCI1394_CSRControl, sel); |
1187 | 1187 | |
1188 | - if (reg_read(ohci, OHCI1394_CSRControl) & 0x80000000) | |
1189 | - lock_old = cpu_to_be32(reg_read(ohci, OHCI1394_CSRData)); | |
1190 | - else | |
1191 | - fw_notify("swap not done yet\n"); | |
1188 | + for (try = 0; try < 20; try++) | |
1189 | + if (reg_read(ohci, OHCI1394_CSRControl) & 0x80000000) { | |
1190 | + lock_old = cpu_to_be32(reg_read(ohci, | |
1191 | + OHCI1394_CSRData)); | |
1192 | + fw_fill_response(&response, packet->header, | |
1193 | + RCODE_COMPLETE, | |
1194 | + &lock_old, sizeof(lock_old)); | |
1195 | + goto out; | |
1196 | + } | |
1192 | 1197 | |
1193 | - fw_fill_response(&response, packet->header, | |
1194 | - RCODE_COMPLETE, &lock_old, sizeof(lock_old)); | |
1198 | + fw_error("swap not done (CSR lock timeout)\n"); | |
1199 | + fw_fill_response(&response, packet->header, RCODE_BUSY, NULL, 0); | |
1200 | + | |
1195 | 1201 | out: |
1196 | 1202 | fw_core_handle_response(&ohci->card, &response); |
1197 | 1203 | } |
1198 | 1204 | |
1199 | 1205 | static void handle_local_request(struct context *ctx, struct fw_packet *packet) |
1200 | 1206 | { |
1201 | - u64 offset; | |
1202 | - u32 csr; | |
1207 | + u64 offset, csr; | |
1203 | 1208 | |
1204 | 1209 | if (ctx == &ctx->ohci->at_request_ctx) { |
1205 | 1210 | packet->ack = ACK_PENDING; |
include/linux/firewire-cdev.h
... | ... | @@ -17,7 +17,7 @@ |
17 | 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
18 | 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
19 | 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
20 | - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
20 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
21 | 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
22 | 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | 23 | * DEALINGS IN THE SOFTWARE. |
include/linux/firewire-constants.h
... | ... | @@ -17,7 +17,7 @@ |
17 | 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
18 | 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
19 | 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
20 | - * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
20 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
21 | 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
22 | 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | 23 | * DEALINGS IN THE SOFTWARE. |