Lines Matching refs:h

176 static int rebuild_lun_table(ctlr_info_t *h, int first_time, int via_ioctl);
177 static int deregister_disk(ctlr_info_t *h, int drv_index,
180 static void cciss_read_capacity(ctlr_info_t *h, int logvol,
182 static void cciss_read_capacity_16(ctlr_info_t *h, int logvol,
184 static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol,
189 static int cciss_enter_simple_mode(struct ctlr_info *h);
190 static void start_io(ctlr_info_t *h);
191 static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size,
194 static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c,
196 static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c);
198 static int add_to_scan_list(struct ctlr_info *h);
200 static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c);
203 static void cciss_free_gendisk(ctlr_info_t *h, int drv_index);
204 static void cciss_free_drive_info(ctlr_info_t *h, int drv_index);
205 static inline u32 next_command(ctlr_info_t *h);
211 static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag);
217 static void cciss_put_controller_into_performant_mode(ctlr_info_t *h);
220 static void cciss_procinit(ctlr_info_t *h);
222 static void cciss_procinit(ctlr_info_t *h) in cciss_procinit() argument
248 static void set_performant_mode(ctlr_info_t *h, CommandList_struct *c) in set_performant_mode() argument
250 if (likely(h->transMethod & CFGTBL_Trans_Performant)) in set_performant_mode()
251 c->busaddr |= 1 | (h->blockFetchTable[c->Header.SGList] << 1); in set_performant_mode()
280 static void enqueue_cmd_and_start_io(ctlr_info_t *h, in enqueue_cmd_and_start_io() argument
284 set_performant_mode(h, c); in enqueue_cmd_and_start_io()
285 spin_lock_irqsave(&h->lock, flags); in enqueue_cmd_and_start_io()
286 addQ(&h->reqQ, c); in enqueue_cmd_and_start_io()
287 h->Qdepth++; in enqueue_cmd_and_start_io()
288 if (h->Qdepth > h->maxQsinceinit) in enqueue_cmd_and_start_io()
289 h->maxQsinceinit = h->Qdepth; in enqueue_cmd_and_start_io()
290 start_io(h); in enqueue_cmd_and_start_io()
291 spin_unlock_irqrestore(&h->lock, flags); in enqueue_cmd_and_start_io()
309 ctlr_info_t *h, int chainsize, int nr_cmds) in cciss_allocate_sg_chain_blocks() argument
327 dev_err(&h->pdev->dev, "Cannot get memory " in cciss_allocate_sg_chain_blocks()
338 static void cciss_unmap_sg_chain_block(ctlr_info_t *h, CommandList_struct *c) in cciss_unmap_sg_chain_block() argument
343 if (c->Header.SGTotal <= h->max_cmd_sgentries) in cciss_unmap_sg_chain_block()
346 chain_sg = &c->SG[h->max_cmd_sgentries - 1]; in cciss_unmap_sg_chain_block()
349 pci_unmap_single(h->pdev, temp64.val, chain_sg->Len, PCI_DMA_TODEVICE); in cciss_unmap_sg_chain_block()
352 static void cciss_map_sg_chain_block(ctlr_info_t *h, CommandList_struct *c, in cciss_map_sg_chain_block() argument
358 chain_sg = &c->SG[h->max_cmd_sgentries - 1]; in cciss_map_sg_chain_block()
361 temp64.val = pci_map_single(h->pdev, chain_block, len, in cciss_map_sg_chain_block()
385 ctlr_info_t *h = seq->private; in cciss_seq_show_header() local
397 h->devname, in cciss_seq_show_header()
398 h->product_name, in cciss_seq_show_header()
399 (unsigned long)h->board_id, in cciss_seq_show_header()
400 h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], in cciss_seq_show_header()
401 h->firm_ver[3], (unsigned int)h->intr[h->intr_mode], in cciss_seq_show_header()
402 h->num_luns, in cciss_seq_show_header()
403 h->Qdepth, h->commands_outstanding, in cciss_seq_show_header()
404 h->maxQsinceinit, h->max_outstanding, h->maxSG); in cciss_seq_show_header()
407 cciss_seq_tape_report(seq, h); in cciss_seq_show_header()
413 ctlr_info_t *h = seq->private; in cciss_seq_start() local
419 spin_lock_irqsave(&h->lock, flags); in cciss_seq_start()
420 if (h->busy_configuring) { in cciss_seq_start()
421 spin_unlock_irqrestore(&h->lock, flags); in cciss_seq_start()
424 h->busy_configuring = 1; in cciss_seq_start()
425 spin_unlock_irqrestore(&h->lock, flags); in cciss_seq_start()
436 ctlr_info_t *h = seq->private; in cciss_seq_show() local
437 unsigned ctlr = h->ctlr; in cciss_seq_show()
439 drive_info_struct *drv = h->drv[*pos]; in cciss_seq_show()
441 if (*pos > h->highest_lun) in cciss_seq_show()
466 ctlr_info_t *h = seq->private; in cciss_seq_next() local
468 if (*pos > h->highest_lun) in cciss_seq_next()
477 ctlr_info_t *h = seq->private; in cciss_seq_stop() local
484 h->busy_configuring = 0; in cciss_seq_stop()
531 ctlr_info_t *h = seq->private; in cciss_proc_write() local
533 err = cciss_engage_scsi(h); in cciss_proc_write()
556 static void cciss_procinit(ctlr_info_t *h) in cciss_procinit() argument
564 pde = proc_create_data(h->devname, S_IWUSR | S_IRUSR | S_IRGRP | in cciss_procinit()
566 &cciss_proc_fops, h); in cciss_procinit()
629 struct ctlr_info *h = to_hba(dev); in host_show_resettable() local
631 return snprintf(buf, 20, "%d\n", ctlr_is_resettable(h->board_id)); in host_show_resettable()
639 struct ctlr_info *h = to_hba(dev); in host_store_rescan() local
641 add_to_scan_list(h); in host_store_rescan()
643 wait_for_completion_interruptible(&h->scan_wait); in host_store_rescan()
653 struct ctlr_info *h = to_hba(dev); in host_show_transport_mode() local
656 h->transMethod & CFGTBL_Trans_Performant ? in host_show_transport_mode()
666 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_unique_id() local
671 spin_lock_irqsave(&h->lock, flags); in dev_show_unique_id()
672 if (h->busy_configuring) in dev_show_unique_id()
676 spin_unlock_irqrestore(&h->lock, flags); in dev_show_unique_id()
696 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_vendor() local
701 spin_lock_irqsave(&h->lock, flags); in dev_show_vendor()
702 if (h->busy_configuring) in dev_show_vendor()
706 spin_unlock_irqrestore(&h->lock, flags); in dev_show_vendor()
720 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_model() local
725 spin_lock_irqsave(&h->lock, flags); in dev_show_model()
726 if (h->busy_configuring) in dev_show_model()
730 spin_unlock_irqrestore(&h->lock, flags); in dev_show_model()
744 struct ctlr_info *h = to_hba(drv->dev.parent); in dev_show_rev() local
749 spin_lock_irqsave(&h->lock, flags); in dev_show_rev()
750 if (h->busy_configuring) in dev_show_rev()
754 spin_unlock_irqrestore(&h->lock, flags); in dev_show_rev()
767 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_lunid() local
771 spin_lock_irqsave(&h->lock, flags); in cciss_show_lunid()
772 if (h->busy_configuring) { in cciss_show_lunid()
773 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
777 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
781 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_lunid()
792 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_raid_level() local
796 spin_lock_irqsave(&h->lock, flags); in cciss_show_raid_level()
797 if (h->busy_configuring) { in cciss_show_raid_level()
798 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_raid_level()
802 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_raid_level()
815 struct ctlr_info *h = to_hba(drv->dev.parent); in cciss_show_usage_count() local
819 spin_lock_irqsave(&h->lock, flags); in cciss_show_usage_count()
820 if (h->busy_configuring) { in cciss_show_usage_count()
821 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_usage_count()
825 spin_unlock_irqrestore(&h->lock, flags); in cciss_show_usage_count()
899 static int cciss_create_hba_sysfs_entry(struct ctlr_info *h) in cciss_create_hba_sysfs_entry() argument
901 device_initialize(&h->dev); in cciss_create_hba_sysfs_entry()
902 h->dev.type = &cciss_host_type; in cciss_create_hba_sysfs_entry()
903 h->dev.bus = &cciss_bus_type; in cciss_create_hba_sysfs_entry()
904 dev_set_name(&h->dev, "%s", h->devname); in cciss_create_hba_sysfs_entry()
905 h->dev.parent = &h->pdev->dev; in cciss_create_hba_sysfs_entry()
907 return device_add(&h->dev); in cciss_create_hba_sysfs_entry()
913 static void cciss_destroy_hba_sysfs_entry(struct ctlr_info *h) in cciss_destroy_hba_sysfs_entry() argument
915 device_del(&h->dev); in cciss_destroy_hba_sysfs_entry()
916 put_device(&h->dev); /* final put. */ in cciss_destroy_hba_sysfs_entry()
934 static long cciss_create_ld_sysfs_entry(struct ctlr_info *h, in cciss_create_ld_sysfs_entry() argument
939 if (h->drv[drv_index]->device_initialized) in cciss_create_ld_sysfs_entry()
942 dev = &h->drv[drv_index]->dev; in cciss_create_ld_sysfs_entry()
946 dev_set_name(dev, "c%dd%d", h->ctlr, drv_index); in cciss_create_ld_sysfs_entry()
947 dev->parent = &h->dev; in cciss_create_ld_sysfs_entry()
948 h->drv[drv_index]->device_initialized = 1; in cciss_create_ld_sysfs_entry()
955 static void cciss_destroy_ld_sysfs_entry(struct ctlr_info *h, int drv_index, in cciss_destroy_ld_sysfs_entry() argument
958 struct device *dev = &h->drv[drv_index]->dev; in cciss_destroy_ld_sysfs_entry()
966 h->drv[drv_index] = NULL; in cciss_destroy_ld_sysfs_entry()
974 static CommandList_struct *cmd_alloc(ctlr_info_t *h) in cmd_alloc() argument
982 i = find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds); in cmd_alloc()
983 if (i == h->nr_cmds) in cmd_alloc()
985 } while (test_and_set_bit(i, h->cmd_pool_bits) != 0); in cmd_alloc()
986 c = h->cmd_pool + i; in cmd_alloc()
988 cmd_dma_handle = h->cmd_pool_dhandle + i * sizeof(CommandList_struct); in cmd_alloc()
989 c->err_info = h->errinfo_pool + i; in cmd_alloc()
991 err_dma_handle = h->errinfo_pool_dhandle in cmd_alloc()
993 h->nr_allocs++; in cmd_alloc()
1004 c->ctlr = h->ctlr; in cmd_alloc()
1011 static CommandList_struct *cmd_special_alloc(ctlr_info_t *h) in cmd_special_alloc() argument
1017 c = pci_zalloc_consistent(h->pdev, sizeof(CommandList_struct), in cmd_special_alloc()
1024 c->err_info = pci_zalloc_consistent(h->pdev, sizeof(ErrorInfo_struct), in cmd_special_alloc()
1028 pci_free_consistent(h->pdev, in cmd_special_alloc()
1040 c->ctlr = h->ctlr; in cmd_special_alloc()
1044 static void cmd_free(ctlr_info_t *h, CommandList_struct *c) in cmd_free() argument
1048 i = c - h->cmd_pool; in cmd_free()
1049 clear_bit(i, h->cmd_pool_bits); in cmd_free()
1050 h->nr_frees++; in cmd_free()
1053 static void cmd_special_free(ctlr_info_t *h, CommandList_struct *c) in cmd_special_free() argument
1059 pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct), in cmd_special_free()
1061 pci_free_consistent(h->pdev, sizeof(CommandList_struct), c, in cmd_special_free()
1062 (dma_addr_t) cciss_tag_discard_error_bits(h, (u32) c->busaddr)); in cmd_special_free()
1080 ctlr_info_t *h = get_host(bdev->bd_disk); in cciss_open() local
1083 dev_dbg(&h->pdev->dev, "cciss_open %s\n", bdev->bd_disk->disk_name); in cciss_open()
1109 h->usage_count++; in cciss_open()
1129 ctlr_info_t *h; in cciss_release() local
1133 h = get_host(disk); in cciss_release()
1135 dev_dbg(&h->pdev->dev, "cciss_release %s\n", disk->disk_name); in cciss_release()
1137 h->usage_count--; in cciss_release()
1275 static void check_ioctl_unit_attention(ctlr_info_t *h, CommandList_struct *c) in check_ioctl_unit_attention() argument
1279 (void)check_for_unit_attention(h, c); in check_ioctl_unit_attention()
1282 static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp) in cciss_getpciinfo() argument
1288 pciinfo.domain = pci_domain_nr(h->pdev->bus); in cciss_getpciinfo()
1289 pciinfo.bus = h->pdev->bus->number; in cciss_getpciinfo()
1290 pciinfo.dev_fn = h->pdev->devfn; in cciss_getpciinfo()
1291 pciinfo.board_id = h->board_id; in cciss_getpciinfo()
1297 static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) in cciss_getintinfo() argument
1304 spin_lock_irqsave(&h->lock, flags); in cciss_getintinfo()
1305 intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); in cciss_getintinfo()
1306 intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); in cciss_getintinfo()
1307 spin_unlock_irqrestore(&h->lock, flags); in cciss_getintinfo()
1314 static int cciss_setintinfo(ctlr_info_t *h, void __user *argp) in cciss_setintinfo() argument
1328 spin_lock_irqsave(&h->lock, flags); in cciss_setintinfo()
1330 writel(intinfo.delay, &(h->cfgtable->HostWrite.CoalIntDelay)); in cciss_setintinfo()
1331 writel(intinfo.count, &(h->cfgtable->HostWrite.CoalIntCount)); in cciss_setintinfo()
1332 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_setintinfo()
1335 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_setintinfo()
1339 spin_unlock_irqrestore(&h->lock, flags); in cciss_setintinfo()
1345 static int cciss_getnodename(ctlr_info_t *h, void __user *argp) in cciss_getnodename() argument
1353 spin_lock_irqsave(&h->lock, flags); in cciss_getnodename()
1355 NodeName[i] = readb(&h->cfgtable->ServerName[i]); in cciss_getnodename()
1356 spin_unlock_irqrestore(&h->lock, flags); in cciss_getnodename()
1362 static int cciss_setnodename(ctlr_info_t *h, void __user *argp) in cciss_setnodename() argument
1374 spin_lock_irqsave(&h->lock, flags); in cciss_setnodename()
1377 writeb(NodeName[i], &h->cfgtable->ServerName[i]); in cciss_setnodename()
1378 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_setnodename()
1380 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_setnodename()
1384 spin_unlock_irqrestore(&h->lock, flags); in cciss_setnodename()
1390 static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) in cciss_getheartbeat() argument
1397 spin_lock_irqsave(&h->lock, flags); in cciss_getheartbeat()
1398 heartbeat = readl(&h->cfgtable->HeartBeat); in cciss_getheartbeat()
1399 spin_unlock_irqrestore(&h->lock, flags); in cciss_getheartbeat()
1405 static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) in cciss_getbustypes() argument
1412 spin_lock_irqsave(&h->lock, flags); in cciss_getbustypes()
1413 BusTypes = readl(&h->cfgtable->BusTypes); in cciss_getbustypes()
1414 spin_unlock_irqrestore(&h->lock, flags); in cciss_getbustypes()
1420 static int cciss_getfirmver(ctlr_info_t *h, void __user *argp) in cciss_getfirmver() argument
1426 memcpy(firmware, h->firm_ver, 4); in cciss_getfirmver()
1434 static int cciss_getdrivver(ctlr_info_t *h, void __user *argp) in cciss_getdrivver() argument
1445 static int cciss_getluninfo(ctlr_info_t *h, in cciss_getluninfo() argument
1461 static int cciss_passthru(ctlr_info_t *h, void __user *argp) in cciss_passthru() argument
1496 c = cmd_special_alloc(h); in cciss_passthru()
1521 temp64.val = pci_map_single(h->pdev, buff, in cciss_passthru()
1530 enqueue_cmd_and_start_io(h, c); in cciss_passthru()
1536 pci_unmap_single(h->pdev, (dma_addr_t) temp64.val, iocommand.buf_size, in cciss_passthru()
1538 check_ioctl_unit_attention(h, c); in cciss_passthru()
1544 cmd_special_free(h, c); in cciss_passthru()
1552 cmd_special_free(h, c); in cciss_passthru()
1557 cmd_special_free(h, c); in cciss_passthru()
1561 static int cciss_bigpassthru(ctlr_info_t *h, void __user *argp) in cciss_bigpassthru() argument
1635 c = cmd_special_alloc(h); in cciss_bigpassthru()
1649 temp64.val = pci_map_single(h->pdev, buff[i], buff_size[i], in cciss_bigpassthru()
1657 enqueue_cmd_and_start_io(h, c); in cciss_bigpassthru()
1663 pci_unmap_single(h->pdev, in cciss_bigpassthru()
1667 check_ioctl_unit_attention(h, c); in cciss_bigpassthru()
1671 cmd_special_free(h, c); in cciss_bigpassthru()
1680 cmd_special_free(h, c); in cciss_bigpassthru()
1687 cmd_special_free(h, c); in cciss_bigpassthru()
1704 ctlr_info_t *h = get_host(disk); in cciss_ioctl() local
1707 dev_dbg(&h->pdev->dev, "cciss_ioctl: Called with cmd=%x %lx\n", in cciss_ioctl()
1711 return cciss_getpciinfo(h, argp); in cciss_ioctl()
1713 return cciss_getintinfo(h, argp); in cciss_ioctl()
1715 return cciss_setintinfo(h, argp); in cciss_ioctl()
1717 return cciss_getnodename(h, argp); in cciss_ioctl()
1719 return cciss_setnodename(h, argp); in cciss_ioctl()
1721 return cciss_getheartbeat(h, argp); in cciss_ioctl()
1723 return cciss_getbustypes(h, argp); in cciss_ioctl()
1725 return cciss_getfirmver(h, argp); in cciss_ioctl()
1727 return cciss_getdrivver(h, argp); in cciss_ioctl()
1731 return rebuild_lun_table(h, 0, 1); in cciss_ioctl()
1733 return cciss_getluninfo(h, disk, argp); in cciss_ioctl()
1735 return cciss_passthru(h, argp); in cciss_ioctl()
1737 return cciss_bigpassthru(h, argp); in cciss_ioctl()
1767 static void cciss_check_queues(ctlr_info_t *h) in cciss_check_queues() argument
1769 int start_queue = h->next_to_run; in cciss_check_queues()
1777 if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) in cciss_check_queues()
1784 for (i = 0; i < h->highest_lun + 1; i++) { in cciss_check_queues()
1785 int curr_queue = (start_queue + i) % (h->highest_lun + 1); in cciss_check_queues()
1789 if (!h->drv[curr_queue]) in cciss_check_queues()
1791 if (!(h->drv[curr_queue]->queue) || in cciss_check_queues()
1792 !(h->drv[curr_queue]->heads)) in cciss_check_queues()
1794 blk_start_queue(h->gendisk[curr_queue]->queue); in cciss_check_queues()
1799 if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) { in cciss_check_queues()
1801 h->next_to_run = in cciss_check_queues()
1802 (start_queue + 1) % (h->highest_lun + 1); in cciss_check_queues()
1805 h->next_to_run = curr_queue; in cciss_check_queues()
1815 ctlr_info_t *h = hba[c->ctlr]; in cciss_softirq_done() local
1831 cciss_unmap_sg_chain_block(h, c); in cciss_softirq_done()
1833 curr_sg = h->cmd_sg_list[c->cmdindex]; in cciss_softirq_done()
1838 pci_unmap_page(h->pdev, temp64.val, curr_sg[sg_index].Len, in cciss_softirq_done()
1843 dev_dbg(&h->pdev->dev, "Done with %p\n", rq); in cciss_softirq_done()
1851 spin_lock_irqsave(&h->lock, flags); in cciss_softirq_done()
1852 cmd_free(h, c); in cciss_softirq_done()
1853 cciss_check_queues(h); in cciss_softirq_done()
1854 spin_unlock_irqrestore(&h->lock, flags); in cciss_softirq_done()
1857 static inline void log_unit_to_scsi3addr(ctlr_info_t *h, in log_unit_to_scsi3addr() argument
1860 memcpy(scsi3addr, h->drv[log_unit]->LunID, in log_unit_to_scsi3addr()
1861 sizeof(h->drv[log_unit]->LunID)); in log_unit_to_scsi3addr()
1868 static void cciss_get_device_descr(ctlr_info_t *h, int logvol, in cciss_get_device_descr() argument
1883 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_get_device_descr()
1884 rc = sendcmd_withirq(h, CISS_INQUIRY, inq_buf, sizeof(*inq_buf), 0, in cciss_get_device_descr()
1904 static void cciss_get_serial_no(ctlr_info_t *h, int logvol, in cciss_get_serial_no() argument
1919 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_get_serial_no()
1920 rc = sendcmd_withirq(h, CISS_INQUIRY, buf, in cciss_get_serial_no()
1931 static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, in cciss_add_disk() argument
1934 disk->queue = blk_init_queue(do_cciss_request, &h->lock); in cciss_add_disk()
1937 sprintf(disk->disk_name, "cciss/c%dd%d", h->ctlr, drv_index); in cciss_add_disk()
1938 disk->major = h->major; in cciss_add_disk()
1941 if (cciss_create_ld_sysfs_entry(h, drv_index)) in cciss_add_disk()
1943 disk->private_data = h->drv[drv_index]; in cciss_add_disk()
1944 disk->driverfs_dev = &h->drv[drv_index]->dev; in cciss_add_disk()
1947 blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask); in cciss_add_disk()
1950 blk_queue_max_segments(disk->queue, h->maxsgentries); in cciss_add_disk()
1952 blk_queue_max_hw_sectors(disk->queue, h->cciss_max_sectors); in cciss_add_disk()
1956 disk->queue->queuedata = h; in cciss_add_disk()
1959 h->drv[drv_index]->block_size); in cciss_add_disk()
1965 h->drv[drv_index]->queue = disk->queue; in cciss_add_disk()
1986 static void cciss_update_drive_info(ctlr_info_t *h, int drv_index, in cciss_update_drive_info() argument
2004 if (h->cciss_read == CCISS_READ_16) { in cciss_update_drive_info()
2005 cciss_read_capacity_16(h, drv_index, in cciss_update_drive_info()
2009 cciss_read_capacity(h, drv_index, &total_size, &block_size); in cciss_update_drive_info()
2014 cciss_read_capacity_16(h, drv_index, in cciss_update_drive_info()
2016 h->cciss_read = CCISS_READ_16; in cciss_update_drive_info()
2017 h->cciss_write = CCISS_WRITE_16; in cciss_update_drive_info()
2019 h->cciss_read = CCISS_READ_10; in cciss_update_drive_info()
2020 h->cciss_write = CCISS_WRITE_10; in cciss_update_drive_info()
2024 cciss_geometry_inquiry(h, drv_index, total_size, block_size, in cciss_update_drive_info()
2029 cciss_get_device_descr(h, drv_index, drvinfo->vendor, in cciss_update_drive_info()
2031 cciss_get_serial_no(h, drv_index, drvinfo->serial_no, in cciss_update_drive_info()
2034 memcpy(drvinfo->LunID, h->drv[drv_index]->LunID, in cciss_update_drive_info()
2038 if (h->drv[drv_index]->raid_level != -1 && in cciss_update_drive_info()
2040 h->drv[drv_index]->serial_no, 16) == 0) && in cciss_update_drive_info()
2041 drvinfo->block_size == h->drv[drv_index]->block_size && in cciss_update_drive_info()
2042 drvinfo->nr_blocks == h->drv[drv_index]->nr_blocks && in cciss_update_drive_info()
2043 drvinfo->heads == h->drv[drv_index]->heads && in cciss_update_drive_info()
2044 drvinfo->sectors == h->drv[drv_index]->sectors && in cciss_update_drive_info()
2045 drvinfo->cylinders == h->drv[drv_index]->cylinders)) in cciss_update_drive_info()
2055 if (h->drv[drv_index]->raid_level != -1 && drv_index != 0) { in cciss_update_drive_info()
2056 dev_warn(&h->pdev->dev, "disk %d has changed.\n", drv_index); in cciss_update_drive_info()
2057 spin_lock_irqsave(&h->lock, flags); in cciss_update_drive_info()
2058 h->drv[drv_index]->busy_configuring = 1; in cciss_update_drive_info()
2059 spin_unlock_irqrestore(&h->lock, flags); in cciss_update_drive_info()
2065 ret = deregister_disk(h, drv_index, 0, via_ioctl); in cciss_update_drive_info()
2076 if (h->drv[drv_index] == NULL) { in cciss_update_drive_info()
2078 h->drv[drv_index] = drvinfo; in cciss_update_drive_info()
2082 h->drv[drv_index]->block_size = drvinfo->block_size; in cciss_update_drive_info()
2083 h->drv[drv_index]->nr_blocks = drvinfo->nr_blocks; in cciss_update_drive_info()
2084 h->drv[drv_index]->heads = drvinfo->heads; in cciss_update_drive_info()
2085 h->drv[drv_index]->sectors = drvinfo->sectors; in cciss_update_drive_info()
2086 h->drv[drv_index]->cylinders = drvinfo->cylinders; in cciss_update_drive_info()
2087 h->drv[drv_index]->raid_level = drvinfo->raid_level; in cciss_update_drive_info()
2088 memcpy(h->drv[drv_index]->serial_no, drvinfo->serial_no, 16); in cciss_update_drive_info()
2089 memcpy(h->drv[drv_index]->vendor, drvinfo->vendor, in cciss_update_drive_info()
2091 memcpy(h->drv[drv_index]->model, drvinfo->model, MODEL_LEN + 1); in cciss_update_drive_info()
2092 memcpy(h->drv[drv_index]->rev, drvinfo->rev, REV_LEN + 1); in cciss_update_drive_info()
2095 ++h->num_luns; in cciss_update_drive_info()
2096 disk = h->gendisk[drv_index]; in cciss_update_drive_info()
2097 set_capacity(disk, h->drv[drv_index]->nr_blocks); in cciss_update_drive_info()
2106 if (cciss_add_disk(h, disk, drv_index) != 0) { in cciss_update_drive_info()
2107 cciss_free_gendisk(h, drv_index); in cciss_update_drive_info()
2108 cciss_free_drive_info(h, drv_index); in cciss_update_drive_info()
2109 dev_warn(&h->pdev->dev, "could not update disk %d\n", in cciss_update_drive_info()
2111 --h->num_luns; in cciss_update_drive_info()
2120 dev_err(&h->pdev->dev, "out of memory\n"); in cciss_update_drive_info()
2134 static int cciss_alloc_drive_info(ctlr_info_t *h, int controller_node) in cciss_alloc_drive_info() argument
2143 if (h->drv[i] && i != 0) in cciss_alloc_drive_info()
2149 if (i == 0 && h->drv[i] && h->drv[i]->raid_level != -1) in cciss_alloc_drive_info()
2156 if (i > h->highest_lun && !controller_node) in cciss_alloc_drive_info()
2157 h->highest_lun = i; in cciss_alloc_drive_info()
2160 if (i == 0 && h->drv[i] != NULL) in cciss_alloc_drive_info()
2171 h->drv[i] = drv; in cciss_alloc_drive_info()
2177 static void cciss_free_drive_info(ctlr_info_t *h, int drv_index) in cciss_free_drive_info() argument
2179 kfree(h->drv[drv_index]); in cciss_free_drive_info()
2180 h->drv[drv_index] = NULL; in cciss_free_drive_info()
2183 static void cciss_free_gendisk(ctlr_info_t *h, int drv_index) in cciss_free_gendisk() argument
2185 put_disk(h->gendisk[drv_index]); in cciss_free_gendisk()
2186 h->gendisk[drv_index] = NULL; in cciss_free_gendisk()
2198 static int cciss_add_gendisk(ctlr_info_t *h, unsigned char lunid[], in cciss_add_gendisk() argument
2203 drv_index = cciss_alloc_drive_info(h, controller_node); in cciss_add_gendisk()
2208 if (!h->gendisk[drv_index]) { in cciss_add_gendisk()
2209 h->gendisk[drv_index] = in cciss_add_gendisk()
2211 if (!h->gendisk[drv_index]) { in cciss_add_gendisk()
2212 dev_err(&h->pdev->dev, in cciss_add_gendisk()
2218 memcpy(h->drv[drv_index]->LunID, lunid, in cciss_add_gendisk()
2219 sizeof(h->drv[drv_index]->LunID)); in cciss_add_gendisk()
2220 if (cciss_create_ld_sysfs_entry(h, drv_index)) in cciss_add_gendisk()
2225 h->drv[drv_index]->busy_configuring = 0; in cciss_add_gendisk()
2230 cciss_free_gendisk(h, drv_index); in cciss_add_gendisk()
2232 cciss_free_drive_info(h, drv_index); in cciss_add_gendisk()
2241 static void cciss_add_controller_node(ctlr_info_t *h) in cciss_add_controller_node() argument
2246 if (h->gendisk[0] != NULL) /* already did this? Then bail. */ in cciss_add_controller_node()
2249 drv_index = cciss_add_gendisk(h, CTLR_LUNID, 1); in cciss_add_controller_node()
2252 h->drv[drv_index]->block_size = 512; in cciss_add_controller_node()
2253 h->drv[drv_index]->nr_blocks = 0; in cciss_add_controller_node()
2254 h->drv[drv_index]->heads = 0; in cciss_add_controller_node()
2255 h->drv[drv_index]->sectors = 0; in cciss_add_controller_node()
2256 h->drv[drv_index]->cylinders = 0; in cciss_add_controller_node()
2257 h->drv[drv_index]->raid_level = -1; in cciss_add_controller_node()
2258 memset(h->drv[drv_index]->serial_no, 0, 16); in cciss_add_controller_node()
2259 disk = h->gendisk[drv_index]; in cciss_add_controller_node()
2260 if (cciss_add_disk(h, disk, drv_index) == 0) in cciss_add_controller_node()
2262 cciss_free_gendisk(h, drv_index); in cciss_add_controller_node()
2263 cciss_free_drive_info(h, drv_index); in cciss_add_controller_node()
2265 dev_warn(&h->pdev->dev, "could not add disk 0.\n"); in cciss_add_controller_node()
2277 static int rebuild_lun_table(ctlr_info_t *h, int first_time, in rebuild_lun_table() argument
2294 spin_lock_irqsave(&h->lock, flags); in rebuild_lun_table()
2295 if (h->busy_configuring) { in rebuild_lun_table()
2296 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2299 h->busy_configuring = 1; in rebuild_lun_table()
2300 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2306 return_code = sendcmd_withirq(h, CISS_REPORT_LOG, ld_buff, in rebuild_lun_table()
2313 dev_warn(&h->pdev->dev, in rebuild_lun_table()
2322 dev_warn(&h->pdev->dev, "more luns configured" in rebuild_lun_table()
2328 cciss_add_controller_node(h); in rebuild_lun_table()
2335 for (i = 0; i <= h->highest_lun; i++) { in rebuild_lun_table()
2340 if (h->drv[i] == NULL) in rebuild_lun_table()
2345 if (memcmp(h->drv[i]->LunID, lunid, in rebuild_lun_table()
2353 spin_lock_irqsave(&h->lock, flags); in rebuild_lun_table()
2354 h->drv[i]->busy_configuring = 1; in rebuild_lun_table()
2355 spin_unlock_irqrestore(&h->lock, flags); in rebuild_lun_table()
2356 return_code = deregister_disk(h, i, 1, via_ioctl); in rebuild_lun_table()
2357 if (h->drv[i] != NULL) in rebuild_lun_table()
2358 h->drv[i]->busy_configuring = 0; in rebuild_lun_table()
2378 for (j = 0; j <= h->highest_lun; j++) { in rebuild_lun_table()
2379 if (h->drv[j] != NULL && in rebuild_lun_table()
2380 memcmp(h->drv[j]->LunID, lunid, in rebuild_lun_table()
2381 sizeof(h->drv[j]->LunID)) == 0) { in rebuild_lun_table()
2390 drv_index = cciss_add_gendisk(h, lunid, 0); in rebuild_lun_table()
2394 cciss_update_drive_info(h, drv_index, first_time, via_ioctl); in rebuild_lun_table()
2399 h->busy_configuring = 0; in rebuild_lun_table()
2406 dev_err(&h->pdev->dev, "out of memory\n"); in rebuild_lun_table()
2407 h->busy_configuring = 0; in rebuild_lun_table()
2451 static int deregister_disk(ctlr_info_t *h, int drv_index, in deregister_disk() argument
2462 drv = h->drv[drv_index]; in deregister_disk()
2463 disk = h->gendisk[drv_index]; in deregister_disk()
2466 if (clear_all || (h->gendisk[0] == disk)) { in deregister_disk()
2472 recalculate_highest_lun = (drv == h->drv[h->highest_lun]); in deregister_disk()
2478 if (h->gendisk[0] != disk) { in deregister_disk()
2481 cciss_destroy_ld_sysfs_entry(h, drv_index, 0); in deregister_disk()
2499 if (h->gendisk[i] == disk) { in deregister_disk()
2500 h->gendisk[i] = NULL; in deregister_disk()
2511 --h->num_luns; in deregister_disk()
2516 for (i = 0; i <= h->highest_lun; i++) { in deregister_disk()
2518 if (h->drv[i] && h->drv[i]->heads) in deregister_disk()
2521 h->highest_lun = newhighest; in deregister_disk()
2526 static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff, in fill_cmd() argument
2615 dev_warn(&h->pdev->dev, "Unknown Command 0x%c\n", cmd); in fill_cmd()
2647 dev_warn(&h->pdev->dev, in fill_cmd()
2652 dev_warn(&h->pdev->dev, "unknown command type %d\n", cmd_type); in fill_cmd()
2657 buff_dma_handle.val = (__u64) pci_map_single(h->pdev, in fill_cmd()
2668 static int cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr, in cciss_send_reset() argument
2674 c = cmd_alloc(h); in cciss_send_reset()
2677 return_status = fill_cmd(h, c, CCISS_RESET_MSG, NULL, 0, 0, in cciss_send_reset()
2681 cmd_special_free(h, c); in cciss_send_reset()
2685 enqueue_cmd_and_start_io(h, c); in cciss_send_reset()
2693 static int check_target_status(ctlr_info_t *h, CommandList_struct *c) in check_target_status() argument
2703 if (check_for_unit_attention(h, c)) in check_target_status()
2705 dev_warn(&h->pdev->dev, "cmd 0x%02x " in check_target_status()
2711 dev_warn(&h->pdev->dev, "cmd 0x%02x" in check_target_status()
2719 static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c) in process_sendcmd_error() argument
2728 return_status = check_target_status(h, c); in process_sendcmd_error()
2735 dev_warn(&h->pdev->dev, "cmd 0x%02x is " in process_sendcmd_error()
2740 dev_warn(&h->pdev->dev, "cmd 0x%02x has " in process_sendcmd_error()
2745 dev_warn(&h->pdev->dev, "cmd 0x%02x had " in process_sendcmd_error()
2750 dev_warn(&h->pdev->dev, "cmd 0x%02x had " in process_sendcmd_error()
2755 dev_warn(&h->pdev->dev, "cmd 0x%02x was " in process_sendcmd_error()
2760 dev_warn(&h->pdev->dev, "cmd 0x%02x reports " in process_sendcmd_error()
2765 dev_warn(&h->pdev->dev, "unsolicited abort 0x%02x\n", in process_sendcmd_error()
2770 dev_warn(&h->pdev->dev, "cmd unabortable\n"); in process_sendcmd_error()
2774 dev_warn(&h->pdev->dev, "cmd 0x%02x returned " in process_sendcmd_error()
2782 static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c, in sendcmd_withirq_core() argument
2791 enqueue_cmd_and_start_io(h, c); in sendcmd_withirq_core()
2798 return_status = process_sendcmd_error(h, c); in sendcmd_withirq_core()
2802 dev_warn(&h->pdev->dev, "retrying 0x%02x\n", in sendcmd_withirq_core()
2816 pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, in sendcmd_withirq_core()
2821 static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size, in sendcmd_withirq() argument
2828 c = cmd_special_alloc(h); in sendcmd_withirq()
2831 return_status = fill_cmd(h, c, cmd, buff, size, page_code, in sendcmd_withirq()
2834 return_status = sendcmd_withirq_core(h, c, 1); in sendcmd_withirq()
2836 cmd_special_free(h, c); in sendcmd_withirq()
2840 static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol, in cciss_geometry_inquiry() argument
2851 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_geometry_inquiry()
2852 return_code = sendcmd_withirq(h, CISS_INQUIRY, inq_buff, in cciss_geometry_inquiry()
2856 dev_warn(&h->pdev->dev, in cciss_geometry_inquiry()
2881 dev_warn(&h->pdev->dev, "reading geometry failed\n"); in cciss_geometry_inquiry()
2886 cciss_read_capacity(ctlr_info_t *h, int logvol, sector_t *total_size, in cciss_read_capacity() argument
2895 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_read_capacity()
2899 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_read_capacity()
2900 return_code = sendcmd_withirq(h, CCISS_READ_CAPACITY, buf, in cciss_read_capacity()
2906 dev_warn(&h->pdev->dev, "read capacity failed\n"); in cciss_read_capacity()
2913 static void cciss_read_capacity_16(ctlr_info_t *h, int logvol, in cciss_read_capacity_16() argument
2922 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_read_capacity_16()
2926 log_unit_to_scsi3addr(h, scsi3addr, logvol); in cciss_read_capacity_16()
2927 return_code = sendcmd_withirq(h, CCISS_READ_CAPACITY_16, in cciss_read_capacity_16()
2934 dev_warn(&h->pdev->dev, "read capacity failed\n"); in cciss_read_capacity_16()
2938 dev_info(&h->pdev->dev, " blocks= %llu block_size= %d\n", in cciss_read_capacity_16()
2945 ctlr_info_t *h = get_host(disk); in cciss_revalidate() local
2953 for (logvol = 0; logvol <= h->highest_lun; logvol++) { in cciss_revalidate()
2954 if (!h->drv[logvol]) in cciss_revalidate()
2956 if (memcmp(h->drv[logvol]->LunID, drv->LunID, in cciss_revalidate()
2968 dev_warn(&h->pdev->dev, "out of memory\n"); in cciss_revalidate()
2971 if (h->cciss_read == CCISS_READ_10) { in cciss_revalidate()
2972 cciss_read_capacity(h, logvol, in cciss_revalidate()
2975 cciss_read_capacity_16(h, logvol, in cciss_revalidate()
2978 cciss_geometry_inquiry(h, logvol, total_size, block_size, in cciss_revalidate()
3004 static void start_io(ctlr_info_t *h) in start_io() argument
3008 while (!list_empty(&h->reqQ)) { in start_io()
3009 c = list_entry(h->reqQ.next, CommandList_struct, list); in start_io()
3011 if ((h->access.fifo_full(h))) { in start_io()
3012 dev_warn(&h->pdev->dev, "fifo full\n"); in start_io()
3018 h->Qdepth--; in start_io()
3021 h->access.submit_command(h, c); in start_io()
3024 addQ(&h->cmpQ, c); in start_io()
3031 static inline void resend_cciss_cmd(ctlr_info_t *h, CommandList_struct *c) in resend_cciss_cmd() argument
3037 addQ(&h->reqQ, c); in resend_cciss_cmd()
3038 h->Qdepth++; in resend_cciss_cmd()
3039 if (h->Qdepth > h->maxQsinceinit) in resend_cciss_cmd()
3040 h->maxQsinceinit = h->Qdepth; in resend_cciss_cmd()
3042 start_io(h); in resend_cciss_cmd()
3056 static inline int evaluate_target_status(ctlr_info_t *h, in evaluate_target_status() argument
3079 dev_warn(&h->pdev->dev, "cmd %p " in evaluate_target_status()
3092 if (check_for_unit_attention(h, cmd)) { in evaluate_target_status()
3100 dev_warn(&h->pdev->dev, "cmd %p has CHECK CONDITION" in evaluate_target_status()
3121 static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd, in complete_command() argument
3137 rq->errors = evaluate_target_status(h, cmd, &retry_cmd); in complete_command()
3141 dev_warn(&h->pdev->dev, "cmd %p has" in complete_command()
3149 dev_warn(&h->pdev->dev, "cciss: cmd %p has" in complete_command()
3154 dev_warn(&h->pdev->dev, "cciss: cmd %p is " in complete_command()
3162 dev_warn(&h->pdev->dev, "cciss: cmd %p has " in complete_command()
3170 dev_warn(&h->pdev->dev, "cciss: cmd %p had " in complete_command()
3178 dev_warn(&h->pdev->dev, "cciss: cmd %p had " in complete_command()
3186 dev_warn(&h->pdev->dev, "cciss: cmd %p was " in complete_command()
3194 dev_warn(&h->pdev->dev, "cciss: cmd %p reports " in complete_command()
3202 dev_warn(&h->pdev->dev, "cciss%d: unsolicited " in complete_command()
3203 "abort %p\n", h->ctlr, cmd); in complete_command()
3206 dev_warn(&h->pdev->dev, "retrying %p\n", cmd); in complete_command()
3209 dev_warn(&h->pdev->dev, in complete_command()
3217 dev_warn(&h->pdev->dev, "cmd %p timedout\n", cmd); in complete_command()
3224 dev_warn(&h->pdev->dev, "cmd %p unabortable\n", cmd); in complete_command()
3231 dev_warn(&h->pdev->dev, "cmd %p returned " in complete_command()
3244 resend_cciss_cmd(h, cmd); in complete_command()
3263 static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag) in cciss_tag_discard_error_bits() argument
3267 if (likely(h->transMethod & CFGTBL_Trans_Performant)) in cciss_tag_discard_error_bits()
3287 ctlr_info_t *h = q->queuedata; in do_cciss_request() local
3305 BUG_ON(creq->nr_phys_segments > h->maxsgentries); in do_cciss_request()
3307 c = cmd_alloc(h); in do_cciss_request()
3313 tmp_sg = h->scatter_list[c->cmdindex]; in do_cciss_request()
3335 (rq_data_dir(creq) == READ) ? h->cciss_read : h->cciss_write; in do_cciss_request()
3337 dev_dbg(&h->pdev->dev, "sector =%d nr_sectors=%d\n", in do_cciss_request()
3339 sg_init_table(tmp_sg, h->maxsgentries); in do_cciss_request()
3353 if (((sg_index+1) == (h->max_cmd_sgentries)) && in do_cciss_request()
3356 curr_sg = h->cmd_sg_list[c->cmdindex]; in do_cciss_request()
3361 temp64.val = (__u64) pci_map_page(h->pdev, sg_page(&tmp_sg[i]), in do_cciss_request()
3370 cciss_map_sg_chain_block(h, c, h->cmd_sg_list[c->cmdindex], in do_cciss_request()
3371 (seg - (h->max_cmd_sgentries - 1)) * in do_cciss_request()
3375 if (seg > h->maxSG) in do_cciss_request()
3376 h->maxSG = seg; in do_cciss_request()
3378 dev_dbg(&h->pdev->dev, "Submitting %u sectors in %d segments " in do_cciss_request()
3383 if (seg <= h->max_cmd_sgentries) in do_cciss_request()
3386 c->Header.SGList = h->max_cmd_sgentries; in do_cciss_request()
3387 set_performant_mode(h, c); in do_cciss_request()
3390 if(h->cciss_read == CCISS_READ_10) { in do_cciss_request()
3423 dev_warn(&h->pdev->dev, "bad request type %d\n", in do_cciss_request()
3430 addQ(&h->reqQ, c); in do_cciss_request()
3431 h->Qdepth++; in do_cciss_request()
3432 if (h->Qdepth > h->maxQsinceinit) in do_cciss_request()
3433 h->maxQsinceinit = h->Qdepth; in do_cciss_request()
3442 start_io(h); in do_cciss_request()
3445 static inline unsigned long get_next_completion(ctlr_info_t *h) in get_next_completion() argument
3447 return h->access.command_completed(h); in get_next_completion()
3450 static inline int interrupt_pending(ctlr_info_t *h) in interrupt_pending() argument
3452 return h->access.intr_pending(h); in interrupt_pending()
3455 static inline long interrupt_not_for_us(ctlr_info_t *h) in interrupt_not_for_us() argument
3457 return ((h->access.intr_pending(h) == 0) || in interrupt_not_for_us()
3458 (h->interrupts_enabled == 0)); in interrupt_not_for_us()
3461 static inline int bad_tag(ctlr_info_t *h, u32 tag_index, in bad_tag() argument
3464 if (unlikely(tag_index >= h->nr_cmds)) { in bad_tag()
3465 dev_warn(&h->pdev->dev, "bad tag 0x%08x ignored.\n", raw_tag); in bad_tag()
3471 static inline void finish_cmd(ctlr_info_t *h, CommandList_struct *c, in finish_cmd() argument
3476 complete_command(h, c, 0); in finish_cmd()
3485 static inline u32 next_command(ctlr_info_t *h) in next_command() argument
3489 if (unlikely(!(h->transMethod & CFGTBL_Trans_Performant))) in next_command()
3490 return h->access.command_completed(h); in next_command()
3492 if ((*(h->reply_pool_head) & 1) == (h->reply_pool_wraparound)) { in next_command()
3493 a = *(h->reply_pool_head); /* Next cmd in ring buffer */ in next_command()
3494 (h->reply_pool_head)++; in next_command()
3495 h->commands_outstanding--; in next_command()
3500 if (h->reply_pool_head == (h->reply_pool + h->max_commands)) { in next_command()
3501 h->reply_pool_head = h->reply_pool; in next_command()
3502 h->reply_pool_wraparound ^= 1; in next_command()
3508 static inline u32 process_indexed_cmd(ctlr_info_t *h, u32 raw_tag) in process_indexed_cmd() argument
3514 if (bad_tag(h, tag_index, raw_tag)) in process_indexed_cmd()
3515 return next_command(h); in process_indexed_cmd()
3516 c = h->cmd_pool + tag_index; in process_indexed_cmd()
3517 finish_cmd(h, c, raw_tag); in process_indexed_cmd()
3518 return next_command(h); in process_indexed_cmd()
3522 static inline u32 process_nonindexed_cmd(ctlr_info_t *h, u32 raw_tag) in process_nonindexed_cmd() argument
3527 tag_masked = cciss_tag_discard_error_bits(h, raw_tag); in process_nonindexed_cmd()
3528 list_for_each_entry(c, &h->cmpQ, list) { in process_nonindexed_cmd()
3529 busaddr_masked = cciss_tag_discard_error_bits(h, c->busaddr); in process_nonindexed_cmd()
3531 finish_cmd(h, c, raw_tag); in process_nonindexed_cmd()
3532 return next_command(h); in process_nonindexed_cmd()
3535 bad_tag(h, h->nr_cmds + 1, raw_tag); in process_nonindexed_cmd()
3536 return next_command(h); in process_nonindexed_cmd()
3544 static int ignore_bogus_interrupt(ctlr_info_t *h) in ignore_bogus_interrupt() argument
3549 if (likely(h->interrupts_enabled)) in ignore_bogus_interrupt()
3552 dev_info(&h->pdev->dev, "Received interrupt while interrupts disabled " in ignore_bogus_interrupt()
3560 ctlr_info_t *h = dev_id; in cciss_intx_discard_completions() local
3564 if (ignore_bogus_interrupt(h)) in cciss_intx_discard_completions()
3567 if (interrupt_not_for_us(h)) in cciss_intx_discard_completions()
3569 spin_lock_irqsave(&h->lock, flags); in cciss_intx_discard_completions()
3570 while (interrupt_pending(h)) { in cciss_intx_discard_completions()
3571 raw_tag = get_next_completion(h); in cciss_intx_discard_completions()
3573 raw_tag = next_command(h); in cciss_intx_discard_completions()
3575 spin_unlock_irqrestore(&h->lock, flags); in cciss_intx_discard_completions()
3581 ctlr_info_t *h = dev_id; in cciss_msix_discard_completions() local
3585 if (ignore_bogus_interrupt(h)) in cciss_msix_discard_completions()
3588 spin_lock_irqsave(&h->lock, flags); in cciss_msix_discard_completions()
3589 raw_tag = get_next_completion(h); in cciss_msix_discard_completions()
3591 raw_tag = next_command(h); in cciss_msix_discard_completions()
3592 spin_unlock_irqrestore(&h->lock, flags); in cciss_msix_discard_completions()
3598 ctlr_info_t *h = dev_id; in do_cciss_intx() local
3602 if (interrupt_not_for_us(h)) in do_cciss_intx()
3604 spin_lock_irqsave(&h->lock, flags); in do_cciss_intx()
3605 while (interrupt_pending(h)) { in do_cciss_intx()
3606 raw_tag = get_next_completion(h); in do_cciss_intx()
3609 raw_tag = process_indexed_cmd(h, raw_tag); in do_cciss_intx()
3611 raw_tag = process_nonindexed_cmd(h, raw_tag); in do_cciss_intx()
3614 spin_unlock_irqrestore(&h->lock, flags); in do_cciss_intx()
3623 ctlr_info_t *h = dev_id; in do_cciss_msix_intr() local
3627 spin_lock_irqsave(&h->lock, flags); in do_cciss_msix_intr()
3628 raw_tag = get_next_completion(h); in do_cciss_msix_intr()
3631 raw_tag = process_indexed_cmd(h, raw_tag); in do_cciss_msix_intr()
3633 raw_tag = process_nonindexed_cmd(h, raw_tag); in do_cciss_msix_intr()
3635 spin_unlock_irqrestore(&h->lock, flags); in do_cciss_msix_intr()
3649 static int add_to_scan_list(struct ctlr_info *h) in add_to_scan_list() argument
3655 if (h->busy_initializing) in add_to_scan_list()
3658 if (!mutex_trylock(&h->busy_shutting_down)) in add_to_scan_list()
3663 if (test_h == h) { in add_to_scan_list()
3668 if (!found && !h->busy_scanning) { in add_to_scan_list()
3669 reinit_completion(&h->scan_wait); in add_to_scan_list()
3670 list_add_tail(&h->scan_list, &scan_q); in add_to_scan_list()
3674 mutex_unlock(&h->busy_shutting_down); in add_to_scan_list()
3692 static void remove_from_scan_list(struct ctlr_info *h) in remove_from_scan_list() argument
3698 if (test_h == h) { /* state 2. */ in remove_from_scan_list()
3699 list_del(&h->scan_list); in remove_from_scan_list()
3700 complete_all(&h->scan_wait); in remove_from_scan_list()
3705 if (h->busy_scanning) { /* state 3. */ in remove_from_scan_list()
3707 wait_for_completion(&h->scan_wait); in remove_from_scan_list()
3727 struct ctlr_info *h; in scan_thread() local
3742 h = list_entry(scan_q.next, in scan_thread()
3745 list_del(&h->scan_list); in scan_thread()
3746 h->busy_scanning = 1; in scan_thread()
3749 rebuild_lun_table(h, 0, 0); in scan_thread()
3750 complete_all(&h->scan_wait); in scan_thread()
3752 h->busy_scanning = 0; in scan_thread()
3760 static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c) in check_for_unit_attention() argument
3767 dev_warn(&h->pdev->dev, "a state change " in check_for_unit_attention()
3772 dev_warn(&h->pdev->dev, "LUN failure " in check_for_unit_attention()
3777 dev_warn(&h->pdev->dev, "report LUN data changed\n"); in check_for_unit_attention()
3797 dev_warn(&h->pdev->dev, in check_for_unit_attention()
3802 dev_warn(&h->pdev->dev, in check_for_unit_attention()
3807 dev_warn(&h->pdev->dev, "unknown unit attention detected\n"); in check_for_unit_attention()
3817 static void print_cfg_table(ctlr_info_t *h) in print_cfg_table() argument
3821 CfgTable_struct *tb = h->cfgtable; in print_cfg_table()
3823 dev_dbg(&h->pdev->dev, "Controller Configuration information\n"); in print_cfg_table()
3824 dev_dbg(&h->pdev->dev, "------------------------------------\n"); in print_cfg_table()
3828 dev_dbg(&h->pdev->dev, " Signature = %s\n", temp_name); in print_cfg_table()
3829 dev_dbg(&h->pdev->dev, " Spec Number = %d\n", in print_cfg_table()
3831 dev_dbg(&h->pdev->dev, " Transport methods supported = 0x%x\n", in print_cfg_table()
3833 dev_dbg(&h->pdev->dev, " Transport methods active = 0x%x\n", in print_cfg_table()
3835 dev_dbg(&h->pdev->dev, " Requested transport Method = 0x%x\n", in print_cfg_table()
3837 dev_dbg(&h->pdev->dev, " Coalesce Interrupt Delay = 0x%x\n", in print_cfg_table()
3839 dev_dbg(&h->pdev->dev, " Coalesce Interrupt Count = 0x%x\n", in print_cfg_table()
3841 dev_dbg(&h->pdev->dev, " Max outstanding commands = 0x%d\n", in print_cfg_table()
3843 dev_dbg(&h->pdev->dev, " Bus Types = 0x%x\n", in print_cfg_table()
3848 dev_dbg(&h->pdev->dev, " Server Name = %s\n", temp_name); in print_cfg_table()
3849 dev_dbg(&h->pdev->dev, " Heartbeat Counter = 0x%x\n\n\n", in print_cfg_table()
3924 static void cciss_wait_for_mode_change_ack(ctlr_info_t *h) in cciss_wait_for_mode_change_ack() argument
3932 if (!(readl(h->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) in cciss_wait_for_mode_change_ack()
3938 static void cciss_enter_performant_mode(ctlr_info_t *h, u32 use_short_tags) in cciss_enter_performant_mode() argument
3968 h->reply_pool_wraparound = 1; /* spec: init to 1 */ in cciss_enter_performant_mode()
3971 memset(h->reply_pool, 0, h->max_commands * sizeof(__u64)); in cciss_enter_performant_mode()
3972 h->reply_pool_head = h->reply_pool; in cciss_enter_performant_mode()
3974 trans_offset = readl(&(h->cfgtable->TransMethodOffset)); in cciss_enter_performant_mode()
3975 calc_bucket_map(bft, ARRAY_SIZE(bft), h->maxsgentries, in cciss_enter_performant_mode()
3976 h->blockFetchTable); in cciss_enter_performant_mode()
3977 writel(bft[0], &h->transtable->BlockFetch0); in cciss_enter_performant_mode()
3978 writel(bft[1], &h->transtable->BlockFetch1); in cciss_enter_performant_mode()
3979 writel(bft[2], &h->transtable->BlockFetch2); in cciss_enter_performant_mode()
3980 writel(bft[3], &h->transtable->BlockFetch3); in cciss_enter_performant_mode()
3981 writel(bft[4], &h->transtable->BlockFetch4); in cciss_enter_performant_mode()
3982 writel(bft[5], &h->transtable->BlockFetch5); in cciss_enter_performant_mode()
3983 writel(bft[6], &h->transtable->BlockFetch6); in cciss_enter_performant_mode()
3984 writel(bft[7], &h->transtable->BlockFetch7); in cciss_enter_performant_mode()
3987 writel(h->max_commands, &h->transtable->RepQSize); in cciss_enter_performant_mode()
3988 writel(1, &h->transtable->RepQCount); in cciss_enter_performant_mode()
3989 writel(0, &h->transtable->RepQCtrAddrLow32); in cciss_enter_performant_mode()
3990 writel(0, &h->transtable->RepQCtrAddrHigh32); in cciss_enter_performant_mode()
3991 writel(h->reply_pool_dhandle, &h->transtable->RepQAddr0Low32); in cciss_enter_performant_mode()
3992 writel(0, &h->transtable->RepQAddr0High32); in cciss_enter_performant_mode()
3994 &(h->cfgtable->HostWrite.TransportRequest)); in cciss_enter_performant_mode()
3996 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_enter_performant_mode()
3997 cciss_wait_for_mode_change_ack(h); in cciss_enter_performant_mode()
3998 register_value = readl(&(h->cfgtable->TransportActive)); in cciss_enter_performant_mode()
4000 dev_warn(&h->pdev->dev, "cciss: unable to get board into" in cciss_enter_performant_mode()
4004 static void cciss_put_controller_into_performant_mode(ctlr_info_t *h) in cciss_put_controller_into_performant_mode() argument
4011 dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n"); in cciss_put_controller_into_performant_mode()
4014 trans_support = readl(&(h->cfgtable->TransportSupport)); in cciss_put_controller_into_performant_mode()
4018 dev_dbg(&h->pdev->dev, "Placing controller into performant mode\n"); in cciss_put_controller_into_performant_mode()
4024 dev_warn(&h->pdev->dev, "%s %d %s\n", in cciss_put_controller_into_performant_mode()
4032 h->reply_pool = (__u64 *)pci_alloc_consistent( in cciss_put_controller_into_performant_mode()
4033 h->pdev, h->max_commands * sizeof(__u64), in cciss_put_controller_into_performant_mode()
4034 &(h->reply_pool_dhandle)); in cciss_put_controller_into_performant_mode()
4037 h->blockFetchTable = kmalloc(((h->maxsgentries+1) * in cciss_put_controller_into_performant_mode()
4040 if ((h->reply_pool == NULL) || (h->blockFetchTable == NULL)) in cciss_put_controller_into_performant_mode()
4043 cciss_enter_performant_mode(h, in cciss_put_controller_into_performant_mode()
4047 h->access = SA5_performant_access; in cciss_put_controller_into_performant_mode()
4048 h->transMethod = CFGTBL_Trans_Performant; in cciss_put_controller_into_performant_mode()
4052 kfree(h->blockFetchTable); in cciss_put_controller_into_performant_mode()
4053 if (h->reply_pool) in cciss_put_controller_into_performant_mode()
4054 pci_free_consistent(h->pdev, in cciss_put_controller_into_performant_mode()
4055 h->max_commands * sizeof(__u64), in cciss_put_controller_into_performant_mode()
4056 h->reply_pool, in cciss_put_controller_into_performant_mode()
4057 h->reply_pool_dhandle); in cciss_put_controller_into_performant_mode()
4066 static void cciss_interrupt_mode(ctlr_info_t *h) in cciss_interrupt_mode() argument
4075 if ((h->board_id == 0x40700E11) || (h->board_id == 0x40800E11) || in cciss_interrupt_mode()
4076 (h->board_id == 0x40820E11) || (h->board_id == 0x40830E11)) in cciss_interrupt_mode()
4079 if (pci_find_capability(h->pdev, PCI_CAP_ID_MSIX)) { in cciss_interrupt_mode()
4080 err = pci_enable_msix_exact(h->pdev, cciss_msix_entries, 4); in cciss_interrupt_mode()
4082 h->intr[0] = cciss_msix_entries[0].vector; in cciss_interrupt_mode()
4083 h->intr[1] = cciss_msix_entries[1].vector; in cciss_interrupt_mode()
4084 h->intr[2] = cciss_msix_entries[2].vector; in cciss_interrupt_mode()
4085 h->intr[3] = cciss_msix_entries[3].vector; in cciss_interrupt_mode()
4086 h->msix_vector = 1; in cciss_interrupt_mode()
4089 dev_warn(&h->pdev->dev, in cciss_interrupt_mode()
4093 if (pci_find_capability(h->pdev, PCI_CAP_ID_MSI)) { in cciss_interrupt_mode()
4094 if (!pci_enable_msi(h->pdev)) in cciss_interrupt_mode()
4095 h->msi_vector = 1; in cciss_interrupt_mode()
4097 dev_warn(&h->pdev->dev, "MSI init failed\n"); in cciss_interrupt_mode()
4102 h->intr[h->intr_mode] = h->pdev->irq; in cciss_interrupt_mode()
4128 static inline bool cciss_board_disabled(ctlr_info_t *h) in cciss_board_disabled() argument
4132 (void) pci_read_config_word(h->pdev, PCI_COMMAND, &command); in cciss_board_disabled()
4197 static int cciss_find_cfgtables(ctlr_info_t *h) in cciss_find_cfgtables() argument
4205 rc = cciss_find_cfg_addrs(h->pdev, h->vaddr, &cfg_base_addr, in cciss_find_cfgtables()
4209 h->cfgtable = remap_pci_mem(pci_resource_start(h->pdev, in cciss_find_cfgtables()
4210 cfg_base_addr_index) + cfg_offset, sizeof(*h->cfgtable)); in cciss_find_cfgtables()
4211 if (!h->cfgtable) in cciss_find_cfgtables()
4213 rc = write_driver_ver_to_cfgtable(h->cfgtable); in cciss_find_cfgtables()
4217 trans_offset = readl(&h->cfgtable->TransMethodOffset); in cciss_find_cfgtables()
4218 h->transtable = remap_pci_mem(pci_resource_start(h->pdev, in cciss_find_cfgtables()
4220 sizeof(*h->transtable)); in cciss_find_cfgtables()
4221 if (!h->transtable) in cciss_find_cfgtables()
4226 static void cciss_get_max_perf_mode_cmds(struct ctlr_info *h) in cciss_get_max_perf_mode_cmds() argument
4228 h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands)); in cciss_get_max_perf_mode_cmds()
4231 if (reset_devices && h->max_commands > 32) in cciss_get_max_perf_mode_cmds()
4232 h->max_commands = 32; in cciss_get_max_perf_mode_cmds()
4234 if (h->max_commands < 16) { in cciss_get_max_perf_mode_cmds()
4235 dev_warn(&h->pdev->dev, "Controller reports " in cciss_get_max_perf_mode_cmds()
4238 h->max_commands); in cciss_get_max_perf_mode_cmds()
4239 h->max_commands = 16; in cciss_get_max_perf_mode_cmds()
4247 static void cciss_find_board_params(ctlr_info_t *h) in cciss_find_board_params() argument
4249 cciss_get_max_perf_mode_cmds(h); in cciss_find_board_params()
4250 h->nr_cmds = h->max_commands - 4 - cciss_tape_cmds; in cciss_find_board_params()
4251 h->maxsgentries = readl(&(h->cfgtable->MaxSGElements)); in cciss_find_board_params()
4257 if (h->board_id == 0x3225103C) in cciss_find_board_params()
4258 h->maxsgentries = MAXSGENTRIES; in cciss_find_board_params()
4263 h->max_cmd_sgentries = 31; in cciss_find_board_params()
4264 if (h->maxsgentries > 512) { in cciss_find_board_params()
4265 h->max_cmd_sgentries = 32; in cciss_find_board_params()
4266 h->chainsize = h->maxsgentries - h->max_cmd_sgentries + 1; in cciss_find_board_params()
4267 h->maxsgentries--; /* save one for chain pointer */ in cciss_find_board_params()
4269 h->maxsgentries = 31; /* default to traditional values */ in cciss_find_board_params()
4270 h->chainsize = 0; in cciss_find_board_params()
4274 static inline bool CISS_signature_present(ctlr_info_t *h) in CISS_signature_present() argument
4276 if (!check_signature(h->cfgtable->Signature, "CISS", 4)) { in CISS_signature_present()
4277 dev_warn(&h->pdev->dev, "not a valid CISS config table\n"); in CISS_signature_present()
4284 static inline void cciss_enable_scsi_prefetch(ctlr_info_t *h) in cciss_enable_scsi_prefetch() argument
4289 prefetch = readl(&(h->cfgtable->SCSI_Prefetch)); in cciss_enable_scsi_prefetch()
4291 writel(prefetch, &(h->cfgtable->SCSI_Prefetch)); in cciss_enable_scsi_prefetch()
4298 static inline void cciss_p600_dma_prefetch_quirk(ctlr_info_t *h) in cciss_p600_dma_prefetch_quirk() argument
4303 if (h->board_id != 0x3225103C) in cciss_p600_dma_prefetch_quirk()
4305 dma_prefetch = readl(h->vaddr + I2O_DMA1_CFG); in cciss_p600_dma_prefetch_quirk()
4307 writel(dma_prefetch, h->vaddr + I2O_DMA1_CFG); in cciss_p600_dma_prefetch_quirk()
4308 pci_read_config_dword(h->pdev, PCI_COMMAND_PARITY, &dma_refetch); in cciss_p600_dma_prefetch_quirk()
4310 pci_write_config_dword(h->pdev, PCI_COMMAND_PARITY, dma_refetch); in cciss_p600_dma_prefetch_quirk()
4313 static int cciss_pci_init(ctlr_info_t *h) in cciss_pci_init() argument
4317 prod_index = cciss_lookup_board_id(h->pdev, &h->board_id); in cciss_pci_init()
4320 h->product_name = products[prod_index].product_name; in cciss_pci_init()
4321 h->access = *(products[prod_index].access); in cciss_pci_init()
4323 if (cciss_board_disabled(h)) { in cciss_pci_init()
4324 dev_warn(&h->pdev->dev, "controller appears to be disabled\n"); in cciss_pci_init()
4328 pci_disable_link_state(h->pdev, PCIE_LINK_STATE_L0S | in cciss_pci_init()
4331 err = pci_enable_device(h->pdev); in cciss_pci_init()
4333 dev_warn(&h->pdev->dev, "Unable to Enable PCI device\n"); in cciss_pci_init()
4337 err = pci_request_regions(h->pdev, "cciss"); in cciss_pci_init()
4339 dev_warn(&h->pdev->dev, in cciss_pci_init()
4344 dev_dbg(&h->pdev->dev, "irq = %x\n", h->pdev->irq); in cciss_pci_init()
4345 dev_dbg(&h->pdev->dev, "board_id = %x\n", h->board_id); in cciss_pci_init()
4350 cciss_interrupt_mode(h); in cciss_pci_init()
4351 err = cciss_pci_find_memory_BAR(h->pdev, &h->paddr); in cciss_pci_init()
4354 h->vaddr = remap_pci_mem(h->paddr, 0x250); in cciss_pci_init()
4355 if (!h->vaddr) { in cciss_pci_init()
4359 err = cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_READY); in cciss_pci_init()
4362 err = cciss_find_cfgtables(h); in cciss_pci_init()
4365 print_cfg_table(h); in cciss_pci_init()
4366 cciss_find_board_params(h); in cciss_pci_init()
4368 if (!CISS_signature_present(h)) { in cciss_pci_init()
4372 cciss_enable_scsi_prefetch(h); in cciss_pci_init()
4373 cciss_p600_dma_prefetch_quirk(h); in cciss_pci_init()
4374 err = cciss_enter_simple_mode(h); in cciss_pci_init()
4377 cciss_put_controller_into_performant_mode(h); in cciss_pci_init()
4385 if (h->transtable) in cciss_pci_init()
4386 iounmap(h->transtable); in cciss_pci_init()
4387 if (h->cfgtable) in cciss_pci_init()
4388 iounmap(h->cfgtable); in cciss_pci_init()
4389 if (h->vaddr) in cciss_pci_init()
4390 iounmap(h->vaddr); in cciss_pci_init()
4391 pci_release_regions(h->pdev); in cciss_pci_init()
4404 ctlr_info_t *h; in alloc_cciss_hba() local
4406 h = kzalloc(sizeof(ctlr_info_t), GFP_KERNEL); in alloc_cciss_hba()
4407 if (!h) in alloc_cciss_hba()
4409 hba[i] = h; in alloc_cciss_hba()
4421 static void free_hba(ctlr_info_t *h) in free_hba() argument
4425 hba[h->ctlr] = NULL; in free_hba()
4426 for (i = 0; i < h->highest_lun + 1; i++) in free_hba()
4427 if (h->gendisk[i] != NULL) in free_hba()
4428 put_disk(h->gendisk[i]); in free_hba()
4429 kfree(h); in free_hba()
4814 static int cciss_allocate_cmd_pool(ctlr_info_t *h) in cciss_allocate_cmd_pool() argument
4816 h->cmd_pool_bits = kmalloc(BITS_TO_LONGS(h->nr_cmds) * in cciss_allocate_cmd_pool()
4818 h->cmd_pool = pci_alloc_consistent(h->pdev, in cciss_allocate_cmd_pool()
4819 h->nr_cmds * sizeof(CommandList_struct), in cciss_allocate_cmd_pool()
4820 &(h->cmd_pool_dhandle)); in cciss_allocate_cmd_pool()
4821 h->errinfo_pool = pci_alloc_consistent(h->pdev, in cciss_allocate_cmd_pool()
4822 h->nr_cmds * sizeof(ErrorInfo_struct), in cciss_allocate_cmd_pool()
4823 &(h->errinfo_pool_dhandle)); in cciss_allocate_cmd_pool()
4824 if ((h->cmd_pool_bits == NULL) in cciss_allocate_cmd_pool()
4825 || (h->cmd_pool == NULL) in cciss_allocate_cmd_pool()
4826 || (h->errinfo_pool == NULL)) { in cciss_allocate_cmd_pool()
4827 dev_err(&h->pdev->dev, "out of memory"); in cciss_allocate_cmd_pool()
4833 static int cciss_allocate_scatterlists(ctlr_info_t *h) in cciss_allocate_scatterlists() argument
4838 h->scatter_list = kzalloc(h->max_commands * in cciss_allocate_scatterlists()
4840 if (!h->scatter_list) in cciss_allocate_scatterlists()
4843 for (i = 0; i < h->nr_cmds; i++) { in cciss_allocate_scatterlists()
4844 h->scatter_list[i] = kmalloc(sizeof(struct scatterlist) * in cciss_allocate_scatterlists()
4845 h->maxsgentries, GFP_KERNEL); in cciss_allocate_scatterlists()
4846 if (h->scatter_list[i] == NULL) { in cciss_allocate_scatterlists()
4847 dev_err(&h->pdev->dev, "could not allocate " in cciss_allocate_scatterlists()
4855 static void cciss_free_scatterlists(ctlr_info_t *h) in cciss_free_scatterlists() argument
4859 if (h->scatter_list) { in cciss_free_scatterlists()
4860 for (i = 0; i < h->nr_cmds; i++) in cciss_free_scatterlists()
4861 kfree(h->scatter_list[i]); in cciss_free_scatterlists()
4862 kfree(h->scatter_list); in cciss_free_scatterlists()
4866 static void cciss_free_cmd_pool(ctlr_info_t *h) in cciss_free_cmd_pool() argument
4868 kfree(h->cmd_pool_bits); in cciss_free_cmd_pool()
4869 if (h->cmd_pool) in cciss_free_cmd_pool()
4870 pci_free_consistent(h->pdev, in cciss_free_cmd_pool()
4871 h->nr_cmds * sizeof(CommandList_struct), in cciss_free_cmd_pool()
4872 h->cmd_pool, h->cmd_pool_dhandle); in cciss_free_cmd_pool()
4873 if (h->errinfo_pool) in cciss_free_cmd_pool()
4874 pci_free_consistent(h->pdev, in cciss_free_cmd_pool()
4875 h->nr_cmds * sizeof(ErrorInfo_struct), in cciss_free_cmd_pool()
4876 h->errinfo_pool, h->errinfo_pool_dhandle); in cciss_free_cmd_pool()
4879 static int cciss_request_irq(ctlr_info_t *h, in cciss_request_irq() argument
4883 if (h->msix_vector || h->msi_vector) { in cciss_request_irq()
4884 if (!request_irq(h->intr[h->intr_mode], msixhandler, in cciss_request_irq()
4885 0, h->devname, h)) in cciss_request_irq()
4887 dev_err(&h->pdev->dev, "Unable to get msi irq %d" in cciss_request_irq()
4888 " for %s\n", h->intr[h->intr_mode], in cciss_request_irq()
4889 h->devname); in cciss_request_irq()
4893 if (!request_irq(h->intr[h->intr_mode], intxhandler, in cciss_request_irq()
4894 IRQF_SHARED, h->devname, h)) in cciss_request_irq()
4896 dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n", in cciss_request_irq()
4897 h->intr[h->intr_mode], h->devname); in cciss_request_irq()
4901 static int cciss_kdump_soft_reset(ctlr_info_t *h) in cciss_kdump_soft_reset() argument
4903 if (cciss_send_reset(h, CTLR_LUNID, CCISS_RESET_TYPE_CONTROLLER)) { in cciss_kdump_soft_reset()
4904 dev_warn(&h->pdev->dev, "Resetting array controller failed.\n"); in cciss_kdump_soft_reset()
4908 dev_info(&h->pdev->dev, "Waiting for board to soft reset.\n"); in cciss_kdump_soft_reset()
4909 if (cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_NOT_READY)) { in cciss_kdump_soft_reset()
4910 dev_warn(&h->pdev->dev, "Soft reset had no effect.\n"); in cciss_kdump_soft_reset()
4914 dev_info(&h->pdev->dev, "Board reset, awaiting READY status.\n"); in cciss_kdump_soft_reset()
4915 if (cciss_wait_for_board_state(h->pdev, h->vaddr, BOARD_READY)) { in cciss_kdump_soft_reset()
4916 dev_warn(&h->pdev->dev, "Board failed to become ready " in cciss_kdump_soft_reset()
4924 static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h) in cciss_undo_allocations_after_kdump_soft_reset() argument
4926 int ctlr = h->ctlr; in cciss_undo_allocations_after_kdump_soft_reset()
4928 free_irq(h->intr[h->intr_mode], h); in cciss_undo_allocations_after_kdump_soft_reset()
4930 if (h->msix_vector) in cciss_undo_allocations_after_kdump_soft_reset()
4931 pci_disable_msix(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4932 else if (h->msi_vector) in cciss_undo_allocations_after_kdump_soft_reset()
4933 pci_disable_msi(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4935 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_undo_allocations_after_kdump_soft_reset()
4936 cciss_free_scatterlists(h); in cciss_undo_allocations_after_kdump_soft_reset()
4937 cciss_free_cmd_pool(h); in cciss_undo_allocations_after_kdump_soft_reset()
4938 kfree(h->blockFetchTable); in cciss_undo_allocations_after_kdump_soft_reset()
4939 if (h->reply_pool) in cciss_undo_allocations_after_kdump_soft_reset()
4940 pci_free_consistent(h->pdev, h->max_commands * sizeof(__u64), in cciss_undo_allocations_after_kdump_soft_reset()
4941 h->reply_pool, h->reply_pool_dhandle); in cciss_undo_allocations_after_kdump_soft_reset()
4942 if (h->transtable) in cciss_undo_allocations_after_kdump_soft_reset()
4943 iounmap(h->transtable); in cciss_undo_allocations_after_kdump_soft_reset()
4944 if (h->cfgtable) in cciss_undo_allocations_after_kdump_soft_reset()
4945 iounmap(h->cfgtable); in cciss_undo_allocations_after_kdump_soft_reset()
4946 if (h->vaddr) in cciss_undo_allocations_after_kdump_soft_reset()
4947 iounmap(h->vaddr); in cciss_undo_allocations_after_kdump_soft_reset()
4948 unregister_blkdev(h->major, h->devname); in cciss_undo_allocations_after_kdump_soft_reset()
4949 cciss_destroy_hba_sysfs_entry(h); in cciss_undo_allocations_after_kdump_soft_reset()
4950 pci_release_regions(h->pdev); in cciss_undo_allocations_after_kdump_soft_reset()
4951 kfree(h); in cciss_undo_allocations_after_kdump_soft_reset()
4968 ctlr_info_t *h; in cciss_init_one() local
5000 h = hba[i]; in cciss_init_one()
5001 h->pdev = pdev; in cciss_init_one()
5002 h->busy_initializing = 1; in cciss_init_one()
5003 h->intr_mode = cciss_simple_mode ? SIMPLE_MODE_INT : PERF_MODE_INT; in cciss_init_one()
5004 INIT_LIST_HEAD(&h->cmpQ); in cciss_init_one()
5005 INIT_LIST_HEAD(&h->reqQ); in cciss_init_one()
5006 mutex_init(&h->busy_shutting_down); in cciss_init_one()
5008 if (cciss_pci_init(h) != 0) in cciss_init_one()
5011 sprintf(h->devname, "cciss%d", i); in cciss_init_one()
5012 h->ctlr = i; in cciss_init_one()
5019 init_completion(&h->scan_wait); in cciss_init_one()
5021 if (cciss_create_hba_sysfs_entry(h)) in cciss_init_one()
5030 dev_err(&h->pdev->dev, "no suitable DMA available\n"); in cciss_init_one()
5040 h->major = COMPAQ_CISS_MAJOR + i; in cciss_init_one()
5041 rc = register_blkdev(h->major, h->devname); in cciss_init_one()
5043 dev_err(&h->pdev->dev, in cciss_init_one()
5045 "on hba %d\n", h->major, h->devname, i); in cciss_init_one()
5049 h->major = rc; in cciss_init_one()
5053 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5054 rc = cciss_request_irq(h, do_cciss_msix_intr, do_cciss_intx); in cciss_init_one()
5058 dev_info(&h->pdev->dev, "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n", in cciss_init_one()
5059 h->devname, pdev->device, pci_name(pdev), in cciss_init_one()
5060 h->intr[h->intr_mode], dac ? "" : " not"); in cciss_init_one()
5062 if (cciss_allocate_cmd_pool(h)) in cciss_init_one()
5065 if (cciss_allocate_scatterlists(h)) in cciss_init_one()
5068 h->cmd_sg_list = cciss_allocate_sg_chain_blocks(h, in cciss_init_one()
5069 h->chainsize, h->nr_cmds); in cciss_init_one()
5070 if (!h->cmd_sg_list && h->chainsize > 0) in cciss_init_one()
5073 spin_lock_init(&h->lock); in cciss_init_one()
5077 pci_set_drvdata(pdev, h); in cciss_init_one()
5080 bitmap_zero(h->cmd_pool_bits, h->nr_cmds); in cciss_init_one()
5082 h->num_luns = 0; in cciss_init_one()
5083 h->highest_lun = -1; in cciss_init_one()
5085 h->drv[j] = NULL; in cciss_init_one()
5086 h->gendisk[j] = NULL; in cciss_init_one()
5102 spin_lock_irqsave(&h->lock, flags); in cciss_init_one()
5103 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5104 spin_unlock_irqrestore(&h->lock, flags); in cciss_init_one()
5105 free_irq(h->intr[h->intr_mode], h); in cciss_init_one()
5106 rc = cciss_request_irq(h, cciss_msix_discard_completions, in cciss_init_one()
5109 dev_warn(&h->pdev->dev, "Failed to request_irq after " in cciss_init_one()
5114 rc = cciss_kdump_soft_reset(h); in cciss_init_one()
5116 dev_warn(&h->pdev->dev, "Soft reset failed.\n"); in cciss_init_one()
5120 dev_info(&h->pdev->dev, "Board READY.\n"); in cciss_init_one()
5121 dev_info(&h->pdev->dev, in cciss_init_one()
5123 h->access.set_intr_mask(h, CCISS_INTR_ON); in cciss_init_one()
5125 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_init_one()
5127 rc = controller_reset_failed(h->cfgtable); in cciss_init_one()
5129 dev_info(&h->pdev->dev, in cciss_init_one()
5136 cciss_undo_allocations_after_kdump_soft_reset(h); in cciss_init_one()
5145 cciss_scsi_setup(h); in cciss_init_one()
5148 h->access.set_intr_mask(h, CCISS_INTR_ON); in cciss_init_one()
5153 dev_err(&h->pdev->dev, "out of memory\n"); in cciss_init_one()
5157 return_code = sendcmd_withirq(h, CISS_INQUIRY, inq_buff, in cciss_init_one()
5160 h->firm_ver[0] = inq_buff->data_byte[32]; in cciss_init_one()
5161 h->firm_ver[1] = inq_buff->data_byte[33]; in cciss_init_one()
5162 h->firm_ver[2] = inq_buff->data_byte[34]; in cciss_init_one()
5163 h->firm_ver[3] = inq_buff->data_byte[35]; in cciss_init_one()
5165 dev_warn(&h->pdev->dev, "unable to determine firmware" in cciss_init_one()
5170 cciss_procinit(h); in cciss_init_one()
5172 h->cciss_max_sectors = 8192; in cciss_init_one()
5174 rebuild_lun_table(h, 1, 0); in cciss_init_one()
5175 cciss_engage_scsi(h); in cciss_init_one()
5176 h->busy_initializing = 0; in cciss_init_one()
5180 cciss_free_cmd_pool(h); in cciss_init_one()
5181 cciss_free_scatterlists(h); in cciss_init_one()
5182 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_init_one()
5183 free_irq(h->intr[h->intr_mode], h); in cciss_init_one()
5185 unregister_blkdev(h->major, h->devname); in cciss_init_one()
5187 cciss_destroy_hba_sysfs_entry(h); in cciss_init_one()
5191 h->busy_initializing = 0; in cciss_init_one()
5198 free_hba(h); in cciss_init_one()
5204 ctlr_info_t *h; in cciss_shutdown() local
5208 h = pci_get_drvdata(pdev); in cciss_shutdown()
5211 dev_warn(&h->pdev->dev, "cache not flushed, out of memory.\n"); in cciss_shutdown()
5215 return_code = sendcmd_withirq(h, CCISS_CACHE_FLUSH, flush_buf, in cciss_shutdown()
5219 dev_warn(&h->pdev->dev, "Error flushing cache\n"); in cciss_shutdown()
5220 h->access.set_intr_mask(h, CCISS_INTR_OFF); in cciss_shutdown()
5221 free_irq(h->intr[h->intr_mode], h); in cciss_shutdown()
5224 static int cciss_enter_simple_mode(struct ctlr_info *h) in cciss_enter_simple_mode() argument
5228 trans_support = readl(&(h->cfgtable->TransportSupport)); in cciss_enter_simple_mode()
5232 h->max_commands = readl(&(h->cfgtable->CmdsOutMax)); in cciss_enter_simple_mode()
5233 writel(CFGTBL_Trans_Simple, &(h->cfgtable->HostWrite.TransportRequest)); in cciss_enter_simple_mode()
5234 writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL); in cciss_enter_simple_mode()
5235 cciss_wait_for_mode_change_ack(h); in cciss_enter_simple_mode()
5236 print_cfg_table(h); in cciss_enter_simple_mode()
5237 if (!(readl(&(h->cfgtable->TransportActive)) & CFGTBL_Trans_Simple)) { in cciss_enter_simple_mode()
5238 dev_warn(&h->pdev->dev, "unable to get board into simple mode\n"); in cciss_enter_simple_mode()
5241 h->transMethod = CFGTBL_Trans_Simple; in cciss_enter_simple_mode()
5248 ctlr_info_t *h; in cciss_remove_one() local
5256 h = pci_get_drvdata(pdev); in cciss_remove_one()
5257 i = h->ctlr; in cciss_remove_one()
5263 mutex_lock(&h->busy_shutting_down); in cciss_remove_one()
5265 remove_from_scan_list(h); in cciss_remove_one()
5266 remove_proc_entry(h->devname, proc_cciss); in cciss_remove_one()
5267 unregister_blkdev(h->major, h->devname); in cciss_remove_one()
5271 struct gendisk *disk = h->gendisk[j]; in cciss_remove_one()
5276 cciss_destroy_ld_sysfs_entry(h, j, 1); in cciss_remove_one()
5285 cciss_unregister_scsi(h); /* unhook from SCSI subsystem */ in cciss_remove_one()
5291 if (h->msix_vector) in cciss_remove_one()
5292 pci_disable_msix(h->pdev); in cciss_remove_one()
5293 else if (h->msi_vector) in cciss_remove_one()
5294 pci_disable_msi(h->pdev); in cciss_remove_one()
5297 iounmap(h->transtable); in cciss_remove_one()
5298 iounmap(h->cfgtable); in cciss_remove_one()
5299 iounmap(h->vaddr); in cciss_remove_one()
5301 cciss_free_cmd_pool(h); in cciss_remove_one()
5303 for (j = 0; j < h->nr_cmds; j++) in cciss_remove_one()
5304 kfree(h->scatter_list[j]); in cciss_remove_one()
5305 kfree(h->scatter_list); in cciss_remove_one()
5306 cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds); in cciss_remove_one()
5307 kfree(h->blockFetchTable); in cciss_remove_one()
5308 if (h->reply_pool) in cciss_remove_one()
5309 pci_free_consistent(h->pdev, h->max_commands * sizeof(__u64), in cciss_remove_one()
5310 h->reply_pool, h->reply_pool_dhandle); in cciss_remove_one()
5317 cciss_destroy_hba_sysfs_entry(h); in cciss_remove_one()
5318 mutex_unlock(&h->busy_shutting_down); in cciss_remove_one()
5319 free_hba(h); in cciss_remove_one()