• Home
  • Raw
  • Download

Lines Matching +full:10 +full:base +full:- +full:te

1 // SPDX-License-Identifier: GPL-2.0
8 * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
34 return shost->max_channel - 1; in myrb_logical_channel()
86 * myrb_create_mempools - allocates auxiliary data structures
95 elem_size = cb->host->sg_tablesize * elem_align; in myrb_create_mempools()
96 cb->sg_pool = dma_pool_create("myrb_sg", &pdev->dev, in myrb_create_mempools()
98 if (cb->sg_pool == NULL) { in myrb_create_mempools()
99 shost_printk(KERN_ERR, cb->host, in myrb_create_mempools()
104 cb->dcdb_pool = dma_pool_create("myrb_dcdb", &pdev->dev, in myrb_create_mempools()
107 if (!cb->dcdb_pool) { in myrb_create_mempools()
108 dma_pool_destroy(cb->sg_pool); in myrb_create_mempools()
109 cb->sg_pool = NULL; in myrb_create_mempools()
110 shost_printk(KERN_ERR, cb->host, in myrb_create_mempools()
115 snprintf(cb->work_q_name, sizeof(cb->work_q_name), in myrb_create_mempools()
116 "myrb_wq_%d", cb->host->host_no); in myrb_create_mempools()
117 cb->work_q = create_singlethread_workqueue(cb->work_q_name); in myrb_create_mempools()
118 if (!cb->work_q) { in myrb_create_mempools()
119 dma_pool_destroy(cb->dcdb_pool); in myrb_create_mempools()
120 cb->dcdb_pool = NULL; in myrb_create_mempools()
121 dma_pool_destroy(cb->sg_pool); in myrb_create_mempools()
122 cb->sg_pool = NULL; in myrb_create_mempools()
123 shost_printk(KERN_ERR, cb->host, in myrb_create_mempools()
131 INIT_DELAYED_WORK(&cb->monitor_work, myrb_monitor); in myrb_create_mempools()
132 queue_delayed_work(cb->work_q, &cb->monitor_work, 1); in myrb_create_mempools()
138 * myrb_destroy_mempools - tears down the memory pools for the controller
142 cancel_delayed_work_sync(&cb->monitor_work); in myrb_destroy_mempools()
143 destroy_workqueue(cb->work_q); in myrb_destroy_mempools()
145 dma_pool_destroy(cb->sg_pool); in myrb_destroy_mempools()
146 dma_pool_destroy(cb->dcdb_pool); in myrb_destroy_mempools()
150 * myrb_reset_cmd - reset command block
154 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_reset_cmd()
157 cmd_blk->status = 0; in myrb_reset_cmd()
161 * myrb_qcmd - queues command block for execution
165 void __iomem *base = cb->io_base; in myrb_qcmd() local
166 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_qcmd()
167 union myrb_cmd_mbox *next_mbox = cb->next_cmd_mbox; in myrb_qcmd()
169 cb->write_cmd_mbox(next_mbox, mbox); in myrb_qcmd()
170 if (cb->prev_cmd_mbox1->words[0] == 0 || in myrb_qcmd()
171 cb->prev_cmd_mbox2->words[0] == 0) in myrb_qcmd()
172 cb->get_cmd_mbox(base); in myrb_qcmd()
173 cb->prev_cmd_mbox2 = cb->prev_cmd_mbox1; in myrb_qcmd()
174 cb->prev_cmd_mbox1 = next_mbox; in myrb_qcmd()
175 if (++next_mbox > cb->last_cmd_mbox) in myrb_qcmd()
176 next_mbox = cb->first_cmd_mbox; in myrb_qcmd()
177 cb->next_cmd_mbox = next_mbox; in myrb_qcmd()
181 * myrb_exec_cmd - executes command block and waits for completion.
191 cmd_blk->completion = &cmpl; in myrb_exec_cmd()
193 spin_lock_irqsave(&cb->queue_lock, flags); in myrb_exec_cmd()
194 cb->qcmd(cb, cmd_blk); in myrb_exec_cmd()
195 spin_unlock_irqrestore(&cb->queue_lock, flags); in myrb_exec_cmd()
199 return cmd_blk->status; in myrb_exec_cmd()
203 * myrb_exec_type3 - executes a type 3 command and waits for completion.
210 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk; in myrb_exec_type3()
211 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_exec_type3()
214 mutex_lock(&cb->dcmd_mutex); in myrb_exec_type3()
216 mbox->type3.id = MYRB_DCMD_TAG; in myrb_exec_type3()
217 mbox->type3.opcode = op; in myrb_exec_type3()
218 mbox->type3.addr = addr; in myrb_exec_type3()
220 mutex_unlock(&cb->dcmd_mutex); in myrb_exec_type3()
225 * myrb_exec_type3D - executes a type 3D command and waits for completion.
233 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk; in myrb_exec_type3D()
234 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_exec_type3D()
238 pdev_info_addr = dma_map_single(&cb->pdev->dev, pdev_info, in myrb_exec_type3D()
241 if (dma_mapping_error(&cb->pdev->dev, pdev_info_addr)) in myrb_exec_type3D()
244 mutex_lock(&cb->dcmd_mutex); in myrb_exec_type3D()
246 mbox->type3D.id = MYRB_DCMD_TAG; in myrb_exec_type3D()
247 mbox->type3D.opcode = op; in myrb_exec_type3D()
248 mbox->type3D.channel = sdev->channel; in myrb_exec_type3D()
249 mbox->type3D.target = sdev->id; in myrb_exec_type3D()
250 mbox->type3D.addr = pdev_info_addr; in myrb_exec_type3D()
252 mutex_unlock(&cb->dcmd_mutex); in myrb_exec_type3D()
253 dma_unmap_single(&cb->pdev->dev, pdev_info_addr, in myrb_exec_type3D()
256 mbox->type3D.opcode == MYRB_CMD_GET_DEVICE_STATE_OLD) in myrb_exec_type3D()
279 * myrb_get_event - get event log from HBA
287 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_event()
288 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_get_event()
293 ev_buf = dma_alloc_coherent(&cb->pdev->dev, in myrb_get_event()
300 mbox->type3E.id = MYRB_MCMD_TAG; in myrb_get_event()
301 mbox->type3E.opcode = MYRB_CMD_EVENT_LOG_OPERATION; in myrb_get_event()
302 mbox->type3E.optype = DAC960_V1_GetEventLogEntry; in myrb_get_event()
303 mbox->type3E.opqual = 1; in myrb_get_event()
304 mbox->type3E.ev_seq = event; in myrb_get_event()
305 mbox->type3E.addr = ev_addr; in myrb_get_event()
308 shost_printk(KERN_INFO, cb->host, in myrb_get_event()
312 else if (ev_buf->seq_num == event) { in myrb_get_event()
316 scsi_normalize_sense(ev_buf->sense, 32, &sshdr); in myrb_get_event()
321 shost_printk(KERN_CRIT, cb->host, in myrb_get_event()
323 ev_buf->channel, ev_buf->target, in myrb_get_event()
326 shost_printk(KERN_CRIT, cb->host, in myrb_get_event()
328 ev_buf->channel, ev_buf->target, in myrb_get_event()
332 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_log_entry), in myrb_get_event()
337 * myrb_get_errtable - retrieves the error table from the controller
343 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_errtable()
344 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_get_errtable()
348 memcpy(&old_table, cb->err_table, sizeof(old_table)); in myrb_get_errtable()
351 mbox->type3.id = MYRB_MCMD_TAG; in myrb_get_errtable()
352 mbox->type3.opcode = MYRB_CMD_GET_ERROR_TABLE; in myrb_get_errtable()
353 mbox->type3.addr = cb->err_table_addr; in myrb_get_errtable()
356 struct myrb_error_entry *table = cb->err_table; in myrb_get_errtable()
361 shost_for_each_device(sdev, cb->host) { in myrb_get_errtable()
362 if (sdev->channel >= myrb_logical_channel(cb->host)) in myrb_get_errtable()
364 err_table_offset = sdev->channel * MYRB_MAX_TARGETS in myrb_get_errtable()
365 + sdev->id; in myrb_get_errtable()
368 if (new->parity_err == old->parity_err && in myrb_get_errtable()
369 new->soft_err == old->soft_err && in myrb_get_errtable()
370 new->hard_err == old->hard_err && in myrb_get_errtable()
371 new->misc_err == old->misc_err) in myrb_get_errtable()
375 new->parity_err, new->soft_err, in myrb_get_errtable()
376 new->hard_err, new->misc_err); in myrb_get_errtable()
382 * myrb_get_ldev_info - retrieves the logical device table from the controller
391 int ldev_num, ldev_cnt = cb->enquiry->ldev_count; in myrb_get_ldev_info()
392 struct Scsi_Host *shost = cb->host; in myrb_get_ldev_info()
395 cb->ldev_info_addr); in myrb_get_ldev_info()
401 struct myrb_ldev_info *new = cb->ldev_info_buf + ldev_num; in myrb_get_ldev_info()
407 if (new->state == MYRB_DEVICE_OFFLINE) in myrb_get_ldev_info()
411 ldev_num, myrb_devstate_name(new->state)); in myrb_get_ldev_info()
416 old = sdev->hostdata; in myrb_get_ldev_info()
417 if (new->state != old->state) in myrb_get_ldev_info()
420 ldev_num, myrb_devstate_name(new->state)); in myrb_get_ldev_info()
421 if (new->wb_enabled != old->wb_enabled) in myrb_get_ldev_info()
424 (new->wb_enabled ? "BACK" : "THRU")); in myrb_get_ldev_info()
432 * myrb_get_rbld_progress - get rebuild progress information
442 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_rbld_progress()
443 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_get_rbld_progress()
448 rbld_buf = dma_alloc_coherent(&cb->pdev->dev, in myrb_get_rbld_progress()
455 mbox->type3.id = MYRB_MCMD_TAG; in myrb_get_rbld_progress()
456 mbox->type3.opcode = MYRB_CMD_GET_REBUILD_PROGRESS; in myrb_get_rbld_progress()
457 mbox->type3.addr = rbld_addr; in myrb_get_rbld_progress()
461 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress), in myrb_get_rbld_progress()
467 * myrb_update_rbld_progress - updates the rebuild status
479 cb->last_rbld_status == MYRB_STATUS_SUCCESS) in myrb_update_rbld_progress()
483 rbld_buf.ldev_size - rbld_buf.blocks_left; in myrb_update_rbld_progress()
486 sdev = scsi_device_lookup(cb->host, in myrb_update_rbld_progress()
487 myrb_logical_channel(cb->host), in myrb_update_rbld_progress()
524 cb->last_rbld_status = status; in myrb_update_rbld_progress()
528 * myrb_get_cc_progress - retrieve the rebuild status
535 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_cc_progress()
536 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_get_cc_progress()
541 rbld_buf = dma_alloc_coherent(&cb->pdev->dev, in myrb_get_cc_progress()
545 cb->need_cc_status = true; in myrb_get_cc_progress()
549 mbox->type3.id = MYRB_MCMD_TAG; in myrb_get_cc_progress()
550 mbox->type3.opcode = MYRB_CMD_REBUILD_STAT; in myrb_get_cc_progress()
551 mbox->type3.addr = rbld_addr; in myrb_get_cc_progress()
554 unsigned int ldev_num = rbld_buf->ldev_num; in myrb_get_cc_progress()
555 unsigned int ldev_size = rbld_buf->ldev_size; in myrb_get_cc_progress()
557 ldev_size - rbld_buf->blocks_left; in myrb_get_cc_progress()
560 sdev = scsi_device_lookup(cb->host, in myrb_get_cc_progress()
561 myrb_logical_channel(cb->host), in myrb_get_cc_progress()
571 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress), in myrb_get_cc_progress()
576 * myrb_bgi_control - updates background initialisation status
582 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_bgi_control()
583 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_bgi_control()
589 bgi = dma_alloc_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status), in myrb_bgi_control()
592 shost_printk(KERN_ERR, cb->host, in myrb_bgi_control()
597 mbox->type3B.id = MYRB_DCMD_TAG; in myrb_bgi_control()
598 mbox->type3B.opcode = MYRB_CMD_BGI_CONTROL; in myrb_bgi_control()
599 mbox->type3B.optype = 0x20; in myrb_bgi_control()
600 mbox->type3B.addr = bgi_addr; in myrb_bgi_control()
602 last_bgi = &cb->bgi_status; in myrb_bgi_control()
603 sdev = scsi_device_lookup(cb->host, in myrb_bgi_control()
604 myrb_logical_channel(cb->host), in myrb_bgi_control()
605 bgi->ldev_num, 0); in myrb_bgi_control()
608 switch (bgi->status) { in myrb_bgi_control()
620 if (bgi->blocks_done == last_bgi->blocks_done && in myrb_bgi_control()
621 bgi->ldev_num == last_bgi->ldev_num) in myrb_bgi_control()
625 (100 * (bgi->blocks_done >> 7)) in myrb_bgi_control()
626 / (bgi->ldev_size >> 7)); in myrb_bgi_control()
641 memcpy(&cb->bgi_status, bgi, sizeof(struct myrb_bgi_status)); in myrb_bgi_control()
644 if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS) in myrb_bgi_control()
647 cb->bgi_status.status = MYRB_BGI_INVALID; in myrb_bgi_control()
650 if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS) in myrb_bgi_control()
655 cb->bgi_status.status = MYRB_BGI_INVALID; in myrb_bgi_control()
660 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status), in myrb_bgi_control()
665 * myrb_hba_enquiry - updates the controller status
676 memcpy(&old, cb->enquiry, sizeof(struct myrb_enquiry)); in myrb_hba_enquiry()
678 status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY, cb->enquiry_addr); in myrb_hba_enquiry()
682 new = cb->enquiry; in myrb_hba_enquiry()
683 if (new->ldev_count > old.ldev_count) { in myrb_hba_enquiry()
684 int ldev_num = old.ldev_count - 1; in myrb_hba_enquiry()
686 while (++ldev_num < new->ldev_count) in myrb_hba_enquiry()
687 shost_printk(KERN_CRIT, cb->host, in myrb_hba_enquiry()
691 if (new->ldev_count < old.ldev_count) { in myrb_hba_enquiry()
692 int ldev_num = new->ldev_count - 1; in myrb_hba_enquiry()
695 shost_printk(KERN_CRIT, cb->host, in myrb_hba_enquiry()
699 if (new->status.deferred != old.status.deferred) in myrb_hba_enquiry()
700 shost_printk(KERN_CRIT, cb->host, in myrb_hba_enquiry()
702 (new->status.deferred ? "TRUE" : "FALSE")); in myrb_hba_enquiry()
703 if (new->ev_seq != old.ev_seq) { in myrb_hba_enquiry()
704 cb->new_ev_seq = new->ev_seq; in myrb_hba_enquiry()
705 cb->need_err_info = true; in myrb_hba_enquiry()
706 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
708 cb->old_ev_seq, cb->new_ev_seq, in myrb_hba_enquiry()
709 old.ev_seq, new->ev_seq); in myrb_hba_enquiry()
711 if ((new->ldev_critical > 0 && in myrb_hba_enquiry()
712 new->ldev_critical != old.ldev_critical) || in myrb_hba_enquiry()
713 (new->ldev_offline > 0 && in myrb_hba_enquiry()
714 new->ldev_offline != old.ldev_offline) || in myrb_hba_enquiry()
715 (new->ldev_count != old.ldev_count)) { in myrb_hba_enquiry()
716 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
718 new->ldev_critical, in myrb_hba_enquiry()
719 new->ldev_offline, in myrb_hba_enquiry()
720 new->ldev_count); in myrb_hba_enquiry()
721 cb->need_ldev_info = true; in myrb_hba_enquiry()
723 if (new->pdev_dead > 0 || in myrb_hba_enquiry()
724 new->pdev_dead != old.pdev_dead || in myrb_hba_enquiry()
725 time_after_eq(jiffies, cb->secondary_monitor_time in myrb_hba_enquiry()
727 cb->need_bgi_status = cb->bgi_status_supported; in myrb_hba_enquiry()
728 cb->secondary_monitor_time = jiffies; in myrb_hba_enquiry()
730 if (new->rbld == MYRB_STDBY_RBLD_IN_PROGRESS || in myrb_hba_enquiry()
731 new->rbld == MYRB_BG_RBLD_IN_PROGRESS || in myrb_hba_enquiry()
734 cb->need_rbld = true; in myrb_hba_enquiry()
735 cb->rbld_first = (new->ldev_critical < old.ldev_critical); in myrb_hba_enquiry()
738 switch (new->rbld) { in myrb_hba_enquiry()
740 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
747 cb->need_cc_status = true; in myrb_hba_enquiry()
750 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
754 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
755 "Consistency Check Failed - Physical Device Failed\n"); in myrb_hba_enquiry()
758 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
759 "Consistency Check Failed - Logical Drive Failed\n"); in myrb_hba_enquiry()
762 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
763 "Consistency Check Failed - Other Causes\n"); in myrb_hba_enquiry()
766 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
770 else if (new->rbld == MYRB_BG_CHECK_IN_PROGRESS) in myrb_hba_enquiry()
771 cb->need_cc_status = true; in myrb_hba_enquiry()
777 * myrb_set_pdev_state - sets the device state for a physical device
784 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk; in myrb_set_pdev_state()
785 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_set_pdev_state()
788 mutex_lock(&cb->dcmd_mutex); in myrb_set_pdev_state()
789 mbox->type3D.opcode = MYRB_CMD_START_DEVICE; in myrb_set_pdev_state()
790 mbox->type3D.id = MYRB_DCMD_TAG; in myrb_set_pdev_state()
791 mbox->type3D.channel = sdev->channel; in myrb_set_pdev_state()
792 mbox->type3D.target = sdev->id; in myrb_set_pdev_state()
793 mbox->type3D.state = state & 0x1F; in myrb_set_pdev_state()
795 mutex_unlock(&cb->dcmd_mutex); in myrb_set_pdev_state()
801 * myrb_enable_mmio - enables the Memory Mailbox Interface
810 void __iomem *base = cb->io_base; in myrb_enable_mmio() local
811 struct pci_dev *pdev = cb->pdev; in myrb_enable_mmio()
821 if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) { in myrb_enable_mmio()
822 dev_err(&pdev->dev, "DMA mask out of range\n"); in myrb_enable_mmio()
826 cb->enquiry = dma_alloc_coherent(&pdev->dev, in myrb_enable_mmio()
828 &cb->enquiry_addr, GFP_KERNEL); in myrb_enable_mmio()
829 if (!cb->enquiry) in myrb_enable_mmio()
834 cb->err_table = dma_alloc_coherent(&pdev->dev, err_table_size, in myrb_enable_mmio()
835 &cb->err_table_addr, GFP_KERNEL); in myrb_enable_mmio()
836 if (!cb->err_table) in myrb_enable_mmio()
840 cb->ldev_info_buf = dma_alloc_coherent(&pdev->dev, ldev_info_size, in myrb_enable_mmio()
841 &cb->ldev_info_addr, GFP_KERNEL); in myrb_enable_mmio()
842 if (!cb->ldev_info_buf) in myrb_enable_mmio()
851 /* These are the base addresses for the command memory mailbox array */ in myrb_enable_mmio()
852 cb->cmd_mbox_size = MYRB_CMD_MBOX_COUNT * sizeof(union myrb_cmd_mbox); in myrb_enable_mmio()
853 cb->first_cmd_mbox = dma_alloc_coherent(&pdev->dev, in myrb_enable_mmio()
854 cb->cmd_mbox_size, in myrb_enable_mmio()
855 &cb->cmd_mbox_addr, in myrb_enable_mmio()
857 if (!cb->first_cmd_mbox) in myrb_enable_mmio()
860 cmd_mbox_mem = cb->first_cmd_mbox; in myrb_enable_mmio()
861 cmd_mbox_mem += MYRB_CMD_MBOX_COUNT - 1; in myrb_enable_mmio()
862 cb->last_cmd_mbox = cmd_mbox_mem; in myrb_enable_mmio()
863 cb->next_cmd_mbox = cb->first_cmd_mbox; in myrb_enable_mmio()
864 cb->prev_cmd_mbox1 = cb->last_cmd_mbox; in myrb_enable_mmio()
865 cb->prev_cmd_mbox2 = cb->last_cmd_mbox - 1; in myrb_enable_mmio()
867 /* These are the base addresses for the status memory mailbox array */ in myrb_enable_mmio()
868 cb->stat_mbox_size = MYRB_STAT_MBOX_COUNT * in myrb_enable_mmio()
870 cb->first_stat_mbox = dma_alloc_coherent(&pdev->dev, in myrb_enable_mmio()
871 cb->stat_mbox_size, in myrb_enable_mmio()
872 &cb->stat_mbox_addr, in myrb_enable_mmio()
874 if (!cb->first_stat_mbox) in myrb_enable_mmio()
877 stat_mbox_mem = cb->first_stat_mbox; in myrb_enable_mmio()
878 stat_mbox_mem += MYRB_STAT_MBOX_COUNT - 1; in myrb_enable_mmio()
879 cb->last_stat_mbox = stat_mbox_mem; in myrb_enable_mmio()
880 cb->next_stat_mbox = cb->first_stat_mbox; in myrb_enable_mmio()
883 cb->dual_mode_interface = true; in myrb_enable_mmio()
887 mbox.typeX.cmd_mbox_addr = cb->cmd_mbox_addr; in myrb_enable_mmio()
888 mbox.typeX.stat_mbox_addr = cb->stat_mbox_addr; in myrb_enable_mmio()
890 status = mmio_init_fn(pdev, base, &mbox); in myrb_enable_mmio()
892 cb->dual_mode_interface = false; in myrb_enable_mmio()
894 status = mmio_init_fn(pdev, base, &mbox); in myrb_enable_mmio()
896 dev_err(&pdev->dev, in myrb_enable_mmio()
906 * myrb_get_hba_config - reads the configuration information
919 struct Scsi_Host *shost = cb->host; in myrb_get_hba_config()
920 struct pci_dev *pdev = cb->pdev; in myrb_get_hba_config()
923 int ret = -ENODEV, memsize = 0; in myrb_get_hba_config()
925 enquiry2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_enquiry2), in myrb_get_hba_config()
928 shost_printk(KERN_ERR, cb->host, in myrb_get_hba_config()
930 return -ENOMEM; in myrb_get_hba_config()
932 config2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_config2), in myrb_get_hba_config()
935 shost_printk(KERN_ERR, cb->host, in myrb_get_hba_config()
937 dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2), in myrb_get_hba_config()
939 return -ENOMEM; in myrb_get_hba_config()
941 mutex_lock(&cb->dma_mutex); in myrb_get_hba_config()
943 mutex_unlock(&cb->dma_mutex); in myrb_get_hba_config()
945 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
952 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
959 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
966 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
974 switch (enquiry2->hw.sub_model) { in myrb_get_hba_config()
976 if (enquiry2->scsi_cap.bus_speed == MYRB_SCSI_SPEED_ULTRA) in myrb_get_hba_config()
977 strcpy(cb->model_name, "DAC960PU"); in myrb_get_hba_config()
979 strcpy(cb->model_name, "DAC960PD"); in myrb_get_hba_config()
982 strcpy(cb->model_name, "DAC960PL"); in myrb_get_hba_config()
985 strcpy(cb->model_name, "DAC960PG"); in myrb_get_hba_config()
988 strcpy(cb->model_name, "DAC960PJ"); in myrb_get_hba_config()
991 strcpy(cb->model_name, "DAC960PR"); in myrb_get_hba_config()
994 strcpy(cb->model_name, "DAC960PT"); in myrb_get_hba_config()
997 strcpy(cb->model_name, "DAC960PTL0"); in myrb_get_hba_config()
1000 strcpy(cb->model_name, "DAC960PRL"); in myrb_get_hba_config()
1003 strcpy(cb->model_name, "DAC960PTL1"); in myrb_get_hba_config()
1006 strcpy(cb->model_name, "eXtremeRAID 1100"); in myrb_get_hba_config()
1009 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
1011 enquiry2->hw.sub_model); in myrb_get_hba_config()
1036 * KZPSC: D040347 (1-channel) or D040348 (2-channel) in myrb_get_hba_config()
1037 * or D040349 (3-channel) in myrb_get_hba_config()
1038 * KZPAC: D040395 (1-channel) or D040396 (2-channel) in myrb_get_hba_config()
1039 * or D040397 (3-channel) in myrb_get_hba_config()
1046 if (enquiry2->fw.major_version == 0) { in myrb_get_hba_config()
1047 enquiry2->fw.major_version = cb->enquiry->fw_major_version; in myrb_get_hba_config()
1048 enquiry2->fw.minor_version = cb->enquiry->fw_minor_version; in myrb_get_hba_config()
1049 enquiry2->fw.firmware_type = '0'; in myrb_get_hba_config()
1050 enquiry2->fw.turn_id = 0; in myrb_get_hba_config()
1052 snprintf(cb->fw_version, sizeof(cb->fw_version), in myrb_get_hba_config()
1053 "%u.%02u-%c-%02u", in myrb_get_hba_config()
1054 enquiry2->fw.major_version, in myrb_get_hba_config()
1055 enquiry2->fw.minor_version, in myrb_get_hba_config()
1056 enquiry2->fw.firmware_type, in myrb_get_hba_config()
1057 enquiry2->fw.turn_id); in myrb_get_hba_config()
1058 if (!((enquiry2->fw.major_version == 5 && in myrb_get_hba_config()
1059 enquiry2->fw.minor_version >= 6) || in myrb_get_hba_config()
1060 (enquiry2->fw.major_version == 4 && in myrb_get_hba_config()
1061 enquiry2->fw.minor_version >= 6) || in myrb_get_hba_config()
1062 (enquiry2->fw.major_version == 3 && in myrb_get_hba_config()
1063 enquiry2->fw.minor_version >= 51) || in myrb_get_hba_config()
1064 (enquiry2->fw.major_version == 2 && in myrb_get_hba_config()
1065 strcmp(cb->fw_version, FIRMWARE_27X) >= 0))) { in myrb_get_hba_config()
1066 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
1068 cb->fw_version); in myrb_get_hba_config()
1072 * Initialize the Channels, Targets, Memory Size, and SAF-TE in myrb_get_hba_config()
1075 switch (enquiry2->hw.model) { in myrb_get_hba_config()
1087 pchan_max = enquiry2->cfg_chan; in myrb_get_hba_config()
1090 pchan_cur = enquiry2->cur_chan; in myrb_get_hba_config()
1091 if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_32BIT) in myrb_get_hba_config()
1092 cb->bus_width = 32; in myrb_get_hba_config()
1093 else if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_16BIT) in myrb_get_hba_config()
1094 cb->bus_width = 16; in myrb_get_hba_config()
1096 cb->bus_width = 8; in myrb_get_hba_config()
1097 cb->ldev_block_size = enquiry2->ldev_block_size; in myrb_get_hba_config()
1098 shost->max_channel = pchan_cur; in myrb_get_hba_config()
1099 shost->max_id = enquiry2->max_targets; in myrb_get_hba_config()
1100 memsize = enquiry2->mem_size >> 20; in myrb_get_hba_config()
1101 cb->safte_enabled = (enquiry2->fault_mgmt == MYRB_FAULT_SAFTE); in myrb_get_hba_config()
1110 shost->can_queue = cb->enquiry->max_tcq; in myrb_get_hba_config()
1111 if (shost->can_queue < 3) in myrb_get_hba_config()
1112 shost->can_queue = enquiry2->max_cmds; in myrb_get_hba_config()
1113 if (shost->can_queue < 3) in myrb_get_hba_config()
1115 shost->can_queue = 1; in myrb_get_hba_config()
1117 if (shost->can_queue > MYRB_CMD_MBOX_COUNT - 2) in myrb_get_hba_config()
1118 shost->can_queue = MYRB_CMD_MBOX_COUNT - 2; in myrb_get_hba_config()
1119 shost->max_sectors = enquiry2->max_sectors; in myrb_get_hba_config()
1120 shost->sg_tablesize = enquiry2->max_sge; in myrb_get_hba_config()
1121 if (shost->sg_tablesize > MYRB_SCATTER_GATHER_LIMIT) in myrb_get_hba_config()
1122 shost->sg_tablesize = MYRB_SCATTER_GATHER_LIMIT; in myrb_get_hba_config()
1126 cb->stripe_size = config2->blocks_per_stripe * config2->block_factor in myrb_get_hba_config()
1127 >> (10 - MYRB_BLKSIZE_BITS); in myrb_get_hba_config()
1128 cb->segment_size = config2->blocks_per_cacheline * config2->block_factor in myrb_get_hba_config()
1129 >> (10 - MYRB_BLKSIZE_BITS); in myrb_get_hba_config()
1131 cb->ldev_geom_heads = 255; in myrb_get_hba_config()
1132 cb->ldev_geom_sectors = 63; in myrb_get_hba_config()
1133 if (config2->drive_geometry) { in myrb_get_hba_config()
1134 cb->ldev_geom_heads = 128; in myrb_get_hba_config()
1135 cb->ldev_geom_sectors = 32; in myrb_get_hba_config()
1141 if ((cb->fw_version[0] == '4' && in myrb_get_hba_config()
1142 strcmp(cb->fw_version, "4.08") >= 0) || in myrb_get_hba_config()
1143 (cb->fw_version[0] == '5' && in myrb_get_hba_config()
1144 strcmp(cb->fw_version, "5.08") >= 0)) { in myrb_get_hba_config()
1145 cb->bgi_status_supported = true; in myrb_get_hba_config()
1148 cb->last_rbld_status = MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS; in myrb_get_hba_config()
1152 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1153 "Configuring %s PCI RAID Controller\n", cb->model_name); in myrb_get_hba_config()
1154 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1156 cb->fw_version, memsize); in myrb_get_hba_config()
1157 if (cb->io_addr == 0) in myrb_get_hba_config()
1158 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1160 (unsigned long)cb->pci_addr, cb->irq); in myrb_get_hba_config()
1162 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1164 (unsigned long)cb->io_addr, (unsigned long)cb->pci_addr, in myrb_get_hba_config()
1165 cb->irq); in myrb_get_hba_config()
1166 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1168 cb->host->can_queue, cb->host->max_sectors); in myrb_get_hba_config()
1169 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1171 cb->host->can_queue, cb->host->sg_tablesize, in myrb_get_hba_config()
1173 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1175 cb->stripe_size, cb->segment_size, in myrb_get_hba_config()
1176 cb->ldev_geom_heads, cb->ldev_geom_sectors, in myrb_get_hba_config()
1177 cb->safte_enabled ? in myrb_get_hba_config()
1178 " SAF-TE Enclosure Management Enabled" : ""); in myrb_get_hba_config()
1179 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1181 pchan_cur, pchan_max, 0, cb->enquiry->pdev_dead, in myrb_get_hba_config()
1182 cb->host->max_id); in myrb_get_hba_config()
1184 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1186 cb->enquiry->ldev_count, MYRB_MAX_LDEVS); in myrb_get_hba_config()
1189 dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2), in myrb_get_hba_config()
1191 dma_free_coherent(&pdev->dev, sizeof(struct myrb_config2), in myrb_get_hba_config()
1198 * myrb_unmap - unmaps controller structures
1202 if (cb->ldev_info_buf) { in myrb_unmap()
1205 dma_free_coherent(&cb->pdev->dev, ldev_info_size, in myrb_unmap()
1206 cb->ldev_info_buf, cb->ldev_info_addr); in myrb_unmap()
1207 cb->ldev_info_buf = NULL; in myrb_unmap()
1209 if (cb->err_table) { in myrb_unmap()
1212 dma_free_coherent(&cb->pdev->dev, err_table_size, in myrb_unmap()
1213 cb->err_table, cb->err_table_addr); in myrb_unmap()
1214 cb->err_table = NULL; in myrb_unmap()
1216 if (cb->enquiry) { in myrb_unmap()
1217 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_enquiry), in myrb_unmap()
1218 cb->enquiry, cb->enquiry_addr); in myrb_unmap()
1219 cb->enquiry = NULL; in myrb_unmap()
1221 if (cb->first_stat_mbox) { in myrb_unmap()
1222 dma_free_coherent(&cb->pdev->dev, cb->stat_mbox_size, in myrb_unmap()
1223 cb->first_stat_mbox, cb->stat_mbox_addr); in myrb_unmap()
1224 cb->first_stat_mbox = NULL; in myrb_unmap()
1226 if (cb->first_cmd_mbox) { in myrb_unmap()
1227 dma_free_coherent(&cb->pdev->dev, cb->cmd_mbox_size, in myrb_unmap()
1228 cb->first_cmd_mbox, cb->cmd_mbox_addr); in myrb_unmap()
1229 cb->first_cmd_mbox = NULL; in myrb_unmap()
1234 * myrb_cleanup - cleanup controller structures
1238 struct pci_dev *pdev = cb->pdev; in myrb_cleanup()
1243 if (cb->mmio_base) { in myrb_cleanup()
1244 cb->disable_intr(cb->io_base); in myrb_cleanup()
1245 iounmap(cb->mmio_base); in myrb_cleanup()
1247 if (cb->irq) in myrb_cleanup()
1248 free_irq(cb->irq, cb); in myrb_cleanup()
1249 if (cb->io_addr) in myrb_cleanup()
1250 release_region(cb->io_addr, 0x80); in myrb_cleanup()
1253 scsi_host_put(cb->host); in myrb_cleanup()
1258 struct Scsi_Host *shost = scmd->device->host; in myrb_host_reset()
1261 cb->reset(cb->io_base); in myrb_host_reset()
1270 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_pthru_queuecommand()
1273 struct scsi_device *sdev = scmd->device; in myrb_pthru_queuecommand()
1279 dcdb = dma_pool_alloc(cb->dcdb_pool, GFP_ATOMIC, &dcdb_addr); in myrb_pthru_queuecommand()
1284 dma_pool_free(cb->dcdb_pool, dcdb, dcdb_addr); in myrb_pthru_queuecommand()
1285 scmd->result = (DID_ERROR << 16); in myrb_pthru_queuecommand()
1286 scmd->scsi_done(scmd); in myrb_pthru_queuecommand()
1290 mbox->type3.opcode = MYRB_CMD_DCDB; in myrb_pthru_queuecommand()
1291 mbox->type3.id = scmd->request->tag + 3; in myrb_pthru_queuecommand()
1292 mbox->type3.addr = dcdb_addr; in myrb_pthru_queuecommand()
1293 dcdb->channel = sdev->channel; in myrb_pthru_queuecommand()
1294 dcdb->target = sdev->id; in myrb_pthru_queuecommand()
1295 switch (scmd->sc_data_direction) { in myrb_pthru_queuecommand()
1297 dcdb->data_xfer = MYRB_DCDB_XFER_NONE; in myrb_pthru_queuecommand()
1300 dcdb->data_xfer = MYRB_DCDB_XFER_SYSTEM_TO_DEVICE; in myrb_pthru_queuecommand()
1303 dcdb->data_xfer = MYRB_DCDB_XFER_DEVICE_TO_SYSTEM; in myrb_pthru_queuecommand()
1306 dcdb->data_xfer = MYRB_DCDB_XFER_ILLEGAL; in myrb_pthru_queuecommand()
1309 dcdb->early_status = false; in myrb_pthru_queuecommand()
1310 if (scmd->request->timeout <= 10) in myrb_pthru_queuecommand()
1311 dcdb->timeout = MYRB_DCDB_TMO_10_SECS; in myrb_pthru_queuecommand()
1312 else if (scmd->request->timeout <= 60) in myrb_pthru_queuecommand()
1313 dcdb->timeout = MYRB_DCDB_TMO_60_SECS; in myrb_pthru_queuecommand()
1314 else if (scmd->request->timeout <= 600) in myrb_pthru_queuecommand()
1315 dcdb->timeout = MYRB_DCDB_TMO_10_MINS; in myrb_pthru_queuecommand()
1317 dcdb->timeout = MYRB_DCDB_TMO_24_HRS; in myrb_pthru_queuecommand()
1318 dcdb->no_autosense = false; in myrb_pthru_queuecommand()
1319 dcdb->allow_disconnect = true; in myrb_pthru_queuecommand()
1321 dcdb->dma_addr = sg_dma_address(sgl); in myrb_pthru_queuecommand()
1323 dcdb->xfer_len_lo = sg_dma_len(sgl) & 0xffff; in myrb_pthru_queuecommand()
1324 dcdb->xfer_len_hi4 = sg_dma_len(sgl) >> 16; in myrb_pthru_queuecommand()
1326 dcdb->xfer_len_lo = sg_dma_len(sgl); in myrb_pthru_queuecommand()
1327 dcdb->xfer_len_hi4 = 0; in myrb_pthru_queuecommand()
1329 dcdb->cdb_len = scmd->cmd_len; in myrb_pthru_queuecommand()
1330 dcdb->sense_len = sizeof(dcdb->sense); in myrb_pthru_queuecommand()
1331 memcpy(&dcdb->cdb, scmd->cmnd, scmd->cmd_len); in myrb_pthru_queuecommand()
1333 spin_lock_irqsave(&cb->queue_lock, flags); in myrb_pthru_queuecommand()
1334 cb->qcmd(cb, cmd_blk); in myrb_pthru_queuecommand()
1335 spin_unlock_irqrestore(&cb->queue_lock, flags); in myrb_pthru_queuecommand()
1350 if (cb->bus_width > 16) in myrb_inquiry()
1352 if (cb->bus_width > 8) in myrb_inquiry()
1354 memcpy(&inq[16], cb->model_name, 16); in myrb_inquiry()
1355 memcpy(&inq[32], cb->fw_version, 1); in myrb_inquiry()
1356 memcpy(&inq[33], &cb->fw_version[2], 2); in myrb_inquiry()
1357 memcpy(&inq[35], &cb->fw_version[7], 1); in myrb_inquiry()
1370 dbd = (scmd->cmnd[1] & 0x08) == 0x08; in myrb_mode_sense()
1379 modes[0] = mode_len - 1; in myrb_mode_sense()
1384 put_unaligned_be32(ldev_info->size, &block_desc[0]); in myrb_mode_sense()
1385 put_unaligned_be32(cb->ldev_block_size, &block_desc[5]); in myrb_mode_sense()
1389 if (ldev_info->wb_enabled) in myrb_mode_sense()
1391 if (cb->segment_size) { in myrb_mode_sense()
1393 put_unaligned_be16(cb->segment_size, &mode_pg[14]); in myrb_mode_sense()
1402 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_request_sense()
1404 scsi_sg_copy_from_buffer(scmd, scmd->sense_buffer, in myrb_request_sense()
1413 dev_dbg(&scmd->device->sdev_gendev, in myrb_read_capacity()
1415 ldev_info->size, cb->ldev_block_size); in myrb_read_capacity()
1416 put_unaligned_be32(ldev_info->size - 1, &data[0]); in myrb_read_capacity()
1417 put_unaligned_be32(cb->ldev_block_size, &data[4]); in myrb_read_capacity()
1426 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_ldev_queuecommand()
1428 struct scsi_device *sdev = scmd->device; in myrb_ldev_queuecommand()
1435 ldev_info = sdev->hostdata; in myrb_ldev_queuecommand()
1436 if (ldev_info->state != MYRB_DEVICE_ONLINE && in myrb_ldev_queuecommand()
1437 ldev_info->state != MYRB_DEVICE_WO) { in myrb_ldev_queuecommand()
1438 dev_dbg(&shost->shost_gendev, "ldev %u in state %x, skip\n", in myrb_ldev_queuecommand()
1439 sdev->id, ldev_info ? ldev_info->state : 0xff); in myrb_ldev_queuecommand()
1440 scmd->result = (DID_BAD_TARGET << 16); in myrb_ldev_queuecommand()
1441 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1444 switch (scmd->cmnd[0]) { in myrb_ldev_queuecommand()
1446 scmd->result = (DID_OK << 16); in myrb_ldev_queuecommand()
1447 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1450 if (scmd->cmnd[1] & 1) { in myrb_ldev_queuecommand()
1452 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1454 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1458 scmd->result = (DID_OK << 16); in myrb_ldev_queuecommand()
1460 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1463 scmd->result = (DID_OK << 16); in myrb_ldev_queuecommand()
1464 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1467 if ((scmd->cmnd[2] & 0x3F) != 0x3F && in myrb_ldev_queuecommand()
1468 (scmd->cmnd[2] & 0x3F) != 0x08) { in myrb_ldev_queuecommand()
1470 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1472 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1476 scmd->result = (DID_OK << 16); in myrb_ldev_queuecommand()
1478 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1481 if ((scmd->cmnd[1] & 1) || in myrb_ldev_queuecommand()
1482 (scmd->cmnd[8] & 1)) { in myrb_ldev_queuecommand()
1484 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1486 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1488 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1491 lba = get_unaligned_be32(&scmd->cmnd[2]); in myrb_ldev_queuecommand()
1494 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1496 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1498 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1502 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1506 scmd->result = (DID_OK << 16); in myrb_ldev_queuecommand()
1509 if (scmd->cmnd[1] != 0x04) { in myrb_ldev_queuecommand()
1511 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1513 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1517 scmd->result = (DID_OK << 16); in myrb_ldev_queuecommand()
1519 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1522 if (ldev_info->state == MYRB_DEVICE_WO) { in myrb_ldev_queuecommand()
1524 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1526 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1528 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1533 lba = (((scmd->cmnd[1] & 0x1F) << 16) | in myrb_ldev_queuecommand()
1534 (scmd->cmnd[2] << 8) | in myrb_ldev_queuecommand()
1535 scmd->cmnd[3]); in myrb_ldev_queuecommand()
1536 block_cnt = scmd->cmnd[4]; in myrb_ldev_queuecommand()
1539 if (ldev_info->state == MYRB_DEVICE_WO) { in myrb_ldev_queuecommand()
1541 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1543 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1545 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1552 lba = get_unaligned_be32(&scmd->cmnd[2]); in myrb_ldev_queuecommand()
1553 block_cnt = get_unaligned_be16(&scmd->cmnd[7]); in myrb_ldev_queuecommand()
1556 if (ldev_info->state == MYRB_DEVICE_WO) { in myrb_ldev_queuecommand()
1558 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1560 scmd->result = (DRIVER_SENSE << 24) | in myrb_ldev_queuecommand()
1562 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1569 lba = get_unaligned_be32(&scmd->cmnd[2]); in myrb_ldev_queuecommand()
1570 block_cnt = get_unaligned_be32(&scmd->cmnd[6]); in myrb_ldev_queuecommand()
1574 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_ldev_queuecommand()
1576 scmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; in myrb_ldev_queuecommand()
1577 scmd->scsi_done(scmd); in myrb_ldev_queuecommand()
1582 mbox->type5.id = scmd->request->tag + 3; in myrb_ldev_queuecommand()
1583 if (scmd->sc_data_direction == DMA_NONE) in myrb_ldev_queuecommand()
1588 if (scmd->sc_data_direction == DMA_FROM_DEVICE) in myrb_ldev_queuecommand()
1589 mbox->type5.opcode = MYRB_CMD_READ; in myrb_ldev_queuecommand()
1591 mbox->type5.opcode = MYRB_CMD_WRITE; in myrb_ldev_queuecommand()
1593 mbox->type5.ld.xfer_len = block_cnt; in myrb_ldev_queuecommand()
1594 mbox->type5.ld.ldev_num = sdev->id; in myrb_ldev_queuecommand()
1595 mbox->type5.lba = lba; in myrb_ldev_queuecommand()
1596 mbox->type5.addr = (u32)sg_dma_address(sgl); in myrb_ldev_queuecommand()
1602 hw_sgl = dma_pool_alloc(cb->sg_pool, GFP_ATOMIC, &hw_sgl_addr); in myrb_ldev_queuecommand()
1606 cmd_blk->sgl = hw_sgl; in myrb_ldev_queuecommand()
1607 cmd_blk->sgl_addr = hw_sgl_addr; in myrb_ldev_queuecommand()
1609 if (scmd->sc_data_direction == DMA_FROM_DEVICE) in myrb_ldev_queuecommand()
1610 mbox->type5.opcode = MYRB_CMD_READ_SG; in myrb_ldev_queuecommand()
1612 mbox->type5.opcode = MYRB_CMD_WRITE_SG; in myrb_ldev_queuecommand()
1614 mbox->type5.ld.xfer_len = block_cnt; in myrb_ldev_queuecommand()
1615 mbox->type5.ld.ldev_num = sdev->id; in myrb_ldev_queuecommand()
1616 mbox->type5.lba = lba; in myrb_ldev_queuecommand()
1617 mbox->type5.addr = hw_sgl_addr; in myrb_ldev_queuecommand()
1618 mbox->type5.sg_count = nsge; in myrb_ldev_queuecommand()
1621 hw_sgl->sge_addr = (u32)sg_dma_address(sgl); in myrb_ldev_queuecommand()
1622 hw_sgl->sge_count = (u32)sg_dma_len(sgl); in myrb_ldev_queuecommand()
1627 spin_lock_irqsave(&cb->queue_lock, flags); in myrb_ldev_queuecommand()
1628 cb->qcmd(cb, cmd_blk); in myrb_ldev_queuecommand()
1629 spin_unlock_irqrestore(&cb->queue_lock, flags); in myrb_ldev_queuecommand()
1637 struct scsi_device *sdev = scmd->device; in myrb_queuecommand()
1639 if (sdev->channel > myrb_logical_channel(shost)) { in myrb_queuecommand()
1640 scmd->result = (DID_BAD_TARGET << 16); in myrb_queuecommand()
1641 scmd->scsi_done(scmd); in myrb_queuecommand()
1644 if (sdev->channel == myrb_logical_channel(shost)) in myrb_queuecommand()
1652 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_ldev_slave_alloc()
1654 unsigned short ldev_num = sdev->id; in myrb_ldev_slave_alloc()
1657 ldev_info = cb->ldev_info_buf + ldev_num; in myrb_ldev_slave_alloc()
1659 return -ENXIO; in myrb_ldev_slave_alloc()
1661 sdev->hostdata = kzalloc(sizeof(*ldev_info), GFP_KERNEL); in myrb_ldev_slave_alloc()
1662 if (!sdev->hostdata) in myrb_ldev_slave_alloc()
1663 return -ENOMEM; in myrb_ldev_slave_alloc()
1664 dev_dbg(&sdev->sdev_gendev, in myrb_ldev_slave_alloc()
1666 ldev_num, ldev_info->state); in myrb_ldev_slave_alloc()
1667 memcpy(sdev->hostdata, ldev_info, in myrb_ldev_slave_alloc()
1669 switch (ldev_info->raid_level) { in myrb_ldev_slave_alloc()
1692 raid_set_level(myrb_raid_template, &sdev->sdev_gendev, level); in myrb_ldev_slave_alloc()
1698 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_pdev_slave_alloc()
1702 if (sdev->id > MYRB_MAX_TARGETS) in myrb_pdev_slave_alloc()
1703 return -ENXIO; in myrb_pdev_slave_alloc()
1707 return -ENOMEM; in myrb_pdev_slave_alloc()
1712 dev_dbg(&sdev->sdev_gendev, in myrb_pdev_slave_alloc()
1716 return -ENXIO; in myrb_pdev_slave_alloc()
1718 if (!pdev_info->present) { in myrb_pdev_slave_alloc()
1719 dev_dbg(&sdev->sdev_gendev, in myrb_pdev_slave_alloc()
1722 return -ENXIO; in myrb_pdev_slave_alloc()
1724 dev_dbg(&sdev->sdev_gendev, in myrb_pdev_slave_alloc()
1726 sdev->channel, sdev->id, pdev_info->state); in myrb_pdev_slave_alloc()
1727 sdev->hostdata = pdev_info; in myrb_pdev_slave_alloc()
1734 if (sdev->channel > myrb_logical_channel(sdev->host)) in myrb_slave_alloc()
1735 return -ENXIO; in myrb_slave_alloc()
1737 if (sdev->lun > 0) in myrb_slave_alloc()
1738 return -ENXIO; in myrb_slave_alloc()
1740 if (sdev->channel == myrb_logical_channel(sdev->host)) in myrb_slave_alloc()
1750 if (sdev->channel > myrb_logical_channel(sdev->host)) in myrb_slave_configure()
1751 return -ENXIO; in myrb_slave_configure()
1753 if (sdev->channel < myrb_logical_channel(sdev->host)) { in myrb_slave_configure()
1754 sdev->no_uld_attach = 1; in myrb_slave_configure()
1757 if (sdev->lun != 0) in myrb_slave_configure()
1758 return -ENXIO; in myrb_slave_configure()
1760 ldev_info = sdev->hostdata; in myrb_slave_configure()
1762 return -ENXIO; in myrb_slave_configure()
1763 if (ldev_info->state != MYRB_DEVICE_ONLINE) in myrb_slave_configure()
1766 myrb_devstate_name(ldev_info->state)); in myrb_slave_configure()
1768 sdev->tagged_supported = 1; in myrb_slave_configure()
1774 kfree(sdev->hostdata); in myrb_slave_destroy()
1780 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_biosparam()
1782 geom[0] = cb->ldev_geom_heads; in myrb_biosparam()
1783 geom[1] = cb->ldev_geom_sectors; in myrb_biosparam()
1793 struct myrb_hba *cb = shost_priv(sdev->host); in raid_state_show()
1796 if (!sdev->hostdata) in raid_state_show()
1799 if (sdev->channel == myrb_logical_channel(sdev->host)) { in raid_state_show()
1800 struct myrb_ldev_info *ldev_info = sdev->hostdata; in raid_state_show()
1803 name = myrb_devstate_name(ldev_info->state); in raid_state_show()
1808 ldev_info->state); in raid_state_show()
1810 struct myrb_pdev_state *pdev_info = sdev->hostdata; in raid_state_show()
1821 if (!pdev_info->present) in raid_state_show()
1824 name = myrb_devstate_name(pdev_info->state); in raid_state_show()
1829 pdev_info->state); in raid_state_show()
1838 struct myrb_hba *cb = shost_priv(sdev->host); in raid_state_store()
1851 return -EINVAL; in raid_state_store()
1853 pdev_info = sdev->hostdata; in raid_state_store()
1856 "Failed - no physical device information\n"); in raid_state_store()
1857 return -ENXIO; in raid_state_store()
1859 if (!pdev_info->present) { in raid_state_store()
1861 "Failed - device not present\n"); in raid_state_store()
1862 return -ENXIO; in raid_state_store()
1865 if (pdev_info->state == new_state) in raid_state_store()
1874 "Failed - Unable to Start Device\n"); in raid_state_store()
1875 count = -EAGAIN; in raid_state_store()
1879 "Failed - No Device at Address\n"); in raid_state_store()
1880 count = -ENODEV; in raid_state_store()
1884 "Failed - Invalid Channel or Target or Modifier\n"); in raid_state_store()
1885 count = -EINVAL; in raid_state_store()
1889 "Failed - Channel Busy\n"); in raid_state_store()
1890 count = -EBUSY; in raid_state_store()
1894 "Failed - Unexpected Status %04X\n", status); in raid_state_store()
1895 count = -EIO; in raid_state_store()
1907 if (sdev->channel == myrb_logical_channel(sdev->host)) { in raid_level_show()
1908 struct myrb_ldev_info *ldev_info = sdev->hostdata; in raid_level_show()
1912 return -ENXIO; in raid_level_show()
1914 name = myrb_raidlevel_name(ldev_info->raid_level); in raid_level_show()
1917 ldev_info->state); in raid_level_show()
1928 struct myrb_hba *cb = shost_priv(sdev->host); in rebuild_show()
1932 if (sdev->channel < myrb_logical_channel(sdev->host)) in rebuild_show()
1933 return snprintf(buf, 32, "physical device - not rebuilding\n"); in rebuild_show()
1937 if (rbld_buf.ldev_num != sdev->id || in rebuild_show()
1942 rbld_buf.ldev_size - rbld_buf.blocks_left, in rebuild_show()
1950 struct myrb_hba *cb = shost_priv(sdev->host); in rebuild_store()
1961 if (sdev->channel >= myrb_logical_channel(sdev->host)) in rebuild_store()
1962 return -ENXIO; in rebuild_store()
1969 return -EALREADY; in rebuild_store()
1971 mutex_lock(&cb->dcmd_mutex); in rebuild_store()
1972 cmd_blk = &cb->dcmd_blk; in rebuild_store()
1974 mbox = &cmd_blk->mbox; in rebuild_store()
1975 mbox->type3D.opcode = MYRB_CMD_REBUILD_ASYNC; in rebuild_store()
1976 mbox->type3D.id = MYRB_DCMD_TAG; in rebuild_store()
1977 mbox->type3D.channel = sdev->channel; in rebuild_store()
1978 mbox->type3D.target = sdev->id; in rebuild_store()
1980 mutex_unlock(&cb->dcmd_mutex); in rebuild_store()
1982 struct pci_dev *pdev = cb->pdev; in rebuild_store()
1992 rate = dma_alloc_coherent(&pdev->dev, sizeof(char), in rebuild_store()
1996 "Cancellation of Rebuild Failed - Out of Memory\n"); in rebuild_store()
1997 return -ENOMEM; in rebuild_store()
1999 mutex_lock(&cb->dcmd_mutex); in rebuild_store()
2000 cmd_blk = &cb->dcmd_blk; in rebuild_store()
2002 mbox = &cmd_blk->mbox; in rebuild_store()
2003 mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL; in rebuild_store()
2004 mbox->type3R.id = MYRB_DCMD_TAG; in rebuild_store()
2005 mbox->type3R.rbld_rate = 0xFF; in rebuild_store()
2006 mbox->type3R.addr = rate_addr; in rebuild_store()
2008 dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr); in rebuild_store()
2009 mutex_unlock(&cb->dcmd_mutex); in rebuild_store()
2020 return -EIO; in rebuild_store()
2042 "Rebuild Failed - %s\n", msg); in rebuild_store()
2047 return -EIO; in rebuild_store()
2055 struct myrb_hba *cb = shost_priv(sdev->host); in consistency_check_store()
2068 if (sdev->channel < myrb_logical_channel(sdev->host)) in consistency_check_store()
2069 return -ENXIO; in consistency_check_store()
2076 return -EALREADY; in consistency_check_store()
2078 mutex_lock(&cb->dcmd_mutex); in consistency_check_store()
2079 cmd_blk = &cb->dcmd_blk; in consistency_check_store()
2081 mbox = &cmd_blk->mbox; in consistency_check_store()
2082 mbox->type3C.opcode = MYRB_CMD_CHECK_CONSISTENCY_ASYNC; in consistency_check_store()
2083 mbox->type3C.id = MYRB_DCMD_TAG; in consistency_check_store()
2084 mbox->type3C.ldev_num = sdev->id; in consistency_check_store()
2085 mbox->type3C.auto_restore = true; in consistency_check_store()
2088 mutex_unlock(&cb->dcmd_mutex); in consistency_check_store()
2090 struct pci_dev *pdev = cb->pdev; in consistency_check_store()
2094 if (ldev_num != sdev->id) { in consistency_check_store()
2099 rate = dma_alloc_coherent(&pdev->dev, sizeof(char), in consistency_check_store()
2103 "Cancellation of Check Consistency Failed - Out of Memory\n"); in consistency_check_store()
2104 return -ENOMEM; in consistency_check_store()
2106 mutex_lock(&cb->dcmd_mutex); in consistency_check_store()
2107 cmd_blk = &cb->dcmd_blk; in consistency_check_store()
2109 mbox = &cmd_blk->mbox; in consistency_check_store()
2110 mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL; in consistency_check_store()
2111 mbox->type3R.id = MYRB_DCMD_TAG; in consistency_check_store()
2112 mbox->type3R.rbld_rate = 0xFF; in consistency_check_store()
2113 mbox->type3R.addr = rate_addr; in consistency_check_store()
2115 dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr); in consistency_check_store()
2116 mutex_unlock(&cb->dcmd_mutex); in consistency_check_store()
2127 return -EIO; in consistency_check_store()
2149 "Check Consistency Failed - %s\n", msg); in consistency_check_store()
2154 return -EIO; in consistency_check_store()
2170 return snprintf(buf, 20, "%u\n", cb->ctlr_num); in ctlr_num_show()
2180 return snprintf(buf, 16, "%s\n", cb->fw_version); in firmware_show()
2190 return snprintf(buf, 16, "%s\n", cb->model_name); in model_show()
2209 return -EIO; in flush_cache_store()
2242 .this_id = -1,
2246 * myrb_is_raid - return boolean indicating device is raid volume
2253 return sdev->channel == myrb_logical_channel(sdev->host); in myrb_is_raid()
2257 * myrb_get_resync - get raid volume resync percent complete
2263 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_get_resync()
2269 if (sdev->channel < myrb_logical_channel(sdev->host)) in myrb_get_resync()
2273 if (rbld_buf.ldev_num == sdev->id) { in myrb_get_resync()
2279 percent_complete = (ldev_size - remaining) * 100 / ldev_size; in myrb_get_resync()
2284 * myrb_get_state - get raid volume status
2290 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_get_state()
2291 struct myrb_ldev_info *ldev_info = sdev->hostdata; in myrb_get_state()
2295 if (sdev->channel < myrb_logical_channel(sdev->host) || !ldev_info) in myrb_get_state()
2302 switch (ldev_info->state) { in myrb_get_state()
2335 if (cmd_blk->dcdb) { in myrb_handle_scsi()
2336 memcpy(scmd->sense_buffer, &cmd_blk->dcdb->sense, 64); in myrb_handle_scsi()
2337 dma_pool_free(cb->dcdb_pool, cmd_blk->dcdb, in myrb_handle_scsi()
2338 cmd_blk->dcdb_addr); in myrb_handle_scsi()
2339 cmd_blk->dcdb = NULL; in myrb_handle_scsi()
2341 if (cmd_blk->sgl) { in myrb_handle_scsi()
2342 dma_pool_free(cb->sg_pool, cmd_blk->sgl, cmd_blk->sgl_addr); in myrb_handle_scsi()
2343 cmd_blk->sgl = NULL; in myrb_handle_scsi()
2344 cmd_blk->sgl_addr = 0; in myrb_handle_scsi()
2346 status = cmd_blk->status; in myrb_handle_scsi()
2350 scmd->result = (DID_OK << 16) | status; in myrb_handle_scsi()
2353 dev_dbg(&scmd->device->sdev_gendev, in myrb_handle_scsi()
2355 if (scmd->sc_data_direction == DMA_FROM_DEVICE) in myrb_handle_scsi()
2357 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_handle_scsi()
2361 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_handle_scsi()
2363 scmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION; in myrb_handle_scsi()
2367 if (scmd->sc_data_direction == DMA_FROM_DEVICE) in myrb_handle_scsi()
2368 /* Unrecovered read error, auto-reallocation failed */ in myrb_handle_scsi()
2369 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_handle_scsi()
2372 /* Write error, auto-reallocation failed */ in myrb_handle_scsi()
2373 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_handle_scsi()
2375 scmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION; in myrb_handle_scsi()
2378 dev_dbg(&scmd->device->sdev_gendev, in myrb_handle_scsi()
2380 scmd->result = (DID_BAD_TARGET << 16); in myrb_handle_scsi()
2383 dev_dbg(&scmd->device->sdev_gendev, in myrb_handle_scsi()
2386 scsi_build_sense_buffer(0, scmd->sense_buffer, in myrb_handle_scsi()
2390 dev_dbg(&scmd->device->sdev_gendev, "Device nonresponsive\n"); in myrb_handle_scsi()
2391 scmd->result = (DID_BAD_TARGET << 16); in myrb_handle_scsi()
2396 scmd->result = (DID_ERROR << 16); in myrb_handle_scsi()
2399 scmd->scsi_done(scmd); in myrb_handle_scsi()
2407 if (cmd_blk->completion) { in myrb_handle_cmdblk()
2408 complete(cmd_blk->completion); in myrb_handle_cmdblk()
2409 cmd_blk->completion = NULL; in myrb_handle_cmdblk()
2417 struct Scsi_Host *shost = cb->host; in myrb_monitor()
2420 dev_dbg(&shost->shost_gendev, "monitor tick\n"); in myrb_monitor()
2422 if (cb->new_ev_seq > cb->old_ev_seq) { in myrb_monitor()
2423 int event = cb->old_ev_seq; in myrb_monitor()
2425 dev_dbg(&shost->shost_gendev, in myrb_monitor()
2427 cb->new_ev_seq, event); in myrb_monitor()
2429 cb->old_ev_seq = event + 1; in myrb_monitor()
2430 interval = 10; in myrb_monitor()
2431 } else if (cb->need_err_info) { in myrb_monitor()
2432 cb->need_err_info = false; in myrb_monitor()
2433 dev_dbg(&shost->shost_gendev, "get error table\n"); in myrb_monitor()
2435 interval = 10; in myrb_monitor()
2436 } else if (cb->need_rbld && cb->rbld_first) { in myrb_monitor()
2437 cb->need_rbld = false; in myrb_monitor()
2438 dev_dbg(&shost->shost_gendev, in myrb_monitor()
2441 interval = 10; in myrb_monitor()
2442 } else if (cb->need_ldev_info) { in myrb_monitor()
2443 cb->need_ldev_info = false; in myrb_monitor()
2444 dev_dbg(&shost->shost_gendev, in myrb_monitor()
2447 interval = 10; in myrb_monitor()
2448 } else if (cb->need_rbld) { in myrb_monitor()
2449 cb->need_rbld = false; in myrb_monitor()
2450 dev_dbg(&shost->shost_gendev, in myrb_monitor()
2453 interval = 10; in myrb_monitor()
2454 } else if (cb->need_cc_status) { in myrb_monitor()
2455 cb->need_cc_status = false; in myrb_monitor()
2456 dev_dbg(&shost->shost_gendev, in myrb_monitor()
2459 interval = 10; in myrb_monitor()
2460 } else if (cb->need_bgi_status) { in myrb_monitor()
2461 cb->need_bgi_status = false; in myrb_monitor()
2462 dev_dbg(&shost->shost_gendev, "get background init status\n"); in myrb_monitor()
2464 interval = 10; in myrb_monitor()
2466 dev_dbg(&shost->shost_gendev, "new enquiry\n"); in myrb_monitor()
2467 mutex_lock(&cb->dma_mutex); in myrb_monitor()
2469 mutex_unlock(&cb->dma_mutex); in myrb_monitor()
2470 if ((cb->new_ev_seq - cb->old_ev_seq > 0) || in myrb_monitor()
2471 cb->need_err_info || cb->need_rbld || in myrb_monitor()
2472 cb->need_ldev_info || cb->need_cc_status || in myrb_monitor()
2473 cb->need_bgi_status) { in myrb_monitor()
2474 dev_dbg(&shost->shost_gendev, in myrb_monitor()
2480 cb->primary_monitor_time = jiffies; in myrb_monitor()
2481 queue_delayed_work(cb->work_q, &cb->monitor_work, interval); in myrb_monitor()
2485 * myrb_err_status - reports controller BIOS messages
2495 struct pci_dev *pdev = cb->pdev; in myrb_err_status()
2499 dev_info(&pdev->dev, in myrb_err_status()
2504 dev_notice(&pdev->dev, "Spinning Up Drives\n"); in myrb_err_status()
2507 dev_notice(&pdev->dev, "Configuration Checksum Error\n"); in myrb_err_status()
2510 dev_notice(&pdev->dev, "Mirror Race Recovery Failed\n"); in myrb_err_status()
2513 dev_notice(&pdev->dev, "Mirror Race Recovery In Progress\n"); in myrb_err_status()
2516 dev_notice(&pdev->dev, "Physical Device %d:%d COD Mismatch\n", in myrb_err_status()
2520 dev_notice(&pdev->dev, "Logical Drive Installation Aborted\n"); in myrb_err_status()
2523 dev_notice(&pdev->dev, "Mirror Race On A Critical Logical Drive\n"); in myrb_err_status()
2526 dev_notice(&pdev->dev, "New Controller Configuration Found\n"); in myrb_err_status()
2529 dev_err(&pdev->dev, "Fatal Memory Parity Error\n"); in myrb_err_status()
2532 dev_err(&pdev->dev, "Unknown Initialization Error %02X\n", in myrb_err_status()
2540 * Hardware-specific functions
2547 static inline void DAC960_LA_hw_mbox_new_cmd(void __iomem *base) in DAC960_LA_hw_mbox_new_cmd() argument
2549 writeb(DAC960_LA_IDB_HWMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET); in DAC960_LA_hw_mbox_new_cmd()
2552 static inline void DAC960_LA_ack_hw_mbox_status(void __iomem *base) in DAC960_LA_ack_hw_mbox_status() argument
2554 writeb(DAC960_LA_IDB_HWMBOX_ACK_STS, base + DAC960_LA_IDB_OFFSET); in DAC960_LA_ack_hw_mbox_status()
2557 static inline void DAC960_LA_gen_intr(void __iomem *base) in DAC960_LA_gen_intr() argument
2559 writeb(DAC960_LA_IDB_GEN_IRQ, base + DAC960_LA_IDB_OFFSET); in DAC960_LA_gen_intr()
2562 static inline void DAC960_LA_reset_ctrl(void __iomem *base) in DAC960_LA_reset_ctrl() argument
2564 writeb(DAC960_LA_IDB_CTRL_RESET, base + DAC960_LA_IDB_OFFSET); in DAC960_LA_reset_ctrl()
2567 static inline void DAC960_LA_mem_mbox_new_cmd(void __iomem *base) in DAC960_LA_mem_mbox_new_cmd() argument
2569 writeb(DAC960_LA_IDB_MMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET); in DAC960_LA_mem_mbox_new_cmd()
2572 static inline bool DAC960_LA_hw_mbox_is_full(void __iomem *base) in DAC960_LA_hw_mbox_is_full() argument
2574 unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET); in DAC960_LA_hw_mbox_is_full()
2579 static inline bool DAC960_LA_init_in_progress(void __iomem *base) in DAC960_LA_init_in_progress() argument
2581 unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET); in DAC960_LA_init_in_progress()
2586 static inline void DAC960_LA_ack_hw_mbox_intr(void __iomem *base) in DAC960_LA_ack_hw_mbox_intr() argument
2588 writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET); in DAC960_LA_ack_hw_mbox_intr()
2591 static inline void DAC960_LA_ack_mem_mbox_intr(void __iomem *base) in DAC960_LA_ack_mem_mbox_intr() argument
2593 writeb(DAC960_LA_ODB_MMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET); in DAC960_LA_ack_mem_mbox_intr()
2596 static inline void DAC960_LA_ack_intr(void __iomem *base) in DAC960_LA_ack_intr() argument
2599 base + DAC960_LA_ODB_OFFSET); in DAC960_LA_ack_intr()
2602 static inline bool DAC960_LA_hw_mbox_status_available(void __iomem *base) in DAC960_LA_hw_mbox_status_available() argument
2604 unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET); in DAC960_LA_hw_mbox_status_available()
2609 static inline bool DAC960_LA_mem_mbox_status_available(void __iomem *base) in DAC960_LA_mem_mbox_status_available() argument
2611 unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET); in DAC960_LA_mem_mbox_status_available()
2616 static inline void DAC960_LA_enable_intr(void __iomem *base) in DAC960_LA_enable_intr() argument
2621 writeb(odb, base + DAC960_LA_IRQMASK_OFFSET); in DAC960_LA_enable_intr()
2624 static inline void DAC960_LA_disable_intr(void __iomem *base) in DAC960_LA_disable_intr() argument
2629 writeb(odb, base + DAC960_LA_IRQMASK_OFFSET); in DAC960_LA_disable_intr()
2632 static inline bool DAC960_LA_intr_enabled(void __iomem *base) in DAC960_LA_intr_enabled() argument
2634 unsigned char imask = readb(base + DAC960_LA_IRQMASK_OFFSET); in DAC960_LA_intr_enabled()
2642 mem_mbox->words[1] = mbox->words[1]; in DAC960_LA_write_cmd_mbox()
2643 mem_mbox->words[2] = mbox->words[2]; in DAC960_LA_write_cmd_mbox()
2644 mem_mbox->words[3] = mbox->words[3]; in DAC960_LA_write_cmd_mbox()
2647 mem_mbox->words[0] = mbox->words[0]; in DAC960_LA_write_cmd_mbox()
2652 static inline void DAC960_LA_write_hw_mbox(void __iomem *base, in DAC960_LA_write_hw_mbox() argument
2655 writel(mbox->words[0], base + DAC960_LA_CMDOP_OFFSET); in DAC960_LA_write_hw_mbox()
2656 writel(mbox->words[1], base + DAC960_LA_MBOX4_OFFSET); in DAC960_LA_write_hw_mbox()
2657 writel(mbox->words[2], base + DAC960_LA_MBOX8_OFFSET); in DAC960_LA_write_hw_mbox()
2658 writeb(mbox->bytes[12], base + DAC960_LA_MBOX12_OFFSET); in DAC960_LA_write_hw_mbox()
2661 static inline unsigned char DAC960_LA_read_status_cmd_ident(void __iomem *base) in DAC960_LA_read_status_cmd_ident() argument
2663 return readb(base + DAC960_LA_STSID_OFFSET); in DAC960_LA_read_status_cmd_ident()
2666 static inline unsigned short DAC960_LA_read_status(void __iomem *base) in DAC960_LA_read_status() argument
2668 return readw(base + DAC960_LA_STS_OFFSET); in DAC960_LA_read_status()
2672 DAC960_LA_read_error_status(void __iomem *base, unsigned char *error, in DAC960_LA_read_error_status() argument
2675 unsigned char errsts = readb(base + DAC960_LA_ERRSTS_OFFSET); in DAC960_LA_read_error_status()
2682 *param0 = readb(base + DAC960_LA_CMDOP_OFFSET); in DAC960_LA_read_error_status()
2683 *param1 = readb(base + DAC960_LA_CMDID_OFFSET); in DAC960_LA_read_error_status()
2684 writeb(0xFF, base + DAC960_LA_ERRSTS_OFFSET); in DAC960_LA_read_error_status()
2689 DAC960_LA_mbox_init(struct pci_dev *pdev, void __iomem *base, in DAC960_LA_mbox_init() argument
2696 if (!DAC960_LA_hw_mbox_is_full(base)) in DAC960_LA_mbox_init()
2698 udelay(10); in DAC960_LA_mbox_init()
2701 if (DAC960_LA_hw_mbox_is_full(base)) { in DAC960_LA_mbox_init()
2702 dev_err(&pdev->dev, in DAC960_LA_mbox_init()
2706 DAC960_LA_write_hw_mbox(base, mbox); in DAC960_LA_mbox_init()
2707 DAC960_LA_hw_mbox_new_cmd(base); in DAC960_LA_mbox_init()
2710 if (DAC960_LA_hw_mbox_status_available(base)) in DAC960_LA_mbox_init()
2712 udelay(10); in DAC960_LA_mbox_init()
2715 if (!DAC960_LA_hw_mbox_status_available(base)) { in DAC960_LA_mbox_init()
2716 dev_err(&pdev->dev, "Timeout waiting for mailbox status\n"); in DAC960_LA_mbox_init()
2719 status = DAC960_LA_read_status(base); in DAC960_LA_mbox_init()
2720 DAC960_LA_ack_hw_mbox_intr(base); in DAC960_LA_mbox_init()
2721 DAC960_LA_ack_hw_mbox_status(base); in DAC960_LA_mbox_init()
2727 struct myrb_hba *cb, void __iomem *base) in DAC960_LA_hw_init() argument
2732 DAC960_LA_disable_intr(base); in DAC960_LA_hw_init()
2733 DAC960_LA_ack_hw_mbox_status(base); in DAC960_LA_hw_init()
2735 while (DAC960_LA_init_in_progress(base) && in DAC960_LA_hw_init()
2737 if (DAC960_LA_read_error_status(base, &error, in DAC960_LA_hw_init()
2740 return -ENODEV; in DAC960_LA_hw_init()
2741 udelay(10); in DAC960_LA_hw_init()
2745 dev_err(&pdev->dev, in DAC960_LA_hw_init()
2747 return -ETIMEDOUT; in DAC960_LA_hw_init()
2750 dev_err(&pdev->dev, in DAC960_LA_hw_init()
2752 DAC960_LA_reset_ctrl(base); in DAC960_LA_hw_init()
2753 return -ENODEV; in DAC960_LA_hw_init()
2755 DAC960_LA_enable_intr(base); in DAC960_LA_hw_init()
2756 cb->qcmd = myrb_qcmd; in DAC960_LA_hw_init()
2757 cb->write_cmd_mbox = DAC960_LA_write_cmd_mbox; in DAC960_LA_hw_init()
2758 if (cb->dual_mode_interface) in DAC960_LA_hw_init()
2759 cb->get_cmd_mbox = DAC960_LA_mem_mbox_new_cmd; in DAC960_LA_hw_init()
2761 cb->get_cmd_mbox = DAC960_LA_hw_mbox_new_cmd; in DAC960_LA_hw_init()
2762 cb->disable_intr = DAC960_LA_disable_intr; in DAC960_LA_hw_init()
2763 cb->reset = DAC960_LA_reset_ctrl; in DAC960_LA_hw_init()
2771 void __iomem *base = cb->io_base; in DAC960_LA_intr_handler() local
2775 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_LA_intr_handler()
2776 DAC960_LA_ack_intr(base); in DAC960_LA_intr_handler()
2777 next_stat_mbox = cb->next_stat_mbox; in DAC960_LA_intr_handler()
2778 while (next_stat_mbox->valid) { in DAC960_LA_intr_handler()
2779 unsigned char id = next_stat_mbox->id; in DAC960_LA_intr_handler()
2784 cmd_blk = &cb->dcmd_blk; in DAC960_LA_intr_handler()
2786 cmd_blk = &cb->mcmd_blk; in DAC960_LA_intr_handler()
2788 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_LA_intr_handler()
2793 cmd_blk->status = next_stat_mbox->status; in DAC960_LA_intr_handler()
2795 dev_err(&cb->pdev->dev, in DAC960_LA_intr_handler()
2799 if (++next_stat_mbox > cb->last_stat_mbox) in DAC960_LA_intr_handler()
2800 next_stat_mbox = cb->first_stat_mbox; in DAC960_LA_intr_handler()
2809 cb->next_stat_mbox = next_stat_mbox; in DAC960_LA_intr_handler()
2810 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_LA_intr_handler()
2823 static inline void DAC960_PG_hw_mbox_new_cmd(void __iomem *base) in DAC960_PG_hw_mbox_new_cmd() argument
2825 writel(DAC960_PG_IDB_HWMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET); in DAC960_PG_hw_mbox_new_cmd()
2828 static inline void DAC960_PG_ack_hw_mbox_status(void __iomem *base) in DAC960_PG_ack_hw_mbox_status() argument
2830 writel(DAC960_PG_IDB_HWMBOX_ACK_STS, base + DAC960_PG_IDB_OFFSET); in DAC960_PG_ack_hw_mbox_status()
2833 static inline void DAC960_PG_gen_intr(void __iomem *base) in DAC960_PG_gen_intr() argument
2835 writel(DAC960_PG_IDB_GEN_IRQ, base + DAC960_PG_IDB_OFFSET); in DAC960_PG_gen_intr()
2838 static inline void DAC960_PG_reset_ctrl(void __iomem *base) in DAC960_PG_reset_ctrl() argument
2840 writel(DAC960_PG_IDB_CTRL_RESET, base + DAC960_PG_IDB_OFFSET); in DAC960_PG_reset_ctrl()
2843 static inline void DAC960_PG_mem_mbox_new_cmd(void __iomem *base) in DAC960_PG_mem_mbox_new_cmd() argument
2845 writel(DAC960_PG_IDB_MMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET); in DAC960_PG_mem_mbox_new_cmd()
2848 static inline bool DAC960_PG_hw_mbox_is_full(void __iomem *base) in DAC960_PG_hw_mbox_is_full() argument
2850 unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET); in DAC960_PG_hw_mbox_is_full()
2855 static inline bool DAC960_PG_init_in_progress(void __iomem *base) in DAC960_PG_init_in_progress() argument
2857 unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET); in DAC960_PG_init_in_progress()
2862 static inline void DAC960_PG_ack_hw_mbox_intr(void __iomem *base) in DAC960_PG_ack_hw_mbox_intr() argument
2864 writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET); in DAC960_PG_ack_hw_mbox_intr()
2867 static inline void DAC960_PG_ack_mem_mbox_intr(void __iomem *base) in DAC960_PG_ack_mem_mbox_intr() argument
2869 writel(DAC960_PG_ODB_MMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET); in DAC960_PG_ack_mem_mbox_intr()
2872 static inline void DAC960_PG_ack_intr(void __iomem *base) in DAC960_PG_ack_intr() argument
2875 base + DAC960_PG_ODB_OFFSET); in DAC960_PG_ack_intr()
2878 static inline bool DAC960_PG_hw_mbox_status_available(void __iomem *base) in DAC960_PG_hw_mbox_status_available() argument
2880 unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET); in DAC960_PG_hw_mbox_status_available()
2885 static inline bool DAC960_PG_mem_mbox_status_available(void __iomem *base) in DAC960_PG_mem_mbox_status_available() argument
2887 unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET); in DAC960_PG_mem_mbox_status_available()
2892 static inline void DAC960_PG_enable_intr(void __iomem *base) in DAC960_PG_enable_intr() argument
2894 unsigned int imask = (unsigned int)-1; in DAC960_PG_enable_intr()
2897 writel(imask, base + DAC960_PG_IRQMASK_OFFSET); in DAC960_PG_enable_intr()
2900 static inline void DAC960_PG_disable_intr(void __iomem *base) in DAC960_PG_disable_intr() argument
2902 unsigned int imask = (unsigned int)-1; in DAC960_PG_disable_intr()
2904 writel(imask, base + DAC960_PG_IRQMASK_OFFSET); in DAC960_PG_disable_intr()
2907 static inline bool DAC960_PG_intr_enabled(void __iomem *base) in DAC960_PG_intr_enabled() argument
2909 unsigned int imask = readl(base + DAC960_PG_IRQMASK_OFFSET); in DAC960_PG_intr_enabled()
2917 mem_mbox->words[1] = mbox->words[1]; in DAC960_PG_write_cmd_mbox()
2918 mem_mbox->words[2] = mbox->words[2]; in DAC960_PG_write_cmd_mbox()
2919 mem_mbox->words[3] = mbox->words[3]; in DAC960_PG_write_cmd_mbox()
2922 mem_mbox->words[0] = mbox->words[0]; in DAC960_PG_write_cmd_mbox()
2927 static inline void DAC960_PG_write_hw_mbox(void __iomem *base, in DAC960_PG_write_hw_mbox() argument
2930 writel(mbox->words[0], base + DAC960_PG_CMDOP_OFFSET); in DAC960_PG_write_hw_mbox()
2931 writel(mbox->words[1], base + DAC960_PG_MBOX4_OFFSET); in DAC960_PG_write_hw_mbox()
2932 writel(mbox->words[2], base + DAC960_PG_MBOX8_OFFSET); in DAC960_PG_write_hw_mbox()
2933 writeb(mbox->bytes[12], base + DAC960_PG_MBOX12_OFFSET); in DAC960_PG_write_hw_mbox()
2937 DAC960_PG_read_status_cmd_ident(void __iomem *base) in DAC960_PG_read_status_cmd_ident() argument
2939 return readb(base + DAC960_PG_STSID_OFFSET); in DAC960_PG_read_status_cmd_ident()
2943 DAC960_PG_read_status(void __iomem *base) in DAC960_PG_read_status() argument
2945 return readw(base + DAC960_PG_STS_OFFSET); in DAC960_PG_read_status()
2949 DAC960_PG_read_error_status(void __iomem *base, unsigned char *error, in DAC960_PG_read_error_status() argument
2952 unsigned char errsts = readb(base + DAC960_PG_ERRSTS_OFFSET); in DAC960_PG_read_error_status()
2958 *param0 = readb(base + DAC960_PG_CMDOP_OFFSET); in DAC960_PG_read_error_status()
2959 *param1 = readb(base + DAC960_PG_CMDID_OFFSET); in DAC960_PG_read_error_status()
2960 writeb(0, base + DAC960_PG_ERRSTS_OFFSET); in DAC960_PG_read_error_status()
2965 DAC960_PG_mbox_init(struct pci_dev *pdev, void __iomem *base, in DAC960_PG_mbox_init() argument
2972 if (!DAC960_PG_hw_mbox_is_full(base)) in DAC960_PG_mbox_init()
2974 udelay(10); in DAC960_PG_mbox_init()
2977 if (DAC960_PG_hw_mbox_is_full(base)) { in DAC960_PG_mbox_init()
2978 dev_err(&pdev->dev, in DAC960_PG_mbox_init()
2982 DAC960_PG_write_hw_mbox(base, mbox); in DAC960_PG_mbox_init()
2983 DAC960_PG_hw_mbox_new_cmd(base); in DAC960_PG_mbox_init()
2987 if (DAC960_PG_hw_mbox_status_available(base)) in DAC960_PG_mbox_init()
2989 udelay(10); in DAC960_PG_mbox_init()
2992 if (!DAC960_PG_hw_mbox_status_available(base)) { in DAC960_PG_mbox_init()
2993 dev_err(&pdev->dev, in DAC960_PG_mbox_init()
2997 status = DAC960_PG_read_status(base); in DAC960_PG_mbox_init()
2998 DAC960_PG_ack_hw_mbox_intr(base); in DAC960_PG_mbox_init()
2999 DAC960_PG_ack_hw_mbox_status(base); in DAC960_PG_mbox_init()
3005 struct myrb_hba *cb, void __iomem *base) in DAC960_PG_hw_init() argument
3010 DAC960_PG_disable_intr(base); in DAC960_PG_hw_init()
3011 DAC960_PG_ack_hw_mbox_status(base); in DAC960_PG_hw_init()
3013 while (DAC960_PG_init_in_progress(base) && in DAC960_PG_hw_init()
3015 if (DAC960_PG_read_error_status(base, &error, in DAC960_PG_hw_init()
3018 return -EIO; in DAC960_PG_hw_init()
3019 udelay(10); in DAC960_PG_hw_init()
3023 dev_err(&pdev->dev, in DAC960_PG_hw_init()
3025 return -ETIMEDOUT; in DAC960_PG_hw_init()
3028 dev_err(&pdev->dev, in DAC960_PG_hw_init()
3030 DAC960_PG_reset_ctrl(base); in DAC960_PG_hw_init()
3031 return -ENODEV; in DAC960_PG_hw_init()
3033 DAC960_PG_enable_intr(base); in DAC960_PG_hw_init()
3034 cb->qcmd = myrb_qcmd; in DAC960_PG_hw_init()
3035 cb->write_cmd_mbox = DAC960_PG_write_cmd_mbox; in DAC960_PG_hw_init()
3036 if (cb->dual_mode_interface) in DAC960_PG_hw_init()
3037 cb->get_cmd_mbox = DAC960_PG_mem_mbox_new_cmd; in DAC960_PG_hw_init()
3039 cb->get_cmd_mbox = DAC960_PG_hw_mbox_new_cmd; in DAC960_PG_hw_init()
3040 cb->disable_intr = DAC960_PG_disable_intr; in DAC960_PG_hw_init()
3041 cb->reset = DAC960_PG_reset_ctrl; in DAC960_PG_hw_init()
3049 void __iomem *base = cb->io_base; in DAC960_PG_intr_handler() local
3053 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_PG_intr_handler()
3054 DAC960_PG_ack_intr(base); in DAC960_PG_intr_handler()
3055 next_stat_mbox = cb->next_stat_mbox; in DAC960_PG_intr_handler()
3056 while (next_stat_mbox->valid) { in DAC960_PG_intr_handler()
3057 unsigned char id = next_stat_mbox->id; in DAC960_PG_intr_handler()
3062 cmd_blk = &cb->dcmd_blk; in DAC960_PG_intr_handler()
3064 cmd_blk = &cb->mcmd_blk; in DAC960_PG_intr_handler()
3066 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_PG_intr_handler()
3071 cmd_blk->status = next_stat_mbox->status; in DAC960_PG_intr_handler()
3073 dev_err(&cb->pdev->dev, in DAC960_PG_intr_handler()
3077 if (++next_stat_mbox > cb->last_stat_mbox) in DAC960_PG_intr_handler()
3078 next_stat_mbox = cb->first_stat_mbox; in DAC960_PG_intr_handler()
3085 cb->next_stat_mbox = next_stat_mbox; in DAC960_PG_intr_handler()
3086 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_PG_intr_handler()
3101 static inline void DAC960_PD_hw_mbox_new_cmd(void __iomem *base) in DAC960_PD_hw_mbox_new_cmd() argument
3103 writeb(DAC960_PD_IDB_HWMBOX_NEW_CMD, base + DAC960_PD_IDB_OFFSET); in DAC960_PD_hw_mbox_new_cmd()
3106 static inline void DAC960_PD_ack_hw_mbox_status(void __iomem *base) in DAC960_PD_ack_hw_mbox_status() argument
3108 writeb(DAC960_PD_IDB_HWMBOX_ACK_STS, base + DAC960_PD_IDB_OFFSET); in DAC960_PD_ack_hw_mbox_status()
3111 static inline void DAC960_PD_gen_intr(void __iomem *base) in DAC960_PD_gen_intr() argument
3113 writeb(DAC960_PD_IDB_GEN_IRQ, base + DAC960_PD_IDB_OFFSET); in DAC960_PD_gen_intr()
3116 static inline void DAC960_PD_reset_ctrl(void __iomem *base) in DAC960_PD_reset_ctrl() argument
3118 writeb(DAC960_PD_IDB_CTRL_RESET, base + DAC960_PD_IDB_OFFSET); in DAC960_PD_reset_ctrl()
3121 static inline bool DAC960_PD_hw_mbox_is_full(void __iomem *base) in DAC960_PD_hw_mbox_is_full() argument
3123 unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET); in DAC960_PD_hw_mbox_is_full()
3128 static inline bool DAC960_PD_init_in_progress(void __iomem *base) in DAC960_PD_init_in_progress() argument
3130 unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET); in DAC960_PD_init_in_progress()
3135 static inline void DAC960_PD_ack_intr(void __iomem *base) in DAC960_PD_ack_intr() argument
3137 writeb(DAC960_PD_ODB_HWMBOX_ACK_IRQ, base + DAC960_PD_ODB_OFFSET); in DAC960_PD_ack_intr()
3140 static inline bool DAC960_PD_hw_mbox_status_available(void __iomem *base) in DAC960_PD_hw_mbox_status_available() argument
3142 unsigned char odb = readb(base + DAC960_PD_ODB_OFFSET); in DAC960_PD_hw_mbox_status_available()
3147 static inline void DAC960_PD_enable_intr(void __iomem *base) in DAC960_PD_enable_intr() argument
3149 writeb(DAC960_PD_IRQMASK_ENABLE_IRQ, base + DAC960_PD_IRQEN_OFFSET); in DAC960_PD_enable_intr()
3152 static inline void DAC960_PD_disable_intr(void __iomem *base) in DAC960_PD_disable_intr() argument
3154 writeb(0, base + DAC960_PD_IRQEN_OFFSET); in DAC960_PD_disable_intr()
3157 static inline bool DAC960_PD_intr_enabled(void __iomem *base) in DAC960_PD_intr_enabled() argument
3159 unsigned char imask = readb(base + DAC960_PD_IRQEN_OFFSET); in DAC960_PD_intr_enabled()
3164 static inline void DAC960_PD_write_cmd_mbox(void __iomem *base, in DAC960_PD_write_cmd_mbox() argument
3167 writel(mbox->words[0], base + DAC960_PD_CMDOP_OFFSET); in DAC960_PD_write_cmd_mbox()
3168 writel(mbox->words[1], base + DAC960_PD_MBOX4_OFFSET); in DAC960_PD_write_cmd_mbox()
3169 writel(mbox->words[2], base + DAC960_PD_MBOX8_OFFSET); in DAC960_PD_write_cmd_mbox()
3170 writeb(mbox->bytes[12], base + DAC960_PD_MBOX12_OFFSET); in DAC960_PD_write_cmd_mbox()
3174 DAC960_PD_read_status_cmd_ident(void __iomem *base) in DAC960_PD_read_status_cmd_ident() argument
3176 return readb(base + DAC960_PD_STSID_OFFSET); in DAC960_PD_read_status_cmd_ident()
3180 DAC960_PD_read_status(void __iomem *base) in DAC960_PD_read_status() argument
3182 return readw(base + DAC960_PD_STS_OFFSET); in DAC960_PD_read_status()
3186 DAC960_PD_read_error_status(void __iomem *base, unsigned char *error, in DAC960_PD_read_error_status() argument
3189 unsigned char errsts = readb(base + DAC960_PD_ERRSTS_OFFSET); in DAC960_PD_read_error_status()
3195 *param0 = readb(base + DAC960_PD_CMDOP_OFFSET); in DAC960_PD_read_error_status()
3196 *param1 = readb(base + DAC960_PD_CMDID_OFFSET); in DAC960_PD_read_error_status()
3197 writeb(0, base + DAC960_PD_ERRSTS_OFFSET); in DAC960_PD_read_error_status()
3203 void __iomem *base = cb->io_base; in DAC960_PD_qcmd() local
3204 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in DAC960_PD_qcmd()
3206 while (DAC960_PD_hw_mbox_is_full(base)) in DAC960_PD_qcmd()
3208 DAC960_PD_write_cmd_mbox(base, mbox); in DAC960_PD_qcmd()
3209 DAC960_PD_hw_mbox_new_cmd(base); in DAC960_PD_qcmd()
3213 struct myrb_hba *cb, void __iomem *base) in DAC960_PD_hw_init() argument
3218 if (!request_region(cb->io_addr, 0x80, "myrb")) { in DAC960_PD_hw_init()
3219 dev_err(&pdev->dev, "IO port 0x%lx busy\n", in DAC960_PD_hw_init()
3220 (unsigned long)cb->io_addr); in DAC960_PD_hw_init()
3221 return -EBUSY; in DAC960_PD_hw_init()
3223 DAC960_PD_disable_intr(base); in DAC960_PD_hw_init()
3224 DAC960_PD_ack_hw_mbox_status(base); in DAC960_PD_hw_init()
3226 while (DAC960_PD_init_in_progress(base) && in DAC960_PD_hw_init()
3228 if (DAC960_PD_read_error_status(base, &error, in DAC960_PD_hw_init()
3231 return -EIO; in DAC960_PD_hw_init()
3232 udelay(10); in DAC960_PD_hw_init()
3236 dev_err(&pdev->dev, in DAC960_PD_hw_init()
3238 return -ETIMEDOUT; in DAC960_PD_hw_init()
3241 dev_err(&pdev->dev, in DAC960_PD_hw_init()
3243 DAC960_PD_reset_ctrl(base); in DAC960_PD_hw_init()
3244 return -ENODEV; in DAC960_PD_hw_init()
3246 DAC960_PD_enable_intr(base); in DAC960_PD_hw_init()
3247 cb->qcmd = DAC960_PD_qcmd; in DAC960_PD_hw_init()
3248 cb->disable_intr = DAC960_PD_disable_intr; in DAC960_PD_hw_init()
3249 cb->reset = DAC960_PD_reset_ctrl; in DAC960_PD_hw_init()
3257 void __iomem *base = cb->io_base; in DAC960_PD_intr_handler() local
3260 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_PD_intr_handler()
3261 while (DAC960_PD_hw_mbox_status_available(base)) { in DAC960_PD_intr_handler()
3262 unsigned char id = DAC960_PD_read_status_cmd_ident(base); in DAC960_PD_intr_handler()
3267 cmd_blk = &cb->dcmd_blk; in DAC960_PD_intr_handler()
3269 cmd_blk = &cb->mcmd_blk; in DAC960_PD_intr_handler()
3271 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_PD_intr_handler()
3276 cmd_blk->status = DAC960_PD_read_status(base); in DAC960_PD_intr_handler()
3278 dev_err(&cb->pdev->dev, in DAC960_PD_intr_handler()
3281 DAC960_PD_ack_intr(base); in DAC960_PD_intr_handler()
3282 DAC960_PD_ack_hw_mbox_status(base); in DAC960_PD_intr_handler()
3289 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_PD_intr_handler()
3322 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_translate_to_rw_command()
3323 int ldev_num = mbox->type5.ld.ldev_num; in myrb_translate_to_rw_command()
3325 mbox->bytes[3] &= 0x7; in myrb_translate_to_rw_command()
3326 mbox->bytes[3] |= mbox->bytes[7] << 6; in myrb_translate_to_rw_command()
3327 mbox->bytes[7] = ldev_num; in myrb_translate_to_rw_command()
3332 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in myrb_translate_from_rw_command()
3333 int ldev_num = mbox->bytes[7]; in myrb_translate_from_rw_command()
3335 mbox->bytes[7] = mbox->bytes[3] >> 6; in myrb_translate_from_rw_command()
3336 mbox->bytes[3] &= 0x7; in myrb_translate_from_rw_command()
3337 mbox->bytes[3] |= ldev_num << 3; in myrb_translate_from_rw_command()
3342 void __iomem *base = cb->io_base; in DAC960_P_qcmd() local
3343 union myrb_cmd_mbox *mbox = &cmd_blk->mbox; in DAC960_P_qcmd()
3345 switch (mbox->common.opcode) { in DAC960_P_qcmd()
3347 mbox->common.opcode = MYRB_CMD_ENQUIRY_OLD; in DAC960_P_qcmd()
3350 mbox->common.opcode = MYRB_CMD_GET_DEVICE_STATE_OLD; in DAC960_P_qcmd()
3353 mbox->common.opcode = MYRB_CMD_READ_OLD; in DAC960_P_qcmd()
3357 mbox->common.opcode = MYRB_CMD_WRITE_OLD; in DAC960_P_qcmd()
3361 mbox->common.opcode = MYRB_CMD_READ_SG_OLD; in DAC960_P_qcmd()
3365 mbox->common.opcode = MYRB_CMD_WRITE_SG_OLD; in DAC960_P_qcmd()
3371 while (DAC960_PD_hw_mbox_is_full(base)) in DAC960_P_qcmd()
3373 DAC960_PD_write_cmd_mbox(base, mbox); in DAC960_P_qcmd()
3374 DAC960_PD_hw_mbox_new_cmd(base); in DAC960_P_qcmd()
3379 struct myrb_hba *cb, void __iomem *base) in DAC960_P_hw_init() argument
3384 if (!request_region(cb->io_addr, 0x80, "myrb")) { in DAC960_P_hw_init()
3385 dev_err(&pdev->dev, "IO port 0x%lx busy\n", in DAC960_P_hw_init()
3386 (unsigned long)cb->io_addr); in DAC960_P_hw_init()
3387 return -EBUSY; in DAC960_P_hw_init()
3389 DAC960_PD_disable_intr(base); in DAC960_P_hw_init()
3390 DAC960_PD_ack_hw_mbox_status(base); in DAC960_P_hw_init()
3392 while (DAC960_PD_init_in_progress(base) && in DAC960_P_hw_init()
3394 if (DAC960_PD_read_error_status(base, &error, in DAC960_P_hw_init()
3397 return -EAGAIN; in DAC960_P_hw_init()
3398 udelay(10); in DAC960_P_hw_init()
3402 dev_err(&pdev->dev, in DAC960_P_hw_init()
3404 return -ETIMEDOUT; in DAC960_P_hw_init()
3407 dev_err(&pdev->dev, in DAC960_P_hw_init()
3409 DAC960_PD_reset_ctrl(base); in DAC960_P_hw_init()
3410 return -ETIMEDOUT; in DAC960_P_hw_init()
3412 DAC960_PD_enable_intr(base); in DAC960_P_hw_init()
3413 cb->qcmd = DAC960_P_qcmd; in DAC960_P_hw_init()
3414 cb->disable_intr = DAC960_PD_disable_intr; in DAC960_P_hw_init()
3415 cb->reset = DAC960_PD_reset_ctrl; in DAC960_P_hw_init()
3423 void __iomem *base = cb->io_base; in DAC960_P_intr_handler() local
3426 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_P_intr_handler()
3427 while (DAC960_PD_hw_mbox_status_available(base)) { in DAC960_P_intr_handler()
3428 unsigned char id = DAC960_PD_read_status_cmd_ident(base); in DAC960_P_intr_handler()
3436 cmd_blk = &cb->dcmd_blk; in DAC960_P_intr_handler()
3438 cmd_blk = &cb->mcmd_blk; in DAC960_P_intr_handler()
3440 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_P_intr_handler()
3445 cmd_blk->status = DAC960_PD_read_status(base); in DAC960_P_intr_handler()
3447 dev_err(&cb->pdev->dev, in DAC960_P_intr_handler()
3450 DAC960_PD_ack_intr(base); in DAC960_P_intr_handler()
3451 DAC960_PD_ack_hw_mbox_status(base); in DAC960_P_intr_handler()
3456 mbox = &cmd_blk->mbox; in DAC960_P_intr_handler()
3457 op = mbox->common.opcode; in DAC960_P_intr_handler()
3460 mbox->common.opcode = MYRB_CMD_ENQUIRY; in DAC960_P_intr_handler()
3461 myrb_translate_enquiry(cb->enquiry); in DAC960_P_intr_handler()
3464 mbox->common.opcode = MYRB_CMD_READ; in DAC960_P_intr_handler()
3468 mbox->common.opcode = MYRB_CMD_WRITE; in DAC960_P_intr_handler()
3472 mbox->common.opcode = MYRB_CMD_READ_SG; in DAC960_P_intr_handler()
3476 mbox->common.opcode = MYRB_CMD_WRITE_SG; in DAC960_P_intr_handler()
3487 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_P_intr_handler()
3501 (struct myrb_privdata *)entry->driver_data; in myrb_detect()
3502 irq_handler_t irq_handler = privdata->irq_handler; in myrb_detect()
3503 unsigned int mmio_size = privdata->mmio_size; in myrb_detect()
3509 dev_err(&pdev->dev, "Unable to allocate Controller\n"); in myrb_detect()
3512 shost->max_cmd_len = 12; in myrb_detect()
3513 shost->max_lun = 256; in myrb_detect()
3515 mutex_init(&cb->dcmd_mutex); in myrb_detect()
3516 mutex_init(&cb->dma_mutex); in myrb_detect()
3517 cb->pdev = pdev; in myrb_detect()
3522 if (privdata->hw_init == DAC960_PD_hw_init || in myrb_detect()
3523 privdata->hw_init == DAC960_P_hw_init) { in myrb_detect()
3524 cb->io_addr = pci_resource_start(pdev, 0); in myrb_detect()
3525 cb->pci_addr = pci_resource_start(pdev, 1); in myrb_detect()
3527 cb->pci_addr = pci_resource_start(pdev, 0); in myrb_detect()
3530 spin_lock_init(&cb->queue_lock); in myrb_detect()
3533 cb->mmio_base = ioremap(cb->pci_addr & PAGE_MASK, mmio_size); in myrb_detect()
3534 if (cb->mmio_base == NULL) { in myrb_detect()
3535 dev_err(&pdev->dev, in myrb_detect()
3540 cb->io_base = cb->mmio_base + (cb->pci_addr & ~PAGE_MASK); in myrb_detect()
3541 if (privdata->hw_init(pdev, cb, cb->io_base)) in myrb_detect()
3544 if (request_irq(pdev->irq, irq_handler, IRQF_SHARED, "myrb", cb) < 0) { in myrb_detect()
3545 dev_err(&pdev->dev, in myrb_detect()
3546 "Unable to acquire IRQ Channel %d\n", pdev->irq); in myrb_detect()
3549 cb->irq = pdev->irq; in myrb_detect()
3553 dev_err(&pdev->dev, in myrb_detect()
3566 return -ENODEV; in myrb_probe()
3575 ret = -ENOMEM; in myrb_probe()
3579 ret = scsi_add_host(cb->host, &dev->dev); in myrb_probe()
3581 dev_err(&dev->dev, "scsi_add_host failed with %d\n", ret); in myrb_probe()
3585 scsi_scan_host(cb->host); in myrb_probe()
3597 shost_printk(KERN_NOTICE, cb->host, "Flushing Cache..."); in myrb_remove()
3639 return -ENODEV; in myrb_init_module()