14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner **
34e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
44e1bc9a0SAchim Leubner *
54e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
64e1bc9a0SAchim Leubner *that the following conditions are met:
74e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
84e1bc9a0SAchim Leubner *following disclaimer.
94e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
104e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
114e1bc9a0SAchim Leubner *with the distribution.
124e1bc9a0SAchim Leubner *
134e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
144e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
154e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
164e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
174e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
184e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
194e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
204e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
214e1bc9a0SAchim Leubner **
224e1bc9a0SAchim Leubner ********************************************************************************/
234e1bc9a0SAchim Leubner #include <sys/cdefs.h>
244e1bc9a0SAchim Leubner #include <dev/pms/config.h>
254e1bc9a0SAchim Leubner
264e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
274e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
284e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
294e1bc9a0SAchim Leubner
304e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/sa.h>
314e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
324e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
334e1bc9a0SAchim Leubner
344e1bc9a0SAchim Leubner #ifdef FDS_DM
354e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
364e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
374e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
384e1bc9a0SAchim Leubner
394e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmdefs.h>
404e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmtypes.h>
414e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmproto.h>
424e1bc9a0SAchim Leubner
434e1bc9a0SAchim Leubner /*****************************************************************************/
444e1bc9a0SAchim Leubner /*! \brief dmDiscover
454e1bc9a0SAchim Leubner *
464e1bc9a0SAchim Leubner *
474e1bc9a0SAchim Leubner * Purpose: A discovery is started by this function
484e1bc9a0SAchim Leubner *
494e1bc9a0SAchim Leubner * \param dmRoot: DM context handle.
504e1bc9a0SAchim Leubner * \param dmPortContext: Pointer to this instance of port context
514e1bc9a0SAchim Leubner * \param option: Discovery option
524e1bc9a0SAchim Leubner *
534e1bc9a0SAchim Leubner * \return:
544e1bc9a0SAchim Leubner * DM_RC_SUCCESS
554e1bc9a0SAchim Leubner * DM_RC_FAILURE
564e1bc9a0SAchim Leubner *
574e1bc9a0SAchim Leubner */
584e1bc9a0SAchim Leubner /*****************************************************************************/
594e1bc9a0SAchim Leubner osGLOBAL bit32
dmDiscover(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,bit32 option)604e1bc9a0SAchim Leubner dmDiscover(
614e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
624e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
634e1bc9a0SAchim Leubner bit32 option)
644e1bc9a0SAchim Leubner {
654e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
664e1bc9a0SAchim Leubner bit32 ret = DM_RC_FAILURE;
674e1bc9a0SAchim Leubner
684e1bc9a0SAchim Leubner DM_DBG3(("dmDiscover: start\n"));
694e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)dmPortContext->dmData;
704e1bc9a0SAchim Leubner
714e1bc9a0SAchim Leubner if (onePortContext == agNULL)
724e1bc9a0SAchim Leubner {
734e1bc9a0SAchim Leubner DM_DBG1(("dmDiscover: onePortContext is NULL!!!\n"));
744e1bc9a0SAchim Leubner return DM_RC_FAILURE;
754e1bc9a0SAchim Leubner }
764e1bc9a0SAchim Leubner
774e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
784e1bc9a0SAchim Leubner {
794e1bc9a0SAchim Leubner DM_DBG1(("dmDiscover: invalid port!!!\n"));
804e1bc9a0SAchim Leubner return DM_RC_FAILURE;
814e1bc9a0SAchim Leubner }
824e1bc9a0SAchim Leubner
834e1bc9a0SAchim Leubner if (onePortContext->RegFailed == agTRUE)
844e1bc9a0SAchim Leubner {
854e1bc9a0SAchim Leubner DM_DBG1(("dmDiscover: Registration failed!!!\n"));
864e1bc9a0SAchim Leubner return DM_RC_FAILURE;
874e1bc9a0SAchim Leubner }
884e1bc9a0SAchim Leubner
894e1bc9a0SAchim Leubner switch ( option )
904e1bc9a0SAchim Leubner {
914e1bc9a0SAchim Leubner case DM_DISCOVERY_OPTION_FULL_START:
924e1bc9a0SAchim Leubner DM_DBG3(("dmDiscover: full, pid %d\n", onePortContext->id));
934e1bc9a0SAchim Leubner onePortContext->discovery.type = DM_DISCOVERY_OPTION_FULL_START;
944e1bc9a0SAchim Leubner dmDiscoveryResetMCN(dmRoot, onePortContext);
954e1bc9a0SAchim Leubner ret = dmFullDiscover(dmRoot, onePortContext);
964e1bc9a0SAchim Leubner break;
974e1bc9a0SAchim Leubner case DM_DISCOVERY_OPTION_INCREMENTAL_START:
984e1bc9a0SAchim Leubner DM_DBG3(("dmDiscover: incremental, pid %d\n", onePortContext->id));
994e1bc9a0SAchim Leubner onePortContext->discovery.type = DM_DISCOVERY_OPTION_INCREMENTAL_START;
1004e1bc9a0SAchim Leubner dmDiscoveryResetMCN(dmRoot, onePortContext);
1014e1bc9a0SAchim Leubner ret = dmIncrementalDiscover(dmRoot, onePortContext, agFALSE);
1024e1bc9a0SAchim Leubner break;
1034e1bc9a0SAchim Leubner case DM_DISCOVERY_OPTION_ABORT:
1044e1bc9a0SAchim Leubner DM_DBG3(("dmDiscover: abort\n"));
1054e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState != DM_DSTATE_COMPLETED)
1064e1bc9a0SAchim Leubner {
1074e1bc9a0SAchim Leubner if (onePortContext->discovery.pendingSMP == 0)
1084e1bc9a0SAchim Leubner {
1094e1bc9a0SAchim Leubner dmDiscoverAbort(dmRoot, onePortContext);
1104e1bc9a0SAchim Leubner tddmDiscoverCB(
1114e1bc9a0SAchim Leubner dmRoot,
1124e1bc9a0SAchim Leubner onePortContext->dmPortContext,
1134e1bc9a0SAchim Leubner dmDiscAborted
1144e1bc9a0SAchim Leubner );
1154e1bc9a0SAchim Leubner }
1164e1bc9a0SAchim Leubner else
1174e1bc9a0SAchim Leubner {
1184e1bc9a0SAchim Leubner DM_DBG3(("dmDiscover: abortInProgress\n"));
1194e1bc9a0SAchim Leubner onePortContext->DiscoveryAbortInProgress = agTRUE;
1204e1bc9a0SAchim Leubner tddmDiscoverCB(
1214e1bc9a0SAchim Leubner dmRoot,
1224e1bc9a0SAchim Leubner dmPortContext,
1234e1bc9a0SAchim Leubner dmDiscAbortInProgress
1244e1bc9a0SAchim Leubner );
1254e1bc9a0SAchim Leubner }
1264e1bc9a0SAchim Leubner }
1274e1bc9a0SAchim Leubner else
1284e1bc9a0SAchim Leubner {
1294e1bc9a0SAchim Leubner DM_DBG3(("dmDiscover: no discovery to abort\n"));
1304e1bc9a0SAchim Leubner tddmDiscoverCB(
1314e1bc9a0SAchim Leubner dmRoot,
1324e1bc9a0SAchim Leubner dmPortContext,
1334e1bc9a0SAchim Leubner dmDiscAbortInvalid
1344e1bc9a0SAchim Leubner );
1354e1bc9a0SAchim Leubner }
1364e1bc9a0SAchim Leubner ret = DM_RC_SUCCESS;
1374e1bc9a0SAchim Leubner break;
1384e1bc9a0SAchim Leubner default:
1394e1bc9a0SAchim Leubner break;
1404e1bc9a0SAchim Leubner }
1414e1bc9a0SAchim Leubner return ret;
1424e1bc9a0SAchim Leubner }
1434e1bc9a0SAchim Leubner
1444e1bc9a0SAchim Leubner osGLOBAL bit32
dmFullDiscover(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)1454e1bc9a0SAchim Leubner dmFullDiscover(
1464e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
1474e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
1484e1bc9a0SAchim Leubner )
1494e1bc9a0SAchim Leubner {
1504e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
1514e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
1524e1bc9a0SAchim Leubner dmDeviceData_t *oneExpDeviceData = agNULL;
1534e1bc9a0SAchim Leubner
1544e1bc9a0SAchim Leubner DM_DBG1(("dmFullDiscover: start\n"));
1554e1bc9a0SAchim Leubner
1564e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
1574e1bc9a0SAchim Leubner {
1584e1bc9a0SAchim Leubner DM_DBG1(("dmFullDiscover: invalid port!!!\n"));
1594e1bc9a0SAchim Leubner return DM_RC_FAILURE;
1604e1bc9a0SAchim Leubner }
1614e1bc9a0SAchim Leubner
1624e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_STARTED)
1634e1bc9a0SAchim Leubner {
1644e1bc9a0SAchim Leubner DM_DBG1(("dmFullDiscover: no two instances of discovery allowed!!!\n"));
1654e1bc9a0SAchim Leubner return DM_RC_FAILURE;
1664e1bc9a0SAchim Leubner }
1674e1bc9a0SAchim Leubner
1684e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_STARTED;
1694e1bc9a0SAchim Leubner
1704e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = onePortContext->sasRemoteAddressHi;
1714e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = onePortContext->sasRemoteAddressLo;
1724e1bc9a0SAchim Leubner
1734e1bc9a0SAchim Leubner /* check OnePortContext->discovery.discoveringExpanderList */
1744e1bc9a0SAchim Leubner oneExpander = dmExpFind(dmRoot, onePortContext, dmSASSubID.sasAddressHi, dmSASSubID.sasAddressLo);
1754e1bc9a0SAchim Leubner if (oneExpander != agNULL)
1764e1bc9a0SAchim Leubner {
1774e1bc9a0SAchim Leubner oneExpDeviceData = oneExpander->dmDevice;
1784e1bc9a0SAchim Leubner }
1794e1bc9a0SAchim Leubner else
1804e1bc9a0SAchim Leubner {
1814e1bc9a0SAchim Leubner /* check dmAllShared->mainExpanderList */
1824e1bc9a0SAchim Leubner oneExpander = dmExpMainListFind(dmRoot, onePortContext, dmSASSubID.sasAddressHi, dmSASSubID.sasAddressLo);
1834e1bc9a0SAchim Leubner if (oneExpander != agNULL)
1844e1bc9a0SAchim Leubner {
1854e1bc9a0SAchim Leubner oneExpDeviceData = oneExpander->dmDevice;
1864e1bc9a0SAchim Leubner }
1874e1bc9a0SAchim Leubner }
1884e1bc9a0SAchim Leubner
1894e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
1904e1bc9a0SAchim Leubner {
1914e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = oneExpDeviceData->initiator_ssp_stp_smp;
1924e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = oneExpDeviceData->target_ssp_stp_smp;
1934e1bc9a0SAchim Leubner oneExpDeviceData->registered = agTRUE;
1944e1bc9a0SAchim Leubner dmAddSASToSharedcontext(dmRoot, onePortContext, &dmSASSubID, oneExpDeviceData, 0xFF);
1954e1bc9a0SAchim Leubner }
1964e1bc9a0SAchim Leubner else
1974e1bc9a0SAchim Leubner {
1984e1bc9a0SAchim Leubner DM_DBG1(("dmFullDiscover:oneExpDeviceData is NULL!!!\n"));
1994e1bc9a0SAchim Leubner return DM_RC_FAILURE;
2004e1bc9a0SAchim Leubner }
2014e1bc9a0SAchim Leubner
2024e1bc9a0SAchim Leubner dmUpStreamDiscoverStart(dmRoot, onePortContext);
2034e1bc9a0SAchim Leubner
2044e1bc9a0SAchim Leubner return DM_RC_SUCCESS;
2054e1bc9a0SAchim Leubner }
2064e1bc9a0SAchim Leubner
2074e1bc9a0SAchim Leubner osGLOBAL bit32
dmIncrementalDiscover(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 flag)2084e1bc9a0SAchim Leubner dmIncrementalDiscover(
2094e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
2104e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
2114e1bc9a0SAchim Leubner bit32 flag
2124e1bc9a0SAchim Leubner )
2134e1bc9a0SAchim Leubner {
2144e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
2154e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
2164e1bc9a0SAchim Leubner dmDeviceData_t *oneExpDeviceData = agNULL;
2174e1bc9a0SAchim Leubner
2184e1bc9a0SAchim Leubner DM_DBG1(("dmIncrementalDiscover: start\n"));
2194e1bc9a0SAchim Leubner
2204e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
2214e1bc9a0SAchim Leubner {
2224e1bc9a0SAchim Leubner DM_DBG1(("dmIncrementalDiscover: invalid port!!!\n"));
2234e1bc9a0SAchim Leubner return DM_RC_FAILURE;
2244e1bc9a0SAchim Leubner }
2254e1bc9a0SAchim Leubner
2264e1bc9a0SAchim Leubner /* TDM triggerred; let go DM triggerred */
2274e1bc9a0SAchim Leubner if (flag == agFALSE)
2284e1bc9a0SAchim Leubner {
2294e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_STARTED)
2304e1bc9a0SAchim Leubner {
2314e1bc9a0SAchim Leubner DM_DBG1(("dmIncrementalDiscover: no two instances of discovery allowed!!!\n"));
2324e1bc9a0SAchim Leubner return DM_RC_FAILURE;
2334e1bc9a0SAchim Leubner }
2344e1bc9a0SAchim Leubner }
2354e1bc9a0SAchim Leubner
2364e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_STARTED;
2374e1bc9a0SAchim Leubner onePortContext->discovery.type = DM_DISCOVERY_OPTION_INCREMENTAL_START;
2384e1bc9a0SAchim Leubner
2394e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = onePortContext->sasRemoteAddressHi;
2404e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = onePortContext->sasRemoteAddressLo;
2414e1bc9a0SAchim Leubner
2424e1bc9a0SAchim Leubner /* check OnePortContext->discovery.discoveringExpanderList */
2434e1bc9a0SAchim Leubner oneExpander = dmExpFind(dmRoot, onePortContext, dmSASSubID.sasAddressHi, dmSASSubID.sasAddressLo);
2444e1bc9a0SAchim Leubner if (oneExpander != agNULL)
2454e1bc9a0SAchim Leubner {
2464e1bc9a0SAchim Leubner oneExpDeviceData = oneExpander->dmDevice;
2474e1bc9a0SAchim Leubner }
2484e1bc9a0SAchim Leubner else
2494e1bc9a0SAchim Leubner {
2504e1bc9a0SAchim Leubner /* check dmAllShared->mainExpanderList */
2514e1bc9a0SAchim Leubner oneExpander = dmExpMainListFind(dmRoot, onePortContext, dmSASSubID.sasAddressHi, dmSASSubID.sasAddressLo);
2524e1bc9a0SAchim Leubner if (oneExpander != agNULL)
2534e1bc9a0SAchim Leubner {
2544e1bc9a0SAchim Leubner oneExpDeviceData = oneExpander->dmDevice;
2554e1bc9a0SAchim Leubner }
2564e1bc9a0SAchim Leubner }
2574e1bc9a0SAchim Leubner
2584e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
2594e1bc9a0SAchim Leubner {
2604e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = oneExpDeviceData->initiator_ssp_stp_smp;
2614e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = oneExpDeviceData->target_ssp_stp_smp;
2624e1bc9a0SAchim Leubner oneExpDeviceData->registered = agTRUE;
2634e1bc9a0SAchim Leubner dmAddSASToSharedcontext(dmRoot, onePortContext, &dmSASSubID, oneExpDeviceData, 0xFF);
2644e1bc9a0SAchim Leubner }
2654e1bc9a0SAchim Leubner else
2664e1bc9a0SAchim Leubner {
2674e1bc9a0SAchim Leubner DM_DBG1(("dmIncrementalDiscover:oneExpDeviceData is NULL!!!\n"));
2684e1bc9a0SAchim Leubner return DM_RC_FAILURE;
2694e1bc9a0SAchim Leubner }
2704e1bc9a0SAchim Leubner
2714e1bc9a0SAchim Leubner dmUpStreamDiscoverStart(dmRoot, onePortContext);
2724e1bc9a0SAchim Leubner
2734e1bc9a0SAchim Leubner return DM_RC_SUCCESS;
2744e1bc9a0SAchim Leubner }
2754e1bc9a0SAchim Leubner
2764e1bc9a0SAchim Leubner osGLOBAL void
dmUpStreamDiscoverStart(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)2774e1bc9a0SAchim Leubner dmUpStreamDiscoverStart(
2784e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
2794e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
2804e1bc9a0SAchim Leubner )
2814e1bc9a0SAchim Leubner {
2824e1bc9a0SAchim Leubner // dmExpander_t *oneExpander = agNULL;
2834e1bc9a0SAchim Leubner bit32 sasAddressHi, sasAddressLo;
2844e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
2854e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
2864e1bc9a0SAchim Leubner
2874e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverStart: start\n"));
2884e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
2894e1bc9a0SAchim Leubner {
2904e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverStart: invalid port!!!\n"));
2914e1bc9a0SAchim Leubner return;
2924e1bc9a0SAchim Leubner }
2934e1bc9a0SAchim Leubner /*
2944e1bc9a0SAchim Leubner at this point, the 1st expander should have been registered.
2954e1bc9a0SAchim Leubner find an expander from onePortContext
2964e1bc9a0SAchim Leubner */
2974e1bc9a0SAchim Leubner sasAddressHi = onePortContext->sasRemoteAddressHi;
2984e1bc9a0SAchim Leubner sasAddressLo = onePortContext->sasRemoteAddressLo;
2994e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverStart: Port Remote AddrHi 0x%08x Remote AddrLo 0x%08x\n", sasAddressHi, sasAddressLo));
3004e1bc9a0SAchim Leubner
3014e1bc9a0SAchim Leubner oneDeviceData = dmDeviceFind(dmRoot, onePortContext, sasAddressHi, sasAddressLo);
3024e1bc9a0SAchim Leubner
3034e1bc9a0SAchim Leubner // oneDeviceData = oneExpander->dmDevice;
3044e1bc9a0SAchim Leubner // start here
3054e1bc9a0SAchim Leubner onePortContext->discovery.status = DISCOVERY_UP_STREAM;
3064e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
3074e1bc9a0SAchim Leubner {
3084e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverStart: oneExpander is NULL, wrong!!!\n"));
3094e1bc9a0SAchim Leubner return;
3104e1bc9a0SAchim Leubner }
3114e1bc9a0SAchim Leubner else
3124e1bc9a0SAchim Leubner {
3134e1bc9a0SAchim Leubner if ( (oneDeviceData->SASSpecDeviceType == SAS_EDGE_EXPANDER_DEVICE)
3144e1bc9a0SAchim Leubner ||
3154e1bc9a0SAchim Leubner (oneDeviceData->SASSpecDeviceType == SAS_FANOUT_EXPANDER_DEVICE)
3164e1bc9a0SAchim Leubner ||
3174e1bc9a0SAchim Leubner DEVICE_IS_SMP_TARGET(oneDeviceData)
3184e1bc9a0SAchim Leubner )
3194e1bc9a0SAchim Leubner {
3204e1bc9a0SAchim Leubner #if 1 /* for incremental discovery */
3214e1bc9a0SAchim Leubner /* start here: if not on discoveringExpanderList, alloc and add
3224e1bc9a0SAchim Leubner dmNewEXPorNot()
3234e1bc9a0SAchim Leubner */
3244e1bc9a0SAchim Leubner oneExpander = dmExpFind(dmRoot, onePortContext, sasAddressHi, sasAddressLo);
3254e1bc9a0SAchim Leubner if ( oneExpander == agNULL)
3264e1bc9a0SAchim Leubner {
3274e1bc9a0SAchim Leubner /* alloc and add */
3284e1bc9a0SAchim Leubner oneExpander = dmDiscoveringExpanderAlloc(dmRoot, onePortContext, oneDeviceData);
3294e1bc9a0SAchim Leubner if ( oneExpander != agNULL)
3304e1bc9a0SAchim Leubner {
3314e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, oneExpander);
3324e1bc9a0SAchim Leubner }
3334e1bc9a0SAchim Leubner else
3344e1bc9a0SAchim Leubner {
3354e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverStart: failed to allocate expander or discovey aborted!!!\n"));
3364e1bc9a0SAchim Leubner return;
3374e1bc9a0SAchim Leubner }
3384e1bc9a0SAchim Leubner }
3394e1bc9a0SAchim Leubner #endif
3404e1bc9a0SAchim Leubner
3414e1bc9a0SAchim Leubner dmUpStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
3424e1bc9a0SAchim Leubner }
3434e1bc9a0SAchim Leubner else
3444e1bc9a0SAchim Leubner {
3454e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverStart: oneDeviceData is not an Expander did %d, wrong!!!\n", oneDeviceData->id));
3464e1bc9a0SAchim Leubner return;
3474e1bc9a0SAchim Leubner }
3484e1bc9a0SAchim Leubner }
3494e1bc9a0SAchim Leubner return;
3504e1bc9a0SAchim Leubner }
3514e1bc9a0SAchim Leubner
3524e1bc9a0SAchim Leubner /* sends report general */
3534e1bc9a0SAchim Leubner osGLOBAL void
dmUpStreamDiscovering(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData)3544e1bc9a0SAchim Leubner dmUpStreamDiscovering(
3554e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
3564e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
3574e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData
3584e1bc9a0SAchim Leubner )
3594e1bc9a0SAchim Leubner {
3604e1bc9a0SAchim Leubner dmList_t *ExpanderList;
3614e1bc9a0SAchim Leubner dmExpander_t *oneNextExpander = agNULL;
3624e1bc9a0SAchim Leubner
3634e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscovering: start\n"));
3644e1bc9a0SAchim Leubner
3654e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
3664e1bc9a0SAchim Leubner {
3674e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscovering: invalid port!!!\n"));
3684e1bc9a0SAchim Leubner return;
3694e1bc9a0SAchim Leubner }
3704e1bc9a0SAchim Leubner
3714e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
3724e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(onePortContext->discovery.discoveringExpanderList)))
3734e1bc9a0SAchim Leubner {
3744e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
3754e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscovering: should be the end\n"));
3764e1bc9a0SAchim Leubner oneNextExpander = agNULL;
3774e1bc9a0SAchim Leubner }
3784e1bc9a0SAchim Leubner else
3794e1bc9a0SAchim Leubner {
3804e1bc9a0SAchim Leubner DMLIST_DEQUEUE_FROM_HEAD(&ExpanderList, &(onePortContext->discovery.discoveringExpanderList));
3814e1bc9a0SAchim Leubner oneNextExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
3824e1bc9a0SAchim Leubner if ( oneNextExpander != agNULL)
3834e1bc9a0SAchim Leubner {
3844e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_HEAD(&(oneNextExpander->linkNode), &(onePortContext->discovery.discoveringExpanderList));
3854e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscovering tdsaSASUpStreamDiscovering: dequeue head\n"));
3864e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscovering: expander id %d\n", oneNextExpander->id));
3874e1bc9a0SAchim Leubner }
3884e1bc9a0SAchim Leubner else
3894e1bc9a0SAchim Leubner {
3904e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscovering: oneNextExpander is NULL!!!\n"));
3914e1bc9a0SAchim Leubner }
3924e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
3934e1bc9a0SAchim Leubner
3944e1bc9a0SAchim Leubner }
3954e1bc9a0SAchim Leubner
3964e1bc9a0SAchim Leubner if (oneNextExpander != agNULL)
3974e1bc9a0SAchim Leubner {
3984e1bc9a0SAchim Leubner dmReportGeneralSend(dmRoot, oneNextExpander->dmDevice);
3994e1bc9a0SAchim Leubner }
4004e1bc9a0SAchim Leubner else
4014e1bc9a0SAchim Leubner {
4024e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscovering: No more expander list\n"));
4034e1bc9a0SAchim Leubner dmDownStreamDiscoverStart(dmRoot, onePortContext, oneDeviceData);
4044e1bc9a0SAchim Leubner }
4054e1bc9a0SAchim Leubner
4064e1bc9a0SAchim Leubner return;
4074e1bc9a0SAchim Leubner }
4084e1bc9a0SAchim Leubner
4094e1bc9a0SAchim Leubner osGLOBAL void
dmDownStreamDiscoverStart(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData)4104e1bc9a0SAchim Leubner dmDownStreamDiscoverStart(
4114e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
4124e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
4134e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData
4144e1bc9a0SAchim Leubner )
4154e1bc9a0SAchim Leubner {
4164e1bc9a0SAchim Leubner dmExpander_t *UpStreamExpander;
4174e1bc9a0SAchim Leubner dmExpander_t *oneExpander;
4184e1bc9a0SAchim Leubner
4194e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: start\n"));
4204e1bc9a0SAchim Leubner
4214e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
4224e1bc9a0SAchim Leubner {
4234e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverStart: invalid port or aborted discovery!!!\n"));
4244e1bc9a0SAchim Leubner return;
4254e1bc9a0SAchim Leubner }
4264e1bc9a0SAchim Leubner
4274e1bc9a0SAchim Leubner /* set discovery status */
4284e1bc9a0SAchim Leubner onePortContext->discovery.status = DISCOVERY_DOWN_STREAM;
4294e1bc9a0SAchim Leubner
4304e1bc9a0SAchim Leubner /* If it's an expander */
4314e1bc9a0SAchim Leubner if ( (oneDeviceData->SASSpecDeviceType == SAS_EDGE_EXPANDER_DEVICE)
4324e1bc9a0SAchim Leubner || (oneDeviceData->SASSpecDeviceType == SAS_FANOUT_EXPANDER_DEVICE)
4334e1bc9a0SAchim Leubner || DEVICE_IS_SMP_TARGET(oneDeviceData)
4344e1bc9a0SAchim Leubner )
4354e1bc9a0SAchim Leubner {
4364e1bc9a0SAchim Leubner oneExpander = oneDeviceData->dmExpander;
4374e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
4384e1bc9a0SAchim Leubner
4394e1bc9a0SAchim Leubner /* If the two expanders are the root of two edge sets; sub-to-sub */
4404e1bc9a0SAchim Leubner if ( (UpStreamExpander != agNULL) && ( UpStreamExpander->dmUpStreamExpander == oneExpander ) )
4414e1bc9a0SAchim Leubner {
4424e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: Root found pExpander=%p pUpStreamExpander=%p\n",
4434e1bc9a0SAchim Leubner oneExpander, UpStreamExpander));
4444e1bc9a0SAchim Leubner //Saves the root expander
4454e1bc9a0SAchim Leubner onePortContext->discovery.RootExp = oneExpander;
4464e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: Root exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
4474e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: Root exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
4484e1bc9a0SAchim Leubner
4494e1bc9a0SAchim Leubner /* reset up stream inform for pExpander */
4504e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = agNULL;
4514e1bc9a0SAchim Leubner /* Add the pExpander to discovering list */
4524e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, oneExpander);
4534e1bc9a0SAchim Leubner
4544e1bc9a0SAchim Leubner /* reset up stream inform for oneExpander */
4554e1bc9a0SAchim Leubner UpStreamExpander->dmUpStreamExpander = agNULL;
4564e1bc9a0SAchim Leubner /* Add the UpStreamExpander to discovering list */
4574e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, UpStreamExpander);
4584e1bc9a0SAchim Leubner }
4594e1bc9a0SAchim Leubner /* If the two expanders are not the root of two edge sets. eg) one root */
4604e1bc9a0SAchim Leubner else
4614e1bc9a0SAchim Leubner {
4624e1bc9a0SAchim Leubner //Saves the root expander
4634e1bc9a0SAchim Leubner onePortContext->discovery.RootExp = oneExpander;
4644e1bc9a0SAchim Leubner
4654e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: NO Root pExpander=%p\n", oneExpander));
4664e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: Root exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
4674e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverStart: Root exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
4684e1bc9a0SAchim Leubner
4694e1bc9a0SAchim Leubner /* (2.2.2.1) Add the pExpander to discovering list */
4704e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, oneExpander);
4714e1bc9a0SAchim Leubner }
4724e1bc9a0SAchim Leubner }
4734e1bc9a0SAchim Leubner
4744e1bc9a0SAchim Leubner /* Continue down stream discovering */
4754e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
4764e1bc9a0SAchim Leubner
4774e1bc9a0SAchim Leubner return;
4784e1bc9a0SAchim Leubner }
4794e1bc9a0SAchim Leubner
4804e1bc9a0SAchim Leubner osGLOBAL void
dmDownStreamDiscovering(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData)4814e1bc9a0SAchim Leubner dmDownStreamDiscovering(
4824e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
4834e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
4844e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData
4854e1bc9a0SAchim Leubner )
4864e1bc9a0SAchim Leubner {
4874e1bc9a0SAchim Leubner dmExpander_t *NextExpander = agNULL;
4884e1bc9a0SAchim Leubner dmList_t *ExpanderList;
4894e1bc9a0SAchim Leubner
4904e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: start\n"));
4914e1bc9a0SAchim Leubner
4924e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
4934e1bc9a0SAchim Leubner {
4944e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscovering: invalid port or aborted discovery!!!\n"));
4954e1bc9a0SAchim Leubner return;
4964e1bc9a0SAchim Leubner }
4974e1bc9a0SAchim Leubner
4984e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
4994e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(onePortContext->discovery.discoveringExpanderList)))
5004e1bc9a0SAchim Leubner {
5014e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
5024e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: should be the end\n"));
5034e1bc9a0SAchim Leubner NextExpander = agNULL;
5044e1bc9a0SAchim Leubner }
5054e1bc9a0SAchim Leubner else
5064e1bc9a0SAchim Leubner {
507*aeb665b5SEd Maste DMLIST_DEQUEUE_FROM_HEAD(&ExpanderList, &(onePortContext->discovery.discoveringExpanderList));
5084e1bc9a0SAchim Leubner NextExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
5094e1bc9a0SAchim Leubner if ( NextExpander != agNULL)
5104e1bc9a0SAchim Leubner {
511*aeb665b5SEd Maste DMLIST_ENQUEUE_AT_HEAD(&(NextExpander->linkNode), &(onePortContext->discovery.discoveringExpanderList));
5124e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering tdsaSASDownStreamDiscovering: dequeue head\n"));
5134e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: expander id %d\n", NextExpander->id));
5144e1bc9a0SAchim Leubner }
5154e1bc9a0SAchim Leubner else
5164e1bc9a0SAchim Leubner {
5174e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscovering: NextExpander is NULL!!!\n"));
5184e1bc9a0SAchim Leubner }
5194e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
5204e1bc9a0SAchim Leubner
5214e1bc9a0SAchim Leubner }
5224e1bc9a0SAchim Leubner
5234e1bc9a0SAchim Leubner /* If there is an expander for continue discoving */
5244e1bc9a0SAchim Leubner if ( NextExpander != agNULL)
5254e1bc9a0SAchim Leubner {
5264e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: Found pNextExpander=%p discoveryStatus=0x%x\n",
5274e1bc9a0SAchim Leubner NextExpander, onePortContext->discovery.status));
5284e1bc9a0SAchim Leubner
5294e1bc9a0SAchim Leubner switch (onePortContext->discovery.status)
5304e1bc9a0SAchim Leubner {
5314e1bc9a0SAchim Leubner /* If the discovery status is DISCOVERY_DOWN_STREAM */
5324e1bc9a0SAchim Leubner case DISCOVERY_DOWN_STREAM:
5334e1bc9a0SAchim Leubner /* Send report general for the next expander */
5344e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: DownStream pNextExpander=%p\n", NextExpander));
5354e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
5364e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: oneExpander %p did %d\n", oneDeviceData->dmExpander, oneDeviceData->dmExpander->id));
5374e1bc9a0SAchim Leubner
5384e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: 2nd oneDeviceData %p did %d\n", NextExpander->dmDevice, NextExpander->dmDevice->id));
5394e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: 2nd oneExpander %p did %d\n", NextExpander, NextExpander->id));
5404e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: 2nd used oneExpander %p did %d\n", NextExpander->dmDevice->dmExpander, NextExpander->dmDevice->dmExpander->id));
5414e1bc9a0SAchim Leubner
5424e1bc9a0SAchim Leubner if (NextExpander != NextExpander->dmDevice->dmExpander)
5434e1bc9a0SAchim Leubner {
5444e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: wrong!!!\n"));
5454e1bc9a0SAchim Leubner }
5464e1bc9a0SAchim Leubner
5474e1bc9a0SAchim Leubner
5484e1bc9a0SAchim Leubner dmReportGeneralSend(dmRoot, NextExpander->dmDevice);
5494e1bc9a0SAchim Leubner break;
5504e1bc9a0SAchim Leubner /* If the discovery status is DISCOVERY_CONFIG_ROUTING */
5514e1bc9a0SAchim Leubner case DISCOVERY_CONFIG_ROUTING:
5524e1bc9a0SAchim Leubner case DISCOVERY_REPORT_PHY_SATA:
5534e1bc9a0SAchim Leubner
5544e1bc9a0SAchim Leubner /* set discovery status */
5554e1bc9a0SAchim Leubner onePortContext->discovery.status = DISCOVERY_DOWN_STREAM;
5564e1bc9a0SAchim Leubner
5574e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: pPort->discovery.status=DISCOVERY_CONFIG_ROUTING, make it DOWN_STREAM\n"));
5584e1bc9a0SAchim Leubner /* If not the last phy */
5594e1bc9a0SAchim Leubner if ( NextExpander->discoveringPhyId < NextExpander->dmDevice->numOfPhys )
5604e1bc9a0SAchim Leubner {
5614e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: pNextExpander->discoveringPhyId=0x%x pNextExpander->numOfPhys=0x%x. Send More Discover\n",
5624e1bc9a0SAchim Leubner NextExpander->discoveringPhyId, NextExpander->dmDevice->numOfPhys));
5634e1bc9a0SAchim Leubner /* Send discover for the next expander */
5644e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, NextExpander->dmDevice);
5654e1bc9a0SAchim Leubner }
5664e1bc9a0SAchim Leubner /* If it's the last phy */
5674e1bc9a0SAchim Leubner else
5684e1bc9a0SAchim Leubner {
5694e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: Last Phy, remove expander%p start DownStream=%p\n",
5704e1bc9a0SAchim Leubner NextExpander, NextExpander->dmDevice));
5714e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, NextExpander);
5724e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, NextExpander->dmDevice);
5734e1bc9a0SAchim Leubner }
5744e1bc9a0SAchim Leubner break;
5754e1bc9a0SAchim Leubner
5764e1bc9a0SAchim Leubner default:
5774e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: *** Unknown pPort->discovery.status=0x%x\n", onePortContext->discovery.status));
5784e1bc9a0SAchim Leubner }
5794e1bc9a0SAchim Leubner }
5804e1bc9a0SAchim Leubner /* If no expander for continue discoving */
5814e1bc9a0SAchim Leubner else
5824e1bc9a0SAchim Leubner {
5834e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscovering: No more expander DONE\n"));
5844e1bc9a0SAchim Leubner /* discover done */
5854e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_SUCCESS);
5864e1bc9a0SAchim Leubner }
5874e1bc9a0SAchim Leubner
5884e1bc9a0SAchim Leubner
5894e1bc9a0SAchim Leubner return;
5904e1bc9a0SAchim Leubner }
5914e1bc9a0SAchim Leubner
5924e1bc9a0SAchim Leubner osGLOBAL void
dmUpStreamDiscoverExpanderPhy(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander,smpRespDiscover_t * pDiscoverResp)5934e1bc9a0SAchim Leubner dmUpStreamDiscoverExpanderPhy(
5944e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
5954e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
5964e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
5974e1bc9a0SAchim Leubner smpRespDiscover_t *pDiscoverResp
5984e1bc9a0SAchim Leubner )
5994e1bc9a0SAchim Leubner {
6004e1bc9a0SAchim Leubner agsaSASIdentify_t sasIdentify;
6014e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
6024e1bc9a0SAchim Leubner bit32 attachedSasHi, attachedSasLo;
6034e1bc9a0SAchim Leubner dmExpander_t *AttachedExpander = agNULL;
6044e1bc9a0SAchim Leubner bit8 connectionRate;
6054e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
6064e1bc9a0SAchim Leubner dmDeviceData_t *AttachedDevice = agNULL;
6074e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
6084e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
6094e1bc9a0SAchim Leubner
6104e1bc9a0SAchim Leubner
6114e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: start\n"));
6124e1bc9a0SAchim Leubner
6134e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
6144e1bc9a0SAchim Leubner {
6154e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: invalid port or aborted discovery!!!\n"));
6164e1bc9a0SAchim Leubner return;
6174e1bc9a0SAchim Leubner }
6184e1bc9a0SAchim Leubner
6194e1bc9a0SAchim Leubner if (oneExpander != oneExpander->dmDevice->dmExpander)
6204e1bc9a0SAchim Leubner {
6214e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: wrong!!!\n"));
6224e1bc9a0SAchim Leubner }
6234e1bc9a0SAchim Leubner
6244e1bc9a0SAchim Leubner dm_memset(&sasIdentify, 0, sizeof(agsaSASIdentify_t));
6254e1bc9a0SAchim Leubner
6264e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
6274e1bc9a0SAchim Leubner
6284e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: Phy #%d of SAS %08x-%08x\n",
6294e1bc9a0SAchim Leubner oneExpander->discoveringPhyId,
6304e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi,
6314e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo));
6324e1bc9a0SAchim Leubner
6334e1bc9a0SAchim Leubner DM_DBG3((" Attached device: %s\n",
6344e1bc9a0SAchim Leubner ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 0 ? "No Device" :
6354e1bc9a0SAchim Leubner (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 1 ? "End Device" :
6364e1bc9a0SAchim Leubner (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 2 ? "Edge Expander" : "Fanout Expander")))));
6374e1bc9a0SAchim Leubner
6384e1bc9a0SAchim Leubner
6394e1bc9a0SAchim Leubner if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
6404e1bc9a0SAchim Leubner {
6414e1bc9a0SAchim Leubner DM_DBG3((" SAS address : %08x-%08x\n",
6424e1bc9a0SAchim Leubner DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp),
6434e1bc9a0SAchim Leubner DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp)));
6444e1bc9a0SAchim Leubner DM_DBG3((" SSP Target : %d\n", DISCRSP_IS_SSP_TARGET(pDiscoverResp)?1:0));
6454e1bc9a0SAchim Leubner DM_DBG3((" STP Target : %d\n", DISCRSP_IS_STP_TARGET(pDiscoverResp)?1:0));
6464e1bc9a0SAchim Leubner DM_DBG3((" SMP Target : %d\n", DISCRSP_IS_SMP_TARGET(pDiscoverResp)?1:0));
6474e1bc9a0SAchim Leubner DM_DBG3((" SATA DEVICE : %d\n", DISCRSP_IS_SATA_DEVICE(pDiscoverResp)?1:0));
6484e1bc9a0SAchim Leubner DM_DBG3((" SSP Initiator : %d\n", DISCRSP_IS_SSP_INITIATOR(pDiscoverResp)?1:0));
6494e1bc9a0SAchim Leubner DM_DBG3((" STP Initiator : %d\n", DISCRSP_IS_STP_INITIATOR(pDiscoverResp)?1:0));
6504e1bc9a0SAchim Leubner DM_DBG3((" SMP Initiator : %d\n", DISCRSP_IS_SMP_INITIATOR(pDiscoverResp)?1:0));
6514e1bc9a0SAchim Leubner DM_DBG3((" Phy ID : %d\n", pDiscoverResp->phyIdentifier));
6524e1bc9a0SAchim Leubner DM_DBG3((" Attached Phy ID: %d\n", pDiscoverResp->attachedPhyIdentifier));
6534e1bc9a0SAchim Leubner }
6544e1bc9a0SAchim Leubner
6554e1bc9a0SAchim Leubner /* for debugging */
6564e1bc9a0SAchim Leubner if (oneExpander->discoveringPhyId != pDiscoverResp->phyIdentifier)
6574e1bc9a0SAchim Leubner {
6584e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: !!! Incorrect SMP response !!!\n"));
6594e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: Request PhyID #%d Response PhyID #%d !!!\n", oneExpander->discoveringPhyId, pDiscoverResp->phyIdentifier));
6604e1bc9a0SAchim Leubner dmhexdump("NO_DEVICE", (bit8*)pDiscoverResp, sizeof(smpRespDiscover_t));
6614e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
6624e1bc9a0SAchim Leubner return;
6634e1bc9a0SAchim Leubner }
6644e1bc9a0SAchim Leubner
6654e1bc9a0SAchim Leubner /* saving routing attribute for non self-configuring expanders */
6664e1bc9a0SAchim Leubner oneExpander->routingAttribute[pDiscoverResp->phyIdentifier] = (bit8)DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp);
6674e1bc9a0SAchim Leubner
6684e1bc9a0SAchim Leubner if ( oneDeviceData->SASSpecDeviceType == SAS_FANOUT_EXPANDER_DEVICE )
6694e1bc9a0SAchim Leubner {
6704e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: SA_SAS_DEV_TYPE_FANOUT_EXPANDER\n"));
6714e1bc9a0SAchim Leubner if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE)
6724e1bc9a0SAchim Leubner {
6734e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: **** Topology Error subtractive routing on fanout expander device!!!\n"));
6744e1bc9a0SAchim Leubner
6754e1bc9a0SAchim Leubner /* discovery error */
6764e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
6774e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
6784e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
6794e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
6804e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
6814e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
6824e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
6834e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
6844e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
6854e1bc9a0SAchim Leubner
6864e1bc9a0SAchim Leubner /* (2.1.3) discovery done */
6874e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
6884e1bc9a0SAchim Leubner return;
6894e1bc9a0SAchim Leubner }
6904e1bc9a0SAchim Leubner }
6914e1bc9a0SAchim Leubner else
6924e1bc9a0SAchim Leubner {
6934e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: SA_SAS_DEV_TYPE_EDGE_EXPANDER\n"));
6944e1bc9a0SAchim Leubner if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
6954e1bc9a0SAchim Leubner {
6964e1bc9a0SAchim Leubner /* Setup sasIdentify for the attached device */
6974e1bc9a0SAchim Leubner sasIdentify.phyIdentifier = pDiscoverResp->phyIdentifier;
6984e1bc9a0SAchim Leubner sasIdentify.deviceType_addressFrameType = (bit8)(pDiscoverResp->attachedDeviceType & 0x70);
6994e1bc9a0SAchim Leubner sasIdentify.initiator_ssp_stp_smp = pDiscoverResp->attached_Ssp_Stp_Smp_Sata_Initiator;
7004e1bc9a0SAchim Leubner sasIdentify.target_ssp_stp_smp = pDiscoverResp->attached_SataPS_Ssp_Stp_Smp_Sata_Target;
7014e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressHi = *(bit32*)pDiscoverResp->attachedSasAddressHi;
7024e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressLo = *(bit32*)pDiscoverResp->attachedSasAddressLo;
7034e1bc9a0SAchim Leubner
7044e1bc9a0SAchim Leubner /* incremental discovery */
7054e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify);
7064e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify);
7074e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = sasIdentify.initiator_ssp_stp_smp;
7084e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = sasIdentify.target_ssp_stp_smp;
7094e1bc9a0SAchim Leubner
7104e1bc9a0SAchim Leubner attachedSasHi = DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp);
7114e1bc9a0SAchim Leubner attachedSasLo = DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp);
7124e1bc9a0SAchim Leubner
7134e1bc9a0SAchim Leubner /* If the phy has subtractive routing attribute */
7144e1bc9a0SAchim Leubner if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE)
7154e1bc9a0SAchim Leubner {
7164e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: SA_SAS_ROUTING_SUBTRACTIVE\n"));
7174e1bc9a0SAchim Leubner /* Setup upstream phys */
7184e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, oneExpander, (bit8) pDiscoverResp->attachedPhyIdentifier);
7194e1bc9a0SAchim Leubner /* If the expander already has an upsteam device set up */
7204e1bc9a0SAchim Leubner if (oneExpander->hasUpStreamDevice == agTRUE)
7214e1bc9a0SAchim Leubner {
7224e1bc9a0SAchim Leubner /* just to update MCN */
7234e1bc9a0SAchim Leubner dmPortSASDeviceFind(dmRoot, onePortContext, attachedSasLo, attachedSasHi, oneDeviceData);
7244e1bc9a0SAchim Leubner /* If the sas address doesn't match */
7254e1bc9a0SAchim Leubner if ( ((oneExpander->upStreamSASAddressHi != attachedSasHi) ||
7264e1bc9a0SAchim Leubner (oneExpander->upStreamSASAddressLo != attachedSasLo)) &&
7274e1bc9a0SAchim Leubner (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE ||
7284e1bc9a0SAchim Leubner DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
7294e1bc9a0SAchim Leubner )
7304e1bc9a0SAchim Leubner {
7314e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
7324e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: **** Topology Error subtractive routing error - inconsistent SAS address!!!\n"));
7334e1bc9a0SAchim Leubner /* call back to notify discovery error */
7344e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
7354e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
7364e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
7374e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
7384e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
7394e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
7404e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
7414e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
7424e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
7434e1bc9a0SAchim Leubner /* discovery done */
7444e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
7454e1bc9a0SAchim Leubner }
7464e1bc9a0SAchim Leubner }
7474e1bc9a0SAchim Leubner else
7484e1bc9a0SAchim Leubner {
7494e1bc9a0SAchim Leubner /* Setup SAS address for up stream device */
7504e1bc9a0SAchim Leubner oneExpander->hasUpStreamDevice = agTRUE;
7514e1bc9a0SAchim Leubner oneExpander->upStreamSASAddressHi = attachedSasHi;
7524e1bc9a0SAchim Leubner oneExpander->upStreamSASAddressLo = attachedSasLo;
7534e1bc9a0SAchim Leubner if ( (onePortContext->sasLocalAddressHi != attachedSasHi)
7544e1bc9a0SAchim Leubner || (onePortContext->sasLocalAddressLo != attachedSasLo) )
7554e1bc9a0SAchim Leubner {
7564e1bc9a0SAchim Leubner /* Find the device from the discovered list */
7574e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceFind(dmRoot, onePortContext, attachedSasLo, attachedSasHi, oneDeviceData);
7584e1bc9a0SAchim Leubner /* New device, If the device has been discovered before */
7594e1bc9a0SAchim Leubner if ( AttachedDevice != agNULL) /* old device */
7604e1bc9a0SAchim Leubner {
7614e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: Seen This Device Before\n"));
7624e1bc9a0SAchim Leubner /* If attached device is an edge expander */
7634e1bc9a0SAchim Leubner if ( AttachedDevice->SASSpecDeviceType == SAS_EDGE_EXPANDER_DEVICE)
7644e1bc9a0SAchim Leubner {
7654e1bc9a0SAchim Leubner /* The attached device is an expander */
7664e1bc9a0SAchim Leubner AttachedExpander = AttachedDevice->dmExpander;
7674e1bc9a0SAchim Leubner /* If the two expanders are the root of the two edge expander sets */
7684e1bc9a0SAchim Leubner if ( (AttachedExpander->upStreamSASAddressHi ==
7694e1bc9a0SAchim Leubner DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo))
7704e1bc9a0SAchim Leubner && (AttachedExpander->upStreamSASAddressLo ==
7714e1bc9a0SAchim Leubner DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo)) )
7724e1bc9a0SAchim Leubner {
7734e1bc9a0SAchim Leubner /* Setup upstream expander for the pExpander */
7744e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = AttachedExpander;
7754e1bc9a0SAchim Leubner }
7764e1bc9a0SAchim Leubner /* If the two expanders are not the root of the two edge expander sets */
7774e1bc9a0SAchim Leubner else
7784e1bc9a0SAchim Leubner {
7794e1bc9a0SAchim Leubner /* TODO: loop found, discovery error, callback */
7804e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: **** Topology Error loop detection!!!\n"));
7814e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
7824e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
7834e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
7844e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
7854e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
7864e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
7874e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
7884e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
7894e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
7904e1bc9a0SAchim Leubner /* discovery done */
7914e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
7924e1bc9a0SAchim Leubner }
7934e1bc9a0SAchim Leubner }
7944e1bc9a0SAchim Leubner /* If attached device is not an edge expander */
7954e1bc9a0SAchim Leubner else
7964e1bc9a0SAchim Leubner {
7974e1bc9a0SAchim Leubner /*TODO: should not happen, ASSERT */
7984e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy, *** Attached Device is not Edge. Confused!!!\n"));
7994e1bc9a0SAchim Leubner }
8004e1bc9a0SAchim Leubner } /* AttachedExpander != agNULL */
8014e1bc9a0SAchim Leubner /* New device, If the device has not been discovered before */
8024e1bc9a0SAchim Leubner else /* new device */
8034e1bc9a0SAchim Leubner {
8044e1bc9a0SAchim Leubner /* Add the device */
8054e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: New device\n"));
8064e1bc9a0SAchim Leubner /* read minimum rate from the configuration
8074e1bc9a0SAchim Leubner onePortContext->LinkRate is SPC's local link rate
8084e1bc9a0SAchim Leubner */
8094e1bc9a0SAchim Leubner connectionRate = (bit8)MIN(onePortContext->LinkRate, DISCRSP_GET_LINKRATE(pDiscoverResp));
8104e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: link rate 0x%x\n", onePortContext->LinkRate));
8114e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: negotiatedPhyLinkRate 0x%x\n", DISCRSP_GET_LINKRATE(pDiscoverResp)));
8124e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: connectionRate 0x%x\n", connectionRate));
8134e1bc9a0SAchim Leubner if (DISCRSP_IS_STP_TARGET(pDiscoverResp) || DISCRSP_IS_SATA_DEVICE(pDiscoverResp))
8144e1bc9a0SAchim Leubner {
8154e1bc9a0SAchim Leubner /* incremental discovery */
8164e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
8174e1bc9a0SAchim Leubner {
8184e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
8194e1bc9a0SAchim Leubner dmRoot,
8204e1bc9a0SAchim Leubner onePortContext,
8214e1bc9a0SAchim Leubner sasIdentify,
8224e1bc9a0SAchim Leubner agFALSE,
8234e1bc9a0SAchim Leubner connectionRate,
8244e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
8254e1bc9a0SAchim Leubner 0,
8264e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
8274e1bc9a0SAchim Leubner oneDeviceData,
8284e1bc9a0SAchim Leubner oneExpander,
8294e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
8304e1bc9a0SAchim Leubner );
8314e1bc9a0SAchim Leubner }
8324e1bc9a0SAchim Leubner else
8334e1bc9a0SAchim Leubner {
8344e1bc9a0SAchim Leubner /* incremental discovery */
8354e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
8364e1bc9a0SAchim Leubner dmRoot,
8374e1bc9a0SAchim Leubner onePortContext,
8384e1bc9a0SAchim Leubner &dmSASSubID
8394e1bc9a0SAchim Leubner );
8404e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
8414e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
8424e1bc9a0SAchim Leubner {
8434e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
8444e1bc9a0SAchim Leubner dmRoot,
8454e1bc9a0SAchim Leubner onePortContext,
8464e1bc9a0SAchim Leubner sasIdentify,
8474e1bc9a0SAchim Leubner agFALSE,
8484e1bc9a0SAchim Leubner connectionRate,
8494e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
8504e1bc9a0SAchim Leubner 0,
8514e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
8524e1bc9a0SAchim Leubner oneDeviceData,
8534e1bc9a0SAchim Leubner oneExpander,
8544e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
8554e1bc9a0SAchim Leubner );
8564e1bc9a0SAchim Leubner }
8574e1bc9a0SAchim Leubner }
8584e1bc9a0SAchim Leubner } /* DISCRSP_IS_STP_TARGET(pDiscoverResp) || DISCRSP_IS_SATA_DEVICE(pDiscoverResp) */
8594e1bc9a0SAchim Leubner else
8604e1bc9a0SAchim Leubner {
8614e1bc9a0SAchim Leubner /* incremental discovery */
8624e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
8634e1bc9a0SAchim Leubner {
8644e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
8654e1bc9a0SAchim Leubner dmRoot,
8664e1bc9a0SAchim Leubner onePortContext,
8674e1bc9a0SAchim Leubner sasIdentify,
8684e1bc9a0SAchim Leubner agFALSE,
8694e1bc9a0SAchim Leubner connectionRate,
8704e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
8714e1bc9a0SAchim Leubner 0,
8724e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
8734e1bc9a0SAchim Leubner oneDeviceData,
8744e1bc9a0SAchim Leubner oneExpander,
8754e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
8764e1bc9a0SAchim Leubner );
8774e1bc9a0SAchim Leubner }
8784e1bc9a0SAchim Leubner else
8794e1bc9a0SAchim Leubner {
8804e1bc9a0SAchim Leubner /* incremental discovery */
8814e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
8824e1bc9a0SAchim Leubner dmRoot,
8834e1bc9a0SAchim Leubner onePortContext,
8844e1bc9a0SAchim Leubner &dmSASSubID
8854e1bc9a0SAchim Leubner );
8864e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
8874e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
8884e1bc9a0SAchim Leubner {
8894e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
8904e1bc9a0SAchim Leubner dmRoot,
8914e1bc9a0SAchim Leubner onePortContext,
8924e1bc9a0SAchim Leubner sasIdentify,
8934e1bc9a0SAchim Leubner agFALSE,
8944e1bc9a0SAchim Leubner connectionRate,
8954e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
8964e1bc9a0SAchim Leubner 0,
8974e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
8984e1bc9a0SAchim Leubner oneDeviceData,
8994e1bc9a0SAchim Leubner oneExpander,
9004e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
9014e1bc9a0SAchim Leubner );
9024e1bc9a0SAchim Leubner }
9034e1bc9a0SAchim Leubner }
9044e1bc9a0SAchim Leubner }
9054e1bc9a0SAchim Leubner /* If the device is added successfully */
9064e1bc9a0SAchim Leubner if ( AttachedDevice != agNULL)
9074e1bc9a0SAchim Leubner {
9084e1bc9a0SAchim Leubner
9094e1bc9a0SAchim Leubner /* (3.1.2.3.2.3.2.1) callback about new device */
9104e1bc9a0SAchim Leubner if ( DISCRSP_IS_SSP_TARGET(pDiscoverResp)
9114e1bc9a0SAchim Leubner || DISCRSP_IS_SSP_INITIATOR(pDiscoverResp)
9124e1bc9a0SAchim Leubner || DISCRSP_IS_SMP_INITIATOR(pDiscoverResp)
9134e1bc9a0SAchim Leubner || DISCRSP_IS_SMP_INITIATOR(pDiscoverResp) )
9144e1bc9a0SAchim Leubner {
9154e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: Found SSP/SMP SAS %08x-%08x\n",
9164e1bc9a0SAchim Leubner attachedSasHi, attachedSasLo));
9174e1bc9a0SAchim Leubner }
9184e1bc9a0SAchim Leubner else
9194e1bc9a0SAchim Leubner {
9204e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: Found a SAS STP device.\n"));
9214e1bc9a0SAchim Leubner }
9224e1bc9a0SAchim Leubner /* If the attached device is an expander */
9234e1bc9a0SAchim Leubner if ( (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
9244e1bc9a0SAchim Leubner || (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE) )
9254e1bc9a0SAchim Leubner {
9264e1bc9a0SAchim Leubner /* Allocate an expander data structure */
9274e1bc9a0SAchim Leubner AttachedExpander = dmDiscoveringExpanderAlloc(
9284e1bc9a0SAchim Leubner dmRoot,
9294e1bc9a0SAchim Leubner onePortContext,
9304e1bc9a0SAchim Leubner AttachedDevice
9314e1bc9a0SAchim Leubner );
9324e1bc9a0SAchim Leubner
9334e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: Found expander=%p\n", AttachedExpander));
9344e1bc9a0SAchim Leubner /* If allocate successfully */
9354e1bc9a0SAchim Leubner if ( AttachedExpander != agNULL)
9364e1bc9a0SAchim Leubner {
9374e1bc9a0SAchim Leubner /* Add the pAttachedExpander to discovering list */
9384e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
9394e1bc9a0SAchim Leubner /* Setup upstream expander for the pExpander */
9404e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = AttachedExpander;
9414e1bc9a0SAchim Leubner }
9424e1bc9a0SAchim Leubner /* If failed to allocate */
9434e1bc9a0SAchim Leubner else
9444e1bc9a0SAchim Leubner {
9454e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: Failed to allocate expander data structure!!!\n"));
9464e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
9474e1bc9a0SAchim Leubner }
9484e1bc9a0SAchim Leubner }
9494e1bc9a0SAchim Leubner /* If the attached device is an end device */
9504e1bc9a0SAchim Leubner else
9514e1bc9a0SAchim Leubner {
9524e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: Found end device\n"));
9534e1bc9a0SAchim Leubner /* LP2006-05-26 added upstream device to the newly found device */
9544e1bc9a0SAchim Leubner AttachedDevice->dmExpander = oneExpander;
9554e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = agNULL;
9564e1bc9a0SAchim Leubner }
9574e1bc9a0SAchim Leubner }
9584e1bc9a0SAchim Leubner else
9594e1bc9a0SAchim Leubner {
9604e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscoverExpanderPhy: Failed to add a device!!!\n"));
9614e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
9624e1bc9a0SAchim Leubner }
9634e1bc9a0SAchim Leubner
9644e1bc9a0SAchim Leubner
9654e1bc9a0SAchim Leubner
9664e1bc9a0SAchim Leubner } /* else, new device */
9674e1bc9a0SAchim Leubner } /* onePortContext->sasLocalAddressLo != attachedSasLo */
9684e1bc9a0SAchim Leubner } /* else */
9694e1bc9a0SAchim Leubner } /* DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE */
9704e1bc9a0SAchim Leubner } /* DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE */
9714e1bc9a0SAchim Leubner } /* big else */
9724e1bc9a0SAchim Leubner
9734e1bc9a0SAchim Leubner
9744e1bc9a0SAchim Leubner
9754e1bc9a0SAchim Leubner oneExpander->discoveringPhyId ++;
9764e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
9774e1bc9a0SAchim Leubner {
9784e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
9794e1bc9a0SAchim Leubner {
9804e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: DISCOVERY_UP_STREAM find more ...\n"));
9814e1bc9a0SAchim Leubner /* continue discovery for the next phy */
9824e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
9834e1bc9a0SAchim Leubner }
9844e1bc9a0SAchim Leubner else
9854e1bc9a0SAchim Leubner {
9864e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: DISCOVERY_UP_STREAM last phy continue upstream..\n"));
9874e1bc9a0SAchim Leubner
9884e1bc9a0SAchim Leubner /* for MCN */
9894e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
9904e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
9914e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
9924e1bc9a0SAchim Leubner /* continue upstream discovering */
9934e1bc9a0SAchim Leubner dmUpStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
9944e1bc9a0SAchim Leubner }
9954e1bc9a0SAchim Leubner }
9964e1bc9a0SAchim Leubner else
9974e1bc9a0SAchim Leubner {
9984e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: onePortContext->discovery.status not in DISCOVERY_UP_STREAM; status %d\n", onePortContext->discovery.status));
9994e1bc9a0SAchim Leubner
10004e1bc9a0SAchim Leubner }
10014e1bc9a0SAchim Leubner
10024e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhy: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
10034e1bc9a0SAchim Leubner
10044e1bc9a0SAchim Leubner return;
10054e1bc9a0SAchim Leubner }
10064e1bc9a0SAchim Leubner
10074e1bc9a0SAchim Leubner osGLOBAL void
dmUpStreamDiscover2ExpanderPhy(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander,smpRespDiscover2_t * pDiscoverResp)10084e1bc9a0SAchim Leubner dmUpStreamDiscover2ExpanderPhy(
10094e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
10104e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
10114e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
10124e1bc9a0SAchim Leubner smpRespDiscover2_t *pDiscoverResp
10134e1bc9a0SAchim Leubner )
10144e1bc9a0SAchim Leubner {
10154e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
10164e1bc9a0SAchim Leubner dmDeviceData_t *AttachedDevice = agNULL;
10174e1bc9a0SAchim Leubner dmExpander_t *AttachedExpander;
10184e1bc9a0SAchim Leubner agsaSASIdentify_t sasIdentify;
10194e1bc9a0SAchim Leubner bit8 connectionRate;
10204e1bc9a0SAchim Leubner bit32 attachedSasHi, attachedSasLo;
10214e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
10224e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
10234e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
10244e1bc9a0SAchim Leubner
10254e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: start\n"));
10264e1bc9a0SAchim Leubner
10274e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
10284e1bc9a0SAchim Leubner {
10294e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: invalid port or aborted discovery!!!\n"));
10304e1bc9a0SAchim Leubner return;
10314e1bc9a0SAchim Leubner }
10324e1bc9a0SAchim Leubner
10334e1bc9a0SAchim Leubner if (oneExpander != oneExpander->dmDevice->dmExpander)
10344e1bc9a0SAchim Leubner {
10354e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: wrong!!!\n"));
10364e1bc9a0SAchim Leubner }
10374e1bc9a0SAchim Leubner
10384e1bc9a0SAchim Leubner dm_memset(&sasIdentify, 0, sizeof(agsaSASIdentify_t));
10394e1bc9a0SAchim Leubner
10404e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
10414e1bc9a0SAchim Leubner
10424e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: Phy #%d of SAS %08x-%08x\n",
10434e1bc9a0SAchim Leubner oneExpander->discoveringPhyId,
10444e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi,
10454e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo));
10464e1bc9a0SAchim Leubner
10474e1bc9a0SAchim Leubner DM_DBG2((" Attached device: %s\n",
10484e1bc9a0SAchim Leubner ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 0 ? "No Device" :
10494e1bc9a0SAchim Leubner (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 1 ? "End Device" :
10504e1bc9a0SAchim Leubner (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 2 ? "Edge Expander" : "Fanout Expander")))));
10514e1bc9a0SAchim Leubner
10524e1bc9a0SAchim Leubner
10534e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
10544e1bc9a0SAchim Leubner {
10554e1bc9a0SAchim Leubner DM_DBG2((" SAS address : %08x-%08x\n",
10564e1bc9a0SAchim Leubner SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp),
10574e1bc9a0SAchim Leubner SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp)));
10584e1bc9a0SAchim Leubner DM_DBG2((" SSP Target : %d\n", SAS2_DISCRSP_IS_SSP_TARGET(pDiscoverResp)?1:0));
10594e1bc9a0SAchim Leubner DM_DBG2((" STP Target : %d\n", SAS2_DISCRSP_IS_STP_TARGET(pDiscoverResp)?1:0));
10604e1bc9a0SAchim Leubner DM_DBG2((" SMP Target : %d\n", SAS2_DISCRSP_IS_SMP_TARGET(pDiscoverResp)?1:0));
10614e1bc9a0SAchim Leubner DM_DBG2((" SATA DEVICE : %d\n", SAS2_DISCRSP_IS_SATA_DEVICE(pDiscoverResp)?1:0));
10624e1bc9a0SAchim Leubner DM_DBG2((" SSP Initiator : %d\n", SAS2_DISCRSP_IS_SSP_INITIATOR(pDiscoverResp)?1:0));
10634e1bc9a0SAchim Leubner DM_DBG2((" STP Initiator : %d\n", SAS2_DISCRSP_IS_STP_INITIATOR(pDiscoverResp)?1:0));
10644e1bc9a0SAchim Leubner DM_DBG2((" SMP Initiator : %d\n", SAS2_DISCRSP_IS_SMP_INITIATOR(pDiscoverResp)?1:0));
10654e1bc9a0SAchim Leubner DM_DBG2((" Phy ID : %d\n", pDiscoverResp->phyIdentifier));
10664e1bc9a0SAchim Leubner DM_DBG2((" Attached Phy ID: %d\n", pDiscoverResp->attachedPhyIdentifier));
10674e1bc9a0SAchim Leubner }
10684e1bc9a0SAchim Leubner
10694e1bc9a0SAchim Leubner if (oneExpander->discoveringPhyId != pDiscoverResp->phyIdentifier)
10704e1bc9a0SAchim Leubner {
10714e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: !!! Incorrect SMP response !!!\n"));
10724e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: Request PhyID #%d Response PhyID #%d\n", oneExpander->discoveringPhyId, pDiscoverResp->phyIdentifier));
10734e1bc9a0SAchim Leubner dmhexdump("NO_DEVICE", (bit8*)pDiscoverResp, sizeof(smpRespDiscover2_t));
10744e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
10754e1bc9a0SAchim Leubner return;
10764e1bc9a0SAchim Leubner }
10774e1bc9a0SAchim Leubner
10784e1bc9a0SAchim Leubner /* saving routing attribute for non self-configuring expanders */
10794e1bc9a0SAchim Leubner oneExpander->routingAttribute[pDiscoverResp->phyIdentifier] = SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp);
10804e1bc9a0SAchim Leubner
10814e1bc9a0SAchim Leubner if ( oneDeviceData->SASSpecDeviceType == SAS_FANOUT_EXPANDER_DEVICE )
10824e1bc9a0SAchim Leubner {
10834e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: SA_SAS_DEV_TYPE_FANOUT_EXPANDER\n"));
10844e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE)
10854e1bc9a0SAchim Leubner {
10864e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: **** Topology Error subtractive routing on fanout expander device!!!\n"));
10874e1bc9a0SAchim Leubner
10884e1bc9a0SAchim Leubner /* discovery error */
10894e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
10904e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
10914e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
10924e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
10934e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
10944e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
10954e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
10964e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
10974e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
10984e1bc9a0SAchim Leubner
10994e1bc9a0SAchim Leubner /* (2.1.3) discovery done */
11004e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
11014e1bc9a0SAchim Leubner return;
11024e1bc9a0SAchim Leubner }
11034e1bc9a0SAchim Leubner }
11044e1bc9a0SAchim Leubner else
11054e1bc9a0SAchim Leubner {
11064e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: SA_SAS_DEV_TYPE_EDGE_EXPANDER\n"));
11074e1bc9a0SAchim Leubner
11084e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
11094e1bc9a0SAchim Leubner {
11104e1bc9a0SAchim Leubner /* Setup sasIdentify for the attached device */
11114e1bc9a0SAchim Leubner sasIdentify.phyIdentifier = pDiscoverResp->phyIdentifier;
11124e1bc9a0SAchim Leubner sasIdentify.deviceType_addressFrameType = pDiscoverResp->attachedDeviceTypeReason & 0x70;
11134e1bc9a0SAchim Leubner sasIdentify.initiator_ssp_stp_smp = pDiscoverResp->attached_Ssp_Stp_Smp_Sata_Initiator;
11144e1bc9a0SAchim Leubner sasIdentify.target_ssp_stp_smp = pDiscoverResp->attached_SataPS_Ssp_Stp_Smp_Sata_Target;
11154e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressHi = *(bit32*)pDiscoverResp->attachedSasAddressHi;
11164e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressLo = *(bit32*)pDiscoverResp->attachedSasAddressLo;
11174e1bc9a0SAchim Leubner
11184e1bc9a0SAchim Leubner /* incremental discovery */
11194e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify);
11204e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify);
11214e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = sasIdentify.initiator_ssp_stp_smp;
11224e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = sasIdentify.target_ssp_stp_smp;
11234e1bc9a0SAchim Leubner
11244e1bc9a0SAchim Leubner attachedSasHi = SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp);
11254e1bc9a0SAchim Leubner attachedSasLo = SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp);
11264e1bc9a0SAchim Leubner
11274e1bc9a0SAchim Leubner /* If the phy has subtractive routing attribute */
11284e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE)
11294e1bc9a0SAchim Leubner {
11304e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: SA_SAS_ROUTING_SUBTRACTIVE\n"));
11314e1bc9a0SAchim Leubner /* Setup upstream phys */
11324e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, oneExpander, (bit8) pDiscoverResp->attachedPhyIdentifier);
11334e1bc9a0SAchim Leubner /* If the expander already has an upsteam device set up */
11344e1bc9a0SAchim Leubner if (oneExpander->hasUpStreamDevice == agTRUE)
11354e1bc9a0SAchim Leubner {
11364e1bc9a0SAchim Leubner /* just to update MCN */
11374e1bc9a0SAchim Leubner dmPortSASDeviceFind(dmRoot, onePortContext, attachedSasLo, attachedSasHi, oneDeviceData);
11384e1bc9a0SAchim Leubner /* If the sas address doesn't match */
11394e1bc9a0SAchim Leubner if ( ((oneExpander->upStreamSASAddressHi != attachedSasHi) ||
11404e1bc9a0SAchim Leubner (oneExpander->upStreamSASAddressLo != attachedSasLo)) &&
11414e1bc9a0SAchim Leubner (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE ||
11424e1bc9a0SAchim Leubner SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
11434e1bc9a0SAchim Leubner )
11444e1bc9a0SAchim Leubner {
11454e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
11464e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: **** Topology Error subtractive routing error - inconsistent SAS address!!!\n"));
11474e1bc9a0SAchim Leubner /* call back to notify discovery error */
11484e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
11494e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
11504e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
11514e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
11524e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
11534e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
11544e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
11554e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
11564e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
11574e1bc9a0SAchim Leubner /* discovery done */
11584e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
11594e1bc9a0SAchim Leubner }
11604e1bc9a0SAchim Leubner }
11614e1bc9a0SAchim Leubner else
11624e1bc9a0SAchim Leubner {
11634e1bc9a0SAchim Leubner /* Setup SAS address for up stream device */
11644e1bc9a0SAchim Leubner oneExpander->hasUpStreamDevice = agTRUE;
11654e1bc9a0SAchim Leubner oneExpander->upStreamSASAddressHi = attachedSasHi;
11664e1bc9a0SAchim Leubner oneExpander->upStreamSASAddressLo = attachedSasLo;
11674e1bc9a0SAchim Leubner
11684e1bc9a0SAchim Leubner if ( (onePortContext->sasLocalAddressHi != attachedSasHi)
11694e1bc9a0SAchim Leubner || (onePortContext->sasLocalAddressLo != attachedSasLo) )
11704e1bc9a0SAchim Leubner {
11714e1bc9a0SAchim Leubner /* Find the device from the discovered list */
11724e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceFind(dmRoot, onePortContext, attachedSasLo, attachedSasHi, oneDeviceData);
11734e1bc9a0SAchim Leubner /* If the device has been discovered before */
11744e1bc9a0SAchim Leubner if ( AttachedDevice != agNULL)
11754e1bc9a0SAchim Leubner {
11764e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: Seen This Device Before\n"));
11774e1bc9a0SAchim Leubner /* If attached device is an edge expander */
11784e1bc9a0SAchim Leubner if ( AttachedDevice->SASSpecDeviceType == SAS_EDGE_EXPANDER_DEVICE)
11794e1bc9a0SAchim Leubner {
11804e1bc9a0SAchim Leubner /* The attached device is an expander */
11814e1bc9a0SAchim Leubner AttachedExpander = AttachedDevice->dmExpander;
11824e1bc9a0SAchim Leubner /* If the two expanders are the root of the two edge expander sets */
11834e1bc9a0SAchim Leubner if ( (AttachedExpander->upStreamSASAddressHi ==
11844e1bc9a0SAchim Leubner DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo))
11854e1bc9a0SAchim Leubner && (AttachedExpander->upStreamSASAddressLo ==
11864e1bc9a0SAchim Leubner DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo)) )
11874e1bc9a0SAchim Leubner {
11884e1bc9a0SAchim Leubner /* Setup upstream expander for the pExpander */
11894e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = AttachedExpander;
11904e1bc9a0SAchim Leubner }
11914e1bc9a0SAchim Leubner /* If the two expanders are not the root of the two edge expander sets */
11924e1bc9a0SAchim Leubner else
11934e1bc9a0SAchim Leubner {
11944e1bc9a0SAchim Leubner /* TODO: loop found, discovery error, callback */
11954e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: **** Topology Error loop detection!!!\n"));
11964e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
11974e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
11984e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
11994e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
12004e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
12014e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
12024e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
12034e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
12044e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
12054e1bc9a0SAchim Leubner /* discovery done */
12064e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
12074e1bc9a0SAchim Leubner }
12084e1bc9a0SAchim Leubner }
12094e1bc9a0SAchim Leubner /* If attached device is not an edge expander */
12104e1bc9a0SAchim Leubner else
12114e1bc9a0SAchim Leubner {
12124e1bc9a0SAchim Leubner /*TODO: should not happen, ASSERT */
12134e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy, *** Attached Device is not Edge. Confused!!!\n"));
12144e1bc9a0SAchim Leubner }
12154e1bc9a0SAchim Leubner }
12164e1bc9a0SAchim Leubner /* If the device has not been discovered before */
12174e1bc9a0SAchim Leubner else
12184e1bc9a0SAchim Leubner {
12194e1bc9a0SAchim Leubner /* Add the device */
12204e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: New device\n"));
12214e1bc9a0SAchim Leubner /* read minimum rate from the configuration
12224e1bc9a0SAchim Leubner onePortContext->LinkRate is SPC's local link rate
12234e1bc9a0SAchim Leubner */
12244e1bc9a0SAchim Leubner connectionRate = MIN(onePortContext->LinkRate, SAS2_DISCRSP_GET_LOGICAL_LINKRATE(pDiscoverResp));
12254e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: link rate 0x%x\n", onePortContext->LinkRate));
12264e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: negotiatedPhyLinkRate 0x%x\n", SAS2_DISCRSP_GET_LINKRATE(pDiscoverResp)));
12274e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: connectionRate 0x%x\n", connectionRate));
12284e1bc9a0SAchim Leubner //hhhhhhhh
12294e1bc9a0SAchim Leubner if (SAS2_DISCRSP_IS_STP_TARGET(pDiscoverResp) || SAS2_DISCRSP_IS_SATA_DEVICE(pDiscoverResp))
12304e1bc9a0SAchim Leubner {
12314e1bc9a0SAchim Leubner /* incremental discovery */
12324e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
12334e1bc9a0SAchim Leubner {
12344e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
12354e1bc9a0SAchim Leubner dmRoot,
12364e1bc9a0SAchim Leubner onePortContext,
12374e1bc9a0SAchim Leubner sasIdentify,
12384e1bc9a0SAchim Leubner agFALSE,
12394e1bc9a0SAchim Leubner connectionRate,
12404e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
12414e1bc9a0SAchim Leubner 0,
12424e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
12434e1bc9a0SAchim Leubner oneDeviceData,
12444e1bc9a0SAchim Leubner oneExpander,
12454e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
12464e1bc9a0SAchim Leubner );
12474e1bc9a0SAchim Leubner }
12484e1bc9a0SAchim Leubner else
12494e1bc9a0SAchim Leubner {
12504e1bc9a0SAchim Leubner /* incremental discovery */
12514e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
12524e1bc9a0SAchim Leubner dmRoot,
12534e1bc9a0SAchim Leubner onePortContext,
12544e1bc9a0SAchim Leubner &dmSASSubID
12554e1bc9a0SAchim Leubner );
12564e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
12574e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
12584e1bc9a0SAchim Leubner {
12594e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
12604e1bc9a0SAchim Leubner dmRoot,
12614e1bc9a0SAchim Leubner onePortContext,
12624e1bc9a0SAchim Leubner sasIdentify,
12634e1bc9a0SAchim Leubner agFALSE,
12644e1bc9a0SAchim Leubner connectionRate,
12654e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
12664e1bc9a0SAchim Leubner 0,
12674e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
12684e1bc9a0SAchim Leubner oneDeviceData,
12694e1bc9a0SAchim Leubner oneExpander,
12704e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
12714e1bc9a0SAchim Leubner );
12724e1bc9a0SAchim Leubner }
12734e1bc9a0SAchim Leubner }
12744e1bc9a0SAchim Leubner }
12754e1bc9a0SAchim Leubner else
12764e1bc9a0SAchim Leubner {
12774e1bc9a0SAchim Leubner /* incremental discovery */
12784e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
12794e1bc9a0SAchim Leubner {
12804e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
12814e1bc9a0SAchim Leubner dmRoot,
12824e1bc9a0SAchim Leubner onePortContext,
12834e1bc9a0SAchim Leubner sasIdentify,
12844e1bc9a0SAchim Leubner agFALSE,
12854e1bc9a0SAchim Leubner connectionRate,
12864e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
12874e1bc9a0SAchim Leubner 0,
12884e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
12894e1bc9a0SAchim Leubner oneDeviceData,
12904e1bc9a0SAchim Leubner oneExpander,
12914e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
12924e1bc9a0SAchim Leubner );
12934e1bc9a0SAchim Leubner }
12944e1bc9a0SAchim Leubner else
12954e1bc9a0SAchim Leubner {
12964e1bc9a0SAchim Leubner /* incremental discovery */
12974e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
12984e1bc9a0SAchim Leubner dmRoot,
12994e1bc9a0SAchim Leubner onePortContext,
13004e1bc9a0SAchim Leubner &dmSASSubID
13014e1bc9a0SAchim Leubner );
13024e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
13034e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
13044e1bc9a0SAchim Leubner {
13054e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
13064e1bc9a0SAchim Leubner dmRoot,
13074e1bc9a0SAchim Leubner onePortContext,
13084e1bc9a0SAchim Leubner sasIdentify,
13094e1bc9a0SAchim Leubner agFALSE,
13104e1bc9a0SAchim Leubner connectionRate,
13114e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
13124e1bc9a0SAchim Leubner 0,
13134e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
13144e1bc9a0SAchim Leubner oneDeviceData,
13154e1bc9a0SAchim Leubner oneExpander,
13164e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
13174e1bc9a0SAchim Leubner );
13184e1bc9a0SAchim Leubner }
13194e1bc9a0SAchim Leubner }
13204e1bc9a0SAchim Leubner }
13214e1bc9a0SAchim Leubner /* If the device is added successfully */
13224e1bc9a0SAchim Leubner if ( AttachedDevice != agNULL)
13234e1bc9a0SAchim Leubner {
13244e1bc9a0SAchim Leubner
13254e1bc9a0SAchim Leubner /* (3.1.2.3.2.3.2.1) callback about new device */
13264e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_IS_SSP_TARGET(pDiscoverResp)
13274e1bc9a0SAchim Leubner || SAS2_DISCRSP_IS_SSP_INITIATOR(pDiscoverResp)
13284e1bc9a0SAchim Leubner || SAS2_DISCRSP_IS_SMP_INITIATOR(pDiscoverResp)
13294e1bc9a0SAchim Leubner || SAS2_DISCRSP_IS_SMP_INITIATOR(pDiscoverResp) )
13304e1bc9a0SAchim Leubner {
13314e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: Found SSP/SMP SAS %08x-%08x\n",
13324e1bc9a0SAchim Leubner attachedSasHi, attachedSasLo));
13334e1bc9a0SAchim Leubner }
13344e1bc9a0SAchim Leubner else
13354e1bc9a0SAchim Leubner {
13364e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: Found a SAS STP device.\n"));
13374e1bc9a0SAchim Leubner }
13384e1bc9a0SAchim Leubner /* If the attached device is an expander */
13394e1bc9a0SAchim Leubner if ( (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
13404e1bc9a0SAchim Leubner || (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE) )
13414e1bc9a0SAchim Leubner {
13424e1bc9a0SAchim Leubner /* Allocate an expander data structure */
13434e1bc9a0SAchim Leubner AttachedExpander = dmDiscoveringExpanderAlloc(
13444e1bc9a0SAchim Leubner dmRoot,
13454e1bc9a0SAchim Leubner onePortContext,
13464e1bc9a0SAchim Leubner AttachedDevice
13474e1bc9a0SAchim Leubner );
13484e1bc9a0SAchim Leubner
13494e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: Found expander=%p\n", AttachedExpander));
13504e1bc9a0SAchim Leubner /* If allocate successfully */
13514e1bc9a0SAchim Leubner if ( AttachedExpander != agNULL)
13524e1bc9a0SAchim Leubner {
13534e1bc9a0SAchim Leubner /* Add the pAttachedExpander to discovering list */
13544e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
13554e1bc9a0SAchim Leubner /* Setup upstream expander for the pExpander */
13564e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = AttachedExpander;
13574e1bc9a0SAchim Leubner }
13584e1bc9a0SAchim Leubner /* If failed to allocate */
13594e1bc9a0SAchim Leubner else
13604e1bc9a0SAchim Leubner {
13614e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy, Failed to allocate expander data structure!!!\n"));
13624e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
13634e1bc9a0SAchim Leubner }
13644e1bc9a0SAchim Leubner }
13654e1bc9a0SAchim Leubner /* If the attached device is an end device */
13664e1bc9a0SAchim Leubner else
13674e1bc9a0SAchim Leubner {
13684e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: Found end device\n"));
13694e1bc9a0SAchim Leubner /* LP2006-05-26 added upstream device to the newly found device */
13704e1bc9a0SAchim Leubner AttachedDevice->dmExpander = oneExpander;
13714e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = agNULL;
13724e1bc9a0SAchim Leubner }
13734e1bc9a0SAchim Leubner }
13744e1bc9a0SAchim Leubner else
13754e1bc9a0SAchim Leubner {
13764e1bc9a0SAchim Leubner DM_DBG1(("dmUpStreamDiscover2ExpanderPhy, Failed to add a device!!!\n"));
13774e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
13784e1bc9a0SAchim Leubner }
13794e1bc9a0SAchim Leubner }
13804e1bc9a0SAchim Leubner }
13814e1bc9a0SAchim Leubner }
13824e1bc9a0SAchim Leubner } /* substractive routing */
13834e1bc9a0SAchim Leubner }
13844e1bc9a0SAchim Leubner }
13854e1bc9a0SAchim Leubner
13864e1bc9a0SAchim Leubner oneExpander->discoveringPhyId ++;
13874e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
13884e1bc9a0SAchim Leubner {
13894e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
13904e1bc9a0SAchim Leubner {
13914e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: DISCOVERY_UP_STREAM find more ...\n"));
13924e1bc9a0SAchim Leubner /* continue discovery for the next phy */
13934e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
13944e1bc9a0SAchim Leubner }
13954e1bc9a0SAchim Leubner else
13964e1bc9a0SAchim Leubner {
13974e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: DISCOVERY_UP_STREAM last phy continue upstream..\n"));
13984e1bc9a0SAchim Leubner
13994e1bc9a0SAchim Leubner /* for MCN */
14004e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
14014e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
14024e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
14034e1bc9a0SAchim Leubner /* continue upstream discovering */
14044e1bc9a0SAchim Leubner dmUpStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
14054e1bc9a0SAchim Leubner }
14064e1bc9a0SAchim Leubner }
14074e1bc9a0SAchim Leubner else
14084e1bc9a0SAchim Leubner {
14094e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: onePortContext->discovery.status not in DISCOVERY_UP_STREAM; status %d\n", onePortContext->discovery.status));
14104e1bc9a0SAchim Leubner
14114e1bc9a0SAchim Leubner }
14124e1bc9a0SAchim Leubner
14134e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhy: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
14144e1bc9a0SAchim Leubner
14154e1bc9a0SAchim Leubner return;
14164e1bc9a0SAchim Leubner }
14174e1bc9a0SAchim Leubner
14184e1bc9a0SAchim Leubner
14194e1bc9a0SAchim Leubner osGLOBAL void
dmDownStreamDiscoverExpanderPhy(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander,smpRespDiscover_t * pDiscoverResp)14204e1bc9a0SAchim Leubner dmDownStreamDiscoverExpanderPhy(
14214e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
14224e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
14234e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
14244e1bc9a0SAchim Leubner smpRespDiscover_t *pDiscoverResp
14254e1bc9a0SAchim Leubner )
14264e1bc9a0SAchim Leubner {
14274e1bc9a0SAchim Leubner agsaSASIdentify_t sasIdentify;
14284e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
14294e1bc9a0SAchim Leubner bit32 attachedSasHi, attachedSasLo;
14304e1bc9a0SAchim Leubner dmExpander_t *AttachedExpander;
14314e1bc9a0SAchim Leubner dmExpander_t *UpStreamExpander;
14324e1bc9a0SAchim Leubner dmExpander_t *ConfigurableExpander = agNULL;
14334e1bc9a0SAchim Leubner bit8 connectionRate, negotiatedPhyLinkRate;
14344e1bc9a0SAchim Leubner bit32 configSASAddressHi;
14354e1bc9a0SAchim Leubner bit32 configSASAddressLo;
14364e1bc9a0SAchim Leubner bit32 dupConfigSASAddr = agFALSE;
14374e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
14384e1bc9a0SAchim Leubner dmDeviceData_t *AttachedDevice = agNULL;
14394e1bc9a0SAchim Leubner bit32 SAS2SAS11Check = agFALSE;
14404e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
14414e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
14424e1bc9a0SAchim Leubner
14434e1bc9a0SAchim Leubner
14444e1bc9a0SAchim Leubner
14454e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: start\n"));
14464e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
14474e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
14484e1bc9a0SAchim Leubner
14494e1bc9a0SAchim Leubner DM_ASSERT(dmRoot, "(dmDownStreamDiscoverExpanderPhy) dmRoot NULL");
14504e1bc9a0SAchim Leubner DM_ASSERT(onePortContext, "(dmDownStreamDiscoverExpanderPhy) pPort NULL");
14514e1bc9a0SAchim Leubner DM_ASSERT(oneExpander, "(dmDownStreamDiscoverExpanderPhy) pExpander NULL");
14524e1bc9a0SAchim Leubner DM_ASSERT(pDiscoverResp, "(dmDownStreamDiscoverExpanderPhy) pDiscoverResp NULL");
14534e1bc9a0SAchim Leubner
14544e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: onePortContxt=%p oneExpander=%p\n", onePortContext, oneExpander));
14554e1bc9a0SAchim Leubner
14564e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
14574e1bc9a0SAchim Leubner {
14584e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: invalid port or aborted discovery!!!\n"));
14594e1bc9a0SAchim Leubner return;
14604e1bc9a0SAchim Leubner }
14614e1bc9a0SAchim Leubner
14624e1bc9a0SAchim Leubner if (oneExpander != oneExpander->dmDevice->dmExpander)
14634e1bc9a0SAchim Leubner {
14644e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: wrong!!!\n"));
14654e1bc9a0SAchim Leubner }
14664e1bc9a0SAchim Leubner
14674e1bc9a0SAchim Leubner /* (1) Find the device structure of the expander */
14684e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
14694e1bc9a0SAchim Leubner
14704e1bc9a0SAchim Leubner DM_ASSERT(oneDeviceData, "(dmDownStreamDiscoverExpanderPhy) pDevice NULL");
14714e1bc9a0SAchim Leubner
14724e1bc9a0SAchim Leubner /* for debugging */
14734e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Phy #%d of SAS %08x-%08x\n",
14744e1bc9a0SAchim Leubner oneExpander->discoveringPhyId,
14754e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi,
14764e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo));
14774e1bc9a0SAchim Leubner
14784e1bc9a0SAchim Leubner DM_DBG3((" Attached device: %s\n",
14794e1bc9a0SAchim Leubner ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 0 ? "No Device" :
14804e1bc9a0SAchim Leubner (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 1 ? "End Device" :
14814e1bc9a0SAchim Leubner (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 2 ? "Edge Expander" : "Fanout Expander")))));
14824e1bc9a0SAchim Leubner
14834e1bc9a0SAchim Leubner
14844e1bc9a0SAchim Leubner /* for debugging */
14854e1bc9a0SAchim Leubner if (oneExpander->discoveringPhyId != pDiscoverResp->phyIdentifier)
14864e1bc9a0SAchim Leubner {
14874e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: !!! Incorrect SMP response !!!\n"));
14884e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: Request PhyID #%d Response PhyID #%d !!!\n", oneExpander->discoveringPhyId, pDiscoverResp->phyIdentifier));
14894e1bc9a0SAchim Leubner dmhexdump("NO_DEVICE", (bit8*)pDiscoverResp, sizeof(smpRespDiscover_t));
14904e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
14914e1bc9a0SAchim Leubner return;
14924e1bc9a0SAchim Leubner }
14934e1bc9a0SAchim Leubner
14944e1bc9a0SAchim Leubner if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
14954e1bc9a0SAchim Leubner {
14964e1bc9a0SAchim Leubner DM_DBG3((" SAS address : %08x-%08x\n",
14974e1bc9a0SAchim Leubner DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp),
14984e1bc9a0SAchim Leubner DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp)));
14994e1bc9a0SAchim Leubner DM_DBG3((" SSP Target : %d\n", DISCRSP_IS_SSP_TARGET(pDiscoverResp)?1:0));
15004e1bc9a0SAchim Leubner DM_DBG3((" STP Target : %d\n", DISCRSP_IS_STP_TARGET(pDiscoverResp)?1:0));
15014e1bc9a0SAchim Leubner DM_DBG3((" SMP Target : %d\n", DISCRSP_IS_SMP_TARGET(pDiscoverResp)?1:0));
15024e1bc9a0SAchim Leubner DM_DBG3((" SATA DEVICE : %d\n", DISCRSP_IS_SATA_DEVICE(pDiscoverResp)?1:0));
15034e1bc9a0SAchim Leubner DM_DBG3((" SSP Initiator : %d\n", DISCRSP_IS_SSP_INITIATOR(pDiscoverResp)?1:0));
15044e1bc9a0SAchim Leubner DM_DBG3((" STP Initiator : %d\n", DISCRSP_IS_STP_INITIATOR(pDiscoverResp)?1:0));
15054e1bc9a0SAchim Leubner DM_DBG3((" SMP Initiator : %d\n", DISCRSP_IS_SMP_INITIATOR(pDiscoverResp)?1:0));
15064e1bc9a0SAchim Leubner DM_DBG3((" Phy ID : %d\n", pDiscoverResp->phyIdentifier));
15074e1bc9a0SAchim Leubner DM_DBG3((" Attached Phy ID: %d\n", pDiscoverResp->attachedPhyIdentifier));
15084e1bc9a0SAchim Leubner
15094e1bc9a0SAchim Leubner }
15104e1bc9a0SAchim Leubner /* end for debugging */
15114e1bc9a0SAchim Leubner
15124e1bc9a0SAchim Leubner /* saving routing attribute for non self-configuring expanders */
15134e1bc9a0SAchim Leubner oneExpander->routingAttribute[pDiscoverResp->phyIdentifier] = DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp);
15144e1bc9a0SAchim Leubner
15154e1bc9a0SAchim Leubner oneExpander->discoverSMPAllowed = agTRUE;
15164e1bc9a0SAchim Leubner
15174e1bc9a0SAchim Leubner /* If a device is attached */
15184e1bc9a0SAchim Leubner if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
15194e1bc9a0SAchim Leubner {
15204e1bc9a0SAchim Leubner /* Setup sasIdentify for the attached device */
15214e1bc9a0SAchim Leubner sasIdentify.phyIdentifier = pDiscoverResp->phyIdentifier;
15224e1bc9a0SAchim Leubner sasIdentify.deviceType_addressFrameType = pDiscoverResp->attachedDeviceType & 0x70;
15234e1bc9a0SAchim Leubner sasIdentify.initiator_ssp_stp_smp = pDiscoverResp->attached_Ssp_Stp_Smp_Sata_Initiator;
15244e1bc9a0SAchim Leubner sasIdentify.target_ssp_stp_smp = pDiscoverResp->attached_SataPS_Ssp_Stp_Smp_Sata_Target;
15254e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressHi = *(bit32*)pDiscoverResp->attachedSasAddressHi;
15264e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressLo = *(bit32*)pDiscoverResp->attachedSasAddressLo;
15274e1bc9a0SAchim Leubner
15284e1bc9a0SAchim Leubner /* incremental discovery */
15294e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify);
15304e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify);
15314e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = sasIdentify.initiator_ssp_stp_smp;
15324e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = sasIdentify.target_ssp_stp_smp;
15334e1bc9a0SAchim Leubner
15344e1bc9a0SAchim Leubner attachedSasHi = DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp);
15354e1bc9a0SAchim Leubner attachedSasLo = DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp);
15364e1bc9a0SAchim Leubner
15374e1bc9a0SAchim Leubner /* If it's a direct routing */
15384e1bc9a0SAchim Leubner if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_DIRECT)
15394e1bc9a0SAchim Leubner {
15404e1bc9a0SAchim Leubner /* If the attached device is an expander */
15414e1bc9a0SAchim Leubner if ( (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
15424e1bc9a0SAchim Leubner || (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE) )
15434e1bc9a0SAchim Leubner
15444e1bc9a0SAchim Leubner {
15454e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error direct routing can't connect to expander!!!\n"));
15464e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
15474e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
15484e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
15494e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
15504e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
15514e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
15524e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
15534e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
15544e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
15554e1bc9a0SAchim Leubner
15564e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
15574e1bc9a0SAchim Leubner return;
15584e1bc9a0SAchim Leubner }
15594e1bc9a0SAchim Leubner }
15604e1bc9a0SAchim Leubner
15614e1bc9a0SAchim Leubner /* If the expander's attached device is not myself */
15624e1bc9a0SAchim Leubner if ( (attachedSasHi != onePortContext->sasLocalAddressHi)
15634e1bc9a0SAchim Leubner || (attachedSasLo != onePortContext->sasLocalAddressLo) )
15644e1bc9a0SAchim Leubner {
15654e1bc9a0SAchim Leubner /* Find the attached device from discovered list */
15664e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceFind(dmRoot, onePortContext, attachedSasLo, attachedSasHi, oneDeviceData);
15674e1bc9a0SAchim Leubner /* If the device has not been discovered before */
15684e1bc9a0SAchim Leubner if ( AttachedDevice == agNULL) //11
15694e1bc9a0SAchim Leubner {
15704e1bc9a0SAchim Leubner /* If the phy has subtractive routing attribute */
15714e1bc9a0SAchim Leubner if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE &&
15724e1bc9a0SAchim Leubner (DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE ||
15734e1bc9a0SAchim Leubner DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
15744e1bc9a0SAchim Leubner )
15754e1bc9a0SAchim Leubner {
15764e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
15774e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: Deferred!!! **** Topology Error subtractive routing error - inconsistent SAS address!!!\n"));
15784e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
15794e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
15804e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
15814e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
15824e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
15834e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
15844e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
15854e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
15864e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
15874e1bc9a0SAchim Leubner
15884e1bc9a0SAchim Leubner onePortContext->discovery.DeferredError = agTRUE;
15894e1bc9a0SAchim Leubner }
15904e1bc9a0SAchim Leubner else /* 11 */
15914e1bc9a0SAchim Leubner {
15924e1bc9a0SAchim Leubner /* Add the device */
15934e1bc9a0SAchim Leubner /* read minimum rate from the configuration
15944e1bc9a0SAchim Leubner onePortContext->LinkRate is SPC's local link rate
15954e1bc9a0SAchim Leubner */
15964e1bc9a0SAchim Leubner connectionRate = MIN(onePortContext->LinkRate, DISCRSP_GET_LINKRATE(pDiscoverResp));
15974e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: link rate 0x%x\n", DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo)));
15984e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: negotiatedPhyLinkRate 0x%x\n", DISCRSP_GET_LINKRATE(pDiscoverResp)));
15994e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: connectionRate 0x%x\n", connectionRate));
16004e1bc9a0SAchim Leubner if (DISCRSP_IS_STP_TARGET(pDiscoverResp) || DISCRSP_IS_SATA_DEVICE(pDiscoverResp))
16014e1bc9a0SAchim Leubner {
16024e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
16034e1bc9a0SAchim Leubner {
16044e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
16054e1bc9a0SAchim Leubner dmRoot,
16064e1bc9a0SAchim Leubner onePortContext,
16074e1bc9a0SAchim Leubner sasIdentify,
16084e1bc9a0SAchim Leubner agFALSE,
16094e1bc9a0SAchim Leubner connectionRate,
16104e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
16114e1bc9a0SAchim Leubner 0,
16124e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
16134e1bc9a0SAchim Leubner oneDeviceData,
16144e1bc9a0SAchim Leubner oneExpander,
16154e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
16164e1bc9a0SAchim Leubner );
16174e1bc9a0SAchim Leubner }
16184e1bc9a0SAchim Leubner else
16194e1bc9a0SAchim Leubner {
16204e1bc9a0SAchim Leubner /* incremental discovery */
16214e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
16224e1bc9a0SAchim Leubner dmRoot,
16234e1bc9a0SAchim Leubner onePortContext,
16244e1bc9a0SAchim Leubner &dmSASSubID
16254e1bc9a0SAchim Leubner );
16264e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
16274e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
16284e1bc9a0SAchim Leubner {
16294e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
16304e1bc9a0SAchim Leubner dmRoot,
16314e1bc9a0SAchim Leubner onePortContext,
16324e1bc9a0SAchim Leubner sasIdentify,
16334e1bc9a0SAchim Leubner agFALSE,
16344e1bc9a0SAchim Leubner connectionRate,
16354e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
16364e1bc9a0SAchim Leubner 0,
16374e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
16384e1bc9a0SAchim Leubner oneDeviceData,
16394e1bc9a0SAchim Leubner oneExpander,
16404e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
16414e1bc9a0SAchim Leubner );
16424e1bc9a0SAchim Leubner }
16434e1bc9a0SAchim Leubner }
16444e1bc9a0SAchim Leubner } /* DISCRSP_IS_STP_TARGET(pDiscoverResp) || DISCRSP_IS_SATA_DEVICE(pDiscoverResp) */
16454e1bc9a0SAchim Leubner else /* 22 */
16464e1bc9a0SAchim Leubner {
16474e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
16484e1bc9a0SAchim Leubner {
16494e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
16504e1bc9a0SAchim Leubner dmRoot,
16514e1bc9a0SAchim Leubner onePortContext,
16524e1bc9a0SAchim Leubner sasIdentify,
16534e1bc9a0SAchim Leubner agFALSE,
16544e1bc9a0SAchim Leubner connectionRate,
16554e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
16564e1bc9a0SAchim Leubner 0,
16574e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
16584e1bc9a0SAchim Leubner oneDeviceData,
16594e1bc9a0SAchim Leubner oneExpander,
16604e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
16614e1bc9a0SAchim Leubner );
16624e1bc9a0SAchim Leubner }
16634e1bc9a0SAchim Leubner else
16644e1bc9a0SAchim Leubner {
16654e1bc9a0SAchim Leubner /* incremental discovery */
16664e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
16674e1bc9a0SAchim Leubner dmRoot,
16684e1bc9a0SAchim Leubner onePortContext,
16694e1bc9a0SAchim Leubner &dmSASSubID
16704e1bc9a0SAchim Leubner );
16714e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
16724e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
16734e1bc9a0SAchim Leubner {
16744e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
16754e1bc9a0SAchim Leubner dmRoot,
16764e1bc9a0SAchim Leubner onePortContext,
16774e1bc9a0SAchim Leubner sasIdentify,
16784e1bc9a0SAchim Leubner agFALSE,
16794e1bc9a0SAchim Leubner connectionRate,
16804e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
16814e1bc9a0SAchim Leubner 0,
16824e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
16834e1bc9a0SAchim Leubner oneDeviceData,
16844e1bc9a0SAchim Leubner oneExpander,
16854e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
16864e1bc9a0SAchim Leubner );
16874e1bc9a0SAchim Leubner }
16884e1bc9a0SAchim Leubner }
16894e1bc9a0SAchim Leubner } /* else 22 */
16904e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: newDevice pDevice=%p\n", AttachedDevice));
16914e1bc9a0SAchim Leubner /* If the device is added successfully */
16924e1bc9a0SAchim Leubner if ( AttachedDevice != agNULL)
16934e1bc9a0SAchim Leubner {
16944e1bc9a0SAchim Leubner if ( SA_IDFRM_IS_SSP_TARGET(&sasIdentify)
16954e1bc9a0SAchim Leubner || SA_IDFRM_IS_SMP_TARGET(&sasIdentify)
16964e1bc9a0SAchim Leubner || SA_IDFRM_IS_SSP_INITIATOR(&sasIdentify)
16974e1bc9a0SAchim Leubner || SA_IDFRM_IS_SMP_INITIATOR(&sasIdentify) )
16984e1bc9a0SAchim Leubner {
16994e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Report a new SAS device !!\n"));
17004e1bc9a0SAchim Leubner
17014e1bc9a0SAchim Leubner }
17024e1bc9a0SAchim Leubner else
17034e1bc9a0SAchim Leubner {
17044e1bc9a0SAchim Leubner if ( SA_IDFRM_IS_STP_TARGET(&sasIdentify) ||
17054e1bc9a0SAchim Leubner SA_IDFRM_IS_SATA_DEVICE(&sasIdentify) )
17064e1bc9a0SAchim Leubner {
17074e1bc9a0SAchim Leubner
17084e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Found an STP or SATA device.\n"));
17094e1bc9a0SAchim Leubner }
17104e1bc9a0SAchim Leubner else
17114e1bc9a0SAchim Leubner {
17124e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Found Other type of device.\n"));
17134e1bc9a0SAchim Leubner }
17144e1bc9a0SAchim Leubner }
17154e1bc9a0SAchim Leubner
17164e1bc9a0SAchim Leubner /* LP2006-05-26 added upstream device to the newly found device */
17174e1bc9a0SAchim Leubner AttachedDevice->dmExpander = oneExpander;
17184e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: AttachedDevice %p did %d\n", AttachedDevice, AttachedDevice->id));
17194e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Attached oneExpander %p did %d\n", AttachedDevice->dmExpander, AttachedDevice->dmExpander->id));
17204e1bc9a0SAchim Leubner
17214e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
17224e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: oneExpander %p did %d\n", oneDeviceData->dmExpander, oneDeviceData->dmExpander->id));
17234e1bc9a0SAchim Leubner
17244e1bc9a0SAchim Leubner /* If the phy has table routing attribute */
17254e1bc9a0SAchim Leubner if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE)
17264e1bc9a0SAchim Leubner {
17274e1bc9a0SAchim Leubner /* If the attached device is a fan out expander */
17284e1bc9a0SAchim Leubner if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
17294e1bc9a0SAchim Leubner {
17304e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
17314e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error two table routing phys are connected!!!\n"));
17324e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
17334e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
17344e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
17354e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
17364e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
17374e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
17384e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
17394e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
17404e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
17414e1bc9a0SAchim Leubner /* discovery done */
17424e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
17434e1bc9a0SAchim Leubner }
17444e1bc9a0SAchim Leubner else if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
17454e1bc9a0SAchim Leubner {
17464e1bc9a0SAchim Leubner /* Allocate an expander data structure */
17474e1bc9a0SAchim Leubner AttachedExpander = dmDiscoveringExpanderAlloc(dmRoot, onePortContext, AttachedDevice);
17484e1bc9a0SAchim Leubner
17494e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Found a EDGE exp device.%p\n", AttachedExpander));
17504e1bc9a0SAchim Leubner /* If allocate successfully */
17514e1bc9a0SAchim Leubner if ( AttachedExpander != agNULL)
17524e1bc9a0SAchim Leubner {
17534e1bc9a0SAchim Leubner /* set up downstream information on configurable expander */
17544e1bc9a0SAchim Leubner dmExpanderDownStreamPhyAdd(dmRoot, oneExpander, (bit8) oneExpander->discoveringPhyId);
17554e1bc9a0SAchim Leubner /* Setup upstream information */
17564e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, AttachedExpander, (bit8) oneExpander->discoveringPhyId);
17574e1bc9a0SAchim Leubner AttachedExpander->hasUpStreamDevice = agTRUE;
17584e1bc9a0SAchim Leubner AttachedExpander->upStreamSASAddressHi
17594e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
17604e1bc9a0SAchim Leubner AttachedExpander->upStreamSASAddressLo
17614e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
17624e1bc9a0SAchim Leubner AttachedExpander->dmUpStreamExpander = oneExpander;
17634e1bc9a0SAchim Leubner /* (2.3.2.2.2.2.2.2.2) Add the pAttachedExpander to discovering list */
17644e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
17654e1bc9a0SAchim Leubner }
17664e1bc9a0SAchim Leubner /* If failed to allocate */
17674e1bc9a0SAchim Leubner else
17684e1bc9a0SAchim Leubner {
17694e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: Failed to allocate expander data structure!!!\n"));
17704e1bc9a0SAchim Leubner /* discovery done */
17714e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
17724e1bc9a0SAchim Leubner }
17734e1bc9a0SAchim Leubner }
17744e1bc9a0SAchim Leubner } /* DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE */
17754e1bc9a0SAchim Leubner /* If status is still DISCOVERY_DOWN_STREAM */
17764e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
17774e1bc9a0SAchim Leubner {
17784e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 1st before\n"));
17794e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
17804e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
17814e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
17824e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
17834e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
17844e1bc9a0SAchim Leubner if (ConfigurableExpander)
17854e1bc9a0SAchim Leubner {
17864e1bc9a0SAchim Leubner if ( (ConfigurableExpander->dmDevice->SASAddressID.sasAddressHi
17874e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo)) &&
17884e1bc9a0SAchim Leubner (ConfigurableExpander->dmDevice->SASAddressID.sasAddressLo
17894e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo))
17904e1bc9a0SAchim Leubner )
17914e1bc9a0SAchim Leubner { /* directly attached between oneExpander and ConfigurableExpander */
17924e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 1st before loc 1\n"));
17934e1bc9a0SAchim Leubner configSASAddressHi = oneExpander->dmDevice->SASAddressID.sasAddressHi;
17944e1bc9a0SAchim Leubner configSASAddressLo = oneExpander->dmDevice->SASAddressID.sasAddressLo;
17954e1bc9a0SAchim Leubner }
17964e1bc9a0SAchim Leubner else
17974e1bc9a0SAchim Leubner {
17984e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 1st before loc 2\n"));
17994e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
18004e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
18014e1bc9a0SAchim Leubner }
18024e1bc9a0SAchim Leubner } /* if !ConfigurableExpander */
18034e1bc9a0SAchim Leubner
18044e1bc9a0SAchim Leubner dupConfigSASAddr = dmDuplicateConfigSASAddr(dmRoot,
18054e1bc9a0SAchim Leubner ConfigurableExpander,
18064e1bc9a0SAchim Leubner configSASAddressHi,
18074e1bc9a0SAchim Leubner configSASAddressLo
18084e1bc9a0SAchim Leubner );
18094e1bc9a0SAchim Leubner
18104e1bc9a0SAchim Leubner if ( ConfigurableExpander && dupConfigSASAddr == agFALSE)
18114e1bc9a0SAchim Leubner {
18124e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 1st q123\n"));
18134e1bc9a0SAchim Leubner UpStreamExpander->dmCurrentDownStreamExpander = oneExpander;
18144e1bc9a0SAchim Leubner ConfigurableExpander->currentDownStreamPhyIndex =
18154e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(dmRoot, ConfigurableExpander);
18164e1bc9a0SAchim Leubner ConfigurableExpander->dmReturnginExpander = oneExpander;
18174e1bc9a0SAchim Leubner dmRoutingEntryAdd(dmRoot,
18184e1bc9a0SAchim Leubner ConfigurableExpander,
18194e1bc9a0SAchim Leubner ConfigurableExpander->downStreamPhys[ConfigurableExpander->currentDownStreamPhyIndex],
18204e1bc9a0SAchim Leubner configSASAddressHi,
18214e1bc9a0SAchim Leubner configSASAddressLo
18224e1bc9a0SAchim Leubner );
18234e1bc9a0SAchim Leubner }
18244e1bc9a0SAchim Leubner } /* onePortContext->discovery.status == DISCOVERY_DOWN_STREAM */
18254e1bc9a0SAchim Leubner } /* AttachedDevice != agNULL */
18264e1bc9a0SAchim Leubner /* If fail to add the device */
18274e1bc9a0SAchim Leubner else
18284e1bc9a0SAchim Leubner {
18294e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: Failed to add a device!!!\n"));
18304e1bc9a0SAchim Leubner /* discovery done */
18314e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
18324e1bc9a0SAchim Leubner }
18334e1bc9a0SAchim Leubner } /* else 11 */
18344e1bc9a0SAchim Leubner } /* AttachedDevice == agNULL */
18354e1bc9a0SAchim Leubner /* If the device has been discovered before */
18364e1bc9a0SAchim Leubner else /* haha discovered before 33 */
18374e1bc9a0SAchim Leubner {
18384e1bc9a0SAchim Leubner /* If the phy has subtractive routing attribute */
18394e1bc9a0SAchim Leubner if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE)
18404e1bc9a0SAchim Leubner {
18414e1bc9a0SAchim Leubner /* If the expander doesn't have up stream device */
18424e1bc9a0SAchim Leubner if ( oneExpander->hasUpStreamDevice == agFALSE)
18434e1bc9a0SAchim Leubner {
18444e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
18454e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error loop, or end device connects to two expanders!!!\n"));
18464e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
18474e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
18484e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
18494e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
18504e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
18514e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
18524e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
18534e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
18544e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
18554e1bc9a0SAchim Leubner /* discovery done */
18564e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
18574e1bc9a0SAchim Leubner }
18584e1bc9a0SAchim Leubner /* If the expander has up stream device */
18594e1bc9a0SAchim Leubner else /* 44 */
18604e1bc9a0SAchim Leubner {
18614e1bc9a0SAchim Leubner /* If sas address doesn't match */
18624e1bc9a0SAchim Leubner if ( (oneExpander->upStreamSASAddressHi != attachedSasHi)
18634e1bc9a0SAchim Leubner || (oneExpander->upStreamSASAddressLo != attachedSasLo) )
18644e1bc9a0SAchim Leubner {
18654e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
18664e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error two subtractive phys!!!\n"));
18674e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
18684e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
18694e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
18704e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
18714e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
18724e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
18734e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
18744e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
18754e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
18764e1bc9a0SAchim Leubner /* discovery done */
18774e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
18784e1bc9a0SAchim Leubner }
18794e1bc9a0SAchim Leubner } /* else 44 */
18804e1bc9a0SAchim Leubner } /* DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE */
18814e1bc9a0SAchim Leubner /* If the phy has table routing attribute */
18824e1bc9a0SAchim Leubner else if ( DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE)
18834e1bc9a0SAchim Leubner {
18844e1bc9a0SAchim Leubner /* If the attached device is a fan out expander */
18854e1bc9a0SAchim Leubner if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
18864e1bc9a0SAchim Leubner {
18874e1bc9a0SAchim Leubner /* (2.3.3.2.1.1) TODO: discovery error, callback */
18884e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error fan out expander to routing table phy!!!\n"));
18894e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
18904e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
18914e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
18924e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
18934e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
18944e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
18954e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
18964e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
18974e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
18984e1bc9a0SAchim Leubner /* discovery done */
18994e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
19004e1bc9a0SAchim Leubner }
19014e1bc9a0SAchim Leubner /* If the attached device is an edge expander */
19024e1bc9a0SAchim Leubner else if ( DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
19034e1bc9a0SAchim Leubner {
19044e1bc9a0SAchim Leubner /* Setup up stream inform */
19054e1bc9a0SAchim Leubner AttachedExpander = AttachedDevice->dmExpander;
19064e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Found edge expander=%p\n", AttachedExpander));
19074e1bc9a0SAchim Leubner /* If the attached expander has up stream device */
19084e1bc9a0SAchim Leubner if ( AttachedExpander->hasUpStreamDevice == agTRUE)
19094e1bc9a0SAchim Leubner {
19104e1bc9a0SAchim Leubner /* compare the sas address */
19114e1bc9a0SAchim Leubner if ( (AttachedExpander->upStreamSASAddressHi
19124e1bc9a0SAchim Leubner != DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo))
19134e1bc9a0SAchim Leubner || (AttachedExpander->upStreamSASAddressLo
19144e1bc9a0SAchim Leubner != DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo)))
19154e1bc9a0SAchim Leubner {
19164e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
19174e1bc9a0SAchim Leubner SAS2SAS11Check = dmSAS2SAS11ErrorCheck(dmRoot, onePortContext, AttachedExpander, oneExpander, oneExpander);
19184e1bc9a0SAchim Leubner if (SAS2SAS11Check == agTRUE)
19194e1bc9a0SAchim Leubner {
19204e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error SAS2 and SAS1.1!!!\n"));
19214e1bc9a0SAchim Leubner }
19224e1bc9a0SAchim Leubner else
19234e1bc9a0SAchim Leubner {
19244e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error two table routing phys connected (1)!!!\n"));
19254e1bc9a0SAchim Leubner }
19264e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
19274e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
19284e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
19294e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
19304e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
19314e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
19324e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
19334e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
19344e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
19354e1bc9a0SAchim Leubner /* discovery done */
19364e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
19374e1bc9a0SAchim Leubner }
19384e1bc9a0SAchim Leubner else
19394e1bc9a0SAchim Leubner {
19404e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Add edge expander=%p\n", AttachedExpander));
19414e1bc9a0SAchim Leubner /* set up downstream information on configurable expander */
19424e1bc9a0SAchim Leubner
19434e1bc9a0SAchim Leubner dmExpanderDownStreamPhyAdd(dmRoot, oneExpander, (bit8) oneExpander->discoveringPhyId);
19444e1bc9a0SAchim Leubner /* haha */
19454e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, AttachedExpander, (bit8) oneExpander->discoveringPhyId);
19464e1bc9a0SAchim Leubner /* Add the pAttachedExpander to discovering list */
19474e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
19484e1bc9a0SAchim Leubner }
19494e1bc9a0SAchim Leubner } /* AttachedExpander->hasUpStreamDevice == agTRUE */
19504e1bc9a0SAchim Leubner /* If the attached expander doesn't have up stream device */
19514e1bc9a0SAchim Leubner else
19524e1bc9a0SAchim Leubner {
19534e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
19544e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: **** Topology Error two table routing phys connected (2)!!!\n"));
19554e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
19564e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
19574e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
19584e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
19594e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
19604e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscoverExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
19614e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
19624e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
19634e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
19644e1bc9a0SAchim Leubner /* discovery done */
19654e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
19664e1bc9a0SAchim Leubner }
19674e1bc9a0SAchim Leubner } /* DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE */
19684e1bc9a0SAchim Leubner } /* DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE */
19694e1bc9a0SAchim Leubner /* do this regradless of sub or table */
19704e1bc9a0SAchim Leubner /* If status is still DISCOVERY_DOWN_STREAM */
19714e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
19724e1bc9a0SAchim Leubner {
19734e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 2nd before\n"));
19744e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
19754e1bc9a0SAchim Leubner
19764e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
19774e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
19784e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
19794e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
19804e1bc9a0SAchim Leubner if (ConfigurableExpander)
19814e1bc9a0SAchim Leubner {
19824e1bc9a0SAchim Leubner if ( (ConfigurableExpander->dmDevice->SASAddressID.sasAddressHi
19834e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo)) &&
19844e1bc9a0SAchim Leubner (ConfigurableExpander->dmDevice->SASAddressID.sasAddressLo
19854e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo))
19864e1bc9a0SAchim Leubner )
19874e1bc9a0SAchim Leubner { /* directly attached between oneExpander and ConfigurableExpander */
19884e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 2nd before loc 1\n"));
19894e1bc9a0SAchim Leubner configSASAddressHi = oneExpander->dmDevice->SASAddressID.sasAddressHi;
19904e1bc9a0SAchim Leubner configSASAddressLo = oneExpander->dmDevice->SASAddressID.sasAddressLo;
19914e1bc9a0SAchim Leubner }
19924e1bc9a0SAchim Leubner else
19934e1bc9a0SAchim Leubner {
19944e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 2nd before loc 2\n"));
19954e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
19964e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
19974e1bc9a0SAchim Leubner }
19984e1bc9a0SAchim Leubner } /* if !ConfigurableExpander */
19994e1bc9a0SAchim Leubner dupConfigSASAddr = dmDuplicateConfigSASAddr(dmRoot,
20004e1bc9a0SAchim Leubner ConfigurableExpander,
20014e1bc9a0SAchim Leubner configSASAddressHi,
20024e1bc9a0SAchim Leubner configSASAddressLo
20034e1bc9a0SAchim Leubner );
20044e1bc9a0SAchim Leubner if ( ConfigurableExpander && dupConfigSASAddr == agFALSE)
20054e1bc9a0SAchim Leubner {
20064e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 2nd q123 \n"));
20074e1bc9a0SAchim Leubner UpStreamExpander->dmCurrentDownStreamExpander = oneExpander;
20084e1bc9a0SAchim Leubner ConfigurableExpander->currentDownStreamPhyIndex =
20094e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(dmRoot, ConfigurableExpander);
20104e1bc9a0SAchim Leubner ConfigurableExpander->dmReturnginExpander = oneExpander;
20114e1bc9a0SAchim Leubner dmRoutingEntryAdd(dmRoot,
20124e1bc9a0SAchim Leubner ConfigurableExpander,
20134e1bc9a0SAchim Leubner ConfigurableExpander->downStreamPhys[ConfigurableExpander->currentDownStreamPhyIndex],
20144e1bc9a0SAchim Leubner configSASAddressHi,
20154e1bc9a0SAchim Leubner configSASAddressLo
20164e1bc9a0SAchim Leubner );
20174e1bc9a0SAchim Leubner }
20184e1bc9a0SAchim Leubner } /* onePortContext->discovery.status == DISCOVERY_DOWN_STREAM */
20194e1bc9a0SAchim Leubner /* incremental discovery */
20204e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_INCREMENTAL_START)
20214e1bc9a0SAchim Leubner {
20224e1bc9a0SAchim Leubner connectionRate = MIN(onePortContext->LinkRate, DISCRSP_GET_LINKRATE(pDiscoverResp));
20234e1bc9a0SAchim Leubner
20244e1bc9a0SAchim Leubner if (DISCRSP_IS_STP_TARGET(pDiscoverResp) || DISCRSP_IS_SATA_DEVICE(pDiscoverResp))
20254e1bc9a0SAchim Leubner {
20264e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: incremental SATA_STP\n"));
20274e1bc9a0SAchim Leubner
20284e1bc9a0SAchim Leubner dmPortSASDeviceAdd(
20294e1bc9a0SAchim Leubner dmRoot,
20304e1bc9a0SAchim Leubner onePortContext,
20314e1bc9a0SAchim Leubner sasIdentify,
20324e1bc9a0SAchim Leubner agFALSE,
20334e1bc9a0SAchim Leubner connectionRate,
20344e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
20354e1bc9a0SAchim Leubner 0,
20364e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
20374e1bc9a0SAchim Leubner oneDeviceData,
20384e1bc9a0SAchim Leubner oneExpander,
20394e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
20404e1bc9a0SAchim Leubner );
20414e1bc9a0SAchim Leubner }
20424e1bc9a0SAchim Leubner else
20434e1bc9a0SAchim Leubner {
20444e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: incremental SAS\n"));
20454e1bc9a0SAchim Leubner
20464e1bc9a0SAchim Leubner
20474e1bc9a0SAchim Leubner dmPortSASDeviceAdd(
20484e1bc9a0SAchim Leubner dmRoot,
20494e1bc9a0SAchim Leubner onePortContext,
20504e1bc9a0SAchim Leubner sasIdentify,
20514e1bc9a0SAchim Leubner agFALSE,
20524e1bc9a0SAchim Leubner connectionRate,
20534e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
20544e1bc9a0SAchim Leubner 0,
20554e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
20564e1bc9a0SAchim Leubner oneDeviceData,
20574e1bc9a0SAchim Leubner oneExpander,
20584e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
20594e1bc9a0SAchim Leubner );
20604e1bc9a0SAchim Leubner
20614e1bc9a0SAchim Leubner }
20624e1bc9a0SAchim Leubner } /* onePortContext->discovery.type == DM_DISCOVERY_OPTION_INCREMENTAL_START */
20634e1bc9a0SAchim Leubner } /* else 33 */
20644e1bc9a0SAchim Leubner } /* (attachedSasLo != onePortContext->sasLocalAddressLo) */
20654e1bc9a0SAchim Leubner
20664e1bc9a0SAchim Leubner else /* else 44 */
20674e1bc9a0SAchim Leubner {
20684e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: Found Self\n"));
20694e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 3rd before\n"));
20704e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
20714e1bc9a0SAchim Leubner
20724e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
20734e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
20744e1bc9a0SAchim Leubner dupConfigSASAddr = dmDuplicateConfigSASAddr(dmRoot,
20754e1bc9a0SAchim Leubner ConfigurableExpander,
20764e1bc9a0SAchim Leubner onePortContext->sasLocalAddressHi,
20774e1bc9a0SAchim Leubner onePortContext->sasLocalAddressLo
20784e1bc9a0SAchim Leubner );
20794e1bc9a0SAchim Leubner
20804e1bc9a0SAchim Leubner if ( ConfigurableExpander && dupConfigSASAddr == agFALSE)
20814e1bc9a0SAchim Leubner {
20824e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: 3rd q123 Setup routing table\n"));
20834e1bc9a0SAchim Leubner UpStreamExpander->dmCurrentDownStreamExpander = oneExpander;
20844e1bc9a0SAchim Leubner ConfigurableExpander->currentDownStreamPhyIndex =
20854e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(dmRoot, ConfigurableExpander);
20864e1bc9a0SAchim Leubner ConfigurableExpander->dmReturnginExpander = oneExpander;
20874e1bc9a0SAchim Leubner dmRoutingEntryAdd(dmRoot,
20884e1bc9a0SAchim Leubner ConfigurableExpander,
20894e1bc9a0SAchim Leubner ConfigurableExpander->downStreamPhys[ConfigurableExpander->currentDownStreamPhyIndex],
20904e1bc9a0SAchim Leubner onePortContext->sasLocalAddressHi,
20914e1bc9a0SAchim Leubner onePortContext->sasLocalAddressLo
20924e1bc9a0SAchim Leubner );
20934e1bc9a0SAchim Leubner }
20944e1bc9a0SAchim Leubner } /* else 44 */
20954e1bc9a0SAchim Leubner } /* DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE */
20964e1bc9a0SAchim Leubner /* If no device is attached */
20974e1bc9a0SAchim Leubner else
20984e1bc9a0SAchim Leubner {
20994e1bc9a0SAchim Leubner
21004e1bc9a0SAchim Leubner DM_DBG2(("!!!!!!!!!!!!!!!!!!!!! SPIN SATA !!!!!!!!!!!!!!!!!!!!!!!!!!!\n"));
21014e1bc9a0SAchim Leubner negotiatedPhyLinkRate = DISCRSP_GET_LINKRATE(pDiscoverResp); // added by thenil
21024e1bc9a0SAchim Leubner
21034e1bc9a0SAchim Leubner if (negotiatedPhyLinkRate == 0x03)
21044e1bc9a0SAchim Leubner {
21054e1bc9a0SAchim Leubner
21064e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: SPIN SATA sent reset\n"));
21074e1bc9a0SAchim Leubner dmPhyControlSend(dmRoot,
21084e1bc9a0SAchim Leubner oneDeviceData,
21094e1bc9a0SAchim Leubner SMP_PHY_CONTROL_HARD_RESET,
21104e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
21114e1bc9a0SAchim Leubner );
21124e1bc9a0SAchim Leubner }
21134e1bc9a0SAchim Leubner
21144e1bc9a0SAchim Leubner /* do nothing */
21154e1bc9a0SAchim Leubner }
21164e1bc9a0SAchim Leubner
21174e1bc9a0SAchim Leubner
21184e1bc9a0SAchim Leubner /* Increment the discovering phy id */
21194e1bc9a0SAchim Leubner oneExpander->discoveringPhyId ++;
21204e1bc9a0SAchim Leubner
21214e1bc9a0SAchim Leubner /* If the discovery status is DISCOVERY_DOWN_STREAM */
21224e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM )
21234e1bc9a0SAchim Leubner {
21244e1bc9a0SAchim Leubner /* If not the last phy */
21254e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
21264e1bc9a0SAchim Leubner {
21274e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: More Phys to discover\n"));
21284e1bc9a0SAchim Leubner /* continue discovery for the next phy */
21294e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
21304e1bc9a0SAchim Leubner }
21314e1bc9a0SAchim Leubner /* If the last phy */
21324e1bc9a0SAchim Leubner else
21334e1bc9a0SAchim Leubner {
21344e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: No More Phys\n"));
21354e1bc9a0SAchim Leubner
21364e1bc9a0SAchim Leubner /* for MCN */
21374e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
21384e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
21394e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
21404e1bc9a0SAchim Leubner /* continue downstream discovering */
21414e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
21424e1bc9a0SAchim Leubner }
21434e1bc9a0SAchim Leubner }
21444e1bc9a0SAchim Leubner else
21454e1bc9a0SAchim Leubner {
21464e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: onePortContext->discovery.status not in DISCOVERY_DOWN_STREAM; status %d\n", onePortContext->discovery.status));
21474e1bc9a0SAchim Leubner }
21484e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhy: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
21494e1bc9a0SAchim Leubner
21504e1bc9a0SAchim Leubner return;
21514e1bc9a0SAchim Leubner }
21524e1bc9a0SAchim Leubner
21534e1bc9a0SAchim Leubner
21544e1bc9a0SAchim Leubner /* works at SAS2 expander (called in dmDownStreamDiscover2ExpanderPhy())
21554e1bc9a0SAchim Leubner if currentExpander is SAS2, called in dmDownStreamDiscover2ExpanderPhy()
21564e1bc9a0SAchim Leubner if currentExpander is SAS1.1, called in dmDownStreamDiscoverExpanderPhy()
21574e1bc9a0SAchim Leubner */
21584e1bc9a0SAchim Leubner osGLOBAL bit32
dmSAS2SAS11ErrorCheck(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * topExpander,dmExpander_t * bottomExpander,dmExpander_t * currentExpander)21594e1bc9a0SAchim Leubner dmSAS2SAS11ErrorCheck(
21604e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
21614e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
21624e1bc9a0SAchim Leubner dmExpander_t *topExpander,
21634e1bc9a0SAchim Leubner dmExpander_t *bottomExpander,
21644e1bc9a0SAchim Leubner dmExpander_t *currentExpander
21654e1bc9a0SAchim Leubner )
21664e1bc9a0SAchim Leubner {
21674e1bc9a0SAchim Leubner bit32 result = agFALSE, i = 0;
21684e1bc9a0SAchim Leubner bit8 downStreamPhyID, upStreamPhyID;
21694e1bc9a0SAchim Leubner
21704e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: start\n"));
21714e1bc9a0SAchim Leubner
21724e1bc9a0SAchim Leubner if (topExpander == agNULL)
21734e1bc9a0SAchim Leubner {
21744e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: topExpander is NULL\n"));
21754e1bc9a0SAchim Leubner return result;
21764e1bc9a0SAchim Leubner }
21774e1bc9a0SAchim Leubner if (bottomExpander == agNULL)
21784e1bc9a0SAchim Leubner {
21794e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: bottomExpander is NULL\n"));
21804e1bc9a0SAchim Leubner return result;
21814e1bc9a0SAchim Leubner }
21824e1bc9a0SAchim Leubner
21834e1bc9a0SAchim Leubner if (currentExpander == agNULL)
21844e1bc9a0SAchim Leubner {
21854e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: currentExpander is NULL\n"));
21864e1bc9a0SAchim Leubner return result;
21874e1bc9a0SAchim Leubner }
21884e1bc9a0SAchim Leubner
21894e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: topExpander addrHi 0x%08x addrLo 0x%08x\n",
21904e1bc9a0SAchim Leubner topExpander->dmDevice->SASAddressID.sasAddressHi, topExpander->dmDevice->SASAddressID.sasAddressLo));
21914e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: bottomExpander addrHi 0x%08x addrLo 0x%08x\n",
21924e1bc9a0SAchim Leubner bottomExpander->dmDevice->SASAddressID.sasAddressHi, bottomExpander->dmDevice->SASAddressID.sasAddressLo));
21934e1bc9a0SAchim Leubner DM_DBG2(("dmSAS2SAS11ErrorCheck: currentExpander addrHi 0x%08x addrLo 0x%08x\n",
21944e1bc9a0SAchim Leubner currentExpander->dmDevice->SASAddressID.sasAddressHi, currentExpander->dmDevice->SASAddressID.sasAddressLo));
21954e1bc9a0SAchim Leubner
21964e1bc9a0SAchim Leubner for (i=0;i<DM_MAX_EXPANDER_PHYS;i++)
21974e1bc9a0SAchim Leubner {
21984e1bc9a0SAchim Leubner downStreamPhyID = topExpander->downStreamPhys[i];
21994e1bc9a0SAchim Leubner upStreamPhyID = bottomExpander->upStreamPhys[i];
22004e1bc9a0SAchim Leubner if (currentExpander->SAS2 == 1)
22014e1bc9a0SAchim Leubner {
22024e1bc9a0SAchim Leubner if ( downStreamPhyID == upStreamPhyID &&
22034e1bc9a0SAchim Leubner topExpander->routingAttribute[downStreamPhyID] == SAS_ROUTING_TABLE &&
22044e1bc9a0SAchim Leubner bottomExpander->routingAttribute[i] == SAS_ROUTING_SUBTRACTIVE &&
22054e1bc9a0SAchim Leubner topExpander->SAS2 == 0 &&
22064e1bc9a0SAchim Leubner bottomExpander->SAS2 == 1
22074e1bc9a0SAchim Leubner )
22084e1bc9a0SAchim Leubner {
22094e1bc9a0SAchim Leubner result = agTRUE;
22104e1bc9a0SAchim Leubner break;
22114e1bc9a0SAchim Leubner }
22124e1bc9a0SAchim Leubner }
22134e1bc9a0SAchim Leubner else if (currentExpander->SAS2 == 0)
22144e1bc9a0SAchim Leubner {
22154e1bc9a0SAchim Leubner if ( downStreamPhyID == upStreamPhyID &&
22164e1bc9a0SAchim Leubner topExpander->routingAttribute[downStreamPhyID] == SAS_ROUTING_SUBTRACTIVE &&
22174e1bc9a0SAchim Leubner bottomExpander->routingAttribute[i] == SAS_ROUTING_TABLE &&
22184e1bc9a0SAchim Leubner topExpander->SAS2 == 1 &&
22194e1bc9a0SAchim Leubner bottomExpander->SAS2 == 0
22204e1bc9a0SAchim Leubner )
22214e1bc9a0SAchim Leubner {
22224e1bc9a0SAchim Leubner result = agTRUE;
22234e1bc9a0SAchim Leubner break;
22244e1bc9a0SAchim Leubner }
22254e1bc9a0SAchim Leubner }
22264e1bc9a0SAchim Leubner }
22274e1bc9a0SAchim Leubner return result;
22284e1bc9a0SAchim Leubner }
22294e1bc9a0SAchim Leubner
22304e1bc9a0SAchim Leubner osGLOBAL void
dmDownStreamDiscover2ExpanderPhy(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander,smpRespDiscover2_t * pDiscoverResp)22314e1bc9a0SAchim Leubner dmDownStreamDiscover2ExpanderPhy(
22324e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
22334e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
22344e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
22354e1bc9a0SAchim Leubner smpRespDiscover2_t *pDiscoverResp
22364e1bc9a0SAchim Leubner )
22374e1bc9a0SAchim Leubner {
22384e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
22394e1bc9a0SAchim Leubner dmExpander_t *UpStreamExpander;
22404e1bc9a0SAchim Leubner dmDeviceData_t *AttachedDevice = agNULL;
22414e1bc9a0SAchim Leubner dmExpander_t *AttachedExpander;
22424e1bc9a0SAchim Leubner agsaSASIdentify_t sasIdentify;
22434e1bc9a0SAchim Leubner bit8 connectionRate;
22444e1bc9a0SAchim Leubner bit32 attachedSasHi, attachedSasLo;
22454e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
22464e1bc9a0SAchim Leubner dmExpander_t *ConfigurableExpander = agNULL;
22474e1bc9a0SAchim Leubner bit32 dupConfigSASAddr = agFALSE;
22484e1bc9a0SAchim Leubner bit32 configSASAddressHi;
22494e1bc9a0SAchim Leubner bit32 configSASAddressLo;
22504e1bc9a0SAchim Leubner bit32 SAS2SAS11Check = agFALSE;
22514e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
22524e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
22534e1bc9a0SAchim Leubner
22544e1bc9a0SAchim Leubner
22554e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: start\n"));
22564e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
22574e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
22584e1bc9a0SAchim Leubner
22594e1bc9a0SAchim Leubner DM_ASSERT(dmRoot, "(dmDownStreamDiscover2ExpanderPhy) dmRoot NULL");
22604e1bc9a0SAchim Leubner DM_ASSERT(onePortContext, "(dmDownStreamDiscover2ExpanderPhy) pPort NULL");
22614e1bc9a0SAchim Leubner DM_ASSERT(oneExpander, "(dmDownStreamDiscover2ExpanderPhy) pExpander NULL");
22624e1bc9a0SAchim Leubner DM_ASSERT(pDiscoverResp, "(dmDownStreamDiscover2ExpanderPhy) pDiscoverResp NULL");
22634e1bc9a0SAchim Leubner
22644e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: onePortContxt=%p oneExpander=%p oneDeviceData=%p\n", onePortContext, oneExpander, oneExpander->dmDevice));
22654e1bc9a0SAchim Leubner
22664e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
22674e1bc9a0SAchim Leubner {
22684e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: invalid port or aborted discovery!!!\n"));
22694e1bc9a0SAchim Leubner return;
22704e1bc9a0SAchim Leubner }
22714e1bc9a0SAchim Leubner
22724e1bc9a0SAchim Leubner if (oneExpander != oneExpander->dmDevice->dmExpander)
22734e1bc9a0SAchim Leubner {
22744e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: wrong!!!\n"));
22754e1bc9a0SAchim Leubner }
22764e1bc9a0SAchim Leubner
22774e1bc9a0SAchim Leubner
22784e1bc9a0SAchim Leubner /* (1) Find the device structure of the expander */
22794e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
22804e1bc9a0SAchim Leubner
22814e1bc9a0SAchim Leubner DM_ASSERT(oneDeviceData, "(dmDownStreamDiscover2ExpanderPhy) pDevice NULL");
22824e1bc9a0SAchim Leubner
22834e1bc9a0SAchim Leubner /* for debugging */
22844e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Phy #%d of SAS %08x-%08x\n",
22854e1bc9a0SAchim Leubner oneExpander->discoveringPhyId,
22864e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi,
22874e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo));
22884e1bc9a0SAchim Leubner
22894e1bc9a0SAchim Leubner DM_DBG2((" Attached device: %s\n",
22904e1bc9a0SAchim Leubner ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 0 ? "No Device" :
22914e1bc9a0SAchim Leubner (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 1 ? "End Device" :
22924e1bc9a0SAchim Leubner (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == 2 ? "Edge Expander" : "Fanout Expander")))));
22934e1bc9a0SAchim Leubner
22944e1bc9a0SAchim Leubner
22954e1bc9a0SAchim Leubner /* for debugging */
22964e1bc9a0SAchim Leubner if (oneExpander->discoveringPhyId != pDiscoverResp->phyIdentifier)
22974e1bc9a0SAchim Leubner {
22984e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: !!! Incorrect SMP response !!!\n"));
22994e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: Request PhyID #%d Response PhyID #%d\n", oneExpander->discoveringPhyId, pDiscoverResp->phyIdentifier));
23004e1bc9a0SAchim Leubner dmhexdump("NO_DEVICE", (bit8*)pDiscoverResp, sizeof(smpRespDiscover2_t));
23014e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
23024e1bc9a0SAchim Leubner return;
23034e1bc9a0SAchim Leubner }
23044e1bc9a0SAchim Leubner
23054e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
23064e1bc9a0SAchim Leubner {
23074e1bc9a0SAchim Leubner DM_DBG2((" SAS address : %08x-%08x\n",
23084e1bc9a0SAchim Leubner SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp),
23094e1bc9a0SAchim Leubner SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp)));
23104e1bc9a0SAchim Leubner DM_DBG2((" SSP Target : %d\n", SAS2_DISCRSP_IS_SSP_TARGET(pDiscoverResp)?1:0));
23114e1bc9a0SAchim Leubner DM_DBG2((" STP Target : %d\n", SAS2_DISCRSP_IS_STP_TARGET(pDiscoverResp)?1:0));
23124e1bc9a0SAchim Leubner DM_DBG2((" SMP Target : %d\n", SAS2_DISCRSP_IS_SMP_TARGET(pDiscoverResp)?1:0));
23134e1bc9a0SAchim Leubner DM_DBG2((" SATA DEVICE : %d\n", SAS2_DISCRSP_IS_SATA_DEVICE(pDiscoverResp)?1:0));
23144e1bc9a0SAchim Leubner DM_DBG2((" SSP Initiator : %d\n", SAS2_DISCRSP_IS_SSP_INITIATOR(pDiscoverResp)?1:0));
23154e1bc9a0SAchim Leubner DM_DBG2((" STP Initiator : %d\n", SAS2_DISCRSP_IS_STP_INITIATOR(pDiscoverResp)?1:0));
23164e1bc9a0SAchim Leubner DM_DBG2((" SMP Initiator : %d\n", SAS2_DISCRSP_IS_SMP_INITIATOR(pDiscoverResp)?1:0));
23174e1bc9a0SAchim Leubner DM_DBG2((" Phy ID : %d\n", pDiscoverResp->phyIdentifier));
23184e1bc9a0SAchim Leubner DM_DBG2((" Attached Phy ID: %d\n", pDiscoverResp->attachedPhyIdentifier));
23194e1bc9a0SAchim Leubner
23204e1bc9a0SAchim Leubner }
23214e1bc9a0SAchim Leubner
23224e1bc9a0SAchim Leubner /* saving routing attribute for non self-configuring expanders */
23234e1bc9a0SAchim Leubner oneExpander->routingAttribute[pDiscoverResp->phyIdentifier] = SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp);
23244e1bc9a0SAchim Leubner
23254e1bc9a0SAchim Leubner
23264e1bc9a0SAchim Leubner oneExpander->discoverSMPAllowed = agTRUE;
23274e1bc9a0SAchim Leubner
23284e1bc9a0SAchim Leubner /* If a device is attached */
23294e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) != SAS_NO_DEVICE)
23304e1bc9a0SAchim Leubner {
23314e1bc9a0SAchim Leubner /* Setup sasIdentify for the attached device */
23324e1bc9a0SAchim Leubner sasIdentify.phyIdentifier = pDiscoverResp->phyIdentifier;
23334e1bc9a0SAchim Leubner sasIdentify.deviceType_addressFrameType = pDiscoverResp->attachedDeviceTypeReason & 0x70;
23344e1bc9a0SAchim Leubner sasIdentify.initiator_ssp_stp_smp = pDiscoverResp->attached_Ssp_Stp_Smp_Sata_Initiator;
23354e1bc9a0SAchim Leubner sasIdentify.target_ssp_stp_smp = pDiscoverResp->attached_SataPS_Ssp_Stp_Smp_Sata_Target;
23364e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressHi = *(bit32*)pDiscoverResp->attachedSasAddressHi;
23374e1bc9a0SAchim Leubner *(bit32*)sasIdentify.sasAddressLo = *(bit32*)pDiscoverResp->attachedSasAddressLo;
23384e1bc9a0SAchim Leubner
23394e1bc9a0SAchim Leubner /* incremental discovery */
23404e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify);
23414e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify);
23424e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = sasIdentify.initiator_ssp_stp_smp;
23434e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = sasIdentify.target_ssp_stp_smp;
23444e1bc9a0SAchim Leubner
23454e1bc9a0SAchim Leubner attachedSasHi = SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pDiscoverResp);
23464e1bc9a0SAchim Leubner attachedSasLo = SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pDiscoverResp);
23474e1bc9a0SAchim Leubner
23484e1bc9a0SAchim Leubner /* If it's a direct routing */
23494e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_DIRECT)
23504e1bc9a0SAchim Leubner {
23514e1bc9a0SAchim Leubner /* If the attached device is an expander */
23524e1bc9a0SAchim Leubner if ( (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
23534e1bc9a0SAchim Leubner || (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE) )
23544e1bc9a0SAchim Leubner
23554e1bc9a0SAchim Leubner {
23564e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error direct routing can't connect to expander!!!\n"));
23574e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
23584e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
23594e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
23604e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
23614e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
23624e1bc9a0SAchim Leubner
23634e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
23644e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
23654e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
23664e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
23674e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
23684e1bc9a0SAchim Leubner
23694e1bc9a0SAchim Leubner return;
23704e1bc9a0SAchim Leubner }
23714e1bc9a0SAchim Leubner }
23724e1bc9a0SAchim Leubner
23734e1bc9a0SAchim Leubner /* If the expander's attached device is not myself */
23744e1bc9a0SAchim Leubner if ( (attachedSasHi != onePortContext->sasLocalAddressHi)
23754e1bc9a0SAchim Leubner || (attachedSasLo != onePortContext->sasLocalAddressLo) )
23764e1bc9a0SAchim Leubner {
23774e1bc9a0SAchim Leubner /* Find the attached device from discovered list */
23784e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceFind(dmRoot, onePortContext, attachedSasLo, attachedSasHi, oneDeviceData);
23794e1bc9a0SAchim Leubner /* If the device has not been discovered before */
23804e1bc9a0SAchim Leubner if ( AttachedDevice == agNULL) //11
23814e1bc9a0SAchim Leubner {
23824e1bc9a0SAchim Leubner //qqqqqq
23834e1bc9a0SAchim Leubner if (0)
23844e1bc9a0SAchim Leubner {
23854e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error subtractive routing error - inconsistent SAS address!!!\n"));
23864e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
23874e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
23884e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
23894e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
23904e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
23914e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
23924e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
23934e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
23944e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
23954e1bc9a0SAchim Leubner /* discovery done */
23964e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
23974e1bc9a0SAchim Leubner }
23984e1bc9a0SAchim Leubner else
23994e1bc9a0SAchim Leubner {
24004e1bc9a0SAchim Leubner /* Add the device */
24014e1bc9a0SAchim Leubner /* read minimum rate from the configuration
24024e1bc9a0SAchim Leubner onePortContext->LinkRate is SPC's local link rate
24034e1bc9a0SAchim Leubner */
24044e1bc9a0SAchim Leubner connectionRate = MIN(onePortContext->LinkRate, SAS2_DISCRSP_GET_LOGICAL_LINKRATE(pDiscoverResp));
24054e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: link rate 0x%x\n", DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo)));
24064e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: negotiatedPhyLinkRate 0x%x\n", SAS2_DISCRSP_GET_LINKRATE(pDiscoverResp)));
24074e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: connectionRate 0x%x\n", connectionRate));
24084e1bc9a0SAchim Leubner
24094e1bc9a0SAchim Leubner if (SAS2_DISCRSP_IS_STP_TARGET(pDiscoverResp) || SAS2_DISCRSP_IS_SATA_DEVICE(pDiscoverResp))
24104e1bc9a0SAchim Leubner {
24114e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
24124e1bc9a0SAchim Leubner {
24134e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
24144e1bc9a0SAchim Leubner dmRoot,
24154e1bc9a0SAchim Leubner onePortContext,
24164e1bc9a0SAchim Leubner sasIdentify,
24174e1bc9a0SAchim Leubner agFALSE,
24184e1bc9a0SAchim Leubner connectionRate,
24194e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
24204e1bc9a0SAchim Leubner 0,
24214e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
24224e1bc9a0SAchim Leubner oneDeviceData,
24234e1bc9a0SAchim Leubner oneExpander,
24244e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
24254e1bc9a0SAchim Leubner );
24264e1bc9a0SAchim Leubner }
24274e1bc9a0SAchim Leubner else
24284e1bc9a0SAchim Leubner {
24294e1bc9a0SAchim Leubner /* incremental discovery */
24304e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
24314e1bc9a0SAchim Leubner dmRoot,
24324e1bc9a0SAchim Leubner onePortContext,
24334e1bc9a0SAchim Leubner &dmSASSubID
24344e1bc9a0SAchim Leubner );
24354e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
24364e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
24374e1bc9a0SAchim Leubner {
24384e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
24394e1bc9a0SAchim Leubner dmRoot,
24404e1bc9a0SAchim Leubner onePortContext,
24414e1bc9a0SAchim Leubner sasIdentify,
24424e1bc9a0SAchim Leubner agFALSE,
24434e1bc9a0SAchim Leubner connectionRate,
24444e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
24454e1bc9a0SAchim Leubner 0,
24464e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
24474e1bc9a0SAchim Leubner oneDeviceData,
24484e1bc9a0SAchim Leubner oneExpander,
24494e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
24504e1bc9a0SAchim Leubner );
24514e1bc9a0SAchim Leubner }
24524e1bc9a0SAchim Leubner }
24534e1bc9a0SAchim Leubner }
24544e1bc9a0SAchim Leubner else
24554e1bc9a0SAchim Leubner {
24564e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
24574e1bc9a0SAchim Leubner {
24584e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
24594e1bc9a0SAchim Leubner dmRoot,
24604e1bc9a0SAchim Leubner onePortContext,
24614e1bc9a0SAchim Leubner sasIdentify,
24624e1bc9a0SAchim Leubner agFALSE,
24634e1bc9a0SAchim Leubner connectionRate,
24644e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
24654e1bc9a0SAchim Leubner 0,
24664e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
24674e1bc9a0SAchim Leubner oneDeviceData,
24684e1bc9a0SAchim Leubner oneExpander,
24694e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
24704e1bc9a0SAchim Leubner );
24714e1bc9a0SAchim Leubner }
24724e1bc9a0SAchim Leubner else
24734e1bc9a0SAchim Leubner {
24744e1bc9a0SAchim Leubner /* incremental discovery */
24754e1bc9a0SAchim Leubner AttachedDevice = dmFindRegNValid(
24764e1bc9a0SAchim Leubner dmRoot,
24774e1bc9a0SAchim Leubner onePortContext,
24784e1bc9a0SAchim Leubner &dmSASSubID
24794e1bc9a0SAchim Leubner );
24804e1bc9a0SAchim Leubner /* not registered and not valid; add this*/
24814e1bc9a0SAchim Leubner if (AttachedDevice == agNULL)
24824e1bc9a0SAchim Leubner {
24834e1bc9a0SAchim Leubner AttachedDevice = dmPortSASDeviceAdd(
24844e1bc9a0SAchim Leubner dmRoot,
24854e1bc9a0SAchim Leubner onePortContext,
24864e1bc9a0SAchim Leubner sasIdentify,
24874e1bc9a0SAchim Leubner agFALSE,
24884e1bc9a0SAchim Leubner connectionRate,
24894e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
24904e1bc9a0SAchim Leubner 0,
24914e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
24924e1bc9a0SAchim Leubner oneDeviceData,
24934e1bc9a0SAchim Leubner oneExpander,
24944e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
24954e1bc9a0SAchim Leubner );
24964e1bc9a0SAchim Leubner }
24974e1bc9a0SAchim Leubner }
24984e1bc9a0SAchim Leubner }
24994e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: newDevice pDevice=%p\n", AttachedDevice));
25004e1bc9a0SAchim Leubner /* If the device is added successfully */
25014e1bc9a0SAchim Leubner if ( AttachedDevice != agNULL)
25024e1bc9a0SAchim Leubner {
25034e1bc9a0SAchim Leubner if ( SA_IDFRM_IS_SSP_TARGET(&sasIdentify)
25044e1bc9a0SAchim Leubner || SA_IDFRM_IS_SMP_TARGET(&sasIdentify)
25054e1bc9a0SAchim Leubner || SA_IDFRM_IS_SSP_INITIATOR(&sasIdentify)
25064e1bc9a0SAchim Leubner || SA_IDFRM_IS_SMP_INITIATOR(&sasIdentify) )
25074e1bc9a0SAchim Leubner {
25084e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Report a new SAS device !!\n"));
25094e1bc9a0SAchim Leubner
25104e1bc9a0SAchim Leubner }
25114e1bc9a0SAchim Leubner else
25124e1bc9a0SAchim Leubner {
25134e1bc9a0SAchim Leubner if ( SA_IDFRM_IS_STP_TARGET(&sasIdentify) ||
25144e1bc9a0SAchim Leubner SA_IDFRM_IS_SATA_DEVICE(&sasIdentify) )
25154e1bc9a0SAchim Leubner {
25164e1bc9a0SAchim Leubner
25174e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Found an STP or SATA device.\n"));
25184e1bc9a0SAchim Leubner }
25194e1bc9a0SAchim Leubner else
25204e1bc9a0SAchim Leubner {
25214e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Found Other type of device.\n"));
25224e1bc9a0SAchim Leubner }
25234e1bc9a0SAchim Leubner }
25244e1bc9a0SAchim Leubner
25254e1bc9a0SAchim Leubner /* LP2006-05-26 added upstream device to the newly found device */
25264e1bc9a0SAchim Leubner AttachedDevice->dmExpander = oneExpander;
25274e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscover2ExpanderPhy: AttachedDevice %p did %d\n", AttachedDevice, AttachedDevice->id));
25284e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscover2ExpanderPhy: Attached oneExpander %p did %d\n", AttachedDevice->dmExpander, AttachedDevice->dmExpander->id));
25294e1bc9a0SAchim Leubner
25304e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscover2ExpanderPhy: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
25314e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscover2ExpanderPhy: oneExpander %p did %d\n", oneDeviceData->dmExpander, oneDeviceData->dmExpander->id));
25324e1bc9a0SAchim Leubner
25334e1bc9a0SAchim Leubner /* If the phy has table routing attribute */
25344e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE)
25354e1bc9a0SAchim Leubner {
25364e1bc9a0SAchim Leubner /* If the attached device is a fan out expander */
25374e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
25384e1bc9a0SAchim Leubner {
25394e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
25404e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error two table routing phys are connected!!!\n"));
25414e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
25424e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
25434e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
25444e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
25454e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
25464e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
25474e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
25484e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
25494e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
25504e1bc9a0SAchim Leubner /* discovery done */
25514e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
25524e1bc9a0SAchim Leubner }
25534e1bc9a0SAchim Leubner else if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
25544e1bc9a0SAchim Leubner {
25554e1bc9a0SAchim Leubner /* Allocate an expander data structure */
25564e1bc9a0SAchim Leubner AttachedExpander = dmDiscoveringExpanderAlloc(dmRoot, onePortContext, AttachedDevice);
25574e1bc9a0SAchim Leubner
25584e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Found a EDGE exp device.%p\n", AttachedExpander));
25594e1bc9a0SAchim Leubner /* If allocate successfully */
25604e1bc9a0SAchim Leubner if ( AttachedExpander != agNULL)
25614e1bc9a0SAchim Leubner {
25624e1bc9a0SAchim Leubner /* set up downstream information on configurable expander */
25634e1bc9a0SAchim Leubner
25644e1bc9a0SAchim Leubner dmExpanderDownStreamPhyAdd(dmRoot, oneExpander, (bit8) oneExpander->discoveringPhyId);
25654e1bc9a0SAchim Leubner
25664e1bc9a0SAchim Leubner /* Setup upstream information */
25674e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, AttachedExpander, (bit8) oneExpander->discoveringPhyId);
25684e1bc9a0SAchim Leubner //qqqqq
25694e1bc9a0SAchim Leubner AttachedExpander->hasUpStreamDevice = agTRUE;
25704e1bc9a0SAchim Leubner AttachedExpander->upStreamSASAddressHi
25714e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
25724e1bc9a0SAchim Leubner AttachedExpander->upStreamSASAddressLo
25734e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
25744e1bc9a0SAchim Leubner AttachedExpander->dmUpStreamExpander = oneExpander;
25754e1bc9a0SAchim Leubner /* (2.3.2.2.2.2.2.2.2) Add the pAttachedExpander to discovering list */
25764e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
25774e1bc9a0SAchim Leubner }
25784e1bc9a0SAchim Leubner /* If failed to allocate */
25794e1bc9a0SAchim Leubner else
25804e1bc9a0SAchim Leubner {
25814e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy, Failed to allocate expander data structure!!!\n"));
25824e1bc9a0SAchim Leubner /* discovery done */
25834e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
25844e1bc9a0SAchim Leubner }
25854e1bc9a0SAchim Leubner }
25864e1bc9a0SAchim Leubner }
25874e1bc9a0SAchim Leubner //qqqqq
25884e1bc9a0SAchim Leubner else if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE &&
25894e1bc9a0SAchim Leubner (SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE ||
25904e1bc9a0SAchim Leubner SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
25914e1bc9a0SAchim Leubner )
25924e1bc9a0SAchim Leubner {
25934e1bc9a0SAchim Leubner /* Allocate an expander data structure */
25944e1bc9a0SAchim Leubner AttachedExpander = dmDiscoveringExpanderAlloc(dmRoot, onePortContext, AttachedDevice);
25954e1bc9a0SAchim Leubner
25964e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Found a EDGE/FANOUT exp device.%p\n", AttachedExpander));
25974e1bc9a0SAchim Leubner /* If allocate successfully */
25984e1bc9a0SAchim Leubner if ( AttachedExpander != agNULL)
25994e1bc9a0SAchim Leubner {
26004e1bc9a0SAchim Leubner /* set up downstream information on configurable expander */
26014e1bc9a0SAchim Leubner dmExpanderDownStreamPhyAdd(dmRoot, oneExpander, (bit8) oneExpander->discoveringPhyId);
26024e1bc9a0SAchim Leubner
26034e1bc9a0SAchim Leubner /* Setup upstream information */
26044e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, AttachedExpander, (bit8) oneExpander->discoveringPhyId);
26054e1bc9a0SAchim Leubner AttachedExpander->hasUpStreamDevice = agTRUE;
26064e1bc9a0SAchim Leubner AttachedExpander->upStreamSASAddressHi
26074e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
26084e1bc9a0SAchim Leubner AttachedExpander->upStreamSASAddressLo
26094e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
26104e1bc9a0SAchim Leubner AttachedExpander->dmUpStreamExpander = oneExpander;
26114e1bc9a0SAchim Leubner /* (2.3.2.2.2.2.2.2.2) Add the pAttachedExpander to discovering list */
26124e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
26134e1bc9a0SAchim Leubner }
26144e1bc9a0SAchim Leubner /* If failed to allocate */
26154e1bc9a0SAchim Leubner else
26164e1bc9a0SAchim Leubner {
26174e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy, Failed to allocate expander data structure (2)!!!\n"));
26184e1bc9a0SAchim Leubner /* discovery done */
26194e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
26204e1bc9a0SAchim Leubner }
26214e1bc9a0SAchim Leubner
26224e1bc9a0SAchim Leubner
26234e1bc9a0SAchim Leubner }
26244e1bc9a0SAchim Leubner /* If status is still DISCOVERY_DOWN_STREAM */
26254e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM &&
26264e1bc9a0SAchim Leubner onePortContext->discovery.ConfiguresOthers == agFALSE)
26274e1bc9a0SAchim Leubner {
26284e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 1st before\n"));
26294e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
26304e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
26314e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
26324e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
26334e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
26344e1bc9a0SAchim Leubner if (ConfigurableExpander)
26354e1bc9a0SAchim Leubner {
26364e1bc9a0SAchim Leubner if ( (ConfigurableExpander->dmDevice->SASAddressID.sasAddressHi
26374e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo)) &&
26384e1bc9a0SAchim Leubner (ConfigurableExpander->dmDevice->SASAddressID.sasAddressLo
26394e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo))
26404e1bc9a0SAchim Leubner )
26414e1bc9a0SAchim Leubner { /* directly attached between oneExpander and ConfigurableExpander */
26424e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 1st before loc 1\n"));
26434e1bc9a0SAchim Leubner configSASAddressHi = oneExpander->dmDevice->SASAddressID.sasAddressHi;
26444e1bc9a0SAchim Leubner configSASAddressLo = oneExpander->dmDevice->SASAddressID.sasAddressLo;
26454e1bc9a0SAchim Leubner }
26464e1bc9a0SAchim Leubner else
26474e1bc9a0SAchim Leubner {
26484e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 1st before loc 2\n"));
26494e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
26504e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
26514e1bc9a0SAchim Leubner }
26524e1bc9a0SAchim Leubner } /* if !ConfigurableExpander */
26534e1bc9a0SAchim Leubner dupConfigSASAddr = dmDuplicateConfigSASAddr(dmRoot,
26544e1bc9a0SAchim Leubner ConfigurableExpander,
26554e1bc9a0SAchim Leubner configSASAddressHi,
26564e1bc9a0SAchim Leubner configSASAddressLo
26574e1bc9a0SAchim Leubner );
26584e1bc9a0SAchim Leubner
26594e1bc9a0SAchim Leubner
26604e1bc9a0SAchim Leubner if ( ConfigurableExpander && dupConfigSASAddr == agFALSE)
26614e1bc9a0SAchim Leubner {
26624e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 1st q123\n"));
26634e1bc9a0SAchim Leubner UpStreamExpander->dmCurrentDownStreamExpander = oneExpander;
26644e1bc9a0SAchim Leubner ConfigurableExpander->currentDownStreamPhyIndex =
26654e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(dmRoot, ConfigurableExpander);
26664e1bc9a0SAchim Leubner ConfigurableExpander->dmReturnginExpander = oneExpander;
26674e1bc9a0SAchim Leubner dmRoutingEntryAdd(dmRoot,
26684e1bc9a0SAchim Leubner ConfigurableExpander,
26694e1bc9a0SAchim Leubner ConfigurableExpander->downStreamPhys[ConfigurableExpander->currentDownStreamPhyIndex],
26704e1bc9a0SAchim Leubner configSASAddressHi,
26714e1bc9a0SAchim Leubner configSASAddressLo
26724e1bc9a0SAchim Leubner );
26734e1bc9a0SAchim Leubner }
26744e1bc9a0SAchim Leubner }
26754e1bc9a0SAchim Leubner }
26764e1bc9a0SAchim Leubner /* If fail to add the device */
26774e1bc9a0SAchim Leubner else
26784e1bc9a0SAchim Leubner {
26794e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy, Failed to add a device!!!\n"));
26804e1bc9a0SAchim Leubner /* discovery done */
26814e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
26824e1bc9a0SAchim Leubner }
26834e1bc9a0SAchim Leubner }
26844e1bc9a0SAchim Leubner }
26854e1bc9a0SAchim Leubner /* If the device has been discovered before */
26864e1bc9a0SAchim Leubner else /* discovered before */
26874e1bc9a0SAchim Leubner {
26884e1bc9a0SAchim Leubner /* If the phy has subtractive routing attribute */
26894e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_SUBTRACTIVE)
26904e1bc9a0SAchim Leubner {
26914e1bc9a0SAchim Leubner /* If the expander doesn't have up stream device */
26924e1bc9a0SAchim Leubner if ( oneExpander->hasUpStreamDevice == agFALSE)
26934e1bc9a0SAchim Leubner {
26944e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
26954e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error loop, or end device connects to two expanders!!!\n"));
26964e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
26974e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
26984e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
26994e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
27004e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
27014e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
27024e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
27034e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
27044e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
27054e1bc9a0SAchim Leubner /* discovery done */
27064e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
27074e1bc9a0SAchim Leubner }
27084e1bc9a0SAchim Leubner /* If the expander has up stream device */
27094e1bc9a0SAchim Leubner else
27104e1bc9a0SAchim Leubner {
27114e1bc9a0SAchim Leubner
27124e1bc9a0SAchim Leubner //qqqqq
27134e1bc9a0SAchim Leubner /* If sas address doesn't match */
27144e1bc9a0SAchim Leubner if ( (oneExpander->upStreamSASAddressHi != attachedSasHi)
27154e1bc9a0SAchim Leubner || (oneExpander->upStreamSASAddressLo != attachedSasLo) )
27164e1bc9a0SAchim Leubner {
27174e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
27184e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** two subtractive phys!!! Allowed in SAS2!!!\n"));
27194e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
27204e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
27214e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
27224e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
27234e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
27244e1bc9a0SAchim Leubner onePortContext->discovery.DeferredError = agTRUE;
27254e1bc9a0SAchim Leubner
27264e1bc9a0SAchim Leubner }
27274e1bc9a0SAchim Leubner }
27284e1bc9a0SAchim Leubner }
27294e1bc9a0SAchim Leubner /* If the phy has table routing attribute */
27304e1bc9a0SAchim Leubner else if ( SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE)
27314e1bc9a0SAchim Leubner {
27324e1bc9a0SAchim Leubner /* If the attached device is a fan out expander */
27334e1bc9a0SAchim Leubner if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_FANOUT_EXPANDER_DEVICE)
27344e1bc9a0SAchim Leubner {
27354e1bc9a0SAchim Leubner /* (2.3.3.2.1.1) TODO: discovery error, callback */
27364e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error fan out expander to routing table phy!!!\n"));
27374e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
27384e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
27394e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
27404e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
27414e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
27424e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
27434e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
27444e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
27454e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
27464e1bc9a0SAchim Leubner /* discovery done */
27474e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
27484e1bc9a0SAchim Leubner }
27494e1bc9a0SAchim Leubner /* If the attached device is an edge expander */
27504e1bc9a0SAchim Leubner else if ( SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pDiscoverResp) == SAS_EDGE_EXPANDER_DEVICE)
27514e1bc9a0SAchim Leubner {
27524e1bc9a0SAchim Leubner /* Setup up stream inform */
27534e1bc9a0SAchim Leubner AttachedExpander = AttachedDevice->dmExpander;
27544e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Found edge expander=%p\n", AttachedExpander));
27554e1bc9a0SAchim Leubner //hhhhhh
27564e1bc9a0SAchim Leubner /* If the attached expander has up stream device */
27574e1bc9a0SAchim Leubner if ( AttachedExpander->hasUpStreamDevice == agTRUE)
27584e1bc9a0SAchim Leubner {
27594e1bc9a0SAchim Leubner /* compare the sas address */
27604e1bc9a0SAchim Leubner if ( (AttachedExpander->upStreamSASAddressHi
27614e1bc9a0SAchim Leubner != DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo))
27624e1bc9a0SAchim Leubner || (AttachedExpander->upStreamSASAddressLo
27634e1bc9a0SAchim Leubner != DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo)))
27644e1bc9a0SAchim Leubner {
27654e1bc9a0SAchim Leubner if (AttachedExpander->TTTSupported && oneExpander->TTTSupported)
27664e1bc9a0SAchim Leubner {
27674e1bc9a0SAchim Leubner /*
27684e1bc9a0SAchim Leubner needs further error checking
27694e1bc9a0SAchim Leubner UpstreamExpanderOfAttachedExpander = AttachedExpander->UpStreamExpander
27704e1bc9a0SAchim Leubner for (i=0;i<DM_MAX_EXPANDER_PHYS;i++)
27714e1bc9a0SAchim Leubner {
27724e1bc9a0SAchim Leubner if (UpstreamExpanderOfAttachedExpander->downStreamPhys[i] != 0 &&
27734e1bc9a0SAchim Leubner }
27744e1bc9a0SAchim Leubner */
27754e1bc9a0SAchim Leubner SAS2SAS11Check = dmSAS2SAS11ErrorCheck(dmRoot, onePortContext, AttachedExpander->dmUpStreamExpander, AttachedExpander, oneExpander);
27764e1bc9a0SAchim Leubner if (SAS2SAS11Check == agTRUE)
27774e1bc9a0SAchim Leubner {
27784e1bc9a0SAchim Leubner
27794e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error SAS2 and SAS1.1!!!\n"));
27804e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
27814e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
27824e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
27834e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
27844e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
27854e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
27864e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
27874e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
27884e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
27894e1bc9a0SAchim Leubner /* discovery done */
27904e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
27914e1bc9a0SAchim Leubner }
27924e1bc9a0SAchim Leubner else
27934e1bc9a0SAchim Leubner {
27944e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: Allowed Table to Table (1)\n"));
27954e1bc9a0SAchim Leubner /* move on to the next phys but should be not proceed after oneExpander */
27964e1bc9a0SAchim Leubner oneExpander->UndoDueToTTTSupported = agTRUE;
27974e1bc9a0SAchim Leubner onePortContext->discovery.DeferredError = agFALSE;
27984e1bc9a0SAchim Leubner }
27994e1bc9a0SAchim Leubner }
28004e1bc9a0SAchim Leubner else
28014e1bc9a0SAchim Leubner {
28024e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
28034e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error two table routing phys connected (1)!!!\n"));
28044e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
28054e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
28064e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
28074e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
28084e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
28094e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
28104e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
28114e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
28124e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
28134e1bc9a0SAchim Leubner /* discovery done */
28144e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
28154e1bc9a0SAchim Leubner }
28164e1bc9a0SAchim Leubner }
28174e1bc9a0SAchim Leubner else
28184e1bc9a0SAchim Leubner {
28194e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Add edge expander=%p\n", AttachedExpander));
28204e1bc9a0SAchim Leubner /* set up downstream information on configurable expander */
28214e1bc9a0SAchim Leubner
28224e1bc9a0SAchim Leubner dmExpanderDownStreamPhyAdd(dmRoot, oneExpander, (bit8) oneExpander->discoveringPhyId);
28234e1bc9a0SAchim Leubner /* haha */
28244e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(dmRoot, AttachedExpander, (bit8) oneExpander->discoveringPhyId);
28254e1bc9a0SAchim Leubner /* Add the pAttachedExpander to discovering list */
28264e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, AttachedExpander);
28274e1bc9a0SAchim Leubner }
28284e1bc9a0SAchim Leubner }
28294e1bc9a0SAchim Leubner /* If the attached expander doesn't have up stream device */
28304e1bc9a0SAchim Leubner else
28314e1bc9a0SAchim Leubner {
28324e1bc9a0SAchim Leubner if (AttachedExpander->TTTSupported && oneExpander->TTTSupported)
28334e1bc9a0SAchim Leubner {
28344e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: Allowed Table to Table (2)\n"));
28354e1bc9a0SAchim Leubner /* move on to the next phys but should be not proceed after oneExpander */
28364e1bc9a0SAchim Leubner oneExpander->UndoDueToTTTSupported = agTRUE;
28374e1bc9a0SAchim Leubner onePortContext->discovery.DeferredError = agFALSE;
28384e1bc9a0SAchim Leubner }
28394e1bc9a0SAchim Leubner else
28404e1bc9a0SAchim Leubner {
28414e1bc9a0SAchim Leubner /* TODO: discovery error, callback */
28424e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: **** Topology Error two table routing phys connected (2)!!!\n"));
28434e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo
28444e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSLO(&oneDeviceData->agDeviceInfo);
28454e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi
28464e1bc9a0SAchim Leubner = DEVINFO_GET_SAS_ADDRESSHI(&oneDeviceData->agDeviceInfo);
28474e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier = oneExpander->discoveringPhyId;
28484e1bc9a0SAchim Leubner DM_DBG1(("dmDownStreamDiscover2ExpanderPhy: sasAddressHi 0x%08x sasAddressLo 0x%08x phyid 0x%x\n",
28494e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressHi,
28504e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.sasAddressLo,
28514e1bc9a0SAchim Leubner onePortContext->discovery.sasAddressIDDiscoverError.phyIdentifier));
28524e1bc9a0SAchim Leubner /* discovery done */
28534e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
28544e1bc9a0SAchim Leubner }
28554e1bc9a0SAchim Leubner }
28564e1bc9a0SAchim Leubner }
28574e1bc9a0SAchim Leubner } /* for else if (SAS2_DISCRSP_GET_ROUTINGATTRIB(pDiscoverResp) == SAS_ROUTING_TABLE) */
28584e1bc9a0SAchim Leubner
28594e1bc9a0SAchim Leubner /* do this regradless of sub or table */
28604e1bc9a0SAchim Leubner /* If status is still DISCOVERY_DOWN_STREAM */
28614e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM &&
28624e1bc9a0SAchim Leubner onePortContext->discovery.ConfiguresOthers == agFALSE)
28634e1bc9a0SAchim Leubner {
28644e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 2nd before\n"));
28654e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
28664e1bc9a0SAchim Leubner
28674e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
28684e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
28694e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
28704e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
28714e1bc9a0SAchim Leubner if (ConfigurableExpander)
28724e1bc9a0SAchim Leubner {
28734e1bc9a0SAchim Leubner if ( (ConfigurableExpander->dmDevice->SASAddressID.sasAddressHi
28744e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo)) &&
28754e1bc9a0SAchim Leubner (ConfigurableExpander->dmDevice->SASAddressID.sasAddressLo
28764e1bc9a0SAchim Leubner == DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo))
28774e1bc9a0SAchim Leubner )
28784e1bc9a0SAchim Leubner { /* directly attached between oneExpander and ConfigurableExpander */
28794e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 2nd before loc 1\n"));
28804e1bc9a0SAchim Leubner configSASAddressHi = oneExpander->dmDevice->SASAddressID.sasAddressHi;
28814e1bc9a0SAchim Leubner configSASAddressLo = oneExpander->dmDevice->SASAddressID.sasAddressLo;
28824e1bc9a0SAchim Leubner }
28834e1bc9a0SAchim Leubner else
28844e1bc9a0SAchim Leubner {
28854e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 2nd before loc 2\n"));
28864e1bc9a0SAchim Leubner configSASAddressHi = DEVINFO_GET_SAS_ADDRESSHI(&AttachedDevice->agDeviceInfo);
28874e1bc9a0SAchim Leubner configSASAddressLo = DEVINFO_GET_SAS_ADDRESSLO(&AttachedDevice->agDeviceInfo);
28884e1bc9a0SAchim Leubner }
28894e1bc9a0SAchim Leubner } /* if !ConfigurableExpander */
28904e1bc9a0SAchim Leubner dupConfigSASAddr = dmDuplicateConfigSASAddr(dmRoot,
28914e1bc9a0SAchim Leubner ConfigurableExpander,
28924e1bc9a0SAchim Leubner configSASAddressHi,
28934e1bc9a0SAchim Leubner configSASAddressLo
28944e1bc9a0SAchim Leubner );
28954e1bc9a0SAchim Leubner
28964e1bc9a0SAchim Leubner if ( ConfigurableExpander && dupConfigSASAddr == agFALSE)
28974e1bc9a0SAchim Leubner {
28984e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 2nd q123 \n"));
28994e1bc9a0SAchim Leubner UpStreamExpander->dmCurrentDownStreamExpander = oneExpander;
29004e1bc9a0SAchim Leubner ConfigurableExpander->currentDownStreamPhyIndex =
29014e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(dmRoot, ConfigurableExpander);
29024e1bc9a0SAchim Leubner ConfigurableExpander->dmReturnginExpander = oneExpander;
29034e1bc9a0SAchim Leubner dmRoutingEntryAdd(dmRoot,
29044e1bc9a0SAchim Leubner ConfigurableExpander,
29054e1bc9a0SAchim Leubner ConfigurableExpander->downStreamPhys[ConfigurableExpander->currentDownStreamPhyIndex],
29064e1bc9a0SAchim Leubner configSASAddressHi,
29074e1bc9a0SAchim Leubner configSASAddressLo
29084e1bc9a0SAchim Leubner );
29094e1bc9a0SAchim Leubner }
29104e1bc9a0SAchim Leubner } /* if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM) */
29114e1bc9a0SAchim Leubner /* incremental discovery */
29124e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_INCREMENTAL_START)
29134e1bc9a0SAchim Leubner {
29144e1bc9a0SAchim Leubner connectionRate = MIN(onePortContext->LinkRate, SAS2_DISCRSP_GET_LOGICAL_LINKRATE(pDiscoverResp));
29154e1bc9a0SAchim Leubner
29164e1bc9a0SAchim Leubner if (SAS2_DISCRSP_IS_STP_TARGET(pDiscoverResp) || SAS2_DISCRSP_IS_SATA_DEVICE(pDiscoverResp))
29174e1bc9a0SAchim Leubner {
29184e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: incremental SATA_STP\n"));
29194e1bc9a0SAchim Leubner
29204e1bc9a0SAchim Leubner dmPortSASDeviceAdd(
29214e1bc9a0SAchim Leubner dmRoot,
29224e1bc9a0SAchim Leubner onePortContext,
29234e1bc9a0SAchim Leubner sasIdentify,
29244e1bc9a0SAchim Leubner agFALSE,
29254e1bc9a0SAchim Leubner connectionRate,
29264e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
29274e1bc9a0SAchim Leubner 0,
29284e1bc9a0SAchim Leubner STP_DEVICE_TYPE,
29294e1bc9a0SAchim Leubner oneDeviceData,
29304e1bc9a0SAchim Leubner oneExpander,
29314e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
29324e1bc9a0SAchim Leubner );
29334e1bc9a0SAchim Leubner }
29344e1bc9a0SAchim Leubner else
29354e1bc9a0SAchim Leubner {
29364e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: incremental SAS\n"));
29374e1bc9a0SAchim Leubner
29384e1bc9a0SAchim Leubner dmPortSASDeviceAdd(
29394e1bc9a0SAchim Leubner dmRoot,
29404e1bc9a0SAchim Leubner onePortContext,
29414e1bc9a0SAchim Leubner sasIdentify,
29424e1bc9a0SAchim Leubner agFALSE,
29434e1bc9a0SAchim Leubner connectionRate,
29444e1bc9a0SAchim Leubner dmAllShared->itNexusTimeout,
29454e1bc9a0SAchim Leubner 0,
29464e1bc9a0SAchim Leubner SAS_DEVICE_TYPE,
29474e1bc9a0SAchim Leubner oneDeviceData,
29484e1bc9a0SAchim Leubner oneExpander,
29494e1bc9a0SAchim Leubner pDiscoverResp->phyIdentifier
29504e1bc9a0SAchim Leubner );
29514e1bc9a0SAchim Leubner
29524e1bc9a0SAchim Leubner }
29534e1bc9a0SAchim Leubner }
29544e1bc9a0SAchim Leubner
29554e1bc9a0SAchim Leubner
29564e1bc9a0SAchim Leubner }/* else; existing devce */
29574e1bc9a0SAchim Leubner } /* not attached to myself */
29584e1bc9a0SAchim Leubner /* If the attached device is myself */
29594e1bc9a0SAchim Leubner else
29604e1bc9a0SAchim Leubner {
29614e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Found Self\n"));
29624e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 3rd before\n"));
29634e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
29644e1bc9a0SAchim Leubner
29654e1bc9a0SAchim Leubner if (onePortContext->discovery.ConfiguresOthers == agFALSE)
29664e1bc9a0SAchim Leubner {
29674e1bc9a0SAchim Leubner UpStreamExpander = oneExpander->dmUpStreamExpander;
29684e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
29694e1bc9a0SAchim Leubner dupConfigSASAddr = dmDuplicateConfigSASAddr(dmRoot,
29704e1bc9a0SAchim Leubner ConfigurableExpander,
29714e1bc9a0SAchim Leubner onePortContext->sasLocalAddressHi,
29724e1bc9a0SAchim Leubner onePortContext->sasLocalAddressLo
29734e1bc9a0SAchim Leubner );
29744e1bc9a0SAchim Leubner
29754e1bc9a0SAchim Leubner if ( ConfigurableExpander && dupConfigSASAddr == agFALSE)
29764e1bc9a0SAchim Leubner {
29774e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: 3rd q123 Setup routing table\n"));
29784e1bc9a0SAchim Leubner UpStreamExpander->dmCurrentDownStreamExpander = oneExpander;
29794e1bc9a0SAchim Leubner ConfigurableExpander->currentDownStreamPhyIndex =
29804e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(dmRoot, ConfigurableExpander);
29814e1bc9a0SAchim Leubner ConfigurableExpander->dmReturnginExpander = oneExpander;
29824e1bc9a0SAchim Leubner dmRoutingEntryAdd(dmRoot,
29834e1bc9a0SAchim Leubner ConfigurableExpander,
29844e1bc9a0SAchim Leubner ConfigurableExpander->downStreamPhys[ConfigurableExpander->currentDownStreamPhyIndex],
29854e1bc9a0SAchim Leubner onePortContext->sasLocalAddressHi,
29864e1bc9a0SAchim Leubner onePortContext->sasLocalAddressLo
29874e1bc9a0SAchim Leubner );
29884e1bc9a0SAchim Leubner }
29894e1bc9a0SAchim Leubner }
29904e1bc9a0SAchim Leubner }
29914e1bc9a0SAchim Leubner }
29924e1bc9a0SAchim Leubner /* If no device is attached */
29934e1bc9a0SAchim Leubner else
29944e1bc9a0SAchim Leubner {
29954e1bc9a0SAchim Leubner }
29964e1bc9a0SAchim Leubner
29974e1bc9a0SAchim Leubner
29984e1bc9a0SAchim Leubner /* Increment the discovering phy id */
29994e1bc9a0SAchim Leubner oneExpander->discoveringPhyId ++;
30004e1bc9a0SAchim Leubner
30014e1bc9a0SAchim Leubner /* If the discovery status is DISCOVERY_DOWN_STREAM */
30024e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM )
30034e1bc9a0SAchim Leubner {
30044e1bc9a0SAchim Leubner /* If not the last phy */
30054e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
30064e1bc9a0SAchim Leubner {
30074e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: More Phys to discover\n"));
30084e1bc9a0SAchim Leubner /* continue discovery for the next phy */
30094e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
30104e1bc9a0SAchim Leubner }
30114e1bc9a0SAchim Leubner /* If the last phy */
30124e1bc9a0SAchim Leubner else
30134e1bc9a0SAchim Leubner {
30144e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: No More Phys\n"));
30154e1bc9a0SAchim Leubner
30164e1bc9a0SAchim Leubner /* for MCN */
30174e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
30184e1bc9a0SAchim Leubner ConfigurableExpander = dmFindConfigurableExp(dmRoot, onePortContext, oneExpander);
30194e1bc9a0SAchim Leubner if (oneExpander->UndoDueToTTTSupported == agTRUE && ConfigurableExpander != agNULL)
30204e1bc9a0SAchim Leubner // if (oneExpander->UndoDueToTTTSupported == agTRUE)
30214e1bc9a0SAchim Leubner {
30224e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: Not sure!!!\n"));
30234e1bc9a0SAchim Leubner dmDiscoveringUndoAdd(dmRoot, onePortContext, oneExpander);
30244e1bc9a0SAchim Leubner oneExpander->UndoDueToTTTSupported = agFALSE;
30254e1bc9a0SAchim Leubner }
30264e1bc9a0SAchim Leubner
30274e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
30284e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
30294e1bc9a0SAchim Leubner /* continue downstream discovering */
30304e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
30314e1bc9a0SAchim Leubner }
30324e1bc9a0SAchim Leubner }
30334e1bc9a0SAchim Leubner else
30344e1bc9a0SAchim Leubner {
30354e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: onePortContext->discovery.status not in DISCOVERY_DOWN_STREAM; status %d\n", onePortContext->discovery.status));
30364e1bc9a0SAchim Leubner }
30374e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhy: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
30384e1bc9a0SAchim Leubner
30394e1bc9a0SAchim Leubner return;
30404e1bc9a0SAchim Leubner }
30414e1bc9a0SAchim Leubner
30424e1bc9a0SAchim Leubner
30434e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveringUndoAdd(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)30444e1bc9a0SAchim Leubner dmDiscoveringUndoAdd(
30454e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
30464e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
30474e1bc9a0SAchim Leubner dmExpander_t *oneExpander
30484e1bc9a0SAchim Leubner )
30494e1bc9a0SAchim Leubner {
30504e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
30514e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
30524e1bc9a0SAchim Leubner dmList_t *ExpanderList;
30534e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
30544e1bc9a0SAchim Leubner dmIntPortContext_t *tmpOnePortContext = onePortContext;
30554e1bc9a0SAchim Leubner
30564e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveringUndoAdd: start\n"));
30574e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
30584e1bc9a0SAchim Leubner {
30594e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveringUndoAdd: empty discoveringExpanderList\n"));
30604e1bc9a0SAchim Leubner return;
30614e1bc9a0SAchim Leubner }
30624e1bc9a0SAchim Leubner
30634e1bc9a0SAchim Leubner // DM_DBG2(("dmDiscoveringUndoAdd: before\n"));
30644e1bc9a0SAchim Leubner // dmDumpAllExp(dmRoot, onePortContext, oneExpander);
30654e1bc9a0SAchim Leubner
30664e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
30674e1bc9a0SAchim Leubner while (ExpanderList != &(tmpOnePortContext->discovery.discoveringExpanderList))
30684e1bc9a0SAchim Leubner {
30694e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
30704e1bc9a0SAchim Leubner if ( tempExpander == agNULL)
30714e1bc9a0SAchim Leubner {
30724e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveringUndoAdd: tempExpander is NULL!!!\n"));
30734e1bc9a0SAchim Leubner return;
30744e1bc9a0SAchim Leubner }
30754e1bc9a0SAchim Leubner if (tempExpander->dmUpStreamExpander == oneExpander)
30764e1bc9a0SAchim Leubner {
30774e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveringUndoAdd: match!!! expander id %d\n", tempExpander->id));
30784e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveringUndoAdd: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
30794e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveringUndoAdd: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
30804e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
30814e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(tempExpander->linkNode));
30824e1bc9a0SAchim Leubner // DMLIST_ENQUEUE_AT_TAIL(&(tempExpander->linkNode), &(dmAllShared->freeExpanderList));
30834e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(tempExpander->linkNode), &(dmAllShared->mainExpanderList));
30844e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
30854e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
30864e1bc9a0SAchim Leubner }
30874e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
30884e1bc9a0SAchim Leubner {
30894e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveringUndoAdd: hitting break\n"));
30904e1bc9a0SAchim Leubner break;
30914e1bc9a0SAchim Leubner }
30924e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
30934e1bc9a0SAchim Leubner }
30944e1bc9a0SAchim Leubner
30954e1bc9a0SAchim Leubner // DM_DBG2(("dmDiscoveringUndoAdd: after\n"));
30964e1bc9a0SAchim Leubner // dmDumpAllExp(dmRoot, onePortContext, oneExpander);
30974e1bc9a0SAchim Leubner return;
30984e1bc9a0SAchim Leubner }
30994e1bc9a0SAchim Leubner
31004e1bc9a0SAchim Leubner osGLOBAL void
dmHandleZoneViolation(dmRoot_t * dmRoot,agsaRoot_t * agRoot,agsaIORequest_t * agIORequest,dmDeviceData_t * oneDeviceData,dmSMPFrameHeader_t * frameHeader,agsaFrameHandle_t frameHandle)31014e1bc9a0SAchim Leubner dmHandleZoneViolation(
31024e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
31034e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
31044e1bc9a0SAchim Leubner agsaIORequest_t *agIORequest,
31054e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData,
31064e1bc9a0SAchim Leubner dmSMPFrameHeader_t *frameHeader,
31074e1bc9a0SAchim Leubner agsaFrameHandle_t frameHandle
31084e1bc9a0SAchim Leubner )
31094e1bc9a0SAchim Leubner {
31104e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
31114e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
31124e1bc9a0SAchim Leubner
31134e1bc9a0SAchim Leubner DM_DBG1(("dmHandleZoneViolation: start\n"));
31144e1bc9a0SAchim Leubner DM_DBG1(("dmHandleZoneViolation: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
31154e1bc9a0SAchim Leubner DM_DBG1(("dmHandleZoneViolation: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
31164e1bc9a0SAchim Leubner onePortContext = oneDeviceData->dmPortContext;
31174e1bc9a0SAchim Leubner oneExpander = oneDeviceData->dmExpander;
31184e1bc9a0SAchim Leubner if (dmDiscoverCheck(dmRoot, onePortContext) == agTRUE)
31194e1bc9a0SAchim Leubner {
31204e1bc9a0SAchim Leubner DM_DBG1(("dmHandleZoneViolation: invalid port or aborted discovery!!!\n"));
31214e1bc9a0SAchim Leubner return;
31224e1bc9a0SAchim Leubner }
31234e1bc9a0SAchim Leubner /* for MCN */
31244e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
31254e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
31264e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
31274e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_UP_STREAM)
31284e1bc9a0SAchim Leubner {
31294e1bc9a0SAchim Leubner /* continue upstream discovering */
31304e1bc9a0SAchim Leubner dmUpStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
31314e1bc9a0SAchim Leubner }
31324e1bc9a0SAchim Leubner else /* DISCOVERY_DOWN_STREAM or DISCOVERY_CONFIG_ROUTING */
31334e1bc9a0SAchim Leubner {
31344e1bc9a0SAchim Leubner /* continue downstream discovering */
31354e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
31364e1bc9a0SAchim Leubner }
31374e1bc9a0SAchim Leubner return;
31384e1bc9a0SAchim Leubner }
31394e1bc9a0SAchim Leubner
31404e1bc9a0SAchim Leubner
31414e1bc9a0SAchim Leubner osGLOBAL void
dmUpStreamDiscoverExpanderPhySkip(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)31424e1bc9a0SAchim Leubner dmUpStreamDiscoverExpanderPhySkip(
31434e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
31444e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
31454e1bc9a0SAchim Leubner dmExpander_t *oneExpander
31464e1bc9a0SAchim Leubner )
31474e1bc9a0SAchim Leubner
31484e1bc9a0SAchim Leubner {
31494e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
31504e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: start\n"));
31514e1bc9a0SAchim Leubner
31524e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
31534e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
31544e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
31554e1bc9a0SAchim Leubner
31564e1bc9a0SAchim Leubner oneExpander->discoveringPhyId++;
31574e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
31584e1bc9a0SAchim Leubner {
31594e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
31604e1bc9a0SAchim Leubner {
31614e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: More Phys to discover\n"));
31624e1bc9a0SAchim Leubner /* continue discovery for the next phy */
31634e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
31644e1bc9a0SAchim Leubner }
31654e1bc9a0SAchim Leubner else
31664e1bc9a0SAchim Leubner {
31674e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: No More Phys\n"));
31684e1bc9a0SAchim Leubner
31694e1bc9a0SAchim Leubner /* for MCN */
31704e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
31714e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
31724e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
31734e1bc9a0SAchim Leubner /* continue upstream discovering */
31744e1bc9a0SAchim Leubner dmUpStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
31754e1bc9a0SAchim Leubner }
31764e1bc9a0SAchim Leubner }
31774e1bc9a0SAchim Leubner else
31784e1bc9a0SAchim Leubner {
31794e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: onePortContext->discovery.status not in DISCOVERY_UP_STREAM; status %d\n", onePortContext->discovery.status));
31804e1bc9a0SAchim Leubner
31814e1bc9a0SAchim Leubner }
31824e1bc9a0SAchim Leubner
31834e1bc9a0SAchim Leubner DM_DBG3(("dmUpStreamDiscoverExpanderPhySkip: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
31844e1bc9a0SAchim Leubner
31854e1bc9a0SAchim Leubner return;
31864e1bc9a0SAchim Leubner }
31874e1bc9a0SAchim Leubner
31884e1bc9a0SAchim Leubner
31894e1bc9a0SAchim Leubner osGLOBAL void
dmUpStreamDiscover2ExpanderPhySkip(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)31904e1bc9a0SAchim Leubner dmUpStreamDiscover2ExpanderPhySkip(
31914e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
31924e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
31934e1bc9a0SAchim Leubner dmExpander_t *oneExpander
31944e1bc9a0SAchim Leubner )
31954e1bc9a0SAchim Leubner {
31964e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
31974e1bc9a0SAchim Leubner
31984e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhySkip: start\n"));
31994e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
32004e1bc9a0SAchim Leubner
32014e1bc9a0SAchim Leubner oneExpander->discoveringPhyId++;
32024e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
32034e1bc9a0SAchim Leubner {
32044e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
32054e1bc9a0SAchim Leubner {
32064e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhySkip: DISCOVERY_UP_STREAM find more ...\n"));
32074e1bc9a0SAchim Leubner /* continue discovery for the next phy */
32084e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
32094e1bc9a0SAchim Leubner }
32104e1bc9a0SAchim Leubner else
32114e1bc9a0SAchim Leubner {
32124e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhySkip: DISCOVERY_UP_STREAM last phy continue upstream..\n"));
32134e1bc9a0SAchim Leubner
32144e1bc9a0SAchim Leubner /* for MCN */
32154e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
32164e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
32174e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
32184e1bc9a0SAchim Leubner /* continue upstream discovering */
32194e1bc9a0SAchim Leubner dmUpStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
32204e1bc9a0SAchim Leubner }
32214e1bc9a0SAchim Leubner }
32224e1bc9a0SAchim Leubner else
32234e1bc9a0SAchim Leubner {
32244e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhySkip: onePortContext->discovery.status not in DISCOVERY_UP_STREAM; status %d\n", onePortContext->discovery.status));
32254e1bc9a0SAchim Leubner }
32264e1bc9a0SAchim Leubner
32274e1bc9a0SAchim Leubner DM_DBG2(("dmUpStreamDiscover2ExpanderPhySkip: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
32284e1bc9a0SAchim Leubner
32294e1bc9a0SAchim Leubner
32304e1bc9a0SAchim Leubner return;
32314e1bc9a0SAchim Leubner }
32324e1bc9a0SAchim Leubner
32334e1bc9a0SAchim Leubner osGLOBAL void
dmDownStreamDiscoverExpanderPhySkip(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)32344e1bc9a0SAchim Leubner dmDownStreamDiscoverExpanderPhySkip(
32354e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
32364e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
32374e1bc9a0SAchim Leubner dmExpander_t *oneExpander
32384e1bc9a0SAchim Leubner )
32394e1bc9a0SAchim Leubner {
32404e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
32414e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: start\n"));
32424e1bc9a0SAchim Leubner
32434e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
32444e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
32454e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
32464e1bc9a0SAchim Leubner
32474e1bc9a0SAchim Leubner /* Increment the discovering phy id */
32484e1bc9a0SAchim Leubner oneExpander->discoveringPhyId ++;
32494e1bc9a0SAchim Leubner
32504e1bc9a0SAchim Leubner /* If the discovery status is DISCOVERY_DOWN_STREAM */
32514e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM )
32524e1bc9a0SAchim Leubner {
32534e1bc9a0SAchim Leubner /* If not the last phy */
32544e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
32554e1bc9a0SAchim Leubner {
32564e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: More Phys to discover\n"));
32574e1bc9a0SAchim Leubner /* continue discovery for the next phy */
32584e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
32594e1bc9a0SAchim Leubner }
32604e1bc9a0SAchim Leubner /* If the last phy */
32614e1bc9a0SAchim Leubner else
32624e1bc9a0SAchim Leubner {
32634e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: No More Phys\n"));
32644e1bc9a0SAchim Leubner
32654e1bc9a0SAchim Leubner /* for MCN */
32664e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
32674e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
32684e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
32694e1bc9a0SAchim Leubner /* continue downstream discovering */
32704e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
32714e1bc9a0SAchim Leubner }
32724e1bc9a0SAchim Leubner }
32734e1bc9a0SAchim Leubner else
32744e1bc9a0SAchim Leubner {
32754e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: onePortContext->discovery.status not in DISCOVERY_DOWN_STREAM; status %d\n", onePortContext->discovery.status));
32764e1bc9a0SAchim Leubner }
32774e1bc9a0SAchim Leubner DM_DBG3(("dmDownStreamDiscoverExpanderPhySkip: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
32784e1bc9a0SAchim Leubner
32794e1bc9a0SAchim Leubner
32804e1bc9a0SAchim Leubner return;
32814e1bc9a0SAchim Leubner }
32824e1bc9a0SAchim Leubner
32834e1bc9a0SAchim Leubner osGLOBAL void
dmDownStreamDiscover2ExpanderPhySkip(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)32844e1bc9a0SAchim Leubner dmDownStreamDiscover2ExpanderPhySkip(
32854e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
32864e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
32874e1bc9a0SAchim Leubner dmExpander_t *oneExpander
32884e1bc9a0SAchim Leubner )
32894e1bc9a0SAchim Leubner {
32904e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
32914e1bc9a0SAchim Leubner
32924e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhySkip: start\n"));
32934e1bc9a0SAchim Leubner
32944e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
32954e1bc9a0SAchim Leubner /* Increment the discovering phy id */
32964e1bc9a0SAchim Leubner oneExpander->discoveringPhyId ++;
32974e1bc9a0SAchim Leubner
32984e1bc9a0SAchim Leubner /* If the discovery status is DISCOVERY_DOWN_STREAM */
32994e1bc9a0SAchim Leubner if ( onePortContext->discovery.status == DISCOVERY_DOWN_STREAM )
33004e1bc9a0SAchim Leubner {
33014e1bc9a0SAchim Leubner /* If not the last phy */
33024e1bc9a0SAchim Leubner if ( oneExpander->discoveringPhyId < oneDeviceData->numOfPhys )
33034e1bc9a0SAchim Leubner {
33044e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhySkip: More Phys to discover\n"));
33054e1bc9a0SAchim Leubner /* continue discovery for the next phy */
33064e1bc9a0SAchim Leubner dmDiscoverSend(dmRoot, oneDeviceData);
33074e1bc9a0SAchim Leubner }
33084e1bc9a0SAchim Leubner /* If the last phy */
33094e1bc9a0SAchim Leubner else
33104e1bc9a0SAchim Leubner {
33114e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhySkip: No More Phys\n"));
33124e1bc9a0SAchim Leubner
33134e1bc9a0SAchim Leubner /* for MCN */
33144e1bc9a0SAchim Leubner dmUpdateAllAdjacent(dmRoot, onePortContext, oneDeviceData);
33154e1bc9a0SAchim Leubner /* remove the expander from the discovering list */
33164e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(dmRoot, onePortContext, oneExpander);
33174e1bc9a0SAchim Leubner /* continue downstream discovering */
33184e1bc9a0SAchim Leubner dmDownStreamDiscovering(dmRoot, onePortContext, oneDeviceData);
33194e1bc9a0SAchim Leubner }
33204e1bc9a0SAchim Leubner }
33214e1bc9a0SAchim Leubner else
33224e1bc9a0SAchim Leubner {
33234e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhySkip: onePortContext->discovery.status not in DISCOVERY_DOWN_STREAM; status %d\n", onePortContext->discovery.status));
33244e1bc9a0SAchim Leubner }
33254e1bc9a0SAchim Leubner DM_DBG2(("dmDownStreamDiscover2ExpanderPhySkip: end return phyID#%d\n", oneExpander->discoveringPhyId - 1));
33264e1bc9a0SAchim Leubner return;
33274e1bc9a0SAchim Leubner }
33284e1bc9a0SAchim Leubner
33294e1bc9a0SAchim Leubner osGLOBAL void
dmExpanderUpStreamPhyAdd(dmRoot_t * dmRoot,dmExpander_t * oneExpander,bit8 phyId)33304e1bc9a0SAchim Leubner dmExpanderUpStreamPhyAdd(
33314e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
33324e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
33334e1bc9a0SAchim Leubner bit8 phyId
33344e1bc9a0SAchim Leubner )
33354e1bc9a0SAchim Leubner {
33364e1bc9a0SAchim Leubner bit32 i;
33374e1bc9a0SAchim Leubner bit32 hasSet = agFALSE;
33384e1bc9a0SAchim Leubner
33394e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderUpStreamPhyAdd: start, phyid %d\n", phyId));
33404e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderUpStreamPhyAdd: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
33414e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderUpStreamPhyAdd: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
33424e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderUpStreamPhyAdd: phyid %d numOfUpStreamPhys %d\n", phyId, oneExpander->numOfUpStreamPhys));
33434e1bc9a0SAchim Leubner
33444e1bc9a0SAchim Leubner for ( i = 0; i < oneExpander->numOfUpStreamPhys; i ++ )
33454e1bc9a0SAchim Leubner {
33464e1bc9a0SAchim Leubner if ( oneExpander->upStreamPhys[i] == phyId )
33474e1bc9a0SAchim Leubner {
33484e1bc9a0SAchim Leubner hasSet = agTRUE;
33494e1bc9a0SAchim Leubner break;
33504e1bc9a0SAchim Leubner }
33514e1bc9a0SAchim Leubner }
33524e1bc9a0SAchim Leubner
33534e1bc9a0SAchim Leubner if ( hasSet == agFALSE )
33544e1bc9a0SAchim Leubner {
33554e1bc9a0SAchim Leubner oneExpander->upStreamPhys[oneExpander->numOfUpStreamPhys ++] = phyId;
33564e1bc9a0SAchim Leubner }
33574e1bc9a0SAchim Leubner
33584e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderUpStreamPhyAdd: AFTER phyid %d numOfUpStreamPhys %d\n", phyId, oneExpander->numOfUpStreamPhys));
33594e1bc9a0SAchim Leubner
33604e1bc9a0SAchim Leubner /* for debugging */
33614e1bc9a0SAchim Leubner for ( i = 0; i < oneExpander->numOfUpStreamPhys; i ++ )
33624e1bc9a0SAchim Leubner {
33634e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderUpStreamPhyAdd: index %d upstream[index] %d\n", i, oneExpander->upStreamPhys[i]));
33644e1bc9a0SAchim Leubner }
33654e1bc9a0SAchim Leubner return;
33664e1bc9a0SAchim Leubner }
33674e1bc9a0SAchim Leubner
33684e1bc9a0SAchim Leubner osGLOBAL void
dmExpanderDownStreamPhyAdd(dmRoot_t * dmRoot,dmExpander_t * oneExpander,bit8 phyId)33694e1bc9a0SAchim Leubner dmExpanderDownStreamPhyAdd(
33704e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
33714e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
33724e1bc9a0SAchim Leubner bit8 phyId
33734e1bc9a0SAchim Leubner )
33744e1bc9a0SAchim Leubner {
33754e1bc9a0SAchim Leubner bit32 i;
33764e1bc9a0SAchim Leubner bit32 hasSet = agFALSE;
33774e1bc9a0SAchim Leubner
33784e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderDownStreamPhyAdd: start, phyid %d\n", phyId));
33794e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderDownStreamPhyAdd: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
33804e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderDownStreamPhyAdd: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
33814e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderDownStreamPhyAdd: phyid %d numOfDownStreamPhys %d\n", phyId, oneExpander->numOfDownStreamPhys));
33824e1bc9a0SAchim Leubner
33834e1bc9a0SAchim Leubner for ( i = 0; i < oneExpander->numOfDownStreamPhys; i ++ )
33844e1bc9a0SAchim Leubner {
33854e1bc9a0SAchim Leubner if ( oneExpander->downStreamPhys[i] == phyId )
33864e1bc9a0SAchim Leubner {
33874e1bc9a0SAchim Leubner hasSet = agTRUE;
33884e1bc9a0SAchim Leubner break;
33894e1bc9a0SAchim Leubner }
33904e1bc9a0SAchim Leubner }
33914e1bc9a0SAchim Leubner
33924e1bc9a0SAchim Leubner if ( hasSet == agFALSE )
33934e1bc9a0SAchim Leubner {
33944e1bc9a0SAchim Leubner oneExpander->downStreamPhys[oneExpander->numOfDownStreamPhys ++] = phyId;
33954e1bc9a0SAchim Leubner }
33964e1bc9a0SAchim Leubner
33974e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderDownStreamPhyAdd: AFTER phyid %d numOfDownStreamPhys %d\n", phyId, oneExpander->numOfDownStreamPhys));
33984e1bc9a0SAchim Leubner
33994e1bc9a0SAchim Leubner /* for debugging */
34004e1bc9a0SAchim Leubner for ( i = 0; i < oneExpander->numOfDownStreamPhys; i ++ )
34014e1bc9a0SAchim Leubner {
34024e1bc9a0SAchim Leubner DM_DBG3(("dmExpanderDownStreamPhyAdd: index %d downstream[index] %d\n", i, oneExpander->downStreamPhys[i]));
34034e1bc9a0SAchim Leubner }
34044e1bc9a0SAchim Leubner return;
34054e1bc9a0SAchim Leubner }
34064e1bc9a0SAchim Leubner
34074e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryReportMCN(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)34084e1bc9a0SAchim Leubner dmDiscoveryReportMCN(
34094e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
34104e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
34114e1bc9a0SAchim Leubner )
34124e1bc9a0SAchim Leubner {
34134e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
34144e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
34154e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
34164e1bc9a0SAchim Leubner dmList_t *DeviceListList;
34174e1bc9a0SAchim Leubner bit16 extension = 0;
34184e1bc9a0SAchim Leubner dmDeviceData_t *oneAttachedExpDeviceData = agNULL;
34194e1bc9a0SAchim Leubner
34204e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: start\n"));
34214e1bc9a0SAchim Leubner
34224e1bc9a0SAchim Leubner /*
34234e1bc9a0SAchim Leubner if full disocvery, report all devices using MCN
34244e1bc9a0SAchim Leubner if incremental discovery,
34254e1bc9a0SAchim Leubner 1. compare MCN and PrevMCN
34264e1bc9a0SAchim Leubner 2. report the changed ones; report MCN
34274e1bc9a0SAchim Leubner 3. set PrevMCN to MCN
34284e1bc9a0SAchim Leubner PrevMCN = MCN
34294e1bc9a0SAchim Leubner */
34304e1bc9a0SAchim Leubner
34314e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
34324e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
34334e1bc9a0SAchim Leubner {
34344e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
34354e1bc9a0SAchim Leubner if ( oneDeviceData == agNULL)
34364e1bc9a0SAchim Leubner {
34374e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryReportMCN: oneDeviceData is NULL!!!\n"));
34384e1bc9a0SAchim Leubner return;
34394e1bc9a0SAchim Leubner }
34404e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryReportMCN: loop did %d\n", oneDeviceData->id));
34414e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext == onePortContext)
34424e1bc9a0SAchim Leubner {
34434e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: oneDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
34444e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
34454e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: MCN 0x%08x PrevMCN 0x%08x\n", oneDeviceData->MCN, oneDeviceData->PrevMCN));
34464e1bc9a0SAchim Leubner
34474e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
34484e1bc9a0SAchim Leubner {
34494e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: FULL_START\n"));
34504e1bc9a0SAchim Leubner }
34514e1bc9a0SAchim Leubner else
34524e1bc9a0SAchim Leubner {
34534e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: INCREMENTAL_START\n"));
34544e1bc9a0SAchim Leubner }
34554e1bc9a0SAchim Leubner /*
34564e1bc9a0SAchim Leubner if MCN is 0, the device is removed
34574e1bc9a0SAchim Leubner */
34584e1bc9a0SAchim Leubner if (oneDeviceData->MCN != oneDeviceData->PrevMCN && oneDeviceData->MCN != 0)
34594e1bc9a0SAchim Leubner {
34604e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: reporting \n"));
34614e1bc9a0SAchim Leubner extension = oneDeviceData->dmDeviceInfo.ext;
34624e1bc9a0SAchim Leubner /* zero out MCN in extension */
34634e1bc9a0SAchim Leubner extension = extension & 0x7FF;
34644e1bc9a0SAchim Leubner /* sets MCN in extension */
34654e1bc9a0SAchim Leubner extension = extension | (oneDeviceData->MCN << 11);
34664e1bc9a0SAchim Leubner DEVINFO_PUT_EXT(&(oneDeviceData->dmDeviceInfo), extension);
34674e1bc9a0SAchim Leubner DM_DBG5(("dmDiscoveryReportMCN: MCN 0x%08x PrevMCN 0x%08x\n", DEVINFO_GET_EXT_MCN(&(oneDeviceData->dmDeviceInfo)), oneDeviceData->PrevMCN));
34684e1bc9a0SAchim Leubner if (oneDeviceData->ExpDevice != agNULL)
34694e1bc9a0SAchim Leubner {
34704e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: attached expander case\n"));
34714e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
34724e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, &oneAttachedExpDeviceData->dmDeviceInfo, dmDeviceMCNChange);
34734e1bc9a0SAchim Leubner }
34744e1bc9a0SAchim Leubner else
34754e1bc9a0SAchim Leubner {
34764e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: No attached expander case\n"));
34774e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, agNULL, dmDeviceMCNChange);
34784e1bc9a0SAchim Leubner }
34794e1bc9a0SAchim Leubner oneDeviceData->PrevMCN = oneDeviceData->MCN;
34804e1bc9a0SAchim Leubner }
34814e1bc9a0SAchim Leubner else
34824e1bc9a0SAchim Leubner {
34834e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryReportMCN: No change; no reporting \n"));
34844e1bc9a0SAchim Leubner if (oneDeviceData->MCN == 0)
34854e1bc9a0SAchim Leubner {
34864e1bc9a0SAchim Leubner oneDeviceData->PrevMCN = oneDeviceData->MCN;
34874e1bc9a0SAchim Leubner }
34884e1bc9a0SAchim Leubner }
34894e1bc9a0SAchim Leubner
34904e1bc9a0SAchim Leubner }
34914e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
34924e1bc9a0SAchim Leubner }
34934e1bc9a0SAchim Leubner
34944e1bc9a0SAchim Leubner return;
34954e1bc9a0SAchim Leubner }
34964e1bc9a0SAchim Leubner
34974e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryDumpMCN(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)34984e1bc9a0SAchim Leubner dmDiscoveryDumpMCN(
34994e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
35004e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
35014e1bc9a0SAchim Leubner )
35024e1bc9a0SAchim Leubner {
35034e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
35044e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
35054e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
35064e1bc9a0SAchim Leubner dmList_t *DeviceListList;
35074e1bc9a0SAchim Leubner
35084e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDumpMCN: start\n"));
35094e1bc9a0SAchim Leubner
35104e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
35114e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
35124e1bc9a0SAchim Leubner {
35134e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
35144e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
35154e1bc9a0SAchim Leubner {
35164e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryDumpMCN: oneDeviceData is NULL!!!\n"));
35174e1bc9a0SAchim Leubner return;
35184e1bc9a0SAchim Leubner }
35194e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDumpMCN: loop did %d\n", oneDeviceData->id));
35204e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext == onePortContext)
35214e1bc9a0SAchim Leubner {
35224e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDumpMCN: oneDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
35234e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
35244e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDumpMCN: MCN 0x%08x PrevMCN 0x%08x\n", oneDeviceData->MCN, oneDeviceData->PrevMCN));
35254e1bc9a0SAchim Leubner }
35264e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
35274e1bc9a0SAchim Leubner }
35284e1bc9a0SAchim Leubner
35294e1bc9a0SAchim Leubner return;
35304e1bc9a0SAchim Leubner }
35314e1bc9a0SAchim Leubner
35324e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryResetMCN(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)35334e1bc9a0SAchim Leubner dmDiscoveryResetMCN(
35344e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
35354e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
35364e1bc9a0SAchim Leubner )
35374e1bc9a0SAchim Leubner {
35384e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
35394e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
35404e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
35414e1bc9a0SAchim Leubner dmList_t *DeviceListList;
35424e1bc9a0SAchim Leubner
35434e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryResetMCN: start\n"));
35444e1bc9a0SAchim Leubner
35454e1bc9a0SAchim Leubner /* reinitialize the device data belonging to this portcontext */
35464e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
35474e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
35484e1bc9a0SAchim Leubner {
35494e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
35504e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
35514e1bc9a0SAchim Leubner {
35524e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryResetMCN: oneDeviceData is NULL!!!\n"));
35534e1bc9a0SAchim Leubner return;
35544e1bc9a0SAchim Leubner }
35554e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryResetMCN: loop did %d\n", oneDeviceData->id));
35564e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext == onePortContext)
35574e1bc9a0SAchim Leubner {
35584e1bc9a0SAchim Leubner if (oneDeviceData->ExpDevice != agNULL)
35594e1bc9a0SAchim Leubner {
35604e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryResetMCN: resetting oneDeviceData->ExpDevice\n"));
35614e1bc9a0SAchim Leubner oneDeviceData->ExpDevice = agNULL;
35624e1bc9a0SAchim Leubner }
35634e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryResetMCN: resetting MCN and MCNdone\n"));
35644e1bc9a0SAchim Leubner oneDeviceData->MCN = 0;
35654e1bc9a0SAchim Leubner
35664e1bc9a0SAchim Leubner oneDeviceData->MCNDone = agFALSE;
35674e1bc9a0SAchim Leubner DM_DBG2(("dmDiscoveryResetMCN: oneDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
35684e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
35694e1bc9a0SAchim Leubner }
35704e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
35714e1bc9a0SAchim Leubner }
35724e1bc9a0SAchim Leubner
35734e1bc9a0SAchim Leubner return;
35744e1bc9a0SAchim Leubner }
35754e1bc9a0SAchim Leubner
35764e1bc9a0SAchim Leubner
35774e1bc9a0SAchim Leubner /*
35784e1bc9a0SAchim Leubner do min(oneDeviceData, found-one) in all upstream and downstream
35794e1bc9a0SAchim Leubner find ajcanent expanders and mark it done; sees only ajcacent targets
35804e1bc9a0SAchim Leubner */
35814e1bc9a0SAchim Leubner osGLOBAL void
dmUpdateAllAdjacent(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData)35824e1bc9a0SAchim Leubner dmUpdateAllAdjacent(
35834e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
35844e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
35854e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData /* current one */
35864e1bc9a0SAchim Leubner )
35874e1bc9a0SAchim Leubner {
35884e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
35894e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
35904e1bc9a0SAchim Leubner dmDeviceData_t *tmponeDeviceData = agNULL;
35914e1bc9a0SAchim Leubner dmList_t *DeviceListList;
35924e1bc9a0SAchim Leubner
35934e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateAllAdjacent: start\n"));
35944e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
35954e1bc9a0SAchim Leubner {
35964e1bc9a0SAchim Leubner DM_DBG1(("dmUpdateAllAdjacent: oneDeviceData is NULL!!!\n"));
35974e1bc9a0SAchim Leubner return;
35984e1bc9a0SAchim Leubner }
35994e1bc9a0SAchim Leubner
36004e1bc9a0SAchim Leubner oneDeviceData->MCNDone = agTRUE;
36014e1bc9a0SAchim Leubner
36024e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateAllAdjacent: oneDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
36034e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
36044e1bc9a0SAchim Leubner
36054e1bc9a0SAchim Leubner
36064e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
36074e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
36084e1bc9a0SAchim Leubner {
36094e1bc9a0SAchim Leubner tmponeDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
36104e1bc9a0SAchim Leubner if ( tmponeDeviceData == agNULL)
36114e1bc9a0SAchim Leubner {
36124e1bc9a0SAchim Leubner DM_DBG1(("dmUpdateAllAdjacent: tmponeDeviceData is NULL!!!\n"));
36134e1bc9a0SAchim Leubner return;
36144e1bc9a0SAchim Leubner }
36154e1bc9a0SAchim Leubner DM_DBG3(("dmUpdateAllAdjacent: loop did %d\n", tmponeDeviceData->id));
36164e1bc9a0SAchim Leubner if (tmponeDeviceData->dmPortContext == onePortContext && tmponeDeviceData->ExpDevice == oneDeviceData)
36174e1bc9a0SAchim Leubner {
36184e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateAllAdjacent: setting MCN DONE\n"));
36194e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateAllAdjacent: tmponeDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
36204e1bc9a0SAchim Leubner tmponeDeviceData->SASAddressID.sasAddressHi, tmponeDeviceData->SASAddressID.sasAddressLo));
36214e1bc9a0SAchim Leubner tmponeDeviceData->MCNDone = agTRUE;
36224e1bc9a0SAchim Leubner if (oneDeviceData->directlyAttached == agFALSE)
36234e1bc9a0SAchim Leubner {
36244e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateAllAdjacent: tmponeDeviceData MCN 0x%x\n", tmponeDeviceData->MCN));
36254e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateAllAdjacent: oneDeviceData MCN 0x%x\n", oneDeviceData->MCN));
36264e1bc9a0SAchim Leubner tmponeDeviceData->MCN = MIN(oneDeviceData->MCN, tmponeDeviceData->MCN);
36274e1bc9a0SAchim Leubner }
36284e1bc9a0SAchim Leubner
36294e1bc9a0SAchim Leubner }
36304e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
36314e1bc9a0SAchim Leubner }
36324e1bc9a0SAchim Leubner
36334e1bc9a0SAchim Leubner return;
36344e1bc9a0SAchim Leubner
36354e1bc9a0SAchim Leubner }
36364e1bc9a0SAchim Leubner
36374e1bc9a0SAchim Leubner osGLOBAL void
dmUpdateMCN(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * AdjacentDeviceData,dmDeviceData_t * oneDeviceData)36384e1bc9a0SAchim Leubner dmUpdateMCN(
36394e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
36404e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
36414e1bc9a0SAchim Leubner dmDeviceData_t *AdjacentDeviceData, /* adjacent expander */
36424e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData /* current one */
36434e1bc9a0SAchim Leubner )
36444e1bc9a0SAchim Leubner {
36454e1bc9a0SAchim Leubner
36464e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: start\n"));
36474e1bc9a0SAchim Leubner
36484e1bc9a0SAchim Leubner if (AdjacentDeviceData == agNULL)
36494e1bc9a0SAchim Leubner {
36504e1bc9a0SAchim Leubner DM_DBG1(("dmUpdateMCN: AdjacentDeviceData is NULL!!!\n"));
36514e1bc9a0SAchim Leubner return;
36524e1bc9a0SAchim Leubner }
36534e1bc9a0SAchim Leubner
36544e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
36554e1bc9a0SAchim Leubner {
36564e1bc9a0SAchim Leubner DM_DBG1(("dmUpdateMCN: oneDeviceData is NULL!!!\n"));
36574e1bc9a0SAchim Leubner return;
36584e1bc9a0SAchim Leubner }
36594e1bc9a0SAchim Leubner
36604e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: Current sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
36614e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
36624e1bc9a0SAchim Leubner
36634e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: AdjacentDeviceData one sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
36644e1bc9a0SAchim Leubner AdjacentDeviceData->SASAddressID.sasAddressHi, AdjacentDeviceData->SASAddressID.sasAddressLo));
36654e1bc9a0SAchim Leubner
36664e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
36674e1bc9a0SAchim Leubner {
36684e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: DISCOVERY_UP_STREAM\n"));
36694e1bc9a0SAchim Leubner }
36704e1bc9a0SAchim Leubner
36714e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
36724e1bc9a0SAchim Leubner {
36734e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: DISCOVERY_DOWN_STREAM\n"));
36744e1bc9a0SAchim Leubner }
36754e1bc9a0SAchim Leubner
36764e1bc9a0SAchim Leubner
36774e1bc9a0SAchim Leubner /* MCN */
36784e1bc9a0SAchim Leubner
36794e1bc9a0SAchim Leubner /* directly attached one does not have MCN
36804e1bc9a0SAchim Leubner update only adjacent device data
36814e1bc9a0SAchim Leubner */
36824e1bc9a0SAchim Leubner
36834e1bc9a0SAchim Leubner if (oneDeviceData->directlyAttached == agTRUE && AdjacentDeviceData->MCNDone == agFALSE)
36844e1bc9a0SAchim Leubner {
36854e1bc9a0SAchim Leubner AdjacentDeviceData->MCN++;
36864e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: case 1 oneDeviceData MCN 0x%x\n", oneDeviceData->MCN));
36874e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: case 1 AdjacentDeviceData MCN 0x%x\n", AdjacentDeviceData->MCN));
36884e1bc9a0SAchim Leubner }
36894e1bc9a0SAchim Leubner else if (AdjacentDeviceData->MCNDone == agFALSE)
36904e1bc9a0SAchim Leubner {
36914e1bc9a0SAchim Leubner AdjacentDeviceData->MCN++;
36924e1bc9a0SAchim Leubner AdjacentDeviceData->MCN = MIN(oneDeviceData->MCN, AdjacentDeviceData->MCN);
36934e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: case 2 oneDeviceData MCN 0x%x\n", oneDeviceData->MCN));
36944e1bc9a0SAchim Leubner DM_DBG2(("dmUpdateMCN: case 2 AdjacentDeviceData MCN 0x%x\n", AdjacentDeviceData->MCN));
36954e1bc9a0SAchim Leubner }
36964e1bc9a0SAchim Leubner
36974e1bc9a0SAchim Leubner
36984e1bc9a0SAchim Leubner return;
36994e1bc9a0SAchim Leubner }
37004e1bc9a0SAchim Leubner /* go through expander list and device list array ??? */
37014e1bc9a0SAchim Leubner osGLOBAL dmDeviceData_t *
dmPortSASDeviceFind(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 sasAddrLo,bit32 sasAddrHi,dmDeviceData_t * CurrentDeviceData)37024e1bc9a0SAchim Leubner dmPortSASDeviceFind(
37034e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
37044e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
37054e1bc9a0SAchim Leubner bit32 sasAddrLo,
37064e1bc9a0SAchim Leubner bit32 sasAddrHi,
37074e1bc9a0SAchim Leubner dmDeviceData_t *CurrentDeviceData /* current expander */
37084e1bc9a0SAchim Leubner )
37094e1bc9a0SAchim Leubner {
37104e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
37114e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
37124e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData, *RetDeviceData=agNULL;
37134e1bc9a0SAchim Leubner dmList_t *DeviceListList;
37144e1bc9a0SAchim Leubner
37154e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: start\n"));
37164e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: sasAddressHi 0x%08x sasAddressLo 0x%08x\n", sasAddrHi, sasAddrLo));
37174e1bc9a0SAchim Leubner
37184e1bc9a0SAchim Leubner DM_ASSERT((agNULL != dmRoot), "");
37194e1bc9a0SAchim Leubner DM_ASSERT((agNULL != onePortContext), "");
37204e1bc9a0SAchim Leubner
37214e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
37224e1bc9a0SAchim Leubner
37234e1bc9a0SAchim Leubner /* find a device's existence */
37244e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
37254e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
37264e1bc9a0SAchim Leubner {
37274e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: Full discovery\n"));
37284e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
37294e1bc9a0SAchim Leubner {
37304e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
37314e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
37324e1bc9a0SAchim Leubner {
37334e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceFind: oneDeviceData is NULL!!!\n"));
37344e1bc9a0SAchim Leubner return agNULL;
37354e1bc9a0SAchim Leubner }
37364e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == sasAddrHi) &&
37374e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == sasAddrLo) &&
37384e1bc9a0SAchim Leubner (oneDeviceData->valid == agTRUE) &&
37394e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
37404e1bc9a0SAchim Leubner )
37414e1bc9a0SAchim Leubner {
37424e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
37434e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
37444e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
37454e1bc9a0SAchim Leubner RetDeviceData = oneDeviceData;
37464e1bc9a0SAchim Leubner dmUpdateMCN(dmRoot, onePortContext, RetDeviceData, CurrentDeviceData);
37474e1bc9a0SAchim Leubner break;
37484e1bc9a0SAchim Leubner }
37494e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
37504e1bc9a0SAchim Leubner }
37514e1bc9a0SAchim Leubner }
37524e1bc9a0SAchim Leubner else
37534e1bc9a0SAchim Leubner {
37544e1bc9a0SAchim Leubner /* incremental discovery */
37554e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: Incremental discovery\n"));
37564e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
37574e1bc9a0SAchim Leubner {
37584e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
37594e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
37604e1bc9a0SAchim Leubner {
37614e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceFind: oneDeviceData is NULL!!!\n"));
37624e1bc9a0SAchim Leubner return agNULL;
37634e1bc9a0SAchim Leubner }
37644e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == sasAddrHi) &&
37654e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == sasAddrLo) &&
37664e1bc9a0SAchim Leubner (oneDeviceData->valid2 == agTRUE) &&
37674e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
37684e1bc9a0SAchim Leubner )
37694e1bc9a0SAchim Leubner {
37704e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
37714e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
37724e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceFind: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
37734e1bc9a0SAchim Leubner RetDeviceData = oneDeviceData;
37744e1bc9a0SAchim Leubner dmUpdateMCN(dmRoot, onePortContext, RetDeviceData, CurrentDeviceData);
37754e1bc9a0SAchim Leubner break;
37764e1bc9a0SAchim Leubner }
37774e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
37784e1bc9a0SAchim Leubner }
37794e1bc9a0SAchim Leubner }
37804e1bc9a0SAchim Leubner
37814e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
37824e1bc9a0SAchim Leubner
37834e1bc9a0SAchim Leubner return RetDeviceData;
37844e1bc9a0SAchim Leubner }
37854e1bc9a0SAchim Leubner
37864e1bc9a0SAchim Leubner bit32
dmNewEXPorNot(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmSASSubID_t * dmSASSubID)37874e1bc9a0SAchim Leubner dmNewEXPorNot(
37884e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
37894e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
37904e1bc9a0SAchim Leubner dmSASSubID_t *dmSASSubID
37914e1bc9a0SAchim Leubner )
37924e1bc9a0SAchim Leubner {
37934e1bc9a0SAchim Leubner // dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
37944e1bc9a0SAchim Leubner // dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
37954e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
37964e1bc9a0SAchim Leubner dmList_t *ExpanderList;
37974e1bc9a0SAchim Leubner bit32 ret = agTRUE;
37984e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
37994e1bc9a0SAchim Leubner
38004e1bc9a0SAchim Leubner DM_DBG3(("dmNewEXPorNot: start\n"));
38014e1bc9a0SAchim Leubner
38024e1bc9a0SAchim Leubner /* find a device's existence */
38034e1bc9a0SAchim Leubner ExpanderList = onePortContext->discovery.discoveringExpanderList.flink;
38044e1bc9a0SAchim Leubner while (ExpanderList != &(onePortContext->discovery.discoveringExpanderList))
38054e1bc9a0SAchim Leubner {
38064e1bc9a0SAchim Leubner oneExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
38074e1bc9a0SAchim Leubner if ( oneExpander == agNULL)
38084e1bc9a0SAchim Leubner {
38094e1bc9a0SAchim Leubner DM_DBG1(("dmNewEXPorNot: oneExpander is NULL!!!\n"));
38104e1bc9a0SAchim Leubner return agFALSE;
38114e1bc9a0SAchim Leubner }
38124e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
38134e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == dmSASSubID->sasAddressHi) &&
38144e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == dmSASSubID->sasAddressLo) &&
38154e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
38164e1bc9a0SAchim Leubner )
38174e1bc9a0SAchim Leubner {
38184e1bc9a0SAchim Leubner DM_DBG3(("dmNewEXPorNot: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
38194e1bc9a0SAchim Leubner ret = agFALSE;
38204e1bc9a0SAchim Leubner break;
38214e1bc9a0SAchim Leubner }
38224e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
38234e1bc9a0SAchim Leubner }
38244e1bc9a0SAchim Leubner
38254e1bc9a0SAchim Leubner return ret;
38264e1bc9a0SAchim Leubner }
38274e1bc9a0SAchim Leubner
38284e1bc9a0SAchim Leubner
38294e1bc9a0SAchim Leubner bit32
dmNewSASorNot(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmSASSubID_t * dmSASSubID)38304e1bc9a0SAchim Leubner dmNewSASorNot(
38314e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
38324e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
38334e1bc9a0SAchim Leubner dmSASSubID_t *dmSASSubID
38344e1bc9a0SAchim Leubner )
38354e1bc9a0SAchim Leubner {
38364e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
38374e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
38384e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
38394e1bc9a0SAchim Leubner dmList_t *DeviceListList;
38404e1bc9a0SAchim Leubner bit32 ret = agTRUE;
38414e1bc9a0SAchim Leubner
38424e1bc9a0SAchim Leubner DM_DBG3(("dmNewSASorNot: start\n"));
38434e1bc9a0SAchim Leubner
38444e1bc9a0SAchim Leubner /* find a device's existence */
38454e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
38464e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
38474e1bc9a0SAchim Leubner {
38484e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
38494e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
38504e1bc9a0SAchim Leubner {
38514e1bc9a0SAchim Leubner DM_DBG1(("dmNewSASorNot: oneDeviceData is NULL!!!\n"));
38524e1bc9a0SAchim Leubner return agFALSE;
38534e1bc9a0SAchim Leubner }
38544e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == dmSASSubID->sasAddressHi) &&
38554e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == dmSASSubID->sasAddressLo) &&
38564e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext) &&
38574e1bc9a0SAchim Leubner (oneDeviceData->registered == agTRUE)
38584e1bc9a0SAchim Leubner )
38594e1bc9a0SAchim Leubner {
38604e1bc9a0SAchim Leubner DM_DBG3(("dmNewSASorNot: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
38614e1bc9a0SAchim Leubner ret = agFALSE;
38624e1bc9a0SAchim Leubner break;
38634e1bc9a0SAchim Leubner }
38644e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
38654e1bc9a0SAchim Leubner }
38664e1bc9a0SAchim Leubner
38674e1bc9a0SAchim Leubner return ret;
38684e1bc9a0SAchim Leubner }
38694e1bc9a0SAchim Leubner /*
38704e1bc9a0SAchim Leubner call
38714e1bc9a0SAchim Leubner osGLOBAL bit32
38724e1bc9a0SAchim Leubner tddmReportDevice(
38734e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
38744e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
38754e1bc9a0SAchim Leubner dmDeviceInfo_t *dmDeviceInfo
38764e1bc9a0SAchim Leubner )
38774e1bc9a0SAchim Leubner if not reported, report Device to TDM
38784e1bc9a0SAchim Leubner */
38794e1bc9a0SAchim Leubner osGLOBAL dmDeviceData_t *
dmPortSASDeviceAdd(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,agsaSASIdentify_t sasIdentify,bit32 sasInitiator,bit8 connectionRate,bit32 itNexusTimeout,bit32 firstBurstSize,bit32 deviceType,dmDeviceData_t * oneExpDeviceData,dmExpander_t * dmExpander,bit8 phyID)38804e1bc9a0SAchim Leubner dmPortSASDeviceAdd(
38814e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
38824e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
38834e1bc9a0SAchim Leubner agsaSASIdentify_t sasIdentify,
38844e1bc9a0SAchim Leubner bit32 sasInitiator,
38854e1bc9a0SAchim Leubner bit8 connectionRate,
38864e1bc9a0SAchim Leubner bit32 itNexusTimeout,
38874e1bc9a0SAchim Leubner bit32 firstBurstSize,
38884e1bc9a0SAchim Leubner bit32 deviceType,
38894e1bc9a0SAchim Leubner dmDeviceData_t *oneExpDeviceData,
38904e1bc9a0SAchim Leubner dmExpander_t *dmExpander,
38914e1bc9a0SAchim Leubner bit8 phyID
38924e1bc9a0SAchim Leubner )
38934e1bc9a0SAchim Leubner {
38944e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
38954e1bc9a0SAchim Leubner bit8 dev_s_rate = 0;
38964e1bc9a0SAchim Leubner bit8 sasorsata = 1;
38974e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
38984e1bc9a0SAchim Leubner bit8 ExpanderConnectionRate = connectionRate;
38994e1bc9a0SAchim Leubner dmDeviceData_t *oneAttachedExpDeviceData = agNULL;
39004e1bc9a0SAchim Leubner bit16 extension = 0;
39014e1bc9a0SAchim Leubner bit32 current_link_rate = 0;
39024e1bc9a0SAchim Leubner
39034e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: start\n"));
39044e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: connectionRate %d\n", connectionRate));
39054e1bc9a0SAchim Leubner
39064e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify);
39074e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify);
39084e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = sasIdentify.initiator_ssp_stp_smp;
39094e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = sasIdentify.target_ssp_stp_smp;
39104e1bc9a0SAchim Leubner
39114e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
39124e1bc9a0SAchim Leubner {
39134e1bc9a0SAchim Leubner ExpanderConnectionRate = DEVINFO_GET_LINKRATE(&oneExpDeviceData->agDeviceInfo);
39144e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: ExpanderConnectionRate 0x%x\n", ExpanderConnectionRate));
39154e1bc9a0SAchim Leubner }
39164e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
39174e1bc9a0SAchim Leubner {
39184e1bc9a0SAchim Leubner if (oneExpDeviceData->SASAddressID.sasAddressHi == 0x0 &&
39194e1bc9a0SAchim Leubner oneExpDeviceData->SASAddressID.sasAddressLo == 0x0)
39204e1bc9a0SAchim Leubner {
39214e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceAdd: 1st Wrong expander!!!\n"));
39224e1bc9a0SAchim Leubner }
39234e1bc9a0SAchim Leubner }
39244e1bc9a0SAchim Leubner /* old device and already reported to TDM */
39254e1bc9a0SAchim Leubner if ( agFALSE == dmNewSASorNot(
39264e1bc9a0SAchim Leubner dmRoot,
39274e1bc9a0SAchim Leubner onePortContext,
39284e1bc9a0SAchim Leubner &dmSASSubID
39294e1bc9a0SAchim Leubner )
39304e1bc9a0SAchim Leubner ) /* old device */
39314e1bc9a0SAchim Leubner {
39324e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: OLD qqqq initiator_ssp_stp_smp %d target_ssp_stp_smp %d\n", dmSASSubID.initiator_ssp_stp_smp, dmSASSubID.target_ssp_stp_smp));
39334e1bc9a0SAchim Leubner /* allocate a new device and set the valid bit */
39344e1bc9a0SAchim Leubner oneDeviceData = dmAddSASToSharedcontext(
39354e1bc9a0SAchim Leubner dmRoot,
39364e1bc9a0SAchim Leubner onePortContext,
39374e1bc9a0SAchim Leubner &dmSASSubID,
39384e1bc9a0SAchim Leubner oneExpDeviceData,
39394e1bc9a0SAchim Leubner phyID
39404e1bc9a0SAchim Leubner );
39414e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
39424e1bc9a0SAchim Leubner {
39434e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceAdd: no more device, oneDeviceData is null!!!\n"));
39444e1bc9a0SAchim Leubner }
39454e1bc9a0SAchim Leubner /* If a device is allocated */
39464e1bc9a0SAchim Leubner if ( oneDeviceData != agNULL )
39474e1bc9a0SAchim Leubner {
39484e1bc9a0SAchim Leubner
39494e1bc9a0SAchim Leubner
39504e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
39514e1bc9a0SAchim Leubner {
39524e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: OLD, UP_STREAM\n"));
39534e1bc9a0SAchim Leubner }
39544e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
39554e1bc9a0SAchim Leubner {
39564e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: OLD, DOWN_STREAM\n"));
39574e1bc9a0SAchim Leubner }
39584e1bc9a0SAchim Leubner
39594e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
39604e1bc9a0SAchim Leubner {
39614e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: FULL_START\n"));
39624e1bc9a0SAchim Leubner oneDeviceData->MCN++;
39634e1bc9a0SAchim Leubner }
39644e1bc9a0SAchim Leubner else
39654e1bc9a0SAchim Leubner {
39664e1bc9a0SAchim Leubner /* incremental */
39674e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: INCREMENTAL_START\n"));
39684e1bc9a0SAchim Leubner if (oneDeviceData->MCN == 0 && oneDeviceData->directlyAttached == agFALSE)
39694e1bc9a0SAchim Leubner {
39704e1bc9a0SAchim Leubner oneDeviceData->MCN++;
39714e1bc9a0SAchim Leubner }
39724e1bc9a0SAchim Leubner }
39734e1bc9a0SAchim Leubner
39744e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: oneDeviceData MCN 0x%08x\n", oneDeviceData->MCN));
39754e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: oneDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
39764e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
39774e1bc9a0SAchim Leubner
39784e1bc9a0SAchim Leubner
39794e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: sasAddressHi 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify)));
39804e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: sasAddressLo 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify)));
39814e1bc9a0SAchim Leubner
39824e1bc9a0SAchim Leubner // oneDeviceData->sasIdentify = sasIdentify;
39834e1bc9a0SAchim Leubner dm_memcpy(&(oneDeviceData->sasIdentify), &sasIdentify, sizeof(agsaSASIdentify_t));
39844e1bc9a0SAchim Leubner
39854e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: sasAddressHi 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSHI(&oneDeviceData->sasIdentify)));
39864e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: sasAddressLo 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSLO(&oneDeviceData->sasIdentify)));
39874e1bc9a0SAchim Leubner
39884e1bc9a0SAchim Leubner /* parse sasIDframe to fill in agDeviceInfo */
39894e1bc9a0SAchim Leubner DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
39904e1bc9a0SAchim Leubner DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)itNexusTimeout);
39914e1bc9a0SAchim Leubner DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, (bit16)firstBurstSize);
39924e1bc9a0SAchim Leubner DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 1);
39934e1bc9a0SAchim Leubner
39944e1bc9a0SAchim Leubner oneDeviceData->SASSpecDeviceType = SA_IDFRM_GET_DEVICETTYPE(&sasIdentify);
39954e1bc9a0SAchim Leubner
39964e1bc9a0SAchim Leubner /* adjusting connectionRate */
39974e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
39984e1bc9a0SAchim Leubner if (oneAttachedExpDeviceData != agNULL)
39994e1bc9a0SAchim Leubner {
40004e1bc9a0SAchim Leubner connectionRate = MIN(connectionRate, DEVINFO_GET_LINKRATE(&oneAttachedExpDeviceData->agDeviceInfo));
40014e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: 1st connectionRate 0x%x DEVINFO_GET_LINKRATE(&oneAttachedExpDeviceData->agDeviceInfo) 0x%x\n",
40024e1bc9a0SAchim Leubner connectionRate, DEVINFO_GET_LINKRATE(&oneAttachedExpDeviceData->agDeviceInfo)));
40034e1bc9a0SAchim Leubner }
40044e1bc9a0SAchim Leubner else
40054e1bc9a0SAchim Leubner {
40064e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: 1st oneAttachedExpDeviceData is NULL\n"));
40074e1bc9a0SAchim Leubner }
40084e1bc9a0SAchim Leubner
40094e1bc9a0SAchim Leubner /* Device Type, SAS or SATA, connection rate; bit7 --- bit0 */
40104e1bc9a0SAchim Leubner sasorsata = (bit8)deviceType;
40114e1bc9a0SAchim Leubner /* sTSDK spec device typ */
40124e1bc9a0SAchim Leubner dev_s_rate = dev_s_rate | (sasorsata << 4);
40134e1bc9a0SAchim Leubner dev_s_rate = dev_s_rate | MIN(connectionRate, ExpanderConnectionRate);
40144e1bc9a0SAchim Leubner /* detect link rate change */
40154e1bc9a0SAchim Leubner current_link_rate = DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo);
40164e1bc9a0SAchim Leubner if (current_link_rate != (bit32)MIN(connectionRate, ExpanderConnectionRate))
40174e1bc9a0SAchim Leubner {
40184e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceAdd: link rate changed current 0x%x new 0x%x\n", current_link_rate, MIN(connectionRate, ExpanderConnectionRate)));
40194e1bc9a0SAchim Leubner DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->dmDeviceInfo, dev_s_rate);
40204e1bc9a0SAchim Leubner if (oneDeviceData->ExpDevice != agNULL)
40214e1bc9a0SAchim Leubner {
40224e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
40234e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, &oneAttachedExpDeviceData->dmDeviceInfo, dmDeviceRateChange);
40244e1bc9a0SAchim Leubner }
40254e1bc9a0SAchim Leubner else
40264e1bc9a0SAchim Leubner {
40274e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, agNULL, dmDeviceArrival);
40284e1bc9a0SAchim Leubner }
40294e1bc9a0SAchim Leubner }
40304e1bc9a0SAchim Leubner
40314e1bc9a0SAchim Leubner DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
40324e1bc9a0SAchim Leubner
40334e1bc9a0SAchim Leubner
40344e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSLO(
40354e1bc9a0SAchim Leubner &oneDeviceData->agDeviceInfo,
40364e1bc9a0SAchim Leubner SA_IDFRM_GET_SAS_ADDRESSLO(&oneDeviceData->sasIdentify)
40374e1bc9a0SAchim Leubner );
40384e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSHI(
40394e1bc9a0SAchim Leubner &oneDeviceData->agDeviceInfo,
40404e1bc9a0SAchim Leubner SA_IDFRM_GET_SAS_ADDRESSHI(&oneDeviceData->sasIdentify)
40414e1bc9a0SAchim Leubner );
40424e1bc9a0SAchim Leubner oneDeviceData->agContext.osData = oneDeviceData;
40434e1bc9a0SAchim Leubner oneDeviceData->agContext.sdkData = agNULL;
40444e1bc9a0SAchim Leubner
40454e1bc9a0SAchim Leubner
40464e1bc9a0SAchim Leubner }
40474e1bc9a0SAchim Leubner return oneDeviceData;
40484e1bc9a0SAchim Leubner } /* old device */
40494e1bc9a0SAchim Leubner
40504e1bc9a0SAchim Leubner
40514e1bc9a0SAchim Leubner /* new device */
40524e1bc9a0SAchim Leubner
40534e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: NEW qqqq initiator_ssp_stp_smp %d target_ssp_stp_smp %d\n", dmSASSubID.initiator_ssp_stp_smp, dmSASSubID.target_ssp_stp_smp));
40544e1bc9a0SAchim Leubner
40554e1bc9a0SAchim Leubner /* allocate a new device and set the valid bit */
40564e1bc9a0SAchim Leubner oneDeviceData = dmAddSASToSharedcontext(
40574e1bc9a0SAchim Leubner dmRoot,
40584e1bc9a0SAchim Leubner onePortContext,
40594e1bc9a0SAchim Leubner &dmSASSubID,
40604e1bc9a0SAchim Leubner oneExpDeviceData,
40614e1bc9a0SAchim Leubner phyID
40624e1bc9a0SAchim Leubner );
40634e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
40644e1bc9a0SAchim Leubner {
40654e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceAdd: no more device, oneDeviceData is null !!!\n"));
40664e1bc9a0SAchim Leubner }
40674e1bc9a0SAchim Leubner
40684e1bc9a0SAchim Leubner /* If a device is allocated */
40694e1bc9a0SAchim Leubner if ( oneDeviceData != agNULL )
40704e1bc9a0SAchim Leubner {
40714e1bc9a0SAchim Leubner
40724e1bc9a0SAchim Leubner // DM_DBG3(("dmPortSASDeviceAdd: sasAddressHi 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify)));
40734e1bc9a0SAchim Leubner // DM_DBG3(("dmPortSASDeviceAdd: sasAddressLo 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify)));
40744e1bc9a0SAchim Leubner
40754e1bc9a0SAchim Leubner // oneDeviceData->sasIdentify = sasIdentify;
40764e1bc9a0SAchim Leubner dm_memcpy(&(oneDeviceData->sasIdentify), &sasIdentify, sizeof(agsaSASIdentify_t));
40774e1bc9a0SAchim Leubner
40784e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
40794e1bc9a0SAchim Leubner {
40804e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: NEW, UP_STREAM\n"));
40814e1bc9a0SAchim Leubner }
40824e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
40834e1bc9a0SAchim Leubner {
40844e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: NEW, DOWN_STREAM\n"));
40854e1bc9a0SAchim Leubner }
40864e1bc9a0SAchim Leubner
40874e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
40884e1bc9a0SAchim Leubner {
40894e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: FULL_START\n"));
40904e1bc9a0SAchim Leubner oneDeviceData->MCN++;
40914e1bc9a0SAchim Leubner }
40924e1bc9a0SAchim Leubner else
40934e1bc9a0SAchim Leubner {
40944e1bc9a0SAchim Leubner /* incremental */
40954e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: INCREMENTAL_START\n"));
40964e1bc9a0SAchim Leubner if (oneDeviceData->MCN == 0 && oneDeviceData->directlyAttached == agFALSE)
40974e1bc9a0SAchim Leubner {
40984e1bc9a0SAchim Leubner oneDeviceData->MCN++;
40994e1bc9a0SAchim Leubner }
41004e1bc9a0SAchim Leubner }
41014e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: oneDeviceData MCN 0x%08x\n", oneDeviceData->MCN));
41024e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: oneDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
41034e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
41044e1bc9a0SAchim Leubner
41054e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: sasAddressHi 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSHI(&oneDeviceData->sasIdentify)));
41064e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: sasAddressLo 0x%08x\n", SA_IDFRM_GET_SAS_ADDRESSLO(&oneDeviceData->sasIdentify)));
41074e1bc9a0SAchim Leubner
41084e1bc9a0SAchim Leubner /* parse sasIDframe to fill in agDeviceInfo */
41094e1bc9a0SAchim Leubner DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
41104e1bc9a0SAchim Leubner DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)itNexusTimeout);
41114e1bc9a0SAchim Leubner DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, (bit16)firstBurstSize);
41124e1bc9a0SAchim Leubner DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 1);
41134e1bc9a0SAchim Leubner
41144e1bc9a0SAchim Leubner oneDeviceData->SASSpecDeviceType = SA_IDFRM_GET_DEVICETTYPE(&sasIdentify);
41154e1bc9a0SAchim Leubner
41164e1bc9a0SAchim Leubner /* adjusting connectionRate */
41174e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
41184e1bc9a0SAchim Leubner if (oneAttachedExpDeviceData != agNULL)
41194e1bc9a0SAchim Leubner {
41204e1bc9a0SAchim Leubner connectionRate = MIN(connectionRate, DEVINFO_GET_LINKRATE(&oneAttachedExpDeviceData->agDeviceInfo));
41214e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: 2nd connectionRate 0x%x DEVINFO_GET_LINKRATE(&oneAttachedExpDeviceData->agDeviceInfo) 0x%x\n",
41224e1bc9a0SAchim Leubner connectionRate, DEVINFO_GET_LINKRATE(&oneAttachedExpDeviceData->agDeviceInfo)));
41234e1bc9a0SAchim Leubner }
41244e1bc9a0SAchim Leubner else
41254e1bc9a0SAchim Leubner {
41264e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: 2nd oneAttachedExpDeviceData is NULL\n"));
41274e1bc9a0SAchim Leubner }
41284e1bc9a0SAchim Leubner
41294e1bc9a0SAchim Leubner /* Device Type, SAS or SATA, connection rate; bit7 --- bit0 */
41304e1bc9a0SAchim Leubner sasorsata = (bit8)deviceType;
41314e1bc9a0SAchim Leubner dev_s_rate = dev_s_rate | (sasorsata << 4);
41324e1bc9a0SAchim Leubner dev_s_rate = dev_s_rate | MIN(connectionRate, ExpanderConnectionRate);
41334e1bc9a0SAchim Leubner DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
41344e1bc9a0SAchim Leubner
41354e1bc9a0SAchim Leubner
41364e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSLO(
41374e1bc9a0SAchim Leubner &oneDeviceData->agDeviceInfo,
41384e1bc9a0SAchim Leubner SA_IDFRM_GET_SAS_ADDRESSLO(&oneDeviceData->sasIdentify)
41394e1bc9a0SAchim Leubner );
41404e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSHI(
41414e1bc9a0SAchim Leubner &oneDeviceData->agDeviceInfo,
41424e1bc9a0SAchim Leubner SA_IDFRM_GET_SAS_ADDRESSHI(&oneDeviceData->sasIdentify)
41434e1bc9a0SAchim Leubner );
41444e1bc9a0SAchim Leubner oneDeviceData->agContext.osData = oneDeviceData;
41454e1bc9a0SAchim Leubner oneDeviceData->agContext.sdkData = agNULL;
41464e1bc9a0SAchim Leubner
41474e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: did %d\n", oneDeviceData->id));
41484e1bc9a0SAchim Leubner
41494e1bc9a0SAchim Leubner
41504e1bc9a0SAchim Leubner /* reporting to TDM; setting dmDeviceInfo */
41514e1bc9a0SAchim Leubner DEVINFO_PUT_SMPTO(&oneDeviceData->dmDeviceInfo, DEFAULT_SMP_TIMEOUT);
41524e1bc9a0SAchim Leubner DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->dmDeviceInfo, (bit16)itNexusTimeout);
41534e1bc9a0SAchim Leubner DEVINFO_PUT_FBS(&oneDeviceData->dmDeviceInfo, (bit16)firstBurstSize);
41544e1bc9a0SAchim Leubner DEVINFO_PUT_FLAG(&oneDeviceData->dmDeviceInfo, 1);
41554e1bc9a0SAchim Leubner DEVINFO_PUT_INITIATOR_SSP_STP_SMP(&oneDeviceData->dmDeviceInfo, dmSASSubID.initiator_ssp_stp_smp);
41564e1bc9a0SAchim Leubner DEVINFO_PUT_TARGET_SSP_STP_SMP(&oneDeviceData->dmDeviceInfo, dmSASSubID.target_ssp_stp_smp);
41574e1bc9a0SAchim Leubner extension = phyID;
41584e1bc9a0SAchim Leubner
41594e1bc9a0SAchim Leubner /* setting 6th bit of dev_s_rate */
41604e1bc9a0SAchim Leubner if (oneDeviceData->SASSpecDeviceType == SAS_EDGE_EXPANDER_DEVICE ||
41614e1bc9a0SAchim Leubner oneDeviceData->SASSpecDeviceType == SAS_FANOUT_EXPANDER_DEVICE )
41624e1bc9a0SAchim Leubner {
41634e1bc9a0SAchim Leubner extension = (bit16)(extension | (1 << 8));
41644e1bc9a0SAchim Leubner }
41654e1bc9a0SAchim Leubner DEVINFO_PUT_EXT(&oneDeviceData->dmDeviceInfo, extension);
41664e1bc9a0SAchim Leubner
41674e1bc9a0SAchim Leubner DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->dmDeviceInfo, dev_s_rate);
41684e1bc9a0SAchim Leubner
41694e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSLO(
41704e1bc9a0SAchim Leubner &oneDeviceData->dmDeviceInfo,
41714e1bc9a0SAchim Leubner SA_IDFRM_GET_SAS_ADDRESSLO(&oneDeviceData->sasIdentify)
41724e1bc9a0SAchim Leubner );
41734e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSHI(
41744e1bc9a0SAchim Leubner &oneDeviceData->dmDeviceInfo,
41754e1bc9a0SAchim Leubner SA_IDFRM_GET_SAS_ADDRESSHI(&oneDeviceData->sasIdentify)
41764e1bc9a0SAchim Leubner );
41774e1bc9a0SAchim Leubner
41784e1bc9a0SAchim Leubner if (oneDeviceData->ExpDevice != agNULL)
41794e1bc9a0SAchim Leubner {
41804e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: attached expander case\n"));
41814e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
41824e1bc9a0SAchim Leubner /*
41834e1bc9a0SAchim Leubner Puts attached expander's SAS address into dmDeviceInfo
41844e1bc9a0SAchim Leubner */
41854e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSLO(
41864e1bc9a0SAchim Leubner &oneAttachedExpDeviceData->dmDeviceInfo,
41874e1bc9a0SAchim Leubner oneAttachedExpDeviceData->SASAddressID.sasAddressLo
41884e1bc9a0SAchim Leubner );
41894e1bc9a0SAchim Leubner DEVINFO_PUT_SAS_ADDRESSHI(
41904e1bc9a0SAchim Leubner &oneAttachedExpDeviceData->dmDeviceInfo,
41914e1bc9a0SAchim Leubner oneAttachedExpDeviceData->SASAddressID.sasAddressHi
41924e1bc9a0SAchim Leubner );
41934e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: oneAttachedExpDeviceData addrHi 0x%08x addrLo 0x%08x PhyID 0x%x ext 0x%x\n",
41944e1bc9a0SAchim Leubner DM_GET_SAS_ADDRESSHI(oneAttachedExpDeviceData->dmDeviceInfo.sasAddressHi),
41954e1bc9a0SAchim Leubner DM_GET_SAS_ADDRESSLO(oneAttachedExpDeviceData->dmDeviceInfo.sasAddressLo),
41964e1bc9a0SAchim Leubner phyID, extension));
41974e1bc9a0SAchim Leubner
41984e1bc9a0SAchim Leubner if (oneAttachedExpDeviceData->SASAddressID.sasAddressHi == 0x0 &&
41994e1bc9a0SAchim Leubner oneAttachedExpDeviceData->SASAddressID.sasAddressLo == 0x0)
42004e1bc9a0SAchim Leubner {
42014e1bc9a0SAchim Leubner DM_DBG1(("dmPortSASDeviceAdd: 2nd Wrong expander!!!\n"));
42024e1bc9a0SAchim Leubner }
42034e1bc9a0SAchim Leubner if (oneDeviceData->reported == agFALSE)
42044e1bc9a0SAchim Leubner {
42054e1bc9a0SAchim Leubner oneDeviceData->registered = agTRUE;
42064e1bc9a0SAchim Leubner oneDeviceData->reported = agTRUE;
42074e1bc9a0SAchim Leubner if (deviceType == STP_DEVICE_TYPE)
42084e1bc9a0SAchim Leubner {
42094e1bc9a0SAchim Leubner /*STP device, DM need send SMP Report Phy SATA to get the SATA device type */
42104e1bc9a0SAchim Leubner oneAttachedExpDeviceData->dmExpander->dmDeviceToProcess = oneDeviceData;
42114e1bc9a0SAchim Leubner dmReportPhySataSend(dmRoot, oneAttachedExpDeviceData, phyID);
42124e1bc9a0SAchim Leubner }
42134e1bc9a0SAchim Leubner else
42144e1bc9a0SAchim Leubner {
42154e1bc9a0SAchim Leubner /* SAS or SMP device */
42164e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, &oneAttachedExpDeviceData->dmDeviceInfo, dmDeviceArrival);
42174e1bc9a0SAchim Leubner }
42184e1bc9a0SAchim Leubner }
42194e1bc9a0SAchim Leubner }
42204e1bc9a0SAchim Leubner else
42214e1bc9a0SAchim Leubner {
42224e1bc9a0SAchim Leubner DM_DBG3(("dmPortSASDeviceAdd: NO attached expander case\n"));
42234e1bc9a0SAchim Leubner if (oneDeviceData->reported == agFALSE)
42244e1bc9a0SAchim Leubner {
42254e1bc9a0SAchim Leubner oneDeviceData->registered = agTRUE;
42264e1bc9a0SAchim Leubner oneDeviceData->reported = agTRUE;
42274e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, agNULL, dmDeviceArrival);
42284e1bc9a0SAchim Leubner }
42294e1bc9a0SAchim Leubner }
42304e1bc9a0SAchim Leubner }
42314e1bc9a0SAchim Leubner
42324e1bc9a0SAchim Leubner return oneDeviceData;
42334e1bc9a0SAchim Leubner }
42344e1bc9a0SAchim Leubner
42354e1bc9a0SAchim Leubner osGLOBAL dmDeviceData_t *
dmFindRegNValid(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmSASSubID_t * dmSASSubID)42364e1bc9a0SAchim Leubner dmFindRegNValid(
42374e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
42384e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
42394e1bc9a0SAchim Leubner dmSASSubID_t *dmSASSubID
42404e1bc9a0SAchim Leubner )
42414e1bc9a0SAchim Leubner {
42424e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
42434e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
42444e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
42454e1bc9a0SAchim Leubner dmList_t *DeviceListList;
42464e1bc9a0SAchim Leubner bit32 found = agFALSE;
42474e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: start\n"));
42484e1bc9a0SAchim Leubner
42494e1bc9a0SAchim Leubner /* find a device's existence */
42504e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
42514e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
42524e1bc9a0SAchim Leubner {
42534e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: Full discovery\n"));
42544e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
42554e1bc9a0SAchim Leubner {
42564e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
42574e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
42584e1bc9a0SAchim Leubner {
42594e1bc9a0SAchim Leubner DM_DBG1(("dmFindRegNValid: oneDeviceData is NULL!!!\n"));
42604e1bc9a0SAchim Leubner return agFALSE;
42614e1bc9a0SAchim Leubner }
42624e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == dmSASSubID->sasAddressHi) &&
42634e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == dmSASSubID->sasAddressLo) &&
42644e1bc9a0SAchim Leubner (oneDeviceData->valid == agTRUE) &&
42654e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
42664e1bc9a0SAchim Leubner )
42674e1bc9a0SAchim Leubner {
42684e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
42694e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
42704e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
42714e1bc9a0SAchim Leubner found = agTRUE;
42724e1bc9a0SAchim Leubner break;
42734e1bc9a0SAchim Leubner }
42744e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
42754e1bc9a0SAchim Leubner }
42764e1bc9a0SAchim Leubner }
42774e1bc9a0SAchim Leubner else
42784e1bc9a0SAchim Leubner {
42794e1bc9a0SAchim Leubner /* incremental discovery */
42804e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: Incremental discovery\n"));
42814e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
42824e1bc9a0SAchim Leubner {
42834e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
42844e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
42854e1bc9a0SAchim Leubner {
42864e1bc9a0SAchim Leubner DM_DBG1(("dmFindRegNValid: oneDeviceData is NULL!!!\n"));
42874e1bc9a0SAchim Leubner return agFALSE;
42884e1bc9a0SAchim Leubner }
42894e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == dmSASSubID->sasAddressHi) &&
42904e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == dmSASSubID->sasAddressLo) &&
42914e1bc9a0SAchim Leubner (oneDeviceData->valid2 == agTRUE) &&
42924e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
42934e1bc9a0SAchim Leubner )
42944e1bc9a0SAchim Leubner {
42954e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
42964e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
42974e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
42984e1bc9a0SAchim Leubner found = agTRUE;
42994e1bc9a0SAchim Leubner break;
43004e1bc9a0SAchim Leubner }
43014e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
43024e1bc9a0SAchim Leubner }
43034e1bc9a0SAchim Leubner }
43044e1bc9a0SAchim Leubner
43054e1bc9a0SAchim Leubner
43064e1bc9a0SAchim Leubner
43074e1bc9a0SAchim Leubner if (found == agFALSE)
43084e1bc9a0SAchim Leubner {
43094e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: end returning NULL\n"));
43104e1bc9a0SAchim Leubner return agNULL;
43114e1bc9a0SAchim Leubner }
43124e1bc9a0SAchim Leubner else
43134e1bc9a0SAchim Leubner {
43144e1bc9a0SAchim Leubner DM_DBG3(("dmFindRegNValid: end returning NOT NULL\n"));
43154e1bc9a0SAchim Leubner return oneDeviceData;
43164e1bc9a0SAchim Leubner }
43174e1bc9a0SAchim Leubner }
43184e1bc9a0SAchim Leubner
43194e1bc9a0SAchim Leubner osGLOBAL void
dmNotifyBC(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,bit32 type)43204e1bc9a0SAchim Leubner dmNotifyBC(
43214e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
43224e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
43234e1bc9a0SAchim Leubner bit32 type)
43244e1bc9a0SAchim Leubner {
43254e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
43264e1bc9a0SAchim Leubner
43274e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)dmPortContext->dmData;
43284e1bc9a0SAchim Leubner
43294e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: start\n"));
43304e1bc9a0SAchim Leubner
43314e1bc9a0SAchim Leubner if (onePortContext == agNULL)
43324e1bc9a0SAchim Leubner {
43334e1bc9a0SAchim Leubner DM_DBG1(("dmNotifyBC: onePortContext is NULL, wrong!!!\n"));
43344e1bc9a0SAchim Leubner return;
43354e1bc9a0SAchim Leubner }
43364e1bc9a0SAchim Leubner
43374e1bc9a0SAchim Leubner if (type == OSSA_HW_EVENT_BROADCAST_CHANGE)
43384e1bc9a0SAchim Leubner {
43394e1bc9a0SAchim Leubner if (onePortContext->DiscoveryAbortInProgress == agFALSE)
43404e1bc9a0SAchim Leubner {
43414e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED)
43424e1bc9a0SAchim Leubner {
43434e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: BROADCAST_CHANGE\n"));
43444e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_NOT_STARTED;
43454e1bc9a0SAchim Leubner onePortContext->discoveryOptions = DM_DISCOVERY_OPTION_INCREMENTAL_START;
43464e1bc9a0SAchim Leubner /* processed broadcast change */
43474e1bc9a0SAchim Leubner onePortContext->discovery.SeenBC = agFALSE;
43484e1bc9a0SAchim Leubner }
43494e1bc9a0SAchim Leubner else
43504e1bc9a0SAchim Leubner {
43514e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: pid %d BROADCAST_CHANGE; updating SeenBC. Do nothing.\n", onePortContext->id));
43524e1bc9a0SAchim Leubner onePortContext->discovery.SeenBC = agTRUE;
43534e1bc9a0SAchim Leubner }
43544e1bc9a0SAchim Leubner }
43554e1bc9a0SAchim Leubner }
43564e1bc9a0SAchim Leubner else if (type == OSSA_HW_EVENT_BROADCAST_SES)
43574e1bc9a0SAchim Leubner {
43584e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: OSSA_HW_EVENT_BROADCAST_SES\n"));
43594e1bc9a0SAchim Leubner }
43604e1bc9a0SAchim Leubner else if (type == OSSA_HW_EVENT_BROADCAST_EXP)
43614e1bc9a0SAchim Leubner {
43624e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: OSSA_HW_EVENT_BROADCAST_EXP\n"));
43634e1bc9a0SAchim Leubner }
43644e1bc9a0SAchim Leubner else
43654e1bc9a0SAchim Leubner {
43664e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: unspecified broadcast type 0x%x\n", type));
43674e1bc9a0SAchim Leubner }
43684e1bc9a0SAchim Leubner return;
43694e1bc9a0SAchim Leubner }
43704e1bc9a0SAchim Leubner
43714e1bc9a0SAchim Leubner
43724e1bc9a0SAchim Leubner #ifdef WORKED
43734e1bc9a0SAchim Leubner /* triggers incremental discovery */
43744e1bc9a0SAchim Leubner osGLOBAL void
dmNotifyBC(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,bit32 type)43754e1bc9a0SAchim Leubner dmNotifyBC(
43764e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
43774e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
43784e1bc9a0SAchim Leubner bit32 type)
43794e1bc9a0SAchim Leubner {
43804e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
43814e1bc9a0SAchim Leubner
43824e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)dmPortContext->dmData;
43834e1bc9a0SAchim Leubner
43844e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: start\n"));
43854e1bc9a0SAchim Leubner
43864e1bc9a0SAchim Leubner
43874e1bc9a0SAchim Leubner if (type == OSSA_HW_EVENT_BROADCAST_CHANGE)
43884e1bc9a0SAchim Leubner {
43894e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED)
43904e1bc9a0SAchim Leubner {
43914e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: BROADCAST_CHANGE; does incremental discovery\n"));
43924e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_NOT_STARTED;
43934e1bc9a0SAchim Leubner onePortContext->discoveryOptions = DM_DISCOVERY_OPTION_INCREMENTAL_START;
43944e1bc9a0SAchim Leubner /* processed broadcast change */
43954e1bc9a0SAchim Leubner onePortContext->discovery.SeenBC = agFALSE;
43964e1bc9a0SAchim Leubner if (onePortContext->discovery.ResetTriggerred == agTRUE)
43974e1bc9a0SAchim Leubner {
43984e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: tdsaBCTimer\n"));
43994e1bc9a0SAchim Leubner dmBCTimer(dmRoot, onePortContext);
44004e1bc9a0SAchim Leubner }
44014e1bc9a0SAchim Leubner else
44024e1bc9a0SAchim Leubner {
44034e1bc9a0SAchim Leubner dmDiscover(
44044e1bc9a0SAchim Leubner dmRoot,
44054e1bc9a0SAchim Leubner dmPortContext,
44064e1bc9a0SAchim Leubner DM_DISCOVERY_OPTION_INCREMENTAL_START
44074e1bc9a0SAchim Leubner );
44084e1bc9a0SAchim Leubner }
44094e1bc9a0SAchim Leubner }
44104e1bc9a0SAchim Leubner else
44114e1bc9a0SAchim Leubner {
44124e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: pid %d BROADCAST_CHANGE; updating SeenBC. Do nothing.\n", onePortContext->id));
44134e1bc9a0SAchim Leubner onePortContext->discovery.SeenBC = agTRUE;
44144e1bc9a0SAchim Leubner }
44154e1bc9a0SAchim Leubner }
44164e1bc9a0SAchim Leubner else if (type == OSSA_HW_EVENT_BROADCAST_SES)
44174e1bc9a0SAchim Leubner {
44184e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: OSSA_HW_EVENT_BROADCAST_SES\n"));
44194e1bc9a0SAchim Leubner }
44204e1bc9a0SAchim Leubner else if (type == OSSA_HW_EVENT_BROADCAST_EXP)
44214e1bc9a0SAchim Leubner {
44224e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: OSSA_HW_EVENT_BROADCAST_EXP\n"));
44234e1bc9a0SAchim Leubner }
44244e1bc9a0SAchim Leubner else
44254e1bc9a0SAchim Leubner {
44264e1bc9a0SAchim Leubner DM_DBG3(("dmNotifyBC: unspecified broadcast type 0x%x\n", type));
44274e1bc9a0SAchim Leubner }
44284e1bc9a0SAchim Leubner return;
44294e1bc9a0SAchim Leubner }
44304e1bc9a0SAchim Leubner #endif
44314e1bc9a0SAchim Leubner
44324e1bc9a0SAchim Leubner osGLOBAL bit32
dmResetFailedDiscovery(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext)44334e1bc9a0SAchim Leubner dmResetFailedDiscovery(
44344e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
44354e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext)
44364e1bc9a0SAchim Leubner {
44374e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
44384e1bc9a0SAchim Leubner
44394e1bc9a0SAchim Leubner DM_DBG1(("dmResetFailedDiscovery: start\n"));
44404e1bc9a0SAchim Leubner
44414e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)dmPortContext->dmData;
44424e1bc9a0SAchim Leubner
44434e1bc9a0SAchim Leubner if (onePortContext == agNULL)
44444e1bc9a0SAchim Leubner {
44454e1bc9a0SAchim Leubner DM_DBG1(("dmResetFailedDiscovery: onePortContext is NULL, wrong!!!\n"));
44464e1bc9a0SAchim Leubner return DM_RC_FAILURE;
44474e1bc9a0SAchim Leubner }
44484e1bc9a0SAchim Leubner
44494e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED_WITH_FAILURE)
44504e1bc9a0SAchim Leubner {
44514e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_COMPLETED;
44524e1bc9a0SAchim Leubner }
44534e1bc9a0SAchim Leubner else
44544e1bc9a0SAchim Leubner {
44554e1bc9a0SAchim Leubner DM_DBG1(("dmResetFailedDiscovery: discovery is NOT DM_DSTATE_COMPLETED_WITH_FAILURE. It is 0x%x\n", onePortContext->DiscoveryState));
44564e1bc9a0SAchim Leubner return DM_RC_FAILURE;
44574e1bc9a0SAchim Leubner }
44584e1bc9a0SAchim Leubner
44594e1bc9a0SAchim Leubner return DM_RC_SUCCESS;
44604e1bc9a0SAchim Leubner }
44614e1bc9a0SAchim Leubner
44624e1bc9a0SAchim Leubner osGLOBAL bit32
dmQueryDiscovery(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext)44634e1bc9a0SAchim Leubner dmQueryDiscovery(
44644e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
44654e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext)
44664e1bc9a0SAchim Leubner {
44674e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
44684e1bc9a0SAchim Leubner
44694e1bc9a0SAchim Leubner DM_DBG3(("dmQueryDiscovery: start\n"));
44704e1bc9a0SAchim Leubner
44714e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)dmPortContext->dmData;
44724e1bc9a0SAchim Leubner
44734e1bc9a0SAchim Leubner if (onePortContext == agNULL)
44744e1bc9a0SAchim Leubner {
44754e1bc9a0SAchim Leubner DM_DBG1(("dmQueryDiscovery: onePortContext is NULL, wrong!!!\n"));
44764e1bc9a0SAchim Leubner return DM_RC_FAILURE;
44774e1bc9a0SAchim Leubner }
44784e1bc9a0SAchim Leubner
44794e1bc9a0SAchim Leubner /* call tddmQueryDiscoveryCB() */
44804e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED)
44814e1bc9a0SAchim Leubner {
44824e1bc9a0SAchim Leubner tddmQueryDiscoveryCB(dmRoot, dmPortContext, onePortContext->discoveryOptions, dmDiscCompleted);
44834e1bc9a0SAchim Leubner }
44844e1bc9a0SAchim Leubner else if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED_WITH_FAILURE)
44854e1bc9a0SAchim Leubner {
44864e1bc9a0SAchim Leubner tddmQueryDiscoveryCB(dmRoot, dmPortContext, onePortContext->discoveryOptions, dmDiscFailed);
44874e1bc9a0SAchim Leubner }
44884e1bc9a0SAchim Leubner else
44894e1bc9a0SAchim Leubner {
44904e1bc9a0SAchim Leubner tddmQueryDiscoveryCB(dmRoot, dmPortContext, onePortContext->discoveryOptions, dmDiscInProgress);
44914e1bc9a0SAchim Leubner }
44924e1bc9a0SAchim Leubner
44934e1bc9a0SAchim Leubner return DM_RC_SUCCESS;
44944e1bc9a0SAchim Leubner }
44954e1bc9a0SAchim Leubner
44964e1bc9a0SAchim Leubner
44974e1bc9a0SAchim Leubner /*
44984e1bc9a0SAchim Leubner should only for an expander
44994e1bc9a0SAchim Leubner */
45004e1bc9a0SAchim Leubner osGLOBAL bit32
dmRegisterDevice(dmRoot_t * dmRoot,dmPortContext_t * dmPortContext,dmDeviceInfo_t * dmDeviceInfo,agsaDevHandle_t * agDevHandle)45014e1bc9a0SAchim Leubner dmRegisterDevice(
45024e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
45034e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
45044e1bc9a0SAchim Leubner dmDeviceInfo_t *dmDeviceInfo,
45054e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle
45064e1bc9a0SAchim Leubner )
45074e1bc9a0SAchim Leubner {
45084e1bc9a0SAchim Leubner
45094e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
45104e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
45114e1bc9a0SAchim Leubner bit32 sasAddressHi, sasAddressLo;
45124e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
45134e1bc9a0SAchim Leubner dmSASSubID_t dmSASSubID;
45144e1bc9a0SAchim Leubner
45154e1bc9a0SAchim Leubner DM_DBG3(("dmRegisterDevice: start\n"));
45164e1bc9a0SAchim Leubner
45174e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)dmPortContext->dmData;
45184e1bc9a0SAchim Leubner if (onePortContext == agNULL)
45194e1bc9a0SAchim Leubner {
45204e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: onePortContext is NULL!!!\n"));
45214e1bc9a0SAchim Leubner return DM_RC_FAILURE;
45224e1bc9a0SAchim Leubner }
45234e1bc9a0SAchim Leubner
45244e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
45254e1bc9a0SAchim Leubner {
45264e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: invalid port!!!\n"));
45274e1bc9a0SAchim Leubner return DM_RC_FAILURE;
45284e1bc9a0SAchim Leubner }
45294e1bc9a0SAchim Leubner
45304e1bc9a0SAchim Leubner onePortContext->RegFailed = agFALSE;
45314e1bc9a0SAchim Leubner
45324e1bc9a0SAchim Leubner /* tdssAddSASToSharedcontext() from ossaHwCB()
45334e1bc9a0SAchim Leubner osGLOBAL void
45344e1bc9a0SAchim Leubner tdssAddSASToSharedcontext(
45354e1bc9a0SAchim Leubner tdsaPortContext_t *tdsaPortContext_Instance,
45364e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
45374e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle,
45384e1bc9a0SAchim Leubner tdsaSASSubID_t *agSASSubID,
45394e1bc9a0SAchim Leubner bit32 registered,
45404e1bc9a0SAchim Leubner bit8 phyID,
45414e1bc9a0SAchim Leubner bit32 flag
45424e1bc9a0SAchim Leubner );
45434e1bc9a0SAchim Leubner from discovery
45444e1bc9a0SAchim Leubner osGLOBAL tdsaDeviceData_t *
45454e1bc9a0SAchim Leubner tdssNewAddSASToSharedcontext(
45464e1bc9a0SAchim Leubner agsaRoot_t *agRoot,
45474e1bc9a0SAchim Leubner tdsaPortContext_t *onePortContext,
45484e1bc9a0SAchim Leubner tdsaSASSubID_t *agSASSubID,
45494e1bc9a0SAchim Leubner tdsaDeviceData_t *oneExpDeviceData,
45504e1bc9a0SAchim Leubner bit8 phyID
45514e1bc9a0SAchim Leubner );
45524e1bc9a0SAchim Leubner
45534e1bc9a0SAchim Leubner */
45544e1bc9a0SAchim Leubner /* start here */
45554e1bc9a0SAchim Leubner dmSASSubID.sasAddressHi = DM_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
45564e1bc9a0SAchim Leubner dmSASSubID.sasAddressLo = DM_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo);
45574e1bc9a0SAchim Leubner dmSASSubID.initiator_ssp_stp_smp = dmDeviceInfo->initiator_ssp_stp_smp;
45584e1bc9a0SAchim Leubner dmSASSubID.target_ssp_stp_smp = dmDeviceInfo->target_ssp_stp_smp;
45594e1bc9a0SAchim Leubner
45604e1bc9a0SAchim Leubner oneDeviceData = dmAddSASToSharedcontext(dmRoot, onePortContext, &dmSASSubID, agNULL, 0xFF);
45614e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
45624e1bc9a0SAchim Leubner {
45634e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: oneDeviceData is NULL!!!\n"));
45644e1bc9a0SAchim Leubner return DM_RC_FAILURE;
45654e1bc9a0SAchim Leubner }
45664e1bc9a0SAchim Leubner oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate;
45674e1bc9a0SAchim Leubner dm_memcpy(oneDeviceData->agDeviceInfo.sasAddressHi, dmDeviceInfo->sasAddressHi, 4);
45684e1bc9a0SAchim Leubner dm_memcpy(oneDeviceData->agDeviceInfo.sasAddressLo, dmDeviceInfo->sasAddressLo, 4);
45694e1bc9a0SAchim Leubner /* finds the type of expanders */
45704e1bc9a0SAchim Leubner if (DEVINFO_GET_EXT_SMP(dmDeviceInfo))
45714e1bc9a0SAchim Leubner {
45724e1bc9a0SAchim Leubner if (DEVINFO_GET_EXT_EXPANDER_TYPE(dmDeviceInfo) == SAS_EDGE_EXPANDER_DEVICE)
45734e1bc9a0SAchim Leubner {
45744e1bc9a0SAchim Leubner oneDeviceData->SASSpecDeviceType = SAS_EDGE_EXPANDER_DEVICE;
45754e1bc9a0SAchim Leubner }
45764e1bc9a0SAchim Leubner else if (DEVINFO_GET_EXT_EXPANDER_TYPE(dmDeviceInfo) == SAS_FANOUT_EXPANDER_DEVICE)
45774e1bc9a0SAchim Leubner {
45784e1bc9a0SAchim Leubner oneDeviceData->SASSpecDeviceType = SAS_FANOUT_EXPANDER_DEVICE;
45794e1bc9a0SAchim Leubner }
45804e1bc9a0SAchim Leubner else
45814e1bc9a0SAchim Leubner {
45824e1bc9a0SAchim Leubner /* default */
45834e1bc9a0SAchim Leubner DM_DBG4(("dmRegisterDevice: no expander type. default to edge expander\n"));
45844e1bc9a0SAchim Leubner oneDeviceData->SASSpecDeviceType = SAS_EDGE_EXPANDER_DEVICE;
45854e1bc9a0SAchim Leubner }
45864e1bc9a0SAchim Leubner }
45874e1bc9a0SAchim Leubner
45884e1bc9a0SAchim Leubner if (DEVINFO_GET_EXT_MCN(dmDeviceInfo) == 0xF)
45894e1bc9a0SAchim Leubner {
45904e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: directly attached expander\n"));
45914e1bc9a0SAchim Leubner oneDeviceData->directlyAttached = agTRUE;
45924e1bc9a0SAchim Leubner oneDeviceData->dmDeviceInfo.ext = (bit16)(oneDeviceData->dmDeviceInfo.ext | (0xF << 11));
45934e1bc9a0SAchim Leubner }
45944e1bc9a0SAchim Leubner else
45954e1bc9a0SAchim Leubner {
45964e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: NOT directly attached expander\n"));
45974e1bc9a0SAchim Leubner oneDeviceData->directlyAttached = agFALSE;
45984e1bc9a0SAchim Leubner }
45994e1bc9a0SAchim Leubner
46004e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_NOT_STARTED)
46014e1bc9a0SAchim Leubner {
46024e1bc9a0SAchim Leubner DM_DBG3(("dmRegisterDevice: DM_DSTATE_NOT_STARTED\n"));
46034e1bc9a0SAchim Leubner /* before the discovery is started */
46044e1bc9a0SAchim Leubner oneExpander = dmDiscoveringExpanderAlloc(dmRoot, onePortContext, oneDeviceData);
46054e1bc9a0SAchim Leubner if ( oneExpander != agNULL)
46064e1bc9a0SAchim Leubner {
46074e1bc9a0SAchim Leubner oneExpander->agDevHandle = agDevHandle;
46084e1bc9a0SAchim Leubner /* update SAS address field */
46094e1bc9a0SAchim Leubner oneExpander->dmDevice->SASAddressID.sasAddressHi = DM_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
46104e1bc9a0SAchim Leubner oneExpander->dmDevice->SASAddressID.sasAddressLo = DM_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
46114e1bc9a0SAchim Leubner DM_DBG3(("dmRegisterDevice: AddrHi 0x%08x AddrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi, oneExpander->dmDevice->SASAddressID.sasAddressLo));
46124e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(dmRoot, onePortContext, oneExpander);
46134e1bc9a0SAchim Leubner }
46144e1bc9a0SAchim Leubner else
46154e1bc9a0SAchim Leubner {
46164e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: failed to allocate expander !!!\n"));
46174e1bc9a0SAchim Leubner /* remember that the registration failed so that a discovery can't be started */
46184e1bc9a0SAchim Leubner onePortContext->RegFailed = agTRUE;
46194e1bc9a0SAchim Leubner return DM_RC_FAILURE;
46204e1bc9a0SAchim Leubner }
46214e1bc9a0SAchim Leubner }
46224e1bc9a0SAchim Leubner else
46234e1bc9a0SAchim Leubner {
46244e1bc9a0SAchim Leubner /*
46254e1bc9a0SAchim Leubner the discovery has started. Alloc and add have been done.
46264e1bc9a0SAchim Leubner find an expander using dmDeviceInfo, and update the expander's agDevHandle
46274e1bc9a0SAchim Leubner call dmExpFind()
46284e1bc9a0SAchim Leubner */
46294e1bc9a0SAchim Leubner DM_DBG3(("dmRegisterDevice: NOT DM_DSTATE_NOT_STARTED\n"));
46304e1bc9a0SAchim Leubner sasAddressHi = DM_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi);
46314e1bc9a0SAchim Leubner sasAddressLo = DM_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo);
46324e1bc9a0SAchim Leubner DM_DBG3(("dmRegisterDevice: AddrHi 0x%08x AddrLo 0x%08x\n", sasAddressHi, sasAddressLo));
46334e1bc9a0SAchim Leubner oneExpander = dmExpFind(dmRoot, onePortContext, sasAddressHi, sasAddressLo);
46344e1bc9a0SAchim Leubner if ( oneExpander != agNULL)
46354e1bc9a0SAchim Leubner {
46364e1bc9a0SAchim Leubner oneExpander->agDevHandle = agDevHandle;
46374e1bc9a0SAchim Leubner }
46384e1bc9a0SAchim Leubner else
46394e1bc9a0SAchim Leubner {
46404e1bc9a0SAchim Leubner DM_DBG1(("dmRegisterDevice: not allowed case, wrong !!!\n"));
46414e1bc9a0SAchim Leubner return DM_RC_FAILURE;
46424e1bc9a0SAchim Leubner }
46434e1bc9a0SAchim Leubner }
46444e1bc9a0SAchim Leubner
46454e1bc9a0SAchim Leubner return DM_RC_SUCCESS;
46464e1bc9a0SAchim Leubner }
46474e1bc9a0SAchim Leubner
46484e1bc9a0SAchim Leubner osGLOBAL dmExpander_t *
dmDiscoveringExpanderAlloc(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData)46494e1bc9a0SAchim Leubner dmDiscoveringExpanderAlloc(
46504e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
46514e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
46524e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData
46534e1bc9a0SAchim Leubner )
46544e1bc9a0SAchim Leubner {
46554e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
46564e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
46574e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
46584e1bc9a0SAchim Leubner dmList_t *ExpanderList;
46594e1bc9a0SAchim Leubner
46604e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAlloc: start\n"));
46614e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAlloc: did %d\n", oneDeviceData->id));
46624e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAlloc: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
46634e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAlloc: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
46644e1bc9a0SAchim Leubner
46654e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
46664e1bc9a0SAchim Leubner {
46674e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveringExpanderAlloc: invalid port!!!\n"));
46684e1bc9a0SAchim Leubner return agNULL;
46694e1bc9a0SAchim Leubner }
46704e1bc9a0SAchim Leubner
46714e1bc9a0SAchim Leubner
46724e1bc9a0SAchim Leubner /* check exitence in dmAllShared->mainExpanderList */
46734e1bc9a0SAchim Leubner oneExpander = dmExpMainListFind(dmRoot,
46744e1bc9a0SAchim Leubner onePortContext,
46754e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi,
46764e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo);
46774e1bc9a0SAchim Leubner
46784e1bc9a0SAchim Leubner if (oneExpander == agNULL)
46794e1bc9a0SAchim Leubner {
46804e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
46814e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->freeExpanderList)))
46824e1bc9a0SAchim Leubner {
46834e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveringExpanderAlloc: no free expanders pid %d!!!\n", onePortContext->id));
46844e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
46854e1bc9a0SAchim Leubner return agNULL;
46864e1bc9a0SAchim Leubner }
46874e1bc9a0SAchim Leubner else
46884e1bc9a0SAchim Leubner {
46894e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
46904e1bc9a0SAchim Leubner }
46914e1bc9a0SAchim Leubner
46924e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
46934e1bc9a0SAchim Leubner DMLIST_DEQUEUE_FROM_HEAD(&ExpanderList, &(dmAllShared->freeExpanderList));
46944e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
46954e1bc9a0SAchim Leubner
46964e1bc9a0SAchim Leubner oneExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
46974e1bc9a0SAchim Leubner }
46984e1bc9a0SAchim Leubner
46994e1bc9a0SAchim Leubner if (oneExpander != agNULL)
47004e1bc9a0SAchim Leubner {
47014e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveringExpanderAlloc: pid %d exp id %d \n", onePortContext->id, oneExpander->id));
47024e1bc9a0SAchim Leubner
47034e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
47044e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(oneExpander->linkNode));
47054e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
47064e1bc9a0SAchim Leubner
47074e1bc9a0SAchim Leubner oneExpander->dmDevice = oneDeviceData;
47084e1bc9a0SAchim Leubner oneExpander->dmUpStreamExpander = agNULL;
47094e1bc9a0SAchim Leubner oneExpander->dmCurrentDownStreamExpander = agNULL;
47104e1bc9a0SAchim Leubner oneExpander->dmReturnginExpander = agNULL;
47114e1bc9a0SAchim Leubner oneExpander->hasUpStreamDevice = agFALSE;
47124e1bc9a0SAchim Leubner oneExpander->numOfUpStreamPhys = 0;
47134e1bc9a0SAchim Leubner oneExpander->currentUpStreamPhyIndex = 0;
47144e1bc9a0SAchim Leubner oneExpander->discoveringPhyId = 0;
47154e1bc9a0SAchim Leubner oneExpander->underDiscovering = agFALSE;
47164e1bc9a0SAchim Leubner dm_memset( &(oneExpander->currentIndex), 0, sizeof(oneExpander->currentIndex));
47174e1bc9a0SAchim Leubner
47184e1bc9a0SAchim Leubner oneDeviceData->dmExpander = oneExpander;
47194e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAlloc: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
47204e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAlloc: oneExpander %p did %d\n", oneDeviceData->dmExpander, oneDeviceData->dmExpander->id));
47214e1bc9a0SAchim Leubner
47224e1bc9a0SAchim Leubner }
47234e1bc9a0SAchim Leubner
47244e1bc9a0SAchim Leubner return oneExpander;
47254e1bc9a0SAchim Leubner }
47264e1bc9a0SAchim Leubner
47274e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveringExpanderAdd(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)47284e1bc9a0SAchim Leubner dmDiscoveringExpanderAdd(
47294e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
47304e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
47314e1bc9a0SAchim Leubner dmExpander_t *oneExpander
47324e1bc9a0SAchim Leubner )
47334e1bc9a0SAchim Leubner {
47344e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: start\n"));
47354e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: expander id %d\n", oneExpander->id));
47364e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
47374e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
47384e1bc9a0SAchim Leubner
47394e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
47404e1bc9a0SAchim Leubner {
47414e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveringExpanderAdd: invalid port!!!\n"));
47424e1bc9a0SAchim Leubner return;
47434e1bc9a0SAchim Leubner }
47444e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
47454e1bc9a0SAchim Leubner {
47464e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: UPSTREAM\n"));
47474e1bc9a0SAchim Leubner }
47484e1bc9a0SAchim Leubner else if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
47494e1bc9a0SAchim Leubner {
47504e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: DOWNSTREAM\n"));
47514e1bc9a0SAchim Leubner }
47524e1bc9a0SAchim Leubner else
47534e1bc9a0SAchim Leubner {
47544e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: status %d\n", onePortContext->discovery.status));
47554e1bc9a0SAchim Leubner }
47564e1bc9a0SAchim Leubner
47574e1bc9a0SAchim Leubner if ( oneExpander->underDiscovering == agFALSE)
47584e1bc9a0SAchim Leubner {
47594e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderAdd: ADDED \n"));
47604e1bc9a0SAchim Leubner
47614e1bc9a0SAchim Leubner oneExpander->underDiscovering = agTRUE;
47624e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
47634e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(oneExpander->linkNode), &(onePortContext->discovery.discoveringExpanderList));
47644e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
47654e1bc9a0SAchim Leubner }
47664e1bc9a0SAchim Leubner
47674e1bc9a0SAchim Leubner return;
47684e1bc9a0SAchim Leubner }
47694e1bc9a0SAchim Leubner
47704e1bc9a0SAchim Leubner osGLOBAL dmExpander_t *
dmFindConfigurableExp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)47714e1bc9a0SAchim Leubner dmFindConfigurableExp(
47724e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
47734e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
47744e1bc9a0SAchim Leubner dmExpander_t *oneExpander
47754e1bc9a0SAchim Leubner )
47764e1bc9a0SAchim Leubner {
47774e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
47784e1bc9a0SAchim Leubner dmIntPortContext_t *tmpOnePortContext = onePortContext;
47794e1bc9a0SAchim Leubner dmExpander_t *ret = agNULL;
47804e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: start\n"));
47814e1bc9a0SAchim Leubner
47824e1bc9a0SAchim Leubner if (oneExpander == agNULL)
47834e1bc9a0SAchim Leubner {
47844e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: NULL expander\n"));
47854e1bc9a0SAchim Leubner return agNULL;
47864e1bc9a0SAchim Leubner }
47874e1bc9a0SAchim Leubner
47884e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
47894e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
47904e1bc9a0SAchim Leubner
47914e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
47924e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
47934e1bc9a0SAchim Leubner {
47944e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
47954e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: empty UpdiscoveringExpanderList\n"));
47964e1bc9a0SAchim Leubner return agNULL;
47974e1bc9a0SAchim Leubner }
47984e1bc9a0SAchim Leubner else
47994e1bc9a0SAchim Leubner {
48004e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
48014e1bc9a0SAchim Leubner }
48024e1bc9a0SAchim Leubner tempExpander = oneExpander->dmUpStreamExpander;
48034e1bc9a0SAchim Leubner while (tempExpander)
48044e1bc9a0SAchim Leubner {
48054e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: loop exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
48064e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: loop exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
48074e1bc9a0SAchim Leubner if (tempExpander->configRouteTable)
48084e1bc9a0SAchim Leubner {
48094e1bc9a0SAchim Leubner DM_DBG3(("dmFindConfigurableExp: found configurable expander\n"));
48104e1bc9a0SAchim Leubner ret = tempExpander;
48114e1bc9a0SAchim Leubner break;
48124e1bc9a0SAchim Leubner }
48134e1bc9a0SAchim Leubner tempExpander = tempExpander->dmUpStreamExpander;
48144e1bc9a0SAchim Leubner }
48154e1bc9a0SAchim Leubner
48164e1bc9a0SAchim Leubner return ret;
48174e1bc9a0SAchim Leubner }
48184e1bc9a0SAchim Leubner
48194e1bc9a0SAchim Leubner osGLOBAL bit32
dmDuplicateConfigSASAddr(dmRoot_t * dmRoot,dmExpander_t * oneExpander,bit32 configSASAddressHi,bit32 configSASAddressLo)48204e1bc9a0SAchim Leubner dmDuplicateConfigSASAddr(
48214e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
48224e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
48234e1bc9a0SAchim Leubner bit32 configSASAddressHi,
48244e1bc9a0SAchim Leubner bit32 configSASAddressLo
48254e1bc9a0SAchim Leubner )
48264e1bc9a0SAchim Leubner {
48274e1bc9a0SAchim Leubner bit32 i;
48284e1bc9a0SAchim Leubner bit32 ret = agFALSE;
48294e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: start\n"));
48304e1bc9a0SAchim Leubner
48314e1bc9a0SAchim Leubner if (oneExpander == agNULL)
48324e1bc9a0SAchim Leubner {
48334e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: NULL expander\n"));
48344e1bc9a0SAchim Leubner return agTRUE;
48354e1bc9a0SAchim Leubner }
48364e1bc9a0SAchim Leubner
48374e1bc9a0SAchim Leubner if (oneExpander->dmDevice->SASAddressID.sasAddressHi == configSASAddressHi &&
48384e1bc9a0SAchim Leubner oneExpander->dmDevice->SASAddressID.sasAddressLo == configSASAddressLo
48394e1bc9a0SAchim Leubner )
48404e1bc9a0SAchim Leubner {
48414e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: unnecessary\n"));
48424e1bc9a0SAchim Leubner return agTRUE;
48434e1bc9a0SAchim Leubner }
48444e1bc9a0SAchim Leubner
48454e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
48464e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
48474e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: configsasAddressHi 0x%08x\n", configSASAddressHi));
48484e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: configsasAddressLo 0x%08x\n", configSASAddressLo));
48494e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: configSASAddrTableIndex %d\n", oneExpander->configSASAddrTableIndex));
48504e1bc9a0SAchim Leubner for(i=0;i<oneExpander->configSASAddrTableIndex;i++)
48514e1bc9a0SAchim Leubner {
48524e1bc9a0SAchim Leubner if (oneExpander->configSASAddressHiTable[i] == configSASAddressHi &&
48534e1bc9a0SAchim Leubner oneExpander->configSASAddressLoTable[i] == configSASAddressLo
48544e1bc9a0SAchim Leubner )
48554e1bc9a0SAchim Leubner {
48564e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: FOUND\n"));
48574e1bc9a0SAchim Leubner ret = agTRUE;
48584e1bc9a0SAchim Leubner break;
48594e1bc9a0SAchim Leubner }
48604e1bc9a0SAchim Leubner }
48614e1bc9a0SAchim Leubner /* new one; let's add it */
48624e1bc9a0SAchim Leubner if (ret == agFALSE)
48634e1bc9a0SAchim Leubner {
48644e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: adding configSAS Addr\n"));
48654e1bc9a0SAchim Leubner DM_DBG3(("dmDuplicateConfigSASAddr: configSASAddrTableIndex %d\n", oneExpander->configSASAddrTableIndex));
48664e1bc9a0SAchim Leubner oneExpander->configSASAddressHiTable[oneExpander->configSASAddrTableIndex] = configSASAddressHi;
48674e1bc9a0SAchim Leubner oneExpander->configSASAddressLoTable[oneExpander->configSASAddrTableIndex] = configSASAddressLo;
48684e1bc9a0SAchim Leubner oneExpander->configSASAddrTableIndex++;
48694e1bc9a0SAchim Leubner }
48704e1bc9a0SAchim Leubner
48714e1bc9a0SAchim Leubner return ret;
48724e1bc9a0SAchim Leubner }
48734e1bc9a0SAchim Leubner
48744e1bc9a0SAchim Leubner osGLOBAL bit16
dmFindCurrentDownStreamPhyIndex(dmRoot_t * dmRoot,dmExpander_t * oneExpander)48754e1bc9a0SAchim Leubner dmFindCurrentDownStreamPhyIndex(
48764e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
48774e1bc9a0SAchim Leubner dmExpander_t *oneExpander
48784e1bc9a0SAchim Leubner )
48794e1bc9a0SAchim Leubner {
48804e1bc9a0SAchim Leubner dmExpander_t *DownStreamExpander;
48814e1bc9a0SAchim Leubner bit16 index = 0;
48824e1bc9a0SAchim Leubner bit16 i;
48834e1bc9a0SAchim Leubner bit8 phyId = 0;
48844e1bc9a0SAchim Leubner
48854e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: start\n"));
48864e1bc9a0SAchim Leubner
48874e1bc9a0SAchim Leubner if (oneExpander == agNULL)
48884e1bc9a0SAchim Leubner {
48894e1bc9a0SAchim Leubner DM_DBG1(("dmFindCurrentDownStreamPhyIndex: wrong, oneExpander is NULL!!!\n"));
48904e1bc9a0SAchim Leubner return 0;
48914e1bc9a0SAchim Leubner }
48924e1bc9a0SAchim Leubner
48934e1bc9a0SAchim Leubner DownStreamExpander = oneExpander->dmCurrentDownStreamExpander;
48944e1bc9a0SAchim Leubner
48954e1bc9a0SAchim Leubner if (DownStreamExpander == agNULL)
48964e1bc9a0SAchim Leubner {
48974e1bc9a0SAchim Leubner DM_DBG1(("dmFindCurrentDownStreamPhyIndex: wrong, DownStreamExpander is NULL!!!\n"));
48984e1bc9a0SAchim Leubner return 0;
48994e1bc9a0SAchim Leubner }
49004e1bc9a0SAchim Leubner
49014e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
49024e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
49034e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: downstream exp addrHi 0x%08x\n", DownStreamExpander->dmDevice->SASAddressID.sasAddressHi));
49044e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: downstream exp addrLo 0x%08x\n", DownStreamExpander->dmDevice->SASAddressID.sasAddressLo));
49054e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: numOfDownStreamPhys %d\n", oneExpander->numOfDownStreamPhys));
49064e1bc9a0SAchim Leubner
49074e1bc9a0SAchim Leubner phyId = DownStreamExpander->upStreamPhys[0];
49084e1bc9a0SAchim Leubner
49094e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: phyId %d\n", phyId));
49104e1bc9a0SAchim Leubner
49114e1bc9a0SAchim Leubner for (i=0; i<oneExpander->numOfDownStreamPhys;i++)
49124e1bc9a0SAchim Leubner {
49134e1bc9a0SAchim Leubner if (oneExpander->downStreamPhys[i] == phyId)
49144e1bc9a0SAchim Leubner {
49154e1bc9a0SAchim Leubner index = i;
49164e1bc9a0SAchim Leubner break;
49174e1bc9a0SAchim Leubner }
49184e1bc9a0SAchim Leubner }
49194e1bc9a0SAchim Leubner DM_DBG3(("dmFindCurrentDownStreamPhyIndex: index %d\n", index));
49204e1bc9a0SAchim Leubner return index;
49214e1bc9a0SAchim Leubner }
49224e1bc9a0SAchim Leubner
49234e1bc9a0SAchim Leubner osGLOBAL bit32
dmFindDiscoveringExpander(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)49244e1bc9a0SAchim Leubner dmFindDiscoveringExpander(
49254e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
49264e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
49274e1bc9a0SAchim Leubner dmExpander_t *oneExpander
49284e1bc9a0SAchim Leubner )
49294e1bc9a0SAchim Leubner {
49304e1bc9a0SAchim Leubner dmList_t *ExpanderList;
49314e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
49324e1bc9a0SAchim Leubner dmIntPortContext_t *tmpOnePortContext = onePortContext;
49334e1bc9a0SAchim Leubner bit32 ret = agFALSE;
49344e1bc9a0SAchim Leubner
49354e1bc9a0SAchim Leubner
49364e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: start\n"));
49374e1bc9a0SAchim Leubner
49384e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
49394e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
49404e1bc9a0SAchim Leubner
49414e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
49424e1bc9a0SAchim Leubner {
49434e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: empty discoveringExpanderList\n"));
49444e1bc9a0SAchim Leubner return ret;
49454e1bc9a0SAchim Leubner }
49464e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
49474e1bc9a0SAchim Leubner while (ExpanderList != &(tmpOnePortContext->discovery.discoveringExpanderList))
49484e1bc9a0SAchim Leubner {
49494e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
49504e1bc9a0SAchim Leubner if (tempExpander == oneExpander)
49514e1bc9a0SAchim Leubner {
49524e1bc9a0SAchim Leubner if (tempExpander != agNULL)
49534e1bc9a0SAchim Leubner {
49544e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: match, expander id %d\n", tempExpander->id));
49554e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
49564e1bc9a0SAchim Leubner DM_DBG3(("dmFindDiscoveringExpander: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
49574e1bc9a0SAchim Leubner }
49584e1bc9a0SAchim Leubner ret = agTRUE;
49594e1bc9a0SAchim Leubner break;
49604e1bc9a0SAchim Leubner }
49614e1bc9a0SAchim Leubner
49624e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
49634e1bc9a0SAchim Leubner }
49644e1bc9a0SAchim Leubner
49654e1bc9a0SAchim Leubner
49664e1bc9a0SAchim Leubner return ret;
49674e1bc9a0SAchim Leubner }
49684e1bc9a0SAchim Leubner
49694e1bc9a0SAchim Leubner
49704e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveringExpanderRemove(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)49714e1bc9a0SAchim Leubner dmDiscoveringExpanderRemove(
49724e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
49734e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
49744e1bc9a0SAchim Leubner dmExpander_t *oneExpander
49754e1bc9a0SAchim Leubner )
49764e1bc9a0SAchim Leubner {
49774e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
49784e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
49794e1bc9a0SAchim Leubner
49804e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: start\n"));
49814e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: expander id %d\n", oneExpander->id));
49824e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: exp addrHi 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressHi));
49834e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: exp addrLo 0x%08x\n", oneExpander->dmDevice->SASAddressID.sasAddressLo));
49844e1bc9a0SAchim Leubner
49854e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: BEFORE\n"));
49864e1bc9a0SAchim Leubner dmDumpAllExp(dmRoot, onePortContext, oneExpander);
49874e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
49884e1bc9a0SAchim Leubner dmDumpAllFreeExp(dmRoot);
49894e1bc9a0SAchim Leubner
49904e1bc9a0SAchim Leubner // if is temporary till smp problem is fixed
49914e1bc9a0SAchim Leubner if (dmFindDiscoveringExpander(dmRoot, onePortContext, oneExpander) == agTRUE)
49924e1bc9a0SAchim Leubner {
49934e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: oneDeviceData %p did %d\n", oneExpander->dmDevice, oneExpander->dmDevice->id));
49944e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: oneExpander %p did %d\n", oneExpander, oneExpander->id));
49954e1bc9a0SAchim Leubner
49964e1bc9a0SAchim Leubner if (oneExpander != oneExpander->dmDevice->dmExpander)
49974e1bc9a0SAchim Leubner {
49984e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: before !!! wrong !!!\n"));
49994e1bc9a0SAchim Leubner }
50004e1bc9a0SAchim Leubner oneExpander->underDiscovering = agFALSE;
50014e1bc9a0SAchim Leubner oneExpander->discoveringPhyId = 0;
50024e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
50034e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(oneExpander->linkNode));
50044e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
50054e1bc9a0SAchim Leubner
50064e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
50074e1bc9a0SAchim Leubner {
50084e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: DISCOVERY_UP_STREAM\n"));
50094e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
50104e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(oneExpander->upNode), &(onePortContext->discovery.UpdiscoveringExpanderList));
50114e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
50124e1bc9a0SAchim Leubner onePortContext->discovery.NumOfUpExp++;
50134e1bc9a0SAchim Leubner }
50144e1bc9a0SAchim Leubner else
50154e1bc9a0SAchim Leubner {
50164e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: Status %d\n", onePortContext->discovery.status));
50174e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
50184e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(oneExpander->linkNode), &(dmAllShared->mainExpanderList));
50194e1bc9a0SAchim Leubner // DMLIST_ENQUEUE_AT_TAIL(&(oneExpander->linkNode), &(dmAllShared->freeExpanderList));
50204e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
50214e1bc9a0SAchim Leubner }
50224e1bc9a0SAchim Leubner // error checking
50234e1bc9a0SAchim Leubner if (oneExpander != oneExpander->dmDevice->dmExpander)
50244e1bc9a0SAchim Leubner {
50254e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: after !!! wrong !!!\n"));
50264e1bc9a0SAchim Leubner }
50274e1bc9a0SAchim Leubner
50284e1bc9a0SAchim Leubner } //end temp if
50294e1bc9a0SAchim Leubner else
50304e1bc9a0SAchim Leubner {
50314e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveringExpanderRemove: !!! problem !!!\n"));
50324e1bc9a0SAchim Leubner }
50334e1bc9a0SAchim Leubner
50344e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveringExpanderRemove: AFTER\n"));
50354e1bc9a0SAchim Leubner
50364e1bc9a0SAchim Leubner dmDumpAllExp(dmRoot, onePortContext, oneExpander);
50374e1bc9a0SAchim Leubner dmDumpAllUpExp(dmRoot, onePortContext, oneExpander);
50384e1bc9a0SAchim Leubner dmDumpAllFreeExp(dmRoot);
50394e1bc9a0SAchim Leubner
50404e1bc9a0SAchim Leubner return;
50414e1bc9a0SAchim Leubner }
50424e1bc9a0SAchim Leubner
50434e1bc9a0SAchim Leubner /*
50444e1bc9a0SAchim Leubner returns an expander with sasAddrLo, sasAddrHi from dmAllShared->mainExpanderList
50454e1bc9a0SAchim Leubner */
50464e1bc9a0SAchim Leubner osGLOBAL dmExpander_t *
dmExpMainListFind(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 sasAddrHi,bit32 sasAddrLo)50474e1bc9a0SAchim Leubner dmExpMainListFind(
50484e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
50494e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
50504e1bc9a0SAchim Leubner bit32 sasAddrHi,
50514e1bc9a0SAchim Leubner bit32 sasAddrLo
50524e1bc9a0SAchim Leubner )
50534e1bc9a0SAchim Leubner {
50544e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
50554e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
50564e1bc9a0SAchim Leubner dmList_t *ExpanderList;
50574e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
50584e1bc9a0SAchim Leubner
50594e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: start\n"));
50604e1bc9a0SAchim Leubner
50614e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
50624e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->mainExpanderList)))
50634e1bc9a0SAchim Leubner {
50644e1bc9a0SAchim Leubner DM_DBG1(("dmExpMainListFind: empty mainExpanderList\n"));
50654e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
50664e1bc9a0SAchim Leubner return agNULL;
50674e1bc9a0SAchim Leubner }
50684e1bc9a0SAchim Leubner else
50694e1bc9a0SAchim Leubner {
50704e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
50714e1bc9a0SAchim Leubner }
50724e1bc9a0SAchim Leubner ExpanderList = dmAllShared->mainExpanderList.flink;
50734e1bc9a0SAchim Leubner while (ExpanderList != &(dmAllShared->mainExpanderList))
50744e1bc9a0SAchim Leubner {
50754e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
50764e1bc9a0SAchim Leubner if (tempExpander == agNULL)
50774e1bc9a0SAchim Leubner {
50784e1bc9a0SAchim Leubner DM_DBG1(("dmExpMainListFind: tempExpander is NULL!!!\n"));
50794e1bc9a0SAchim Leubner return agNULL;
50804e1bc9a0SAchim Leubner }
50814e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: expander id %d\n", tempExpander->id));
50824e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
50834e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
50844e1bc9a0SAchim Leubner if ((tempExpander->dmDevice->SASAddressID.sasAddressHi == sasAddrHi) &&
50854e1bc9a0SAchim Leubner (tempExpander->dmDevice->SASAddressID.sasAddressLo == sasAddrLo) &&
50864e1bc9a0SAchim Leubner (tempExpander->dmDevice->dmPortContext == onePortContext)
50874e1bc9a0SAchim Leubner )
50884e1bc9a0SAchim Leubner {
50894e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: found expander id %d\n", tempExpander->id));
50904e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: found exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
50914e1bc9a0SAchim Leubner DM_DBG3(("dmExpMainListFind: found exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
50924e1bc9a0SAchim Leubner return tempExpander;
50934e1bc9a0SAchim Leubner }
50944e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
50954e1bc9a0SAchim Leubner }
50964e1bc9a0SAchim Leubner return agNULL;
50974e1bc9a0SAchim Leubner
50984e1bc9a0SAchim Leubner }
50994e1bc9a0SAchim Leubner
51004e1bc9a0SAchim Leubner /*
51014e1bc9a0SAchim Leubner returns an expander with sasAddrLo, sasAddrHi from discoveringExpanderList
51024e1bc9a0SAchim Leubner */
51034e1bc9a0SAchim Leubner osGLOBAL dmExpander_t *
dmExpFind(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 sasAddrHi,bit32 sasAddrLo)51044e1bc9a0SAchim Leubner dmExpFind(
51054e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
51064e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
51074e1bc9a0SAchim Leubner bit32 sasAddrHi,
51084e1bc9a0SAchim Leubner bit32 sasAddrLo
51094e1bc9a0SAchim Leubner )
51104e1bc9a0SAchim Leubner {
51114e1bc9a0SAchim Leubner dmList_t *ExpanderList;
51124e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
51134e1bc9a0SAchim Leubner dmIntPortContext_t *tmpOnePortContext = onePortContext;
51144e1bc9a0SAchim Leubner DM_DBG3(("dmExpFind: start\n"));
51154e1bc9a0SAchim Leubner
51164e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
51174e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
51184e1bc9a0SAchim Leubner {
51194e1bc9a0SAchim Leubner DM_DBG3(("dmExpFind tdsaDumpAllExp: empty discoveringExpanderList\n"));
51204e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
51214e1bc9a0SAchim Leubner return agNULL;
51224e1bc9a0SAchim Leubner }
51234e1bc9a0SAchim Leubner else
51244e1bc9a0SAchim Leubner {
51254e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
51264e1bc9a0SAchim Leubner }
51274e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
51284e1bc9a0SAchim Leubner while (ExpanderList != &(tmpOnePortContext->discovery.discoveringExpanderList))
51294e1bc9a0SAchim Leubner {
51304e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
51314e1bc9a0SAchim Leubner if (tempExpander == agNULL)
51324e1bc9a0SAchim Leubner {
51334e1bc9a0SAchim Leubner DM_DBG1(("dmExpFind: tempExpander is NULL!!!\n"));
51344e1bc9a0SAchim Leubner return agNULL;
51354e1bc9a0SAchim Leubner }
51364e1bc9a0SAchim Leubner DM_DBG3(("dmExpFind: expander id %d\n", tempExpander->id));
51374e1bc9a0SAchim Leubner DM_DBG3(("dmExpFind: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
51384e1bc9a0SAchim Leubner DM_DBG3(("dmExpFind: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
51394e1bc9a0SAchim Leubner if ((tempExpander->dmDevice->SASAddressID.sasAddressHi == sasAddrHi) &&
51404e1bc9a0SAchim Leubner (tempExpander->dmDevice->SASAddressID.sasAddressLo == sasAddrLo) &&
51414e1bc9a0SAchim Leubner (tempExpander->dmDevice->dmPortContext == onePortContext)
51424e1bc9a0SAchim Leubner )
51434e1bc9a0SAchim Leubner {
51444e1bc9a0SAchim Leubner DM_DBG3(("dmExpFind: found\n"));
51454e1bc9a0SAchim Leubner return tempExpander;
51464e1bc9a0SAchim Leubner }
51474e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
51484e1bc9a0SAchim Leubner }
51494e1bc9a0SAchim Leubner return agNULL;
51504e1bc9a0SAchim Leubner }
51514e1bc9a0SAchim Leubner
51524e1bc9a0SAchim Leubner osGLOBAL bit32
dmDiscoverCheck(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)51534e1bc9a0SAchim Leubner dmDiscoverCheck(
51544e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
51554e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
51564e1bc9a0SAchim Leubner )
51574e1bc9a0SAchim Leubner {
51584e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverCheck: start\n"));
51594e1bc9a0SAchim Leubner
51604e1bc9a0SAchim Leubner if (onePortContext == agNULL)
51614e1bc9a0SAchim Leubner {
51624e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverCheck: onePortContext is NULL!!!\n"));
51634e1bc9a0SAchim Leubner return agTRUE;
51644e1bc9a0SAchim Leubner }
51654e1bc9a0SAchim Leubner if (onePortContext->valid == agFALSE)
51664e1bc9a0SAchim Leubner {
51674e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverCheck: invalid port!!!\n"));
51684e1bc9a0SAchim Leubner return agTRUE;
51694e1bc9a0SAchim Leubner }
51704e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED ||
51714e1bc9a0SAchim Leubner onePortContext->discovery.status == DISCOVERY_SAS_DONE
51724e1bc9a0SAchim Leubner )
51734e1bc9a0SAchim Leubner {
51744e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverCheck: aborted discovery!!!\n"));
51754e1bc9a0SAchim Leubner tddmDiscoverCB(
51764e1bc9a0SAchim Leubner dmRoot,
51774e1bc9a0SAchim Leubner onePortContext->dmPortContext,
51784e1bc9a0SAchim Leubner dmDiscAborted
51794e1bc9a0SAchim Leubner );
51804e1bc9a0SAchim Leubner return agTRUE;
51814e1bc9a0SAchim Leubner }
51824e1bc9a0SAchim Leubner
51834e1bc9a0SAchim Leubner return agFALSE;
51844e1bc9a0SAchim Leubner }
51854e1bc9a0SAchim Leubner
51864e1bc9a0SAchim Leubner /* ??? needs to handle pending SMPs
51874e1bc9a0SAchim Leubner move from dmAllShared->discoveringExpanderList to dmAllShared->mainExpanderList
51884e1bc9a0SAchim Leubner */
51894e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoverAbort(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)51904e1bc9a0SAchim Leubner dmDiscoverAbort(
51914e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
51924e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
51934e1bc9a0SAchim Leubner )
51944e1bc9a0SAchim Leubner {
51954e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverAbort: start\n"));
51964e1bc9a0SAchim Leubner
51974e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_COMPLETED ||
51984e1bc9a0SAchim Leubner onePortContext->discovery.status == DISCOVERY_SAS_DONE)
51994e1bc9a0SAchim Leubner {
52004e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverAbort: not allowed case!!! onePortContext->DiscoveryState 0x%x onePortContext->discovery.status 0x%x\n",
52014e1bc9a0SAchim Leubner onePortContext->DiscoveryState, onePortContext->discovery.status));
52024e1bc9a0SAchim Leubner return;
52034e1bc9a0SAchim Leubner }
52044e1bc9a0SAchim Leubner
52054e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_COMPLETED;
52064e1bc9a0SAchim Leubner onePortContext->discovery.status = DISCOVERY_SAS_DONE;
52074e1bc9a0SAchim Leubner
52084e1bc9a0SAchim Leubner /* move from dmAllShared->discoveringExpanderList to dmAllShared->mainExpanderList */
52094e1bc9a0SAchim Leubner dmCleanAllExp(dmRoot, onePortContext);
52104e1bc9a0SAchim Leubner
52114e1bc9a0SAchim Leubner
52124e1bc9a0SAchim Leubner return;
52134e1bc9a0SAchim Leubner
52144e1bc9a0SAchim Leubner
52154e1bc9a0SAchim Leubner }
52164e1bc9a0SAchim Leubner
52174e1bc9a0SAchim Leubner /* move from dmAllShared->discoveringExpanderList to dmAllShared->mainExpanderList */
52184e1bc9a0SAchim Leubner osGLOBAL void
dmCleanAllExp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)52194e1bc9a0SAchim Leubner dmCleanAllExp(
52204e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
52214e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
52224e1bc9a0SAchim Leubner )
52234e1bc9a0SAchim Leubner {
52244e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
52254e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
52264e1bc9a0SAchim Leubner dmList_t *ExpanderList;
52274e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
52284e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
52294e1bc9a0SAchim Leubner dmIntPortContext_t *tmpOnePortContext = onePortContext;
52304e1bc9a0SAchim Leubner
52314e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: start\n"));
52324e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: pid %d\n", onePortContext->id));
52334e1bc9a0SAchim Leubner
52344e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: before all clean up\n"));
52354e1bc9a0SAchim Leubner dmDumpAllFreeExp(dmRoot);
52364e1bc9a0SAchim Leubner
52374e1bc9a0SAchim Leubner /* clean up UpdiscoveringExpanderList*/
52384e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: clean discoveringExpanderList\n"));
52394e1bc9a0SAchim Leubner if (!DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
52404e1bc9a0SAchim Leubner {
52414e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
52424e1bc9a0SAchim Leubner while (ExpanderList != &(tmpOnePortContext->discovery.discoveringExpanderList))
52434e1bc9a0SAchim Leubner {
52444e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
52454e1bc9a0SAchim Leubner if (tempExpander == agNULL)
52464e1bc9a0SAchim Leubner {
52474e1bc9a0SAchim Leubner DM_DBG1(("dmCleanAllExp: tempExpander is NULL!!!\n"));
52484e1bc9a0SAchim Leubner return;
52494e1bc9a0SAchim Leubner }
52504e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
52514e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
52524e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: exp id %d\n", tempExpander->id));
52534e1bc9a0SAchim Leubner
52544e1bc9a0SAchim Leubner oneExpander = dmExpMainListFind(dmRoot,
52554e1bc9a0SAchim Leubner tmpOnePortContext,
52564e1bc9a0SAchim Leubner tempExpander->dmDevice->SASAddressID.sasAddressHi,
52574e1bc9a0SAchim Leubner tempExpander->dmDevice->SASAddressID.sasAddressLo);
52584e1bc9a0SAchim Leubner if (oneExpander == agNULL)
52594e1bc9a0SAchim Leubner {
52604e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: moving\n"));
52614e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: moving, exp id %d\n", tempExpander->id));
52624e1bc9a0SAchim Leubner /* putting back to the free pool */
52634e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
52644e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(tempExpander->linkNode));
52654e1bc9a0SAchim Leubner // DMLIST_ENQUEUE_AT_TAIL(&(tempExpander->linkNode), &(dmAllShared->freeExpanderList));
52664e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(tempExpander->linkNode), &(dmAllShared->mainExpanderList));
52674e1bc9a0SAchim Leubner
52684e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
52694e1bc9a0SAchim Leubner {
52704e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
52714e1bc9a0SAchim Leubner break;
52724e1bc9a0SAchim Leubner }
52734e1bc9a0SAchim Leubner else
52744e1bc9a0SAchim Leubner {
52754e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
52764e1bc9a0SAchim Leubner }
52774e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
52784e1bc9a0SAchim Leubner }
52794e1bc9a0SAchim Leubner else
52804e1bc9a0SAchim Leubner {
52814e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: in mainExpanderList; skippig\n"));
52824e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
52834e1bc9a0SAchim Leubner }
52844e1bc9a0SAchim Leubner }
52854e1bc9a0SAchim Leubner }
52864e1bc9a0SAchim Leubner else
52874e1bc9a0SAchim Leubner {
52884e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: empty discoveringExpanderList\n"));
52894e1bc9a0SAchim Leubner }
52904e1bc9a0SAchim Leubner
52914e1bc9a0SAchim Leubner /* reset discoveringExpanderList */
52924e1bc9a0SAchim Leubner DMLIST_INIT_HDR(&(tmpOnePortContext->discovery.discoveringExpanderList));
52934e1bc9a0SAchim Leubner
52944e1bc9a0SAchim Leubner /* clean up UpdiscoveringExpanderList*/
52954e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: clean UpdiscoveringExpanderList\n"));
52964e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.UpdiscoveringExpanderList)))
52974e1bc9a0SAchim Leubner {
52984e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: empty UpdiscoveringExpanderList\n"));
52994e1bc9a0SAchim Leubner return;
53004e1bc9a0SAchim Leubner }
53014e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.UpdiscoveringExpanderList.flink;
53024e1bc9a0SAchim Leubner while (ExpanderList != &(tmpOnePortContext->discovery.UpdiscoveringExpanderList))
53034e1bc9a0SAchim Leubner {
53044e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, upNode, ExpanderList);
53054e1bc9a0SAchim Leubner if (tempExpander == agNULL)
53064e1bc9a0SAchim Leubner {
53074e1bc9a0SAchim Leubner DM_DBG1(("dmCleanAllExp: tempExpander is NULL!!!\n"));
53084e1bc9a0SAchim Leubner return;
53094e1bc9a0SAchim Leubner }
53104e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
53114e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
53124e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: exp id %d\n", tempExpander->id));
53134e1bc9a0SAchim Leubner oneExpander = dmExpMainListFind(dmRoot,
53144e1bc9a0SAchim Leubner tmpOnePortContext,
53154e1bc9a0SAchim Leubner tempExpander->dmDevice->SASAddressID.sasAddressHi,
53164e1bc9a0SAchim Leubner tempExpander->dmDevice->SASAddressID.sasAddressLo);
53174e1bc9a0SAchim Leubner if (oneExpander == agNULL)
53184e1bc9a0SAchim Leubner {
53194e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: moving\n"));
53204e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: moving exp id %d\n", tempExpander->id));
53214e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
53224e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(tempExpander->upNode));
53234e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(tempExpander->linkNode), &(dmAllShared->mainExpanderList));
53244e1bc9a0SAchim Leubner
53254e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(tmpOnePortContext->discovery.UpdiscoveringExpanderList)))
53264e1bc9a0SAchim Leubner {
53274e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
53284e1bc9a0SAchim Leubner break;
53294e1bc9a0SAchim Leubner }
53304e1bc9a0SAchim Leubner else
53314e1bc9a0SAchim Leubner {
53324e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
53334e1bc9a0SAchim Leubner }
53344e1bc9a0SAchim Leubner ExpanderList = tmpOnePortContext->discovery.UpdiscoveringExpanderList.flink;
53354e1bc9a0SAchim Leubner }
53364e1bc9a0SAchim Leubner else
53374e1bc9a0SAchim Leubner {
53384e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: in mainExpanderList; skippig\n"));
53394e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
53404e1bc9a0SAchim Leubner }
53414e1bc9a0SAchim Leubner }
53424e1bc9a0SAchim Leubner
53434e1bc9a0SAchim Leubner /* reset UpdiscoveringExpanderList */
53444e1bc9a0SAchim Leubner DMLIST_INIT_HDR(&(tmpOnePortContext->discovery.UpdiscoveringExpanderList));
53454e1bc9a0SAchim Leubner
53464e1bc9a0SAchim Leubner DM_DBG3(("dmCleanAllExp: after all clean up\n"));
53474e1bc9a0SAchim Leubner dmDumpAllFreeExp(dmRoot);
53484e1bc9a0SAchim Leubner
53494e1bc9a0SAchim Leubner return;
53504e1bc9a0SAchim Leubner }
53514e1bc9a0SAchim Leubner
53524e1bc9a0SAchim Leubner osGLOBAL void
dmInternalRemovals(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)53534e1bc9a0SAchim Leubner dmInternalRemovals(
53544e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
53554e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
53564e1bc9a0SAchim Leubner )
53574e1bc9a0SAchim Leubner {
53584e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
53594e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
53604e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
53614e1bc9a0SAchim Leubner dmList_t *DeviceListList;
53624e1bc9a0SAchim Leubner
53634e1bc9a0SAchim Leubner
53644e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: start\n"));
53654e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
53664e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
53674e1bc9a0SAchim Leubner {
53684e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
53694e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: empty device list\n"));
53704e1bc9a0SAchim Leubner return;
53714e1bc9a0SAchim Leubner }
53724e1bc9a0SAchim Leubner else
53734e1bc9a0SAchim Leubner {
53744e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
53754e1bc9a0SAchim Leubner }
53764e1bc9a0SAchim Leubner
53774e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
53784e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
53794e1bc9a0SAchim Leubner {
53804e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
53814e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
53824e1bc9a0SAchim Leubner {
53834e1bc9a0SAchim Leubner DM_DBG1(("dmInternalRemovals: oneDeviceData is NULL!!!\n"));
53844e1bc9a0SAchim Leubner return;
53854e1bc9a0SAchim Leubner }
53864e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: loop did %d\n", oneDeviceData->id));
53874e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
53884e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
53894e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: valid %d\n", oneDeviceData->valid));
53904e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: valid2 %d\n", oneDeviceData->valid2));
53914e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: directlyAttached %d\n", oneDeviceData->directlyAttached));
53924e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
53934e1bc9a0SAchim Leubner {
53944e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: right portcontext pid %d\n", onePortContext->id));
53954e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_INCREMENTAL_START)
53964e1bc9a0SAchim Leubner {
53974e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: incremental discovery\n"));
53984e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
53994e1bc9a0SAchim Leubner }
54004e1bc9a0SAchim Leubner else
54014e1bc9a0SAchim Leubner {
54024e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: full discovery\n"));
54034e1bc9a0SAchim Leubner oneDeviceData->valid = agFALSE;
54044e1bc9a0SAchim Leubner }
54054e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
54064e1bc9a0SAchim Leubner }
54074e1bc9a0SAchim Leubner else
54084e1bc9a0SAchim Leubner {
54094e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext != agNULL)
54104e1bc9a0SAchim Leubner {
54114e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: different portcontext; oneDeviceData->dmPortContext pid %d oneportcontext pid %d\n", oneDeviceData->dmPortContext->id, onePortContext->id));
54124e1bc9a0SAchim Leubner }
54134e1bc9a0SAchim Leubner else
54144e1bc9a0SAchim Leubner {
54154e1bc9a0SAchim Leubner DM_DBG3(("dmInternalRemovals: different portcontext; oneDeviceData->dmPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
54164e1bc9a0SAchim Leubner }
54174e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
54184e1bc9a0SAchim Leubner }
54194e1bc9a0SAchim Leubner }
54204e1bc9a0SAchim Leubner
54214e1bc9a0SAchim Leubner
54224e1bc9a0SAchim Leubner return;
54234e1bc9a0SAchim Leubner }
54244e1bc9a0SAchim Leubner
54254e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryResetProcessed(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)54264e1bc9a0SAchim Leubner dmDiscoveryResetProcessed(
54274e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
54284e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
54294e1bc9a0SAchim Leubner )
54304e1bc9a0SAchim Leubner {
54314e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
54324e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
54334e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
54344e1bc9a0SAchim Leubner dmList_t *DeviceListList;
54354e1bc9a0SAchim Leubner
54364e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryResetProcessed: start\n"));
54374e1bc9a0SAchim Leubner
54384e1bc9a0SAchim Leubner /* reinitialize the device data belonging to this portcontext */
54394e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
54404e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
54414e1bc9a0SAchim Leubner {
54424e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
54434e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
54444e1bc9a0SAchim Leubner {
54454e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryResetProcessed: oneDeviceData is NULL!!!\n"));
54464e1bc9a0SAchim Leubner return;
54474e1bc9a0SAchim Leubner }
54484e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryResetProcessed: loop did %d\n", oneDeviceData->id));
54494e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext == onePortContext)
54504e1bc9a0SAchim Leubner {
54514e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryResetProcessed: resetting procssed flag\n"));
54524e1bc9a0SAchim Leubner oneDeviceData->processed = agFALSE;
54534e1bc9a0SAchim Leubner }
54544e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
54554e1bc9a0SAchim Leubner }
54564e1bc9a0SAchim Leubner
54574e1bc9a0SAchim Leubner return;
54584e1bc9a0SAchim Leubner }
54594e1bc9a0SAchim Leubner
54604e1bc9a0SAchim Leubner /*
54614e1bc9a0SAchim Leubner calls
54624e1bc9a0SAchim Leubner osGLOBAL void
54634e1bc9a0SAchim Leubner tddmDiscoverCB(
54644e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
54654e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
54664e1bc9a0SAchim Leubner bit32 eventStatus
54674e1bc9a0SAchim Leubner )
54684e1bc9a0SAchim Leubner
54694e1bc9a0SAchim Leubner */
54704e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoverDone(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 flag)54714e1bc9a0SAchim Leubner dmDiscoverDone(
54724e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
54734e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
54744e1bc9a0SAchim Leubner bit32 flag
54754e1bc9a0SAchim Leubner )
54764e1bc9a0SAchim Leubner {
54774e1bc9a0SAchim Leubner
54784e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverDone: start\n"));
54794e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverDone: pid %d\n", onePortContext->id));
54804e1bc9a0SAchim Leubner
54814e1bc9a0SAchim Leubner /* Set discovery status */
54824e1bc9a0SAchim Leubner onePortContext->discovery.status = DISCOVERY_SAS_DONE;
54834e1bc9a0SAchim Leubner
54844e1bc9a0SAchim Leubner
54854e1bc9a0SAchim Leubner /* clean up expanders data strucures; move to free exp when device is cleaned */
54864e1bc9a0SAchim Leubner dmCleanAllExp(dmRoot, onePortContext);
54874e1bc9a0SAchim Leubner
54884e1bc9a0SAchim Leubner dmDumpAllMainExp(dmRoot, onePortContext);
54894e1bc9a0SAchim Leubner
54904e1bc9a0SAchim Leubner dmDiscoveryResetProcessed(dmRoot, onePortContext);
54914e1bc9a0SAchim Leubner
54924e1bc9a0SAchim Leubner dmDiscoveryDumpMCN(dmRoot, onePortContext);
54934e1bc9a0SAchim Leubner
54944e1bc9a0SAchim Leubner if (onePortContext->discovery.SeenBC == agTRUE)
54954e1bc9a0SAchim Leubner {
54964e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverDone: broadcast change; discover again\n"));
54974e1bc9a0SAchim Leubner dmDiscoveryResetMCN(dmRoot, onePortContext);
54984e1bc9a0SAchim Leubner
54994e1bc9a0SAchim Leubner dmInternalRemovals(dmRoot, onePortContext);
55004e1bc9a0SAchim Leubner
55014e1bc9a0SAchim Leubner /* processed broadcast change */
55024e1bc9a0SAchim Leubner onePortContext->discovery.SeenBC = agFALSE;
55034e1bc9a0SAchim Leubner if (onePortContext->discovery.ResetTriggerred == agTRUE)
55044e1bc9a0SAchim Leubner {
55054e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverDone: dmBCTimer\n"));
55064e1bc9a0SAchim Leubner dmBCTimer(dmRoot, onePortContext);
55074e1bc9a0SAchim Leubner }
55084e1bc9a0SAchim Leubner else
55094e1bc9a0SAchim Leubner {
55104e1bc9a0SAchim Leubner
55114e1bc9a0SAchim Leubner dmIncrementalDiscover(dmRoot, onePortContext, agTRUE);
55124e1bc9a0SAchim Leubner }
55134e1bc9a0SAchim Leubner }
55144e1bc9a0SAchim Leubner else
55154e1bc9a0SAchim Leubner {
55164e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_COMPLETED;
55174e1bc9a0SAchim Leubner
55184e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_FULL_START)
55194e1bc9a0SAchim Leubner {
55204e1bc9a0SAchim Leubner if (flag == DM_RC_SUCCESS)
55214e1bc9a0SAchim Leubner {
55224e1bc9a0SAchim Leubner
55234e1bc9a0SAchim Leubner dmResetReported(dmRoot,
55244e1bc9a0SAchim Leubner onePortContext
55254e1bc9a0SAchim Leubner );
55264e1bc9a0SAchim Leubner
55274e1bc9a0SAchim Leubner dmDiscoveryReportMCN(dmRoot,
55284e1bc9a0SAchim Leubner onePortContext
55294e1bc9a0SAchim Leubner );
55304e1bc9a0SAchim Leubner
55314e1bc9a0SAchim Leubner
55324e1bc9a0SAchim Leubner /* call tddmDiscoverCB() */
55334e1bc9a0SAchim Leubner tddmDiscoverCB(
55344e1bc9a0SAchim Leubner dmRoot,
55354e1bc9a0SAchim Leubner onePortContext->dmPortContext,
55364e1bc9a0SAchim Leubner dmDiscCompleted
55374e1bc9a0SAchim Leubner );
55384e1bc9a0SAchim Leubner }
55394e1bc9a0SAchim Leubner else if (flag != DM_RC_SUCCESS || onePortContext->discovery.DeferredError == agTRUE)
55404e1bc9a0SAchim Leubner {
55414e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_COMPLETED_WITH_FAILURE;
55424e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverDone: Error; clean up!!!\n"));
55434e1bc9a0SAchim Leubner
55444e1bc9a0SAchim Leubner dmDiscoveryInvalidateDevices(dmRoot,
55454e1bc9a0SAchim Leubner onePortContext
55464e1bc9a0SAchim Leubner );
55474e1bc9a0SAchim Leubner
55484e1bc9a0SAchim Leubner tddmDiscoverCB(
55494e1bc9a0SAchim Leubner dmRoot,
55504e1bc9a0SAchim Leubner onePortContext->dmPortContext,
55514e1bc9a0SAchim Leubner dmDiscFailed
55524e1bc9a0SAchim Leubner );
55534e1bc9a0SAchim Leubner }
55544e1bc9a0SAchim Leubner }
55554e1bc9a0SAchim Leubner else
55564e1bc9a0SAchim Leubner {
55574e1bc9a0SAchim Leubner if (flag == DM_RC_SUCCESS)
55584e1bc9a0SAchim Leubner {
55594e1bc9a0SAchim Leubner dmReportChanges(dmRoot,
55604e1bc9a0SAchim Leubner onePortContext
55614e1bc9a0SAchim Leubner );
55624e1bc9a0SAchim Leubner dmDiscoveryReportMCN(dmRoot,
55634e1bc9a0SAchim Leubner onePortContext
55644e1bc9a0SAchim Leubner );
55654e1bc9a0SAchim Leubner tddmDiscoverCB(
55664e1bc9a0SAchim Leubner dmRoot,
55674e1bc9a0SAchim Leubner onePortContext->dmPortContext,
55684e1bc9a0SAchim Leubner dmDiscCompleted
55694e1bc9a0SAchim Leubner );
55704e1bc9a0SAchim Leubner }
55714e1bc9a0SAchim Leubner else if (flag != DM_RC_SUCCESS || onePortContext->discovery.DeferredError == agTRUE)
55724e1bc9a0SAchim Leubner {
55734e1bc9a0SAchim Leubner onePortContext->DiscoveryState = DM_DSTATE_COMPLETED_WITH_FAILURE;
55744e1bc9a0SAchim Leubner dmDiscoveryInvalidateDevices(dmRoot,
55754e1bc9a0SAchim Leubner onePortContext
55764e1bc9a0SAchim Leubner );
55774e1bc9a0SAchim Leubner
55784e1bc9a0SAchim Leubner tddmDiscoverCB(
55794e1bc9a0SAchim Leubner dmRoot,
55804e1bc9a0SAchim Leubner onePortContext->dmPortContext,
55814e1bc9a0SAchim Leubner dmDiscFailed
55824e1bc9a0SAchim Leubner );
55834e1bc9a0SAchim Leubner }
55844e1bc9a0SAchim Leubner }
55854e1bc9a0SAchim Leubner }
55864e1bc9a0SAchim Leubner return;
55874e1bc9a0SAchim Leubner }
55884e1bc9a0SAchim Leubner
55894e1bc9a0SAchim Leubner /* called by dmDiscoveryErrorRemovals() or dmReportRemovals() on discovery failure */
55904e1bc9a0SAchim Leubner osGLOBAL void
dmSubReportRemovals(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData,bit32 flag)55914e1bc9a0SAchim Leubner dmSubReportRemovals(
55924e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
55934e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
55944e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData,
55954e1bc9a0SAchim Leubner bit32 flag
55964e1bc9a0SAchim Leubner )
55974e1bc9a0SAchim Leubner {
55984e1bc9a0SAchim Leubner dmDeviceData_t *oneAttachedExpDeviceData = agNULL;
55994e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportRemovals: start\n"));
56004e1bc9a0SAchim Leubner
56014e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportRemovals: flag 0x%x\n", flag));
56024e1bc9a0SAchim Leubner if (flag == dmDeviceRemoval)
56034e1bc9a0SAchim Leubner {
56044e1bc9a0SAchim Leubner oneDeviceData->registered = agFALSE;
56054e1bc9a0SAchim Leubner }
56064e1bc9a0SAchim Leubner
56074e1bc9a0SAchim Leubner if (oneDeviceData->ExpDevice != agNULL)
56084e1bc9a0SAchim Leubner {
56094e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportRemovals: attached expander case\n"));
56104e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
56114e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, &oneAttachedExpDeviceData->dmDeviceInfo, flag);
56124e1bc9a0SAchim Leubner }
56134e1bc9a0SAchim Leubner else
56144e1bc9a0SAchim Leubner {
56154e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportRemovals: NO attached expander case\n"));
56164e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, agNULL, flag);
56174e1bc9a0SAchim Leubner }
56184e1bc9a0SAchim Leubner
56194e1bc9a0SAchim Leubner
56205aa0576bSEd Maste /* this function is called at the end of discovery; reinitializes oneDeviceData->reported */
56214e1bc9a0SAchim Leubner oneDeviceData->reported = agFALSE;
56224e1bc9a0SAchim Leubner return;
56234e1bc9a0SAchim Leubner }
56244e1bc9a0SAchim Leubner
56254e1bc9a0SAchim Leubner
56264e1bc9a0SAchim Leubner /* called by dmReportChanges() on discovery success */
56274e1bc9a0SAchim Leubner osGLOBAL void
dmSubReportChanges(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData,bit32 flag)56284e1bc9a0SAchim Leubner dmSubReportChanges(
56294e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
56304e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
56314e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData,
56324e1bc9a0SAchim Leubner bit32 flag
56334e1bc9a0SAchim Leubner )
56344e1bc9a0SAchim Leubner {
56354e1bc9a0SAchim Leubner dmDeviceData_t *oneAttachedExpDeviceData = agNULL;
56364e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportChanges: start\n"));
56374e1bc9a0SAchim Leubner
56384e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportChanges: flag 0x%x\n", flag));
56394e1bc9a0SAchim Leubner if (flag == dmDeviceRemoval)
56404e1bc9a0SAchim Leubner {
56414e1bc9a0SAchim Leubner oneDeviceData->registered = agFALSE;
56424e1bc9a0SAchim Leubner }
56434e1bc9a0SAchim Leubner if (oneDeviceData->reported == agFALSE)
56444e1bc9a0SAchim Leubner {
56454e1bc9a0SAchim Leubner if (oneDeviceData->ExpDevice != agNULL)
56464e1bc9a0SAchim Leubner {
56474e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportChanges: attached expander case\n"));
56484e1bc9a0SAchim Leubner oneAttachedExpDeviceData = oneDeviceData->ExpDevice;
56494e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, &oneAttachedExpDeviceData->dmDeviceInfo, flag);
56504e1bc9a0SAchim Leubner }
56514e1bc9a0SAchim Leubner else
56524e1bc9a0SAchim Leubner {
56534e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportChanges: NO attached expander case\n"));
56544e1bc9a0SAchim Leubner tddmReportDevice(dmRoot, onePortContext->dmPortContext, &oneDeviceData->dmDeviceInfo, agNULL, flag);
56554e1bc9a0SAchim Leubner }
56564e1bc9a0SAchim Leubner }
56574e1bc9a0SAchim Leubner else
56584e1bc9a0SAchim Leubner {
56594e1bc9a0SAchim Leubner DM_DBG3(("dmSubReportChanges: skip; been reported\n"));
56604e1bc9a0SAchim Leubner }
56614e1bc9a0SAchim Leubner
56624e1bc9a0SAchim Leubner
56635aa0576bSEd Maste /* this function is called at the end of discovery; reinitializes oneDeviceData->reported */
56644e1bc9a0SAchim Leubner oneDeviceData->reported = agFALSE;
56654e1bc9a0SAchim Leubner return;
56664e1bc9a0SAchim Leubner }
56674e1bc9a0SAchim Leubner
56684e1bc9a0SAchim Leubner /*
56694e1bc9a0SAchim Leubner should add or remove be reported per device???
56704e1bc9a0SAchim Leubner */
56714e1bc9a0SAchim Leubner osGLOBAL void
dmReportChanges(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)56724e1bc9a0SAchim Leubner dmReportChanges(
56734e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
56744e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
56754e1bc9a0SAchim Leubner )
56764e1bc9a0SAchim Leubner {
56774e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
56784e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
56794e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
56804e1bc9a0SAchim Leubner dmList_t *DeviceListList;
56814e1bc9a0SAchim Leubner bit32 added = agFALSE, removed = agFALSE;
56824e1bc9a0SAchim Leubner // dmDeviceData_t *oneAttachedExpDeviceData = agNULL;
56834e1bc9a0SAchim Leubner
56844e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: start\n"));
56854e1bc9a0SAchim Leubner
56864e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
56874e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
56884e1bc9a0SAchim Leubner {
56894e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
56904e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: empty device list\n"));
56914e1bc9a0SAchim Leubner return;
56924e1bc9a0SAchim Leubner }
56934e1bc9a0SAchim Leubner else
56944e1bc9a0SAchim Leubner {
56954e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
56964e1bc9a0SAchim Leubner }
56974e1bc9a0SAchim Leubner
56984e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
56994e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
57004e1bc9a0SAchim Leubner {
57014e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
57024e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
57034e1bc9a0SAchim Leubner {
57044e1bc9a0SAchim Leubner DM_DBG1(("dmReportChanges: oneDeviceData is NULL!!!\n"));
57054e1bc9a0SAchim Leubner return;
57064e1bc9a0SAchim Leubner }
57074e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
57084e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
57094e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
57104e1bc9a0SAchim Leubner {
57114e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: right portcontext\n"));
57124e1bc9a0SAchim Leubner if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi &&
57134e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo
57144e1bc9a0SAchim Leubner )
57154e1bc9a0SAchim Leubner {
57164e1bc9a0SAchim Leubner DM_DBG1(("dmReportChanges: keep, not reporting did 0x%x\n", oneDeviceData->id));
57174e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
57184e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
57194e1bc9a0SAchim Leubner }
57204e1bc9a0SAchim Leubner else if ( (oneDeviceData->valid == agTRUE) && (oneDeviceData->valid2 == agTRUE) )
57214e1bc9a0SAchim Leubner {
57224e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: same\n"));
57234e1bc9a0SAchim Leubner /* reset valid bit */
57244e1bc9a0SAchim Leubner oneDeviceData->valid = oneDeviceData->valid2;
57254e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
57264e1bc9a0SAchim Leubner dmSubReportChanges(dmRoot, onePortContext, oneDeviceData, dmDeviceNoChange);
57274e1bc9a0SAchim Leubner }
57284e1bc9a0SAchim Leubner else if ( (oneDeviceData->valid == agTRUE) && (oneDeviceData->valid2 == agFALSE) )
57294e1bc9a0SAchim Leubner {
57304e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: removed\n"));
57314e1bc9a0SAchim Leubner removed = agTRUE;
57324e1bc9a0SAchim Leubner /* reset valid bit */
57334e1bc9a0SAchim Leubner oneDeviceData->valid = oneDeviceData->valid2;
57344e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
57354e1bc9a0SAchim Leubner
57364e1bc9a0SAchim Leubner onePortContext->RegisteredDevNums--;
57374e1bc9a0SAchim Leubner dmSubReportChanges(dmRoot, onePortContext, oneDeviceData, dmDeviceRemoval);
57384e1bc9a0SAchim Leubner }
57394e1bc9a0SAchim Leubner else if ( (oneDeviceData->valid == agFALSE) && (oneDeviceData->valid2 == agTRUE) )
57404e1bc9a0SAchim Leubner {
57414e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: added\n"));
57424e1bc9a0SAchim Leubner added = agTRUE;
57434e1bc9a0SAchim Leubner /* reset valid bit */
57444e1bc9a0SAchim Leubner oneDeviceData->valid = oneDeviceData->valid2;
57454e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
57464e1bc9a0SAchim Leubner dmSubReportChanges(dmRoot, onePortContext, oneDeviceData, dmDeviceArrival);
57474e1bc9a0SAchim Leubner }
57484e1bc9a0SAchim Leubner else
57494e1bc9a0SAchim Leubner {
57504e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: else\n"));
57514e1bc9a0SAchim Leubner }
57524e1bc9a0SAchim Leubner }
57534e1bc9a0SAchim Leubner else
57544e1bc9a0SAchim Leubner {
57554e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: different portcontext\n"));
57564e1bc9a0SAchim Leubner }
57574e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
57584e1bc9a0SAchim Leubner }
57594e1bc9a0SAchim Leubner /*
57604e1bc9a0SAchim Leubner osGLOBAL void
57614e1bc9a0SAchim Leubner tddmReportDevice(
57624e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
57634e1bc9a0SAchim Leubner dmPortContext_t *dmPortContext,
57644e1bc9a0SAchim Leubner dmDeviceInfo_t *dmDeviceInfo,
57654e1bc9a0SAchim Leubner dmDeviceInfo_t *dmExpDeviceInfo,
57664e1bc9a0SAchim Leubner bit32 flag
57674e1bc9a0SAchim Leubner
57684e1bc9a0SAchim Leubner )
57694e1bc9a0SAchim Leubner
57704e1bc9a0SAchim Leubner */
57714e1bc9a0SAchim Leubner
57724e1bc9a0SAchim Leubner /* arrival or removal at once */
57734e1bc9a0SAchim Leubner if (added == agTRUE)
57744e1bc9a0SAchim Leubner {
57754e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: added at the end\n"));
57764e1bc9a0SAchim Leubner #if 0 /* TBD */
57774e1bc9a0SAchim Leubner ostiInitiatorEvent(
57784e1bc9a0SAchim Leubner tiRoot,
57794e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
57804e1bc9a0SAchim Leubner agNULL,
57814e1bc9a0SAchim Leubner tiIntrEventTypeDeviceChange,
57824e1bc9a0SAchim Leubner tiDeviceArrival,
57834e1bc9a0SAchim Leubner agNULL
57844e1bc9a0SAchim Leubner );
57854e1bc9a0SAchim Leubner #endif
57864e1bc9a0SAchim Leubner
57874e1bc9a0SAchim Leubner }
57884e1bc9a0SAchim Leubner if (removed == agTRUE)
57894e1bc9a0SAchim Leubner {
57904e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: removed at the end\n"));
57914e1bc9a0SAchim Leubner #if 0 /* TBD */
57924e1bc9a0SAchim Leubner ostiInitiatorEvent(
57934e1bc9a0SAchim Leubner tiRoot,
57944e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
57954e1bc9a0SAchim Leubner agNULL,
57964e1bc9a0SAchim Leubner tiIntrEventTypeDeviceChange,
57974e1bc9a0SAchim Leubner tiDeviceRemoval,
57984e1bc9a0SAchim Leubner agNULL
57994e1bc9a0SAchim Leubner );
58004e1bc9a0SAchim Leubner #endif
58014e1bc9a0SAchim Leubner }
58024e1bc9a0SAchim Leubner
58034e1bc9a0SAchim Leubner if (onePortContext->discovery.forcedOK == agTRUE && added == agFALSE && removed == agFALSE)
58044e1bc9a0SAchim Leubner {
58054e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: missed chance to report. forced to report OK\n"));
58064e1bc9a0SAchim Leubner onePortContext->discovery.forcedOK = agFALSE;
58074e1bc9a0SAchim Leubner #if 0 /* TBD */
58084e1bc9a0SAchim Leubner ostiInitiatorEvent(
58094e1bc9a0SAchim Leubner tiRoot,
58104e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
58114e1bc9a0SAchim Leubner agNULL,
58124e1bc9a0SAchim Leubner tiIntrEventTypeDiscovery,
58134e1bc9a0SAchim Leubner tiDiscOK,
58144e1bc9a0SAchim Leubner agNULL
58154e1bc9a0SAchim Leubner );
58164e1bc9a0SAchim Leubner #endif
58174e1bc9a0SAchim Leubner }
58184e1bc9a0SAchim Leubner
58194e1bc9a0SAchim Leubner if (added == agFALSE && removed == agFALSE)
58204e1bc9a0SAchim Leubner {
58214e1bc9a0SAchim Leubner DM_DBG3(("dmReportChanges: the same\n"));
58224e1bc9a0SAchim Leubner }
58234e1bc9a0SAchim Leubner
58244e1bc9a0SAchim Leubner return;
58254e1bc9a0SAchim Leubner }
58264e1bc9a0SAchim Leubner
58274e1bc9a0SAchim Leubner osGLOBAL void
dmReportRemovals(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 flag)58284e1bc9a0SAchim Leubner dmReportRemovals(
58294e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
58304e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
58314e1bc9a0SAchim Leubner bit32 flag
58324e1bc9a0SAchim Leubner )
58334e1bc9a0SAchim Leubner {
58344e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
58354e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
58364e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
58374e1bc9a0SAchim Leubner dmList_t *DeviceListList;
58384e1bc9a0SAchim Leubner bit32 removed = agFALSE;
58394e1bc9a0SAchim Leubner
58404e1bc9a0SAchim Leubner DM_DBG1(("dmReportRemovals: start\n"));
58414e1bc9a0SAchim Leubner
58424e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
58434e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
58444e1bc9a0SAchim Leubner {
58454e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
58464e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: empty device list\n"));
58474e1bc9a0SAchim Leubner return;
58484e1bc9a0SAchim Leubner }
58494e1bc9a0SAchim Leubner else
58504e1bc9a0SAchim Leubner {
58514e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
58524e1bc9a0SAchim Leubner }
58534e1bc9a0SAchim Leubner
58544e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
58554e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
58564e1bc9a0SAchim Leubner {
58574e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
58584e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
58594e1bc9a0SAchim Leubner {
58604e1bc9a0SAchim Leubner DM_DBG1(("dmReportRemovals: oneDeviceData is NULL!!!\n"));
58614e1bc9a0SAchim Leubner return;
58624e1bc9a0SAchim Leubner }
58634e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: loop did %d\n", oneDeviceData->id));
58644e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
58654e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
58664e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: valid %d\n", oneDeviceData->valid));
58674e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: valid2 %d\n", oneDeviceData->valid2));
58684e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: directlyAttached %d\n", oneDeviceData->directlyAttached));
58694e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
58704e1bc9a0SAchim Leubner {
58714e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: right portcontext pid %d\n", onePortContext->id));
58724e1bc9a0SAchim Leubner if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi &&
58734e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo
58744e1bc9a0SAchim Leubner )
58754e1bc9a0SAchim Leubner {
58764e1bc9a0SAchim Leubner DM_DBG1(("dmReportRemovals: keeping\n"));
58774e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
58784e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
58794e1bc9a0SAchim Leubner }
58804e1bc9a0SAchim Leubner else if (oneDeviceData->valid == agTRUE)
58814e1bc9a0SAchim Leubner {
58824e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: removing\n"));
58834e1bc9a0SAchim Leubner
58844e1bc9a0SAchim Leubner /* notify only reported devices to OS layer*/
58854e1bc9a0SAchim Leubner if ( DEVICE_IS_SSP_TARGET(oneDeviceData) ||
58864e1bc9a0SAchim Leubner DEVICE_IS_STP_TARGET(oneDeviceData) ||
58874e1bc9a0SAchim Leubner DEVICE_IS_SATA_DEVICE(oneDeviceData)
58884e1bc9a0SAchim Leubner )
58894e1bc9a0SAchim Leubner {
58904e1bc9a0SAchim Leubner removed = agTRUE;
58914e1bc9a0SAchim Leubner }
58924e1bc9a0SAchim Leubner
58934e1bc9a0SAchim Leubner /* all targets except expanders */
58944e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: did %d\n", oneDeviceData->id));
58954e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
58964e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
58974e1bc9a0SAchim Leubner onePortContext->RegisteredDevNums--;
58984e1bc9a0SAchim Leubner dmSubReportRemovals(dmRoot, onePortContext, oneDeviceData, dmDeviceRemoval);
58994e1bc9a0SAchim Leubner
59004e1bc9a0SAchim Leubner
59014e1bc9a0SAchim Leubner /* reset valid bit */
59024e1bc9a0SAchim Leubner oneDeviceData->valid = agFALSE;
59034e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
59044e1bc9a0SAchim Leubner
59054e1bc9a0SAchim Leubner
59064e1bc9a0SAchim Leubner }
59074e1bc9a0SAchim Leubner /* called by port invalid case */
59084e1bc9a0SAchim Leubner if (flag == agTRUE)
59094e1bc9a0SAchim Leubner {
59104e1bc9a0SAchim Leubner oneDeviceData->dmPortContext = agNULL;
59114e1bc9a0SAchim Leubner }
59124e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
59134e1bc9a0SAchim Leubner }
59144e1bc9a0SAchim Leubner else
59154e1bc9a0SAchim Leubner {
59164e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext != agNULL)
59174e1bc9a0SAchim Leubner {
59184e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: different portcontext; oneDeviceData->dmPortContext pid %d oneportcontext pid %d\n", oneDeviceData->dmPortContext->id, onePortContext->id));
59194e1bc9a0SAchim Leubner }
59204e1bc9a0SAchim Leubner else
59214e1bc9a0SAchim Leubner {
59224e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: different portcontext; oneDeviceData->dmPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
59234e1bc9a0SAchim Leubner }
59244e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
59254e1bc9a0SAchim Leubner }
59264e1bc9a0SAchim Leubner }
59274e1bc9a0SAchim Leubner
59284e1bc9a0SAchim Leubner if (removed == agTRUE)
59294e1bc9a0SAchim Leubner {
59304e1bc9a0SAchim Leubner DM_DBG3(("dmReportRemovals: removed at the end\n"));
59314e1bc9a0SAchim Leubner #if 0 /* TBD */
59324e1bc9a0SAchim Leubner ostiInitiatorEvent(
59334e1bc9a0SAchim Leubner tiRoot,
59344e1bc9a0SAchim Leubner onePortContext->tiPortalContext,
59354e1bc9a0SAchim Leubner agNULL,
59364e1bc9a0SAchim Leubner tiIntrEventTypeDeviceChange,
59374e1bc9a0SAchim Leubner tiDeviceRemoval,
59384e1bc9a0SAchim Leubner agNULL
59394e1bc9a0SAchim Leubner );
59404e1bc9a0SAchim Leubner #endif
59414e1bc9a0SAchim Leubner }
59424e1bc9a0SAchim Leubner
59434e1bc9a0SAchim Leubner return;
59444e1bc9a0SAchim Leubner }
59454e1bc9a0SAchim Leubner
59464e1bc9a0SAchim Leubner osGLOBAL void
dmResetReported(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)59474e1bc9a0SAchim Leubner dmResetReported(
59484e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
59494e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
59504e1bc9a0SAchim Leubner )
59514e1bc9a0SAchim Leubner {
59524e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
59534e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
59544e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
59554e1bc9a0SAchim Leubner dmList_t *DeviceListList;
59564e1bc9a0SAchim Leubner
59574e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: start\n"));
59584e1bc9a0SAchim Leubner
59594e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
59604e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
59614e1bc9a0SAchim Leubner {
59624e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
59634e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: empty device list\n"));
59644e1bc9a0SAchim Leubner return;
59654e1bc9a0SAchim Leubner }
59664e1bc9a0SAchim Leubner else
59674e1bc9a0SAchim Leubner {
59684e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
59694e1bc9a0SAchim Leubner }
59704e1bc9a0SAchim Leubner
59714e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
59724e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
59734e1bc9a0SAchim Leubner {
59744e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
59754e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
59764e1bc9a0SAchim Leubner {
59774e1bc9a0SAchim Leubner DM_DBG1(("dmResetReported: oneDeviceData is NULL!!!\n"));
59784e1bc9a0SAchim Leubner return;
59794e1bc9a0SAchim Leubner }
59804e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: loop did %d\n", oneDeviceData->id));
59814e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
59824e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
59834e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: valid %d\n", oneDeviceData->valid));
59844e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: valid2 %d\n", oneDeviceData->valid2));
59854e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: directlyAttached %d\n", oneDeviceData->directlyAttached));
59864e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
59874e1bc9a0SAchim Leubner {
59884e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: right portcontext pid %d\n", onePortContext->id));
59894e1bc9a0SAchim Leubner oneDeviceData->reported = agFALSE;
59904e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
59914e1bc9a0SAchim Leubner }
59924e1bc9a0SAchim Leubner else
59934e1bc9a0SAchim Leubner {
59944e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext != agNULL)
59954e1bc9a0SAchim Leubner {
59964e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: different portcontext; oneDeviceData->dmPortContext pid %d oneportcontext pid %d\n", oneDeviceData->dmPortContext->id, onePortContext->id));
59974e1bc9a0SAchim Leubner }
59984e1bc9a0SAchim Leubner else
59994e1bc9a0SAchim Leubner {
60004e1bc9a0SAchim Leubner DM_DBG3(("dmResetReported: different portcontext; oneDeviceData->dmPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
60014e1bc9a0SAchim Leubner }
60024e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
60034e1bc9a0SAchim Leubner }
60044e1bc9a0SAchim Leubner }
60054e1bc9a0SAchim Leubner
60064e1bc9a0SAchim Leubner return;
60074e1bc9a0SAchim Leubner }
60084e1bc9a0SAchim Leubner
60094e1bc9a0SAchim Leubner /* called on discover failure */
60104e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryInvalidateDevices(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)60114e1bc9a0SAchim Leubner dmDiscoveryInvalidateDevices(
60124e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
60134e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
60144e1bc9a0SAchim Leubner )
60154e1bc9a0SAchim Leubner {
60164e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
60174e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
60184e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
60194e1bc9a0SAchim Leubner dmList_t *DeviceListList;
60204e1bc9a0SAchim Leubner
60214e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryInvalidateDevices: start\n"));
60224e1bc9a0SAchim Leubner
60234e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
60244e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
60254e1bc9a0SAchim Leubner {
60264e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
60274e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: empty device list\n"));
60284e1bc9a0SAchim Leubner return;
60294e1bc9a0SAchim Leubner }
60304e1bc9a0SAchim Leubner else
60314e1bc9a0SAchim Leubner {
60324e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
60334e1bc9a0SAchim Leubner }
60344e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
60354e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
60364e1bc9a0SAchim Leubner {
60374e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
60384e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
60394e1bc9a0SAchim Leubner {
60404e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryInvalidateDevices: oneDeviceData is NULL!!!\n"));
60414e1bc9a0SAchim Leubner return;
60424e1bc9a0SAchim Leubner }
60434e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: loop did %d\n", oneDeviceData->id));
60444e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
60454e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
60464e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: valid %d\n", oneDeviceData->valid));
60474e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: valid2 %d\n", oneDeviceData->valid2));
60484e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: directlyAttached %d\n", oneDeviceData->directlyAttached));
60494e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
60504e1bc9a0SAchim Leubner {
60514e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: right portcontext pid %d\n", onePortContext->id));
60524e1bc9a0SAchim Leubner if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi &&
60534e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo
60544e1bc9a0SAchim Leubner )
60554e1bc9a0SAchim Leubner {
60564e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryInvalidateDevices: keeping\n"));
60574e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
60584e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
60594e1bc9a0SAchim Leubner }
60604e1bc9a0SAchim Leubner else
60614e1bc9a0SAchim Leubner {
60624e1bc9a0SAchim Leubner oneDeviceData->valid = agFALSE;
60634e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
60644e1bc9a0SAchim Leubner oneDeviceData->registered = agFALSE;
60654e1bc9a0SAchim Leubner oneDeviceData->reported = agFALSE;
60664e1bc9a0SAchim Leubner /* all targets other than expanders */
60674e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: did %d\n", oneDeviceData->id));
60684e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
60694e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
60704e1bc9a0SAchim Leubner onePortContext->RegisteredDevNums--;
60714e1bc9a0SAchim Leubner }
60724e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
60734e1bc9a0SAchim Leubner }
60744e1bc9a0SAchim Leubner else
60754e1bc9a0SAchim Leubner {
60764e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext != agNULL)
60774e1bc9a0SAchim Leubner {
60784e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: different portcontext; oneDeviceData->dmPortContext pid %d oneportcontext pid %d\n", oneDeviceData->dmPortContext->id, onePortContext->id));
60794e1bc9a0SAchim Leubner }
60804e1bc9a0SAchim Leubner else
60814e1bc9a0SAchim Leubner {
60824e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryInvalidateDevices: different portcontext; oneDeviceData->dmPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
60834e1bc9a0SAchim Leubner }
60844e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
60854e1bc9a0SAchim Leubner }
60864e1bc9a0SAchim Leubner }
60874e1bc9a0SAchim Leubner
60884e1bc9a0SAchim Leubner return;
60894e1bc9a0SAchim Leubner }
60904e1bc9a0SAchim Leubner
60914e1bc9a0SAchim Leubner
60924e1bc9a0SAchim Leubner /*
60934e1bc9a0SAchim Leubner should DM report the device removal to TDM on an error case?
60944e1bc9a0SAchim Leubner or
60954e1bc9a0SAchim Leubner DM simply removes the devices
60964e1bc9a0SAchim Leubner For now, the second option.
60974e1bc9a0SAchim Leubner */
60984e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryErrorRemovals(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)60994e1bc9a0SAchim Leubner dmDiscoveryErrorRemovals(
61004e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
61014e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
61024e1bc9a0SAchim Leubner )
61034e1bc9a0SAchim Leubner {
61044e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
61054e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
61064e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
61074e1bc9a0SAchim Leubner dmList_t *DeviceListList;
61084e1bc9a0SAchim Leubner
61094e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryErrorRemovals: start\n"));
61104e1bc9a0SAchim Leubner
61114e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
61124e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
61134e1bc9a0SAchim Leubner {
61144e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
61154e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: empty device list\n"));
61164e1bc9a0SAchim Leubner return;
61174e1bc9a0SAchim Leubner }
61184e1bc9a0SAchim Leubner else
61194e1bc9a0SAchim Leubner {
61204e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
61214e1bc9a0SAchim Leubner }
61224e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
61234e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
61244e1bc9a0SAchim Leubner {
61254e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
61264e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
61274e1bc9a0SAchim Leubner {
61284e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryErrorRemovals: oneDeviceData is NULL!!!\n"));
61294e1bc9a0SAchim Leubner return;
61304e1bc9a0SAchim Leubner }
61314e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: loop did %d\n", oneDeviceData->id));
61324e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
61334e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
61344e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: valid %d\n", oneDeviceData->valid));
61354e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: valid2 %d\n", oneDeviceData->valid2));
61364e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: directlyAttached %d\n", oneDeviceData->directlyAttached));
61374e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
61384e1bc9a0SAchim Leubner {
61394e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: right portcontext pid %d\n", onePortContext->id));
61404e1bc9a0SAchim Leubner if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi &&
61414e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo
61424e1bc9a0SAchim Leubner )
61434e1bc9a0SAchim Leubner {
61444e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryErrorRemovals: keeping\n"));
61454e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
61464e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
61474e1bc9a0SAchim Leubner }
61484e1bc9a0SAchim Leubner else
61494e1bc9a0SAchim Leubner {
61504e1bc9a0SAchim Leubner oneDeviceData->valid = agFALSE;
61514e1bc9a0SAchim Leubner oneDeviceData->valid2 = agFALSE;
61524e1bc9a0SAchim Leubner
61534e1bc9a0SAchim Leubner /* all targets other than expanders */
61544e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: did %d\n", oneDeviceData->id));
61554e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
61564e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
61574e1bc9a0SAchim Leubner onePortContext->RegisteredDevNums--;
61584e1bc9a0SAchim Leubner dmSubReportRemovals(dmRoot, onePortContext, oneDeviceData, dmDeviceRemoval);
61594e1bc9a0SAchim Leubner
61604e1bc9a0SAchim Leubner }
61614e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
61624e1bc9a0SAchim Leubner }
61634e1bc9a0SAchim Leubner else
61644e1bc9a0SAchim Leubner {
61654e1bc9a0SAchim Leubner if (oneDeviceData->dmPortContext != agNULL)
61664e1bc9a0SAchim Leubner {
61674e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: different portcontext; oneDeviceData->dmPortContext pid %d oneportcontext pid %d\n", oneDeviceData->dmPortContext->id, onePortContext->id));
61684e1bc9a0SAchim Leubner }
61694e1bc9a0SAchim Leubner else
61704e1bc9a0SAchim Leubner {
61714e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryErrorRemovals: different portcontext; oneDeviceData->dmPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
61724e1bc9a0SAchim Leubner }
61734e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
61744e1bc9a0SAchim Leubner }
61754e1bc9a0SAchim Leubner }
61764e1bc9a0SAchim Leubner
61774e1bc9a0SAchim Leubner return;
61784e1bc9a0SAchim Leubner }
61794e1bc9a0SAchim Leubner
61804e1bc9a0SAchim Leubner /* move from dmAllShared->mainExpanderList to dmAllShared->freeExpanderList */
61814e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryExpanderCleanUp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)61824e1bc9a0SAchim Leubner dmDiscoveryExpanderCleanUp(
61834e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
61844e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
61854e1bc9a0SAchim Leubner )
61864e1bc9a0SAchim Leubner {
61874e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
61884e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
61894e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
61904e1bc9a0SAchim Leubner dmList_t *ExpanderList = agNULL;
61914e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
61924e1bc9a0SAchim Leubner
61934e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryExpanderCleanUp: start\n"));
61944e1bc9a0SAchim Leubner /*
61954e1bc9a0SAchim Leubner be sure to call
61964e1bc9a0SAchim Leubner osGLOBAL void
61974e1bc9a0SAchim Leubner dmExpanderDeviceDataReInit(
61984e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
61994e1bc9a0SAchim Leubner dmExpander_t *oneExpander
62004e1bc9a0SAchim Leubner );
62014e1bc9a0SAchim Leubner
62024e1bc9a0SAchim Leubner */
62034e1bc9a0SAchim Leubner
62044e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
62054e1bc9a0SAchim Leubner if (!DMLIST_EMPTY(&(dmAllShared->mainExpanderList)))
62064e1bc9a0SAchim Leubner {
62074e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
62084e1bc9a0SAchim Leubner ExpanderList = dmAllShared->mainExpanderList.flink;
62094e1bc9a0SAchim Leubner while (ExpanderList != &(dmAllShared->mainExpanderList))
62104e1bc9a0SAchim Leubner {
62114e1bc9a0SAchim Leubner oneExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
62124e1bc9a0SAchim Leubner if (oneExpander == agNULL)
62134e1bc9a0SAchim Leubner {
62144e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryExpanderCleanUp: oneExpander is NULL!!!\n"));
62154e1bc9a0SAchim Leubner return;
62164e1bc9a0SAchim Leubner }
62174e1bc9a0SAchim Leubner oneDeviceData = oneExpander->dmDevice;
62184e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryExpanderCleanUp: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
62194e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryExpanderCleanUp: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
62204e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
62214e1bc9a0SAchim Leubner {
62224e1bc9a0SAchim Leubner dmExpanderDeviceDataReInit(dmRoot, oneExpander);
62234e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
62244e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(oneExpander->linkNode));
62254e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(oneExpander->linkNode), &(dmAllShared->freeExpanderList));
62264e1bc9a0SAchim Leubner
62274e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->mainExpanderList)))
62284e1bc9a0SAchim Leubner {
62294e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
62304e1bc9a0SAchim Leubner break;
62314e1bc9a0SAchim Leubner }
62324e1bc9a0SAchim Leubner else
62334e1bc9a0SAchim Leubner {
62344e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
62354e1bc9a0SAchim Leubner }
62364e1bc9a0SAchim Leubner ExpanderList = dmAllShared->mainExpanderList.flink;
62374e1bc9a0SAchim Leubner }
62384e1bc9a0SAchim Leubner else
62394e1bc9a0SAchim Leubner {
62404e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
62414e1bc9a0SAchim Leubner }
62424e1bc9a0SAchim Leubner }
62434e1bc9a0SAchim Leubner }
62444e1bc9a0SAchim Leubner else
62454e1bc9a0SAchim Leubner {
62464e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
62474e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryExpanderCleanUp: empty mainExpanderList\n"));
62484e1bc9a0SAchim Leubner }
62494e1bc9a0SAchim Leubner return;
62504e1bc9a0SAchim Leubner
62514e1bc9a0SAchim Leubner }
62524e1bc9a0SAchim Leubner
62534e1bc9a0SAchim Leubner
62544e1bc9a0SAchim Leubner /* moves all devices from dmAllShared->MainDeviceList to dmAllShared->FreeDeviceList */
62554e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryDeviceCleanUp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)62564e1bc9a0SAchim Leubner dmDiscoveryDeviceCleanUp(
62574e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
62584e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
62594e1bc9a0SAchim Leubner )
62604e1bc9a0SAchim Leubner {
62614e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
62624e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
62634e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
62644e1bc9a0SAchim Leubner dmList_t *DeviceListList;
62654e1bc9a0SAchim Leubner
62664e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDeviceCleanUp: start\n"));
62674e1bc9a0SAchim Leubner
62684e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
62694e1bc9a0SAchim Leubner if (!DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
62704e1bc9a0SAchim Leubner {
62714e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
62724e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
62734e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
62744e1bc9a0SAchim Leubner {
62754e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
62764e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
62774e1bc9a0SAchim Leubner {
62784e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoveryDeviceCleanUp: oneDeviceData is NULL!!!\n"));
62794e1bc9a0SAchim Leubner return;
62804e1bc9a0SAchim Leubner }
62814e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDeviceCleanUp: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
62824e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDeviceCleanUp: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
62834e1bc9a0SAchim Leubner if ( oneDeviceData->dmPortContext == onePortContext)
62844e1bc9a0SAchim Leubner {
62854e1bc9a0SAchim Leubner dmDeviceDataReInit(dmRoot, oneDeviceData);
62864e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
62874e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
62884e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(dmAllShared->FreeDeviceList));
62894e1bc9a0SAchim Leubner
62904e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
62914e1bc9a0SAchim Leubner {
62924e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
62934e1bc9a0SAchim Leubner break;
62944e1bc9a0SAchim Leubner }
62954e1bc9a0SAchim Leubner else
62964e1bc9a0SAchim Leubner {
62974e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
62984e1bc9a0SAchim Leubner }
62994e1bc9a0SAchim Leubner onePortContext->RegisteredDevNums--;
63004e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
63014e1bc9a0SAchim Leubner }
63024e1bc9a0SAchim Leubner else
63034e1bc9a0SAchim Leubner {
63044e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
63054e1bc9a0SAchim Leubner }
63064e1bc9a0SAchim Leubner }
63074e1bc9a0SAchim Leubner }
63084e1bc9a0SAchim Leubner else
63094e1bc9a0SAchim Leubner {
63104e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
63114e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryDeviceCleanUp: empty MainDeviceList\n"));
63124e1bc9a0SAchim Leubner }
63134e1bc9a0SAchim Leubner return;
63144e1bc9a0SAchim Leubner }
63154e1bc9a0SAchim Leubner
63164e1bc9a0SAchim Leubner
63174e1bc9a0SAchim Leubner
63184e1bc9a0SAchim Leubner osGLOBAL void
dmDumpAllExp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)63194e1bc9a0SAchim Leubner dmDumpAllExp(
63204e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
63214e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
63224e1bc9a0SAchim Leubner dmExpander_t *oneExpander
63234e1bc9a0SAchim Leubner )
63244e1bc9a0SAchim Leubner {
63254e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllExp: start\n"));
63264e1bc9a0SAchim Leubner return;
63274e1bc9a0SAchim Leubner }
63284e1bc9a0SAchim Leubner
63294e1bc9a0SAchim Leubner
63304e1bc9a0SAchim Leubner osGLOBAL void
dmDumpAllUpExp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander)63314e1bc9a0SAchim Leubner dmDumpAllUpExp(
63324e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
63334e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
63344e1bc9a0SAchim Leubner dmExpander_t *oneExpander
63354e1bc9a0SAchim Leubner )
63364e1bc9a0SAchim Leubner {
63374e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllUpExp: start\n"));
63384e1bc9a0SAchim Leubner return;
63394e1bc9a0SAchim Leubner }
63404e1bc9a0SAchim Leubner
63414e1bc9a0SAchim Leubner osGLOBAL void
dmDumpAllFreeExp(dmRoot_t * dmRoot)63424e1bc9a0SAchim Leubner dmDumpAllFreeExp(
63434e1bc9a0SAchim Leubner dmRoot_t *dmRoot
63444e1bc9a0SAchim Leubner )
63454e1bc9a0SAchim Leubner {
63464e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllFreeExp: start\n"));
63474e1bc9a0SAchim Leubner return;
63484e1bc9a0SAchim Leubner }
63494e1bc9a0SAchim Leubner
63504e1bc9a0SAchim Leubner osGLOBAL void
dmDumpAllMainExp(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)63514e1bc9a0SAchim Leubner dmDumpAllMainExp(
63524e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
63534e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
63544e1bc9a0SAchim Leubner )
63554e1bc9a0SAchim Leubner {
63564e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
63574e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
63584e1bc9a0SAchim Leubner dmList_t *ExpanderList;
63594e1bc9a0SAchim Leubner dmExpander_t *tempExpander;
63604e1bc9a0SAchim Leubner
63614e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: start\n"));
63624e1bc9a0SAchim Leubner
63634e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_EXPANDER_LOCK);
63644e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->mainExpanderList)))
63654e1bc9a0SAchim Leubner {
63664e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: empty discoveringExpanderList\n"));
63674e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
63684e1bc9a0SAchim Leubner return;
63694e1bc9a0SAchim Leubner }
63704e1bc9a0SAchim Leubner else
63714e1bc9a0SAchim Leubner {
63724e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_EXPANDER_LOCK);
63734e1bc9a0SAchim Leubner }
63744e1bc9a0SAchim Leubner
63754e1bc9a0SAchim Leubner ExpanderList = dmAllShared->mainExpanderList.flink;
63764e1bc9a0SAchim Leubner while (ExpanderList != &(dmAllShared->mainExpanderList))
63774e1bc9a0SAchim Leubner {
63784e1bc9a0SAchim Leubner tempExpander = DMLIST_OBJECT_BASE(dmExpander_t, linkNode, ExpanderList);
63794e1bc9a0SAchim Leubner if (tempExpander == agNULL)
63804e1bc9a0SAchim Leubner {
63814e1bc9a0SAchim Leubner DM_DBG1(("dmDumpAllMainExp: tempExpander is NULL!!!\n"));
63824e1bc9a0SAchim Leubner return;
63834e1bc9a0SAchim Leubner }
63844e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: expander id %d\n", tempExpander->id));
63854e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
63864e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
63874e1bc9a0SAchim Leubner if ((tempExpander->dmDevice->dmPortContext == onePortContext)
63884e1bc9a0SAchim Leubner )
63894e1bc9a0SAchim Leubner {
63904e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: found expander id %d\n", tempExpander->id));
63914e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: found exp addrHi 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressHi));
63924e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainExp: found exp addrLo 0x%08x\n", tempExpander->dmDevice->SASAddressID.sasAddressLo));
63934e1bc9a0SAchim Leubner }
63944e1bc9a0SAchim Leubner ExpanderList = ExpanderList->flink;
63954e1bc9a0SAchim Leubner }
63964e1bc9a0SAchim Leubner return;
63974e1bc9a0SAchim Leubner }
63984e1bc9a0SAchim Leubner
63994e1bc9a0SAchim Leubner
64004e1bc9a0SAchim Leubner osGLOBAL void
dmDumpAllMainDevice(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)64014e1bc9a0SAchim Leubner dmDumpAllMainDevice(
64024e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
64034e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
64044e1bc9a0SAchim Leubner )
64054e1bc9a0SAchim Leubner {
64064e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
64074e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
64084e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
64094e1bc9a0SAchim Leubner dmList_t *DeviceListList;
64104e1bc9a0SAchim Leubner bit32 total = 0, port_total = 0;
64114e1bc9a0SAchim Leubner
64124e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: start\n"));
64134e1bc9a0SAchim Leubner
64144e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
64154e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->MainDeviceList)))
64164e1bc9a0SAchim Leubner {
64174e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: empty discoveringExpanderList\n"));
64184e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
64194e1bc9a0SAchim Leubner return;
64204e1bc9a0SAchim Leubner }
64214e1bc9a0SAchim Leubner else
64224e1bc9a0SAchim Leubner {
64234e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
64244e1bc9a0SAchim Leubner }
64254e1bc9a0SAchim Leubner
64264e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
64274e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
64284e1bc9a0SAchim Leubner {
64294e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
64304e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
64314e1bc9a0SAchim Leubner {
64324e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: oneDeviceData is NULL!!!\n"));
64334e1bc9a0SAchim Leubner return;
64344e1bc9a0SAchim Leubner }
64354e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: oneDeviceData id %d\n", oneDeviceData->id));
64364e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: addrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
64374e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: addrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
64384e1bc9a0SAchim Leubner total++;
64394e1bc9a0SAchim Leubner if ((oneDeviceData->dmPortContext == onePortContext)
64404e1bc9a0SAchim Leubner )
64414e1bc9a0SAchim Leubner {
64424e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: found oneDeviceData id %d\n", oneDeviceData->id));
64434e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: found addrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
64444e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: found addrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
64454e1bc9a0SAchim Leubner port_total++;
64464e1bc9a0SAchim Leubner }
64474e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
64484e1bc9a0SAchim Leubner }
64494e1bc9a0SAchim Leubner DM_DBG3(("dmDumpAllMainDevice: total %d port_totaol %d\n", total, port_total));
64504e1bc9a0SAchim Leubner
64514e1bc9a0SAchim Leubner return;
64524e1bc9a0SAchim Leubner }
64534e1bc9a0SAchim Leubner
64544e1bc9a0SAchim Leubner
64554e1bc9a0SAchim Leubner
64564e1bc9a0SAchim Leubner osGLOBAL dmDeviceData_t *
dmAddSASToSharedcontext(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmSASSubID_t * dmSASSubID,dmDeviceData_t * oneExpDeviceData,bit8 phyID)64574e1bc9a0SAchim Leubner dmAddSASToSharedcontext(
64584e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
64594e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
64604e1bc9a0SAchim Leubner dmSASSubID_t *dmSASSubID,
64614e1bc9a0SAchim Leubner dmDeviceData_t *oneExpDeviceData,
64624e1bc9a0SAchim Leubner bit8 phyID
64634e1bc9a0SAchim Leubner )
64644e1bc9a0SAchim Leubner {
64654e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
64664e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
64674e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
64684e1bc9a0SAchim Leubner dmList_t *DeviceListList;
64694e1bc9a0SAchim Leubner bit32 new_device = agTRUE;
64704e1bc9a0SAchim Leubner
64714e1bc9a0SAchim Leubner
64724e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: start\n"));
64734e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: oneportContext ID %d\n", onePortContext->id));
64744e1bc9a0SAchim Leubner
64754e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
64764e1bc9a0SAchim Leubner {
64774e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: oneExpDeviceData sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
64784e1bc9a0SAchim Leubner oneExpDeviceData->SASAddressID.sasAddressHi, oneExpDeviceData->SASAddressID.sasAddressLo));
64794e1bc9a0SAchim Leubner }
64804e1bc9a0SAchim Leubner else
64814e1bc9a0SAchim Leubner {
64824e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: oneExpDeviceData is NULL\n"));
64834e1bc9a0SAchim Leubner }
64844e1bc9a0SAchim Leubner /* find a device's existence */
64854e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
64864e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
64874e1bc9a0SAchim Leubner {
64884e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
64894e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
64904e1bc9a0SAchim Leubner {
64914e1bc9a0SAchim Leubner DM_DBG1(("dmAddSASToSharedcontext: oneDeviceData is NULL!!!\n"));
64924e1bc9a0SAchim Leubner return agNULL;
64934e1bc9a0SAchim Leubner }
64944e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == dmSASSubID->sasAddressHi) &&
64954e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == dmSASSubID->sasAddressLo) &&
64964e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
64974e1bc9a0SAchim Leubner )
64984e1bc9a0SAchim Leubner {
64994e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: pid %d did %d\n", onePortContext->id, oneDeviceData->id));
65004e1bc9a0SAchim Leubner new_device = agFALSE;
65014e1bc9a0SAchim Leubner break;
65024e1bc9a0SAchim Leubner }
65034e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
65044e1bc9a0SAchim Leubner }
65054e1bc9a0SAchim Leubner
65064e1bc9a0SAchim Leubner /* new device */
65074e1bc9a0SAchim Leubner if (new_device == agTRUE)
65084e1bc9a0SAchim Leubner {
65094e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: new device\n"));
65104e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
65114e1bc9a0SAchim Leubner dmSASSubID->sasAddressHi, dmSASSubID->sasAddressLo));
65124e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
65134e1bc9a0SAchim Leubner if (!DMLIST_NOT_EMPTY(&(dmAllShared->FreeDeviceList)))
65144e1bc9a0SAchim Leubner {
65154e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
65164e1bc9a0SAchim Leubner DM_DBG1(("dmAddSASToSharedcontext: empty DeviceData FreeLink\n"));
65174e1bc9a0SAchim Leubner dmDumpAllMainDevice(dmRoot, onePortContext);
65184e1bc9a0SAchim Leubner return agNULL;
65194e1bc9a0SAchim Leubner }
65204e1bc9a0SAchim Leubner
65214e1bc9a0SAchim Leubner DMLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(dmAllShared->FreeDeviceList));
65224e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
65234e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, FreeLink, DeviceListList);
65244e1bc9a0SAchim Leubner
65254e1bc9a0SAchim Leubner if (oneDeviceData != agNULL)
65264e1bc9a0SAchim Leubner {
65274e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: oneDeviceData %p pid %d did %d\n", oneDeviceData, onePortContext->id, oneDeviceData->id));
65284e1bc9a0SAchim Leubner
65294e1bc9a0SAchim Leubner onePortContext->Count++;
65304e1bc9a0SAchim Leubner oneDeviceData->dmRoot = dmRoot;
65314e1bc9a0SAchim Leubner /* saving sas address */
65324e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo = dmSASSubID->sasAddressLo;
65334e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi = dmSASSubID->sasAddressHi;
65344e1bc9a0SAchim Leubner oneDeviceData->initiator_ssp_stp_smp = dmSASSubID->initiator_ssp_stp_smp;
65354e1bc9a0SAchim Leubner oneDeviceData->target_ssp_stp_smp = dmSASSubID->target_ssp_stp_smp;
65364e1bc9a0SAchim Leubner oneDeviceData->dmPortContext = onePortContext;
65374e1bc9a0SAchim Leubner /* handles both SAS target and STP-target, SATA-device */
65384e1bc9a0SAchim Leubner if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
65394e1bc9a0SAchim Leubner {
65404e1bc9a0SAchim Leubner oneDeviceData->DeviceType = DM_SAS_DEVICE;
65414e1bc9a0SAchim Leubner }
65424e1bc9a0SAchim Leubner else
65434e1bc9a0SAchim Leubner {
65444e1bc9a0SAchim Leubner oneDeviceData->DeviceType = DM_SATA_DEVICE;
65454e1bc9a0SAchim Leubner }
65464e1bc9a0SAchim Leubner
65474e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
65484e1bc9a0SAchim Leubner {
65494e1bc9a0SAchim Leubner oneDeviceData->ExpDevice = oneExpDeviceData;
65504e1bc9a0SAchim Leubner }
65514e1bc9a0SAchim Leubner
65524e1bc9a0SAchim Leubner /* set phyID only when it has initial value of 0xFF */
65534e1bc9a0SAchim Leubner if (oneDeviceData->phyID == 0xFF)
65544e1bc9a0SAchim Leubner {
65554e1bc9a0SAchim Leubner oneDeviceData->phyID = phyID;
65564e1bc9a0SAchim Leubner }
65574e1bc9a0SAchim Leubner /* incremental discovery */
65584e1bc9a0SAchim Leubner /* add device to incremental-related link. Report using this link
65594e1bc9a0SAchim Leubner when incremental discovery is done */
65604e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_NOT_STARTED)
65614e1bc9a0SAchim Leubner {
65624e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: DM_DSTATE_NOT_STARTED\n"));
65634e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
65644e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
65654e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
65664e1bc9a0SAchim Leubner }
65674e1bc9a0SAchim Leubner else
65684e1bc9a0SAchim Leubner {
65694e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_INCREMENTAL_START)
65704e1bc9a0SAchim Leubner {
65714e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: incremental discovery\n"));
65724e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
65734e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
65744e1bc9a0SAchim Leubner oneDeviceData->valid2 = agTRUE;
65754e1bc9a0SAchim Leubner }
65764e1bc9a0SAchim Leubner else
65774e1bc9a0SAchim Leubner {
65784e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: full discovery\n"));
65794e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
65804e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
65814e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
65824e1bc9a0SAchim Leubner }
65834e1bc9a0SAchim Leubner }
65844e1bc9a0SAchim Leubner /* add the devicedata to the portcontext */
65854e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_DEVICE_LOCK);
65864e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(dmAllShared->MainDeviceList));
65874e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_DEVICE_LOCK);
65884e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: one case pid %d did %d \n", onePortContext->id, oneDeviceData->id));
65894e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: new case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
65904e1bc9a0SAchim Leubner }
65914e1bc9a0SAchim Leubner }
65924e1bc9a0SAchim Leubner else /* old device */
65934e1bc9a0SAchim Leubner {
65944e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: old device\n"));
65954e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
65964e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddressHi 0x%08x sasAddressLo 0x%08x\n",
65974e1bc9a0SAchim Leubner dmSASSubID->sasAddressHi, dmSASSubID->sasAddressLo));
65984e1bc9a0SAchim Leubner
65994e1bc9a0SAchim Leubner oneDeviceData->dmRoot = dmRoot;
66004e1bc9a0SAchim Leubner /* saving sas address */
66014e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressLo = dmSASSubID->sasAddressLo;
66024e1bc9a0SAchim Leubner oneDeviceData->SASAddressID.sasAddressHi = dmSASSubID->sasAddressHi;
66034e1bc9a0SAchim Leubner oneDeviceData->initiator_ssp_stp_smp = dmSASSubID->initiator_ssp_stp_smp;
66044e1bc9a0SAchim Leubner oneDeviceData->target_ssp_stp_smp = dmSASSubID->target_ssp_stp_smp;
66054e1bc9a0SAchim Leubner oneDeviceData->dmPortContext = onePortContext;
66064e1bc9a0SAchim Leubner /* handles both SAS target and STP-target, SATA-device */
66074e1bc9a0SAchim Leubner if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
66084e1bc9a0SAchim Leubner {
66094e1bc9a0SAchim Leubner oneDeviceData->DeviceType = DM_SAS_DEVICE;
66104e1bc9a0SAchim Leubner }
66114e1bc9a0SAchim Leubner else
66124e1bc9a0SAchim Leubner {
66134e1bc9a0SAchim Leubner oneDeviceData->DeviceType = DM_SATA_DEVICE;
66144e1bc9a0SAchim Leubner }
66154e1bc9a0SAchim Leubner
66164e1bc9a0SAchim Leubner if (oneExpDeviceData != agNULL)
66174e1bc9a0SAchim Leubner {
66184e1bc9a0SAchim Leubner oneDeviceData->ExpDevice = oneExpDeviceData;
66194e1bc9a0SAchim Leubner }
66204e1bc9a0SAchim Leubner
66214e1bc9a0SAchim Leubner /* set phyID only when it has initial value of 0xFF */
66224e1bc9a0SAchim Leubner if (oneDeviceData->phyID == 0xFF)
66234e1bc9a0SAchim Leubner {
66244e1bc9a0SAchim Leubner oneDeviceData->phyID = phyID;
66254e1bc9a0SAchim Leubner }
66264e1bc9a0SAchim Leubner
66274e1bc9a0SAchim Leubner if (onePortContext->DiscoveryState == DM_DSTATE_NOT_STARTED)
66284e1bc9a0SAchim Leubner {
66294e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: DM_DSTATE_NOT_STARTED\n"));
66304e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
66314e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
66324e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
66334e1bc9a0SAchim Leubner }
66344e1bc9a0SAchim Leubner else
66354e1bc9a0SAchim Leubner {
66364e1bc9a0SAchim Leubner if (onePortContext->discovery.type == DM_DISCOVERY_OPTION_INCREMENTAL_START)
66374e1bc9a0SAchim Leubner {
66384e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: incremental discovery\n"));
66394e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
66404e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
66414e1bc9a0SAchim Leubner oneDeviceData->valid2 = agTRUE;
66424e1bc9a0SAchim Leubner }
66434e1bc9a0SAchim Leubner else
66444e1bc9a0SAchim Leubner {
66454e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: full discovery\n"));
66464e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
66474e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
66484e1bc9a0SAchim Leubner oneDeviceData->valid = agTRUE;
66494e1bc9a0SAchim Leubner }
66504e1bc9a0SAchim Leubner }
66514e1bc9a0SAchim Leubner DM_DBG3(("dmAddSASToSharedcontext: old case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
66524e1bc9a0SAchim Leubner
66534e1bc9a0SAchim Leubner }
66544e1bc9a0SAchim Leubner return oneDeviceData;
66554e1bc9a0SAchim Leubner }
66564e1bc9a0SAchim Leubner
66574e1bc9a0SAchim Leubner /* no checking of valid and valid2 */
66584e1bc9a0SAchim Leubner osGLOBAL dmDeviceData_t *
dmDeviceFind(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 sasAddrHi,bit32 sasAddrLo)66594e1bc9a0SAchim Leubner dmDeviceFind(
66604e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
66614e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
66624e1bc9a0SAchim Leubner bit32 sasAddrHi,
66634e1bc9a0SAchim Leubner bit32 sasAddrLo
66644e1bc9a0SAchim Leubner )
66654e1bc9a0SAchim Leubner {
66664e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
66674e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
66684e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
66694e1bc9a0SAchim Leubner dmList_t *DeviceListList;
66704e1bc9a0SAchim Leubner bit32 found = agFALSE;
66714e1bc9a0SAchim Leubner
66724e1bc9a0SAchim Leubner DM_DBG3(("dmDeviceFind: start\n"));
66734e1bc9a0SAchim Leubner /* find a device's existence */
66744e1bc9a0SAchim Leubner DeviceListList = dmAllShared->MainDeviceList.flink;
66754e1bc9a0SAchim Leubner
66764e1bc9a0SAchim Leubner while (DeviceListList != &(dmAllShared->MainDeviceList))
66774e1bc9a0SAchim Leubner {
66784e1bc9a0SAchim Leubner oneDeviceData = DMLIST_OBJECT_BASE(dmDeviceData_t, MainLink, DeviceListList);
66794e1bc9a0SAchim Leubner if (oneDeviceData == agNULL)
66804e1bc9a0SAchim Leubner {
66814e1bc9a0SAchim Leubner DM_DBG1(("dmDeviceFind: oneDeviceData is NULL!!!\n"));
66824e1bc9a0SAchim Leubner return agNULL;
66834e1bc9a0SAchim Leubner }
66844e1bc9a0SAchim Leubner if ((oneDeviceData->SASAddressID.sasAddressHi == sasAddrHi) &&
66854e1bc9a0SAchim Leubner (oneDeviceData->SASAddressID.sasAddressLo == sasAddrLo) &&
66864e1bc9a0SAchim Leubner // (oneDeviceData->valid == agTRUE) &&
66874e1bc9a0SAchim Leubner (oneDeviceData->dmPortContext == onePortContext)
66884e1bc9a0SAchim Leubner )
66894e1bc9a0SAchim Leubner {
66904e1bc9a0SAchim Leubner DM_DBG3(("dmDeviceFind: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
66914e1bc9a0SAchim Leubner DM_DBG3(("dmDeviceFind: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
66924e1bc9a0SAchim Leubner DM_DBG3(("dmDeviceFind: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
66934e1bc9a0SAchim Leubner found = agTRUE;
66944e1bc9a0SAchim Leubner break;
66954e1bc9a0SAchim Leubner }
66964e1bc9a0SAchim Leubner DeviceListList = DeviceListList->flink;
66974e1bc9a0SAchim Leubner }
66984e1bc9a0SAchim Leubner
66994e1bc9a0SAchim Leubner if (found == agFALSE)
67004e1bc9a0SAchim Leubner {
67014e1bc9a0SAchim Leubner DM_DBG3(("dmDeviceFind: end returning NULL\n"));
67024e1bc9a0SAchim Leubner return agNULL;
67034e1bc9a0SAchim Leubner }
67044e1bc9a0SAchim Leubner else
67054e1bc9a0SAchim Leubner {
67064e1bc9a0SAchim Leubner DM_DBG3(("dmDeviceFind: end returning NOT NULL\n"));
67074e1bc9a0SAchim Leubner return oneDeviceData;
67084e1bc9a0SAchim Leubner }
67094e1bc9a0SAchim Leubner
67104e1bc9a0SAchim Leubner }
67114e1bc9a0SAchim Leubner
67124e1bc9a0SAchim Leubner
67134e1bc9a0SAchim Leubner osGLOBAL void
dmBCTimer(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext)67144e1bc9a0SAchim Leubner dmBCTimer(
67154e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
67164e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext
67174e1bc9a0SAchim Leubner )
67184e1bc9a0SAchim Leubner {
67194e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
67204e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
67214e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
67224e1bc9a0SAchim Leubner
67234e1bc9a0SAchim Leubner DM_DBG3(("dmBCTimer: start\n"));
67244e1bc9a0SAchim Leubner
67254e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
67264e1bc9a0SAchim Leubner
67274e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
67284e1bc9a0SAchim Leubner if (discovery->BCTimer.timerRunning == agTRUE)
67294e1bc9a0SAchim Leubner {
67304e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
67314e1bc9a0SAchim Leubner dmKillTimer(
67324e1bc9a0SAchim Leubner dmRoot,
67334e1bc9a0SAchim Leubner &discovery->BCTimer
67344e1bc9a0SAchim Leubner );
67354e1bc9a0SAchim Leubner }
67364e1bc9a0SAchim Leubner else
67374e1bc9a0SAchim Leubner {
67384e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
67394e1bc9a0SAchim Leubner }
67404e1bc9a0SAchim Leubner
67414e1bc9a0SAchim Leubner if (onePortContext->valid == agTRUE)
67424e1bc9a0SAchim Leubner {
67434e1bc9a0SAchim Leubner dmSetTimerRequest(
67444e1bc9a0SAchim Leubner dmRoot,
67454e1bc9a0SAchim Leubner &discovery->BCTimer,
67464e1bc9a0SAchim Leubner BC_TIMER_VALUE/dmAllShared->usecsPerTick,
67474e1bc9a0SAchim Leubner dmBCTimerCB,
67484e1bc9a0SAchim Leubner onePortContext,
67494e1bc9a0SAchim Leubner agNULL,
67504e1bc9a0SAchim Leubner agNULL
67514e1bc9a0SAchim Leubner );
67524e1bc9a0SAchim Leubner
67534e1bc9a0SAchim Leubner dmAddTimer(
67544e1bc9a0SAchim Leubner dmRoot,
67554e1bc9a0SAchim Leubner &dmAllShared->timerlist,
67564e1bc9a0SAchim Leubner &discovery->BCTimer
67574e1bc9a0SAchim Leubner );
67584e1bc9a0SAchim Leubner
67594e1bc9a0SAchim Leubner }
67604e1bc9a0SAchim Leubner
67614e1bc9a0SAchim Leubner
67624e1bc9a0SAchim Leubner return;
67634e1bc9a0SAchim Leubner }
67644e1bc9a0SAchim Leubner
67654e1bc9a0SAchim Leubner
67664e1bc9a0SAchim Leubner osGLOBAL void
dmBCTimerCB(dmRoot_t * dmRoot,void * timerData1,void * timerData2,void * timerData3)67674e1bc9a0SAchim Leubner dmBCTimerCB(
67684e1bc9a0SAchim Leubner dmRoot_t * dmRoot,
67694e1bc9a0SAchim Leubner void * timerData1,
67704e1bc9a0SAchim Leubner void * timerData2,
67714e1bc9a0SAchim Leubner void * timerData3
67724e1bc9a0SAchim Leubner )
67734e1bc9a0SAchim Leubner {
67744e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext;
67754e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
67764e1bc9a0SAchim Leubner
67774e1bc9a0SAchim Leubner DM_DBG3(("dmBCTimerCB: start\n"));
67784e1bc9a0SAchim Leubner
67794e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)timerData1;
67804e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
67814e1bc9a0SAchim Leubner
67824e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
67834e1bc9a0SAchim Leubner if (discovery->BCTimer.timerRunning == agTRUE)
67844e1bc9a0SAchim Leubner {
67854e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
67864e1bc9a0SAchim Leubner dmKillTimer(
67874e1bc9a0SAchim Leubner dmRoot,
67884e1bc9a0SAchim Leubner &discovery->BCTimer
67894e1bc9a0SAchim Leubner );
67904e1bc9a0SAchim Leubner }
67914e1bc9a0SAchim Leubner else
67924e1bc9a0SAchim Leubner {
67934e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
67944e1bc9a0SAchim Leubner }
67954e1bc9a0SAchim Leubner
67964e1bc9a0SAchim Leubner discovery->ResetTriggerred = agFALSE;
67974e1bc9a0SAchim Leubner
67984e1bc9a0SAchim Leubner if (onePortContext->valid == agTRUE)
67994e1bc9a0SAchim Leubner {
68004e1bc9a0SAchim Leubner dmDiscover(dmRoot,
68014e1bc9a0SAchim Leubner onePortContext->dmPortContext,
68024e1bc9a0SAchim Leubner DM_DISCOVERY_OPTION_INCREMENTAL_START
68034e1bc9a0SAchim Leubner );
68044e1bc9a0SAchim Leubner }
68054e1bc9a0SAchim Leubner return;
68064e1bc9a0SAchim Leubner }
68074e1bc9a0SAchim Leubner
68084e1bc9a0SAchim Leubner /* discovery related SMP timers */
68094e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoverySMPTimer(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,bit32 functionCode,dmSMPRequestBody_t * dmSMPRequestBody)68104e1bc9a0SAchim Leubner dmDiscoverySMPTimer(dmRoot_t *dmRoot,
68114e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
68124e1bc9a0SAchim Leubner bit32 functionCode,
68134e1bc9a0SAchim Leubner dmSMPRequestBody_t *dmSMPRequestBody
68144e1bc9a0SAchim Leubner )
68154e1bc9a0SAchim Leubner {
68164e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
68174e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
68184e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
68194e1bc9a0SAchim Leubner
68204e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverySMPTimer: start\n"));
68214e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverySMPTimer: pid %d SMPFn 0x%x\n", onePortContext->id, functionCode));
68224e1bc9a0SAchim Leubner
68234e1bc9a0SAchim Leubner /* start the SMP timer which works as SMP application timer */
68244e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
68254e1bc9a0SAchim Leubner
68264e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
68274e1bc9a0SAchim Leubner if (discovery->DiscoverySMPTimer.timerRunning == agTRUE)
68284e1bc9a0SAchim Leubner {
68294e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
68304e1bc9a0SAchim Leubner dmKillTimer(
68314e1bc9a0SAchim Leubner dmRoot,
68324e1bc9a0SAchim Leubner &discovery->DiscoverySMPTimer
68334e1bc9a0SAchim Leubner );
68344e1bc9a0SAchim Leubner }
68354e1bc9a0SAchim Leubner else
68364e1bc9a0SAchim Leubner {
68374e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
68384e1bc9a0SAchim Leubner }
68394e1bc9a0SAchim Leubner
68404e1bc9a0SAchim Leubner
68414e1bc9a0SAchim Leubner dmSetTimerRequest(
68424e1bc9a0SAchim Leubner dmRoot,
68434e1bc9a0SAchim Leubner &discovery->DiscoverySMPTimer,
68444e1bc9a0SAchim Leubner SMP_TIMER_VALUE/dmAllShared->usecsPerTick,
68454e1bc9a0SAchim Leubner dmDiscoverySMPTimerCB,
68464e1bc9a0SAchim Leubner onePortContext,
68474e1bc9a0SAchim Leubner dmSMPRequestBody,
68484e1bc9a0SAchim Leubner agNULL
68494e1bc9a0SAchim Leubner );
68504e1bc9a0SAchim Leubner
68514e1bc9a0SAchim Leubner dmAddTimer (
68524e1bc9a0SAchim Leubner dmRoot,
68534e1bc9a0SAchim Leubner &dmAllShared->timerlist,
68544e1bc9a0SAchim Leubner &discovery->DiscoverySMPTimer
68554e1bc9a0SAchim Leubner );
68564e1bc9a0SAchim Leubner
68574e1bc9a0SAchim Leubner return;
68584e1bc9a0SAchim Leubner }
68594e1bc9a0SAchim Leubner
68604e1bc9a0SAchim Leubner
68614e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoverySMPTimerCB(dmRoot_t * dmRoot,void * timerData1,void * timerData2,void * timerData3)68624e1bc9a0SAchim Leubner dmDiscoverySMPTimerCB(
68634e1bc9a0SAchim Leubner dmRoot_t * dmRoot,
68644e1bc9a0SAchim Leubner void * timerData1,
68654e1bc9a0SAchim Leubner void * timerData2,
68664e1bc9a0SAchim Leubner void * timerData3
68674e1bc9a0SAchim Leubner )
68684e1bc9a0SAchim Leubner {
68694e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
68704e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext;
68714e1bc9a0SAchim Leubner bit8 SMPFunction;
68724e1bc9a0SAchim Leubner #ifndef DIRECT_SMP
68734e1bc9a0SAchim Leubner dmSMPFrameHeader_t *dmSMPFrameHeader;
68744e1bc9a0SAchim Leubner bit8 smpHeader[4];
68754e1bc9a0SAchim Leubner #endif
68764e1bc9a0SAchim Leubner dmSMPRequestBody_t *dmSMPRequestBody;
68774e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
68784e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
68794e1bc9a0SAchim Leubner agsaIORequest_t *agAbortIORequest = agNULL;
68804e1bc9a0SAchim Leubner agsaIORequest_t *agToBeAbortIORequest = agNULL;
68814e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
68824e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
68834e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
68844e1bc9a0SAchim Leubner dmSMPRequestBody_t *dmAbortSMPRequestBody = agNULL;
68854e1bc9a0SAchim Leubner dmList_t *SMPList;
68864e1bc9a0SAchim Leubner
68874e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: start!!!\n"));
68884e1bc9a0SAchim Leubner
68894e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)timerData1;
68904e1bc9a0SAchim Leubner dmSMPRequestBody = (dmSMPRequestBody_t *)timerData2;
68914e1bc9a0SAchim Leubner
68924e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
68934e1bc9a0SAchim Leubner oneDeviceData = dmSMPRequestBody->dmDevice;
68944e1bc9a0SAchim Leubner agToBeAbortIORequest = &(dmSMPRequestBody->agIORequest);
68954e1bc9a0SAchim Leubner agRoot = dmAllShared->agRoot;
68964e1bc9a0SAchim Leubner
68974e1bc9a0SAchim Leubner #ifdef DIRECT_SMP
68984e1bc9a0SAchim Leubner SMPFunction = dmSMPRequestBody->smpPayload[1];
68994e1bc9a0SAchim Leubner #else
69004e1bc9a0SAchim Leubner saFrameReadBlock(agRoot, dmSMPRequestBody->IndirectSMP, 0, smpHeader, 4);
69014e1bc9a0SAchim Leubner dmSMPFrameHeader = (dmSMPFrameHeader_t *)smpHeader;
69024e1bc9a0SAchim Leubner SMPFunction = dmSMPFrameHeader->smpFunction;
69034e1bc9a0SAchim Leubner #endif
69044e1bc9a0SAchim Leubner
69054e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoverySMPTimerCB: SMP function 0x%x\n", SMPFunction));
69064e1bc9a0SAchim Leubner
69074e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
69084e1bc9a0SAchim Leubner if (discovery->DiscoverySMPTimer.timerRunning == agTRUE)
69094e1bc9a0SAchim Leubner {
69104e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
69114e1bc9a0SAchim Leubner dmKillTimer(
69124e1bc9a0SAchim Leubner dmRoot,
69134e1bc9a0SAchim Leubner &discovery->DiscoverySMPTimer
69144e1bc9a0SAchim Leubner );
69154e1bc9a0SAchim Leubner }
69164e1bc9a0SAchim Leubner else
69174e1bc9a0SAchim Leubner {
69184e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
69194e1bc9a0SAchim Leubner }
69204e1bc9a0SAchim Leubner
69214e1bc9a0SAchim Leubner //for debugging
69224e1bc9a0SAchim Leubner // saGetPendingPICI(agRoot);
69234e1bc9a0SAchim Leubner
69244e1bc9a0SAchim Leubner switch (SMPFunction)
69254e1bc9a0SAchim Leubner {
69264e1bc9a0SAchim Leubner case SMP_REPORT_GENERAL: /* fall through */
69274e1bc9a0SAchim Leubner case SMP_DISCOVER: /* fall through */
69284e1bc9a0SAchim Leubner case SMP_CONFIGURE_ROUTING_INFORMATION: /* fall through */
69294e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: failing discovery, SMP function 0x%x !!!\n", SMPFunction));
69304e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
69314e1bc9a0SAchim Leubner return; /* no more things to do */
69324e1bc9a0SAchim Leubner case SMP_REPORT_PHY_SATA:
69334e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: failing discovery, SMP function SMP_REPORT_PHY_SATA !!!\n"));
69344e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
69354e1bc9a0SAchim Leubner break;
69364e1bc9a0SAchim Leubner default:
69374e1bc9a0SAchim Leubner /* do nothing */
69384e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: Error, not allowed case!!!\n"));
69394e1bc9a0SAchim Leubner break;
69404e1bc9a0SAchim Leubner }
69414e1bc9a0SAchim Leubner
69424e1bc9a0SAchim Leubner if (oneDeviceData->registered == agTRUE && (oneDeviceData->valid == agTRUE || oneDeviceData->valid2 == agTRUE) )
69434e1bc9a0SAchim Leubner {
69444e1bc9a0SAchim Leubner /* call to saSMPAbort(one) */
69454e1bc9a0SAchim Leubner /* get an smp REQUEST from the free list */
69464e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_SMP_LOCK);
69474e1bc9a0SAchim Leubner if (DMLIST_EMPTY(&(dmAllShared->freeSMPList)))
69484e1bc9a0SAchim Leubner {
69494e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: no free SMP, can't abort SMP!!!\n"));
69504e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_SMP_LOCK);
69514e1bc9a0SAchim Leubner return;
69524e1bc9a0SAchim Leubner }
69534e1bc9a0SAchim Leubner else
69544e1bc9a0SAchim Leubner {
69554e1bc9a0SAchim Leubner DMLIST_DEQUEUE_FROM_HEAD(&SMPList, &(dmAllShared->freeSMPList));
69564e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_SMP_LOCK);
69574e1bc9a0SAchim Leubner dmAbortSMPRequestBody = DMLIST_OBJECT_BASE(dmSMPRequestBody_t, Link, SMPList);
69584e1bc9a0SAchim Leubner if (dmAbortSMPRequestBody == agNULL)
69594e1bc9a0SAchim Leubner {
69604e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: dmAbortSMPRequestBody is NULL!!!\n"));
69614e1bc9a0SAchim Leubner return;
69624e1bc9a0SAchim Leubner }
69634e1bc9a0SAchim Leubner DM_DBG5(("dmDiscoverySMPTimerCB: SMP id %d\n", dmAbortSMPRequestBody->id));
69644e1bc9a0SAchim Leubner }
69654e1bc9a0SAchim Leubner
69664e1bc9a0SAchim Leubner dmAbortSMPRequestBody->dmRoot = dmRoot;
69674e1bc9a0SAchim Leubner
69684e1bc9a0SAchim Leubner agAbortIORequest = &(dmAbortSMPRequestBody->agIORequest);
69694e1bc9a0SAchim Leubner agAbortIORequest->osData = (void *) dmAbortSMPRequestBody;
69704e1bc9a0SAchim Leubner agAbortIORequest->sdkData = agNULL; /* SALL takes care of this */
69714e1bc9a0SAchim Leubner
69724e1bc9a0SAchim Leubner oneExpander = oneDeviceData->dmExpander;
69734e1bc9a0SAchim Leubner
69744e1bc9a0SAchim Leubner DM_DBG1(("dmDiscoverySMPTimerCB: calling saSMPAbort!!!\n"));
69754e1bc9a0SAchim Leubner saSMPAbort(agRoot,
69764e1bc9a0SAchim Leubner agAbortIORequest,
69774e1bc9a0SAchim Leubner 0,
69784e1bc9a0SAchim Leubner oneExpander->agDevHandle,
69794e1bc9a0SAchim Leubner 0, /* abort one */
69804e1bc9a0SAchim Leubner agToBeAbortIORequest,
69814e1bc9a0SAchim Leubner dmSMPAbortCB
69824e1bc9a0SAchim Leubner );
69834e1bc9a0SAchim Leubner }
69844e1bc9a0SAchim Leubner return;
69854e1bc9a0SAchim Leubner }
69864e1bc9a0SAchim Leubner
69874e1bc9a0SAchim Leubner
69884e1bc9a0SAchim Leubner
69894e1bc9a0SAchim Leubner
69904e1bc9a0SAchim Leubner osGLOBAL void
dmSMPBusyTimer(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData,dmSMPRequestBody_t * dmSMPRequestBody)69914e1bc9a0SAchim Leubner dmSMPBusyTimer(dmRoot_t *dmRoot,
69924e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
69934e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData,
69944e1bc9a0SAchim Leubner dmSMPRequestBody_t *dmSMPRequestBody
69954e1bc9a0SAchim Leubner )
69964e1bc9a0SAchim Leubner {
69974e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
69984e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
69994e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
70004e1bc9a0SAchim Leubner
70014e1bc9a0SAchim Leubner DM_DBG3(("dmSMPBusyTimer: start\n"));
70024e1bc9a0SAchim Leubner DM_DBG3(("dmSMPBusyTimer: pid %d\n", onePortContext->id));
70034e1bc9a0SAchim Leubner
70044e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
70054e1bc9a0SAchim Leubner
70064e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
70074e1bc9a0SAchim Leubner if (discovery->SMPBusyTimer.timerRunning == agTRUE)
70084e1bc9a0SAchim Leubner {
70094e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
70104e1bc9a0SAchim Leubner dmKillTimer(
70114e1bc9a0SAchim Leubner dmRoot,
70124e1bc9a0SAchim Leubner &discovery->SMPBusyTimer
70134e1bc9a0SAchim Leubner );
70144e1bc9a0SAchim Leubner }
70154e1bc9a0SAchim Leubner else
70164e1bc9a0SAchim Leubner {
70174e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
70184e1bc9a0SAchim Leubner }
70194e1bc9a0SAchim Leubner
70204e1bc9a0SAchim Leubner dmSetTimerRequest(
70214e1bc9a0SAchim Leubner dmRoot,
70224e1bc9a0SAchim Leubner &discovery->SMPBusyTimer,
70234e1bc9a0SAchim Leubner SMP_BUSY_TIMER_VALUE/dmAllShared->usecsPerTick,
70244e1bc9a0SAchim Leubner dmSMPBusyTimerCB,
70254e1bc9a0SAchim Leubner onePortContext,
70264e1bc9a0SAchim Leubner oneDeviceData,
70274e1bc9a0SAchim Leubner dmSMPRequestBody
70284e1bc9a0SAchim Leubner );
70294e1bc9a0SAchim Leubner
70304e1bc9a0SAchim Leubner dmAddTimer (
70314e1bc9a0SAchim Leubner dmRoot,
70324e1bc9a0SAchim Leubner &dmAllShared->timerlist,
70334e1bc9a0SAchim Leubner &discovery->SMPBusyTimer
70344e1bc9a0SAchim Leubner );
70354e1bc9a0SAchim Leubner
70364e1bc9a0SAchim Leubner
70374e1bc9a0SAchim Leubner return;
70384e1bc9a0SAchim Leubner }
70394e1bc9a0SAchim Leubner
70404e1bc9a0SAchim Leubner osGLOBAL void
dmSMPBusyTimerCB(dmRoot_t * dmRoot,void * timerData1,void * timerData2,void * timerData3)70414e1bc9a0SAchim Leubner dmSMPBusyTimerCB(
70424e1bc9a0SAchim Leubner dmRoot_t * dmRoot,
70434e1bc9a0SAchim Leubner void * timerData1,
70444e1bc9a0SAchim Leubner void * timerData2,
70454e1bc9a0SAchim Leubner void * timerData3
70464e1bc9a0SAchim Leubner )
70474e1bc9a0SAchim Leubner {
70484e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
70494e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
70504e1bc9a0SAchim Leubner agsaRoot_t *agRoot;
70514e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext;
70524e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData;
70534e1bc9a0SAchim Leubner dmSMPRequestBody_t *dmSMPRequestBody;
70544e1bc9a0SAchim Leubner agsaSASRequestBody_t *agSASRequestBody;
70554e1bc9a0SAchim Leubner agsaIORequest_t *agIORequest;
70564e1bc9a0SAchim Leubner agsaDevHandle_t *agDevHandle;
70574e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
70584e1bc9a0SAchim Leubner bit32 status = AGSA_RC_FAILURE;
70594e1bc9a0SAchim Leubner dmExpander_t *oneExpander = agNULL;
70604e1bc9a0SAchim Leubner
70614e1bc9a0SAchim Leubner
70624e1bc9a0SAchim Leubner DM_DBG3(("dmSMPBusyTimerCB: start\n"));
70634e1bc9a0SAchim Leubner
70644e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)timerData1;
70654e1bc9a0SAchim Leubner oneDeviceData = (dmDeviceData_t *)timerData2;
70664e1bc9a0SAchim Leubner dmSMPRequestBody = (dmSMPRequestBody_t *)timerData3;
70674e1bc9a0SAchim Leubner agRoot = dmAllShared->agRoot;
70684e1bc9a0SAchim Leubner agIORequest = &(dmSMPRequestBody->agIORequest);
70694e1bc9a0SAchim Leubner oneExpander = oneDeviceData->dmExpander;
70704e1bc9a0SAchim Leubner agDevHandle = oneExpander->agDevHandle;
70714e1bc9a0SAchim Leubner agSASRequestBody = &(dmSMPRequestBody->agSASRequestBody);
70724e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
70734e1bc9a0SAchim Leubner
70744e1bc9a0SAchim Leubner discovery->SMPRetries++;
70754e1bc9a0SAchim Leubner
70764e1bc9a0SAchim Leubner if (discovery->SMPRetries < SMP_BUSY_RETRIES)
70774e1bc9a0SAchim Leubner {
70784e1bc9a0SAchim Leubner status = saSMPStart(
70794e1bc9a0SAchim Leubner agRoot,
70804e1bc9a0SAchim Leubner agIORequest,
70814e1bc9a0SAchim Leubner 0,
70824e1bc9a0SAchim Leubner agDevHandle,
70834e1bc9a0SAchim Leubner AGSA_SMP_INIT_REQ,
70844e1bc9a0SAchim Leubner agSASRequestBody,
70854e1bc9a0SAchim Leubner &dmsaSMPCompleted
70864e1bc9a0SAchim Leubner );
70874e1bc9a0SAchim Leubner }
70884e1bc9a0SAchim Leubner
70894e1bc9a0SAchim Leubner if (status == AGSA_RC_SUCCESS)
70904e1bc9a0SAchim Leubner {
70914e1bc9a0SAchim Leubner discovery->SMPRetries = 0;
70924e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
70934e1bc9a0SAchim Leubner if (discovery->SMPBusyTimer.timerRunning == agTRUE)
70944e1bc9a0SAchim Leubner {
70954e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
70964e1bc9a0SAchim Leubner dmKillTimer(
70974e1bc9a0SAchim Leubner dmRoot,
70984e1bc9a0SAchim Leubner &discovery->SMPBusyTimer
70994e1bc9a0SAchim Leubner );
71004e1bc9a0SAchim Leubner }
71014e1bc9a0SAchim Leubner else
71024e1bc9a0SAchim Leubner {
71034e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71044e1bc9a0SAchim Leubner }
71054e1bc9a0SAchim Leubner }
71064e1bc9a0SAchim Leubner else if (status == AGSA_RC_FAILURE)
71074e1bc9a0SAchim Leubner {
71084e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
71094e1bc9a0SAchim Leubner if (discovery->SMPBusyTimer.timerRunning == agTRUE)
71104e1bc9a0SAchim Leubner {
71114e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71124e1bc9a0SAchim Leubner dmKillTimer(
71134e1bc9a0SAchim Leubner dmRoot,
71144e1bc9a0SAchim Leubner &discovery->SMPBusyTimer
71154e1bc9a0SAchim Leubner );
71164e1bc9a0SAchim Leubner }
71174e1bc9a0SAchim Leubner else
71184e1bc9a0SAchim Leubner {
71194e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71204e1bc9a0SAchim Leubner }
71214e1bc9a0SAchim Leubner
71224e1bc9a0SAchim Leubner discovery->SMPRetries = 0;
71234e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
71244e1bc9a0SAchim Leubner }
71254e1bc9a0SAchim Leubner else /* AGSA_RC_BUSY */
71264e1bc9a0SAchim Leubner {
71274e1bc9a0SAchim Leubner if (discovery->SMPRetries >= SMP_BUSY_RETRIES)
71284e1bc9a0SAchim Leubner {
71294e1bc9a0SAchim Leubner /* done with retris; give up */
71304e1bc9a0SAchim Leubner DM_DBG3(("dmSMPBusyTimerCB: retries are over\n"));
71314e1bc9a0SAchim Leubner
71324e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
71334e1bc9a0SAchim Leubner if (discovery->SMPBusyTimer.timerRunning == agTRUE)
71344e1bc9a0SAchim Leubner {
71354e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71364e1bc9a0SAchim Leubner dmKillTimer(
71374e1bc9a0SAchim Leubner dmRoot,
71384e1bc9a0SAchim Leubner &discovery->SMPBusyTimer
71394e1bc9a0SAchim Leubner );
71404e1bc9a0SAchim Leubner }
71414e1bc9a0SAchim Leubner else
71424e1bc9a0SAchim Leubner {
71434e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71444e1bc9a0SAchim Leubner }
71454e1bc9a0SAchim Leubner
71464e1bc9a0SAchim Leubner discovery->SMPRetries = 0;
71474e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
71484e1bc9a0SAchim Leubner
71494e1bc9a0SAchim Leubner }
71504e1bc9a0SAchim Leubner else
71514e1bc9a0SAchim Leubner {
71524e1bc9a0SAchim Leubner /* keep retrying */
71534e1bc9a0SAchim Leubner dmSMPBusyTimer(dmRoot, onePortContext, oneDeviceData, dmSMPRequestBody);
71544e1bc9a0SAchim Leubner }
71554e1bc9a0SAchim Leubner }
71564e1bc9a0SAchim Leubner
71574e1bc9a0SAchim Leubner return;
71584e1bc9a0SAchim Leubner }
71594e1bc9a0SAchim Leubner
71604e1bc9a0SAchim Leubner
71614e1bc9a0SAchim Leubner /* expander configuring timer */
71624e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryConfiguringTimer(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmDeviceData_t * oneDeviceData)71634e1bc9a0SAchim Leubner dmDiscoveryConfiguringTimer(dmRoot_t *dmRoot,
71644e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
71654e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData
71664e1bc9a0SAchim Leubner )
71674e1bc9a0SAchim Leubner {
71684e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
71694e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
71704e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
71714e1bc9a0SAchim Leubner
71724e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryConfiguringTimer: start\n"));
71734e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryConfiguringTimer: pid %d\n", onePortContext->id));
71744e1bc9a0SAchim Leubner
71754e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
71764e1bc9a0SAchim Leubner
71774e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
71784e1bc9a0SAchim Leubner if (discovery->discoveryTimer.timerRunning == agTRUE)
71794e1bc9a0SAchim Leubner {
71804e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71814e1bc9a0SAchim Leubner dmKillTimer(
71824e1bc9a0SAchim Leubner dmRoot,
71834e1bc9a0SAchim Leubner &discovery->discoveryTimer
71844e1bc9a0SAchim Leubner );
71854e1bc9a0SAchim Leubner }
71864e1bc9a0SAchim Leubner else
71874e1bc9a0SAchim Leubner {
71884e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
71894e1bc9a0SAchim Leubner }
71904e1bc9a0SAchim Leubner
71914e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryConfiguringTimer: UsecsPerTick %d\n", dmAllShared->usecsPerTick));
71924e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryConfiguringTimer: Timervalue %d\n", DISCOVERY_CONFIGURING_TIMER_VALUE/dmAllShared->usecsPerTick));
71934e1bc9a0SAchim Leubner
71944e1bc9a0SAchim Leubner dmSetTimerRequest(
71954e1bc9a0SAchim Leubner dmRoot,
71964e1bc9a0SAchim Leubner &discovery->discoveryTimer,
71974e1bc9a0SAchim Leubner DISCOVERY_CONFIGURING_TIMER_VALUE/dmAllShared->usecsPerTick,
71984e1bc9a0SAchim Leubner dmDiscoveryConfiguringTimerCB,
71994e1bc9a0SAchim Leubner onePortContext,
72004e1bc9a0SAchim Leubner oneDeviceData,
72014e1bc9a0SAchim Leubner agNULL
72024e1bc9a0SAchim Leubner );
72034e1bc9a0SAchim Leubner
72044e1bc9a0SAchim Leubner dmAddTimer (
72054e1bc9a0SAchim Leubner dmRoot,
72064e1bc9a0SAchim Leubner &dmAllShared->timerlist,
72074e1bc9a0SAchim Leubner &discovery->discoveryTimer
72084e1bc9a0SAchim Leubner );
72094e1bc9a0SAchim Leubner
72104e1bc9a0SAchim Leubner
72114e1bc9a0SAchim Leubner return;
72124e1bc9a0SAchim Leubner }
72134e1bc9a0SAchim Leubner
72144e1bc9a0SAchim Leubner
72154e1bc9a0SAchim Leubner osGLOBAL void
dmDiscoveryConfiguringTimerCB(dmRoot_t * dmRoot,void * timerData1,void * timerData2,void * timerData3)72164e1bc9a0SAchim Leubner dmDiscoveryConfiguringTimerCB(
72174e1bc9a0SAchim Leubner dmRoot_t * dmRoot,
72184e1bc9a0SAchim Leubner void * timerData1,
72194e1bc9a0SAchim Leubner void * timerData2,
72204e1bc9a0SAchim Leubner void * timerData3
72214e1bc9a0SAchim Leubner )
72224e1bc9a0SAchim Leubner {
72234e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext = agNULL;
72244e1bc9a0SAchim Leubner dmDiscovery_t *discovery = agNULL;
72254e1bc9a0SAchim Leubner dmDeviceData_t *oneDeviceData = agNULL;
72264e1bc9a0SAchim Leubner
72274e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)timerData1;
72284e1bc9a0SAchim Leubner oneDeviceData = (dmDeviceData_t *)timerData2;
72294e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
72304e1bc9a0SAchim Leubner
72314e1bc9a0SAchim Leubner DM_DBG3(("dmDiscoveryConfiguringTimerCB: start\n"));
72324e1bc9a0SAchim Leubner
72334e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
72344e1bc9a0SAchim Leubner if (discovery->discoveryTimer.timerRunning == agTRUE)
72354e1bc9a0SAchim Leubner {
72364e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
72374e1bc9a0SAchim Leubner dmKillTimer(
72384e1bc9a0SAchim Leubner dmRoot,
72394e1bc9a0SAchim Leubner &discovery->discoveryTimer
72404e1bc9a0SAchim Leubner );
72414e1bc9a0SAchim Leubner }
72424e1bc9a0SAchim Leubner else
72434e1bc9a0SAchim Leubner {
72444e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
72454e1bc9a0SAchim Leubner }
72464e1bc9a0SAchim Leubner
72474e1bc9a0SAchim Leubner if (oneDeviceData->valid == agTRUE || oneDeviceData->valid2 == agTRUE)
72484e1bc9a0SAchim Leubner {
72494e1bc9a0SAchim Leubner dmReportGeneralSend(dmRoot, oneDeviceData);
72504e1bc9a0SAchim Leubner }
72514e1bc9a0SAchim Leubner return;
72524e1bc9a0SAchim Leubner }
72534e1bc9a0SAchim Leubner
72544e1bc9a0SAchim Leubner osGLOBAL void
dmConfigureRouteTimer(dmRoot_t * dmRoot,dmIntPortContext_t * onePortContext,dmExpander_t * oneExpander,smpRespDiscover_t * pdmSMPDiscoverResp,smpRespDiscover2_t * pdmSMPDiscover2Resp)72554e1bc9a0SAchim Leubner dmConfigureRouteTimer(dmRoot_t *dmRoot,
72564e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext,
72574e1bc9a0SAchim Leubner dmExpander_t *oneExpander,
72584e1bc9a0SAchim Leubner smpRespDiscover_t *pdmSMPDiscoverResp,
72594e1bc9a0SAchim Leubner smpRespDiscover2_t *pdmSMPDiscover2Resp
72604e1bc9a0SAchim Leubner )
72614e1bc9a0SAchim Leubner {
72624e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
72634e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
72644e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
72654e1bc9a0SAchim Leubner
72664e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: start\n"));
72674e1bc9a0SAchim Leubner
72684e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: pid %d\n", onePortContext->id));
72694e1bc9a0SAchim Leubner
72704e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
72714e1bc9a0SAchim Leubner
72724e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: onePortContext %p oneExpander %p pdmSMPDiscoverResp %p\n", onePortContext, oneExpander, pdmSMPDiscoverResp));
72734e1bc9a0SAchim Leubner
72744e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: discovery %p \n", discovery));
72754e1bc9a0SAchim Leubner
72764e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: pid %d configureRouteRetries %d\n", onePortContext->id, discovery->configureRouteRetries));
72774e1bc9a0SAchim Leubner
72784e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: discovery->status %d\n", discovery->status));
72794e1bc9a0SAchim Leubner
72804e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
72814e1bc9a0SAchim Leubner if (discovery->configureRouteTimer.timerRunning == agTRUE)
72824e1bc9a0SAchim Leubner {
72834e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
72844e1bc9a0SAchim Leubner dmKillTimer(
72854e1bc9a0SAchim Leubner dmRoot,
72864e1bc9a0SAchim Leubner &discovery->configureRouteTimer
72874e1bc9a0SAchim Leubner );
72884e1bc9a0SAchim Leubner }
72894e1bc9a0SAchim Leubner else
72904e1bc9a0SAchim Leubner {
72914e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
72924e1bc9a0SAchim Leubner }
72934e1bc9a0SAchim Leubner
72944e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: UsecsPerTick %d\n", dmAllShared->usecsPerTick));
72954e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimer: Timervalue %d\n", CONFIGURE_ROUTE_TIMER_VALUE/dmAllShared->usecsPerTick));
72964e1bc9a0SAchim Leubner
72974e1bc9a0SAchim Leubner if (oneExpander->SAS2 == 0)
72984e1bc9a0SAchim Leubner {
72994e1bc9a0SAchim Leubner /* SAS 1.1 */
73004e1bc9a0SAchim Leubner dmSetTimerRequest(
73014e1bc9a0SAchim Leubner dmRoot,
73024e1bc9a0SAchim Leubner &discovery->configureRouteTimer,
73034e1bc9a0SAchim Leubner CONFIGURE_ROUTE_TIMER_VALUE/dmAllShared->usecsPerTick,
73044e1bc9a0SAchim Leubner dmConfigureRouteTimerCB,
73054e1bc9a0SAchim Leubner (void *)onePortContext,
73064e1bc9a0SAchim Leubner (void *)oneExpander,
73074e1bc9a0SAchim Leubner (void *)pdmSMPDiscoverResp
73084e1bc9a0SAchim Leubner );
73094e1bc9a0SAchim Leubner }
73104e1bc9a0SAchim Leubner else
73114e1bc9a0SAchim Leubner {
73124e1bc9a0SAchim Leubner /* SAS 2 */
73134e1bc9a0SAchim Leubner dmSetTimerRequest(
73144e1bc9a0SAchim Leubner dmRoot,
73154e1bc9a0SAchim Leubner &discovery->configureRouteTimer,
73164e1bc9a0SAchim Leubner CONFIGURE_ROUTE_TIMER_VALUE/dmAllShared->usecsPerTick,
73174e1bc9a0SAchim Leubner dmConfigureRouteTimerCB,
73184e1bc9a0SAchim Leubner (void *)onePortContext,
73194e1bc9a0SAchim Leubner (void *)oneExpander,
73204e1bc9a0SAchim Leubner (void *)pdmSMPDiscover2Resp
73214e1bc9a0SAchim Leubner );
73224e1bc9a0SAchim Leubner }
73234e1bc9a0SAchim Leubner dmAddTimer (
73244e1bc9a0SAchim Leubner dmRoot,
73254e1bc9a0SAchim Leubner &dmAllShared->timerlist,
73264e1bc9a0SAchim Leubner &discovery->configureRouteTimer
73274e1bc9a0SAchim Leubner );
73284e1bc9a0SAchim Leubner
73294e1bc9a0SAchim Leubner return;
73304e1bc9a0SAchim Leubner }
73314e1bc9a0SAchim Leubner
73324e1bc9a0SAchim Leubner
73334e1bc9a0SAchim Leubner osGLOBAL void
dmConfigureRouteTimerCB(dmRoot_t * dmRoot,void * timerData1,void * timerData2,void * timerData3)73344e1bc9a0SAchim Leubner dmConfigureRouteTimerCB(
73354e1bc9a0SAchim Leubner dmRoot_t * dmRoot,
73364e1bc9a0SAchim Leubner void * timerData1,
73374e1bc9a0SAchim Leubner void * timerData2,
73384e1bc9a0SAchim Leubner void * timerData3
73394e1bc9a0SAchim Leubner )
73404e1bc9a0SAchim Leubner {
73414e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
73424e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
73434e1bc9a0SAchim Leubner dmIntPortContext_t *onePortContext;
73444e1bc9a0SAchim Leubner dmExpander_t *oneExpander;
73454e1bc9a0SAchim Leubner smpRespDiscover_t *pdmSMPDiscoverResp = agNULL;
73464e1bc9a0SAchim Leubner smpRespDiscover2_t *pdmSMPDiscover2Resp = agNULL;
73474e1bc9a0SAchim Leubner dmDiscovery_t *discovery;
73484e1bc9a0SAchim Leubner
73494e1bc9a0SAchim Leubner
73504e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: start\n"));
73514e1bc9a0SAchim Leubner
73524e1bc9a0SAchim Leubner onePortContext = (dmIntPortContext_t *)timerData1;
73534e1bc9a0SAchim Leubner oneExpander = (dmExpander_t *)timerData2;
73544e1bc9a0SAchim Leubner if (oneExpander->SAS2 == 0)
73554e1bc9a0SAchim Leubner {
73564e1bc9a0SAchim Leubner pdmSMPDiscoverResp = (smpRespDiscover_t *)timerData3;
73574e1bc9a0SAchim Leubner }
73584e1bc9a0SAchim Leubner else
73594e1bc9a0SAchim Leubner {
73604e1bc9a0SAchim Leubner pdmSMPDiscover2Resp = (smpRespDiscover2_t *)timerData3;
73614e1bc9a0SAchim Leubner }
73624e1bc9a0SAchim Leubner discovery = &(onePortContext->discovery);
73634e1bc9a0SAchim Leubner
73644e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: onePortContext %p oneExpander %p pdmSMPDiscoverResp %p\n", onePortContext, oneExpander, pdmSMPDiscoverResp));
73654e1bc9a0SAchim Leubner
73664e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: discovery %p\n", discovery));
73674e1bc9a0SAchim Leubner
73684e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: pid %d configureRouteRetries %d\n", onePortContext->id, discovery->configureRouteRetries));
73694e1bc9a0SAchim Leubner
73704e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: discovery.status %d\n", discovery->status));
73714e1bc9a0SAchim Leubner
73724e1bc9a0SAchim Leubner discovery->configureRouteRetries++;
73734e1bc9a0SAchim Leubner if (discovery->configureRouteRetries >= dmAllShared->MaxRetryDiscovery)
73744e1bc9a0SAchim Leubner {
73754e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: retries are over\n"));
73764e1bc9a0SAchim Leubner
73774e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
73784e1bc9a0SAchim Leubner if (discovery->configureRouteTimer.timerRunning == agTRUE)
73794e1bc9a0SAchim Leubner {
73804e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
73814e1bc9a0SAchim Leubner dmKillTimer(
73824e1bc9a0SAchim Leubner dmRoot,
73834e1bc9a0SAchim Leubner &discovery->configureRouteTimer
73844e1bc9a0SAchim Leubner );
73854e1bc9a0SAchim Leubner }
73864e1bc9a0SAchim Leubner else
73874e1bc9a0SAchim Leubner {
73884e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
73894e1bc9a0SAchim Leubner }
73904e1bc9a0SAchim Leubner
73914e1bc9a0SAchim Leubner discovery->configureRouteRetries = 0;
73924e1bc9a0SAchim Leubner /* failed the discovery */
73934e1bc9a0SAchim Leubner dmDiscoverDone(dmRoot, onePortContext, DM_RC_FAILURE);
73944e1bc9a0SAchim Leubner
73954e1bc9a0SAchim Leubner return;
73964e1bc9a0SAchim Leubner }
73974e1bc9a0SAchim Leubner
73984e1bc9a0SAchim Leubner
73994e1bc9a0SAchim Leubner if (oneExpander->SAS2 == 0)
74004e1bc9a0SAchim Leubner {
74014e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
74024e1bc9a0SAchim Leubner {
74034e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: proceed by calling dmDownStreamDiscoverExpanderPhy\n"));
74044e1bc9a0SAchim Leubner dmhexdump("dmConfigureRouteTimerCB", (bit8*)pdmSMPDiscoverResp, sizeof(smpRespDiscover_t));
74054e1bc9a0SAchim Leubner discovery->configureRouteRetries = 0;
74064e1bc9a0SAchim Leubner
74074e1bc9a0SAchim Leubner dmDownStreamDiscoverExpanderPhy(dmRoot, onePortContext, oneExpander, pdmSMPDiscoverResp);
74084e1bc9a0SAchim Leubner }
74094e1bc9a0SAchim Leubner else
74104e1bc9a0SAchim Leubner {
74114e1bc9a0SAchim Leubner DM_DBG3(("dmConfigureRouteTimerCB: setting timer again\n"));
74124e1bc9a0SAchim Leubner /* set the timer again */
74134e1bc9a0SAchim Leubner dmSetTimerRequest(
74144e1bc9a0SAchim Leubner dmRoot,
74154e1bc9a0SAchim Leubner &discovery->configureRouteTimer,
74164e1bc9a0SAchim Leubner CONFIGURE_ROUTE_TIMER_VALUE/dmAllShared->usecsPerTick,
74174e1bc9a0SAchim Leubner dmConfigureRouteTimerCB,
74184e1bc9a0SAchim Leubner (void *)onePortContext,
74194e1bc9a0SAchim Leubner (void *)oneExpander,
74204e1bc9a0SAchim Leubner (void *)pdmSMPDiscoverResp
74214e1bc9a0SAchim Leubner );
74224e1bc9a0SAchim Leubner
74234e1bc9a0SAchim Leubner dmAddTimer (
74244e1bc9a0SAchim Leubner dmRoot,
74254e1bc9a0SAchim Leubner &dmAllShared->timerlist,
74264e1bc9a0SAchim Leubner &discovery->configureRouteTimer
74274e1bc9a0SAchim Leubner );
74284e1bc9a0SAchim Leubner }
74294e1bc9a0SAchim Leubner } /* SAS 1.1 */
74304e1bc9a0SAchim Leubner else
74314e1bc9a0SAchim Leubner {
74324e1bc9a0SAchim Leubner /* SAS 2 */
74334e1bc9a0SAchim Leubner if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
74344e1bc9a0SAchim Leubner {
74354e1bc9a0SAchim Leubner DM_DBG2(("dmConfigureRouteTimerCB: proceed by calling dmDownStreamDiscover2ExpanderPhy\n"));
74364e1bc9a0SAchim Leubner dmhexdump("dmConfigureRouteTimerCB", (bit8*)pdmSMPDiscover2Resp, sizeof(smpRespDiscover2_t));
74374e1bc9a0SAchim Leubner
74384e1bc9a0SAchim Leubner dmDownStreamDiscover2ExpanderPhy(dmRoot, onePortContext, oneExpander, pdmSMPDiscover2Resp);
74394e1bc9a0SAchim Leubner }
74404e1bc9a0SAchim Leubner else
74414e1bc9a0SAchim Leubner {
74424e1bc9a0SAchim Leubner DM_DBG2(("dmConfigureRouteTimerCB: setting timer again\n"));
74434e1bc9a0SAchim Leubner /* set the timer again */
74444e1bc9a0SAchim Leubner dmSetTimerRequest(
74454e1bc9a0SAchim Leubner dmRoot,
74464e1bc9a0SAchim Leubner &discovery->configureRouteTimer,
74474e1bc9a0SAchim Leubner CONFIGURE_ROUTE_TIMER_VALUE/dmAllShared->usecsPerTick,
74484e1bc9a0SAchim Leubner dmConfigureRouteTimerCB,
74494e1bc9a0SAchim Leubner (void *)onePortContext,
74504e1bc9a0SAchim Leubner (void *)oneExpander,
74514e1bc9a0SAchim Leubner (void *)pdmSMPDiscover2Resp
74524e1bc9a0SAchim Leubner );
74534e1bc9a0SAchim Leubner
74544e1bc9a0SAchim Leubner dmAddTimer (
74554e1bc9a0SAchim Leubner dmRoot,
74564e1bc9a0SAchim Leubner &dmAllShared->timerlist,
74574e1bc9a0SAchim Leubner &discovery->configureRouteTimer
74584e1bc9a0SAchim Leubner );
74594e1bc9a0SAchim Leubner }
74604e1bc9a0SAchim Leubner }
74614e1bc9a0SAchim Leubner
74624e1bc9a0SAchim Leubner return;
74634e1bc9a0SAchim Leubner }
74644e1bc9a0SAchim Leubner #endif /* FDS_ DM */
74654e1bc9a0SAchim Leubner
7466