hey cathy, thanks for looking into this some. i'm following up on it and it seems like multiple bugs in devfs. once i figure out exactly what's going on i'll get some bugs filed on the issue. thanks ed
On Wed, Feb 27, 2008 at 06:56:06PM +0800, Cathy Zhou wrote: > > >>I had another look. Ed said that the rtls device used to be rtls0 and now > >>it is changed to rtls1. Therefore, the rtls1 in the softmac_hash is > >>expected. > >> > >>Then the question becomes, why the following check in > >>softmac_hold_device() > >>succeeded? > >> > >> if ((dip = ddi_hold_devi_by_instance(getmajor(dev), ppa, 0)) == NULL) > >> return (ENOENT); > >> > > > >a fine question! but it's one that i am not going to be able to answer > >before going to bed. ;) > > > Using mdb, I found the dip returned by the above call is indeed the dip of > rtls1: > > [0]> d31e8e28::print struct dev_info devi_binding_name devi_instance > devi_ops > devi_binding_name = 0xd31edcfd "pci10ec,8139" > devi_instance = 0x1 > devi_ops = rtls`rtls_dev_ops > > But somehow calling ddi_hold_devi_by_instance(<major_of_rtls>, 0, 0) > returns that dip, I believe that went through the code path: > > ddi_hold_devi_by_instance()->hold_devi()->e_ddi_majorinstance_to_path() > ->e_ddi_instance_majorinstance_to_path() > > which in turn calls: > > /* look for the instance threaded off major */ > dnp = &devnamesp[major]; > for (dp = dnp->dn_inlist; dp != NULL; dp = dp->ind_next) > if (dp->ind_instance == inst) > break; > > Note that in the dnp list: > > [0]> d26c1d18::print struct devnames dn_name dn_inlist > dn_name = 0xd2460628 "rtls" > dn_inlist = 0xd24683a0 > [0]> 0xd24683a0::print in_drv_t ind_instance ind_node > ind_instance = 0 <----- > ind_node = 0xd244bb70 > [0]> 0xd244bb70::print in_node_t in_node_name > in_node_name = 0xd244bb88 "pci10ec,0" > > I am not sure why ind_instance is not 1 at this point. > > Thanks > - Cathy > > >
