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)
608 static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter)
623 enumerated host adapter, determine whether its ISA Compatible
625 Primary I/O Address. A host adapter that is assigned the
627 The MultiMaster BIOS will first recognize a host adapter at
630 standard ISA I/O Addresses. When a PCI host adapter is found
639 struct blogic_adapter *host_adapter = adapter;
767 and if that host adapter is a BT-948/958/958D, then the
830 static int __init blogic_init_fp_probeinfo(struct blogic_adapter *adapter)
922 static void __init blogic_init_probeinfo_list(struct blogic_adapter *adapter)
931 blogic_init_mm_probeinfo(adapter);
932 blogic_init_fp_probeinfo(adapter);
934 blogic_init_fp_probeinfo(adapter);
935 blogic_init_mm_probeinfo(adapter);
937 int fpcount = blogic_init_fp_probeinfo(adapter);
938 int mmcount = blogic_init_mm_probeinfo(adapter);
942 struct blogic_adapter *myadapter = adapter;
990 static bool blogic_failure(struct blogic_adapter *adapter, char *msg)
992 blogic_announce_drvr(adapter);
993 if (adapter->adapter_bus_type == BLOGIC_PCI_BUS) {
995 adapter);
996 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);
998 blogic_err("While configuring BusLogic Host Adapter at I/O Address 0x%lX:\n", adapter, adapter->io_addr);
999 blogic_err("%s FAILED - DETACHING\n", adapter, msg);
1001 blogic_err("ADDITIONAL FAILURE INFO - %s\n", adapter,
1011 static bool __init blogic_probe(struct blogic_adapter *adapter)
1019 if (blogic_flashpoint_type(adapter)) {
1020 struct fpoint_info *fpinfo = &adapter->fpinfo;
1021 fpinfo->base_addr = (u32) adapter->io_addr;
1022 fpinfo->irq_ch = adapter->irq_ch;
1026 blogic_err("BusLogic: FlashPoint Host Adapter detected at PCI Bus %d Device %d\n", adapter, adapter->bus, adapter->dev);
1027 blogic_err("BusLogic: I/O Address 0x%lX PCI Address 0x%lX, but FlashPoint\n", adapter, adapter->io_addr, adapter->pci_addr);
1028 blogic_err("BusLogic: Probe Function failed to validate it.\n", adapter);
1032 blogic_notice("BusLogic_Probe(0x%lX): FlashPoint Found\n", adapter, adapter->io_addr);
1045 statusreg.all = blogic_rdstatus(adapter);
1046 intreg.all = blogic_rdint(adapter);
1047 georeg.all = blogic_rdgeom(adapter);
1049 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);
1087 static bool blogic_hwreset(struct blogic_adapter *adapter, bool hard_reset)
1095 if (blogic_flashpoint_type(adapter)) {
1096 struct fpoint_info *fpinfo = &adapter->fpinfo;
1099 adapter->cardhandle =
1101 if (adapter->cardhandle == (void *)FPOINT_BADCARD_HANDLE)
1114 blogic_hardreset(adapter);
1116 blogic_softreset(adapter);
1122 statusreg.all = blogic_rdstatus(adapter);
1128 blogic_notice("BusLogic_HardwareReset(0x%lX): Diagnostic Active, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1142 statusreg.all = blogic_rdstatus(adapter);
1148 blogic_notice("BusLogic_HardwareReset(0x%lX): Diagnostic Completed, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1157 statusreg.all = blogic_rdstatus(adapter);
1164 blogic_notice("BusLogic_HardwareReset(0x%lX): Host Adapter Ready, Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1175 blogic_failure(adapter, "HARD RESET DIAGNOSTICS");
1176 blogic_err("HOST ADAPTER STATUS REGISTER = %02X\n", adapter,
1179 blogic_err("HOST ADAPTER ERROR CODE = %d\n", adapter,
1180 blogic_rddatain(adapter));
1195 static bool __init blogic_checkadapter(struct blogic_adapter *adapter)
1203 if (blogic_flashpoint_type(adapter))
1212 if (blogic_cmd(adapter, BLOGIC_INQ_EXTSETUP, &req_replylen,
1220 blogic_notice("BusLogic_Check(0x%lX): MultiMaster %s\n", adapter,
1221 adapter->io_addr,
1232 static bool __init blogic_rdconfig(struct blogic_adapter *adapter)
1254 if (blogic_flashpoint_type(adapter)) {
1255 struct fpoint_info *fpinfo = &adapter->fpinfo;
1256 tgt = adapter->model;
1263 strcpy(adapter->fw_ver, FLASHPOINT_FW_VER);
1264 adapter->scsi_id = fpinfo->scsi_id;
1265 adapter->ext_trans_enable = fpinfo->ext_trans_enable;
1266 adapter->parity = fpinfo->parity;
1267 adapter->reset_enabled = !fpinfo->softreset;
1268 adapter->level_int = true;
1269 adapter->wide = fpinfo->wide;
1270 adapter->differential = false;
1271 adapter->scam = true;
1272 adapter->ultra = true;
1273 adapter->ext_lun = true;
1274 adapter->terminfo_valid = true;
1275 adapter->low_term = fpinfo->low_term;
1276 adapter->high_term = fpinfo->high_term;
1277 adapter->scam_enabled = fpinfo->scam_enabled;
1278 adapter->scam_lev2 = fpinfo->scam_lev2;
1279 adapter->drvr_sglimit = BLOGIC_SG_LIMIT;
1280 adapter->maxdev = (adapter->wide ? 16 : 8);
1281 adapter->maxlun = 32;
1282 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE;
1283 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE;
1284 adapter->drvr_qdepth = 255;
1285 adapter->adapter_qdepth = adapter->drvr_qdepth;
1286 adapter->sync_ok = fpinfo->sync_ok;
1287 adapter->fast_ok = fpinfo->fast_ok;
1288 adapter->ultra_ok = fpinfo->ultra_ok;
1289 adapter->wide_ok = fpinfo->wide_ok;
1290 adapter->discon_ok = fpinfo->discon_ok;
1291 adapter->tagq_ok = 0xFFFF;
1297 if (blogic_cmd(adapter, BLOGIC_GET_BOARD_ID, NULL, 0, &id,
1299 return blogic_failure(adapter, "INQUIRE BOARD ID");
1303 if (blogic_cmd(adapter, BLOGIC_INQ_CONFIG, NULL, 0, &config,
1306 return blogic_failure(adapter, "INQUIRE CONFIGURATION");
1311 if (blogic_cmd(adapter, BLOGIC_INQ_SETUPINFO, &req_replylen,
1314 return blogic_failure(adapter, "INQUIRE SETUP INFORMATION");
1319 if (blogic_cmd(adapter, BLOGIC_INQ_EXTSETUP, &req_replylen,
1322 return blogic_failure(adapter,
1329 if (blogic_cmd(adapter, BLOGIC_INQ_FWVER_D3, NULL, 0,
1332 return blogic_failure(adapter,
1350 if (blogic_cmd(adapter, BLOGIC_INQ_MODELNO, &req_replylen,
1353 return blogic_failure(adapter,
1376 tgt = adapter->model;
1390 tgt = adapter->fw_ver;
1400 if (strcmp(adapter->fw_ver, "3.3") >= 0) {
1401 if (blogic_cmd(adapter, BLOGIC_INQ_FWVER_LETTER, NULL, 0,
1404 return blogic_failure(adapter,
1413 adapter->scsi_id = config.id;
1419 adapter->adapter_bus_type =
1420 blogic_adater_bus_types[adapter->model[3] - '4'];
1421 if (adapter->irq_ch == 0) {
1423 adapter->irq_ch = 9;
1425 adapter->irq_ch = 10;
1427 adapter->irq_ch = 11;
1429 adapter->irq_ch = 12;
1431 adapter->irq_ch = 14;
1433 adapter->irq_ch = 15;
1439 georeg.all = blogic_rdgeom(adapter);
1440 adapter->ext_trans_enable = georeg.gr.ext_trans_enable;
1446 adapter->adapter_sglimit = ext_setupinfo.sg_limit;
1447 adapter->drvr_sglimit = adapter->adapter_sglimit;
1448 if (adapter->adapter_sglimit > BLOGIC_SG_LIMIT)
1449 adapter->drvr_sglimit = BLOGIC_SG_LIMIT;
1451 adapter->level_int = true;
1452 adapter->wide = ext_setupinfo.wide;
1453 adapter->differential = ext_setupinfo.differential;
1454 adapter->scam = ext_setupinfo.scam;
1455 adapter->ultra = ext_setupinfo.ultra;
1460 if (adapter->fw_ver[0] == '5' || (adapter->fw_ver[0] == '4' &&
1461 adapter->wide))
1462 adapter->ext_lun = true;
1467 if (adapter->fw_ver[0] == '5') {
1468 if (blogic_cmd(adapter, BLOGIC_INQ_PCI_INFO, NULL, 0,
1471 return blogic_failure(adapter,
1478 adapter->terminfo_valid = true;
1479 adapter->low_term = adapter_info.low_term;
1480 adapter->high_term = adapter_info.high_term;
1487 if (adapter->fw_ver[0] >= '4') {
1490 if (blogic_cmd(adapter, BLOGIC_FETCH_LOCALRAM, &fetch_localram,
1493 return blogic_failure(adapter,
1499 adapter->parity = autoscsi.parity;
1500 adapter->reset_enabled = autoscsi.reset_enabled;
1501 if (adapter->fw_ver[0] == '4') {
1502 adapter->terminfo_valid = true;
1503 adapter->low_term = autoscsi.low_term;
1504 adapter->high_term = autoscsi.high_term;
1511 adapter->wide_ok = autoscsi.wide_ok;
1512 adapter->fast_ok = autoscsi.fast_ok;
1513 adapter->sync_ok = autoscsi.sync_ok;
1514 adapter->discon_ok = autoscsi.discon_ok;
1515 if (adapter->ultra)
1516 adapter->ultra_ok = autoscsi.ultra_ok;
1517 if (adapter->scam) {
1518 adapter->scam_enabled = autoscsi.scam_enabled;
1519 adapter->scam_lev2 = autoscsi.scam_lev2;
1526 if (adapter->fw_ver[0] < '4') {
1528 adapter->sync_ok = 0xFF;
1529 if (adapter->adapter_bus_type == BLOGIC_EISA_BUS) {
1531 adapter->fast_ok = 0xFF;
1532 if (strcmp(adapter->model, "BT-757") == 0)
1533 adapter->wide_ok = 0xFF;
1536 adapter->discon_ok = 0xFF;
1537 adapter->parity = setupinfo.parity;
1538 adapter->reset_enabled = true;
1544 adapter->maxdev = (adapter->wide ? 16 : 8);
1545 adapter->maxlun = (adapter->ext_lun ? 32 : 8);
1571 if (adapter->fw_ver[0] == '5')
1572 adapter->adapter_qdepth = 192;
1573 else if (adapter->fw_ver[0] == '4')
1574 adapter->adapter_qdepth = 100;
1576 adapter->adapter_qdepth = 30;
1577 if (strcmp(adapter->fw_ver, "3.31") >= 0) {
1578 adapter->strict_rr = true;
1579 adapter->mbox_count = BLOGIC_MAX_MAILBOX;
1581 adapter->strict_rr = false;
1582 adapter->mbox_count = 32;
1584 adapter->drvr_qdepth = adapter->mbox_count;
1585 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE;
1586 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE;
1594 adapter->tagq_ok = 0;
1595 switch (adapter->fw_ver[0]) {
1597 adapter->tagq_ok = 0xFFFF;
1600 if (strcmp(adapter->fw_ver, "4.22") >= 0)
1601 adapter->tagq_ok = 0xFFFF;
1604 if (strcmp(adapter->fw_ver, "3.35") >= 0)
1605 adapter->tagq_ok = 0xFFFF;
1613 adapter->bios_addr = ext_setupinfo.bios_addr << 12;
1621 if (adapter->bios_addr > 0 &&
1622 strcmp(adapter->model, "BT-445S") == 0 &&
1623 strcmp(adapter->fw_ver, "3.37") < 0)
1624 return blogic_failure(adapter, "Too old firmware");
1633 strcpy(adapter->full_model, "BusLogic ");
1634 strcat(adapter->full_model, adapter->model);
1644 if (adapter->drvr_opts != NULL &&
1645 adapter->drvr_opts->qdepth[tgt_id] > 0)
1646 qdepth = adapter->drvr_opts->qdepth[tgt_id];
1647 adapter->qdepth[tgt_id] = qdepth;
1649 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH;
1650 if (adapter->drvr_opts != NULL)
1651 adapter->common_qdepth = adapter->drvr_opts->common_qdepth;
1652 if (adapter->common_qdepth > 0 &&
1653 adapter->common_qdepth < adapter->untag_qdepth)
1654 adapter->untag_qdepth = adapter->common_qdepth;
1660 adapter->tagq_ok &= adapter->discon_ok;
1665 if (adapter->drvr_opts != NULL)
1666 adapter->tagq_ok = (adapter->drvr_opts->tagq_ok &
1667 adapter->drvr_opts->tagq_ok_mask) |
1668 (adapter->tagq_ok & ~adapter->drvr_opts->tagq_ok_mask);
1675 if (adapter->drvr_opts != NULL &&
1676 adapter->drvr_opts->bus_settle_time > 0)
1677 adapter->bus_settle_time = adapter->drvr_opts->bus_settle_time;
1679 adapter->bus_settle_time = BLOGIC_BUS_SETTLE_TIME;
1692 static bool __init blogic_reportconfig(struct blogic_adapter *adapter)
1694 unsigned short alltgt_mask = (1 << adapter->maxdev) - 1;
1709 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" : ""));
1710 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"));
1711 if (adapter->adapter_bus_type != BLOGIC_PCI_BUS) {
1712 blogic_info(" DMA Channel: None, ", adapter);
1713 if (adapter->bios_addr > 0)
1714 blogic_info("BIOS Address: 0x%X, ", adapter,
1715 adapter->bios_addr);
1717 blogic_info("BIOS Address: None, ", adapter);
1719 blogic_info(" PCI Bus: %d, Device: %d, Address: ", adapter,
1720 adapter->bus, adapter->dev);
1721 if (adapter->pci_addr > 0)
1722 blogic_info("0x%lX, ", adapter, adapter->pci_addr);
1724 blogic_info("Unassigned, ", adapter);
1726 blogic_info("Host Adapter SCSI ID: %d\n", adapter, adapter->scsi_id);
1728 adapter, (adapter->parity ? "Enabled" : "Disabled"),
1729 (adapter->ext_trans_enable ? "Enabled" : "Disabled"));
1730 alltgt_mask &= ~(1 << adapter->scsi_id);
1731 sync_ok = adapter->sync_ok & alltgt_mask;
1732 fast_ok = adapter->fast_ok & alltgt_mask;
1733 ultra_ok = adapter->ultra_ok & alltgt_mask;
1734 if ((blogic_multimaster_type(adapter) &&
1735 (adapter->fw_ver[0] >= '4' ||
1736 adapter->adapter_bus_type == BLOGIC_EISA_BUS)) ||
1737 blogic_flashpoint_type(adapter)) {
1757 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1759 syncstr[adapter->scsi_id] = '#';
1760 syncstr[adapter->maxdev] = '\0';
1764 wide_ok = adapter->wide_ok & alltgt_mask;
1770 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1772 widestr[adapter->scsi_id] = '#';
1773 widestr[adapter->maxdev] = '\0';
1775 discon_ok = adapter->discon_ok & alltgt_mask;
1781 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1783 discon_str[adapter->scsi_id] = '#';
1784 discon_str[adapter->maxdev] = '\0';
1786 tagq_ok = adapter->tagq_ok & alltgt_mask;
1792 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1794 tagq_str[adapter->scsi_id] = '#';
1795 tagq_str[adapter->maxdev] = '\0';
1798 adapter, syncmsg, widemsg);
1799 blogic_info(" Disconnect/Reconnect: %s, Tagged Queuing: %s\n", adapter,
1801 if (blogic_multimaster_type(adapter)) {
1802 blogic_info(" Scatter/Gather Limit: %d of %d segments, Mailboxes: %d\n", adapter, adapter->drvr_sglimit, adapter->adapter_sglimit, adapter->mbox_count);
1803 blogic_info(" Driver Queue Depth: %d, Host Adapter Queue Depth: %d\n", adapter, adapter->drvr_qdepth, adapter->adapter_qdepth);
1805 blogic_info(" Driver Queue Depth: %d, Scatter/Gather Limit: %d segments\n", adapter, adapter->drvr_qdepth, adapter->drvr_sglimit);
1806 blogic_info(" Tagged Queue Depth: ", adapter);
1808 for (tgt_id = 1; tgt_id < adapter->maxdev; tgt_id++)
1809 if (adapter->qdepth[tgt_id] != adapter->qdepth[0]) {
1814 if (adapter->qdepth[0] > 0)
1815 blogic_info("%d", adapter, adapter->qdepth[0]);
1817 blogic_info("Automatic", adapter);
1819 blogic_info("Individual", adapter);
1820 blogic_info(", Untagged Queue Depth: %d\n", adapter,
1821 adapter->untag_qdepth);
1822 if (adapter->terminfo_valid) {
1823 if (adapter->wide)
1824 blogic_info(" SCSI Bus Termination: %s", adapter,
1825 (adapter->low_term ? (adapter->high_term ? "Both Enabled" : "Low Enabled") : (adapter->high_term ? "High Enabled" : "Both Disabled")));
1827 blogic_info(" SCSI Bus Termination: %s", adapter,
1828 (adapter->low_term ? "Enabled" : "Disabled"));
1829 if (adapter->scam)
1830 blogic_info(", SCAM: %s", adapter,
1831 (adapter->scam_enabled ? (adapter->scam_lev2 ? "Enabled, Level 2" : "Enabled, Level 1") : "Disabled"));
1832 blogic_info("\n", adapter);
1847 static bool __init blogic_getres(struct blogic_adapter *adapter)
1849 if (adapter->irq_ch == 0) {
1851 adapter);
1857 if (request_irq(adapter->irq_ch, blogic_inthandler, IRQF_SHARED,
1858 adapter->full_model, adapter) < 0) {
1860 adapter, adapter->irq_ch);
1863 adapter->irq_acquired = true;
1876 static void blogic_relres(struct blogic_adapter *adapter)
1881 if (adapter->irq_acquired)
1882 free_irq(adapter->irq_ch, adapter);
1886 if (adapter->mbox_space)
1887 dma_free_coherent(&adapter->pci_device->dev, adapter->mbox_sz,
1888 adapter->mbox_space, adapter->mbox_space_handle);
1889 pci_dev_put(adapter->pci_device);
1890 adapter->mbox_space = NULL;
1891 adapter->mbox_space_handle = 0;
1892 adapter->mbox_sz = 0;
1902 static bool blogic_initadapter(struct blogic_adapter *adapter)
1913 adapter->firstccb = NULL;
1914 adapter->lastccb = NULL;
1921 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
1922 adapter->bdr_pend[tgt_id] = NULL;
1923 adapter->tgt_flags[tgt_id].tagq_active = false;
1924 adapter->tgt_flags[tgt_id].cmd_good = false;
1925 adapter->active_cmds[tgt_id] = 0;
1926 adapter->cmds_since_rst[tgt_id] = 0;
1932 if (blogic_flashpoint_type(adapter))
1938 adapter->mbox_sz = adapter->mbox_count * (sizeof(struct blogic_outbox) + sizeof(struct blogic_inbox));
1939 adapter->mbox_space = dma_alloc_coherent(&adapter->pci_device->dev,
1940 adapter->mbox_sz, &adapter->mbox_space_handle,
1942 if (adapter->mbox_space == NULL)
1943 return blogic_failure(adapter, "MAILBOX ALLOCATION");
1944 adapter->first_outbox = (struct blogic_outbox *) adapter->mbox_space;
1945 adapter->last_outbox = adapter->first_outbox + adapter->mbox_count - 1;
1946 adapter->next_outbox = adapter->first_outbox;
1947 adapter->first_inbox = (struct blogic_inbox *) (adapter->last_outbox + 1);
1948 adapter->last_inbox = adapter->first_inbox + adapter->mbox_count - 1;
1949 adapter->next_inbox = adapter->first_inbox;
1954 memset(adapter->first_outbox, 0,
1955 adapter->mbox_count * sizeof(struct blogic_outbox));
1956 memset(adapter->first_inbox, 0,
1957 adapter->mbox_count * sizeof(struct blogic_inbox));
1963 extmbox_req.mbox_count = adapter->mbox_count;
1964 extmbox_req.base_mbox_addr = (u32) adapter->mbox_space_handle;
1965 if (blogic_cmd(adapter, BLOGIC_INIT_EXT_MBOX, &extmbox_req,
1967 return blogic_failure(adapter, "MAILBOX INITIALIZATION");
1976 if (adapter->strict_rr) {
1978 if (blogic_cmd(adapter, BLOGIC_STRICT_RR, &rr_req,
1980 return blogic_failure(adapter,
1988 if (adapter->ext_lun) {
1990 if (blogic_cmd(adapter, BLOGIC_SETCCB_FMT, &setccb_fmt,
1992 return blogic_failure(adapter, "SET CCB FORMAT");
1999 if (!adapter->adapter_initd) {
2000 blogic_info("*** %s Initialized Successfully ***\n", adapter,
2001 adapter->full_model);
2002 blogic_info("\n", adapter);
2004 blogic_warn("*** %s Initialized Successfully ***\n", adapter,
2005 adapter->full_model);
2006 adapter->adapter_initd = true;
2020 static bool __init blogic_inquiry(struct blogic_adapter *adapter)
2035 blogic_delay(adapter->bus_settle_time);
2039 if (blogic_flashpoint_type(adapter))
2044 if (adapter->drvr_opts != NULL && adapter->drvr_opts->stop_tgt_inquiry)
2056 if (strcmp(adapter->fw_ver, "4.25") >= 0) {
2066 if (blogic_cmd(adapter, BLOGIC_INQ_DEV, NULL, 0,
2069 return blogic_failure(adapter, "INQUIRE TARGET DEVICES");
2070 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2071 adapter->tgt_flags[tgt_id].tgt_exists =
2082 if (blogic_cmd(adapter, BLOGIC_INQ_DEV0TO7, NULL, 0,
2085 return blogic_failure(adapter,
2088 adapter->tgt_flags[tgt_id].tgt_exists =
2095 if (blogic_cmd(adapter, BLOGIC_INQ_SETUPINFO, &req_replylen,
2098 return blogic_failure(adapter, "INQUIRE SETUP INFORMATION");
2099 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2100 adapter->sync_offset[tgt_id] = (tgt_id < 8 ? setupinfo.sync0to7[tgt_id].offset : setupinfo.sync8to15[tgt_id - 8].offset);
2101 if (strcmp(adapter->fw_ver, "5.06L") >= 0)
2102 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2103 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));
2107 if (adapter->fw_ver[0] >= '3') {
2115 if (blogic_cmd(adapter, BLOGIC_INQ_SYNC_PERIOD, &req_replylen,
2118 return blogic_failure(adapter,
2120 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2121 adapter->sync_period[tgt_id] = sync_period[tgt_id];
2123 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2125 adapter->sync_period[tgt_id] = 20 + 5 * setupinfo.sync0to7[tgt_id].tx_period;
2141 static void __init blogic_inithoststruct(struct blogic_adapter *adapter,
2144 host->max_id = adapter->maxdev;
2145 host->max_lun = adapter->maxlun;
2147 host->unique_id = adapter->io_addr;
2148 host->this_id = adapter->scsi_id;
2149 host->can_queue = adapter->drvr_qdepth;
2150 host->sg_tablesize = adapter->drvr_sglimit;
2151 host->cmd_per_lun = adapter->untag_qdepth;
2164 struct blogic_adapter *adapter =
2167 int qdepth = adapter->qdepth[tgt_id];
2169 if (adapter->tgt_flags[tgt_id].tagq_ok &&
2170 (adapter->tagq_ok & (1 << tgt_id))) {
2173 adapter->qdepth[tgt_id] = qdepth;
2176 adapter->tagq_ok &= ~(1 << tgt_id);
2177 qdepth = adapter->untag_qdepth;
2178 adapter->qdepth[tgt_id] = qdepth;
2182 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2183 if (adapter->tgt_flags[tgt_id].tgt_exists)
2184 qdepth += adapter->qdepth[tgt_id];
2185 if (qdepth > adapter->alloc_ccbs)
2186 blogic_create_addlccbs(adapter, qdepth - adapter->alloc_ccbs,
2202 struct blogic_adapter *adapter;
2221 adapter = kzalloc(sizeof(struct blogic_adapter), GFP_KERNEL);
2222 if (adapter == NULL) {
2232 blogic_init_probeinfo_list(adapter);
2236 struct blogic_adapter *myadapter = adapter;
2309 memcpy(myadapter, adapter, sizeof(struct blogic_adapter));
2392 kfree(adapter);
2405 static int __exit blogic_deladapter(struct blogic_adapter *adapter)
2407 struct Scsi_Host *host = adapter->scsi_host;
2415 if (blogic_flashpoint_type(adapter))
2416 FlashPoint_ReleaseHostAdapter(adapter->cardhandle);
2421 blogic_destroy_ccbs(adapter);
2422 blogic_relres(adapter);
2426 release_region(adapter->io_addr, adapter->addr_count);
2431 list_del(&adapter->host_list);
2444 struct blogic_adapter *adapter = ccb->adapter;
2448 if (adapter->firstccb == NULL) {
2449 adapter->firstccb = ccb;
2450 adapter->lastccb = ccb;
2452 adapter->lastccb->next = ccb;
2453 adapter->lastccb = ccb;
2455 adapter->active_cmds[ccb->tgt_id]--;
2464 static int blogic_resultcode(struct blogic_adapter *adapter,
2483 adapter, adapter_status);
2508 blogic_warn("Unknown Host Adapter Status 0x%02X\n", adapter,
2521 blogic_inbox_to_ccb(struct blogic_adapter *adapter, struct blogic_inbox *inbox)
2525 for (ccb = adapter->all_ccbs; ccb; ccb = ccb->next_all)
2536 static void blogic_scan_inbox(struct blogic_adapter *adapter)
2551 struct blogic_inbox *next_inbox = adapter->next_inbox;
2555 struct blogic_ccb *ccb = blogic_inbox_to_ccb(adapter, next_inbox);
2561 blogic_warn("Could not find CCB for dma address %x\n", adapter, next_inbox->ccb);
2578 blogic_warn("Illegal CCB #%ld status %d in Incoming Mailbox\n", adapter, ccb->serial, ccb->status);
2582 if (++next_inbox > adapter->last_inbox)
2583 next_inbox = adapter->first_inbox;
2585 adapter->next_inbox = next_inbox;
2596 static void blogic_process_ccbs(struct blogic_adapter *adapter)
2598 if (adapter->processing_ccbs)
2600 adapter->processing_ccbs = true;
2601 while (adapter->firstccb != NULL) {
2602 struct blogic_ccb *ccb = adapter->firstccb;
2604 adapter->firstccb = ccb->next;
2605 if (adapter->firstccb == NULL)
2606 adapter->lastccb = NULL;
2613 blogic_warn("Bus Device Reset CCB #%ld to Target %d Completed\n", adapter, ccb->serial, tgt_id);
2614 blogic_inc_count(&adapter->tgt_stats[tgt_id].bdr_done);
2615 adapter->tgt_flags[tgt_id].tagq_active = false;
2616 adapter->cmds_since_rst[tgt_id] = 0;
2617 adapter->last_resetdone[tgt_id] = jiffies;
2645 for (ccb = adapter->all_ccbs; ccb != NULL;
2651 adapter->active_cmds[tgt_id]--;
2655 adapter->bdr_pend[tgt_id] = NULL;
2666 blogic_warn("CCB #%ld to Target %d Impossible State\n", adapter, ccb->serial, ccb->tgt_id);
2669 adapter->tgt_stats[ccb->tgt_id]
2671 adapter->tgt_flags[ccb->tgt_id]
2677 adapter, ccb->serial, ccb->tgt_id);
2678 blogic_inc_count(&adapter->tgt_stats[ccb->tgt_id].aborts_done);
2682 command->result = blogic_resultcode(adapter,
2685 adapter->tgt_stats[ccb->tgt_id]
2690 "Adapter Status %02X Target Status %02X\n", adapter, ccb->serial, ccb->tgt_id, command->result, ccb->adapter_status, ccb->tgt_status);
2691 blogic_notice("CDB ", adapter);
2693 blogic_notice(" %02X", adapter, ccb->cdb[i]);
2694 blogic_notice("\n", adapter);
2695 blogic_notice("Sense ", adapter);
2697 blogic_notice(" %02X", adapter, command->sense_buffer[i]);
2698 blogic_notice("\n", adapter);
2711 &adapter->tgt_flags[ccb->tgt_id];
2728 adapter->processing_ccbs = false;
2739 struct blogic_adapter *adapter = (struct blogic_adapter *) devid;
2744 spin_lock_irqsave(adapter->scsi_host->host_lock, processor_flag);
2748 if (blogic_multimaster_type(adapter)) {
2753 intreg.all = blogic_rdint(adapter);
2759 blogic_intreset(adapter);
2767 adapter->adapter_extreset = true;
2769 blogic_scan_inbox(adapter);
2771 adapter->adapter_cmd_complete = true;
2777 if (FlashPoint_InterruptPending(adapter->cardhandle))
2778 switch (FlashPoint_HandleInterrupt(adapter->cardhandle)) {
2782 adapter->adapter_extreset = true;
2785 blogic_warn("Internal FlashPoint Error detected - Resetting Host Adapter\n", adapter);
2786 adapter->adapter_intern_err = true;
2793 if (adapter->firstccb != NULL)
2794 blogic_process_ccbs(adapter);
2798 if (adapter->adapter_extreset) {
2799 blogic_warn("Resetting %s due to External SCSI Bus Reset\n", adapter, adapter->full_model);
2800 blogic_inc_count(&adapter->ext_resets);
2801 blogic_resetadapter(adapter, false);
2802 adapter->adapter_extreset = false;
2803 } else if (adapter->adapter_intern_err) {
2804 blogic_warn("Resetting %s due to Host Adapter Internal Error\n", adapter, adapter->full_model);
2805 blogic_inc_count(&adapter->adapter_intern_errors);
2806 blogic_resetadapter(adapter, true);
2807 adapter->adapter_intern_err = false;
2812 spin_unlock_irqrestore(adapter->scsi_host->host_lock, processor_flag);
2823 static bool blogic_write_outbox(struct blogic_adapter *adapter,
2828 next_outbox = adapter->next_outbox;
2839 blogic_execmbox(adapter);
2840 if (++next_outbox > adapter->last_outbox)
2841 next_outbox = adapter->first_outbox;
2842 adapter->next_outbox = next_outbox;
2844 adapter->active_cmds[ccb->tgt_id]++;
2846 adapter->tgt_stats[ccb->tgt_id].cmds_tried++;
2857 struct blogic_adapter *adapter =
2861 struct blogic_tgt_stats *stats = &adapter->tgt_stats[id];
2868 rc = blogic_resetadapter(adapter, false);
2881 struct blogic_adapter *adapter =
2884 &adapter->tgt_flags[command->device->id];
2885 struct blogic_tgt_stats *tgt_stats = adapter->tgt_stats;
2913 ccb = blogic_alloc_ccb(adapter);
2915 spin_unlock_irq(adapter->scsi_host->host_lock);
2917 spin_lock_irq(adapter->scsi_host->host_lock);
2918 ccb = blogic_alloc_ccb(adapter);
2937 if (blogic_multimaster_type(adapter))
2996 if (adapter->cmds_since_rst[tgt_id]++ >= BLOGIC_MAX_TAG_DEPTH &&
2998 adapter->active_cmds[tgt_id] == 0
3000 (adapter->tagq_ok & (1 << tgt_id))) {
3003 adapter, tgt_id);
3022 if (adapter->active_cmds[tgt_id] == 0)
3023 adapter->last_seqpoint[tgt_id] = jiffies;
3025 adapter->last_seqpoint[tgt_id] + 4 * HZ)) {
3026 adapter->last_seqpoint[tgt_id] = jiffies;
3029 if (adapter->ext_lun) {
3040 sense_buf = dma_map_single(&adapter->pci_device->dev,
3043 if (dma_mapping_error(&adapter->pci_device->dev, sense_buf)) {
3045 adapter);
3050 if (blogic_multimaster_type(adapter)) {
3061 if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START, ccb)) {
3062 spin_unlock_irq(adapter->scsi_host->host_lock);
3063 blogic_warn("Unable to write Outgoing Mailbox - Pausing for 1 second\n", adapter);
3065 spin_lock_irq(adapter->scsi_host->host_lock);
3066 if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START,
3068 blogic_warn("Still unable to write Outgoing Mailbox - Host Adapter Dead?\n", adapter);
3080 adapter->active_cmds[tgt_id]++;
3082 FlashPoint_StartCCB(adapter->cardhandle, ccb);
3089 blogic_process_ccbs(adapter);
3103 struct blogic_adapter *adapter =
3108 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_request);
3114 for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
3118 blogic_warn("Unable to Abort Command to Target %d - No CCB Found\n", adapter, tgt_id);
3121 blogic_warn("Unable to Abort Command to Target %d - CCB Completed\n", adapter, tgt_id);
3124 blogic_warn("Unable to Abort Command to Target %d - CCB Reset\n", adapter, tgt_id);
3127 if (blogic_multimaster_type(adapter)) {
3140 if (adapter->tgt_flags[tgt_id].tagq_active &&
3141 adapter->fw_ver[0] < '5') {
3142 blogic_warn("Unable to Abort CCB #%ld to Target %d - Abort Tag Not Supported\n", adapter, ccb->serial, tgt_id);
3144 } else if (blogic_write_outbox(adapter, BLOGIC_MBOX_ABORT,
3147 adapter, ccb->serial, tgt_id);
3148 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried);
3151 blogic_warn("Unable to Abort CCB #%ld to Target %d - No Outgoing Mailboxes\n", adapter, ccb->serial, tgt_id);
3159 blogic_warn("Aborting CCB #%ld to Target %d\n", adapter,
3161 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried);
3162 FlashPoint_AbortCCB(adapter->cardhandle, ccb);
3169 blogic_process_ccbs(adapter);
3181 static int blogic_resetadapter(struct blogic_adapter *adapter, bool hard_reset)
3190 if (!(blogic_hwreset(adapter, hard_reset) &&
3191 blogic_initadapter(adapter))) {
3192 blogic_err("Resetting %s Failed\n", adapter,
3193 adapter->full_model);
3201 for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
3212 spin_unlock_irq(adapter->scsi_host->host_lock);
3213 blogic_delay(adapter->bus_settle_time);
3214 spin_lock_irq(adapter->scsi_host->host_lock);
3217 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
3218 adapter->last_resettried[tgt_id] = jiffies;
3219 adapter->last_resetdone[tgt_id] = jiffies;
3244 struct blogic_adapter *adapter =
3249 if (adapter->ext_trans_enable && capacity >= 2 * 1024 * 1024 /* 1 GB in 512 byte sectors */) {
3302 blogic_warn("Adopting Geometry %d/%d from Partition Table\n", adapter, diskparam->heads, diskparam->sectors);
3304 blogic_warn("Warning: Partition Table appears to have Geometry %d/%d which is\n", adapter, part_end_head + 1, part_end_sector);
3305 blogic_warn("not compatible with current BusLogic Host Adapter Geometry %d/%d\n", adapter, diskparam->heads, diskparam->sectors);
3320 struct blogic_adapter *adapter =
3324 tgt_stats = adapter->tgt_stats;
3325 adapter->ext_resets = 0;
3326 adapter->adapter_intern_errors = 0;
3333 struct blogic_adapter *adapter = (struct blogic_adapter *) shost->hostdata;
3337 tgt_stats = adapter->tgt_stats;
3338 seq_write(m, adapter->msgbuf, adapter->msgbuflen);
3341 Currently Allocated CCBs: %d\n", adapter->drvr_qdepth, adapter->alloc_ccbs);
3347 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3348 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3351 seq_printf(m, " %2d %s", tgt, (tgt_flags->tagq_ok ? (tgt_flags->tagq_active ? " Active" : (adapter->tagq_ok & (1 << tgt)
3355 " %3d %3u %9u %9u\n", adapter->qdepth[tgt], adapter->active_cmds[tgt], tgt_stats[tgt].cmds_tried, tgt_stats[tgt].cmds_complete);
3360 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3361 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3377 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3378 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3393 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3394 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3413 for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3414 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3428 seq_printf(m, "\nExternal Host Adapter Resets: %d\n", adapter->ext_resets);
3429 seq_printf(m, "Host Adapter Internal Errors: %d\n", adapter->adapter_intern_errors);
3439 struct blogic_adapter *adapter, ...)
3446 va_start(args, adapter);
3451 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf);
3452 adapter->msgbuflen += len;
3456 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf);
3457 adapter->msgbuflen += len;
3460 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
3465 if (adapter != NULL && adapter->adapter_initd)
3466 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
3507 command line. Individual option specifications for a single host adapter are
3510 selected host adapter.