diff options
author | Matthew Wilcox <matthew@wil.cx> | 2007-10-02 21:55:24 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-10-12 14:52:59 -0400 |
commit | 41d2493d3478942f891b21dff60951ff939c08d9 (patch) | |
tree | 755abed809d87450700e69d4003f50307ad92a0a /drivers/scsi/advansys.c | |
parent | 6e8905f4a028bd07190fa5b2f90b5a35868c84d8 (diff) |
[SCSI] advansys: Restructure asc_execute_scsi_cmnd()
The wide and narrow boards share identical handling of the return value,
except for some trivial error messages. Move the handling to the common
end of the function. Also move variable declarations to the arms of
the `if' that they're used in and delete some pointless comments.
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/advansys.c')
-rw-r--r-- | drivers/scsi/advansys.c | 131 |
1 files changed, 39 insertions, 92 deletions
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 737c0e4b3190..3dd785617602 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
@@ -11331,80 +11331,26 @@ static int AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq) | |||
11331 | */ | 11331 | */ |
11332 | static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp) | 11332 | static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp) |
11333 | { | 11333 | { |
11334 | asc_board_t *boardp; | 11334 | int ret, err_code; |
11335 | ASC_DVC_VAR *asc_dvc_varp; | 11335 | asc_board_t *boardp = ASC_BOARDP(scp->device->host); |
11336 | ADV_DVC_VAR *adv_dvc_varp; | ||
11337 | ADV_SCSI_REQ_Q *adv_scsiqp; | ||
11338 | int ret; | ||
11339 | 11336 | ||
11340 | ASC_DBG2(1, "asc_execute_scsi_cmnd: scp 0x%lx, done 0x%lx\n", | 11337 | ASC_DBG1(1, "asc_execute_scsi_cmnd: scp 0x%p\n", scp); |
11341 | (ulong)scp, (ulong)scp->scsi_done); | ||
11342 | |||
11343 | boardp = ASC_BOARDP(scp->device->host); | ||
11344 | 11338 | ||
11345 | if (ASC_NARROW_BOARD(boardp)) { | 11339 | if (ASC_NARROW_BOARD(boardp)) { |
11346 | /* | 11340 | ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var; |
11347 | * Build and execute Narrow Board request. | ||
11348 | */ | ||
11349 | |||
11350 | asc_dvc_varp = &boardp->dvc_var.asc_dvc_var; | ||
11351 | 11341 | ||
11352 | /* | 11342 | /* asc_build_req() can not return ASC_BUSY. */ |
11353 | * Build Asc Library request structure using the | ||
11354 | * global structures 'asc_scsi_req' and 'asc_sg_head'. | ||
11355 | * | ||
11356 | * If an error is returned, then the request has been | ||
11357 | * queued on the board done queue. It will be completed | ||
11358 | * by the caller. | ||
11359 | * | ||
11360 | * asc_build_req() can not return ASC_BUSY. | ||
11361 | */ | ||
11362 | if (asc_build_req(boardp, scp) == ASC_ERROR) { | 11343 | if (asc_build_req(boardp, scp) == ASC_ERROR) { |
11363 | ASC_STATS(scp->device->host, build_error); | 11344 | ASC_STATS(scp->device->host, build_error); |
11364 | return ASC_ERROR; | 11345 | return ASC_ERROR; |
11365 | } | 11346 | } |
11366 | 11347 | ||
11367 | switch (ret = AscExeScsiQueue(asc_dvc_varp, &asc_scsi_q)) { | 11348 | ret = AscExeScsiQueue(asc_dvc, &asc_scsi_q); |
11368 | case ASC_NOERROR: | 11349 | err_code = asc_dvc->err_code; |
11369 | ASC_STATS(scp->device->host, exe_noerror); | ||
11370 | /* | ||
11371 | * Increment monotonically increasing per device | ||
11372 | * successful request counter. Wrapping doesn't matter. | ||
11373 | */ | ||
11374 | boardp->reqcnt[scp->device->id]++; | ||
11375 | ASC_DBG(1, "asc_execute_scsi_cmnd: AscExeScsiQueue(), " | ||
11376 | "ASC_NOERROR\n"); | ||
11377 | break; | ||
11378 | case ASC_BUSY: | ||
11379 | ASC_STATS(scp->device->host, exe_busy); | ||
11380 | break; | ||
11381 | case ASC_ERROR: | ||
11382 | ASC_PRINT2("asc_execute_scsi_cmnd: board %d: " | ||
11383 | "AscExeScsiQueue() ASC_ERROR, err_code 0x%x\n", | ||
11384 | boardp->id, asc_dvc_varp->err_code); | ||
11385 | ASC_STATS(scp->device->host, exe_error); | ||
11386 | scp->result = HOST_BYTE(DID_ERROR); | ||
11387 | break; | ||
11388 | default: | ||
11389 | ASC_PRINT2("asc_execute_scsi_cmnd: board %d: " | ||
11390 | "AscExeScsiQueue() unknown, err_code 0x%x\n", | ||
11391 | boardp->id, asc_dvc_varp->err_code); | ||
11392 | ASC_STATS(scp->device->host, exe_unknown); | ||
11393 | scp->result = HOST_BYTE(DID_ERROR); | ||
11394 | break; | ||
11395 | } | ||
11396 | } else { | 11350 | } else { |
11397 | /* | 11351 | ADV_DVC_VAR *adv_dvc = &boardp->dvc_var.adv_dvc_var; |
11398 | * Build and execute Wide Board request. | 11352 | ADV_SCSI_REQ_Q *adv_scsiqp; |
11399 | */ | ||
11400 | adv_dvc_varp = &boardp->dvc_var.adv_dvc_var; | ||
11401 | 11353 | ||
11402 | /* | ||
11403 | * Build and get a pointer to an Adv Library request structure. | ||
11404 | * | ||
11405 | * If the request is successfully built then send it below, | ||
11406 | * otherwise return with an error. | ||
11407 | */ | ||
11408 | switch (adv_build_req(boardp, scp, &adv_scsiqp)) { | 11354 | switch (adv_build_req(boardp, scp, &adv_scsiqp)) { |
11409 | case ASC_NOERROR: | 11355 | case ASC_NOERROR: |
11410 | ASC_DBG(3, "asc_execute_scsi_cmnd: adv_build_req " | 11356 | ASC_DBG(3, "asc_execute_scsi_cmnd: adv_build_req " |
@@ -11428,35 +11374,36 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp) | |||
11428 | return ASC_ERROR; | 11374 | return ASC_ERROR; |
11429 | } | 11375 | } |
11430 | 11376 | ||
11431 | switch (ret = AdvExeScsiQueue(adv_dvc_varp, adv_scsiqp)) { | 11377 | ret = AdvExeScsiQueue(adv_dvc, adv_scsiqp); |
11432 | case ASC_NOERROR: | 11378 | err_code = adv_dvc->err_code; |
11433 | ASC_STATS(scp->device->host, exe_noerror); | 11379 | } |
11434 | /* | 11380 | |
11435 | * Increment monotonically increasing per device | 11381 | switch (ret) { |
11436 | * successful request counter. Wrapping doesn't matter. | 11382 | case ASC_NOERROR: |
11437 | */ | 11383 | ASC_STATS(scp->device->host, exe_noerror); |
11438 | boardp->reqcnt[scp->device->id]++; | 11384 | /* |
11439 | ASC_DBG(1, "asc_execute_scsi_cmnd: AdvExeScsiQueue(), " | 11385 | * Increment monotonically increasing per device |
11440 | "ASC_NOERROR\n"); | 11386 | * successful request counter. Wrapping doesn't matter. |
11441 | break; | 11387 | */ |
11442 | case ASC_BUSY: | 11388 | boardp->reqcnt[scp->device->id]++; |
11443 | ASC_STATS(scp->device->host, exe_busy); | 11389 | ASC_DBG(1, "asc_execute_scsi_cmnd: ExeScsiQueue(), " |
11444 | break; | 11390 | "ASC_NOERROR\n"); |
11445 | case ASC_ERROR: | 11391 | break; |
11446 | ASC_PRINT2("asc_execute_scsi_cmnd: board %d: " | 11392 | case ASC_BUSY: |
11447 | "AdvExeScsiQueue() ASC_ERROR, err_code 0x%x\n", | 11393 | ASC_STATS(scp->device->host, exe_busy); |
11448 | boardp->id, adv_dvc_varp->err_code); | 11394 | break; |
11449 | ASC_STATS(scp->device->host, exe_error); | 11395 | case ASC_ERROR: |
11450 | scp->result = HOST_BYTE(DID_ERROR); | 11396 | ASC_PRINT2("asc_execute_scsi_cmnd: board %d: ExeScsiQueue() " |
11451 | break; | 11397 | "ASC_ERROR, err_code 0x%x\n", boardp->id, err_code); |
11452 | default: | 11398 | ASC_STATS(scp->device->host, exe_error); |
11453 | ASC_PRINT2("asc_execute_scsi_cmnd: board %d: " | 11399 | scp->result = HOST_BYTE(DID_ERROR); |
11454 | "AdvExeScsiQueue() unknown, err_code 0x%x\n", | 11400 | break; |
11455 | boardp->id, adv_dvc_varp->err_code); | 11401 | default: |
11456 | ASC_STATS(scp->device->host, exe_unknown); | 11402 | ASC_PRINT2("asc_execute_scsi_cmnd: board %d: ExeScsiQueue() " |
11457 | scp->result = HOST_BYTE(DID_ERROR); | 11403 | "unknown, err_code 0x%x\n", boardp->id, err_code); |
11458 | break; | 11404 | ASC_STATS(scp->device->host, exe_unknown); |
11459 | } | 11405 | scp->result = HOST_BYTE(DID_ERROR); |
11406 | break; | ||
11460 | } | 11407 | } |
11461 | 11408 | ||
11462 | ASC_DBG(1, "asc_execute_scsi_cmnd: end\n"); | 11409 | ASC_DBG(1, "asc_execute_scsi_cmnd: end\n"); |