Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 05 Sep 2000 17:56:28 CST
From:      "bsdnewbie bsdnewbie" <bsdnewbie@hotmail.com>
To:        freebsd-scsi@FreeBSD.org
Subject:   _Problem of KLD
Message-ID:  <F241KSKVyqIyxJBU8v200004c1d@hotmail.com>

next in thread | raw e-mail | index | archive | help
I write a driver for a pci scsi card.  In order to make my driver easy for 
debugging, I write it as a loadable module.  But it can not work well, so I 
compile it into kernel and things get better.  The problem is: why the 
loadable module can not work as it compiled in to the kernel. (described as 
follows:)

I write my program by referring "aic7xxx.c"
My program:

/*
* Attach all the sub-devices we can find
*/
int
foo_attach(struct foo_softc *foo) {
         ...
     bus_setup_intr(...);
     devq = cam_simq_alloc(SCB_MAX);
     sim = cam_sim_alloc(foo_action, foo_poll, "foo",
                         foo, foo->unit,
		       1, SCB_MAX, devq);
     xpt_bus_register(sim, bus_id);
     xpt_create_path(&path, /*periph*/NULL,
		    cam_sim_path(sim), CAM_TARGET_WILDCARD,
		    CAM_LUN_WILDCARD);
         ...
}

1) When I use "kldload foo.ko", the function foo_action will be called with 
the "ccb->ccb_h.func_code == XPT_PATH_INQ" only one time.   And no function 
will be called by system any more.

2) When I compile this module into kernel, the function foo_action will be 
called with the func_code in order:
     XPT_PATH_INQ
     XPT_PATH_INQ
     XPT_PATH_INQ
     XPT_RESET_BUS
     XPT_PATH_INQ
     XPT_PATH_INQ
     XPT_PATH_INQ
     XPT_SCSI_IO



detail log of situation 1:
/kernel: foo: -> foo_pci_attach
/kernel: foo: <-> foo_setup
/kernel: foo: <-> foo_alloc
/kernel: foo: <-> foo_reset
/kernel: foo: <-> foo_init
/kernel: foo: -> foo_attach
/kernel: (noperiph:foo0:0:-1:-1): xpt_compile_path
/kernel: (noperiph:foo0:0:-1:-1): xpt_setup_ccb
/kernel: (noperiph:foo0:0:-1:-1): xpt_action
/kernel: foo: -> foo_action
/kernel: (noperiph:foo0:0:-1:-1): foo_action
/kernel: foo: XPT_PATH_INQ
/kernel: (noperiph:foo0:0:-1:-1): xpt_done
/kernel: foo: <- foo_action
/kernel: (xpt0:xpt0:0:-1:-1): xpt_async
/kernel: (noperiph:foo0:0:-1:-1): xpt_release_path
/kernel: (noperiph:foo0:0:-1:-1): xpt_compile_path
/kernel: (noperiph:foo0:0:-1:-1): xpt_setup_ccb
/kernel: (noperiph:foo0:0:-1:-1): xpt_action
/kernel: foo: <- foo_attach
/kernel: foo: <- foo_pci_attach

detail log of 2: (displayed by dmesg)
Copyright (c) 1992-2000 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD 4.1-RELEASE #4: Tue Sep  5 15:27:11 CST 2000
    bsdnewbie@TPA.MyHome.com:/usr/src/sys/compile/NEW2
