diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2007-05-25 13:00:42 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-06-17 13:04:36 -0400 |
commit | 727eead62e22cf0a9498cf34e075c08269402978 (patch) | |
tree | 05835453a61f23932dc5dd7a7c095be2347c1e5a /drivers/scsi/aacraid/aachba.c | |
parent | 2f4cf91cc0a1f32f75e1fa0a4d70a9bc7340a302 (diff) |
[SCSI] aacraid: convert to use the data buffer accessors
- remove the unnecessary map_single path.
- convert to use the new accessors for the sg lists and the
parameters.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: "Salyzyn, Mark" <mark_salyzyn@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aacraid/aachba.c')
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 166 |
1 files changed, 49 insertions, 117 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 47014beef96e..2dbfbe3cf453 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -344,21 +344,16 @@ static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigne | |||
344 | { | 344 | { |
345 | void *buf; | 345 | void *buf; |
346 | int transfer_len; | 346 | int transfer_len; |
347 | struct scatterlist *sg = scsicmd->request_buffer; | 347 | struct scatterlist *sg = scsi_sglist(scsicmd); |
348 | |||
349 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | ||
350 | transfer_len = min(sg->length, len + offset); | ||
348 | 351 | ||
349 | if (scsicmd->use_sg) { | ||
350 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | ||
351 | transfer_len = min(sg->length, len + offset); | ||
352 | } else { | ||
353 | buf = scsicmd->request_buffer; | ||
354 | transfer_len = min(scsicmd->request_bufflen, len + offset); | ||
355 | } | ||
356 | transfer_len -= offset; | 352 | transfer_len -= offset; |
357 | if (buf && transfer_len > 0) | 353 | if (buf && transfer_len > 0) |
358 | memcpy(buf + offset, data, transfer_len); | 354 | memcpy(buf + offset, data, transfer_len); |
359 | 355 | ||
360 | if (scsicmd->use_sg) | 356 | kunmap_atomic(buf - sg->offset, KM_IRQ0); |
361 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | ||
362 | 357 | ||
363 | } | 358 | } |
364 | 359 | ||
@@ -1043,7 +1038,7 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd) | |||
1043 | struct aac_srb * srbcmd = aac_scsi_common(fib, cmd); | 1038 | struct aac_srb * srbcmd = aac_scsi_common(fib, cmd); |
1044 | 1039 | ||
1045 | aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg); | 1040 | aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg); |
1046 | srbcmd->count = cpu_to_le32(cmd->request_bufflen); | 1041 | srbcmd->count = cpu_to_le32(scsi_bufflen(cmd)); |
1047 | 1042 | ||
1048 | memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); | 1043 | memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); |
1049 | memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); | 1044 | memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); |
@@ -1071,7 +1066,7 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd) | |||
1071 | struct aac_srb * srbcmd = aac_scsi_common(fib, cmd); | 1066 | struct aac_srb * srbcmd = aac_scsi_common(fib, cmd); |
1072 | 1067 | ||
1073 | aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg); | 1068 | aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg); |
1074 | srbcmd->count = cpu_to_le32(cmd->request_bufflen); | 1069 | srbcmd->count = cpu_to_le32(scsi_bufflen(cmd)); |
1075 | 1070 | ||
1076 | memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); | 1071 | memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); |
1077 | memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); | 1072 | memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); |
@@ -1373,16 +1368,9 @@ static void io_callback(void *context, struct fib * fibptr) | |||
1373 | } | 1368 | } |
1374 | 1369 | ||
1375 | BUG_ON(fibptr == NULL); | 1370 | BUG_ON(fibptr == NULL); |
1376 | 1371 | ||
1377 | if(scsicmd->use_sg) | 1372 | scsi_dma_unmap(scsicmd); |
1378 | pci_unmap_sg(dev->pdev, | 1373 | |
1379 | (struct scatterlist *)scsicmd->request_buffer, | ||
1380 | scsicmd->use_sg, | ||
1381 | scsicmd->sc_data_direction); | ||
1382 | else if(scsicmd->request_bufflen) | ||
1383 | pci_unmap_single(dev->pdev, scsicmd->SCp.dma_handle, | ||
1384 | scsicmd->request_bufflen, | ||
1385 | scsicmd->sc_data_direction); | ||
1386 | readreply = (struct aac_read_reply *)fib_data(fibptr); | 1374 | readreply = (struct aac_read_reply *)fib_data(fibptr); |
1387 | if (le32_to_cpu(readreply->status) == ST_OK) | 1375 | if (le32_to_cpu(readreply->status) == ST_OK) |
1388 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 1376 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; |
@@ -2182,18 +2170,11 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |||
2182 | /* | 2170 | /* |
2183 | * Calculate resid for sg | 2171 | * Calculate resid for sg |
2184 | */ | 2172 | */ |
2185 | 2173 | ||
2186 | scsicmd->resid = scsicmd->request_bufflen - | 2174 | scsi_set_resid(scsicmd, scsi_bufflen(scsicmd) |
2187 | le32_to_cpu(srbreply->data_xfer_length); | 2175 | - le32_to_cpu(srbreply->data_xfer_length)); |
2188 | 2176 | ||
2189 | if(scsicmd->use_sg) | 2177 | scsi_dma_unmap(scsicmd); |
2190 | pci_unmap_sg(dev->pdev, | ||
2191 | (struct scatterlist *)scsicmd->request_buffer, | ||
2192 | scsicmd->use_sg, | ||
2193 | scsicmd->sc_data_direction); | ||
2194 | else if(scsicmd->request_bufflen) | ||
2195 | pci_unmap_single(dev->pdev, scsicmd->SCp.dma_handle, scsicmd->request_bufflen, | ||
2196 | scsicmd->sc_data_direction); | ||
2197 | 2178 | ||
2198 | /* | 2179 | /* |
2199 | * First check the fib status | 2180 | * First check the fib status |
@@ -2379,34 +2360,33 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg) | |||
2379 | { | 2360 | { |
2380 | struct aac_dev *dev; | 2361 | struct aac_dev *dev; |
2381 | unsigned long byte_count = 0; | 2362 | unsigned long byte_count = 0; |
2363 | int nseg; | ||
2382 | 2364 | ||
2383 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 2365 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
2384 | // Get rid of old data | 2366 | // Get rid of old data |
2385 | psg->count = 0; | 2367 | psg->count = 0; |
2386 | psg->sg[0].addr = 0; | 2368 | psg->sg[0].addr = 0; |
2387 | psg->sg[0].count = 0; | 2369 | psg->sg[0].count = 0; |
2388 | if (scsicmd->use_sg) { | 2370 | |
2371 | nseg = scsi_dma_map(scsicmd); | ||
2372 | BUG_ON(nseg < 0); | ||
2373 | if (nseg) { | ||
2389 | struct scatterlist *sg; | 2374 | struct scatterlist *sg; |
2390 | int i; | 2375 | int i; |
2391 | int sg_count; | ||
2392 | sg = (struct scatterlist *) scsicmd->request_buffer; | ||
2393 | 2376 | ||
2394 | sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg, | 2377 | psg->count = cpu_to_le32(nseg); |
2395 | scsicmd->sc_data_direction); | ||
2396 | psg->count = cpu_to_le32(sg_count); | ||
2397 | 2378 | ||
2398 | for (i = 0; i < sg_count; i++) { | 2379 | scsi_for_each_sg(scsicmd, sg, nseg, i) { |
2399 | psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); | 2380 | psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); |
2400 | psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); | 2381 | psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); |
2401 | byte_count += sg_dma_len(sg); | 2382 | byte_count += sg_dma_len(sg); |
2402 | sg++; | ||
2403 | } | 2383 | } |
2404 | /* hba wants the size to be exact */ | 2384 | /* hba wants the size to be exact */ |
2405 | if(byte_count > scsicmd->request_bufflen){ | 2385 | if (byte_count > scsi_bufflen(scsicmd)) { |
2406 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - | 2386 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - |
2407 | (byte_count - scsicmd->request_bufflen); | 2387 | (byte_count - scsi_bufflen(scsicmd)); |
2408 | psg->sg[i-1].count = cpu_to_le32(temp); | 2388 | psg->sg[i-1].count = cpu_to_le32(temp); |
2409 | byte_count = scsicmd->request_bufflen; | 2389 | byte_count = scsi_bufflen(scsicmd); |
2410 | } | 2390 | } |
2411 | /* Check for command underflow */ | 2391 | /* Check for command underflow */ |
2412 | if(scsicmd->underflow && (byte_count < scsicmd->underflow)){ | 2392 | if(scsicmd->underflow && (byte_count < scsicmd->underflow)){ |
@@ -2414,18 +2394,6 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg) | |||
2414 | byte_count, scsicmd->underflow); | 2394 | byte_count, scsicmd->underflow); |
2415 | } | 2395 | } |
2416 | } | 2396 | } |
2417 | else if(scsicmd->request_bufflen) { | ||
2418 | u32 addr; | ||
2419 | scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, | ||
2420 | scsicmd->request_buffer, | ||
2421 | scsicmd->request_bufflen, | ||
2422 | scsicmd->sc_data_direction); | ||
2423 | addr = scsicmd->SCp.dma_handle; | ||
2424 | psg->count = cpu_to_le32(1); | ||
2425 | psg->sg[0].addr = cpu_to_le32(addr); | ||
2426 | psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen); | ||
2427 | byte_count = scsicmd->request_bufflen; | ||
2428 | } | ||
2429 | return byte_count; | 2397 | return byte_count; |
2430 | } | 2398 | } |
2431 | 2399 | ||
@@ -2435,6 +2403,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p | |||
2435 | struct aac_dev *dev; | 2403 | struct aac_dev *dev; |
2436 | unsigned long byte_count = 0; | 2404 | unsigned long byte_count = 0; |
2437 | u64 addr; | 2405 | u64 addr; |
2406 | int nseg; | ||
2438 | 2407 | ||
2439 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 2408 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
2440 | // Get rid of old data | 2409 | // Get rid of old data |
@@ -2442,31 +2411,28 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p | |||
2442 | psg->sg[0].addr[0] = 0; | 2411 | psg->sg[0].addr[0] = 0; |
2443 | psg->sg[0].addr[1] = 0; | 2412 | psg->sg[0].addr[1] = 0; |
2444 | psg->sg[0].count = 0; | 2413 | psg->sg[0].count = 0; |
2445 | if (scsicmd->use_sg) { | 2414 | |
2415 | nseg = scsi_dma_map(scsicmd); | ||
2416 | BUG_ON(nseg < 0); | ||
2417 | if (nseg) { | ||
2446 | struct scatterlist *sg; | 2418 | struct scatterlist *sg; |
2447 | int i; | 2419 | int i; |
2448 | int sg_count; | ||
2449 | sg = (struct scatterlist *) scsicmd->request_buffer; | ||
2450 | |||
2451 | sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg, | ||
2452 | scsicmd->sc_data_direction); | ||
2453 | 2420 | ||
2454 | for (i = 0; i < sg_count; i++) { | 2421 | scsi_for_each_sg(scsicmd, sg, nseg, i) { |
2455 | int count = sg_dma_len(sg); | 2422 | int count = sg_dma_len(sg); |
2456 | addr = sg_dma_address(sg); | 2423 | addr = sg_dma_address(sg); |
2457 | psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); | 2424 | psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); |
2458 | psg->sg[i].addr[1] = cpu_to_le32(addr>>32); | 2425 | psg->sg[i].addr[1] = cpu_to_le32(addr>>32); |
2459 | psg->sg[i].count = cpu_to_le32(count); | 2426 | psg->sg[i].count = cpu_to_le32(count); |
2460 | byte_count += count; | 2427 | byte_count += count; |
2461 | sg++; | ||
2462 | } | 2428 | } |
2463 | psg->count = cpu_to_le32(sg_count); | 2429 | psg->count = cpu_to_le32(nseg); |
2464 | /* hba wants the size to be exact */ | 2430 | /* hba wants the size to be exact */ |
2465 | if(byte_count > scsicmd->request_bufflen){ | 2431 | if (byte_count > scsi_bufflen(scsicmd)) { |
2466 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - | 2432 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - |
2467 | (byte_count - scsicmd->request_bufflen); | 2433 | (byte_count - scsi_bufflen(scsicmd)); |
2468 | psg->sg[i-1].count = cpu_to_le32(temp); | 2434 | psg->sg[i-1].count = cpu_to_le32(temp); |
2469 | byte_count = scsicmd->request_bufflen; | 2435 | byte_count = scsi_bufflen(scsicmd); |
2470 | } | 2436 | } |
2471 | /* Check for command underflow */ | 2437 | /* Check for command underflow */ |
2472 | if(scsicmd->underflow && (byte_count < scsicmd->underflow)){ | 2438 | if(scsicmd->underflow && (byte_count < scsicmd->underflow)){ |
@@ -2474,26 +2440,13 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p | |||
2474 | byte_count, scsicmd->underflow); | 2440 | byte_count, scsicmd->underflow); |
2475 | } | 2441 | } |
2476 | } | 2442 | } |
2477 | else if(scsicmd->request_bufflen) { | ||
2478 | scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, | ||
2479 | scsicmd->request_buffer, | ||
2480 | scsicmd->request_bufflen, | ||
2481 | scsicmd->sc_data_direction); | ||
2482 | addr = scsicmd->SCp.dma_handle; | ||
2483 | psg->count = cpu_to_le32(1); | ||
2484 | psg->sg[0].addr[0] = cpu_to_le32(addr & 0xffffffff); | ||
2485 | psg->sg[0].addr[1] = cpu_to_le32(addr >> 32); | ||
2486 | psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen); | ||
2487 | byte_count = scsicmd->request_bufflen; | ||
2488 | } | ||
2489 | return byte_count; | 2443 | return byte_count; |
2490 | } | 2444 | } |
2491 | 2445 | ||
2492 | static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg) | 2446 | static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg) |
2493 | { | 2447 | { |
2494 | struct Scsi_Host *host = scsicmd->device->host; | ||
2495 | struct aac_dev *dev = (struct aac_dev *)host->hostdata; | ||
2496 | unsigned long byte_count = 0; | 2448 | unsigned long byte_count = 0; |
2449 | int nseg; | ||
2497 | 2450 | ||
2498 | // Get rid of old data | 2451 | // Get rid of old data |
2499 | psg->count = 0; | 2452 | psg->count = 0; |
@@ -2503,16 +2456,14 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* | |||
2503 | psg->sg[0].addr[1] = 0; | 2456 | psg->sg[0].addr[1] = 0; |
2504 | psg->sg[0].count = 0; | 2457 | psg->sg[0].count = 0; |
2505 | psg->sg[0].flags = 0; | 2458 | psg->sg[0].flags = 0; |
2506 | if (scsicmd->use_sg) { | 2459 | |
2460 | nseg = scsi_dma_map(scsicmd); | ||
2461 | BUG_ON(nseg < 0); | ||
2462 | if (nseg) { | ||
2507 | struct scatterlist *sg; | 2463 | struct scatterlist *sg; |
2508 | int i; | 2464 | int i; |
2509 | int sg_count; | ||
2510 | sg = (struct scatterlist *) scsicmd->request_buffer; | ||
2511 | 2465 | ||
2512 | sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg, | 2466 | scsi_for_each_sg(scsicmd, sg, nseg, i) { |
2513 | scsicmd->sc_data_direction); | ||
2514 | |||
2515 | for (i = 0; i < sg_count; i++) { | ||
2516 | int count = sg_dma_len(sg); | 2467 | int count = sg_dma_len(sg); |
2517 | u64 addr = sg_dma_address(sg); | 2468 | u64 addr = sg_dma_address(sg); |
2518 | psg->sg[i].next = 0; | 2469 | psg->sg[i].next = 0; |
@@ -2522,15 +2473,14 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* | |||
2522 | psg->sg[i].count = cpu_to_le32(count); | 2473 | psg->sg[i].count = cpu_to_le32(count); |
2523 | psg->sg[i].flags = 0; | 2474 | psg->sg[i].flags = 0; |
2524 | byte_count += count; | 2475 | byte_count += count; |
2525 | sg++; | ||
2526 | } | 2476 | } |
2527 | psg->count = cpu_to_le32(sg_count); | 2477 | psg->count = cpu_to_le32(nseg); |
2528 | /* hba wants the size to be exact */ | 2478 | /* hba wants the size to be exact */ |
2529 | if(byte_count > scsicmd->request_bufflen){ | 2479 | if (byte_count > scsi_bufflen(scsicmd)) { |
2530 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - | 2480 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - |
2531 | (byte_count - scsicmd->request_bufflen); | 2481 | (byte_count - scsi_bufflen(scsicmd)); |
2532 | psg->sg[i-1].count = cpu_to_le32(temp); | 2482 | psg->sg[i-1].count = cpu_to_le32(temp); |
2533 | byte_count = scsicmd->request_bufflen; | 2483 | byte_count = scsi_bufflen(scsicmd); |
2534 | } | 2484 | } |
2535 | /* Check for command underflow */ | 2485 | /* Check for command underflow */ |
2536 | if(scsicmd->underflow && (byte_count < scsicmd->underflow)){ | 2486 | if(scsicmd->underflow && (byte_count < scsicmd->underflow)){ |
@@ -2538,24 +2488,6 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* | |||
2538 | byte_count, scsicmd->underflow); | 2488 | byte_count, scsicmd->underflow); |
2539 | } | 2489 | } |
2540 | } | 2490 | } |
2541 | else if(scsicmd->request_bufflen) { | ||
2542 | int count; | ||
2543 | u64 addr; | ||
2544 | scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, | ||
2545 | scsicmd->request_buffer, | ||
2546 | scsicmd->request_bufflen, | ||
2547 | scsicmd->sc_data_direction); | ||
2548 | addr = scsicmd->SCp.dma_handle; | ||
2549 | count = scsicmd->request_bufflen; | ||
2550 | psg->count = cpu_to_le32(1); | ||
2551 | psg->sg[0].next = 0; | ||
2552 | psg->sg[0].prev = 0; | ||
2553 | psg->sg[0].addr[1] = cpu_to_le32((u32)(addr>>32)); | ||
2554 | psg->sg[0].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff)); | ||
2555 | psg->sg[0].count = cpu_to_le32(count); | ||
2556 | psg->sg[0].flags = 0; | ||
2557 | byte_count = scsicmd->request_bufflen; | ||
2558 | } | ||
2559 | return byte_count; | 2491 | return byte_count; |
2560 | } | 2492 | } |
2561 | 2493 | ||