]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: BusLogic: Remove bus_to_virt()
authorArnd Bergmann <arnd@arndb.de>
Fri, 24 Jun 2022 15:52:24 +0000 (17:52 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 28 Jun 2022 02:52:05 +0000 (22:52 -0400)
The BusLogic driver is the last remaining driver that relies on the
deprecated bus_to_virt() function, which in turn only works on a few
architectures, and is incompatible with both swiotlb and iommu support.

Before commit 2b6c0513f94e ("[SCSI] BusLogic: Port driver to 64-bit."), the
driver had a dependency on x86-32, presumably because of this
problem. However, the change introduced another bug that made it still
impossible to use the driver on any 64-bit machine.

This was in turn fixed in commit b4a13fbc90f0 ("scsi: BusLogic: Fix 64-bit
system enumeration error for Buslogic"), 8 years later, which shows that
there are not a lot of users.

Maciej is still using the driver on 32-bit hardware, and Khalid mentioned
that the driver works with the device emulation used in VirtualBox and
VMware. Both of those only emulate it for Windows 2000 and older operating
systems that did not ship with the better LSI logic driver.

Do a minimum fix that searches through the list of descriptors to find one
that matches the bus address. This is clearly as inefficient as was
indicated in the code comment about the lack of a bus_to_virt()
replacement. A better fix would likely involve changing out the entire
descriptor allocation for a simpler one, but that would be much more
invasive.

Link: https://lore.kernel.org/r/20220624155226.2889613-2-arnd@kernel.org
Cc: Maciej W. Rozycki <macro@orcam.me.uk>
Cc: Matt Wang <wwentao@vmware.com>
Tested-by: Khalid Aziz <khalid@gonehiking.org>
Reviewed-by: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Acked-by: Khalid Aziz <khalid@gonehiking.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/BusLogic.c
drivers/scsi/Kconfig

index a897c8f914cf331f4efe72273d355ebb3803c6d0..f2abffce26599cf40f5fb9a39c788f5888e26c64 100644 (file)
@@ -2515,12 +2515,26 @@ static int blogic_resultcode(struct blogic_adapter *adapter,
        return (hoststatus << 16) | tgt_status;
 }
 
+/*
+ * turn the dma address from an inbox into a ccb pointer
+ * This is rather inefficient.
+ */
+static struct blogic_ccb *
+blogic_inbox_to_ccb(struct blogic_adapter *adapter, struct blogic_inbox *inbox)
+{
+       struct blogic_ccb *ccb;
+
+       for (ccb = adapter->all_ccbs; ccb; ccb = ccb->next_all)
+               if (inbox->ccb == ccb->dma_handle)
+                       break;
+
+       return ccb;
+}
 
 /*
   blogic_scan_inbox scans the Incoming Mailboxes saving any
   Incoming Mailbox entries for completion processing.
 */
-
 static void blogic_scan_inbox(struct blogic_adapter *adapter)
 {
        /*
@@ -2540,17 +2554,14 @@ static void blogic_scan_inbox(struct blogic_adapter *adapter)
        enum blogic_cmplt_code comp_code;
 
        while ((comp_code = next_inbox->comp_code) != BLOGIC_INBOX_FREE) {
-               /*
-                  We are only allowed to do this because we limit our
-                  architectures we run on to machines where bus_to_virt(
-                  actually works.  There *needs* to be a dma_addr_to_virt()
-                  in the new PCI DMA mapping interface to replace
-                  bus_to_virt() or else this code is going to become very
-                  innefficient.
-                */
-               struct blogic_ccb *ccb =
-                       (struct blogic_ccb *) bus_to_virt(next_inbox->ccb);
-               if (comp_code != BLOGIC_CMD_NOTFOUND) {
+               struct blogic_ccb *ccb = blogic_inbox_to_ccb(adapter, next_inbox);
+               if (!ccb) {
+                       /*
+                        * This should never happen, unless the CCB list is
+                        * corrupted in memory.
+                        */
+                       blogic_warn("Could not find CCB for dma address %x\n", adapter, next_inbox->ccb);
+               } else if (comp_code != BLOGIC_CMD_NOTFOUND) {
                        if (ccb->status == BLOGIC_CCB_ACTIVE ||
                                        ccb->status == BLOGIC_CCB_RESET) {
                                /*
index a9fe5152addd3a6703cee5b480a4d698d1ebb565..64a35d160e2d757b8b31ae6b76e432f41b4a9304 100644 (file)
@@ -513,7 +513,7 @@ config SCSI_HPTIOP
 
 config SCSI_BUSLOGIC
        tristate "BusLogic SCSI support"
-       depends on PCI && SCSI && VIRT_TO_BUS
+       depends on PCI && SCSI
        help
          This is support for BusLogic MultiMaster and FlashPoint SCSI Host
          Adapters. Consult the SCSI-HOWTO, available from