Lines Matching +full:sfc +full:- +full:no +full:- +full:dma

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
5 * Copyright (c) 1995-2000 Advanced System Products, Inc.
6 * Copyright (c) 2000-2001 ConnectCom Solutions, Inc.
34 #include <linux/dma-mapping.h>
39 #include <asm/dma.h>
109 #define ASC_CHIP_LATEST_VER_EISA ((ASC_CHIP_MIN_VER_EISA - 1) + 3)
125 * Narrow boards only support 12-byte commands, while wide boards
126 * extend to 16-byte commands.
380 #define ASC_IERR_NO_CARRIER 0x0001 /* No more carrier memory */
391 #define ASC_IERR_BIST_PRE_TEST 0x0800 /* BIST pre-test error */
412 * is Ultra-capable or not. These tables let us convert from one to the other.
565 * aren't portable between big and little-endian platforms so they are not used.
568 #define ASC_EEP_GET_CHIP_ID(cfg) ((cfg)->id_speed & 0x0f)
569 #define ASC_EEP_GET_DMA_SPD(cfg) (((cfg)->id_speed & 0xf0) >> 4)
571 ((cfg)->id_speed = ((cfg)->id_speed & 0xf0) | ((sid) & ASC_MAX_TID))
573 ((cfg)->id_speed = ((cfg)->id_speed & 0x0f) | ((spd) & 0x0f) << 4)
588 /* high order 4 bits is isa dma speed */
870 * Define total number of simultaneous maximum element scatter-gather
873 * command uses one or more ADV_SG_BLOCK each with 15 scatter-gather
876 * structures or 255 scatter-gather elements.
881 * Define maximum number of scatter-gather elements per request.
919 /* bit 13 set - Term Polarity Control */
920 /* bit 14 set - BIOS Enable */
921 /* bit 15 set - Big Endian Mode */
929 ushort scam_tolerant; /* 08 no scam */
939 uchar termination; /* 11 0 - automatic */
940 /* 1 - low off / high off */
941 /* 2 - low off / high on */
942 /* 3 - low on / high on */
943 /* There is no low on / high off */
959 /* bit 11 No verbose initialization. */
988 /* bit 13 set - Load CIS */
989 /* bit 14 set - BIOS Enable */
990 /* bit 15 set - Big Endian Mode */
994 ushort sdtr_speed1; /* 04 SDTR Speed TID 0-3 */
998 ushort scam_tolerant; /* 08 no scam */
1008 uchar termination_se; /* 11 0 - automatic */
1009 /* 1 - low off / high off */
1010 /* 2 - low off / high on */
1011 /* 3 - low on / high on */
1012 /* There is no low on / high off */
1014 uchar termination_lvd; /* 11 0 - automatic */
1015 /* 1 - low off / high off */
1016 /* 2 - low off / high on */
1017 /* 3 - low on / high on */
1018 /* There is no low on / high off */
1032 /* bit 11 No verbose initialization. */
1037 ushort sdtr_speed2; /* 13 SDTR speed TID 4-7 */
1038 ushort sdtr_speed3; /* 14 SDTR speed TID 8-11 */
1042 ushort sdtr_speed4; /* 17 SDTR speed 4 TID 12-15 */
1088 /* bit 11 set - Func. 0 INTB, Func. 1 INTA */
1089 /* clear - Func. 0 INTA, Func. 1 INTB */
1090 /* bit 13 set - Load CIS */
1091 /* bit 14 set - BIOS Enable */
1092 /* bit 15 set - Big Endian Mode */
1096 ushort sdtr_speed1; /* 04 SDTR Speed TID 0-3 */
1100 ushort scam_tolerant; /* 08 no scam */
1110 uchar termination_se; /* 11 0 - automatic */
1111 /* 1 - low off / high off */
1112 /* 2 - low off / high on */
1113 /* 3 - low on / high on */
1114 /* There is no low on / high off */
1116 uchar termination_lvd; /* 11 0 - automatic */
1117 /* 1 - low off / high off */
1118 /* 2 - low off / high on */
1119 /* 3 - low on / high on */
1120 /* There is no low on / high off */
1134 /* bit 11 No verbose initialization. */
1139 ushort sdtr_speed2; /* 13 SDTR speed TID 4-7 */
1140 ushort sdtr_speed3; /* 14 SDTR speed TID 8-11 */
1144 ushort sdtr_speed4; /* 17 SDTR speed 4 TID 12-15 */
1210 * XXX - Since ASC38C1600 Rev.3 has a local RAM failure issue, there is
1304 #define IOPW_SFIFO_CNT 0x1E /* SFC */
1414 #define DIFF_MODE 0x0100 /* SCSI differential Mode (Read-Only) */
1415 #define DIFF_SENSE 0x0080 /* 1: No SE cables, 0: SE cable (Read-Only) */
1423 * Addendum for ASC-38C0800 Chip
1425 * The ASC-38C1600 Chip uses the same definitions except that the
1428 * SCSI_CFG1 are read-only and always available. Bit 14 (DIS_TERM_DRV)
1429 * is not needed. The [12:10] bits in IOPB_SOFT_OVER_WR are write-only.
1430 * Also each ASC-38C1600 function or channel uses only cable bits [5:4]
1475 #define BC_THRESH_ENB 0x80 /* PCI DMA Start Conditions */
1476 #define FIFO_THRESH 0x70 /* PCI DMA FIFO Threshold */
1484 #define START_CTL 0x0C /* DMA start conditions */
1495 * ASC-38C0800 RAM BIST Register bit definitions
1544 #define ADV_ERROR (-1)
1569 #define ASC_MC_SDTR_SPEED1 0x0090 /* SDTR Speed for TID 0-3 */
1570 #define ASC_MC_SDTR_SPEED2 0x0092 /* SDTR Speed for TID 4-7 */
1571 #define ASC_MC_SDTR_SPEED3 0x0094 /* SDTR Speed for TID 8-11 */
1572 #define ASC_MC_SDTR_SPEED4 0x0096 /* SDTR Speed for TID 12-15 */
1611 #define CONTROL_FLAG_IGNORE_PERR 0x0001 /* Ignore DMA Parity Errors */
1627 #define ASC_QC_DATA_OUT 0x02 /* Data out DMA transfer. */
1628 #define ASC_QC_START_MOTOR 0x04 /* Send auto-start motor before request. */
1646 * little-endian.
1681 #define ADV_CHIP_ASC3550 0x01 /* Ultra-Wide IC */
1682 #define ADV_CHIP_ASC38C0800 0x02 /* Ultra2-Wide/LVD IC */
1683 #define ADV_CHIP_ASC38C1600 0x03 /* Ultra3-Wide/LVD2 IC */
1699 uchar termination; /* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */
1724 * ADV_SCSI_REQ_Q - microcode request structure
1751 uchar cdb[12]; /* SCSI CDB bytes 0-11. */
1754 uchar cdb16[4]; /* SCSI CDB bytes 12-15. */
1758 * End of microcode structure - 60 bytes. The rest of the structure
1771 * to the Mid-Level SCSI request structure.
1774 * ADV_SG_BLOCK structure holds 15 scatter-gather elements. Under Linux
1775 * up to 255 scatter-gather elements may be used per request or
1783 struct adv_sgblk *next_sgblkp; /* Next scatter-gather structure. */
1789 struct scsi_cmnd *cmndp; /* Mid-Level SCSI command pointer. */
1791 adv_sgblk_t *sgblkp; /* Adv Library scatter-gather pointer. */
1813 ushort sdtr_speed1; /* EEPROM SDTR Speed for TID 0-3 */
1814 ushort sdtr_speed2; /* EEPROM SDTR Speed for TID 4-7 */
1815 ushort sdtr_speed3; /* EEPROM SDTR Speed for TID 8-11 */
1816 ushort sdtr_speed4; /* EEPROM SDTR Speed for TID 12-15 */
1873 #define ADV_RDMA_IN_CARR_AND_Q_INVALID 0x04 /* RDMAed-in data invalid. */
1921 /* Write little-endian double word (4 bytes) to LRAM */
1922 /* Because of unspecified C language ordering don't use auto-increment. */
1968 * ADV_TRUE(1) - Queue was successfully aborted.
1969 * ADV_FALSE(0) - Queue was not found on the active queue list.
1982 * ADV_TRUE(1) - All requests on the target are purged.
1983 * ADV_FALSE(0) - Couldn't issue Bus Device Reset Message; Requests
2020 #define QHSTA_M_SXFR_SDMA_ERR 0x16 /* SXFR_STATUS SCSI DMA Error */
2022 #define QHSTA_M_RDMA_PERR 0x18 /* RISC PCI DMA parity error */
2042 #define QHSTA_M_SGBACKUP_ERROR 0x47 /* Scatter-Gather backup error */
2051 * number of scatter-gather elements the driver supports in a
2057 ((ADV_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK))
2062 #define ASC_NARROW_BOARD(boardp) (((boardp)->flags & ASC_IS_WIDE_BOARD) == 0)
2064 #define NO_ISA_DMA 0xff /* No ISA DMA Channel Used */
2073 #define ASC_ERROR (-1)
2080 (((struct asc_board *) shost_priv(shost))->asc_stats.counter += (count))
2086 0 : ((((num) * 10)/(den)) - (10 * ((num)/(den)))))
2139 * 1: High-Level Tracing
2140 * 2-N: Verbose Tracing
2215 unsigned int xfer_elem; /* # scatter-gather elements */
2216 unsigned int xfer_sect; /* # 512-byte blocks */
2225 * field. It is guaranteed to be allocated from DMA-able memory.
2267 struct dma_pool *adv_sgblk_pool; /* Scatter-gather structures. */
2278 #define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
2291 "%d,\n", h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl); in asc_prt_asc_dvc_var()
2293 printk(" bus_type %d, init_sdtr 0x%x,\n", h->bus_type, in asc_prt_asc_dvc_var()
2294 (unsigned)h->init_sdtr); in asc_prt_asc_dvc_var()
2297 "chip_no 0x%x,\n", (unsigned)h->sdtr_done, in asc_prt_asc_dvc_var()
2298 (unsigned)h->use_tagged_qng, (unsigned)h->unit_not_ready, in asc_prt_asc_dvc_var()
2299 (unsigned)h->chip_no); in asc_prt_asc_dvc_var()
2302 "%u,\n", (unsigned)h->queue_full_or_busy, in asc_prt_asc_dvc_var()
2303 (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait); in asc_prt_asc_dvc_var()
2306 "in_critical_cnt %u,\n", (unsigned)h->is_in_int, in asc_prt_asc_dvc_var()
2307 (unsigned)h->max_total_qng, (unsigned)h->cur_total_qng, in asc_prt_asc_dvc_var()
2308 (unsigned)h->in_critical_cnt); in asc_prt_asc_dvc_var()
2311 "pci_fix_asyn_xfer 0x%x,\n", (unsigned)h->last_q_shortage, in asc_prt_asc_dvc_var()
2312 (unsigned)h->init_state, (unsigned)h->no_scam, in asc_prt_asc_dvc_var()
2313 (unsigned)h->pci_fix_asyn_xfer); in asc_prt_asc_dvc_var()
2315 printk(" cfg 0x%lx\n", (ulong)h->cfg); in asc_prt_asc_dvc_var()
2326 h->can_tagged_qng, h->cmd_qng_enabled); in asc_prt_asc_dvc_cfg()
2328 h->disc_enable, h->sdtr_enable); in asc_prt_asc_dvc_cfg()
2331 h->chip_scsi_id, h->chip_version); in asc_prt_asc_dvc_cfg()
2334 h->mcode_date, h->mcode_version); in asc_prt_asc_dvc_cfg()
2347 (ulong)h->iop_base, h->err_code, (unsigned)h->ultra_able); in asc_prt_adv_dvc_var()
2350 (unsigned)h->sdtr_able, (unsigned)h->wdtr_able); in asc_prt_adv_dvc_var()
2353 (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait); in asc_prt_adv_dvc_var()
2356 (unsigned)h->max_host_qng, (unsigned)h->max_dvc_qng, in asc_prt_adv_dvc_var()
2357 h->carr_freelist); in asc_prt_adv_dvc_var()
2359 printk(" icq_sp 0x%p, irq_sp 0x%p\n", h->icq_sp, h->irq_sp); in asc_prt_adv_dvc_var()
2362 (unsigned)h->no_scam, (unsigned)h->tagqng_able); in asc_prt_adv_dvc_var()
2365 (unsigned)h->chip_scsi_id, (ulong)h->cfg); in asc_prt_adv_dvc_var()
2378 h->disc_enable, h->termination); in asc_prt_adv_dvc_cfg()
2381 h->chip_version, h->mcode_date); in asc_prt_adv_dvc_cfg()
2384 h->mcode_version, h->control_flag); in asc_prt_adv_dvc_cfg()
2394 printk("Scsi_Host at addr 0x%p, device %s\n", s, dev_name(boardp->dev)); in asc_prt_scsi_host()
2396 scsi_host_busy(s), s->host_no); in asc_prt_scsi_host()
2399 (ulong)s->base, (ulong)s->io_port, boardp->irq); in asc_prt_scsi_host()
2402 s->dma_channel, s->this_id, s->can_queue); in asc_prt_scsi_host()
2405 s->cmd_per_lun, s->sg_tablesize); in asc_prt_scsi_host()
2408 asc_prt_asc_dvc_var(&boardp->dvc_var.asc_dvc_var); in asc_prt_scsi_host()
2409 asc_prt_asc_dvc_cfg(&boardp->dvc_cfg.asc_dvc_cfg); in asc_prt_scsi_host()
2411 asc_prt_adv_dvc_var(&boardp->dvc_var.adv_dvc_var); in asc_prt_scsi_host()
2412 asc_prt_adv_dvc_cfg(&boardp->dvc_cfg.adv_dvc_cfg); in asc_prt_scsi_host()
2420 * or 8 double-words per line.
2433 /* Display a maximum of 8 double-words per line. */ in asc_prt_hex()
2434 if ((k = (l - i) / 4) >= 8) { in asc_prt_hex()
2438 m = (l - i) % 4; in asc_prt_hex()
2485 q->q2.target_ix, q->q1.target_lun, q->q2.srb_tag, in asc_prt_asc_scsi_q()
2486 q->q2.tag_code); in asc_prt_asc_scsi_q()
2490 (ulong)le32_to_cpu(q->q1.data_addr), in asc_prt_asc_scsi_q()
2491 (ulong)le32_to_cpu(q->q1.data_cnt), in asc_prt_asc_scsi_q()
2492 (ulong)le32_to_cpu(q->q1.sense_addr), q->q1.sense_len); in asc_prt_asc_scsi_q()
2495 (ulong)q->cdbptr, q->q2.cdb_len, in asc_prt_asc_scsi_q()
2496 (ulong)q->sg_head, q->q1.sg_queue_cnt); in asc_prt_asc_scsi_q()
2498 if (q->sg_head) { in asc_prt_asc_scsi_q()
2499 sgp = q->sg_head; in asc_prt_asc_scsi_q()
2501 printk(" entry_cnt %u, queue_cnt %u\n", sgp->entry_cnt, in asc_prt_asc_scsi_q()
2502 sgp->queue_cnt); in asc_prt_asc_scsi_q()
2503 for (i = 0; i < sgp->entry_cnt; i++) { in asc_prt_asc_scsi_q()
2505 i, (ulong)le32_to_cpu(sgp->sg_list[i].addr), in asc_prt_asc_scsi_q()
2506 (ulong)le32_to_cpu(sgp->sg_list[i].bytes)); in asc_prt_asc_scsi_q()
2519 q->d2.srb_tag, q->d2.target_ix, q->d2.cdb_len, in asc_prt_asc_qdone_info()
2520 q->d2.tag_code); in asc_prt_asc_qdone_info()
2523 q->d3.done_stat, q->d3.host_stat, q->d3.scsi_stat, q->d3.scsi_msg); in asc_prt_asc_qdone_info()
2538 b->sg_cnt, (u32)le32_to_cpu(b->sg_ptr)); in asc_prt_adv_sgblock()
2539 BUG_ON(b->sg_cnt > NO_OF_SG_PER_BLOCK); in asc_prt_adv_sgblock()
2540 if (b->sg_ptr != 0) in asc_prt_adv_sgblock()
2541 BUG_ON(b->sg_cnt != NO_OF_SG_PER_BLOCK); in asc_prt_adv_sgblock()
2542 for (i = 0; i < b->sg_cnt; i++) { in asc_prt_adv_sgblock()
2544 i, (u32)le32_to_cpu(b->sg_list[i].sg_addr), in asc_prt_adv_sgblock()
2545 (u32)le32_to_cpu(b->sg_list[i].sg_count)); in asc_prt_adv_sgblock()
2563 q->target_id, q->target_lun, q->srb_tag); in asc_prt_adv_scsi_req_q()
2566 q->cntl, (ulong)le32_to_cpu(q->data_addr)); in asc_prt_adv_scsi_req_q()
2569 (ulong)le32_to_cpu(q->data_cnt), in asc_prt_adv_scsi_req_q()
2570 (ulong)le32_to_cpu(q->sense_addr), q->sense_len); in asc_prt_adv_scsi_req_q()
2574 q->cdb_len, q->done_status, q->host_status, q->scsi_status); in asc_prt_adv_scsi_req_q()
2577 q->sg_working_ix, q->target_cmd); in asc_prt_adv_scsi_req_q()
2580 (ulong)le32_to_cpu(q->scsiq_rptr), in asc_prt_adv_scsi_req_q()
2581 (ulong)le32_to_cpu(q->sg_real_addr), (ulong)q->sg_list_ptr); in asc_prt_adv_scsi_req_q()
2584 if (q->sg_list_ptr != NULL) { in asc_prt_adv_scsi_req_q()
2585 sgblkp = container_of(q->sg_list_ptr, adv_sgblk_t, sg_block); in asc_prt_adv_scsi_req_q()
2588 sg_ptr = &sgblkp->sg_block; in asc_prt_adv_scsi_req_q()
2590 if (sg_ptr->sg_ptr == 0) { in asc_prt_adv_scsi_req_q()
2593 sgblkp = sgblkp->next_sgblkp; in asc_prt_adv_scsi_req_q()
2619 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var; in advansys_info()
2622 if (asc_dvc_varp->bus_type & ASC_IS_VL) { in advansys_info()
2624 } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) { in advansys_info()
2626 } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) { in advansys_info()
2627 if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA) in advansys_info()
2636 "type %d\n", asc_dvc_varp->bus_type); in advansys_info()
2639 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X", in advansys_info()
2640 ASC_VERSION, busname, (ulong)shost->io_port, in advansys_info()
2641 (ulong)shost->io_port + ASC_IOADR_GAP - 1, in advansys_info()
2642 boardp->irq); in advansys_info()
2647 * Memory-mapped I/O is used instead of I/O space to access in advansys_info()
2651 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var; in advansys_info()
2652 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in advansys_info()
2653 widename = "Ultra-Wide"; in advansys_info()
2654 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in advansys_info()
2655 widename = "Ultra2-Wide"; in advansys_info()
2657 widename = "Ultra3-Wide"; in advansys_info()
2660 "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X", in advansys_info()
2661 ASC_VERSION, widename, (ulong)adv_dvc_varp->iop_base, in advansys_info()
2662 (ulong)adv_dvc_varp->iop_base + boardp->asc_n_io_port - 1, boardp->irq); in advansys_info()
2684 shost->host_no); in asc_prt_board_devices()
2687 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id; in asc_prt_board_devices()
2689 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id; in asc_prt_board_devices()
2694 if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) in asc_prt_board_devices()
2714 if (boardp->bios_signature != 0x55AA) { in asc_prt_adv_bios()
2715 seq_puts(m, "Disabled or Pre-3.1\n" in asc_prt_adv_bios()
2716 "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n" in asc_prt_adv_bios()
2719 major = (boardp->bios_version >> 12) & 0xF; in asc_prt_adv_bios()
2720 minor = (boardp->bios_version >> 8) & 0xF; in asc_prt_adv_bios()
2721 letter = (boardp->bios_version & 0xFF); in asc_prt_adv_bios()
2732 (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) { in asc_prt_adv_bios()
2741 * is found in at bit 15-9 (7 bits) of word 1.
2743 * Serial Number consists fo 12 alpha-numeric digits.
2745 * 1 - Product type (A,B,C,D..) Word0: 15-13 (3 bits)
2746 * 2 - MFG Location (A,B,C,D..) Word0: 12-10 (3 bits)
2747 * 3-4 - Product ID (0-99) Word0: 9-0 (10 bits)
2748 * 5 - Product revision (A-J) Word0: " "
2750 * Signature Word1: 15-9 (7 bits)
2751 * 6 - Year (0-9) Word1: 8-6 (3 bits) & Word2: 15 (1 bit)
2752 * 7-8 - Week of the year (1-52) Word1: 5-0 (6 bits)
2754 * 9-12 - Serial Number (A001-Z999) Word2: 14-0 (15 bits)
2770 * First word - 6 digits. in asc_get_eeprom_string()
2774 /* Product type - 1st digit. */ in asc_get_eeprom_string()
2781 /* Manufacturing location - 2nd digit. */ in asc_get_eeprom_string()
2784 /* Product ID - 3rd, 4th digits. */ in asc_get_eeprom_string()
2790 /* Product revision - 5th digit. */ in asc_get_eeprom_string()
2799 * Year - 6th digit. in asc_get_eeprom_string()
2810 /* Week of year - 7th, 8th digits. */ in asc_get_eeprom_string()
2821 /* Serial number - 9th digit. */ in asc_get_eeprom_string()
2849 ep = &boardp->eep_config.asc_eep; in asc_prt_asc_board_eeprom()
2853 shost->host_no); in asc_prt_asc_board_eeprom()
2855 if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr) in asc_prt_asc_board_eeprom()
2858 else if (ep->adapter_info[5] == 0xBB) in asc_prt_asc_board_eeprom()
2860 " Default Settings Used for EEPROM-less Adapter.\n"); in asc_prt_asc_board_eeprom()
2866 ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng, in asc_prt_asc_board_eeprom()
2867 ep->max_tag_qng); in asc_prt_asc_board_eeprom()
2870 " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam); in asc_prt_asc_board_eeprom()
2879 (ep->disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); in asc_prt_asc_board_eeprom()
2884 (ep->use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); in asc_prt_asc_board_eeprom()
2889 (ep->start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); in asc_prt_asc_board_eeprom()
2894 (ep->init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); in asc_prt_asc_board_eeprom()
2917 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var; in asc_prt_adv_board_eeprom()
2918 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
2919 ep_3550 = &boardp->eep_config.adv_3550_eep; in asc_prt_adv_board_eeprom()
2920 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
2921 ep_38C0800 = &boardp->eep_config.adv_38C0800_eep; in asc_prt_adv_board_eeprom()
2923 ep_38C1600 = &boardp->eep_config.adv_38C1600_eep; in asc_prt_adv_board_eeprom()
2928 shost->host_no); in asc_prt_adv_board_eeprom()
2930 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
2931 wordp = &ep_3550->serial_number_word1; in asc_prt_adv_board_eeprom()
2932 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
2933 wordp = &ep_38C0800->serial_number_word1; in asc_prt_adv_board_eeprom()
2935 wordp = &ep_38C1600->serial_number_word1; in asc_prt_adv_board_eeprom()
2943 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) in asc_prt_adv_board_eeprom()
2946 ep_3550->adapter_scsi_id, in asc_prt_adv_board_eeprom()
2947 ep_3550->max_host_qng, ep_3550->max_dvc_qng); in asc_prt_adv_board_eeprom()
2948 else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) in asc_prt_adv_board_eeprom()
2951 ep_38C0800->adapter_scsi_id, in asc_prt_adv_board_eeprom()
2952 ep_38C0800->max_host_qng, in asc_prt_adv_board_eeprom()
2953 ep_38C0800->max_dvc_qng); in asc_prt_adv_board_eeprom()
2957 ep_38C1600->adapter_scsi_id, in asc_prt_adv_board_eeprom()
2958 ep_38C1600->max_host_qng, in asc_prt_adv_board_eeprom()
2959 ep_38C1600->max_dvc_qng); in asc_prt_adv_board_eeprom()
2960 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
2961 word = ep_3550->termination; in asc_prt_adv_board_eeprom()
2962 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
2963 word = ep_38C0800->termination_lvd; in asc_prt_adv_board_eeprom()
2965 word = ep_38C1600->termination_lvd; in asc_prt_adv_board_eeprom()
2983 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) in asc_prt_adv_board_eeprom()
2986 ep_3550->termination, termstr, in asc_prt_adv_board_eeprom()
2987 ep_3550->bios_ctrl); in asc_prt_adv_board_eeprom()
2988 else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) in asc_prt_adv_board_eeprom()
2991 ep_38C0800->termination_lvd, termstr, in asc_prt_adv_board_eeprom()
2992 ep_38C0800->bios_ctrl); in asc_prt_adv_board_eeprom()
2996 ep_38C1600->termination_lvd, termstr, in asc_prt_adv_board_eeprom()
2997 ep_38C1600->bios_ctrl); in asc_prt_adv_board_eeprom()
3004 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
3005 word = ep_3550->disc_enable; in asc_prt_adv_board_eeprom()
3006 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
3007 word = ep_38C0800->disc_enable; in asc_prt_adv_board_eeprom()
3009 word = ep_38C1600->disc_enable; in asc_prt_adv_board_eeprom()
3017 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
3018 word = ep_3550->tagqng_able; in asc_prt_adv_board_eeprom()
3019 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
3020 word = ep_38C0800->tagqng_able; in asc_prt_adv_board_eeprom()
3022 word = ep_38C1600->tagqng_able; in asc_prt_adv_board_eeprom()
3030 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
3031 word = ep_3550->start_motor; in asc_prt_adv_board_eeprom()
3032 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
3033 word = ep_38C0800->start_motor; in asc_prt_adv_board_eeprom()
3035 word = ep_38C1600->start_motor; in asc_prt_adv_board_eeprom()
3043 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
3047 (ep_3550->sdtr_able & ADV_TID_TO_TIDMASK(i)) ? in asc_prt_adv_board_eeprom()
3052 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
3056 (ep_3550->ultra_able & ADV_TID_TO_TIDMASK(i)) in asc_prt_adv_board_eeprom()
3061 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in asc_prt_adv_board_eeprom()
3062 word = ep_3550->wdtr_able; in asc_prt_adv_board_eeprom()
3063 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in asc_prt_adv_board_eeprom()
3064 word = ep_38C0800->wdtr_able; in asc_prt_adv_board_eeprom()
3066 word = ep_38C1600->wdtr_able; in asc_prt_adv_board_eeprom()
3074 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 || in asc_prt_adv_board_eeprom()
3075 adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) { in asc_prt_adv_board_eeprom()
3081 sdtr_speed = adv_dvc_varp->sdtr_speed1; in asc_prt_adv_board_eeprom()
3083 sdtr_speed = adv_dvc_varp->sdtr_speed2; in asc_prt_adv_board_eeprom()
3085 sdtr_speed = adv_dvc_varp->sdtr_speed3; in asc_prt_adv_board_eeprom()
3087 sdtr_speed = adv_dvc_varp->sdtr_speed4; in asc_prt_adv_board_eeprom()
3130 shost->host_no); in asc_prt_driver_conf()
3134 scsi_host_busy(shost), shost->max_id, in asc_prt_driver_conf()
3135 shost->max_lun, shost->max_channel); in asc_prt_driver_conf()
3139 shost->unique_id, shost->can_queue, shost->this_id, in asc_prt_driver_conf()
3140 shost->sg_tablesize, shost->cmd_per_lun); in asc_prt_driver_conf()
3144 boardp->flags, shost->last_reset, jiffies, in asc_prt_driver_conf()
3145 boardp->asc_n_io_port); in asc_prt_driver_conf()
3147 seq_printf(m, " io_port 0x%lx\n", shost->io_port); in asc_prt_driver_conf()
3164 v = &boardp->dvc_var.asc_dvc_var; in asc_prt_asc_board_info()
3165 c = &boardp->dvc_cfg.asc_dvc_cfg; in asc_prt_asc_board_info()
3166 chip_scsi_id = c->chip_scsi_id; in asc_prt_asc_board_info()
3170 shost->host_no); in asc_prt_asc_board_info()
3174 c->chip_version, c->mcode_date, c->mcode_version, in asc_prt_asc_board_info()
3175 v->err_code); in asc_prt_asc_board_info()
3179 " Total Command Pending: %d\n", v->cur_total_qng); in asc_prt_asc_board_info()
3184 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_asc_board_info()
3189 (v->use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); in asc_prt_asc_board_info()
3196 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_asc_board_info()
3199 seq_printf(m, " %X:%u", i, v->cur_dvc_qng[i]); in asc_prt_asc_board_info()
3206 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_asc_board_info()
3209 seq_printf(m, " %X:%u", i, v->max_dvc_qng[i]); in asc_prt_asc_board_info()
3216 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_asc_board_info()
3219 if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) in asc_prt_asc_board_info()
3220 seq_printf(m, " %X:Y-%d", in asc_prt_asc_board_info()
3221 i, boardp->queue_full_cnt[i]); in asc_prt_asc_board_info()
3229 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_asc_board_info()
3234 (v->sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); in asc_prt_asc_board_info()
3242 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) || in asc_prt_asc_board_info()
3243 ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_asc_board_info()
3249 if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) { in asc_prt_asc_board_info()
3253 (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index - in asc_prt_asc_board_info()
3258 v->sdtr_period_tbl[syn_period_ix], in asc_prt_asc_board_info()
3259 250 / v->sdtr_period_tbl[syn_period_ix], in asc_prt_asc_board_info()
3261 v->sdtr_period_tbl[syn_period_ix])); in asc_prt_asc_board_info()
3264 boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET); in asc_prt_asc_board_info()
3267 if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) { in asc_prt_asc_board_info()
3276 seq_puts(m, " * = Re-negotiation pending before next command.\n"); in asc_prt_asc_board_info()
3301 v = &boardp->dvc_var.adv_dvc_var; in asc_prt_adv_board_info()
3302 c = &boardp->dvc_cfg.adv_dvc_cfg; in asc_prt_adv_board_info()
3303 iop_base = v->iop_base; in asc_prt_adv_board_info()
3304 chip_scsi_id = v->chip_scsi_id; in asc_prt_adv_board_info()
3308 shost->host_no); in asc_prt_adv_board_info()
3312 (unsigned long)v->iop_base, in asc_prt_adv_board_info()
3314 v->err_code); in asc_prt_adv_board_info()
3317 "mcode_version 0x%x\n", c->chip_version, in asc_prt_adv_board_info()
3318 c->mcode_date, c->mcode_version); in asc_prt_adv_board_info()
3324 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_adv_board_info()
3336 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_adv_board_info()
3349 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_adv_board_info()
3364 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_adv_board_info()
3378 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_adv_board_info()
3401 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { in asc_prt_adv_board_info()
3420 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) || in asc_prt_adv_board_info()
3463 seq_puts(m, " * = Re-negotiation pending before next command.\n"); in asc_prt_adv_board_info()
3474 struct asc_stats *s = &boardp->asc_stats; in asc_prt_board_stats()
3478 shost->host_no); in asc_prt_board_stats()
3482 s->queuecommand, s->reset, s->biosparam, in asc_prt_board_stats()
3483 s->interrupt); in asc_prt_board_stats()
3487 s->callback, s->done, s->build_error, in asc_prt_board_stats()
3488 s->adv_build_noreq, s->adv_build_nosg); in asc_prt_board_stats()
3492 s->exe_noerror, s->exe_busy, s->exe_error, in asc_prt_board_stats()
3493 s->exe_unknown); in asc_prt_board_stats()
3498 if (s->xfer_cnt > 0) { in asc_prt_board_stats()
3500 s->xfer_cnt, s->xfer_elem); in asc_prt_board_stats()
3503 s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2)); in asc_prt_board_stats()
3507 s->xfer_elem / s->xfer_cnt, in asc_prt_board_stats()
3508 ASC_TENTHS(s->xfer_elem, s->xfer_cnt)); in asc_prt_board_stats()
3511 (s->xfer_sect / 2) / s->xfer_elem, in asc_prt_board_stats()
3512 ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem)); in asc_prt_board_stats()
3515 (s->xfer_sect / 2) / s->xfer_cnt, in asc_prt_board_stats()
3516 ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt)); in asc_prt_board_stats()
3522 * advansys_show_info() - /proc/scsi/advansys/{0,1,2,3,...}
3594 ASC_STATS(scp->device->host, done); in asc_scsi_done()
3595 scp->scsi_done(scp); in asc_scsi_done()
3663 iop_base = asc_dvc->iop_base; in AscResetChipAndScsiBus()
3665 && (i-- > 0)) { in AscResetChipAndScsiBus()
3721 AscSetChipLramAddr(iop_base, addr - 1); in AscReadLramByte()
3763 addr--; in AscWriteLramByte()
3778 * The source data is assumed to be in little-endian order in memory
3779 * and is maintained in little-endian order when written to LRAM.
3790 * On a little-endian system the second argument below in AscMemWordCopyPtrToLram()
3791 * produces a little-endian ushort which is written to in AscMemWordCopyPtrToLram()
3792 * LRAM in little-endian order. On a big-endian system in AscMemWordCopyPtrToLram()
3793 * the second argument produces a big-endian ushort which in AscMemWordCopyPtrToLram()
3794 * is "transparently" byte-swapped by outpw() and written in AscMemWordCopyPtrToLram()
3795 * in little-endian order to LRAM. in AscMemWordCopyPtrToLram()
3805 * The source data is assumed to be in little-endian order in memory
3806 * and is maintained in little-endian order when written to LRAM.
3824 * The source data is assumed to be in little-endian order in LRAM
3825 * and is maintained in little-endian order when written to memory.
3859 iop_base = asc_dvc->iop_base; in AscInitLram()
3861 (ushort)(((int)(asc_dvc->max_total_qng + 2 + 1) * in AscInitLram()
3868 (uchar)(asc_dvc->max_total_qng)); in AscInitLram()
3873 for (; i < asc_dvc->max_total_qng; i++, s_addr += ASC_QBLK_SIZE) { in AscInitLram()
3877 (uchar)(i - 1)); in AscInitLram()
3884 (uchar)(asc_dvc->max_total_qng - 1)); in AscInitLram()
3886 (uchar)asc_dvc->max_total_qng); in AscInitLram()
3889 for (; i <= (uchar)(asc_dvc->max_total_qng + 3); in AscInitLram()
3917 (ushort)((mcode_size - in AscLoadMicroCode()
3918 s_addr - (ushort) in AscLoadMicroCode()
3933 iop_base = asc_dvc->iop_base; in AscInitQLinkVar()
3935 AscPutRiscVarDoneQTail(iop_base, asc_dvc->max_total_qng); in AscInitQLinkVar()
3937 AscPutVarDoneQTail(iop_base, asc_dvc->max_total_qng); in AscInitQLinkVar()
3939 (uchar)((int)asc_dvc->max_total_qng + 1)); in AscInitQLinkVar()
3941 (uchar)((int)asc_dvc->max_total_qng + 2)); in AscInitQLinkVar()
3943 asc_dvc->max_total_qng); in AscInitQLinkVar()
3965 iop_base = asc_dvc->iop_base; in AscInitMicroCodeVar()
3969 asc_dvc->cfg->sdtr_period_offset[i]); in AscInitMicroCodeVar()
3974 asc_dvc->cfg->disc_enable); in AscInitMicroCodeVar()
3976 ASC_TID_TO_TARGET_ID(asc_dvc->cfg->chip_scsi_id)); in AscInitMicroCodeVar()
3979 BUG_ON((unsigned long)asc_dvc->overrun_buf & 7); in AscInitMicroCodeVar()
3980 asc_dvc->overrun_dma = dma_map_single(board->dev, asc_dvc->overrun_buf, in AscInitMicroCodeVar()
3982 if (dma_mapping_error(board->dev, asc_dvc->overrun_dma)) { in AscInitMicroCodeVar()
3983 warn_code = -ENOMEM; in AscInitMicroCodeVar()
3986 phy_addr = cpu_to_le32(asc_dvc->overrun_dma); in AscInitMicroCodeVar()
3993 asc_dvc->cfg->mcode_date = in AscInitMicroCodeVar()
3995 asc_dvc->cfg->mcode_version = in AscInitMicroCodeVar()
4000 asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR; in AscInitMicroCodeVar()
4001 warn_code = -EINVAL; in AscInitMicroCodeVar()
4005 asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP; in AscInitMicroCodeVar()
4006 warn_code = -EIO; in AscInitMicroCodeVar()
4013 dma_unmap_single(board->dev, asc_dvc->overrun_dma, in AscInitMicroCodeVar()
4016 asc_dvc->overrun_dma = 0; in AscInitMicroCodeVar()
4029 iop_base = asc_dvc->iop_base; in AscInitAsc1000Driver()
4031 if ((asc_dvc->dvc_cntl & ASC_CNTL_RESET_SCSI) && in AscInitAsc1000Driver()
4032 !(asc_dvc->init_state & ASC_INIT_RESET_SCSI_DONE)) { in AscInitAsc1000Driver()
4034 mdelay(asc_dvc->scsi_reset_wait * 1000); /* XXX: msleep? */ in AscInitAsc1000Driver()
4036 asc_dvc->init_state |= ASC_INIT_STATE_BEG_LOAD_MC; in AscInitAsc1000Driver()
4037 if (asc_dvc->err_code != 0) in AscInitAsc1000Driver()
4039 if (!AscFindSignature(asc_dvc->iop_base)) { in AscInitAsc1000Driver()
4040 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; in AscInitAsc1000Driver()
4046 err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); in AscInitAsc1000Driver()
4050 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; in AscInitAsc1000Driver()
4053 if (fw->size < 4) { in AscInitAsc1000Driver()
4055 fw->size, fwname); in AscInitAsc1000Driver()
4057 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; in AscInitAsc1000Driver()
4058 return -EINVAL; in AscInitAsc1000Driver()
4060 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | in AscInitAsc1000Driver()
4061 (fw->data[1] << 8) | fw->data[0]; in AscInitAsc1000Driver()
4063 if (AscLoadMicroCode(iop_base, 0, &fw->data[4], in AscInitAsc1000Driver()
4064 fw->size - 4) != chksum) { in AscInitAsc1000Driver()
4065 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; in AscInitAsc1000Driver()
4071 if (!asc_dvc->overrun_dma) in AscInitAsc1000Driver()
4073 asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC; in AscInitAsc1000Driver()
4088 * 1-Byte Code:
4094 * Multi-Byte Code:
4159 carr_paddr = adv_dvc->carrier_addr + carr_offset; in AdvBuildCarrierFreelist()
4161 adv_dvc->carrier[i].carr_pa = cpu_to_le32(carr_paddr); in AdvBuildCarrierFreelist()
4162 adv_dvc->carrier[i].carr_va = cpu_to_le32(carr_offset); in AdvBuildCarrierFreelist()
4163 adv_dvc->carrier[i].areq_vpa = 0; in AdvBuildCarrierFreelist()
4167 adv_dvc->carrier[i].next_vpa = cpu_to_le32(next_offset); in AdvBuildCarrierFreelist()
4175 adv_dvc->carr_freelist = &adv_dvc->carrier[1]; in AdvBuildCarrierFreelist()
4185 return &adv_dvc->carrier[index]; in adv_get_carrier()
4190 ADV_CARR_T *carrp = adv_dvc->carr_freelist; in adv_get_next_carrier()
4191 u32 next_vpa = le32_to_cpu(carrp->next_vpa); in adv_get_next_carrier()
4198 adv_dvc->carr_freelist = adv_get_carrier(adv_dvc, next_vpa); in adv_get_next_carrier()
4202 carrp->next_vpa = cpu_to_le32(ADV_CQ_STOPPER); in adv_get_next_carrier()
4212 struct asc_board *boardp = adv_dvc->drv_ptr; in adv_get_reqp()
4214 BUG_ON(offset > adv_dvc->max_host_qng); in adv_get_reqp()
4215 return &boardp->adv_reqp[offset]; in adv_get_reqp()
4224 * But the function is not re-entrant, so it uses the DvcEnter/LeaveCritical()
4228 * ADV_TRUE - command completed successfully
4229 * ADV_FALSE - command failed
4230 * ADV_ERROR - command timed out
4239 iop_base = asc_dvc->iop_base; in AdvSendIdleCmd()
4243 * to a non-zero value to indicate when the command is completed. in AdvSendIdleCmd()
4244 * The non-zero result is one of the IDLE_CMD_STATUS_* values in AdvSendIdleCmd()
4262 if (asc_dvc->chip_type == ADV_CHIP_ASC3550) { in AdvSendIdleCmd()
4264 * Clear the tickle value. In the ASC-3550 the RISC flag in AdvSendIdleCmd()
4291 * ADV_TRUE(1) - All requests are purged and SCSI Bus is reset.
4292 * ADV_FALSE(0) - Microcode command failed.
4293 * ADV_ERROR(-1) - Microcode command timed-out. Microcode or IC
4312 * The hold time delay is done on the host because the RISC has no in AdvResetSB()
4318 * Send the SCSI Bus Reset end idle command which de-asserts in AdvResetSB()
4326 mdelay(asc_dvc->scsi_reset_wait * 1000); /* XXX: msleep? */ in AdvResetSB()
4332 * Initialize the ASC-3550.
4336 * For a non-fatal error return a warning code. If there are no warnings
4356 ushort bios_mem[ASC_MC_BIOSLEN / 2]; /* BIOS RISC Memory 0x40-0x8F. */ in AdvInitAsc3550Driver()
4361 if (asc_dvc->err_code != 0) in AdvInitAsc3550Driver()
4367 if (asc_dvc->chip_type != ADV_CHIP_ASC3550) { in AdvInitAsc3550Driver()
4368 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE; in AdvInitAsc3550Driver()
4373 iop_base = asc_dvc->iop_base; in AdvInitAsc3550Driver()
4391 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == 0x55AA) { in AdvInitAsc3550Driver()
4395 bios_mem[(ASC_MC_BIOS_VERSION - ASC_MC_BIOSMEM) / 2]; in AdvInitAsc3550Driver()
4412 err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); in AdvInitAsc3550Driver()
4416 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; in AdvInitAsc3550Driver()
4419 if (fw->size < 4) { in AdvInitAsc3550Driver()
4421 fw->size, fwname); in AdvInitAsc3550Driver()
4423 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; in AdvInitAsc3550Driver()
4424 return -EINVAL; in AdvInitAsc3550Driver()
4426 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | in AdvInitAsc3550Driver()
4427 (fw->data[1] << 8) | fw->data[0]; in AdvInitAsc3550Driver()
4428 asc_dvc->err_code = AdvLoadMicrocode(iop_base, &fw->data[4], in AdvInitAsc3550Driver()
4429 fw->size - 4, ADV_3550_MEMSIZE, in AdvInitAsc3550Driver()
4432 if (asc_dvc->err_code) in AdvInitAsc3550Driver()
4460 asc_dvc->cfg->mcode_date); in AdvInitAsc3550Driver()
4462 asc_dvc->cfg->mcode_version); in AdvInitAsc3550Driver()
4473 * to ignore DMA parity errors. in AdvInitAsc3550Driver()
4475 if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) { in AdvInitAsc3550Driver()
4482 * For ASC-3550, setting the START_CTL_EMFU [3:2] bits sets a FIFO in AdvInitAsc3550Driver()
4500 if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) { in AdvInitAsc3550Driver()
4502 asc_dvc->wdtr_able); in AdvInitAsc3550Driver()
4504 asc_dvc->sdtr_able); in AdvInitAsc3550Driver()
4517 * 4-bit speed SDTR speed name in AdvInitAsc3550Driver()
4531 if (ADV_TID_TO_TIDMASK(tid) & asc_dvc->ultra_able) { in AdvInitAsc3550Driver()
4557 asc_dvc->cfg->disc_enable); in AdvInitAsc3550Driver()
4567 asc_dvc->chip_scsi_id); in AdvInitAsc3550Driver()
4584 asc_dvc->err_code |= ASC_IERR_ILLEGAL_CONNECTION; in AdvInitAsc3550Driver()
4594 asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE; in AdvInitAsc3550Driver()
4599 * If this is a differential board and a single-ended device in AdvInitAsc3550Driver()
4603 asc_dvc->err_code |= ASC_IERR_SINGLE_END_DEVICE; in AdvInitAsc3550Driver()
4612 * then 'termination' was set-up in AdvInitFrom3550EEPROM() and in AdvInitAsc3550Driver()
4615 if (asc_dvc->cfg->termination == 0) { in AdvInitAsc3550Driver()
4620 asc_dvc->cfg->termination |= TERM_CTL_SEL; in AdvInitAsc3550Driver()
4630 asc_dvc->cfg->termination |= (TERM_CTL_H | TERM_CTL_L); in AdvInitAsc3550Driver()
4639 asc_dvc->cfg->termination |= TERM_CTL_H; in AdvInitAsc3550Driver()
4660 scsi_cfg1 |= (TERM_CTL_SEL | (~asc_dvc->cfg->termination & TERM_CTL)); in AdvInitAsc3550Driver()
4680 * MEM_CFG may be accessed as a word or byte, but only bits 0-7 in AdvInitAsc3550Driver()
4683 * ASC-3550 has 8KB internal memory. in AdvInitAsc3550Driver()
4695 ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id)); in AdvInitAsc3550Driver()
4700 * Set-up the Host->RISC Initiator Command Queue (ICQ). in AdvInitAsc3550Driver()
4703 asc_dvc->icq_sp = adv_get_next_carrier(asc_dvc); in AdvInitAsc3550Driver()
4704 if (!asc_dvc->icq_sp) { in AdvInitAsc3550Driver()
4705 asc_dvc->err_code |= ASC_IERR_NO_CARRIER; in AdvInitAsc3550Driver()
4712 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa); in AdvInitAsc3550Driver()
4715 * Set-up the RISC->Host Initiator Response Queue (IRQ). in AdvInitAsc3550Driver()
4717 asc_dvc->irq_sp = adv_get_next_carrier(asc_dvc); in AdvInitAsc3550Driver()
4718 if (!asc_dvc->irq_sp) { in AdvInitAsc3550Driver()
4719 asc_dvc->err_code |= ASC_IERR_NO_CARRIER; in AdvInitAsc3550Driver()
4726 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa); in AdvInitAsc3550Driver()
4727 asc_dvc->carr_pending_cnt = 0; in AdvInitAsc3550Driver()
4744 if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) { in AdvInitAsc3550Driver()
4750 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == in AdvInitAsc3550Driver()
4775 * Initialize the ASC-38C0800.
4779 * For a non-fatal error return a warning code. If there are no warnings
4800 ushort bios_mem[ASC_MC_BIOSLEN / 2]; /* BIOS RISC Memory 0x40-0x8F. */ in AdvInitAsc38C0800Driver()
4805 if (asc_dvc->err_code != 0) in AdvInitAsc38C0800Driver()
4811 if (asc_dvc->chip_type != ADV_CHIP_ASC38C0800) { in AdvInitAsc38C0800Driver()
4812 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE; in AdvInitAsc38C0800Driver()
4817 iop_base = asc_dvc->iop_base; in AdvInitAsc38C0800Driver()
4844 * RAM BIST (RAM Built-In Self Test) in AdvInitAsc38C0800Driver()
4847 * Function: Bit 7-6(RW) : RAM mode in AdvInitAsc38C0800Driver()
4849 * Pre-test Mode : 0x40 in AdvInitAsc38C0800Driver()
4853 * Bit 3-0(RO) : Status in AdvInitAsc38C0800Driver()
4858 * No Error : 0x00 in AdvInitAsc38C0800Driver()
4865 * LRAM Pre-test in AdvInitAsc38C0800Driver()
4878 asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST; in AdvInitAsc38C0800Driver()
4886 asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST; in AdvInitAsc38C0800Driver()
4892 * LRAM Test - It takes about 1.5 ms to run through the test. in AdvInitAsc38C0800Driver()
4904 asc_dvc->bist_err_code = byte; /* for BIOS display message */ in AdvInitAsc38C0800Driver()
4905 asc_dvc->err_code = ASC_IERR_BIST_RAM_TEST; in AdvInitAsc38C0800Driver()
4912 err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); in AdvInitAsc38C0800Driver()
4916 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; in AdvInitAsc38C0800Driver()
4919 if (fw->size < 4) { in AdvInitAsc38C0800Driver()
4921 fw->size, fwname); in AdvInitAsc38C0800Driver()
4923 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; in AdvInitAsc38C0800Driver()
4924 return -EINVAL; in AdvInitAsc38C0800Driver()
4926 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | in AdvInitAsc38C0800Driver()
4927 (fw->data[1] << 8) | fw->data[0]; in AdvInitAsc38C0800Driver()
4928 asc_dvc->err_code = AdvLoadMicrocode(iop_base, &fw->data[4], in AdvInitAsc38C0800Driver()
4929 fw->size - 4, ADV_38C0800_MEMSIZE, in AdvInitAsc38C0800Driver()
4932 if (asc_dvc->err_code) in AdvInitAsc38C0800Driver()
4960 asc_dvc->cfg->mcode_date); in AdvInitAsc38C0800Driver()
4962 asc_dvc->cfg->mcode_version); in AdvInitAsc38C0800Driver()
4985 * to ignore DMA parity errors. in AdvInitAsc38C0800Driver()
4987 if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) { in AdvInitAsc38C0800Driver()
4994 * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2] in AdvInitAsc38C0800Driver()
4997 * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes. in AdvInitAsc38C0800Driver()
4999 * For DMA Errata #4 set the BC_THRESH_ENB bit. in AdvInitAsc38C0800Driver()
5017 if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) { in AdvInitAsc38C0800Driver()
5019 asc_dvc->wdtr_able); in AdvInitAsc38C0800Driver()
5021 asc_dvc->sdtr_able); in AdvInitAsc38C0800Driver()
5034 asc_dvc->cfg->disc_enable); in AdvInitAsc38C0800Driver()
5035 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1); in AdvInitAsc38C0800Driver()
5036 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2); in AdvInitAsc38C0800Driver()
5037 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3); in AdvInitAsc38C0800Driver()
5038 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4); in AdvInitAsc38C0800Driver()
5048 asc_dvc->chip_scsi_id); in AdvInitAsc38C0800Driver()
5066 asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE; in AdvInitAsc38C0800Driver()
5078 * error. However, there is no way to detect HVD device attached to in AdvInitAsc38C0800Driver()
5082 asc_dvc->err_code = ASC_IERR_HVD_DEVICE; in AdvInitAsc38C0800Driver()
5091 * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready in AdvInitAsc38C0800Driver()
5094 if ((asc_dvc->cfg->termination & TERM_SE) == 0) { in AdvInitAsc38C0800Driver()
5101 asc_dvc->cfg->termination |= TERM_SE; in AdvInitAsc38C0800Driver()
5106 asc_dvc->cfg->termination |= TERM_SE_HI; in AdvInitAsc38C0800Driver()
5111 if ((asc_dvc->cfg->termination & TERM_LVD) == 0) { in AdvInitAsc38C0800Driver()
5118 asc_dvc->cfg->termination |= TERM_LVD; in AdvInitAsc38C0800Driver()
5135 scsi_cfg1 |= (~asc_dvc->cfg->termination & 0xF0); in AdvInitAsc38C0800Driver()
5161 * MEM_CFG may be accessed as a word or byte, but only bits 0-7 in AdvInitAsc38C0800Driver()
5164 * ASC-38C0800 has 16KB internal memory. in AdvInitAsc38C0800Driver()
5176 ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id)); in AdvInitAsc38C0800Driver()
5181 * Set-up the Host->RISC Initiator Command Queue (ICQ). in AdvInitAsc38C0800Driver()
5184 asc_dvc->icq_sp = adv_get_next_carrier(asc_dvc); in AdvInitAsc38C0800Driver()
5185 if (!asc_dvc->icq_sp) { in AdvInitAsc38C0800Driver()
5187 asc_dvc->err_code |= ASC_IERR_NO_CARRIER; in AdvInitAsc38C0800Driver()
5195 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa); in AdvInitAsc38C0800Driver()
5198 * Set-up the RISC->Host Initiator Response Queue (IRQ). in AdvInitAsc38C0800Driver()
5200 asc_dvc->irq_sp = adv_get_next_carrier(asc_dvc); in AdvInitAsc38C0800Driver()
5201 if (!asc_dvc->irq_sp) { in AdvInitAsc38C0800Driver()
5203 asc_dvc->err_code |= ASC_IERR_NO_CARRIER; in AdvInitAsc38C0800Driver()
5212 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa); in AdvInitAsc38C0800Driver()
5213 asc_dvc->carr_pending_cnt = 0; in AdvInitAsc38C0800Driver()
5230 if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) { in AdvInitAsc38C0800Driver()
5236 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == in AdvInitAsc38C0800Driver()
5261 * Initialize the ASC-38C1600.
5265 * For a non-fatal error return a warning code. If there are no warnings
5286 ushort bios_mem[ASC_MC_BIOSLEN / 2]; /* BIOS RISC Memory 0x40-0x8F. */ in AdvInitAsc38C1600Driver()
5291 if (asc_dvc->err_code != 0) { in AdvInitAsc38C1600Driver()
5298 if (asc_dvc->chip_type != ADV_CHIP_ASC38C1600) { in AdvInitAsc38C1600Driver()
5299 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE; in AdvInitAsc38C1600Driver()
5304 iop_base = asc_dvc->iop_base; in AdvInitAsc38C1600Driver()
5332 * RAM BIST (Built-In Self Test) in AdvInitAsc38C1600Driver()
5335 * Function: Bit 7-6(RW) : RAM mode in AdvInitAsc38C1600Driver()
5337 * Pre-test Mode : 0x40 in AdvInitAsc38C1600Driver()
5341 * Bit 3-0(RO) : Status in AdvInitAsc38C1600Driver()
5346 * No Error : 0x00 in AdvInitAsc38C1600Driver()
5353 * LRAM Pre-test in AdvInitAsc38C1600Driver()
5366 asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST; in AdvInitAsc38C1600Driver()
5374 asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST; in AdvInitAsc38C1600Driver()
5380 * LRAM Test - It takes about 1.5 ms to run through the test. in AdvInitAsc38C1600Driver()
5392 asc_dvc->bist_err_code = byte; /* for BIOS display message */ in AdvInitAsc38C1600Driver()
5393 asc_dvc->err_code = ASC_IERR_BIST_RAM_TEST; in AdvInitAsc38C1600Driver()
5400 err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev); in AdvInitAsc38C1600Driver()
5404 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; in AdvInitAsc38C1600Driver()
5407 if (fw->size < 4) { in AdvInitAsc38C1600Driver()
5409 fw->size, fwname); in AdvInitAsc38C1600Driver()
5411 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; in AdvInitAsc38C1600Driver()
5412 return -EINVAL; in AdvInitAsc38C1600Driver()
5414 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | in AdvInitAsc38C1600Driver()
5415 (fw->data[1] << 8) | fw->data[0]; in AdvInitAsc38C1600Driver()
5416 asc_dvc->err_code = AdvLoadMicrocode(iop_base, &fw->data[4], in AdvInitAsc38C1600Driver()
5417 fw->size - 4, ADV_38C1600_MEMSIZE, in AdvInitAsc38C1600Driver()
5420 if (asc_dvc->err_code) in AdvInitAsc38C1600Driver()
5448 asc_dvc->cfg->mcode_date); in AdvInitAsc38C1600Driver()
5450 asc_dvc->cfg->mcode_version); in AdvInitAsc38C1600Driver()
5473 * to ignore DMA parity errors. in AdvInitAsc38C1600Driver()
5475 if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) { in AdvInitAsc38C1600Driver()
5487 if ((asc_dvc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0) { in AdvInitAsc38C1600Driver()
5494 * For ASC-38C1600 use DMA_CFG0 default values: FIFO_THRESH_80B [6:4], in AdvInitAsc38C1600Driver()
5512 if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) { in AdvInitAsc38C1600Driver()
5514 asc_dvc->wdtr_able); in AdvInitAsc38C1600Driver()
5516 asc_dvc->sdtr_able); in AdvInitAsc38C1600Driver()
5529 asc_dvc->cfg->disc_enable); in AdvInitAsc38C1600Driver()
5530 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1); in AdvInitAsc38C1600Driver()
5531 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2); in AdvInitAsc38C1600Driver()
5532 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3); in AdvInitAsc38C1600Driver()
5533 AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4); in AdvInitAsc38C1600Driver()
5543 asc_dvc->chip_scsi_id); in AdvInitAsc38C1600Driver()
5551 * Each ASC-38C1600 function has only two cable detect bits. in AdvInitAsc38C1600Driver()
5562 asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE; in AdvInitAsc38C1600Driver()
5567 * Each ASC-38C1600 function has two connectors. Only an HVD device in AdvInitAsc38C1600Driver()
5575 asc_dvc->err_code |= ASC_IERR_HVD_DEVICE; in AdvInitAsc38C1600Driver()
5580 * Each function in the ASC-38C1600 uses only the SE cable detect and in AdvInitAsc38C1600Driver()
5589 * then 'termination' was set-up in AscInitFrom38C1600EEPROM() and is in AdvInitAsc38C1600Driver()
5592 if ((asc_dvc->cfg->termination & TERM_SE) == 0) { in AdvInitAsc38C1600Driver()
5600 asc_dvc->cfg->termination |= TERM_SE; in AdvInitAsc38C1600Driver()
5604 if (PCI_FUNC(pdev->devfn) == 0) { in AdvInitAsc38C1600Driver()
5605 /* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */ in AdvInitAsc38C1600Driver()
5607 /* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */ in AdvInitAsc38C1600Driver()
5608 asc_dvc->cfg->termination |= TERM_SE_HI; in AdvInitAsc38C1600Driver()
5622 scsi_cfg1 |= (~asc_dvc->cfg->termination & TERM_SE); in AdvInitAsc38C1600Driver()
5650 * MEM_CFG may be accessed as a word or byte, but only bits 0-7 in AdvInitAsc38C1600Driver()
5653 * ASC-38C1600 has 32KB internal memory. in AdvInitAsc38C1600Driver()
5655 * XXX - Since ASC38C1600 Rev.3 has a Local RAM failure issue, we come in AdvInitAsc38C1600Driver()
5673 ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id)); in AdvInitAsc38C1600Driver()
5678 * Set-up the Host->RISC Initiator Command Queue (ICQ). in AdvInitAsc38C1600Driver()
5680 asc_dvc->icq_sp = adv_get_next_carrier(asc_dvc); in AdvInitAsc38C1600Driver()
5681 if (!asc_dvc->icq_sp) { in AdvInitAsc38C1600Driver()
5682 asc_dvc->err_code |= ASC_IERR_NO_CARRIER; in AdvInitAsc38C1600Driver()
5691 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa); in AdvInitAsc38C1600Driver()
5693 le32_to_cpu(asc_dvc->icq_sp->carr_pa)); in AdvInitAsc38C1600Driver()
5696 * Set-up the RISC->Host Initiator Response Queue (IRQ). in AdvInitAsc38C1600Driver()
5698 asc_dvc->irq_sp = adv_get_next_carrier(asc_dvc); in AdvInitAsc38C1600Driver()
5699 if (!asc_dvc->irq_sp) { in AdvInitAsc38C1600Driver()
5700 asc_dvc->err_code |= ASC_IERR_NO_CARRIER; in AdvInitAsc38C1600Driver()
5707 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa); in AdvInitAsc38C1600Driver()
5708 asc_dvc->carr_pending_cnt = 0; in AdvInitAsc38C1600Driver()
5724 if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) { in AdvInitAsc38C1600Driver()
5729 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == in AdvInitAsc38C1600Driver()
5758 * ADV_TRUE(1) - Chip re-initialization and SCSI Bus Reset successful.
5759 * ADV_FALSE(0) - Chip re-initialization and SCSI Bus Reset failure.
5770 iop_base = asc_dvc->iop_base; in AdvResetChipAndSB()
5777 if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) { in AdvResetChipAndSB()
5806 * re-initializing the chip. in AdvResetChipAndSB()
5808 asc_dvc->err_code = 0; in AdvResetChipAndSB()
5809 if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) { in AdvResetChipAndSB()
5811 } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) { in AdvResetChipAndSB()
5834 if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) { in AdvResetChipAndSB()
5847 * adv_async_callback() - Adv Library asynchronous event callback function.
5883 * adv_isr_callback() - Second Level Interrupt Handler called by AdvISR().
5889 struct asc_board *boardp = adv_dvc_varp->drv_ptr; in adv_isr_callback()
5905 scp = scsi_host_find_tag(boardp->shost, scsiqp->srb_tag); in adv_isr_callback()
5913 ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len); in adv_isr_callback()
5915 reqp = (adv_req_t *)scp->host_scribble; in adv_isr_callback()
5925 scp->host_scribble = NULL; in adv_isr_callback()
5926 reqp->cmndp = NULL; in adv_isr_callback()
5928 ASC_STATS(boardp->shost, callback); in adv_isr_callback()
5929 ASC_DBG(1, "shost 0x%p\n", boardp->shost); in adv_isr_callback()
5931 sense_addr = le32_to_cpu(scsiqp->sense_addr); in adv_isr_callback()
5932 dma_unmap_single(boardp->dev, sense_addr, in adv_isr_callback()
5938 scp->result = 0; in adv_isr_callback()
5939 switch (scsiqp->done_status) { in adv_isr_callback()
5946 * If there was no error and an underrun condition, then in adv_isr_callback()
5949 resid_cnt = le32_to_cpu(scsiqp->data_cnt); in adv_isr_callback()
5960 switch (scsiqp->host_status) { in adv_isr_callback()
5962 set_status_byte(scp, scsiqp->scsi_status); in adv_isr_callback()
5963 if (scsiqp->scsi_status == SAM_STAT_CHECK_CONDITION) { in adv_isr_callback()
5965 ASC_DBG_PRT_SENSE(2, scp->sense_buffer, in adv_isr_callback()
5972 ASC_DBG(1, "host_status 0x%x\n", scsiqp->host_status); in adv_isr_callback()
5980 set_status_byte(scp, scsiqp->scsi_status); in adv_isr_callback()
5985 ASC_DBG(1, "done_status 0x%x\n", scsiqp->done_status); in adv_isr_callback()
5986 set_status_byte(scp, scsiqp->scsi_status); in adv_isr_callback()
5996 if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 && in adv_isr_callback()
5997 scsiqp->done_status == QD_NO_ERROR && in adv_isr_callback()
5998 scsiqp->host_status == QHSTA_NO_ERROR) { in adv_isr_callback()
5999 boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id); in adv_isr_callback()
6007 while ((sgblkp = reqp->sgblkp) != NULL) { in adv_isr_callback()
6009 reqp->sgblkp = sgblkp->next_sgblkp; in adv_isr_callback()
6011 dma_pool_free(boardp->adv_sgblk_pool, sgblkp, in adv_isr_callback()
6012 sgblkp->sg_addr); in adv_isr_callback()
6022 * The function disables and re-enables interrupts.
6028 * when there is no hardware interrupt condition present. It will
6034 * ADV_TRUE(1) - interrupt was pending
6035 * ADV_FALSE(0) - no interrupt was pending
6046 iop_base = asc_dvc->iop_base; in AdvISR()
6066 if (asc_dvc->chip_type == ADV_CHIP_ASC3550 || in AdvISR()
6067 asc_dvc->chip_type == ADV_CHIP_ASC38C0800) { in AdvISR()
6069 asc_dvc->carr_pending_cnt != 0) { in AdvISR()
6072 if (asc_dvc->chip_type == ADV_CHIP_ASC3550) { in AdvISR()
6087 le32_to_cpu(asc_dvc->irq_sp->next_vpa)) & ADV_RQ_DONE) != 0) { in AdvISR()
6097 u32 pa_offset = le32_to_cpu(asc_dvc->irq_sp->areq_vpa); in AdvISR()
6099 asc_dvc->irq_sp, pa_offset); in AdvISR()
6101 scsiq = &reqp->scsi_req_q; in AdvISR()
6109 scsiq->done_status = QD_NO_ERROR; in AdvISR()
6110 scsiq->host_status = scsiq->scsi_status = 0; in AdvISR()
6111 scsiq->data_cnt = 0L; in AdvISR()
6119 free_carrp = asc_dvc->irq_sp; in AdvISR()
6120 asc_dvc->irq_sp = adv_get_carrier(asc_dvc, in AdvISR()
6123 free_carrp->next_vpa = asc_dvc->carr_freelist->carr_va; in AdvISR()
6124 asc_dvc->carr_freelist = free_carrp; in AdvISR()
6125 asc_dvc->carr_pending_cnt--; in AdvISR()
6130 scsiq->cntl = 0; in AdvISR()
6139 * can no longer be referenced. in AdvISR()
6150 if (asc_dvc->err_code == 0) { in AscSetLibErrorCode()
6151 asc_dvc->err_code = err_code; in AscSetLibErrorCode()
6152 AscWriteLramWord(asc_dvc->iop_base, ASCV_ASCDVC_ERR_CODE_W, in AscSetLibErrorCode()
6194 period_table = asc_dvc->sdtr_period_tbl; in AscGetSynPeriodIndex()
6195 max_index = (int)asc_dvc->max_sdtr_index; in AscGetSynPeriodIndex()
6196 min_index = (int)asc_dvc->min_sdtr_index; in AscGetSynPeriodIndex()
6198 for (i = min_index; i < (max_index - 1); i++) { in AscGetSynPeriodIndex()
6212 PortAddr iop_base = asc_dvc->iop_base; in AscMsgOutSDTR()
6223 if (sdtr_period_index <= asc_dvc->max_sdtr_index) { in AscMsgOutSDTR()
6244 if (sdtr_period_ix > asc_dvc->max_sdtr_index) in AscCalSDTRData()
6306 BUG_ON(!asc_dvc->drv_ptr); in AscIsrChipHalted()
6307 boardp = asc_dvc->drv_ptr; in AscIsrChipHalted()
6309 iop_base = asc_dvc->iop_base; in AscIsrChipHalted()
6321 if (asc_dvc->pci_fix_asyn_xfer & target_id) { in AscIsrChipHalted()
6327 if (asc_dvc->pci_fix_asyn_xfer & target_id) { in AscIsrChipHalted()
6329 boardp->sdtr_data[tid_no] = 0; in AscIsrChipHalted()
6334 if (asc_dvc->pci_fix_asyn_xfer & target_id) { in AscIsrChipHalted()
6336 boardp->sdtr_data[tid_no] = asyn_sdtr; in AscIsrChipHalted()
6356 asc_dvc->sdtr_period_tbl[asc_dvc->min_sdtr_index]) in AscIsrChipHalted()
6358 asc_dvc->sdtr_period_tbl[asc_dvc-> in AscIsrChipHalted()
6362 asc_dvc->sdtr_period_tbl[asc_dvc-> in AscIsrChipHalted()
6372 asc_dvc->init_sdtr &= ~target_id; in AscIsrChipHalted()
6373 asc_dvc->sdtr_done &= ~target_id; in AscIsrChipHalted()
6376 boardp->sdtr_data[tid_no] = asyn_sdtr; in AscIsrChipHalted()
6382 asc_dvc->init_sdtr &= ~target_id; in AscIsrChipHalted()
6383 asc_dvc->sdtr_done &= ~target_id; in AscIsrChipHalted()
6388 asc_dvc->sdtr_done |= target_id; in AscIsrChipHalted()
6389 asc_dvc->init_sdtr |= target_id; in AscIsrChipHalted()
6390 asc_dvc->pci_fix_asyn_xfer &= in AscIsrChipHalted()
6399 boardp->sdtr_data[tid_no] = sdtr_data; in AscIsrChipHalted()
6405 asc_dvc->pci_fix_asyn_xfer &= in AscIsrChipHalted()
6414 boardp->sdtr_data[tid_no] = sdtr_data; in AscIsrChipHalted()
6415 asc_dvc->sdtr_done |= target_id; in AscIsrChipHalted()
6416 asc_dvc->init_sdtr |= target_id; in AscIsrChipHalted()
6461 if ((asc_dvc->init_sdtr & target_id) != 0) { in AscIsrChipHalted()
6463 asc_dvc->sdtr_done &= ~target_id; in AscIsrChipHalted()
6468 asc_dvc-> in AscIsrChipHalted()
6470 (uchar)(asc_dvc-> in AscIsrChipHalted()
6471 max_sdtr_index - in AscIsrChipHalted()
6485 if ((asc_dvc->pci_fix_asyn_xfer & target_id) in AscIsrChipHalted()
6486 && !(asc_dvc->pci_fix_asyn_xfer_always & target_id) in AscIsrChipHalted()
6524 asc_dvc->init_sdtr &= ~target_id; in AscIsrChipHalted()
6525 asc_dvc->sdtr_done &= ~target_id; in AscIsrChipHalted()
6527 boardp->sdtr_data[tid_no] = asyn_sdtr; in AscIsrChipHalted()
6545 if ((cur_dvc_qng > 0) && (asc_dvc->cur_dvc_qng[tid_no] > 0)) { in AscIsrChipHalted()
6552 asc_dvc->queue_full_or_busy |= target_id; in AscIsrChipHalted()
6556 cur_dvc_qng -= 1; in AscIsrChipHalted()
6557 asc_dvc->max_dvc_qng[tid_no] = in AscIsrChipHalted()
6572 boardp->queue_full |= target_id; in AscIsrChipHalted()
6573 boardp->queue_full_cnt[tid_no] = in AscIsrChipHalted()
6627 scsiq->q_status = (uchar)_val; in _AscCopyLramScsiDoneQ()
6628 scsiq->q_no = (uchar)(_val >> 8); in _AscCopyLramScsiDoneQ()
6631 scsiq->cntl = (uchar)_val; in _AscCopyLramScsiDoneQ()
6636 scsiq->sense_len = (uchar)_val; in _AscCopyLramScsiDoneQ()
6637 scsiq->extra_bytes = (uchar)(_val >> 8); in _AscCopyLramScsiDoneQ()
6642 scsiq->remain_bytes = (((u32)AscReadLramWord(iop_base, in _AscCopyLramScsiDoneQ()
6650 scsiq->remain_bytes += AscReadLramWord(iop_base, in _AscCopyLramScsiDoneQ()
6654 scsiq->remain_bytes &= max_dma_count; in _AscCopyLramScsiDoneQ()
6659 * asc_isr_callback() - Second Level Interrupt Handler called by AscISR().
6665 struct asc_board *boardp = asc_dvc_varp->drv_ptr; in asc_isr_callback()
6675 srb_tag = qdonep->d2.srb_tag - 1; in asc_isr_callback()
6676 scp = scsi_host_find_tag(boardp->shost, srb_tag); in asc_isr_callback()
6680 ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len); in asc_isr_callback()
6682 ASC_STATS(boardp->shost, callback); in asc_isr_callback()
6684 dma_unmap_single(boardp->dev, scp->SCp.dma_handle, in asc_isr_callback()
6689 scp->result = 0; in asc_isr_callback()
6690 switch (qdonep->d3.done_stat) { in asc_isr_callback()
6697 * If there was no error and an underrun condition, then in asc_isr_callback()
6700 if (scsi_bufflen(scp) != 0 && qdonep->remain_bytes != 0 && in asc_isr_callback()
6701 qdonep->remain_bytes <= scsi_bufflen(scp)) { in asc_isr_callback()
6703 (unsigned)qdonep->remain_bytes); in asc_isr_callback()
6704 scsi_set_resid(scp, qdonep->remain_bytes); in asc_isr_callback()
6710 switch (qdonep->d3.host_stat) { in asc_isr_callback()
6712 set_status_byte(scp, qdonep->d3.scsi_stat); in asc_isr_callback()
6713 if (qdonep->d3.scsi_stat == SAM_STAT_CHECK_CONDITION) { in asc_isr_callback()
6715 ASC_DBG_PRT_SENSE(2, scp->sense_buffer, in asc_isr_callback()
6722 ASC_DBG(1, "host_stat 0x%x\n", qdonep->d3.host_stat); in asc_isr_callback()
6730 set_status_byte(scp, qdonep->d3.scsi_stat); in asc_isr_callback()
6735 ASC_DBG(1, "done_stat 0x%x\n", qdonep->d3.done_stat); in asc_isr_callback()
6736 set_status_byte(scp, qdonep->d3.scsi_stat); in asc_isr_callback()
6746 if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 && in asc_isr_callback()
6747 qdonep->d3.done_stat == QD_NO_ERROR && in asc_isr_callback()
6748 qdonep->d3.host_stat == QHSTA_NO_ERROR) { in asc_isr_callback()
6749 boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id); in asc_isr_callback()
6774 iop_base = asc_dvc->iop_base; in AscIsrQDone()
6785 asc_dvc->max_dma_count); in AscIsrQDone()
6789 (uchar)(scsiq-> in AscIsrQDone()
6792 tid_no = ASC_TIX_TO_TID(scsiq->d2.target_ix); in AscIsrQDone()
6793 target_id = ASC_TIX_TO_TARGET_ID(scsiq->d2.target_ix); in AscIsrQDone()
6794 if ((scsiq->cntl & QC_SG_HEAD) != 0) { in AscIsrQDone()
6806 scsiq->d3.done_stat = QD_WITH_ERROR; in AscIsrQDone()
6807 scsiq->d3.host_stat = in AscIsrQDone()
6819 if (asc_dvc->queue_full_or_busy & target_id) { in AscIsrQDone()
6824 scsiq->d2. in AscIsrQDone()
6826 if (cur_target_qng < asc_dvc->max_dvc_qng[tid_no]) { in AscIsrQDone()
6833 asc_dvc->queue_full_or_busy &= ~target_id; in AscIsrQDone()
6836 if (asc_dvc->cur_total_qng >= n_q_used) { in AscIsrQDone()
6837 asc_dvc->cur_total_qng -= n_q_used; in AscIsrQDone()
6838 if (asc_dvc->cur_dvc_qng[tid_no] != 0) { in AscIsrQDone()
6839 asc_dvc->cur_dvc_qng[tid_no]--; in AscIsrQDone()
6843 scsiq->d3.done_stat = QD_WITH_ERROR; in AscIsrQDone()
6846 if ((scsiq->d2.srb_tag == 0UL) || in AscIsrQDone()
6847 ((scsiq->q_status & QS_ABORTED) != 0)) { in AscIsrQDone()
6849 } else if (scsiq->q_status == QS_DONE) { in AscIsrQDone()
6855 if (scsiq->extra_bytes != 0) { in AscIsrQDone()
6856 scsiq->remain_bytes += scsiq->extra_bytes; in AscIsrQDone()
6858 if (scsiq->d3.done_stat == QD_WITH_ERROR) { in AscIsrQDone()
6859 if (scsiq->d3.host_stat == in AscIsrQDone()
6861 if ((scsiq-> in AscIsrQDone()
6864 scsiq->d3.done_stat = in AscIsrQDone()
6866 scsiq->d3.host_stat = in AscIsrQDone()
6869 scsiq->d3.done_stat = in AscIsrQDone()
6871 scsiq->d3.host_stat = in AscIsrQDone()
6874 } else if (scsiq->d3.host_stat == in AscIsrQDone()
6888 if ((scsiq->cntl & QC_NO_CALLBACK) == 0) { in AscIsrQDone()
6895 asc_dvc->unit_not_ready &= ~target_id; in AscIsrQDone()
6896 if (scsiq->d3.done_stat != QD_NO_ERROR) { in AscIsrQDone()
6897 asc_dvc->start_motor &= in AscIsrQDone()
6906 if ((scsiq->cntl & QC_NO_CALLBACK) == 0) { in AscIsrQDone()
6926 iop_base = asc_dvc->iop_base; in AscISR()
6932 if ((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0) { in AscISR()
6935 if (asc_dvc->in_critical_cnt != 0) { in AscISR()
6939 if (asc_dvc->is_in_int) { in AscISR()
6943 asc_dvc->is_in_int = true; in AscISR()
6949 if (!(asc_dvc->bus_type & (ASC_IS_VL | ASC_IS_EISA))) { in AscISR()
6952 asc_dvc->sdtr_done = 0; in AscISR()
6955 CSW_SCSI_RESET_ACTIVE) && (i-- > 0)) { in AscISR()
6978 if ((asc_dvc->dvc_cntl & ASC_CNTL_INT_MULTI_Q) != 0) { in AscISR()
6997 asc_dvc->is_in_int = false; in AscISR()
7007 * sleeping is allowed and no locking other than for host structures is
7012 struct Scsi_Host *shost = scp->device->host; in advansys_reset()
7025 ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var; in advansys_reset()
7032 if (asc_dvc->err_code || !asc_dvc->overrun_dma) { in advansys_reset()
7034 "0x%x, status: 0x%x\n", asc_dvc->err_code, in advansys_reset()
7051 ADV_DVC_VAR *adv_dvc = &boardp->dvc_var.adv_dvc_var; in advansys_reset()
7068 spin_lock_irqsave(shost->host_lock, flags); in advansys_reset()
7070 spin_unlock_irqrestore(shost->host_lock, flags); in advansys_reset()
7093 struct asc_board *boardp = shost_priv(sdev->host); in advansys_biosparam()
7096 ASC_STATS(sdev->host, biosparam); in advansys_biosparam()
7098 if ((boardp->dvc_var.asc_dvc_var.dvc_cntl & in advansys_biosparam()
7107 if ((boardp->dvc_var.adv_dvc_var.bios_ctrl & in advansys_biosparam()
7122 * First-level interrupt handler.
7134 spin_lock_irqsave(shost->host_lock, flags); in advansys_interrupt()
7136 if (AscIsIntPending(shost->io_port)) { in advansys_interrupt()
7140 AscISR(&boardp->dvc_var.asc_dvc_var); in advansys_interrupt()
7144 if (AdvISR(&boardp->dvc_var.adv_dvc_var)) { in advansys_interrupt()
7149 spin_unlock_irqrestore(shost->host_lock, flags); in advansys_interrupt()
7191 char type = sdev->type; in AscAsyncFix()
7192 ASC_SCSI_BIT_ID_TYPE tid_bits = 1 << sdev->id; in AscAsyncFix()
7194 if (!(asc_dvc->bug_fix_cntl & ASC_BUG_FIX_ASYN_USE_SYN)) in AscAsyncFix()
7196 if (asc_dvc->init_sdtr & tid_bits) in AscAsyncFix()
7199 if ((type == TYPE_ROM) && (strncmp(sdev->vendor, "HP ", 3) == 0)) in AscAsyncFix()
7200 asc_dvc->pci_fix_asyn_xfer_always |= tid_bits; in AscAsyncFix()
7202 asc_dvc->pci_fix_asyn_xfer |= tid_bits; in AscAsyncFix()
7205 asc_dvc->pci_fix_asyn_xfer &= ~tid_bits; in AscAsyncFix()
7207 if (asc_dvc->pci_fix_asyn_xfer & tid_bits) in AscAsyncFix()
7208 AscSetRunChipSynRegAtID(asc_dvc->iop_base, sdev->id, in AscAsyncFix()
7215 ASC_SCSI_BIT_ID_TYPE tid_bit = 1 << sdev->id; in advansys_narrow_slave_configure()
7216 ASC_SCSI_BIT_ID_TYPE orig_use_tagged_qng = asc_dvc->use_tagged_qng; in advansys_narrow_slave_configure()
7218 if (sdev->lun == 0) { in advansys_narrow_slave_configure()
7219 ASC_SCSI_BIT_ID_TYPE orig_init_sdtr = asc_dvc->init_sdtr; in advansys_narrow_slave_configure()
7220 if ((asc_dvc->cfg->sdtr_enable & tid_bit) && sdev->sdtr) { in advansys_narrow_slave_configure()
7221 asc_dvc->init_sdtr |= tid_bit; in advansys_narrow_slave_configure()
7223 asc_dvc->init_sdtr &= ~tid_bit; in advansys_narrow_slave_configure()
7226 if (orig_init_sdtr != asc_dvc->init_sdtr) in advansys_narrow_slave_configure()
7230 if (sdev->tagged_supported) { in advansys_narrow_slave_configure()
7231 if (asc_dvc->cfg->cmd_qng_enabled & tid_bit) { in advansys_narrow_slave_configure()
7232 if (sdev->lun == 0) { in advansys_narrow_slave_configure()
7233 asc_dvc->cfg->can_tagged_qng |= tid_bit; in advansys_narrow_slave_configure()
7234 asc_dvc->use_tagged_qng |= tid_bit; in advansys_narrow_slave_configure()
7237 asc_dvc->max_dvc_qng[sdev->id]); in advansys_narrow_slave_configure()
7240 if (sdev->lun == 0) { in advansys_narrow_slave_configure()
7241 asc_dvc->cfg->can_tagged_qng &= ~tid_bit; in advansys_narrow_slave_configure()
7242 asc_dvc->use_tagged_qng &= ~tid_bit; in advansys_narrow_slave_configure()
7246 if ((sdev->lun == 0) && in advansys_narrow_slave_configure()
7247 (orig_use_tagged_qng != asc_dvc->use_tagged_qng)) { in advansys_narrow_slave_configure()
7248 AscWriteLramByte(asc_dvc->iop_base, ASCV_DISC_ENABLE_B, in advansys_narrow_slave_configure()
7249 asc_dvc->cfg->disc_enable); in advansys_narrow_slave_configure()
7250 AscWriteLramByte(asc_dvc->iop_base, ASCV_USE_TAGGED_QNG_B, in advansys_narrow_slave_configure()
7251 asc_dvc->use_tagged_qng); in advansys_narrow_slave_configure()
7252 AscWriteLramByte(asc_dvc->iop_base, ASCV_CAN_TAGGED_QNG_B, in advansys_narrow_slave_configure()
7253 asc_dvc->cfg->can_tagged_qng); in advansys_narrow_slave_configure()
7255 asc_dvc->max_dvc_qng[sdev->id] = in advansys_narrow_slave_configure()
7256 asc_dvc->cfg->max_tag_qng[sdev->id]; in advansys_narrow_slave_configure()
7257 AscWriteLramByte(asc_dvc->iop_base, in advansys_narrow_slave_configure()
7258 (ushort)(ASCV_MAX_DVC_QNG_BEG + sdev->id), in advansys_narrow_slave_configure()
7259 asc_dvc->max_dvc_qng[sdev->id]); in advansys_narrow_slave_configure()
7333 AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, adv_dvc->ppr_able); in advansys_wide_enable_ppr()
7334 adv_dvc->ppr_able |= tidmask; in advansys_wide_enable_ppr()
7335 AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, adv_dvc->ppr_able); in advansys_wide_enable_ppr()
7341 AdvPortAddr iop_base = adv_dvc->iop_base; in advansys_wide_slave_configure()
7342 unsigned short tidmask = 1 << sdev->id; in advansys_wide_slave_configure()
7344 if (sdev->lun == 0) { in advansys_wide_slave_configure()
7351 if ((adv_dvc->wdtr_able & tidmask) && sdev->wdtr) in advansys_wide_slave_configure()
7353 if ((adv_dvc->sdtr_able & tidmask) && sdev->sdtr) in advansys_wide_slave_configure()
7355 if (adv_dvc->chip_type == ADV_CHIP_ASC38C1600 && sdev->ppr) in advansys_wide_slave_configure()
7360 * mode and would see no benefit from Tag Queuing. Also by in advansys_wide_slave_configure()
7364 if ((adv_dvc->tagqng_able & tidmask) && in advansys_wide_slave_configure()
7365 sdev->tagged_supported) { in advansys_wide_slave_configure()
7372 ASC_MC_NUMBER_OF_MAX_CMD + sdev->id, in advansys_wide_slave_configure()
7373 adv_dvc->max_dvc_qng); in advansys_wide_slave_configure()
7377 if ((adv_dvc->tagqng_able & tidmask) && sdev->tagged_supported) in advansys_wide_slave_configure()
7378 scsi_change_queue_depth(sdev, adv_dvc->max_dvc_qng); in advansys_wide_slave_configure()
7387 struct asc_board *boardp = shost_priv(sdev->host); in advansys_slave_configure()
7391 &boardp->dvc_var.asc_dvc_var); in advansys_slave_configure()
7394 &boardp->dvc_var.adv_dvc_var); in advansys_slave_configure()
7401 struct asc_board *board = shost_priv(scp->device->host); in asc_get_sense_buffer_dma()
7403 scp->SCp.dma_handle = dma_map_single(board->dev, scp->sense_buffer, in asc_get_sense_buffer_dma()
7406 if (dma_mapping_error(board->dev, scp->SCp.dma_handle)) { in asc_get_sense_buffer_dma()
7410 return cpu_to_le32(scp->SCp.dma_handle); in asc_get_sense_buffer_dma()
7416 struct asc_dvc_var *asc_dvc = &boardp->dvc_var.asc_dvc_var; in asc_build_req()
7426 srb_tag = scsi_cmd_to_rq(scp)->tag + 1; in asc_build_req()
7427 asc_scsi_q->q2.srb_tag = srb_tag; in asc_build_req()
7432 asc_scsi_q->cdbptr = &scp->cmnd[0]; in asc_build_req()
7433 asc_scsi_q->q2.cdb_len = scp->cmd_len; in asc_build_req()
7434 asc_scsi_q->q1.target_id = ASC_TID_TO_TARGET_ID(scp->device->id); in asc_build_req()
7435 asc_scsi_q->q1.target_lun = scp->device->lun; in asc_build_req()
7436 asc_scsi_q->q2.target_ix = in asc_build_req()
7437 ASC_TIDLUN_TO_IX(scp->device->id, scp->device->lun); in asc_build_req()
7438 asc_scsi_q->q1.sense_addr = asc_get_sense_buffer_dma(scp); in asc_build_req()
7439 asc_scsi_q->q1.sense_len = SCSI_SENSE_BUFFERSIZE; in asc_build_req()
7440 if (!asc_scsi_q->q1.sense_addr) in asc_build_req()
7454 if ((asc_dvc->cur_dvc_qng[scp->device->id] > 0) && in asc_build_req()
7455 (boardp->reqcnt[scp->device->id] % 255) == 0) { in asc_build_req()
7456 asc_scsi_q->q2.tag_code = ORDERED_QUEUE_TAG; in asc_build_req()
7458 asc_scsi_q->q2.tag_code = SIMPLE_QUEUE_TAG; in asc_build_req()
7471 if (use_sg > scp->device->host->sg_tablesize) { in asc_build_req()
7474 scp->device->host->sg_tablesize); in asc_build_req()
7480 asc_sg_head = kzalloc(sizeof(asc_scsi_q->sg_head) + in asc_build_req()
7488 asc_scsi_q->q1.cntl |= QC_SG_HEAD; in asc_build_req()
7489 asc_scsi_q->sg_head = asc_sg_head; in asc_build_req()
7490 asc_scsi_q->q1.data_cnt = 0; in asc_build_req()
7491 asc_scsi_q->q1.data_addr = 0; in asc_build_req()
7493 asc_sg_head->entry_cnt = asc_scsi_q->q1.sg_queue_cnt = use_sg; in asc_build_req()
7494 ASC_STATS_ADD(scp->device->host, xfer_elem, in asc_build_req()
7495 asc_sg_head->entry_cnt); in asc_build_req()
7498 * Convert scatter-gather list into ASC_SG_HEAD list. in asc_build_req()
7501 asc_sg_head->sg_list[sgcnt].addr = in asc_build_req()
7503 asc_sg_head->sg_list[sgcnt].bytes = in asc_build_req()
7505 ASC_STATS_ADD(scp->device->host, xfer_sect, in asc_build_req()
7510 ASC_STATS(scp->device->host, xfer_cnt); in asc_build_req()
7513 ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len); in asc_build_req()
7519 * Build scatter-gather list for Adv Library (Wide Board).
7522 * if the total number of scatter-gather elements exceeds
7527 * ADV_SUCCESS(1) - SG List successfully created
7528 * ADV_ERROR(-1) - SG List creation failed
7545 reqp->sgblkp = NULL; in adv_get_sglist()
7551 * (15) scatter-gather elements. in adv_get_sglist()
7553 sgblkp = dma_pool_alloc(boardp->adv_sgblk_pool, GFP_ATOMIC, in adv_get_sglist()
7556 ASC_DBG(1, "no free adv_sgblk_t\n"); in adv_get_sglist()
7557 ASC_STATS(scp->device->host, adv_build_nosg); in adv_get_sglist()
7563 while ((sgblkp = reqp->sgblkp) != NULL) { in adv_get_sglist()
7565 reqp->sgblkp = sgblkp->next_sgblkp; in adv_get_sglist()
7566 sgblkp->next_sgblkp = NULL; in adv_get_sglist()
7567 dma_pool_free(boardp->adv_sgblk_pool, sgblkp, in adv_get_sglist()
7568 sgblkp->sg_addr); in adv_get_sglist()
7573 sgblkp->sg_addr = sgblk_paddr; in adv_get_sglist()
7574 sgblkp->next_sgblkp = NULL; in adv_get_sglist()
7575 sg_block = &sgblkp->sg_block; in adv_get_sglist()
7581 if (reqp->sgblkp == NULL) { in adv_get_sglist()
7582 /* Request's first scatter-gather block. */ in adv_get_sglist()
7583 reqp->sgblkp = sgblkp; in adv_get_sglist()
7589 scsiqp->sg_list_ptr = sg_block; in adv_get_sglist()
7590 scsiqp->sg_real_addr = cpu_to_le32(sgblk_paddr); in adv_get_sglist()
7592 /* Request's second or later scatter-gather block. */ in adv_get_sglist()
7593 prev_sgblkp->next_sgblkp = sgblkp; in adv_get_sglist()
7599 prev_sg_block->sg_ptr = cpu_to_le32(sgblk_paddr); in adv_get_sglist()
7603 sg_block->sg_list[i].sg_addr = in adv_get_sglist()
7605 sg_block->sg_list[i].sg_count = in adv_get_sglist()
7607 ASC_STATS_ADD(scp->device->host, xfer_sect, in adv_get_sglist()
7610 if (--sg_elem_cnt == 0) { in adv_get_sglist()
7612 * Last ADV_SG_BLOCK and scatter-gather entry. in adv_get_sglist()
7614 sg_block->sg_cnt = i + 1; in adv_get_sglist()
7615 sg_block->sg_ptr = 0L; /* Last ADV_SG_BLOCK in list. */ in adv_get_sglist()
7620 sg_block->sg_cnt = NO_OF_SG_PER_BLOCK; in adv_get_sglist()
7632 * Multi-byte fields in the ADV_SCSI_REQ_Q that are used by the
7633 * microcode for DMA addresses or math operations are byte swapped
7634 * to little-endian order.
7640 u32 srb_tag = scsi_cmd_to_rq(scp)->tag; in adv_build_req()
7651 reqp = &boardp->adv_reqp[srb_tag]; in adv_build_req()
7652 if (reqp->cmndp && reqp->cmndp != scp ) { in adv_build_req()
7653 ASC_DBG(1, "no free adv_req_t\n"); in adv_build_req()
7654 ASC_STATS(scp->device->host, adv_build_noreq); in adv_build_req()
7658 reqp->req_addr = boardp->adv_reqp_addr + (srb_tag * sizeof(adv_req_t)); in adv_build_req()
7660 scsiqp = &reqp->scsi_req_q; in adv_build_req()
7665 scsiqp->cntl = scsiqp->scsi_cntl = scsiqp->done_status = 0; in adv_build_req()
7670 scsiqp->srb_tag = srb_tag; in adv_build_req()
7675 reqp->cmndp = scp; in adv_build_req()
7676 scp->host_scribble = (void *)reqp; in adv_build_req()
7683 scsiqp->cdb_len = scp->cmd_len; in adv_build_req()
7685 memcpy(scsiqp->cdb, scp->cmnd, scp->cmd_len < 12 ? scp->cmd_len : 12); in adv_build_req()
7687 if (scp->cmd_len > 12) { in adv_build_req()
7688 int cdb16_len = scp->cmd_len - 12; in adv_build_req()
7690 memcpy(scsiqp->cdb16, &scp->cmnd[12], cdb16_len); in adv_build_req()
7693 scsiqp->target_id = scp->device->id; in adv_build_req()
7694 scsiqp->target_lun = scp->device->lun; in adv_build_req()
7696 sense_addr = dma_map_single(boardp->dev, scp->sense_buffer, in adv_build_req()
7698 if (dma_mapping_error(boardp->dev, sense_addr)) { in adv_build_req()
7700 ASC_STATS(scp->device->host, adv_build_noreq); in adv_build_req()
7703 scsiqp->sense_addr = cpu_to_le32(sense_addr); in adv_build_req()
7704 scsiqp->sense_len = SCSI_SENSE_BUFFERSIZE; in adv_build_req()
7711 ASC_STATS(scp->device->host, adv_build_noreq); in adv_build_req()
7714 /* Zero-length transfer */ in adv_build_req()
7715 reqp->sgblkp = NULL; in adv_build_req()
7716 scsiqp->data_cnt = 0; in adv_build_req()
7718 scsiqp->data_addr = 0; in adv_build_req()
7719 scsiqp->sg_list_ptr = NULL; in adv_build_req()
7720 scsiqp->sg_real_addr = 0; in adv_build_req()
7725 scp->device->host->sg_tablesize); in adv_build_req()
7728 reqp->cmndp = NULL; in adv_build_req()
7729 scp->host_scribble = NULL; in adv_build_req()
7734 scsiqp->data_cnt = cpu_to_le32(scsi_bufflen(scp)); in adv_build_req()
7740 reqp->cmndp = NULL; in adv_build_req()
7741 scp->host_scribble = NULL; in adv_build_req()
7746 ASC_STATS_ADD(scp->device->host, xfer_elem, use_sg); in adv_build_req()
7749 ASC_STATS(scp->device->host, xfer_cnt); in adv_build_req()
7752 ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len); in adv_build_req()
7763 n_sg_list_qs = ((sg_list - 1) / ASC_SG_LIST_PER_Q); in AscSgListToQueue()
7764 if (((sg_list - 1) % ASC_SG_LIST_PER_Q) != 0) in AscSgListToQueue()
7779 if ((asc_dvc->unit_not_ready & target_id) || in AscGetNumOfFreeQueue()
7780 (asc_dvc->queue_full_or_busy & target_id)) { in AscGetNumOfFreeQueue()
7784 cur_used_qs = (uint) asc_dvc->cur_total_qng + in AscGetNumOfFreeQueue()
7785 (uint) asc_dvc->last_q_shortage + (uint) ASC_MIN_FREE_Q; in AscGetNumOfFreeQueue()
7787 cur_used_qs = (uint) asc_dvc->cur_total_qng + in AscGetNumOfFreeQueue()
7790 if ((uint) (cur_used_qs + n_qs) <= (uint) asc_dvc->max_total_qng) { in AscGetNumOfFreeQueue()
7791 cur_free_qs = (uint) asc_dvc->max_total_qng - cur_used_qs; in AscGetNumOfFreeQueue()
7792 if (asc_dvc->cur_dvc_qng[tid_no] >= in AscGetNumOfFreeQueue()
7793 asc_dvc->max_dvc_qng[tid_no]) { in AscGetNumOfFreeQueue()
7799 if ((n_qs > asc_dvc->last_q_shortage) in AscGetNumOfFreeQueue()
7800 && (n_qs <= (asc_dvc->max_total_qng - ASC_MIN_FREE_Q))) { in AscGetNumOfFreeQueue()
7801 asc_dvc->last_q_shortage = n_qs; in AscGetNumOfFreeQueue()
7871 iop_base = asc_dvc->iop_base; in AscPutReadyQueue()
7872 if (((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) && in AscPutReadyQueue()
7873 ((asc_dvc->sdtr_done & scsiq->q1.target_id) == 0)) { in AscPutReadyQueue()
7874 tid_no = ASC_TIX_TO_TID(scsiq->q2.target_ix); in AscPutReadyQueue()
7877 (sdtr_data >> 4) & (asc_dvc->max_sdtr_index - 1); in AscPutReadyQueue()
7880 asc_dvc->sdtr_period_tbl[syn_period_ix], in AscPutReadyQueue()
7882 scsiq->q1.cntl |= QC_MSG_OUT; in AscPutReadyQueue()
7885 if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) { in AscPutReadyQueue()
7886 scsiq->q2.tag_code &= ~SIMPLE_QUEUE_TAG; in AscPutReadyQueue()
7888 scsiq->q1.status = QS_FREE; in AscPutReadyQueue()
7891 (uchar *)scsiq->cdbptr, scsiq->q2.cdb_len >> 1); in AscPutReadyQueue()
7895 (uchar *)&scsiq->q1.cntl, in AscPutReadyQueue()
7896 ((sizeof(ASC_SCSIQ_1) + sizeof(ASC_SCSIQ_2)) / 2) - 1); in AscPutReadyQueue()
7899 (ushort)(((ushort)scsiq->q1. in AscPutReadyQueue()
7920 iop_base = asc_dvc->iop_base; in AscPutReadySgListQueue()
7921 sg_head = scsiq->sg_head; in AscPutReadySgListQueue()
7922 saved_data_addr = scsiq->q1.data_addr; in AscPutReadySgListQueue()
7923 saved_data_cnt = scsiq->q1.data_cnt; in AscPutReadySgListQueue()
7924 scsiq->q1.data_addr = cpu_to_le32(sg_head->sg_list[0].addr); in AscPutReadySgListQueue()
7925 scsiq->q1.data_cnt = cpu_to_le32(sg_head->sg_list[0].bytes); in AscPutReadySgListQueue()
7931 sg_entry_cnt = sg_head->entry_cnt - 1; in AscPutReadySgListQueue()
7934 scsiq->q1.cntl |= QC_SG_HEAD; in AscPutReadySgListQueue()
7937 scsiq->q1.sg_queue_cnt = sg_head->queue_cnt; in AscPutReadySgListQueue()
7940 for (i = 0; i < sg_head->queue_cnt; i++) { in AscPutReadySgListQueue()
7944 sg_entry_cnt -= ASC_SG_LIST_PER_Q; in AscPutReadySgListQueue()
7952 ASC_SG_LIST_PER_Q - 1; in AscPutReadySgListQueue()
7954 ASC_SG_LIST_PER_Q - 1; in AscPutReadySgListQueue()
7965 sg_entry_cnt - 1; in AscPutReadySgListQueue()
7967 sg_entry_cnt - 1; in AscPutReadySgListQueue()
7982 (uchar *)&sg_head-> in AscPutReadySgListQueue()
7986 scsiq->next_sg_index = sg_index; in AscPutReadySgListQueue()
7989 scsiq->q1.cntl &= ~QC_SG_HEAD; in AscPutReadySgListQueue()
7992 scsiq->q1.data_addr = saved_data_addr; in AscPutReadySgListQueue()
7993 scsiq->q1.data_cnt = saved_data_cnt; in AscPutReadySgListQueue()
8007 iop_base = asc_dvc->iop_base; in AscSendScsiQueue()
8008 target_ix = scsiq->q2.target_ix; in AscSendScsiQueue()
8016 asc_dvc->last_q_shortage = 0; in AscSendScsiQueue()
8017 scsiq->sg_head->queue_cnt = n_q_required - 1; in AscSendScsiQueue()
8018 scsiq->q1.q_no = free_q_head; in AscSendScsiQueue()
8025 scsiq->q1.q_no = free_q_head; in AscSendScsiQueue()
8031 asc_dvc->cur_total_qng += n_q_required; in AscSendScsiQueue()
8032 asc_dvc->cur_dvc_qng[tid_no]++; in AscSendScsiQueue()
8076 iop_base = asc_dvc->iop_base; in AscExeScsiQueue()
8077 sg_head = scsiq->sg_head; in AscExeScsiQueue()
8078 if (asc_dvc->err_code != 0) in AscExeScsiQueue()
8080 scsiq->q1.q_no = 0; in AscExeScsiQueue()
8081 if ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES) == 0) { in AscExeScsiQueue()
8082 scsiq->q1.extra_bytes = 0; in AscExeScsiQueue()
8085 target_ix = scsiq->q2.target_ix; in AscExeScsiQueue()
8088 if (scsiq->cdbptr[0] == REQUEST_SENSE) { in AscExeScsiQueue()
8089 if ((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) { in AscExeScsiQueue()
8090 asc_dvc->sdtr_done &= ~scsiq->q1.target_id; in AscExeScsiQueue()
8093 asc_dvc-> in AscExeScsiQueue()
8095 (uchar)(asc_dvc-> in AscExeScsiQueue()
8096 max_sdtr_index - in AscExeScsiQueue()
8100 scsiq->q1.cntl |= (QC_MSG_OUT | QC_URGENT); in AscExeScsiQueue()
8103 if (asc_dvc->in_critical_cnt != 0) { in AscExeScsiQueue()
8107 asc_dvc->in_critical_cnt++; in AscExeScsiQueue()
8108 if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) { in AscExeScsiQueue()
8109 if ((sg_entry_cnt = sg_head->entry_cnt) == 0) { in AscExeScsiQueue()
8110 asc_dvc->in_critical_cnt--; in AscExeScsiQueue()
8114 asc_dvc->in_critical_cnt--; in AscExeScsiQueue()
8118 scsiq->q1.data_addr = cpu_to_le32(sg_head->sg_list[0].addr); in AscExeScsiQueue()
8119 scsiq->q1.data_cnt = cpu_to_le32(sg_head->sg_list[0].bytes); in AscExeScsiQueue()
8120 scsiq->q1.cntl &= ~(QC_SG_HEAD | QC_SG_SWAP_QUEUE); in AscExeScsiQueue()
8122 sg_entry_cnt_minus_one = sg_entry_cnt - 1; in AscExeScsiQueue()
8124 scsi_cmd = scsiq->cdbptr[0]; in AscExeScsiQueue()
8126 if ((asc_dvc->pci_fix_asyn_xfer & scsiq->q1.target_id) && in AscExeScsiQueue()
8127 !(asc_dvc->pci_fix_asyn_xfer_always & scsiq->q1.target_id)) { in AscExeScsiQueue()
8128 if (scsiq->q1.cntl & QC_SG_HEAD) { in AscExeScsiQueue()
8131 data_cnt += le32_to_cpu(sg_head->sg_list[i]. in AscExeScsiQueue()
8135 data_cnt = le32_to_cpu(scsiq->q1.data_cnt); in AscExeScsiQueue()
8158 scsiq->q2.tag_code &= ~SIMPLE_QUEUE_TAG; in AscExeScsiQueue()
8159 scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX | in AscExeScsiQueue()
8162 scsiq->q2.tag_code &= 0x27; in AscExeScsiQueue()
8164 if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) { in AscExeScsiQueue()
8165 if (asc_dvc->bug_fix_cntl) { in AscExeScsiQueue()
8166 if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) { in AscExeScsiQueue()
8169 addr = le32_to_cpu(sg_head-> in AscExeScsiQueue()
8173 le32_to_cpu(sg_head-> in AscExeScsiQueue()
8181 ((scsiq->q2. in AscExeScsiQueue()
8185 scsiq->q2.tag_code |= in AscExeScsiQueue()
8187 scsiq->q1.extra_bytes = in AscExeScsiQueue()
8190 le32_to_cpu(sg_head-> in AscExeScsiQueue()
8194 data_cnt -= extra_bytes; in AscExeScsiQueue()
8195 sg_head-> in AscExeScsiQueue()
8204 sg_head->entry_to_copy = sg_head->entry_cnt; in AscExeScsiQueue()
8208 || ((scsiq->q1.cntl & QC_URGENT) != 0)) { in AscExeScsiQueue()
8212 asc_dvc->in_critical_cnt--; in AscExeScsiQueue()
8217 if (asc_dvc->bug_fix_cntl) { in AscExeScsiQueue()
8218 if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) { in AscExeScsiQueue()
8222 le32_to_cpu(scsiq->q1.data_addr) + in AscExeScsiQueue()
8223 le32_to_cpu(scsiq->q1.data_cnt); in AscExeScsiQueue()
8228 ((scsiq->q2. in AscExeScsiQueue()
8233 le32_to_cpu(scsiq->q1. in AscExeScsiQueue()
8237 scsiq->q2.tag_code |= in AscExeScsiQueue()
8239 data_cnt -= extra_bytes; in AscExeScsiQueue()
8240 scsiq->q1.data_cnt = in AscExeScsiQueue()
8243 scsiq->q1.extra_bytes = in AscExeScsiQueue()
8252 ((scsiq->q1.cntl & QC_URGENT) != 0)) { in AscExeScsiQueue()
8255 asc_dvc->in_critical_cnt--; in AscExeScsiQueue()
8260 asc_dvc->in_critical_cnt--; in AscExeScsiQueue()
8265 * AdvExeScsiQueue() - Send a request to the RISC microcode program.
8274 * Multi-byte fields in the ADV_SCSI_REQ_Q that are used by the microcode
8275 * for DMA addresses or math operations are byte swapped to little-endian
8279 * ADV_SUCCESS(1) - The request was successfully queued.
8280 * ADV_BUSY(0) - Resource unavailable; Retry again after pending
8282 * ADV_ERROR(-1) - Invalid ADV_SCSI_REQ_Q request structure
8289 ADV_SCSI_REQ_Q *scsiq = &reqp->scsi_req_q; in AdvExeScsiQueue()
8294 if (scsiq->target_id > ADV_MAX_TID) { in AdvExeScsiQueue()
8295 scsiq->host_status = QHSTA_M_INVALID_DEVICE; in AdvExeScsiQueue()
8296 scsiq->done_status = QD_WITH_ERROR; in AdvExeScsiQueue()
8300 iop_base = asc_dvc->iop_base; in AdvExeScsiQueue()
8308 ASC_DBG(1, "No free carriers\n"); in AdvExeScsiQueue()
8312 asc_dvc->carr_pending_cnt++; in AdvExeScsiQueue()
8315 scsiq->scsiq_ptr = cpu_to_le32(scsiq->srb_tag); in AdvExeScsiQueue()
8316 scsiq->scsiq_rptr = cpu_to_le32(reqp->req_addr); in AdvExeScsiQueue()
8318 scsiq->carr_va = asc_dvc->icq_sp->carr_va; in AdvExeScsiQueue()
8319 scsiq->carr_pa = asc_dvc->icq_sp->carr_pa; in AdvExeScsiQueue()
8326 asc_dvc->icq_sp->areq_vpa = scsiq->scsiq_rptr; in AdvExeScsiQueue()
8333 asc_dvc->icq_sp->next_vpa = new_carrp->carr_pa; in AdvExeScsiQueue()
8338 asc_dvc->icq_sp = new_carrp; in AdvExeScsiQueue()
8340 if (asc_dvc->chip_type == ADV_CHIP_ASC3550 || in AdvExeScsiQueue()
8341 asc_dvc->chip_type == ADV_CHIP_ASC38C0800) { in AdvExeScsiQueue()
8346 if (asc_dvc->chip_type == ADV_CHIP_ASC3550) { in AdvExeScsiQueue()
8348 * Clear the tickle value. In the ASC-3550 the RISC flag in AdvExeScsiQueue()
8355 } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) { in AdvExeScsiQueue()
8361 le32_to_cpu(new_carrp->carr_pa)); in AdvExeScsiQueue()
8373 struct asc_board *boardp = shost_priv(scp->device->host); in asc_execute_scsi_cmnd()
8378 ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var; in asc_execute_scsi_cmnd()
8383 ASC_STATS(scp->device->host, build_error); in asc_execute_scsi_cmnd()
8389 err_code = asc_dvc->err_code; in asc_execute_scsi_cmnd()
8391 ADV_DVC_VAR *adv_dvc = &boardp->dvc_var.adv_dvc_var; in asc_execute_scsi_cmnd()
8410 ASC_STATS(scp->device->host, build_error); in asc_execute_scsi_cmnd()
8415 err_code = adv_dvc->err_code; in asc_execute_scsi_cmnd()
8420 ASC_STATS(scp->device->host, exe_noerror); in asc_execute_scsi_cmnd()
8425 boardp->reqcnt[scp->device->id]++; in asc_execute_scsi_cmnd()
8430 ASC_STATS(scp->device->host, exe_busy); in asc_execute_scsi_cmnd()
8435 ASC_STATS(scp->device->host, exe_error); in asc_execute_scsi_cmnd()
8441 ASC_STATS(scp->device->host, exe_unknown); in asc_execute_scsi_cmnd()
8451 * advansys_queuecommand() - interrupt-driven I/O entrypoint.
8459 struct Scsi_Host *shost = scp->device->host; in advansys_queuecommand_lck()
8463 scp->scsi_done = done; in advansys_queuecommand_lck()
8502 * The PCI BIOS is re-located by the motherboard BIOS. Because in AscGetChipBiosAddress()
8554 return ASC_CHIP_MIN_VER_EISA - 1 + revision; in AscGetChipVersion()
8590 iop_base = asc_dvc->iop_base; in AscInitAscDvcVar()
8591 asc_dvc->err_code = 0; in AscInitAscDvcVar()
8592 if ((asc_dvc->bus_type & in AscInitAscDvcVar()
8594 asc_dvc->err_code |= ASC_IERR_NO_BUS_TYPE; in AscInitAscDvcVar()
8598 asc_dvc->bug_fix_cntl = 0; in AscInitAscDvcVar()
8599 asc_dvc->pci_fix_asyn_xfer = 0; in AscInitAscDvcVar()
8600 asc_dvc->pci_fix_asyn_xfer_always = 0; in AscInitAscDvcVar()
8601 /* asc_dvc->init_state initialized in AscInitGetConfig(). */ in AscInitAscDvcVar()
8602 asc_dvc->sdtr_done = 0; in AscInitAscDvcVar()
8603 asc_dvc->cur_total_qng = 0; in AscInitAscDvcVar()
8604 asc_dvc->is_in_int = false; in AscInitAscDvcVar()
8605 asc_dvc->in_critical_cnt = 0; in AscInitAscDvcVar()
8606 asc_dvc->last_q_shortage = 0; in AscInitAscDvcVar()
8607 asc_dvc->use_tagged_qng = 0; in AscInitAscDvcVar()
8608 asc_dvc->no_scam = 0; in AscInitAscDvcVar()
8609 asc_dvc->unit_not_ready = 0; in AscInitAscDvcVar()
8610 asc_dvc->queue_full_or_busy = 0; in AscInitAscDvcVar()
8611 asc_dvc->redo_scam = 0; in AscInitAscDvcVar()
8612 asc_dvc->res2 = 0; in AscInitAscDvcVar()
8613 asc_dvc->min_sdtr_index = 0; in AscInitAscDvcVar()
8614 asc_dvc->cfg->can_tagged_qng = 0; in AscInitAscDvcVar()
8615 asc_dvc->cfg->cmd_qng_enabled = 0; in AscInitAscDvcVar()
8616 asc_dvc->dvc_cntl = ASC_DEF_DVC_CNTL; in AscInitAscDvcVar()
8617 asc_dvc->init_sdtr = 0; in AscInitAscDvcVar()
8618 asc_dvc->max_total_qng = ASC_DEF_MAX_TOTAL_QNG; in AscInitAscDvcVar()
8619 asc_dvc->scsi_reset_wait = 3; in AscInitAscDvcVar()
8620 asc_dvc->start_motor = ASC_SCSI_WIDTH_BIT_SET; in AscInitAscDvcVar()
8621 asc_dvc->max_dma_count = AscGetMaxDmaCount(asc_dvc->bus_type); in AscInitAscDvcVar()
8622 asc_dvc->cfg->sdtr_enable = ASC_SCSI_WIDTH_BIT_SET; in AscInitAscDvcVar()
8623 asc_dvc->cfg->disc_enable = ASC_SCSI_WIDTH_BIT_SET; in AscInitAscDvcVar()
8624 asc_dvc->cfg->chip_scsi_id = ASC_DEF_CHIP_SCSI_ID; in AscInitAscDvcVar()
8625 chip_version = AscGetChipVersion(iop_base, asc_dvc->bus_type); in AscInitAscDvcVar()
8626 asc_dvc->cfg->chip_version = chip_version; in AscInitAscDvcVar()
8627 asc_dvc->sdtr_period_tbl = asc_syn_xfer_period; in AscInitAscDvcVar()
8628 asc_dvc->max_sdtr_index = 7; in AscInitAscDvcVar()
8629 if ((asc_dvc->bus_type & ASC_IS_PCI) && in AscInitAscDvcVar()
8631 asc_dvc->bus_type = ASC_IS_PCI_ULTRA; in AscInitAscDvcVar()
8632 asc_dvc->sdtr_period_tbl = asc_syn_ultra_xfer_period; in AscInitAscDvcVar()
8633 asc_dvc->max_sdtr_index = 15; in AscInitAscDvcVar()
8643 if (asc_dvc->bus_type == ASC_IS_PCI) { in AscInitAscDvcVar()
8649 asc_dvc->cur_dvc_qng[i] = 0; in AscInitAscDvcVar()
8650 asc_dvc->max_dvc_qng[i] = ASC_MAX_SCSI1_QNG; in AscInitAscDvcVar()
8651 asc_dvc->scsiq_busy_head[i] = (ASC_SCSI_Q *)0L; in AscInitAscDvcVar()
8652 asc_dvc->scsiq_busy_tail[i] = (ASC_SCSI_Q *)0L; in AscInitAscDvcVar()
8653 asc_dvc->cfg->max_tag_qng[i] = ASC_MAX_INRAM_TAG_QNG; in AscInitAscDvcVar()
8700 int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2; in AscGetEEPConfig()
8705 /* Read two config words; Byte-swapping done by AscReadEEPWord(). */ in AscGetEEPConfig()
8717 for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) { in AscGetEEPConfig()
8721 * Swap all char fields - must unswap bytes already swapped in AscGetEEPConfig()
8726 /* Don't swap word field at the end - cntl field. */ in AscGetEEPConfig()
8746 iop_base = asc_dvc->iop_base; in AscTestExternalLram()
8815 int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2; in AscSetEEPConfigOnce()
8834 for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) { in AscSetEEPConfigOnce()
8846 /* Don't swap word field at the end - cntl field. */ in AscSetEEPConfigOnce()
8863 * Read two config words; Byte-swapping done by AscReadEEPWord(). in AscSetEEPConfigOnce()
8877 for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) { in AscSetEEPConfigOnce()
8887 /* Don't swap word field at the end - cntl field. */ in AscSetEEPConfigOnce()
8931 iop_base = asc_dvc->iop_base; in AscInitFromEEP()
8937 asc_dvc->init_state |= ASC_INIT_RESET_SCSI_DONE; in AscInitFromEEP()
8939 mdelay(asc_dvc->scsi_reset_wait * 1000); /* XXX: msleep? */ in AscInitFromEEP()
8942 asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP; in AscInitFromEEP()
8947 asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR; in AscInitFromEEP()
8958 chksum = AscGetEEPConfig(iop_base, eep_config, asc_dvc->bus_type); in AscInitFromEEP()
8965 if (asc_dvc->cfg->chip_version == 3) { in AscInitFromEEP()
8966 if (eep_config->cfg_lsw != cfg_lsw) { in AscInitFromEEP()
8968 eep_config->cfg_lsw = in AscInitFromEEP()
8971 if (eep_config->cfg_msw != cfg_msw) { in AscInitFromEEP()
8973 eep_config->cfg_msw = in AscInitFromEEP()
8978 eep_config->cfg_msw &= ~ASC_CFG_MSW_CLR_MASK; in AscInitFromEEP()
8979 eep_config->cfg_lsw |= ASC_CFG0_HOST_INT_ON; in AscInitFromEEP()
8980 ASC_DBG(1, "eep_config->chksum 0x%x\n", eep_config->chksum); in AscInitFromEEP()
8981 if (chksum != eep_config->chksum) { in AscInitFromEEP()
8982 if (AscGetChipVersion(iop_base, asc_dvc->bus_type) == in AscInitFromEEP()
8984 ASC_DBG(1, "chksum error ignored; EEPROM-less board\n"); in AscInitFromEEP()
8985 eep_config->init_sdtr = 0xFF; in AscInitFromEEP()
8986 eep_config->disc_enable = 0xFF; in AscInitFromEEP()
8987 eep_config->start_motor = 0xFF; in AscInitFromEEP()
8988 eep_config->use_cmd_qng = 0; in AscInitFromEEP()
8989 eep_config->max_total_qng = 0xF0; in AscInitFromEEP()
8990 eep_config->max_tag_qng = 0x20; in AscInitFromEEP()
8991 eep_config->cntl = 0xBFFF; in AscInitFromEEP()
8993 eep_config->no_scam = 0; in AscInitFromEEP()
8994 eep_config->adapter_info[0] = 0; in AscInitFromEEP()
8995 eep_config->adapter_info[1] = 0; in AscInitFromEEP()
8996 eep_config->adapter_info[2] = 0; in AscInitFromEEP()
8997 eep_config->adapter_info[3] = 0; in AscInitFromEEP()
8998 eep_config->adapter_info[4] = 0; in AscInitFromEEP()
8999 /* Indicate EEPROM-less board. */ in AscInitFromEEP()
9000 eep_config->adapter_info[5] = 0xBB; in AscInitFromEEP()
9003 ("AscInitFromEEP: EEPROM checksum error; Will try to re-write EEPROM.\n"); in AscInitFromEEP()
9008 asc_dvc->cfg->sdtr_enable = eep_config->init_sdtr; in AscInitFromEEP()
9009 asc_dvc->cfg->disc_enable = eep_config->disc_enable; in AscInitFromEEP()
9010 asc_dvc->cfg->cmd_qng_enabled = eep_config->use_cmd_qng; in AscInitFromEEP()
9011 asc_dvc->start_motor = eep_config->start_motor; in AscInitFromEEP()
9012 asc_dvc->dvc_cntl = eep_config->cntl; in AscInitFromEEP()
9013 asc_dvc->no_scam = eep_config->no_scam; in AscInitFromEEP()
9014 asc_dvc->cfg->adapter_info[0] = eep_config->adapter_info[0]; in AscInitFromEEP()
9015 asc_dvc->cfg->adapter_info[1] = eep_config->adapter_info[1]; in AscInitFromEEP()
9016 asc_dvc->cfg->adapter_info[2] = eep_config->adapter_info[2]; in AscInitFromEEP()
9017 asc_dvc->cfg->adapter_info[3] = eep_config->adapter_info[3]; in AscInitFromEEP()
9018 asc_dvc->cfg->adapter_info[4] = eep_config->adapter_info[4]; in AscInitFromEEP()
9019 asc_dvc->cfg->adapter_info[5] = eep_config->adapter_info[5]; in AscInitFromEEP()
9021 if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == in AscInitFromEEP()
9023 eep_config->max_total_qng = in AscInitFromEEP()
9025 eep_config->max_tag_qng = in AscInitFromEEP()
9028 eep_config->cfg_msw |= 0x0800; in AscInitFromEEP()
9031 eep_config->max_total_qng = ASC_MAX_PCI_INRAM_TOTAL_QNG; in AscInitFromEEP()
9032 eep_config->max_tag_qng = ASC_MAX_INRAM_TAG_QNG; in AscInitFromEEP()
9036 if (eep_config->max_total_qng < ASC_MIN_TOTAL_QNG) { in AscInitFromEEP()
9037 eep_config->max_total_qng = ASC_MIN_TOTAL_QNG; in AscInitFromEEP()
9039 if (eep_config->max_total_qng > ASC_MAX_TOTAL_QNG) { in AscInitFromEEP()
9040 eep_config->max_total_qng = ASC_MAX_TOTAL_QNG; in AscInitFromEEP()
9042 if (eep_config->max_tag_qng > eep_config->max_total_qng) { in AscInitFromEEP()
9043 eep_config->max_tag_qng = eep_config->max_total_qng; in AscInitFromEEP()
9045 if (eep_config->max_tag_qng < ASC_MIN_TAG_Q_PER_DVC) { in AscInitFromEEP()
9046 eep_config->max_tag_qng = ASC_MIN_TAG_Q_PER_DVC; in AscInitFromEEP()
9048 asc_dvc->max_total_qng = eep_config->max_total_qng; in AscInitFromEEP()
9049 if ((eep_config->use_cmd_qng & eep_config->disc_enable) != in AscInitFromEEP()
9050 eep_config->use_cmd_qng) { in AscInitFromEEP()
9051 eep_config->disc_enable = eep_config->use_cmd_qng; in AscInitFromEEP()
9056 asc_dvc->cfg->chip_scsi_id = ASC_EEP_GET_CHIP_ID(eep_config); in AscInitFromEEP()
9057 if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) && in AscInitFromEEP()
9058 !(asc_dvc->dvc_cntl & ASC_CNTL_SDTR_ENABLE_ULTRA)) { in AscInitFromEEP()
9059 asc_dvc->min_sdtr_index = ASC_SDTR_ULTRA_PCI_10MB_INDEX; in AscInitFromEEP()
9063 asc_dvc->dos_int13_table[i] = eep_config->dos_int13_table[i]; in AscInitFromEEP()
9064 asc_dvc->cfg->max_tag_qng[i] = eep_config->max_tag_qng; in AscInitFromEEP()
9065 asc_dvc->cfg->sdtr_period_offset[i] = in AscInitFromEEP()
9067 (asc_dvc->min_sdtr_index << 4)); in AscInitFromEEP()
9069 eep_config->cfg_msw = AscGetChipCfgMsw(iop_base); in AscInitFromEEP()
9072 asc_dvc->bus_type)) != 0) { in AscInitFromEEP()
9074 ("AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n", in AscInitFromEEP()
9078 ("AscInitFromEEP: Successfully re-wrote EEPROM.\n"); in AscInitFromEEP()
9087 ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var; in AscInitGetConfig()
9090 asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG; in AscInitGetConfig()
9091 if (asc_dvc->err_code != 0) in AscInitGetConfig()
9092 return asc_dvc->err_code; in AscInitGetConfig()
9094 if (AscFindSignature(asc_dvc->iop_base)) { in AscInitGetConfig()
9097 asc_dvc->init_state |= ASC_INIT_STATE_END_GET_CFG; in AscInitGetConfig()
9098 if (asc_dvc->scsi_reset_wait > ASC_MAX_SCSI_RESET_WAIT) in AscInitGetConfig()
9099 asc_dvc->scsi_reset_wait = ASC_MAX_SCSI_RESET_WAIT; in AscInitGetConfig()
9101 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; in AscInitGetConfig()
9105 case 0: /* No error */ in AscInitGetConfig()
9131 if (asc_dvc->err_code != 0) in AscInitGetConfig()
9133 "0x%x\n", asc_dvc->err_code, asc_dvc->init_state); in AscInitGetConfig()
9135 return asc_dvc->err_code; in AscInitGetConfig()
9141 ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var; in AscInitSetConfig()
9142 PortAddr iop_base = asc_dvc->iop_base; in AscInitSetConfig()
9146 asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG; in AscInitSetConfig()
9147 if (asc_dvc->err_code != 0) in AscInitSetConfig()
9148 return asc_dvc->err_code; in AscInitSetConfig()
9149 if (!AscFindSignature(asc_dvc->iop_base)) { in AscInitSetConfig()
9150 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; in AscInitSetConfig()
9151 return asc_dvc->err_code; in AscInitSetConfig()
9160 if ((asc_dvc->cfg->cmd_qng_enabled & asc_dvc->cfg->disc_enable) != in AscInitSetConfig()
9161 asc_dvc->cfg->cmd_qng_enabled) { in AscInitSetConfig()
9162 asc_dvc->cfg->disc_enable = asc_dvc->cfg->cmd_qng_enabled; in AscInitSetConfig()
9169 if (asc_dvc->bus_type & ASC_IS_PCI) { in AscInitSetConfig()
9172 if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) { in AscInitSetConfig()
9174 if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) || in AscInitSetConfig()
9175 (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) { in AscInitSetConfig()
9176 asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_IF_NOT_DWB; in AscInitSetConfig()
9177 asc_dvc->bug_fix_cntl |= in AscInitSetConfig()
9183 if (AscSetChipScsiID(iop_base, asc_dvc->cfg->chip_scsi_id) != in AscInitSetConfig()
9184 asc_dvc->cfg->chip_scsi_id) { in AscInitSetConfig()
9185 asc_dvc->err_code |= ASC_IERR_SET_SCSI_ID; in AscInitSetConfig()
9188 asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG; in AscInitSetConfig()
9191 case 0: /* No error. */ in AscInitSetConfig()
9217 if (asc_dvc->err_code != 0) in AscInitSetConfig()
9219 "0x%x\n", asc_dvc->err_code, asc_dvc->init_state); in AscInitSetConfig()
9221 return asc_dvc->err_code; in AscInitSetConfig()
9237 * on big-endian platforms so char fields read as words are actually being
9238 * unswapped on big-endian platforms.
9282 0, /* -disc_enable */
9345 , /* 22-29 oem_name[16] */
9410 , /* 22-29 oem_name[16] */
9475 , /* 22-29 oem_name[16] */
9540 , /* 22-29 oem_name[16] */
9944 * For a non-fatal error return a warning code. If there are no warnings
9955 iop_base = asc_dvc->iop_base; in AdvInitFrom3550EEP()
9978 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1); in AdvInitFrom3550EEP()
9981 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2); in AdvInitFrom3550EEP()
9984 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3); in AdvInitFrom3550EEP()
9994 asc_dvc->wdtr_able = eep_config.wdtr_able; in AdvInitFrom3550EEP()
9995 asc_dvc->sdtr_able = eep_config.sdtr_able; in AdvInitFrom3550EEP()
9996 asc_dvc->ultra_able = eep_config.ultra_able; in AdvInitFrom3550EEP()
9997 asc_dvc->tagqng_able = eep_config.tagqng_able; in AdvInitFrom3550EEP()
9998 asc_dvc->cfg->disc_enable = eep_config.disc_enable; in AdvInitFrom3550EEP()
9999 asc_dvc->max_host_qng = eep_config.max_host_qng; in AdvInitFrom3550EEP()
10000 asc_dvc->max_dvc_qng = eep_config.max_dvc_qng; in AdvInitFrom3550EEP()
10001 asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID); in AdvInitFrom3550EEP()
10002 asc_dvc->start_motor = eep_config.start_motor; in AdvInitFrom3550EEP()
10003 asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay; in AdvInitFrom3550EEP()
10004 asc_dvc->bios_ctrl = eep_config.bios_ctrl; in AdvInitFrom3550EEP()
10005 asc_dvc->no_scam = eep_config.scam_tolerant; in AdvInitFrom3550EEP()
10006 asc_dvc->cfg->serial1 = eep_config.serial_number_word1; in AdvInitFrom3550EEP()
10007 asc_dvc->cfg->serial2 = eep_config.serial_number_word2; in AdvInitFrom3550EEP()
10008 asc_dvc->cfg->serial3 = eep_config.serial_number_word3; in AdvInitFrom3550EEP()
10048 asc_dvc->max_host_qng = eep_config.max_host_qng; in AdvInitFrom3550EEP()
10049 asc_dvc->max_dvc_qng = eep_config.max_dvc_qng; in AdvInitFrom3550EEP()
10055 * If the termination is specified with a non-zero 'termination' in AdvInitFrom3550EEP()
10060 asc_dvc->cfg->termination = 0; /* auto termination */ in AdvInitFrom3550EEP()
10064 asc_dvc->cfg->termination = TERM_CTL_SEL; in AdvInitFrom3550EEP()
10068 asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H; in AdvInitFrom3550EEP()
10072 asc_dvc->cfg->termination = in AdvInitFrom3550EEP()
10079 asc_dvc->cfg->termination = 0; in AdvInitFrom3550EEP()
10094 * For a non-fatal error return a warning code. If there are no warnings
10107 iop_base = asc_dvc->iop_base; in AdvInitFrom38C0800EEP()
10131 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1); in AdvInitFrom38C0800EEP()
10134 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2); in AdvInitFrom38C0800EEP()
10137 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3); in AdvInitFrom38C0800EEP()
10147 asc_dvc->wdtr_able = eep_config.wdtr_able; in AdvInitFrom38C0800EEP()
10148 asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1; in AdvInitFrom38C0800EEP()
10149 asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2; in AdvInitFrom38C0800EEP()
10150 asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3; in AdvInitFrom38C0800EEP()
10151 asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4; in AdvInitFrom38C0800EEP()
10152 asc_dvc->tagqng_able = eep_config.tagqng_able; in AdvInitFrom38C0800EEP()
10153 asc_dvc->cfg->disc_enable = eep_config.disc_enable; in AdvInitFrom38C0800EEP()
10154 asc_dvc->max_host_qng = eep_config.max_host_qng; in AdvInitFrom38C0800EEP()
10155 asc_dvc->max_dvc_qng = eep_config.max_dvc_qng; in AdvInitFrom38C0800EEP()
10156 asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID); in AdvInitFrom38C0800EEP()
10157 asc_dvc->start_motor = eep_config.start_motor; in AdvInitFrom38C0800EEP()
10158 asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay; in AdvInitFrom38C0800EEP()
10159 asc_dvc->bios_ctrl = eep_config.bios_ctrl; in AdvInitFrom38C0800EEP()
10160 asc_dvc->no_scam = eep_config.scam_tolerant; in AdvInitFrom38C0800EEP()
10161 asc_dvc->cfg->serial1 = eep_config.serial_number_word1; in AdvInitFrom38C0800EEP()
10162 asc_dvc->cfg->serial2 = eep_config.serial_number_word2; in AdvInitFrom38C0800EEP()
10163 asc_dvc->cfg->serial3 = eep_config.serial_number_word3; in AdvInitFrom38C0800EEP()
10169 asc_dvc->sdtr_able = 0; in AdvInitFrom38C0800EEP()
10172 sdtr_speed = asc_dvc->sdtr_speed1; in AdvInitFrom38C0800EEP()
10174 sdtr_speed = asc_dvc->sdtr_speed2; in AdvInitFrom38C0800EEP()
10176 sdtr_speed = asc_dvc->sdtr_speed3; in AdvInitFrom38C0800EEP()
10178 sdtr_speed = asc_dvc->sdtr_speed4; in AdvInitFrom38C0800EEP()
10181 asc_dvc->sdtr_able |= (1 << tid); in AdvInitFrom38C0800EEP()
10224 asc_dvc->max_host_qng = eep_config.max_host_qng; in AdvInitFrom38C0800EEP()
10225 asc_dvc->max_dvc_qng = eep_config.max_dvc_qng; in AdvInitFrom38C0800EEP()
10231 * If the termination is specified with a non-zero 'termination' in AdvInitFrom38C0800EEP()
10260 asc_dvc->cfg->termination = termination; /* auto termination for LVD */ in AdvInitFrom38C0800EEP()
10264 asc_dvc->cfg->termination = termination; in AdvInitFrom38C0800EEP()
10268 asc_dvc->cfg->termination = termination | TERM_LVD_HI; in AdvInitFrom38C0800EEP()
10272 asc_dvc->cfg->termination = termination | TERM_LVD; in AdvInitFrom38C0800EEP()
10278 asc_dvc->cfg->termination = termination; in AdvInitFrom38C0800EEP()
10293 * For a non-fatal error return a warning code. If there are no warnings
10306 iop_base = asc_dvc->iop_base; in AdvInitFrom38C1600EEP()
10326 if (PCI_FUNC(pdev->devfn) != 0) { in AdvInitFrom38C1600EEP()
10340 * 1 - Function 1 interrupt line wired to INT A. in AdvInitFrom38C1600EEP()
10341 * 0 - Function 1 interrupt line wired to INT B. in AdvInitFrom38C1600EEP()
10358 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1); in AdvInitFrom38C1600EEP()
10360 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2); in AdvInitFrom38C1600EEP()
10362 AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3); in AdvInitFrom38C1600EEP()
10373 asc_dvc->wdtr_able = eep_config.wdtr_able; in AdvInitFrom38C1600EEP()
10374 asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1; in AdvInitFrom38C1600EEP()
10375 asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2; in AdvInitFrom38C1600EEP()
10376 asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3; in AdvInitFrom38C1600EEP()
10377 asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4; in AdvInitFrom38C1600EEP()
10378 asc_dvc->ppr_able = 0; in AdvInitFrom38C1600EEP()
10379 asc_dvc->tagqng_able = eep_config.tagqng_able; in AdvInitFrom38C1600EEP()
10380 asc_dvc->cfg->disc_enable = eep_config.disc_enable; in AdvInitFrom38C1600EEP()
10381 asc_dvc->max_host_qng = eep_config.max_host_qng; in AdvInitFrom38C1600EEP()
10382 asc_dvc->max_dvc_qng = eep_config.max_dvc_qng; in AdvInitFrom38C1600EEP()
10383 asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ASC_MAX_TID); in AdvInitFrom38C1600EEP()
10384 asc_dvc->start_motor = eep_config.start_motor; in AdvInitFrom38C1600EEP()
10385 asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay; in AdvInitFrom38C1600EEP()
10386 asc_dvc->bios_ctrl = eep_config.bios_ctrl; in AdvInitFrom38C1600EEP()
10387 asc_dvc->no_scam = eep_config.scam_tolerant; in AdvInitFrom38C1600EEP()
10393 asc_dvc->sdtr_able = 0; in AdvInitFrom38C1600EEP()
10396 sdtr_speed = asc_dvc->sdtr_speed1; in AdvInitFrom38C1600EEP()
10398 sdtr_speed = asc_dvc->sdtr_speed2; in AdvInitFrom38C1600EEP()
10400 sdtr_speed = asc_dvc->sdtr_speed3; in AdvInitFrom38C1600EEP()
10402 sdtr_speed = asc_dvc->sdtr_speed4; in AdvInitFrom38C1600EEP()
10405 asc_dvc->sdtr_able |= (1 << tid); in AdvInitFrom38C1600EEP()
10448 asc_dvc->max_host_qng = eep_config.max_host_qng; in AdvInitFrom38C1600EEP()
10449 asc_dvc->max_dvc_qng = eep_config.max_dvc_qng; in AdvInitFrom38C1600EEP()
10455 * If the termination is specified with a non-zero 'termination' in AdvInitFrom38C1600EEP()
10484 asc_dvc->cfg->termination = termination; /* auto termination for LVD */ in AdvInitFrom38C1600EEP()
10488 asc_dvc->cfg->termination = termination; in AdvInitFrom38C1600EEP()
10492 asc_dvc->cfg->termination = termination | TERM_LVD_HI; in AdvInitFrom38C1600EEP()
10496 asc_dvc->cfg->termination = termination | TERM_LVD; in AdvInitFrom38C1600EEP()
10502 asc_dvc->cfg->termination = termination; in AdvInitFrom38C1600EEP()
10515 * For a non-fatal error return a warning code. If there are no warnings
10521 ADV_DVC_VAR *asc_dvc = &board->dvc_var.adv_dvc_var; in AdvInitGetConfig()
10523 AdvPortAddr iop_base = asc_dvc->iop_base; in AdvInitGetConfig()
10527 asc_dvc->err_code = 0; in AdvInitGetConfig()
10533 * DMA parity errors. in AdvInitGetConfig()
10535 asc_dvc->cfg->control_flag = 0; in AdvInitGetConfig()
10538 asc_dvc->cfg->control_flag |= CONTROL_FLAG_IGNORE_PERR; in AdvInitGetConfig()
10540 asc_dvc->cfg->chip_version = in AdvInitGetConfig()
10541 AdvGetChipVersion(iop_base, asc_dvc->bus_type); in AdvInitGetConfig()
10555 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; in AdvInitGetConfig()
10561 if (asc_dvc->chip_type != ADV_CHIP_ASC3550 && in AdvInitGetConfig()
10562 asc_dvc->chip_type != ADV_CHIP_ASC38C0800 && in AdvInitGetConfig()
10563 asc_dvc->chip_type != ADV_CHIP_ASC38C1600) { in AdvInitGetConfig()
10564 asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE; in AdvInitGetConfig()
10577 if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) { in AdvInitGetConfig()
10579 } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) { in AdvInitGetConfig()
10590 if (asc_dvc->err_code) in AdvInitGetConfig()
10592 asc_dvc->err_code); in AdvInitGetConfig()
10594 return asc_dvc->err_code; in AdvInitGetConfig()
10614 struct adv_dvc_var *adv_dvc = &board->dvc_var.adv_dvc_var; in advansys_wide_init_chip()
10622 adv_dvc->carrier = dma_alloc_coherent(board->dev, in advansys_wide_init_chip()
10623 ADV_CARRIER_BUFSIZE, &adv_dvc->carrier_addr, GFP_KERNEL); in advansys_wide_init_chip()
10624 ASC_DBG(1, "carrier 0x%p\n", adv_dvc->carrier); in advansys_wide_init_chip()
10626 if (!adv_dvc->carrier) in advansys_wide_init_chip()
10634 board->adv_reqp_size = adv_dvc->max_host_qng * sizeof(adv_req_t); in advansys_wide_init_chip()
10635 if (board->adv_reqp_size & 0x1f) { in advansys_wide_init_chip()
10637 board->adv_reqp_size = ADV_32BALIGN(board->adv_reqp_size); in advansys_wide_init_chip()
10639 board->adv_reqp = dma_alloc_coherent(board->dev, board->adv_reqp_size, in advansys_wide_init_chip()
10640 &board->adv_reqp_addr, GFP_KERNEL); in advansys_wide_init_chip()
10642 if (!board->adv_reqp) in advansys_wide_init_chip()
10645 ASC_DBG(1, "reqp 0x%p, req_cnt %d, bytes %lu\n", board->adv_reqp, in advansys_wide_init_chip()
10646 adv_dvc->max_host_qng, board->adv_reqp_size); in advansys_wide_init_chip()
10653 board->adv_sgblk_pool = dma_pool_create("adv_sgblk", board->dev, in advansys_wide_init_chip()
10659 if (!board->adv_sgblk_pool) in advansys_wide_init_chip()
10662 if (adv_dvc->chip_type == ADV_CHIP_ASC3550) { in advansys_wide_init_chip()
10665 } else if (adv_dvc->chip_type == ADV_CHIP_ASC38C0800) { in advansys_wide_init_chip()
10672 err_code = adv_dvc->err_code; in advansys_wide_init_chip()
10690 struct adv_dvc_var *adv_dvc = &board->dvc_var.adv_dvc_var; in advansys_wide_free_mem()
10692 if (adv_dvc->carrier) { in advansys_wide_free_mem()
10693 dma_free_coherent(board->dev, ADV_CARRIER_BUFSIZE, in advansys_wide_free_mem()
10694 adv_dvc->carrier, adv_dvc->carrier_addr); in advansys_wide_free_mem()
10695 adv_dvc->carrier = NULL; in advansys_wide_free_mem()
10697 if (board->adv_reqp) { in advansys_wide_free_mem()
10698 dma_free_coherent(board->dev, board->adv_reqp_size, in advansys_wide_free_mem()
10699 board->adv_reqp, board->adv_reqp_addr); in advansys_wide_free_mem()
10700 board->adv_reqp = NULL; in advansys_wide_free_mem()
10702 if (board->adv_sgblk_pool) { in advansys_wide_free_mem()
10703 dma_pool_destroy(board->adv_sgblk_pool); in advansys_wide_free_mem()
10704 board->adv_sgblk_pool = NULL; in advansys_wide_free_mem()
10717 pdev = (bus_type == ASC_IS_PCI) ? to_pci_dev(boardp->dev) : NULL; in advansys_board_found()
10721 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var; in advansys_board_found()
10722 asc_dvc_varp->bus_type = bus_type; in advansys_board_found()
10723 asc_dvc_varp->drv_ptr = boardp; in advansys_board_found()
10724 asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg; in advansys_board_found()
10725 asc_dvc_varp->iop_base = iop; in advansys_board_found()
10728 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var; in advansys_board_found()
10729 adv_dvc_varp->drv_ptr = boardp; in advansys_board_found()
10730 adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg; in advansys_board_found()
10731 if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW) { in advansys_board_found()
10732 ASC_DBG(1, "wide board ASC-3550\n"); in advansys_board_found()
10733 adv_dvc_varp->chip_type = ADV_CHIP_ASC3550; in advansys_board_found()
10734 } else if (pdev->device == PCI_DEVICE_ID_38C0800_REV1) { in advansys_board_found()
10735 ASC_DBG(1, "wide board ASC-38C0800\n"); in advansys_board_found()
10736 adv_dvc_varp->chip_type = ADV_CHIP_ASC38C0800; in advansys_board_found()
10738 ASC_DBG(1, "wide board ASC-38C1600\n"); in advansys_board_found()
10739 adv_dvc_varp->chip_type = ADV_CHIP_ASC38C1600; in advansys_board_found()
10742 boardp->asc_n_io_port = pci_resource_len(pdev, 1); in advansys_board_found()
10743 boardp->ioremap_addr = pci_ioremap_bar(pdev, 1); in advansys_board_found()
10744 if (!boardp->ioremap_addr) { in advansys_board_found()
10748 boardp->asc_n_io_port); in advansys_board_found()
10749 ret = -ENODEV; in advansys_board_found()
10752 adv_dvc_varp->iop_base = (AdvPortAddr)boardp->ioremap_addr; in advansys_board_found()
10753 ASC_DBG(1, "iop_base: 0x%p\n", adv_dvc_varp->iop_base); in advansys_board_found()
10760 boardp->ioport = iop; in advansys_board_found()
10772 switch (asc_dvc_varp->bus_type) { in advansys_board_found()
10788 "%d\n", asc_dvc_varp->bus_type); in advansys_board_found()
10795 * bus_type value. The bus_type value should no in advansys_board_found()
10797 * referenced only use the bit-wise AND operator "&". in advansys_board_found()
10800 ret = AscInitGetConfig(shost) ? -ENODEV : 0; in advansys_board_found()
10810 ret = AdvInitGetConfig(pdev, shost) ? -ENODEV : 0; in advansys_board_found()
10813 ret = -ENODEV; in advansys_board_found()
10831 boardp->init_tidmask |= in advansys_board_found()
10832 ADV_TID_TO_TIDMASK(asc_dvc_varp->cfg->chip_scsi_id); in advansys_board_found()
10837 ep = &boardp->eep_config.asc_eep; in advansys_board_found()
10839 ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable; in advansys_board_found()
10840 ep->disc_enable = asc_dvc_varp->cfg->disc_enable; in advansys_board_found()
10841 ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled; in advansys_board_found()
10843 ep->start_motor = asc_dvc_varp->start_motor; in advansys_board_found()
10844 ep->cntl = asc_dvc_varp->dvc_cntl; in advansys_board_found()
10845 ep->no_scam = asc_dvc_varp->no_scam; in advansys_board_found()
10846 ep->max_total_qng = asc_dvc_varp->max_total_qng; in advansys_board_found()
10847 ASC_EEP_SET_CHIP_ID(ep, asc_dvc_varp->cfg->chip_scsi_id); in advansys_board_found()
10849 ep->max_tag_qng = asc_dvc_varp->cfg->max_tag_qng[0]; in advansys_board_found()
10850 ep->adapter_info[0] = asc_dvc_varp->cfg->adapter_info[0]; in advansys_board_found()
10851 ep->adapter_info[1] = asc_dvc_varp->cfg->adapter_info[1]; in advansys_board_found()
10852 ep->adapter_info[2] = asc_dvc_varp->cfg->adapter_info[2]; in advansys_board_found()
10853 ep->adapter_info[3] = asc_dvc_varp->cfg->adapter_info[3]; in advansys_board_found()
10854 ep->adapter_info[4] = asc_dvc_varp->cfg->adapter_info[4]; in advansys_board_found()
10855 ep->adapter_info[5] = asc_dvc_varp->cfg->adapter_info[5]; in advansys_board_found()
10861 ret = AscInitSetConfig(pdev, shost) ? -ENODEV : 0; in advansys_board_found()
10872 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { in advansys_board_found()
10873 ep_3550 = &boardp->eep_config.adv_3550_eep; in advansys_board_found()
10875 ep_3550->adapter_scsi_id = adv_dvc_varp->chip_scsi_id; in advansys_board_found()
10876 ep_3550->max_host_qng = adv_dvc_varp->max_host_qng; in advansys_board_found()
10877 ep_3550->max_dvc_qng = adv_dvc_varp->max_dvc_qng; in advansys_board_found()
10878 ep_3550->termination = adv_dvc_varp->cfg->termination; in advansys_board_found()
10879 ep_3550->disc_enable = adv_dvc_varp->cfg->disc_enable; in advansys_board_found()
10880 ep_3550->bios_ctrl = adv_dvc_varp->bios_ctrl; in advansys_board_found()
10881 ep_3550->wdtr_able = adv_dvc_varp->wdtr_able; in advansys_board_found()
10882 ep_3550->sdtr_able = adv_dvc_varp->sdtr_able; in advansys_board_found()
10883 ep_3550->ultra_able = adv_dvc_varp->ultra_able; in advansys_board_found()
10884 ep_3550->tagqng_able = adv_dvc_varp->tagqng_able; in advansys_board_found()
10885 ep_3550->start_motor = adv_dvc_varp->start_motor; in advansys_board_found()
10886 ep_3550->scsi_reset_delay = in advansys_board_found()
10887 adv_dvc_varp->scsi_reset_wait; in advansys_board_found()
10888 ep_3550->serial_number_word1 = in advansys_board_found()
10889 adv_dvc_varp->cfg->serial1; in advansys_board_found()
10890 ep_3550->serial_number_word2 = in advansys_board_found()
10891 adv_dvc_varp->cfg->serial2; in advansys_board_found()
10892 ep_3550->serial_number_word3 = in advansys_board_found()
10893 adv_dvc_varp->cfg->serial3; in advansys_board_found()
10894 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { in advansys_board_found()
10895 ep_38C0800 = &boardp->eep_config.adv_38C0800_eep; in advansys_board_found()
10897 ep_38C0800->adapter_scsi_id = in advansys_board_found()
10898 adv_dvc_varp->chip_scsi_id; in advansys_board_found()
10899 ep_38C0800->max_host_qng = adv_dvc_varp->max_host_qng; in advansys_board_found()
10900 ep_38C0800->max_dvc_qng = adv_dvc_varp->max_dvc_qng; in advansys_board_found()
10901 ep_38C0800->termination_lvd = in advansys_board_found()
10902 adv_dvc_varp->cfg->termination; in advansys_board_found()
10903 ep_38C0800->disc_enable = in advansys_board_found()
10904 adv_dvc_varp->cfg->disc_enable; in advansys_board_found()
10905 ep_38C0800->bios_ctrl = adv_dvc_varp->bios_ctrl; in advansys_board_found()
10906 ep_38C0800->wdtr_able = adv_dvc_varp->wdtr_able; in advansys_board_found()
10907 ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able; in advansys_board_found()
10908 ep_38C0800->sdtr_speed1 = adv_dvc_varp->sdtr_speed1; in advansys_board_found()
10909 ep_38C0800->sdtr_speed2 = adv_dvc_varp->sdtr_speed2; in advansys_board_found()
10910 ep_38C0800->sdtr_speed3 = adv_dvc_varp->sdtr_speed3; in advansys_board_found()
10911 ep_38C0800->sdtr_speed4 = adv_dvc_varp->sdtr_speed4; in advansys_board_found()
10912 ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able; in advansys_board_found()
10913 ep_38C0800->start_motor = adv_dvc_varp->start_motor; in advansys_board_found()
10914 ep_38C0800->scsi_reset_delay = in advansys_board_found()
10915 adv_dvc_varp->scsi_reset_wait; in advansys_board_found()
10916 ep_38C0800->serial_number_word1 = in advansys_board_found()
10917 adv_dvc_varp->cfg->serial1; in advansys_board_found()
10918 ep_38C0800->serial_number_word2 = in advansys_board_found()
10919 adv_dvc_varp->cfg->serial2; in advansys_board_found()
10920 ep_38C0800->serial_number_word3 = in advansys_board_found()
10921 adv_dvc_varp->cfg->serial3; in advansys_board_found()
10923 ep_38C1600 = &boardp->eep_config.adv_38C1600_eep; in advansys_board_found()
10925 ep_38C1600->adapter_scsi_id = in advansys_board_found()
10926 adv_dvc_varp->chip_scsi_id; in advansys_board_found()
10927 ep_38C1600->max_host_qng = adv_dvc_varp->max_host_qng; in advansys_board_found()
10928 ep_38C1600->max_dvc_qng = adv_dvc_varp->max_dvc_qng; in advansys_board_found()
10929 ep_38C1600->termination_lvd = in advansys_board_found()
10930 adv_dvc_varp->cfg->termination; in advansys_board_found()
10931 ep_38C1600->disc_enable = in advansys_board_found()
10932 adv_dvc_varp->cfg->disc_enable; in advansys_board_found()
10933 ep_38C1600->bios_ctrl = adv_dvc_varp->bios_ctrl; in advansys_board_found()
10934 ep_38C1600->wdtr_able = adv_dvc_varp->wdtr_able; in advansys_board_found()
10935 ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able; in advansys_board_found()
10936 ep_38C1600->sdtr_speed1 = adv_dvc_varp->sdtr_speed1; in advansys_board_found()
10937 ep_38C1600->sdtr_speed2 = adv_dvc_varp->sdtr_speed2; in advansys_board_found()
10938 ep_38C1600->sdtr_speed3 = adv_dvc_varp->sdtr_speed3; in advansys_board_found()
10939 ep_38C1600->sdtr_speed4 = adv_dvc_varp->sdtr_speed4; in advansys_board_found()
10940 ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able; in advansys_board_found()
10941 ep_38C1600->start_motor = adv_dvc_varp->start_motor; in advansys_board_found()
10942 ep_38C1600->scsi_reset_delay = in advansys_board_found()
10943 adv_dvc_varp->scsi_reset_wait; in advansys_board_found()
10944 ep_38C1600->serial_number_word1 = in advansys_board_found()
10945 adv_dvc_varp->cfg->serial1; in advansys_board_found()
10946 ep_38C1600->serial_number_word2 = in advansys_board_found()
10947 adv_dvc_varp->cfg->serial2; in advansys_board_found()
10948 ep_38C1600->serial_number_word3 = in advansys_board_found()
10949 adv_dvc_varp->cfg->serial3; in advansys_board_found()
10955 boardp->init_tidmask |= in advansys_board_found()
10956 ADV_TID_TO_TIDMASK(adv_dvc_varp->chip_scsi_id); in advansys_board_found()
10961 * structure supports one channel. Multi-channel boards have a in advansys_board_found()
10964 shost->max_channel = 0; in advansys_board_found()
10966 shost->max_id = ASC_MAX_TID + 1; in advansys_board_found()
10967 shost->max_lun = ASC_MAX_LUN + 1; in advansys_board_found()
10968 shost->max_cmd_len = ASC_MAX_CDB_LEN; in advansys_board_found()
10970 shost->io_port = asc_dvc_varp->iop_base; in advansys_board_found()
10971 boardp->asc_n_io_port = ASC_IOADR_GAP; in advansys_board_found()
10972 shost->this_id = asc_dvc_varp->cfg->chip_scsi_id; in advansys_board_found()
10975 shost->can_queue = asc_dvc_varp->max_total_qng; in advansys_board_found()
10977 shost->max_id = ADV_MAX_TID + 1; in advansys_board_found()
10978 shost->max_lun = ADV_MAX_LUN + 1; in advansys_board_found()
10979 shost->max_cmd_len = ADV_MAX_CDB_LEN; in advansys_board_found()
10987 shost->io_port = iop; in advansys_board_found()
10989 shost->this_id = adv_dvc_varp->chip_scsi_id; in advansys_board_found()
10992 shost->can_queue = adv_dvc_varp->max_host_qng; in advansys_board_found()
10996 * Set the maximum number of scatter-gather elements the in advansys_board_found()
11001 * Allow two commands with 'sg_tablesize' scatter-gather in advansys_board_found()
11006 shost->sg_tablesize = in advansys_board_found()
11007 (((asc_dvc_varp->max_total_qng - 2) / 2) * in advansys_board_found()
11010 shost->sg_tablesize = ADV_MAX_SG_LIST; in advansys_board_found()
11015 * mid-level driver definition of SG_ALL. SG_ALL also in advansys_board_found()
11017 * size of the scatter-gather table in 'struct asc_sg_head'. in advansys_board_found()
11019 if (shost->sg_tablesize > SG_ALL) { in advansys_board_found()
11020 shost->sg_tablesize = SG_ALL; in advansys_board_found()
11023 ASC_DBG(1, "sg_tablesize: %d\n", shost->sg_tablesize); in advansys_board_found()
11027 shost->base = AscGetChipBiosAddress(asc_dvc_varp->iop_base, in advansys_board_found()
11028 asc_dvc_varp->bus_type); in advansys_board_found()
11031 * Fill-in BIOS board variables. The Wide BIOS saves in advansys_board_found()
11034 AdvReadWordLram(adv_dvc_varp->iop_base, in advansys_board_found()
11035 BIOS_SIGNATURE, boardp->bios_signature); in advansys_board_found()
11036 AdvReadWordLram(adv_dvc_varp->iop_base, in advansys_board_found()
11037 BIOS_VERSION, boardp->bios_version); in advansys_board_found()
11038 AdvReadWordLram(adv_dvc_varp->iop_base, in advansys_board_found()
11039 BIOS_CODESEG, boardp->bios_codeseg); in advansys_board_found()
11040 AdvReadWordLram(adv_dvc_varp->iop_base, in advansys_board_found()
11041 BIOS_CODELEN, boardp->bios_codelen); in advansys_board_found()
11044 boardp->bios_signature, boardp->bios_version); in advansys_board_found()
11047 boardp->bios_codeseg, boardp->bios_codelen); in advansys_board_found()
11053 if (boardp->bios_signature == 0x55AA) { in advansys_board_found()
11058 shost->base = ((ulong)boardp->bios_codeseg << 4); in advansys_board_found()
11060 shost->base = 0; in advansys_board_found()
11065 * Register Board Resources - I/O Port, DMA, IRQ in advansys_board_found()
11068 /* Register DMA Channel for Narrow boards. */ in advansys_board_found()
11069 shost->dma_channel = NO_ISA_DMA; /* Default to no ISA DMA. */ in advansys_board_found()
11072 ASC_DBG(2, "request_irq(%d, %p)\n", boardp->irq, shost); in advansys_board_found()
11074 ret = request_irq(boardp->irq, advansys_interrupt, share_irq, in advansys_board_found()
11078 if (ret == -EBUSY) { in advansys_board_found()
11080 "already in use\n", boardp->irq); in advansys_board_found()
11081 } else if (ret == -EINVAL) { in advansys_board_found()
11083 "not valid\n", boardp->irq); in advansys_board_found()
11086 "failed with %d\n", boardp->irq, ret); in advansys_board_found()
11097 asc_dvc_varp->overrun_buf = kzalloc(ASC_OVERRUN_BSIZE, GFP_KERNEL); in advansys_board_found()
11098 if (!asc_dvc_varp->overrun_buf) { in advansys_board_found()
11099 ret = -ENOMEM; in advansys_board_found()
11104 if (warn_code || asc_dvc_varp->err_code) { in advansys_board_found()
11107 asc_dvc_varp->init_state, warn_code, in advansys_board_found()
11108 asc_dvc_varp->err_code); in advansys_board_found()
11109 if (!asc_dvc_varp->overrun_dma) { in advansys_board_found()
11110 ret = -ENODEV; in advansys_board_found()
11116 ret = -ENODEV; in advansys_board_found()
11123 ret = scsi_add_host(shost, boardp->dev); in advansys_board_found()
11132 if (asc_dvc_varp->overrun_dma) in advansys_board_found()
11133 dma_unmap_single(boardp->dev, asc_dvc_varp->overrun_dma, in advansys_board_found()
11135 kfree(asc_dvc_varp->overrun_buf); in advansys_board_found()
11139 free_irq(boardp->irq, shost); in advansys_board_found()
11141 if (boardp->ioremap_addr) in advansys_board_found()
11142 iounmap(boardp->ioremap_addr); in advansys_board_found()
11159 free_irq(board->irq, shost); in advansys_release()
11162 dma_unmap_single(board->dev, in advansys_release()
11163 board->dvc_var.asc_dvc_var.overrun_dma, in advansys_release()
11165 kfree(board->dvc_var.asc_dvc_var.overrun_buf); in advansys_release()
11167 iounmap(board->ioremap_addr); in advansys_release()
11211 int err = -ENODEV; in advansys_vlb_probe()
11218 return -ENODEV; in advansys_vlb_probe()
11231 err = -ENOMEM; in advansys_vlb_probe()
11237 board->irq = advansys_vlb_irq_no(iop_base); in advansys_vlb_probe()
11238 board->dev = dev; in advansys_vlb_probe()
11239 board->shost = shost; in advansys_vlb_probe()
11252 return -ENODEV; in advansys_vlb_probe()
11293 unsigned short cfg_lsw = inw(edev->base_addr + 0xc86); in advansys_eisa_irq_no()
11307 err = -ENOMEM; in advansys_eisa_probe()
11311 ioport = edev->base_addr + 0xc30; in advansys_eisa_probe()
11313 err = -ENODEV; in advansys_eisa_probe()
11318 printk(KERN_WARNING "Region %x-%x busy\n", ioport, in advansys_eisa_probe()
11319 ioport + ASC_IOADR_GAP - 1); in advansys_eisa_probe()
11339 err = -ENOMEM; in advansys_eisa_probe()
11345 board->irq = irq; in advansys_eisa_probe()
11346 board->dev = dev; in advansys_eisa_probe()
11347 board->shost = shost; in advansys_eisa_probe()
11351 data->host[i] = shost; in advansys_eisa_probe()
11367 kfree(data->host[0]); in advansys_eisa_probe()
11368 kfree(data->host[1]); in advansys_eisa_probe()
11381 struct Scsi_Host *shost = data->host[i]; in advansys_eisa_remove()
11384 ioport = shost->io_port; in advansys_eisa_remove()
11423 if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) || in advansys_set_latency()
11424 (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) { in advansys_set_latency()
11450 err = -ENODEV; in advansys_pci_probe()
11456 err = -ENOMEM; in advansys_pci_probe()
11462 board->irq = pdev->irq; in advansys_pci_probe()
11463 board->dev = &pdev->dev; in advansys_pci_probe()
11464 board->shost = shost; in advansys_pci_probe()
11466 if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW || in advansys_pci_probe()
11467 pdev->device == PCI_DEVICE_ID_38C0800_REV1 || in advansys_pci_probe()
11468 pdev->device == PCI_DEVICE_ID_38C1600_REV1) { in advansys_pci_probe()
11469 board->flags |= ASC_IS_WIDE_BOARD; in advansys_pci_probe()