Lines Matching +full:module +full:- +full:instance

1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/module.h>
37 struct Scsi_Host *instance = data; in gvp11_intr() local
38 struct gvp11_hostdata *hdata = shost_priv(instance); in gvp11_intr()
39 unsigned int status = hdata->regs->CNTR; in gvp11_intr()
45 spin_lock_irqsave(instance->host_lock, flags); in gvp11_intr()
46 wd33c93_intr(instance); in gvp11_intr()
47 spin_unlock_irqrestore(instance->host_lock, flags); in gvp11_intr()
56 unsigned long len = scsi_pointer->this_residual; in dma_setup()
57 struct Scsi_Host *instance = cmd->device->host; in dma_setup() local
58 struct gvp11_hostdata *hdata = shost_priv(instance); in dma_setup()
59 struct WD33C93_hostdata *wh = &hdata->wh; in dma_setup()
60 struct gvp11_scsiregs *regs = hdata->regs; in dma_setup()
66 addr = dma_map_single(hdata->dev, scsi_pointer->ptr, in dma_setup()
68 if (dma_mapping_error(hdata->dev, addr)) { in dma_setup()
69 dev_warn(hdata->dev, "cannot map SCSI data block %p\n", in dma_setup()
70 scsi_pointer->ptr); in dma_setup()
73 scsi_pointer->dma_handle = addr; in dma_setup()
76 if (addr & wh->dma_xfer_mask) { in dma_setup()
78 dma_unmap_single(hdata->dev, scsi_pointer->dma_handle, in dma_setup()
79 scsi_pointer->this_residual, in dma_setup()
81 scsi_pointer->dma_handle = (dma_addr_t) NULL; in dma_setup()
83 wh->dma_bounce_len = (scsi_pointer->this_residual + 511) & ~0x1ff; in dma_setup()
86 wh->dma_bounce_buffer = in dma_setup()
87 kmalloc(wh->dma_bounce_len, GFP_KERNEL); in dma_setup()
88 wh->dma_buffer_pool = BUF_SCSI_ALLOCED; in dma_setup()
92 !wh->dma_bounce_buffer) { in dma_setup()
93 wh->dma_bounce_buffer = in dma_setup()
94 amiga_chip_alloc(wh->dma_bounce_len, in dma_setup()
97 if (!wh->dma_bounce_buffer) { in dma_setup()
98 wh->dma_bounce_len = 0; in dma_setup()
102 wh->dma_buffer_pool = BUF_CHIP_ALLOCED; in dma_setup()
107 memcpy(wh->dma_bounce_buffer, scsi_pointer->ptr, in dma_setup()
108 scsi_pointer->this_residual); in dma_setup()
111 if (wh->dma_buffer_pool == BUF_SCSI_ALLOCED) { in dma_setup()
113 addr = dma_map_single(hdata->dev, in dma_setup()
114 wh->dma_bounce_buffer, in dma_setup()
115 wh->dma_bounce_len, in dma_setup()
118 if (dma_mapping_error(hdata->dev, addr)) { in dma_setup()
119 dev_warn(hdata->dev, in dma_setup()
121 wh->dma_bounce_buffer); in dma_setup()
126 if (addr & wh->dma_xfer_mask) { in dma_setup()
128 dma_unmap_single(hdata->dev, scsi_pointer->dma_handle, in dma_setup()
129 scsi_pointer->this_residual, in dma_setup()
132 if (wh->dma_buffer_pool == BUF_SCSI_ALLOCED) { in dma_setup()
133 kfree(wh->dma_bounce_buffer); in dma_setup()
136 amiga_chip_free(wh->dma_bounce_buffer); in dma_setup()
139 wh->dma_bounce_buffer = in dma_setup()
140 amiga_chip_alloc(wh->dma_bounce_len, in dma_setup()
143 if (!wh->dma_bounce_buffer) { in dma_setup()
144 wh->dma_bounce_len = 0; in dma_setup()
150 memcpy(wh->dma_bounce_buffer, scsi_pointer->ptr, in dma_setup()
151 scsi_pointer->this_residual); in dma_setup()
154 addr = virt_to_phys(wh->dma_bounce_buffer); in dma_setup()
156 wh->dma_buffer_pool = BUF_CHIP_ALLOCED; in dma_setup()
159 scsi_pointer->dma_handle = addr; in dma_setup()
167 wh->dma_dir = dir_in; in dma_setup()
168 regs->CNTR = cntr; in dma_setup()
171 regs->ACR = addr; in dma_setup()
173 /* no more cache flush here - dma_map_single() takes care */ in dma_setup()
175 bank_mask = (~wh->dma_xfer_mask >> 18) & 0x01c0; in dma_setup()
177 regs->BANK = bank_mask & (addr >> 18); in dma_setup()
180 regs->ST_DMA = 1; in dma_setup()
186 static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt, in dma_stop() argument
190 struct gvp11_hostdata *hdata = shost_priv(instance); in dma_stop()
191 struct WD33C93_hostdata *wh = &hdata->wh; in dma_stop()
192 struct gvp11_scsiregs *regs = hdata->regs; in dma_stop()
195 regs->SP_DMA = 1; in dma_stop()
197 regs->CNTR = GVP11_DMAC_INT_ENABLE; in dma_stop()
199 if (wh->dma_buffer_pool == BUF_SCSI_ALLOCED) in dma_stop()
200 dma_unmap_single(hdata->dev, scsi_pointer->dma_handle, in dma_stop()
201 scsi_pointer->this_residual, in dma_stop()
202 DMA_DIR(wh->dma_dir)); in dma_stop()
205 if (status && wh->dma_bounce_buffer) { in dma_stop()
206 if (wh->dma_dir && SCpnt) in dma_stop()
207 memcpy(scsi_pointer->ptr, wh->dma_bounce_buffer, in dma_stop()
208 scsi_pointer->this_residual); in dma_stop()
210 if (wh->dma_buffer_pool == BUF_SCSI_ALLOCED) in dma_stop()
211 kfree(wh->dma_bounce_buffer); in dma_stop()
213 amiga_chip_free(wh->dma_bounce_buffer); in dma_stop()
215 wh->dma_bounce_buffer = NULL; in dma_stop()
216 wh->dma_bounce_len = 0; in dma_stop()
221 .module = THIS_MODULE,
233 .dma_boundary = PAGE_SIZE - 1,
245 * These darn GVP boards are a problem - it can be tough to tell in check_wd33c93()
247 * ultimate Yet-Another-GVP-Detection-Hack in that it actually in check_wd33c93()
255 sasr_3393 = &regs->SASR; in check_wd33c93()
256 scmd_3393 = &regs->SCMD; in check_wd33c93()
263 return -ENODEV; in check_wd33c93()
266 *sasr_3393 = save_sasr; /* Oops - restore this byte */ in check_wd33c93()
267 return -ENODEV; in check_wd33c93()
270 *sasr_3393 = save_sasr; /* Oops - restore this byte */ in check_wd33c93()
271 return -ENODEV; in check_wd33c93()
274 return -ENODEV; in check_wd33c93()
291 return -ENODEV; in check_wd33c93()
301 return -ENODEV; in check_wd33c93()
311 return -ENODEV; in check_wd33c93()
319 struct Scsi_Host *instance; in gvp11_probe() local
328 default_dma_xfer_mask = ent->driver_data; in gvp11_probe()
330 if (dma_set_mask_and_coherent(&z->dev, in gvp11_probe()
332 dev_warn(&z->dev, "cannot use DMA mask %llx\n", in gvp11_probe()
334 return -ENODEV; in gvp11_probe()
339 * code as the SCSI controllers. Therefore if the board-size in gvp11_probe()
343 return -ENODEV; in gvp11_probe()
345 address = z->resource.start; in gvp11_probe()
347 return -EBUSY; in gvp11_probe()
355 instance = scsi_host_alloc(&gvp11_scsi_template, in gvp11_probe()
357 if (!instance) { in gvp11_probe()
358 error = -ENOMEM; in gvp11_probe()
362 instance->irq = IRQ_AMIGA_PORTS; in gvp11_probe()
363 instance->unique_id = z->slotaddr; in gvp11_probe()
365 regs->secret2 = 1; in gvp11_probe()
366 regs->secret1 = 0; in gvp11_probe()
367 regs->secret3 = 15; in gvp11_probe()
368 while (regs->CNTR & GVP11_DMAC_BUSY) in gvp11_probe()
370 regs->CNTR = 0; in gvp11_probe()
371 regs->BANK = 0; in gvp11_probe()
373 wdregs.SASR = &regs->SASR; in gvp11_probe()
374 wdregs.SCMD = &regs->SCMD; in gvp11_probe()
376 hdata = shost_priv(instance); in gvp11_probe()
378 hdata->wh.dma_xfer_mask = gvp11_xfer_mask; in gvp11_probe()
379 if (dma_set_mask_and_coherent(&z->dev, in gvp11_probe()
381 dev_warn(&z->dev, "cannot use DMA mask %llx\n", in gvp11_probe()
383 error = -ENODEV; in gvp11_probe()
387 hdata->wh.dma_xfer_mask = default_dma_xfer_mask; in gvp11_probe()
389 hdata->wh.no_sync = 0xff; in gvp11_probe()
390 hdata->wh.fast = 0; in gvp11_probe()
391 hdata->wh.dma_mode = CTRL_DMA; in gvp11_probe()
392 hdata->regs = regs; in gvp11_probe()
398 wd33c93_init(instance, wdregs, dma_setup, dma_stop, in gvp11_probe()
403 "GVP11 SCSI", instance); in gvp11_probe()
407 regs->CNTR = GVP11_DMAC_INT_ENABLE; in gvp11_probe()
409 error = scsi_add_host(instance, NULL); in gvp11_probe()
413 zorro_set_drvdata(z, instance); in gvp11_probe()
414 scsi_scan_host(instance); in gvp11_probe()
418 free_irq(IRQ_AMIGA_PORTS, instance); in gvp11_probe()
420 scsi_host_put(instance); in gvp11_probe()
428 struct Scsi_Host *instance = zorro_get_drvdata(z); in gvp11_remove() local
429 struct gvp11_hostdata *hdata = shost_priv(instance); in gvp11_remove()
431 hdata->regs->CNTR = 0; in gvp11_remove()
432 scsi_remove_host(instance); in gvp11_remove()
433 free_irq(IRQ_AMIGA_PORTS, instance); in gvp11_remove()
434 scsi_host_put(instance); in gvp11_remove()
435 release_mem_region(z->resource.start, 256); in gvp11_remove()