diff options
Diffstat (limited to 'drivers/scsi/gvp11.c')
-rw-r--r-- | drivers/scsi/gvp11.c | 93 |
1 files changed, 46 insertions, 47 deletions
diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c index bd5d90328ee0..18b7102bb80e 100644 --- a/drivers/scsi/gvp11.c +++ b/drivers/scsi/gvp11.c | |||
@@ -23,7 +23,6 @@ | |||
23 | 23 | ||
24 | 24 | ||
25 | #define DMA(ptr) ((gvp11_scsiregs *)((ptr)->base)) | 25 | #define DMA(ptr) ((gvp11_scsiregs *)((ptr)->base)) |
26 | #define HDATA(ptr) ((struct WD33C93_hostdata *)((ptr)->hostdata)) | ||
27 | 26 | ||
28 | static irqreturn_t gvp11_intr(int irq, void *_instance) | 27 | static irqreturn_t gvp11_intr(int irq, void *_instance) |
29 | { | 28 | { |
@@ -50,70 +49,66 @@ void gvp11_setup(char *str, int *ints) | |||
50 | 49 | ||
51 | static int dma_setup(struct scsi_cmnd *cmd, int dir_in) | 50 | static int dma_setup(struct scsi_cmnd *cmd, int dir_in) |
52 | { | 51 | { |
52 | struct Scsi_Host *instance = cmd->device->host; | ||
53 | struct WD33C93_hostdata *hdata = shost_priv(instance); | ||
53 | unsigned short cntr = GVP11_DMAC_INT_ENABLE; | 54 | unsigned short cntr = GVP11_DMAC_INT_ENABLE; |
54 | unsigned long addr = virt_to_bus(cmd->SCp.ptr); | 55 | unsigned long addr = virt_to_bus(cmd->SCp.ptr); |
55 | int bank_mask; | 56 | int bank_mask; |
56 | static int scsi_alloc_out_of_range = 0; | 57 | static int scsi_alloc_out_of_range = 0; |
57 | 58 | ||
58 | /* use bounce buffer if the physical address is bad */ | 59 | /* use bounce buffer if the physical address is bad */ |
59 | if (addr & HDATA(cmd->device->host)->dma_xfer_mask) { | 60 | if (addr & hdata->dma_xfer_mask) { |
60 | HDATA(cmd->device->host)->dma_bounce_len = | 61 | hdata->dma_bounce_len = (cmd->SCp.this_residual + 511) & ~0x1ff; |
61 | (cmd->SCp.this_residual + 511) & ~0x1ff; | ||
62 | 62 | ||
63 | if (!scsi_alloc_out_of_range) { | 63 | if (!scsi_alloc_out_of_range) { |
64 | HDATA(cmd->device->host)->dma_bounce_buffer = | 64 | hdata->dma_bounce_buffer = |
65 | kmalloc(HDATA(cmd->device->host)->dma_bounce_len, | 65 | kmalloc(hdata->dma_bounce_len, GFP_KERNEL); |
66 | GFP_KERNEL); | 66 | hdata->dma_buffer_pool = BUF_SCSI_ALLOCED; |
67 | HDATA(cmd->device->host)->dma_buffer_pool = | ||
68 | BUF_SCSI_ALLOCED; | ||
69 | } | 67 | } |
70 | 68 | ||
71 | if (scsi_alloc_out_of_range || | 69 | if (scsi_alloc_out_of_range || |
72 | !HDATA(cmd->device->host)->dma_bounce_buffer) { | 70 | !hdata->dma_bounce_buffer) { |
73 | HDATA(cmd->device->host)->dma_bounce_buffer = | 71 | hdata->dma_bounce_buffer = |
74 | amiga_chip_alloc(HDATA(cmd->device->host)->dma_bounce_len, | 72 | amiga_chip_alloc(hdata->dma_bounce_len, |
75 | "GVP II SCSI Bounce Buffer"); | 73 | "GVP II SCSI Bounce Buffer"); |
76 | 74 | ||
77 | if (!HDATA(cmd->device->host)->dma_bounce_buffer) { | 75 | if (!hdata->dma_bounce_buffer) { |
78 | HDATA(cmd->device->host)->dma_bounce_len = 0; | 76 | hdata->dma_bounce_len = 0; |
79 | return 1; | 77 | return 1; |
80 | } | 78 | } |
81 | 79 | ||
82 | HDATA(cmd->device->host)->dma_buffer_pool = | 80 | hdata->dma_buffer_pool = BUF_CHIP_ALLOCED; |
83 | BUF_CHIP_ALLOCED; | ||
84 | } | 81 | } |
85 | 82 | ||
86 | /* check if the address of the bounce buffer is OK */ | 83 | /* check if the address of the bounce buffer is OK */ |
87 | addr = virt_to_bus(HDATA(cmd->device->host)->dma_bounce_buffer); | 84 | addr = virt_to_bus(hdata->dma_bounce_buffer); |
88 | 85 | ||
89 | if (addr & HDATA(cmd->device->host)->dma_xfer_mask) { | 86 | if (addr & hdata->dma_xfer_mask) { |
90 | /* fall back to Chip RAM if address out of range */ | 87 | /* fall back to Chip RAM if address out of range */ |
91 | if (HDATA(cmd->device->host)->dma_buffer_pool == | 88 | if (hdata->dma_buffer_pool == BUF_SCSI_ALLOCED) { |
92 | BUF_SCSI_ALLOCED) { | 89 | kfree(hdata->dma_bounce_buffer); |
93 | kfree(HDATA(cmd->device->host)->dma_bounce_buffer); | ||
94 | scsi_alloc_out_of_range = 1; | 90 | scsi_alloc_out_of_range = 1; |
95 | } else { | 91 | } else { |
96 | amiga_chip_free(HDATA(cmd->device->host)->dma_bounce_buffer); | 92 | amiga_chip_free(hdata->dma_bounce_buffer); |
97 | } | 93 | } |
98 | 94 | ||
99 | HDATA(cmd->device->host)->dma_bounce_buffer = | 95 | hdata->dma_bounce_buffer = |
100 | amiga_chip_alloc(HDATA(cmd->device->host)->dma_bounce_len, | 96 | amiga_chip_alloc(hdata->dma_bounce_len, |
101 | "GVP II SCSI Bounce Buffer"); | 97 | "GVP II SCSI Bounce Buffer"); |
102 | 98 | ||
103 | if (!HDATA(cmd->device->host)->dma_bounce_buffer) { | 99 | if (!hdata->dma_bounce_buffer) { |
104 | HDATA(cmd->device->host)->dma_bounce_len = 0; | 100 | hdata->dma_bounce_len = 0; |
105 | return 1; | 101 | return 1; |
106 | } | 102 | } |
107 | 103 | ||
108 | addr = virt_to_bus(HDATA(cmd->device->host)->dma_bounce_buffer); | 104 | addr = virt_to_bus(hdata->dma_bounce_buffer); |
109 | HDATA(cmd->device->host)->dma_buffer_pool = | 105 | hdata->dma_buffer_pool = BUF_CHIP_ALLOCED; |
110 | BUF_CHIP_ALLOCED; | ||
111 | } | 106 | } |
112 | 107 | ||
113 | if (!dir_in) { | 108 | if (!dir_in) { |
114 | /* copy to bounce buffer for a write */ | 109 | /* copy to bounce buffer for a write */ |
115 | memcpy(HDATA(cmd->device->host)->dma_bounce_buffer, | 110 | memcpy(hdata->dma_bounce_buffer, cmd->SCp.ptr, |
116 | cmd->SCp.ptr, cmd->SCp.this_residual); | 111 | cmd->SCp.this_residual); |
117 | } | 112 | } |
118 | } | 113 | } |
119 | 114 | ||
@@ -121,7 +116,7 @@ static int dma_setup(struct scsi_cmnd *cmd, int dir_in) | |||
121 | if (!dir_in) | 116 | if (!dir_in) |
122 | cntr |= GVP11_DMAC_DIR_WRITE; | 117 | cntr |= GVP11_DMAC_DIR_WRITE; |
123 | 118 | ||
124 | HDATA(cmd->device->host)->dma_dir = dir_in; | 119 | hdata->dma_dir = dir_in; |
125 | DMA(cmd->device->host)->CNTR = cntr; | 120 | DMA(cmd->device->host)->CNTR = cntr; |
126 | 121 | ||
127 | /* setup DMA *physical* address */ | 122 | /* setup DMA *physical* address */ |
@@ -135,7 +130,8 @@ static int dma_setup(struct scsi_cmnd *cmd, int dir_in) | |||
135 | cache_push(addr, cmd->SCp.this_residual); | 130 | cache_push(addr, cmd->SCp.this_residual); |
136 | } | 131 | } |
137 | 132 | ||
138 | if ((bank_mask = (~HDATA(cmd->device->host)->dma_xfer_mask >> 18) & 0x01c0)) | 133 | bank_mask = (~hdata->dma_xfer_mask >> 18) & 0x01c0; |
134 | if (bank_mask) | ||
139 | DMA(cmd->device->host)->BANK = bank_mask & (addr >> 18); | 135 | DMA(cmd->device->host)->BANK = bank_mask & (addr >> 18); |
140 | 136 | ||
141 | /* start DMA */ | 137 | /* start DMA */ |
@@ -148,25 +144,26 @@ static int dma_setup(struct scsi_cmnd *cmd, int dir_in) | |||
148 | static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt, | 144 | static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt, |
149 | int status) | 145 | int status) |
150 | { | 146 | { |
147 | struct WD33C93_hostdata *hdata = shost_priv(instance); | ||
148 | |||
151 | /* stop DMA */ | 149 | /* stop DMA */ |
152 | DMA(instance)->SP_DMA = 1; | 150 | DMA(instance)->SP_DMA = 1; |
153 | /* remove write bit from CONTROL bits */ | 151 | /* remove write bit from CONTROL bits */ |
154 | DMA(instance)->CNTR = GVP11_DMAC_INT_ENABLE; | 152 | DMA(instance)->CNTR = GVP11_DMAC_INT_ENABLE; |
155 | 153 | ||
156 | /* copy from a bounce buffer, if necessary */ | 154 | /* copy from a bounce buffer, if necessary */ |
157 | if (status && HDATA(instance)->dma_bounce_buffer) { | 155 | if (status && hdata->dma_bounce_buffer) { |
158 | if (HDATA(instance)->dma_dir && SCpnt) | 156 | if (hdata->dma_dir && SCpnt) |
159 | memcpy(SCpnt->SCp.ptr, | 157 | memcpy(SCpnt->SCp.ptr, hdata->dma_bounce_buffer, |
160 | HDATA(instance)->dma_bounce_buffer, | ||
161 | SCpnt->SCp.this_residual); | 158 | SCpnt->SCp.this_residual); |
162 | 159 | ||
163 | if (HDATA(instance)->dma_buffer_pool == BUF_SCSI_ALLOCED) | 160 | if (hdata->dma_buffer_pool == BUF_SCSI_ALLOCED) |
164 | kfree(HDATA(instance)->dma_bounce_buffer); | 161 | kfree(hdata->dma_bounce_buffer); |
165 | else | 162 | else |
166 | amiga_chip_free(HDATA(instance)->dma_bounce_buffer); | 163 | amiga_chip_free(hdata->dma_bounce_buffer); |
167 | 164 | ||
168 | HDATA(instance)->dma_bounce_buffer = NULL; | 165 | hdata->dma_bounce_buffer = NULL; |
169 | HDATA(instance)->dma_bounce_len = 0; | 166 | hdata->dma_bounce_len = 0; |
170 | } | 167 | } |
171 | } | 168 | } |
172 | 169 | ||
@@ -180,6 +177,7 @@ int __init gvp11_detect(struct scsi_host_template *tpnt) | |||
180 | unsigned int epc; | 177 | unsigned int epc; |
181 | struct zorro_dev *z = NULL; | 178 | struct zorro_dev *z = NULL; |
182 | unsigned int default_dma_xfer_mask; | 179 | unsigned int default_dma_xfer_mask; |
180 | struct WD33C93_hostdata *hdata; | ||
183 | wd33c93_regs regs; | 181 | wd33c93_regs regs; |
184 | int num_gvp11 = 0; | 182 | int num_gvp11 = 0; |
185 | #ifdef CHECK_WD33C93 | 183 | #ifdef CHECK_WD33C93 |
@@ -306,10 +304,11 @@ int __init gvp11_detect(struct scsi_host_template *tpnt) | |||
306 | instance->irq = IRQ_AMIGA_PORTS; | 304 | instance->irq = IRQ_AMIGA_PORTS; |
307 | instance->unique_id = z->slotaddr; | 305 | instance->unique_id = z->slotaddr; |
308 | 306 | ||
307 | hdata = shost_priv(instance); | ||
309 | if (gvp11_xfer_mask) | 308 | if (gvp11_xfer_mask) |
310 | HDATA(instance)->dma_xfer_mask = gvp11_xfer_mask; | 309 | hdata->dma_xfer_mask = gvp11_xfer_mask; |
311 | else | 310 | else |
312 | HDATA(instance)->dma_xfer_mask = default_dma_xfer_mask; | 311 | hdata->dma_xfer_mask = default_dma_xfer_mask; |
313 | 312 | ||
314 | DMA(instance)->secret2 = 1; | 313 | DMA(instance)->secret2 = 1; |
315 | DMA(instance)->secret1 = 0; | 314 | DMA(instance)->secret1 = 0; |
@@ -327,9 +326,9 @@ int __init gvp11_detect(struct scsi_host_template *tpnt) | |||
327 | */ | 326 | */ |
328 | regs.SASR = &(DMA(instance)->SASR); | 327 | regs.SASR = &(DMA(instance)->SASR); |
329 | regs.SCMD = &(DMA(instance)->SCMD); | 328 | regs.SCMD = &(DMA(instance)->SCMD); |
330 | HDATA(instance)->no_sync = 0xff; | 329 | hdata->no_sync = 0xff; |
331 | HDATA(instance)->fast = 0; | 330 | hdata->fast = 0; |
332 | HDATA(instance)->dma_mode = CTRL_DMA; | 331 | hdata->dma_mode = CTRL_DMA; |
333 | wd33c93_init(instance, regs, dma_setup, dma_stop, | 332 | wd33c93_init(instance, regs, dma_setup, dma_stop, |
334 | (epc & GVP_SCSICLKMASK) ? WD33C93_FS_8_10 | 333 | (epc & GVP_SCSICLKMASK) ? WD33C93_FS_8_10 |
335 | : WD33C93_FS_12_15); | 334 | : WD33C93_FS_12_15); |