aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid/dpcsup.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aacraid/dpcsup.c')
-rw-r--r--drivers/scsi/aacraid/dpcsup.c35
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