From 2f2fef022c3e7a29680cb5cb45c460d0ae786d05 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:29:54 +0200 Subject: aha1542: use a local bounce buffer To remove the last user of the unchecked_isa_dma flag and thus the block layer ISA bounce buffering switch this driver to use its own local bounce buffer. This has the effect of not needing the chain indirection and supporting and unlimited number of segments. It does however limit the transfer size for each command to something that can be reasonable allocated by dma_alloc_coherent like 8K. Signed-off-by: Christoph Hellwig Acked-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Link: https://lore.kernel.org/r/20210331073001.46776-2-hch@lst.de Signed-off-by: Jens Axboe --- drivers/scsi/aha1542.c | 105 +++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 48 deletions(-) (limited to 'drivers') diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c index 21aab9f5b117..1210e61afb18 100644 --- a/drivers/scsi/aha1542.c +++ b/drivers/scsi/aha1542.c @@ -65,9 +65,12 @@ struct aha1542_hostdata { dma_addr_t ccb_handle; }; +#define AHA1542_MAX_SECTORS 16 + struct aha1542_cmd { - struct chain *chain; - dma_addr_t chain_handle; + /* bounce buffer */ + void *data_buffer; + dma_addr_t data_buffer_handle; }; static inline void aha1542_intr_reset(u16 base) @@ -257,15 +260,19 @@ static int aha1542_test_port(struct Scsi_Host *sh) static void aha1542_free_cmd(struct scsi_cmnd *cmd) { struct aha1542_cmd *acmd = scsi_cmd_priv(cmd); - struct device *dev = cmd->device->host->dma_dev; - size_t len = scsi_sg_count(cmd) * sizeof(struct chain); - if (acmd->chain) { - dma_unmap_single(dev, acmd->chain_handle, len, DMA_TO_DEVICE); - kfree(acmd->chain); + if (cmd->sc_data_direction == DMA_FROM_DEVICE) { + void *buf = acmd->data_buffer; + struct req_iterator iter; + struct bio_vec bv; + + rq_for_each_segment(bv, cmd->request, iter) { + memcpy_to_page(bv.bv_page, bv.bv_offset, buf, + bv.bv_len); + buf += bv.bv_len; + } } - acmd->chain = NULL; scsi_dma_unmap(cmd); } @@ -416,7 +423,7 @@ static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd) u8 lun = cmd->device->lun; unsigned long flags; int bufflen = scsi_bufflen(cmd); - int mbo, sg_count; + int mbo; struct mailbox *mb = aha1542->mb; struct ccb *ccb = aha1542->ccb; @@ -438,17 +445,17 @@ static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd) print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len); } #endif - sg_count = scsi_dma_map(cmd); - if (sg_count) { - size_t len = sg_count * sizeof(struct chain); - - acmd->chain = kmalloc(len, GFP_DMA); - if (!acmd->chain) - goto out_unmap; - acmd->chain_handle = dma_map_single(sh->dma_dev, acmd->chain, - len, DMA_TO_DEVICE); - if (dma_mapping_error(sh->dma_dev, acmd->chain_handle)) - goto out_free_chain; + + if (cmd->sc_data_direction == DMA_TO_DEVICE) { + void *buf = acmd->data_buffer; + struct req_iterator iter; + struct bio_vec bv; + + rq_for_each_segment(bv, cmd->request, iter) { + memcpy_from_page(buf, bv.bv_page, bv.bv_offset, + bv.bv_len); + buf += bv.bv_len; + } } /* @@ -496,27 +503,12 @@ static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd) direction = 16; memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen); - - if (bufflen) { - struct scatterlist *sg; - int i; - - ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */ - scsi_for_each_sg(cmd, sg, sg_count, i) { - any2scsi(acmd->chain[i].dataptr, sg_dma_address(sg)); - any2scsi(acmd->chain[i].datalen, sg_dma_len(sg)); - }; - any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain)); - any2scsi(ccb[mbo].dataptr, acmd->chain_handle); -#ifdef DEBUG - shost_printk(KERN_DEBUG, sh, "cptr %p: ", acmd->chain); - print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, acmd->chain, 18); -#endif - } else { - ccb[mbo].op = 0; /* SCSI Initiator Command */ - any2scsi(ccb[mbo].datalen, 0); + ccb[mbo].op = 0; /* SCSI Initiator Command */ + any2scsi(ccb[mbo].datalen, bufflen); + if (bufflen) + any2scsi(ccb[mbo].dataptr, acmd->data_buffer_handle); + else any2scsi(ccb[mbo].dataptr, 0); - }; ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */ ccb[mbo].rsalen = 16; ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0; @@ -531,12 +523,6 @@ static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd) spin_unlock_irqrestore(sh->host_lock, flags); return 0; -out_free_chain: - kfree(acmd->chain); - acmd->chain = NULL; -out_unmap: - scsi_dma_unmap(cmd); - return SCSI_MLQUEUE_HOST_BUSY; } /* Initialize mailboxes */ @@ -1027,6 +1013,27 @@ static int aha1542_biosparam(struct scsi_device *sdev, } MODULE_LICENSE("GPL"); +static int aha1542_init_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) +{ + struct aha1542_cmd *acmd = scsi_cmd_priv(cmd); + + acmd->data_buffer = dma_alloc_coherent(shost->dma_dev, + SECTOR_SIZE * AHA1542_MAX_SECTORS, + &acmd->data_buffer_handle, GFP_KERNEL); + if (!acmd->data_buffer) + return -ENOMEM; + return 0; +} + +static int aha1542_exit_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) +{ + struct aha1542_cmd *acmd = scsi_cmd_priv(cmd); + + dma_free_coherent(shost->dma_dev, SECTOR_SIZE * AHA1542_MAX_SECTORS, + acmd->data_buffer, acmd->data_buffer_handle); + return 0; +} + static struct scsi_host_template driver_template = { .module = THIS_MODULE, .proc_name = "aha1542", @@ -1037,10 +1044,12 @@ static struct scsi_host_template driver_template = { .eh_bus_reset_handler = aha1542_bus_reset, .eh_host_reset_handler = aha1542_host_reset, .bios_param = aha1542_biosparam, + .init_cmd_priv = aha1542_init_cmd_priv, + .exit_cmd_priv = aha1542_exit_cmd_priv, .can_queue = AHA1542_MAILBOXES, .this_id = 7, - .sg_tablesize = 16, - .unchecked_isa_dma = 1, + .max_sectors = AHA1542_MAX_SECTORS, + .sg_tablesize = SG_ALL, }; static int aha1542_isa_match(struct device *pdev, unsigned int ndev) -- cgit v1.2.3 From 8cad3b66bff4ee7c7d52b9a663cb6a2c5f66a7f7 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:29:55 +0200 Subject: Buslogic: remove ISA support The ISA support in Buslogic has been broken for a long time, as all the I/O path expects a struct device for DMA mapping that is derived from the PCI device, which would simply crash for ISA adapters. Signed-off-by: Christoph Hellwig Acked-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Acked-by: Khalid Aziz Link: https://lore.kernel.org/r/20210331073001.46776-3-hch@lst.de Signed-off-by: Jens Axboe --- drivers/scsi/BusLogic.c | 184 ++---------------------------------------------- drivers/scsi/BusLogic.h | 10 --- drivers/scsi/Kconfig | 2 +- 3 files changed, 6 insertions(+), 190 deletions(-) (limited to 'drivers') diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index ccb061ab0a0a..25ca2f938346 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -561,60 +561,6 @@ done: } -/* - blogic_add_probeaddr_isa appends a single ISA I/O Address to the list - of I/O Address and Bus Probe Information to be checked for potential BusLogic - Host Adapters. -*/ - -static void __init blogic_add_probeaddr_isa(unsigned long io_addr) -{ - struct blogic_probeinfo *probeinfo; - if (blogic_probeinfo_count >= BLOGIC_MAX_ADAPTERS) - return; - probeinfo = &blogic_probeinfo_list[blogic_probeinfo_count++]; - probeinfo->adapter_type = BLOGIC_MULTIMASTER; - probeinfo->adapter_bus_type = BLOGIC_ISA_BUS; - probeinfo->io_addr = io_addr; - probeinfo->pci_device = NULL; -} - - -/* - blogic_init_probeinfo_isa initializes the list of I/O Address and - Bus Probe Information to be checked for potential BusLogic SCSI Host Adapters - only from the list of standard BusLogic MultiMaster ISA I/O Addresses. -*/ - -static void __init blogic_init_probeinfo_isa(struct blogic_adapter *adapter) -{ - /* - If BusLogic Driver Options specifications requested that ISA - Bus Probes be inhibited, do not proceed further. - */ - if (blogic_probe_options.noprobe_isa) - return; - /* - Append the list of standard BusLogic MultiMaster ISA I/O Addresses. - */ - if (!blogic_probe_options.limited_isa || blogic_probe_options.probe330) - blogic_add_probeaddr_isa(0x330); - if (!blogic_probe_options.limited_isa || blogic_probe_options.probe334) - blogic_add_probeaddr_isa(0x334); - if (!blogic_probe_options.limited_isa || blogic_probe_options.probe230) - blogic_add_probeaddr_isa(0x230); - if (!blogic_probe_options.limited_isa || blogic_probe_options.probe234) - blogic_add_probeaddr_isa(0x234); - if (!blogic_probe_options.limited_isa || blogic_probe_options.probe130) - blogic_add_probeaddr_isa(0x130); - if (!blogic_probe_options.limited_isa || blogic_probe_options.probe134) - blogic_add_probeaddr_isa(0x134); -} - - -#ifdef CONFIG_PCI - - /* blogic_sort_probeinfo sorts a section of blogic_probeinfo_list in order of increasing PCI Bus and Device Number. @@ -667,14 +613,11 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) int nonpr_mmcount = 0, mmcount = 0; bool force_scan_order = false; bool force_scan_order_checked = false; - bool addr_seen[6]; struct pci_dev *pci_device = NULL; int i; if (blogic_probeinfo_count >= BLOGIC_MAX_ADAPTERS) return 0; blogic_probeinfo_count++; - for (i = 0; i < 6; i++) - addr_seen[i] = false; /* Iterate over the MultiMaster PCI Host Adapters. For each enumerated host adapter, determine whether its ISA Compatible @@ -744,11 +687,8 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) host_adapter->io_addr = io_addr; blogic_intreset(host_adapter); if (blogic_cmd(host_adapter, BLOGIC_INQ_PCI_INFO, NULL, 0, - &adapter_info, sizeof(adapter_info)) == - sizeof(adapter_info)) { - if (adapter_info.isa_port < 6) - addr_seen[adapter_info.isa_port] = true; - } else + &adapter_info, sizeof(adapter_info)) != + sizeof(adapter_info)) adapter_info.isa_port = BLOGIC_IO_DISABLE; /* Issue the Modify I/O Address command to disable the @@ -835,45 +775,6 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) if (force_scan_order) blogic_sort_probeinfo(&blogic_probeinfo_list[nonpr_mmindex], nonpr_mmcount); - /* - If no PCI MultiMaster Host Adapter is assigned the Primary - I/O Address, then the Primary I/O Address must be probed - explicitly before any PCI host adapters are probed. - */ - if (!blogic_probe_options.noprobe_isa) - if (pr_probeinfo->io_addr == 0 && - (!blogic_probe_options.limited_isa || - blogic_probe_options.probe330)) { - pr_probeinfo->adapter_type = BLOGIC_MULTIMASTER; - pr_probeinfo->adapter_bus_type = BLOGIC_ISA_BUS; - pr_probeinfo->io_addr = 0x330; - } - /* - Append the list of standard BusLogic MultiMaster ISA I/O Addresses, - omitting the Primary I/O Address which has already been handled. - */ - if (!blogic_probe_options.noprobe_isa) { - if (!addr_seen[1] && - (!blogic_probe_options.limited_isa || - blogic_probe_options.probe334)) - blogic_add_probeaddr_isa(0x334); - if (!addr_seen[2] && - (!blogic_probe_options.limited_isa || - blogic_probe_options.probe230)) - blogic_add_probeaddr_isa(0x230); - if (!addr_seen[3] && - (!blogic_probe_options.limited_isa || - blogic_probe_options.probe234)) - blogic_add_probeaddr_isa(0x234); - if (!addr_seen[4] && - (!blogic_probe_options.limited_isa || - blogic_probe_options.probe130)) - blogic_add_probeaddr_isa(0x130); - if (!addr_seen[5] && - (!blogic_probe_options.limited_isa || - blogic_probe_options.probe134)) - blogic_add_probeaddr_isa(0x134); - } /* Iterate over the older non-compliant MultiMaster PCI Host Adapters, noting the PCI bus location and assigned IRQ Channel. @@ -1078,18 +979,10 @@ static void __init blogic_init_probeinfo_list(struct blogic_adapter *adapter) } } } - } else { - blogic_init_probeinfo_isa(adapter); } } -#else -#define blogic_init_probeinfo_list(adapter) \ - blogic_init_probeinfo_isa(adapter) -#endif /* CONFIG_PCI */ - - /* blogic_failure prints a standardized error message, and then returns false. */ @@ -1539,14 +1432,6 @@ static bool __init blogic_rdconfig(struct blogic_adapter *adapter) else if (config.irq_ch15) adapter->irq_ch = 15; } - if (adapter->adapter_bus_type == BLOGIC_ISA_BUS) { - if (config.dma_ch5) - adapter->dma_ch = 5; - else if (config.dma_ch6) - adapter->dma_ch = 6; - else if (config.dma_ch7) - adapter->dma_ch = 7; - } /* Determine whether Extended Translation is enabled and save it in the Host Adapter structure. @@ -1686,8 +1571,7 @@ static bool __init blogic_rdconfig(struct blogic_adapter *adapter) if (adapter->fw_ver[0] == '5') adapter->adapter_qdepth = 192; else if (adapter->fw_ver[0] == '4') - adapter->adapter_qdepth = (adapter->adapter_bus_type != - BLOGIC_ISA_BUS ? 100 : 50); + adapter->adapter_qdepth = 100; else adapter->adapter_qdepth = 30; if (strcmp(adapter->fw_ver, "3.31") >= 0) { @@ -1727,13 +1611,6 @@ static bool __init blogic_rdconfig(struct blogic_adapter *adapter) bios_addr is 0. */ adapter->bios_addr = ext_setupinfo.bios_addr << 12; - /* - ISA Host Adapters require Bounce Buffers if there is more than - 16MB memory. - */ - if (adapter->adapter_bus_type == BLOGIC_ISA_BUS && - (void *) high_memory > (void *) MAX_DMA_ADDRESS) - adapter->need_bouncebuf = true; /* BusLogic BT-445S Host Adapters prior to board revision E have a hardware bug whereby when the BIOS is enabled, transfers to/from @@ -1839,11 +1716,7 @@ static bool __init blogic_reportconfig(struct blogic_adapter *adapter) blogic_info("Configuring BusLogic Model %s %s%s%s%s SCSI Host Adapter\n", adapter, adapter->model, blogic_adapter_busnames[adapter->adapter_bus_type], (adapter->wide ? " Wide" : ""), (adapter->differential ? " Differential" : ""), (adapter->ultra ? " Ultra" : "")); blogic_info(" Firmware Version: %s, I/O Address: 0x%lX, IRQ Channel: %d/%s\n", adapter, adapter->fw_ver, adapter->io_addr, adapter->irq_ch, (adapter->level_int ? "Level" : "Edge")); if (adapter->adapter_bus_type != BLOGIC_PCI_BUS) { - blogic_info(" DMA Channel: ", adapter); - if (adapter->dma_ch > 0) - blogic_info("%d, ", adapter, adapter->dma_ch); - else - blogic_info("None, ", adapter); + blogic_info(" DMA Channel: None, ", adapter); if (adapter->bios_addr > 0) blogic_info("BIOS Address: 0x%lX, ", adapter, adapter->bios_addr); @@ -1995,18 +1868,6 @@ static bool __init blogic_getres(struct blogic_adapter *adapter) return false; } adapter->irq_acquired = true; - /* - Acquire exclusive access to the DMA Channel. - */ - if (adapter->dma_ch > 0) { - if (request_dma(adapter->dma_ch, adapter->full_model) < 0) { - blogic_err("UNABLE TO ACQUIRE DMA CHANNEL %d - DETACHING\n", adapter, adapter->dma_ch); - return false; - } - set_dma_mode(adapter->dma_ch, DMA_MODE_CASCADE); - enable_dma(adapter->dma_ch); - adapter->dma_chan_acquired = true; - } /* Indicate the System Resource Acquisition completed successfully, */ @@ -2026,11 +1887,6 @@ static void blogic_relres(struct blogic_adapter *adapter) */ if (adapter->irq_acquired) free_irq(adapter->irq_ch, adapter); - /* - Release exclusive access to the DMA Channel. - */ - if (adapter->dma_chan_acquired) - free_dma(adapter->dma_ch); /* Release any allocated memory structs not released elsewhere */ @@ -3666,37 +3522,7 @@ static int __init blogic_parseopts(char *options) memset(drvr_opts, 0, sizeof(struct blogic_drvr_options)); while (*options != '\0' && *options != ';') { - /* Probing Options. */ - if (blogic_parse(&options, "IO:")) { - unsigned long io_addr = simple_strtoul(options, - &options, 0); - blogic_probe_options.limited_isa = true; - switch (io_addr) { - case 0x330: - blogic_probe_options.probe330 = true; - break; - case 0x334: - blogic_probe_options.probe334 = true; - break; - case 0x230: - blogic_probe_options.probe230 = true; - break; - case 0x234: - blogic_probe_options.probe234 = true; - break; - case 0x130: - blogic_probe_options.probe130 = true; - break; - case 0x134: - blogic_probe_options.probe134 = true; - break; - default: - blogic_err("BusLogic: Invalid Driver Options (invalid I/O Address 0x%lX)\n", NULL, io_addr); - return 0; - } - } else if (blogic_parse(&options, "NoProbeISA")) - blogic_probe_options.noprobe_isa = true; - else if (blogic_parse(&options, "NoProbePCI")) + if (blogic_parse(&options, "NoProbePCI")) blogic_probe_options.noprobe_pci = true; else if (blogic_parse(&options, "NoProbe")) blogic_probe_options.noprobe = true; diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h index 6182cc8a0344..2eedeaa47970 100644 --- a/drivers/scsi/BusLogic.h +++ b/drivers/scsi/BusLogic.h @@ -237,18 +237,10 @@ struct blogic_probeinfo { struct blogic_probe_options { bool noprobe:1; /* Bit 0 */ - bool noprobe_isa:1; /* Bit 1 */ bool noprobe_pci:1; /* Bit 2 */ bool nosort_pci:1; /* Bit 3 */ bool multimaster_first:1; /* Bit 4 */ bool flashpoint_first:1; /* Bit 5 */ - bool limited_isa:1; /* Bit 6 */ - bool probe330:1; /* Bit 7 */ - bool probe334:1; /* Bit 8 */ - bool probe230:1; /* Bit 9 */ - bool probe234:1; /* Bit 10 */ - bool probe130:1; /* Bit 11 */ - bool probe134:1; /* Bit 12 */ }; /* @@ -997,10 +989,8 @@ struct blogic_adapter { unsigned char bus; unsigned char dev; unsigned char irq_ch; - unsigned char dma_ch; unsigned char scsi_id; bool irq_acquired:1; - bool dma_chan_acquired:1; bool ext_trans_enable:1; bool parity:1; bool reset_enabled:1; diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 06b87c7f6bab..3d114be5b662 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -497,7 +497,7 @@ config SCSI_HPTIOP config SCSI_BUSLOGIC tristate "BusLogic SCSI support" - depends on (PCI || ISA) && SCSI && ISA_DMA_API && VIRT_TO_BUS + depends on PCI && SCSI && VIRT_TO_BUS help This is support for BusLogic MultiMaster and FlashPoint SCSI Host Adapters. Consult the SCSI-HOWTO, available from -- cgit v1.2.3 From a5f7a122dc04d7000ed60f6f7df76aa5be8bd7cf Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:29:56 +0200 Subject: BusLogic: reject broken old firmware that requires ISA-style bounce buffering Warn on and don't support adapters that have a DMA bug that forces ISA-style bounce buffering. Signed-off-by: Christoph Hellwig Acked-by: Khalid Aziz Acked-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Link: https://lore.kernel.org/r/20210331073001.46776-4-hch@lst.de Signed-off-by: Jens Axboe --- drivers/scsi/BusLogic.c | 21 ++++++--------------- drivers/scsi/BusLogic.h | 1 - 2 files changed, 6 insertions(+), 16 deletions(-) (limited to 'drivers') diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index 25ca2f938346..69068081f439 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -1616,14 +1616,12 @@ static bool __init blogic_rdconfig(struct blogic_adapter *adapter) hardware bug whereby when the BIOS is enabled, transfers to/from the same address range the BIOS occupies modulo 16MB are handled incorrectly. Only properly functioning BT-445S Host Adapters - have firmware version 3.37, so require that ISA Bounce Buffers - be used for the buggy BT-445S models if there is more than 16MB - memory. + have firmware version 3.37. */ - if (adapter->bios_addr > 0 && strcmp(adapter->model, "BT-445S") == 0 && - strcmp(adapter->fw_ver, "3.37") < 0 && - (void *) high_memory > (void *) MAX_DMA_ADDRESS) - adapter->need_bouncebuf = true; + if (adapter->bios_addr > 0 && + strcmp(adapter->model, "BT-445S") == 0 && + strcmp(adapter->fw_ver, "3.37") < 0) + return blogic_failure(adapter, "Too old firmware"); /* Initialize parameters common to MultiMaster and FlashPoint Host Adapters. @@ -1646,14 +1644,9 @@ common: if (adapter->drvr_opts != NULL && adapter->drvr_opts->qdepth[tgt_id] > 0) qdepth = adapter->drvr_opts->qdepth[tgt_id]; - else if (adapter->need_bouncebuf) - qdepth = BLOGIC_TAG_DEPTH_BB; adapter->qdepth[tgt_id] = qdepth; } - if (adapter->need_bouncebuf) - adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH_BB; - else - adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH; + adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH; if (adapter->drvr_opts != NULL) adapter->common_qdepth = adapter->drvr_opts->common_qdepth; if (adapter->common_qdepth > 0 && @@ -2155,7 +2148,6 @@ static void __init blogic_inithoststruct(struct blogic_adapter *adapter, host->this_id = adapter->scsi_id; host->can_queue = adapter->drvr_qdepth; host->sg_tablesize = adapter->drvr_sglimit; - host->unchecked_isa_dma = adapter->need_bouncebuf; host->cmd_per_lun = adapter->untag_qdepth; } @@ -3677,7 +3669,6 @@ static struct scsi_host_template blogic_template = { #if 0 .eh_abort_handler = blogic_abort, #endif - .unchecked_isa_dma = 1, .max_sectors = 128, }; diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h index 2eedeaa47970..a8e4a19788a7 100644 --- a/drivers/scsi/BusLogic.h +++ b/drivers/scsi/BusLogic.h @@ -1003,7 +1003,6 @@ struct blogic_adapter { bool terminfo_valid:1; bool low_term:1; bool high_term:1; - bool need_bouncebuf:1; bool strict_rr:1; bool scam_enabled:1; bool scam_lev2:1; -- cgit v1.2.3 From 9b4c8eaa68d0ce85be4ae06cbbd158c53f66fe4f Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:29:57 +0200 Subject: advansys: remove ISA support This is the last piece in the kernel requiring the block layer ISA bounce buffering, and it does not actually look used. So remove it to see if anyone screams, in which case we'll need to find a solution to fix it back up. Signed-off-by: Christoph Hellwig Acked-by: Martin K. Petersen Reviewed-by: Matthew Wilcox (Oracle) Reviewed-by: Hannes Reinecke Link: https://lore.kernel.org/r/20210331073001.46776-5-hch@lst.de Signed-off-by: Jens Axboe --- drivers/scsi/advansys.c | 321 +++++------------------------------------------- 1 file changed, 32 insertions(+), 289 deletions(-) (limited to 'drivers') diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index ec5627890809..993596d44a12 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c @@ -84,8 +84,6 @@ typedef unsigned char uchar; #define ASC_CS_TYPE unsigned short -#define ASC_IS_ISA (0x0001) -#define ASC_IS_ISAPNP (0x0081) #define ASC_IS_EISA (0x0002) #define ASC_IS_PCI (0x0004) #define ASC_IS_PCI_ULTRA (0x0104) @@ -101,11 +99,6 @@ typedef unsigned char uchar; #define ASC_CHIP_MIN_VER_PCI (0x09) #define ASC_CHIP_MAX_VER_PCI (0x0F) #define ASC_CHIP_VER_PCI_BIT (0x08) -#define ASC_CHIP_MIN_VER_ISA (0x11) -#define ASC_CHIP_MIN_VER_ISA_PNP (0x21) -#define ASC_CHIP_MAX_VER_ISA (0x27) -#define ASC_CHIP_VER_ISA_BIT (0x30) -#define ASC_CHIP_VER_ISAPNP_BIT (0x20) #define ASC_CHIP_VER_ASYN_BUG (0x21) #define ASC_CHIP_VER_PCI 0x08 #define ASC_CHIP_VER_PCI_ULTRA_3150 (ASC_CHIP_VER_PCI | 0x02) @@ -116,7 +109,6 @@ typedef unsigned char uchar; #define ASC_CHIP_LATEST_VER_EISA ((ASC_CHIP_MIN_VER_EISA - 1) + 3) #define ASC_MAX_VL_DMA_COUNT (0x07FFFFFFL) #define ASC_MAX_PCI_DMA_COUNT (0xFFFFFFFFL) -#define ASC_MAX_ISA_DMA_COUNT (0x00FFFFFFL) #define ASC_SCSI_ID_BITS 3 #define ASC_SCSI_TIX_TYPE uchar @@ -194,7 +186,6 @@ typedef unsigned char uchar; #define ASC_FLAG_SRB_LINEAR_ADDR 0x08 #define ASC_FLAG_WIN16 0x10 #define ASC_FLAG_WIN32 0x20 -#define ASC_FLAG_ISA_OVER_16MB 0x40 #define ASC_FLAG_DOS_VM_CALLBACK 0x80 #define ASC_TAG_FLAG_EXTRA_BYTES 0x10 #define ASC_TAG_FLAG_DISABLE_DISCONNECT 0x04 @@ -464,8 +455,6 @@ typedef struct asc_dvc_cfg { ASC_SCSI_BIT_ID_TYPE disc_enable; ASC_SCSI_BIT_ID_TYPE sdtr_enable; uchar chip_scsi_id; - uchar isa_dma_speed; - uchar isa_dma_channel; uchar chip_version; ushort mcode_date; ushort mcode_version; @@ -572,10 +561,8 @@ typedef struct asc_cap_info_array { #define ASC_EEP_MAX_RETRY 20 /* - * These macros keep the chip SCSI id and ISA DMA speed - * bitfields in board order. C bitfields aren't portable - * between big and little-endian platforms so they are - * not used. + * These macros keep the chip SCSI id bitfields in board order. C bitfields + * aren't portable between big and little-endian platforms so they are not used. */ #define ASC_EEP_GET_CHIP_ID(cfg) ((cfg)->id_speed & 0x0f) @@ -2340,9 +2327,8 @@ static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h) printk(" disc_enable 0x%x, sdtr_enable 0x%x,\n", h->disc_enable, h->sdtr_enable); - printk(" chip_scsi_id %d, isa_dma_speed %d, isa_dma_channel %d, " - "chip_version %d,\n", h->chip_scsi_id, h->isa_dma_speed, - h->isa_dma_channel, h->chip_version); + printk(" chip_scsi_id %d, chip_version %d,\n", + h->chip_scsi_id, h->chip_version); printk(" mcode_date 0x%x, mcode_version %d\n", h->mcode_date, h->mcode_version); @@ -2415,8 +2401,8 @@ static void asc_prt_scsi_host(struct Scsi_Host *s) printk(" dma_channel %d, this_id %d, can_queue %d,\n", s->dma_channel, s->this_id, s->can_queue); - printk(" cmd_per_lun %d, sg_tablesize %d, unchecked_isa_dma %d\n", - s->cmd_per_lun, s->sg_tablesize, s->unchecked_isa_dma); + printk(" cmd_per_lun %d, sg_tablesize %d\n", + s->cmd_per_lun, s->sg_tablesize); if (ASC_NARROW_BOARD(boardp)) { asc_prt_asc_dvc_var(&boardp->dvc_var.asc_dvc_var); @@ -2632,42 +2618,28 @@ static const char *advansys_info(struct Scsi_Host *shost) if (ASC_NARROW_BOARD(boardp)) { asc_dvc_varp = &boardp->dvc_var.asc_dvc_var; ASC_DBG(1, "begin\n"); - if (asc_dvc_varp->bus_type & ASC_IS_ISA) { - if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) == - ASC_IS_ISAPNP) { - busname = "ISA PnP"; + + if (asc_dvc_varp->bus_type & ASC_IS_VL) { + busname = "VL"; + } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) { + busname = "EISA"; + } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) { + if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA) + == ASC_IS_PCI_ULTRA) { + busname = "PCI Ultra"; } else { - busname = "ISA"; + busname = "PCI"; } - sprintf(info, - "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X", - ASC_VERSION, busname, - (ulong)shost->io_port, - (ulong)shost->io_port + ASC_IOADR_GAP - 1, - boardp->irq, shost->dma_channel); } else { - if (asc_dvc_varp->bus_type & ASC_IS_VL) { - busname = "VL"; - } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) { - busname = "EISA"; - } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) { - if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA) - == ASC_IS_PCI_ULTRA) { - busname = "PCI Ultra"; - } else { - busname = "PCI"; - } - } else { - busname = "?"; - shost_printk(KERN_ERR, shost, "unknown bus " - "type %d\n", asc_dvc_varp->bus_type); - } - sprintf(info, - "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X", - ASC_VERSION, busname, (ulong)shost->io_port, - (ulong)shost->io_port + ASC_IOADR_GAP - 1, - boardp->irq); + busname = "?"; + shost_printk(KERN_ERR, shost, "unknown bus " + "type %d\n", asc_dvc_varp->bus_type); } + sprintf(info, + "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X", + ASC_VERSION, busname, (ulong)shost->io_port, + (ulong)shost->io_port + ASC_IOADR_GAP - 1, + boardp->irq); } else { /* * Wide Adapter Information @@ -2873,12 +2845,7 @@ static void asc_prt_asc_board_eeprom(struct seq_file *m, struct Scsi_Host *shost ASCEEP_CONFIG *ep; int i; uchar serialstr[13]; -#ifdef CONFIG_ISA - ASC_DVC_VAR *asc_dvc_varp; - int isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 }; - asc_dvc_varp = &boardp->dvc_var.asc_dvc_var; -#endif /* CONFIG_ISA */ ep = &boardp->eep_config.asc_eep; seq_printf(m, @@ -2926,14 +2893,6 @@ static void asc_prt_asc_board_eeprom(struct seq_file *m, struct Scsi_Host *shost seq_printf(m, " %c", (ep->init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); seq_putc(m, '\n'); - -#ifdef CONFIG_ISA - if (asc_dvc_varp->bus_type & ASC_IS_ISA) { - seq_printf(m, - " Host ISA DMA speed: %d MB/S\n", - isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]); - } -#endif /* CONFIG_ISA */ } /* @@ -3180,10 +3139,6 @@ static void asc_prt_driver_conf(struct seq_file *m, struct Scsi_Host *shost) shost->unique_id, shost->can_queue, shost->this_id, shost->sg_tablesize, shost->cmd_per_lun); - seq_printf(m, - " unchecked_isa_dma %d\n", - shost->unchecked_isa_dma); - seq_printf(m, " flags 0x%x, last_reset 0x%lx, jiffies 0x%lx, asc_n_io_port 0x%x\n", boardp->flags, shost->last_reset, jiffies, @@ -8563,12 +8518,6 @@ static unsigned short AscGetChipBiosAddress(PortAddr iop_base, } cfg_lsw = AscGetChipCfgLsw(iop_base); - - /* - * ISA PnP uses the top bit as the 32K BIOS flag - */ - if (bus_type == ASC_IS_ISAPNP) - cfg_lsw &= 0x7FFF; bios_addr = ASC_BIOS_MIN_ADDR + (cfg_lsw >> 12) * ASC_BIOS_BANK_SIZE; return bios_addr; } @@ -8611,19 +8560,6 @@ static unsigned char AscGetChipVersion(PortAddr iop_base, return AscGetChipVerNo(iop_base); } -#ifdef CONFIG_ISA -static void AscEnableIsaDma(uchar dma_channel) -{ - if (dma_channel < 4) { - outp(0x000B, (ushort)(0xC0 | dma_channel)); - outp(0x000A, dma_channel); - } else if (dma_channel < 8) { - outp(0x00D6, (ushort)(0xC0 | (dma_channel - 4))); - outp(0x00D4, (ushort)(dma_channel - 4)); - } -} -#endif /* CONFIG_ISA */ - static int AscStopQueueExe(PortAddr iop_base) { int count = 0; @@ -8644,65 +8580,11 @@ static int AscStopQueueExe(PortAddr iop_base) static unsigned int AscGetMaxDmaCount(ushort bus_type) { - if (bus_type & ASC_IS_ISA) - return ASC_MAX_ISA_DMA_COUNT; - else if (bus_type & (ASC_IS_EISA | ASC_IS_VL)) + if (bus_type & (ASC_IS_EISA | ASC_IS_VL)) return ASC_MAX_VL_DMA_COUNT; return ASC_MAX_PCI_DMA_COUNT; } -#ifdef CONFIG_ISA -static ushort AscGetIsaDmaChannel(PortAddr iop_base) -{ - ushort channel; - - channel = AscGetChipCfgLsw(iop_base) & 0x0003; - if (channel == 0x03) - return (0); - else if (channel == 0x00) - return (7); - return (channel + 4); -} - -static ushort AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channel) -{ - ushort cfg_lsw; - uchar value; - - if ((dma_channel >= 5) && (dma_channel <= 7)) { - if (dma_channel == 7) - value = 0x00; - else - value = dma_channel - 4; - cfg_lsw = AscGetChipCfgLsw(iop_base) & 0xFFFC; - cfg_lsw |= value; - AscSetChipCfgLsw(iop_base, cfg_lsw); - return (AscGetIsaDmaChannel(iop_base)); - } - return 0; -} - -static uchar AscGetIsaDmaSpeed(PortAddr iop_base) -{ - uchar speed_value; - - AscSetBank(iop_base, 1); - speed_value = AscReadChipDmaSpeed(iop_base); - speed_value &= 0x07; - AscSetBank(iop_base, 0); - return speed_value; -} - -static uchar AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value) -{ - speed_value &= 0x07; - AscSetBank(iop_base, 1); - AscWriteChipDmaSpeed(iop_base, speed_value); - AscSetBank(iop_base, 0); - return AscGetIsaDmaSpeed(iop_base); -} -#endif /* CONFIG_ISA */ - static void AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc) { int i; @@ -8712,7 +8594,7 @@ static void AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc) iop_base = asc_dvc->iop_base; asc_dvc->err_code = 0; if ((asc_dvc->bus_type & - (ASC_IS_ISA | ASC_IS_PCI | ASC_IS_EISA | ASC_IS_VL)) == 0) { + (ASC_IS_PCI | ASC_IS_EISA | ASC_IS_VL)) == 0) { asc_dvc->err_code |= ASC_IERR_NO_BUS_TYPE; } AscSetChipControl(iop_base, CC_HALT); @@ -8767,17 +8649,6 @@ static void AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc) (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE)); } - asc_dvc->cfg->isa_dma_speed = ASC_DEF_ISA_DMA_SPEED; -#ifdef CONFIG_ISA - if ((asc_dvc->bus_type & ASC_IS_ISA) != 0) { - if (chip_version >= ASC_CHIP_MIN_VER_ISA_PNP) { - AscSetChipIFC(iop_base, IFC_INIT_DEFAULT); - asc_dvc->bus_type = ASC_IS_ISAPNP; - } - asc_dvc->cfg->isa_dma_channel = - (uchar)AscGetIsaDmaChannel(iop_base); - } -#endif /* CONFIG_ISA */ for (i = 0; i <= ASC_MAX_TID; i++) { asc_dvc->cur_dvc_qng[i] = 0; asc_dvc->max_dvc_qng[i] = ASC_MAX_SCSI1_QNG; @@ -9141,7 +9012,6 @@ static int AscInitFromEEP(ASC_DVC_VAR *asc_dvc) asc_dvc->cfg->sdtr_enable = eep_config->init_sdtr; asc_dvc->cfg->disc_enable = eep_config->disc_enable; asc_dvc->cfg->cmd_qng_enabled = eep_config->use_cmd_qng; - asc_dvc->cfg->isa_dma_speed = ASC_EEP_GET_DMA_SPD(eep_config); asc_dvc->start_motor = eep_config->start_motor; asc_dvc->dvc_cntl = eep_config->cntl; asc_dvc->no_scam = eep_config->no_scam; @@ -9314,22 +9184,10 @@ static int AscInitSetConfig(struct pci_dev *pdev, struct Scsi_Host *shost) } } else #endif /* CONFIG_PCI */ - if (asc_dvc->bus_type == ASC_IS_ISAPNP) { - if (AscGetChipVersion(iop_base, asc_dvc->bus_type) - == ASC_CHIP_VER_ASYN_BUG) { - asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_ASYN_USE_SYN; - } - } if (AscSetChipScsiID(iop_base, asc_dvc->cfg->chip_scsi_id) != asc_dvc->cfg->chip_scsi_id) { asc_dvc->err_code |= ASC_IERR_SET_SCSI_ID; } -#ifdef CONFIG_ISA - if (asc_dvc->bus_type & ASC_IS_ISA) { - AscSetIsaDmaChannel(iop_base, asc_dvc->cfg->isa_dma_channel); - AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed); - } -#endif /* CONFIG_ISA */ asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG; @@ -10752,12 +10610,6 @@ static struct scsi_host_template advansys_template = { .eh_host_reset_handler = advansys_reset, .bios_param = advansys_biosparam, .slave_configure = advansys_slave_configure, - /* - * Because the driver may control an ISA adapter 'unchecked_isa_dma' - * must be set. The flag will be cleared in advansys_board_found - * for non-ISA adapters. - */ - .unchecked_isa_dma = true, }; static int advansys_wide_init_chip(struct Scsi_Host *shost) @@ -10923,29 +10775,21 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop, */ switch (asc_dvc_varp->bus_type) { #ifdef CONFIG_ISA - case ASC_IS_ISA: - shost->unchecked_isa_dma = true; - share_irq = 0; - break; case ASC_IS_VL: - shost->unchecked_isa_dma = false; share_irq = 0; break; case ASC_IS_EISA: - shost->unchecked_isa_dma = false; share_irq = IRQF_SHARED; break; #endif /* CONFIG_ISA */ #ifdef CONFIG_PCI case ASC_IS_PCI: - shost->unchecked_isa_dma = false; share_irq = IRQF_SHARED; break; #endif /* CONFIG_PCI */ default: shost_printk(KERN_ERR, shost, "unknown adapter type: " "%d\n", asc_dvc_varp->bus_type); - shost->unchecked_isa_dma = false; share_irq = 0; break; } @@ -10964,7 +10808,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop, * For Wide boards set PCI information before calling * AdvInitGetConfig(). */ - shost->unchecked_isa_dma = false; share_irq = IRQF_SHARED; ASC_DBG(2, "AdvInitGetConfig()\n"); @@ -11000,7 +10843,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop, ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable; ep->disc_enable = asc_dvc_varp->cfg->disc_enable; ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled; - ASC_EEP_SET_DMA_SPD(ep, asc_dvc_varp->cfg->isa_dma_speed); + ASC_EEP_SET_DMA_SPD(ep, ASC_DEF_ISA_DMA_SPEED); ep->start_motor = asc_dvc_varp->start_motor; ep->cntl = asc_dvc_varp->dvc_cntl; ep->no_scam = asc_dvc_varp->no_scam; @@ -11228,22 +11071,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop, /* Register DMA Channel for Narrow boards. */ shost->dma_channel = NO_ISA_DMA; /* Default to no ISA DMA. */ -#ifdef CONFIG_ISA - if (ASC_NARROW_BOARD(boardp)) { - /* Register DMA channel for ISA bus. */ - if (asc_dvc_varp->bus_type & ASC_IS_ISA) { - shost->dma_channel = asc_dvc_varp->cfg->isa_dma_channel; - ret = request_dma(shost->dma_channel, DRV_NAME); - if (ret) { - shost_printk(KERN_ERR, shost, "request_dma() " - "%d failed %d\n", - shost->dma_channel, ret); - goto err_unmap; - } - AscEnableIsaDma(shost->dma_channel); - } - } -#endif /* CONFIG_ISA */ /* Register IRQ Number. */ ASC_DBG(2, "request_irq(%d, %p)\n", boardp->irq, shost); @@ -11262,7 +11089,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop, shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x " "failed with %d\n", boardp->irq, ret); } - goto err_free_dma; + goto err_unmap; } /* @@ -11314,11 +11141,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop, advansys_wide_free_mem(boardp); err_free_irq: free_irq(boardp->irq, shost); - err_free_dma: -#ifdef CONFIG_ISA - if (shost->dma_channel != NO_ISA_DMA) - free_dma(shost->dma_channel); -#endif err_unmap: if (boardp->ioremap_addr) iounmap(boardp->ioremap_addr); @@ -11339,12 +11161,7 @@ static int advansys_release(struct Scsi_Host *shost) ASC_DBG(1, "begin\n"); scsi_remove_host(shost); free_irq(board->irq, shost); -#ifdef CONFIG_ISA - if (shost->dma_channel != NO_ISA_DMA) { - ASC_DBG(1, "free_dma()\n"); - free_dma(shost->dma_channel); - } -#endif + if (ASC_NARROW_BOARD(board)) { dma_unmap_single(board->dev, board->dvc_var.asc_dvc_var.overrun_dma, @@ -11366,79 +11183,13 @@ static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] = { 0x0210, 0x0230, 0x0250, 0x0330 }; -/* - * The ISA IRQ number is found in bits 2 and 3 of the CfgLsw. It decodes as: - * 00: 10 - * 01: 11 - * 10: 12 - * 11: 15 - */ -static unsigned int advansys_isa_irq_no(PortAddr iop_base) -{ - unsigned short cfg_lsw = AscGetChipCfgLsw(iop_base); - unsigned int chip_irq = ((cfg_lsw >> 2) & 0x03) + 10; - if (chip_irq == 13) - chip_irq = 15; - return chip_irq; -} - -static int advansys_isa_probe(struct device *dev, unsigned int id) -{ - int err = -ENODEV; - PortAddr iop_base = _asc_def_iop_base[id]; - struct Scsi_Host *shost; - struct asc_board *board; - - if (!request_region(iop_base, ASC_IOADR_GAP, DRV_NAME)) { - ASC_DBG(1, "I/O port 0x%x busy\n", iop_base); - return -ENODEV; - } - ASC_DBG(1, "probing I/O port 0x%x\n", iop_base); - if (!AscFindSignature(iop_base)) - goto release_region; - if (!(AscGetChipVersion(iop_base, ASC_IS_ISA) & ASC_CHIP_VER_ISA_BIT)) - goto release_region; - - err = -ENOMEM; - shost = scsi_host_alloc(&advansys_template, sizeof(*board)); - if (!shost) - goto release_region; - - board = shost_priv(shost); - board->irq = advansys_isa_irq_no(iop_base); - board->dev = dev; - board->shost = shost; - - err = advansys_board_found(shost, iop_base, ASC_IS_ISA); - if (err) - goto free_host; - - dev_set_drvdata(dev, shost); - return 0; - - free_host: - scsi_host_put(shost); - release_region: - release_region(iop_base, ASC_IOADR_GAP); - return err; -} - -static void advansys_isa_remove(struct device *dev, unsigned int id) +static void advansys_vlb_remove(struct device *dev, unsigned int id) { int ioport = _asc_def_iop_base[id]; advansys_release(dev_get_drvdata(dev)); release_region(ioport, ASC_IOADR_GAP); } -static struct isa_driver advansys_isa_driver = { - .probe = advansys_isa_probe, - .remove = advansys_isa_remove, - .driver = { - .owner = THIS_MODULE, - .name = DRV_NAME, - }, -}; - /* * The VLB IRQ number is found in bits 2 to 4 of the CfgLsw. It decodes as: * 000: invalid @@ -11507,7 +11258,7 @@ static int advansys_vlb_probe(struct device *dev, unsigned int id) static struct isa_driver advansys_vlb_driver = { .probe = advansys_vlb_probe, - .remove = advansys_isa_remove, + .remove = advansys_vlb_remove, .driver = { .owner = THIS_MODULE, .name = "advansys_vlb", @@ -11757,15 +11508,10 @@ static int __init advansys_init(void) { int error; - error = isa_register_driver(&advansys_isa_driver, - ASC_IOADR_TABLE_MAX_IX); - if (error) - goto fail; - error = isa_register_driver(&advansys_vlb_driver, ASC_IOADR_TABLE_MAX_IX); if (error) - goto unregister_isa; + goto fail; error = eisa_driver_register(&advansys_eisa_driver); if (error) @@ -11781,8 +11527,6 @@ static int __init advansys_init(void) eisa_driver_unregister(&advansys_eisa_driver); unregister_vlb: isa_unregister_driver(&advansys_vlb_driver); - unregister_isa: - isa_unregister_driver(&advansys_isa_driver); fail: return error; } @@ -11792,7 +11536,6 @@ static void __exit advansys_exit(void) pci_unregister_driver(&advansys_pci_driver); eisa_driver_unregister(&advansys_eisa_driver); isa_unregister_driver(&advansys_vlb_driver); - isa_unregister_driver(&advansys_isa_driver); } module_init(advansys_init); -- cgit v1.2.3 From aaff5ebaa2694f283b7d07fdd55fb287ffc4f1e9 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:29:58 +0200 Subject: scsi: remove the unchecked_isa_dma flag Remove the unchecked_isa_dma now that all users are gone. Signed-off-by: Christoph Hellwig Acked-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Link: https://lore.kernel.org/r/20210331073001.46776-6-hch@lst.de Signed-off-by: Jens Axboe --- drivers/scsi/esas2r/esas2r_main.c | 1 - drivers/scsi/hosts.c | 7 +----- drivers/scsi/scsi_debugfs.c | 1 - drivers/scsi/scsi_lib.c | 52 ++++----------------------------------- drivers/scsi/scsi_scan.c | 6 ++--- drivers/scsi/scsi_sysfs.c | 2 -- drivers/scsi/sg.c | 10 ++------ drivers/scsi/sr_ioctl.c | 12 +++------ drivers/scsi/st.c | 20 ++++++--------- drivers/scsi/st.h | 2 -- 10 files changed, 22 insertions(+), 91 deletions(-) (limited to 'drivers') diff --git a/drivers/scsi/esas2r/esas2r_main.c b/drivers/scsi/esas2r/esas2r_main.c index a9dd6345f064..5d9eeac6717a 100644 --- a/drivers/scsi/esas2r/esas2r_main.c +++ b/drivers/scsi/esas2r/esas2r_main.c @@ -249,7 +249,6 @@ static struct scsi_host_template driver_template = { .cmd_per_lun = ESAS2R_DEFAULT_CMD_PER_LUN, .present = 0, - .unchecked_isa_dma = 0, .emulated = 0, .proc_name = ESAS2R_DRVR_NAME, .change_queue_depth = scsi_change_queue_depth, diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 2f162603876f..697c09ef259b 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -371,13 +371,9 @@ static struct device_type scsi_host_type = { struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) { struct Scsi_Host *shost; - gfp_t gfp_mask = GFP_KERNEL; int index; - if (sht->unchecked_isa_dma && privsize) - gfp_mask |= __GFP_DMA; - - shost = kzalloc(sizeof(struct Scsi_Host) + privsize, gfp_mask); + shost = kzalloc(sizeof(struct Scsi_Host) + privsize, GFP_KERNEL); if (!shost) return NULL; @@ -419,7 +415,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) shost->sg_tablesize = sht->sg_tablesize; shost->sg_prot_tablesize = sht->sg_prot_tablesize; shost->cmd_per_lun = sht->cmd_per_lun; - shost->unchecked_isa_dma = sht->unchecked_isa_dma; shost->no_write_same = sht->no_write_same; shost->host_tagset = sht->host_tagset; diff --git a/drivers/scsi/scsi_debugfs.c b/drivers/scsi/scsi_debugfs.c index c19ea7ab54cb..d9109771f274 100644 --- a/drivers/scsi/scsi_debugfs.c +++ b/drivers/scsi/scsi_debugfs.c @@ -8,7 +8,6 @@ #define SCSI_CMD_FLAG_NAME(name)[const_ilog2(SCMD_##name)] = #name static const char *const scsi_cmd_flags[] = { SCSI_CMD_FLAG_NAME(TAGGED), - SCSI_CMD_FLAG_NAME(UNCHECKED_ISA_DMA), SCSI_CMD_FLAG_NAME(INITIALIZED), }; #undef SCSI_CMD_FLAG_NAME diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 7d52a11e1b61..c289991ffaed 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -53,49 +53,16 @@ #endif static struct kmem_cache *scsi_sense_cache; -static struct kmem_cache *scsi_sense_isadma_cache; static DEFINE_MUTEX(scsi_sense_cache_mutex); static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd); -static inline struct kmem_cache * -scsi_select_sense_cache(bool unchecked_isa_dma) -{ - return unchecked_isa_dma ? scsi_sense_isadma_cache : scsi_sense_cache; -} - -static void scsi_free_sense_buffer(bool unchecked_isa_dma, - unsigned char *sense_buffer) -{ - kmem_cache_free(scsi_select_sense_cache(unchecked_isa_dma), - sense_buffer); -} - -static unsigned char *scsi_alloc_sense_buffer(bool unchecked_isa_dma, - gfp_t gfp_mask, int numa_node) -{ - return kmem_cache_alloc_node(scsi_select_sense_cache(unchecked_isa_dma), - gfp_mask, numa_node); -} - int scsi_init_sense_cache(struct Scsi_Host *shost) { - struct kmem_cache *cache; int ret = 0; mutex_lock(&scsi_sense_cache_mutex); - cache = scsi_select_sense_cache(shost->unchecked_isa_dma); - if (cache) - goto exit; - - if (shost->unchecked_isa_dma) { - scsi_sense_isadma_cache = - kmem_cache_create("scsi_sense_cache(DMA)", - SCSI_SENSE_BUFFERSIZE, 0, - SLAB_HWCACHE_ALIGN | SLAB_CACHE_DMA, NULL); - if (!scsi_sense_isadma_cache) - ret = -ENOMEM; - } else { + if (!scsi_sense_cache) { scsi_sense_cache = kmem_cache_create_usercopy("scsi_sense_cache", SCSI_SENSE_BUFFERSIZE, 0, SLAB_HWCACHE_ALIGN, @@ -103,7 +70,6 @@ int scsi_init_sense_cache(struct Scsi_Host *shost) if (!scsi_sense_cache) ret = -ENOMEM; } - exit: mutex_unlock(&scsi_sense_cache_mutex); return ret; } @@ -1748,15 +1714,12 @@ static int scsi_mq_init_request(struct blk_mq_tag_set *set, struct request *rq, unsigned int hctx_idx, unsigned int numa_node) { struct Scsi_Host *shost = set->driver_data; - const bool unchecked_isa_dma = shost->unchecked_isa_dma; struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq); struct scatterlist *sg; int ret = 0; - if (unchecked_isa_dma) - cmd->flags |= SCMD_UNCHECKED_ISA_DMA; - cmd->sense_buffer = scsi_alloc_sense_buffer(unchecked_isa_dma, - GFP_KERNEL, numa_node); + cmd->sense_buffer = + kmem_cache_alloc_node(scsi_sense_cache, GFP_KERNEL, numa_node); if (!cmd->sense_buffer) return -ENOMEM; cmd->req.sense = cmd->sense_buffer; @@ -1770,8 +1733,7 @@ static int scsi_mq_init_request(struct blk_mq_tag_set *set, struct request *rq, if (shost->hostt->init_cmd_priv) { ret = shost->hostt->init_cmd_priv(shost, cmd); if (ret < 0) - scsi_free_sense_buffer(unchecked_isa_dma, - cmd->sense_buffer); + kmem_cache_free(scsi_sense_cache, cmd->sense_buffer); } return ret; @@ -1785,8 +1747,7 @@ static void scsi_mq_exit_request(struct blk_mq_tag_set *set, struct request *rq, if (shost->hostt->exit_cmd_priv) shost->hostt->exit_cmd_priv(shost, cmd); - scsi_free_sense_buffer(cmd->flags & SCMD_UNCHECKED_ISA_DMA, - cmd->sense_buffer); + kmem_cache_free(scsi_sense_cache, cmd->sense_buffer); } static int scsi_map_queues(struct blk_mq_tag_set *set) @@ -1821,8 +1782,6 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q) dma_max_mapping_size(dev) >> SECTOR_SHIFT); } blk_queue_max_hw_sectors(q, shost->max_sectors); - if (shost->unchecked_isa_dma) - blk_queue_bounce_limit(q, BLK_BOUNCE_ISA); blk_queue_segment_boundary(q, shost->dma_boundary); dma_set_seg_boundary(dev, shost->dma_boundary); @@ -1988,7 +1947,6 @@ EXPORT_SYMBOL(scsi_unblock_requests); void scsi_exit_queue(void) { kmem_cache_destroy(scsi_sense_cache); - kmem_cache_destroy(scsi_sense_isadma_cache); } /** diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 9af50e6f94c4..9b73aa506382 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -1078,8 +1078,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, if (!sdev) goto out; - result = kmalloc(result_len, GFP_KERNEL | - ((shost->unchecked_isa_dma) ? __GFP_DMA : 0)); + result = kmalloc(result_len, GFP_KERNEL); if (!result) goto out_free_sdev; @@ -1336,8 +1335,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, blist_flags_t bflag */ length = (511 + 1) * sizeof(struct scsi_lun); retry: - lun_data = kmalloc(length, GFP_KERNEL | - (sdev->host->unchecked_isa_dma ? __GFP_DMA : 0)); + lun_data = kmalloc(length, GFP_KERNEL); if (!lun_data) { printk(ALLOC_FAILURE_MSG, __func__); goto out; diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index b6378c8ca783..b71ea1a69c8b 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -373,7 +373,6 @@ shost_rd_attr(cmd_per_lun, "%hd\n"); shost_rd_attr(can_queue, "%d\n"); shost_rd_attr(sg_tablesize, "%hu\n"); shost_rd_attr(sg_prot_tablesize, "%hu\n"); -shost_rd_attr(unchecked_isa_dma, "%d\n"); shost_rd_attr(prot_capabilities, "%u\n"); shost_rd_attr(prot_guard_type, "%hd\n"); shost_rd_attr2(proc_name, hostt->proc_name, "%s\n"); @@ -411,7 +410,6 @@ static struct attribute *scsi_sysfs_shost_attrs[] = { &dev_attr_can_queue.attr, &dev_attr_sg_tablesize.attr, &dev_attr_sg_prot_tablesize.attr, - &dev_attr_unchecked_isa_dma.attr, &dev_attr_proc_name.attr, &dev_attr_scan.attr, &dev_attr_hstate.attr, diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 4383d93110f8..70f38715641e 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -974,7 +974,7 @@ sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp, */ return 0; case SG_GET_LOW_DMA: - return put_user((int) sdp->device->host->unchecked_isa_dma, ip); + return put_user(0, ip); case SG_GET_SCSI_ID: { sg_scsi_id_t v; @@ -1777,7 +1777,6 @@ sg_start_req(Sg_request *srp, unsigned char *cmd) if (sg_allow_dio && hp->flags & SG_FLAG_DIRECT_IO && dxfer_dir != SG_DXFER_UNKNOWN && !iov_count && - !sfp->parentdp->device->host->unchecked_isa_dma && blk_rq_aligned(q, (unsigned long)hp->dxferp, dxfer_len)) md = NULL; else @@ -1893,7 +1892,6 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) int sg_tablesize = sfp->parentdp->sg_tablesize; int blk_size = buff_size, order; gfp_t gfp_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN | __GFP_ZERO; - struct sg_device *sdp = sfp->parentdp; if (blk_size < 0) return -EFAULT; @@ -1919,9 +1917,6 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) scatter_elem_sz_prev = num; } - if (sdp->device->host->unchecked_isa_dma) - gfp_mask |= GFP_DMA; - order = get_order(num); retry: ret_sz = 1 << (PAGE_SHIFT + order); @@ -2547,8 +2542,7 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp) "(res)sgat=%d low_dma=%d\n", k, jiffies_to_msecs(fp->timeout), fp->reserve.bufflen, - (int) fp->reserve.k_use_sg, - (int) sdp->device->host->unchecked_isa_dma); + (int) fp->reserve.k_use_sg, 0); seq_printf(s, " cmd_q=%d f_packid=%d k_orphan=%d closed=0\n", (int) fp->cmd_q, (int) fp->force_packid, (int) fp->keep_orphan); diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c index 5703f8400b73..15c305283b6c 100644 --- a/drivers/scsi/sr_ioctl.c +++ b/drivers/scsi/sr_ioctl.c @@ -33,10 +33,6 @@ static int xa_test = 0; module_param(xa_test, int, S_IRUGO | S_IWUSR); -/* primitive to determine whether we need to have GFP_DMA set based on - * the status of the unchecked_isa_dma flag in the host structure */ -#define SR_GFP_DMA(cd) (((cd)->device->host->unchecked_isa_dma) ? GFP_DMA : 0) - static int sr_read_tochdr(struct cdrom_device_info *cdi, struct cdrom_tochdr *tochdr) { @@ -45,7 +41,7 @@ static int sr_read_tochdr(struct cdrom_device_info *cdi, int result; unsigned char *buffer; - buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd)); + buffer = kmalloc(32, GFP_KERNEL); if (!buffer) return -ENOMEM; @@ -75,7 +71,7 @@ static int sr_read_tocentry(struct cdrom_device_info *cdi, int result; unsigned char *buffer; - buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd)); + buffer = kmalloc(32, GFP_KERNEL); if (!buffer) return -ENOMEM; @@ -384,7 +380,7 @@ int sr_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn) { Scsi_CD *cd = cdi->handle; struct packet_command cgc; - char *buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd)); + char *buffer = kmalloc(32, GFP_KERNEL); int result; if (!buffer) @@ -567,7 +563,7 @@ int sr_is_xa(Scsi_CD *cd) if (!xa_test) return 0; - raw_sector = kmalloc(2048, GFP_KERNEL | SR_GFP_DMA(cd)); + raw_sector = kmalloc(2048, GFP_KERNEL); if (!raw_sector) return -ENOMEM; if (0 == sr_read_sector(cd, cd->ms_offset + 16, diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 9ca536aae784..3b1afe1d5b27 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -188,7 +188,7 @@ static int st_max_sg_segs = ST_MAX_SG; static int modes_defined; -static int enlarge_buffer(struct st_buffer *, int, int); +static int enlarge_buffer(struct st_buffer *, int); static void clear_buffer(struct st_buffer *); static void normalize_buffer(struct st_buffer *); static int append_to_buffer(const char __user *, struct st_buffer *, int); @@ -1289,7 +1289,7 @@ static int st_open(struct inode *inode, struct file *filp) } /* See that we have at least a one page buffer available */ - if (!enlarge_buffer(STp->buffer, PAGE_SIZE, STp->restr_dma)) { + if (!enlarge_buffer(STp->buffer, PAGE_SIZE)) { st_printk(KERN_WARNING, STp, "Can't allocate one page tape buffer.\n"); retval = (-EOVERFLOW); @@ -1586,7 +1586,7 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf, } if (bufsize > STbp->buffer_size && - !enlarge_buffer(STbp, bufsize, STp->restr_dma)) { + !enlarge_buffer(STbp, bufsize)) { st_printk(KERN_WARNING, STp, "Can't allocate %d byte tape buffer.\n", bufsize); @@ -3894,7 +3894,7 @@ static long st_compat_ioctl(struct file *file, unsigned int cmd_in, unsigned lon /* Try to allocate a new tape buffer. Calling function must not hold dev_arr_lock. */ -static struct st_buffer *new_tape_buffer(int need_dma, int max_sg) +static struct st_buffer *new_tape_buffer(int max_sg) { struct st_buffer *tb; @@ -3905,7 +3905,6 @@ static struct st_buffer *new_tape_buffer(int need_dma, int max_sg) } tb->frp_segs = 0; tb->use_sg = max_sg; - tb->dma = need_dma; tb->buffer_size = 0; tb->reserved_pages = kcalloc(max_sg, sizeof(struct page *), @@ -3922,7 +3921,7 @@ static struct st_buffer *new_tape_buffer(int need_dma, int max_sg) /* Try to allocate enough space in the tape buffer */ #define ST_MAX_ORDER 6 -static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dma) +static int enlarge_buffer(struct st_buffer * STbuffer, int new_size) { int segs, max_segs, b_size, order, got; gfp_t priority; @@ -3936,8 +3935,6 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm max_segs = STbuffer->use_sg; priority = GFP_KERNEL | __GFP_NOWARN; - if (need_dma) - priority |= GFP_DMA; if (STbuffer->cleared) priority |= __GFP_ZERO; @@ -3957,7 +3954,7 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm if (order == ST_MAX_ORDER) return 0; normalize_buffer(STbuffer); - return enlarge_buffer(STbuffer, new_size, need_dma); + return enlarge_buffer(STbuffer, new_size); } for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size; @@ -4296,7 +4293,7 @@ static int st_probe(struct device *dev) i = queue_max_segments(SDp->request_queue); if (st_max_sg_segs < i) i = st_max_sg_segs; - buffer = new_tape_buffer((SDp->host)->unchecked_isa_dma, i); + buffer = new_tape_buffer(i); if (buffer == NULL) { sdev_printk(KERN_ERR, SDp, "st: Can't allocate new tape buffer. " @@ -4340,7 +4337,6 @@ static int st_probe(struct device *dev) tpnt->dirty = 0; tpnt->in_use = 0; tpnt->drv_buffer = 1; /* Try buffering if no mode sense */ - tpnt->restr_dma = (SDp->host)->unchecked_isa_dma; tpnt->use_pf = (SDp->scsi_level >= SCSI_2); tpnt->density = 0; tpnt->do_auto_lock = ST_AUTO_LOCK; @@ -4358,7 +4354,7 @@ static int st_probe(struct device *dev) tpnt->nbr_partitions = 0; blk_queue_rq_timeout(tpnt->device->request_queue, ST_TIMEOUT); tpnt->long_timeout = ST_LONG_TIMEOUT; - tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma; + tpnt->try_dio = try_direct_io; for (i = 0; i < ST_NBR_MODES; i++) { STm = &(tpnt->modes[i]); diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index 95d2e7a7988d..9d3c38bb0794 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h @@ -35,7 +35,6 @@ struct st_request { /* The tape buffer descriptor. */ struct st_buffer { - unsigned char dma; /* DMA-able buffer */ unsigned char cleared; /* internal buffer cleared after open? */ unsigned short do_dio; /* direct i/o set up? */ int buffer_size; @@ -133,7 +132,6 @@ struct scsi_tape { unsigned char two_fm; unsigned char fast_mteom; unsigned char immediate; - unsigned char restr_dma; unsigned char scsi2_logical; unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */ unsigned char cln_mode; /* 0 = none, otherwise sense byte nbr */ -- cgit v1.2.3 From ce288e0535688cc3475a3c3d4d96624514c3550c Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:29:59 +0200 Subject: block: remove BLK_BOUNCE_ISA support Remove the BLK_BOUNCE_ISA support now that all users are gone. Signed-off-by: Christoph Hellwig Acked-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Link: https://lore.kernel.org/r/20210331073001.46776-7-hch@lst.de Signed-off-by: Jens Axboe --- drivers/ata/libata-scsi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 48b8934970f3..fd8b6febbf70 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1043,8 +1043,7 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev) blk_queue_max_segments(q, queue_max_segments(q) - 1); sdev->dma_drain_len = ATAPI_MAX_DRAIN; - sdev->dma_drain_buf = kmalloc(sdev->dma_drain_len, - q->bounce_gfp | GFP_KERNEL); + sdev->dma_drain_buf = kmalloc(sdev->dma_drain_len, GFP_NOIO); if (!sdev->dma_drain_buf) { ata_dev_err(dev, "drain buffer allocation failed\n"); return -ENOMEM; -- cgit v1.2.3 From 393bb12e00580aaa23356504eed38d8f5571153a Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 Mar 2021 09:30:01 +0200 Subject: block: stop calling blk_queue_bounce for passthrough requests Instead of overloading the passthrough fast path with the deprecated block layer bounce buffering let the users that combine an old undermaintained driver with a highmem system pay the price by always falling back to copies in that case. Signed-off-by: Christoph Hellwig Acked-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Link: https://lore.kernel.org/r/20210331073001.46776-9-hch@lst.de Signed-off-by: Jens Axboe --- drivers/nvme/host/lightnvm.c | 2 +- drivers/target/target_core_pscsi.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c index b705988629f2..f6ca2fbb711e 100644 --- a/drivers/nvme/host/lightnvm.c +++ b/drivers/nvme/host/lightnvm.c @@ -660,7 +660,7 @@ static struct request *nvme_nvm_alloc_request(struct request_queue *q, rq->cmd_flags &= ~REQ_FAILFAST_DRIVER; if (rqd->bio) - blk_rq_append_bio(rq, &rqd->bio); + blk_rq_append_bio(rq, rqd->bio); else rq->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, IOPRIO_NORM); diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 3cbc074992bc..7df4a9c9c7ff 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -911,7 +911,7 @@ new_bio: " %d i: %d bio: %p, allocating another" " bio\n", bio->bi_vcnt, i, bio); - rc = blk_rq_append_bio(req, &bio); + rc = blk_rq_append_bio(req, bio); if (rc) { pr_err("pSCSI: failed to append bio\n"); goto fail; @@ -930,7 +930,7 @@ new_bio: } if (bio) { - rc = blk_rq_append_bio(req, &bio); + rc = blk_rq_append_bio(req, bio); if (rc) { pr_err("pSCSI: failed to append bio\n"); goto fail; -- cgit v1.2.3 From b896fa85e0ee4f09ba4be48a3f405fc82c38afb4 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 6 Apr 2021 08:22:52 +0200 Subject: dasd: use bdev_disk_changed instead of blk_drop_partitions Use the more general interface - the behavior is the same except that now a change uevent is sent, which is the right thing to do when the device becomes unusable. Signed-off-by: Christoph Hellwig Acked-by: Stefan Haberland Link: https://lore.kernel.org/r/20210406062303.811835-2-hch@lst.de Signed-off-by: Jens Axboe --- drivers/s390/block/dasd_genhd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index a9698fba9b76..8d6587ec73e2 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -146,12 +146,11 @@ void dasd_destroy_partitions(struct dasd_block *block) block->bdev = NULL; mutex_lock(&bdev->bd_mutex); - blk_drop_partitions(bdev); + bdev_disk_changed(bdev, true); mutex_unlock(&bdev->bd_mutex); /* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */ blkdev_put(bdev, FMODE_READ); - set_capacity(block->gdp, 0); } int dasd_gendisk_init(void) -- cgit v1.2.3 From 5f03414d4098b5718f1a5e99b43b9d9cb6f3612a Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Mon, 12 Apr 2021 15:46:58 +0200 Subject: block: move bio_list_copy_data to pktcdvd bio_list_copy_data is only used by pktcdvd, so move it there. Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20210412134658.2623190-2-hch@lst.de Reviewed-by: Johannes Thumshirn Signed-off-by: Jens Axboe --- drivers/block/pktcdvd.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'drivers') diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index fc4b0f1aa86d..bd3556585122 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -1199,6 +1199,42 @@ try_next_bio: return 1; } +/** + * bio_list_copy_data - copy contents of data buffers from one chain of bios to + * another + * @src: source bio list + * @dst: destination bio list + * + * Stops when it reaches the end of either the @src list or @dst list - that is, + * copies min(src->bi_size, dst->bi_size) bytes (or the equivalent for lists of + * bios). + */ +static void bio_list_copy_data(struct bio *dst, struct bio *src) +{ + struct bvec_iter src_iter = src->bi_iter; + struct bvec_iter dst_iter = dst->bi_iter; + + while (1) { + if (!src_iter.bi_size) { + src = src->bi_next; + if (!src) + break; + + src_iter = src->bi_iter; + } + + if (!dst_iter.bi_size) { + dst = dst->bi_next; + if (!dst) + break; + + dst_iter = dst->bi_iter; + } + + bio_copy_data_iter(dst, &dst_iter, src, &src_iter); + } +} + /* * Assemble a bio to write one packet and queue the bio for processing * by the underlying block device. -- cgit v1.2.3