All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Hood <jdthood@mail.com>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Brian Gerst <bgerst@didntduck.org>, linux-kernel@vger.kernel.org
Subject: Re: PnP BIOS driver status
Date: Fri, 08 Mar 2002 21:48:38 -0500	[thread overview]
Message-ID: <1015642119.941.49.camel@thanatos> (raw)
In-Reply-To: <E16jWYf-0008Q4-00@the-village.bc.nu>
In-Reply-To: <E16jWYf-0008Q4-00@the-village.bc.nu>

Here the patch for Alan (which also includes the
kpnpbios -> kpnpbiosd change):

--- linux-2.4.19-pre2-ac3/drivers/pnp/pnpbios_core.c_ORIG	Fri Mar  8 17:35:44 2002
+++ linux-2.4.19-pre2-ac3/drivers/pnp/pnpbios_core.c	Fri Mar  8 21:43:10 2002
@@ -139,10 +139,16 @@
 
 static spinlock_t pnp_bios_lock;
 
+/*
+ * call_pnp_bios
+ *
+ * Call with the pnp_bios_lock held and with irqs disabled.
+ * On some boxes IRQ's during PnP BIOS calls are deadly.
+ */
+
 static inline u16 call_pnp_bios(u16 func, u16 arg1, u16 arg2, u16 arg3,
                                 u16 arg4, u16 arg5, u16 arg6, u16 arg7)
 {
-	unsigned long flags;
 	u16 status;
 
 	/*
@@ -152,9 +158,6 @@
 	if(pnp_bios_is_utter_crap)
 		return PNP_FUNCTION_NOT_SUPPORTED;
 
-	/* On some boxes IRQ's during PnP BIOS calls are deadly.  */
-	spin_lock_irqsave(&pnp_bios_lock, flags);
-	__cli();
 	__asm__ __volatile__(
 	        "pushl %%ebp\n\t"
 		"pushl %%edi\n\t"
@@ -184,7 +187,6 @@
 		  "i" (0)
 		: "memory"
 	);
-	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	
 	/* If we get here and this is set then the PnP BIOS faulted on us. */
 	if(pnp_bios_is_utter_crap)
@@ -220,7 +222,7 @@
 /*
  * Call this only after init time
  */
-static int pnp_bios_present(void)
+static inline int pnp_bios_present(void)
 {
 	return (pnp_bios_hdr != NULL);
 }
@@ -254,11 +256,14 @@
  */
 static int __pnp_bios_dev_node_info(struct pnp_dev_node_info *data)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, sizeof(struct pnp_dev_node_info));
 	status = call_pnp_bios(PNP_GET_NUM_SYS_DEV_NODES, 0, PNP_TS1, 2, PNP_TS1, PNP_DS, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	data->no_nodes &= 0xff;
 	return status;
 }
