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()
524 ctlr_info_t *h = seq->private; in cciss_proc_write() local
526 err = cciss_engage_scsi(h); in cciss_proc_write()
548 static void cciss_procinit(ctlr_info_t *h) in cciss_procinit() argument
556 pde = proc_create_data(h->devname, S_IWUSR | S_IRUSR | S_IRGRP | in cciss_procinit()
558 &cciss_proc_fops, h); in cciss_procinit()
639 struct ctlr_info *h = to_hba(dev); in host_show_resettable() local
641 return snprintf(buf, 20, "%d\n", ctlr_is_resettable(h->board_id)); in host_show_resettable()
649 struct ctlr_info *h = to_hba(dev); in host_store_rescan() local
651 add_to_scan_list(h); in host_store_rescan()
653 wait_for_completion_interruptible(&h->scan_wait); in host_store_rescan()
663 struct ctlr_info *h = to_hba(dev); in host_show_transport_mode() local
666 h->transMethod & CFGTBL_Trans_Performant ? in host_show_transport_mode()
676 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_unique_id() local
681 spin_lock_irqsave(&h->lock, flags); in dev_show_unique_id()
682 if (h->busy_configuring) in dev_show_unique_id()
686 spin_unlock_irqrestore(&h->lock, flags); in dev_show_unique_id()
706 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_vendor() local
711 spin_lock_irqsave(&h->lock, flags); in dev_show_vendor()
712 if (h->busy_configuring) in dev_show_vendor()
716 spin_unlock_irqrestore(&h->lock, flags); in dev_show_vendor()
730 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_model() local
735 spin_lock_irqsave(&h->lock, flags); in dev_show_model()
736 if (h->busy_configuring) in dev_show_model()
740 spin_unlock_irqrestore(&h->lock, flags); in dev_show_model()
754 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_rev() local
759 spin_lock_irqsave(&h->lock, flags); in dev_show_rev()
760 if (h->busy_configuring) in dev_show_rev()
764 spin_unlock_irqrestore(&h->lock, flags); in dev_show_rev()
777 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_lunid() local
781 spin_lock_irqsave(&h->lock, flags); in cciss_show_lunid()
782 if (h->busy_configuring) { in cciss_show_lunid()
783 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
787 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
791 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
802 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_raid_level() local
806 spin_lock_irqsave(&h->lock, flags); in cciss_show_raid_level()
807 if (h->busy_configuring) { in cciss_show_raid_level()
808 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_raid_level()
812 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_raid_level()
825 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_usage_count() local
829 spin_lock_irqsave(&h->lock, flags); in cciss_show_usage_count()
830 if (h->busy_configuring) { in cciss_show_usage_count()
831 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_usage_count()
835 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_usage_count()
909 static int cciss_create_hba_sysfs_entry(struct ctlr_info *h) in cciss_create_hba_sysfs_entry() argument
911 device_initialize(&h->dev); in cciss_create_hba_sysfs_entry()
912 h->dev.type = &cciss_host_type; in cciss_create_hba_sysfs_entry()
913 h->dev.bus = &cciss_bus_type; in cciss_create_hba_sysfs_entry()
914 dev_set_name(&h->dev, "%s", h->devname); in cciss_create_hba_sysfs_entry()
915 h->dev.parent = &h->pdev->dev; in cciss_create_hba_sysfs_entry()
917 return device_add(&h->dev); in cciss_create_hba_sysfs_entry()
923 static void cciss_destroy_hba_sysfs_entry(struct ctlr_info *h) in cciss_destroy_hba_sysfs_entry() argument
925 device_del(&h->dev); in cciss_destroy_hba_sysfs_entry()
926 put_device(&h->dev); /* final put. */ in cciss_destroy_hba_sysfs_entry()
944 static long cciss_create_ld_sysfs_entry(struct ctlr_info *h, in cciss_create_ld_sysfs_entry() argument
949 if (h->drv[drv_index]->device_initialized) in cciss_create_ld_sysfs_entry()
952 dev = &h->drv[drv_index]->dev; in cciss_create_ld_sysfs_entry()
956 dev_set_name(dev, "c%dd%d", h->ctlr, drv_index); in cciss_create_ld_sysfs_entry()
957 dev->parent = &h->dev; in cciss_create_ld_sysfs_entry()
958 h->drv[drv_index]->device_initialized = 1; in cciss_create_ld_sysfs_entry()
965 static void cciss_destroy_ld_sysfs_entry(struct ctlr_info *h, int drv_index, in cciss_destroy_ld_sysfs_entry() argument
968 struct device *dev = &h->drv[drv_index]->dev; in cciss_destroy_ld_sysfs_entry()
976 h->drv[drv_index] = NULL; in cciss_destroy_ld_sysfs_entry()
984 static CommandList_struct *cmd_alloc(ctlr_info_t *h) in cmd_alloc() argument
992 i = find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds); in cmd_alloc()
993 if (i == h->nr_cmds) in cmd_alloc()
995 } while (test_and_set_bit(i, h->cmd_pool_bits) != 0); in cmd_alloc()
996 c = h->cmd_pool + i; in cmd_alloc()
998 cmd_dma_handle = h->cmd_pool_dhandle + i * sizeof(CommandList_struct); in cmd_alloc()
999 c->err_info = h->errinfo_pool + i; in cmd_alloc()
1001 err_dma_handle = h->errinfo_pool_dhandle in cmd_alloc()
1003 h->nr_allocs++; in cmd_alloc()
1014 c->ctlr = h->ctlr; in cmd_alloc()
1021 static CommandList_struct *cmd_special_alloc(ctlr_info_t *h) in cmd_special_alloc() argument
1027 c = pci_zalloc_consistent(h->pdev, sizeof(CommandList_struct), in cmd_special_alloc()
1034 c->err_info = pci_zalloc_consistent(h->pdev, sizeof(ErrorInfo_struct), in cmd_special_alloc()
1038 pci_free_consistent(h->pdev, in cmd_special_alloc()
1050 c->ctlr = h->ctlr; in cmd_special_alloc()
1054 static void cmd_free(ctlr_info_t *h, CommandList_struct *c) in cmd_free() argument
1058 i = c - h->cmd_pool; in cmd_free()
1059 clear_bit(i, h->cmd_pool_bits); in cmd_free()
1060 h->nr_frees++; in cmd_free()
1063 static void cmd_special_free(ctlr_info_t *h, CommandList_struct *c) in cmd_special_free() argument
1069 pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct), in cmd_special_free()
1071 pci_free_consistent(h->pdev, sizeof(CommandList_struct), c, in cmd_special_free()
1072 (dma_addr_t) cciss_tag_discard_error_bits(h, (u32) c->busaddr)); in cmd_special_free()
1090 ctlr_info_t *h = get_host(bdev->bd_disk); in cciss_open() local
1093 dev_dbg(&h->pdev->dev, "cciss_open %s\n", bdev->bd_disk->disk_name); in cciss_open()
1119 h->usage_count++; in cciss_open()
1139 ctlr_info_t *h; in cciss_release() local
1143 h = get_host(disk); in cciss_release()
1145 dev_dbg(&h->pdev->dev, "cciss_release %s\n", disk->disk_name); in cciss_release()
1147 h->usage_count--; in cciss_release()
1285 static void check_ioctl_unit_attention(ctlr_info_t *h, CommandList_struct *c) in check_ioctl_unit_attention() argument
1289 (void)check_for_unit_attention(h, c); in check_ioctl_unit_attention()
1292 static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp) in cciss_getpciinfo() argument
1298 pciinfo.domain = pci_domain_nr(h->pdev->bus); in cciss_getpciinfo()
1299 pciinfo.bus = h->pdev->bus->number; in cciss_getpciinfo()
1300 pciinfo.dev_fn = h->pdev->devfn; in cciss_getpciinfo()
1301 pciinfo.board_id = h->board_id; in cciss_getpciinfo()
1307 static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) in cciss_getintinfo() argument
1314 spin_lock_irqsave(&h->lock, flags); in cciss_getintinfo()
1315 intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); in cciss_getintinfo()
1316 intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); in cciss_getintinfo()
1317 spin_unlock_irqrestore(&h->lock, flags); in cciss_getintinfo()
1324 static int cciss_setintinfo(ctlr_info_t *h, void __user *argp) in cciss_setintinfo() argument
1338 spin_lock_irqsave(&h->lock, flags); in cciss_setintinfo()
1340 writel(intinfo.delay, &(h->cfgtable->HostWrite.CoalIntDelay)); in cciss_setintinfo()
1341 writel(intinfo.count, &(h->cfgtable->HostWrite.CoalIntCount)); in cciss_setintinfo()
1342 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_setintinfo()
1345 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_setintinfo()
1349 spin_unlock_irqrestore(&h->lock, flags); in cciss_setintinfo()
1355 static int cciss_getnodename(ctlr_info_t *h, void __user *argp) in cciss_getnodename() argument
1363 spin_lock_irqsave(&h->lock, flags); in cciss_getnodename()
1365 NodeName[i] = readb(&h->cfgtable->ServerName[i]); in cciss_getnodename()
1366 spin_unlock_irqrestore(&h->lock, flags); in cciss_getnodename()
1372 static int cciss_setnodename(ctlr_info_t *h, void __user *argp) in cciss_setnodename() argument
1384 spin_lock_irqsave(&h->lock, flags); in cciss_setnodename()
1387 writeb(NodeName[i], &h->cfgtable->ServerName[i]); in cciss_setnodename()
1388 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_setnodename()
1390 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_setnodename()
1394 spin_unlock_irqrestore(&h->lock, flags); in cciss_setnodename()
1400 static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) in cciss_getheartbeat() argument
1407 spin_lock_irqsave(&h->lock, flags); in cciss_getheartbeat()
1408 heartbeat = readl(&h->cfgtable->HeartBeat); in cciss_getheartbeat()
1409 spin_unlock_irqrestore(&h->lock, flags); in cciss_getheartbeat()
1415 static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) in cciss_getbustypes() argument
1422 spin_lock_irqsave(&h->lock, flags); in cciss_getbustypes()
1423 BusTypes = readl(&h->cfgtable->BusTypes); in cciss_getbustypes()
1424 spin_unlock_irqrestore(&h->lock, flags); in cciss_getbustypes()
1430 static int cciss_getfirmver(ctlr_info_t *h, void __user *argp) in cciss_getfirmver() argument
1436 memcpy(firmware, h->firm_ver, 4); in cciss_getfirmver()
1444 static int cciss_getdrivver(ctlr_info_t *h, void __user *argp) in cciss_getdrivver() argument
1455 static int cciss_getluninfo(ctlr_info_t *h, in cciss_getluninfo() argument
1471 static int cciss_passthru(ctlr_info_t *h, void __user *argp) in cciss_passthru() argument
1506 c = cmd_special_alloc(h); in cciss_passthru()
1531 temp64.val = pci_map_single(h->pdev, buff, in cciss_passthru()
1540 enqueue_cmd_and_start_io(h, c); in cciss_passthru()
1546 pci_unmap_single(h->pdev, (dma_addr_t) temp64.val, iocommand.buf_size, in cciss_passthru()
1548 check_ioctl_unit_attention(h, c); in cciss_passthru()
1554 cmd_special_free(h, c); in cciss_passthru()
1562 cmd_special_free(h, c); in cciss_passthru()
1567 cmd_special_free(h, c); in cciss_passthru()
1571 static int cciss_bigpassthru(ctlr_info_t *h, void __user *argp) in cciss_bigpassthru() argument
1645 c = cmd_special_alloc(h); in cciss_bigpassthru()
1659 temp64.val = pci_map_single(h->pdev, buff[i], buff_size[i], in cciss_bigpassthru()
1667 enqueue_cmd_and_start_io(h, c); in cciss_bigpassthru()
1673 pci_unmap_single(h->pdev, in cciss_bigpassthru()
1677 check_ioctl_unit_attention(h, c); in cciss_bigpassthru()
1681 cmd_special_free(h, c); in cciss_bigpassthru()
1690 cmd_special_free(h, c); in cciss_bigpassthru()
1697 cmd_special_free(h, c); in cciss_bigpassthru()
1714 ctlr_info_t *h = get_host(disk); in cciss_ioctl() local
1717 dev_dbg(&h->pdev->dev, "cciss_ioctl: Called with cmd=%x %lx\n", in cciss_ioctl()
1721 return cciss_getpciinfo(h, argp); in cciss_ioctl()
1723 return cciss_getintinfo(h, argp); in cciss_ioctl()
1725 return cciss_setintinfo(h, argp); in cciss_ioctl()
1727 return cciss_getnodename(h, argp); in cciss_ioctl()
1729 return cciss_setnodename(h, argp); in cciss_ioctl()
1731 return cciss_getheartbeat(h, argp); in cciss_ioctl()
1733 return cciss_getbustypes(h, argp); in cciss_ioctl()
1735 return cciss_getfirmver(h, argp); in cciss_ioctl()
1737 return cciss_getdrivver(h, argp); in cciss_ioctl()
1741 return rebuild_lun_table(h, 0, 1); in cciss_ioctl()
1743 return cciss_getluninfo(h, disk, argp); in cciss_ioctl()
1745 return cciss_passthru(h, argp); in cciss_ioctl()
1747 return cciss_bigpassthru(h, argp); in cciss_ioctl()
1777 static void cciss_check_queues(ctlr_info_t *h) in cciss_check_queues() argument
1779 int start_queue = h->next_to_run; in cciss_check_queues()
1787 if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) in cciss_check_queues()
1794 for (i = 0; i < h->highest_lun + 1; i++) { in cciss_check_queues()
1795 int curr_queue = (start_queue + i) % (h->highest_lun + 1); in cciss_check_queues()
1799 if (!h->drv[curr_queue]) in cciss_check_queues()
1801 if (!(h->drv[curr_queue]->queue) || in cciss_check_queues()
1802 !(h->drv[curr_queue]->heads)) in cciss_check_queues()
1804 blk_start_queue(h->gendisk[curr_queue]->queue); in cciss_check_queues()
1809 if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) { in cciss_check_queues()
1811 h->next_to_run = in cciss_check_queues()
1812 (start_queue + 1) % (h->highest_lun + 1); in cciss_check_queues()
1815 h->next_to_run = curr_queue; in cciss_check_queues()
1825 ctlr_info_t *h = hba[c->ctlr]; in cciss_softirq_done() local
1841 cciss_unmap_sg_chain_block(h, c); in cciss_softirq_done()
1843 curr_sg = h->cmd_sg_list[c->cmdindex]; in cciss_softirq_done()
1848 pci_unmap_page(h->pdev, temp64.val, curr_sg[sg_index].Len, in cciss_softirq_done()
1853 dev_dbg(&h->pdev->dev, "Done with %p\n", rq); in cciss_softirq_done()
1861 spin_lock_irqsave(&h->lock, flags); in cciss_softirq_done()
1862 cmd_free(h, c); in cciss_softirq_done()
1863 cciss_check_queues(h); in cciss_softirq_done()
1864 spin_unlock_irqrestore(&h->lock, flags); in cciss_softirq_done()
1867 static inline void log_unit_to_scsi3addr(ctlr_info_t *h, in log_unit_to_scsi3addr() argument
1870 memcpy(scsi3addr, h->drv[log_unit]->LunID, in log_unit_to_scsi3addr()
1871 sizeof(h->drv[log_unit]->LunID)); in log_unit_to_scsi3addr()
1878 static void cciss_get_device_descr(ctlr_info_t *h, int logvol, in cciss_get_device_descr() argument
1893 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_get_device_descr()
1894 rc = sendcmd_withirq(h, CISS_INQUIRY, inq_buf, sizeof(*inq_buf), 0, in cciss_get_device_descr()
1914 static void cciss_get_serial_no(ctlr_info_t *h, int logvol, in cciss_get_serial_no() argument
1929 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_get_serial_no()
1930 rc = sendcmd_withirq(h, CISS_INQUIRY, buf, in cciss_get_serial_no()
1941 static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, in cciss_add_disk() argument
1944 disk->queue = blk_init_queue(do_cciss_request, &h->lock); in cciss_add_disk()
1947 sprintf(disk->disk_name, "cciss/c%dd%d", h->ctlr, drv_index); in cciss_add_disk()
1948 disk->major = h->major; in cciss_add_disk()
1951 if (cciss_create_ld_sysfs_entry(h, drv_index)) in cciss_add_disk()
1953 disk->private_data = h->drv[drv_index]; in cciss_add_disk()
1956 blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask); in cciss_add_disk()
1959 blk_queue_max_segments(disk->queue, h->maxsgentries); in cciss_add_disk()
1961 blk_queue_max_hw_sectors(disk->queue, h->cciss_max_sectors); in cciss_add_disk()
1965 disk->queue->queuedata = h; in cciss_add_disk()
1968 h->drv[drv_index]->block_size); in cciss_add_disk()
1974 h->drv[drv_index]->queue = disk->queue; in cciss_add_disk()
1975 device_add_disk(&h->drv[drv_index]->dev, disk); in cciss_add_disk()
1995 static void cciss_update_drive_info(ctlr_info_t *h, int drv_index, in cciss_update_drive_info() argument
2013 if (h->cciss_read == CCISS_READ_16) { in cciss_update_drive_info()
2014 cciss_read_capacity_16(h, drv_index, in cciss_update_drive_info()
2018 cciss_read_capacity(h, drv_index, &total_size, &block_size); in cciss_update_drive_info()
2023 cciss_read_capacity_16(h, drv_index, in cciss_update_drive_info()
2025 h->cciss_read = CCISS_READ_16; in cciss_update_drive_info()
2026 h->cciss_write = CCISS_WRITE_16; in cciss_update_drive_info()
2028 h->cciss_read = CCISS_READ_10; in cciss_update_drive_info()
2029 h->cciss_write = CCISS_WRITE_10; in cciss_update_drive_info()
2033 cciss_geometry_inquiry(h, drv_index, total_size, block_size, in cciss_update_drive_info()
2038 cciss_get_device_descr(h, drv_index, drvinfo->vendor, in cciss_update_drive_info()
2040 cciss_get_serial_no(h, drv_index, drvinfo->serial_no, in cciss_update_drive_info()
2043 memcpy(drvinfo->LunID, h->drv[drv_index]->LunID, in cciss_update_drive_info()
2047 if (h->drv[drv_index]->raid_level != -1 && in cciss_update_drive_info()
2049 h->drv[drv_index]->serial_no, 16) == 0) && in cciss_update_drive_info()
2050 drvinfo->block_size == h->drv[drv_index]->block_size && in cciss_update_drive_info()
2051 drvinfo->nr_blocks == h->drv[drv_index]->nr_blocks && in cciss_update_drive_info()
2052 drvinfo->heads == h->drv[drv_index]->heads && in cciss_update_drive_info()
2053 drvinfo->sectors == h->drv[drv_index]->sectors && in cciss_update_drive_info()
2054 drvinfo->cylinders == h->drv[drv_index]->cylinders)) in cciss_update_drive_info()
2064 if (h->drv[drv_index]->raid_level != -1 && drv_index != 0) { in cciss_update_drive_info()
2065 dev_warn(&h->pdev->dev, "disk %d has changed.\n", drv_index); in cciss_update_drive_info()
2066 spin_lock_irqsave(&h->lock, flags); in cciss_update_drive_info()
2067 h->drv[drv_index]->busy_configuring = 1; in cciss_update_drive_info()
2068 spin_unlock_irqrestore(&h->lock, flags); in cciss_update_drive_info()
2074 ret = deregister_disk(h, drv_index, 0, via_ioctl); in cciss_update_drive_info()
2085 if (h->drv[drv_index] == NULL) { in cciss_update_drive_info()
2087 h->drv[drv_index] = drvinfo; in cciss_update_drive_info()
2091 h->drv[drv_index]->block_size = drvinfo->block_size; in cciss_update_drive_info()
2092 h->drv[drv_index]->nr_blocks = drvinfo->nr_blocks; in cciss_update_drive_info()
2093 h->drv[drv_index]->heads = drvinfo->heads; in cciss_update_drive_info()
2094 h->drv[drv_index]->sectors = drvinfo->sectors; in cciss_update_drive_info()
2095 h->drv[drv_index]->cylinders = drvinfo->cylinders; in cciss_update_drive_info()
2096 h->drv[drv_index]->raid_level = drvinfo->raid_level; in cciss_update_drive_info()
2097 memcpy(h->drv[drv_index]->serial_no, drvinfo->serial_no, 16); in cciss_update_drive_info()
2098 memcpy(h->drv[drv_index]->vendor, drvinfo->vendor, in cciss_update_drive_info()
2100 memcpy(h->drv[drv_index]->model, drvinfo->model, MODEL_LEN + 1); in cciss_update_drive_info()
2101 memcpy(h->drv[drv_index]->rev, drvinfo->rev, REV_LEN + 1); in cciss_update_drive_info()
2104 ++h->num_luns; in cciss_update_drive_info()
2105 disk = h->gendisk[drv_index]; in cciss_update_drive_info()
2106 set_capacity(disk, h->drv[drv_index]->nr_blocks); in cciss_update_drive_info()
2115 if (cciss_add_disk(h, disk, drv_index) != 0) { in cciss_update_drive_info()
2116 cciss_free_gendisk(h, drv_index); in cciss_update_drive_info()
2117 cciss_free_drive_info(h, drv_index); in cciss_update_drive_info()
2118 dev_warn(&h->pdev->dev, "could not update disk %d\n", in cciss_update_drive_info()
2120 --h->num_luns; in cciss_update_drive_info()
2129 dev_err(&h->pdev->dev, "out of memory\n"); in cciss_update_drive_info()
2143 static int cciss_alloc_drive_info(ctlr_info_t *h, int controller_node) in cciss_alloc_drive_info() argument
2152 if (h->drv[i] && i != 0) in cciss_alloc_drive_info()
2158 if (i == 0 && h->drv[i] && h->drv[i]->raid_level != -1) in cciss_alloc_drive_info()
2165 if (i > h->highest_lun && !controller_node) in cciss_alloc_drive_info()
2166 h->highest_lun = i; in cciss_alloc_drive_info()
2169 if (i == 0 && h->drv[i] != NULL) in cciss_alloc_drive_info()
2180 h->drv[i] = drv; in cciss_alloc_drive_info()
2186 static void cciss_free_drive_info(ctlr_info_t *h, int drv_index) in cciss_free_drive_info() argument
2188 kfree(h->drv[drv_index]); in cciss_free_drive_info()
2189 h->drv[drv_index] = NULL; in cciss_free_drive_info()
2192 static void cciss_free_gendisk(ctlr_info_t *h, int drv_index) in cciss_free_gendisk() argument
2194 put_disk(h->gendisk[drv_index]); in cciss_free_gendisk()
2195 h->gendisk[drv_index] = NULL; in cciss_free_gendisk()
2207 static int cciss_add_gendisk(ctlr_info_t *h, unsigned char lunid[], in cciss_add_gendisk() argument
2212 drv_index = cciss_alloc_drive_info(h, controller_node); in cciss_add_gendisk()
2217 if (!h->gendisk[drv_index]) { in cciss_add_gendisk()
2218 h->gendisk[drv_index] = in cciss_add_gendisk()
2220 if (!h->gendisk[drv_index]) { in cciss_add_gendisk()
2221 dev_err(&h->pdev->dev, in cciss_add_gendisk()
2227 memcpy(h->drv[drv_index]->LunID, lunid, in cciss_add_gendisk()
2228 sizeof(h->drv[drv_index]->LunID)); in cciss_add_gendisk()
2229 if (cciss_create_ld_sysfs_entry(h, drv_index)) in cciss_add_gendisk()
2234 h->drv[drv_index]->busy_configuring = 0; in cciss_add_gendisk()
2239 cciss_free_gendisk(h, drv_index); in cciss_add_gendisk()
2241 cciss_free_drive_info(h, drv_index); in cciss_add_gendisk()
2250 static void cciss_add_controller_node(ctlr_info_t *h) in cciss_add_controller_node() argument
2255 if (h->gendisk[0] != NULL) /* already did this? Then bail. */ in cciss_add_controller_node()
2258 drv_index = cciss_add_gendisk(h, CTLR_LUNID, 1); in cciss_add_controller_node()
2261 h->drv[drv_index]->block_size = 512; in cciss_add_controller_node()
2262 h->drv[drv_index]->nr_blocks = 0; in cciss_add_controller_node()
2263 h->drv[drv_index]->heads = 0; in cciss_add_controller_node()
2264 h->drv[drv_index]->sectors = 0; in cciss_add_controller_node()
2265 h->drv[drv_index]->cylinders = 0; in cciss_add_controller_node()
2266 h->drv[drv_index]->raid_level = -1; in cciss_add_controller_node()
2267 memset(h->drv[drv_index]->serial_no, 0, 16); in cciss_add_controller_node()
2268 disk = h->gendisk[drv_index]; in cciss_add_controller_node()
2269 if (cciss_add_disk(h, disk, drv_index) == 0) in cciss_add_controller_node()
2271 cciss_free_gendisk(h, drv_index); in cciss_add_controller_node()
2272 cciss_free_drive_info(h, drv_index); in cciss_add_controller_node()
2274 dev_warn(&h->pdev->dev, "could not add disk 0.\n"); in cciss_add_controller_node()
2286 static int rebuild_lun_table(ctlr_info_t *h, int first_time, in rebuild_lun_table() argument
2303 spin_lock_irqsave(&h->lock, flags); in rebuild_lun_table()
2304 if (h->busy_configuring) { in rebuild_lun_table()
2305 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2308 h->busy_configuring = 1; in rebuild_lun_table()
2309 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2315 return_code = sendcmd_withirq(h, CISS_REPORT_LOG, ld_buff, in rebuild_lun_table()
2322 dev_warn(&h->pdev->dev, in rebuild_lun_table()
2331 dev_warn(&h->pdev->dev, "more luns configured" in rebuild_lun_table()
2337 cciss_add_controller_node(h); in rebuild_lun_table()
2344 for (i = 0; i <= h->highest_lun; i++) { in rebuild_lun_table()
2349 if (h->drv[i] == NULL) in rebuild_lun_table()
2354 if (memcmp(h->drv[i]->LunID, lunid, in rebuild_lun_table()
2362 spin_lock_irqsave(&h->lock, flags); in rebuild_lun_table()
2363 h->drv[i]->busy_configuring = 1; in rebuild_lun_table()
2364 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2365 return_code = deregister_disk(h, i, 1, via_ioctl); in rebuild_lun_table()
2366 if (h->drv[i] != NULL) in rebuild_lun_table()
2367 h->drv[i]->busy_configuring = 0; in rebuild_lun_table()
2387 for (j = 0; j <= h->highest_lun; j++) { in rebuild_lun_table()
2388 if (h->drv[j] != NULL && in rebuild_lun_table()
2389 memcmp(h->drv[j]->LunID, lunid, in rebuild_lun_table()
2390 sizeof(h->drv[j]->LunID)) == 0) { in rebuild_lun_table()
2399 drv_index = cciss_add_gendisk(h, lunid, 0); in rebuild_lun_table()
2403 cciss_update_drive_info(h, drv_index, first_time, via_ioctl); in rebuild_lun_table()
2408 h->busy_configuring = 0; in rebuild_lun_table()
2415 dev_err(&h->pdev->dev, "out of memory\n"); in rebuild_lun_table()
2416 h->busy_configuring = 0; in rebuild_lun_table()
2460 static int deregister_disk(ctlr_info_t *h, int drv_index, in deregister_disk() argument
2471 drv = h->drv[drv_index]; in deregister_disk()
2472 disk = h->gendisk[drv_index]; in deregister_disk()
2475 if (clear_all || (h->gendisk[0] == disk)) { in deregister_disk()
2481 recalculate_highest_lun = (drv == h->drv[h->highest_lun]); in deregister_disk()
2487 if (h->gendisk[0] != disk) { in deregister_disk()
2490 cciss_destroy_ld_sysfs_entry(h, drv_index, 0); in deregister_disk()
2508 if (h->gendisk[i] == disk) { in deregister_disk()
2509 h->gendisk[i] = NULL; in deregister_disk()
2520 --h->num_luns; in deregister_disk()
2525 for (i = 0; i <= h->highest_lun; i++) { in deregister_disk()
2527 if (h->drv[i] && h->drv[i]->heads) in deregister_disk()
2530 h->highest_lun = newhighest; in deregister_disk()
2535 static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff, in fill_cmd() argument
2624 dev_warn(&h->pdev->dev, "Unknown Command 0x%c\n", cmd); in fill_cmd()
2656 dev_warn(&h->pdev->dev, in fill_cmd()
2661 dev_warn(&h->pdev->dev, "unknown command type %d\n", cmd_type); in fill_cmd()
2666 buff_dma_handle.val = (__u64) pci_map_single(h->pdev, in fill_cmd()
2677 static int cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr, in cciss_send_reset() argument
2683 c = cmd_alloc(h); in cciss_send_reset()
2686 return_status = fill_cmd(h, c, CCISS_RESET_MSG, NULL, 0, 0, in cciss_send_reset()
2690 cmd_special_free(h, c); in cciss_send_reset()
2694 enqueue_cmd_and_start_io(h, c); in cciss_send_reset()
2702 static int check_target_status(ctlr_info_t *h, CommandList_struct *c) in check_target_status() argument
2712 if (check_for_unit_attention(h, c)) in check_target_status()
2714 dev_warn(&h->pdev->dev, "cmd 0x%02x " in check_target_status()
2720 dev_warn(&h->pdev->dev, "cmd 0x%02x" in check_target_status()
2728 static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c) in process_sendcmd_error() argument
2737 return_status = check_target_status(h, c); in process_sendcmd_error()
2744 dev_warn(&h->pdev->dev, "cmd 0x%02x is " in process_sendcmd_error()
2749 dev_warn(&h->pdev->dev, "cmd 0x%02x has " in process_sendcmd_error()
2754 dev_warn(&h->pdev->dev, "cmd 0x%02x had " in process_sendcmd_error()
2759 dev_warn(&h->pdev->dev, "cmd 0x%02x had " in process_sendcmd_error()
2764 dev_warn(&h->pdev->dev, "cmd 0x%02x was " in process_sendcmd_error()
2769 dev_warn(&h->pdev->dev, "cmd 0x%02x reports " in process_sendcmd_error()
2774 dev_warn(&h->pdev->dev, "unsolicited abort 0x%02x\n", in process_sendcmd_error()
2779 dev_warn(&h->pdev->dev, "cmd unabortable\n"); in process_sendcmd_error()
2783 dev_warn(&h->pdev->dev, "cmd 0x%02x returned " in process_sendcmd_error()
2791 static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c, in sendcmd_withirq_core() argument
2800 enqueue_cmd_and_start_io(h, c); in sendcmd_withirq_core()
2807 return_status = process_sendcmd_error(h, c); in sendcmd_withirq_core()
2811 dev_warn(&h->pdev->dev, "retrying 0x%02x\n", in sendcmd_withirq_core()
2825 pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, in sendcmd_withirq_core()
2830 static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size, in sendcmd_withirq() argument
2837 c = cmd_special_alloc(h); in sendcmd_withirq()
2840 return_status = fill_cmd(h, c, cmd, buff, size, page_code, in sendcmd_withirq()
2843 return_status = sendcmd_withirq_core(h, c, 1); in sendcmd_withirq()
2845 cmd_special_free(h, c); in sendcmd_withirq()
2849 static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol, in cciss_geometry_inquiry() argument
2860 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_geometry_inquiry()
2861 return_code = sendcmd_withirq(h, CISS_INQUIRY, inq_buff, in cciss_geometry_inquiry()
2865 dev_warn(&h->pdev->dev, in cciss_geometry_inquiry()
2890 dev_warn(&h->pdev->dev, "reading geometry failed\n"); in cciss_geometry_inquiry()
2895 cciss_read_capacity(ctlr_info_t *h, int logvol, sector_t *total_size, in cciss_read_capacity() argument
2904 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_read_capacity()
2908 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_read_capacity()
2909 return_code = sendcmd_withirq(h, CCISS_READ_CAPACITY, buf, in cciss_read_capacity()
2915 dev_warn(&h->pdev->dev, "read capacity failed\n"); in cciss_read_capacity()
2922 static void cciss_read_capacity_16(ctlr_info_t *h, int logvol, in cciss_read_capacity_16() argument
2931 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_read_capacity_16()
2935 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_read_capacity_16()
2936 return_code = sendcmd_withirq(h, CCISS_READ_CAPACITY_16, in cciss_read_capacity_16()
2943 dev_warn(&h->pdev->dev, "read capacity failed\n"); in cciss_read_capacity_16()
2947 dev_info(&h->pdev->dev, " blocks= %llu block_size= %d\n", in cciss_read_capacity_16()
2954 ctlr_info_t *h = get_host(disk); in cciss_revalidate() local
2962 for (logvol = 0; logvol <= h->highest_lun; logvol++) { in cciss_revalidate()
2963 if (!h->drv[logvol]) in cciss_revalidate()
2965 if (memcmp(h->drv[logvol]->LunID, drv->LunID, in cciss_revalidate()
2977 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_revalidate()
2980 if (h->cciss_read == CCISS_READ_10) { in cciss_revalidate()
2981 cciss_read_capacity(h, logvol, in cciss_revalidate()
2984 cciss_read_capacity_16(h, logvol, in cciss_revalidate()
2987 cciss_geometry_inquiry(h, logvol, total_size, block_size, in cciss_revalidate()
3013 static void start_io(ctlr_info_t *h) in start_io() argument
3017 while (!list_empty(&h->reqQ)) { in start_io()
3018 c = list_entry(h->reqQ.next, CommandList_struct, list); in start_io()
3020 if ((h->access.fifo_full(h))) { in start_io()
3021 dev_warn(&h->pdev->dev, "fifo full\n"); in start_io()
3027 h->Qdepth--; in start_io()
3030 h->access.submit_command(h, c); in start_io()
3033 addQ(&h->cmpQ, c); in start_io()
3040 static inline void resend_cciss_cmd(ctlr_info_t *h, CommandList_struct *c) in resend_cciss_cmd() argument
3046 addQ(&h->reqQ, c); in resend_cciss_cmd()
3047 h->Qdepth++; in resend_cciss_cmd()
3048 if (h->Qdepth > h->maxQsinceinit) in resend_cciss_cmd()
3049 h->maxQsinceinit = h->Qdepth; in resend_cciss_cmd()
3051 start_io(h); in resend_cciss_cmd()
3065 static inline int evaluate_target_status(ctlr_info_t *h, in evaluate_target_status() argument
3088 dev_warn(&h->pdev->dev, "cmd %p " in evaluate_target_status()
3101 if (check_for_unit_attention(h, cmd)) { in evaluate_target_status()
3109 dev_warn(&h->pdev->dev, "cmd %p has CHECK CONDITION" in evaluate_target_status()
3130 static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd, in complete_command() argument
3146 rq->errors = evaluate_target_status(h, cmd, &retry_cmd); in complete_command()
3150 dev_warn(&h->pdev->dev, "cmd %p has" in complete_command()
3158 dev_warn(&h->pdev->dev, "cciss: cmd %p has" in complete_command()
3163 dev_warn(&h->pdev->dev, "cciss: cmd %p is " in complete_command()
3171 dev_warn(&h->pdev->dev, "cciss: cmd %p has " in complete_command()
3179 dev_warn(&h->pdev->dev, "cciss: cmd %p had " in complete_command()
3187 dev_warn(&h->pdev->dev, "cciss: cmd %p had " in complete_command()
3195 dev_warn(&h->pdev->dev, "cciss: cmd %p was " in complete_command()
3203 dev_warn(&h->pdev->dev, "cciss: cmd %p reports " in complete_command()
3211 dev_warn(&h->pdev->dev, "cciss%d: unsolicited " in complete_command()
3212 "abort %p\n", h->ctlr, cmd); in complete_command()
3215 dev_warn(&h->pdev->dev, "retrying %p\n", cmd); in complete_command()
3218 dev_warn(&h->pdev->dev, in complete_command()
3226 dev_warn(&h->pdev->dev, "cmd %p timedout\n", cmd); in complete_command()
3233 dev_warn(&h->pdev->dev, "cmd %p unabortable\n", cmd); in complete_command()
3240 dev_warn(&h->pdev->dev, "cmd %p returned " in complete_command()
3253 resend_cciss_cmd(h, cmd); in complete_command()
3272 static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag) in cciss_tag_discard_error_bits() argument
3276 if (likely(h->transMethod & CFGTBL_Trans_Performant)) in cciss_tag_discard_error_bits()
3296 ctlr_info_t *h = q->queuedata; in do_cciss_request() local
3314 BUG_ON(creq->nr_phys_segments > h->maxsgentries); in do_cciss_request()
3316 c = cmd_alloc(h); in do_cciss_request()
3322 tmp_sg = h->scatter_list[c->cmdindex]; in do_cciss_request()
3344 (rq_data_dir(creq) == READ) ? h->cciss_read : h->cciss_write; in do_cciss_request()
3346 dev_dbg(&h->pdev->dev, "sector =%d nr_sectors=%d\n", in do_cciss_request()
3348 sg_init_table(tmp_sg, h->maxsgentries); in do_cciss_request()
3362 if (((sg_index+1) == (h->max_cmd_sgentries)) && in do_cciss_request()
3365 curr_sg = h->cmd_sg_list[c->cmdindex]; in do_cciss_request()
3370 temp64.val = (__u64) pci_map_page(h->pdev, sg_page(&tmp_sg[i]), in do_cciss_request()
3379 cciss_map_sg_chain_block(h, c, h->cmd_sg_list[c->cmdindex], in do_cciss_request()
3380 (seg - (h->max_cmd_sgentries - 1)) * in do_cciss_request()
3384 if (seg > h->maxSG) in do_cciss_request()
3385 h->maxSG = seg; in do_cciss_request()
3387 dev_dbg(&h->pdev->dev, "Submitting %u sectors in %d segments " in do_cciss_request()
3392 if (seg <= h->max_cmd_sgentries) in do_cciss_request()
3395 c->Header.SGList = h->max_cmd_sgentries; in do_cciss_request()
3396 set_performant_mode(h, c); in do_cciss_request()
3399 if(h->cciss_read == CCISS_READ_10) { in do_cciss_request()
3432 dev_warn(&h->pdev->dev, "bad request type %d\n", in do_cciss_request()
3439 addQ(&h->reqQ, c); in do_cciss_request()
3440 h->Qdepth++; in do_cciss_request()
3441 if (h->Qdepth > h->maxQsinceinit) in do_cciss_request()
3442 h->maxQsinceinit = h->Qdepth; in do_cciss_request()
3451 start_io(h); in do_cciss_request()
3454 static inline unsigned long get_next_completion(ctlr_info_t *h) in get_next_completion() argument
3456 return h->access.command_completed(h); in get_next_completion()
3459 static inline int interrupt_pending(ctlr_info_t *h) in interrupt_pending() argument
3461 return h->access.intr_pending(h); in interrupt_pending()
3464 static inline long interrupt_not_for_us(ctlr_info_t *h) in interrupt_not_for_us() argument
3466 return ((h->access.intr_pending(h) == 0) || in interrupt_not_for_us()
3467 (h->interrupts_enabled == 0)); in interrupt_not_for_us()
3470 static inline int bad_tag(ctlr_info_t *h, u32 tag_index, in bad_tag() argument
3473 if (unlikely(tag_index >= h->nr_cmds)) { in bad_tag()
3474 dev_warn(&h->pdev->dev, "bad tag 0x%08x ignored.\n", raw_tag); in bad_tag()
3480 static inline void finish_cmd(ctlr_info_t *h, CommandList_struct *c, in finish_cmd() argument
3485 complete_command(h, c, 0); in finish_cmd()
3494 static inline u32 next_command(ctlr_info_t *h) in next_command() argument
3498 if (unlikely(!(h->transMethod & CFGTBL_Trans_Performant))) in next_command()
3499 return h->access.command_completed(h); in next_command()
3501 if ((*(h->reply_pool_head) & 1) == (h->reply_pool_wraparound)) { in next_command()
3502 a = *(h->reply_pool_head); /* Next cmd in ring buffer */ in next_command()
3503 (h->reply_pool_head)++; in next_command()
3504 h->commands_outstanding--; in next_command()
3509 if (h->reply_pool_head == (h->reply_pool + h->max_commands)) { in next_command()
3510 h->reply_pool_head = h->reply_pool; in next_command()
3511 h->reply_pool_wraparound ^= 1; in next_command()
3517 static inline u32 process_indexed_cmd(ctlr_info_t *h, u32 raw_tag) in process_indexed_cmd() argument
3523 if (bad_tag(h, tag_index, raw_tag)) in process_indexed_cmd()
3524 return next_command(h); in process_indexed_cmd()
3525 c = h->cmd_pool + tag_index; in process_indexed_cmd()
3526 finish_cmd(h, c, raw_tag); in process_indexed_cmd()
3527 return next_command(h); in process_indexed_cmd()
3531 static inline u32 process_nonindexed_cmd(ctlr_info_t *h, u32 raw_tag) in process_nonindexed_cmd() argument
3536 tag_masked = cciss_tag_discard_error_bits(h, raw_tag); in process_nonindexed_cmd()
3537 list_for_each_entry(c, &h->cmpQ, list) { in process_nonindexed_cmd()
3538 busaddr_masked = cciss_tag_discard_error_bits(h, c->busaddr); in process_nonindexed_cmd()
3540 finish_cmd(h, c, raw_tag); in process_nonindexed_cmd()
3541 return next_command(h); in process_nonindexed_cmd()
3544 bad_tag(h, h->nr_cmds + 1, raw_tag); in process_nonindexed_cmd()
3545 return next_command(h); in process_nonindexed_cmd()
3553 static int ignore_bogus_interrupt(ctlr_info_t *h) in ignore_bogus_interrupt() argument
3558 if (likely(h->interrupts_enabled)) in ignore_bogus_interrupt()
3561 dev_info(&h->pdev->dev, "Received interrupt while interrupts disabled " in ignore_bogus_interrupt()
3569 ctlr_info_t *h = dev_id; in cciss_intx_discard_completions() local
3573 if (ignore_bogus_interrupt(h)) in cciss_intx_discard_completions()
3576 if (interrupt_not_for_us(h)) in cciss_intx_discard_completions()
3578 spin_lock_irqsave(&h->lock, flags); in cciss_intx_discard_completions()
3579 while (interrupt_pending(h)) { in cciss_intx_discard_completions()
3580 raw_tag = get_next_completion(h); in cciss_intx_discard_completions()
3582 raw_tag = next_command(h); in cciss_intx_discard_completions()
3584 spin_unlock_irqrestore(&h->lock, flags); in cciss_intx_discard_completions()
3590 ctlr_info_t *h = dev_id; in cciss_msix_discard_completions() local
3594 if (ignore_bogus_interrupt(h)) in cciss_msix_discard_completions()
3597 spin_lock_irqsave(&h->lock, flags); in cciss_msix_discard_completions()
3598 raw_tag = get_next_completion(h); in cciss_msix_discard_completions()
3600 raw_tag = next_command(h); in cciss_msix_discard_completions()
3601 spin_unlock_irqrestore(&h->lock, flags); in cciss_msix_discard_completions()
3607 ctlr_info_t *h = dev_id; in do_cciss_intx() local
3611 if (interrupt_not_for_us(h)) in do_cciss_intx()
3613 spin_lock_irqsave(&h->lock, flags); in do_cciss_intx()
3614 while (interrupt_pending(h)) { in do_cciss_intx()
3615 raw_tag = get_next_completion(h); in do_cciss_intx()
3618 raw_tag = process_indexed_cmd(h, raw_tag); in do_cciss_intx()
3620 raw_tag = process_nonindexed_cmd(h, raw_tag); in do_cciss_intx()
3623 spin_unlock_irqrestore(&h->lock, flags); in do_cciss_intx()
3632 ctlr_info_t *h = dev_id; in do_cciss_msix_intr() local
3636 spin_lock_irqsave(&h->lock, flags); in do_cciss_msix_intr()
3637 raw_tag = get_next_completion(h); in do_cciss_msix_intr()
3640 raw_tag = process_indexed_cmd(h, raw_tag); in do_cciss_msix_intr()
3642 raw_tag = process_nonindexed_cmd(h, raw_tag); in do_cciss_msix_intr()
3644 spin_unlock_irqrestore(&h->lock, flags); in do_cciss_msix_intr()
3658 static int add_to_scan_list(struct ctlr_info *h) in add_to_scan_list() argument
3664 if (h->busy_initializing) in add_to_scan_list()
3667 if (!mutex_trylock(&h->busy_shutting_down)) in add_to_scan_list()
3672 if (test_h == h) { in add_to_scan_list()
3677 if (!found && !h->busy_scanning) { in add_to_scan_list()
3678 reinit_completion(&h->scan_wait); in add_to_scan_list()
3679 list_add_tail(&h->scan_list, &scan_q); in add_to_scan_list()
3683 mutex_unlock(&h->busy_shutting_down); in add_to_scan_list()
3701 static void remove_from_scan_list(struct ctlr_info *h) in remove_from_scan_list() argument
3707 if (test_h == h) { /* state 2. */ in remove_from_scan_list()
3708 list_del(&h->scan_list); in remove_from_scan_list()
3709 complete_all(&h->scan_wait); in remove_from_scan_list()
3714 if (h->busy_scanning) { /* state 3. */ in remove_from_scan_list()
3716 wait_for_completion(&h->scan_wait); in remove_from_scan_list()
3736 struct ctlr_info *h; in scan_thread() local
3751 h = list_entry(scan_q.next, in scan_thread()
3754 list_del(&h->scan_list); in scan_thread()
3755 h->busy_scanning = 1; in scan_thread()
3758 rebuild_lun_table(h, 0, 0); in scan_thread()
3759 complete_all(&h->scan_wait); in scan_thread()
3761 h->busy_scanning = 0; in scan_thread()
3769 static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c) in check_for_unit_attention() argument
3776 dev_warn(&h->pdev->dev, "a state change " in check_for_unit_attention()
3781 dev_warn(&h->pdev->dev, "LUN failure " in check_for_unit_attention()
3786 dev_warn(&h->pdev->dev, "report LUN data changed\n"); in check_for_unit_attention()
3806 dev_warn(&h->pdev->dev, in check_for_unit_attention()
3811 dev_warn(&h->pdev->dev, in check_for_unit_attention()
3816 dev_warn(&h->pdev->dev, "unknown unit attention detected\n"); in check_for_unit_attention()
3826 static void print_cfg_table(ctlr_info_t *h) in print_cfg_table() argument
3830 CfgTable_struct *tb = h->cfgtable; in print_cfg_table()
3832 dev_dbg(&h->pdev->dev, "Controller Configuration information\n"); in print_cfg_table()
3833 dev_dbg(&h->pdev->dev, "------------------------------------\n"); in print_cfg_table()
3837 dev_dbg(&h->pdev->dev, " Signature = %s\n", temp_name); in print_cfg_table()
3838 dev_dbg(&h->pdev->dev, " Spec Number = %d\n", in print_cfg_table()
3840 dev_dbg(&h->pdev->dev, " Transport methods supported = 0x%x\n", in print_cfg_table()
3842 dev_dbg(&h->pdev->dev, " Transport methods active = 0x%x\n", in print_cfg_table()
3844 dev_dbg(&h->pdev->dev, " Requested transport Method = 0x%x\n", in print_cfg_table()
3846 dev_dbg(&h->pdev->dev, " Coalesce Interrupt Delay = 0x%x\n", in print_cfg_table()
3848 dev_dbg(&h->pdev->dev, " Coalesce Interrupt Count = 0x%x\n", in print_cfg_table()
3850 dev_dbg(&h->pdev->dev, " Max outstanding commands = 0x%x\n", in print_cfg_table()
3852 dev_dbg(&h->pdev->dev, " Bus Types = 0x%x\n", in print_cfg_table()
3857 dev_dbg(&h->pdev->dev, " Server Name = %s\n", temp_name); in print_cfg_table()
3858 dev_dbg(&h->pdev->dev, " Heartbeat Counter = 0x%x\n\n\n", in print_cfg_table()
3933 static void cciss_wait_for_mode_change_ack(ctlr_info_t *h) in cciss_wait_for_mode_change_ack() argument
3941 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_wait_for_mode_change_ack()
3947 static void cciss_enter_performant_mode(ctlr_info_t *h, u32 use_short_tags) in cciss_enter_performant_mode() argument
3977 h->reply_pool_wraparound = 1; /* spec: init to 1 */ in cciss_enter_performant_mode()
3980 memset(h->reply_pool, 0, h->max_commands * sizeof(__u64)); in cciss_enter_performant_mode()
3981 h->reply_pool_head = h->reply_pool; in cciss_enter_performant_mode()
3983 trans_offset = readl(&(h->cfgtable->TransMethodOffset)); in cciss_enter_performant_mode()
3984 calc_bucket_map(bft, ARRAY_SIZE(bft), h->maxsgentries, in cciss_enter_performant_mode()
3985 h->blockFetchTable); in cciss_enter_performant_mode()
3986 writel(bft[0], &h->transtable->BlockFetch0); in cciss_enter_performant_mode()
3987 writel(bft[1], &h->transtable->BlockFetch1); in cciss_enter_performant_mode()
3988 writel(bft[2], &h->transtable->BlockFetch2); in cciss_enter_performant_mode()
3989 writel(bft[3], &h->transtable->BlockFetch3); in cciss_enter_performant_mode()
3990 writel(bft[4], &h->transtable->BlockFetch4); in cciss_enter_performant_mode()
3991 writel(bft[5], &h->transtable->BlockFetch5); in cciss_enter_performant_mode()
3992 writel(bft[6], &h->transtable->BlockFetch6); in cciss_enter_performant_mode()
3993 writel(bft[7], &h->transtable->BlockFetch7); in cciss_enter_performant_mode()
3996 writel(h->max_commands, &h->transtable->RepQSize); in cciss_enter_performant_mode()
3997 writel(1, &h->transtable->RepQCount); in cciss_enter_performant_mode()
3998 writel(0, &h->transtable->RepQCtrAddrLow32); in cciss_enter_performant_mode()
3999 writel(0, &h->transtable->RepQCtrAddrHigh32); in cciss_enter_performant_mode()
4000 writel(h->reply_pool_dhandle, &h->transtable->RepQAddr0Low32); in cciss_enter_performant_mode()
4001 writel(0, &h->transtable->RepQAddr0High32); in cciss_enter_performant_mode()
4003 &(h->cfgtable->HostWrite.TransportRequest)); in cciss_enter_performant_mode()
4005 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_enter_performant_mode()
4006 cciss_wait_for_mode_change_ack(h); in cciss_enter_performant_mode()
4007 register_value = readl(&(h->cfgtable->TransportActive)); in cciss_enter_performant_mode()
4009 dev_warn(&h->pdev->dev, "cciss: unable to get board into" in cciss_enter_performant_mode()
4013 static void cciss_put_controller_into_performant_mode(ctlr_info_t *h) in cciss_put_controller_into_performant_mode() argument
4020 dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n"); in cciss_put_controller_into_performant_mode()
4023 trans_support = readl(&(h->cfgtable->TransportSupport)); in cciss_put_controller_into_performant_mode()
4027 dev_dbg(&h->pdev->dev, "Placing controller into performant mode\n"); in cciss_put_controller_into_performant_mode()
4033 dev_warn(&h->pdev->dev, "%s %d %s\n", in cciss_put_controller_into_performant_mode()
4041 h->reply_pool = (__u64 *)pci_alloc_consistent( in cciss_put_controller_into_performant_mode()
4042 h->pdev, h->max_commands * sizeof(__u64), in cciss_put_controller_into_performant_mode()
4043 &(h->reply_pool_dhandle)); in cciss_put_controller_into_performant_mode()
4046 h->blockFetchTable = kmalloc(((h->maxsgentries+1) * in cciss_put_controller_into_performant_mode()
4049 if ((h->reply_pool == NULL) || (h->blockFetchTable == NULL)) in cciss_put_controller_into_performant_mode()
4052 cciss_enter_performant_mode(h, in cciss_put_controller_into_performant_mode()
4056 h->access = SA5_performant_access; in cciss_put_controller_into_performant_mode()
4057 h->transMethod = CFGTBL_Trans_Performant; in cciss_put_controller_into_performant_mode()
4061 kfree(h->blockFetchTable); in cciss_put_controller_into_performant_mode()
4062 if (h->reply_pool) in cciss_put_controller_into_performant_mode()
4063 pci_free_consistent(h->pdev, in cciss_put_controller_into_performant_mode()
4064 h->max_commands * sizeof(__u64), in cciss_put_controller_into_performant_mode()
4065 h->reply_pool, in cciss_put_controller_into_performant_mode()
4066 h->reply_pool_dhandle); in cciss_put_controller_into_performant_mode()
4075 static void cciss_interrupt_mode(ctlr_info_t *h) in cciss_interrupt_mode() argument
4084 if ((h->board_id == 0x40700E11) || (h->board_id == 0x40800E11) || in cciss_interrupt_mode()
4085 (h->board_id == 0x40820E11) || (h->board_id == 0x40830E11)) in cciss_interrupt_mode()
4088 if (pci_find_capability(h->pdev, PCI_CAP_ID_MSIX)) { in cciss_interrupt_mode()
4089 err = pci_enable_msix_exact(h->pdev, cciss_msix_entries, 4); in cciss_interrupt_mode()
4091 h->intr[0] = cciss_msix_entries[0].vector; in cciss_interrupt_mode()
4092 h->intr[1] = cciss_msix_entries[1].vector; in cciss_interrupt_mode()
4093 h->intr[2] = cciss_msix_entries[2].vector; in cciss_interrupt_mode()
4094 h->intr[3] = cciss_msix_entries[3].vector; in cciss_interrupt_mode()
4095 h->msix_vector = 1; in cciss_interrupt_mode()
4098 dev_warn(&h->pdev->dev, in cciss_interrupt_mode()
4102 if (pci_find_capability(h->pdev, PCI_CAP_ID_MSI)) { in cciss_interrupt_mode()
4103 if (!pci_enable_msi(h->pdev)) in cciss_interrupt_mode()
4104 h->msi_vector = 1; in cciss_interrupt_mode()
4106 dev_warn(&h->pdev->dev, "MSI init failed\n"); in cciss_interrupt_mode()
4111 h->intr[h->intr_mode] = h->pdev->irq; in cciss_interrupt_mode()
4137 static inline bool cciss_board_disabled(ctlr_info_t *h) in cciss_board_disabled() argument
4141 (void) pci_read_config_word(h->pdev, PCI_COMMAND, &command); in cciss_board_disabled()
4206 static int cciss_find_cfgtables(ctlr_info_t *h) in cciss_find_cfgtables() argument
4214 rc = cciss_find_cfg_addrs(h->pdev, h->vaddr, &cfg_base_addr, in cciss_find_cfgtables()
4218 h->cfgtable = remap_pci_mem(pci_resource_start(h->pdev, in cciss_find_cfgtables()
4219 cfg_base_addr_index) + cfg_offset, sizeof(*h->cfgtable)); in cciss_find_cfgtables()
4220 if (!h->cfgtable) in cciss_find_cfgtables()
4222 rc = write_driver_ver_to_cfgtable(h->cfgtable); in cciss_find_cfgtables()
4226 trans_offset = readl(&h->cfgtable->TransMethodOffset); in cciss_find_cfgtables()
4227 h->transtable = remap_pci_mem(pci_resource_start(h->pdev, in cciss_find_cfgtables()
4229 sizeof(*h->transtable)); in cciss_find_cfgtables()
4230 if (!h->transtable) in cciss_find_cfgtables()
4235 static void cciss_get_max_perf_mode_cmds(struct ctlr_info *h) in cciss_get_max_perf_mode_cmds() argument
4237 h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands)); in cciss_get_max_perf_mode_cmds()
4240 if (reset_devices && h->max_commands > 32) in cciss_get_max_perf_mode_cmds()
4241 h->max_commands = 32; in cciss_get_max_perf_mode_cmds()
4243 if (h->max_commands < 16) { in cciss_get_max_perf_mode_cmds()
4244 dev_warn(&h->pdev->dev, "Controller reports " in cciss_get_max_perf_mode_cmds()
4247 h->max_commands); in cciss_get_max_perf_mode_cmds()
4248 h->max_commands = 16; in cciss_get_max_perf_mode_cmds()
4256 static void cciss_find_board_params(ctlr_info_t *h) in cciss_find_board_params() argument
4258 cciss_get_max_perf_mode_cmds(h); in cciss_find_board_params()
4259 h->nr_cmds = h->max_commands - 4 - cciss_tape_cmds; in cciss_find_board_params()
4260 h->maxsgentries = readl(&(h->cfgtable->MaxSGElements)); in cciss_find_board_params()
4266 if (h->board_id == 0x3225103C) in cciss_find_board_params()
4267 h->maxsgentries = MAXSGENTRIES; in cciss_find_board_params()
4272 h->max_cmd_sgentries = 31; in cciss_find_board_params()
4273 if (h->maxsgentries > 512) { in cciss_find_board_params()
4274 h->max_cmd_sgentries = 32; in cciss_find_board_params()
4275 h->chainsize = h->maxsgentries - h->max_cmd_sgentries + 1; in cciss_find_board_params()
4276 h->maxsgentries--; /* save one for chain pointer */ in cciss_find_board_params()
4278 h->maxsgentries = 31; /* default to traditional values */ in cciss_find_board_params()
4279 h->chainsize = 0; in cciss_find_board_params()
4283 static inline bool CISS_signature_present(ctlr_info_t *h) in CISS_signature_present() argument
4285 if (!check_signature(h->cfgtable->Signature, "CISS", 4)) { in CISS_signature_present()
4286 dev_warn(&h->pdev->dev, "not a valid CISS config table\n"); in CISS_signature_present()
4293 static inline void cciss_enable_scsi_prefetch(ctlr_info_t *h) in cciss_enable_scsi_prefetch() argument
4298 prefetch = readl(&(h->cfgtable->SCSI_Prefetch)); in cciss_enable_scsi_prefetch()
4300 writel(prefetch, &(h->cfgtable->SCSI_Prefetch)); in cciss_enable_scsi_prefetch()
4307 static inline void cciss_p600_dma_prefetch_quirk(ctlr_info_t *h) in cciss_p600_dma_prefetch_quirk() argument
4312 if (h->board_id != 0x3225103C) in cciss_p600_dma_prefetch_quirk()
4314 dma_prefetch = readl(h->vaddr + I2O_DMA1_CFG); in cciss_p600_dma_prefetch_quirk()
4316 writel(dma_prefetch, h->vaddr + I2O_DMA1_CFG); in cciss_p600_dma_prefetch_quirk()
4317 pci_read_config_dword(h->pdev, PCI_COMMAND_PARITY, &dma_refetch); in cciss_p600_dma_prefetch_quirk()
4319 pci_write_config_dword(h->pdev, PCI_COMMAND_PARITY, dma_refetch); in cciss_p600_dma_prefetch_quirk()
4322 static int cciss_pci_init(ctlr_info_t *h) in cciss_pci_init() argument
4326 prod_index = cciss_lookup_board_id(h->pdev, &h->board_id); in cciss_pci_init()
4329 h->product_name = products[prod_index].product_name; in cciss_pci_init()
4330 h->access = *(products[prod_index].access); in cciss_pci_init()
4332 if (cciss_board_disabled(h)) { in cciss_pci_init()
4333 dev_warn(&h->pdev->dev, "controller appears to be disabled\n"); in cciss_pci_init()
4337 pci_disable_link_state(h->pdev, PCIE_LINK_STATE_L0S | in cciss_pci_init()
4340 err = pci_enable_device(h->pdev); in cciss_pci_init()
4342 dev_warn(&h->pdev->dev, "Unable to Enable PCI device\n"); in cciss_pci_init()
4346 err = pci_request_regions(h->pdev, "cciss"); in cciss_pci_init()
4348 dev_warn(&h->pdev->dev, in cciss_pci_init()
4353 dev_dbg(&h->pdev->dev, "irq = %x\n", h->pdev->irq); in cciss_pci_init()
4354 dev_dbg(&h->pdev->dev, "board_id = %x\n", h->board_id); in cciss_pci_init()
4359 cciss_interrupt_mode(h); in cciss_pci_init()
4360 err = cciss_pci_find_memory_BAR(h->pdev, &h->paddr); in cciss_pci_init()
4363 h->vaddr = remap_pci_mem(h->paddr, 0x250); in cciss_pci_init()
4364 if (!h->vaddr) { in cciss_pci_init()
4368 err = cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_READY); in cciss_pci_init()
4371 err = cciss_find_cfgtables(h); in cciss_pci_init()
4374 print_cfg_table(h); in cciss_pci_init()
4375 cciss_find_board_params(h); in cciss_pci_init()
4377 if (!CISS_signature_present(h)) { in cciss_pci_init()
4381 cciss_enable_scsi_prefetch(h); in cciss_pci_init()
4382 cciss_p600_dma_prefetch_quirk(h); in cciss_pci_init()
4383 err = cciss_enter_simple_mode(h); in cciss_pci_init()
4386 cciss_put_controller_into_performant_mode(h); in cciss_pci_init()
4394 if (h->transtable) in cciss_pci_init()
4395 iounmap(h->transtable); in cciss_pci_init()
4396 if (h->cfgtable) in cciss_pci_init()
4397 iounmap(h->cfgtable); in cciss_pci_init()
4398 if (h->vaddr) in cciss_pci_init()
4399 iounmap(h->vaddr); in cciss_pci_init()
4400 pci_release_regions(h->pdev); in cciss_pci_init()
4413 ctlr_info_t *h; in alloc_cciss_hba() local
4415 h = kzalloc(sizeof(ctlr_info_t), GFP_KERNEL); in alloc_cciss_hba()
4416 if (!h) in alloc_cciss_hba()
4418 hba[i] = h; in alloc_cciss_hba()
4430 static void free_hba(ctlr_info_t *h) in free_hba() argument
4434 hba[h->ctlr] = NULL; in free_hba()
4435 for (i = 0; i < h->highest_lun + 1; i++) in free_hba()
4436 if (h->gendisk[i] != NULL) in free_hba()
4437 put_disk(h->gendisk[i]); in free_hba()
4438 kfree(h); in free_hba()
4822 static int cciss_allocate_cmd_pool(ctlr_info_t *h) in cciss_allocate_cmd_pool() argument
4824 h->cmd_pool_bits = kmalloc(BITS_TO_LONGS(h->nr_cmds) * in cciss_allocate_cmd_pool()
4826 h->cmd_pool = pci_alloc_consistent(h->pdev, in cciss_allocate_cmd_pool()
4827 h->nr_cmds * sizeof(CommandList_struct), in cciss_allocate_cmd_pool()
4828 &(h->cmd_pool_dhandle)); in cciss_allocate_cmd_pool()
4829 h->errinfo_pool = pci_alloc_consistent(h->pdev, in cciss_allocate_cmd_pool()
4830 h->nr_cmds * sizeof(ErrorInfo_struct), in cciss_allocate_cmd_pool()
4831 &(h->errinfo_pool_dhandle)); in cciss_allocate_cmd_pool()
4832 if ((h->cmd_pool_bits == NULL) in cciss_allocate_cmd_pool()
4833 || (h->cmd_pool == NULL) in cciss_allocate_cmd_pool()
4834 || (h->errinfo_pool == NULL)) { in cciss_allocate_cmd_pool()
4835 dev_err(&h->pdev->dev, "out of memory"); in cciss_allocate_cmd_pool()
4841 static int cciss_allocate_scatterlists(ctlr_info_t *h) in cciss_allocate_scatterlists() argument
4846 h->scatter_list = kzalloc(h->max_commands * in cciss_allocate_scatterlists()
4848 if (!h->scatter_list) in cciss_allocate_scatterlists()
4851 for (i = 0; i < h->nr_cmds; i++) { in cciss_allocate_scatterlists()
4852 h->scatter_list[i] = kmalloc(sizeof(struct scatterlist) * in cciss_allocate_scatterlists()
4853 h->maxsgentries, GFP_KERNEL); in cciss_allocate_scatterlists()
4854 if (h->scatter_list[i] == NULL) { in cciss_allocate_scatterlists()
4855 dev_err(&h->pdev->dev, "could not allocate " in cciss_allocate_scatterlists()
4863 static void cciss_free_scatterlists(ctlr_info_t *h) in cciss_free_scatterlists() argument
4867 if (h->scatter_list) { in cciss_free_scatterlists()
4868 for (i = 0; i < h->nr_cmds; i++) in cciss_free_scatterlists()
4869 kfree(h->scatter_list[i]); in cciss_free_scatterlists()
4870 kfree(h->scatter_list); in cciss_free_scatterlists()
4874 static void cciss_free_cmd_pool(ctlr_info_t *h) in cciss_free_cmd_pool() argument
4876 kfree(h->cmd_pool_bits); in cciss_free_cmd_pool()
4877 if (h->cmd_pool) in cciss_free_cmd_pool()
4878 pci_free_consistent(h->pdev, in cciss_free_cmd_pool()
4879 h->nr_cmds * sizeof(CommandList_struct), in cciss_free_cmd_pool()
4880 h->cmd_pool, h->cmd_pool_dhandle); in cciss_free_cmd_pool()
4881 if (h->errinfo_pool) in cciss_free_cmd_pool()
4882 pci_free_consistent(h->pdev, in cciss_free_cmd_pool()
4883 h->nr_cmds * sizeof(ErrorInfo_struct), in cciss_free_cmd_pool()
4884 h->errinfo_pool, h->errinfo_pool_dhandle); in cciss_free_cmd_pool()
4887 static int cciss_request_irq(ctlr_info_t *h, in cciss_request_irq() argument
4891 if (h->msix_vector || h->msi_vector) { in cciss_request_irq()
4892 if (!request_irq(h->intr[h->intr_mode], msixhandler, in cciss_request_irq()
4893 0, h->devname, h)) in cciss_request_irq()
4895 dev_err(&h->pdev->dev, "Unable to get msi irq %d" in cciss_request_irq()
4896 " for %s\n", h->intr[h->intr_mode], in cciss_request_irq()
4897 h->devname); in cciss_request_irq()
4901 if (!request_irq(h->intr[h->intr_mode], intxhandler, in cciss_request_irq()
4902 IRQF_SHARED, h->devname, h)) in cciss_request_irq()
4904 dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n", in cciss_request_irq()
4905 h->intr[h->intr_mode], h->devname); in cciss_request_irq()
4909 static int cciss_kdump_soft_reset(ctlr_info_t *h) in cciss_kdump_soft_reset() argument
4911 if (cciss_send_reset(h, CTLR_LUNID, CCISS_RESET_TYPE_CONTROLLER)) { in cciss_kdump_soft_reset()
4912 dev_warn(&h->pdev->dev, "Resetting array controller failed.\n"); in cciss_kdump_soft_reset()
4916 dev_info(&h->pdev->dev, "Waiting for board to soft reset.\n"); in cciss_kdump_soft_reset()
4917 if (cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_NOT_READY)) { in cciss_kdump_soft_reset()
4918 dev_warn(&h->pdev->dev, "Soft reset had no effect.\n"); in cciss_kdump_soft_reset()
4922 dev_info(&h->pdev->dev, "Board reset, awaiting READY status.\n"); in cciss_kdump_soft_reset()
4923 if (cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_READY)) { in cciss_kdump_soft_reset()
4924 dev_warn(&h->pdev->dev, "Board failed to become ready " in cciss_kdump_soft_reset()
4932 static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h) in cciss_undo_allocations_after_kdump_soft_reset() argument
4934 int ctlr = h->ctlr; in cciss_undo_allocations_after_kdump_soft_reset()
4936 free_irq(h->intr[h->intr_mode], h); in cciss_undo_allocations_after_kdump_soft_reset()
4938 if (h->msix_vector) in cciss_undo_allocations_after_kdump_soft_reset()
4939 pci_disable_msix(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4940 else if (h->msi_vector) in cciss_undo_allocations_after_kdump_soft_reset()
4941 pci_disable_msi(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4943 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_undo_allocations_after_kdump_soft_reset()
4944 cciss_free_scatterlists(h); in cciss_undo_allocations_after_kdump_soft_reset()
4945 cciss_free_cmd_pool(h); in cciss_undo_allocations_after_kdump_soft_reset()
4946 kfree(h->blockFetchTable); in cciss_undo_allocations_after_kdump_soft_reset()
4947 if (h->reply_pool) in cciss_undo_allocations_after_kdump_soft_reset()
4948 pci_free_consistent(h->pdev, h->max_commands * sizeof(__u64), in cciss_undo_allocations_after_kdump_soft_reset()
4949 h->reply_pool, h->reply_pool_dhandle); in cciss_undo_allocations_after_kdump_soft_reset()
4950 if (h->transtable) in cciss_undo_allocations_after_kdump_soft_reset()
4951 iounmap(h->transtable); in cciss_undo_allocations_after_kdump_soft_reset()
4952 if (h->cfgtable) in cciss_undo_allocations_after_kdump_soft_reset()
4953 iounmap(h->cfgtable); in cciss_undo_allocations_after_kdump_soft_reset()
4954 if (h->vaddr) in cciss_undo_allocations_after_kdump_soft_reset()
4955 iounmap(h->vaddr); in cciss_undo_allocations_after_kdump_soft_reset()
4956 unregister_blkdev(h->major, h->devname); in cciss_undo_allocations_after_kdump_soft_reset()
4957 cciss_destroy_hba_sysfs_entry(h); in cciss_undo_allocations_after_kdump_soft_reset()
4958 pci_release_regions(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4959 kfree(h); in cciss_undo_allocations_after_kdump_soft_reset()
4976 ctlr_info_t *h; in cciss_init_one() local
5008 h = hba[i]; in cciss_init_one()
5009 h->pdev = pdev; in cciss_init_one()
5010 h->busy_initializing = 1; in cciss_init_one()
5011 h->intr_mode = cciss_simple_mode ? SIMPLE_MODE_INT : PERF_MODE_INT; in cciss_init_one()
5012 INIT_LIST_HEAD(&h->cmpQ); in cciss_init_one()
5013 INIT_LIST_HEAD(&h->reqQ); in cciss_init_one()
5014 mutex_init(&h->busy_shutting_down); in cciss_init_one()
5016 if (cciss_pci_init(h) != 0) in cciss_init_one()
5019 sprintf(h->devname, "cciss%d", i); in cciss_init_one()
5020 h->ctlr = i; in cciss_init_one()
5027 init_completion(&h->scan_wait); in cciss_init_one()
5029 if (cciss_create_hba_sysfs_entry(h)) in cciss_init_one()
5038 dev_err(&h->pdev->dev, "no suitable DMA available\n"); in cciss_init_one()
5048 h->major = COMPAQ_CISS_MAJOR + i; in cciss_init_one()
5049 rc = register_blkdev(h->major, h->devname); in cciss_init_one()
5051 dev_err(&h->pdev->dev, in cciss_init_one()
5053 "on hba %d\n", h->major, h->devname, i); in cciss_init_one()
5057 h->major = rc; in cciss_init_one()
5061 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5062 rc = cciss_request_irq(h, do_cciss_msix_intr, do_cciss_intx); in cciss_init_one()
5066 dev_info(&h->pdev->dev, "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n", in cciss_init_one()
5067 h->devname, pdev->device, pci_name(pdev), in cciss_init_one()
5068 h->intr[h->intr_mode], dac ? "" : " not"); in cciss_init_one()
5070 if (cciss_allocate_cmd_pool(h)) in cciss_init_one()
5073 if (cciss_allocate_scatterlists(h)) in cciss_init_one()
5076 h->cmd_sg_list = cciss_allocate_sg_chain_blocks(h, in cciss_init_one()
5077 h->chainsize, h->nr_cmds); in cciss_init_one()
5078 if (!h->cmd_sg_list && h->chainsize > 0) in cciss_init_one()
5081 spin_lock_init(&h->lock); in cciss_init_one()
5085 pci_set_drvdata(pdev, h); in cciss_init_one()
5088 bitmap_zero(h->cmd_pool_bits, h->nr_cmds); in cciss_init_one()
5090 h->num_luns = 0; in cciss_init_one()
5091 h->highest_lun = -1; in cciss_init_one()
5093 h->drv[j] = NULL; in cciss_init_one()
5094 h->gendisk[j] = NULL; in cciss_init_one()
5110 spin_lock_irqsave(&h->lock, flags); in cciss_init_one()
5111 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5112 spin_unlock_irqrestore(&h->lock, flags); in cciss_init_one()
5113 free_irq(h->intr[h->intr_mode], h); in cciss_init_one()
5114 rc = cciss_request_irq(h, cciss_msix_discard_completions, in cciss_init_one()
5117 dev_warn(&h->pdev->dev, "Failed to request_irq after " in cciss_init_one()
5122 rc = cciss_kdump_soft_reset(h); in cciss_init_one()
5124 dev_warn(&h->pdev->dev, "Soft reset failed.\n"); in cciss_init_one()
5128 dev_info(&h->pdev->dev, "Board READY.\n"); in cciss_init_one()
5129 dev_info(&h->pdev->dev, in cciss_init_one()
5131 h->access.set_intr_mask(h, CCISS_INTR_ON); in cciss_init_one()
5133 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5135 rc = controller_reset_failed(h->cfgtable); in cciss_init_one()
5137 dev_info(&h->pdev->dev, in cciss_init_one()
5144 cciss_undo_allocations_after_kdump_soft_reset(h); in cciss_init_one()
5153 cciss_scsi_setup(h); in cciss_init_one()
5156 h->access.set_intr_mask(h, CCISS_INTR_ON); in cciss_init_one()
5161 dev_err(&h->pdev->dev, "out of memory\n"); in cciss_init_one()
5165 return_code = sendcmd_withirq(h, CISS_INQUIRY, inq_buff, in cciss_init_one()
5168 h->firm_ver[0] = inq_buff->data_byte[32]; in cciss_init_one()
5169 h->firm_ver[1] = inq_buff->data_byte[33]; in cciss_init_one()
5170 h->firm_ver[2] = inq_buff->data_byte[34]; in cciss_init_one()
5171 h->firm_ver[3] = inq_buff->data_byte[35]; in cciss_init_one()
5173 dev_warn(&h->pdev->dev, "unable to determine firmware" in cciss_init_one()
5178 cciss_procinit(h); in cciss_init_one()
5180 h->cciss_max_sectors = 8192; in cciss_init_one()
5182 rebuild_lun_table(h, 1, 0); in cciss_init_one()
5183 cciss_engage_scsi(h); in cciss_init_one()
5184 h->busy_initializing = 0; in cciss_init_one()
5188 cciss_free_cmd_pool(h); in cciss_init_one()
5189 cciss_free_scatterlists(h); in cciss_init_one()
5190 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_init_one()
5191 free_irq(h->intr[h->intr_mode], h); in cciss_init_one()
5193 unregister_blkdev(h->major, h->devname); in cciss_init_one()
5195 cciss_destroy_hba_sysfs_entry(h); in cciss_init_one()
5199 h->busy_initializing = 0; in cciss_init_one()
5206 free_hba(h); in cciss_init_one()
5212 ctlr_info_t *h; in cciss_shutdown() local
5216 h = pci_get_drvdata(pdev); in cciss_shutdown()
5219 dev_warn(&h->pdev->dev, "cache not flushed, out of memory.\n"); in cciss_shutdown()
5223 return_code = sendcmd_withirq(h, CCISS_CACHE_FLUSH, flush_buf, in cciss_shutdown()
5227 dev_warn(&h->pdev->dev, "Error flushing cache\n"); in cciss_shutdown()
5228 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_shutdown()
5229 free_irq(h->intr[h->intr_mode], h); in cciss_shutdown()
5232 static int cciss_enter_simple_mode(struct ctlr_info *h) in cciss_enter_simple_mode() argument
5236 trans_support = readl(&(h->cfgtable->TransportSupport)); in cciss_enter_simple_mode()
5240 h->max_commands = readl(&(h->cfgtable->CmdsOutMax)); in cciss_enter_simple_mode()
5241 writel(CFGTBL_Trans_Simple, &(h->cfgtable->HostWrite.TransportRequest)); in cciss_enter_simple_mode()
5242 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_enter_simple_mode()
5243 cciss_wait_for_mode_change_ack(h); in cciss_enter_simple_mode()
5244 print_cfg_table(h); in cciss_enter_simple_mode()
5245 if (!(readl(&(h->cfgtable->TransportActive)) & CFGTBL_Trans_Simple)) { in cciss_enter_simple_mode()
5246 dev_warn(&h->pdev->dev, "unable to get board into simple mode\n"); in cciss_enter_simple_mode()
5249 h->transMethod = CFGTBL_Trans_Simple; in cciss_enter_simple_mode()
5256 ctlr_info_t *h; in cciss_remove_one() local
5264 h = pci_get_drvdata(pdev); in cciss_remove_one()
5265 i = h->ctlr; in cciss_remove_one()
5271 mutex_lock(&h->busy_shutting_down); in cciss_remove_one()
5273 remove_from_scan_list(h); in cciss_remove_one()
5274 remove_proc_entry(h->devname, proc_cciss); in cciss_remove_one()
5275 unregister_blkdev(h->major, h->devname); in cciss_remove_one()
5279 struct gendisk *disk = h->gendisk[j]; in cciss_remove_one()
5284 cciss_destroy_ld_sysfs_entry(h, j, 1); in cciss_remove_one()
5293 cciss_unregister_scsi(h); /* unhook from SCSI subsystem */ in cciss_remove_one()
5299 if (h->msix_vector) in cciss_remove_one()
5300 pci_disable_msix(h->pdev); in cciss_remove_one()
5301 else if (h->msi_vector) in cciss_remove_one()
5302 pci_disable_msi(h->pdev); in cciss_remove_one()
5305 iounmap(h->transtable); in cciss_remove_one()
5306 iounmap(h->cfgtable); in cciss_remove_one()
5307 iounmap(h->vaddr); in cciss_remove_one()
5309 cciss_free_cmd_pool(h); in cciss_remove_one()
5311 for (j = 0; j < h->nr_cmds; j++) in cciss_remove_one()
5312 kfree(h->scatter_list[j]); in cciss_remove_one()
5313 kfree(h->scatter_list); in cciss_remove_one()
5314 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_remove_one()
5315 kfree(h->blockFetchTable); in cciss_remove_one()
5316 if (h->reply_pool) in cciss_remove_one()
5317 pci_free_consistent(h->pdev, h->max_commands * sizeof(__u64), in cciss_remove_one()
5318 h->reply_pool, h->reply_pool_dhandle); in cciss_remove_one()
5325 cciss_destroy_hba_sysfs_entry(h); in cciss_remove_one()
5326 mutex_unlock(&h->busy_shutting_down); in cciss_remove_one()
5327 free_hba(h); in cciss_remove_one()