qic02 modularized

Tekno Soft Snc (MC3641@mclink.it)
Tue, 21 May 96 20:15:59 CEST


This is the new patch of QIC02 driver, that correct minor errors of
cleanup code, and allow the driver to check the I/O regions.

--- cut here --- cut here --- cut here --- cut here --- cut here --- cut
here

--- drivers/char/tpqic02.c.old Mon May 20 15:59:09 1996
+++ drivers/char/tpqic02.c Tue May 21 19:46:30 1996
@@ -34,6 +34,9 @@
* You are not allowed to change this line nor the text above.
*
* $Log: tpqic02.c,v $
+ * Revision 0.4.1.6 1996/05/20 16:00:00
+ * Modularized. Roberto Fichera - mc3641@mclink.it
+ *
* Revision 0.4.1.5 1994/10/29 02:46:13 root
* Minor cleanups.
*
@@ -200,6 +203,8 @@

#define REALLY_SLOW_IO /* it sure is ... */

+#include <linux/module.h>
+#include <linux/malloc.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/fs.h>
@@ -212,6 +217,7 @@
#include <linux/tpqic02.h>
#include <linux/config.h>
#include <linux/mm.h>
+#include <linux/ioport.h>

#include <asm/dma.h>
#include <asm/system.h>
@@ -333,8 +339,12 @@
* at 512 bytes, to prevent problems with 64k boundaries.
*/

+#ifndef MODULE
static volatile char qic02_tape_buf[TPQBUF_SIZE+TAPE_BLKSIZE];
/* A really good compiler would be able to align this at 512 bytes... :-(
*/
+#else
+static volatile char *qic02_tape_buf=(char *)NULL;
+#endif

static unsigned long buffaddr; /* aligned physical address of buffer */

@@ -2250,6 +2260,7 @@
unsigned short dens = 0;
int s;

+ MOD_INC_USE_COUNT;

