diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 27 | ||||
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 1 | ||||
-rw-r--r-- | drivers/scsi/aacraid/commsup.c | 32 | ||||
-rw-r--r-- | drivers/scsi/aacraid/dpcsup.c | 2 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 2 |
5 files changed, 44 insertions, 20 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index e4c243748a97..7dfd0fa27255 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -323,7 +323,6 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd, | |||
323 | if (unlikely(!scsicmd || !scsicmd->scsi_done)) { | 323 | if (unlikely(!scsicmd || !scsicmd->scsi_done)) { |
324 | dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n")); | 324 | dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n")); |
325 | aac_fib_complete(fibptr); | 325 | aac_fib_complete(fibptr); |
326 | aac_fib_free(fibptr); | ||
327 | return 0; | 326 | return 0; |
328 | } | 327 | } |
329 | scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; | 328 | scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; |
@@ -331,7 +330,6 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd, | |||
331 | if (unlikely(!device || !scsi_device_online(device))) { | 330 | if (unlikely(!device || !scsi_device_online(device))) { |
332 | dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n")); | 331 | dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n")); |
333 | aac_fib_complete(fibptr); | 332 | aac_fib_complete(fibptr); |
334 | aac_fib_free(fibptr); | ||
335 | return 0; | 333 | return 0; |
336 | } | 334 | } |
337 | return 1; | 335 | return 1; |
@@ -541,7 +539,6 @@ static void get_container_name_callback(void *context, struct fib * fibptr) | |||
541 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 539 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; |
542 | 540 | ||
543 | aac_fib_complete(fibptr); | 541 | aac_fib_complete(fibptr); |
544 | aac_fib_free(fibptr); | ||
545 | scsicmd->scsi_done(scsicmd); | 542 | scsicmd->scsi_done(scsicmd); |
546 | } | 543 | } |
547 | 544 | ||
@@ -557,7 +554,8 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd) | |||
557 | 554 | ||
558 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 555 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
559 | 556 | ||
560 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) | 557 | cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd); |
558 | if (!cmd_fibcontext) | ||
561 | return -ENOMEM; | 559 | return -ENOMEM; |
562 | 560 | ||
563 | aac_fib_init(cmd_fibcontext); | 561 | aac_fib_init(cmd_fibcontext); |
@@ -586,7 +584,6 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd) | |||
586 | 584 | ||
587 | printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); | 585 | printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); |
588 | aac_fib_complete(cmd_fibcontext); | 586 | aac_fib_complete(cmd_fibcontext); |
589 | aac_fib_free(cmd_fibcontext); | ||
590 | return -1; | 587 | return -1; |
591 | } | 588 | } |
592 | 589 | ||
@@ -1024,7 +1021,6 @@ static void get_container_serial_callback(void *context, struct fib * fibptr) | |||
1024 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 1021 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; |
1025 | 1022 | ||
1026 | aac_fib_complete(fibptr); | 1023 | aac_fib_complete(fibptr); |
1027 | aac_fib_free(fibptr); | ||
1028 | scsicmd->scsi_done(scsicmd); | 1024 | scsicmd->scsi_done(scsicmd); |
1029 | } | 1025 | } |
1030 | 1026 | ||
@@ -1040,7 +1036,8 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd) | |||
1040 | 1036 | ||
1041 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 1037 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
1042 | 1038 | ||
1043 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) | 1039 | cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd); |
1040 | if (!cmd_fibcontext) | ||
1044 | return -ENOMEM; | 1041 | return -ENOMEM; |
1045 | 1042 | ||
1046 | aac_fib_init(cmd_fibcontext); | 1043 | aac_fib_init(cmd_fibcontext); |
@@ -1068,7 +1065,6 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd) | |||
1068 | 1065 | ||
1069 | printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status); | 1066 | printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status); |
1070 | aac_fib_complete(cmd_fibcontext); | 1067 | aac_fib_complete(cmd_fibcontext); |
1071 | aac_fib_free(cmd_fibcontext); | ||
1072 | return -1; | 1068 | return -1; |
1073 | } | 1069 | } |
1074 | 1070 | ||
@@ -1869,7 +1865,6 @@ static void io_callback(void *context, struct fib * fibptr) | |||
1869 | break; | 1865 | break; |
1870 | } | 1866 | } |
1871 | aac_fib_complete(fibptr); | 1867 | aac_fib_complete(fibptr); |
1872 | aac_fib_free(fibptr); | ||
1873 | 1868 | ||
1874 | scsicmd->scsi_done(scsicmd); | 1869 | scsicmd->scsi_done(scsicmd); |
1875 | } | 1870 | } |
@@ -1954,7 +1949,8 @@ static int aac_read(struct scsi_cmnd * scsicmd) | |||
1954 | /* | 1949 | /* |
1955 | * Alocate and initialize a Fib | 1950 | * Alocate and initialize a Fib |
1956 | */ | 1951 | */ |
1957 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { | 1952 | cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd); |
1953 | if (!cmd_fibcontext) { | ||
1958 | printk(KERN_WARNING "aac_read: fib allocation failed\n"); | 1954 | printk(KERN_WARNING "aac_read: fib allocation failed\n"); |
1959 | return -1; | 1955 | return -1; |
1960 | } | 1956 | } |
@@ -2051,7 +2047,8 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
2051 | /* | 2047 | /* |
2052 | * Allocate and initialize a Fib then setup a BlockWrite command | 2048 | * Allocate and initialize a Fib then setup a BlockWrite command |
2053 | */ | 2049 | */ |
2054 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { | 2050 | cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd); |
2051 | if (!cmd_fibcontext) { | ||
2055 | /* FIB temporarily unavailable,not catastrophic failure */ | 2052 | /* FIB temporarily unavailable,not catastrophic failure */ |
2056 | 2053 | ||
2057 | /* scsicmd->result = DID_ERROR << 16; | 2054 | /* scsicmd->result = DID_ERROR << 16; |
@@ -2285,7 +2282,7 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd) | |||
2285 | /* | 2282 | /* |
2286 | * Allocate and initialize a Fib | 2283 | * Allocate and initialize a Fib |
2287 | */ | 2284 | */ |
2288 | cmd_fibcontext = aac_fib_alloc(aac); | 2285 | cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd); |
2289 | if (!cmd_fibcontext) | 2286 | if (!cmd_fibcontext) |
2290 | return SCSI_MLQUEUE_HOST_BUSY; | 2287 | return SCSI_MLQUEUE_HOST_BUSY; |
2291 | 2288 | ||
@@ -3157,7 +3154,6 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |||
3157 | scsicmd->result |= le32_to_cpu(srbreply->scsi_status); | 3154 | scsicmd->result |= le32_to_cpu(srbreply->scsi_status); |
3158 | 3155 | ||
3159 | aac_fib_complete(fibptr); | 3156 | aac_fib_complete(fibptr); |
3160 | aac_fib_free(fibptr); | ||
3161 | scsicmd->scsi_done(scsicmd); | 3157 | scsicmd->scsi_done(scsicmd); |
3162 | } | 3158 | } |
3163 | 3159 | ||
@@ -3187,9 +3183,10 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) | |||
3187 | /* | 3183 | /* |
3188 | * Allocate and initialize a Fib then setup a BlockWrite command | 3184 | * Allocate and initialize a Fib then setup a BlockWrite command |
3189 | */ | 3185 | */ |
3190 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { | 3186 | cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd); |
3187 | if (!cmd_fibcontext) | ||
3191 | return -1; | 3188 | return -1; |
3192 | } | 3189 | |
3193 | status = aac_adapter_scsi(cmd_fibcontext, scsicmd); | 3190 | status = aac_adapter_scsi(cmd_fibcontext, scsicmd); |
3194 | 3191 | ||
3195 | /* | 3192 | /* |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 074878b55a0b..f51f0a009574 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -2114,6 +2114,7 @@ int aac_acquire_irq(struct aac_dev *dev); | |||
2114 | void aac_free_irq(struct aac_dev *dev); | 2114 | void aac_free_irq(struct aac_dev *dev); |
2115 | const char *aac_driverinfo(struct Scsi_Host *); | 2115 | const char *aac_driverinfo(struct Scsi_Host *); |
2116 | struct fib *aac_fib_alloc(struct aac_dev *dev); | 2116 | struct fib *aac_fib_alloc(struct aac_dev *dev); |
2117 | struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd); | ||
2117 | int aac_fib_setup(struct aac_dev *dev); | 2118 | int aac_fib_setup(struct aac_dev *dev); |
2118 | void aac_fib_map_free(struct aac_dev *dev); | 2119 | void aac_fib_map_free(struct aac_dev *dev); |
2119 | void aac_fib_free(struct fib * context); | 2120 | void aac_fib_free(struct fib * context); |
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index a1f90fe849c9..46a2a2f77db3 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
@@ -137,6 +137,7 @@ int aac_fib_setup(struct aac_dev * dev) | |||
137 | i++, fibptr++) | 137 | i++, fibptr++) |
138 | { | 138 | { |
139 | fibptr->flags = 0; | 139 | fibptr->flags = 0; |
140 | fibptr->size = sizeof(struct fib); | ||
140 | fibptr->dev = dev; | 141 | fibptr->dev = dev; |
141 | fibptr->hw_fib_va = hw_fib; | 142 | fibptr->hw_fib_va = hw_fib; |
142 | fibptr->data = (void *) fibptr->hw_fib_va->data; | 143 | fibptr->data = (void *) fibptr->hw_fib_va->data; |
@@ -156,13 +157,38 @@ int aac_fib_setup(struct aac_dev * dev) | |||
156 | */ | 157 | */ |
157 | dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL; | 158 | dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL; |
158 | /* | 159 | /* |
159 | * Enable this to debug out of queue space | 160 | * Set 8 fibs aside for management tools |
160 | */ | 161 | */ |
161 | dev->free_fib = &dev->fibs[0]; | 162 | dev->free_fib = &dev->fibs[dev->scsi_host_ptr->can_queue]; |
162 | return 0; | 163 | return 0; |
163 | } | 164 | } |
164 | 165 | ||
165 | /** | 166 | /** |
167 | * aac_fib_alloc_tag-allocate a fib using tags | ||
168 | * @dev: Adapter to allocate the fib for | ||
169 | * | ||
170 | * Allocate a fib from the adapter fib pool using tags | ||
171 | * from the blk layer. | ||
172 | */ | ||
173 | |||
174 | struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd) | ||
175 | { | ||
176 | struct fib *fibptr; | ||
177 | |||
178 | fibptr = &dev->fibs[scmd->request->tag]; | ||
179 | /* | ||
180 | * Null out fields that depend on being zero at the start of | ||
181 | * each I/O | ||
182 | */ | ||
183 | fibptr->hw_fib_va->header.XferState = 0; | ||
184 | fibptr->type = FSAFS_NTC_FIB_CONTEXT; | ||
185 | fibptr->callback_data = NULL; | ||
186 | fibptr->callback = NULL; | ||
187 | |||
188 | return fibptr; | ||
189 | } | ||
190 | |||
191 | /** | ||
166 | * aac_fib_alloc - allocate a fib | 192 | * aac_fib_alloc - allocate a fib |
167 | * @dev: Adapter to allocate the fib for | 193 | * @dev: Adapter to allocate the fib for |
168 | * | 194 | * |
diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c index da9d9936e995..d677b52860ae 100644 --- a/drivers/scsi/aacraid/dpcsup.c +++ b/drivers/scsi/aacraid/dpcsup.c | |||
@@ -394,7 +394,6 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, | |||
394 | fib->callback(fib->callback_data, fib); | 394 | fib->callback(fib->callback_data, fib); |
395 | } else { | 395 | } else { |
396 | aac_fib_complete(fib); | 396 | aac_fib_complete(fib); |
397 | aac_fib_free(fib); | ||
398 | } | 397 | } |
399 | } else { | 398 | } else { |
400 | unsigned long flagv; | 399 | unsigned long flagv; |
@@ -416,7 +415,6 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, | |||
416 | fib->done = 0; | 415 | fib->done = 0; |
417 | spin_unlock_irqrestore(&fib->event_lock, flagv); | 416 | spin_unlock_irqrestore(&fib->event_lock, flagv); |
418 | aac_fib_complete(fib); | 417 | aac_fib_complete(fib); |
419 | aac_fib_free(fib); | ||
420 | } | 418 | } |
421 | 419 | ||
422 | } | 420 | } |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 76eaa38ffd6e..129a515c7e49 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -454,6 +454,8 @@ static int aac_slave_configure(struct scsi_device *sdev) | |||
454 | } else | 454 | } else |
455 | scsi_change_queue_depth(sdev, 1); | 455 | scsi_change_queue_depth(sdev, 1); |
456 | 456 | ||
457 | sdev->tagged_supported = 1; | ||
458 | |||
457 | return 0; | 459 | return 0; |
458 | } | 460 | } |
459 | 461 | ||