Commit cfc94b2c9ac603b20db54225408df6ed80188dcd

Authored by Linus Torvalds

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.