aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-10-11 10:17:13 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2018-10-17 21:34:20 -0400
commitcd29660dc8675ec235db23e38435fad833158e1c (patch)
tree7e43624c93a3ec6b9044e981486730910e196b41
parent77266186397c6c782a3f670d32808a9671806ec5 (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>
-rw-r--r--drivers/scsi/dc395x.c152
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
757static 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
771static 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
778static 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
787static 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
796static 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
804static 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
819static 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
835static 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
845static 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 */
856static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) 757static 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