ERROR: Removing 'pci2': Device or resource busy
yashoda
devika_n_30 at yahoo.com
Thu Sep 17 10:49:15 UTC 2009
I tried to find a similar querry on google, but it didn't help me....
i have written a kernel module for a PCI card. After compiling (make) it
successfully, i insmoded the module.
Now it doesnt rmmod.....n dispays the error
ERROR: Removing 'pci2': Device or resource busy
on dmesg, it gives
*********************************************************************************************************************************
6>DevicePCI: cleanup
sum BUG error<0>------------[ cut here ]------------
kernel BUG at /home/fedora/Desktop/pci_drive/pci2.c:80!
invalid opcode: 0000 [#1] SMP
last sysfs file:
/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host4/target4:0:0/4:0:0:0/evt_media_change
Modules linked in: pci2(P-) vfat fat usb_storage fuse ipt_MASQUERADE
iptable_nat nf_nat sco bridge stp llc bnep l2cap bluetooth sunrpc
ip6t_REJECT nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6
cpufreq_ondemand acpi_cpufreq dm_multipath uinput snd_hda_codec_realtek
snd_hda_intel snd_hda_codec ppdev snd_hwdep snd_pcm snd_timer iTCO_wdt snd
iTCO_vendor_support e100 soundcore mii i2c_i801 snd_page_alloc pcspkr
parport_pc parport ata_generic pata_acpi i915 drm i2c_algo_bit i2c_core
video output [last unloaded: scsi_wait_scan]
Pid: 3832, comm: rmmod Tainted: P (2.6.29.4-167.fc11.i686.PAE #1)
EIP: 0060:[<f847e0ec>] EFLAGS: 00010246 CPU: 0
EIP is at remove_pci+0x1c/0x20 [pci2]
EAX: f847e134 EBX: f6af5800 ECX: f6af585c EDX: 0127d000
ESI: f847e708 EDI: f6af58e8 EBP: e6d13ed8 ESP: e6d13ed8
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
Process rmmod (pid: 3832, ti=e6d12000 task=edd5cbc0 task.ti=e6d12000)
Stack:
e6d13ee4 c0572f54 f6af585c e6d13ef4 c05eee10 f847e708 f6af585c e6d13f08
c05eeea4 f847e708 c08a40f0 00000000 e6d13f1c c05ee3ee 00000000 f847e708
00000880 e6d13f2c c05ef271 f847e6d8 f847e708 e6d13f44 c0573132 e6d13f44
Call Trace:
[<c0572f54>] ? pci_device_remove+0x1e/0x3e
[<c05eee10>] ? __device_release_driver+0x53/0x70
[<c05eeea4>] ? driver_detach+0x77/0x9b
[<c05ee3ee>] ? bus_remove_driver+0x68/0x84
[<c05ef271>] ? driver_unregister+0x2d/0x31
[<c0573132>] ? pci_unregister_driver+0x32/0x6d
[<f847e10c>] ? pci_cleanup+0x1c/0x1f [pci2]
[<c0456839>] ? sys_delete_module+0x17b/0x1cd
[<c0494cc1>] ? remove_vma+0x5a/0x60
[<c046c416>] ? audit_syscall_entry+0x163/0x185
[<c040945f>] ? sysenter_do_call+0x12/0x34
Code: c8 31 c0 59 8d 65 f4 5b 5e 5f 5d c3 90 90 90 55 89 e5 e8 8c bd f8 c7
83 b8 00 01 00 00 00 75 0b 68 34 e1 47 f8 e8 e8 6a 29 c8 58 <0f> 0b eb fe 55
89 e5 e8 6c bd f8 c7 68 6c e1 47 f8 e8 d1 6a 29
EIP: [<f847e0ec>] remove_pci+0x1c/0x20 [pci2] SS:ESP 0068:e6d13ed8
---[ end trace 2248c42203ac08c8 ]---
*************************************************************************************************************************************
line 80 of the driver program is
iounmap(ioaddr);
and the entire driver program is
***********************************************************************************************************************************
// Linux PCI device driver
#define OUR_PCI_VENDER_ID 0x10b5
#define OUR_PCI_DEVICE_ID 0x9054
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
static struct pci_device_id our_pci_id_tb[] = {
{ OUR_PCI_VENDER_ID, OUR_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0
},
{ 0, }
};
MODULE_DEVICE_TABLE (pci, our_pci_id_tb);
int init_module_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
unsigned long mmio_start, mmio_end, mmio_len, mmio_flags;
void *ioaddr;
pdev = pci_find_device(OUR_PCI_VENDER_ID, OUR_PCI_DEVICE_ID, NULL);
if(pdev)
{
printk ("<1> yipeee.....device found !!!\n");
if(pci_enable_device(pdev))
printk("<1>Could not enable the device\n");
else printk("Device enabled\n");
}
else
printk("device not found\n");
//pdev = probe_for_device();
if(!pdev)
return 0;
mmio_start = pci_resource_start(pdev, 2);
mmio_end = pci_resource_end(pdev, 2);
mmio_len = pci_resource_len(pdev, 2);
mmio_flags = pci_resource_flags(pdev, 2);
if(pci_request_regions(pdev, "pci_device"))
{
printk("Could not get PCI region\n");
return 0;
//goto cleanup1;
}
ioaddr = ioremap(mmio_start, mmio_len);
printk("<1> The ioaddr is %x", ioaddr);
if(!ioaddr)
{
printk("Could not ioremap\n");
return 0;
//goto cleanup2;
}
printk("<1> ioaddress obtained");
// register the device
// pci_register_driver(&our_pci_driver);
return 0;
}
static void __devexit remove_pci(struct pci_dev *pdev)
{ void *ioaddr;
struct device *dev = pci_get_drvdata(pdev);
if (!dev)
printk("<1> sum BUG error");
BUG();
iounmap(ioaddr);
//unregister_netdev(dev);
pci_release_regions(pdev);
//free_netdev(dev);
pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL);
}
static struct pci_driver our_pci_driver = {
.name = "pci_device",
.probe = init_module_probe,
.remove = __devexit_p(remove_pci),
.id_table = our_pci_id_tb,
};
static int __init pci_init(void)
{
printk(KERN_INFO "DevicePCI: init\n");
return pci_register_driver(&our_pci_driver);
}
static void __exit pci_cleanup(void)
{
printk(KERN_INFO "DevicePCI: cleanup\n");
pci_unregister_driver(&our_pci_driver);
}
module_init(pci_init);
module_exit(pci_cleanup);
**************************************************************************************************************************************
On using insmod, the dmesg output was
*******************************************************
DevicePCI: init
yipeee.....device found !!!
pci_device 0000:05:00.0: PCI INT A -> GSI 21 (level, low) -> IRQ 21
Device enabled
The ioaddr is f9400000<1> ioaddress obtained
*******************************************************
Can anyone help me out ??
--
View this message in context: http://n2.nabble.com/ERROR-Removing-pci2-Device-or-resource-busy-tp3662279p3662279.html
Sent from the fedora mailing list archive at Nabble.com.
More information about the users
mailing list