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;
next prev 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.