/* * This is it. Find all the controllers and register them. * returns the number of block devices registered. */ static int __init cpqarray_init(void) { int num_cntlrs_reg = 0; int i; int rc = 0; /* detect controllers */ printk(DRIVER_NAME "\n"); rc = pci_register_driver(&cpqarray_pci_driver); if (rc) return rc; cpqarray_eisa_detect(); for (i=0; i < MAX_CTLR; i++) { if (hba[i] != NULL) num_cntlrs_reg++; } if (num_cntlrs_reg) return 0; else { pci_unregister_driver(&cpqarray_pci_driver); return -ENODEV; } }
/* * This is it. Find all the controllers and register them. I really hate * stealing all these major device numbers. */ void cpqarray_init(void) { void (*request_fns[MAX_CTLR])(void) = { do_ida_request0, do_ida_request1, do_ida_request2, do_ida_request3, do_ida_request4, do_ida_request5, do_ida_request6, do_ida_request7, }; int i; /* detect controllers */ #ifdef CONFIG_BLK_CPQ_DA_PCI cpqarray_pci_detect(); #endif #ifdef CONFIG_BLK_CPQ_DA_EISA cpqarray_eisa_detect(); #endif if (nr_ctlr == 0) return; printk(DRIVER_NAME "\n"); printk("Found %d controller(s)\n", nr_ctlr); /* allocate space for disk structs */ ida = kmalloc(sizeof(struct hd_struct)*nr_ctlr*NWD*16, GFP_KERNEL); ida_sizes = kmalloc(sizeof(int)*nr_ctlr*NWD*16, GFP_KERNEL); ida_blocksizes = kmalloc(sizeof(int)*nr_ctlr*NWD*16, GFP_KERNEL); ida_hardsizes = kmalloc(sizeof(int)*nr_ctlr*NWD*16, GFP_KERNEL); ida_maxsegments = kmalloc(sizeof(int)*nr_ctlr*NWD*16, GFP_KERNEL); ida_maxsectors = kmalloc(sizeof(int)*nr_ctlr*NWD*16, GFP_KERNEL); memset(ida, 0, sizeof(struct hd_struct)*nr_ctlr*NWD*16); memset(ida_sizes, 0, sizeof(int)*nr_ctlr*NWD*16); memset(ida_blocksizes, 0, sizeof(int)*nr_ctlr*NWD*16); memset(ida_hardsizes, 0, sizeof(int)*nr_ctlr*NWD*16); memset(ida_maxsegments, 0, sizeof(int)*nr_ctlr*NWD*16); memset(ida_maxsectors, 0, sizeof(int)*nr_ctlr*NWD*16); memset(ida_gendisk, 0, sizeof(struct gendisk)*MAX_CTLR); for(i=0; i<nr_ctlr*NWD*16; i++) { ida_maxsegments[i] = SG_MAX; ida_maxsectors[i] = 1024; } /* * register block devices * Find disks and fill in structs * Get an interrupt, set the Q depth and get into /proc */ for(i=0; i< nr_ctlr; i++) { smart2_write(0, hba[i], INTR_MASK); /* No interrupts */ if (request_irq(hba[i]->intr, do_ida_intr, SA_INTERRUPT | SA_SHIRQ, hba[i]->devname, hba[i])) { printk("Unable to get irq %d for %s\n", hba[i]->intr, hba[i]->devname); continue; } if (register_blkdev(MAJOR_NR+i, hba[i]->devname, &ida_fops)) { printk("Unable to get major number %d for %s\n", MAJOR_NR+i, hba[i]->devname); continue; } hba[i]->cmd_pool = (cmdlist_t*)kmalloc( NR_CMDS*sizeof(cmdlist_t), GFP_KERNEL); hba[i]->cmd_pool_bits = (__u32*)kmalloc( ((NR_CMDS+31)/32)*sizeof(__u32), GFP_KERNEL); memset(hba[i]->cmd_pool, 0, NR_CMDS*sizeof(cmdlist_t)); memset(hba[i]->cmd_pool_bits, 0, ((NR_CMDS+31)/32)*sizeof(__u32)); printk("Finding drives on %s", hba[i]->devname); getgeometry(i); smart2_write(FIFO_NOT_EMPTY, hba[i], INTR_MASK); ida_procinit(i); ida_gendisk[i].major = MAJOR_NR + i; ida_gendisk[i].major_name = "ida"; ida_gendisk[i].minor_shift = NWD_SHIFT; ida_gendisk[i].max_p = 16; ida_gendisk[i].max_nr = 16; ida_gendisk[i].init = ida_geninit; ida_gendisk[i].part = ida + (i*256); ida_gendisk[i].sizes = ida_sizes + (i*256); /* ida_gendisk[i].nr_real is handled by getgeometry */ blk_dev[MAJOR_NR+i].request_fn = request_fns[i]; blksize_size[MAJOR_NR+i] = ida_blocksizes + (i*256); hardsect_size[MAJOR_NR+i] = ida_hardsizes + (i*256); read_ahead[MAJOR_NR+i] = READ_AHEAD; max_sectors[MAJOR_NR+i] = ida_maxsectors + (i*256); max_segments[MAJOR_NR+i] = ida_maxsegments + (i*256); /* Get on the disk list */ ida_gendisk[i].next = gendisk_head; gendisk_head = &ida_gendisk[i]; init_timer(&hba[i]->timer); hba[i]->timer.expires = jiffies + IDA_TIMER; hba[i]->timer.data = (unsigned long)hba[i]; hba[i]->timer.function = ida_timer; add_timer(&hba[i]->timer); } /* done ! */ }