diff options
Diffstat (limited to 'drivers/scsi/gdth_proc.c')
| -rw-r--r-- | drivers/scsi/gdth_proc.c | 245 |
1 files changed, 40 insertions, 205 deletions
diff --git a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c index 5e8657f9cdf6..32982eb75c84 100644 --- a/drivers/scsi/gdth_proc.c +++ b/drivers/scsi/gdth_proc.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* gdth_proc.c | 1 | /* gdth_proc.c |
| 2 | * $Id: gdth_proc.c,v 1.42 2004/03/05 15:50:20 achim Exp $ | 2 | * $Id: gdth_proc.c,v 1.43 2006/01/11 16:15:00 achim Exp $ |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #include <linux/completion.h> | 5 | #include <linux/completion.h> |
| @@ -51,57 +51,26 @@ int gdth_proc_info(char *buffer,char **start,off_t offset,int length,int hostno, | |||
| 51 | static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host, | 51 | static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host, |
| 52 | int hanum,int busnum) | 52 | int hanum,int busnum) |
| 53 | { | 53 | { |
| 54 | int ret_val = -EINVAL; | 54 | int ret_val = -EINVAL; |
| 55 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | ||
| 56 | Scsi_Request *scp; | ||
| 57 | struct scsi_device *sdev; | ||
| 58 | #else | ||
| 59 | Scsi_Cmnd *scp; | ||
| 60 | struct scsi_device *sdev; | ||
| 61 | #endif | ||
| 62 | TRACE2(("gdth_set_info() ha %d bus %d\n",hanum,busnum)); | ||
| 63 | 55 | ||
| 64 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 56 | TRACE2(("gdth_set_info() ha %d bus %d\n",hanum,busnum)); |
| 65 | sdev = scsi_get_host_dev(host); | ||
| 66 | scp = scsi_allocate_request(sdev, GFP_KERNEL); | ||
| 67 | if (!scp) | ||
| 68 | return -ENOMEM; | ||
| 69 | scp->sr_cmd_len = 12; | ||
| 70 | scp->sr_use_sg = 0; | ||
| 71 | #else | ||
| 72 | sdev = scsi_get_host_dev(host); | ||
| 73 | scp = scsi_allocate_device(sdev, 1, FALSE); | ||
| 74 | if (!scp) | ||
| 75 | return -ENOMEM; | ||
| 76 | scp->cmd_len = 12; | ||
| 77 | scp->use_sg = 0; | ||
| 78 | #endif | ||
| 79 | 57 | ||
| 80 | if (length >= 4) { | 58 | if (length >= 4) { |
| 81 | if (strncmp(buffer,"gdth",4) == 0) { | 59 | if (strncmp(buffer,"gdth",4) == 0) { |
| 82 | buffer += 5; | 60 | buffer += 5; |
| 83 | length -= 5; | 61 | length -= 5; |
| 84 | ret_val = gdth_set_asc_info( buffer, length, hanum, scp ); | 62 | ret_val = gdth_set_asc_info(host, buffer, length, hanum); |
| 85 | } | 63 | } |
| 86 | } | 64 | } |
| 87 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 65 | |
| 88 | scsi_release_request(scp); | ||
| 89 | scsi_free_host_dev(sdev); | ||
| 90 | #else | ||
| 91 | scsi_release_command(scp); | ||
| 92 | scsi_free_host_dev(sdev); | ||
| 93 | #endif | ||
| 94 | return ret_val; | 66 | return ret_val; |
| 95 | } | 67 | } |
| 96 | 68 | ||
| 97 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 69 | static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, |
| 98 | static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Request *scp) | 70 | int length,int hanum) |
| 99 | #else | ||
| 100 | static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp) | ||
| 101 | #endif | ||
| 102 | { | 71 | { |
| 103 | int orig_length, drive, wb_mode; | 72 | int orig_length, drive, wb_mode; |
| 104 | int i, found; | 73 | int i, found; |
| 105 | gdth_ha_str *ha; | 74 | gdth_ha_str *ha; |
| 106 | gdth_cmd_str gdtcmd; | 75 | gdth_cmd_str gdtcmd; |
| 107 | gdth_cpar_str *pcpar; | 76 | gdth_cpar_str *pcpar; |
| @@ -146,11 +115,8 @@ static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp) | |||
| 146 | gdtcmd.u.cache.DeviceNo = i; | 115 | gdtcmd.u.cache.DeviceNo = i; |
| 147 | gdtcmd.u.cache.BlockNo = 1; | 116 | gdtcmd.u.cache.BlockNo = 1; |
| 148 | } | 117 | } |
| 149 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 118 | |
| 150 | gdth_do_req(scp, &gdtcmd, cmnd, 30); | 119 | gdth_execute(host, &gdtcmd, cmnd, 30, NULL); |
| 151 | #else | ||
| 152 | gdth_do_cmd(scp, &gdtcmd, cmnd, 30); | ||
| 153 | #endif | ||
| 154 | } | 120 | } |
| 155 | } | 121 | } |
| 156 | if (!found) | 122 | if (!found) |
| @@ -202,11 +168,9 @@ static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp) | |||
| 202 | gdtcmd.u.ioctl.subfunc = CACHE_CONFIG; | 168 | gdtcmd.u.ioctl.subfunc = CACHE_CONFIG; |
| 203 | gdtcmd.u.ioctl.channel = INVALID_CHANNEL; | 169 | gdtcmd.u.ioctl.channel = INVALID_CHANNEL; |
| 204 | pcpar->write_back = wb_mode==1 ? 0:1; | 170 | pcpar->write_back = wb_mode==1 ? 0:1; |
| 205 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 171 | |
| 206 | gdth_do_req(scp, &gdtcmd, cmnd, 30); | 172 | gdth_execute(host, &gdtcmd, cmnd, 30, NULL); |
| 207 | #else | 173 | |
| 208 | gdth_do_cmd(scp, &gdtcmd, cmnd, 30); | ||
| 209 | #endif | ||
| 210 | gdth_ioctl_free(hanum, GDTH_SCRATCH, ha->pscratch, paddr); | 174 | gdth_ioctl_free(hanum, GDTH_SCRATCH, ha->pscratch, paddr); |
| 211 | printk("Done.\n"); | 175 | printk("Done.\n"); |
| 212 | return(orig_length); | 176 | return(orig_length); |
| @@ -230,13 +194,6 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 230 | 194 | ||
| 231 | gdth_cmd_str *gdtcmd; | 195 | gdth_cmd_str *gdtcmd; |
| 232 | gdth_evt_str *estr; | 196 | gdth_evt_str *estr; |
| 233 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | ||
| 234 | Scsi_Request *scp; | ||
| 235 | struct scsi_device *sdev; | ||
| 236 | #else | ||
| 237 | Scsi_Cmnd *scp; | ||
| 238 | struct scsi_device *sdev; | ||
| 239 | #endif | ||
| 240 | char hrec[161]; | 197 | char hrec[161]; |
| 241 | struct timeval tv; | 198 | struct timeval tv; |
| 242 | 199 | ||
| @@ -252,7 +209,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 252 | gdtcmd = kmalloc(sizeof(*gdtcmd), GFP_KERNEL); | 209 | gdtcmd = kmalloc(sizeof(*gdtcmd), GFP_KERNEL); |
| 253 | estr = kmalloc(sizeof(*estr), GFP_KERNEL); | 210 | estr = kmalloc(sizeof(*estr), GFP_KERNEL); |
| 254 | if (!gdtcmd || !estr) | 211 | if (!gdtcmd || !estr) |
| 255 | goto free_fail; | 212 | goto free_fail; |
| 256 | 213 | ||
| 257 | memset(cmnd, 0xff, 12); | 214 | memset(cmnd, 0xff, 12); |
| 258 | memset(gdtcmd, 0, sizeof(gdth_cmd_str)); | 215 | memset(gdtcmd, 0, sizeof(gdth_cmd_str)); |
| @@ -260,28 +217,6 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 260 | TRACE2(("gdth_get_info() ha %d bus %d\n",hanum,busnum)); | 217 | TRACE2(("gdth_get_info() ha %d bus %d\n",hanum,busnum)); |
| 261 | ha = HADATA(gdth_ctr_tab[hanum]); | 218 | ha = HADATA(gdth_ctr_tab[hanum]); |
| 262 | 219 | ||
| 263 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | ||
| 264 | sdev = scsi_get_host_dev(host); | ||
| 265 | scp = scsi_allocate_request(sdev, GFP_KERNEL); | ||
| 266 | if (!scp) | ||
| 267 | goto free_fail; | ||
| 268 | scp->sr_cmd_len = 12; | ||
| 269 | scp->sr_use_sg = 0; | ||
| 270 | #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) | ||
| 271 | sdev = scsi_get_host_dev(host); | ||
| 272 | scp = scsi_allocate_device(sdev, 1, FALSE); | ||
| 273 | if (!scp) | ||
| 274 | goto free_fail; | ||
| 275 | scp->cmd_len = 12; | ||
| 276 | scp->use_sg = 0; | ||
| 277 | #else | ||
| 278 | memset(&sdev,0,sizeof(struct scsi_device)); | ||
| 279 | memset(&scp, 0,sizeof(Scsi_Cmnd)); | ||
| 280 | sdev.host = scp.host = host; | ||
| 281 | sdev.id = scp.target = sdev.host->this_id; | ||
| 282 | scp.device = &sdev; | ||
| 283 | #endif | ||
| 284 | |||
| 285 | 220 | ||
| 286 | /* request is i.e. "cat /proc/scsi/gdth/0" */ | 221 | /* request is i.e. "cat /proc/scsi/gdth/0" */ |
| 287 | /* format: %-15s\t%-10s\t%-15s\t%s */ | 222 | /* format: %-15s\t%-10s\t%-15s\t%s */ |
| @@ -386,16 +321,9 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 386 | sizeof(pds->list[0]); | 321 | sizeof(pds->list[0]); |
| 387 | if (pds->entries > cnt) | 322 | if (pds->entries > cnt) |
| 388 | pds->entries = cnt; | 323 | pds->entries = cnt; |
| 389 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 324 | |
| 390 | gdth_do_req(scp, gdtcmd, cmnd, 30); | 325 | if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) != S_OK) |
| 391 | if (scp->sr_command->SCp.Status != S_OK) | ||
| 392 | #else | ||
| 393 | gdth_do_cmd(scp, gdtcmd, cmnd, 30); | ||
| 394 | if (scp->SCp.Status != S_OK) | ||
| 395 | #endif | ||
| 396 | { | ||
| 397 | pds->count = 0; | 326 | pds->count = 0; |
| 398 | } | ||
| 399 | 327 | ||
| 400 | /* other IOCTLs must fit into area GDTH_SCRATCH/4 */ | 328 | /* other IOCTLs must fit into area GDTH_SCRATCH/4 */ |
| 401 | for (j = 0; j < ha->raw[i].pdev_cnt; ++j) { | 329 | for (j = 0; j < ha->raw[i].pdev_cnt; ++j) { |
| @@ -410,14 +338,8 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 410 | gdtcmd->u.ioctl.subfunc = SCSI_DR_INFO | L_CTRL_PATTERN; | 338 | gdtcmd->u.ioctl.subfunc = SCSI_DR_INFO | L_CTRL_PATTERN; |
| 411 | gdtcmd->u.ioctl.channel = | 339 | gdtcmd->u.ioctl.channel = |
| 412 | ha->raw[i].address | ha->raw[i].id_list[j]; | 340 | ha->raw[i].address | ha->raw[i].id_list[j]; |
| 413 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 341 | |
| 414 | gdth_do_req(scp, gdtcmd, cmnd, 30); | 342 | if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { |
| 415 | if (scp->sr_command->SCp.Status == S_OK) | ||
| 416 | #else | ||
| 417 | gdth_do_cmd(scp, gdtcmd, cmnd, 30); | ||
| 418 | if (scp->SCp.Status == S_OK) | ||
| 419 | #endif | ||
| 420 | { | ||
| 421 | strncpy(hrec,pdi->vendor,8); | 343 | strncpy(hrec,pdi->vendor,8); |
| 422 | strncpy(hrec+8,pdi->product,16); | 344 | strncpy(hrec+8,pdi->product,16); |
| 423 | strncpy(hrec+24,pdi->revision,4); | 345 | strncpy(hrec+24,pdi->revision,4); |
| @@ -466,14 +388,8 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 466 | gdtcmd->u.ioctl.channel = | 388 | gdtcmd->u.ioctl.channel = |
| 467 | ha->raw[i].address | ha->raw[i].id_list[j]; | 389 | ha->raw[i].address | ha->raw[i].id_list[j]; |
| 468 | pdef->sddc_type = 0x08; | 390 | pdef->sddc_type = 0x08; |
| 469 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 391 | |
| 470 | gdth_do_req(scp, gdtcmd, cmnd, 30); | 392 | if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { |
| 471 | if (scp->sr_command->SCp.Status == S_OK) | ||
| 472 | #else | ||
| 473 | gdth_do_cmd(scp, gdtcmd, cmnd, 30); | ||
| 474 | if (scp->SCp.Status == S_OK) | ||
| 475 | #endif | ||
| 476 | { | ||
| 477 | size = sprintf(buffer+len, | 393 | size = sprintf(buffer+len, |
| 478 | " Grown Defects:\t%d\n", | 394 | " Grown Defects:\t%d\n", |
| 479 | pdef->sddc_cnt); | 395 | pdef->sddc_cnt); |
| @@ -519,16 +435,8 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 519 | gdtcmd->u.ioctl.param_size = sizeof(gdth_cdrinfo_str); | 435 | gdtcmd->u.ioctl.param_size = sizeof(gdth_cdrinfo_str); |
| 520 | gdtcmd->u.ioctl.subfunc = CACHE_DRV_INFO; | 436 | gdtcmd->u.ioctl.subfunc = CACHE_DRV_INFO; |
| 521 | gdtcmd->u.ioctl.channel = drv_no; | 437 | gdtcmd->u.ioctl.channel = drv_no; |
| 522 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 438 | if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) != S_OK) |
| 523 | gdth_do_req(scp, gdtcmd, cmnd, 30); | ||
| 524 | if (scp->sr_command->SCp.Status != S_OK) | ||
| 525 | #else | ||
| 526 | gdth_do_cmd(scp, gdtcmd, cmnd, 30); | ||
| 527 | if (scp->SCp.Status != S_OK) | ||
| 528 | #endif | ||
| 529 | { | ||
| 530 | break; | 439 | break; |
| 531 | } | ||
| 532 | pcdi->ld_dtype >>= 16; | 440 | pcdi->ld_dtype >>= 16; |
| 533 | j++; | 441 | j++; |
| 534 | if (pcdi->ld_dtype > 2) { | 442 | if (pcdi->ld_dtype > 2) { |
| @@ -629,14 +537,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 629 | gdtcmd->u.ioctl.param_size = sizeof(gdth_arrayinf_str); | 537 | gdtcmd->u.ioctl.param_size = sizeof(gdth_arrayinf_str); |
| 630 | gdtcmd->u.ioctl.subfunc = ARRAY_INFO | LA_CTRL_PATTERN; | 538 | gdtcmd->u.ioctl.subfunc = ARRAY_INFO | LA_CTRL_PATTERN; |
| 631 | gdtcmd->u.ioctl.channel = i; | 539 | gdtcmd->u.ioctl.channel = i; |
| 632 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 540 | if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { |
| 633 | gdth_do_req(scp, gdtcmd, cmnd, 30); | ||
| 634 | if (scp->sr_command->SCp.Status == S_OK) | ||
| 635 | #else | ||
| 636 | gdth_do_cmd(scp, gdtcmd, cmnd, 30); | ||
| 637 | if (scp->SCp.Status == S_OK) | ||
| 638 | #endif | ||
| 639 | { | ||
| 640 | if (pai->ai_state == 0) | 541 | if (pai->ai_state == 0) |
| 641 | strcpy(hrec, "idle"); | 542 | strcpy(hrec, "idle"); |
| 642 | else if (pai->ai_state == 2) | 543 | else if (pai->ai_state == 2) |
| @@ -710,14 +611,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 710 | gdtcmd->u.ioctl.channel = i; | 611 | gdtcmd->u.ioctl.channel = i; |
| 711 | phg->entries = MAX_HDRIVES; | 612 | phg->entries = MAX_HDRIVES; |
| 712 | phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]); | 613 | phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]); |
| 713 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | 614 | if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { |
| 714 | gdth_do_req(scp, gdtcmd, cmnd, 30); | ||
| 715 | if (scp->sr_command->SCp.Status != S_OK) | ||
| 716 | #else | ||
| 717 | gdth_do_cmd(scp, gdtcmd, cmnd, 30); | ||
| 718 | if (scp->SCp.Status != S_OK) | ||
| 719 | #endif | ||
| 720 | { | ||
| 721 | ha->hdr[i].ldr_no = i; | 615 | ha->hdr[i].ldr_no = i; |
| 722 | ha->hdr[i].rw_attribs = 0; | 616 | ha->hdr[i].rw_attribs = 0; |
| 723 | ha->hdr[i].start_sec = 0; | 617 | ha->hdr[i].start_sec = 0; |
| @@ -791,13 +685,6 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, | |||
| 791 | } | 685 | } |
| 792 | 686 | ||
| 793 | stop_output: | 687 | stop_output: |
| 794 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | ||
| 795 | scsi_release_request(scp); | ||
| 796 | scsi_free_host_dev(sdev); | ||
| 797 | #else | ||
| 798 | scsi_release_command(scp); | ||
| 799 | scsi_free_host_dev(sdev); | ||
| 800 | #endif | ||
| 801 | *start = buffer +(offset-begin); | 688 | *start = buffer +(offset-begin); |
| 802 | len -= (offset-begin); | 689 | len -= (offset-begin); |
| 803 | if (len > length) | 690 | if (len > length) |
| @@ -812,64 +699,6 @@ free_fail: | |||
| 812 | return rc; | 699 | return rc; |
| 813 | } | 700 | } |
| 814 | 701 | ||
| 815 | |||
| 816 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | ||
| 817 | static void gdth_do_req(Scsi_Request *scp, gdth_cmd_str *gdtcmd, | ||
| 818 | char *cmnd, int timeout) | ||
| 819 | { | ||
| 820 | unsigned bufflen; | ||
| 821 | DECLARE_COMPLETION(wait); | ||
| 822 | |||
| 823 | TRACE2(("gdth_do_req()\n")); | ||
| 824 | if (gdtcmd != NULL) { | ||
| 825 | bufflen = sizeof(gdth_cmd_str); | ||
| 826 | } else { | ||
| 827 | bufflen = 0; | ||
| 828 | } | ||
| 829 | scp->sr_request->rq_status = RQ_SCSI_BUSY; | ||
| 830 | scp->sr_request->waiting = &wait; | ||
| 831 | scsi_do_req(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); | ||
| 832 | wait_for_completion(&wait); | ||
| 833 | } | ||
| 834 | |||
| 835 | #else | ||
| 836 | static void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *gdtcmd, | ||
| 837 | char *cmnd, int timeout) | ||
| 838 | { | ||
| 839 | unsigned bufflen; | ||
| 840 | DECLARE_COMPLETION(wait); | ||
| 841 | |||
| 842 | TRACE2(("gdth_do_cmd()\n")); | ||
| 843 | if (gdtcmd != NULL) { | ||
| 844 | scp->SCp.this_residual = IOCTL_PRI; | ||
| 845 | bufflen = sizeof(gdth_cmd_str); | ||
| 846 | } else { | ||
| 847 | scp->SCp.this_residual = DEFAULT_PRI; | ||
| 848 | bufflen = 0; | ||
| 849 | } | ||
| 850 | |||
| 851 | scp->request.rq_status = RQ_SCSI_BUSY; | ||
| 852 | scp->request.waiting = &wait; | ||
| 853 | scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); | ||
| 854 | wait_for_completion(&wait); | ||
| 855 | } | ||
| 856 | #endif | ||
| 857 | |||
| 858 | void gdth_scsi_done(Scsi_Cmnd *scp) | ||
| 859 | { | ||
| 860 | TRACE2(("gdth_scsi_done()\n")); | ||
| 861 | |||
| 862 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) | ||
| 863 | scp->request->rq_status = RQ_SCSI_DONE; | ||
| 864 | if (scp->request->waiting != NULL) | ||
| 865 | complete(scp->request->waiting); | ||
| 866 | #else | ||
| 867 | scp->request.rq_status = RQ_SCSI_DONE; | ||
| 868 | if (scp->request.waiting != NULL) | ||
| 869 | complete(scp->request.waiting); | ||
| 870 | #endif | ||
| 871 | } | ||
| 872 | |||
| 873 | static char *gdth_ioctl_alloc(int hanum, int size, int scratch, | 702 | static char *gdth_ioctl_alloc(int hanum, int size, int scratch, |
| 874 | ulong64 *paddr) | 703 | ulong64 *paddr) |
| 875 | { | 704 | { |
| @@ -976,11 +805,14 @@ static void gdth_stop_timeout(int hanum, int busnum, int id) | |||
| 976 | spin_lock_irqsave(&ha->smp_lock, flags); | 805 | spin_lock_irqsave(&ha->smp_lock, flags); |
| 977 | 806 | ||
| 978 | for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { | 807 | for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { |
| 979 | b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel; | 808 | if (scp->done != gdth_scsi_done) { |
| 980 | t = scp->device->id; | 809 | b = virt_ctr ? |
| 981 | if (t == (unchar)id && b == (unchar)busnum) { | 810 | NUMDATA(scp->device->host)->busnum : scp->device->channel; |
| 982 | TRACE2(("gdth_stop_timeout(): update_timeout()\n")); | 811 | t = scp->device->id; |
| 983 | scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0); | 812 | if (t == (unchar)id && b == (unchar)busnum) { |
| 813 | TRACE2(("gdth_stop_timeout(): update_timeout()\n")); | ||
| 814 | scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0); | ||
| 815 | } | ||
| 984 | } | 816 | } |
| 985 | } | 817 | } |
| 986 | spin_unlock_irqrestore(&ha->smp_lock, flags); | 818 | spin_unlock_irqrestore(&ha->smp_lock, flags); |
| @@ -997,11 +829,14 @@ static void gdth_start_timeout(int hanum, int busnum, int id) | |||
| 997 | spin_lock_irqsave(&ha->smp_lock, flags); | 829 | spin_lock_irqsave(&ha->smp_lock, flags); |
| 998 | 830 | ||
| 999 | for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { | 831 | for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { |
| 1000 | b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel; | 832 | if (scp->done != gdth_scsi_done) { |
| 1001 | t = scp->device->id; | 833 | b = virt_ctr ? |
| 1002 | if (t == (unchar)id && b == (unchar)busnum) { | 834 | NUMDATA(scp->device->host)->busnum : scp->device->channel; |
| 1003 | TRACE2(("gdth_start_timeout(): update_timeout()\n")); | 835 | t = scp->device->id; |
| 1004 | gdth_update_timeout(hanum, scp, scp->SCp.buffers_residual); | 836 | if (t == (unchar)id && b == (unchar)busnum) { |
| 837 | TRACE2(("gdth_start_timeout(): update_timeout()\n")); | ||
| 838 | gdth_update_timeout(hanum, scp, scp->SCp.buffers_residual); | ||
| 839 | } | ||
| 1005 | } | 840 | } |
| 1006 | } | 841 | } |
| 1007 | spin_unlock_irqrestore(&ha->smp_lock, flags); | 842 | spin_unlock_irqrestore(&ha->smp_lock, flags); |
