diff options
Diffstat (limited to 'drivers/scsi/aacraid/dpcsup.c')
-rw-r--r-- | drivers/scsi/aacraid/dpcsup.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c index 66aeb57dcc2d..42c7dcda6d9b 100644 --- a/drivers/scsi/aacraid/dpcsup.c +++ b/drivers/scsi/aacraid/dpcsup.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
@@ -72,7 +72,7 @@ unsigned int aac_response_normal(struct aac_queue * q) | |||
72 | u32 index = le32_to_cpu(entry->addr); | 72 | u32 index = le32_to_cpu(entry->addr); |
73 | fast = index & 0x01; | 73 | fast = index & 0x01; |
74 | fib = &dev->fibs[index >> 2]; | 74 | fib = &dev->fibs[index >> 2]; |
75 | hwfib = fib->hw_fib; | 75 | hwfib = fib->hw_fib_va; |
76 | 76 | ||
77 | aac_consumer_free(dev, q, HostNormRespQueue); | 77 | aac_consumer_free(dev, q, HostNormRespQueue); |
78 | /* | 78 | /* |
@@ -83,11 +83,13 @@ unsigned int aac_response_normal(struct aac_queue * q) | |||
83 | * continue. The caller has already been notified that | 83 | * continue. The caller has already been notified that |
84 | * the fib timed out. | 84 | * the fib timed out. |
85 | */ | 85 | */ |
86 | if (!(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) | 86 | dev->queues->queue[AdapNormCmdQueue].numpending--; |
87 | dev->queues->queue[AdapNormCmdQueue].numpending--; | 87 | |
88 | else { | 88 | if (unlikely(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) { |
89 | printk(KERN_WARNING "aacraid: FIB timeout (%x).\n", fib->flags); | 89 | spin_unlock_irqrestore(q->lock, flags); |
90 | printk(KERN_DEBUG"aacraid: hwfib=%p fib index=%i fib=%p\n",hwfib, hwfib->header.SenderData,fib); | 90 | aac_fib_complete(fib); |
91 | aac_fib_free(fib); | ||
92 | spin_lock_irqsave(q->lock, flags); | ||
91 | continue; | 93 | continue; |
92 | } | 94 | } |
93 | spin_unlock_irqrestore(q->lock, flags); | 95 | spin_unlock_irqrestore(q->lock, flags); |
@@ -192,7 +194,7 @@ unsigned int aac_command_normal(struct aac_queue *q) | |||
192 | INIT_LIST_HEAD(&fib->fiblink); | 194 | INIT_LIST_HEAD(&fib->fiblink); |
193 | fib->type = FSAFS_NTC_FIB_CONTEXT; | 195 | fib->type = FSAFS_NTC_FIB_CONTEXT; |
194 | fib->size = sizeof(struct fib); | 196 | fib->size = sizeof(struct fib); |
195 | fib->hw_fib = hw_fib; | 197 | fib->hw_fib_va = hw_fib; |
196 | fib->data = hw_fib->data; | 198 | fib->data = hw_fib->data; |
197 | fib->dev = dev; | 199 | fib->dev = dev; |
198 | 200 | ||
@@ -253,12 +255,13 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index) | |||
253 | return 1; | 255 | return 1; |
254 | } | 256 | } |
255 | memset(hw_fib, 0, sizeof(struct hw_fib)); | 257 | memset(hw_fib, 0, sizeof(struct hw_fib)); |
256 | memcpy(hw_fib, (struct hw_fib *)(((unsigned long)(dev->regs.sa)) + (index & ~0x00000002L)), sizeof(struct hw_fib)); | 258 | memcpy(hw_fib, (struct hw_fib *)(((ptrdiff_t)(dev->regs.sa)) + |
259 | (index & ~0x00000002L)), sizeof(struct hw_fib)); | ||
257 | memset(fib, 0, sizeof(struct fib)); | 260 | memset(fib, 0, sizeof(struct fib)); |
258 | INIT_LIST_HEAD(&fib->fiblink); | 261 | INIT_LIST_HEAD(&fib->fiblink); |
259 | fib->type = FSAFS_NTC_FIB_CONTEXT; | 262 | fib->type = FSAFS_NTC_FIB_CONTEXT; |
260 | fib->size = sizeof(struct fib); | 263 | fib->size = sizeof(struct fib); |
261 | fib->hw_fib = hw_fib; | 264 | fib->hw_fib_va = hw_fib; |
262 | fib->data = hw_fib->data; | 265 | fib->data = hw_fib->data; |
263 | fib->dev = dev; | 266 | fib->dev = dev; |
264 | 267 | ||
@@ -270,7 +273,7 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index) | |||
270 | } else { | 273 | } else { |
271 | int fast = index & 0x01; | 274 | int fast = index & 0x01; |
272 | struct fib * fib = &dev->fibs[index >> 2]; | 275 | struct fib * fib = &dev->fibs[index >> 2]; |
273 | struct hw_fib * hwfib = fib->hw_fib; | 276 | struct hw_fib * hwfib = fib->hw_fib_va; |
274 | 277 | ||
275 | /* | 278 | /* |
276 | * Remove this fib from the Outstanding I/O queue. | 279 | * Remove this fib from the Outstanding I/O queue. |
@@ -280,14 +283,14 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index) | |||
280 | * continue. The caller has already been notified that | 283 | * continue. The caller has already been notified that |
281 | * the fib timed out. | 284 | * the fib timed out. |
282 | */ | 285 | */ |
283 | if ((fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) { | 286 | dev->queues->queue[AdapNormCmdQueue].numpending--; |
284 | printk(KERN_WARNING "aacraid: FIB timeout (%x).\n", fib->flags); | 287 | |
285 | printk(KERN_DEBUG"aacraid: hwfib=%p index=%i fib=%p\n",hwfib, hwfib->header.SenderData,fib); | 288 | if (unlikely(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) { |
289 | aac_fib_complete(fib); | ||
290 | aac_fib_free(fib); | ||
286 | return 0; | 291 | return 0; |
287 | } | 292 | } |
288 | 293 | ||
289 | dev->queues->queue[AdapNormCmdQueue].numpending--; | ||
290 | |||
291 | if (fast) { | 294 | if (fast) { |
292 | /* | 295 | /* |
293 | * Doctor the fib | 296 | * Doctor the fib |