PCI fixes for 2.6.0-test5
Subsystems (9)
PATCH 1/1 PCI fixes for 2.6.0-test5
Hi,
Here are some PCI patches against 2.6.0-test5. They fix the problem with PCI drivers declaring their probe function as __init or __devinit and then not selecting CONFIG_HOTPLUG. When a user would try to add a new device id by using the "new_id" file in the driver's sysfs directory, it would cause an oops. So now the "new_id" file is only enabled if CONFIG_HOTPLUG is selected, and we've fixed up all of the PCI drivers to mark their probe functions (and child functions and data) as __devinit.
Thanks to Matt Domsch for the big patch, and all of the other people who helped figure this out.
Please pull from:
bk://kernel.bkbits.net/gregkh/linux/pci-2.6
thanks,
greg k-h
p.s. I'll send these as patches in response to this email to lkml for those who want to see them.
drivers/atm/firestream.c | 18 - drivers/block/cciss.c | 4 drivers/char/epca.c | 2 drivers/char/watchdog/wdt_pci.c | 2 drivers/net/hamachi.c | 6 drivers/net/irda/via-ircc.c | 6 drivers/net/tc35815.c | 4 drivers/net/tokenring/abyss.c | 4 drivers/net/tokenring/tmspci.c | 4 drivers/net/tulip/de2104x.c | 4 drivers/net/tulip/de4x5.c | 8 drivers/net/wan/dscc4.c | 2 drivers/pci/hotplug/acpiphp.h | 12 - drivers/pci/hotplug/acpiphp_core.c | 12 - drivers/pci/hotplug/acpiphp_glue.c | 6 drivers/pci/hotplug/acpiphp_pci.c | 12 - drivers/pci/hotplug/acpiphp_res.c | 12 - drivers/pci/hotplug/cpci_hotplug.h | 6 drivers/pci/hotplug/cpci_hotplug_core.c | 6 drivers/pci/hotplug/cpci_hotplug_pci.c | 2 drivers/pci/hotplug/cpqphp.h | 6 drivers/pci/hotplug/cpqphp_core.c | 6 drivers/pci/hotplug/cpqphp_ctrl.c | 6 drivers/pci/hotplug/cpqphp_nvram.c | 6 drivers/pci/hotplug/cpqphp_nvram.h | 4 drivers/pci/hotplug/cpqphp_pci.c | 6 drivers/pci/hotplug/cpqphp_sysfs.c | 6 drivers/pci/hotplug/fakephp.c | 6 drivers/pci/hotplug/ibmphp.h | 4 drivers/pci/hotplug/ibmphp_core.c | 4 drivers/pci/hotplug/ibmphp_ebda.c | 4 drivers/pci/hotplug/ibmphp_hpc.c | 2 drivers/pci/hotplug/ibmphp_pci.c | 4 drivers/pci/hotplug/ibmphp_res.c | 4 drivers/pci/hotplug/pci_hotplug.h | 6 drivers/pci/hotplug/pci_hotplug_core.c | 4 drivers/pci/hotplug/pcihp_skeleton.c | 4 drivers/pci/pci-driver.c | 334 +++++++++++++++++--------------- drivers/pcmcia/i82092.c | 2 drivers/video/i810/i810_main.c | 20 - drivers/video/i810/i810_main.h | 4 drivers/video/riva/fbdev.c | 4 42 files changed, 304 insertions(+), 274 deletions(-)
-----
Greg Kroah-Hartman:
o PCI: fix up some pci drivers that had marked their probe functions with __init
o PCI: remove compiler warning from previous new_id patch
o PCI hotplug: fix up a bunch of copyrights that were incorrectly declared
Matt Domsch:
o PCI: make new_id rely on CONFIG_HOTPLUG
PATCH 1/1 PCI fixes for 2.6.0-test5
ChangeSet 1.1153.78.1, 2003/08/27 14:45:27-07:00, [email protected]
[PATCH] PCI hotplug: fix up a bunch of copyrights that were incorrectly declared.
It needs to be "Copyright (C)" not "Copyright (c)" according to the lawyers who know these things...
drivers/pci/hotplug/acpiphp.h | 12 ++++++------ drivers/pci/hotplug/acpiphp_core.c | 12 ++++++------ drivers/pci/hotplug/acpiphp_glue.c | 6 +++--- drivers/pci/hotplug/acpiphp_pci.c | 12 ++++++------ drivers/pci/hotplug/acpiphp_res.c | 12 ++++++------ drivers/pci/hotplug/cpci_hotplug.h | 6 +++--- drivers/pci/hotplug/cpci_hotplug_core.c | 6 +++--- drivers/pci/hotplug/cpci_hotplug_pci.c | 2 +- drivers/pci/hotplug/cpqphp.h | 6 +++--- drivers/pci/hotplug/cpqphp_core.c | 6 +++--- drivers/pci/hotplug/cpqphp_ctrl.c | 6 +++--- drivers/pci/hotplug/cpqphp_nvram.c | 6 +++--- drivers/pci/hotplug/cpqphp_nvram.h | 4 ++-- drivers/pci/hotplug/cpqphp_pci.c | 6 +++--- drivers/pci/hotplug/cpqphp_sysfs.c | 6 +++--- drivers/pci/hotplug/fakephp.c | 6 +++--- drivers/pci/hotplug/ibmphp.h | 4 ++-- drivers/pci/hotplug/ibmphp_core.c | 4 ++-- drivers/pci/hotplug/ibmphp_ebda.c | 4 ++-- drivers/pci/hotplug/ibmphp_hpc.c | 2 +- drivers/pci/hotplug/ibmphp_pci.c | 4 ++-- drivers/pci/hotplug/ibmphp_res.c | 4 ++-- drivers/pci/hotplug/pci_hotplug.h | 6 +++--- drivers/pci/hotplug/pci_hotplug_core.c | 4 ++-- drivers/pci/hotplug/pcihp_skeleton.c | 4 ++-- 25 files changed, 75 insertions(+), 75 deletions(-)
drivers/pci/hotplug/acpiphp.h +6 -6
@@ -1,12 +1,12 @@/* * ACPI PCI Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. -* Copyright (c) 2002 Hiroshi Aono ([email protected]) -* Copyright (c) 2002,2003 Takayoshi Kochi ([email protected]) -* Copyright (c) 2002,2003 NEC Corporation +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. +* Copyright (C) 2002 Hiroshi Aono ([email protected]) +* Copyright (C) 2002,2003 Takayoshi Kochi ([email protected]) +* Copyright (C) 2002,2003 NEC Corporation * * All rights reserved. *
drivers/pci/hotplug/acpiphp_core.c +6 -6
@@ -1,12 +1,12 @@/* * ACPI PCI Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. -* Copyright (c) 2002 Hiroshi Aono ([email protected]) -* Copyright (c) 2002,2003 Takayoshi Kochi ([email protected]) -* Copyright (c) 2002,2003 NEC Corporation +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. +* Copyright (C) 2002 Hiroshi Aono ([email protected]) +* Copyright (C) 2002,2003 Takayoshi Kochi ([email protected]) +* Copyright (C) 2002,2003 NEC Corporation * * All rights reserved. *
drivers/pci/hotplug/acpiphp_glue.c +3 -3
@@ -1,9 +1,9 @@/* * ACPI PCI HotPlug glue functions to ACPI CA subsystem * -* Copyright (c) 2002,2003 Takayoshi Kochi ([email protected]) -* Copyright (c) 2002 Hiroshi Aono ([email protected]) -* Copyright (c) 2002,2003 NEC Corporation +* Copyright (C) 2002,2003 Takayoshi Kochi ([email protected]) +* Copyright (C) 2002 Hiroshi Aono ([email protected]) +* Copyright (C) 2002,2003 NEC Corporation * * All rights reserved. *
drivers/pci/hotplug/acpiphp_pci.c +6 -6
@@ -1,12 +1,12 @@/* * ACPI PCI HotPlug PCI configuration space management * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001,2002 IBM Corp. -* Copyright (c) 2002 Takayoshi Kochi ([email protected]) -* Copyright (c) 2002 Hiroshi Aono ([email protected]) -* Copyright (c) 2002 NEC Corporation +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001,2002 IBM Corp. +* Copyright (C) 2002 Takayoshi Kochi ([email protected]) +* Copyright (C) 2002 Hiroshi Aono ([email protected]) +* Copyright (C) 2002 NEC Corporation * * All rights reserved. *
drivers/pci/hotplug/acpiphp_res.c +6 -6
@@ -1,12 +1,12 @@/* * ACPI PCI HotPlug Utility functions * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. -* Copyright (c) 2002 Hiroshi Aono ([email protected]) -* Copyright (c) 2002 Takayoshi Kochi ([email protected]) -* Copyright (c) 2002 NEC Corporation +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. +* Copyright (C) 2002 Hiroshi Aono ([email protected]) +* Copyright (C) 2002 Takayoshi Kochi ([email protected]) +* Copyright (C) 2002 NEC Corporation * * All rights reserved. *
drivers/pci/hotplug/cpci_hotplug.h +3 -3
@@ -1,9 +1,9 @@/* * CompactPCI Hot Plug Core Functions * -* Copyright (c) 2002 SOMA Networks, Inc. -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 2002 SOMA Networks, Inc. +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/cpci_hotplug_core.c +3 -3
@@ -1,9 +1,9 @@/* * CompactPCI Hot Plug Driver * -* Copyright (c) 2002 SOMA Networks, Inc. -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 2002 SOMA Networks, Inc. +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/cpci_hotplug_pci.c +1 -1
@@ -1,7 +1,7 @@/* * CompactPCI Hot Plug Driver PCI functions * -* Copyright (c) 2002 by SOMA Networks, Inc. +* Copyright (C) 2002 by SOMA Networks, Inc. * * All rights reserved. *
drivers/pci/hotplug/cpqphp.h +3 -3
@@ -1,9 +1,9 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM * * All rights reserved. *
drivers/pci/hotplug/cpqphp_core.c +3 -3
@@ -1,9 +1,9 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/cpqphp_ctrl.c +3 -3
@@ -1,9 +1,9 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/cpqphp_nvram.c +3 -3
@@ -1,9 +1,9 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/cpqphp_nvram.h +2 -2
@@ -1,8 +1,8 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) * * All rights reserved. *
drivers/pci/hotplug/cpqphp_pci.c +3 -3
@@ -1,9 +1,9 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/cpqphp_sysfs.c +3 -3
@@ -1,9 +1,9 @@/* * Compaq Hot Plug Controller Driver * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001,2003 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001,2003 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/fakephp.c +3 -3
@@ -1,9 +1,9 @@/* * Fake PCI Hot Plug Controller Driver * -* Copyright (c) 2003 Greg Kroah-Hartman <[email protected]> -* Copyright (c) 2003 IBM Corp. -* Copyright (c) 2003 Rolf Eike Beer <[email protected]> +* Copyright (C) 2003 Greg Kroah-Hartman <[email protected]> +* Copyright (C) 2003 IBM Corp. +* Copyright (C) 2003 Rolf Eike Beer <[email protected]> * * Based on ideas and code from: * Vladimir Kondratiev <[email protected]>
drivers/pci/hotplug/ibmphp.h +2 -2
@@ -6,8 +6,8 @@* * Written By: Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation * -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001-2003 IBM Corp. +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001-2003 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/ibmphp_core.c +2 -2
@@ -3,8 +3,8 @@* * Written By: Chuck Cole, Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation * -* Copyright (c) 2001,2003 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001-2003 IBM Corp. +* Copyright (C) 2001,2003 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001-2003 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/ibmphp_ebda.c +2 -2
@@ -3,8 +3,8 @@* * Written By: Tong Yu, IBM Corporation * -* Copyright (c) 2001,2003 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001-2003 IBM Corp. +* Copyright (C) 2001,2003 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001-2003 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/ibmphp_hpc.c +1 -1
@@ -3,7 +3,7 @@* * Written By: Jyoti Shah, IBM Corporation * -* Copyright (c) 2001-2003 IBM Corp. +* Copyright (C) 2001-2003 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/ibmphp_pci.c +2 -2
@@ -3,8 +3,8 @@* * Written By: Irene Zubarev, IBM Corporation * -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001,2002 IBM Corp. +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/ibmphp_res.c +2 -2
@@ -3,8 +3,8 @@* * Written By: Irene Zubarev, IBM Corporation * -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001,2002 IBM Corp. +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/pci_hotplug.h +3 -3
@@ -1,9 +1,9 @@/* * PCI HotPlug Core Functions * -* Copyright (c) 1995,2001 Compaq Computer Corporation -* Copyright (c) 2001 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001 IBM Corp. +* Copyright (C) 1995,2001 Compaq Computer Corporation +* Copyright (C) 2001 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/pci_hotplug_core.c +2 -2
@@ -1,8 +1,8 @@/* * PCI HotPlug Controller Core * -* Copyright (c) 2001-2002 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001-2002 IBM Corp. +* Copyright (C) 2001-2002 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001-2002 IBM Corp. * * All rights reserved. *
drivers/pci/hotplug/pcihp_skeleton.c +2 -2
@@ -1,8 +1,8 @@/* * PCI Hot Plug Controller Skeleton Driver - 0.2 * -* Copyright (c) 2001,2003 Greg Kroah-Hartman ([email protected]) -* Copyright (c) 2001,2003 IBM Corp. +* Copyright (C) 2001,2003 Greg Kroah-Hartman ([email protected]) +* Copyright (C) 2001,2003 IBM Corp. * * All rights reserved. *
ChangeSet 1.1285, 2003/09/11 14:27:15-07:00, [email protected]
[PATCH] PCI: make new_id rely on CONFIG_HOTPLUG
Quoted 2 lines
Quoted 2 lines
These either need to be marked
__devinitand make "new_id" dependant onCONFIG_HOTPLUG
Patch below moves all the new_id code under CONFIG_HOTPLUG. Tested with both CONFIG_HOTPLUG enabled and disabled. No significant code changes, merely code moving, and in 2 cases, stub functions added.
drivers/pci/pci-driver.c | 301 +++++++++++++++++++++++++---------------------- 1 files changed, 162 insertions(+), 139 deletions(-)
drivers/pci/pci-driver.c +162 -139
@@ -35,6 +35,166 @@return NULL ; } +/* +* Dynamic device IDs are disabled for !CONFIG_HOTPLUG +*/ + +#ifdef CONFIG_HOTPLUG +/** +* pci_device_probe_dynamic() +* +* Walk the dynamic ID list looking for a match. +* returns 0 and sets pci_dev->driver when drv claims pci_dev, else error. +*/ +static int +pci_device_probe_dynamic (struct pci_driver *drv,struct pci_dev *pci_dev) +{ +int error = -ENODEV ; +struct list_head *pos; +struct dynid *dynid; + +spin_lock (&drv->dynids.lock); +list_for_each (pos, &drv->dynids.list) { + dynid = list_entry(pos, struct dynid, node); +if (pci_match_one_device (&dynid->id, pci_dev)) { +spin_unlock (&drv->dynids.lock); + error = drv->probe (pci_dev, &dynid->id); +if (error >=0 ) { + pci_dev->driver = drv; +return 0 ; + } +return error; + } + } +spin_unlock (&drv->dynids.lock); +return error; +} +static inline void +dynid_init (struct dynid *dynid) +{ +memset (dynid,0 ,sizeof (*dynid)); +INIT_LIST_HEAD (&dynid->node); +} + +/** +* store_new_id +* @ pdrv +* @ buf +* @ count +* +* Adds a new dynamic pci device ID to this driver, +* and causes the driver to probe for all devices again. +*/ +static inline ssize_t +store_new_id (struct device_driver * driver,const char * buf,size_t count) +{ +struct dynid *dynid; +struct bus_type * bus; +struct pci_driver *pdrv =to_pci_driver (driver); +__u32 vendor=PCI_ANY_ID , device=PCI_ANY_ID , subvendor=PCI_ANY_ID , + subdevice=PCI_ANY_ID , class=0 , class_mask=0 ; +unsigned long driver_data=0 ; +int fields=0 ; + + fields =sscanf (buf,"%x %x %x %x %x %x %lux" , + &vendor, &device, &subvendor, &subdevice, + &class, &class_mask, &driver_data); +if (fields <0 ) +return -EINVAL ; + + dynid =kmalloc (sizeof (*dynid),GFP_KERNEL ); +if (!dynid) +return -ENOMEM ; +dynid_init (dynid); + + dynid->id.vendor = vendor; + dynid->id.device = device; + dynid->id.subvendor = subvendor; + dynid->id.subdevice = subdevice; + dynid->id.class = class; + dynid->id.class_mask = class_mask; + dynid->id.driver_data = pdrv->dynids.use_driver_data ? + driver_data :0UL ; + +spin_lock (&pdrv->dynids.lock); +list_add_tail (&pdrv->dynids.list, &dynid->node); +spin_unlock (&pdrv->dynids.lock); + + bus =get_bus (pdrv->driver.bus); +if (bus) { +if (get_driver (&pdrv->driver)) { +down_write (&bus->subsys.rwsem); +driver_attach (&pdrv->driver); +up_write (&bus->subsys.rwsem); +put_driver (&pdrv->driver); + } +put_bus (bus); + } + +return count; +} + +static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id); +static inline void +pci_init_dynids (struct pci_dynids *dynids) +{ +memset (dynids,0 ,sizeof (*dynids)); +spin_lock_init (&dynids->lock); +INIT_LIST_HEAD (&dynids->list); +} + +static void +pci_free_dynids (struct pci_driver *drv) +{ +struct list_head *pos, *n; +struct dynid *dynid; + +spin_lock (&drv->dynids.lock); +list_for_each_safe (pos, n, &drv->dynids.list) { + dynid = list_entry(pos, struct dynid, node); +list_del (&dynid->node); +kfree (dynid); + } +spin_unlock (&drv->dynids.lock); +} + +static int +pci_create_newid_file (struct pci_driver * drv) +{ +int error =0 ; +if (drv->probe !=NULL ) + error =sysfs_create_file (&drv->driver.kobj, + &driver_attr_new_id.attr); +return error; +} + +static int +pci_bus_match_dynids (const struct pci_dev * pci_dev,const struct pci_driver * pci_drv) +{ +struct list_head *pos; +struct dynid *dynid; + +spin_lock (&pci_drv->dynids.lock); +list_for_each (pos, &pci_drv->dynids.list) { + dynid = list_entry(pos, struct dynid, node); +if (pci_match_one_device (&dynid->id, pci_dev)) { +spin_unlock (&pci_drv->dynids.lock); +return 1 ; + } + } +spin_unlock (&pci_drv->dynids.lock); +return 0 ; +} + +#else /* !CONFIG_HOTPLUG */ +#define pci_device_probe_dynamic (drv,pci_dev) (-ENODEV) +#define dynid_init (dynid) do {} while (0) +#define pci_init_dynids (dynids) do {} while (0) +#define pci_free_dynids (drv) do {} while (0) +#define pci_create_newid_file (drv) (0) +#define pci_bus_match_dynids (pci_dev, pci_drv) (0) +#endif +/** * pci_match_device - Tell if a PCI device structure has a matching * PCI device id structure
@@ -80,36 +240,6 @@ }/** -* pci_device_probe_dynamic() -* -* Walk the dynamic ID list looking for a match. -* returns 0 and sets pci_dev->driver when drv claims pci_dev, else error. -*/ -static int -pci_device_probe_dynamic (struct pci_driver *drv,struct pci_dev *pci_dev) -{ -int error = -ENODEV ; -struct list_head *pos; -struct dynid *dynid; - -spin_lock (&drv->dynids.lock); -list_for_each (pos, &drv->dynids.list) { - dynid = list_entry(pos, struct dynid, node); -if (pci_match_one_device (&dynid->id, pci_dev)) { -spin_unlock (&drv->dynids.lock); - error = drv->probe (pci_dev, &dynid->id); -if (error >=0 ) { - pci_dev->driver = drv; -return 0 ; - } -return error; - } - } -spin_unlock (&drv->dynids.lock); -return error; -} - -/** * __pci_device_probe() * * returns 0 on success, else error.
@@ -178,72 +308,6 @@return 0 ; } -static inline void -dynid_init (struct dynid *dynid) -{ -memset (dynid,0 ,sizeof (*dynid)); -INIT_LIST_HEAD (&dynid->node); -} - -/** -* store_new_id -* @ pdrv -* @ buf -* @ count -* -* Adds a new dynamic pci device ID to this driver, -* and causes the driver to probe for all devices again. -*/ -static inline ssize_t -store_new_id (struct device_driver * driver,const char * buf,size_t count) -{ -struct dynid *dynid; -struct bus_type * bus; -struct pci_driver *pdrv =to_pci_driver (driver); -__u32 vendor=PCI_ANY_ID , device=PCI_ANY_ID , subvendor=PCI_ANY_ID , - subdevice=PCI_ANY_ID , class=0 , class_mask=0 ; -unsigned long driver_data=0 ; -int fields=0 ; - - fields =sscanf (buf,"%x %x %x %x %x %x %lux" , - &vendor, &device, &subvendor, &subdevice, - &class, &class_mask, &driver_data); -if (fields <0 ) -return -EINVAL ; - - dynid =kmalloc (sizeof (*dynid),GFP_KERNEL ); -if (!dynid) -return -ENOMEM ; -dynid_init (dynid); - - dynid->id.vendor = vendor; - dynid->id.device = device; - dynid->id.subvendor = subvendor; - dynid->id.subdevice = subdevice; - dynid->id.class = class; - dynid->id.class_mask = class_mask; - dynid->id.driver_data = pdrv->dynids.use_driver_data ? - driver_data :0UL ; - -spin_lock (&pdrv->dynids.lock); -list_add_tail (&pdrv->dynids.list, &dynid->node); -spin_unlock (&pdrv->dynids.lock); - - bus =get_bus (pdrv->driver.bus); -if (bus) { -if (get_driver (&pdrv->driver)) { -down_write (&bus->subsys.rwsem); -driver_attach (&pdrv->driver); -up_write (&bus->subsys.rwsem); -put_driver (&pdrv->driver); - } -put_bus (bus); - } - -return count; -} - -static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);#define kobj_to_pci_driver (obj) container_of(obj, struct device_driver, kobj)#define attr_to_driver_attribute (obj) container_of(obj, struct driver_attribute, attr)
@@ -290,38 +354,9 @@static int pci_populate_driver_dir (struct pci_driver * drv) { -int error =0 ; - -if (drv->probe !=NULL ) - error =sysfs_create_file (&drv->driver.kobj, - &driver_attr_new_id.attr); -return error; +return pci_create_newid_file (drv); } -static inline void -pci_init_dynids (struct pci_dynids *dynids) -{ -memset (dynids,0 ,sizeof (*dynids)); -spin_lock_init (&dynids->lock); -INIT_LIST_HEAD (&dynids->list); -} - -static void -pci_free_dynids (struct pci_driver *drv) -{ -struct list_head *pos, *n; -struct dynid *dynid; - -spin_lock (&drv->dynids.lock); -list_for_each_safe (pos, n, &drv->dynids.list) { - dynid = list_entry(pos, struct dynid, node); -list_del (&dynid->node); -kfree (dynid); - } -spin_unlock (&drv->dynids.lock); -} - -/** * pci_register_driver - register a new pci driver * @drv: the driver structure to register
@@ -411,8 +446,6 @@struct pci_driver * pci_drv =to_pci_driver (drv);const struct pci_device_id * ids = pci_drv->id_table;const struct pci_device_id *found_id; -struct list_head *pos; -struct dynid *dynid;if (!ids)return 0 ;
@@ -421,17 +454,7 @@if (found_id)return 1 ; -spin_lock (&pci_drv->dynids.lock); -list_for_each (pos, &pci_drv->dynids.list) { - dynid = list_entry(pos, struct dynid, node); -if (pci_match_one_device (&dynid->id, pci_dev)) { -spin_unlock (&pci_drv->dynids.lock); -return 1 ; - } - } -spin_unlock (&pci_drv->dynids.lock); - -return 0 ; +return pci_bus_match_dynids (pci_dev, pci_drv); }/**
ChangeSet 1.1286, 2003/09/11 14:36:33-07:00, [email protected]
[PATCH] PCI: remove compiler warning from previous new_id patch
Also change the #define functions into inline functions to help catch any future paramater mis-matches.
And clean up a few minor style issue...
drivers/pci/pci-driver.c | 33 ++++++++++++++++++++------------- 1 files changed, 20 insertions(+), 13 deletions(-)
drivers/pci/pci-driver.c +20 -13
@@ -69,6 +69,7 @@spin_unlock (&drv->dynids.lock);return error; } +static inline void dynid_init (struct dynid *dynid) {
@@ -78,15 +79,12 @@/** * store_new_id -* @ pdrv -* @ buf -* @ count * * Adds a new dynamic pci device ID to this driver, * and causes the driver to probe for all devices again. */ static inline ssize_t -store_new_id (struct device_driver * driver,const char * buf,size_t count) +store_new_id (struct device_driver *driver,const char *buf,size_t count) {struct dynid *dynid;struct bus_type * bus;
@@ -159,7 +157,7 @@ }static int -pci_create_newid_file (struct pci_driver * drv) +pci_create_newid_file (struct pci_driver *drv) {int error =0 ;if (drv->probe !=NULL )
@@ -169,7 +167,7 @@ }static int -pci_bus_match_dynids (const struct pci_dev * pci_dev,const struct pci_driver * pci_drv) +pci_bus_match_dynids (const struct pci_dev *pci_dev,struct pci_driver *pci_drv) {struct list_head *pos;struct dynid *dynid;
@@ -187,12 +185,21 @@ }#else /* !CONFIG_HOTPLUG */ -#define pci_device_probe_dynamic (drv,pci_dev) (-ENODEV) -#define dynid_init (dynid) do {} while (0) -#define pci_init_dynids (dynids) do {} while (0) -#define pci_free_dynids (drv) do {} while (0) -#define pci_create_newid_file (drv) (0) -#define pci_bus_match_dynids (pci_dev, pci_drv) (0) +static inline int pci_device_probe_dynamic (struct pci_driver *drv,struct pci_dev *pci_dev) +{ +return -ENODEV ; +} +static inline void dynid_init (struct dynid *dynid) {} +static inline void pci_init_dynids (struct pci_dynids *dynids) {} +static inline void pci_free_dynids (struct pci_driver *drv) {} +static inline int pci_create_newid_file (struct pci_driver *drv) +{ +return 0 ; +} +static inline int pci_bus_match_dynids (const struct pci_dev *pci_dev,struct pci_driver *pci_drv) +{ +return 0 ; +}#endif /**
@@ -352,7 +359,7 @@ };static int -pci_populate_driver_dir (struct pci_driver * drv) +pci_populate_driver_dir (struct pci_driver *drv) {return pci_create_newid_file (drv); }
ChangeSet 1.1287, 2003/09/11 15:46:20-07:00, [email protected]
PCI: fix up some pci drivers that had marked their probe functions with __init
This also required some other functions and variables to be marked as __devinit
drivers/atm/firestream.c | 18 +++++++++--------- drivers/block/cciss.c | 4 ++-- drivers/char/epca.c | 2 +- drivers/char/watchdog/wdt_pci.c | 2 +- drivers/net/hamachi.c | 6 +++--- drivers/net/irda/via-ircc.c | 6 +++--- drivers/net/tc35815.c | 4 ++-- drivers/net/tokenring/abyss.c | 4 ++-- drivers/net/tokenring/tmspci.c | 4 ++-- drivers/net/tulip/de2104x.c | 4 ++-- drivers/net/tulip/de4x5.c | 8 ++++---- drivers/net/wan/dscc4.c | 2 +- drivers/pcmcia/i82092.c | 2 +- drivers/video/i810/i810_main.c | 20 ++++++++++---------- drivers/video/i810/i810_main.h | 4 ++-- drivers/video/riva/fbdev.c | 4 ++-- 16 files changed, 47 insertions(+), 47 deletions(-)
drivers/atm/firestream.c +9 -9
@@ -250,7 +250,7 @@ }; -struct reginit_item PHY_NTC_INIT []__initdata = { +struct reginit_item PHY_NTC_INIT []__devinitdata = { {PHY_CLEARALL ,0x40 }, {0x12 ,0x0001 }, {0x13 ,0x7605 },
@@ -1296,7 +1296,7 @@ }; -static void __init undocumented_pci_fix (struct pci_dev *pdev) +static void __devinit undocumented_pci_fix (struct pci_dev *pdev) {int tint;
@@ -1320,13 +1320,13 @@* PHY routines * **************************************************************************/ -static void __init write_phy (struct fs_dev *dev,int regnum,int val) +static void __devinit write_phy (struct fs_dev *dev,int regnum,int val) {submit_command (dev, &dev->hp_txq,QE_CMD_PRP_WR |QE_CMD_IMM_INQ , regnum, val,0 ); } -static int __init init_phy (struct fs_dev *dev,struct reginit_item *reginit) +static int __devinit init_phy (struct fs_dev *dev,struct reginit_item *reginit) {int i;
@@ -1382,7 +1382,7 @@ } } -static void __init *aligned_kmalloc (int size,int flags,int alignment) +static void __devinit *aligned_kmalloc (int size,int flags,int alignment) {void *t;
@@ -1399,7 +1399,7 @@return NULL ; } -static int __init init_q (struct fs_dev *dev, +static int __devinit init_q (struct fs_dev *dev,struct queue *txq,int queue,int nentries,int is_rq) {int sz = nentries *sizeof (struct FS_QENTRY );
@@ -1435,7 +1435,7 @@ } -static int __init init_fp (struct fs_dev *dev, +static int __devinit init_fp (struct fs_dev *dev,struct freepool *fp,int queue,int bufsize,int nr_buffers) {func_enter ();
@@ -1655,7 +1655,7 @@ }#endif -static int __init fs_init (struct fs_dev *dev) +static int __devinit fs_init (struct fs_dev *dev) {struct pci_dev *pci_dev;int isr, to;
@@ -1890,7 +1890,7 @@return 0 ; } -static int __init firestream_init_one (struct pci_dev *pci_dev, +static int __devinit firestream_init_one (struct pci_dev *pci_dev,const struct pci_device_id *ent) {struct atm_dev *atm_dev;
drivers/block/cciss.c +2 -2
@@ -243,7 +243,7 @@* Get us a file in /proc/cciss that says something about each controller. * Create /proc/cciss if it doesn't exist yet. */ -static void __init cciss_procinit (int i) +static void __devinit cciss_procinit (int i) {struct proc_dir_entry *pde;
@@ -2427,7 +2427,7 @@* stealing all these major device numbers. * returns the number of block devices registered. */ -static int __init cciss_init_one (struct pci_dev *pdev, +static int __devinit cciss_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {request_queue_t *q;
drivers/char/epca.c +1 -1
@@ -3868,7 +3868,7 @@ }; -static int __init epca_init_one (struct pci_dev *pdev, +static int __devinit epca_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {static int board_num =-1 ;
drivers/char/watchdog/wdt_pci.c +1 -1
@@ -505,7 +505,7 @@ }; -static int __init wdtpci_init_one (struct pci_dev *dev, +static int __devinit wdtpci_init_one (struct pci_dev *dev,const struct pci_device_id *ent) {static int dev_count =0 ;
drivers/net/hamachi.c +3 -3
@@ -178,7 +178,7 @@#include <asm/unaligned.h> #include <asm/cache.h> -static char version[]__initdata = +static char version[]__devinitdata = KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker\n"KERN_INFO " Some modifications by Eric kasten <[email protected]>\n" KERN_INFO " Further modifications by Keith Underwood <[email protected]>\n" ;
@@ -569,7 +569,7 @@static void set_rx_mode (struct net_device *dev); -static int __init hamachi_init_one (struct pci_dev *pdev, +static int __devinit hamachi_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {struct hamachi_private *hmp;
@@ -794,7 +794,7 @@return ret; } -static int __init read_eeprom (long ioaddr,int location) +static int __devinit read_eeprom (long ioaddr,int location) {int bogus_cnt =1000 ;
drivers/net/irda/via-ircc.c +3 -3
@@ -107,7 +107,7 @@void hwreset (struct via_ircc_cb *self);static int via_ircc_dma_xmit (struct via_ircc_cb *self,u16 iobase);static int upload_rxdata (struct via_ircc_cb *self,int iobase); -static int __init via_init_one (struct pci_dev *pcidev,const struct pci_device_id *id); +static int __devinit via_init_one (struct pci_dev *pcidev,const struct pci_device_id *id); static void __exit via_remove_one (struct pci_dev *pdev);/* Should use udelay() instead, even if we are x86 only - Jean II */
@@ -168,7 +168,7 @@ } -static int __init via_init_one (struct pci_dev *pcidev,const struct pci_device_id *id) +static int __devinit via_init_one (struct pci_dev *pcidev,const struct pci_device_id *id) {int rc;u8 temp,oldPCI_40,oldPCI_44,bTmp,bTmp1;
@@ -326,7 +326,7 @@* Open driver instance * */ -static __init int via_ircc_open (int i,chipio_t * info,unsigned int id) +static __devinit int via_ircc_open (int i,chipio_t * info,unsigned int id) {struct net_device *dev;struct via_ircc_cb *self;
drivers/net/tc35815.c +2 -2
@@ -448,7 +448,7 @@/* Index to functions, as function prototypes. */ -static int __init tc35815_probe1 (struct pci_dev *pdev,unsigned int base_addr,unsigned int irq); +static int __devinit tc35815_probe1 (struct pci_dev *pdev,unsigned int base_addr,unsigned int irq);static int tc35815_open (struct net_device *dev);static int tc35815_send_packet (struct sk_buff *skb,struct net_device *dev);
@@ -526,7 +526,7 @@return -ENODEV ; } -static int __init tc35815_probe1 (struct pci_dev *pdev,unsigned int base_addr,unsigned int irq) +static int __devinit tc35815_probe1 (struct pci_dev *pdev,unsigned int base_addr,unsigned int irq) {static unsigned version_printed =0 ;int i;
drivers/net/tokenring/abyss.c +2 -2
@@ -40,7 +40,7 @@#include "tms380tr.h" #include "abyss.h" /* Madge-specific constants */ -static char version[]__initdata = +static char version[]__devinitdata ="abyss.c: v1.02 23/11/2000 by Adam Fritzler\n" ;#define ABYSS_IO_EXTENT 64
@@ -92,7 +92,7 @@outw (val, dev->base_addr + reg); } -static int __init abyss_attach (struct pci_dev *pdev,const struct pci_device_id *ent) +static int __devinit abyss_attach (struct pci_dev *pdev,const struct pci_device_id *ent) {static int versionprinted;struct net_device *dev;
drivers/net/tokenring/tmspci.c +2 -2
@@ -40,7 +40,7 @@#include "tms380tr.h" -static char version[]__initdata = +static char version[]__devinitdata ="tmspci.c: v1.02 23/11/2000 by Adam Fritzler\n" ;#define TMS_PCI_IO_EXTENT 32
@@ -91,7 +91,7 @@outw (val, dev->base_addr + reg); } -static int __init tms_pci_attach (struct pci_dev *pdev,const struct pci_device_id *ent) +static int __devinit tms_pci_attach (struct pci_dev *pdev,const struct pci_device_id *ent) {static int versionprinted;struct net_device *dev;
drivers/net/tulip/de2104x.c +2 -2
@@ -50,7 +50,7 @@#include <asm/unaligned.h> /* These identify the driver base version and may not be removed. */ -static char version[]__initdata = +static char version[] = KERN_INFO DRV_NAME " PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")\n";MODULE_AUTHOR ("Jeff Garzik <[email protected]>" );
@@ -1932,7 +1932,7 @@ goto fill_defaults; } -static int __init de_init_one (struct pci_dev *pdev, +static int __devinit de_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {struct net_device *dev;
drivers/net/tulip/de4x5.c +4 -4
@@ -480,7 +480,7 @@#include "de4x5.h" -static char version[]__initdata ="de4x5.c:V0.546 2001/02/22 [email protected]\n" ; +static char version[]__devinitdata ="de4x5.c:V0.546 2001/02/22 [email protected]\n" ;#define c_char const char#define TWIDDLE (a) (u_short)le16_to_cpu(get_unaligned((u_short *)(a)))
@@ -1082,7 +1082,7 @@ } -static int __init +static int __devinit de4x5_hw_init (struct net_device *dev,u_long iobase,struct device *gendev) {char name[DE4X5_NAME_LENGTH +1 ];
@@ -2132,7 +2132,7 @@** DECchips, we can find the base SROM irrespective of the BIOS scan direction. ** For single port cards this is a time waster... */ -static void __init +static void __devinit srom_search (struct net_device *dev,struct pci_dev *pdev) {u_char pb;
@@ -2213,7 +2213,7 @@** kernels use the V0.535[n] drivers. */ -static int __init de4x5_pci_probe (struct pci_dev *pdev, +static int __devinit de4x5_pci_probe (struct pci_dev *pdev,const struct pci_device_id *ent) {u_char pb, pbus =0 , dev_num, dnum =0 , timer;
drivers/net/wan/dscc4.c +1 -1
@@ -693,7 +693,7 @@kfree (ppriv); } -static int __init dscc4_init_one (struct pci_dev *pdev, +static int __devinit dscc4_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {struct dscc4_pci_priv *priv;
drivers/pcmcia/i82092.c +1 -1
@@ -92,7 +92,7 @@static int socket_count;/* shortcut */ -static int __init i82092aa_pci_probe (struct pci_dev *dev,const struct pci_device_id *id) +static int __devinit i82092aa_pci_probe (struct pci_dev *dev,const struct pci_device_id *id) {unsigned char configbyte;int i, ret;
drivers/video/i810/i810_main.c +10 -10
@@ -57,7 +57,7 @@#include "i810_main.h" /* PCI */ -static const char *i810_pci_list[]__initdata = { +static const char *i810_pci_list[]__devinitdata = {"Intel(R) 810 Framebuffer Device" ,"Intel(R) 810-DC100 Framebuffer Device" ,"Intel(R) 810E Framebuffer Device" ,
@@ -1456,7 +1456,7 @@return 0 ; } -static struct fb_ops i810fb_ops__initdata = { +static struct fb_ops i810fb_ops__devinitdata = { .owner =THIS_MODULE , .fb_open = i810fb_open, .fb_release = i810fb_release,
@@ -1538,7 +1538,7 @@* AGP resource allocation * ***********************************************************************/ -static void __init i810_fix_pointers (struct i810fb_par *par) +static void __devinit i810_fix_pointers (struct i810fb_par *par) { par->fb.physical = par->aperture.physical+(par->fb.offset <<12 ); par->fb.virtual = par->aperture.virtual+(par->fb.offset <<12 );
@@ -1550,7 +1550,7 @@ (par->cursor_heap.offset <<12 ); } -static void __init i810_fix_offsets (struct i810fb_par *par) +static void __devinit i810_fix_offsets (struct i810fb_par *par) {if (vram +1 > par->aperture.size >>20 ) vram = (par->aperture.size >>20 ) -1 ;
@@ -1570,7 +1570,7 @@ par->cursor_heap.size =4096 ; } -static int __init i810_alloc_agp_mem (struct fb_info *info) +static int __devinit i810_alloc_agp_mem (struct fb_info *info) {struct i810fb_par *par = (struct i810fb_par *) info->par;int size;
@@ -1635,7 +1635,7 @@* Sets the the user monitor's horizontal and vertical * frequency limits */ -static void __init i810_init_monspecs (struct fb_info *info) +static void __devinit i810_init_monspecs (struct fb_info *info) {if (!hsync1) hsync1 =HFMIN ;
@@ -1663,7 +1663,7 @@* @par: pointer to i810fb_par structure * @info: pointer to current fb_info structure */ -static void __init i810_init_defaults (struct i810fb_par *par, +static void __devinit i810_init_defaults (struct i810fb_par *par,struct fb_info *info) {if (voffset)
@@ -1707,7 +1707,7 @@* i810_init_device - initialize device * @par: pointer to i810fb_par structure */ -static void __init i810_init_device (struct i810fb_par *par) +static void __devinit i810_init_device (struct i810fb_par *par) {u8 reg, *mmio = par->mmio_start_virtual;
@@ -1726,7 +1726,7 @@ par->mem_freq = (reg) ?133 :100 ; } -static int __init +static int __devinit i810_allocate_pci_resource (struct i810fb_par *par,const struct pci_device_id *entry) {
@@ -1831,7 +1831,7 @@return 0 ; } -static int __init i810fb_init_pci (struct pci_dev *dev, +static int __devinit i810fb_init_pci (struct pci_dev *dev,const struct pci_device_id *entry) {struct fb_info *info;
drivers/video/i810/i810_main.h +2 -2
@@ -14,7 +14,7 @@#ifndef __I810_MAIN_H__#define __I810_MAIN_H__ -static int __init i810fb_init_pci (struct pci_dev *dev, +static int __devinit i810fb_init_pci (struct pci_dev *dev,const struct pci_device_id *entry); static void __exit i810fb_remove_pci(struct pci_dev *dev);static int i810fb_resume (struct pci_dev *dev);
@@ -95,7 +95,7 @@#ifdef CONFIG_MTRR #define KERNEL_HAS_MTRR 1 -static inline void __init set_mtrr (struct i810fb_par *par) +static inline void __devinit set_mtrr (struct i810fb_par *par) { par->mtrr_reg =mtrr_add ((u32 ) par->aperture.physical, par->aperture.size,MTRR_TYPE_WRCOMB ,1 );
drivers/video/riva/fbdev.c +2 -2
@@ -1576,7 +1576,7 @@ .fb_sync = rivafb_sync, }; -static int __init riva_set_fbinfo (struct fb_info *info) +static int __devinit riva_set_fbinfo (struct fb_info *info) {struct riva_par *par = (struct riva_par *) info->par;unsigned int cmap_len;
@@ -1726,7 +1726,7 @@* * ------------------------------------------------------------------------- */ -static int __init rivafb_probe (struct pci_dev *pd, +static int __devinit rivafb_probe (struct pci_dev *pd,const struct pci_device_id *ent) {struct riva_chip_info *rci = &riva_chip_info[ent->driver_data];