| .. | .. |
|---|
| 61 | 61 | #include <asm/io.h> |
|---|
| 62 | 62 | |
|---|
| 63 | 63 | #include <scsi/scsi.h> |
|---|
| 64 | | -#include <scsi/scsicam.h> /* needed for scsicam_bios_param */ |
|---|
| 65 | 64 | #include <scsi/scsi_cmnd.h> |
|---|
| 66 | 65 | #include <scsi/scsi_device.h> |
|---|
| 67 | 66 | #include <scsi/scsi_host.h> |
|---|
| .. | .. |
|---|
| 753 | 752 | return NULL; |
|---|
| 754 | 753 | } |
|---|
| 755 | 754 | |
|---|
| 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 | 755 | /* Sets the timer to wake us up */ |
|---|
| 856 | 756 | static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) |
|---|
| 857 | 757 | { |
|---|
| .. | .. |
|---|
| 923 | 823 | |
|---|
| 924 | 824 | /* Try to send to the bus */ |
|---|
| 925 | 825 | if (!start_scsi(acb, pos, srb)) |
|---|
| 926 | | - srb_waiting_to_going_move(pos, srb); |
|---|
| 826 | + list_move(&srb->list, &pos->srb_going_list); |
|---|
| 927 | 827 | else |
|---|
| 928 | 828 | waiting_set_timer(acb, HZ/50); |
|---|
| 929 | 829 | break; |
|---|
| .. | .. |
|---|
| 960 | 860 | if (dcb->max_command <= list_size(&dcb->srb_going_list) || |
|---|
| 961 | 861 | acb->active_dcb || |
|---|
| 962 | 862 | (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { |
|---|
| 963 | | - srb_waiting_append(dcb, srb); |
|---|
| 863 | + list_add_tail(&srb->list, &dcb->srb_waiting_list); |
|---|
| 964 | 864 | waiting_process_next(acb); |
|---|
| 965 | 865 | return; |
|---|
| 966 | 866 | } |
|---|
| 967 | 867 | |
|---|
| 968 | | - if (!start_scsi(acb, dcb, srb)) |
|---|
| 969 | | - srb_going_append(dcb, srb); |
|---|
| 970 | | - else { |
|---|
| 971 | | - srb_waiting_insert(dcb, srb); |
|---|
| 868 | + if (!start_scsi(acb, dcb, srb)) { |
|---|
| 869 | + list_add_tail(&srb->list, &dcb->srb_going_list); |
|---|
| 870 | + } else { |
|---|
| 871 | + list_add(&srb->list, &dcb->srb_waiting_list); |
|---|
| 972 | 872 | waiting_set_timer(acb, HZ / 50); |
|---|
| 973 | 873 | } |
|---|
| 974 | 874 | } |
|---|
| .. | .. |
|---|
| 1002 | 902 | nseg = scsi_dma_map(cmd); |
|---|
| 1003 | 903 | BUG_ON(nseg < 0); |
|---|
| 1004 | 904 | |
|---|
| 1005 | | - if (dir == PCI_DMA_NONE || !nseg) { |
|---|
| 905 | + if (dir == DMA_NONE || !nseg) { |
|---|
| 1006 | 906 | dprintkdbg(DBG_0, |
|---|
| 1007 | 907 | "build_srb: [0] len=%d buf=%p use_sg=%d !MAP=%08x\n", |
|---|
| 1008 | 908 | cmd->bufflen, scsi_sglist(cmd), scsi_sg_count(cmd), |
|---|
| .. | .. |
|---|
| 1045 | 945 | sgp->length++; |
|---|
| 1046 | 946 | } |
|---|
| 1047 | 947 | |
|---|
| 1048 | | - srb->sg_bus_addr = pci_map_single(dcb->acb->dev, |
|---|
| 1049 | | - srb->segment_x, |
|---|
| 1050 | | - SEGMENTX_LEN, |
|---|
| 1051 | | - PCI_DMA_TODEVICE); |
|---|
| 948 | + srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, |
|---|
| 949 | + srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE); |
|---|
| 1052 | 950 | |
|---|
| 1053 | 951 | dprintkdbg(DBG_SG, "build_srb: [n] map sg %p->%08x(%05x)\n", |
|---|
| 1054 | 952 | srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN); |
|---|
| .. | .. |
|---|
| 1116 | 1014 | cmd->scsi_done = done; |
|---|
| 1117 | 1015 | cmd->result = 0; |
|---|
| 1118 | 1016 | |
|---|
| 1119 | | - srb = srb_get_free(acb); |
|---|
| 1120 | | - if (!srb) |
|---|
| 1121 | | - { |
|---|
| 1017 | + srb = list_first_entry_or_null(&acb->srb_free_list, |
|---|
| 1018 | + struct ScsiReqBlk, list); |
|---|
| 1019 | + if (!srb) { |
|---|
| 1122 | 1020 | /* |
|---|
| 1123 | 1021 | * Return 1 since we are unable to queue this command at this |
|---|
| 1124 | 1022 | * point in time. |
|---|
| .. | .. |
|---|
| 1126 | 1024 | dprintkdbg(DBG_0, "queue_command: No free srb's\n"); |
|---|
| 1127 | 1025 | return 1; |
|---|
| 1128 | 1026 | } |
|---|
| 1027 | + list_del(&srb->list); |
|---|
| 1129 | 1028 | |
|---|
| 1130 | 1029 | build_srb(cmd, dcb, srb); |
|---|
| 1131 | 1030 | |
|---|
| 1132 | 1031 | if (!list_empty(&dcb->srb_waiting_list)) { |
|---|
| 1133 | 1032 | /* append to waiting queue */ |
|---|
| 1134 | | - srb_waiting_append(dcb, srb); |
|---|
| 1033 | + list_add_tail(&srb->list, &dcb->srb_waiting_list); |
|---|
| 1135 | 1034 | waiting_process_next(acb); |
|---|
| 1136 | 1035 | } else { |
|---|
| 1137 | 1036 | /* process immediately */ |
|---|
| .. | .. |
|---|
| 1152 | 1051 | } |
|---|
| 1153 | 1052 | |
|---|
| 1154 | 1053 | static DEF_SCSI_QCMD(dc395x_queue_command) |
|---|
| 1155 | | - |
|---|
| 1156 | | -/* |
|---|
| 1157 | | - * Return the disk geometry for the given SCSI device. |
|---|
| 1158 | | - */ |
|---|
| 1159 | | -static int dc395x_bios_param(struct scsi_device *sdev, |
|---|
| 1160 | | - struct block_device *bdev, sector_t capacity, int *info) |
|---|
| 1161 | | -{ |
|---|
| 1162 | | -#ifdef CONFIG_SCSI_DC395x_TRMS1040_TRADMAP |
|---|
| 1163 | | - int heads, sectors, cylinders; |
|---|
| 1164 | | - struct AdapterCtlBlk *acb; |
|---|
| 1165 | | - int size = capacity; |
|---|
| 1166 | | - |
|---|
| 1167 | | - dprintkdbg(DBG_0, "dc395x_bios_param..............\n"); |
|---|
| 1168 | | - acb = (struct AdapterCtlBlk *)sdev->host->hostdata; |
|---|
| 1169 | | - heads = 64; |
|---|
| 1170 | | - sectors = 32; |
|---|
| 1171 | | - cylinders = size / (heads * sectors); |
|---|
| 1172 | | - |
|---|
| 1173 | | - if ((acb->gmode2 & NAC_GREATER_1G) && (cylinders > 1024)) { |
|---|
| 1174 | | - heads = 255; |
|---|
| 1175 | | - sectors = 63; |
|---|
| 1176 | | - cylinders = size / (heads * sectors); |
|---|
| 1177 | | - } |
|---|
| 1178 | | - geom[0] = heads; |
|---|
| 1179 | | - geom[1] = sectors; |
|---|
| 1180 | | - geom[2] = cylinders; |
|---|
| 1181 | | - return 0; |
|---|
| 1182 | | -#else |
|---|
| 1183 | | - return scsicam_bios_param(bdev, capacity, info); |
|---|
| 1184 | | -#endif |
|---|
| 1185 | | -} |
|---|
| 1186 | | - |
|---|
| 1187 | 1054 | |
|---|
| 1188 | 1055 | static void dump_register_info(struct AdapterCtlBlk *acb, |
|---|
| 1189 | 1056 | struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) |
|---|
| .. | .. |
|---|
| 1376 | 1243 | |
|---|
| 1377 | 1244 | srb = find_cmd(cmd, &dcb->srb_waiting_list); |
|---|
| 1378 | 1245 | if (srb) { |
|---|
| 1379 | | - srb_waiting_remove(dcb, srb); |
|---|
| 1246 | + list_del(&srb->list); |
|---|
| 1380 | 1247 | pci_unmap_srb_sense(acb, srb); |
|---|
| 1381 | 1248 | pci_unmap_srb(acb, srb); |
|---|
| 1382 | 1249 | free_tag(dcb, srb); |
|---|
| 1383 | | - srb_free_insert(acb, srb); |
|---|
| 1250 | + list_add_tail(&srb->list, &acb->srb_free_list); |
|---|
| 1384 | 1251 | dprintkl(KERN_DEBUG, "eh_abort: Command was waiting\n"); |
|---|
| 1385 | 1252 | cmd->result = DID_ABORT << 16; |
|---|
| 1386 | 1253 | return SUCCESS; |
|---|
| .. | .. |
|---|
| 1969 | 1836 | xferred -= psge->length; |
|---|
| 1970 | 1837 | } else { |
|---|
| 1971 | 1838 | /* Partial SG entry done */ |
|---|
| 1972 | | - pci_dma_sync_single_for_cpu(srb->dcb-> |
|---|
| 1973 | | - acb->dev, |
|---|
| 1974 | | - srb->sg_bus_addr, |
|---|
| 1975 | | - SEGMENTX_LEN, |
|---|
| 1976 | | - PCI_DMA_TODEVICE); |
|---|
| 1839 | + dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, |
|---|
| 1840 | + srb->sg_bus_addr, SEGMENTX_LEN, |
|---|
| 1841 | + DMA_TO_DEVICE); |
|---|
| 1977 | 1842 | psge->length -= xferred; |
|---|
| 1978 | 1843 | psge->address += xferred; |
|---|
| 1979 | 1844 | srb->sg_index = idx; |
|---|
| 1980 | | - pci_dma_sync_single_for_device(srb->dcb-> |
|---|
| 1981 | | - acb->dev, |
|---|
| 1982 | | - srb->sg_bus_addr, |
|---|
| 1983 | | - SEGMENTX_LEN, |
|---|
| 1984 | | - PCI_DMA_TODEVICE); |
|---|
| 1845 | + dma_sync_single_for_device(&srb->dcb->acb->dev->dev, |
|---|
| 1846 | + srb->sg_bus_addr, SEGMENTX_LEN, |
|---|
| 1847 | + DMA_TO_DEVICE); |
|---|
| 1985 | 1848 | break; |
|---|
| 1986 | 1849 | } |
|---|
| 1987 | 1850 | psge++; |
|---|
| .. | .. |
|---|
| 3088 | 2951 | goto disc1; |
|---|
| 3089 | 2952 | } |
|---|
| 3090 | 2953 | free_tag(dcb, srb); |
|---|
| 3091 | | - srb_going_to_waiting_move(dcb, srb); |
|---|
| 2954 | + list_move(&srb->list, &dcb->srb_waiting_list); |
|---|
| 3092 | 2955 | dprintkdbg(DBG_KG, |
|---|
| 3093 | 2956 | "disconnect: (0x%p) Retry\n", |
|---|
| 3094 | 2957 | srb->cmd); |
|---|
| .. | .. |
|---|
| 3153 | 3016 | |
|---|
| 3154 | 3017 | srb->state = SRB_READY; |
|---|
| 3155 | 3018 | free_tag(dcb, srb); |
|---|
| 3156 | | - srb_going_to_waiting_move(dcb, srb); |
|---|
| 3019 | + list_move(&srb->list, &dcb->srb_waiting_list); |
|---|
| 3157 | 3020 | waiting_set_timer(acb, HZ / 20); |
|---|
| 3158 | 3021 | |
|---|
| 3159 | 3022 | /* return; */ |
|---|
| .. | .. |
|---|
| 3272 | 3135 | struct scsi_cmnd *cmd = srb->cmd; |
|---|
| 3273 | 3136 | enum dma_data_direction dir = cmd->sc_data_direction; |
|---|
| 3274 | 3137 | |
|---|
| 3275 | | - if (scsi_sg_count(cmd) && dir != PCI_DMA_NONE) { |
|---|
| 3138 | + if (scsi_sg_count(cmd) && dir != DMA_NONE) { |
|---|
| 3276 | 3139 | /* unmap DC395x SG list */ |
|---|
| 3277 | 3140 | dprintkdbg(DBG_SG, "pci_unmap_srb: list=%08x(%05x)\n", |
|---|
| 3278 | 3141 | srb->sg_bus_addr, SEGMENTX_LEN); |
|---|
| 3279 | | - pci_unmap_single(acb->dev, srb->sg_bus_addr, |
|---|
| 3280 | | - SEGMENTX_LEN, |
|---|
| 3281 | | - PCI_DMA_TODEVICE); |
|---|
| 3142 | + dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, |
|---|
| 3143 | + DMA_TO_DEVICE); |
|---|
| 3282 | 3144 | dprintkdbg(DBG_SG, "pci_unmap_srb: segs=%i buffer=%p\n", |
|---|
| 3283 | 3145 | scsi_sg_count(cmd), scsi_bufflen(cmd)); |
|---|
| 3284 | 3146 | /* unmap the sg segments */ |
|---|
| .. | .. |
|---|
| 3296 | 3158 | /* Unmap sense buffer */ |
|---|
| 3297 | 3159 | dprintkdbg(DBG_SG, "pci_unmap_srb_sense: buffer=%08x\n", |
|---|
| 3298 | 3160 | srb->segment_x[0].address); |
|---|
| 3299 | | - pci_unmap_single(acb->dev, srb->segment_x[0].address, |
|---|
| 3300 | | - srb->segment_x[0].length, PCI_DMA_FROMDEVICE); |
|---|
| 3161 | + dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, |
|---|
| 3162 | + srb->segment_x[0].length, DMA_FROM_DEVICE); |
|---|
| 3301 | 3163 | /* Restore SG stuff */ |
|---|
| 3302 | 3164 | srb->total_xfer_length = srb->xferred; |
|---|
| 3303 | 3165 | srb->segment_x[0].address = |
|---|
| .. | .. |
|---|
| 3416 | 3278 | tempcnt--; |
|---|
| 3417 | 3279 | dcb->max_command = tempcnt; |
|---|
| 3418 | 3280 | free_tag(dcb, srb); |
|---|
| 3419 | | - srb_going_to_waiting_move(dcb, srb); |
|---|
| 3281 | + list_move(&srb->list, &dcb->srb_waiting_list); |
|---|
| 3420 | 3282 | waiting_set_timer(acb, HZ / 20); |
|---|
| 3421 | 3283 | srb->adapter_status = 0; |
|---|
| 3422 | 3284 | srb->target_status = 0; |
|---|
| .. | .. |
|---|
| 3471 | 3333 | |
|---|
| 3472 | 3334 | if (!ckc_only && (cmd->result & RES_DID) == 0 |
|---|
| 3473 | 3335 | && cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8 |
|---|
| 3474 | | - && dir != PCI_DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) |
|---|
| 3336 | + && dir != DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) |
|---|
| 3475 | 3337 | dcb->inquiry7 = ptr->Flags; |
|---|
| 3476 | 3338 | |
|---|
| 3477 | 3339 | /*if( srb->cmd->cmnd[0] == INQUIRY && */ |
|---|
| .. | .. |
|---|
| 3501 | 3363 | cmd->cmnd[0], srb->total_xfer_length); |
|---|
| 3502 | 3364 | } |
|---|
| 3503 | 3365 | |
|---|
| 3504 | | - srb_going_remove(dcb, srb); |
|---|
| 3505 | | - /* Add to free list */ |
|---|
| 3506 | | - if (srb == acb->tmp_srb) |
|---|
| 3507 | | - dprintkl(KERN_ERR, "srb_done: ERROR! Completed cmd with tmp_srb\n"); |
|---|
| 3508 | | - else { |
|---|
| 3366 | + if (srb != acb->tmp_srb) { |
|---|
| 3367 | + /* Add to free list */ |
|---|
| 3509 | 3368 | dprintkdbg(DBG_0, "srb_done: (0x%p) done result=0x%08x\n", |
|---|
| 3510 | 3369 | cmd, cmd->result); |
|---|
| 3511 | | - srb_free_insert(acb, srb); |
|---|
| 3370 | + list_move_tail(&srb->list, &acb->srb_free_list); |
|---|
| 3371 | + } else { |
|---|
| 3372 | + dprintkl(KERN_ERR, "srb_done: ERROR! Completed cmd with tmp_srb\n"); |
|---|
| 3512 | 3373 | } |
|---|
| 3513 | 3374 | |
|---|
| 3514 | 3375 | cmd->scsi_done(cmd); |
|---|
| .. | .. |
|---|
| 3537 | 3398 | result = MK_RES(0, did_flag, 0, 0); |
|---|
| 3538 | 3399 | printk("G:%p(%02i-%i) ", p, |
|---|
| 3539 | 3400 | p->device->id, (u8)p->device->lun); |
|---|
| 3540 | | - srb_going_remove(dcb, srb); |
|---|
| 3401 | + list_del(&srb->list); |
|---|
| 3541 | 3402 | free_tag(dcb, srb); |
|---|
| 3542 | | - srb_free_insert(acb, srb); |
|---|
| 3403 | + list_add_tail(&srb->list, &acb->srb_free_list); |
|---|
| 3543 | 3404 | p->result = result; |
|---|
| 3544 | 3405 | pci_unmap_srb_sense(acb, srb); |
|---|
| 3545 | 3406 | pci_unmap_srb(acb, srb); |
|---|
| .. | .. |
|---|
| 3567 | 3428 | result = MK_RES(0, did_flag, 0, 0); |
|---|
| 3568 | 3429 | printk("W:%p<%02i-%i>", p, p->device->id, |
|---|
| 3569 | 3430 | (u8)p->device->lun); |
|---|
| 3570 | | - srb_waiting_remove(dcb, srb); |
|---|
| 3571 | | - srb_free_insert(acb, srb); |
|---|
| 3431 | + list_move_tail(&srb->list, &acb->srb_free_list); |
|---|
| 3572 | 3432 | p->result = result; |
|---|
| 3573 | 3433 | pci_unmap_srb_sense(acb, srb); |
|---|
| 3574 | 3434 | pci_unmap_srb(acb, srb); |
|---|
| .. | .. |
|---|
| 3694 | 3554 | srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE; |
|---|
| 3695 | 3555 | srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE; |
|---|
| 3696 | 3556 | /* Map sense buffer */ |
|---|
| 3697 | | - srb->segment_x[0].address = |
|---|
| 3698 | | - pci_map_single(acb->dev, cmd->sense_buffer, |
|---|
| 3699 | | - SCSI_SENSE_BUFFERSIZE, PCI_DMA_FROMDEVICE); |
|---|
| 3557 | + srb->segment_x[0].address = dma_map_single(&acb->dev->dev, |
|---|
| 3558 | + cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE, |
|---|
| 3559 | + DMA_FROM_DEVICE); |
|---|
| 3700 | 3560 | dprintkdbg(DBG_SG, "request_sense: map buffer %p->%08x(%05x)\n", |
|---|
| 3701 | 3561 | cmd->sense_buffer, srb->segment_x[0].address, |
|---|
| 3702 | 3562 | SCSI_SENSE_BUFFERSIZE); |
|---|
| .. | .. |
|---|
| 3707 | 3567 | dprintkl(KERN_DEBUG, |
|---|
| 3708 | 3568 | "request_sense: (0x%p) failed <%02i-%i>\n", |
|---|
| 3709 | 3569 | srb->cmd, dcb->target_id, dcb->target_lun); |
|---|
| 3710 | | - srb_going_to_waiting_move(dcb, srb); |
|---|
| 3570 | + list_move(&srb->list, &dcb->srb_waiting_list); |
|---|
| 3711 | 3571 | waiting_set_timer(acb, HZ / 100); |
|---|
| 3712 | 3572 | } |
|---|
| 3713 | 3573 | } |
|---|
| .. | .. |
|---|
| 3771 | 3631 | #endif |
|---|
| 3772 | 3632 | if (dcb->target_lun != 0) { |
|---|
| 3773 | 3633 | /* Copy settings */ |
|---|
| 3774 | | - struct DeviceCtlBlk *p; |
|---|
| 3775 | | - list_for_each_entry(p, &acb->dcb_list, list) |
|---|
| 3776 | | - if (p->target_id == dcb->target_id) |
|---|
| 3634 | + struct DeviceCtlBlk *p = NULL, *iter; |
|---|
| 3635 | + |
|---|
| 3636 | + list_for_each_entry(iter, &acb->dcb_list, list) |
|---|
| 3637 | + if (iter->target_id == dcb->target_id) { |
|---|
| 3638 | + p = iter; |
|---|
| 3777 | 3639 | break; |
|---|
| 3640 | + } |
|---|
| 3641 | + |
|---|
| 3642 | + if (!p) { |
|---|
| 3643 | + kfree(dcb); |
|---|
| 3644 | + return NULL; |
|---|
| 3645 | + } |
|---|
| 3646 | + |
|---|
| 3778 | 3647 | dprintkdbg(DBG_1, |
|---|
| 3779 | 3648 | "device_alloc: <%02i-%i> copy from <%02i-%i>\n", |
|---|
| 3780 | 3649 | dcb->target_id, dcb->target_lun, |
|---|
| .. | .. |
|---|
| 4266 | 4135 | const unsigned srbs_per_page = PAGE_SIZE/SEGMENTX_LEN; |
|---|
| 4267 | 4136 | int srb_idx = 0; |
|---|
| 4268 | 4137 | unsigned i = 0; |
|---|
| 4269 | | - struct SGentry *uninitialized_var(ptr); |
|---|
| 4138 | + struct SGentry *ptr; |
|---|
| 4270 | 4139 | |
|---|
| 4271 | 4140 | for (i = 0; i < DC395x_MAX_SRB_CNT; i++) |
|---|
| 4272 | 4141 | acb->srb_array[i].segment_x = NULL; |
|---|
| .. | .. |
|---|
| 4394 | 4263 | |
|---|
| 4395 | 4264 | /* link static array of srbs into the srb free list */ |
|---|
| 4396 | 4265 | for (i = 0; i < acb->srb_count - 1; i++) |
|---|
| 4397 | | - srb_free_insert(acb, &acb->srb_array[i]); |
|---|
| 4266 | + list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); |
|---|
| 4398 | 4267 | } |
|---|
| 4399 | 4268 | |
|---|
| 4400 | 4269 | |
|---|
| .. | .. |
|---|
| 4644 | 4513 | /*seq_printf(m, "\n"); */ |
|---|
| 4645 | 4514 | |
|---|
| 4646 | 4515 | seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); |
|---|
| 4647 | | - seq_printf(m, "Map of attached LUNs: %02x %02x %02x %02x %02x %02x %02x %02x\n", |
|---|
| 4648 | | - acb->dcb_map[0], acb->dcb_map[1], acb->dcb_map[2], |
|---|
| 4649 | | - acb->dcb_map[3], acb->dcb_map[4], acb->dcb_map[5], |
|---|
| 4650 | | - acb->dcb_map[6], acb->dcb_map[7]); |
|---|
| 4651 | | - seq_printf(m, " %02x %02x %02x %02x %02x %02x %02x %02x\n", |
|---|
| 4652 | | - acb->dcb_map[8], acb->dcb_map[9], acb->dcb_map[10], |
|---|
| 4653 | | - acb->dcb_map[11], acb->dcb_map[12], acb->dcb_map[13], |
|---|
| 4654 | | - acb->dcb_map[14], acb->dcb_map[15]); |
|---|
| 4516 | + seq_printf(m, "Map of attached LUNs: %8ph\n", &acb->dcb_map[0]); |
|---|
| 4517 | + seq_printf(m, " %8ph\n", &acb->dcb_map[8]); |
|---|
| 4655 | 4518 | |
|---|
| 4656 | 4519 | seq_puts(m, |
|---|
| 4657 | 4520 | "Un ID LUN Prty Sync Wide DsCn SndS TagQ nego_period SyncFreq SyncOffs MaxCmd\n"); |
|---|
| .. | .. |
|---|
| 4729 | 4592 | .show_info = dc395x_show_info, |
|---|
| 4730 | 4593 | .name = DC395X_BANNER " " DC395X_VERSION, |
|---|
| 4731 | 4594 | .queuecommand = dc395x_queue_command, |
|---|
| 4732 | | - .bios_param = dc395x_bios_param, |
|---|
| 4733 | 4595 | .slave_alloc = dc395x_slave_alloc, |
|---|
| 4734 | 4596 | .slave_destroy = dc395x_slave_destroy, |
|---|
| 4735 | 4597 | .can_queue = DC395x_MAX_CAN_QUEUE, |
|---|
| .. | .. |
|---|
| 4738 | 4600 | .cmd_per_lun = DC395x_MAX_CMD_PER_LUN, |
|---|
| 4739 | 4601 | .eh_abort_handler = dc395x_eh_abort, |
|---|
| 4740 | 4602 | .eh_bus_reset_handler = dc395x_eh_bus_reset, |
|---|
| 4741 | | - .use_clustering = DISABLE_CLUSTERING, |
|---|
| 4603 | + .dma_boundary = PAGE_SIZE - 1, |
|---|
| 4742 | 4604 | }; |
|---|
| 4743 | 4605 | |
|---|
| 4744 | 4606 | |
|---|
| .. | .. |
|---|
| 4869 | 4731 | .probe = dc395x_init_one, |
|---|
| 4870 | 4732 | .remove = dc395x_remove_one, |
|---|
| 4871 | 4733 | }; |
|---|
| 4872 | | - |
|---|
| 4873 | | - |
|---|
| 4874 | | -/** |
|---|
| 4875 | | - * dc395x_module_init - Module initialization function |
|---|
| 4876 | | - * |
|---|
| 4877 | | - * Used by both module and built-in driver to initialise this driver. |
|---|
| 4878 | | - **/ |
|---|
| 4879 | | -static int __init dc395x_module_init(void) |
|---|
| 4880 | | -{ |
|---|
| 4881 | | - return pci_register_driver(&dc395x_driver); |
|---|
| 4882 | | -} |
|---|
| 4883 | | - |
|---|
| 4884 | | - |
|---|
| 4885 | | -/** |
|---|
| 4886 | | - * dc395x_module_exit - Module cleanup function. |
|---|
| 4887 | | - **/ |
|---|
| 4888 | | -static void __exit dc395x_module_exit(void) |
|---|
| 4889 | | -{ |
|---|
| 4890 | | - pci_unregister_driver(&dc395x_driver); |
|---|
| 4891 | | -} |
|---|
| 4892 | | - |
|---|
| 4893 | | - |
|---|
| 4894 | | -module_init(dc395x_module_init); |
|---|
| 4895 | | -module_exit(dc395x_module_exit); |
|---|
| 4734 | +module_pci_driver(dc395x_driver); |
|---|
| 4896 | 4735 | |
|---|
| 4897 | 4736 | MODULE_AUTHOR("C.L. Huang / Erich Chen / Kurt Garloff"); |
|---|
| 4898 | 4737 | MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and DC315 series"); |
|---|