diff options
author | Christoph Hellwig <hch@lst.de> | 2018-10-11 10:17:13 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-10-17 21:34:20 -0400 |
commit | cd29660dc8675ec235db23e38435fad833158e1c (patch) | |
tree | 7e43624c93a3ec6b9044e981486730910e196b41 /drivers/scsi/dc395x.c | |
parent | 77266186397c6c782a3f670d32808a9671806ec5 (diff) |
scsi: dc395x: simplify list handling
Remove the list wrappers, including the pointless list iteration before
deletion.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/dc395x.c')
-rw-r--r-- | drivers/scsi/dc395x.c | 152 |
1 files changed, 26 insertions, 126 deletions
diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c index 1ed2cd82129d..8705730b2e5a 100644 --- a/drivers/scsi/dc395x.c +++ b/drivers/scsi/dc395x.c | |||
@@ -753,105 +753,6 @@ static inline struct ScsiReqBlk *find_cmd(struct scsi_cmnd *cmd, | |||
753 | return NULL; | 753 | return NULL; |
754 | } | 754 | } |
755 | 755 | ||
756 | |||
757 | static struct ScsiReqBlk *srb_get_free(struct AdapterCtlBlk *acb) | ||
758 | { | ||
759 | struct list_head *head = &acb->srb_free_list; | ||
760 | struct ScsiReqBlk *srb = NULL; | ||
761 | |||
762 | if (!list_empty(head)) { | ||
763 | srb = list_entry(head->next, struct ScsiReqBlk, list); | ||
764 | list_del(head->next); | ||
765 | dprintkdbg(DBG_0, "srb_get_free: srb=%p\n", srb); | ||
766 | } | ||
767 | return srb; | ||
768 | } | ||
769 | |||
770 | |||
771 | static void srb_free_insert(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) | ||
772 | { | ||
773 | dprintkdbg(DBG_0, "srb_free_insert: srb=%p\n", srb); | ||
774 | list_add_tail(&srb->list, &acb->srb_free_list); | ||
775 | } | ||
776 | |||
777 | |||
778 | static void srb_waiting_insert(struct DeviceCtlBlk *dcb, | ||
779 | struct ScsiReqBlk *srb) | ||
780 | { | ||
781 | dprintkdbg(DBG_0, "srb_waiting_insert: (0x%p) <%02i-%i> srb=%p\n", | ||
782 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
783 | list_add(&srb->list, &dcb->srb_waiting_list); | ||
784 | } | ||
785 | |||
786 | |||
787 | static void srb_waiting_append(struct DeviceCtlBlk *dcb, | ||
788 | struct ScsiReqBlk *srb) | ||
789 | { | ||
790 | dprintkdbg(DBG_0, "srb_waiting_append: (0x%p) <%02i-%i> srb=%p\n", | ||
791 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
792 | list_add_tail(&srb->list, &dcb->srb_waiting_list); | ||
793 | } | ||
794 | |||
795 | |||
796 | static void srb_going_append(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) | ||
797 | { | ||
798 | dprintkdbg(DBG_0, "srb_going_append: (0x%p) <%02i-%i> srb=%p\n", | ||
799 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
800 | list_add_tail(&srb->list, &dcb->srb_going_list); | ||
801 | } | ||
802 | |||
803 | |||
804 | static void srb_going_remove(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) | ||
805 | { | ||
806 | struct ScsiReqBlk *i; | ||
807 | struct ScsiReqBlk *tmp; | ||
808 | dprintkdbg(DBG_0, "srb_going_remove: (0x%p) <%02i-%i> srb=%p\n", | ||
809 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
810 | |||
811 | list_for_each_entry_safe(i, tmp, &dcb->srb_going_list, list) | ||
812 | if (i == srb) { | ||
813 | list_del(&srb->list); | ||
814 | break; | ||
815 | } | ||
816 | } | ||
817 | |||
818 | |||
819 | static void srb_waiting_remove(struct DeviceCtlBlk *dcb, | ||
820 | struct ScsiReqBlk *srb) | ||
821 | { | ||
822 | struct ScsiReqBlk *i; | ||
823 | struct ScsiReqBlk *tmp; | ||
824 | dprintkdbg(DBG_0, "srb_waiting_remove: (0x%p) <%02i-%i> srb=%p\n", | ||
825 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
826 | |||
827 | list_for_each_entry_safe(i, tmp, &dcb->srb_waiting_list, list) | ||
828 | if (i == srb) { | ||
829 | list_del(&srb->list); | ||
830 | break; | ||
831 | } | ||
832 | } | ||
833 | |||
834 | |||
835 | static void srb_going_to_waiting_move(struct DeviceCtlBlk *dcb, | ||
836 | struct ScsiReqBlk *srb) | ||
837 | { | ||
838 | dprintkdbg(DBG_0, | ||
839 | "srb_going_to_waiting_move: (0x%p) <%02i-%i> srb=%p\n", | ||
840 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
841 | list_move(&srb->list, &dcb->srb_waiting_list); | ||
842 | } | ||
843 | |||
844 | |||
845 | static void srb_waiting_to_going_move(struct DeviceCtlBlk *dcb, | ||
846 | struct ScsiReqBlk *srb) | ||
847 | { | ||
848 | dprintkdbg(DBG_0, | ||
849 | "srb_waiting_to_going_move: (0x%p) <%02i-%i> srb=%p\n", | ||
850 | srb->cmd, dcb->target_id, dcb->target_lun, srb); | ||
851 | list_move(&srb->list, &dcb->srb_going_list); | ||
852 | } | ||
853 | |||
854 | |||
855 | /* Sets the timer to wake us up */ | 756 | /* Sets the timer to wake us up */ |
856 | static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) | 757 | static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) |
857 | { | 758 | { |
@@ -923,7 +824,7 @@ static void waiting_process_next(struct AdapterCtlBlk *acb) | |||
923 | 824 | ||
924 | /* Try to send to the bus */ | 825 | /* Try to send to the bus */ |
925 | if (!start_scsi(acb, pos, srb)) | 826 | if (!start_scsi(acb, pos, srb)) |
926 | srb_waiting_to_going_move(pos, srb); | 827 | list_move(&srb->list, &pos->srb_going_list); |
927 | else | 828 | else |
928 | waiting_set_timer(acb, HZ/50); | 829 | waiting_set_timer(acb, HZ/50); |
929 | break; | 830 | break; |
@@ -960,15 +861,15 @@ static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) | |||
960 | if (dcb->max_command <= list_size(&dcb->srb_going_list) || | 861 | if (dcb->max_command <= list_size(&dcb->srb_going_list) || |
961 | acb->active_dcb || | 862 | acb->active_dcb || |
962 | (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { | 863 | (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { |
963 | srb_waiting_append(dcb, srb); | 864 | list_add_tail(&srb->list, &dcb->srb_waiting_list); |
964 | waiting_process_next(acb); | 865 | waiting_process_next(acb); |
965 | return; | 866 | return; |
966 | } | 867 | } |
967 | 868 | ||
968 | if (!start_scsi(acb, dcb, srb)) | 869 | if (!start_scsi(acb, dcb, srb)) { |
969 | srb_going_append(dcb, srb); | 870 | list_add_tail(&srb->list, &dcb->srb_going_list); |
970 | else { | 871 | } else { |
971 | srb_waiting_insert(dcb, srb); | 872 | list_add(&srb->list, &dcb->srb_waiting_list); |
972 | waiting_set_timer(acb, HZ / 50); | 873 | waiting_set_timer(acb, HZ / 50); |
973 | } | 874 | } |
974 | } | 875 | } |
@@ -1116,9 +1017,9 @@ static int dc395x_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct s | |||
1116 | cmd->scsi_done = done; | 1017 | cmd->scsi_done = done; |
1117 | cmd->result = 0; | 1018 | cmd->result = 0; |
1118 | 1019 | ||
1119 | srb = srb_get_free(acb); | 1020 | srb = list_first_entry_or_null(&acb->srb_free_list, |
1120 | if (!srb) | 1021 | struct ScsiReqBlk, list); |
1121 | { | 1022 | if (!srb) { |
1122 | /* | 1023 | /* |
1123 | * Return 1 since we are unable to queue this command at this | 1024 | * Return 1 since we are unable to queue this command at this |
1124 | * point in time. | 1025 | * point in time. |
@@ -1126,12 +1027,13 @@ static int dc395x_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct s | |||
1126 | dprintkdbg(DBG_0, "queue_command: No free srb's\n"); | 1027 | dprintkdbg(DBG_0, "queue_command: No free srb's\n"); |
1127 | return 1; | 1028 | return 1; |
1128 | } | 1029 | } |
1030 | list_del(&srb->list); | ||
1129 | 1031 | ||
1130 | build_srb(cmd, dcb, srb); | 1032 | build_srb(cmd, dcb, srb); |
1131 | 1033 | ||
1132 | if (!list_empty(&dcb->srb_waiting_list)) { | 1034 | if (!list_empty(&dcb->srb_waiting_list)) { |
1133 | /* append to waiting queue */ | 1035 | /* append to waiting queue */ |
1134 | srb_waiting_append(dcb, srb); | 1036 | list_add_tail(&srb->list, &dcb->srb_waiting_list); |
1135 | waiting_process_next(acb); | 1037 | waiting_process_next(acb); |
1136 | } else { | 1038 | } else { |
1137 | /* process immediately */ | 1039 | /* process immediately */ |
@@ -1376,11 +1278,11 @@ static int dc395x_eh_abort(struct scsi_cmnd *cmd) | |||
1376 | 1278 | ||
1377 | srb = find_cmd(cmd, &dcb->srb_waiting_list); | 1279 | srb = find_cmd(cmd, &dcb->srb_waiting_list); |
1378 | if (srb) { | 1280 | if (srb) { |
1379 | srb_waiting_remove(dcb, srb); | 1281 | list_del(&srb->list); |
1380 | pci_unmap_srb_sense(acb, srb); | 1282 | pci_unmap_srb_sense(acb, srb); |
1381 | pci_unmap_srb(acb, srb); | 1283 | pci_unmap_srb(acb, srb); |
1382 | free_tag(dcb, srb); | 1284 | free_tag(dcb, srb); |
1383 | srb_free_insert(acb, srb); | 1285 | list_add_tail(&srb->list, &acb->srb_free_list); |
1384 | dprintkl(KERN_DEBUG, "eh_abort: Command was waiting\n"); | 1286 | dprintkl(KERN_DEBUG, "eh_abort: Command was waiting\n"); |
1385 | cmd->result = DID_ABORT << 16; | 1287 | cmd->result = DID_ABORT << 16; |
1386 | return SUCCESS; | 1288 | return SUCCESS; |
@@ -3083,7 +2985,7 @@ static void disconnect(struct AdapterCtlBlk *acb) | |||
3083 | goto disc1; | 2985 | goto disc1; |
3084 | } | 2986 | } |
3085 | free_tag(dcb, srb); | 2987 | free_tag(dcb, srb); |
3086 | srb_going_to_waiting_move(dcb, srb); | 2988 | list_move(&srb->list, &dcb->srb_waiting_list); |
3087 | dprintkdbg(DBG_KG, | 2989 | dprintkdbg(DBG_KG, |
3088 | "disconnect: (0x%p) Retry\n", | 2990 | "disconnect: (0x%p) Retry\n", |
3089 | srb->cmd); | 2991 | srb->cmd); |
@@ -3148,7 +3050,7 @@ static void reselect(struct AdapterCtlBlk *acb) | |||
3148 | 3050 | ||
3149 | srb->state = SRB_READY; | 3051 | srb->state = SRB_READY; |
3150 | free_tag(dcb, srb); | 3052 | free_tag(dcb, srb); |
3151 | srb_going_to_waiting_move(dcb, srb); | 3053 | list_move(&srb->list, &dcb->srb_waiting_list); |
3152 | waiting_set_timer(acb, HZ / 20); | 3054 | waiting_set_timer(acb, HZ / 20); |
3153 | 3055 | ||
3154 | /* return; */ | 3056 | /* return; */ |
@@ -3411,7 +3313,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, | |||
3411 | tempcnt--; | 3313 | tempcnt--; |
3412 | dcb->max_command = tempcnt; | 3314 | dcb->max_command = tempcnt; |
3413 | free_tag(dcb, srb); | 3315 | free_tag(dcb, srb); |
3414 | srb_going_to_waiting_move(dcb, srb); | 3316 | list_move(&srb->list, &dcb->srb_waiting_list); |
3415 | waiting_set_timer(acb, HZ / 20); | 3317 | waiting_set_timer(acb, HZ / 20); |
3416 | srb->adapter_status = 0; | 3318 | srb->adapter_status = 0; |
3417 | srb->target_status = 0; | 3319 | srb->target_status = 0; |
@@ -3498,14 +3400,13 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, | |||
3498 | cmd->cmnd[0], srb->total_xfer_length); | 3400 | cmd->cmnd[0], srb->total_xfer_length); |
3499 | } | 3401 | } |
3500 | 3402 | ||
3501 | srb_going_remove(dcb, srb); | 3403 | if (srb != acb->tmp_srb) { |
3502 | /* Add to free list */ | 3404 | /* Add to free list */ |
3503 | if (srb == acb->tmp_srb) | ||
3504 | dprintkl(KERN_ERR, "srb_done: ERROR! Completed cmd with tmp_srb\n"); | ||
3505 | else { | ||
3506 | dprintkdbg(DBG_0, "srb_done: (0x%p) done result=0x%08x\n", | 3405 | dprintkdbg(DBG_0, "srb_done: (0x%p) done result=0x%08x\n", |
3507 | cmd, cmd->result); | 3406 | cmd, cmd->result); |
3508 | srb_free_insert(acb, srb); | 3407 | list_move_tail(&srb->list, &acb->srb_free_list); |
3408 | } else { | ||
3409 | dprintkl(KERN_ERR, "srb_done: ERROR! Completed cmd with tmp_srb\n"); | ||
3509 | } | 3410 | } |
3510 | pci_unmap_srb(acb, srb); | 3411 | pci_unmap_srb(acb, srb); |
3511 | 3412 | ||
@@ -3535,9 +3436,9 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, | |||
3535 | result = MK_RES(0, did_flag, 0, 0); | 3436 | result = MK_RES(0, did_flag, 0, 0); |
3536 | printk("G:%p(%02i-%i) ", p, | 3437 | printk("G:%p(%02i-%i) ", p, |
3537 | p->device->id, (u8)p->device->lun); | 3438 | p->device->id, (u8)p->device->lun); |
3538 | srb_going_remove(dcb, srb); | 3439 | list_del(&srb->list); |
3539 | free_tag(dcb, srb); | 3440 | free_tag(dcb, srb); |
3540 | srb_free_insert(acb, srb); | 3441 | list_add_tail(&srb->list, &acb->srb_free_list); |
3541 | p->result = result; | 3442 | p->result = result; |
3542 | pci_unmap_srb_sense(acb, srb); | 3443 | pci_unmap_srb_sense(acb, srb); |
3543 | pci_unmap_srb(acb, srb); | 3444 | pci_unmap_srb(acb, srb); |
@@ -3565,8 +3466,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, | |||
3565 | result = MK_RES(0, did_flag, 0, 0); | 3466 | result = MK_RES(0, did_flag, 0, 0); |
3566 | printk("W:%p<%02i-%i>", p, p->device->id, | 3467 | printk("W:%p<%02i-%i>", p, p->device->id, |
3567 | (u8)p->device->lun); | 3468 | (u8)p->device->lun); |
3568 | srb_waiting_remove(dcb, srb); | 3469 | list_move_tail(&srb->list, &acb->srb_free_list); |
3569 | srb_free_insert(acb, srb); | ||
3570 | p->result = result; | 3470 | p->result = result; |
3571 | pci_unmap_srb_sense(acb, srb); | 3471 | pci_unmap_srb_sense(acb, srb); |
3572 | pci_unmap_srb(acb, srb); | 3472 | pci_unmap_srb(acb, srb); |
@@ -3705,7 +3605,7 @@ static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, | |||
3705 | dprintkl(KERN_DEBUG, | 3605 | dprintkl(KERN_DEBUG, |
3706 | "request_sense: (0x%p) failed <%02i-%i>\n", | 3606 | "request_sense: (0x%p) failed <%02i-%i>\n", |
3707 | srb->cmd, dcb->target_id, dcb->target_lun); | 3607 | srb->cmd, dcb->target_id, dcb->target_lun); |
3708 | srb_going_to_waiting_move(dcb, srb); | 3608 | list_move(&srb->list, &dcb->srb_waiting_list); |
3709 | waiting_set_timer(acb, HZ / 100); | 3609 | waiting_set_timer(acb, HZ / 100); |
3710 | } | 3610 | } |
3711 | } | 3611 | } |
@@ -4392,7 +4292,7 @@ static void adapter_init_params(struct AdapterCtlBlk *acb) | |||
4392 | 4292 | ||
4393 | /* link static array of srbs into the srb free list */ | 4293 | /* link static array of srbs into the srb free list */ |
4394 | for (i = 0; i < acb->srb_count - 1; i++) | 4294 | for (i = 0; i < acb->srb_count - 1; i++) |
4395 | srb_free_insert(acb, &acb->srb_array[i]); | 4295 | list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); |
4396 | } | 4296 | } |
4397 | 4297 | ||
4398 | 4298 | ||