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; }
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; }