static int add_one_buffer(void)
{
    TRACE_FUN(ft_t_flow);

    if (ft_nr_buffers >= FT_MAX_NR_BUFFERS) {
        TRACE_EXIT -ENOMEM;
    }
    ft_buffer[ft_nr_buffers] = kmalloc(sizeof(buffer_struct), GFP_KERNEL);
    if (ft_buffer[ft_nr_buffers] == NULL) {
        TRACE_EXIT -ENOMEM;
    }
    memset(ft_buffer[ft_nr_buffers], 0, sizeof(buffer_struct));
    ft_buffer[ft_nr_buffers]->address = dmaalloc(FT_BUFF_SIZE);
    if (ft_buffer[ft_nr_buffers]->address == NULL) {
        kfree(ft_buffer[ft_nr_buffers]);
        ft_buffer[ft_nr_buffers] = NULL;
        TRACE_EXIT -ENOMEM;
    }
    ft_nr_buffers ++;
    TRACE(ft_t_info, "buffer nr #%d @ %p, dma area @ %p",
          ft_nr_buffers,
          ft_buffer[ft_nr_buffers-1],
          ft_buffer[ft_nr_buffers-1]->address);
    TRACE_EXIT 0;
}
Ejemplo n.º 2
0
int ftape_init(void)
{
	int n;
	int order;
	TRACE_FUN(5, "ftape_init");
#ifdef MODULE
	printk(KERN_INFO "ftape-2.08 960314\n"
	       KERN_INFO " (c) 1993-1995 Bas Laarhoven ([email protected])\n"
	       KERN_INFO " (c) 1995-1996 Kai Harrekilde-Petersen ([email protected])\n"
	KERN_INFO " QIC-117 driver for QIC-40/80/3010/3020 tape drives\n"
	       KERN_INFO " Compiled for kernel version %s"
#ifdef MODVERSIONS
	       " with versioned symbols"
#endif
	       "\n", kernel_version);
#else /* !MODULE */
	/* print a short no-nonsense boot message */
	printk("ftape-2.08 960314 for Linux 1.3.70\n");
#endif				/* MODULE */
	TRACE(3, "installing QIC-117 ftape driver...");
	if (register_chrdev(QIC117_TAPE_MAJOR, "ft", &ftape_cdev)) {
		TRACE(1, "register_chrdev failed");
		TRACE_EXIT;
		return -EIO;
	}
	TRACEx1(3, "ftape_init @ 0x%p", ftape_init);
	/*
	 * Allocate the DMA buffers. They are deallocated at cleanup() time.
	 */
	order = __get_order(BUFF_SIZE);
	for (n = 0; n < NR_BUFFERS; n++) {
		tape_buffer[n] = (byte *) dmaalloc(order);
		if (!tape_buffer[n]) {
			TRACE(1, "dmaalloc() failed");
			for (n = 0; n < NR_BUFFERS; n++) {
				if (tape_buffer[n]) {
					dmafree(tape_buffer[n], order);
					tape_buffer[n] = NULL;
				}
			}
			current->blocked = old_sigmask;		/* restore mask */
			if (unregister_chrdev(QIC117_TAPE_MAJOR, "ft") != 0) {
				TRACE(3, "unregister_chrdev failed");
			}
			TRACE_EXIT;
			return -ENOMEM;
		} else {
			TRACEx2(3, "dma-buffer #%d @ %p", n, tape_buffer[n]);
		}
	}
	busy_flag = 0;
	ftape_unit = -1;
	ftape_failure = 1;	/* inhibit any operation but open */
	udelay_calibrate();	/* must be before fdc_wait_calibrate ! */
	fdc_wait_calibrate();
	TRACE_EXIT;
#ifdef MODULE
	register_symtab(0);	/* remove global ftape symbols */
#endif
	return 0;
}