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