hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/scsi/dc395x.c
....@@ -61,7 +61,6 @@
6161 #include <asm/io.h>
6262
6363 #include <scsi/scsi.h>
64
-#include <scsi/scsicam.h> /* needed for scsicam_bios_param */
6564 #include <scsi/scsi_cmnd.h>
6665 #include <scsi/scsi_device.h>
6766 #include <scsi/scsi_host.h>
....@@ -753,105 +752,6 @@
753752 return NULL;
754753 }
755754
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
-
855755 /* Sets the timer to wake us up */
856756 static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to)
857757 {
....@@ -923,7 +823,7 @@
923823
924824 /* Try to send to the bus */
925825 if (!start_scsi(acb, pos, srb))
926
- srb_waiting_to_going_move(pos, srb);
826
+ list_move(&srb->list, &pos->srb_going_list);
927827 else
928828 waiting_set_timer(acb, HZ/50);
929829 break;
....@@ -960,15 +860,15 @@
960860 if (dcb->max_command <= list_size(&dcb->srb_going_list) ||
961861 acb->active_dcb ||
962862 (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);
964864 waiting_process_next(acb);
965865 return;
966866 }
967867
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);
972872 waiting_set_timer(acb, HZ / 50);
973873 }
974874 }
....@@ -1002,7 +902,7 @@
1002902 nseg = scsi_dma_map(cmd);
1003903 BUG_ON(nseg < 0);
1004904
1005
- if (dir == PCI_DMA_NONE || !nseg) {
905
+ if (dir == DMA_NONE || !nseg) {
1006906 dprintkdbg(DBG_0,
1007907 "build_srb: [0] len=%d buf=%p use_sg=%d !MAP=%08x\n",
1008908 cmd->bufflen, scsi_sglist(cmd), scsi_sg_count(cmd),
....@@ -1045,10 +945,8 @@
1045945 sgp->length++;
1046946 }
1047947
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);
1052950
1053951 dprintkdbg(DBG_SG, "build_srb: [n] map sg %p->%08x(%05x)\n",
1054952 srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN);
....@@ -1116,9 +1014,9 @@
11161014 cmd->scsi_done = done;
11171015 cmd->result = 0;
11181016
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) {
11221020 /*
11231021 * Return 1 since we are unable to queue this command at this
11241022 * point in time.
....@@ -1126,12 +1024,13 @@
11261024 dprintkdbg(DBG_0, "queue_command: No free srb's\n");
11271025 return 1;
11281026 }
1027
+ list_del(&srb->list);
11291028
11301029 build_srb(cmd, dcb, srb);
11311030
11321031 if (!list_empty(&dcb->srb_waiting_list)) {
11331032 /* append to waiting queue */
1134
- srb_waiting_append(dcb, srb);
1033
+ list_add_tail(&srb->list, &dcb->srb_waiting_list);
11351034 waiting_process_next(acb);
11361035 } else {
11371036 /* process immediately */
....@@ -1152,38 +1051,6 @@
11521051 }
11531052
11541053 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
-
11871054
11881055 static void dump_register_info(struct AdapterCtlBlk *acb,
11891056 struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb)
....@@ -1376,11 +1243,11 @@
13761243
13771244 srb = find_cmd(cmd, &dcb->srb_waiting_list);
13781245 if (srb) {
1379
- srb_waiting_remove(dcb, srb);
1246
+ list_del(&srb->list);
13801247 pci_unmap_srb_sense(acb, srb);
13811248 pci_unmap_srb(acb, srb);
13821249 free_tag(dcb, srb);
1383
- srb_free_insert(acb, srb);
1250
+ list_add_tail(&srb->list, &acb->srb_free_list);
13841251 dprintkl(KERN_DEBUG, "eh_abort: Command was waiting\n");
13851252 cmd->result = DID_ABORT << 16;
13861253 return SUCCESS;
....@@ -1969,19 +1836,15 @@
19691836 xferred -= psge->length;
19701837 } else {
19711838 /* 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);
19771842 psge->length -= xferred;
19781843 psge->address += xferred;
19791844 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);
19851848 break;
19861849 }
19871850 psge++;
....@@ -3088,7 +2951,7 @@
30882951 goto disc1;
30892952 }
30902953 free_tag(dcb, srb);
3091
- srb_going_to_waiting_move(dcb, srb);
2954
+ list_move(&srb->list, &dcb->srb_waiting_list);
30922955 dprintkdbg(DBG_KG,
30932956 "disconnect: (0x%p) Retry\n",
30942957 srb->cmd);
....@@ -3153,7 +3016,7 @@
31533016
31543017 srb->state = SRB_READY;
31553018 free_tag(dcb, srb);
3156
- srb_going_to_waiting_move(dcb, srb);
3019
+ list_move(&srb->list, &dcb->srb_waiting_list);
31573020 waiting_set_timer(acb, HZ / 20);
31583021
31593022 /* return; */
....@@ -3272,13 +3135,12 @@
32723135 struct scsi_cmnd *cmd = srb->cmd;
32733136 enum dma_data_direction dir = cmd->sc_data_direction;
32743137
3275
- if (scsi_sg_count(cmd) && dir != PCI_DMA_NONE) {
3138
+ if (scsi_sg_count(cmd) && dir != DMA_NONE) {
32763139 /* unmap DC395x SG list */
32773140 dprintkdbg(DBG_SG, "pci_unmap_srb: list=%08x(%05x)\n",
32783141 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);
32823144 dprintkdbg(DBG_SG, "pci_unmap_srb: segs=%i buffer=%p\n",
32833145 scsi_sg_count(cmd), scsi_bufflen(cmd));
32843146 /* unmap the sg segments */
....@@ -3296,8 +3158,8 @@
32963158 /* Unmap sense buffer */
32973159 dprintkdbg(DBG_SG, "pci_unmap_srb_sense: buffer=%08x\n",
32983160 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);
33013163 /* Restore SG stuff */
33023164 srb->total_xfer_length = srb->xferred;
33033165 srb->segment_x[0].address =
....@@ -3416,7 +3278,7 @@
34163278 tempcnt--;
34173279 dcb->max_command = tempcnt;
34183280 free_tag(dcb, srb);
3419
- srb_going_to_waiting_move(dcb, srb);
3281
+ list_move(&srb->list, &dcb->srb_waiting_list);
34203282 waiting_set_timer(acb, HZ / 20);
34213283 srb->adapter_status = 0;
34223284 srb->target_status = 0;
....@@ -3471,7 +3333,7 @@
34713333
34723334 if (!ckc_only && (cmd->result & RES_DID) == 0
34733335 && 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)
34753337 dcb->inquiry7 = ptr->Flags;
34763338
34773339 /*if( srb->cmd->cmnd[0] == INQUIRY && */
....@@ -3501,14 +3363,13 @@
35013363 cmd->cmnd[0], srb->total_xfer_length);
35023364 }
35033365
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 */
35093368 dprintkdbg(DBG_0, "srb_done: (0x%p) done result=0x%08x\n",
35103369 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");
35123373 }
35133374
35143375 cmd->scsi_done(cmd);
....@@ -3537,9 +3398,9 @@
35373398 result = MK_RES(0, did_flag, 0, 0);
35383399 printk("G:%p(%02i-%i) ", p,
35393400 p->device->id, (u8)p->device->lun);
3540
- srb_going_remove(dcb, srb);
3401
+ list_del(&srb->list);
35413402 free_tag(dcb, srb);
3542
- srb_free_insert(acb, srb);
3403
+ list_add_tail(&srb->list, &acb->srb_free_list);
35433404 p->result = result;
35443405 pci_unmap_srb_sense(acb, srb);
35453406 pci_unmap_srb(acb, srb);
....@@ -3567,8 +3428,7 @@
35673428 result = MK_RES(0, did_flag, 0, 0);
35683429 printk("W:%p<%02i-%i>", p, p->device->id,
35693430 (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);
35723432 p->result = result;
35733433 pci_unmap_srb_sense(acb, srb);
35743434 pci_unmap_srb(acb, srb);
....@@ -3694,9 +3554,9 @@
36943554 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE;
36953555 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE;
36963556 /* 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);
37003560 dprintkdbg(DBG_SG, "request_sense: map buffer %p->%08x(%05x)\n",
37013561 cmd->sense_buffer, srb->segment_x[0].address,
37023562 SCSI_SENSE_BUFFERSIZE);
....@@ -3707,7 +3567,7 @@
37073567 dprintkl(KERN_DEBUG,
37083568 "request_sense: (0x%p) failed <%02i-%i>\n",
37093569 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);
37113571 waiting_set_timer(acb, HZ / 100);
37123572 }
37133573 }
....@@ -3771,10 +3631,19 @@
37713631 #endif
37723632 if (dcb->target_lun != 0) {
37733633 /* 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;
37773639 break;
3640
+ }
3641
+
3642
+ if (!p) {
3643
+ kfree(dcb);
3644
+ return NULL;
3645
+ }
3646
+
37783647 dprintkdbg(DBG_1,
37793648 "device_alloc: <%02i-%i> copy from <%02i-%i>\n",
37803649 dcb->target_id, dcb->target_lun,
....@@ -4266,7 +4135,7 @@
42664135 const unsigned srbs_per_page = PAGE_SIZE/SEGMENTX_LEN;
42674136 int srb_idx = 0;
42684137 unsigned i = 0;
4269
- struct SGentry *uninitialized_var(ptr);
4138
+ struct SGentry *ptr;
42704139
42714140 for (i = 0; i < DC395x_MAX_SRB_CNT; i++)
42724141 acb->srb_array[i].segment_x = NULL;
....@@ -4394,7 +4263,7 @@
43944263
43954264 /* link static array of srbs into the srb free list */
43964265 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);
43984267 }
43994268
44004269
....@@ -4644,14 +4513,8 @@
46444513 /*seq_printf(m, "\n"); */
46454514
46464515 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]);
46554518
46564519 seq_puts(m,
46574520 "Un ID LUN Prty Sync Wide DsCn SndS TagQ nego_period SyncFreq SyncOffs MaxCmd\n");
....@@ -4729,7 +4592,6 @@
47294592 .show_info = dc395x_show_info,
47304593 .name = DC395X_BANNER " " DC395X_VERSION,
47314594 .queuecommand = dc395x_queue_command,
4732
- .bios_param = dc395x_bios_param,
47334595 .slave_alloc = dc395x_slave_alloc,
47344596 .slave_destroy = dc395x_slave_destroy,
47354597 .can_queue = DC395x_MAX_CAN_QUEUE,
....@@ -4738,7 +4600,7 @@
47384600 .cmd_per_lun = DC395x_MAX_CMD_PER_LUN,
47394601 .eh_abort_handler = dc395x_eh_abort,
47404602 .eh_bus_reset_handler = dc395x_eh_bus_reset,
4741
- .use_clustering = DISABLE_CLUSTERING,
4603
+ .dma_boundary = PAGE_SIZE - 1,
47424604 };
47434605
47444606
....@@ -4869,30 +4731,7 @@
48694731 .probe = dc395x_init_one,
48704732 .remove = dc395x_remove_one,
48714733 };
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);
48964735
48974736 MODULE_AUTHOR("C.L. Huang / Erich Chen / Kurt Garloff");
48984737 MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and DC315 series");