All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olaf Hering <olh@suse.de>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] request_region for winbond and smsc parport drivers
Date: Wed, 4 Aug 2004 13:45:51 +0200	[thread overview]
Message-ID: <20040804114551.GA30710@suse.de> (raw)


An attempt to fix the random poking in legacy io space...


ask for permissions before poking at io ports.
this affects detect_and_report_winbond() and 
detect_and_report_smsc().
Its unclear what port number is returned in
show_parconfig_winbond(), so just request the 
region as well and free the probing region.


Signed-off-by: Olaf Hering <olh@suse.de>

diff -purN linux-2.6.8-rc3.orig/drivers/parport/parport_pc.c linux-2.6.8-rc3/drivers/parport/parport_pc.c
--- linux-2.6.8-rc3.orig/drivers/parport/parport_pc.c	2004-08-04 11:29:16.000000000 +0200
+++ linux-2.6.8-rc3/drivers/parport/parport_pc.c	2004-08-04 13:11:22.605866967 +0200
@@ -1194,7 +1194,7 @@ struct parport_operations parport_pc_ops
 
 #ifdef CONFIG_PARPORT_PC_SUPERIO
 /* Super-IO chipset detection, Winbond, SMSC */
-static void __devinit show_parconfig_smsc37c669(int io, int key)
+static int __devinit show_parconfig_smsc37c669(int io, int key)
 {
 	int cr1,cr4,cra,cr23,cr26,cr27,i=0;
 	static const char *modes[]={ "SPP and Bidirectional (PS/2)",	
@@ -1261,17 +1261,26 @@ static void __devinit show_parconfig_sms
 					superios[i].io = 0x278;
 					superios[i].irq = 5;
 			}
+			if (io != superios[i].io) {
+				/* how many bytes? */
+				if (!request_region(superios[i].io, 3, "smsc parport")) {
+					superios[i].io = 0;
+					return 0;
+				}
+			}
 			d=(cr26 &0x0f);
 			if((d==1) || (d==3)) 
 				superios[i].dma= d;
 			else
 				superios[i].dma= PARPORT_DMA_NONE;
+			return 1;
 		}
  	}
+	return 0;
 }
 
 
-static void __devinit show_parconfig_winbond(int io, int key)
+static int __devinit show_parconfig_winbond(int io, int key)
 {
 	int cr30,cr60,cr61,cr70,cr74,crf0,i=0;
 	static const char *modes[] = {
@@ -1327,14 +1336,23 @@ static void __devinit show_parconfig_win
 			printk(KERN_INFO "Super-IO: too many chips!\n");
 		else {
 			superios[i].io = (cr60<<8)|cr61;
+			if (io != superios[i].io) {
+				/* how many bytes? */
+				if (!request_region(superios[i].io, 3, "winbond parport")) {
+					superios[i].io = 0;
+					return 0;
+				}
+			}
 			superios[i].irq = cr70&0x0f;
 			superios[i].dma = (((cr74 & 0x07) > 3) ?
 					   PARPORT_DMA_NONE : (cr74 & 0x07));
+			return 1;
 		}
 	}
+	return 0;
 }
 
-static void __devinit decode_winbond(int efer, int key, int devid, int devrev, int oldid)
+static int __devinit decode_winbond(int efer, int key, int devid, int devrev, int oldid)
 {
 	const char *type = "unknown";
 	int id,progif=2;
@@ -1342,7 +1360,7 @@ static void __devinit decode_winbond(int
 	if (devid == devrev)
 		/* simple heuristics, we happened to read some
                    non-winbond register */
-		return;
+		return 0;
 
 	id=(devid<<8) | devrev;
 
@@ -1367,19 +1385,20 @@ static void __devinit decode_winbond(int
 		       efer, key, devid, devrev, oldid, type);
 
 	if (progif == 2)
-		show_parconfig_winbond(efer,key);
+		return show_parconfig_winbond(efer,key);
+	return 0;
 }
 
-static void __devinit decode_smsc(int efer, int key, int devid, int devrev)
+static int __devinit decode_smsc(int efer, int key, int devid, int devrev)
 {
         const char *type = "unknown";
-	void (*func)(int io, int key);
+	int (*func)(int io, int key);
         int id;
 
         if (devid == devrev)
 		/* simple heuristics, we happened to read some
                    non-smsc register */
-		return;
+		return 0;
 
 	func=NULL;
         id=(devid<<8) | devrev;
@@ -1395,7 +1414,8 @@ static void __devinit decode_smsc(int ef
 		       efer, key, devid, devrev, type);
 
 	if (func)
-		func(efer,key);
+		return func(efer,key);
+	return 0;
 }
 
 
@@ -1403,6 +1423,9 @@ static void __devinit winbond_check(int 
 {
 	int devid,devrev,oldid,x_devid,x_devrev,x_oldid;
 
+	if (!request_region(io, 3, __FUNCTION__))
+		return;
+
 	/* First probe without key */
 	outb(0x20,io);
 	x_devid=inb(io+1);
@@ -1423,15 +1446,21 @@ static void __devinit winbond_check(int 
 	outb(0xaa,io);    /* Magic Seal */
 
 	if ((x_devid == devid) && (x_devrev == devrev) && (x_oldid == oldid))
-		return; /* protection against false positives */
+		goto out; /* protection against false positives */
 
-	decode_winbond(io,key,devid,devrev,oldid);
+	if (decode_winbond(io,key,devid,devrev,oldid));
+		return;
+out:
+	release_region(io, 3);
 }
 
 static void __devinit winbond_check2(int io,int key)
 {
         int devid,devrev,oldid,x_devid,x_devrev,x_oldid;
 
+	if (!request_region(io, 3, __FUNCTION__))
+		return;
+
 	/* First probe without the key */
 	outb(0x20,io+2);
 	x_devid=inb(io+2);
@@ -1451,15 +1480,20 @@ static void __devinit winbond_check2(int
         outb(0xaa,io);    /* Magic Seal */
 
 	if ((x_devid == devid) && (x_devrev == devrev) && (x_oldid == oldid))
-		return; /* protection against false positives */
+		goto out; /* protection against false positives */
 
         decode_winbond(io,key,devid,devrev,oldid);
+out:
+	release_region(io, 3);
 }
 
 static void __devinit smsc_check(int io, int key)
 {
         int id,rev,oldid,oldrev,x_id,x_rev,x_oldid,x_oldrev;
 
+	if (!request_region(io, 3, __FUNCTION__))
+		return;
+
 	/* First probe without the key */
 	outb(0x0d,io);
 	x_oldid=inb(io+1);
@@ -1485,9 +1519,11 @@ static void __devinit smsc_check(int io,
 
 	if ((x_id == id) && (x_oldrev == oldrev) &&
 	    (x_oldid == oldid) && (x_rev == rev))
-		return; /* protection against false positives */
+		goto out; /* protection against false positives */
 
         decode_smsc(io,key,oldid,oldrev);
+out:
+	release_region(io, 3);
 }
 
 

-- 
USB is for mice, FireWire is for men!

sUse lINUX ag, nÜRNBERG

                 reply	other threads:[~2004-08-04 11:50 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040804114551.GA30710@suse.de \
    --to=olh@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.