Lines Matching refs:h
174 static int rebuild_lun_table(ctlr_info_t *h, int first_time, int via_ioctl);
175 static int deregister_disk(ctlr_info_t *h, int drv_index,
178 static void cciss_read_capacity(ctlr_info_t *h, int logvol,
180 static void cciss_read_capacity_16(ctlr_info_t *h, int logvol,
182 static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol,
187 static int cciss_enter_simple_mode(struct ctlr_info *h);
188 static void start_io(ctlr_info_t *h);
189 static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size,
192 static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c,
194 static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c);
196 static int add_to_scan_list(struct ctlr_info *h);
198 static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c);
201 static void cciss_free_gendisk(ctlr_info_t *h, int drv_index);
202 static void cciss_free_drive_info(ctlr_info_t *h, int drv_index);
203 static inline u32 next_command(ctlr_info_t *h);
209 static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag);
215 static void cciss_put_controller_into_performant_mode(ctlr_info_t *h);
218 static void cciss_procinit(ctlr_info_t *h);
220 static void cciss_procinit(ctlr_info_t *h) in cciss_procinit() argument
246 static void set_performant_mode(ctlr_info_t *h, CommandList_struct *c) in set_performant_mode() argument
248 if (likely(h->transMethod & CFGTBL_Trans_Performant)) in set_performant_mode()
249 c->busaddr |= 1 | (h->blockFetchTable[c->Header.SGList] << 1); in set_performant_mode()
278 static void enqueue_cmd_and_start_io(ctlr_info_t *h, in enqueue_cmd_and_start_io() argument
282 set_performant_mode(h, c); in enqueue_cmd_and_start_io()
283 spin_lock_irqsave(&h->lock, flags); in enqueue_cmd_and_start_io()
284 addQ(&h->reqQ, c); in enqueue_cmd_and_start_io()
285 h->Qdepth++; in enqueue_cmd_and_start_io()
286 if (h->Qdepth > h->maxQsinceinit) in enqueue_cmd_and_start_io()
287 h->maxQsinceinit = h->Qdepth; in enqueue_cmd_and_start_io()
288 start_io(h); in enqueue_cmd_and_start_io()
289 spin_unlock_irqrestore(&h->lock, flags); in enqueue_cmd_and_start_io()
307 ctlr_info_t *h, int chainsize, int nr_cmds) in cciss_allocate_sg_chain_blocks() argument
325 dev_err(&h->pdev->dev, "Cannot get memory " in cciss_allocate_sg_chain_blocks()
336 static void cciss_unmap_sg_chain_block(ctlr_info_t *h, CommandList_struct *c) in cciss_unmap_sg_chain_block() argument
341 if (c->Header.SGTotal <= h->max_cmd_sgentries) in cciss_unmap_sg_chain_block()
344 chain_sg = &c->SG[h->max_cmd_sgentries - 1]; in cciss_unmap_sg_chain_block()
347 pci_unmap_single(h->pdev, temp64.val, chain_sg->Len, PCI_DMA_TODEVICE); in cciss_unmap_sg_chain_block()
350 static void cciss_map_sg_chain_block(ctlr_info_t *h, CommandList_struct *c, in cciss_map_sg_chain_block() argument
356 chain_sg = &c->SG[h->max_cmd_sgentries - 1]; in cciss_map_sg_chain_block()
359 temp64.val = pci_map_single(h->pdev, chain_block, len, in cciss_map_sg_chain_block()
383 ctlr_info_t *h = seq->private; in cciss_seq_show_header() local
395 h->devname, in cciss_seq_show_header()
396 h->product_name, in cciss_seq_show_header()
397 (unsigned long)h->board_id, in cciss_seq_show_header()
398 h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], in cciss_seq_show_header()
399 h->firm_ver[3], (unsigned int)h->intr[h->intr_mode], in cciss_seq_show_header()
400 h->num_luns, in cciss_seq_show_header()
401 h->Qdepth, h->commands_outstanding, in cciss_seq_show_header()
402 h->maxQsinceinit, h->max_outstanding, h->maxSG); in cciss_seq_show_header()
405 cciss_seq_tape_report(seq, h); in cciss_seq_show_header()
411 ctlr_info_t *h = seq->private; in cciss_seq_start() local
417 spin_lock_irqsave(&h->lock, flags); in cciss_seq_start()
418 if (h->busy_configuring) { in cciss_seq_start()
419 spin_unlock_irqrestore(&h->lock, flags); in cciss_seq_start()
422 h->busy_configuring = 1; in cciss_seq_start()
423 spin_unlock_irqrestore(&h->lock, flags); in cciss_seq_start()
434 ctlr_info_t *h = seq->private; in cciss_seq_show() local
435 unsigned ctlr = h->ctlr; in cciss_seq_show()
437 drive_info_struct *drv = h->drv[*pos]; in cciss_seq_show()
439 if (*pos > h->highest_lun) in cciss_seq_show()
464 ctlr_info_t *h = seq->private; in cciss_seq_next() local
466 if (*pos > h->highest_lun) in cciss_seq_next()
475 ctlr_info_t *h = seq->private; in cciss_seq_stop() local
482 h->busy_configuring = 0; in cciss_seq_stop()
529 ctlr_info_t *h = seq->private; in cciss_proc_write() local
531 err = cciss_engage_scsi(h); in cciss_proc_write()
554 static void cciss_procinit(ctlr_info_t *h) in cciss_procinit() argument
562 pde = proc_create_data(h->devname, S_IWUSR | S_IRUSR | S_IRGRP | in cciss_procinit()
564 &cciss_proc_fops, h); in cciss_procinit()
645 struct ctlr_info *h = to_hba(dev); in host_show_resettable() local
647 return snprintf(buf, 20, "%d\n", ctlr_is_resettable(h->board_id)); in host_show_resettable()
655 struct ctlr_info *h = to_hba(dev); in host_store_rescan() local
657 add_to_scan_list(h); in host_store_rescan()
659 wait_for_completion_interruptible(&h->scan_wait); in host_store_rescan()
669 struct ctlr_info *h = to_hba(dev); in host_show_transport_mode() local
672 h->transMethod & CFGTBL_Trans_Performant ? in host_show_transport_mode()
682 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_unique_id() local
687 spin_lock_irqsave(&h->lock, flags); in dev_show_unique_id()
688 if (h->busy_configuring) in dev_show_unique_id()
692 spin_unlock_irqrestore(&h->lock, flags); in dev_show_unique_id()
712 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_vendor() local
717 spin_lock_irqsave(&h->lock, flags); in dev_show_vendor()
718 if (h->busy_configuring) in dev_show_vendor()
722 spin_unlock_irqrestore(&h->lock, flags); in dev_show_vendor()
736 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_model() local
741 spin_lock_irqsave(&h->lock, flags); in dev_show_model()
742 if (h->busy_configuring) in dev_show_model()
746 spin_unlock_irqrestore(&h->lock, flags); in dev_show_model()
760 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_rev() local
765 spin_lock_irqsave(&h->lock, flags); in dev_show_rev()
766 if (h->busy_configuring) in dev_show_rev()
770 spin_unlock_irqrestore(&h->lock, flags); in dev_show_rev()
783 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_lunid() local
787 spin_lock_irqsave(&h->lock, flags); in cciss_show_lunid()
788 if (h->busy_configuring) { in cciss_show_lunid()
789 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
793 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
797 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
808 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_raid_level() local
812 spin_lock_irqsave(&h->lock, flags); in cciss_show_raid_level()
813 if (h->busy_configuring) { in cciss_show_raid_level()
814 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_raid_level()
818 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_raid_level()
831 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_usage_count() local
835 spin_lock_irqsave(&h->lock, flags); in cciss_show_usage_count()
836 if (h->busy_configuring) { in cciss_show_usage_count()
837 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_usage_count()
841 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_usage_count()
915 static int cciss_create_hba_sysfs_entry(struct ctlr_info *h) in cciss_create_hba_sysfs_entry() argument
917 device_initialize(&h->dev); in cciss_create_hba_sysfs_entry()
918 h->dev.type = &cciss_host_type; in cciss_create_hba_sysfs_entry()
919 h->dev.bus = &cciss_bus_type; in cciss_create_hba_sysfs_entry()
920 dev_set_name(&h->dev, "%s", h->devname); in cciss_create_hba_sysfs_entry()
921 h->dev.parent = &h->pdev->dev; in cciss_create_hba_sysfs_entry()
923 return device_add(&h->dev); in cciss_create_hba_sysfs_entry()
929 static void cciss_destroy_hba_sysfs_entry(struct ctlr_info *h) in cciss_destroy_hba_sysfs_entry() argument
931 device_del(&h->dev); in cciss_destroy_hba_sysfs_entry()
932 put_device(&h->dev); /* final put. */ in cciss_destroy_hba_sysfs_entry()
950 static long cciss_create_ld_sysfs_entry(struct ctlr_info *h, in cciss_create_ld_sysfs_entry() argument
955 if (h->drv[drv_index]->device_initialized) in cciss_create_ld_sysfs_entry()
958 dev = &h->drv[drv_index]->dev; in cciss_create_ld_sysfs_entry()
962 dev_set_name(dev, "c%dd%d", h->ctlr, drv_index); in cciss_create_ld_sysfs_entry()
963 dev->parent = &h->dev; in cciss_create_ld_sysfs_entry()
964 h->drv[drv_index]->device_initialized = 1; in cciss_create_ld_sysfs_entry()
971 static void cciss_destroy_ld_sysfs_entry(struct ctlr_info *h, int drv_index, in cciss_destroy_ld_sysfs_entry() argument
974 struct device *dev = &h->drv[drv_index]->dev; in cciss_destroy_ld_sysfs_entry()
982 h->drv[drv_index] = NULL; in cciss_destroy_ld_sysfs_entry()
990 static CommandList_struct *cmd_alloc(ctlr_info_t *h) in cmd_alloc() argument
998 i = find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds); in cmd_alloc()
999 if (i == h->nr_cmds) in cmd_alloc()
1001 } while (test_and_set_bit(i, h->cmd_pool_bits) != 0); in cmd_alloc()
1002 c = h->cmd_pool + i; in cmd_alloc()
1004 cmd_dma_handle = h->cmd_pool_dhandle + i * sizeof(CommandList_struct); in cmd_alloc()
1005 c->err_info = h->errinfo_pool + i; in cmd_alloc()
1007 err_dma_handle = h->errinfo_pool_dhandle in cmd_alloc()
1009 h->nr_allocs++; in cmd_alloc()
1020 c->ctlr = h->ctlr; in cmd_alloc()
1027 static CommandList_struct *cmd_special_alloc(ctlr_info_t *h) in cmd_special_alloc() argument
1033 c = pci_zalloc_consistent(h->pdev, sizeof(CommandList_struct), in cmd_special_alloc()
1040 c->err_info = pci_zalloc_consistent(h->pdev, sizeof(ErrorInfo_struct), in cmd_special_alloc()
1044 pci_free_consistent(h->pdev, in cmd_special_alloc()
1056 c->ctlr = h->ctlr; in cmd_special_alloc()
1060 static void cmd_free(ctlr_info_t *h, CommandList_struct *c) in cmd_free() argument
1064 i = c - h->cmd_pool; in cmd_free()
1065 clear_bit(i, h->cmd_pool_bits); in cmd_free()
1066 h->nr_frees++; in cmd_free()
1069 static void cmd_special_free(ctlr_info_t *h, CommandList_struct *c) in cmd_special_free() argument
1075 pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct), in cmd_special_free()
1077 pci_free_consistent(h->pdev, sizeof(CommandList_struct), c, in cmd_special_free()
1078 (dma_addr_t) cciss_tag_discard_error_bits(h, (u32) c->busaddr)); in cmd_special_free()
1096 ctlr_info_t *h = get_host(bdev->bd_disk); in cciss_open() local
1099 dev_dbg(&h->pdev->dev, "cciss_open %s\n", bdev->bd_disk->disk_name); in cciss_open()
1125 h->usage_count++; in cciss_open()
1145 ctlr_info_t *h; in cciss_release() local
1149 h = get_host(disk); in cciss_release()
1151 dev_dbg(&h->pdev->dev, "cciss_release %s\n", disk->disk_name); in cciss_release()
1153 h->usage_count--; in cciss_release()
1291 static void check_ioctl_unit_attention(ctlr_info_t *h, CommandList_struct *c) in check_ioctl_unit_attention() argument
1295 (void)check_for_unit_attention(h, c); in check_ioctl_unit_attention()
1298 static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp) in cciss_getpciinfo() argument
1304 pciinfo.domain = pci_domain_nr(h->pdev->bus); in cciss_getpciinfo()
1305 pciinfo.bus = h->pdev->bus->number; in cciss_getpciinfo()
1306 pciinfo.dev_fn = h->pdev->devfn; in cciss_getpciinfo()
1307 pciinfo.board_id = h->board_id; in cciss_getpciinfo()
1313 static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) in cciss_getintinfo() argument
1320 spin_lock_irqsave(&h->lock, flags); in cciss_getintinfo()
1321 intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); in cciss_getintinfo()
1322 intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); in cciss_getintinfo()
1323 spin_unlock_irqrestore(&h->lock, flags); in cciss_getintinfo()
1330 static int cciss_setintinfo(ctlr_info_t *h, void __user *argp) in cciss_setintinfo() argument
1344 spin_lock_irqsave(&h->lock, flags); in cciss_setintinfo()
1346 writel(intinfo.delay, &(h->cfgtable->HostWrite.CoalIntDelay)); in cciss_setintinfo()
1347 writel(intinfo.count, &(h->cfgtable->HostWrite.CoalIntCount)); in cciss_setintinfo()
1348 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_setintinfo()
1351 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_setintinfo()
1355 spin_unlock_irqrestore(&h->lock, flags); in cciss_setintinfo()
1361 static int cciss_getnodename(ctlr_info_t *h, void __user *argp) in cciss_getnodename() argument
1369 spin_lock_irqsave(&h->lock, flags); in cciss_getnodename()
1371 NodeName[i] = readb(&h->cfgtable->ServerName[i]); in cciss_getnodename()
1372 spin_unlock_irqrestore(&h->lock, flags); in cciss_getnodename()
1378 static int cciss_setnodename(ctlr_info_t *h, void __user *argp) in cciss_setnodename() argument
1390 spin_lock_irqsave(&h->lock, flags); in cciss_setnodename()
1393 writeb(NodeName[i], &h->cfgtable->ServerName[i]); in cciss_setnodename()
1394 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_setnodename()
1396 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_setnodename()
1400 spin_unlock_irqrestore(&h->lock, flags); in cciss_setnodename()
1406 static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) in cciss_getheartbeat() argument
1413 spin_lock_irqsave(&h->lock, flags); in cciss_getheartbeat()
1414 heartbeat = readl(&h->cfgtable->HeartBeat); in cciss_getheartbeat()
1415 spin_unlock_irqrestore(&h->lock, flags); in cciss_getheartbeat()
1421 static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) in cciss_getbustypes() argument
1428 spin_lock_irqsave(&h->lock, flags); in cciss_getbustypes()
1429 BusTypes = readl(&h->cfgtable->BusTypes); in cciss_getbustypes()
1430 spin_unlock_irqrestore(&h->lock, flags); in cciss_getbustypes()
1436 static int cciss_getfirmver(ctlr_info_t *h, void __user *argp) in cciss_getfirmver() argument
1442 memcpy(firmware, h->firm_ver, 4); in cciss_getfirmver()
1450 static int cciss_getdrivver(ctlr_info_t *h, void __user *argp) in cciss_getdrivver() argument
1461 static int cciss_getluninfo(ctlr_info_t *h, in cciss_getluninfo() argument
1477 static int cciss_passthru(ctlr_info_t *h, void __user *argp) in cciss_passthru() argument
1512 c = cmd_special_alloc(h); in cciss_passthru()
1537 temp64.val = pci_map_single(h->pdev, buff, in cciss_passthru()
1546 enqueue_cmd_and_start_io(h, c); in cciss_passthru()
1552 pci_unmap_single(h->pdev, (dma_addr_t) temp64.val, iocommand.buf_size, in cciss_passthru()
1554 check_ioctl_unit_attention(h, c); in cciss_passthru()
1560 cmd_special_free(h, c); in cciss_passthru()
1568 cmd_special_free(h, c); in cciss_passthru()
1573 cmd_special_free(h, c); in cciss_passthru()
1577 static int cciss_bigpassthru(ctlr_info_t *h, void __user *argp) in cciss_bigpassthru() argument
1651 c = cmd_special_alloc(h); in cciss_bigpassthru()
1665 temp64.val = pci_map_single(h->pdev, buff[i], buff_size[i], in cciss_bigpassthru()
1673 enqueue_cmd_and_start_io(h, c); in cciss_bigpassthru()
1679 pci_unmap_single(h->pdev, in cciss_bigpassthru()
1683 check_ioctl_unit_attention(h, c); in cciss_bigpassthru()
1687 cmd_special_free(h, c); in cciss_bigpassthru()
1696 cmd_special_free(h, c); in cciss_bigpassthru()
1703 cmd_special_free(h, c); in cciss_bigpassthru()
1720 ctlr_info_t *h = get_host(disk); in cciss_ioctl() local
1723 dev_dbg(&h->pdev->dev, "cciss_ioctl: Called with cmd=%x %lx\n", in cciss_ioctl()
1727 return cciss_getpciinfo(h, argp); in cciss_ioctl()
1729 return cciss_getintinfo(h, argp); in cciss_ioctl()
1731 return cciss_setintinfo(h, argp); in cciss_ioctl()
1733 return cciss_getnodename(h, argp); in cciss_ioctl()
1735 return cciss_setnodename(h, argp); in cciss_ioctl()
1737 return cciss_getheartbeat(h, argp); in cciss_ioctl()
1739 return cciss_getbustypes(h, argp); in cciss_ioctl()
1741 return cciss_getfirmver(h, argp); in cciss_ioctl()
1743 return cciss_getdrivver(h, argp); in cciss_ioctl()
1747 return rebuild_lun_table(h, 0, 1); in cciss_ioctl()
1749 return cciss_getluninfo(h, disk, argp); in cciss_ioctl()
1751 return cciss_passthru(h, argp); in cciss_ioctl()
1753 return cciss_bigpassthru(h, argp); in cciss_ioctl()
1783 static void cciss_check_queues(ctlr_info_t *h) in cciss_check_queues() argument
1785 int start_queue = h->next_to_run; in cciss_check_queues()
1793 if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) in cciss_check_queues()
1800 for (i = 0; i < h->highest_lun + 1; i++) { in cciss_check_queues()
1801 int curr_queue = (start_queue + i) % (h->highest_lun + 1); in cciss_check_queues()
1805 if (!h->drv[curr_queue]) in cciss_check_queues()
1807 if (!(h->drv[curr_queue]->queue) || in cciss_check_queues()
1808 !(h->drv[curr_queue]->heads)) in cciss_check_queues()
1810 blk_start_queue(h->gendisk[curr_queue]->queue); in cciss_check_queues()
1815 if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) { in cciss_check_queues()
1817 h->next_to_run = in cciss_check_queues()
1818 (start_queue + 1) % (h->highest_lun + 1); in cciss_check_queues()
1821 h->next_to_run = curr_queue; in cciss_check_queues()
1831 ctlr_info_t *h = hba[c->ctlr]; in cciss_softirq_done() local
1847 cciss_unmap_sg_chain_block(h, c); in cciss_softirq_done()
1849 curr_sg = h->cmd_sg_list[c->cmdindex]; in cciss_softirq_done()
1854 pci_unmap_page(h->pdev, temp64.val, curr_sg[sg_index].Len, in cciss_softirq_done()
1859 dev_dbg(&h->pdev->dev, "Done with %p\n", rq); in cciss_softirq_done()
1867 spin_lock_irqsave(&h->lock, flags); in cciss_softirq_done()
1868 cmd_free(h, c); in cciss_softirq_done()
1869 cciss_check_queues(h); in cciss_softirq_done()
1870 spin_unlock_irqrestore(&h->lock, flags); in cciss_softirq_done()
1873 static inline void log_unit_to_scsi3addr(ctlr_info_t *h, in log_unit_to_scsi3addr() argument
1876 memcpy(scsi3addr, h->drv[log_unit]->LunID, in log_unit_to_scsi3addr()
1877 sizeof(h->drv[log_unit]->LunID)); in log_unit_to_scsi3addr()
1884 static void cciss_get_device_descr(ctlr_info_t *h, int logvol, in cciss_get_device_descr() argument
1899 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_get_device_descr()
1900 rc = sendcmd_withirq(h, CISS_INQUIRY, inq_buf, sizeof(*inq_buf), 0, in cciss_get_device_descr()
1920 static void cciss_get_serial_no(ctlr_info_t *h, int logvol, in cciss_get_serial_no() argument
1935 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_get_serial_no()
1936 rc = sendcmd_withirq(h, CISS_INQUIRY, buf, in cciss_get_serial_no()
1947 static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, in cciss_add_disk() argument
1950 disk->queue = blk_init_queue(do_cciss_request, &h->lock); in cciss_add_disk()
1953 sprintf(disk->disk_name, "cciss/c%dd%d", h->ctlr, drv_index); in cciss_add_disk()
1954 disk->major = h->major; in cciss_add_disk()
1957 if (cciss_create_ld_sysfs_entry(h, drv_index)) in cciss_add_disk()
1959 disk->private_data = h->drv[drv_index]; in cciss_add_disk()
1960 disk->driverfs_dev = &h->drv[drv_index]->dev; in cciss_add_disk()
1963 blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask); in cciss_add_disk()
1966 blk_queue_max_segments(disk->queue, h->maxsgentries); in cciss_add_disk()
1968 blk_queue_max_hw_sectors(disk->queue, h->cciss_max_sectors); in cciss_add_disk()
1972 disk->queue->queuedata = h; in cciss_add_disk()
1975 h->drv[drv_index]->block_size); in cciss_add_disk()
1981 h->drv[drv_index]->queue = disk->queue; in cciss_add_disk()
2002 static void cciss_update_drive_info(ctlr_info_t *h, int drv_index, in cciss_update_drive_info() argument
2020 if (h->cciss_read == CCISS_READ_16) { in cciss_update_drive_info()
2021 cciss_read_capacity_16(h, drv_index, in cciss_update_drive_info()
2025 cciss_read_capacity(h, drv_index, &total_size, &block_size); in cciss_update_drive_info()
2030 cciss_read_capacity_16(h, drv_index, in cciss_update_drive_info()
2032 h->cciss_read = CCISS_READ_16; in cciss_update_drive_info()
2033 h->cciss_write = CCISS_WRITE_16; in cciss_update_drive_info()
2035 h->cciss_read = CCISS_READ_10; in cciss_update_drive_info()
2036 h->cciss_write = CCISS_WRITE_10; in cciss_update_drive_info()
2040 cciss_geometry_inquiry(h, drv_index, total_size, block_size, in cciss_update_drive_info()
2045 cciss_get_device_descr(h, drv_index, drvinfo->vendor, in cciss_update_drive_info()
2047 cciss_get_serial_no(h, drv_index, drvinfo->serial_no, in cciss_update_drive_info()
2050 memcpy(drvinfo->LunID, h->drv[drv_index]->LunID, in cciss_update_drive_info()
2054 if (h->drv[drv_index]->raid_level != -1 && in cciss_update_drive_info()
2056 h->drv[drv_index]->serial_no, 16) == 0) && in cciss_update_drive_info()
2057 drvinfo->block_size == h->drv[drv_index]->block_size && in cciss_update_drive_info()
2058 drvinfo->nr_blocks == h->drv[drv_index]->nr_blocks && in cciss_update_drive_info()
2059 drvinfo->heads == h->drv[drv_index]->heads && in cciss_update_drive_info()
2060 drvinfo->sectors == h->drv[drv_index]->sectors && in cciss_update_drive_info()
2061 drvinfo->cylinders == h->drv[drv_index]->cylinders)) in cciss_update_drive_info()
2071 if (h->drv[drv_index]->raid_level != -1 && drv_index != 0) { in cciss_update_drive_info()
2072 dev_warn(&h->pdev->dev, "disk %d has changed.\n", drv_index); in cciss_update_drive_info()
2073 spin_lock_irqsave(&h->lock, flags); in cciss_update_drive_info()
2074 h->drv[drv_index]->busy_configuring = 1; in cciss_update_drive_info()
2075 spin_unlock_irqrestore(&h->lock, flags); in cciss_update_drive_info()
2081 ret = deregister_disk(h, drv_index, 0, via_ioctl); in cciss_update_drive_info()
2092 if (h->drv[drv_index] == NULL) { in cciss_update_drive_info()
2094 h->drv[drv_index] = drvinfo; in cciss_update_drive_info()
2098 h->drv[drv_index]->block_size = drvinfo->block_size; in cciss_update_drive_info()
2099 h->drv[drv_index]->nr_blocks = drvinfo->nr_blocks; in cciss_update_drive_info()
2100 h->drv[drv_index]->heads = drvinfo->heads; in cciss_update_drive_info()
2101 h->drv[drv_index]->sectors = drvinfo->sectors; in cciss_update_drive_info()
2102 h->drv[drv_index]->cylinders = drvinfo->cylinders; in cciss_update_drive_info()
2103 h->drv[drv_index]->raid_level = drvinfo->raid_level; in cciss_update_drive_info()
2104 memcpy(h->drv[drv_index]->serial_no, drvinfo->serial_no, 16); in cciss_update_drive_info()
2105 memcpy(h->drv[drv_index]->vendor, drvinfo->vendor, in cciss_update_drive_info()
2107 memcpy(h->drv[drv_index]->model, drvinfo->model, MODEL_LEN + 1); in cciss_update_drive_info()
2108 memcpy(h->drv[drv_index]->rev, drvinfo->rev, REV_LEN + 1); in cciss_update_drive_info()
2111 ++h->num_luns; in cciss_update_drive_info()
2112 disk = h->gendisk[drv_index]; in cciss_update_drive_info()
2113 set_capacity(disk, h->drv[drv_index]->nr_blocks); in cciss_update_drive_info()
2122 if (cciss_add_disk(h, disk, drv_index) != 0) { in cciss_update_drive_info()
2123 cciss_free_gendisk(h, drv_index); in cciss_update_drive_info()
2124 cciss_free_drive_info(h, drv_index); in cciss_update_drive_info()
2125 dev_warn(&h->pdev->dev, "could not update disk %d\n", in cciss_update_drive_info()
2127 --h->num_luns; in cciss_update_drive_info()
2136 dev_err(&h->pdev->dev, "out of memory\n"); in cciss_update_drive_info()
2150 static int cciss_alloc_drive_info(ctlr_info_t *h, int controller_node) in cciss_alloc_drive_info() argument
2159 if (h->drv[i] && i != 0) in cciss_alloc_drive_info()
2165 if (i == 0 && h->drv[i] && h->drv[i]->raid_level != -1) in cciss_alloc_drive_info()
2172 if (i > h->highest_lun && !controller_node) in cciss_alloc_drive_info()
2173 h->highest_lun = i; in cciss_alloc_drive_info()
2176 if (i == 0 && h->drv[i] != NULL) in cciss_alloc_drive_info()
2187 h->drv[i] = drv; in cciss_alloc_drive_info()
2193 static void cciss_free_drive_info(ctlr_info_t *h, int drv_index) in cciss_free_drive_info() argument
2195 kfree(h->drv[drv_index]); in cciss_free_drive_info()
2196 h->drv[drv_index] = NULL; in cciss_free_drive_info()
2199 static void cciss_free_gendisk(ctlr_info_t *h, int drv_index) in cciss_free_gendisk() argument
2201 put_disk(h->gendisk[drv_index]); in cciss_free_gendisk()
2202 h->gendisk[drv_index] = NULL; in cciss_free_gendisk()
2214 static int cciss_add_gendisk(ctlr_info_t *h, unsigned char lunid[], in cciss_add_gendisk() argument
2219 drv_index = cciss_alloc_drive_info(h, controller_node); in cciss_add_gendisk()
2224 if (!h->gendisk[drv_index]) { in cciss_add_gendisk()
2225 h->gendisk[drv_index] = in cciss_add_gendisk()
2227 if (!h->gendisk[drv_index]) { in cciss_add_gendisk()
2228 dev_err(&h->pdev->dev, in cciss_add_gendisk()
2234 memcpy(h->drv[drv_index]->LunID, lunid, in cciss_add_gendisk()
2235 sizeof(h->drv[drv_index]->LunID)); in cciss_add_gendisk()
2236 if (cciss_create_ld_sysfs_entry(h, drv_index)) in cciss_add_gendisk()
2241 h->drv[drv_index]->busy_configuring = 0; in cciss_add_gendisk()
2246 cciss_free_gendisk(h, drv_index); in cciss_add_gendisk()
2248 cciss_free_drive_info(h, drv_index); in cciss_add_gendisk()
2257 static void cciss_add_controller_node(ctlr_info_t *h) in cciss_add_controller_node() argument
2262 if (h->gendisk[0] != NULL) /* already did this? Then bail. */ in cciss_add_controller_node()
2265 drv_index = cciss_add_gendisk(h, CTLR_LUNID, 1); in cciss_add_controller_node()
2268 h->drv[drv_index]->block_size = 512; in cciss_add_controller_node()
2269 h->drv[drv_index]->nr_blocks = 0; in cciss_add_controller_node()
2270 h->drv[drv_index]->heads = 0; in cciss_add_controller_node()
2271 h->drv[drv_index]->sectors = 0; in cciss_add_controller_node()
2272 h->drv[drv_index]->cylinders = 0; in cciss_add_controller_node()
2273 h->drv[drv_index]->raid_level = -1; in cciss_add_controller_node()
2274 memset(h->drv[drv_index]->serial_no, 0, 16); in cciss_add_controller_node()
2275 disk = h->gendisk[drv_index]; in cciss_add_controller_node()
2276 if (cciss_add_disk(h, disk, drv_index) == 0) in cciss_add_controller_node()
2278 cciss_free_gendisk(h, drv_index); in cciss_add_controller_node()
2279 cciss_free_drive_info(h, drv_index); in cciss_add_controller_node()
2281 dev_warn(&h->pdev->dev, "could not add disk 0.\n"); in cciss_add_controller_node()
2293 static int rebuild_lun_table(ctlr_info_t *h, int first_time, in rebuild_lun_table() argument
2310 spin_lock_irqsave(&h->lock, flags); in rebuild_lun_table()
2311 if (h->busy_configuring) { in rebuild_lun_table()
2312 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2315 h->busy_configuring = 1; in rebuild_lun_table()
2316 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2322 return_code = sendcmd_withirq(h, CISS_REPORT_LOG, ld_buff, in rebuild_lun_table()
2329 dev_warn(&h->pdev->dev, in rebuild_lun_table()
2338 dev_warn(&h->pdev->dev, "more luns configured" in rebuild_lun_table()
2344 cciss_add_controller_node(h); in rebuild_lun_table()
2351 for (i = 0; i <= h->highest_lun; i++) { in rebuild_lun_table()
2356 if (h->drv[i] == NULL) in rebuild_lun_table()
2361 if (memcmp(h->drv[i]->LunID, lunid, in rebuild_lun_table()
2369 spin_lock_irqsave(&h->lock, flags); in rebuild_lun_table()
2370 h->drv[i]->busy_configuring = 1; in rebuild_lun_table()
2371 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2372 return_code = deregister_disk(h, i, 1, via_ioctl); in rebuild_lun_table()
2373 if (h->drv[i] != NULL) in rebuild_lun_table()
2374 h->drv[i]->busy_configuring = 0; in rebuild_lun_table()
2394 for (j = 0; j <= h->highest_lun; j++) { in rebuild_lun_table()
2395 if (h->drv[j] != NULL && in rebuild_lun_table()
2396 memcmp(h->drv[j]->LunID, lunid, in rebuild_lun_table()
2397 sizeof(h->drv[j]->LunID)) == 0) { in rebuild_lun_table()
2406 drv_index = cciss_add_gendisk(h, lunid, 0); in rebuild_lun_table()
2410 cciss_update_drive_info(h, drv_index, first_time, via_ioctl); in rebuild_lun_table()
2415 h->busy_configuring = 0; in rebuild_lun_table()
2422 dev_err(&h->pdev->dev, "out of memory\n"); in rebuild_lun_table()
2423 h->busy_configuring = 0; in rebuild_lun_table()
2467 static int deregister_disk(ctlr_info_t *h, int drv_index, in deregister_disk() argument
2478 drv = h->drv[drv_index]; in deregister_disk()
2479 disk = h->gendisk[drv_index]; in deregister_disk()
2482 if (clear_all || (h->gendisk[0] == disk)) { in deregister_disk()
2488 recalculate_highest_lun = (drv == h->drv[h->highest_lun]); in deregister_disk()
2494 if (h->gendisk[0] != disk) { in deregister_disk()
2497 cciss_destroy_ld_sysfs_entry(h, drv_index, 0); in deregister_disk()
2515 if (h->gendisk[i] == disk) { in deregister_disk()
2516 h->gendisk[i] = NULL; in deregister_disk()
2527 --h->num_luns; in deregister_disk()
2532 for (i = 0; i <= h->highest_lun; i++) { in deregister_disk()
2534 if (h->drv[i] && h->drv[i]->heads) in deregister_disk()
2537 h->highest_lun = newhighest; in deregister_disk()
2542 static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff, in fill_cmd() argument
2631 dev_warn(&h->pdev->dev, "Unknown Command 0x%c\n", cmd); in fill_cmd()
2663 dev_warn(&h->pdev->dev, in fill_cmd()
2668 dev_warn(&h->pdev->dev, "unknown command type %d\n", cmd_type); in fill_cmd()
2673 buff_dma_handle.val = (__u64) pci_map_single(h->pdev, in fill_cmd()
2684 static int cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr, in cciss_send_reset() argument
2690 c = cmd_alloc(h); in cciss_send_reset()
2693 return_status = fill_cmd(h, c, CCISS_RESET_MSG, NULL, 0, 0, in cciss_send_reset()
2697 cmd_special_free(h, c); in cciss_send_reset()
2701 enqueue_cmd_and_start_io(h, c); in cciss_send_reset()
2709 static int check_target_status(ctlr_info_t *h, CommandList_struct *c) in check_target_status() argument
2719 if (check_for_unit_attention(h, c)) in check_target_status()
2721 dev_warn(&h->pdev->dev, "cmd 0x%02x " in check_target_status()
2727 dev_warn(&h->pdev->dev, "cmd 0x%02x" in check_target_status()
2735 static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c) in process_sendcmd_error() argument
2744 return_status = check_target_status(h, c); in process_sendcmd_error()
2751 dev_warn(&h->pdev->dev, "cmd 0x%02x is " in process_sendcmd_error()
2756 dev_warn(&h->pdev->dev, "cmd 0x%02x has " in process_sendcmd_error()
2761 dev_warn(&h->pdev->dev, "cmd 0x%02x had " in process_sendcmd_error()
2766 dev_warn(&h->pdev->dev, "cmd 0x%02x had " in process_sendcmd_error()
2771 dev_warn(&h->pdev->dev, "cmd 0x%02x was " in process_sendcmd_error()
2776 dev_warn(&h->pdev->dev, "cmd 0x%02x reports " in process_sendcmd_error()
2781 dev_warn(&h->pdev->dev, "unsolicited abort 0x%02x\n", in process_sendcmd_error()
2786 dev_warn(&h->pdev->dev, "cmd unabortable\n"); in process_sendcmd_error()
2790 dev_warn(&h->pdev->dev, "cmd 0x%02x returned " in process_sendcmd_error()
2798 static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c, in sendcmd_withirq_core() argument
2807 enqueue_cmd_and_start_io(h, c); in sendcmd_withirq_core()
2814 return_status = process_sendcmd_error(h, c); in sendcmd_withirq_core()
2818 dev_warn(&h->pdev->dev, "retrying 0x%02x\n", in sendcmd_withirq_core()
2832 pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, in sendcmd_withirq_core()
2837 static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size, in sendcmd_withirq() argument
2844 c = cmd_special_alloc(h); in sendcmd_withirq()
2847 return_status = fill_cmd(h, c, cmd, buff, size, page_code, in sendcmd_withirq()
2850 return_status = sendcmd_withirq_core(h, c, 1); in sendcmd_withirq()
2852 cmd_special_free(h, c); in sendcmd_withirq()
2856 static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol, in cciss_geometry_inquiry() argument
2867 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_geometry_inquiry()
2868 return_code = sendcmd_withirq(h, CISS_INQUIRY, inq_buff, in cciss_geometry_inquiry()
2872 dev_warn(&h->pdev->dev, in cciss_geometry_inquiry()
2897 dev_warn(&h->pdev->dev, "reading geometry failed\n"); in cciss_geometry_inquiry()
2902 cciss_read_capacity(ctlr_info_t *h, int logvol, sector_t *total_size, in cciss_read_capacity() argument
2911 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_read_capacity()
2915 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_read_capacity()
2916 return_code = sendcmd_withirq(h, CCISS_READ_CAPACITY, buf, in cciss_read_capacity()
2922 dev_warn(&h->pdev->dev, "read capacity failed\n"); in cciss_read_capacity()
2929 static void cciss_read_capacity_16(ctlr_info_t *h, int logvol, in cciss_read_capacity_16() argument
2938 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_read_capacity_16()
2942 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_read_capacity_16()
2943 return_code = sendcmd_withirq(h, CCISS_READ_CAPACITY_16, in cciss_read_capacity_16()
2950 dev_warn(&h->pdev->dev, "read capacity failed\n"); in cciss_read_capacity_16()
2954 dev_info(&h->pdev->dev, " blocks= %llu block_size= %d\n", in cciss_read_capacity_16()
2961 ctlr_info_t *h = get_host(disk); in cciss_revalidate() local
2969 for (logvol = 0; logvol <= h->highest_lun; logvol++) { in cciss_revalidate()
2970 if (!h->drv[logvol]) in cciss_revalidate()
2972 if (memcmp(h->drv[logvol]->LunID, drv->LunID, in cciss_revalidate()
2984 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_revalidate()
2987 if (h->cciss_read == CCISS_READ_10) { in cciss_revalidate()
2988 cciss_read_capacity(h, logvol, in cciss_revalidate()
2991 cciss_read_capacity_16(h, logvol, in cciss_revalidate()
2994 cciss_geometry_inquiry(h, logvol, total_size, block_size, in cciss_revalidate()
3020 static void start_io(ctlr_info_t *h) in start_io() argument
3024 while (!list_empty(&h->reqQ)) { in start_io()
3025 c = list_entry(h->reqQ.next, CommandList_struct, list); in start_io()
3027 if ((h->access.fifo_full(h))) { in start_io()
3028 dev_warn(&h->pdev->dev, "fifo full\n"); in start_io()
3034 h->Qdepth--; in start_io()
3037 h->access.submit_command(h, c); in start_io()
3040 addQ(&h->cmpQ, c); in start_io()
3047 static inline void resend_cciss_cmd(ctlr_info_t *h, CommandList_struct *c) in resend_cciss_cmd() argument
3053 addQ(&h->reqQ, c); in resend_cciss_cmd()
3054 h->Qdepth++; in resend_cciss_cmd()
3055 if (h->Qdepth > h->maxQsinceinit) in resend_cciss_cmd()
3056 h->maxQsinceinit = h->Qdepth; in resend_cciss_cmd()
3058 start_io(h); in resend_cciss_cmd()
3072 static inline int evaluate_target_status(ctlr_info_t *h, in evaluate_target_status() argument
3095 dev_warn(&h->pdev->dev, "cmd %p " in evaluate_target_status()
3108 if (check_for_unit_attention(h, cmd)) { in evaluate_target_status()
3116 dev_warn(&h->pdev->dev, "cmd %p has CHECK CONDITION" in evaluate_target_status()
3137 static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd, in complete_command() argument
3153 rq->errors = evaluate_target_status(h, cmd, &retry_cmd); in complete_command()
3157 dev_warn(&h->pdev->dev, "cmd %p has" in complete_command()
3165 dev_warn(&h->pdev->dev, "cciss: cmd %p has" in complete_command()
3170 dev_warn(&h->pdev->dev, "cciss: cmd %p is " in complete_command()
3178 dev_warn(&h->pdev->dev, "cciss: cmd %p has " in complete_command()
3186 dev_warn(&h->pdev->dev, "cciss: cmd %p had " in complete_command()
3194 dev_warn(&h->pdev->dev, "cciss: cmd %p had " in complete_command()
3202 dev_warn(&h->pdev->dev, "cciss: cmd %p was " in complete_command()
3210 dev_warn(&h->pdev->dev, "cciss: cmd %p reports " in complete_command()
3218 dev_warn(&h->pdev->dev, "cciss%d: unsolicited " in complete_command()
3219 "abort %p\n", h->ctlr, cmd); in complete_command()
3222 dev_warn(&h->pdev->dev, "retrying %p\n", cmd); in complete_command()
3225 dev_warn(&h->pdev->dev, in complete_command()
3233 dev_warn(&h->pdev->dev, "cmd %p timedout\n", cmd); in complete_command()
3240 dev_warn(&h->pdev->dev, "cmd %p unabortable\n", cmd); in complete_command()
3247 dev_warn(&h->pdev->dev, "cmd %p returned " in complete_command()
3260 resend_cciss_cmd(h, cmd); in complete_command()
3279 static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag) in cciss_tag_discard_error_bits() argument
3283 if (likely(h->transMethod & CFGTBL_Trans_Performant)) in cciss_tag_discard_error_bits()
3303 ctlr_info_t *h = q->queuedata; in do_cciss_request() local
3321 BUG_ON(creq->nr_phys_segments > h->maxsgentries); in do_cciss_request()
3323 c = cmd_alloc(h); in do_cciss_request()
3329 tmp_sg = h->scatter_list[c->cmdindex]; in do_cciss_request()
3351 (rq_data_dir(creq) == READ) ? h->cciss_read : h->cciss_write; in do_cciss_request()
3353 dev_dbg(&h->pdev->dev, "sector =%d nr_sectors=%d\n", in do_cciss_request()
3355 sg_init_table(tmp_sg, h->maxsgentries); in do_cciss_request()
3369 if (((sg_index+1) == (h->max_cmd_sgentries)) && in do_cciss_request()
3372 curr_sg = h->cmd_sg_list[c->cmdindex]; in do_cciss_request()
3377 temp64.val = (__u64) pci_map_page(h->pdev, sg_page(&tmp_sg[i]), in do_cciss_request()
3386 cciss_map_sg_chain_block(h, c, h->cmd_sg_list[c->cmdindex], in do_cciss_request()
3387 (seg - (h->max_cmd_sgentries - 1)) * in do_cciss_request()
3391 if (seg > h->maxSG) in do_cciss_request()
3392 h->maxSG = seg; in do_cciss_request()
3394 dev_dbg(&h->pdev->dev, "Submitting %u sectors in %d segments " in do_cciss_request()
3399 if (seg <= h->max_cmd_sgentries) in do_cciss_request()
3402 c->Header.SGList = h->max_cmd_sgentries; in do_cciss_request()
3403 set_performant_mode(h, c); in do_cciss_request()
3406 if(h->cciss_read == CCISS_READ_10) { in do_cciss_request()
3439 dev_warn(&h->pdev->dev, "bad request type %d\n", in do_cciss_request()
3446 addQ(&h->reqQ, c); in do_cciss_request()
3447 h->Qdepth++; in do_cciss_request()
3448 if (h->Qdepth > h->maxQsinceinit) in do_cciss_request()
3449 h->maxQsinceinit = h->Qdepth; in do_cciss_request()
3458 start_io(h); in do_cciss_request()
3461 static inline unsigned long get_next_completion(ctlr_info_t *h) in get_next_completion() argument
3463 return h->access.command_completed(h); in get_next_completion()
3466 static inline int interrupt_pending(ctlr_info_t *h) in interrupt_pending() argument
3468 return h->access.intr_pending(h); in interrupt_pending()
3471 static inline long interrupt_not_for_us(ctlr_info_t *h) in interrupt_not_for_us() argument
3473 return ((h->access.intr_pending(h) == 0) || in interrupt_not_for_us()
3474 (h->interrupts_enabled == 0)); in interrupt_not_for_us()
3477 static inline int bad_tag(ctlr_info_t *h, u32 tag_index, in bad_tag() argument
3480 if (unlikely(tag_index >= h->nr_cmds)) { in bad_tag()
3481 dev_warn(&h->pdev->dev, "bad tag 0x%08x ignored.\n", raw_tag); in bad_tag()
3487 static inline void finish_cmd(ctlr_info_t *h, CommandList_struct *c, in finish_cmd() argument
3492 complete_command(h, c, 0); in finish_cmd()
3501 static inline u32 next_command(ctlr_info_t *h) in next_command() argument
3505 if (unlikely(!(h->transMethod & CFGTBL_Trans_Performant))) in next_command()
3506 return h->access.command_completed(h); in next_command()
3508 if ((*(h->reply_pool_head) & 1) == (h->reply_pool_wraparound)) { in next_command()
3509 a = *(h->reply_pool_head); /* Next cmd in ring buffer */ in next_command()
3510 (h->reply_pool_head)++; in next_command()
3511 h->commands_outstanding--; in next_command()
3516 if (h->reply_pool_head == (h->reply_pool + h->max_commands)) { in next_command()
3517 h->reply_pool_head = h->reply_pool; in next_command()
3518 h->reply_pool_wraparound ^= 1; in next_command()
3524 static inline u32 process_indexed_cmd(ctlr_info_t *h, u32 raw_tag) in process_indexed_cmd() argument
3530 if (bad_tag(h, tag_index, raw_tag)) in process_indexed_cmd()
3531 return next_command(h); in process_indexed_cmd()
3532 c = h->cmd_pool + tag_index; in process_indexed_cmd()
3533 finish_cmd(h, c, raw_tag); in process_indexed_cmd()
3534 return next_command(h); in process_indexed_cmd()
3538 static inline u32 process_nonindexed_cmd(ctlr_info_t *h, u32 raw_tag) in process_nonindexed_cmd() argument
3543 tag_masked = cciss_tag_discard_error_bits(h, raw_tag); in process_nonindexed_cmd()
3544 list_for_each_entry(c, &h->cmpQ, list) { in process_nonindexed_cmd()
3545 busaddr_masked = cciss_tag_discard_error_bits(h, c->busaddr); in process_nonindexed_cmd()
3547 finish_cmd(h, c, raw_tag); in process_nonindexed_cmd()
3548 return next_command(h); in process_nonindexed_cmd()
3551 bad_tag(h, h->nr_cmds + 1, raw_tag); in process_nonindexed_cmd()
3552 return next_command(h); in process_nonindexed_cmd()
3560 static int ignore_bogus_interrupt(ctlr_info_t *h) in ignore_bogus_interrupt() argument
3565 if (likely(h->interrupts_enabled)) in ignore_bogus_interrupt()
3568 dev_info(&h->pdev->dev, "Received interrupt while interrupts disabled " in ignore_bogus_interrupt()
3576 ctlr_info_t *h = dev_id; in cciss_intx_discard_completions() local
3580 if (ignore_bogus_interrupt(h)) in cciss_intx_discard_completions()
3583 if (interrupt_not_for_us(h)) in cciss_intx_discard_completions()
3585 spin_lock_irqsave(&h->lock, flags); in cciss_intx_discard_completions()
3586 while (interrupt_pending(h)) { in cciss_intx_discard_completions()
3587 raw_tag = get_next_completion(h); in cciss_intx_discard_completions()
3589 raw_tag = next_command(h); in cciss_intx_discard_completions()
3591 spin_unlock_irqrestore(&h->lock, flags); in cciss_intx_discard_completions()
3597 ctlr_info_t *h = dev_id; in cciss_msix_discard_completions() local
3601 if (ignore_bogus_interrupt(h)) in cciss_msix_discard_completions()
3604 spin_lock_irqsave(&h->lock, flags); in cciss_msix_discard_completions()
3605 raw_tag = get_next_completion(h); in cciss_msix_discard_completions()
3607 raw_tag = next_command(h); in cciss_msix_discard_completions()
3608 spin_unlock_irqrestore(&h->lock, flags); in cciss_msix_discard_completions()
3614 ctlr_info_t *h = dev_id; in do_cciss_intx() local
3618 if (interrupt_not_for_us(h)) in do_cciss_intx()
3620 spin_lock_irqsave(&h->lock, flags); in do_cciss_intx()
3621 while (interrupt_pending(h)) { in do_cciss_intx()
3622 raw_tag = get_next_completion(h); in do_cciss_intx()
3625 raw_tag = process_indexed_cmd(h, raw_tag); in do_cciss_intx()
3627 raw_tag = process_nonindexed_cmd(h, raw_tag); in do_cciss_intx()
3630 spin_unlock_irqrestore(&h->lock, flags); in do_cciss_intx()
3639 ctlr_info_t *h = dev_id; in do_cciss_msix_intr() local
3643 spin_lock_irqsave(&h->lock, flags); in do_cciss_msix_intr()
3644 raw_tag = get_next_completion(h); in do_cciss_msix_intr()
3647 raw_tag = process_indexed_cmd(h, raw_tag); in do_cciss_msix_intr()
3649 raw_tag = process_nonindexed_cmd(h, raw_tag); in do_cciss_msix_intr()
3651 spin_unlock_irqrestore(&h->lock, flags); in do_cciss_msix_intr()
3665 static int add_to_scan_list(struct ctlr_info *h) in add_to_scan_list() argument
3671 if (h->busy_initializing) in add_to_scan_list()
3674 if (!mutex_trylock(&h->busy_shutting_down)) in add_to_scan_list()
3679 if (test_h == h) { in add_to_scan_list()
3684 if (!found && !h->busy_scanning) { in add_to_scan_list()
3685 reinit_completion(&h->scan_wait); in add_to_scan_list()
3686 list_add_tail(&h->scan_list, &scan_q); in add_to_scan_list()
3690 mutex_unlock(&h->busy_shutting_down); in add_to_scan_list()
3708 static void remove_from_scan_list(struct ctlr_info *h) in remove_from_scan_list() argument
3714 if (test_h == h) { /* state 2. */ in remove_from_scan_list()
3715 list_del(&h->scan_list); in remove_from_scan_list()
3716 complete_all(&h->scan_wait); in remove_from_scan_list()
3721 if (h->busy_scanning) { /* state 3. */ in remove_from_scan_list()
3723 wait_for_completion(&h->scan_wait); in remove_from_scan_list()
3743 struct ctlr_info *h; in scan_thread() local
3758 h = list_entry(scan_q.next, in scan_thread()
3761 list_del(&h->scan_list); in scan_thread()
3762 h->busy_scanning = 1; in scan_thread()
3765 rebuild_lun_table(h, 0, 0); in scan_thread()
3766 complete_all(&h->scan_wait); in scan_thread()
3768 h->busy_scanning = 0; in scan_thread()
3776 static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c) in check_for_unit_attention() argument
3783 dev_warn(&h->pdev->dev, "a state change " in check_for_unit_attention()
3788 dev_warn(&h->pdev->dev, "LUN failure " in check_for_unit_attention()
3793 dev_warn(&h->pdev->dev, "report LUN data changed\n"); in check_for_unit_attention()
3813 dev_warn(&h->pdev->dev, in check_for_unit_attention()
3818 dev_warn(&h->pdev->dev, in check_for_unit_attention()
3823 dev_warn(&h->pdev->dev, "unknown unit attention detected\n"); in check_for_unit_attention()
3833 static void print_cfg_table(ctlr_info_t *h) in print_cfg_table() argument
3837 CfgTable_struct *tb = h->cfgtable; in print_cfg_table()
3839 dev_dbg(&h->pdev->dev, "Controller Configuration information\n"); in print_cfg_table()
3840 dev_dbg(&h->pdev->dev, "------------------------------------\n"); in print_cfg_table()
3844 dev_dbg(&h->pdev->dev, " Signature = %s\n", temp_name); in print_cfg_table()
3845 dev_dbg(&h->pdev->dev, " Spec Number = %d\n", in print_cfg_table()
3847 dev_dbg(&h->pdev->dev, " Transport methods supported = 0x%x\n", in print_cfg_table()
3849 dev_dbg(&h->pdev->dev, " Transport methods active = 0x%x\n", in print_cfg_table()
3851 dev_dbg(&h->pdev->dev, " Requested transport Method = 0x%x\n", in print_cfg_table()
3853 dev_dbg(&h->pdev->dev, " Coalesce Interrupt Delay = 0x%x\n", in print_cfg_table()
3855 dev_dbg(&h->pdev->dev, " Coalesce Interrupt Count = 0x%x\n", in print_cfg_table()
3857 dev_dbg(&h->pdev->dev, " Max outstanding commands = 0x%d\n", in print_cfg_table()
3859 dev_dbg(&h->pdev->dev, " Bus Types = 0x%x\n", in print_cfg_table()
3864 dev_dbg(&h->pdev->dev, " Server Name = %s\n", temp_name); in print_cfg_table()
3865 dev_dbg(&h->pdev->dev, " Heartbeat Counter = 0x%x\n\n\n", in print_cfg_table()
3940 static void cciss_wait_for_mode_change_ack(ctlr_info_t *h) in cciss_wait_for_mode_change_ack() argument
3948 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_wait_for_mode_change_ack()
3954 static void cciss_enter_performant_mode(ctlr_info_t *h, u32 use_short_tags) in cciss_enter_performant_mode() argument
3984 h->reply_pool_wraparound = 1; /* spec: init to 1 */ in cciss_enter_performant_mode()
3987 memset(h->reply_pool, 0, h->max_commands * sizeof(__u64)); in cciss_enter_performant_mode()
3988 h->reply_pool_head = h->reply_pool; in cciss_enter_performant_mode()
3990 trans_offset = readl(&(h->cfgtable->TransMethodOffset)); in cciss_enter_performant_mode()
3991 calc_bucket_map(bft, ARRAY_SIZE(bft), h->maxsgentries, in cciss_enter_performant_mode()
3992 h->blockFetchTable); in cciss_enter_performant_mode()
3993 writel(bft[0], &h->transtable->BlockFetch0); in cciss_enter_performant_mode()
3994 writel(bft[1], &h->transtable->BlockFetch1); in cciss_enter_performant_mode()
3995 writel(bft[2], &h->transtable->BlockFetch2); in cciss_enter_performant_mode()
3996 writel(bft[3], &h->transtable->BlockFetch3); in cciss_enter_performant_mode()
3997 writel(bft[4], &h->transtable->BlockFetch4); in cciss_enter_performant_mode()
3998 writel(bft[5], &h->transtable->BlockFetch5); in cciss_enter_performant_mode()
3999 writel(bft[6], &h->transtable->BlockFetch6); in cciss_enter_performant_mode()
4000 writel(bft[7], &h->transtable->BlockFetch7); in cciss_enter_performant_mode()
4003 writel(h->max_commands, &h->transtable->RepQSize); in cciss_enter_performant_mode()
4004 writel(1, &h->transtable->RepQCount); in cciss_enter_performant_mode()
4005 writel(0, &h->transtable->RepQCtrAddrLow32); in cciss_enter_performant_mode()
4006 writel(0, &h->transtable->RepQCtrAddrHigh32); in cciss_enter_performant_mode()
4007 writel(h->reply_pool_dhandle, &h->transtable->RepQAddr0Low32); in cciss_enter_performant_mode()
4008 writel(0, &h->transtable->RepQAddr0High32); in cciss_enter_performant_mode()
4010 &(h->cfgtable->HostWrite.TransportRequest)); in cciss_enter_performant_mode()
4012 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_enter_performant_mode()
4013 cciss_wait_for_mode_change_ack(h); in cciss_enter_performant_mode()
4014 register_value = readl(&(h->cfgtable->TransportActive)); in cciss_enter_performant_mode()
4016 dev_warn(&h->pdev->dev, "cciss: unable to get board into" in cciss_enter_performant_mode()
4020 static void cciss_put_controller_into_performant_mode(ctlr_info_t *h) in cciss_put_controller_into_performant_mode() argument
4027 dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n"); in cciss_put_controller_into_performant_mode()
4030 trans_support = readl(&(h->cfgtable->TransportSupport)); in cciss_put_controller_into_performant_mode()
4034 dev_dbg(&h->pdev->dev, "Placing controller into performant mode\n"); in cciss_put_controller_into_performant_mode()
4040 dev_warn(&h->pdev->dev, "%s %d %s\n", in cciss_put_controller_into_performant_mode()
4048 h->reply_pool = (__u64 *)pci_alloc_consistent( in cciss_put_controller_into_performant_mode()
4049 h->pdev, h->max_commands * sizeof(__u64), in cciss_put_controller_into_performant_mode()
4050 &(h->reply_pool_dhandle)); in cciss_put_controller_into_performant_mode()
4053 h->blockFetchTable = kmalloc(((h->maxsgentries+1) * in cciss_put_controller_into_performant_mode()
4056 if ((h->reply_pool == NULL) || (h->blockFetchTable == NULL)) in cciss_put_controller_into_performant_mode()
4059 cciss_enter_performant_mode(h, in cciss_put_controller_into_performant_mode()
4063 h->access = SA5_performant_access; in cciss_put_controller_into_performant_mode()
4064 h->transMethod = CFGTBL_Trans_Performant; in cciss_put_controller_into_performant_mode()
4068 kfree(h->blockFetchTable); in cciss_put_controller_into_performant_mode()
4069 if (h->reply_pool) in cciss_put_controller_into_performant_mode()
4070 pci_free_consistent(h->pdev, in cciss_put_controller_into_performant_mode()
4071 h->max_commands * sizeof(__u64), in cciss_put_controller_into_performant_mode()
4072 h->reply_pool, in cciss_put_controller_into_performant_mode()
4073 h->reply_pool_dhandle); in cciss_put_controller_into_performant_mode()
4082 static void cciss_interrupt_mode(ctlr_info_t *h) in cciss_interrupt_mode() argument
4091 if ((h->board_id == 0x40700E11) || (h->board_id == 0x40800E11) || in cciss_interrupt_mode()
4092 (h->board_id == 0x40820E11) || (h->board_id == 0x40830E11)) in cciss_interrupt_mode()
4095 if (pci_find_capability(h->pdev, PCI_CAP_ID_MSIX)) { in cciss_interrupt_mode()
4096 err = pci_enable_msix_exact(h->pdev, cciss_msix_entries, 4); in cciss_interrupt_mode()
4098 h->intr[0] = cciss_msix_entries[0].vector; in cciss_interrupt_mode()
4099 h->intr[1] = cciss_msix_entries[1].vector; in cciss_interrupt_mode()
4100 h->intr[2] = cciss_msix_entries[2].vector; in cciss_interrupt_mode()
4101 h->intr[3] = cciss_msix_entries[3].vector; in cciss_interrupt_mode()
4102 h->msix_vector = 1; in cciss_interrupt_mode()
4105 dev_warn(&h->pdev->dev, in cciss_interrupt_mode()
4109 if (pci_find_capability(h->pdev, PCI_CAP_ID_MSI)) { in cciss_interrupt_mode()
4110 if (!pci_enable_msi(h->pdev)) in cciss_interrupt_mode()
4111 h->msi_vector = 1; in cciss_interrupt_mode()
4113 dev_warn(&h->pdev->dev, "MSI init failed\n"); in cciss_interrupt_mode()
4118 h->intr[h->intr_mode] = h->pdev->irq; in cciss_interrupt_mode()
4144 static inline bool cciss_board_disabled(ctlr_info_t *h) in cciss_board_disabled() argument
4148 (void) pci_read_config_word(h->pdev, PCI_COMMAND, &command); in cciss_board_disabled()
4213 static int cciss_find_cfgtables(ctlr_info_t *h) in cciss_find_cfgtables() argument
4221 rc = cciss_find_cfg_addrs(h->pdev, h->vaddr, &cfg_base_addr, in cciss_find_cfgtables()
4225 h->cfgtable = remap_pci_mem(pci_resource_start(h->pdev, in cciss_find_cfgtables()
4226 cfg_base_addr_index) + cfg_offset, sizeof(*h->cfgtable)); in cciss_find_cfgtables()
4227 if (!h->cfgtable) in cciss_find_cfgtables()
4229 rc = write_driver_ver_to_cfgtable(h->cfgtable); in cciss_find_cfgtables()
4233 trans_offset = readl(&h->cfgtable->TransMethodOffset); in cciss_find_cfgtables()
4234 h->transtable = remap_pci_mem(pci_resource_start(h->pdev, in cciss_find_cfgtables()
4236 sizeof(*h->transtable)); in cciss_find_cfgtables()
4237 if (!h->transtable) in cciss_find_cfgtables()
4242 static void cciss_get_max_perf_mode_cmds(struct ctlr_info *h) in cciss_get_max_perf_mode_cmds() argument
4244 h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands)); in cciss_get_max_perf_mode_cmds()
4247 if (reset_devices && h->max_commands > 32) in cciss_get_max_perf_mode_cmds()
4248 h->max_commands = 32; in cciss_get_max_perf_mode_cmds()
4250 if (h->max_commands < 16) { in cciss_get_max_perf_mode_cmds()
4251 dev_warn(&h->pdev->dev, "Controller reports " in cciss_get_max_perf_mode_cmds()
4254 h->max_commands); in cciss_get_max_perf_mode_cmds()
4255 h->max_commands = 16; in cciss_get_max_perf_mode_cmds()
4263 static void cciss_find_board_params(ctlr_info_t *h) in cciss_find_board_params() argument
4265 cciss_get_max_perf_mode_cmds(h); in cciss_find_board_params()
4266 h->nr_cmds = h->max_commands - 4 - cciss_tape_cmds; in cciss_find_board_params()
4267 h->maxsgentries = readl(&(h->cfgtable->MaxSGElements)); in cciss_find_board_params()
4273 if (h->board_id == 0x3225103C) in cciss_find_board_params()
4274 h->maxsgentries = MAXSGENTRIES; in cciss_find_board_params()
4279 h->max_cmd_sgentries = 31; in cciss_find_board_params()
4280 if (h->maxsgentries > 512) { in cciss_find_board_params()
4281 h->max_cmd_sgentries = 32; in cciss_find_board_params()
4282 h->chainsize = h->maxsgentries - h->max_cmd_sgentries + 1; in cciss_find_board_params()
4283 h->maxsgentries--; /* save one for chain pointer */ in cciss_find_board_params()
4285 h->maxsgentries = 31; /* default to traditional values */ in cciss_find_board_params()
4286 h->chainsize = 0; in cciss_find_board_params()
4290 static inline bool CISS_signature_present(ctlr_info_t *h) in CISS_signature_present() argument
4292 if (!check_signature(h->cfgtable->Signature, "CISS", 4)) { in CISS_signature_present()
4293 dev_warn(&h->pdev->dev, "not a valid CISS config table\n"); in CISS_signature_present()
4300 static inline void cciss_enable_scsi_prefetch(ctlr_info_t *h) in cciss_enable_scsi_prefetch() argument
4305 prefetch = readl(&(h->cfgtable->SCSI_Prefetch)); in cciss_enable_scsi_prefetch()
4307 writel(prefetch, &(h->cfgtable->SCSI_Prefetch)); in cciss_enable_scsi_prefetch()
4314 static inline void cciss_p600_dma_prefetch_quirk(ctlr_info_t *h) in cciss_p600_dma_prefetch_quirk() argument
4319 if (h->board_id != 0x3225103C) in cciss_p600_dma_prefetch_quirk()
4321 dma_prefetch = readl(h->vaddr + I2O_DMA1_CFG); in cciss_p600_dma_prefetch_quirk()
4323 writel(dma_prefetch, h->vaddr + I2O_DMA1_CFG); in cciss_p600_dma_prefetch_quirk()
4324 pci_read_config_dword(h->pdev, PCI_COMMAND_PARITY, &dma_refetch); in cciss_p600_dma_prefetch_quirk()
4326 pci_write_config_dword(h->pdev, PCI_COMMAND_PARITY, dma_refetch); in cciss_p600_dma_prefetch_quirk()
4329 static int cciss_pci_init(ctlr_info_t *h) in cciss_pci_init() argument
4333 prod_index = cciss_lookup_board_id(h->pdev, &h->board_id); in cciss_pci_init()
4336 h->product_name = products[prod_index].product_name; in cciss_pci_init()
4337 h->access = *(products[prod_index].access); in cciss_pci_init()
4339 if (cciss_board_disabled(h)) { in cciss_pci_init()
4340 dev_warn(&h->pdev->dev, "controller appears to be disabled\n"); in cciss_pci_init()
4344 pci_disable_link_state(h->pdev, PCIE_LINK_STATE_L0S | in cciss_pci_init()
4347 err = pci_enable_device(h->pdev); in cciss_pci_init()
4349 dev_warn(&h->pdev->dev, "Unable to Enable PCI device\n"); in cciss_pci_init()
4353 err = pci_request_regions(h->pdev, "cciss"); in cciss_pci_init()
4355 dev_warn(&h->pdev->dev, in cciss_pci_init()
4360 dev_dbg(&h->pdev->dev, "irq = %x\n", h->pdev->irq); in cciss_pci_init()
4361 dev_dbg(&h->pdev->dev, "board_id = %x\n", h->board_id); in cciss_pci_init()
4366 cciss_interrupt_mode(h); in cciss_pci_init()
4367 err = cciss_pci_find_memory_BAR(h->pdev, &h->paddr); in cciss_pci_init()
4370 h->vaddr = remap_pci_mem(h->paddr, 0x250); in cciss_pci_init()
4371 if (!h->vaddr) { in cciss_pci_init()
4375 err = cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_READY); in cciss_pci_init()
4378 err = cciss_find_cfgtables(h); in cciss_pci_init()
4381 print_cfg_table(h); in cciss_pci_init()
4382 cciss_find_board_params(h); in cciss_pci_init()
4384 if (!CISS_signature_present(h)) { in cciss_pci_init()
4388 cciss_enable_scsi_prefetch(h); in cciss_pci_init()
4389 cciss_p600_dma_prefetch_quirk(h); in cciss_pci_init()
4390 err = cciss_enter_simple_mode(h); in cciss_pci_init()
4393 cciss_put_controller_into_performant_mode(h); in cciss_pci_init()
4401 if (h->transtable) in cciss_pci_init()
4402 iounmap(h->transtable); in cciss_pci_init()
4403 if (h->cfgtable) in cciss_pci_init()
4404 iounmap(h->cfgtable); in cciss_pci_init()
4405 if (h->vaddr) in cciss_pci_init()
4406 iounmap(h->vaddr); in cciss_pci_init()
4407 pci_release_regions(h->pdev); in cciss_pci_init()
4420 ctlr_info_t *h; in alloc_cciss_hba() local
4422 h = kzalloc(sizeof(ctlr_info_t), GFP_KERNEL); in alloc_cciss_hba()
4423 if (!h) in alloc_cciss_hba()
4425 hba[i] = h; in alloc_cciss_hba()
4437 static void free_hba(ctlr_info_t *h) in free_hba() argument
4441 hba[h->ctlr] = NULL; in free_hba()
4442 for (i = 0; i < h->highest_lun + 1; i++) in free_hba()
4443 if (h->gendisk[i] != NULL) in free_hba()
4444 put_disk(h->gendisk[i]); in free_hba()
4445 kfree(h); in free_hba()
4829 static int cciss_allocate_cmd_pool(ctlr_info_t *h) in cciss_allocate_cmd_pool() argument
4831 h->cmd_pool_bits = kmalloc(BITS_TO_LONGS(h->nr_cmds) * in cciss_allocate_cmd_pool()
4833 h->cmd_pool = pci_alloc_consistent(h->pdev, in cciss_allocate_cmd_pool()
4834 h->nr_cmds * sizeof(CommandList_struct), in cciss_allocate_cmd_pool()
4835 &(h->cmd_pool_dhandle)); in cciss_allocate_cmd_pool()
4836 h->errinfo_pool = pci_alloc_consistent(h->pdev, in cciss_allocate_cmd_pool()
4837 h->nr_cmds * sizeof(ErrorInfo_struct), in cciss_allocate_cmd_pool()
4838 &(h->errinfo_pool_dhandle)); in cciss_allocate_cmd_pool()
4839 if ((h->cmd_pool_bits == NULL) in cciss_allocate_cmd_pool()
4840 || (h->cmd_pool == NULL) in cciss_allocate_cmd_pool()
4841 || (h->errinfo_pool == NULL)) { in cciss_allocate_cmd_pool()
4842 dev_err(&h->pdev->dev, "out of memory"); in cciss_allocate_cmd_pool()
4848 static int cciss_allocate_scatterlists(ctlr_info_t *h) in cciss_allocate_scatterlists() argument
4853 h->scatter_list = kzalloc(h->max_commands * in cciss_allocate_scatterlists()
4855 if (!h->scatter_list) in cciss_allocate_scatterlists()
4858 for (i = 0; i < h->nr_cmds; i++) { in cciss_allocate_scatterlists()
4859 h->scatter_list[i] = kmalloc(sizeof(struct scatterlist) * in cciss_allocate_scatterlists()
4860 h->maxsgentries, GFP_KERNEL); in cciss_allocate_scatterlists()
4861 if (h->scatter_list[i] == NULL) { in cciss_allocate_scatterlists()
4862 dev_err(&h->pdev->dev, "could not allocate " in cciss_allocate_scatterlists()
4870 static void cciss_free_scatterlists(ctlr_info_t *h) in cciss_free_scatterlists() argument
4874 if (h->scatter_list) { in cciss_free_scatterlists()
4875 for (i = 0; i < h->nr_cmds; i++) in cciss_free_scatterlists()
4876 kfree(h->scatter_list[i]); in cciss_free_scatterlists()
4877 kfree(h->scatter_list); in cciss_free_scatterlists()
4881 static void cciss_free_cmd_pool(ctlr_info_t *h) in cciss_free_cmd_pool() argument
4883 kfree(h->cmd_pool_bits); in cciss_free_cmd_pool()
4884 if (h->cmd_pool) in cciss_free_cmd_pool()
4885 pci_free_consistent(h->pdev, in cciss_free_cmd_pool()
4886 h->nr_cmds * sizeof(CommandList_struct), in cciss_free_cmd_pool()
4887 h->cmd_pool, h->cmd_pool_dhandle); in cciss_free_cmd_pool()
4888 if (h->errinfo_pool) in cciss_free_cmd_pool()
4889 pci_free_consistent(h->pdev, in cciss_free_cmd_pool()
4890 h->nr_cmds * sizeof(ErrorInfo_struct), in cciss_free_cmd_pool()
4891 h->errinfo_pool, h->errinfo_pool_dhandle); in cciss_free_cmd_pool()
4894 static int cciss_request_irq(ctlr_info_t *h, in cciss_request_irq() argument
4898 if (h->msix_vector || h->msi_vector) { in cciss_request_irq()
4899 if (!request_irq(h->intr[h->intr_mode], msixhandler, in cciss_request_irq()
4900 0, h->devname, h)) in cciss_request_irq()
4902 dev_err(&h->pdev->dev, "Unable to get msi irq %d" in cciss_request_irq()
4903 " for %s\n", h->intr[h->intr_mode], in cciss_request_irq()
4904 h->devname); in cciss_request_irq()
4908 if (!request_irq(h->intr[h->intr_mode], intxhandler, in cciss_request_irq()
4909 IRQF_SHARED, h->devname, h)) in cciss_request_irq()
4911 dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n", in cciss_request_irq()
4912 h->intr[h->intr_mode], h->devname); in cciss_request_irq()
4916 static int cciss_kdump_soft_reset(ctlr_info_t *h) in cciss_kdump_soft_reset() argument
4918 if (cciss_send_reset(h, CTLR_LUNID, CCISS_RESET_TYPE_CONTROLLER)) { in cciss_kdump_soft_reset()
4919 dev_warn(&h->pdev->dev, "Resetting array controller failed.\n"); in cciss_kdump_soft_reset()
4923 dev_info(&h->pdev->dev, "Waiting for board to soft reset.\n"); in cciss_kdump_soft_reset()
4924 if (cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_NOT_READY)) { in cciss_kdump_soft_reset()
4925 dev_warn(&h->pdev->dev, "Soft reset had no effect.\n"); in cciss_kdump_soft_reset()
4929 dev_info(&h->pdev->dev, "Board reset, awaiting READY status.\n"); in cciss_kdump_soft_reset()
4930 if (cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_READY)) { in cciss_kdump_soft_reset()
4931 dev_warn(&h->pdev->dev, "Board failed to become ready " in cciss_kdump_soft_reset()
4939 static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h) in cciss_undo_allocations_after_kdump_soft_reset() argument
4941 int ctlr = h->ctlr; in cciss_undo_allocations_after_kdump_soft_reset()
4943 free_irq(h->intr[h->intr_mode], h); in cciss_undo_allocations_after_kdump_soft_reset()
4945 if (h->msix_vector) in cciss_undo_allocations_after_kdump_soft_reset()
4946 pci_disable_msix(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4947 else if (h->msi_vector) in cciss_undo_allocations_after_kdump_soft_reset()
4948 pci_disable_msi(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4950 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_undo_allocations_after_kdump_soft_reset()
4951 cciss_free_scatterlists(h); in cciss_undo_allocations_after_kdump_soft_reset()
4952 cciss_free_cmd_pool(h); in cciss_undo_allocations_after_kdump_soft_reset()
4953 kfree(h->blockFetchTable); in cciss_undo_allocations_after_kdump_soft_reset()
4954 if (h->reply_pool) in cciss_undo_allocations_after_kdump_soft_reset()
4955 pci_free_consistent(h->pdev, h->max_commands * sizeof(__u64), in cciss_undo_allocations_after_kdump_soft_reset()
4956 h->reply_pool, h->reply_pool_dhandle); in cciss_undo_allocations_after_kdump_soft_reset()
4957 if (h->transtable) in cciss_undo_allocations_after_kdump_soft_reset()
4958 iounmap(h->transtable); in cciss_undo_allocations_after_kdump_soft_reset()
4959 if (h->cfgtable) in cciss_undo_allocations_after_kdump_soft_reset()
4960 iounmap(h->cfgtable); in cciss_undo_allocations_after_kdump_soft_reset()
4961 if (h->vaddr) in cciss_undo_allocations_after_kdump_soft_reset()
4962 iounmap(h->vaddr); in cciss_undo_allocations_after_kdump_soft_reset()
4963 unregister_blkdev(h->major, h->devname); in cciss_undo_allocations_after_kdump_soft_reset()
4964 cciss_destroy_hba_sysfs_entry(h); in cciss_undo_allocations_after_kdump_soft_reset()
4965 pci_release_regions(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4966 kfree(h); in cciss_undo_allocations_after_kdump_soft_reset()
4983 ctlr_info_t *h; in cciss_init_one() local
5015 h = hba[i]; in cciss_init_one()
5016 h->pdev = pdev; in cciss_init_one()
5017 h->busy_initializing = 1; in cciss_init_one()
5018 h->intr_mode = cciss_simple_mode ? SIMPLE_MODE_INT : PERF_MODE_INT; in cciss_init_one()
5019 INIT_LIST_HEAD(&h->cmpQ); in cciss_init_one()
5020 INIT_LIST_HEAD(&h->reqQ); in cciss_init_one()
5021 mutex_init(&h->busy_shutting_down); in cciss_init_one()
5023 if (cciss_pci_init(h) != 0) in cciss_init_one()
5026 sprintf(h->devname, "cciss%d", i); in cciss_init_one()
5027 h->ctlr = i; in cciss_init_one()
5034 init_completion(&h->scan_wait); in cciss_init_one()
5036 if (cciss_create_hba_sysfs_entry(h)) in cciss_init_one()
5045 dev_err(&h->pdev->dev, "no suitable DMA available\n"); in cciss_init_one()
5055 h->major = COMPAQ_CISS_MAJOR + i; in cciss_init_one()
5056 rc = register_blkdev(h->major, h->devname); in cciss_init_one()
5058 dev_err(&h->pdev->dev, in cciss_init_one()
5060 "on hba %d\n", h->major, h->devname, i); in cciss_init_one()
5064 h->major = rc; in cciss_init_one()
5068 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5069 rc = cciss_request_irq(h, do_cciss_msix_intr, do_cciss_intx); in cciss_init_one()
5073 dev_info(&h->pdev->dev, "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n", in cciss_init_one()
5074 h->devname, pdev->device, pci_name(pdev), in cciss_init_one()
5075 h->intr[h->intr_mode], dac ? "" : " not"); in cciss_init_one()
5077 if (cciss_allocate_cmd_pool(h)) in cciss_init_one()
5080 if (cciss_allocate_scatterlists(h)) in cciss_init_one()
5083 h->cmd_sg_list = cciss_allocate_sg_chain_blocks(h, in cciss_init_one()
5084 h->chainsize, h->nr_cmds); in cciss_init_one()
5085 if (!h->cmd_sg_list && h->chainsize > 0) in cciss_init_one()
5088 spin_lock_init(&h->lock); in cciss_init_one()
5092 pci_set_drvdata(pdev, h); in cciss_init_one()
5095 bitmap_zero(h->cmd_pool_bits, h->nr_cmds); in cciss_init_one()
5097 h->num_luns = 0; in cciss_init_one()
5098 h->highest_lun = -1; in cciss_init_one()
5100 h->drv[j] = NULL; in cciss_init_one()
5101 h->gendisk[j] = NULL; in cciss_init_one()
5117 spin_lock_irqsave(&h->lock, flags); in cciss_init_one()
5118 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5119 spin_unlock_irqrestore(&h->lock, flags); in cciss_init_one()
5120 free_irq(h->intr[h->intr_mode], h); in cciss_init_one()
5121 rc = cciss_request_irq(h, cciss_msix_discard_completions, in cciss_init_one()
5124 dev_warn(&h->pdev->dev, "Failed to request_irq after " in cciss_init_one()
5129 rc = cciss_kdump_soft_reset(h); in cciss_init_one()
5131 dev_warn(&h->pdev->dev, "Soft reset failed.\n"); in cciss_init_one()
5135 dev_info(&h->pdev->dev, "Board READY.\n"); in cciss_init_one()
5136 dev_info(&h->pdev->dev, in cciss_init_one()
5138 h->access.set_intr_mask(h, CCISS_INTR_ON); in cciss_init_one()
5140 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5142 rc = controller_reset_failed(h->cfgtable); in cciss_init_one()
5144 dev_info(&h->pdev->dev, in cciss_init_one()
5151 cciss_undo_allocations_after_kdump_soft_reset(h); in cciss_init_one()
5160 cciss_scsi_setup(h); in cciss_init_one()
5163 h->access.set_intr_mask(h, CCISS_INTR_ON); in cciss_init_one()
5168 dev_err(&h->pdev->dev, "out of memory\n"); in cciss_init_one()
5172 return_code = sendcmd_withirq(h, CISS_INQUIRY, inq_buff, in cciss_init_one()
5175 h->firm_ver[0] = inq_buff->data_byte[32]; in cciss_init_one()
5176 h->firm_ver[1] = inq_buff->data_byte[33]; in cciss_init_one()
5177 h->firm_ver[2] = inq_buff->data_byte[34]; in cciss_init_one()
5178 h->firm_ver[3] = inq_buff->data_byte[35]; in cciss_init_one()
5180 dev_warn(&h->pdev->dev, "unable to determine firmware" in cciss_init_one()
5185 cciss_procinit(h); in cciss_init_one()
5187 h->cciss_max_sectors = 8192; in cciss_init_one()
5189 rebuild_lun_table(h, 1, 0); in cciss_init_one()
5190 cciss_engage_scsi(h); in cciss_init_one()
5191 h->busy_initializing = 0; in cciss_init_one()
5195 cciss_free_cmd_pool(h); in cciss_init_one()
5196 cciss_free_scatterlists(h); in cciss_init_one()
5197 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_init_one()
5198 free_irq(h->intr[h->intr_mode], h); in cciss_init_one()
5200 unregister_blkdev(h->major, h->devname); in cciss_init_one()
5202 cciss_destroy_hba_sysfs_entry(h); in cciss_init_one()
5206 h->busy_initializing = 0; in cciss_init_one()
5213 free_hba(h); in cciss_init_one()
5219 ctlr_info_t *h; in cciss_shutdown() local
5223 h = pci_get_drvdata(pdev); in cciss_shutdown()
5226 dev_warn(&h->pdev->dev, "cache not flushed, out of memory.\n"); in cciss_shutdown()
5230 return_code = sendcmd_withirq(h, CCISS_CACHE_FLUSH, flush_buf, in cciss_shutdown()
5234 dev_warn(&h->pdev->dev, "Error flushing cache\n"); in cciss_shutdown()
5235 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_shutdown()
5236 free_irq(h->intr[h->intr_mode], h); in cciss_shutdown()
5239 static int cciss_enter_simple_mode(struct ctlr_info *h) in cciss_enter_simple_mode() argument
5243 trans_support = readl(&(h->cfgtable->TransportSupport)); in cciss_enter_simple_mode()
5247 h->max_commands = readl(&(h->cfgtable->CmdsOutMax)); in cciss_enter_simple_mode()
5248 writel(CFGTBL_Trans_Simple, &(h->cfgtable->HostWrite.TransportRequest)); in cciss_enter_simple_mode()
5249 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_enter_simple_mode()
5250 cciss_wait_for_mode_change_ack(h); in cciss_enter_simple_mode()
5251 print_cfg_table(h); in cciss_enter_simple_mode()
5252 if (!(readl(&(h->cfgtable->TransportActive)) & CFGTBL_Trans_Simple)) { in cciss_enter_simple_mode()
5253 dev_warn(&h->pdev->dev, "unable to get board into simple mode\n"); in cciss_enter_simple_mode()
5256 h->transMethod = CFGTBL_Trans_Simple; in cciss_enter_simple_mode()
5263 ctlr_info_t *h; in cciss_remove_one() local
5271 h = pci_get_drvdata(pdev); in cciss_remove_one()
5272 i = h->ctlr; in cciss_remove_one()
5278 mutex_lock(&h->busy_shutting_down); in cciss_remove_one()
5280 remove_from_scan_list(h); in cciss_remove_one()
5281 remove_proc_entry(h->devname, proc_cciss); in cciss_remove_one()
5282 unregister_blkdev(h->major, h->devname); in cciss_remove_one()
5286 struct gendisk *disk = h->gendisk[j]; in cciss_remove_one()
5291 cciss_destroy_ld_sysfs_entry(h, j, 1); in cciss_remove_one()
5300 cciss_unregister_scsi(h); /* unhook from SCSI subsystem */ in cciss_remove_one()
5306 if (h->msix_vector) in cciss_remove_one()
5307 pci_disable_msix(h->pdev); in cciss_remove_one()
5308 else if (h->msi_vector) in cciss_remove_one()
5309 pci_disable_msi(h->pdev); in cciss_remove_one()
5312 iounmap(h->transtable); in cciss_remove_one()
5313 iounmap(h->cfgtable); in cciss_remove_one()
5314 iounmap(h->vaddr); in cciss_remove_one()
5316 cciss_free_cmd_pool(h); in cciss_remove_one()
5318 for (j = 0; j < h->nr_cmds; j++) in cciss_remove_one()
5319 kfree(h->scatter_list[j]); in cciss_remove_one()
5320 kfree(h->scatter_list); in cciss_remove_one()
5321 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_remove_one()
5322 kfree(h->blockFetchTable); in cciss_remove_one()
5323 if (h->reply_pool) in cciss_remove_one()
5324 pci_free_consistent(h->pdev, h->max_commands * sizeof(__u64), in cciss_remove_one()
5325 h->reply_pool, h->reply_pool_dhandle); in cciss_remove_one()
5332 cciss_destroy_hba_sysfs_entry(h); in cciss_remove_one()
5333 mutex_unlock(&h->busy_shutting_down); in cciss_remove_one()
5334 free_hba(h); in cciss_remove_one()