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.


/* 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] <[EMAIL PROTECTED]> wrote:
>
> Garrett D'Amore wrote:
> > On Tue, 2007-09-11 at 17:47 +0200, [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
driver-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/driver-discuss

Reply via email to