Exemple #1
0
/*
 *  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;
	}
}
Exemple #2
0
/*
 *  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 ! */
}