if (TP_DIAGS(dev)) {
printk("qic02_tape_open: dev=%s, flags=%x ",
@@ -2436,6 +2447,8 @@
if (TP_DIAGS(dev))
printk("qic02_tape_release: dev=%s\n",
kdevname(dev));
+
+ MOD_DEC_USE_COUNT;

if (status_zombie==YES) /* don't rewind in zombie mode */
return;
@@ -2814,6 +2827,7 @@
{
free_irq(QIC02_TAPE_IRQ, NULL);
free_dma(QIC02_TAPE_DMA);
+ release_region(QIC02_TAPE_PORT, 4);
status_zombie = YES;
} /* qic02_release_resources */

@@ -2851,6 +2865,19 @@
return -1;
}

+ /* Check the request IO region */
+ if (check_region(QIC02_TAPE_PORT, 4) < 0) {
+ printk(TPQIC02_NAME ": can't allocate I/O region
0x%04x-0x%04x for QIC-02 tape",
+ QIC02_TAPE_PORT, QIC02_TAPE_PORT+4);
+ free_irq(QIC02_TAPE_IRQ, NULL);
+ free_dma(QIC02_TAPE_DMA);
+ status_zombie = YES;
+ return -1;
+ }
+
+ /* Now we can allocate the requested IO region */
+ request_region(QIC02_TAPE_PORT, 4, "QIC-02");
+
printk(TPQIC02_NAME ": Settings: IRQ %d, DMA %d, IO 0x%x, IFC
%s\n",
QIC02_TAPE_IRQ, QIC02_TAPE_DMA,
((QIC02_TAPE_IFC==ARCHIVE) || (QIC02_TAPE_IFC==MOUNTAIN))?
@@ -2913,16 +2940,39 @@

printk(TPQIC02_NAME ": DMA buffers: %u blocks", NR_BLK_BUF);

+#ifdef MODULE
+ /* On a module we must allocate the buffer in low memory
*/
+ qic02_tape_buf = (char
*)kmalloc((size_t)(TPQBUF_SIZE+TAPE_BLKSIZE), GFP_DMA);
+ if (qic02_tape_buf == (char *)NULL) {
+ printk (TPQIC02_NAME ": kmalloc() failed to allocate
low-memory\n");
+ free_irq(QIC02_TAPE_IRQ, NULL);
+ free_dma(QIC02_TAPE_DMA);
+ release_region(QIC02_TAPE_PORT, 4);
+ return -ENODEV;
+ }
+#endif
+
/* Setup the page-address for the dma transfer.
* This assumes a one-to-one identity mapping between
* kernel addresses and physical memory.
*/
+#ifndef MODULE
buffaddr = align_buffer((unsigned long) &qic02_tape_buf,
TAPE_BLKSIZE);
printk(", at address 0x%lx (0x%lx)\n", buffaddr, (unsigned
long)&qic02_tape_buf);
+#else
+ buffaddr = align_buffer((unsigned long) qic02_tape_buf,
TAPE_BLKSIZE);
+ printk(", at address 0x%lx (0x%lx)\n", buffaddr, (unsigned
long)qic02_tape_buf);
+#endif

#ifndef CONFIG_MAX_16M
if (buffaddr+TPQBUF_SIZE>=0x1000000) {
printk(TPQIC02_NAME ": DMA buffer *must* be in lower
16MB\n");
+ free_irq(QIC02_TAPE_IRQ, NULL);
+ free_dma(QIC02_TAPE_DMA);
+ release_region(QIC02_TAPE_PORT, 4);
+#ifdef MODULE
+ kfree((void *)qic02_tape_buf);
+#endif
return -ENODEV;
}
#endif
@@ -2933,6 +2983,10 @@
#ifndef CONFIG_QIC02_DYNCONF
free_irq(QIC02_TAPE_IRQ, NULL);
free_dma(QIC02_TAPE_DMA);
+ release_region(QIC02_TAPE_PORT, 4);
+#ifdef MODULE
+ kfree((void *)qic02_tape_buf);
+#endif
#endif
return -ENODEV;
}
@@ -2949,6 +3003,10 @@
status_dead = YES;
free_irq(QIC02_TAPE_IRQ, NULL);
free_dma(QIC02_TAPE_DMA);
+ release_region(QIC02_TAPE_PORT, 4);
+#ifdef MODULE
+ kfree((void *)qic02_tape_buf);
+#endif
unregister_chrdev(QIC02_TAPE_MAJOR, TPQIC02_NAME);
return -ENODEV;
} else {
@@ -2972,3 +3030,20 @@
return 0;
} /* qic02_tape_init */

+#ifdef MODULE
+int init_module(void)
+{
+ printk("tpqic02.c:v0.2 21/05/96 modularized version
MC3641@mclink.it\n");
+
+ return qic02_tape_init();
+}
+
+void cleanup_module(void)
+{
+ free_irq(QIC02_TAPE_IRQ, NULL);
+ free_dma(QIC02_TAPE_DMA);
+ release_region(QIC02_TAPE_PORT, 4);
+ kfree((void *)qic02_tape_buf);
+ unregister_chrdev(QIC02_TAPE_MAJOR, TPQIC02_NAME);
+}
+#endif /* MODULE */
--- drivers/char/Config.in.old Mon May 20 16:41:35 1996
+++ drivers/char/Config.in Mon May 20 16:41:35 1996
@@ -23,8 +23,8 @@
tristate 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE
bool 'Support for user misc device modules' CONFIG_UMISC

-bool 'QIC-02 tape support' CONFIG_QIC02_TAPE
-if [ "$CONFIG_QIC02_TAPE" = "y" ]; then
+tristate 'QIC-02 tape support' CONFIG_QIC02_TAPE
+if [ "$CONFIG_QIC02_TAPE" != "n" ]; then
bool 'Do you want runtime configuration for QIC-02'
CONFIG_QIC02_DYNCONF
if [ "$CONFIG_QIC02_DYNCONF" != "y" ]; then
comment 'Edit configuration parameters in ./include/linux/tpqic02.h!'
--- drivers/char/Makefile.old Mon May 20 16:46:52 1996
+++ drivers/char/Makefile Mon May 20 16:46:52 1996
@@ -156,8 +156,12 @@
L_OBJS += rtc.o
endif

-ifdef CONFIG_QIC02_TAPE
-L_OBJS += tpqic02.o
+ifeq ($(CONFIG_QIC02_TAPE),y)
+ L_OBJS += tpqic02.o
+else
+ ifeq ($(CONFIG_QIC02_TAPE),m)
+ M_OBJS += tpqic02.o
+ endif
endif

ifeq ($(CONFIG_FTAPE),y)
--- include/linux/tpqic02.h.old Mon May 20 17:11:43 1996
+++ include/linux/tpqic02.h Mon May 20 18:36:27 1996
@@ -12,7 +12,8 @@

#include <linux/config.h>

-#if CONFIG_QIC02_TAPE
+#if CONFIG_QIC02_TAPE || \
+ CONFIG_QIC02_TAPE_MODULE

/* need to have QIC02_TAPE_DRIVE and QIC02_TAPE_IFC expand to something
*/
#include <linux/mtio.h>

--- cut here --- cut here --- cut here --- cut here --- cut here --- cut
here

--
Roberto Fichera - email MC3641@mclink.it
TeknoSOFT s.n.c. - ITALY