Timecounter "i8254"  frequency 1193182 Hz
CPU: Pentium III/Pentium III Xeon/Celeron (666.45-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0x683  Stepping = 3
  
Features=0x383f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PA
T,PSE36,MMX,FXSR,XMM>
real memory  = 134217728 (131072K bytes)
config> di pcic0
config> di sn0
config> di lnc0
config> di le0
config> di ie0
config> di fe0
config> di cs0
config> di bt0
config> di aic0
config> di aha0
config> di adv0
config> q
avail memory = 126468096 (123504K bytes)
Preloaded elf kernel "kernel" at 0xc03fd000.
Preloaded userconfig_script "/boot/kernel.conf" at 0xc03fd09c.
Pentium Pro MTRR support enabled
md0: Malloc disk
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib2: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on 
pci0
pci1: <PCI bus> on pcib2
pci1: <NVidia Riva Ultra Vanta TNT2 graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C596B PCI-ISA bridge> at device 7.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <VIA 82C596B ATA66 controller> port 0xd000-0xd00f at device 7.1 on 
pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0: <VIA 83C572 USB controller> port 0xd400-0xd41f irq 10 at device 7.2 
on pc
i0
usb0: <VIA 83C572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
uhub0: port 1 power on failed, IOERROR
uhub0: port 2 power on failed, IOERROR
xl0: <3Com 3c905B-TX Fast Etherlink XL> port 0xd800-0xd87f mem 
0xea020000-0xea02
007f irq 12 at device 10.0 on pci0
xl0: Ethernet address: 00:10:5a:75:79:6a
miibus0: <MII bus> on xl0
xlphy0: <3Com internal media interface> on miibus0
xlphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
foo0: <my_foo_dev> port 
0xec00-0xec3f,0xe800-0xe803,0xe400-0xe407,0xe000-0xe003
,0xdc00-0xdc07 mem 0xea000000-0xea01ffff irq 9 at device 11.0 on pci0
foo: -> foo_pci_attach
foo: <-> foo_setup
foo: <-> foo_alloc
foo: <-> foo_reset
foo: <-> foo_init
foo: -> foo_attach
foo: -> foo_action
foo: XPT_PATH_INQ
foo: <- foo_action
foo: <- foo_attach
foo: <- foo_pci_attach
pcib1: <Host to PCI bridge> on motherboard
pci2: <PCI bus> on pcib1
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: Generic chipset (NIBBLE-only) in COMPATIBLE mode
ppi0: <Parallel I/O> on ppbus0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
plip0: <PLIP network interface> on ppbus0
ad0: 14649MB <IBM-DTLA-307015> [29765/16/63] at ata0-master using UDMA66
acd0: CDROM <ATAPI CD-ROM DRIVE 40X MAXIMUM> at ata1-master using PIO4
(noperiph:foo0:0:-1:-1): xpt_compile_path
(noperiph:foo0:0:-1:-1): xpt_setup_ccb
(noperiph:foo0:0:-1:-1): xpt_action
foo: -> foo_action
(noperiph:foo0:0:-1:-1): foo_action
foo: XPT_PATH_INQ
(noperiph:foo0:0:-1:-1): xpt_done
foo: <- foo_action
(noperiph:foo0:0:-1:-1): xpt_release_path
Waiting 15 seconds for SCSI devices to settle
(xpt0:foo0:0:-1:-1): xpt_compile_path
(xpt0:foo0:0:-1:-1): xpt_setup_ccb
(xpt0:foo0:0:-1:-1): xpt_action
foo: -> foo_action
(xpt0:foo0:0:-1:-1): foo_action
foo: XPT_PATH_INQ
(xpt0:foo0:0:-1:-1): xpt_done
foo: <- foo_action
(xpt0:foo0:0:-1:-1): xpt_setup_ccb
(xpt0:foo0:0:-1:-1): xpt_action
foo: -> foo_action
(xpt0:foo0:0:-1:-1): foo_action
foo: XPT_RESET_BUS
foo: <-> foo_reset
(xpt0:foo0:0:-1:-1): xpt_done
foo: <- foo_action
(xpt0:foo0:0:-1:-1): xpt_finishconfig
(xpt0:foo0:0:-1:-1): xpt_action
(xpt0:foo0:0:-1:-1): xpt_scan_bus
(xpt0:foo0:0:-1:-1): xpt_setup_ccb
(xpt0:foo0:0:-1:-1): xpt_action
foo: -> foo_action
(xpt0:foo0:0:-1:-1): foo_action
foo: XPT_PATH_INQ
(xpt0:foo0:0:-1:-1): xpt_done
foo: <- foo_action
(xpt0:foo0:0:1:0): xpt_compile_path
(xpt0:foo0:0:1:0): xpt_setup_ccb
(xpt0:foo0:0:1:0): xpt_action
(xpt0:foo0:0:1:0): xpt_scan_lun
(xpt0:foo0:0:1:0): xpt_setup_ccb
(xpt0:foo0:0:1:0): xpt_action
foo: -> foo_action
(xpt0:foo0:0:1:0): foo_action
foo: XPT_PATH_INQ
(xpt0:foo0:0:1:0): xpt_done
foo: <- foo_action
(probe0:foo0:0:1:0): xpt_compile_path
(probe0:foo0:0:1:0): xpt_setup_ccb
(probe0:foo0:0:1:0): xpt_action
(probe0:foo0:0:1:0): xpt_setup_ccb
(probe0:foo0:0:1:0): xpt_action
(probe0:foo0:0:1:0): xpt_setup_ccb
(probe0:foo0:0:1:0): xpt_action
foo: -> foo_action
(probe0:foo0:0:1:0): foo_action
foo: XPT_PATH_INQ
(probe0:foo0:0:1:0): xpt_done
foo: <- foo_action
(probe0:foo0:0:1:0): xpt_schedule
(probe0:foo0:0:1:0): xpt_setup_ccb
(probe0:foo0:0:1:0): probestart
(probe0:foo0:0:1:0): xpt_action
(probe0:foo0:0:1:0): . CDB: 12 0 0 0 24 0
foo: -> foo_action
(probe0:foo0:0:1:0): foo_action
foo: XPT_SCSI_IO
(probe0:foo0:0:1:0): xpt_done
foo: <- foo_action
(probe0:foo0:0:1:0): camisr(probe0:foo0:0:1:0): probedone
(xpt0:foo0:0:1:0): xpt_done
(probe0:foo0:0:1:0): xpt_free_path
(probe0:foo0:0:1:0): xpt_release_path
(xpt0:foo0:0:1:0): camisr(xpt0:foo0:0:1:0): xpt_scan_bus
(xpt0:foo0:0:1:0): xpt_setup_ccb
(xpt0:foo0:0:1:0): xpt_action
(xpt0:foo0:0:1:0): xpt_free_path
(xpt0:foo0:0:1:0): xpt_release_path
(xpt0:foo0:0:-1:-1): xpt_done
(xpt0:foo0:0:-1:-1): camisr(xpt0:foo0:0:-1:-1): xpt_finishconfig
(xpt0:foo0:0:-1:-1): xpt_free_path
(xpt0:foo0:0:-1:-1): xpt_release_path
(noperiph:xpt0:0:-1:-1): xpt_compile_path
(noperiph:xpt0:0:-1:-1): xpt_setup_ccb
(noperiph:xpt0:0:-1:-1): xpt_action
(noperiph:xpt0:0:-1:-1): xpt_free_path
(noperiph:xpt0:0:-1:-1): xpt_release_path
(noperiph:xpt0:0:-1:-1): xpt_compile_path
(noperiph:xpt0:0:-1:-1): xpt_setup_ccb
(noperiph:xpt0:0:-1:-1): xpt_action
(noperiph:xpt0:0:-1:-1): xpt_free_path
(noperiph:xpt0:0:-1:-1): xpt_release_path
(noperiph:xpt0:0:-1:-1): xpt_compile_path
(noperiph:xpt0:0:-1:-1): xpt_setup_ccb
(noperiph:xpt0:0:-1:-1): xpt_action
(noperiph:xpt0:0:-1:-1): xpt_free_path
(noperiph:xpt0:0:-1:-1): xpt_release_path
(noperiph:xpt0:0:-1:-1): xpt_compile_path
(noperiph:xpt0:0:-1:-1): xpt_setup_ccb
(noperiph:xpt0:0:-1:-1): xpt_action
(noperiph:xpt0:0:-1:-1): xpt_free_path
(noperiph:xpt0:0:-1:-1): xpt_release_path
Mounting root from ufs:/dev/ad0s2a


I wanna to know why 1) and 2) runs in different way?  How can I made 1) run 
just as that of 2)?  I notice that in the source code of FreeBSD 4.1, aha is 
writen as a loadable module while ahc is writen to compiled into the kernel, 
why?

Thanks in Advance,

Best Regards,
bsdnewbie
Sep 5, 2k


_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.

Share information about yourself, create your own public profile at 
http://profiles.msn.com.



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-scsi" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F241KSKVyqIyxJBU8v200004c1d>