I've got a testdriver.conf which looks like this (one line)
# cat testdriver.conf
name="testdriver" parent="pseudo" instance=0;
#
-rw-r--r-- 1 root sys 8364 Sep 11 14:46 testdriver
-rw-r--r-- 1 root sys 46 Sep 11 14:36 testdriver.conf
# pwd
/usr/kernel/drv
I also appended the following line to /etc/devlink.tab:
type=ddi_pseudo;name=testdriver \M0
Still doesn't work.
-Daniel
On 9/11/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
> Daniel Corbe wrote:
> > I found my problem, it was with the way I was declaring modldrv, I had
> > the last struct member set to NULL instead of a valid and initialized
> > dev_ops struct.
> >
> > So now the driver loads without crashing the kernel.
> >
> > # add_drv -m '* 0644 root sys' testdriver
> > devfsadm: driver failed to attach: testdriver
> > Warning: Driver (testdriver) successfully added to system but failed
> > to attach
> >
> > It looks as if my attach procedure isn't even being called.
> >
> >
> Your driver is for a pseudo device? If so, you need a driver.conf
> file. Otherwise, the system
> loads your driver, decides there are no devices that the driver drives,
> and then unloads it.
> See pseudo(4) and driver.conf(4) for a description of the driver.conf
> file (yours should be
> something like testdriver.conf. Also, you'll need to rem_drv before
> add_drv again.
>
> max
>
> > /* Attach and detatch a device */
> >
> > int testdriver_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
> >
> > {
> >
> > int result = DDI_FAILURE;
> >
> > cmn_err(CE_WARN, "ATTACHING!!");
> >
> > ddi_create_minor_node(dip, "testdriver", S_IFCHR, 1, NULL, 0);
> >
> > result = DDI_SUCCESS;
> >
> > return(result);
> >
> > }
> >
> >
> > and these are the relevant structs
> >
> >
> >
> > /* Character device specific stuff */
> >
> > static struct cb_ops cb_testdriver_ops =
> >
> > {
> >
> > nodev,
> > /* cb_open */
> >
> > nodev,
> > /* cb_close */
> >
> > nodev,
> > /* cb_strategy */
> >
> > nodev,
> > /* cb_print */
> >
> > nodev,
> > /* cb_dump */
> >
> > nodev,
> > /* cb_read */
> >
> > nodev,
> > /* cb_write */
> >
> > nodev,
> > /* cb_ioctl */
> >
> > nodev,
> > /* cb_devmap */
> >
> > nodev,
> > /* cb_mmap */
> >
> > nodev,
> > /* cb_segmap */
> >
> > nochpoll,
> > /* cb_chpoll */
> >
> > ddi_prop_op, /* cb_prop_op */
> >
> > &testdriver_strtab, /* cb_stream */
> >
> > (D_NEW | D_MP | D_MTPERMOD) /* cb_flag */
> >
> > };
> >
> >
> > static struct dev_ops testdriver_ops =
> >
> > {
> >
> > DEVO_REV, /* devo_rev */
> >
> > 0 , /* devo_refcnt */
> >
> > nodev,
> > /* devo_getinfo */
> >
> > nodev,
> > /* devo_identify */
> >
> > nodev,
> > /* devo_probe */
> >
> > testdriver_attach, /* devo_attach */
> >
> > testdriver_detach, /* devo_detach */
> >
> > nodev,
> > /* devo_reset */
> >
> > &cb_testdriver_ops, /* devo_cb_ops */
> >
> > (struct bus_ops *)NULL /* devo_bus_ops */
> >
> > };
> >
> >
> > /* Module specific (kernel linkage for the kernel*/
> >
> > static struct modldrv modldrv =
> >
> > {
> >
> > &mod_driverops,
> >
> > "testdriver" ,
> >
> > &testdriver_ops
> >
> > };
> >
> >
> > static struct modlinkage modlinkage =
> >
> > {
> >
> > MODREV_1,
> >
> > &modldrv,
> >
> > NULL
> >
> > };
> >
> >
> >
> > SO what am I doing wrong now?
> >
> >
> > -Daniel
> >
> >
> >
> >
> > On 9/11/07, [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>*
> > <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > wrote:
> >
> > Garrett D'Amore wrote:
> > > On Tue, 2007-09-11 at 17:47 +0200, [EMAIL PROTECTED]
> > <mailto:[EMAIL PROTECTED]> wrote:
> > >
> > >> Garrett D'Amore wrote:
> > >>
> > >>> On Tue, 2007-09-11 at 10:22 -0400, Daniel Corbe wrote:
> > >>>
> > >>>
> > >>>> You guys are extremely patient with answering these
> > questions, thank
> > >>>> you.
> > >>>>
> > >>>>
> > >>>> I've run into another issue.
> > >>>>
> > >>>>
> > >>>> Running add_drv causes my system to reboot. I assume it's
> > something
> > >>>> I'm doing wrong. I figured it had something to do with
> > either the
> > >>>> attach or getinfo procedures in my driver, and in fact the
> > getinfo
> > >>>> procedure is using an uninitialized pointer.
> > >>>>
> > >>>>
> > >>> I don't think getinfo() is the problem... its more likely to be
> > >>> attach(). (getinfo() is normally only called as part of Dynamic
> > >>> Reconfiguration operation, IIRC.)
> > >>>
> > >>> -- Garrett
> > >>>
> > >>>
> > >> Actually, getinfo() is called twice on open(2). Try
> > >>
> > >> # dtrace -n 'pts_devinfo:entry{stack();}'
> > >>
> > >> and then open a new terminal window. The pts_devinfo() routine
> > is the
> > >> getinfo for the pseudo terminal slave
> > >> driver (also a streams driver).
> > >>
> > >
> > > Is that true for all drivers, or just clone devices? I confess
> > I've not
> > > looked at getinfo() much lately.. most of the NIC drivers these
> days
> > > don't need a getinfo(), since they use qassociate() to provide the
> > > mapping between dev_info_t and streams.
> > >
> > > -- Garrett
> > >
> > Yes. True for all drivers that use cb_ops. See getinfo(9e) and
> > ddi_no_info(9f). And
> > I thought pts was cloned, but glancing at the source code, I guess
> > not!?
> >
> > max
> >
> >
> >
> >
> >
>
>
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss