diff options
Diffstat (limited to 'drivers/scsi/aha152x.c')
| -rw-r--r-- | drivers/scsi/aha152x.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 36e63f82d9f8..f974869ea323 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c | |||
| @@ -551,6 +551,11 @@ struct aha152x_hostdata { | |||
| 551 | struct aha152x_scdata { | 551 | struct aha152x_scdata { |
| 552 | Scsi_Cmnd *next; /* next sc in queue */ | 552 | Scsi_Cmnd *next; /* next sc in queue */ |
| 553 | struct semaphore *sem; /* semaphore to block on */ | 553 | struct semaphore *sem; /* semaphore to block on */ |
| 554 | unsigned char cmd_len; | ||
| 555 | unsigned char cmnd[MAX_COMMAND_SIZE]; | ||
| 556 | unsigned short use_sg; | ||
| 557 | unsigned request_bufflen; | ||
| 558 | void *request_buffer; | ||
| 554 | }; | 559 | }; |
| 555 | 560 | ||
| 556 | 561 | ||
| @@ -1006,11 +1011,20 @@ static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int p | |||
| 1006 | return FAILED; | 1011 | return FAILED; |
| 1007 | } | 1012 | } |
| 1008 | } else { | 1013 | } else { |
| 1014 | struct aha152x_scdata *sc; | ||
| 1015 | |||
| 1009 | SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC); | 1016 | SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC); |
| 1010 | if(SCpnt->host_scribble==0) { | 1017 | if(SCpnt->host_scribble==0) { |
| 1011 | printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt)); | 1018 | printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt)); |
| 1012 | return FAILED; | 1019 | return FAILED; |
| 1013 | } | 1020 | } |
| 1021 | |||
| 1022 | sc = SCDATA(SCpnt); | ||
| 1023 | memcpy(sc->cmnd, SCpnt->cmnd, sizeof(sc->cmnd)); | ||
| 1024 | sc->request_buffer = SCpnt->request_buffer; | ||
| 1025 | sc->request_bufflen = SCpnt->request_bufflen; | ||
| 1026 | sc->use_sg = SCpnt->use_sg; | ||
| 1027 | sc->cmd_len = SCpnt->cmd_len; | ||
| 1014 | } | 1028 | } |
| 1015 | 1029 | ||
| 1016 | SCNEXT(SCpnt) = NULL; | 1030 | SCNEXT(SCpnt) = NULL; |
| @@ -1165,6 +1179,10 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt) | |||
| 1165 | DECLARE_MUTEX_LOCKED(sem); | 1179 | DECLARE_MUTEX_LOCKED(sem); |
| 1166 | struct timer_list timer; | 1180 | struct timer_list timer; |
| 1167 | int ret, issued, disconnected; | 1181 | int ret, issued, disconnected; |
| 1182 | unsigned char old_cmd_len = SCpnt->cmd_len; | ||
| 1183 | unsigned short old_use_sg = SCpnt->use_sg; | ||
| 1184 | void *old_buffer = SCpnt->request_buffer; | ||
| 1185 | unsigned old_bufflen = SCpnt->request_bufflen; | ||
| 1168 | unsigned long flags; | 1186 | unsigned long flags; |
| 1169 | 1187 | ||
| 1170 | #if defined(AHA152X_DEBUG) | 1188 | #if defined(AHA152X_DEBUG) |
| @@ -1198,11 +1216,11 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt) | |||
| 1198 | add_timer(&timer); | 1216 | add_timer(&timer); |
| 1199 | down(&sem); | 1217 | down(&sem); |
| 1200 | del_timer(&timer); | 1218 | del_timer(&timer); |
| 1201 | 1219 | ||
| 1202 | SCpnt->cmd_len = SCpnt->old_cmd_len; | 1220 | SCpnt->cmd_len = old_cmd_len; |
| 1203 | SCpnt->use_sg = SCpnt->old_use_sg; | 1221 | SCpnt->use_sg = old_use_sg; |
| 1204 | SCpnt->request_buffer = SCpnt->buffer; | 1222 | SCpnt->request_buffer = old_buffer; |
| 1205 | SCpnt->request_bufflen = SCpnt->bufflen; | 1223 | SCpnt->request_bufflen = old_bufflen; |
| 1206 | 1224 | ||
| 1207 | DO_LOCK(flags); | 1225 | DO_LOCK(flags); |
| 1208 | 1226 | ||
| @@ -1565,6 +1583,9 @@ static void busfree_run(struct Scsi_Host *shpnt) | |||
| 1565 | #endif | 1583 | #endif |
| 1566 | 1584 | ||
| 1567 | if(DONE_SC->SCp.phase & check_condition) { | 1585 | if(DONE_SC->SCp.phase & check_condition) { |
| 1586 | struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC; | ||
| 1587 | struct aha152x_scdata *sc = SCDATA(cmd); | ||
| 1588 | |||
| 1568 | #if 0 | 1589 | #if 0 |
| 1569 | if(HOSTDATA(shpnt)->debug & debug_eh) { | 1590 | if(HOSTDATA(shpnt)->debug & debug_eh) { |
| 1570 | printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC)); | 1591 | printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC)); |
| @@ -1573,13 +1594,13 @@ static void busfree_run(struct Scsi_Host *shpnt) | |||
| 1573 | #endif | 1594 | #endif |
| 1574 | 1595 | ||
| 1575 | /* restore old command */ | 1596 | /* restore old command */ |
| 1576 | memcpy((void *) DONE_SC->cmnd, (void *) DONE_SC->data_cmnd, sizeof(DONE_SC->data_cmnd)); | 1597 | memcpy(cmd->cmnd, sc->cmnd, sizeof(sc->cmnd)); |
| 1577 | DONE_SC->request_buffer = DONE_SC->buffer; | 1598 | cmd->request_buffer = sc->request_buffer; |
| 1578 | DONE_SC->request_bufflen = DONE_SC->bufflen; | 1599 | cmd->request_bufflen = sc->request_bufflen; |
| 1579 | DONE_SC->use_sg = DONE_SC->old_use_sg; | 1600 | cmd->use_sg = sc->use_sg; |
| 1580 | DONE_SC->cmd_len = DONE_SC->old_cmd_len; | 1601 | cmd->cmd_len = sc->cmd_len; |
| 1581 | 1602 | ||
| 1582 | DONE_SC->SCp.Status = 0x02; | 1603 | cmd->SCp.Status = 0x02; |
| 1583 | 1604 | ||
| 1584 | HOSTDATA(shpnt)->commands--; | 1605 | HOSTDATA(shpnt)->commands--; |
| 1585 | if (!HOSTDATA(shpnt)->commands) | 1606 | if (!HOSTDATA(shpnt)->commands) |
