>> 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