Author: mav
Date: Mon Oct  5 08:33:41 2015
New Revision: 288716
URL: https://svnweb.freebsd.org/changeset/base/288716

Log:
  MFC r285510:
  Switch initiator IDs in target mode to the same address space as target
  IDs in initiator mode -- index in port database instead of handlers.
  
  This makes initiator IDs persist across role changes and firmware resets,
  when handlers previously assigned by firmware are lost and reused.

Modified:
  stable/10/sys/dev/isp/isp_freebsd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/isp/isp_freebsd.c
==============================================================================
--- stable/10/sys/dev/isp/isp_freebsd.c Mon Oct  5 08:32:34 2015        
(r288715)
+++ stable/10/sys/dev/isp/isp_freebsd.c Mon Oct  5 08:33:41 2015        
(r288716)
@@ -1898,10 +1898,10 @@ isp_target_start_ctio(ispsoftc_t *isp, u
                        cto->ct_header.rqs_entry_count = 1;
                        cto->ct_header.rqs_seqno |= ATPD_SEQ_NOTIFY_CAM;
                        ATPD_SET_SEQNO(cto, atp);
-                       if (ISP_CAP_2KLOGIN(isp) == 0) {
-                               ((ct2e_entry_t *)cto)->ct_iid = cso->init_id;
+                       if (ISP_CAP_2KLOGIN(isp)) {
+                               ((ct2e_entry_t *)cto)->ct_iid = atp->nphdl;
                        } else {
-                               cto->ct_iid = cso->init_id;
+                               cto->ct_iid = atp->nphdl;
                                if (ISP_CAP_SCCFW(isp) == 0) {
                                        cto->ct_lun = ccb->ccb_h.target_lun;
                                }
@@ -2441,28 +2441,24 @@ isp_handle_platform_atio2(ispsoftc_t *is
         * We don't get 'suggested' sense data as we do with SCSI cards.
         */
        atiop->sense_len = 0;
-       if (ISP_CAP_2KLOGIN(isp)) {
-               /*
-                * NB: We could not possibly have 2K logins if we
-                * NB: also did not have SCC FW.
-                */
-               atiop->init_id = ((at2e_entry_t *)aep)->at_iid;
-       } else {
-               atiop->init_id = aep->at_iid;
-       }
 
        /*
         * If we're not in the port database, add ourselves.
         */
-       if (!IS_2100(isp) &&
-           (isp_find_pdb_by_handle(isp, 0, atiop->init_id, &lp) == 0 ||
-            lp->state == FC_PORTDB_STATE_ZOMBIE)) {
-               uint64_t iid =
-                       (((uint64_t) aep->at_wwpn[0]) << 48) |
-                       (((uint64_t) aep->at_wwpn[1]) << 32) |
-                       (((uint64_t) aep->at_wwpn[2]) << 16) |
-                       (((uint64_t) aep->at_wwpn[3]) <<  0);
-               isp_add_wwn_entry(isp, 0, iid, atiop->init_id, PORT_ANY, 0);
+       if (IS_2100(isp))
+               atiop->init_id = nphdl;
+       else {
+               if ((isp_find_pdb_by_handle(isp, 0, nphdl, &lp) == 0 ||
+                    lp->state == FC_PORTDB_STATE_ZOMBIE)) {
+                       uint64_t iid =
+                               (((uint64_t) aep->at_wwpn[0]) << 48) |
+                               (((uint64_t) aep->at_wwpn[1]) << 32) |
+                               (((uint64_t) aep->at_wwpn[2]) << 16) |
+                               (((uint64_t) aep->at_wwpn[3]) <<  0);
+                       isp_add_wwn_entry(isp, 0, iid, nphdl, PORT_ANY, 0);
+                       isp_find_pdb_by_handle(isp, 0, nphdl, &lp);
+               }
+               atiop->init_id = FC_PORTDB_TGT(isp, 0, lp);
        }
        atiop->cdb_len = ATIO2_CDBLEN;
        ISP_MEMCPY(atiop->cdb_io.cdb_bytes, aep->at_cdb, ATIO2_CDBLEN);
@@ -2491,7 +2487,7 @@ isp_handle_platform_atio2(ispsoftc_t *is
        atp->orig_datalen = aep->at_datalen;
        atp->bytes_xfered = 0;
        atp->lun = lun;
-       atp->nphdl = atiop->init_id;
+       atp->nphdl = nphdl;
        atp->sid = PORT_ANY;
        atp->oxid = aep->at_oxid;
        atp->cdb0 = aep->at_cdb[0];
@@ -2520,7 +2516,6 @@ isp_handle_platform_atio7(ispsoftc_t *is
        int cdbxlen;
        uint16_t lun, chan, nphdl = NIL_HANDLE;
        uint32_t did, sid;
-       uint64_t wwn = INI_NONE;
        fcportdb_t *lp;
        tstate_t *tptr;
        struct ccb_accept_tio *atiop;
@@ -2588,7 +2583,6 @@ isp_handle_platform_atio7(ispsoftc_t *is
                return;
        }
        nphdl = lp->handle;
-       wwn = lp->port_wwn;
 
        /*
         * Get the tstate pointer
@@ -2676,7 +2670,7 @@ isp_handle_platform_atio7(ispsoftc_t *is
        SLIST_REMOVE_HEAD(&tptr->atios, sim_links.sle);
        tptr->atio_count--;
        ISP_PATH_PRT(isp, ISP_LOGTDEBUG2, atiop->ccb_h.path, "Take FREE ATIO 
count now %d\n", tptr->atio_count);
-       atiop->init_id = nphdl;
+       atiop->init_id = FC_PORTDB_TGT(isp, chan, lp);
        atiop->ccb_h.target_id = FCPARAM(isp, chan)->isp_loopid;
        atiop->ccb_h.target_lun = lun;
        atiop->sense_len = 0;
@@ -3090,7 +3084,7 @@ isp_handle_platform_notify_fc(ispsoftc_t
        {
                tstate_t *tptr;
                uint16_t lun;
-               uint32_t loopid;
+               uint32_t loopid, sid;
                uint64_t wwn;
                atio_private_data_t *atp;
                fcportdb_t *lp;
@@ -3108,8 +3102,10 @@ isp_handle_platform_notify_fc(ispsoftc_t
                }
                if (isp_find_pdb_by_handle(isp, 0, loopid, &lp)) {
                        wwn = lp->port_wwn;
+                       sid = lp->portid;
                } else {
                        wwn = INI_ANY;
+                       sid = PORT_ANY;
                }
                tptr = get_lun_statep(isp, 0, lun);
                if (tptr == NULL) {
@@ -3141,7 +3137,7 @@ isp_handle_platform_notify_fc(ispsoftc_t
                        nt->nt_tgt = FCPARAM(isp, 0)->isp_wwpn;
                        nt->nt_wwn = wwn;
                        nt->nt_nphdl = loopid;
-                       nt->nt_sid = PORT_ANY;
+                       nt->nt_sid = sid;
                        nt->nt_did = PORT_ANY;
                        nt->nt_lun = lun;
                        nt->nt_need_ack = 1;
@@ -3453,10 +3449,11 @@ isp_handle_platform_target_tmf(ispsoftc_
                goto bad;
        }
 
-       if (isp_find_pdb_by_sid(isp, notify->nt_channel, notify->nt_sid, &lp) 
== 0) {
+       if (isp_find_pdb_by_sid(isp, notify->nt_channel, notify->nt_sid, &lp) 
== 0 &&
+           isp_find_pdb_by_handle(isp, notify->nt_channel, notify->nt_nphdl, 
&lp) == 0) {
                inot->initiator_id = CAM_TARGET_WILDCARD;
        } else {
-               inot->initiator_id = lp->handle;
+               inot->initiator_id = FC_PORTDB_TGT(isp, notify->nt_channel, lp);
        }
        inot->seq_id = notify->nt_tagval;
        inot->tag_id = notify->nt_tagval >> 32;
@@ -4666,7 +4663,7 @@ isp_gdt_task(void *arg, int pending)
                        adc = (struct ac_device_changed *) ac.contract_data;
                        adc->wwpn = lp->port_wwn;
                        adc->port = lp->portid;
-                       adc->target = lp->handle;
+                       adc->target = dbidx;
                        adc->arrived = 0;
                        xpt_async(AC_CONTRACT, fc->path, &ac);
                }
@@ -4753,7 +4750,7 @@ isp_ldt_task(void *arg, int pending)
                        adc = (struct ac_device_changed *) ac.contract_data;
                        adc->wwpn = lp->port_wwn;
                        adc->port = lp->portid;
-                       adc->target = lp->handle;
+                       adc->target = dbidx;
                        adc->arrived = 0;
                        xpt_async(AC_CONTRACT, fc->path, &ac);
                }
@@ -5757,7 +5754,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cm
                        adc = (struct ac_device_changed *) ac.contract_data;
                        adc->wwpn = lp->port_wwn;
                        adc->port = lp->portid;
-                       adc->target = lp->handle;
+                       adc->target = tgt;
                        adc->arrived = 1;
                        xpt_async(AC_CONTRACT, fc->path, &ac);
                }
@@ -5792,7 +5789,7 @@ changed:
                        adc = (struct ac_device_changed *) ac.contract_data;
                        adc->wwpn = lp->port_wwn;
                        adc->port = lp->portid;
-                       adc->target = lp->handle;
+                       adc->target = tgt;
                        adc->arrived = lp->is_initiator;
                        xpt_async(AC_CONTRACT, fc->path, &ac);
                }
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to