Hi Som,

Actually, your tran_bus_config() should allocate/online immediate 
children as persistent node before you call
ndi_busos_bus_config(). In one world, you have to use 
ndi_devi_alloc/ndi_devi_online to online all immediate children as well.
I believe your HBA is able to discover the specific target existence or 
all attached targets by some vendor specific method.
Once HBA detect targets, you use ndi_devi_alloc() and ndi_devi_online() 
to configure your devices.

Please refer to my below pseudo code:

myxx_tran_bus_config(dev_info_t *parent, uint_t flags, 
ddi_bus_config_op_t op, void *arg, dev_info_t **childp)
{
    int ret = DDI_FAILURE;
    /*
     * get the softstate of your initiator
     */
    myxx_softstate = (myxx_softs *)ddi_get_soft_state(mpt_state,
        ddi_get_instance(parent));
    if (myxx_softstate == NULL) {
        return (NDI_FAILURE);
    }

    ndi_devi_enter(parent, &circ1);
    switch (op) {
    case BUS_CONFIG_ONE:
        /* parse target name out of name given */
        if ((ptr = strchr((char *)arg, '@')) == NULL) {
            ret = NDI_FAILURE;
            break;
        }
        /*
         * per the string to parse target and lun
         */
        myxx_parse_target_lun(prt, &target, lun&)
        ret = myxx_config_one(myxx_softstate, target,lun);
          break;
    case BUS_CONFIG_DRIVER:    
    case BUS_CONFIG_ALL:
        myxx_config_all(myxx_softstate);
        ret = DDI_SUCCESS;
        break;
    default:
        break; 
    }
    /*
     * Only when above configure success, then invoke ndi_busop
     */
    if (ret == NDI_SUCCESS) {
        ret = ndi_busop_bus_config(parent, flags,
            op, arg, childp, 0);
    ndi_devi_exit(parent, circ1);
}

int myxx_config_one(myxx_softs *myxx, int target, int lun, dev_info_t 
**childp) {
    /*
     * Check if the target+lun has already been in your internel list
     * if exist, just set childp pointer and return success, if failed 
go to next step
     * to configure
     */

     .....code for search internal list...
     if (find the node from internal list) {
          set childp
          return (NDI_SUCCESS);
     }
   
    /*
     * your discovery process to make sure the target is there
     */
     ....target discovery existence...
     or just scsi_hba_probe() to probe the target,lun

     if the target,lun exist we need configure the device
     ndi_devi_alloc()
     scsi_hba_nodename_compatible_get()
     if (ndi_prop_update_int(DDI_DEV_T_NONE,
            *lun_dip, TARGET_PROP, (int)target) !=
            DDI_PROP_SUCCESS) {
            ndi_rtn = NDI_FAILURE;
            goto error_handle;
     }

     if (ndi_prop_update_int(DDI_DEV_T_NONE,
            *lun_dip, LUN_PROP, lun) !=
            DDI_PROP_SUCCESS) {
            mpt_log(mpt, CE_WARN, "mpt driver unable to create "
                "property for target %d lun %d (LUN_PROP)",
                target, lun);
            ndi_rtn = NDI_FAILURE;
            goto error_handle;
     }

    ret = ndi_devi_online();
    if (ret ==NDI_SUCCESS)
        set the dip to childp;
    return (ret);
   
}

void myxx_config_all() {

    discovery all attached iSCSI targets
    for (each target) {
       issue REPORT_LUN to get LUNs
       for (each lun) {
       myxx_config_one();

       }
    }


Above is just a rough pseduo codes for configuration routine, hope it 
can help you.

BTW, I am not sure if you handle device offline, I mean when a iscsi 
target get gone, you can call ndi_devi_offline to offline the target 
devices.

Javen

Somnath kotur wrote:

>Hi Javen,
>       Yes that is right, atleast that is the only
>thing i could understand after looking at the src
>code,(esp the solaris iscsi initiator src) .So below
>is what i am doing in my tran_bus_config. 
>
>myxx_tran_bus_config(dev_info_t *parent, uint_t flags,
>    ddi_bus_config_op_t op, void *arg, dev_info_t
>**childp)
>{
>        return  ndi_busop_bus_config(parent, flags,
>                    op, arg, childp, 0);
>}
>
>I figured that the implementation of  BUS_CONFIG_ONE
>and BUS_CONFIG_ALL was more relevant to it ,because of
>the way it names its target(iqn way), i just use a
>targetID 
>
>
>On hotplug i do an ndi_devi_alloc ,update the
>target/lun props and online it 
>
>
>In my tran_tgt_init()  i do as below : 
>
> if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
>           
>            (void) ndi_merge_node(tgt_dip,
>scsi_name_child);
>            ddi_set_name_addr(tgt_dip, NULL);
>            return (DDI_FAILURE);
>        }
>// Then my driver scans through its internal list of
>available targets looking for the same targetnumber
>input via the  sd(struct scsi_device *) parameter and
>if found returns DDI_SUCCESS.
>
>
>So, pls let me know what i am doing wrong and if so
>,how to correct it. 
>
>Thanks
>Som
>
>
>
>--- Javen Wu <[EMAIL PROTECTED]> wrote:
>
>  
>
>>Hi Som,
>>
>> From you last email, I found another potential
>>problem which maybe 
>>irrelevant to your panic.
>>My understanding about your last email is that you
>>use 
>>ndi_busop_bus_configure() to enumerate the immediate
>>children, but for 
>>the target added into the system after the system
>>boot, you use 
>>ndi_devi_online(). In another words, You relies on
>>.conf files of target 
>>drivers(sd.conf, st.conf...) to enumerate iSCSI
>>targets during boot, but 
>>use ndi_devi_online handle hotplug. Is my
>>understanding correct? If my 
>>understanding is correct, that could cause the
>>attributes of dip 
>>nodes(dev_info_t) of your iSCSI targets in the
>>device tree are different.
>>You know, solaris has .conf node and persistent node
>>which are 
>>different. Persistent node was allocated by
>>ndi_devi_alloc() and onlined 
>>by ndi_devi_online(). But .conf nodes are different.
>>I guess according your implementation, the immediate
>>children are .conf 
>>nodes, however, the iSCSI targets reported
>>asynchronizly are persistent 
>>node which would cause endless problem.
>>Is it possible you show us how you implement
>>tran_bus_config() 
>>BUS_CONFIG_ONE & BUS_CONFIG_ALL?
>>How you name your iSCSI target? iqn name or small
>>digital targetID?
>>How you load your driver? What's your driver class?
>>
>>--javen
>>
>>
>>Somnath kotur wrote:
>>
>>    
>>
>>>Hi Javen,
>>>       Well, this is consistently reproducible
>>>exactly 50% of the time, i.e  * every other reboot
>>>      
>>>
>>*
>>    
>>
>>>... so im thinking that there must be some simple
>>>explanation to this ..like some setting ,prtconf
>>>output was OK ..im still looking on seeing the
>>>      
>>>
>>output
>>    
>>
>>>of tran_tgt_init and probe ..
>>>
>>>BTW i am indeed using ndi_devi_online when i want
>>>      
>>>
>>to
>>    
>>
>>>async report my targets online after an iscsi login
>>>      
>>>
>>to
>>    
>>
>>>a target 
>>>
>>>Thanks 
>>>Som
>>>
>>>--- Javen Wu <[EMAIL PROTECTED]> wrote:
>>>
>>>
>>>      
>>>
>>>>Hi Som,
>>>>
>>>>I met the same panic stack during configuration
>>>>failure in my driver. 
>>>>But I am not sure if your problem is exactly same
>>>>        
>>>>
>>as
>>    
>>
>>>>mine.
>>>>I am curious why it happens occasionally in your
>>>>case. But I think 
>>>>that's a start point
>>>>to position/debug the problem. Is it possible the
>>>>configure routine 
>>>>failed by some reason occasionally?
>>>>
>>>>I thought your implement dynamic enumeration by
>>>>calling ndi_devi_online 
>>>>previously, but it seems your driver is not.
>>>>
>>>>Anyway, I guess before panic in mount root, your
>>>>tran_bus_configure 
>>>>failed and return DDI_FAILURE.
>>>>You can verify my guess by watching the return
>>>>        
>>>>
>>value
>>    
>>
>>>>of your 
>>>>tran_bus_configure by kmdb.
>>>>
>>>>If my above guess is correct. So after you invoke 
>>>>ndi_busop_bus_configure(), please trace the return
>>>>value
>>>>of your tran_tgt_init() and tran_tgt_probe()
>>>>        
>>>>
>>routine
>>    
>>
>>>>and watch the 
>>>>return value. Most likely your
>>>>tran_tgt_probe() failed occasionally due to some
>>>>werid situation in my 
>>>>mind. If you didn't implement
>>>>tran_tgt_probe() routine by yourself, the SCSA
>>>>        
>>>>
>>will
>>    
>>
>>>>set scsi_hba_probe() 
>>>>as default. So you can trace the return
>>>>value of scsi_hba_probe().
>>>>
>>>>If scsi_hba_probe failed as well. That means at
>>>>least *this time*, your 
>>>>IO met some problem to send inquiry...So you can
>>>>        
>>>>
>>do
>>    
>>
>>>>deeper investigation.
>>>>
>>>>Cheers
>>>>Javen
>>>>
>>>>Somnath kotur wrote:
>>>>
>>>>
>>>>        
>>>>
>>>>>Javen,
>>>>>      Thank you once again, but one thing i do
>>>>>
>>>>>          
>>>>>
>>>>not
>>>>
>>>>        
>>>>
>>>>>understand is if that is the case,then why does
>>>>>          
>>>>>
>>it
>>    
>>
>>>>>boot fine after the reboot ,i mean everytime
>>>>>          
>>>>>
>>there
>>    
>>
>>>>is
>>>>
>>>>        
>>>>
>>>>>a panic ..the subsequent reboot that is initiated
>>>>>
>>>>>          
>>>>>
>>>>by
>>>>
>>>>        
>>>>
>>>>>it always leads to a succesful boot ..(reboot
>>>>>          
>>>>>
>>from
>>    
>>
>>>>>this stage again leads to a panic ..alternating) 
>>>>>
>>>>>my tran_bus_config() implementation just calls 
>>>>>ndi_busop_bus_config(parent, flags,op, arg,
>>>>>          
>>>>>
>>childp,
>>    
>>
>>>>0)
>>>>
>>>>        
>>>>
>>>>>=> passing down the rest of the args as it is
>>>>>
>>>>>          
>>>>>
>>>>..with
>>>>
>>>>        
>>>>
>>>>>timeout of 0, you think that should be changed?
>>>>>
>>>>>Thanks
>>>>>som
>>>>>
>>>>>
>>>>>
>>>>>--- Javen Wu <[EMAIL PROTECTED]> wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>          
>>>>>
>>>>>>During the boot phase, system would configure
>>>>>>            
>>>>>>
>>root
>>    
>>
>>>>>>device by 
>>>>>>BUS_CONFIG_ONE with the argument root device
>>>>>>            
>>>>>>
>>path.
>>    
>>
>>>>>>I don't know how you implement your
>>>>>>tran_bus_config() routine, but you 
>>>>>>can trace or debug your implementation of
>>>>>>tran_bus_config with 
>>>>>>BUS_CONFIG_ONE by kmdb. I think the panic could
>>>>>>            
>>>>>>
>>be
>>    
>>
>>>>>>caused by 
>>>>>>tran_bus_config failure during configuring root
>>>>>>device. Another way to 
>>>>>>prove the point is I guess you invoked
>>>>>>ndi_devi_online() in your 
>>>>>>tran_bus_config(), you can watch the return
>>>>>>            
>>>>>>
>>value
>>    
>>
>>>>of
>>>>
>>>>        
>>>>
>>>>>>ndi_devi_online() 
>>>>>>during boot by kmdb. I suppose you used x86
>>>>>>
>>>>>>            
>>>>>>
>>>>system,
>>>>
>>>>        
>>>>
>>>>>>%eax or %rax is the 
>>>>>>return value after you jump out the function by
>>>>>>
>>>>>>            
>>>>>>
>>>>":u"
>>>>
>>>>        
>>>>
>>>>>>command in kmdb.
>>>>>>
>>>>>>Javen
>>>>>>
>>>>>>
>>>>>>Javen Wu wrote:
>>>>>>
>>>>>>  
>>>>>>
>>>>>>            
>>>>>>
>=== message truncated ===
>
>
>
>      
> ____________________________________________________________________________________
>Never miss a thing.  Make Yahoo your home page. 
>http://www.yahoo.com/r/hs
>  
>

_______________________________________________
driver-discuss mailing list
driver-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/driver-discuss

Reply via email to