@@ -287,14 +292,17 @@
  */
 static int __pnp_bios_get_dev_node(u8 *nodenum, char boot, struct pnp_bios_node *data)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
 	if ( !boot & pnpbios_dont_use_current_config )
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, nodenum, sizeof(char));
 	Q2_SET_SEL(PNP_TS2, data, 64 * 1024);
 	status = call_pnp_bios(PNP_GET_SYS_DEV_NODE, 0, PNP_TS1, 0, PNP_TS2, boot ? 2 : 1, PNP_DS, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 
@@ -316,13 +324,16 @@
  */
 static int __pnp_bios_set_dev_node(u8 nodenum, char boot, struct pnp_bios_node *data)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
 	if ( !boot & pnpbios_dont_use_current_config )
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, /* *((u16 *) data)*/ 65536);
 	status = call_pnp_bios(PNP_SET_SYS_DEV_NODE, nodenum, 0, PNP_TS1, boot ? 2 : 1, PNP_DS, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 
@@ -350,11 +361,14 @@
  */
 static int pnp_bios_get_event(u16 *event)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, event, sizeof(u16));
 	status = call_pnp_bios(PNP_GET_EVENT, 0, PNP_TS1, PNP_DS, 0, 0 ,0 ,0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 #endif
@@ -365,10 +379,13 @@
  */
 static int pnp_bios_send_message(u16 message)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	status = call_pnp_bios(PNP_SEND_MESSAGE, message, PNP_DS, 0, 0, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 #endif
@@ -379,11 +396,14 @@
  */
 static int pnp_bios_dock_station_info(struct pnp_docking_station_info *data)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, sizeof(struct pnp_docking_station_info));
 	status = call_pnp_bios(PNP_GET_DOCKING_STATION_INFORMATION, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 #endif
@@ -395,11 +415,14 @@
  */
 static int pnp_bios_set_stat_res(char *info)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, info, *((u16 *) info));
 	status = call_pnp_bios(PNP_SET_STATIC_ALLOCED_RES_INFO, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 #endif
@@ -410,11 +433,14 @@
  */
 static int __pnp_bios_get_stat_res(char *info)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, info, 64 * 1024);
 	status = call_pnp_bios(PNP_GET_STATIC_ALLOCED_RES_INFO, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 
@@ -433,12 +459,15 @@
  */
 static int pnp_bios_apm_id_table(char *table, u16 *size)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, table, *size);
 	Q2_SET_SEL(PNP_TS2, size, sizeof(u16));
 	status = call_pnp_bios(PNP_GET_APM_ID_TABLE, 0, PNP_TS2, 0, PNP_TS1, PNP_DS, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 #endif
@@ -448,11 +477,14 @@
  */
 static int __pnp_bios_isapnp_config(struct pnp_isa_config_struc *data)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return PNP_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, sizeof(struct pnp_isa_config_struc));
 	status = call_pnp_bios(PNP_GET_PNP_ISA_CONFIG_STRUC, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 
@@ -470,11 +502,14 @@
  */
 static int __pnp_bios_escd_info(struct escd_info_struc *data)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return ESCD_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, sizeof(struct escd_info_struc));
 	status = call_pnp_bios(PNP_GET_ESCD_INFO, 0, PNP_TS1, 2, PNP_TS1, 4, PNP_TS1, PNP_DS);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 
@@ -493,13 +528,16 @@
  */
 static int __pnp_bios_read_escd(char *data, u32 nvram_base)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return ESCD_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, 64 * 1024);
 	set_base(gdt[PNP_TS2 >> 3], nvram_base);
 	set_limit(gdt[PNP_TS2 >> 3], 64 * 1024);
 	status = call_pnp_bios(PNP_READ_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 
@@ -518,13 +556,16 @@
  */
 static int pnp_bios_write_escd(char *data, u32 nvram_base)
 {
+	unsigned long flags;
 	u16 status;
 	if (!pnp_bios_present())
 		return ESCD_FUNCTION_NOT_SUPPORTED;
+	spin_lock_irqsave(&pnp_bios_lock, flags);
 	Q2_SET_SEL(PNP_TS1, data, 64 * 1024);
 	set_base(gdt[PNP_TS2 >> 3], nvram_base);
 	set_limit(gdt[PNP_TS2 >> 3], 64 * 1024);
 	status = call_pnp_bios(PNP_WRITE_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0);
+	spin_unlock_irqrestore(&pnp_bios_lock, flags);
 	return status;
 }
 #endif
@@ -606,7 +647,7 @@
 	int docked = -1, d = 0;
 	daemonize();
 	reparent_to_init();
-	strcpy(current->comm, "kpnpbios");
+	strcpy(current->comm, "kpnpbiosd");
 	while(!unloading && !signal_pending(current))
 	{
 		int status;


  parent reply	other threads:[~2002-03-09  7:19 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-03-08 23:00 PnP BIOS driver status Thomas Hood
2002-03-08 23:14 ` Dave Jones
2002-03-09  0:43   ` Thomas Hood
2002-03-09  1:00 ` Brian Gerst
2002-03-09  1:10   ` Thomas Hood
2002-03-09  2:23     ` Brian Gerst
2002-03-09  3:02       ` Thomas Hood
2002-03-09  1:25   ` Alan Cox
2002-03-09  1:37     ` Brian Gerst
2002-03-09  2:00       ` Alan Cox
2002-03-09  1:51         ` Brian Gerst
2002-03-09  2:26           ` Alan Cox
2002-03-09  2:24             ` Thomas Hood
2002-03-09  2:48             ` Thomas Hood [this message]
2002-03-09 14:44             ` Thomas Hood
  -- strict thread matches above, loose matches on Subject: below --
2002-03-09 15:11 Thomas Hood

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=1015642119.941.49.camel@thanatos \
    --to=jdthood@mail.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=bgerst@didntduck.org \
    --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.