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

Reply via email to