aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2500pci.c
diff options
context:
space:
mode:
authorGertjan van Wingerde <gwingerde@gmail.com>2011-04-18 09:32:13 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-19 15:39:45 -0400
commite01ae27f8ce6bd3ee26ef33c704f62449ce8233b (patch)
tree28c022b0e755e244e4834f741d2bfce600606624 /drivers/net/wireless/rt2x00/rt2500pci.c
parentce2919c9fffe2aa52f9c3e327176d03764dbf9b5 (diff)
rt2x00: Allow dynamic addition of PCI/USB IDs.
Both USB and PCI drivers allow a system administrator to dynamically add USB/PCI IDs to the device table that a driver supports via the /sys/bus/{usb,pci,pci_express}/drivers/<driver-name>/new_id files. However, for the rt2x00 drivers using this method currently crashes the system with a NULL pointer failure. This is due to the set-up of rt2x00 where the probe functions require a rt2x00_ops structure in the driver_info field of the probed device. As this field is empty for the dynamically added devices this fails for these devices. Fix this by introducing driver-specific probe wrappers that do nothing but calling the bus-specific probe functions with the rt2x00_ops structure as an argument, rather than depending on the driver_info field. Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500pci.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index c8deeeb9d812..15f5649e2cae 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -2095,7 +2095,7 @@ static const struct rt2x00_ops rt2500pci_ops = {
2095 * RT2500pci module information. 2095 * RT2500pci module information.
2096 */ 2096 */
2097static DEFINE_PCI_DEVICE_TABLE(rt2500pci_device_table) = { 2097static DEFINE_PCI_DEVICE_TABLE(rt2500pci_device_table) = {
2098 { PCI_DEVICE(0x1814, 0x0201), PCI_DEVICE_DATA(&rt2500pci_ops) }, 2098 { PCI_DEVICE(0x1814, 0x0201) },
2099 { 0, } 2099 { 0, }
2100}; 2100};
2101 2101
@@ -2106,10 +2106,16 @@ MODULE_SUPPORTED_DEVICE("Ralink RT2560 PCI & PCMCIA chipset based cards");
2106MODULE_DEVICE_TABLE(pci, rt2500pci_device_table); 2106MODULE_DEVICE_TABLE(pci, rt2500pci_device_table);
2107MODULE_LICENSE("GPL"); 2107MODULE_LICENSE("GPL");
2108 2108
2109static int rt2500pci_probe(struct pci_dev *pci_dev,
2110 const struct pci_device_id *id)
2111{
2112 return rt2x00pci_probe(pci_dev, &rt2500pci_ops);
2113}
2114
2109static struct pci_driver rt2500pci_driver = { 2115static struct pci_driver rt2500pci_driver = {
2110 .name = KBUILD_MODNAME, 2116 .name = KBUILD_MODNAME,
2111 .id_table = rt2500pci_device_table, 2117 .id_table = rt2500pci_device_table,
2112 .probe = rt2x00pci_probe, 2118 .probe = rt2500pci_probe,
2113 .remove = __devexit_p(rt2x00pci_remove), 2119 .remove = __devexit_p(rt2x00pci_remove),
2114 .suspend = rt2x00pci_suspend, 2120 .suspend = rt2x00pci_suspend,
2115 .resume = rt2x00pci_resume, 2121 .resume = rt2x00pci_resume,