Som, Unfortunately, Less document introduce relevant content.
As I mentioned .conf node is different to persistent node. You mixed .conf nodes and persistent nodes. I cannot remember what kind of problem I met during my development, but that do cause problem during handle hotplug. If the device offline, ndi_devi_offline with NDI_REMOVE flag should be called, but the node should be a persistent node which is allocated by ndi_devi_alloc(). .conf node is not allocated by ndi_devi_alloc(), I am guess it would cause problem. On the other hands, iSCSI initiator driver should be a self identify/auto-enumeration driver like FC driver. You should enumerate devices without replying on sd.conf. I am working on a new driver class named "scsi-self-identify" which means the driver will enumerate targets by HBA driver itself without the help of .conf file. Since you async report devices as persistent node, you need keep all nodes are consistent. I haven't saw any driver mix .conf node and persistent node. BTW, did you figure out the boot panic problem? Cheers Javen Somnath kotur wrote: >Hi Javen, > Thanks a lot for your help,But I still do not >understand the semantics and exactly why we need to do >all that ? Especially since i am registering my HBA >driver as a class 'scsi' ,so as of now whenever i do >an iscsi login /logout all i do is call >ndi_devi_alloc/ndi_devi_online and a >devfs_clean/ndi_devi_offline respectively and this >works fine for me . I do NOT understand where/how >exactly it might just break > > >Could you pls explain or point me to some relevant >documentation ? > >Thanks >Som >--- Javen Wu <[EMAIL PROTECTED]> wrote: > > > >>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 >>> >>> >>> >=== 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