• Home
  • Raw
  • Download

Lines Matching +full:host +full:- +full:command

1 // SPDX-License-Identifier: GPL-2.0-only
5 Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
7 Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
13 Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
37 #include <linux/dma-mapping.h>
54 #define FAILURE (-1)
61 Options specifications provided via the Linux Kernel Command Line or via
70 BusLogic Driver Options specifications provided via the Linux Kernel Command
90 all BusLogic Host Adapters.
98 all BusLogic Host Adapters.
114 to be checked for potential BusLogic Host Adapters. It is initialized by
124 call to blogic_cmd failed. It is only non-NULL when blogic_cmd
138 blogic_announce("Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>\n", adapter); in blogic_announce_drvr()
143 blogic_drvr_info returns the Host Adapter Name to identify this SCSI
144 Driver and Host Adapter.
147 static const char *blogic_drvr_info(struct Scsi_Host *host) in blogic_drvr_info() argument
150 (struct blogic_adapter *) host->hostdata; in blogic_drvr_info()
151 return adapter->full_model; in blogic_drvr_info()
155 blogic_init_ccbs initializes a group of Command Control Blocks (CCBs)
156 for Host Adapter from the blk_size bytes located at blk_pointer. The newly
157 created CCBs are added to Host Adapter's free list.
166 ccb->allocgrp_head = blkp; in blogic_init_ccbs()
167 ccb->allocgrp_size = blk_size; in blogic_init_ccbs()
168 while ((blk_size -= sizeof(struct blogic_ccb)) >= 0) { in blogic_init_ccbs()
169 ccb->status = BLOGIC_CCB_FREE; in blogic_init_ccbs()
170 ccb->adapter = adapter; in blogic_init_ccbs()
171 ccb->dma_handle = (u32) blkp + offset; in blogic_init_ccbs()
173 ccb->callback = blogic_qcompleted_ccb; in blogic_init_ccbs()
174 ccb->base_addr = adapter->fpinfo.base_addr; in blogic_init_ccbs()
176 ccb->next = adapter->free_ccbs; in blogic_init_ccbs()
177 ccb->next_all = adapter->all_ccbs; in blogic_init_ccbs()
178 adapter->free_ccbs = ccb; in blogic_init_ccbs()
179 adapter->all_ccbs = ccb; in blogic_init_ccbs()
180 adapter->alloc_ccbs++; in blogic_init_ccbs()
188 blogic_create_initccbs allocates the initial CCBs for Host Adapter.
197 while (adapter->alloc_ccbs < adapter->initccbs) { in blogic_create_initccbs()
198 blk_pointer = dma_alloc_coherent(&adapter->pci_device->dev, in blogic_create_initccbs()
201 blogic_err("UNABLE TO ALLOCATE CCB GROUP - DETACHING\n", in blogic_create_initccbs()
212 blogic_destroy_ccbs deallocates the CCBs for Host Adapter.
217 struct blogic_ccb *next_ccb = adapter->all_ccbs, *ccb, *lastccb = NULL; in blogic_destroy_ccbs()
218 adapter->all_ccbs = NULL; in blogic_destroy_ccbs()
219 adapter->free_ccbs = NULL; in blogic_destroy_ccbs()
221 next_ccb = ccb->next_all; in blogic_destroy_ccbs()
222 if (ccb->allocgrp_head) { in blogic_destroy_ccbs()
224 dma_free_coherent(&adapter->pci_device->dev, in blogic_destroy_ccbs()
225 lastccb->allocgrp_size, lastccb, in blogic_destroy_ccbs()
226 lastccb->allocgrp_head); in blogic_destroy_ccbs()
231 dma_free_coherent(&adapter->pci_device->dev, in blogic_destroy_ccbs()
232 lastccb->allocgrp_size, lastccb, in blogic_destroy_ccbs()
233 lastccb->allocgrp_head); in blogic_destroy_ccbs()
238 blogic_create_addlccbs allocates Additional CCBs for Host Adapter. If
241 multiple host adapters share the same IRQ Channel.
248 int prev_alloc = adapter->alloc_ccbs; in blogic_create_addlccbs()
253 while (adapter->alloc_ccbs - prev_alloc < addl_ccbs) { in blogic_create_addlccbs()
254 blk_pointer = dma_alloc_coherent(&adapter->pci_device->dev, in blogic_create_addlccbs()
260 if (adapter->alloc_ccbs > prev_alloc) { in blogic_create_addlccbs()
262 …ated %d additional CCBs (total now %d)\n", adapter, adapter->alloc_ccbs - prev_alloc, adapter->all… in blogic_create_addlccbs()
266 if (adapter->drvr_qdepth > adapter->alloc_ccbs - adapter->tgt_count) { in blogic_create_addlccbs()
267 adapter->drvr_qdepth = adapter->alloc_ccbs - adapter->tgt_count; in blogic_create_addlccbs()
268 adapter->scsi_host->can_queue = adapter->drvr_qdepth; in blogic_create_addlccbs()
273 blogic_alloc_ccb allocates a CCB from Host Adapter's free list,
274 allocating more memory from the Kernel if necessary. The Host Adapter's
282 ccb = adapter->free_ccbs; in blogic_alloc_ccb()
284 ccb->serial = ++serial; in blogic_alloc_ccb()
285 adapter->free_ccbs = ccb->next; in blogic_alloc_ccb()
286 ccb->next = NULL; in blogic_alloc_ccb()
287 if (adapter->free_ccbs == NULL) in blogic_alloc_ccb()
288 blogic_create_addlccbs(adapter, adapter->inc_ccbs, in blogic_alloc_ccb()
292 blogic_create_addlccbs(adapter, adapter->inc_ccbs, true); in blogic_alloc_ccb()
293 ccb = adapter->free_ccbs; in blogic_alloc_ccb()
296 ccb->serial = ++serial; in blogic_alloc_ccb()
297 adapter->free_ccbs = ccb->next; in blogic_alloc_ccb()
298 ccb->next = NULL; in blogic_alloc_ccb()
304 blogic_dealloc_ccb deallocates a CCB, returning it to the Host Adapter's
305 free list. The Host Adapter's Lock should already have been acquired by the
311 struct blogic_adapter *adapter = ccb->adapter; in blogic_dealloc_ccb()
313 if (ccb->command != NULL) in blogic_dealloc_ccb()
314 scsi_dma_unmap(ccb->command); in blogic_dealloc_ccb()
316 dma_unmap_single(&adapter->pci_device->dev, ccb->sensedata, in blogic_dealloc_ccb()
317 ccb->sense_datalen, DMA_FROM_DEVICE); in blogic_dealloc_ccb()
319 ccb->command = NULL; in blogic_dealloc_ccb()
320 ccb->status = BLOGIC_CCB_FREE; in blogic_dealloc_ccb()
321 ccb->next = adapter->free_ccbs; in blogic_dealloc_ccb()
322 adapter->free_ccbs = ccb; in blogic_dealloc_ccb()
327 blogic_cmd sends the command opcode to adapter, optionally
333 the Host Adapter (including any discarded data); on failure, it returns
334 -1 if the command was invalid, or -2 if a timeout occurred.
336 blogic_cmd is called exclusively during host adapter detection and
338 access to the Host Adapter hardware is assumed. Once the host adapter and
339 driver are initialized, the only Host Adapter command that is issued is the
340 single byte Execute Mailbox Command operation code, which does not require
341 waiting for the Host Adapter Ready bit to be set in the Status Register.
361 must be disabled while issuing host adapter commands since a in blogic_cmd()
362 Command Complete interrupt could occur if the IRQ Channel was in blogic_cmd()
363 previously enabled by another BusLogic Host Adapter or another in blogic_cmd()
366 if (!adapter->irq_acquired) in blogic_cmd()
369 Wait for the Host Adapter Ready bit to be set and the in blogic_cmd()
370 Command/Parameter Register Busy bit to be reset in the Status in blogic_cmd()
374 while (--timeout >= 0) { in blogic_cmd()
382 "Timeout waiting for Host Adapter Ready"; in blogic_cmd()
383 result = -2; in blogic_cmd()
387 Write the opcode to the Command/Parameter Register. in blogic_cmd()
389 adapter->adapter_cmd_complete = false; in blogic_cmd()
395 while (paramlen > 0 && --timeout >= 0) { in blogic_cmd()
397 Wait 100 microseconds to give the Host Adapter enough in blogic_cmd()
399 Command/Parameter Register was valid or not. If the in blogic_cmd()
400 Command Complete bit is set in the Interrupt Register, in blogic_cmd()
401 then the Command Invalid bit in the Status Register will in blogic_cmd()
403 and the command has completed, or set if the Operation in blogic_cmd()
407 back from the Host Adapter. Otherwise, wait for the in blogic_cmd()
408 Command/Parameter Register Busy bit in the Status in blogic_cmd()
416 if (adapter->adapter_cmd_complete) in blogic_cmd()
423 paramlen--; in blogic_cmd()
428 result = -2; in blogic_cmd()
432 The Modify I/O Address command does not cause a Command Complete in blogic_cmd()
440 result = -1; in blogic_cmd()
449 Select an appropriate timeout value for awaiting command completion. in blogic_cmd()
464 Receive any Reply Bytes, waiting for either the Command in blogic_cmd()
466 Interrupt Handler to set the Host Adapter Command Completed in blogic_cmd()
467 bit in the Host Adapter structure. in blogic_cmd()
469 while (--timeout >= 0) { in blogic_cmd()
474 if (adapter->adapter_cmd_complete) in blogic_cmd()
489 "Timeout waiting for Command Complete"; in blogic_cmd()
490 result = -2; in blogic_cmd()
494 Clear any pending Command Complete Interrupt. in blogic_cmd()
513 Process Command Invalid conditions. in blogic_cmd()
517 Some early BusLogic Host Adapters may not recover in blogic_cmd()
518 properly from a Command Invalid condition, so if this in blogic_cmd()
520 Host Adapter. Potentially invalid commands are never in blogic_cmd()
522 so there should be no Host Adapter state lost by a in blogic_cmd()
523 Soft Reset in response to a Command Invalid condition. in blogic_cmd()
537 blogic_cmd_failure_reason = "Command Invalid"; in blogic_cmd()
538 result = -1; in blogic_cmd()
546 result = -1; in blogic_cmd()
550 Indicate the command completed successfully. in blogic_cmd()
558 if (!adapter->irq_acquired) in blogic_cmd()
567 Host Adapters.
576 probeinfo->adapter_type = BLOGIC_MULTIMASTER; in blogic_add_probeaddr_isa()
577 probeinfo->adapter_bus_type = BLOGIC_ISA_BUS; in blogic_add_probeaddr_isa()
578 probeinfo->io_addr = io_addr; in blogic_add_probeaddr_isa()
579 probeinfo->pci_device = NULL; in blogic_add_probeaddr_isa()
585 Bus Probe Information to be checked for potential BusLogic SCSI Host Adapters
626 int last_exchange = probeinfo_cnt - 1, bound, j; in blogic_sort_probeinfo()
636 if (probeinfo1->bus > probeinfo2->bus || in blogic_sort_probeinfo()
637 (probeinfo1->bus == probeinfo2->bus && in blogic_sort_probeinfo()
638 (probeinfo1->dev > probeinfo2->dev))) { in blogic_sort_probeinfo()
657 SCSI Host Adapters by interrogating the PCI Configuration Space on PCI
659 I/O Addresses. It returns the number of PCI MultiMaster Host Adapters found.
679 Iterate over the MultiMaster PCI Host Adapters. For each in blogic_init_mm_probeinfo()
680 enumerated host adapter, determine whether its ISA Compatible in blogic_init_mm_probeinfo()
682 Primary I/O Address. A host adapter that is assigned the in blogic_init_mm_probeinfo()
684 The MultiMaster BIOS will first recognize a host adapter at in blogic_init_mm_probeinfo()
685 the Primary I/O Address, then any other PCI host adapters, in blogic_init_mm_probeinfo()
686 and finally any host adapters located at the remaining in blogic_init_mm_probeinfo()
687 standard ISA I/O Addresses. When a PCI host adapter is found in blogic_init_mm_probeinfo()
688 with its ISA Compatible I/O Port enabled, a command is issued in blogic_init_mm_probeinfo()
692 pr_probeinfo->io_addr = 0; in blogic_init_mm_probeinfo()
710 if (dma_set_mask(&pci_device->dev, DMA_BIT_MASK(32))) in blogic_init_mm_probeinfo()
713 bus = pci_device->bus->number; in blogic_init_mm_probeinfo()
714 device = pci_device->devfn >> 3; in blogic_init_mm_probeinfo()
715 irq_ch = pci_device->irq; in blogic_init_mm_probeinfo()
720 …blogic_err("BusLogic: Base Address0 0x%lX not I/O for MultiMaster Host Adapter\n", NULL, base_addr… in blogic_init_mm_probeinfo()
725 …blogic_err("BusLogic: Base Address1 0x%lX not Memory for MultiMaster Host Adapter\n", NULL, base_a… in blogic_init_mm_probeinfo()
730 blogic_err("BusLogic: IRQ Channel %d invalid for MultiMaster Host Adapter\n", NULL, irq_ch); in blogic_init_mm_probeinfo()
735 blogic_notice("BusLogic: PCI MultiMaster Host Adapter detected at\n", NULL); in blogic_init_mm_probeinfo()
739 Issue the Inquire PCI Host Adapter Information command to determine in blogic_init_mm_probeinfo()
744 host_adapter->io_addr = io_addr; in blogic_init_mm_probeinfo()
754 Issue the Modify I/O Address command to disable the in blogic_init_mm_probeinfo()
755 ISA Compatible I/O Port. On PCI Host Adapters, the in blogic_init_mm_probeinfo()
756 Modify I/O Address command allows modification of the in blogic_init_mm_probeinfo()
757 ISA compatible I/O Address that the Host Adapter in blogic_init_mm_probeinfo()
765 For the first MultiMaster Host Adapter enumerated, in blogic_init_mm_probeinfo()
766 issue the Fetch Host Adapter Local RAM command to read in blogic_init_mm_probeinfo()
769 Issue the Inquire Board ID command since this option is in blogic_init_mm_probeinfo()
770 only valid for the BT-948/958/958D. in blogic_init_mm_probeinfo()
791 Determine whether this MultiMaster Host Adapter has its in blogic_init_mm_probeinfo()
794 MultiMaster Host Adapter and must be recognized first. in blogic_init_mm_probeinfo()
796 after any Primary MultiMaster Host Adapter is probed. in blogic_init_mm_probeinfo()
799 pr_probeinfo->adapter_type = BLOGIC_MULTIMASTER; in blogic_init_mm_probeinfo()
800 pr_probeinfo->adapter_bus_type = BLOGIC_PCI_BUS; in blogic_init_mm_probeinfo()
801 pr_probeinfo->io_addr = io_addr; in blogic_init_mm_probeinfo()
802 pr_probeinfo->pci_addr = pci_addr; in blogic_init_mm_probeinfo()
803 pr_probeinfo->bus = bus; in blogic_init_mm_probeinfo()
804 pr_probeinfo->dev = device; in blogic_init_mm_probeinfo()
805 pr_probeinfo->irq_ch = irq_ch; in blogic_init_mm_probeinfo()
806 pr_probeinfo->pci_device = pci_dev_get(pci_device); in blogic_init_mm_probeinfo()
811 probeinfo->adapter_type = BLOGIC_MULTIMASTER; in blogic_init_mm_probeinfo()
812 probeinfo->adapter_bus_type = BLOGIC_PCI_BUS; in blogic_init_mm_probeinfo()
813 probeinfo->io_addr = io_addr; in blogic_init_mm_probeinfo()
814 probeinfo->pci_addr = pci_addr; in blogic_init_mm_probeinfo()
815 probeinfo->bus = bus; in blogic_init_mm_probeinfo()
816 probeinfo->dev = device; in blogic_init_mm_probeinfo()
817 probeinfo->irq_ch = irq_ch; in blogic_init_mm_probeinfo()
818 probeinfo->pci_device = pci_dev_get(pci_device); in blogic_init_mm_probeinfo()
822 blogic_warn("BusLogic: Too many Host Adapters detected\n", NULL); in blogic_init_mm_probeinfo()
826 option is ON for the first enumerated MultiMaster Host Adapter, in blogic_init_mm_probeinfo()
827 and if that host adapter is a BT-948/958/958D, then the in blogic_init_mm_probeinfo()
828 MultiMaster BIOS will recognize MultiMaster Host Adapters in in blogic_init_mm_probeinfo()
832 MultiMaster Host Adapters in the order they are enumerated by in blogic_init_mm_probeinfo()
839 If no PCI MultiMaster Host Adapter is assigned the Primary in blogic_init_mm_probeinfo()
841 explicitly before any PCI host adapters are probed. in blogic_init_mm_probeinfo()
844 if (pr_probeinfo->io_addr == 0 && in blogic_init_mm_probeinfo()
847 pr_probeinfo->adapter_type = BLOGIC_MULTIMASTER; in blogic_init_mm_probeinfo()
848 pr_probeinfo->adapter_bus_type = BLOGIC_ISA_BUS; in blogic_init_mm_probeinfo()
849 pr_probeinfo->io_addr = 0x330; in blogic_init_mm_probeinfo()
878 Iterate over the older non-compliant MultiMaster PCI Host Adapters, in blogic_init_mm_probeinfo()
893 if (dma_set_mask(&pci_device->dev, DMA_BIT_MASK(32))) in blogic_init_mm_probeinfo()
896 bus = pci_device->bus->number; in blogic_init_mm_probeinfo()
897 device = pci_device->devfn >> 3; in blogic_init_mm_probeinfo()
898 irq_ch = pci_device->irq; in blogic_init_mm_probeinfo()
906 if (probeinfo->io_addr == io_addr && in blogic_init_mm_probeinfo()
907 probeinfo->adapter_type == BLOGIC_MULTIMASTER) { in blogic_init_mm_probeinfo()
908 probeinfo->adapter_bus_type = BLOGIC_PCI_BUS; in blogic_init_mm_probeinfo()
909 probeinfo->pci_addr = 0; in blogic_init_mm_probeinfo()
910 probeinfo->bus = bus; in blogic_init_mm_probeinfo()
911 probeinfo->dev = device; in blogic_init_mm_probeinfo()
912 probeinfo->irq_ch = irq_ch; in blogic_init_mm_probeinfo()
913 probeinfo->pci_device = pci_dev_get(pci_device); in blogic_init_mm_probeinfo()
925 Host Adapters by interrogating the PCI Configuration Space. It returns the
926 number of FlashPoint Host Adapters found.
934 Interrogate PCI Configuration Space for any FlashPoint Host Adapters. in blogic_init_fp_probeinfo()
950 if (dma_set_mask(&pci_device->dev, DMA_BIT_MASK(32))) in blogic_init_fp_probeinfo()
953 bus = pci_device->bus->number; in blogic_init_fp_probeinfo()
954 device = pci_device->devfn >> 3; in blogic_init_fp_probeinfo()
955 irq_ch = pci_device->irq; in blogic_init_fp_probeinfo()
960 …blogic_err("BusLogic: Base Address0 0x%lX not I/O for FlashPoint Host Adapter\n", NULL, base_addr0… in blogic_init_fp_probeinfo()
965 …blogic_err("BusLogic: Base Address1 0x%lX not Memory for FlashPoint Host Adapter\n", NULL, base_ad… in blogic_init_fp_probeinfo()
970 blogic_err("BusLogic: IRQ Channel %d invalid for FlashPoint Host Adapter\n", NULL, irq_ch); in blogic_init_fp_probeinfo()
975 blogic_notice("BusLogic: FlashPoint Host Adapter detected at\n", NULL); in blogic_init_fp_probeinfo()
981 probeinfo->adapter_type = BLOGIC_FLASHPOINT; in blogic_init_fp_probeinfo()
982 probeinfo->adapter_bus_type = BLOGIC_PCI_BUS; in blogic_init_fp_probeinfo()
983 probeinfo->io_addr = io_addr; in blogic_init_fp_probeinfo()
984 probeinfo->pci_addr = pci_addr; in blogic_init_fp_probeinfo()
985 probeinfo->bus = bus; in blogic_init_fp_probeinfo()
986 probeinfo->dev = device; in blogic_init_fp_probeinfo()
987 probeinfo->irq_ch = irq_ch; in blogic_init_fp_probeinfo()
988 probeinfo->pci_device = pci_dev_get(pci_device); in blogic_init_fp_probeinfo()
991 blogic_warn("BusLogic: Too many Host Adapters detected\n", NULL); in blogic_init_fp_probeinfo()
993 …blogic_err("BusLogic: FlashPoint Host Adapter detected at PCI Bus %d Device %d\n", NULL, bus, devi… in blogic_init_fp_probeinfo()
999 The FlashPoint BIOS will scan for FlashPoint Host Adapters in the order of in blogic_init_fp_probeinfo()
1010 Probe Information to be checked for potential BusLogic SCSI Host Adapters by
1013 FlashPoint and PCI MultiMaster Host Adapters are present, this driver will
1014 probe for FlashPoint Host Adapters first unless the BIOS primary disk is
1015 controlled by the first PCI MultiMaster Host Adapter, in which case
1016 MultiMaster Host Adapters will be probed first. The BusLogic Driver Options
1025 FlashPoint Host Adapters; otherwise, default to the standard in blogic_init_probeinfo_list()
1045 while (probeinfo->adapter_bus_type != in blogic_init_probeinfo_list()
1048 myadapter->io_addr = probeinfo->io_addr; in blogic_init_probeinfo_list()
1060 PCI MultiMaster Host Adapter, then reverse in blogic_init_probeinfo_list()
1061 the probe order so that MultiMaster Host in blogic_init_probeinfo_list()
1062 Adapters are probed before FlashPoint Host in blogic_init_probeinfo_list()
1067 int mmcount = blogic_probeinfo_count - fpcount; in blogic_init_probeinfo_list()
1100 if (adapter->adapter_bus_type == BLOGIC_PCI_BUS) { in blogic_failure()
1101 blogic_err("While configuring BusLogic PCI Host Adapter at\n", in blogic_failure()
1103 …Address 0x%lX PCI Address 0x%lX:\n", adapter, adapter->bus, adapter->dev, adapter->io_addr, adapte… in blogic_failure()
1105 …blogic_err("While configuring BusLogic Host Adapter at I/O Address 0x%lX:\n", adapter, adapter->io… in blogic_failure()
1106 blogic_err("%s FAILED - DETACHING\n", adapter, msg); in blogic_failure()
1108 blogic_err("ADDITIONAL FAILURE INFO - %s\n", adapter, in blogic_failure()
1115 blogic_probe probes for a BusLogic Host Adapter.
1124 FlashPoint Host Adapters are Probed by the FlashPoint SCCB Manager. in blogic_probe()
1127 struct fpoint_info *fpinfo = &adapter->fpinfo; in blogic_probe()
1128 fpinfo->base_addr = (u32) adapter->io_addr; in blogic_probe()
1129 fpinfo->irq_ch = adapter->irq_ch; in blogic_probe()
1130 fpinfo->present = false; in blogic_probe()
1132 fpinfo->present)) { in blogic_probe()
1133 …blogic_err("BusLogic: FlashPoint Host Adapter detected at PCI Bus %d Device %d\n", adapter, adapte… in blogic_probe()
1134 … Address 0x%lX PCI Address 0x%lX, but FlashPoint\n", adapter, adapter->io_addr, adapter->pci_addr); in blogic_probe()
1139 blogic_notice("BusLogic_Probe(0x%lX): FlashPoint Found\n", adapter, adapter->io_addr); in blogic_probe()
1141 Indicate the Host Adapter Probe completed successfully. in blogic_probe()
1148 BusLogic Host Adapter. A nonexistent I/O port will return 0xFF, in which in blogic_probe()
1149 case there is definitely no BusLogic Host Adapter at this base I/O Address. in blogic_probe()
1150 The test here is a subset of that used by the BusLogic Host Adapter BIOS. in blogic_probe()
1156 …x%lX): Status 0x%02X, Interrupt 0x%02X, Geometry 0x%02X\n", adapter, adapter->io_addr, statusreg.a… in blogic_probe()
1163 an I/O port that responded. Adaptec Host Adapters do not in blogic_probe()
1168 later when the Inquire Extended Setup Information command is in blogic_probe()
1169 issued in blogic_checkadapter. The AMI FastDisk Host Adapter in blogic_probe()
1171 earlier BusLogic Host Adapters, including the undocumented in blogic_probe()
1180 Indicate the Host Adapter Probe completed successfully. in blogic_probe()
1187 blogic_hwreset issues a Hardware Reset to the Host Adapter
1188 and waits for Host Adapter Diagnostics to complete. If hard_reset is true, a
1190 Soft Reset is performed which only resets the Host Adapter without forcing a
1199 FlashPoint Host Adapters are Hard Reset by the FlashPoint in blogic_hwreset()
1203 struct fpoint_info *fpinfo = &adapter->fpinfo; in blogic_hwreset()
1204 fpinfo->softreset = !hard_reset; in blogic_hwreset()
1205 fpinfo->report_underrun = true; in blogic_hwreset()
1206 adapter->cardhandle = in blogic_hwreset()
1208 if (adapter->cardhandle == (void *)FPOINT_BADCARD_HANDLE) in blogic_hwreset()
1211 Indicate the Host Adapter Hard Reset completed successfully. in blogic_hwreset()
1216 Issue a Hard Reset or Soft Reset Command to the Host Adapter. in blogic_hwreset()
1217 The Host Adapter should respond by setting Diagnostic Active in in blogic_hwreset()
1228 while (--timeout >= 0) { in blogic_hwreset()
1235 …_HardwareReset(0x%lX): Diagnostic Active, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.a… in blogic_hwreset()
1248 while (--timeout >= 0) { in blogic_hwreset()
1255 …rdwareReset(0x%lX): Diagnostic Completed, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.a… in blogic_hwreset()
1259 Wait until at least one of the Diagnostic Failure, Host Adapter in blogic_hwreset()
1263 while (--timeout >= 0) { in blogic_hwreset()
1271 …blogic_notice("BusLogic_HardwareReset(0x%lX): Host Adapter Ready, Status 0x%02X\n", adapter, adapt… in blogic_hwreset()
1275 If Diagnostic Failure is set or Host Adapter Ready is reset, in blogic_hwreset()
1276 then an error occurred during the Host Adapter diagnostics. in blogic_hwreset()
1283 blogic_err("HOST ADAPTER STATUS REGISTER = %02X\n", adapter, in blogic_hwreset()
1286 blogic_err("HOST ADAPTER ERROR CODE = %d\n", adapter, in blogic_hwreset()
1291 Indicate the Host Adapter Hard Reset completed successfully. in blogic_hwreset()
1299 Host Adapter.
1308 FlashPoint Host Adapters do not require this protection. in blogic_checkadapter()
1313 Issue the Inquire Extended Setup Information command. Only genuine in blogic_checkadapter()
1314 BusLogic Host Adapters and true clones support this command. in blogic_checkadapter()
1315 Adaptec 1542C series Host Adapters that respond to the Geometry in blogic_checkadapter()
1316 Register I/O port will fail this command. in blogic_checkadapter()
1328 adapter->io_addr, in blogic_checkadapter()
1336 from Host Adapter and initializes the Host Adapter structure.
1356 Configuration Information for FlashPoint Host Adapters is in blogic_rdconfig()
1359 Host Adapter structure from the fpoint_info structure. in blogic_rdconfig()
1362 struct fpoint_info *fpinfo = &adapter->fpinfo; in blogic_rdconfig()
1363 tgt = adapter->model; in blogic_rdconfig()
1366 *tgt++ = '-'; in blogic_rdconfig()
1367 for (i = 0; i < sizeof(fpinfo->model); i++) in blogic_rdconfig()
1368 *tgt++ = fpinfo->model[i]; in blogic_rdconfig()
1370 strcpy(adapter->fw_ver, FLASHPOINT_FW_VER); in blogic_rdconfig()
1371 adapter->scsi_id = fpinfo->scsi_id; in blogic_rdconfig()
1372 adapter->ext_trans_enable = fpinfo->ext_trans_enable; in blogic_rdconfig()
1373 adapter->parity = fpinfo->parity; in blogic_rdconfig()
1374 adapter->reset_enabled = !fpinfo->softreset; in blogic_rdconfig()
1375 adapter->level_int = true; in blogic_rdconfig()
1376 adapter->wide = fpinfo->wide; in blogic_rdconfig()
1377 adapter->differential = false; in blogic_rdconfig()
1378 adapter->scam = true; in blogic_rdconfig()
1379 adapter->ultra = true; in blogic_rdconfig()
1380 adapter->ext_lun = true; in blogic_rdconfig()
1381 adapter->terminfo_valid = true; in blogic_rdconfig()
1382 adapter->low_term = fpinfo->low_term; in blogic_rdconfig()
1383 adapter->high_term = fpinfo->high_term; in blogic_rdconfig()
1384 adapter->scam_enabled = fpinfo->scam_enabled; in blogic_rdconfig()
1385 adapter->scam_lev2 = fpinfo->scam_lev2; in blogic_rdconfig()
1386 adapter->drvr_sglimit = BLOGIC_SG_LIMIT; in blogic_rdconfig()
1387 adapter->maxdev = (adapter->wide ? 16 : 8); in blogic_rdconfig()
1388 adapter->maxlun = 32; in blogic_rdconfig()
1389 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE; in blogic_rdconfig()
1390 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE; in blogic_rdconfig()
1391 adapter->drvr_qdepth = 255; in blogic_rdconfig()
1392 adapter->adapter_qdepth = adapter->drvr_qdepth; in blogic_rdconfig()
1393 adapter->sync_ok = fpinfo->sync_ok; in blogic_rdconfig()
1394 adapter->fast_ok = fpinfo->fast_ok; in blogic_rdconfig()
1395 adapter->ultra_ok = fpinfo->ultra_ok; in blogic_rdconfig()
1396 adapter->wide_ok = fpinfo->wide_ok; in blogic_rdconfig()
1397 adapter->discon_ok = fpinfo->discon_ok; in blogic_rdconfig()
1398 adapter->tagq_ok = 0xFFFF; in blogic_rdconfig()
1402 Issue the Inquire Board ID command. in blogic_rdconfig()
1408 Issue the Inquire Configuration command. in blogic_rdconfig()
1415 Issue the Inquire Setup Information command. in blogic_rdconfig()
1423 Issue the Inquire Extended Setup Information command. in blogic_rdconfig()
1432 Issue the Inquire Firmware Version 3rd Digit command. in blogic_rdconfig()
1442 Issue the Inquire Host Adapter Model Number command. in blogic_rdconfig()
1445 /* BusLogic BT-542B ISA 2.xx */ in blogic_rdconfig()
1450 /* BusLogic BT-742A EISA 2.1x or 2.20 */ in blogic_rdconfig()
1461 "INQUIRE HOST ADAPTER MODEL NUMBER"); in blogic_rdconfig()
1464 BusLogic MultiMaster Host Adapters can be identified by their in blogic_rdconfig()
1468 5.xx BusLogic "W" Series Host Adapters: in blogic_rdconfig()
1469 BT-948/958/958D in blogic_rdconfig()
1470 4.xx BusLogic "C" Series Host Adapters: in blogic_rdconfig()
1471 BT-946C/956C/956CD/747C/757C/757CD/445C/545C/540CF in blogic_rdconfig()
1472 3.xx BusLogic "S" Series Host Adapters: in blogic_rdconfig()
1473 BT-747S/747D/757S/757D/445S/545S/542D in blogic_rdconfig()
1474 BT-542B/742A (revision H) in blogic_rdconfig()
1475 2.xx BusLogic "A" Series Host Adapters: in blogic_rdconfig()
1476 BT-542B/742A (revision G and below) in blogic_rdconfig()
1477 0.xx AMI FastDisk VLB/EISA BusLogic Clone Host Adapter in blogic_rdconfig()
1480 Save the Model Name and Host Adapter Name in the Host Adapter in blogic_rdconfig()
1483 tgt = adapter->model; in blogic_rdconfig()
1486 *tgt++ = '-'; in blogic_rdconfig()
1495 Save the Firmware Version in the Host Adapter structure. in blogic_rdconfig()
1497 tgt = adapter->fw_ver; in blogic_rdconfig()
1505 Issue the Inquire Firmware Version Letter command. in blogic_rdconfig()
1507 if (strcmp(adapter->fw_ver, "3.3") >= 0) { in blogic_rdconfig()
1518 Save the Host Adapter SCSI ID in the Host Adapter structure. in blogic_rdconfig()
1520 adapter->scsi_id = config.id; in blogic_rdconfig()
1522 Determine the Bus Type and save it in the Host Adapter structure, in blogic_rdconfig()
1524 and save the DMA Channel for ISA Host Adapters. in blogic_rdconfig()
1526 adapter->adapter_bus_type = in blogic_rdconfig()
1527 blogic_adater_bus_types[adapter->model[3] - '4']; in blogic_rdconfig()
1528 if (adapter->irq_ch == 0) { in blogic_rdconfig()
1530 adapter->irq_ch = 9; in blogic_rdconfig()
1532 adapter->irq_ch = 10; in blogic_rdconfig()
1534 adapter->irq_ch = 11; in blogic_rdconfig()
1536 adapter->irq_ch = 12; in blogic_rdconfig()
1538 adapter->irq_ch = 14; in blogic_rdconfig()
1540 adapter->irq_ch = 15; in blogic_rdconfig()
1542 if (adapter->adapter_bus_type == BLOGIC_ISA_BUS) { in blogic_rdconfig()
1544 adapter->dma_ch = 5; in blogic_rdconfig()
1546 adapter->dma_ch = 6; in blogic_rdconfig()
1548 adapter->dma_ch = 7; in blogic_rdconfig()
1552 the Host Adapter structure. in blogic_rdconfig()
1555 adapter->ext_trans_enable = georeg.gr.ext_trans_enable; in blogic_rdconfig()
1559 Ultra SCSI flag in the Host Adapter structure. in blogic_rdconfig()
1561 adapter->adapter_sglimit = ext_setupinfo.sg_limit; in blogic_rdconfig()
1562 adapter->drvr_sglimit = adapter->adapter_sglimit; in blogic_rdconfig()
1563 if (adapter->adapter_sglimit > BLOGIC_SG_LIMIT) in blogic_rdconfig()
1564 adapter->drvr_sglimit = BLOGIC_SG_LIMIT; in blogic_rdconfig()
1566 adapter->level_int = true; in blogic_rdconfig()
1567 adapter->wide = ext_setupinfo.wide; in blogic_rdconfig()
1568 adapter->differential = ext_setupinfo.differential; in blogic_rdconfig()
1569 adapter->scam = ext_setupinfo.scam; in blogic_rdconfig()
1570 adapter->ultra = ext_setupinfo.ultra; in blogic_rdconfig()
1573 information in the Host Adapter structure. in blogic_rdconfig()
1575 if (adapter->fw_ver[0] == '5' || (adapter->fw_ver[0] == '4' && in blogic_rdconfig()
1576 adapter->wide)) in blogic_rdconfig()
1577 adapter->ext_lun = true; in blogic_rdconfig()
1579 Issue the Inquire PCI Host Adapter Information command to read the in blogic_rdconfig()
1580 Termination Information from "W" series MultiMaster Host Adapters. in blogic_rdconfig()
1582 if (adapter->fw_ver[0] == '5') { in blogic_rdconfig()
1587 "INQUIRE PCI HOST ADAPTER INFORMATION"); in blogic_rdconfig()
1589 Save the Termination Information in the Host Adapter in blogic_rdconfig()
1593 adapter->terminfo_valid = true; in blogic_rdconfig()
1594 adapter->low_term = adapter_info.low_term; in blogic_rdconfig()
1595 adapter->high_term = adapter_info.high_term; in blogic_rdconfig()
1599 Issue the Fetch Host Adapter Local RAM command to read the in blogic_rdconfig()
1600 AutoSCSI data from "W" and "C" series MultiMaster Host Adapters. in blogic_rdconfig()
1602 if (adapter->fw_ver[0] >= '4') { in blogic_rdconfig()
1609 "FETCH HOST ADAPTER LOCAL RAM"); in blogic_rdconfig()
1612 and Termination Information in the Host Adapter structure. in blogic_rdconfig()
1614 adapter->parity = autoscsi.parity; in blogic_rdconfig()
1615 adapter->reset_enabled = autoscsi.reset_enabled; in blogic_rdconfig()
1616 if (adapter->fw_ver[0] == '4') { in blogic_rdconfig()
1617 adapter->terminfo_valid = true; in blogic_rdconfig()
1618 adapter->low_term = autoscsi.low_term; in blogic_rdconfig()
1619 adapter->high_term = autoscsi.high_term; in blogic_rdconfig()
1624 SCAM Information in the Host Adapter structure. in blogic_rdconfig()
1626 adapter->wide_ok = autoscsi.wide_ok; in blogic_rdconfig()
1627 adapter->fast_ok = autoscsi.fast_ok; in blogic_rdconfig()
1628 adapter->sync_ok = autoscsi.sync_ok; in blogic_rdconfig()
1629 adapter->discon_ok = autoscsi.discon_ok; in blogic_rdconfig()
1630 if (adapter->ultra) in blogic_rdconfig()
1631 adapter->ultra_ok = autoscsi.ultra_ok; in blogic_rdconfig()
1632 if (adapter->scam) { in blogic_rdconfig()
1633 adapter->scam_enabled = autoscsi.scam_enabled; in blogic_rdconfig()
1634 adapter->scam_lev2 = autoscsi.scam_lev2; in blogic_rdconfig()
1638 Initialize fields in the Host Adapter structure for "S" and "A" in blogic_rdconfig()
1639 series MultiMaster Host Adapters. in blogic_rdconfig()
1641 if (adapter->fw_ver[0] < '4') { in blogic_rdconfig()
1643 adapter->sync_ok = 0xFF; in blogic_rdconfig()
1644 if (adapter->adapter_bus_type == BLOGIC_EISA_BUS) { in blogic_rdconfig()
1646 adapter->fast_ok = 0xFF; in blogic_rdconfig()
1647 if (strcmp(adapter->model, "BT-757") == 0) in blogic_rdconfig()
1648 adapter->wide_ok = 0xFF; in blogic_rdconfig()
1651 adapter->discon_ok = 0xFF; in blogic_rdconfig()
1652 adapter->parity = setupinfo.parity; in blogic_rdconfig()
1653 adapter->reset_enabled = true; in blogic_rdconfig()
1657 supported by this driver for Wide and Narrow Host Adapters. in blogic_rdconfig()
1659 adapter->maxdev = (adapter->wide ? 16 : 8); in blogic_rdconfig()
1660 adapter->maxlun = (adapter->ext_lun ? 32 : 8); in blogic_rdconfig()
1669 not supported, then the Host Adapter must scan all the Outgoing in blogic_rdconfig()
1671 cause a substantial performance penalty. The host adapters in blogic_rdconfig()
1676 set to the Mailbox Count, rather than the Host Adapter Queue in blogic_rdconfig()
1681 192 BT-948/958/958D in blogic_rdconfig()
1682 100 BT-946C/956C/956CD/747C/757C/757CD/445C in blogic_rdconfig()
1683 50 BT-545C/540CF in blogic_rdconfig()
1684 30 BT-747S/747D/757S/757D/445S/545S/542D/542B/742A in blogic_rdconfig()
1686 if (adapter->fw_ver[0] == '5') in blogic_rdconfig()
1687 adapter->adapter_qdepth = 192; in blogic_rdconfig()
1688 else if (adapter->fw_ver[0] == '4') in blogic_rdconfig()
1689 adapter->adapter_qdepth = (adapter->adapter_bus_type != in blogic_rdconfig()
1692 adapter->adapter_qdepth = 30; in blogic_rdconfig()
1693 if (strcmp(adapter->fw_ver, "3.31") >= 0) { in blogic_rdconfig()
1694 adapter->strict_rr = true; in blogic_rdconfig()
1695 adapter->mbox_count = BLOGIC_MAX_MAILBOX; in blogic_rdconfig()
1697 adapter->strict_rr = false; in blogic_rdconfig()
1698 adapter->mbox_count = 32; in blogic_rdconfig()
1700 adapter->drvr_qdepth = adapter->mbox_count; in blogic_rdconfig()
1701 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE; in blogic_rdconfig()
1702 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE; in blogic_rdconfig()
1705 all "W" series MultiMaster Host Adapters, on "C" series in blogic_rdconfig()
1706 MultiMaster Host Adapters with firmware version 4.22 and above, in blogic_rdconfig()
1707 and on "S" series MultiMaster Host Adapters with firmware version in blogic_rdconfig()
1710 adapter->tagq_ok = 0; in blogic_rdconfig()
1711 switch (adapter->fw_ver[0]) { in blogic_rdconfig()
1713 adapter->tagq_ok = 0xFFFF; in blogic_rdconfig()
1716 if (strcmp(adapter->fw_ver, "4.22") >= 0) in blogic_rdconfig()
1717 adapter->tagq_ok = 0xFFFF; in blogic_rdconfig()
1720 if (strcmp(adapter->fw_ver, "3.35") >= 0) in blogic_rdconfig()
1721 adapter->tagq_ok = 0xFFFF; in blogic_rdconfig()
1725 Determine the Host Adapter BIOS Address if the BIOS is enabled and in blogic_rdconfig()
1726 save it in the Host Adapter structure. The BIOS is disabled if the in blogic_rdconfig()
1729 adapter->bios_addr = ext_setupinfo.bios_addr << 12; in blogic_rdconfig()
1731 ISA Host Adapters require Bounce Buffers if there is more than in blogic_rdconfig()
1734 if (adapter->adapter_bus_type == BLOGIC_ISA_BUS && in blogic_rdconfig()
1736 adapter->need_bouncebuf = true; in blogic_rdconfig()
1738 BusLogic BT-445S Host Adapters prior to board revision E have a in blogic_rdconfig()
1741 incorrectly. Only properly functioning BT-445S Host Adapters in blogic_rdconfig()
1743 be used for the buggy BT-445S models if there is more than 16MB in blogic_rdconfig()
1746 if (adapter->bios_addr > 0 && strcmp(adapter->model, "BT-445S") == 0 && in blogic_rdconfig()
1747 strcmp(adapter->fw_ver, "3.37") < 0 && in blogic_rdconfig()
1749 adapter->need_bouncebuf = true; in blogic_rdconfig()
1752 Host Adapters. in blogic_rdconfig()
1756 Initialize the Host Adapter Full Model Name from the Model Name. in blogic_rdconfig()
1758 strcpy(adapter->full_model, "BusLogic "); in blogic_rdconfig()
1759 strcat(adapter->full_model, adapter->model); in blogic_rdconfig()
1762 BusLogic Driver Options specification, or based on whether this Host in blogic_rdconfig()
1769 if (adapter->drvr_opts != NULL && in blogic_rdconfig()
1770 adapter->drvr_opts->qdepth[tgt_id] > 0) in blogic_rdconfig()
1771 qdepth = adapter->drvr_opts->qdepth[tgt_id]; in blogic_rdconfig()
1772 else if (adapter->need_bouncebuf) in blogic_rdconfig()
1774 adapter->qdepth[tgt_id] = qdepth; in blogic_rdconfig()
1776 if (adapter->need_bouncebuf) in blogic_rdconfig()
1777 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH_BB; in blogic_rdconfig()
1779 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH; in blogic_rdconfig()
1780 if (adapter->drvr_opts != NULL) in blogic_rdconfig()
1781 adapter->common_qdepth = adapter->drvr_opts->common_qdepth; in blogic_rdconfig()
1782 if (adapter->common_qdepth > 0 && in blogic_rdconfig()
1783 adapter->common_qdepth < adapter->untag_qdepth) in blogic_rdconfig()
1784 adapter->untag_qdepth = adapter->common_qdepth; in blogic_rdconfig()
1790 adapter->tagq_ok &= adapter->discon_ok; in blogic_rdconfig()
1795 if (adapter->drvr_opts != NULL) in blogic_rdconfig()
1796 adapter->tagq_ok = (adapter->drvr_opts->tagq_ok & in blogic_rdconfig()
1797 adapter->drvr_opts->tagq_ok_mask) | in blogic_rdconfig()
1798 (adapter->tagq_ok & ~adapter->drvr_opts->tagq_ok_mask); in blogic_rdconfig()
1805 if (adapter->drvr_opts != NULL && in blogic_rdconfig()
1806 adapter->drvr_opts->bus_settle_time > 0) in blogic_rdconfig()
1807 adapter->bus_settle_time = adapter->drvr_opts->bus_settle_time; in blogic_rdconfig()
1809 adapter->bus_settle_time = BLOGIC_BUS_SETTLE_TIME; in blogic_rdconfig()
1811 Indicate reading the Host Adapter Configuration completed in blogic_rdconfig()
1819 blogic_reportconfig reports the configuration of Host Adapter.
1824 unsigned short alltgt_mask = (1 << adapter->maxdev) - 1; in blogic_reportconfig()
1839Host Adapter\n", adapter, adapter->model, blogic_adapter_busnames[adapter->adapter_bus_type], (ada… in blogic_reportconfig()
1840 …s: 0x%lX, IRQ Channel: %d/%s\n", adapter, adapter->fw_ver, adapter->io_addr, adapter->irq_ch, (ada… in blogic_reportconfig()
1841 if (adapter->adapter_bus_type != BLOGIC_PCI_BUS) { in blogic_reportconfig()
1843 if (adapter->dma_ch > 0) in blogic_reportconfig()
1844 blogic_info("%d, ", adapter, adapter->dma_ch); in blogic_reportconfig()
1847 if (adapter->bios_addr > 0) in blogic_reportconfig()
1849 adapter->bios_addr); in blogic_reportconfig()
1854 adapter->bus, adapter->dev); in blogic_reportconfig()
1855 if (adapter->pci_addr > 0) in blogic_reportconfig()
1856 blogic_info("0x%lX, ", adapter, adapter->pci_addr); in blogic_reportconfig()
1860 blogic_info("Host Adapter SCSI ID: %d\n", adapter, adapter->scsi_id); in blogic_reportconfig()
1862 adapter, (adapter->parity ? "Enabled" : "Disabled"), in blogic_reportconfig()
1863 (adapter->ext_trans_enable ? "Enabled" : "Disabled")); in blogic_reportconfig()
1864 alltgt_mask &= ~(1 << adapter->scsi_id); in blogic_reportconfig()
1865 sync_ok = adapter->sync_ok & alltgt_mask; in blogic_reportconfig()
1866 fast_ok = adapter->fast_ok & alltgt_mask; in blogic_reportconfig()
1867 ultra_ok = adapter->ultra_ok & alltgt_mask; in blogic_reportconfig()
1869 (adapter->fw_ver[0] >= '4' || in blogic_reportconfig()
1870 adapter->adapter_bus_type == BLOGIC_EISA_BUS)) || in blogic_reportconfig()
1891 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_reportconfig()
1893 syncstr[adapter->scsi_id] = '#'; in blogic_reportconfig()
1894 syncstr[adapter->maxdev] = '\0'; in blogic_reportconfig()
1898 wide_ok = adapter->wide_ok & alltgt_mask; in blogic_reportconfig()
1904 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_reportconfig()
1906 widestr[adapter->scsi_id] = '#'; in blogic_reportconfig()
1907 widestr[adapter->maxdev] = '\0'; in blogic_reportconfig()
1909 discon_ok = adapter->discon_ok & alltgt_mask; in blogic_reportconfig()
1915 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_reportconfig()
1917 discon_str[adapter->scsi_id] = '#'; in blogic_reportconfig()
1918 discon_str[adapter->maxdev] = '\0'; in blogic_reportconfig()
1920 tagq_ok = adapter->tagq_ok & alltgt_mask; in blogic_reportconfig()
1926 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_reportconfig()
1928 tagq_str[adapter->scsi_id] = '#'; in blogic_reportconfig()
1929 tagq_str[adapter->maxdev] = '\0'; in blogic_reportconfig()
1936 … of %d segments, Mailboxes: %d\n", adapter, adapter->drvr_sglimit, adapter->adapter_sglimit, adapt… in blogic_reportconfig()
1937 …blogic_info(" Driver Queue Depth: %d, Host Adapter Queue Depth: %d\n", adapter, adapter->drvr_qde… in blogic_reportconfig()
1939 …Depth: %d, Scatter/Gather Limit: %d segments\n", adapter, adapter->drvr_qdepth, adapter->drvr_sgli… in blogic_reportconfig()
1942 for (tgt_id = 1; tgt_id < adapter->maxdev; tgt_id++) in blogic_reportconfig()
1943 if (adapter->qdepth[tgt_id] != adapter->qdepth[0]) { in blogic_reportconfig()
1948 if (adapter->qdepth[0] > 0) in blogic_reportconfig()
1949 blogic_info("%d", adapter, adapter->qdepth[0]); in blogic_reportconfig()
1955 adapter->untag_qdepth); in blogic_reportconfig()
1956 if (adapter->terminfo_valid) { in blogic_reportconfig()
1957 if (adapter->wide) in blogic_reportconfig()
1959 …(adapter->low_term ? (adapter->high_term ? "Both Enabled" : "Low Enabled") : (adapter->high_term ?… in blogic_reportconfig()
1962 (adapter->low_term ? "Enabled" : "Disabled")); in blogic_reportconfig()
1963 if (adapter->scam) in blogic_reportconfig()
1965 …(adapter->scam_enabled ? (adapter->scam_lev2 ? "Enabled, Level 2" : "Enabled, Level 1") : "Disable… in blogic_reportconfig()
1969 Indicate reporting the Host Adapter configuration completed in blogic_reportconfig()
1978 Host Adapter.
1983 if (adapter->irq_ch == 0) { in blogic_getres()
1984 blogic_err("NO LEGAL INTERRUPT CHANNEL ASSIGNED - DETACHING\n", in blogic_getres()
1991 if (request_irq(adapter->irq_ch, blogic_inthandler, IRQF_SHARED, in blogic_getres()
1992 adapter->full_model, adapter) < 0) { in blogic_getres()
1993 blogic_err("UNABLE TO ACQUIRE IRQ CHANNEL %d - DETACHING\n", in blogic_getres()
1994 adapter, adapter->irq_ch); in blogic_getres()
1997 adapter->irq_acquired = true; in blogic_getres()
2001 if (adapter->dma_ch > 0) { in blogic_getres()
2002 if (request_dma(adapter->dma_ch, adapter->full_model) < 0) { in blogic_getres()
2003 blogic_err("UNABLE TO ACQUIRE DMA CHANNEL %d - DETACHING\n", adapter, adapter->dma_ch); in blogic_getres()
2006 set_dma_mode(adapter->dma_ch, DMA_MODE_CASCADE); in blogic_getres()
2007 enable_dma(adapter->dma_ch); in blogic_getres()
2008 adapter->dma_chan_acquired = true; in blogic_getres()
2027 if (adapter->irq_acquired) in blogic_relres()
2028 free_irq(adapter->irq_ch, adapter); in blogic_relres()
2032 if (adapter->dma_chan_acquired) in blogic_relres()
2033 free_dma(adapter->dma_ch); in blogic_relres()
2037 if (adapter->mbox_space) in blogic_relres()
2038 dma_free_coherent(&adapter->pci_device->dev, adapter->mbox_sz, in blogic_relres()
2039 adapter->mbox_space, adapter->mbox_space_handle); in blogic_relres()
2040 pci_dev_put(adapter->pci_device); in blogic_relres()
2041 adapter->mbox_space = NULL; in blogic_relres()
2042 adapter->mbox_space_handle = 0; in blogic_relres()
2043 adapter->mbox_sz = 0; in blogic_relres()
2048 blogic_initadapter initializes Host Adapter. This is the only
2049 function called during SCSI Host Adapter detection which modifies the state
2050 of the Host Adapter from its initial power on or hard reset state.
2064 adapter->firstccb = NULL; in blogic_initadapter()
2065 adapter->lastccb = NULL; in blogic_initadapter()
2069 Command Successful Flag, Active Commands, and Commands Since Reset in blogic_initadapter()
2072 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) { in blogic_initadapter()
2073 adapter->bdr_pend[tgt_id] = NULL; in blogic_initadapter()
2074 adapter->tgt_flags[tgt_id].tagq_active = false; in blogic_initadapter()
2075 adapter->tgt_flags[tgt_id].cmd_good = false; in blogic_initadapter()
2076 adapter->active_cmds[tgt_id] = 0; in blogic_initadapter()
2077 adapter->cmds_since_rst[tgt_id] = 0; in blogic_initadapter()
2081 FlashPoint Host Adapters do not use Outgoing and Incoming Mailboxes. in blogic_initadapter()
2089 …adapter->mbox_sz = adapter->mbox_count * (sizeof(struct blogic_outbox) + sizeof(struct blogic_inbo… in blogic_initadapter()
2090 adapter->mbox_space = dma_alloc_coherent(&adapter->pci_device->dev, in blogic_initadapter()
2091 adapter->mbox_sz, &adapter->mbox_space_handle, in blogic_initadapter()
2093 if (adapter->mbox_space == NULL) in blogic_initadapter()
2095 adapter->first_outbox = (struct blogic_outbox *) adapter->mbox_space; in blogic_initadapter()
2096 adapter->last_outbox = adapter->first_outbox + adapter->mbox_count - 1; in blogic_initadapter()
2097 adapter->next_outbox = adapter->first_outbox; in blogic_initadapter()
2098 adapter->first_inbox = (struct blogic_inbox *) (adapter->last_outbox + 1); in blogic_initadapter()
2099 adapter->last_inbox = adapter->first_inbox + adapter->mbox_count - 1; in blogic_initadapter()
2100 adapter->next_inbox = adapter->first_inbox; in blogic_initadapter()
2105 memset(adapter->first_outbox, 0, in blogic_initadapter()
2106 adapter->mbox_count * sizeof(struct blogic_outbox)); in blogic_initadapter()
2107 memset(adapter->first_inbox, 0, in blogic_initadapter()
2108 adapter->mbox_count * sizeof(struct blogic_inbox)); in blogic_initadapter()
2111 Initialize the Host Adapter's Pointer to the Outgoing/Incoming in blogic_initadapter()
2114 extmbox_req.mbox_count = adapter->mbox_count; in blogic_initadapter()
2115 extmbox_req.base_mbox_addr = (u32) adapter->mbox_space_handle; in blogic_initadapter()
2120 Enable Strict Round Robin Mode if supported by the Host Adapter. In in blogic_initadapter()
2121 Strict Round Robin Mode, the Host Adapter only looks at the next in blogic_initadapter()
2122 Outgoing Mailbox for each new command, rather than scanning in blogic_initadapter()
2127 if (adapter->strict_rr) { in blogic_initadapter()
2136 For Host Adapters that support Extended LUN Format CCBs, issue the in blogic_initadapter()
2137 Set CCB Format command to allow 32 Logical Units per Target Device. in blogic_initadapter()
2139 if (adapter->ext_lun) { in blogic_initadapter()
2150 if (!adapter->adapter_initd) { in blogic_initadapter()
2152 adapter->full_model); in blogic_initadapter()
2156 adapter->full_model); in blogic_initadapter()
2157 adapter->adapter_initd = true; in blogic_initadapter()
2160 Indicate the Host Adapter Initialization completed successfully. in blogic_initadapter()
2168 through Host Adapter.
2181 Wait a few seconds between the Host Adapter Hard Reset which in blogic_inquiry()
2186 blogic_delay(adapter->bus_settle_time); in blogic_inquiry()
2188 FlashPoint Host Adapters do not provide for Target Device Inquiry. in blogic_inquiry()
2195 if (adapter->drvr_opts != NULL && adapter->drvr_opts->stop_tgt_inquiry) in blogic_inquiry()
2198 Issue the Inquire Target Devices command for host adapters with in blogic_inquiry()
2200 ID 0 to 7 command for older host adapters. This is necessary to in blogic_inquiry()
2203 valid data. The Inquire Target Devices command is preferable to in blogic_inquiry()
2207 if (strcmp(adapter->fw_ver, "4.25") >= 0) { in blogic_inquiry()
2210 Issue a Inquire Target Devices command. Inquire Target in blogic_inquiry()
2213 Logical Units 0 - 7. Two bytes are returned, where byte in blogic_inquiry()
2221 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_inquiry()
2222 adapter->tgt_flags[tgt_id].tgt_exists = in blogic_inquiry()
2227 Issue an Inquire Installed Devices command. For each in blogic_inquiry()
2239 adapter->tgt_flags[tgt_id].tgt_exists = in blogic_inquiry()
2243 Issue the Inquire Setup Information command. in blogic_inquiry()
2250 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_inquiry()
2251 …adapter->sync_offset[tgt_id] = (tgt_id < 8 ? setupinfo.sync0to7[tgt_id].offset : setupinfo.sync8to… in blogic_inquiry()
2252 if (strcmp(adapter->fw_ver, "5.06L") >= 0) in blogic_inquiry()
2253 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_inquiry()
2254->tgt_flags[tgt_id].wide_active = (tgt_id < 8 ? (setupinfo.wide_tx_active0to7 & (1 << tgt_id) ? tr… in blogic_inquiry()
2256 Issue the Inquire Synchronous Period command. in blogic_inquiry()
2258 if (adapter->fw_ver[0] >= '3') { in blogic_inquiry()
2260 /* Issue a Inquire Synchronous Period command. For each in blogic_inquiry()
2271 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_inquiry()
2272 adapter->sync_period[tgt_id] = sync_period[tgt_id]; in blogic_inquiry()
2274 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_inquiry()
2276 adapter->sync_period[tgt_id] = 20 + 5 * setupinfo.sync0to7[tgt_id].tx_period; in blogic_inquiry()
2284 blogic_inithoststruct initializes the fields in the SCSI Host
2286 SCSI Host structure are intentionally left uninitialized, as this driver
2288 ensuring exclusive access to the Host Adapter hardware and data structures
2289 through explicit acquisition and release of the Host Adapter's Lock.
2293 struct Scsi_Host *host) in blogic_inithoststruct() argument
2295 host->max_id = adapter->maxdev; in blogic_inithoststruct()
2296 host->max_lun = adapter->maxlun; in blogic_inithoststruct()
2297 host->max_channel = 0; in blogic_inithoststruct()
2298 host->unique_id = adapter->io_addr; in blogic_inithoststruct()
2299 host->this_id = adapter->scsi_id; in blogic_inithoststruct()
2300 host->can_queue = adapter->drvr_qdepth; in blogic_inithoststruct()
2301 host->sg_tablesize = adapter->drvr_sglimit; in blogic_inithoststruct()
2302 host->unchecked_isa_dma = adapter->need_bouncebuf; in blogic_inithoststruct()
2303 host->cmd_per_lun = adapter->untag_qdepth; in blogic_inithoststruct()
2317 (struct blogic_adapter *) dev->host->hostdata; in blogic_slaveconfig()
2318 int tgt_id = dev->id; in blogic_slaveconfig()
2319 int qdepth = adapter->qdepth[tgt_id]; in blogic_slaveconfig()
2321 if (adapter->tgt_flags[tgt_id].tagq_ok && in blogic_slaveconfig()
2322 (adapter->tagq_ok & (1 << tgt_id))) { in blogic_slaveconfig()
2325 adapter->qdepth[tgt_id] = qdepth; in blogic_slaveconfig()
2328 adapter->tagq_ok &= ~(1 << tgt_id); in blogic_slaveconfig()
2329 qdepth = adapter->untag_qdepth; in blogic_slaveconfig()
2330 adapter->qdepth[tgt_id] = qdepth; in blogic_slaveconfig()
2334 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) in blogic_slaveconfig()
2335 if (adapter->tgt_flags[tgt_id].tgt_exists) in blogic_slaveconfig()
2336 qdepth += adapter->qdepth[tgt_id]; in blogic_slaveconfig()
2337 if (qdepth > adapter->alloc_ccbs) in blogic_slaveconfig()
2338 blogic_create_addlccbs(adapter, qdepth - adapter->alloc_ccbs, in blogic_slaveconfig()
2344 blogic_init probes for BusLogic Host Adapters at the standard
2346 reporting the configuration of each BusLogic Host Adapter it finds. It
2347 returns the number of BusLogic Host Adapters successfully initialized and
2363 return -ENODEV; in blogic_init()
2370 return -ENOMEM; in blogic_init()
2376 blogic_err("BusLogic: Unable to allocate Prototype Host Adapter\n", NULL); in blogic_init()
2377 return -ENOMEM; in blogic_init()
2389 struct Scsi_Host *host; in blogic_init() local
2391 if (probeinfo->io_addr == 0) in blogic_init()
2394 myadapter->adapter_type = probeinfo->adapter_type; in blogic_init()
2395 myadapter->adapter_bus_type = probeinfo->adapter_bus_type; in blogic_init()
2396 myadapter->io_addr = probeinfo->io_addr; in blogic_init()
2397 myadapter->pci_addr = probeinfo->pci_addr; in blogic_init()
2398 myadapter->bus = probeinfo->bus; in blogic_init()
2399 myadapter->dev = probeinfo->dev; in blogic_init()
2400 myadapter->pci_device = probeinfo->pci_device; in blogic_init()
2401 myadapter->irq_ch = probeinfo->irq_ch; in blogic_init()
2402 myadapter->addr_count = in blogic_init()
2403 blogic_adapter_addr_count[myadapter->adapter_type]; in blogic_init()
2408 if (!request_region(myadapter->io_addr, myadapter->addr_count, in blogic_init()
2412 Probe the Host Adapter. If unsuccessful, abort further in blogic_init()
2416 release_region(myadapter->io_addr, in blogic_init()
2417 myadapter->addr_count); in blogic_init()
2421 Hard Reset the Host Adapter. If unsuccessful, abort further in blogic_init()
2425 release_region(myadapter->io_addr, in blogic_init()
2426 myadapter->addr_count); in blogic_init()
2430 Check the Host Adapter. If unsuccessful, abort further in blogic_init()
2434 release_region(myadapter->io_addr, in blogic_init()
2435 myadapter->addr_count); in blogic_init()
2442 myadapter->drvr_opts = in blogic_init()
2450 Register the SCSI Host structure. in blogic_init()
2453 host = scsi_host_alloc(&blogic_template, in blogic_init()
2455 if (host == NULL) { in blogic_init()
2456 release_region(myadapter->io_addr, in blogic_init()
2457 myadapter->addr_count); in blogic_init()
2460 myadapter = (struct blogic_adapter *) host->hostdata; in blogic_init()
2462 myadapter->scsi_host = host; in blogic_init()
2463 myadapter->host_no = host->host_no; in blogic_init()
2465 Add Host Adapter to the end of the list of registered in blogic_init()
2466 BusLogic Host Adapters. in blogic_init()
2468 list_add_tail(&myadapter->host_list, &blogic_host_list); in blogic_init()
2471 Read the Host Adapter Configuration, Configure the Host in blogic_init()
2473 the Host Adapter, then Create the Initial CCBs, Initialize in blogic_init()
2474 the Host Adapter, and finally perform Target Device in blogic_init()
2476 assumed to be due to a problem with the Host Adapter, in blogic_init()
2478 as belonging to a BusLogic Host Adapter. The I/O Address in blogic_init()
2480 being incorrectly identified as any other type of Host in blogic_init()
2491 Release and re-register usage of the I/O Address in blogic_init()
2492 range so that the Model Name of the Host Adapter in blogic_init()
2493 will appear, and initialize the SCSI Host structure. in blogic_init()
2495 release_region(myadapter->io_addr, in blogic_init()
2496 myadapter->addr_count); in blogic_init()
2497 if (!request_region(myadapter->io_addr, in blogic_init()
2498 myadapter->addr_count, in blogic_init()
2499 myadapter->full_model)) { in blogic_init()
2501 "BusLogic: Release and re-register of " in blogic_init()
2503 (unsigned long)myadapter->io_addr); in blogic_init()
2506 list_del(&myadapter->host_list); in blogic_init()
2507 scsi_host_put(host); in blogic_init()
2508 ret = -ENOMEM; in blogic_init()
2511 host); in blogic_init()
2512 if (scsi_add_host(host, myadapter->pci_device in blogic_init()
2513 ? &myadapter->pci_device->dev in blogic_init()
2520 list_del(&myadapter->host_list); in blogic_init()
2521 scsi_host_put(host); in blogic_init()
2522 ret = -ENODEV; in blogic_init()
2524 scsi_scan_host(host); in blogic_init()
2530 An error occurred during Host Adapter Configuration in blogic_init()
2531 Querying, Host Adapter Configuration, Resource in blogic_init()
2532 Acquisition, CCB Creation, Host Adapter in blogic_init()
2534 remove Host Adapter from the list of registered in blogic_init()
2535 BusLogic Host Adapters, destroy the CCBs, Release in blogic_init()
2537 Host. in blogic_init()
2541 list_del(&myadapter->host_list); in blogic_init()
2542 scsi_host_put(host); in blogic_init()
2543 ret = -ENODEV; in blogic_init()
2555 support a specific Host Adapter, including the I/O Address range, and
2556 unregisters the BusLogic Host Adapter.
2561 struct Scsi_Host *host = adapter->scsi_host; in blogic_deladapter() local
2563 scsi_remove_host(host); in blogic_deladapter()
2566 FlashPoint Host Adapters must first be released by the FlashPoint in blogic_deladapter()
2570 FlashPoint_ReleaseHostAdapter(adapter->cardhandle); in blogic_deladapter()
2573 support Host Adapter. in blogic_deladapter()
2580 release_region(adapter->io_addr, adapter->addr_count); in blogic_deladapter()
2582 Remove Host Adapter from the list of registered BusLogic in blogic_deladapter()
2583 Host Adapters. in blogic_deladapter()
2585 list_del(&adapter->host_list); in blogic_deladapter()
2587 scsi_host_put(host); in blogic_deladapter()
2598 struct blogic_adapter *adapter = ccb->adapter; in blogic_qcompleted_ccb()
2600 ccb->status = BLOGIC_CCB_COMPLETE; in blogic_qcompleted_ccb()
2601 ccb->next = NULL; in blogic_qcompleted_ccb()
2602 if (adapter->firstccb == NULL) { in blogic_qcompleted_ccb()
2603 adapter->firstccb = ccb; in blogic_qcompleted_ccb()
2604 adapter->lastccb = ccb; in blogic_qcompleted_ccb()
2606 adapter->lastccb->next = ccb; in blogic_qcompleted_ccb()
2607 adapter->lastccb = ccb; in blogic_qcompleted_ccb()
2609 adapter->active_cmds[ccb->tgt_id]--; in blogic_qcompleted_ccb()
2615 the Host Adapter Status and Target Device Status.
2662 blogic_warn("Unknown Host Adapter Status 0x%02X\n", adapter, in blogic_resultcode()
2681 is essential that for each CCB and SCSI Command issued, command in blogic_scan_inbox()
2683 only Incoming Mailboxes with completion code Command Completed in blogic_scan_inbox()
2684 Without Error, Command Completed With Error, or Command Aborted in blogic_scan_inbox()
2685 At Host Request are saved for completion processing. When an in blogic_scan_inbox()
2686 Incoming Mailbox has a completion code of Aborted Command Not in blogic_scan_inbox()
2691 struct blogic_inbox *next_inbox = adapter->next_inbox; in blogic_scan_inbox()
2694 while ((comp_code = next_inbox->comp_code) != BLOGIC_INBOX_FREE) { in blogic_scan_inbox()
2704 (struct blogic_ccb *) bus_to_virt(next_inbox->ccb); in blogic_scan_inbox()
2706 if (ccb->status == BLOGIC_CCB_ACTIVE || in blogic_scan_inbox()
2707 ccb->status == BLOGIC_CCB_RESET) { in blogic_scan_inbox()
2712 ccb->comp_code = comp_code; in blogic_scan_inbox()
2719 the Host Adapter firmware. in blogic_scan_inbox()
2721 …blogic_warn("Illegal CCB #%ld status %d in Incoming Mailbox\n", adapter, ccb->serial, ccb->status); in blogic_scan_inbox()
2724 next_inbox->comp_code = BLOGIC_INBOX_FREE; in blogic_scan_inbox()
2725 if (++next_inbox > adapter->last_inbox) in blogic_scan_inbox()
2726 next_inbox = adapter->first_inbox; in blogic_scan_inbox()
2728 adapter->next_inbox = next_inbox; in blogic_scan_inbox()
2733 blogic_process_ccbs iterates over the completed CCBs for Host
2734 Adapter setting the SCSI Command Result Codes, deallocating the CCBs, and
2735 calling the SCSI Subsystem Completion Routines. The Host Adapter's Lock
2741 if (adapter->processing_ccbs) in blogic_process_ccbs()
2743 adapter->processing_ccbs = true; in blogic_process_ccbs()
2744 while (adapter->firstccb != NULL) { in blogic_process_ccbs()
2745 struct blogic_ccb *ccb = adapter->firstccb; in blogic_process_ccbs()
2746 struct scsi_cmnd *command = ccb->command; in blogic_process_ccbs() local
2747 adapter->firstccb = ccb->next; in blogic_process_ccbs()
2748 if (adapter->firstccb == NULL) in blogic_process_ccbs()
2749 adapter->lastccb = NULL; in blogic_process_ccbs()
2753 if (ccb->opcode == BLOGIC_BDR) { in blogic_process_ccbs()
2754 int tgt_id = ccb->tgt_id; in blogic_process_ccbs()
2756 blogic_warn("Bus Device Reset CCB #%ld to Target %d Completed\n", adapter, ccb->serial, tgt_id); in blogic_process_ccbs()
2757 blogic_inc_count(&adapter->tgt_stats[tgt_id].bdr_done); in blogic_process_ccbs()
2758 adapter->tgt_flags[tgt_id].tagq_active = false; in blogic_process_ccbs()
2759 adapter->cmds_since_rst[tgt_id] = 0; in blogic_process_ccbs()
2760 adapter->last_resetdone[tgt_id] = jiffies; in blogic_process_ccbs()
2762 Place CCB back on the Host Adapter's free list. in blogic_process_ccbs()
2767 Bus Device Reset CCBs have the command field in blogic_process_ccbs()
2768 non-NULL only when a Bus Device Reset was requested in blogic_process_ccbs()
2769 for a command that did not have a currently active in blogic_process_ccbs()
2770 CCB in the Host Adapter (i.e., a Synchronous Bus in blogic_process_ccbs()
2774 while (command != NULL) { in blogic_process_ccbs()
2776 command->reset_chain; in blogic_process_ccbs()
2777 command->reset_chain = NULL; in blogic_process_ccbs()
2778 command->result = DID_RESET << 16; in blogic_process_ccbs()
2779 command->scsi_done(command); in blogic_process_ccbs()
2780 command = nxt_cmd; in blogic_process_ccbs()
2784 Iterate over the CCBs for this Host Adapter in blogic_process_ccbs()
2788 for (ccb = adapter->all_ccbs; ccb != NULL; in blogic_process_ccbs()
2789 ccb = ccb->next_all) in blogic_process_ccbs()
2790 if (ccb->status == BLOGIC_CCB_RESET && in blogic_process_ccbs()
2791 ccb->tgt_id == tgt_id) { in blogic_process_ccbs()
2792 command = ccb->command; in blogic_process_ccbs()
2794 adapter->active_cmds[tgt_id]--; in blogic_process_ccbs()
2795 command->result = DID_RESET << 16; in blogic_process_ccbs()
2796 command->scsi_done(command); in blogic_process_ccbs()
2798 adapter->bdr_pend[tgt_id] = NULL; in blogic_process_ccbs()
2801 Translate the Completion Code, Host Adapter Status, in blogic_process_ccbs()
2805 switch (ccb->comp_code) { in blogic_process_ccbs()
2809 blogic_warn("CCB #%ld to Target %d Impossible State\n", adapter, ccb->serial, ccb->tgt_id); in blogic_process_ccbs()
2812 adapter->tgt_stats[ccb->tgt_id] in blogic_process_ccbs()
2814 adapter->tgt_flags[ccb->tgt_id] in blogic_process_ccbs()
2816 command->result = DID_OK << 16; in blogic_process_ccbs()
2820 adapter, ccb->serial, ccb->tgt_id); in blogic_process_ccbs()
2821 blogic_inc_count(&adapter->tgt_stats[ccb->tgt_id].aborts_done); in blogic_process_ccbs()
2822 command->result = DID_ABORT << 16; in blogic_process_ccbs()
2825 command->result = blogic_resultcode(adapter, in blogic_process_ccbs()
2826 ccb->adapter_status, ccb->tgt_status); in blogic_process_ccbs()
2827 if (ccb->adapter_status != BLOGIC_SELECT_TIMEOUT) { in blogic_process_ccbs()
2828 adapter->tgt_stats[ccb->tgt_id] in blogic_process_ccbs()
2832 blogic_notice("CCB #%ld Target %d: Result %X Host " in blogic_process_ccbs()
2833 …tus %02X Target Status %02X\n", adapter, ccb->serial, ccb->tgt_id, command->result, ccb->adapter_s… in blogic_process_ccbs()
2835 for (i = 0; i < ccb->cdblen; i++) in blogic_process_ccbs()
2836 blogic_notice(" %02X", adapter, ccb->cdb[i]); in blogic_process_ccbs()
2839 for (i = 0; i < ccb->sense_datalen; i++) in blogic_process_ccbs()
2840 blogic_notice(" %02X", adapter, command->sense_buffer[i]); in blogic_process_ccbs()
2847 When an INQUIRY command completes normally, save the in blogic_process_ccbs()
2851 if (ccb->cdb[0] == INQUIRY && ccb->cdb[1] == 0 && in blogic_process_ccbs()
2852 ccb->adapter_status == BLOGIC_CMD_CMPLT_NORMAL) { in blogic_process_ccbs()
2854 &adapter->tgt_flags[ccb->tgt_id]; in blogic_process_ccbs()
2856 (struct scsi_inquiry *) scsi_sglist(command); in blogic_process_ccbs()
2857 tgt_flags->tgt_exists = true; in blogic_process_ccbs()
2858 tgt_flags->tagq_ok = inquiry->CmdQue; in blogic_process_ccbs()
2859 tgt_flags->wide_ok = inquiry->WBus16; in blogic_process_ccbs()
2862 Place CCB back on the Host Adapter's free list. in blogic_process_ccbs()
2866 Call the SCSI Command Completion Routine. in blogic_process_ccbs()
2868 command->scsi_done(command); in blogic_process_ccbs()
2871 adapter->processing_ccbs = false; in blogic_process_ccbs()
2876 blogic_inthandler handles hardware interrupts from BusLogic Host
2885 Acquire exclusive access to Host Adapter. in blogic_inthandler()
2887 spin_lock_irqsave(adapter->scsi_host->host_lock, processor_flag); in blogic_inthandler()
2889 Handle Interrupts appropriately for each Host Adapter type. in blogic_inthandler()
2894 Read the Host Adapter Interrupt Register. in blogic_inthandler()
2899 Acknowledge the interrupt and reset the Host Adapter in blogic_inthandler()
2905 Mailbox Loaded Interrupts. Command Complete in blogic_inthandler()
2910 adapter->adapter_extreset = true; in blogic_inthandler()
2914 adapter->adapter_cmd_complete = true; in blogic_inthandler()
2918 Check if there is a pending interrupt for this Host Adapter. in blogic_inthandler()
2920 if (FlashPoint_InterruptPending(adapter->cardhandle)) in blogic_inthandler()
2921 switch (FlashPoint_HandleInterrupt(adapter->cardhandle)) { in blogic_inthandler()
2925 adapter->adapter_extreset = true; in blogic_inthandler()
2928 blogic_warn("Internal FlashPoint Error detected - Resetting Host Adapter\n", adapter); in blogic_inthandler()
2929 adapter->adapter_intern_err = true; in blogic_inthandler()
2936 if (adapter->firstccb != NULL) in blogic_inthandler()
2939 Reset the Host Adapter if requested. in blogic_inthandler()
2941 if (adapter->adapter_extreset) { in blogic_inthandler()
2942 blogic_warn("Resetting %s due to External SCSI Bus Reset\n", adapter, adapter->full_model); in blogic_inthandler()
2943 blogic_inc_count(&adapter->ext_resets); in blogic_inthandler()
2945 adapter->adapter_extreset = false; in blogic_inthandler()
2946 } else if (adapter->adapter_intern_err) { in blogic_inthandler()
2947 blogic_warn("Resetting %s due to Host Adapter Internal Error\n", adapter, adapter->full_model); in blogic_inthandler()
2948 blogic_inc_count(&adapter->adapter_intern_errors); in blogic_inthandler()
2950 adapter->adapter_intern_err = false; in blogic_inthandler()
2953 Release exclusive access to Host Adapter. in blogic_inthandler()
2955 spin_unlock_irqrestore(adapter->scsi_host->host_lock, processor_flag); in blogic_inthandler()
2962 Mailbox for execution by Host Adapter. The Host Adapter's Lock should
2971 next_outbox = adapter->next_outbox; in blogic_write_outbox()
2972 if (next_outbox->action == BLOGIC_OUTBOX_FREE) { in blogic_write_outbox()
2973 ccb->status = BLOGIC_CCB_ACTIVE; in blogic_write_outbox()
2976 since the Host Adapter is operating asynchronously and the in blogic_write_outbox()
2978 by the Host Adapter. in blogic_write_outbox()
2980 next_outbox->ccb = ccb->dma_handle; in blogic_write_outbox()
2981 next_outbox->action = action; in blogic_write_outbox()
2983 if (++next_outbox > adapter->last_outbox) in blogic_write_outbox()
2984 next_outbox = adapter->first_outbox; in blogic_write_outbox()
2985 adapter->next_outbox = next_outbox; in blogic_write_outbox()
2987 adapter->active_cmds[ccb->tgt_id]++; in blogic_write_outbox()
2988 if (ccb->opcode != BLOGIC_BDR) in blogic_write_outbox()
2989 adapter->tgt_stats[ccb->tgt_id].cmds_tried++; in blogic_write_outbox()
3001 (struct blogic_adapter *) SCpnt->device->host->hostdata; in blogic_hostreset()
3003 unsigned int id = SCpnt->device->id; in blogic_hostreset()
3004 struct blogic_tgt_stats *stats = &adapter->tgt_stats[id]; in blogic_hostreset()
3007 spin_lock_irq(SCpnt->device->host->host_lock); in blogic_hostreset()
3009 blogic_inc_count(&stats->adapter_reset_req); in blogic_hostreset()
3012 spin_unlock_irq(SCpnt->device->host->host_lock); in blogic_hostreset()
3017 blogic_qcmd creates a CCB for Command and places it into an
3018 Outgoing Mailbox for execution by the associated Host Adapter.
3021 static int blogic_qcmd_lck(struct scsi_cmnd *command, in blogic_qcmd_lck() argument
3025 (struct blogic_adapter *) command->device->host->hostdata; in blogic_qcmd_lck()
3027 &adapter->tgt_flags[command->device->id]; in blogic_qcmd_lck()
3028 struct blogic_tgt_stats *tgt_stats = adapter->tgt_stats; in blogic_qcmd_lck()
3029 unsigned char *cdb = command->cmnd; in blogic_qcmd_lck()
3030 int cdblen = command->cmd_len; in blogic_qcmd_lck()
3031 int tgt_id = command->device->id; in blogic_qcmd_lck()
3032 int lun = command->device->lun; in blogic_qcmd_lck()
3033 int buflen = scsi_bufflen(command); in blogic_qcmd_lck()
3040 Host Adapter for any errors, so they should not be executed in blogic_qcmd_lck()
3044 if (cdb[0] == REQUEST_SENSE && command->sense_buffer[0] != 0) { in blogic_qcmd_lck()
3045 command->result = DID_OK << 16; in blogic_qcmd_lck()
3046 comp_cb(command); in blogic_qcmd_lck()
3050 Allocate a CCB from the Host Adapter's free list. In the unlikely in blogic_qcmd_lck()
3052 wait 1 second and try again. If that fails, the Host Adapter is in blogic_qcmd_lck()
3053 probably hung so signal an error as a Host Adapter Hard Reset in blogic_qcmd_lck()
3058 spin_unlock_irq(adapter->scsi_host->host_lock); in blogic_qcmd_lck()
3060 spin_lock_irq(adapter->scsi_host->host_lock); in blogic_qcmd_lck()
3063 command->result = DID_ERROR << 16; in blogic_qcmd_lck()
3064 comp_cb(command); in blogic_qcmd_lck()
3070 Initialize the fields in the BusLogic Command Control Block (CCB). in blogic_qcmd_lck()
3072 count = scsi_dma_map(command); in blogic_qcmd_lck()
3078 ccb->opcode = BLOGIC_INITIATOR_CCB_SG; in blogic_qcmd_lck()
3079 ccb->datalen = count * sizeof(struct blogic_sg_seg); in blogic_qcmd_lck()
3081 ccb->data = (unsigned int) ccb->dma_handle + in blogic_qcmd_lck()
3082 ((unsigned long) &ccb->sglist - in blogic_qcmd_lck()
3085 ccb->data = virt_to_32bit_virt(ccb->sglist); in blogic_qcmd_lck()
3087 scsi_for_each_sg(command, sg, count, i) { in blogic_qcmd_lck()
3088 ccb->sglist[i].segbytes = sg_dma_len(sg); in blogic_qcmd_lck()
3089 ccb->sglist[i].segdata = sg_dma_address(sg); in blogic_qcmd_lck()
3092 ccb->opcode = BLOGIC_INITIATOR_CCB; in blogic_qcmd_lck()
3093 ccb->datalen = buflen; in blogic_qcmd_lck()
3094 ccb->data = 0; in blogic_qcmd_lck()
3100 ccb->datadir = BLOGIC_DATAIN_CHECKED; in blogic_qcmd_lck()
3107 ccb->datadir = BLOGIC_DATAOUT_CHECKED; in blogic_qcmd_lck()
3113 ccb->datadir = BLOGIC_UNCHECKED_TX; in blogic_qcmd_lck()
3116 ccb->cdblen = cdblen; in blogic_qcmd_lck()
3117 ccb->adapter_status = 0; in blogic_qcmd_lck()
3118 ccb->tgt_status = 0; in blogic_qcmd_lck()
3119 ccb->tgt_id = tgt_id; in blogic_qcmd_lck()
3120 ccb->lun = lun; in blogic_qcmd_lck()
3121 ccb->tag_enable = false; in blogic_qcmd_lck()
3122 ccb->legacytag_enable = false; in blogic_qcmd_lck()
3126 Tagged Queue fashion so that the Host Adapter and Target Device in blogic_qcmd_lck()
3135 from non-tagged to tagged commands, so it is necessary to wait in blogic_qcmd_lck()
3139 if (adapter->cmds_since_rst[tgt_id]++ >= BLOGIC_MAX_TAG_DEPTH && in blogic_qcmd_lck()
3140 !tgt_flags->tagq_active && in blogic_qcmd_lck()
3141 adapter->active_cmds[tgt_id] == 0 in blogic_qcmd_lck()
3142 && tgt_flags->tagq_ok && in blogic_qcmd_lck()
3143 (adapter->tagq_ok & (1 << tgt_id))) { in blogic_qcmd_lck()
3144 tgt_flags->tagq_active = true; in blogic_qcmd_lck()
3148 if (tgt_flags->tagq_active) { in blogic_qcmd_lck()
3153 a queued command will not remain in a disconnected state in blogic_qcmd_lck()
3160 last sequence point, this command will be issued with an in blogic_qcmd_lck()
3163 queued commands before this command may be executed. in blogic_qcmd_lck()
3165 if (adapter->active_cmds[tgt_id] == 0) in blogic_qcmd_lck()
3166 adapter->last_seqpoint[tgt_id] = jiffies; in blogic_qcmd_lck()
3168 adapter->last_seqpoint[tgt_id] + 4 * HZ)) { in blogic_qcmd_lck()
3169 adapter->last_seqpoint[tgt_id] = jiffies; in blogic_qcmd_lck()
3172 if (adapter->ext_lun) { in blogic_qcmd_lck()
3173 ccb->tag_enable = true; in blogic_qcmd_lck()
3174 ccb->queuetag = queuetag; in blogic_qcmd_lck()
3176 ccb->legacytag_enable = true; in blogic_qcmd_lck()
3177 ccb->legacy_tag = queuetag; in blogic_qcmd_lck()
3180 memcpy(ccb->cdb, cdb, cdblen); in blogic_qcmd_lck()
3181 ccb->sense_datalen = SCSI_SENSE_BUFFERSIZE; in blogic_qcmd_lck()
3182 ccb->command = command; in blogic_qcmd_lck()
3183 sense_buf = dma_map_single(&adapter->pci_device->dev, in blogic_qcmd_lck()
3184 command->sense_buffer, ccb->sense_datalen, in blogic_qcmd_lck()
3186 if (dma_mapping_error(&adapter->pci_device->dev, sense_buf)) { in blogic_qcmd_lck()
3192 ccb->sensedata = sense_buf; in blogic_qcmd_lck()
3193 command->scsi_done = comp_cb; in blogic_qcmd_lck()
3201 again. If that fails, the Host Adapter is probably hung in blogic_qcmd_lck()
3202 so signal an error as a Host Adapter Hard Reset should in blogic_qcmd_lck()
3206 spin_unlock_irq(adapter->scsi_host->host_lock); in blogic_qcmd_lck()
3207 blogic_warn("Unable to write Outgoing Mailbox - Pausing for 1 second\n", adapter); in blogic_qcmd_lck()
3209 spin_lock_irq(adapter->scsi_host->host_lock); in blogic_qcmd_lck()
3212 blogic_warn("Still unable to write Outgoing Mailbox - Host Adapter Dead?\n", adapter); in blogic_qcmd_lck()
3214 command->result = DID_ERROR << 16; in blogic_qcmd_lck()
3215 command->scsi_done(command); in blogic_qcmd_lck()
3223 ccb->status = BLOGIC_CCB_ACTIVE; in blogic_qcmd_lck()
3224 adapter->active_cmds[tgt_id]++; in blogic_qcmd_lck()
3226 FlashPoint_StartCCB(adapter->cardhandle, ccb); in blogic_qcmd_lck()
3228 The Command may have already completed and in blogic_qcmd_lck()
3232 if (ccb->status == BLOGIC_CCB_COMPLETE) in blogic_qcmd_lck()
3242 blogic_abort aborts Command if possible. in DEF_SCSI_QCMD()
3245 static int blogic_abort(struct scsi_cmnd *command) in DEF_SCSI_QCMD()
3248 (struct blogic_adapter *) command->device->host->hostdata; in DEF_SCSI_QCMD()
3250 int tgt_id = command->device->id; in DEF_SCSI_QCMD()
3252 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_request); in DEF_SCSI_QCMD()
3255 Attempt to find an Active CCB for this Command. If no Active in DEF_SCSI_QCMD()
3256 CCB for this Command is found, then no Abort is necessary. in DEF_SCSI_QCMD()
3258 for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all) in DEF_SCSI_QCMD()
3259 if (ccb->command == command) in DEF_SCSI_QCMD()
3262 blogic_warn("Unable to Abort Command to Target %d - No CCB Found\n", adapter, tgt_id); in DEF_SCSI_QCMD()
3264 } else if (ccb->status == BLOGIC_CCB_COMPLETE) { in DEF_SCSI_QCMD()
3265 blogic_warn("Unable to Abort Command to Target %d - CCB Completed\n", adapter, tgt_id); in DEF_SCSI_QCMD()
3267 } else if (ccb->status == BLOGIC_CCB_RESET) { in DEF_SCSI_QCMD()
3268 blogic_warn("Unable to Abort Command to Target %d - CCB Reset\n", adapter, tgt_id); in DEF_SCSI_QCMD()
3275 generate the non-tagged Abort message. Since non-tagged in DEF_SCSI_QCMD()
3276 commands are not sent by the Host Adapter until the queue in DEF_SCSI_QCMD()
3278 Abort message is treated as a non-tagged command, it is in DEF_SCSI_QCMD()
3284 if (adapter->tgt_flags[tgt_id].tagq_active && in DEF_SCSI_QCMD()
3285 adapter->fw_ver[0] < '5') { in DEF_SCSI_QCMD()
3286 …blogic_warn("Unable to Abort CCB #%ld to Target %d - Abort Tag Not Supported\n", adapter, ccb->ser… in DEF_SCSI_QCMD()
3291 adapter, ccb->serial, tgt_id); in DEF_SCSI_QCMD()
3292 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried); in DEF_SCSI_QCMD()
3295 …blogic_warn("Unable to Abort CCB #%ld to Target %d - No Outgoing Mailboxes\n", adapter, ccb->seria… in DEF_SCSI_QCMD()
3304 ccb->serial, tgt_id); in DEF_SCSI_QCMD()
3305 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried); in DEF_SCSI_QCMD()
3306 FlashPoint_AbortCCB(adapter->cardhandle, ccb); in DEF_SCSI_QCMD()
3312 if (ccb->status == BLOGIC_CCB_COMPLETE) in DEF_SCSI_QCMD()
3321 blogic_resetadapter resets Host Adapter if possible, marking all
3331 * Attempt to Reset and Reinitialize the Host Adapter.
3337 adapter->full_model);
3345 for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
3346 if (ccb->status == BLOGIC_CCB_ACTIVE)
3349 * Wait a few seconds between the Host Adapter Hard Reset which
3356 spin_unlock_irq(adapter->scsi_host->host_lock);
3357 blogic_delay(adapter->bus_settle_time);
3358 spin_lock_irq(adapter->scsi_host->host_lock);
3361 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
3362 adapter->last_resettried[tgt_id] = jiffies;
3363 adapter->last_resetdone[tgt_id] = jiffies;
3374 may be enabled in AutoSCSI on FlashPoint Host Adapters and on "W" and "C"
3375 series MultiMaster Host Adapters, or by a dip switch setting on "S" and "A"
3376 series MultiMaster Host Adapters. With Extended Translation enabled, drives
3389 (struct blogic_adapter *) sdev->host->hostdata; in blogic_diskparam()
3393 if (adapter->ext_trans_enable && capacity >= 2 * 1024 * 1024 /* 1 GB in 512 byte sectors */) { in blogic_diskparam()
3395 diskparam->heads = 255; in blogic_diskparam()
3396 diskparam->sectors = 63; in blogic_diskparam()
3398 diskparam->heads = 128; in blogic_diskparam()
3399 diskparam->sectors = 32; in blogic_diskparam()
3402 diskparam->heads = 64; in blogic_diskparam()
3403 diskparam->sectors = 32; in blogic_diskparam()
3405 diskparam->cylinders = (unsigned long) capacity / (diskparam->heads * diskparam->sectors); in blogic_diskparam()
3418 int saved_cyl = diskparam->cylinders, part_no; in blogic_diskparam()
3422 part_end_head = part_entry->end_head; in blogic_diskparam()
3423 part_end_sector = part_entry->end_sector & 0x3F; in blogic_diskparam()
3424 if (part_end_head == 64 - 1) { in blogic_diskparam()
3425 diskparam->heads = 64; in blogic_diskparam()
3426 diskparam->sectors = 32; in blogic_diskparam()
3428 } else if (part_end_head == 128 - 1) { in blogic_diskparam()
3429 diskparam->heads = 128; in blogic_diskparam()
3430 diskparam->sectors = 32; in blogic_diskparam()
3432 } else if (part_end_head == 255 - 1) { in blogic_diskparam()
3433 diskparam->heads = 255; in blogic_diskparam()
3434 diskparam->sectors = 63; in blogic_diskparam()
3440 part_end_head = part1_entry->end_head; in blogic_diskparam()
3441 part_end_sector = part1_entry->end_sector & 0x3F; in blogic_diskparam()
3443 diskparam->cylinders = (unsigned long) capacity / (diskparam->heads * diskparam->sectors); in blogic_diskparam()
3444 if (part_no < 4 && part_end_sector == diskparam->sectors) { in blogic_diskparam()
3445 if (diskparam->cylinders != saved_cyl) in blogic_diskparam()
3446 …n("Adopting Geometry %d/%d from Partition Table\n", adapter, diskparam->heads, diskparam->sectors); in blogic_diskparam()
3449 …arn("not compatible with current BusLogic Host Adapter Geometry %d/%d\n", adapter, diskparam->head… in blogic_diskparam()
3465 (struct blogic_adapter *) shost->hostdata; in blogic_write_info()
3468 tgt_stats = adapter->tgt_stats; in blogic_write_info()
3469 adapter->ext_resets = 0; in blogic_write_info()
3470 adapter->adapter_intern_errors = 0; in blogic_write_info()
3477 struct blogic_adapter *adapter = (struct blogic_adapter *) shost->hostdata; in blogic_show_info()
3481 tgt_stats = adapter->tgt_stats; in blogic_show_info()
3482 seq_write(m, adapter->msgbuf, adapter->msgbuflen); in blogic_show_info()
3485 Currently Allocated CCBs: %d\n", adapter->drvr_qdepth, adapter->alloc_ccbs); in blogic_show_info()
3491 for (tgt = 0; tgt < adapter->maxdev; tgt++) { in blogic_show_info()
3492 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt]; in blogic_show_info()
3493 if (!tgt_flags->tgt_exists) in blogic_show_info()
3495 …seq_printf(m, " %2d %s", tgt, (tgt_flags->tagq_ok ? (tgt_flags->tagq_active ? " Active" : (ada… in blogic_show_info()
3499 …" %3d %3u %9u %9u\n", adapter->qdepth[tgt], adapter->active_cmds[tgt], tgt_stats[tgt]… in blogic_show_info()
3504 for (tgt = 0; tgt < adapter->maxdev; tgt++) { in blogic_show_info()
3505 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt]; in blogic_show_info()
3506 if (!tgt_flags->tgt_exists) in blogic_show_info()
3519 Target Command 0-1KB 1-2KB 2-4KB 4-8KB 8-16KB\n\ in blogic_show_info()
3521 for (tgt = 0; tgt < adapter->maxdev; tgt++) { in blogic_show_info()
3522 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt]; in blogic_show_info()
3523 if (!tgt_flags->tgt_exists) in blogic_show_info()
3535 Target Command 16-32KB 32-64KB 64-128KB 128-256KB 256KB+\n\ in blogic_show_info()
3537 for (tgt = 0; tgt < adapter->maxdev; tgt++) { in blogic_show_info()
3538 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt]; in blogic_show_info()
3539 if (!tgt_flags->tgt_exists) in blogic_show_info()
3553 Command Aborts Bus Device Resets Host Adapter Resets\n\ in blogic_show_info()
3557 for (tgt = 0; tgt < adapter->maxdev; tgt++) { in blogic_show_info()
3558 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt]; in blogic_show_info()
3559 if (!tgt_flags->tgt_exists) in blogic_show_info()
3572 seq_printf(m, "\nExternal Host Adapter Resets: %d\n", adapter->ext_resets); in blogic_show_info()
3573 seq_printf(m, "Host Adapter Internal Errors: %d\n", adapter->adapter_intern_errors); in blogic_show_info()
3595 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf); in blogic_msg()
3596 adapter->msgbuflen += len; in blogic_msg()
3600 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf); in blogic_msg()
3601 adapter->msgbuflen += len; in blogic_msg()
3604 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf); in blogic_msg()
3609 if (adapter != NULL && adapter->adapter_initd) in blogic_msg()
3610 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf); in blogic_msg()
3616 begin = (buf[len - 1] == '\n'); in blogic_msg()
3632 strch += 'a' - 'Z'; in blogic_parse()
3634 keywordch += 'a' - 'Z'; in blogic_parse()
3647 BusLogic Driver Options may be specified either via the Linux Kernel Command
3649 for multiple host adapters may be specified either by separating the option
3651 command line. Individual option specifications for a single host adapter are
3652 separated by commas. The Probing and Debugging Options apply to all host
3654 selected host adapter.
3718 drvr_opts->qdepth[tgt_id] = qdepth; in blogic_parseopts()
3740 drvr_opts->common_qdepth = qdepth; in blogic_parseopts()
3742 drvr_opts->qdepth[tgt_id] = qdepth; in blogic_parseopts()
3746 drvr_opts->tagq_ok = 0x0000; in blogic_parseopts()
3747 drvr_opts->tagq_ok_mask = 0x0000; in blogic_parseopts()
3749 drvr_opts->tagq_ok = 0xFFFF; in blogic_parseopts()
3750 drvr_opts->tagq_ok_mask = 0xFFFF; in blogic_parseopts()
3752 drvr_opts->tagq_ok = 0x0000; in blogic_parseopts()
3753 drvr_opts->tagq_ok_mask = 0xFFFF; in blogic_parseopts()
3761 drvr_opts->tagq_ok |= tgt_bit; in blogic_parseopts()
3762 drvr_opts->tagq_ok_mask |= tgt_bit; in blogic_parseopts()
3765 drvr_opts->tagq_ok &= ~tgt_bit; in blogic_parseopts()
3766 drvr_opts->tagq_ok_mask |= tgt_bit; in blogic_parseopts()
3771 options--; in blogic_parseopts()
3786 drvr_opts->bus_settle_time = bus_settle_time; in blogic_parseopts()
3789 drvr_opts->stop_tgt_inquiry = true; in blogic_parseopts()
3823 if (drvr_opts->qdepth[tgt_id] == 1) { in blogic_parseopts()
3825 drvr_opts->tagq_ok &= ~tgt_bit; in blogic_parseopts()
3826 drvr_opts->tagq_ok_mask |= tgt_bit; in blogic_parseopts()
3859 blogic_setup handles processing of Kernel Command Line Arguments.
3869 blogic_err("BusLogic: Obsolete Command Line Entry Format Ignored\n", NULL); in blogic_setup()