Lines Matching refs:cb
90 static bool myrb_create_mempools(struct pci_dev *pdev, struct myrb_hba *cb) in myrb_create_mempools() argument
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 cb->work_q = alloc_ordered_workqueue("myrb_wq_%d", WQ_MEM_RECLAIM, in myrb_create_mempools()
116 cb->host->host_no); in myrb_create_mempools()
117 if (!cb->work_q) { in myrb_create_mempools()
118 dma_pool_destroy(cb->dcdb_pool); in myrb_create_mempools()
119 cb->dcdb_pool = NULL; in myrb_create_mempools()
120 dma_pool_destroy(cb->sg_pool); in myrb_create_mempools()
121 cb->sg_pool = NULL; in myrb_create_mempools()
122 shost_printk(KERN_ERR, cb->host, in myrb_create_mempools()
130 INIT_DELAYED_WORK(&cb->monitor_work, myrb_monitor); in myrb_create_mempools()
131 queue_delayed_work(cb->work_q, &cb->monitor_work, 1); in myrb_create_mempools()
139 static void myrb_destroy_mempools(struct myrb_hba *cb) in myrb_destroy_mempools() argument
141 cancel_delayed_work_sync(&cb->monitor_work); in myrb_destroy_mempools()
142 destroy_workqueue(cb->work_q); in myrb_destroy_mempools()
144 dma_pool_destroy(cb->sg_pool); in myrb_destroy_mempools()
145 dma_pool_destroy(cb->dcdb_pool); in myrb_destroy_mempools()
162 static void myrb_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk) in myrb_qcmd() argument
164 void __iomem *base = cb->io_base; in myrb_qcmd()
166 union myrb_cmd_mbox *next_mbox = cb->next_cmd_mbox; in myrb_qcmd()
168 cb->write_cmd_mbox(next_mbox, mbox); in myrb_qcmd()
169 if (cb->prev_cmd_mbox1->words[0] == 0 || in myrb_qcmd()
170 cb->prev_cmd_mbox2->words[0] == 0) in myrb_qcmd()
171 cb->get_cmd_mbox(base); in myrb_qcmd()
172 cb->prev_cmd_mbox2 = cb->prev_cmd_mbox1; in myrb_qcmd()
173 cb->prev_cmd_mbox1 = next_mbox; in myrb_qcmd()
174 if (++next_mbox > cb->last_cmd_mbox) in myrb_qcmd()
175 next_mbox = cb->first_cmd_mbox; in myrb_qcmd()
176 cb->next_cmd_mbox = next_mbox; in myrb_qcmd()
184 static unsigned short myrb_exec_cmd(struct myrb_hba *cb, in myrb_exec_cmd() argument
192 spin_lock_irqsave(&cb->queue_lock, flags); in myrb_exec_cmd()
193 cb->qcmd(cb, cmd_blk); in myrb_exec_cmd()
194 spin_unlock_irqrestore(&cb->queue_lock, flags); in myrb_exec_cmd()
205 static unsigned short myrb_exec_type3(struct myrb_hba *cb, in myrb_exec_type3() argument
208 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk; in myrb_exec_type3()
212 mutex_lock(&cb->dcmd_mutex); in myrb_exec_type3()
217 status = myrb_exec_cmd(cb, cmd_blk); in myrb_exec_type3()
218 mutex_unlock(&cb->dcmd_mutex); in myrb_exec_type3()
227 static unsigned short myrb_exec_type3D(struct myrb_hba *cb, in myrb_exec_type3D() argument
231 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk; in myrb_exec_type3D()
236 pdev_info_addr = dma_map_single(&cb->pdev->dev, pdev_info, in myrb_exec_type3D()
239 if (dma_mapping_error(&cb->pdev->dev, pdev_info_addr)) in myrb_exec_type3D()
242 mutex_lock(&cb->dcmd_mutex); in myrb_exec_type3D()
249 status = myrb_exec_cmd(cb, cmd_blk); in myrb_exec_type3D()
250 mutex_unlock(&cb->dcmd_mutex); in myrb_exec_type3D()
251 dma_unmap_single(&cb->pdev->dev, pdev_info_addr, in myrb_exec_type3D()
283 static void myrb_get_event(struct myrb_hba *cb, unsigned int event) in myrb_get_event() argument
285 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_event()
291 ev_buf = dma_alloc_coherent(&cb->pdev->dev, in myrb_get_event()
304 status = myrb_exec_cmd(cb, cmd_blk); in myrb_get_event()
306 shost_printk(KERN_INFO, cb->host, in myrb_get_event()
319 shost_printk(KERN_CRIT, cb->host, in myrb_get_event()
324 shost_printk(KERN_CRIT, cb->host, in myrb_get_event()
330 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_log_entry), in myrb_get_event()
339 static void myrb_get_errtable(struct myrb_hba *cb) in myrb_get_errtable() argument
341 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_errtable()
346 memcpy(&old_table, cb->err_table, sizeof(old_table)); in myrb_get_errtable()
351 mbox->type3.addr = cb->err_table_addr; in myrb_get_errtable()
352 status = myrb_exec_cmd(cb, cmd_blk); in myrb_get_errtable()
354 struct myrb_error_entry *table = cb->err_table; in myrb_get_errtable()
359 shost_for_each_device(sdev, cb->host) { in myrb_get_errtable()
360 if (sdev->channel >= myrb_logical_channel(cb->host)) in myrb_get_errtable()
386 static unsigned short myrb_get_ldev_info(struct myrb_hba *cb) in myrb_get_ldev_info() argument
389 int ldev_num, ldev_cnt = cb->enquiry->ldev_count; in myrb_get_ldev_info()
390 struct Scsi_Host *shost = cb->host; in myrb_get_ldev_info()
392 status = myrb_exec_type3(cb, MYRB_CMD_GET_LDEV_INFO, in myrb_get_ldev_info()
393 cb->ldev_info_addr); in myrb_get_ldev_info()
399 struct myrb_ldev_info *new = cb->ldev_info_buf + ldev_num; in myrb_get_ldev_info()
437 static unsigned short myrb_get_rbld_progress(struct myrb_hba *cb, in myrb_get_rbld_progress() argument
440 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_rbld_progress()
446 rbld_buf = dma_alloc_coherent(&cb->pdev->dev, in myrb_get_rbld_progress()
456 status = myrb_exec_cmd(cb, cmd_blk); in myrb_get_rbld_progress()
459 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress), in myrb_get_rbld_progress()
469 static void myrb_update_rbld_progress(struct myrb_hba *cb) in myrb_update_rbld_progress() argument
474 status = myrb_get_rbld_progress(cb, &rbld_buf); in myrb_update_rbld_progress()
476 cb->last_rbld_status == MYRB_STATUS_SUCCESS) in myrb_update_rbld_progress()
483 sdev = scsi_device_lookup(cb->host, in myrb_update_rbld_progress()
484 myrb_logical_channel(cb->host), in myrb_update_rbld_progress()
521 cb->last_rbld_status = status; in myrb_update_rbld_progress()
530 static void myrb_get_cc_progress(struct myrb_hba *cb) in myrb_get_cc_progress() argument
532 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_get_cc_progress()
538 rbld_buf = dma_alloc_coherent(&cb->pdev->dev, in myrb_get_cc_progress()
542 cb->need_cc_status = true; in myrb_get_cc_progress()
549 status = myrb_exec_cmd(cb, cmd_blk); in myrb_get_cc_progress()
557 sdev = scsi_device_lookup(cb->host, in myrb_get_cc_progress()
558 myrb_logical_channel(cb->host), in myrb_get_cc_progress()
568 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress), in myrb_get_cc_progress()
577 static void myrb_bgi_control(struct myrb_hba *cb) in myrb_bgi_control() argument
579 struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk; in myrb_bgi_control()
586 bgi = dma_alloc_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status), in myrb_bgi_control()
589 shost_printk(KERN_ERR, cb->host, in myrb_bgi_control()
598 status = myrb_exec_cmd(cb, cmd_blk); in myrb_bgi_control()
599 last_bgi = &cb->bgi_status; in myrb_bgi_control()
600 sdev = scsi_device_lookup(cb->host, in myrb_bgi_control()
601 myrb_logical_channel(cb->host), in myrb_bgi_control()
638 memcpy(&cb->bgi_status, bgi, sizeof(struct myrb_bgi_status)); in myrb_bgi_control()
641 if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS) in myrb_bgi_control()
644 cb->bgi_status.status = MYRB_BGI_INVALID; in myrb_bgi_control()
647 if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS) in myrb_bgi_control()
652 cb->bgi_status.status = MYRB_BGI_INVALID; in myrb_bgi_control()
657 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status), in myrb_bgi_control()
668 static unsigned short myrb_hba_enquiry(struct myrb_hba *cb) in myrb_hba_enquiry() argument
673 memcpy(&old, cb->enquiry, sizeof(struct myrb_enquiry)); in myrb_hba_enquiry()
675 status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY, cb->enquiry_addr); in myrb_hba_enquiry()
679 new = cb->enquiry; in myrb_hba_enquiry()
684 shost_printk(KERN_CRIT, cb->host, in myrb_hba_enquiry()
692 shost_printk(KERN_CRIT, cb->host, in myrb_hba_enquiry()
697 shost_printk(KERN_CRIT, cb->host, in myrb_hba_enquiry()
701 cb->new_ev_seq = new->ev_seq; in myrb_hba_enquiry()
702 cb->need_err_info = true; in myrb_hba_enquiry()
703 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
705 cb->old_ev_seq, cb->new_ev_seq, in myrb_hba_enquiry()
713 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
718 cb->need_ldev_info = true; in myrb_hba_enquiry()
722 time_after_eq(jiffies, cb->secondary_monitor_time in myrb_hba_enquiry()
724 cb->need_bgi_status = cb->bgi_status_supported; in myrb_hba_enquiry()
725 cb->secondary_monitor_time = jiffies; in myrb_hba_enquiry()
731 cb->need_rbld = true; in myrb_hba_enquiry()
732 cb->rbld_first = (new->ldev_critical < old.ldev_critical); in myrb_hba_enquiry()
737 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
744 cb->need_cc_status = true; in myrb_hba_enquiry()
747 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
751 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
755 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
759 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
763 shost_printk(KERN_INFO, cb->host, in myrb_hba_enquiry()
768 cb->need_cc_status = true; in myrb_hba_enquiry()
778 static unsigned short myrb_set_pdev_state(struct myrb_hba *cb, in myrb_set_pdev_state() argument
781 struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk; in myrb_set_pdev_state()
785 mutex_lock(&cb->dcmd_mutex); in myrb_set_pdev_state()
791 status = myrb_exec_cmd(cb, cmd_blk); in myrb_set_pdev_state()
792 mutex_unlock(&cb->dcmd_mutex); in myrb_set_pdev_state()
805 static bool myrb_enable_mmio(struct myrb_hba *cb, mbox_mmio_init_t mmio_init_fn) in myrb_enable_mmio() argument
807 void __iomem *base = cb->io_base; in myrb_enable_mmio()
808 struct pci_dev *pdev = cb->pdev; in myrb_enable_mmio()
823 cb->enquiry = dma_alloc_coherent(&pdev->dev, in myrb_enable_mmio()
825 &cb->enquiry_addr, GFP_KERNEL); in myrb_enable_mmio()
826 if (!cb->enquiry) in myrb_enable_mmio()
831 cb->err_table = dma_alloc_coherent(&pdev->dev, err_table_size, in myrb_enable_mmio()
832 &cb->err_table_addr, GFP_KERNEL); in myrb_enable_mmio()
833 if (!cb->err_table) in myrb_enable_mmio()
837 cb->ldev_info_buf = dma_alloc_coherent(&pdev->dev, ldev_info_size, in myrb_enable_mmio()
838 &cb->ldev_info_addr, GFP_KERNEL); in myrb_enable_mmio()
839 if (!cb->ldev_info_buf) in myrb_enable_mmio()
849 cb->cmd_mbox_size = MYRB_CMD_MBOX_COUNT * sizeof(union myrb_cmd_mbox); in myrb_enable_mmio()
850 cb->first_cmd_mbox = dma_alloc_coherent(&pdev->dev, in myrb_enable_mmio()
851 cb->cmd_mbox_size, in myrb_enable_mmio()
852 &cb->cmd_mbox_addr, in myrb_enable_mmio()
854 if (!cb->first_cmd_mbox) in myrb_enable_mmio()
857 cmd_mbox_mem = cb->first_cmd_mbox; in myrb_enable_mmio()
859 cb->last_cmd_mbox = cmd_mbox_mem; in myrb_enable_mmio()
860 cb->next_cmd_mbox = cb->first_cmd_mbox; in myrb_enable_mmio()
861 cb->prev_cmd_mbox1 = cb->last_cmd_mbox; in myrb_enable_mmio()
862 cb->prev_cmd_mbox2 = cb->last_cmd_mbox - 1; in myrb_enable_mmio()
865 cb->stat_mbox_size = MYRB_STAT_MBOX_COUNT * in myrb_enable_mmio()
867 cb->first_stat_mbox = dma_alloc_coherent(&pdev->dev, in myrb_enable_mmio()
868 cb->stat_mbox_size, in myrb_enable_mmio()
869 &cb->stat_mbox_addr, in myrb_enable_mmio()
871 if (!cb->first_stat_mbox) in myrb_enable_mmio()
874 stat_mbox_mem = cb->first_stat_mbox; in myrb_enable_mmio()
876 cb->last_stat_mbox = stat_mbox_mem; in myrb_enable_mmio()
877 cb->next_stat_mbox = cb->first_stat_mbox; in myrb_enable_mmio()
880 cb->dual_mode_interface = true; in myrb_enable_mmio()
884 mbox.typeX.cmd_mbox_addr = cb->cmd_mbox_addr; in myrb_enable_mmio()
885 mbox.typeX.stat_mbox_addr = cb->stat_mbox_addr; in myrb_enable_mmio()
889 cb->dual_mode_interface = false; in myrb_enable_mmio()
910 static int myrb_get_hba_config(struct myrb_hba *cb) in myrb_get_hba_config() argument
916 struct Scsi_Host *shost = cb->host; in myrb_get_hba_config()
917 struct pci_dev *pdev = cb->pdev; in myrb_get_hba_config()
925 shost_printk(KERN_ERR, cb->host, in myrb_get_hba_config()
932 shost_printk(KERN_ERR, cb->host, in myrb_get_hba_config()
938 mutex_lock(&cb->dma_mutex); in myrb_get_hba_config()
939 status = myrb_hba_enquiry(cb); in myrb_get_hba_config()
940 mutex_unlock(&cb->dma_mutex); in myrb_get_hba_config()
942 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
947 status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY2, enquiry2_addr); in myrb_get_hba_config()
949 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
954 status = myrb_exec_type3(cb, MYRB_CMD_READ_CONFIG2, config2_addr); in myrb_get_hba_config()
956 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
961 status = myrb_get_ldev_info(cb); in myrb_get_hba_config()
963 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
974 strcpy(cb->model_name, "DAC960PU"); in myrb_get_hba_config()
976 strcpy(cb->model_name, "DAC960PD"); in myrb_get_hba_config()
979 strcpy(cb->model_name, "DAC960PL"); in myrb_get_hba_config()
982 strcpy(cb->model_name, "DAC960PG"); in myrb_get_hba_config()
985 strcpy(cb->model_name, "DAC960PJ"); in myrb_get_hba_config()
988 strcpy(cb->model_name, "DAC960PR"); in myrb_get_hba_config()
991 strcpy(cb->model_name, "DAC960PT"); in myrb_get_hba_config()
994 strcpy(cb->model_name, "DAC960PTL0"); in myrb_get_hba_config()
997 strcpy(cb->model_name, "DAC960PRL"); in myrb_get_hba_config()
1000 strcpy(cb->model_name, "DAC960PTL1"); in myrb_get_hba_config()
1003 strcpy(cb->model_name, "eXtremeRAID 1100"); in myrb_get_hba_config()
1006 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
1044 enquiry2->fw.major_version = cb->enquiry->fw_major_version; in myrb_get_hba_config()
1045 enquiry2->fw.minor_version = cb->enquiry->fw_minor_version; in myrb_get_hba_config()
1049 snprintf(cb->fw_version, sizeof(cb->fw_version), in myrb_get_hba_config()
1062 strcmp(cb->fw_version, FIRMWARE_27X) >= 0))) { in myrb_get_hba_config()
1063 shost_printk(KERN_WARNING, cb->host, in myrb_get_hba_config()
1065 cb->fw_version); in myrb_get_hba_config()
1089 cb->bus_width = 32; in myrb_get_hba_config()
1091 cb->bus_width = 16; in myrb_get_hba_config()
1093 cb->bus_width = 8; in myrb_get_hba_config()
1094 cb->ldev_block_size = enquiry2->ldev_block_size; in myrb_get_hba_config()
1098 cb->safte_enabled = (enquiry2->fault_mgmt == MYRB_FAULT_SAFTE); in myrb_get_hba_config()
1107 shost->can_queue = cb->enquiry->max_tcq; in myrb_get_hba_config()
1123 cb->stripe_size = config2->blocks_per_stripe * config2->block_factor in myrb_get_hba_config()
1125 cb->segment_size = config2->blocks_per_cacheline * config2->block_factor in myrb_get_hba_config()
1128 cb->ldev_geom_heads = 255; in myrb_get_hba_config()
1129 cb->ldev_geom_sectors = 63; in myrb_get_hba_config()
1131 cb->ldev_geom_heads = 128; in myrb_get_hba_config()
1132 cb->ldev_geom_sectors = 32; in myrb_get_hba_config()
1138 if ((cb->fw_version[0] == '4' && in myrb_get_hba_config()
1139 strcmp(cb->fw_version, "4.08") >= 0) || in myrb_get_hba_config()
1140 (cb->fw_version[0] == '5' && in myrb_get_hba_config()
1141 strcmp(cb->fw_version, "5.08") >= 0)) { in myrb_get_hba_config()
1142 cb->bgi_status_supported = true; in myrb_get_hba_config()
1143 myrb_bgi_control(cb); in myrb_get_hba_config()
1145 cb->last_rbld_status = MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS; in myrb_get_hba_config()
1149 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1150 "Configuring %s PCI RAID Controller\n", cb->model_name); in myrb_get_hba_config()
1151 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1153 cb->fw_version, memsize); in myrb_get_hba_config()
1154 if (cb->io_addr == 0) in myrb_get_hba_config()
1155 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1157 (unsigned long)cb->pci_addr, cb->irq); in myrb_get_hba_config()
1159 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1161 (unsigned long)cb->io_addr, (unsigned long)cb->pci_addr, in myrb_get_hba_config()
1162 cb->irq); in myrb_get_hba_config()
1163 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1165 cb->host->can_queue, cb->host->max_sectors); in myrb_get_hba_config()
1166 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1168 cb->host->can_queue, cb->host->sg_tablesize, in myrb_get_hba_config()
1170 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1172 cb->stripe_size, cb->segment_size, in myrb_get_hba_config()
1173 cb->ldev_geom_heads, cb->ldev_geom_sectors, in myrb_get_hba_config()
1174 cb->safte_enabled ? in myrb_get_hba_config()
1176 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1178 pchan_cur, pchan_max, 0, cb->enquiry->pdev_dead, in myrb_get_hba_config()
1179 cb->host->max_id); in myrb_get_hba_config()
1181 shost_printk(KERN_INFO, cb->host, in myrb_get_hba_config()
1183 cb->enquiry->ldev_count, MYRB_MAX_LDEVS); in myrb_get_hba_config()
1197 static void myrb_unmap(struct myrb_hba *cb) in myrb_unmap() argument
1199 if (cb->ldev_info_buf) { in myrb_unmap()
1202 dma_free_coherent(&cb->pdev->dev, ldev_info_size, in myrb_unmap()
1203 cb->ldev_info_buf, cb->ldev_info_addr); in myrb_unmap()
1204 cb->ldev_info_buf = NULL; in myrb_unmap()
1206 if (cb->err_table) { in myrb_unmap()
1209 dma_free_coherent(&cb->pdev->dev, err_table_size, in myrb_unmap()
1210 cb->err_table, cb->err_table_addr); in myrb_unmap()
1211 cb->err_table = NULL; in myrb_unmap()
1213 if (cb->enquiry) { in myrb_unmap()
1214 dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_enquiry), in myrb_unmap()
1215 cb->enquiry, cb->enquiry_addr); in myrb_unmap()
1216 cb->enquiry = NULL; in myrb_unmap()
1218 if (cb->first_stat_mbox) { in myrb_unmap()
1219 dma_free_coherent(&cb->pdev->dev, cb->stat_mbox_size, in myrb_unmap()
1220 cb->first_stat_mbox, cb->stat_mbox_addr); in myrb_unmap()
1221 cb->first_stat_mbox = NULL; in myrb_unmap()
1223 if (cb->first_cmd_mbox) { in myrb_unmap()
1224 dma_free_coherent(&cb->pdev->dev, cb->cmd_mbox_size, in myrb_unmap()
1225 cb->first_cmd_mbox, cb->cmd_mbox_addr); in myrb_unmap()
1226 cb->first_cmd_mbox = NULL; in myrb_unmap()
1233 static void myrb_cleanup(struct myrb_hba *cb) in myrb_cleanup() argument
1235 struct pci_dev *pdev = cb->pdev; in myrb_cleanup()
1238 myrb_unmap(cb); in myrb_cleanup()
1240 if (cb->mmio_base) { in myrb_cleanup()
1241 if (cb->disable_intr) in myrb_cleanup()
1242 cb->disable_intr(cb->io_base); in myrb_cleanup()
1243 iounmap(cb->mmio_base); in myrb_cleanup()
1245 if (cb->irq) in myrb_cleanup()
1246 free_irq(cb->irq, cb); in myrb_cleanup()
1247 if (cb->io_addr) in myrb_cleanup()
1248 release_region(cb->io_addr, 0x80); in myrb_cleanup()
1251 scsi_host_put(cb->host); in myrb_cleanup()
1257 struct myrb_hba *cb = shost_priv(shost); in myrb_host_reset() local
1259 cb->reset(cb->io_base); in myrb_host_reset()
1267 struct myrb_hba *cb = shost_priv(shost); in myrb_pthru_queuecommand() local
1278 dcdb = dma_pool_alloc(cb->dcdb_pool, GFP_ATOMIC, &dcdb_addr); in myrb_pthru_queuecommand()
1283 dma_pool_free(cb->dcdb_pool, dcdb, dcdb_addr); in myrb_pthru_queuecommand()
1332 spin_lock_irqsave(&cb->queue_lock, flags); in myrb_pthru_queuecommand()
1333 cb->qcmd(cb, cmd_blk); in myrb_pthru_queuecommand()
1334 spin_unlock_irqrestore(&cb->queue_lock, flags); in myrb_pthru_queuecommand()
1338 static void myrb_inquiry(struct myrb_hba *cb, in myrb_inquiry() argument
1349 if (cb->bus_width > 16) in myrb_inquiry()
1351 if (cb->bus_width > 8) in myrb_inquiry()
1353 memcpy(&inq[16], cb->model_name, 16); in myrb_inquiry()
1354 memcpy(&inq[32], cb->fw_version, 1); in myrb_inquiry()
1355 memcpy(&inq[33], &cb->fw_version[2], 2); in myrb_inquiry()
1356 memcpy(&inq[35], &cb->fw_version[7], 1); in myrb_inquiry()
1362 myrb_mode_sense(struct myrb_hba *cb, struct scsi_cmnd *scmd, in myrb_mode_sense() argument
1384 put_unaligned_be32(cb->ldev_block_size, &block_desc[5]); in myrb_mode_sense()
1390 if (cb->segment_size) { in myrb_mode_sense()
1392 put_unaligned_be16(cb->segment_size, &mode_pg[14]); in myrb_mode_sense()
1398 static void myrb_request_sense(struct myrb_hba *cb, in myrb_request_sense() argument
1406 static void myrb_read_capacity(struct myrb_hba *cb, struct scsi_cmnd *scmd, in myrb_read_capacity() argument
1413 ldev_info->size, cb->ldev_block_size); in myrb_read_capacity()
1415 put_unaligned_be32(cb->ldev_block_size, &data[4]); in myrb_read_capacity()
1422 struct myrb_hba *cb = shost_priv(shost); in myrb_ldev_queuecommand() local
1452 myrb_inquiry(cb, scmd); in myrb_ldev_queuecommand()
1467 myrb_mode_sense(cb, scmd, ldev_info); in myrb_ldev_queuecommand()
1487 myrb_read_capacity(cb, scmd, ldev_info); in myrb_ldev_queuecommand()
1491 myrb_request_sense(cb, scmd); in myrb_ldev_queuecommand()
1574 hw_sgl = dma_pool_alloc(cb->sg_pool, GFP_ATOMIC, &hw_sgl_addr); in myrb_ldev_queuecommand()
1599 spin_lock_irqsave(&cb->queue_lock, flags); in myrb_ldev_queuecommand()
1600 cb->qcmd(cb, cmd_blk); in myrb_ldev_queuecommand()
1601 spin_unlock_irqrestore(&cb->queue_lock, flags); in myrb_ldev_queuecommand()
1624 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_ldev_sdev_init() local
1629 ldev_info = cb->ldev_info_buf + ldev_num; in myrb_ldev_sdev_init()
1668 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_pdev_sdev_init() local
1679 status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE, in myrb_pdev_sdev_init()
1751 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_biosparam() local
1753 geom[0] = cb->ldev_geom_heads; in myrb_biosparam()
1754 geom[1] = cb->ldev_geom_sectors; in myrb_biosparam()
1764 struct myrb_hba *cb = shost_priv(sdev->host); in raid_state_show() local
1785 status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE, in raid_state_show()
1809 struct myrb_hba *cb = shost_priv(sdev->host); in raid_state_store() local
1839 status = myrb_set_pdev_state(cb, sdev, new_state); in raid_state_store()
1899 struct myrb_hba *cb = shost_priv(sdev->host); in rebuild_show() local
1906 status = myrb_get_rbld_progress(cb, &rbld_buf); in rebuild_show()
1921 struct myrb_hba *cb = shost_priv(sdev->host); in rebuild_store() local
1935 status = myrb_get_rbld_progress(cb, NULL); in rebuild_store()
1942 mutex_lock(&cb->dcmd_mutex); in rebuild_store()
1943 cmd_blk = &cb->dcmd_blk; in rebuild_store()
1950 status = myrb_exec_cmd(cb, cmd_blk); in rebuild_store()
1951 mutex_unlock(&cb->dcmd_mutex); in rebuild_store()
1953 struct pci_dev *pdev = cb->pdev; in rebuild_store()
1970 mutex_lock(&cb->dcmd_mutex); in rebuild_store()
1971 cmd_blk = &cb->dcmd_blk; in rebuild_store()
1978 status = myrb_exec_cmd(cb, cmd_blk); in rebuild_store()
1980 mutex_unlock(&cb->dcmd_mutex); in rebuild_store()
2026 struct myrb_hba *cb = shost_priv(sdev->host); in consistency_check_store() local
2042 status = myrb_get_rbld_progress(cb, &rbld_buf); in consistency_check_store()
2049 mutex_lock(&cb->dcmd_mutex); in consistency_check_store()
2050 cmd_blk = &cb->dcmd_blk; in consistency_check_store()
2058 status = myrb_exec_cmd(cb, cmd_blk); in consistency_check_store()
2059 mutex_unlock(&cb->dcmd_mutex); in consistency_check_store()
2061 struct pci_dev *pdev = cb->pdev; in consistency_check_store()
2077 mutex_lock(&cb->dcmd_mutex); in consistency_check_store()
2078 cmd_blk = &cb->dcmd_blk; in consistency_check_store()
2085 status = myrb_exec_cmd(cb, cmd_blk); in consistency_check_store()
2087 mutex_unlock(&cb->dcmd_mutex); in consistency_check_store()
2139 struct myrb_hba *cb = shost_priv(shost); in ctlr_num_show() local
2141 return snprintf(buf, 20, "%u\n", cb->ctlr_num); in ctlr_num_show()
2149 struct myrb_hba *cb = shost_priv(shost); in firmware_show() local
2151 return snprintf(buf, 16, "%s\n", cb->fw_version); in firmware_show()
2159 struct myrb_hba *cb = shost_priv(shost); in model_show() local
2161 return snprintf(buf, 16, "%s\n", cb->model_name); in model_show()
2169 struct myrb_hba *cb = shost_priv(shost); in flush_cache_store() local
2172 status = myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0); in flush_cache_store()
2238 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_get_resync() local
2246 status = myrb_get_rbld_progress(cb, &rbld_buf); in myrb_get_resync()
2265 struct myrb_hba *cb = shost_priv(sdev->host); in myrb_get_state() local
2273 status = myrb_get_rbld_progress(cb, NULL); in myrb_get_state()
2300 static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk, in myrb_handle_scsi() argument
2312 dma_pool_free(cb->dcdb_pool, cmd_blk->dcdb, in myrb_handle_scsi()
2317 dma_pool_free(cb->sg_pool, cmd_blk->sgl, cmd_blk->sgl_addr); in myrb_handle_scsi()
2370 static void myrb_handle_cmdblk(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk) in myrb_handle_cmdblk() argument
2383 struct myrb_hba *cb = container_of(work, in myrb_monitor() local
2385 struct Scsi_Host *shost = cb->host; in myrb_monitor()
2390 if (cb->new_ev_seq > cb->old_ev_seq) { in myrb_monitor()
2391 int event = cb->old_ev_seq; in myrb_monitor()
2395 cb->new_ev_seq, event); in myrb_monitor()
2396 myrb_get_event(cb, event); in myrb_monitor()
2397 cb->old_ev_seq = event + 1; in myrb_monitor()
2399 } else if (cb->need_err_info) { in myrb_monitor()
2400 cb->need_err_info = false; in myrb_monitor()
2402 myrb_get_errtable(cb); in myrb_monitor()
2404 } else if (cb->need_rbld && cb->rbld_first) { in myrb_monitor()
2405 cb->need_rbld = false; in myrb_monitor()
2408 myrb_update_rbld_progress(cb); in myrb_monitor()
2410 } else if (cb->need_ldev_info) { in myrb_monitor()
2411 cb->need_ldev_info = false; in myrb_monitor()
2414 myrb_get_ldev_info(cb); in myrb_monitor()
2416 } else if (cb->need_rbld) { in myrb_monitor()
2417 cb->need_rbld = false; in myrb_monitor()
2420 myrb_update_rbld_progress(cb); in myrb_monitor()
2422 } else if (cb->need_cc_status) { in myrb_monitor()
2423 cb->need_cc_status = false; in myrb_monitor()
2426 myrb_get_cc_progress(cb); in myrb_monitor()
2428 } else if (cb->need_bgi_status) { in myrb_monitor()
2429 cb->need_bgi_status = false; in myrb_monitor()
2431 myrb_bgi_control(cb); in myrb_monitor()
2435 mutex_lock(&cb->dma_mutex); in myrb_monitor()
2436 myrb_hba_enquiry(cb); in myrb_monitor()
2437 mutex_unlock(&cb->dma_mutex); in myrb_monitor()
2438 if ((cb->new_ev_seq - cb->old_ev_seq > 0) || in myrb_monitor()
2439 cb->need_err_info || cb->need_rbld || in myrb_monitor()
2440 cb->need_ldev_info || cb->need_cc_status || in myrb_monitor()
2441 cb->need_bgi_status) { in myrb_monitor()
2448 cb->primary_monitor_time = jiffies; in myrb_monitor()
2449 queue_delayed_work(cb->work_q, &cb->monitor_work, interval); in myrb_monitor()
2460 static bool myrb_err_status(struct myrb_hba *cb, unsigned char error, in myrb_err_status() argument
2463 struct pci_dev *pdev = cb->pdev; in myrb_err_status()
2666 struct myrb_hba *cb, void __iomem *base) in DAC960_LA_hw_init() argument
2678 myrb_err_status(cb, error, parm0, parm1)) in DAC960_LA_hw_init()
2688 if (!myrb_enable_mmio(cb, DAC960_LA_mbox_init)) { in DAC960_LA_hw_init()
2695 cb->qcmd = myrb_qcmd; in DAC960_LA_hw_init()
2696 cb->write_cmd_mbox = DAC960_LA_write_cmd_mbox; in DAC960_LA_hw_init()
2697 if (cb->dual_mode_interface) in DAC960_LA_hw_init()
2698 cb->get_cmd_mbox = DAC960_LA_mem_mbox_new_cmd; in DAC960_LA_hw_init()
2700 cb->get_cmd_mbox = DAC960_LA_hw_mbox_new_cmd; in DAC960_LA_hw_init()
2701 cb->disable_intr = DAC960_LA_disable_intr; in DAC960_LA_hw_init()
2702 cb->reset = DAC960_LA_reset_ctrl; in DAC960_LA_hw_init()
2709 struct myrb_hba *cb = arg; in DAC960_LA_intr_handler() local
2710 void __iomem *base = cb->io_base; in DAC960_LA_intr_handler()
2714 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_LA_intr_handler()
2716 next_stat_mbox = cb->next_stat_mbox; in DAC960_LA_intr_handler()
2723 cmd_blk = &cb->dcmd_blk; in DAC960_LA_intr_handler()
2725 cmd_blk = &cb->mcmd_blk; in DAC960_LA_intr_handler()
2727 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_LA_intr_handler()
2734 dev_err(&cb->pdev->dev, in DAC960_LA_intr_handler()
2738 if (++next_stat_mbox > cb->last_stat_mbox) in DAC960_LA_intr_handler()
2739 next_stat_mbox = cb->first_stat_mbox; in DAC960_LA_intr_handler()
2743 myrb_handle_cmdblk(cb, cmd_blk); in DAC960_LA_intr_handler()
2745 myrb_handle_scsi(cb, cmd_blk, scmd); in DAC960_LA_intr_handler()
2748 cb->next_stat_mbox = next_stat_mbox; in DAC960_LA_intr_handler()
2749 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_LA_intr_handler()
2914 struct myrb_hba *cb, void __iomem *base) in DAC960_PG_hw_init() argument
2926 myrb_err_status(cb, error, parm0, parm1)) in DAC960_PG_hw_init()
2936 if (!myrb_enable_mmio(cb, DAC960_PG_mbox_init)) { in DAC960_PG_hw_init()
2943 cb->qcmd = myrb_qcmd; in DAC960_PG_hw_init()
2944 cb->write_cmd_mbox = DAC960_PG_write_cmd_mbox; in DAC960_PG_hw_init()
2945 if (cb->dual_mode_interface) in DAC960_PG_hw_init()
2946 cb->get_cmd_mbox = DAC960_PG_mem_mbox_new_cmd; in DAC960_PG_hw_init()
2948 cb->get_cmd_mbox = DAC960_PG_hw_mbox_new_cmd; in DAC960_PG_hw_init()
2949 cb->disable_intr = DAC960_PG_disable_intr; in DAC960_PG_hw_init()
2950 cb->reset = DAC960_PG_reset_ctrl; in DAC960_PG_hw_init()
2957 struct myrb_hba *cb = arg; in DAC960_PG_intr_handler() local
2958 void __iomem *base = cb->io_base; in DAC960_PG_intr_handler()
2962 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_PG_intr_handler()
2964 next_stat_mbox = cb->next_stat_mbox; in DAC960_PG_intr_handler()
2971 cmd_blk = &cb->dcmd_blk; in DAC960_PG_intr_handler()
2973 cmd_blk = &cb->mcmd_blk; in DAC960_PG_intr_handler()
2975 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_PG_intr_handler()
2982 dev_err(&cb->pdev->dev, in DAC960_PG_intr_handler()
2986 if (++next_stat_mbox > cb->last_stat_mbox) in DAC960_PG_intr_handler()
2987 next_stat_mbox = cb->first_stat_mbox; in DAC960_PG_intr_handler()
2990 myrb_handle_cmdblk(cb, cmd_blk); in DAC960_PG_intr_handler()
2992 myrb_handle_scsi(cb, cmd_blk, scmd); in DAC960_PG_intr_handler()
2994 cb->next_stat_mbox = next_stat_mbox; in DAC960_PG_intr_handler()
2995 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_PG_intr_handler()
3098 static void DAC960_PD_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk) in DAC960_PD_qcmd() argument
3100 void __iomem *base = cb->io_base; in DAC960_PD_qcmd()
3110 struct myrb_hba *cb, void __iomem *base) in DAC960_PD_hw_init() argument
3115 if (!request_region(cb->io_addr, 0x80, "myrb")) { in DAC960_PD_hw_init()
3117 (unsigned long)cb->io_addr); in DAC960_PD_hw_init()
3127 myrb_err_status(cb, error, parm0, parm1)) in DAC960_PD_hw_init()
3137 if (!myrb_enable_mmio(cb, NULL)) { in DAC960_PD_hw_init()
3144 cb->qcmd = DAC960_PD_qcmd; in DAC960_PD_hw_init()
3145 cb->disable_intr = DAC960_PD_disable_intr; in DAC960_PD_hw_init()
3146 cb->reset = DAC960_PD_reset_ctrl; in DAC960_PD_hw_init()
3153 struct myrb_hba *cb = arg; in DAC960_PD_intr_handler() local
3154 void __iomem *base = cb->io_base; in DAC960_PD_intr_handler()
3157 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_PD_intr_handler()
3164 cmd_blk = &cb->dcmd_blk; in DAC960_PD_intr_handler()
3166 cmd_blk = &cb->mcmd_blk; in DAC960_PD_intr_handler()
3168 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_PD_intr_handler()
3175 dev_err(&cb->pdev->dev, in DAC960_PD_intr_handler()
3182 myrb_handle_cmdblk(cb, cmd_blk); in DAC960_PD_intr_handler()
3184 myrb_handle_scsi(cb, cmd_blk, scmd); in DAC960_PD_intr_handler()
3186 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_PD_intr_handler()
3237 static void DAC960_P_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk) in DAC960_P_qcmd() argument
3239 void __iomem *base = cb->io_base; in DAC960_P_qcmd()
3276 struct myrb_hba *cb, void __iomem *base) in DAC960_P_hw_init() argument
3281 if (!request_region(cb->io_addr, 0x80, "myrb")) { in DAC960_P_hw_init()
3283 (unsigned long)cb->io_addr); in DAC960_P_hw_init()
3293 myrb_err_status(cb, error, parm0, parm1)) in DAC960_P_hw_init()
3303 if (!myrb_enable_mmio(cb, NULL)) { in DAC960_P_hw_init()
3310 cb->qcmd = DAC960_P_qcmd; in DAC960_P_hw_init()
3311 cb->disable_intr = DAC960_PD_disable_intr; in DAC960_P_hw_init()
3312 cb->reset = DAC960_PD_reset_ctrl; in DAC960_P_hw_init()
3319 struct myrb_hba *cb = arg; in DAC960_P_intr_handler() local
3320 void __iomem *base = cb->io_base; in DAC960_P_intr_handler()
3323 spin_lock_irqsave(&cb->queue_lock, flags); in DAC960_P_intr_handler()
3333 cmd_blk = &cb->dcmd_blk; in DAC960_P_intr_handler()
3335 cmd_blk = &cb->mcmd_blk; in DAC960_P_intr_handler()
3337 scmd = scsi_host_find_tag(cb->host, id - 3); in DAC960_P_intr_handler()
3344 dev_err(&cb->pdev->dev, in DAC960_P_intr_handler()
3358 myrb_translate_enquiry(cb->enquiry); in DAC960_P_intr_handler()
3380 myrb_handle_cmdblk(cb, cmd_blk); in DAC960_P_intr_handler()
3382 myrb_handle_scsi(cb, cmd_blk, scmd); in DAC960_P_intr_handler()
3384 spin_unlock_irqrestore(&cb->queue_lock, flags); in DAC960_P_intr_handler()
3402 struct myrb_hba *cb = NULL; in myrb_detect() local
3411 cb = shost_priv(shost); in myrb_detect()
3412 mutex_init(&cb->dcmd_mutex); in myrb_detect()
3413 mutex_init(&cb->dma_mutex); in myrb_detect()
3414 cb->pdev = pdev; in myrb_detect()
3415 cb->host = shost; in myrb_detect()
3425 cb->io_addr = pci_resource_start(pdev, 0); in myrb_detect()
3426 cb->pci_addr = pci_resource_start(pdev, 1); in myrb_detect()
3428 cb->pci_addr = pci_resource_start(pdev, 0); in myrb_detect()
3430 pci_set_drvdata(pdev, cb); in myrb_detect()
3431 spin_lock_init(&cb->queue_lock); in myrb_detect()
3434 cb->mmio_base = ioremap(cb->pci_addr & PAGE_MASK, mmio_size); in myrb_detect()
3435 if (cb->mmio_base == NULL) { in myrb_detect()
3441 cb->io_base = cb->mmio_base + (cb->pci_addr & ~PAGE_MASK); in myrb_detect()
3442 if (privdata->hw_init(pdev, cb, cb->io_base)) in myrb_detect()
3445 if (request_irq(pdev->irq, irq_handler, IRQF_SHARED, "myrb", cb) < 0) { in myrb_detect()
3450 cb->irq = pdev->irq; in myrb_detect()
3451 return cb; in myrb_detect()
3456 myrb_cleanup(cb); in myrb_detect()
3462 struct myrb_hba *cb; in myrb_probe() local
3465 cb = myrb_detect(dev, entry); in myrb_probe()
3466 if (!cb) in myrb_probe()
3469 ret = myrb_get_hba_config(cb); in myrb_probe()
3471 myrb_cleanup(cb); in myrb_probe()
3475 if (!myrb_create_mempools(dev, cb)) { in myrb_probe()
3480 ret = scsi_add_host(cb->host, &dev->dev); in myrb_probe()
3483 myrb_destroy_mempools(cb); in myrb_probe()
3486 scsi_scan_host(cb->host); in myrb_probe()
3489 myrb_cleanup(cb); in myrb_probe()
3496 struct myrb_hba *cb = pci_get_drvdata(pdev); in myrb_remove() local
3498 shost_printk(KERN_NOTICE, cb->host, "Flushing Cache..."); in myrb_remove()
3499 myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0); in myrb_remove()
3500 myrb_cleanup(cb); in myrb_remove()
3501 myrb_destroy_mempools(cb); in myrb_remove()