PnP BIOS #6
PATCH 1/1 PnP BIOS #6
(A couple of people have tested this patch now and have reported favorable results to me, so I'll post it to the list. Should apply cleanly to 2.4.12-ac6.)
Here's a new version of my PnP BIOS patch with the addition of item 6, below. Let me know if you have any
problems with it. // Thomas Hood
Summary of changes in this patch:
1) Fix bugs in resource reservation:
- didn't reserve all io resources
- end of resource range recorded in devlist off by 1
2) Change code so that set_dev_node updates the devlist, so drivers loaded after a setpnp will get up-to-date resource information. Because I haven't protected devlist update code with locks, this feature isn't SMP safe yet. I'd like some advice about how to do the locking. If you're worried, don't use setpnp.
3) Miscellaneous code cleanups. Improve printk output. Etc.
(I reverted some function name changes that I made in the first edition of this patch, though.)
4) Don't EXPORT_SYMBOL lowlevel PnP BIOS access functions since they aren't used by anything except the proc routines which don't need them to be EXPORT_SYMBOL to link to them.
5) Declare announce_device in header (since it is EXPORT_SYMBOL in pnp_bios.c, presumably for a reason).
6) Refrain from marking ioports busy. This should fix the problem of drivers not being able to request these ioports.
The patch:
init/main.c +1 -1
@@ -822,7 +822,7 @@isapnp_init ();#endif #ifdef CONFIG_PNPBIOS -pnp_bios_init (); +pnpbios_init ();#endif #ifdef CONFIG_TC
include/linux/pnp_bios.h +27 -20
82 lines not on this page · raw message
drivers/pnp/pnp_bios.c +267 -181
750 lines not on this page · raw message
drivers/pnp/pnp_proc.c +13 -13
@@ -31,7 +31,7 @@ *eof =1 ;return 0 ; } - node =kmalloc (node_info.max_node_size,GFP_KERNEL ); + node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return -ENOMEM ;for (i=0 ,nodenum=0 ;i<0xff && nodenum!=0xff ; i++) {if (pnp_bios_get_dev_node (&nodenum,1 , node) )
@@ -57,7 +57,7 @@ *eof =1 ;return 0 ; } - node =kmalloc (node_info.max_node_size,GFP_KERNEL ); + node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return -ENOMEM ;if (pnp_bios_get_dev_node (&nodenum, boot, node) )return -EIO ;
@@ -74,7 +74,7 @@int boot = (long )data >>8 ;u8 nodenum = (long )data; - node =kmalloc (node_info.max_node_size,GFP_KERNEL ); + node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return -ENOMEM ;if (pnp_bios_get_dev_node (&nodenum, boot, node) )return -EIO ;
@@ -87,9 +87,12 @@return count; } -static int pnp_proc_dont_use_current_config; - -void pnp_proc_init (int dont_use_current ) +/* +* When this is called, pnpbios functions are assumed to +* work and the pnpbios_dont_use_current_config flag +* should already have been set to the appropriate value +*/ +void pnpbios_proc_init (void ) {struct pnp_bios_node *node;struct proc_dir_entry *ent;
@@ -97,9 +100,6 @@int i;u8 nodenum; - pnp_proc_dont_use_current_config = dont_use_current; - -if (!pnp_bios_present ())return ;if (pnp_bios_dev_node_info (&node_info) !=0 )return ; proc_pnp =proc_mkdir ("pnp" , proc_bus);
@@ -108,13 +108,13 @@if (!proc_pnp_boot)return ;create_proc_read_entry ("devices" ,0 , proc_pnp, proc_read_devices,NULL ); - node =kmalloc (node_info.max_node_size,GFP_KERNEL ); + node =pnpbios_kmalloc (node_info.max_node_size,GFP_KERNEL );if (!node)return ;for (i=0 ,nodenum =0 ; i<0xff && nodenum !=0xff ; i++) {if (pnp_bios_get_dev_node (&nodenum,1 , node) !=0 )break ;sprintf (name,"%02x" , node->handle); -if ( !pnp_proc_dont_use_current_config ) { +if ( !pnpbios_dont_use_current_config ) { ent =create_proc_entry (name,0 , proc_pnp);if (ent) { ent->read_proc = proc_read_node;
@@ -132,7 +132,7 @@kfree (node); } -void pnp_proc_done (void ) +void pnpbios_proc_done (void ) {int i;char name[3 ];
@@ -141,7 +141,7 @@for (i=0 ; i<0xff ; i++) {sprintf (name,"%02x" , i); -if ( !pnp_proc_dont_use_current_config ) +if ( !pnpbios_dont_use_current_config )remove_proc_entry (name, proc_pnp);remove_proc_entry (name, proc_pnp_boot); }