Lines Matching refs:host
85 static struct orc_scb *__orc_alloc_scb(struct orc_host * host);
86 static void inia100_scb_handler(struct orc_host *host, struct orc_scb *scb);
139 static u8 wait_chip_ready(struct orc_host * host) in wait_chip_ready() argument
144 if (inb(host->base + ORC_HCTRL) & HOSTSTOP) /* Wait HOSTSTOP set */ in wait_chip_ready()
151 static u8 wait_firmware_ready(struct orc_host * host) in wait_firmware_ready() argument
156 if (inb(host->base + ORC_HSTUS) & RREADY) /* Wait READY set */ in wait_firmware_ready()
164 static u8 wait_scsi_reset_done(struct orc_host * host) in wait_scsi_reset_done() argument
169 if (!(inb(host->base + ORC_HCTRL) & SCSIRST)) /* Wait SCSIRST done */ in wait_scsi_reset_done()
177 static u8 wait_HDO_off(struct orc_host * host) in wait_HDO_off() argument
182 if (!(inb(host->base + ORC_HCTRL) & HDO)) /* Wait HDO off */ in wait_HDO_off()
190 static u8 wait_hdi_set(struct orc_host * host, u8 * data) in wait_hdi_set() argument
195 if ((*data = inb(host->base + ORC_HSTUS)) & HDI) in wait_hdi_set()
203 static unsigned short orc_read_fwrev(struct orc_host * host) in orc_read_fwrev() argument
208 outb(ORC_CMD_VERSION, host->base + ORC_HDATA); in orc_read_fwrev()
209 outb(HDO, host->base + ORC_HCTRL); in orc_read_fwrev()
210 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orc_read_fwrev()
213 if (wait_hdi_set(host, &data) == 0) /* Wait HDI set */ in orc_read_fwrev()
215 version = inb(host->base + ORC_HDATA); in orc_read_fwrev()
216 outb(data, host->base + ORC_HSTUS); /* Clear HDI */ in orc_read_fwrev()
218 if (wait_hdi_set(host, &data) == 0) /* Wait HDI set */ in orc_read_fwrev()
220 version |= inb(host->base + ORC_HDATA) << 8; in orc_read_fwrev()
221 outb(data, host->base + ORC_HSTUS); /* Clear HDI */ in orc_read_fwrev()
227 static u8 orc_nv_write(struct orc_host * host, unsigned char address, unsigned char value) in orc_nv_write() argument
229 outb(ORC_CMD_SET_NVM, host->base + ORC_HDATA); /* Write command */ in orc_nv_write()
230 outb(HDO, host->base + ORC_HCTRL); in orc_nv_write()
231 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orc_nv_write()
234 outb(address, host->base + ORC_HDATA); /* Write address */ in orc_nv_write()
235 outb(HDO, host->base + ORC_HCTRL); in orc_nv_write()
236 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orc_nv_write()
239 outb(value, host->base + ORC_HDATA); /* Write value */ in orc_nv_write()
240 outb(HDO, host->base + ORC_HCTRL); in orc_nv_write()
241 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orc_nv_write()
248 static u8 orc_nv_read(struct orc_host * host, u8 address, u8 *ptr) in orc_nv_read() argument
252 outb(ORC_CMD_GET_NVM, host->base + ORC_HDATA); /* Write command */ in orc_nv_read()
253 outb(HDO, host->base + ORC_HCTRL); in orc_nv_read()
254 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orc_nv_read()
257 outb(address, host->base + ORC_HDATA); /* Write address */ in orc_nv_read()
258 outb(HDO, host->base + ORC_HCTRL); in orc_nv_read()
259 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orc_nv_read()
262 if (wait_hdi_set(host, &data) == 0) /* Wait HDI set */ in orc_nv_read()
264 *ptr = inb(host->base + ORC_HDATA); in orc_nv_read()
265 outb(data, host->base + ORC_HSTUS); /* Clear HDI */ in orc_nv_read()
277 static void orc_exec_scb(struct orc_host * host, struct orc_scb * scb) in orc_exec_scb() argument
280 outb(scb->scbidx, host->base + ORC_PQUEUE); in orc_exec_scb()
291 static int se2_rd_all(struct orc_host * host) in se2_rd_all() argument
298 if (orc_nv_read(host, (u8) i, np) == 0) in se2_rd_all()
319 static void se2_update_all(struct orc_host * host) in se2_update_all() argument
334 orc_nv_write(host, (u8) i, *np); in se2_update_all()
346 static void read_eeprom(struct orc_host * host) in read_eeprom() argument
348 if (se2_rd_all(host) != 1) { in read_eeprom()
349 se2_update_all(host); /* setup default pattern */ in read_eeprom()
350 se2_rd_all(host); /* load again */ in read_eeprom()
365 static u8 orc_load_firmware(struct orc_host * host) in orc_load_firmware() argument
375 data = inb(host->base + ORC_GCFG); in orc_load_firmware()
376 outb(data | EEPRG, host->base + ORC_GCFG); /* Enable EEPROM programming */ in orc_load_firmware()
377 outb(0x00, host->base + ORC_EBIOSADR2); in orc_load_firmware()
378 outw(0x0000, host->base + ORC_EBIOSADR0); in orc_load_firmware()
379 if (inb(host->base + ORC_EBIOSDATA) != 0x55) { in orc_load_firmware()
380 outb(data, host->base + ORC_GCFG); /* Disable EEPROM programming */ in orc_load_firmware()
383 outw(0x0001, host->base + ORC_EBIOSADR0); in orc_load_firmware()
384 if (inb(host->base + ORC_EBIOSDATA) != 0xAA) { in orc_load_firmware()
385 outb(data, host->base + ORC_GCFG); /* Disable EEPROM programming */ in orc_load_firmware()
389 outb(PRGMRST | DOWNLOAD, host->base + ORC_RISCCTL); /* Enable SRAM programming */ in orc_load_firmware()
392 outw(0x0010, host->base + ORC_EBIOSADR0); in orc_load_firmware()
393 *data32_ptr = inb(host->base + ORC_EBIOSDATA); /* Read from BIOS */ in orc_load_firmware()
394 outw(0x0011, host->base + ORC_EBIOSADR0); in orc_load_firmware()
395 *(data32_ptr + 1) = inb(host->base + ORC_EBIOSDATA); /* Read from BIOS */ in orc_load_firmware()
396 outw(0x0012, host->base + ORC_EBIOSADR0); in orc_load_firmware()
397 *(data32_ptr + 2) = inb(host->base + ORC_EBIOSDATA); /* Read from BIOS */ in orc_load_firmware()
398 outw(*(data32_ptr + 2), host->base + ORC_EBIOSADR2); in orc_load_firmware()
399 outl(le32_to_cpu(data32), host->base + ORC_FWBASEADR); /* Write FW address */ in orc_load_firmware()
408 outw(bios_addr, host->base + ORC_EBIOSADR0); in orc_load_firmware()
409 *data32_ptr++ = inb(host->base + ORC_EBIOSDATA); /* Read from BIOS */ in orc_load_firmware()
411 outl(le32_to_cpu(data32), host->base + ORC_RISCRAM); /* Write every 4 bytes */ in orc_load_firmware()
418 outb(PRGMRST | DOWNLOAD, host->base + ORC_RISCCTL); /* Reset program count 0 */ in orc_load_firmware()
423 outw(bios_addr, host->base + ORC_EBIOSADR0); in orc_load_firmware()
424 *data32_ptr++ = inb(host->base + ORC_EBIOSDATA); /* Read from BIOS */ in orc_load_firmware()
426 if (inl(host->base + ORC_RISCRAM) != le32_to_cpu(data32)) { in orc_load_firmware()
427 outb(PRGMRST, host->base + ORC_RISCCTL); /* Reset program to 0 */ in orc_load_firmware()
428 outb(data, host->base + ORC_GCFG); /*Disable EEPROM programming */ in orc_load_firmware()
436 outb(PRGMRST, host->base + ORC_RISCCTL); /* Reset program to 0 */ in orc_load_firmware()
437 outb(data, host->base + ORC_GCFG); /* Disable EEPROM programming */ in orc_load_firmware()
442 static void setup_SCBs(struct orc_host * host) in setup_SCBs() argument
450 outb(ORC_MAXQUEUE, host->base + ORC_SCBSIZE); /* Total number of SCBs */ in setup_SCBs()
452 outl(host->scb_phys, host->base + ORC_SCBBASE0); in setup_SCBs()
454 outl(host->scb_phys, host->base + ORC_SCBBASE1); in setup_SCBs()
457 scb = host->scb_virt; in setup_SCBs()
458 escb = host->escb_virt; in setup_SCBs()
461 escb_phys = (host->escb_phys + (sizeof(struct orc_extended_scb) * i)); in setup_SCBs()
479 static void init_alloc_map(struct orc_host * host) in init_alloc_map() argument
485 host->allocation_map[i][j] = 0xffffffff; in init_alloc_map()
499 static int init_orchid(struct orc_host * host) in init_orchid() argument
505 init_alloc_map(host); in init_orchid()
506 outb(0xFF, host->base + ORC_GIMSK); /* Disable all interrupts */ in init_orchid()
508 if (inb(host->base + ORC_HSTUS) & RREADY) { /* Orchid is ready */ in init_orchid()
509 revision = orc_read_fwrev(host); in init_orchid()
511 outb(DEVRST, host->base + ORC_HCTRL); /* Reset Host Adapter */ in init_orchid()
512 if (wait_chip_ready(host) == 0) in init_orchid()
514 orc_load_firmware(host); /* Download FW */ in init_orchid()
515 setup_SCBs(host); /* Setup SCB base and SCB Size registers */ in init_orchid()
516 outb(0x00, host->base + ORC_HCTRL); /* clear HOSTSTOP */ in init_orchid()
517 if (wait_firmware_ready(host) == 0) in init_orchid()
521 setup_SCBs(host); /* Setup SCB base and SCB Size registers */ in init_orchid()
524 outb(DEVRST, host->base + ORC_HCTRL); /* Reset Host Adapter */ in init_orchid()
525 if (wait_chip_ready(host) == 0) in init_orchid()
527 orc_load_firmware(host); /* Download FW */ in init_orchid()
528 setup_SCBs(host); /* Setup SCB base and SCB Size registers */ in init_orchid()
529 outb(HDO, host->base + ORC_HCTRL); /* Do Hardware Reset & */ in init_orchid()
532 if (wait_firmware_ready(host) == 0) /* Wait for firmware ready */ in init_orchid()
538 read_eeprom(host); in init_orchid()
543 host->scsi_id = nvramp->scsi_id; in init_orchid()
544 host->BIOScfg = nvramp->BIOSConfig1; in init_orchid()
545 host->max_targets = MAX_TARGETS; in init_orchid()
548 host->target_flag[i] = *ptr; in init_orchid()
549 host->max_tags[i] = ORC_MAXTAGS; in init_orchid()
553 host->flags |= HCF_SCSI_RESET; in init_orchid()
554 outb(0xFB, host->base + ORC_GIMSK); /* enable RP FIFO interrupt */ in init_orchid()
565 static int orc_reset_scsi_bus(struct orc_host * host) in orc_reset_scsi_bus() argument
569 spin_lock_irqsave(&host->allocation_lock, flags); in orc_reset_scsi_bus()
571 init_alloc_map(host); in orc_reset_scsi_bus()
573 outb(SCSIRST, host->base + ORC_HCTRL); in orc_reset_scsi_bus()
576 if (wait_scsi_reset_done(host) == 0) { in orc_reset_scsi_bus()
577 spin_unlock_irqrestore(&host->allocation_lock, flags); in orc_reset_scsi_bus()
580 spin_unlock_irqrestore(&host->allocation_lock, flags); in orc_reset_scsi_bus()
595 static int orc_device_reset(struct orc_host * host, struct scsi_cmnd *cmd, unsigned int target) in orc_device_reset() argument
603 spin_lock_irqsave(&(host->allocation_lock), flags); in orc_device_reset()
608 host_scb = host->scb_virt; in orc_device_reset()
612 init_alloc_map(host); in orc_device_reset()
624 spin_unlock_irqrestore(&(host->allocation_lock), flags); in orc_device_reset()
629 if ((scb = __orc_alloc_scb(host)) == NULL) { in orc_device_reset()
631 spin_unlock_irqrestore(&(host->allocation_lock), flags); in orc_device_reset()
650 orc_exec_scb(host, scb); /* Start execute SCB */ in orc_device_reset()
651 spin_unlock_irqrestore(&host->allocation_lock, flags); in orc_device_reset()
665 static struct orc_scb *__orc_alloc_scb(struct orc_host * host) in __orc_alloc_scb() argument
672 channel = host->index; in __orc_alloc_scb()
675 if ((host->allocation_map[channel][i] >> index) & 0x01) { in __orc_alloc_scb()
676 host->allocation_map[channel][i] &= ~(1 << index); in __orc_alloc_scb()
681 return host->scb_virt + idx; in __orc_alloc_scb()
696 static struct orc_scb *orc_alloc_scb(struct orc_host * host) in orc_alloc_scb() argument
701 spin_lock_irqsave(&host->allocation_lock, flags); in orc_alloc_scb()
702 scb = __orc_alloc_scb(host); in orc_alloc_scb()
703 spin_unlock_irqrestore(&host->allocation_lock, flags); in orc_alloc_scb()
716 static void orc_release_scb(struct orc_host *host, struct orc_scb *scb) in orc_release_scb() argument
721 spin_lock_irqsave(&(host->allocation_lock), flags); in orc_release_scb()
722 channel = host->index; /* Channel */ in orc_release_scb()
726 host->allocation_map[channel][i] |= (1 << index); in orc_release_scb()
727 spin_unlock_irqrestore(&(host->allocation_lock), flags); in orc_release_scb()
738 static int orchid_abort_scb(struct orc_host * host, struct orc_scb * scb) in orchid_abort_scb() argument
742 outb(ORC_CMD_ABORT_SCB, host->base + ORC_HDATA); /* Write command */ in orchid_abort_scb()
743 outb(HDO, host->base + ORC_HCTRL); in orchid_abort_scb()
744 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orchid_abort_scb()
747 outb(scb->scbidx, host->base + ORC_HDATA); /* Write address */ in orchid_abort_scb()
748 outb(HDO, host->base + ORC_HCTRL); in orchid_abort_scb()
749 if (wait_HDO_off(host) == 0) /* Wait HDO off */ in orchid_abort_scb()
752 if (wait_hdi_set(host, &data) == 0) /* Wait HDI set */ in orchid_abort_scb()
754 status = inb(host->base + ORC_HDATA); in orchid_abort_scb()
755 outb(data, host->base + ORC_HSTUS); /* Clear HDI */ in orchid_abort_scb()
762 static int inia100_abort_cmd(struct orc_host * host, struct scsi_cmnd *cmd) in inia100_abort_cmd() argument
769 spin_lock_irqsave(&(host->allocation_lock), flags); in inia100_abort_cmd()
771 scb = host->scb_virt; in inia100_abort_cmd()
784 if (orchid_abort_scb(host, scb)) { in inia100_abort_cmd()
786 spin_unlock_irqrestore(&host->allocation_lock, flags); in inia100_abort_cmd()
794 spin_unlock_irqrestore(&host->allocation_lock, flags); in inia100_abort_cmd()
811 static irqreturn_t orc_interrupt(struct orc_host * host) in orc_interrupt() argument
817 if (inb(host->base + ORC_RQUEUECNT) == 0) in orc_interrupt()
822 scb_index = inb(host->base + ORC_RQUEUE); in orc_interrupt()
825 …scb = (struct orc_scb *) ((unsigned long) host->scb_virt + (unsigned long) (sizeof(struct orc_scb)… in orc_interrupt()
828 inia100_scb_handler(host, scb); in orc_interrupt()
829 } while (inb(host->base + ORC_RQUEUECNT)); in orc_interrupt()
842 static int inia100_build_scb(struct orc_host * host, struct orc_scb * scb, struct scsi_cmnd * cmd) in inia100_build_scb() argument
917 struct orc_host *host; /* Point to Host adapter control block */ in inia100_queue_lck() local
919 host = (struct orc_host *) cmd->device->host->hostdata; in inia100_queue_lck()
922 if ((scb = orc_alloc_scb(host)) == NULL) in inia100_queue_lck()
925 if (inia100_build_scb(host, scb, cmd)) { in inia100_queue_lck()
926 orc_release_scb(host, scb); in inia100_queue_lck()
929 orc_exec_scb(host, scb); /* Start execute SCB */ in inia100_queue_lck()
945 struct orc_host *host; in DEF_SCSI_QCMD() local
947 host = (struct orc_host *) cmd->device->host->hostdata; in DEF_SCSI_QCMD()
948 return inia100_abort_cmd(host, cmd); in DEF_SCSI_QCMD()
961 struct orc_host *host; in inia100_bus_reset() local
962 host = (struct orc_host *) cmd->device->host->hostdata; in inia100_bus_reset()
963 return orc_reset_scsi_bus(host); in inia100_bus_reset()
975 struct orc_host *host; in inia100_device_reset() local
976 host = (struct orc_host *) cmd->device->host->hostdata; in inia100_device_reset()
977 return orc_device_reset(host, cmd, scmd_id(cmd)); in inia100_device_reset()
991 static void inia100_scb_handler(struct orc_host *host, struct orc_scb *scb) in inia100_scb_handler() argument
999 orc_release_scb(host, scb); /* Release SCB for current channel */ in inia100_scb_handler()
1046 orc_release_scb(host, scb); /* Release SCB for current channel */ in inia100_scb_handler()
1060 struct orc_host *host = (struct orc_host *)shost->hostdata; in inia100_intr() local
1065 res = orc_interrupt(host); in inia100_intr()
1088 struct orc_host *host; in inia100_probe_one() local
1119 host = (struct orc_host *)shost->hostdata; in inia100_probe_one()
1120 host->pdev = pdev; in inia100_probe_one()
1121 host->base = port; in inia100_probe_one()
1122 host->BIOScfg = bios; in inia100_probe_one()
1123 spin_lock_init(&host->allocation_lock); in inia100_probe_one()
1127 host->scb_virt = pci_zalloc_consistent(pdev, sz, &host->scb_phys); in inia100_probe_one()
1128 if (!host->scb_virt) { in inia100_probe_one()
1135 host->escb_virt = pci_zalloc_consistent(pdev, sz, &host->escb_phys); in inia100_probe_one()
1136 if (!host->escb_virt) { in inia100_probe_one()
1141 biosaddr = host->BIOScfg; in inia100_probe_one()
1144 if (init_orchid(host)) { /* Initialize orchid chip */ in inia100_probe_one()
1149 shost->io_port = host->base; in inia100_probe_one()
1153 shost->max_id = host->max_targets; in inia100_probe_one()
1156 shost->this_id = host->scsi_id; /* Assign HCS index */ in inia100_probe_one()
1181 host->escb_virt, host->escb_phys); in inia100_probe_one()
1184 host->scb_virt, host->scb_phys); in inia100_probe_one()
1198 struct orc_host *host = (struct orc_host *)shost->hostdata; in inia100_remove_one() local
1204 host->escb_virt, host->escb_phys); in inia100_remove_one()
1206 host->scb_virt, host->scb_phys); in inia100_remove_one()