Lines Matching refs:adapter
135 static void blogic_announce_drvr(struct blogic_adapter *adapter)
137 blogic_announce("***** BusLogic SCSI Driver Version " blogic_drvr_version " of " blogic_drvr_date " *****\n", adapter);
138 blogic_announce("Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>\n", adapter);
149 struct blogic_adapter *adapter =
151 return adapter->full_model;
160 static void blogic_init_ccbs(struct blogic_adapter *adapter, void *blk_pointer,
170 ccb->adapter = adapter;
172 if (blogic_flashpoint_type(adapter)) {
174 ccb->base_addr = adapter->fpinfo.base_addr;
176 ccb->next = adapter->free_ccbs;
177 ccb->next_all = adapter->all_ccbs;
178 adapter->free_ccbs = ccb;
179 adapter->all_ccbs = ccb;
180 adapter->alloc_ccbs++;
191 static bool __init blogic_create_initccbs(struct blogic_adapter *adapter)
197 while (adapter->alloc_ccbs < adapter->initccbs) {
198 blk_pointer = dma_alloc_coherent(&adapter->pci_device->dev,
202 adapter);
205 blogic_init_ccbs(adapter, blk_pointer, blk_size, blkp);
215 static void blogic_destroy_ccbs(struct blogic_adapter *adapter)
217 struct blogic_ccb *next_ccb = adapter->all_ccbs, *ccb, *lastccb = NULL;
218 adapter->all_ccbs = NULL;
219 adapter->free_ccbs = NULL;
224 dma_free_coherent(&adapter->pci_device->dev,
231 dma_free_coherent(&adapter->pci_device->dev,
244 static void blogic_create_addlccbs(struct blogic_adapter *adapter,
248 int prev_alloc = adapter->alloc_ccbs;
253 while (adapter->alloc_ccbs - prev_alloc < addl_ccbs) {
254 blk_pointer = dma_alloc_coherent(&adapter->pci_device->dev,
258 blogic_init_ccbs(adapter, blk_pointer, blk_size, blkp);
260 if (adapter->alloc_ccbs > prev_alloc) {
262 blogic_notice("Allocated %d additional CCBs (total now %d)\n", adapter, adapter->alloc_ccbs - prev_alloc, adapter->alloc_ccbs);
265 blogic_notice("Failed to allocate additional CCBs\n", adapter);
266 if (adapter->drvr_qdepth > adapter->alloc_ccbs - adapter->tgt_count) {
267 adapter->drvr_qdepth = adapter->alloc_ccbs - adapter->tgt_count;
268 adapter->scsi_host->can_queue = adapter->drvr_qdepth;
278 static struct blogic_ccb *blogic_alloc_ccb(struct blogic_adapter *adapter)
282 ccb = adapter->free_ccbs;
285 adapter->free_ccbs = ccb->next;
287 if (adapter->free_ccbs == NULL)
288 blogic_create_addlccbs(adapter, adapter->inc_ccbs,
292 blogic_create_addlccbs(adapter, adapter->inc_ccbs, true);
293 ccb = adapter->free_ccbs;
297 adapter->free_ccbs = ccb->next;
311 struct blogic_adapter *adapter = ccb->adapter;
316 dma_unmap_single(&adapter->pci_device->dev, ccb->sensedata,
321 ccb->next = adapter->free_ccbs;
322 adapter->free_ccbs = ccb;
327 blogic_cmd sends the command opcode to adapter, optionally
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
344 static int blogic_cmd(struct blogic_adapter *adapter, enum blogic_opcode opcode,
361 must be disabled while issuing host adapter commands since a
366 if (!adapter->irq_acquired)
375 statusreg.all = blogic_rdstatus(adapter);
389 adapter->adapter_cmd_complete = false;
390 blogic_setcmdparam(adapter, opcode);
412 intreg.all = blogic_rdint(adapter);
413 statusreg.all = blogic_rdstatus(adapter);
416 if (adapter->adapter_cmd_complete)
422 blogic_setcmdparam(adapter, *param_p++);
436 statusreg.all = blogic_rdstatus(adapter);
444 blogic_notice("blogic_cmd(%02X) Status = %02X: (Modify I/O Address)\n", adapter, opcode, statusreg.all);
470 intreg.all = blogic_rdint(adapter);
471 statusreg.all = blogic_rdstatus(adapter);
474 if (adapter->adapter_cmd_complete)
478 *reply_p++ = blogic_rddatain(adapter);
480 blogic_rddatain(adapter);
496 blogic_intreset(adapter);
503 adapter, opcode, statusreg.all, replylen,
508 blogic_notice(" %02X", adapter,
510 blogic_notice("\n", adapter);
526 statusreg.all = blogic_rdstatus(adapter);
534 blogic_softreset(adapter);
558 if (!adapter->irq_acquired)
589 static void __init blogic_init_probeinfo_isa(struct blogic_adapter *adapter)
662 static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter)
680 enumerated host adapter, determine whether its ISA Compatible
682 Primary I/O Address. A host adapter that is assigned the
684 The MultiMaster BIOS will first recognize a host adapter at
687 standard ISA I/O Addresses. When a PCI host adapter is found
696 struct blogic_adapter *host_adapter = adapter;
827 and if that host adapter is a BT-948/958/958D, then the
929 static int __init blogic_init_fp_probeinfo(struct blogic_adapter *adapter)
1021 static void __init blogic_init_probeinfo_list(struct blogic_adapter *adapter)
1030 blogic_init_mm_probeinfo(adapter);
1031 blogic_init_fp_probeinfo(adapter);
1033 blogic_init_fp_probeinfo(adapter);
1034 blogic_init_mm_probeinfo(adapter);
1036 int fpcount = blogic_init_fp_probeinfo(adapter);
1037 int mmcount = blogic_init_mm_probeinfo(adapter);
1041 struct blogic_adapter *myadapter = adapter;
1082 blogic_init_probeinfo_isa(adapter);
1088 #define blogic_init_probeinfo_list(adapter) \
1089 blogic_init_probeinfo_isa(adapter)
1097 static bool blogic_failure(struct blogic_adapter *adapter, char *msg)
1099 blogic_announce_drvr(adapter);
1100 if (adapter->adapter_bus_type == BLOGIC_PCI_BUS) {
1102 adapter);
1103 blogic_err("Bus %d Device %d I/O Address 0x%lX PCI Address 0x%lX:\n", adapter, adapter->bus, adapter->dev, adapter->io_addr, adapter->pci_addr);
1105 blogic_err("While configuring BusLogic Host Adapter at I/O Address 0x%lX:\n", adapter, adapter->io_addr);
1106 blogic_err("%s FAILED - DETACHING\n", adapter, msg);
1108 blogic_err("ADDITIONAL FAILURE INFO - %s\n", adapter,
1118 static bool __init blogic_probe(struct blogic_adapter *adapter)
1126 if (blogic_flashpoint_type(adapter)) {
1127 struct fpoint_info *fpinfo = &adapter->fpinfo;
1128 fpinfo->base_addr = (u32) adapter->io_addr;
1129 fpinfo->irq_ch = adapter->irq_ch;
1133 blogic_err("BusLogic: FlashPoint Host Adapter detected at PCI Bus %d Device %d\n", adapter, adapter->bus, adapter->dev);
1134 blogic_err("BusLogic: I/O Address 0x%lX PCI Address 0x%lX, but FlashPoint\n", adapter, adapter->io_addr, adapter->pci_addr);
1135 blogic_err("BusLogic: Probe Function failed to validate it.\n", adapter);
1139 blogic_notice("BusLogic_Probe(0x%lX): FlashPoint Found\n", adapter, adapter->io_addr);
1152 statusreg.all = blogic_rdstatus(adapter);
1153 intreg.all = blogic_rdint(adapter);
1154 georeg.all = blogic_rdgeom(adapter);
1156 blogic_notice("BusLogic_Probe(0x%lX): Status 0x%02X, Interrupt 0x%02X, Geometry 0x%02X\n", adapter, adapter->io_addr, statusreg.all, intreg.all, georeg.all);
1194 static bool blogic_hwreset(struct blogic_adapter *adapter, bool hard_reset)
1202 if (blogic_flashpoint_type(adapter)) {
1203 struct fpoint_info *fpinfo = &adapter->fpinfo;
1206 adapter->cardhandle =
1208 if (adapter->cardhandle == (void *)FPOINT_BADCARD_HANDLE)
1221 blogic_hardreset(adapter);
1223 blogic_softreset(adapter);
1229 statusreg.all = blogic_rdstatus(adapter);
1235 blogic_notice("BusLogic_HardwareReset(0x%lX): Diagnostic Active, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1249 statusreg.all = blogic_rdstatus(adapter);
1255 blogic_notice("BusLogic_HardwareReset(0x%lX): Diagnostic Completed, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1264 statusreg.all = blogic_rdstatus(adapter);
1271 blogic_notice("BusLogic_HardwareReset(0x%lX): Host Adapter Ready, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1282 blogic_failure(adapter, "HARD RESET DIAGNOSTICS");
1283 blogic_err("HOST ADAPTER STATUS REGISTER = %02X\n", adapter,
1286 blogic_err("HOST ADAPTER ERROR CODE = %d\n", adapter,
1287 blogic_rddatain(adapter));
1302 static bool __init blogic_checkadapter(struct blogic_adapter *adapter)
1310 if (blogic_flashpoint_type(adapter))
1319 if (blogic_cmd(adapter, BLOGIC_INQ_EXTSETUP, &req_replylen,
1327 blogic_notice("BusLogic_Check(0x%lX): MultiMaster %s\n", adapter,
1328 adapter->io_addr,
1339 static bool __init blogic_rdconfig(struct blogic_adapter *adapter)
1361 if (blogic_flashpoint_type(adapter)) {
1362 struct fpoint_info *fpinfo = &adapter->fpinfo;
1363 tgt = adapter->model;
1370 strcpy(adapter->fw_ver, FLASHPOINT_FW_VER);
1371 adapter->scsi_id = fpinfo->scsi_id;
1372 adapter->ext_trans_enable = fpinfo->ext_trans_enable;
1373 adapter->parity = fpinfo->parity;
1374 adapter->reset_enabled = !fpinfo->softreset;
1375 adapter->level_int = true;
1376 adapter->wide = fpinfo->wide;
1377 adapter->differential = false;
1378 adapter->scam = true;
1379 adapter->ultra = true;
1380 adapter->ext_lun = true;
1381 adapter->terminfo_valid = true;
1382 adapter->low_term = fpinfo->low_term;
1383 adapter->high_term = fpinfo->high_term;
1384 adapter->scam_enabled = fpinfo->scam_enabled;
1385 adapter->scam_lev2 = fpinfo->scam_lev2;
1386 adapter->drvr_sglimit = BLOGIC_SG_LIMIT;
1387 adapter->maxdev = (adapter->wide ? 16 : 8);
1388 adapter->maxlun = 32;
1389 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE;
1390 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE;
1391 adapter->drvr_qdepth = 255;
1392 adapter->adapter_qdepth = adapter->drvr_qdepth;
1393 adapter->sync_ok = fpinfo->sync_ok;
1394 adapter->fast_ok = fpinfo->fast_ok;
1395 adapter->ultra_ok = fpinfo->ultra_ok;
1396 adapter->wide_ok = fpinfo->wide_ok;
1397 adapter->discon_ok = fpinfo->discon_ok;
1398 adapter->tagq_ok = 0xFFFF;
1404 if (blogic_cmd(adapter, BLOGIC_GET_BOARD_ID, NULL, 0, &id,
1406 return blogic_failure(adapter, "INQUIRE BOARD ID");
1410 if (blogic_cmd(adapter, BLOGIC_INQ_CONFIG, NULL, 0, &config,
1413 return blogic_failure(adapter, "INQUIRE CONFIGURATION");
1418 if (blogic_cmd(adapter, BLOGIC_INQ_SETUPINFO, &req_replylen,
1421 return blogic_failure(adapter, "INQUIRE SETUP INFORMATION");
1426 if (blogic_cmd(adapter, BLOGIC_INQ_EXTSETUP, &req_replylen,
1429 return blogic_failure(adapter,
1436 if (blogic_cmd(adapter, BLOGIC_INQ_FWVER_D3, NULL, 0,
1439 return blogic_failure(adapter,
1457 if (blogic_cmd(adapter, BLOGIC_INQ_MODELNO, &req_replylen,
1460 return blogic_failure(adapter,
1483 tgt = adapter->model;
1497 tgt = adapter->fw_ver;
1507 if (strcmp(adapter->fw_ver, "3.3") >= 0) {
1508 if (blogic_cmd(adapter, BLOGIC_INQ_FWVER_LETTER, NULL, 0,
1511 return blogic_failure(adapter,
1520 adapter->scsi_id = config.id;
1526 adapter->adapter_bus_type =
1527 blogic_adater_bus_types[adapter->model[3] - '4'];
1528 if (adapter->irq_ch == 0) {
1530 adapter->irq_ch = 9;
1532 adapter->irq_ch = 10;
1534 adapter->irq_ch = 11;
1536 adapter->irq_ch = 12;
1538 adapter->irq_ch = 14;
1540 adapter->irq_ch = 15;
1542 if (adapter->adapter_bus_type == BLOGIC_ISA_BUS) {
1544 adapter->dma_ch = 5;
1546 adapter->dma_ch = 6;
1548 adapter->dma_ch = 7;
1554 georeg.all = blogic_rdgeom(adapter);
1555 adapter->ext_trans_enable = georeg.gr.ext_trans_enable;
1561 adapter->adapter_sglimit = ext_setupinfo.sg_limit;
1562 adapter->drvr_sglimit = adapter->adapter_sglimit;
1563 if (adapter->adapter_sglimit > BLOGIC_SG_LIMIT)
1564 adapter->drvr_sglimit = BLOGIC_SG_LIMIT;
1566 adapter->level_int = true;
1567 adapter->wide = ext_setupinfo.wide;
1568 adapter->differential = ext_setupinfo.differential;
1569 adapter->scam = ext_setupinfo.scam;
1570 adapter->ultra = ext_setupinfo.ultra;
1575 if (adapter->fw_ver[0] == '5' || (adapter->fw_ver[0] == '4' &&
1576 adapter->wide))
1577 adapter->ext_lun = true;
1582 if (adapter->fw_ver[0] == '5') {
1583 if (blogic_cmd(adapter, BLOGIC_INQ_PCI_INFO, NULL, 0,
1586 return blogic_failure(adapter,
1593 adapter->terminfo_valid = true;
1594 adapter->low_term = adapter_info.low_term;
1595 adapter->high_term = adapter_info.high_term;
1602 if (adapter->fw_ver[0] >= '4') {
1605 if (blogic_cmd(adapter, BLOGIC_FETCH_LOCALRAM, &fetch_localram,
1608 return blogic_failure(adapter,
1614 adapter->parity = autoscsi.parity;
1615 adapter->reset_enabled = autoscsi.reset_enabled;
1616 if (adapter->fw_ver[0] == '4') {
1617 adapter->terminfo_valid = true;
1618 adapter->low_term = autoscsi.low_term;
1619 adapter->high_term = autoscsi.high_term;
1626 adapter->wide_ok = autoscsi.wide_ok;
1627 adapter->fast_ok = autoscsi.fast_ok;
1628 adapter->sync_ok = autoscsi.sync_ok;
1629 adapter->discon_ok = autoscsi.discon_ok;
1630 if (adapter->ultra)
1631 adapter->ultra_ok = autoscsi.ultra_ok;
1632 if (adapter->scam) {
1633 adapter->scam_enabled = autoscsi.scam_enabled;
1634 adapter->scam_lev2 = autoscsi.scam_lev2;
1641 if (adapter->fw_ver[0] < '4') {
1643 adapter->sync_ok = 0xFF;
1644 if (adapter->adapter_bus_type == BLOGIC_EISA_BUS) {
1646 adapter->fast_ok = 0xFF;
1647 if (strcmp(adapter->model, "BT-757") == 0)
1648 adapter->wide_ok = 0xFF;
1651 adapter->discon_ok = 0xFF;
1652 adapter->parity = setupinfo.parity;
1653 adapter->reset_enabled = true;
1659 adapter->maxdev = (adapter->wide ? 16 : 8);
1660 adapter->maxlun = (adapter->ext_lun ? 32 : 8);
1686 if (adapter->fw_ver[0] == '5')
1687 adapter->adapter_qdepth = 192;
1688 else if (adapter->fw_ver[0] == '4')
1689 adapter->adapter_qdepth = (adapter->adapter_bus_type !=
1692 adapter->adapter_qdepth = 30;
1693 if (strcmp(adapter->fw_ver, "3.31") >= 0) {
1694 adapter->strict_rr = true;
1695 adapter->mbox_count = BLOGIC_MAX_MAILBOX;
1697 adapter->strict_rr = false;
1698 adapter->mbox_count = 32;
1700 adapter->drvr_qdepth = adapter->mbox_count;
1701 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE;
1702 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE;
1710 adapter->tagq_ok = 0;
1711 switch (adapter->fw_ver[0]) {
1713 adapter->tagq_ok = 0xFFFF;
1716 if (strcmp(adapter->fw_ver, "4.22") >= 0)
1717 adapter->tagq_ok = 0xFFFF;
1720 if (strcmp(adapter->fw_ver, "3.35") >= 0)
1721 adapter->tagq_ok = 0xFFFF;
1729 adapter->bios_addr = ext_setupinfo.bios_addr << 12;
1734 if (adapter->adapter_bus_type == BLOGIC_ISA_BUS &&
1736 adapter->need_bouncebuf = true;
1746 if (adapter->bios_addr > 0 && strcmp(adapter->model, "BT-445S") == 0 &&
1747 strcmp(adapter->fw_ver, "3.37") < 0 &&
1749 adapter->need_bouncebuf = true;
1758 strcpy(adapter->full_model, "BusLogic ");
1759 strcat(adapter->full_model, adapter->model);
1769 if (adapter->drvr_opts != NULL &&
1770 adapter->drvr_opts->qdepth[tgt_id] > 0)
1771 qdepth = adapter->drvr_opts->qdepth[tgt_id];
1772 else if (adapter->need_bouncebuf)
1774 adapter->qdepth[tgt_id] = qdepth;
1776 if (adapter->need_bouncebuf)
1777 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH_BB;
1779 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH;
1780 if (adapter->drvr_opts != NULL)
1781 adapter->common_qdepth = adapter->drvr_opts->common_qdepth;
1782 if (adapter->common_qdepth > 0 &&
1783 adapter->common_qdepth < adapter->untag_qdepth)
1784 adapter->untag_qdepth = adapter->common_qdepth;
1790 adapter->tagq_ok &= adapter->discon_ok;
1795 if (adapter->drvr_opts != NULL)
1796 adapter->tagq_ok = (adapter->drvr_opts->tagq_ok &
1797 adapter->drvr_opts->tagq_ok_mask) |
1798 (adapter->tagq_ok & ~adapter->drvr_opts->tagq_ok_mask);
1805 if (adapter->drvr_opts != NULL &&
1806 adapter->drvr_opts->bus_settle_time > 0)
1807 adapter->bus_settle_time = adapter->drvr_opts->bus_settle_time;
1809 adapter->bus_settle_time = BLOGIC_BUS_SETTLE_TIME;
1822 static bool __init blogic_reportconfig(struct blogic_adapter *adapter)
1824 unsigned short alltgt_mask = (1 << adapter->maxdev) - 1;
1839 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" : ""));
1840 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"));
1841 if (adapter->adapter_bus_type != BLOGIC_PCI_BUS) {
1842 blogic_info(" DMA Channel: ", adapter);
1843 if (adapter->dma_ch > 0)
1844 blogic_info("%d, ", adapter, adapter->dma_ch);
1846 blogic_info("None, ", adapter);
1847 if (adapter->bios_addr > 0)
1848 blogic_info("BIOS Address: 0x%X, ", adapter,
1849 adapter->bios_addr);
1851 blogic_info("BIOS Address: None, ", adapter);
1853 blogic_info(" PCI Bus: %d, Device: %d, Address: ", adapter,
1854 adapter->bus, adapter->dev);
1855 if (adapter->pci_addr > 0)
1856 blogic_info("0x%lX, ", adapter, adapter->pci_addr);
1858 blogic_info("Unassigned, ", adapter);
1860 blogic_info("Host Adapter SCSI ID: %d\n", adapter, adapter->scsi_id);
1862 adapter, (adapter->parity ? "Enabled" : "Disabled"),
1863 (adapter->ext_trans_enable ? "Enabled" : "Disabled"));
1864 alltgt_mask &= ~(1 << adapter->scsi_id);
1865 sync_ok = adapter->sync_ok & alltgt_mask;
1866 fast_ok = adapter->fast_ok & alltgt_mask;
1867 ultra_ok = adapter->ultra_ok & alltgt_mask;
1868 if ((blogic_multimaster_type(adapter) &&
1869 (adapter->fw_ver[0] >= '4' ||
1870 adapter->adapter_bus_type == BLOGIC_EISA_BUS)) ||
1871 blogic_flashpoint_type(adapter)) {
1891 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1893 syncstr[adapter->scsi_id] = '#';
1894 syncstr[adapter->maxdev] = '\0';
1898 wide_ok = adapter->wide_ok & alltgt_mask;
1904 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1906 widestr[adapter->scsi_id] = '#';
1907 widestr[adapter->maxdev] = '\0';
1909 discon_ok = adapter->discon_ok & alltgt_mask;
1915 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1917 discon_str[adapter->scsi_id] = '#';
1918 discon_str[adapter->maxdev] = '\0';
1920 tagq_ok = adapter->tagq_ok & alltgt_mask;
1926 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1928 tagq_str[adapter->scsi_id] = '#';
1929 tagq_str[adapter->maxdev] = '\0';
1932 adapter, syncmsg, widemsg);
1933 blogic_info(" Disconnect/Reconnect: %s, Tagged Queuing: %s\n", adapter,
1935 if (blogic_multimaster_type(adapter)) {
1936 blogic_info(" Scatter/Gather Limit: %d of %d segments, Mailboxes: %d\n", adapter, adapter->drvr_sglimit, adapter->adapter_sglimit, adapter->mbox_count);
1937 blogic_info(" Driver Queue Depth: %d, Host Adapter Queue Depth: %d\n", adapter, adapter->drvr_qdepth, adapter->adapter_qdepth);
1939 blogic_info(" Driver Queue Depth: %d, Scatter/Gather Limit: %d segments\n", adapter, adapter->drvr_qdepth, adapter->drvr_sglimit);
1940 blogic_info(" Tagged Queue Depth: ", adapter);
1942 for (tgt_id = 1; tgt_id < adapter->maxdev; tgt_id++)
1943 if (adapter->qdepth[tgt_id] != adapter->qdepth[0]) {
1948 if (adapter->qdepth[0] > 0)
1949 blogic_info("%d", adapter, adapter->qdepth[0]);
1951 blogic_info("Automatic", adapter);
1953 blogic_info("Individual", adapter);
1954 blogic_info(", Untagged Queue Depth: %d\n", adapter,
1955 adapter->untag_qdepth);
1956 if (adapter->terminfo_valid) {
1957 if (adapter->wide)
1958 blogic_info(" SCSI Bus Termination: %s", adapter,
1959 (adapter->low_term ? (adapter->high_term ? "Both Enabled" : "Low Enabled") : (adapter->high_term ? "High Enabled" : "Both Disabled")));
1961 blogic_info(" SCSI Bus Termination: %s", adapter,
1962 (adapter->low_term ? "Enabled" : "Disabled"));
1963 if (adapter->scam)
1964 blogic_info(", SCAM: %s", adapter,
1965 (adapter->scam_enabled ? (adapter->scam_lev2 ? "Enabled, Level 2" : "Enabled, Level 1") : "Disabled"));
1966 blogic_info("\n", adapter);
1981 static bool __init blogic_getres(struct blogic_adapter *adapter)
1983 if (adapter->irq_ch == 0) {
1985 adapter);
1991 if (request_irq(adapter->irq_ch, blogic_inthandler, IRQF_SHARED,
1992 adapter->full_model, adapter) < 0) {
1994 adapter, adapter->irq_ch);
1997 adapter->irq_acquired = true;
2001 if (adapter->dma_ch > 0) {
2002 if (request_dma(adapter->dma_ch, adapter->full_model) < 0) {
2003 blogic_err("UNABLE TO ACQUIRE DMA CHANNEL %d - DETACHING\n", adapter, adapter->dma_ch);
2006 set_dma_mode(adapter->dma_ch, DMA_MODE_CASCADE);
2007 enable_dma(adapter->dma_ch);
2008 adapter->dma_chan_acquired = true;
2022 static void blogic_relres(struct blogic_adapter *adapter)
2027 if (adapter->irq_acquired)
2028 free_irq(adapter->irq_ch, adapter);
2032 if (adapter->dma_chan_acquired)
2033 free_dma(adapter->dma_ch);
2037 if (adapter->mbox_space)
2038 dma_free_coherent(&adapter->pci_device->dev, adapter->mbox_sz,
2039 adapter->mbox_space, adapter->mbox_space_handle);
2040 pci_dev_put(adapter->pci_device);
2041 adapter->mbox_space = NULL;
2042 adapter->mbox_space_handle = 0;
2043 adapter->mbox_sz = 0;
2053 static bool blogic_initadapter(struct blogic_adapter *adapter)
2064 adapter->firstccb = NULL;
2065 adapter->lastccb = NULL;
2072 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
2073 adapter->bdr_pend[tgt_id] = NULL;
2074 adapter->tgt_flags[tgt_id].tagq_active = false;
2075 adapter->tgt_flags[tgt_id].cmd_good = false;
2076 adapter->active_cmds[tgt_id] = 0;
2077 adapter->cmds_since_rst[tgt_id] = 0;
2083 if (blogic_flashpoint_type(adapter))
2089 adapter->mbox_sz = adapter->mbox_count * (sizeof(struct blogic_outbox) + sizeof(struct blogic_inbox));
2090 adapter->mbox_space = dma_alloc_coherent(&adapter->pci_device->dev,
2091 adapter->mbox_sz, &adapter->mbox_space_handle,
2093 if (adapter->mbox_space == NULL)
2094 return blogic_failure(adapter, "MAILBOX ALLOCATION");
2095 adapter->first_outbox = (struct blogic_outbox *) adapter->mbox_space;
2096 adapter->last_outbox = adapter->first_outbox + adapter->mbox_count - 1;
2097 adapter->next_outbox = adapter->first_outbox;
2098 adapter->first_inbox = (struct blogic_inbox *) (adapter->last_outbox + 1);
2099 adapter->last_inbox = adapter->first_inbox + adapter->mbox_count - 1;
2100 adapter->next_inbox = adapter->first_inbox;
2105 memset(adapter->first_outbox, 0,
2106 adapter->mbox_count * sizeof(struct blogic_outbox));
2107 memset(adapter->first_inbox, 0,
2108 adapter->mbox_count * sizeof(struct blogic_inbox));
2114 extmbox_req.mbox_count = adapter->mbox_count;
2115 extmbox_req.base_mbox_addr = (u32) adapter->mbox_space_handle;
2116 if (blogic_cmd(adapter, BLOGIC_INIT_EXT_MBOX, &extmbox_req,
2118 return blogic_failure(adapter, "MAILBOX INITIALIZATION");
2127 if (adapter->strict_rr) {
2129 if (blogic_cmd(adapter, BLOGIC_STRICT_RR, &rr_req,
2131 return blogic_failure(adapter,
2139 if (adapter->ext_lun) {
2141 if (blogic_cmd(adapter, BLOGIC_SETCCB_FMT, &setccb_fmt,
2143 return blogic_failure(adapter, "SET CCB FORMAT");
2150 if (!adapter->adapter_initd) {
2151 blogic_info("*** %s Initialized Successfully ***\n", adapter,
2152 adapter->full_model);
2153 blogic_info("\n", adapter);
2155 blogic_warn("*** %s Initialized Successfully ***\n", adapter,
2156 adapter->full_model);
2157 adapter->adapter_initd = true;
2171 static bool __init blogic_inquiry(struct blogic_adapter *adapter)
2186 blogic_delay(adapter->bus_settle_time);
2190 if (blogic_flashpoint_type(adapter))
2195 if (adapter->drvr_opts != NULL && adapter->drvr_opts->stop_tgt_inquiry)
2207 if (strcmp(adapter->fw_ver, "4.25") >= 0) {
2217 if (blogic_cmd(adapter, BLOGIC_INQ_DEV, NULL, 0,
2220 return blogic_failure(adapter, "INQUIRE TARGET DEVICES");
2221 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2222 adapter->tgt_flags[tgt_id].tgt_exists =
2233 if (blogic_cmd(adapter, BLOGIC_INQ_DEV0TO7, NULL, 0,
2236 return blogic_failure(adapter,
2239 adapter->tgt_flags[tgt_id].tgt_exists =
2246 if (blogic_cmd(adapter, BLOGIC_INQ_SETUPINFO, &req_replylen,
2249 return blogic_failure(adapter, "INQUIRE SETUP INFORMATION");
2250 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2251 adapter->sync_offset[tgt_id] = (tgt_id < 8 ? setupinfo.sync0to7[tgt_id].offset : setupinfo.sync8to15[tgt_id - 8].offset);
2252 if (strcmp(adapter->fw_ver, "5.06L") >= 0)
2253 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2254 adapter->tgt_flags[tgt_id].wide_active = (tgt_id < 8 ? (setupinfo.wide_tx_active0to7 & (1 << tgt_id) ? true : false) : (setupinfo.wide_tx_active8to15 & (1 << (tgt_id - 8)) ? true : false));
2258 if (adapter->fw_ver[0] >= '3') {
2266 if (blogic_cmd(adapter, BLOGIC_INQ_SYNC_PERIOD, &req_replylen,
2269 return blogic_failure(adapter,
2271 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2272 adapter->sync_period[tgt_id] = sync_period[tgt_id];
2274 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2276 adapter->sync_period[tgt_id] = 20 + 5 * setupinfo.sync0to7[tgt_id].tx_period;
2292 static void __init blogic_inithoststruct(struct blogic_adapter *adapter,
2295 host->max_id = adapter->maxdev;
2296 host->max_lun = adapter->maxlun;
2298 host->unique_id = adapter->io_addr;
2299 host->this_id = adapter->scsi_id;
2300 host->can_queue = adapter->drvr_qdepth;
2301 host->sg_tablesize = adapter->drvr_sglimit;
2302 host->unchecked_isa_dma = adapter->need_bouncebuf;
2303 host->cmd_per_lun = adapter->untag_qdepth;
2316 struct blogic_adapter *adapter =
2319 int qdepth = adapter->qdepth[tgt_id];
2321 if (adapter->tgt_flags[tgt_id].tagq_ok &&
2322 (adapter->tagq_ok & (1 << tgt_id))) {
2325 adapter->qdepth[tgt_id] = qdepth;
2328 adapter->tagq_ok &= ~(1 << tgt_id);
2329 qdepth = adapter->untag_qdepth;
2330 adapter->qdepth[tgt_id] = qdepth;
2334 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2335 if (adapter->tgt_flags[tgt_id].tgt_exists)
2336 qdepth += adapter->qdepth[tgt_id];
2337 if (qdepth > adapter->alloc_ccbs)
2338 blogic_create_addlccbs(adapter, qdepth - adapter->alloc_ccbs,
2354 struct blogic_adapter *adapter;
2373 adapter = kzalloc(sizeof(struct blogic_adapter), GFP_KERNEL);
2374 if (adapter == NULL) {
2384 blogic_init_probeinfo_list(adapter);
2388 struct blogic_adapter *myadapter = adapter;
2461 memcpy(myadapter, adapter, sizeof(struct blogic_adapter));
2546 kfree(adapter);
2559 static int __exit blogic_deladapter(struct blogic_adapter *adapter)
2561 struct Scsi_Host *host = adapter->scsi_host;
2569 if (blogic_flashpoint_type(adapter))
2570 FlashPoint_ReleaseHostAdapter(adapter->cardhandle);
2575 blogic_destroy_ccbs(adapter);
2576 blogic_relres(adapter);
2580 release_region(adapter->io_addr, adapter->addr_count);
2585 list_del(&adapter->host_list);
2598 struct blogic_adapter *adapter = ccb->adapter;
2602 if (adapter->firstccb == NULL) {
2603 adapter->firstccb = ccb;
2604 adapter->lastccb = ccb;
2606 adapter->lastccb->next = ccb;
2607 adapter->lastccb = ccb;
2609 adapter->active_cmds[ccb->tgt_id]--;
2618 static int blogic_resultcode(struct blogic_adapter *adapter,
2637 adapter, adapter_status);
2662 blogic_warn("Unknown Host Adapter Status 0x%02X\n", adapter,
2676 static void blogic_scan_inbox(struct blogic_adapter *adapter)
2691 struct blogic_inbox *next_inbox = adapter->next_inbox;
2721 blogic_warn("Illegal CCB #%ld status %d in Incoming Mailbox\n", adapter, ccb->serial, ccb->status);
2725 if (++next_inbox > adapter->last_inbox)
2726 next_inbox = adapter->first_inbox;
2728 adapter->next_inbox = next_inbox;
2739 static void blogic_process_ccbs(struct blogic_adapter *adapter)
2741 if (adapter->processing_ccbs)
2743 adapter->processing_ccbs = true;
2744 while (adapter->firstccb != NULL) {
2745 struct blogic_ccb *ccb = adapter->firstccb;
2747 adapter->firstccb = ccb->next;
2748 if (adapter->firstccb == NULL)
2749 adapter->lastccb = NULL;
2756 blogic_warn("Bus Device Reset CCB #%ld to Target %d Completed\n", adapter, ccb->serial, tgt_id);
2757 blogic_inc_count(&adapter->tgt_stats[tgt_id].bdr_done);
2758 adapter->tgt_flags[tgt_id].tagq_active = false;
2759 adapter->cmds_since_rst[tgt_id] = 0;
2760 adapter->last_resetdone[tgt_id] = jiffies;
2788 for (ccb = adapter->all_ccbs; ccb != NULL;
2794 adapter->active_cmds[tgt_id]--;
2798 adapter->bdr_pend[tgt_id] = NULL;
2809 blogic_warn("CCB #%ld to Target %d Impossible State\n", adapter, ccb->serial, ccb->tgt_id);
2812 adapter->tgt_stats[ccb->tgt_id]
2814 adapter->tgt_flags[ccb->tgt_id]
2820 adapter, ccb->serial, ccb->tgt_id);
2821 blogic_inc_count(&adapter->tgt_stats[ccb->tgt_id].aborts_done);
2825 command->result = blogic_resultcode(adapter,
2828 adapter->tgt_stats[ccb->tgt_id]
2833 "Adapter Status %02X Target Status %02X\n", adapter, ccb->serial, ccb->tgt_id, command->result, ccb->adapter_status, ccb->tgt_status);
2834 blogic_notice("CDB ", adapter);
2836 blogic_notice(" %02X", adapter, ccb->cdb[i]);
2837 blogic_notice("\n", adapter);
2838 blogic_notice("Sense ", adapter);
2840 blogic_notice(" %02X", adapter, command->sense_buffer[i]);
2841 blogic_notice("\n", adapter);
2854 &adapter->tgt_flags[ccb->tgt_id];
2871 adapter->processing_ccbs = false;
2882 struct blogic_adapter *adapter = (struct blogic_adapter *) devid;
2887 spin_lock_irqsave(adapter->scsi_host->host_lock, processor_flag);
2891 if (blogic_multimaster_type(adapter)) {
2896 intreg.all = blogic_rdint(adapter);
2902 blogic_intreset(adapter);
2910 adapter->adapter_extreset = true;
2912 blogic_scan_inbox(adapter);
2914 adapter->adapter_cmd_complete = true;
2920 if (FlashPoint_InterruptPending(adapter->cardhandle))
2921 switch (FlashPoint_HandleInterrupt(adapter->cardhandle)) {
2925 adapter->adapter_extreset = true;
2928 blogic_warn("Internal FlashPoint Error detected - Resetting Host Adapter\n", adapter);
2929 adapter->adapter_intern_err = true;
2936 if (adapter->firstccb != NULL)
2937 blogic_process_ccbs(adapter);
2941 if (adapter->adapter_extreset) {
2942 blogic_warn("Resetting %s due to External SCSI Bus Reset\n", adapter, adapter->full_model);
2943 blogic_inc_count(&adapter->ext_resets);
2944 blogic_resetadapter(adapter, false);
2945 adapter->adapter_extreset = false;
2946 } else if (adapter->adapter_intern_err) {
2947 blogic_warn("Resetting %s due to Host Adapter Internal Error\n", adapter, adapter->full_model);
2948 blogic_inc_count(&adapter->adapter_intern_errors);
2949 blogic_resetadapter(adapter, true);
2950 adapter->adapter_intern_err = false;
2955 spin_unlock_irqrestore(adapter->scsi_host->host_lock, processor_flag);
2966 static bool blogic_write_outbox(struct blogic_adapter *adapter,
2971 next_outbox = adapter->next_outbox;
2982 blogic_execmbox(adapter);
2983 if (++next_outbox > adapter->last_outbox)
2984 next_outbox = adapter->first_outbox;
2985 adapter->next_outbox = next_outbox;
2987 adapter->active_cmds[ccb->tgt_id]++;
2989 adapter->tgt_stats[ccb->tgt_id].cmds_tried++;
3000 struct blogic_adapter *adapter =
3004 struct blogic_tgt_stats *stats = &adapter->tgt_stats[id];
3011 rc = blogic_resetadapter(adapter, false);
3024 struct blogic_adapter *adapter =
3027 &adapter->tgt_flags[command->device->id];
3028 struct blogic_tgt_stats *tgt_stats = adapter->tgt_stats;
3056 ccb = blogic_alloc_ccb(adapter);
3058 spin_unlock_irq(adapter->scsi_host->host_lock);
3060 spin_lock_irq(adapter->scsi_host->host_lock);
3061 ccb = blogic_alloc_ccb(adapter);
3080 if (blogic_multimaster_type(adapter))
3139 if (adapter->cmds_since_rst[tgt_id]++ >= BLOGIC_MAX_TAG_DEPTH &&
3141 adapter->active_cmds[tgt_id] == 0
3143 (adapter->tagq_ok & (1 << tgt_id))) {
3146 adapter, tgt_id);
3165 if (adapter->active_cmds[tgt_id] == 0)
3166 adapter->last_seqpoint[tgt_id] = jiffies;
3168 adapter->last_seqpoint[tgt_id] + 4 * HZ)) {
3169 adapter->last_seqpoint[tgt_id] = jiffies;
3172 if (adapter->ext_lun) {
3183 sense_buf = dma_map_single(&adapter->pci_device->dev,
3186 if (dma_mapping_error(&adapter->pci_device->dev, sense_buf)) {
3188 adapter);
3194 if (blogic_multimaster_type(adapter)) {
3205 if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START, ccb)) {
3206 spin_unlock_irq(adapter->scsi_host->host_lock);
3207 blogic_warn("Unable to write Outgoing Mailbox - Pausing for 1 second\n", adapter);
3209 spin_lock_irq(adapter->scsi_host->host_lock);
3210 if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START,
3212 blogic_warn("Still unable to write Outgoing Mailbox - Host Adapter Dead?\n", adapter);
3224 adapter->active_cmds[tgt_id]++;
3226 FlashPoint_StartCCB(adapter->cardhandle, ccb);
3233 blogic_process_ccbs(adapter);
3247 struct blogic_adapter *adapter =
3252 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_request);
3258 for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
3262 blogic_warn("Unable to Abort Command to Target %d - No CCB Found\n", adapter, tgt_id);
3265 blogic_warn("Unable to Abort Command to Target %d - CCB Completed\n", adapter, tgt_id);
3268 blogic_warn("Unable to Abort Command to Target %d - CCB Reset\n", adapter, tgt_id);
3271 if (blogic_multimaster_type(adapter)) {
3284 if (adapter->tgt_flags[tgt_id].tagq_active &&
3285 adapter->fw_ver[0] < '5') {
3286 blogic_warn("Unable to Abort CCB #%ld to Target %d - Abort Tag Not Supported\n", adapter, ccb->serial, tgt_id);
3288 } else if (blogic_write_outbox(adapter, BLOGIC_MBOX_ABORT,
3291 adapter, ccb->serial, tgt_id);
3292 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried);
3295 blogic_warn("Unable to Abort CCB #%ld to Target %d - No Outgoing Mailboxes\n", adapter, ccb->serial, tgt_id);
3303 blogic_warn("Aborting CCB #%ld to Target %d\n", adapter,
3305 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried);
3306 FlashPoint_AbortCCB(adapter->cardhandle, ccb);
3313 blogic_process_ccbs(adapter);
3325 static int blogic_resetadapter(struct blogic_adapter *adapter, bool hard_reset)
3334 if (!(blogic_hwreset(adapter, hard_reset) &&
3335 blogic_initadapter(adapter))) {
3336 blogic_err("Resetting %s Failed\n", adapter,
3337 adapter->full_model);
3345 for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
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;
3388 struct blogic_adapter *adapter =
3393 if (adapter->ext_trans_enable && capacity >= 2 * 1024 * 1024 /* 1 GB in 512 byte sectors */) {
3446 blogic_warn("Adopting Geometry %d/%d from Partition Table\n", adapter, diskparam->heads, diskparam->sectors);
3448 blogic_warn("Warning: Partition Table appears to have Geometry %d/%d which is\n", adapter, part_end_head + 1, part_end_sector);
3449 blogic_warn("not compatible with current BusLogic Host Adapter Geometry %d/%d\n", adapter, diskparam->heads, diskparam->sectors);
3464 struct blogic_adapter *adapter =
3468 tgt_stats = adapter->tgt_stats;
3469 adapter->ext_resets = 0;
3470 adapter->adapter_intern_errors = 0;
3477 struct blogic_adapter *adapter = (struct blogic_adapter *) shost->hostdata;
3481 tgt_stats = adapter->tgt_stats;
3482 seq_write(m, adapter->msgbuf, adapter->msgbuflen);
3485 Currently Allocated CCBs: %d\n", adapter->drvr_qdepth, adapter->alloc_ccbs);
3491 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3492 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3495 seq_printf(m, " %2d %s", tgt, (tgt_flags->tagq_ok ? (tgt_flags->tagq_active ? " Active" : (adapter->tagq_ok & (1 << tgt)
3499 " %3d %3u %9u %9u\n", adapter->qdepth[tgt], adapter->active_cmds[tgt], tgt_stats[tgt].cmds_tried, tgt_stats[tgt].cmds_complete);
3504 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3505 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3521 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3522 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3537 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3538 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3557 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3558 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3572 seq_printf(m, "\nExternal Host Adapter Resets: %d\n", adapter->ext_resets);
3573 seq_printf(m, "Host Adapter Internal Errors: %d\n", adapter->adapter_intern_errors);
3583 struct blogic_adapter *adapter, ...)
3590 va_start(args, adapter);
3595 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf);
3596 adapter->msgbuflen += len;
3600 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf);
3601 adapter->msgbuflen += len;
3604 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
3609 if (adapter != NULL && adapter->adapter_initd)
3610 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
3651 command line. Individual option specifications for a single host adapter are
3654 selected host adapter.