tddmcmnapi.c revision 285809
1191762Simp/******************************************************************************* 2191762Simp*Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3191762Simp* 4191762Simp*Redistribution and use in source and binary forms, with or without modification, are permitted provided 5191762Simp*that the following conditions are met: 6191762Simp*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7191762Simp*following disclaimer. 8191762Simp*2. Redistributions in binary form must reproduce the above copyright notice, 9191762Simp*this list of conditions and the following disclaimer in the documentation and/or other materials provided 10191762Simp*with the distribution. 11191762Simp* 12191762Simp*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13191762Simp*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14191762Simp*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15191762Simp*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16191762Simp*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17191762Simp*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18191762Simp*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19191762Simp*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20191762Simp 21191762Simp********************************************************************************/ 22191762Simp#include <sys/cdefs.h> 23191762Simp__FBSDID("$FreeBSD$"); 24191762Simp#include <dev/pms/config.h> 25191762Simp 26191762Simp#include <dev/pms/freebsd/driver/common/osenv.h> 27191762Simp#include <dev/pms/freebsd/driver/common/ostypes.h> 28191762Simp#include <dev/pms/freebsd/driver/common/osdebug.h> 29191762Simp 30191762Simp#include <dev/pms/RefTisa/tisa/api/titypes.h> 31191762Simp#include <dev/pms/RefTisa/tisa/api/ostiapi.h> 32191762Simp#include <dev/pms/RefTisa/tisa/api/tiapi.h> 33191762Simp/* for TIDEBUG_MSG */ 34191762Simp#include <dev/pms/RefTisa/tisa/api/tiglobal.h> 35191762Simp 36191762Simp#ifdef FDS_DM 37191762Simp 38191762Simp#include <dev/pms/RefTisa/discovery/api/dm.h> 39191762Simp#include <dev/pms/RefTisa/discovery/api/dmapi.h> 40191762Simp#include <dev/pms/RefTisa/discovery/api/tddmapi.h> 41191762Simp 42191762Simp#ifdef FDS_SM 43191762Simp#include <dev/pms/RefTisa/sat/api/sm.h> 44191762Simp#include <dev/pms/RefTisa/sat/api/smapi.h> 45191762Simp#endif 46191762Simp 47191762Simp#ifdef INITIATOR_DRIVER 48191762Simp#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h> 49191762Simp#endif 50191762Simp 51191762Simp#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h> 52191762Simp#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h> 53191762Simp#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h> 54191762Simp 55191762Simp#if defined(DM_DEBUG) 56191762Simpextern bit32 gDMDebugLevel; 57191762Simp#endif 58191762Simp 59191762SimposGLOBAL bit32 60191762SimptddmRotateQnumber( 61191762Simp dmRoot_t *dmRoot, 62191762Simp agsaDevHandle_t *agDevHandle 63191762Simp ) 64191762Simp{ 65191762Simp tdsaRoot_t *tdsaRoot; 66191762Simp tdsaContext_t *tdsaAllShared; 67191762Simp tiRoot_t *tiRoot; 68191762Simp tdsaDeviceData_t *oneDeviceData = agNULL; 69191762Simp TI_DBG1(("tddmRotateQnumber: start\n")); 70191762Simp if (agDevHandle == agNULL) 71191762Simp { 72191762Simp TI_DBG1(("tddmRotateQnumber: agDevHandle is NULL!!!\n")); 73191762Simp return 0; 74191762Simp } 75191762Simp oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData; 76191762Simp if (oneDeviceData == agNULL) 77191762Simp { 78191762Simp TI_DBG1(("tddmRotateQnumber: oneDeviceData is NULL!!!\n")); 79191762Simp return 0; 80191762Simp } 81191762Simp tdsaRoot = (tdsaRoot_t *)dmRoot->tdData; 82191762Simp if (tdsaRoot == agNULL) 83191762Simp { 84191762Simp TI_DBG1(("tddmRotateQnumber: tdsaRoot is NULL\n")); 85191762Simp return 0; 86191762Simp } 87191762Simp tdsaAllShared = &(tdsaRoot->tdsaAllShared); 88191762Simp if (tdsaAllShared == agNULL) 89191762Simp { 90191762Simp TI_DBG1(("tddmRotateQnumber: tdsaAllShared is NULL\n")); 91191762Simp return 0; 92191762Simp } 93191762Simp tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot; 94191762Simp if (tiRoot == agNULL) 95191762Simp { 96191762Simp TI_DBG1(("tddmRotateQnumber: tiRoot is NULL\n")); 97191762Simp return 0; 98191762Simp } 99191762Simp return tdsaRotateQnumber(tiRoot, oneDeviceData); 100191762Simp} 101191762SimposGLOBAL bit32 102191762SimptdsaFindLocalMCN( 103191762Simp tiRoot_t *tiRoot, 104191762Simp tdsaPortContext_t *onePortContext 105191762Simp ) 106191762Simp{ 107191762Simp bit32 i, localMCN = 0; 108191762Simp 109191762Simp TI_DBG2(("tdsaFindLocalMCN: start\n")); 110191762Simp 111191762Simp if (onePortContext->valid == agFALSE) 112191762Simp { 113191762Simp TI_DBG1(("tdsaFindLocalMCN: invalid portcontext id %d\n", onePortContext->id)); 114191762Simp return 0; 115191762Simp } 116191762Simp 117191762Simp for(i=0;i<TD_MAX_NUM_PHYS;i++) 118191762Simp { 119191762Simp if (onePortContext->PhyIDList[i] == agTRUE) 120191762Simp { 121191762Simp localMCN++; 122191762Simp } 123191762Simp } 124191762Simp 125191762Simp return localMCN; 126191762Simp} 127191762Simp 128191762Simp 129191762Simp/* 130191762Simp on success, 131191762Simp ostiInitiatorEvent( 132191762Simp tiRoot, 133191762Simp onePortContext->tiPortalContext, 134191762Simp agNULL, 135191762Simp tiIntrEventTypeDiscovery, 136191762Simp tiDiscOK, 137191762Simp agNULL 138191762Simp ); 139191762Simpelse 140191762Simp remove(de-register) all devices 141191762Simp ostiInitiatorEvent( 142191762Simp tiRoot, 143191762Simp onePortContext->tiPortalContext, 144191762Simp agNULL, 145191762Simp tiIntrEventTypeDiscovery, 146191762Simp tiDiscFailed, 147191762Simp agNULL 148191762Simp ); 149191762Simp 150191762Simp 151191762Simp dmRoot->tdData is tdsaRoot_t (just like current TD layer) 152191762Simp dmPortContext->tdData is tdsaPortContext_t 153191762Simp 154191762Simp*/ 155191762SimposGLOBAL void 156191762SimptddmDiscoverCB( 157191762Simp dmRoot_t *dmRoot, 158191762Simp dmPortContext_t *dmPortContext, 159191762Simp bit32 eventStatus 160191762Simp ) 161191762Simp{ 162191762Simp tdsaRoot_t *tdsaRoot; 163191762Simp tdsaContext_t *tdsaAllShared; 164191762Simp tiRoot_t *tiRoot; 165191762Simp tdsaPortContext_t *onePortContext; 166191762Simp agsaRoot_t *agRoot; 167191762Simp agsaPortContext_t *agPortContext; 168191762Simp 169191762Simp TI_DBG1(("tddmDiscoverCB: start\n")); 170191762Simp tdsaRoot = (tdsaRoot_t *)dmRoot->tdData; 171191762Simp if (tdsaRoot == agNULL) 172191762Simp { 173191762Simp TI_DBG1(("tddmDiscoverCB: tdsaRoot is NULL\n")); 174191762Simp return; 175191762Simp } 176191762Simp 177191762Simp tdsaAllShared = &(tdsaRoot->tdsaAllShared); 178191762Simp if (tdsaAllShared == agNULL) 179191762Simp { 180191762Simp TI_DBG1(("tddmDiscoverCB: tdsaAllShared is NULL\n")); 181191762Simp return; 182191762Simp } 183191762Simp 184191762Simp tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot; 185191762Simp if (tiRoot == agNULL) 186191762Simp { 187191762Simp TI_DBG1(("tddmDiscoverCB: tiRoot is NULL\n")); 188191762Simp return; 189191762Simp } 190191762Simp 191191762Simp onePortContext = (tdsaPortContext_t *)dmPortContext->tdData; 192191762Simp if (onePortContext == agNULL) 193191762Simp { 194191762Simp TI_DBG1(("tddmDiscoverCB: onePortContext is NULL\n")); 195191762Simp return; 196191762Simp } 197191762Simp 198191762Simp TI_DBG2(("tddmDiscoverCB: localMCN 0x%x\n", tdsaFindLocalMCN(tiRoot, onePortContext))); 199191762Simp 200191762Simp if (eventStatus == dmDiscCompleted) 201191762Simp { 202191762Simp TI_DBG1(("tddmDiscoverCB: dmDiscCompleted\n")); 203191762Simp onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED; 204191762Simp onePortContext->DMDiscoveryState = dmDiscCompleted; 205191762Simp TI_DBG1(("tddmDiscoverCB: pid %d tiPortalContext %p\n", onePortContext->id, onePortContext->tiPortalContext)); 206191762Simp 207191762Simp /* update onePortContext->UpdateMCN = agFALSE */ 208191762Simp if ( onePortContext->UpdateMCN == agTRUE) 209191762Simp { 210191762Simp TI_DBG2(("tddmDiscoverCB: calling tdsaUpdateMCN\n")); 211191762Simp onePortContext->UpdateMCN = agFALSE; 212191762Simp tdsaUpdateMCN(dmRoot, onePortContext); 213191762Simp } 214191762Simp 215191762Simp ostiInitiatorEvent( 216191762Simp tiRoot, 217191762Simp onePortContext->tiPortalContext, 218191762Simp agNULL, 219191762Simp tiIntrEventTypeDiscovery, 220191762Simp tiDiscOK, 221191762Simp agNULL 222191762Simp ); 223191762Simp } 224191762Simp else if (eventStatus == dmDiscFailed ) 225191762Simp { 226191762Simp TI_DBG1(("tddmDiscoverCB: dmDiscFailed \n")); 227191762Simp onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED; 228191762Simp onePortContext->DMDiscoveryState = dmDiscFailed; 229191762Simp TI_DBG1(("tddmDiscoverCB: pid %d tiPortalContext %p\n", onePortContext->id, onePortContext->tiPortalContext)); 230191762Simp agRoot = &(tdsaAllShared->agRootNonInt); 231191762Simp if (agRoot == agNULL) 232191762Simp { 233191762Simp TI_DBG1(("tddmDiscoverCB: agRoot is NULL\n")); 234191762Simp return; 235191762Simp } 236191762Simp agPortContext = onePortContext->agPortContext; 237191762Simp if (agPortContext == agNULL) 238191762Simp { 239191762Simp TI_DBG1(("tddmDiscoverCB: agPortContext is NULL\n")); 240191762Simp return; 241191762Simp } 242191762Simp /* 243191762Simp invalidate all devices in this port 244191762Simp */ 245191762Simp tddmInvalidateDevicesInPort(tiRoot, onePortContext); 246191762Simp 247191762Simp saPortControl(agRoot, 248191762Simp agNULL, 249191762Simp 0, 250191762Simp agPortContext, 251191762Simp AGSA_PORT_IO_ABORT, 252191762Simp 0 /*quarantine */, 253191762Simp 0 /* unused */); 254191762Simp 255191762Simp 256191762Simp ostiInitiatorEvent( 257191762Simp tiRoot, 258191762Simp onePortContext->tiPortalContext, 259191762Simp agNULL, 260191762Simp tiIntrEventTypeDiscovery, 261191762Simp tiDiscFailed, 262191762Simp agNULL 263191762Simp ); 264191762Simp } 265191762Simp else if (eventStatus == dmDiscAborted ) 266191762Simp { 267191762Simp TI_DBG1(("tddmDiscoverCB: dmDiscAborted \n")); 268191762Simp onePortContext->DMDiscoveryState = dmDiscAborted; 269191762Simp } 270191762Simp else if (eventStatus == dmDiscAbortFailed ) 271191762Simp { 272191762Simp TI_DBG1(("tddmDiscoverCB: dmDiscAbortFailed \n")); 273191762Simp onePortContext->DMDiscoveryState = dmDiscAbortFailed; 274191762Simp } 275191762Simp else if (eventStatus == dmDiscAbortInvalid ) 276191762Simp { 277191762Simp TI_DBG1(("tddmDiscoverCB: dmDiscAbortInvalid \n")); 278191762Simp onePortContext->DMDiscoveryState = dmDiscAbortInvalid; 279191762Simp } 280191762Simp else if (eventStatus == dmDiscAbortInProgress ) 281191762Simp { 282191762Simp TI_DBG1(("tddmDiscoverCB: dmDiscAbortInProgress \n")); 283191762Simp onePortContext->DMDiscoveryState = dmDiscAbortInProgress; 284191762Simp } 285191762Simp else 286191762Simp { 287191762Simp TI_DBG1(("tddmDiscoverCB: undefined eventStatus 0x%x\n", eventStatus)); 288191762Simp onePortContext->DMDiscoveryState = dmDiscFailed; 289191762Simp } 290191762Simp 291191762Simp return; 292191762Simp} 293191762Simp 294191762Simp 295191762SimposGLOBAL void 296191762SimptddmQueryDiscoveryCB( 297191762Simp dmRoot_t *dmRoot, 298191762Simp dmPortContext_t *dmPortContext, 299191762Simp bit32 discType, 300191762Simp bit32 discState 301191762Simp ) 302191762Simp{ 303191762Simp tdsaPortContext_t *onePortContext = agNULL; 304191762Simp 305191762Simp TI_DBG2(("tddmQueryDiscoveryCB: start\n")); 306191762Simp onePortContext = (tdsaPortContext_t *)dmPortContext->tdData; 307191762Simp if (onePortContext == agNULL) 308191762Simp { 309191762Simp TI_DBG1(("tddmQueryDiscoveryCB: onePortContext is NULL\n")); 310191762Simp return; 311191762Simp } 312191762Simp TI_DBG2(("tddmQueryDiscoveryCB: discType %d discState %d\n", discType, discState)); 313191762Simp 314191762Simp onePortContext->DMDiscoveryState = discState; 315191762Simp return; 316191762Simp} 317191762Simp 318191762SimposGLOBAL void 319191762SimptddmInvalidateDevicesInPort( 320191762Simp tiRoot_t *tiRoot, 321191762Simp tdsaPortContext_t *onePortContext 322191762Simp ) 323191762Simp{ 324191762Simp tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 325191762Simp tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 326191762Simp tdsaDeviceData_t *oneDeviceData = agNULL; 327191762Simp tdList_t *DeviceListList; 328191762Simp 329191762Simp TI_DBG1(("tddmInvalidateDevicesInPort: start\n")); 330191762Simp 331191762Simp /* find a device's existence */ 332191762Simp DeviceListList = tdsaAllShared->MainDeviceList.flink; 333191762Simp while (DeviceListList != &(tdsaAllShared->MainDeviceList)) 334191762Simp { 335191762Simp oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList); 336191762Simp if (oneDeviceData == agNULL) 337191762Simp { 338191762Simp TI_DBG1(("tddmInvalidateDevicesInPort: oneDeviceData is NULL!!!\n")); 339191762Simp return; 340191762Simp } 341191762Simp if ((oneDeviceData->registered == agTRUE) && 342191762Simp (oneDeviceData->tdPortContext == onePortContext) 343191762Simp ) 344191762Simp { 345191762Simp 346191762Simp TI_DBG3(("tddmInvalidateDevicesInPort: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id)); 347191762Simp if (oneDeviceData->SASAddressID.sasAddressHi == onePortContext->sasRemoteAddressHi && 348191762Simp oneDeviceData->SASAddressID.sasAddressLo == onePortContext->sasRemoteAddressLo 349191762Simp ) 350191762Simp { 351191762Simp TI_DBG1(("tddmInvalidateDevicesInPort: keeping\n")); 352191762Simp oneDeviceData->valid = agTRUE; 353191762Simp oneDeviceData->valid2 = agFALSE; 354191762Simp } 355191762Simp else if (oneDeviceData->valid == agTRUE) 356191762Simp { 357191762Simp oneDeviceData->valid = agFALSE; 358191762Simp oneDeviceData->valid2 = agFALSE; 359191762Simp oneDeviceData->registered = agFALSE; 360191762Simp } 361191762Simp } 362191762Simp DeviceListList = DeviceListList->flink; 363191762Simp } 364191762Simp 365191762Simp TI_DBG3(("tddmInvalidateDevicesInPort: end\n")); 366191762Simp 367191762Simp return; 368191762Simp} 369191762Simp 370191762SimposGLOBAL bit32 371191762SimptddmNewSASorNot( 372191762Simp tiRoot_t *tiRoot, 373191762Simp tdsaPortContext_t *onePortContext, 374191762Simp tdsaSASSubID_t *agSASSubID 375191762Simp ) 376191762Simp{ 377191762Simp tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 378191762Simp tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 379191762Simp tdsaDeviceData_t *oneDeviceData = agNULL; 380191762Simp tdList_t *DeviceListList; 381191762Simp bit32 ret = agTRUE; 382191762Simp 383191762Simp TI_DBG3(("tddmNewSASorNot: start\n")); 384191762Simp 385191762Simp /* find a device's existence */ 386191762Simp DeviceListList = tdsaAllShared->MainDeviceList.flink; 387191762Simp while (DeviceListList != &(tdsaAllShared->MainDeviceList)) 388191762Simp { 389191762Simp oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList); 390191762Simp if (oneDeviceData == agNULL) 391191762Simp { 392191762Simp TI_DBG1(("tddmNewSASorNot: oneDeviceData is NULL!!!\n")); 393191762Simp return agFALSE; 394191762Simp } 395191762Simp if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) && 396191762Simp (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) && 397191762Simp (oneDeviceData->registered == agTRUE) && 398191762Simp (oneDeviceData->tdPortContext == onePortContext) 399191762Simp ) 400191762Simp { 401191762Simp TI_DBG3(("tddmNewSASorNot: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id)); 402191762Simp ret = agFALSE; 403191762Simp break; 404191762Simp } 405191762Simp DeviceListList = DeviceListList->flink; 406191762Simp } 407191762Simp 408191762Simp 409191762Simp 410191762Simp TI_DBG3(("tddmNewSASorNot: end\n")); 411191762Simp 412191762Simp return ret; 413191762Simp} 414191762Simp 415191762SimposGLOBAL tdsaDeviceData_t * 416191762SimptddmPortSASDeviceFind( 417191762Simp tiRoot_t *tiRoot, 418191762Simp tdsaPortContext_t *onePortContext, 419191762Simp bit32 sasAddrLo, 420191762Simp bit32 sasAddrHi 421191762Simp ) 422191762Simp{ 423191762Simp tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 424191762Simp tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 425191762Simp tdsaDeviceData_t *oneDeviceData, *RetDeviceData=agNULL; 426191762Simp tdList_t *DeviceListList; 427191762Simp 428191762Simp TI_DBG2(("tddmPortSASDeviceFind: start\n")); 429191762Simp 430191762Simp TD_ASSERT((agNULL != tiRoot), ""); 431191762Simp TD_ASSERT((agNULL != onePortContext), ""); 432191762Simp 433191762Simp tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 434191762Simp 435191762Simp /* find a device's existence */ 436191762Simp DeviceListList = tdsaAllShared->MainDeviceList.flink; 437191762Simp while (DeviceListList != &(tdsaAllShared->MainDeviceList)) 438191762Simp { 439191762Simp oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList); 440191762Simp if (oneDeviceData == agNULL) 441191762Simp { 442191762Simp TI_DBG1(("tddmPortSASDeviceFind: oneDeviceData is NULL!!!\n")); 443191762Simp return agNULL; 444191762Simp } 445191762Simp if ((oneDeviceData->SASAddressID.sasAddressHi == sasAddrHi) && 446191762Simp (oneDeviceData->SASAddressID.sasAddressLo == sasAddrLo) && 447191762Simp (oneDeviceData->valid == agTRUE) && 448191762Simp (oneDeviceData->tdPortContext == onePortContext) 449191762Simp ) 450191762Simp { 451191762Simp TI_DBG2(("tddmPortSASDeviceFind: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id)); 452191762Simp TI_DBG2(("tddmPortSASDeviceFind: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi)); 453191762Simp TI_DBG2(("tddmPortSASDeviceFind: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo)); 454191762Simp RetDeviceData = oneDeviceData; 455191762Simp break; 456191762Simp } 457191762Simp DeviceListList = DeviceListList->flink; 458191762Simp } 459191762Simp 460191762Simp tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 461191762Simp 462191762Simp return RetDeviceData; 463191762Simp} 464191762Simp 465191762Simp/* not in use yet */ 466191762SimposGLOBAL tdsaDeviceData_t * 467191762SimptddmAddToSharedcontext( 468191762Simp agsaRoot_t *agRoot, 469191762Simp tdsaPortContext_t *onePortContext, 470191762Simp tdsaSASSubID_t *agSASSubID, 471191762Simp tdsaDeviceData_t *oneExpDeviceData, 472191762Simp bit8 phyID 473191762Simp ) 474191762Simp{ 475191762Simp tdsaDeviceData_t *oneDeviceData = agNULL; 476191762Simp tdList_t *DeviceListList; 477191762Simp tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 478191762Simp tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 479191762Simp tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 480191762Simp tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 481191762Simp bit32 new_device = agTRUE; 482191762Simp 483191762Simp TI_DBG1(("tddmAddToSharedcontext: start\n")); 484191762Simp 485191762Simp TI_DBG1(("tddmAddToSharedcontext: oneportContext ID %d\n", onePortContext->id)); 486191762Simp /* find a device's existence */ 487191762Simp DeviceListList = tdsaAllShared->MainDeviceList.flink; 488191762Simp while (DeviceListList != &(tdsaAllShared->MainDeviceList)) 489191762Simp { 490191762Simp oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList); 491191762Simp if (oneDeviceData == agNULL) 492191762Simp { 493191762Simp TI_DBG1(("tddmAddToSharedcontext: oneDeviceData is NULL!!!\n")); 494191762Simp return agNULL; 495191762Simp } 496191762Simp if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) && 497191762Simp (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) && 498191762Simp (oneDeviceData->tdPortContext == onePortContext) 499191762Simp ) 500191762Simp { 501191762Simp TI_DBG1(("tddmAddToSharedcontext: pid %dtddmAddToSharedcontext did %d\n", onePortContext->id, oneDeviceData->id)); 502191762Simp new_device = agFALSE; 503191762Simp break; 504191762Simp } 505191762Simp DeviceListList = DeviceListList->flink; 506191762Simp } 507191762Simp 508191762Simp /* new device */ 509191762Simp if (new_device == agTRUE) 510191762Simp { 511191762Simp TI_DBG1(("tddmAddToSharedcontext: new device\n")); 512191762Simp tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 513191762Simp if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList))) 514191762Simp { 515191762Simp tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 516191762Simp TI_DBG1(("tddmAddToSharedcontext: empty DeviceData FreeLink\n")); 517191762Simp return agNULL; 518191762Simp } 519191762Simp 520191762Simp TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList)); 521191762Simp tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 522191762Simp oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList); 523191762Simp 524191762Simp TI_DBG1(("tddmAddToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id)); 525191762Simp 526191762Simp onePortContext->Count++; 527191762Simp oneDeviceData->agRoot = agRoot; 528191762Simp /* saving sas address */ 529191762Simp oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo; 530191762Simp oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi; 531191762Simp oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp; 532191762Simp oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp; 533191762Simp oneDeviceData->tdPortContext = onePortContext; 534191762Simp /* handles both SAS target and STP-target, SATA-device */ 535191762Simp if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData)) 536191762Simp { 537191762Simp oneDeviceData->DeviceType = TD_SAS_DEVICE; 538191762Simp } 539191762Simp else 540191762Simp { 541191762Simp oneDeviceData->DeviceType = TD_SATA_DEVICE; 542191762Simp } 543191762Simp 544191762Simp oneDeviceData->ExpDevice = oneExpDeviceData; 545191762Simp /* set phyID only when it has initial value of 0xFF */ 546191762Simp if (oneDeviceData->phyID == 0xFF) 547191762Simp { 548191762Simp oneDeviceData->phyID = phyID; 549191762Simp } 550191762Simp 551191762Simp oneDeviceData->valid = agTRUE; 552191762Simp 553191762Simp /* add the devicedata to the portcontext */ 554191762Simp tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 555191762Simp TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList)); 556191762Simp tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 557191762Simp TI_DBG1(("tddmAddToSharedcontext: one case pid %d did %d \n", onePortContext->id, oneDeviceData->id)); 558191762Simp TI_DBG1(("tddmAddToSharedcontext: new case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID)); 559191762Simp } 560191762Simp else /* old device */ 561191762Simp { 562191762Simp TI_DBG1(("tddmAddToSharedcontext: old device\n")); 563191762Simp TI_DBG1(("tddmAddToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id)); 564191762Simp 565191762Simp oneDeviceData->agRoot = agRoot; 566191762Simp /* saving sas address */ 567191762Simp oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo; 568191762Simp oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi; 569191762Simp oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp; 570191762Simp oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp; 571191762Simp oneDeviceData->tdPortContext = onePortContext; 572191762Simp /* handles both SAS target and STP-target, SATA-device */ 573191762Simp if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData)) 574199198Sjhb { 575191762Simp oneDeviceData->DeviceType = TD_SAS_DEVICE; 576191762Simp } 577191762Simp else 578191762Simp { 579191762Simp oneDeviceData->DeviceType = TD_SATA_DEVICE; 580191762Simp } 581191762Simp 582191762Simp oneDeviceData->ExpDevice = oneExpDeviceData; 583191762Simp /* set phyID only when it has initial value of 0xFF */ 584191762Simp if (oneDeviceData->phyID == 0xFF) 585191762Simp { 586191762Simp oneDeviceData->phyID = phyID; 587191762Simp } 588191762Simp 589191762Simp oneDeviceData->valid = agTRUE; 590191762Simp TI_DBG1(("tddmAddToSharedcontext: old case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID)); 591191762Simp 592191762Simp } 593191762Simp return oneDeviceData; 594191762Simp 595191762Simp} 596191762Simp 597191762Simp 598191762Simp/* 599191762Simp calls saRegisterNewDevice() 600191762Simp in ossaDeviceRegistrationCB(), if an expander, register to DM 601191762Simp#define DEVICE_IS_SMP_TARGET(DeviceData) \ 602191762Simp (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT) 603191762Simp*/ 604191762SimposGLOBAL tdsaDeviceData_t * 605191762SimptddmPortDeviceAdd( 606191762Simp tiRoot_t *tiRoot, 607191762Simp tdsaPortContext_t *onePortContext, 608191762Simp dmDeviceInfo_t *dmDeviceInfo, 609191762Simp tdsaDeviceData_t *oneExpDeviceData 610191762Simp ) 611191762Simp{ 612191762Simp tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 613191762Simp tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 614191762Simp tdsaDeviceData_t *oneDeviceData = agNULL; 615191762Simp tdsaSASSubID_t agSASSubID; 616191762Simp bit8 phyID; 617191762Simp 618191762Simp TI_DBG2(("tddmPortDeviceAdd: start\n")); 619191762Simp 620191762Simp 621191762Simp agSASSubID.sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi); 622191762Simp agSASSubID.sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo); 623191762Simp agSASSubID.initiator_ssp_stp_smp = dmDeviceInfo->initiator_ssp_stp_smp; 624191762Simp agSASSubID.target_ssp_stp_smp = dmDeviceInfo->target_ssp_stp_smp; 625191762Simp phyID = (dmDeviceInfo->ext) & 0xFF; 626191762Simp 627191762Simp /* old device and already registered to LL; added by link-up event */ 628191762Simp if ( agFALSE == tdssNewSASorNot( 629191762Simp onePortContext->agRoot, 630191762Simp onePortContext, 631191762Simp &agSASSubID 632191762Simp ) 633191762Simp ) 634191762Simp { 635191762Simp /* old device and already registered to LL; added by link-up event */ 636191762Simp TI_DBG2(("tddmPortDeviceAdd: OLD qqqq initiator_ssp_stp_smp %d target_ssp_stp_smp %d\n", agSASSubID.initiator_ssp_stp_smp, agSASSubID.target_ssp_stp_smp)); 637191762Simp /* find the old device */ 638191762Simp oneDeviceData = tdssNewAddSASToSharedcontext( 639191762Simp onePortContext->agRoot, 640191762Simp onePortContext, 641191762Simp &agSASSubID, 642191762Simp oneExpDeviceData, 643191762Simp phyID 644191762Simp ); 645191762Simp 646191762Simp if (oneDeviceData == agNULL) 647191762Simp { 648191762Simp TI_DBG1(("tddmPortDeviceAdd: no more device!!! oneDeviceData is null\n")); 649191762Simp } 650191762Simp 651191762Simp /* If a device is allocated */ 652191762Simp if ( oneDeviceData != agNULL ) 653191762Simp { 654191762Simp 655191762Simp TI_DBG2(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi)); 656191762Simp TI_DBG2(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo)); 657191762Simp TI_DBG2(("tddmPortDeviceAdd: phyID 0x%x\n", phyID)); 658191762Simp 659191762Simp /* copy dmDeviceInfo to oneDeviceData->agDeviceInfo except ext field */ 660191762Simp oneDeviceData->agDeviceInfo.smpTimeout = dmDeviceInfo->smpTimeout; 661191762Simp oneDeviceData->agDeviceInfo.it_NexusTimeout = dmDeviceInfo->it_NexusTimeout; 662191762Simp oneDeviceData->agDeviceInfo.firstBurstSize = dmDeviceInfo->firstBurstSize; 663191762Simp oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate; 664191762Simp osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressHi), &(dmDeviceInfo->sasAddressHi), 4); 665191762Simp osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressLo), &(dmDeviceInfo->sasAddressLo), 4); 666191762Simp if (dmDeviceInfo->sataDeviceType == SATA_ATAPI_DEVICE) 667191762Simp { 668191762Simp oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; 669191762Simp } 670191762Simp 671191762Simp oneDeviceData->satDevData.satDeviceType = dmDeviceInfo->sataDeviceType; 672191762Simp 673191762Simp 674191762Simp 675191762Simp oneDeviceData->agContext.osData = oneDeviceData; 676191762Simp oneDeviceData->agContext.sdkData = agNULL; 677191762Simp 678191762Simp } 679191762Simp return oneDeviceData; 680191762Simp } /* old device */ 681191762Simp 682191762Simp /* new device */ 683191762Simp 684191762Simp TI_DBG2(("tddmPortDeviceAdd: NEW qqqq initiator_ssp_stp_smp %d target_ssp_stp_smp %d\n", agSASSubID.initiator_ssp_stp_smp, agSASSubID.target_ssp_stp_smp)); 685191762Simp 686191762Simp /* allocate a new device and set the valid bit */ 687191762Simp oneDeviceData = tdssNewAddSASToSharedcontext( 688191762Simp onePortContext->agRoot, 689191762Simp onePortContext, 690191762Simp &agSASSubID, 691191762Simp oneExpDeviceData, 692191762Simp phyID 693191762Simp ); 694191762Simp 695191762Simp if (oneDeviceData == agNULL) 696191762Simp { 697191762Simp TI_DBG1(("tddmPortDeviceAdd: no more device!!! oneDeviceData is null\n")); 698191762Simp } 699191762Simp 700191762Simp /* If a device is allocated */ 701191762Simp if ( oneDeviceData != agNULL ) 702191762Simp { 703191762Simp 704 TI_DBG2(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi)); 705 TI_DBG2(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo)); 706 TI_DBG2(("tddmPortDeviceAdd: phyID 0x%x\n", phyID)); 707 708 /* copy dmDeviceInfo to oneDeviceData->agDeviceInfo except ext field */ 709 oneDeviceData->agDeviceInfo.smpTimeout = dmDeviceInfo->smpTimeout; 710 oneDeviceData->agDeviceInfo.it_NexusTimeout = dmDeviceInfo->it_NexusTimeout; 711 oneDeviceData->agDeviceInfo.firstBurstSize = dmDeviceInfo->firstBurstSize; 712 oneDeviceData->agDeviceInfo.devType_S_Rate = dmDeviceInfo->devType_S_Rate; 713 osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressHi), &(dmDeviceInfo->sasAddressHi), 4); 714 osti_memcpy(&(oneDeviceData->agDeviceInfo.sasAddressLo), &(dmDeviceInfo->sasAddressLo), 4); 715 716 oneDeviceData->satDevData.satDeviceType = dmDeviceInfo->sataDeviceType; 717 if (dmDeviceInfo->sataDeviceType == SATA_ATAPI_DEVICE) 718 { 719 oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; 720 } 721 722 oneDeviceData->agContext.osData = oneDeviceData; 723 oneDeviceData->agContext.sdkData = agNULL; 724 725 TI_DBG2(("tddmPortDeviceAdd: did %d\n", oneDeviceData->id)); 726 727 /* don't add and register initiator for T2D */ 728 if ( (((oneDeviceData->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) && 729 ((oneDeviceData->target_ssp_stp_smp & DEVICE_SSP_BIT) != DEVICE_SSP_BIT)) 730 || 731 (((oneDeviceData->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) && 732 ((oneDeviceData->target_ssp_stp_smp & DEVICE_SSP_BIT) != DEVICE_SSP_BIT)) 733 ) 734 { 735 TI_DBG1(("tddmPortDeviceAdd: initiator. no add and registration\n")); 736 TI_DBG1(("tddmPortDeviceAdd: sasAddressHi 0x%08x\n", agSASSubID.sasAddressHi)); 737 TI_DBG1(("tddmPortDeviceAdd: sasAddressLo 0x%08x\n", agSASSubID.sasAddressLo)); 738 739 } 740 else 741 { 742 if (oneDeviceData->registered == agFALSE) 743 { 744#ifdef REMOVED 745 //temp; setting MCN to tdsaAllShared->MCN 746 oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16); 747 //end temp 748#endif 749 if( tdsaAllShared->sflag ) 750 { 751 if( ! DEVICE_IS_SMP_TARGET(oneDeviceData)) 752 { 753 TI_DBG1(("tddmPortDeviceAdd: saRegisterNewDevice sflag %d\n", tdsaAllShared->sflag)); 754 oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | TD_XFER_RDY_PRIORTY_DEVICE_FLAG; 755 } 756 } 757 saRegisterNewDevice( /* tddmPortDeviceAdd */ 758 onePortContext->agRoot, 759 &oneDeviceData->agContext, 760 0, 761 &oneDeviceData->agDeviceInfo, 762 onePortContext->agPortContext, 763 0 764 ); 765 } 766 } 767 } 768 769 return oneDeviceData; 770} 771 772 773/* 774 each call, add the device to the device list 775 typedef struct{ 776 bit16 smpTimeout; 777 bit16 it_NexusTimeout; 778 bit16 firstBurstSize; 779 bit8 flag; 780 bit8 devType_S_Rate; 781 bit8 sasAddressHi[4]; 782 bit8 sasAddressLo[4]; 783} dmDeviceInfo_t; 784 785 find oneExpDeviceData (expander device data) from dmExpDeviceInfo and 786 pass it to tddmPortDeviceAdd() 787 start here - change spec from bit32 to void 788 789 phyID = ((dmDeviceInfo->flag) & 0xFC) >> 2; 790 Initiators are not registered 791*/ 792//start here 793osGLOBAL void 794tddmReportDevice( 795 dmRoot_t *dmRoot, 796 dmPortContext_t *dmPortContext, 797 dmDeviceInfo_t *dmDeviceInfo, /* device */ 798 dmDeviceInfo_t *dmExpDeviceInfo, /* expander the device is attached to */ 799 bit32 flag 800 801 ) 802{ 803 agsaRoot_t *agRoot; 804 tdsaRoot_t *tdsaRoot; 805 tdsaContext_t *tdsaAllShared; 806 tiRoot_t *tiRoot; 807 tdsaDeviceData_t *oneExpDeviceData = agNULL; 808 bit32 sasAddressHi, sasAddressLo; 809 tdsaPortContext_t *onePortContext; 810 tdsaDeviceData_t *oneDeviceData = agNULL; 811 bit32 localMCN = 0, finalMCN = 0; 812 bit32 devMCN = 1; 813 bit32 DLR = 0xA; 814 bit32 option; 815 bit32 param; 816 817#ifdef FDS_SM 818 smRoot_t *smRoot; 819#endif 820 821 TI_DBG2(("tddmReportDevice: start\n")); 822 tdsaRoot = (tdsaRoot_t *)dmRoot->tdData; 823 if (tdsaRoot == agNULL) 824 { 825 TI_DBG1(("tddmReportDevice: tdsaRoot is NULL\n")); 826 return; 827 } 828 829 tdsaAllShared = &(tdsaRoot->tdsaAllShared); 830 if (tdsaAllShared == agNULL) 831 { 832 TI_DBG1(("tddmReportDevice: tdsaAllShared is NULL\n")); 833 return; 834 } 835 836 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot; 837 if (tiRoot == agNULL) 838 { 839 TI_DBG1(("tddmReportDevice: tiRoot is NULL\n")); 840 return; 841 } 842 843 onePortContext = (tdsaPortContext_t *)dmPortContext->tdData; 844 if (onePortContext == agNULL) 845 { 846 TI_DBG1(("tddmReportDevice: onePortContext is NULL\n")); 847 return; 848 } 849 850#ifdef FDS_SM 851 smRoot = &(tdsaAllShared->smRoot); 852#endif 853 854 TI_DBG2(("tddmReportDevice: device addrHi 0x%08x addrLo 0x%08x\n", 855 TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo))); 856 857 if (dmExpDeviceInfo != agNULL) 858 { 859 TI_DBG2(("tddmReportDevice: attached expander addrHi 0x%08x addrLo 0x%08x\n", 860 TD_GET_SAS_ADDRESSHI(dmExpDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSLO(dmExpDeviceInfo->sasAddressLo))); 861 } 862 else 863 { 864 TI_DBG2(("tddmReportDevice: No attached expander\n")); 865 } 866 867 /* initiators only (e.g. SPC or SPCv) are discarded */ 868 if ( (dmDeviceInfo->target_ssp_stp_smp == 0) && 869 ( DEVICE_IS_SSP_INITIATOR(dmDeviceInfo) || DEVICE_IS_STP_INITIATOR(dmDeviceInfo) || DEVICE_IS_SMP_INITIATOR(dmDeviceInfo)) 870 ) 871 { 872 TI_DBG3(("tddmReportDevice: Initiators are not added\n")); 873 TI_DBG3(("tddmReportDevice: device addrHi 0x%08x addrLo 0x%08x\n", 874 TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi), TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressLo))); 875 return; 876 } 877 878 if (flag == dmDeviceArrival) 879 { 880 TI_DBG2(("tddmReportDevice: arrival\n")); 881 if (dmExpDeviceInfo != agNULL) 882 { 883 sasAddressHi = TD_GET_SAS_ADDRESSHI(dmExpDeviceInfo->sasAddressHi); 884 sasAddressLo = TD_GET_SAS_ADDRESSLO(dmExpDeviceInfo->sasAddressLo); 885 886 oneExpDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi); 887 } 888 889 tddmPortDeviceAdd(tiRoot, onePortContext, dmDeviceInfo, oneExpDeviceData); 890 891 } 892 else if (flag == dmDeviceRemoval) 893 { 894 TI_DBG2(("tddmReportDevice: removal\n")); 895 sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi); 896 sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo); 897 oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi); 898 if (oneDeviceData == agNULL) 899 { 900 TI_DBG2(("tddmReportDevice: oneDeviceData is NULL!!!\n")); 901 } 902 else 903 { 904 /* invalidate device */ 905 TI_DBG2(("tddmReportDevice: invalidating\n")); 906 TI_DBG2(("tddmReportDevice: agDevHandle %p\n", oneDeviceData->agDevHandle)); 907 if ( oneDeviceData->agDevHandle != agNULL) 908 { 909 TI_DBG2(("tddmReportDevice: agDevHandle->sdkData %p\n", oneDeviceData->agDevHandle->sdkData)); 910 } 911 else 912 { 913 TI_DBG2(("tddmReportDevice: agDevHandle->sdkData is NULL\n")); 914 } 915 oneDeviceData->valid = agFALSE; 916//to do; to be tested 917 agRoot = oneDeviceData->agRoot; 918 if ( (oneDeviceData->registered == agTRUE) && 919 ( DEVICE_IS_SSP_TARGET(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData) 920 || DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_SMP_TARGET(oneDeviceData) ) 921 ) 922 { 923 if ( !( DEVICE_IS_SMP_TARGET(oneDeviceData) && oneDeviceData->directlyAttached == agTRUE)) 924 { 925 tdsaAbortAll(tiRoot, agRoot, oneDeviceData); 926 oneDeviceData->registered = agFALSE; 927 } 928 else 929 { 930 TI_DBG2(("tddmReportDevice: keeping\n")); 931 oneDeviceData->registered = agTRUE; 932 } 933 } 934 else if (oneDeviceData->registered == agTRUE) 935 { 936 if ( oneDeviceData->agDevHandle == agNULL) 937 { 938 TI_DBG1(("tddmReportDevice: agDevHandle->sdkData is NULL. Error!!! \n")); 939 } 940 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 941 oneDeviceData->registered = agFALSE; 942 } 943//to do remove 944#ifdef FDS_SM_WRONG 945 if (DEVICE_IS_SATA_DEVICE(oneDeviceData)) 946 { 947 TI_DBG2(("tddmReportDevice: smDeregisterDevice\n")); 948 smDeregisterDevice(smRoot, agNULL, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle)); 949 oneDeviceData->satDevData.IDDeviceValid = agFALSE; 950 } 951#endif 952 } 953 } 954 else if (flag == dmDeviceNoChange) 955 { 956 TI_DBG2(("tddmReportDevice: no change; do nothing \n")); 957#ifdef FDS_SM 958 sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi); 959 sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo); 960 oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi); 961 if (oneDeviceData == agNULL) 962 { 963 TI_DBG2(("tddmReportDevice: oneDeviceData is NULL!!!\n")); 964 } 965 else 966 { 967 agRoot = oneDeviceData->agRoot; 968 if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData)) 969 && 970 oneDeviceData->satDevData.IDDeviceValid == agFALSE) 971 { 972 tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext); 973 } 974 } 975#endif 976 } 977 else if (flag == dmDeviceMCNChange) 978 { 979 TI_DBG2(("tddmReportDevice: dmDeviceMCNChange \n")); 980 localMCN = tdsaFindLocalMCN(tiRoot, onePortContext); 981 devMCN = DEVINFO_GET_EXT_MCN(dmDeviceInfo); 982 TI_DBG2(("tddmReportDevice: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN)); 983 984 sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi); 985 sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo); 986 oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi); 987 if (oneDeviceData == agNULL) 988 { 989 TI_DBG1(("tddmReportDevice: oneDeviceData is NULL!!!\n")); 990 } 991 else 992 { 993 agRoot = oneDeviceData->agRoot; 994 oneDeviceData->devMCN = devMCN; 995 TI_DBG2(("tddmReportDevice: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", sasAddressHi, sasAddressLo)); 996 if (oneDeviceData->directlyAttached == agTRUE) 997 { 998 finalMCN = localMCN; 999 TI_DBG2(("tddmReportDevice: directlyAttached, Final MCN 0x%08x\n", finalMCN)); 1000 } 1001 else 1002 { 1003 finalMCN = MIN(devMCN, localMCN); 1004 TI_DBG2(("tddmReportDevice: Not directlyAttached, Final MCN 0x%08x\n", finalMCN)); 1005 } 1006 if ( oneDeviceData->registered == agTRUE) 1007 { 1008 /* saSetDeviceInfo to change MCN, using finalMCN */ 1009 option = 8; /* setting only MCN 1000b */ 1010 param = finalMCN << 24; 1011 TI_DBG2(("tddmReportDevice: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN)); 1012 saSetDeviceInfo(agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB); 1013 } 1014 else 1015 { 1016 TI_DBG1(("tddmReportDevice: oneDeviceData is not yet registered !!!\n")); 1017 } 1018 oneDeviceData->finalMCN = finalMCN; 1019 } 1020 } 1021 else if (flag == dmDeviceRateChange) 1022 { 1023 TI_DBG1(("tddmReportDevice: dmDeviceRateChange \n")); 1024 sasAddressHi = TD_GET_SAS_ADDRESSHI(dmDeviceInfo->sasAddressHi); 1025 sasAddressLo = TD_GET_SAS_ADDRESSLO(dmDeviceInfo->sasAddressLo); 1026 oneDeviceData = tddmPortSASDeviceFind(tiRoot, onePortContext, sasAddressLo, sasAddressHi); 1027 if (oneDeviceData == agNULL) 1028 { 1029 TI_DBG1(("tddmReportDevice: oneDeviceData is NULL!!!\n")); 1030 } 1031 else 1032 { 1033 agRoot = oneDeviceData->agRoot; 1034 if ( oneDeviceData->registered == agTRUE) 1035 { 1036 option = 0x20; /* bit 5 */ 1037 DLR = DEVINFO_GET_LINKRATE(dmDeviceInfo); 1038 param = DLR << 28; 1039 TI_DBG1(("tddmReportDevice: option 0x%x param 0x%x DLR 0x%x\n", option, param, DLR)); 1040 saSetDeviceInfo(agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB); 1041 1042 } 1043 else 1044 { 1045 TI_DBG1(("tddmReportDevice: oneDeviceData is not yet registered !!!\n")); 1046 } 1047 1048 } 1049 } 1050 else 1051 { 1052 TI_DBG1(("tddmReportDevice: unknown flag 0x%x, wrong\n", flag)); 1053 } 1054 1055 return; 1056} 1057 1058osGLOBAL void 1059tdsaUpdateMCN( 1060 dmRoot_t *dmRoot, 1061 tdsaPortContext_t *onePortContext 1062 ) 1063{ 1064 tdsaRoot_t *tdsaRoot; 1065 tdsaContext_t *tdsaAllShared; 1066 tiRoot_t *tiRoot; 1067 tdsaDeviceData_t *oneDeviceData = agNULL; 1068 tdList_t *DeviceListList; 1069 bit32 localMCN = 0, finalMCN = 0; 1070 bit32 devMCN = 1; 1071 bit32 option; 1072 bit32 param; 1073 1074 TI_DBG3(("tdsaUpdateMCN: start\n")); 1075 tdsaRoot = (tdsaRoot_t *)dmRoot->tdData; 1076 if (tdsaRoot == agNULL) 1077 { 1078 TI_DBG1(("tdsaUpdateMCN: tdsaRoot is NULL\n")); 1079 return; 1080 } 1081 1082 tdsaAllShared = &(tdsaRoot->tdsaAllShared); 1083 if (tdsaAllShared == agNULL) 1084 { 1085 TI_DBG1(("tdsaUpdateMCN: tdsaAllShared is NULL\n")); 1086 return; 1087 } 1088 1089 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot; 1090 if (tiRoot == agNULL) 1091 { 1092 TI_DBG1(("tdsaUpdateMCN: tiRoot is NULL\n")); 1093 return; 1094 } 1095 1096 if (onePortContext->valid == agFALSE) 1097 { 1098 TI_DBG1(("tdsaUpdateMCN: onePortContext is invalid\n")); 1099 return; 1100 } 1101 1102 TI_DBG3(("tdsaUpdateMCN: pid %d\n", onePortContext->id)); 1103 1104 localMCN = tdsaFindLocalMCN(tiRoot, onePortContext); 1105 1106 if (TDLIST_EMPTY(&(tdsaAllShared->MainDeviceList))) 1107 { 1108 TI_DBG1(("tdsaUpdateMCN: empty device list\n")); 1109 return; 1110 } 1111 1112 /* update directly and behind expander device */ 1113 DeviceListList = tdsaAllShared->MainDeviceList.flink; 1114 while (DeviceListList != &(tdsaAllShared->MainDeviceList)) 1115 { 1116 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList); 1117 if (oneDeviceData == agNULL) 1118 { 1119 TI_DBG1(("tdsaUpdateMCN: oneDeviceData is NULL!!!\n")); 1120 return; 1121 } 1122 TI_DBG3(("tdsaUpdateMCN: loop did %d\n", oneDeviceData->id)); 1123 TI_DBG3(("tdsaUpdateMCN: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo)); 1124 devMCN = oneDeviceData->devMCN; 1125 if ( oneDeviceData->tdPortContext == onePortContext) 1126 { 1127 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && oneDeviceData->directlyAttached == agTRUE) 1128 { 1129 TI_DBG3(("tdsaUpdateMCN: found directly attached\n")); 1130 finalMCN = localMCN; 1131 TI_DBG3(("tdsaUpdateMCN: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN)); 1132 TI_DBG3(("tdsaUpdateMCN: finalMCN 0x%08x\n", finalMCN)); 1133 if (oneDeviceData->finalMCN != finalMCN) 1134 { 1135 /* saSetDeviceInfo using finalMCN */ 1136 option = 8; /* setting only MCN 1000b */ 1137 param = finalMCN << 24; 1138 TI_DBG3(("tdsaUpdateMCN: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN)); 1139 saSetDeviceInfo(oneDeviceData->agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB); 1140 oneDeviceData->finalMCN = finalMCN; 1141 } 1142 1143 } 1144 else if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && oneDeviceData->directlyAttached == agFALSE) 1145 { 1146 TI_DBG3(("tdsaUpdateMCN: found behind expander device\n")); 1147 finalMCN = MIN(localMCN, devMCN); 1148 TI_DBG3(("tdsaUpdateMCN: devMCN 0x%08x localMCN 0x%08x\n", devMCN, localMCN)); 1149 TI_DBG3(("tdsaUpdateMCN: finalMCN 0x%08x\n", finalMCN)); 1150 if (oneDeviceData->finalMCN != finalMCN) 1151 { 1152 /* saSetDeviceInfo using finalMCN */ 1153 option = 8; /* setting only MCN 1000b */ 1154 param = finalMCN << 24; 1155 TI_DBG3(("tdsaUpdateMCN: option 0x%x param 0x%x MCN 0x%x\n", option, param, finalMCN)); 1156 saSetDeviceInfo(oneDeviceData->agRoot, agNULL, 0, oneDeviceData->agDevHandle, option, param, ossaSetDeviceInfoCB); 1157 oneDeviceData->finalMCN = finalMCN; 1158 } 1159 1160 } 1161 DeviceListList = DeviceListList->flink; 1162 } 1163 else 1164 { 1165 if (oneDeviceData->tdPortContext != agNULL) 1166 { 1167 TI_DBG3(("tdsaUpdateMCN: different portcontext; oneDeviceData->tdPortContext pid %d oneportcontext pid %d\n", oneDeviceData->tdPortContext->id, onePortContext->id)); 1168 } 1169 else 1170 { 1171 TI_DBG3(("tdsaUpdateMCN: different portcontext; oneDeviceData->tdPortContext pid NULL oneportcontext pid %d\n", onePortContext->id)); 1172 } 1173 DeviceListList = DeviceListList->flink; 1174 } 1175 } /* while */ 1176 1177 return; 1178} 1179 1180osGLOBAL bit8 1181tddmSATADeviceTypeDecode(bit8 * pSignature) 1182{ 1183 return (bit8)tdssSATADeviceTypeDecode(pSignature); 1184} 1185 1186 1187osGLOBAL void 1188tddmSingleThreadedEnter( 1189 dmRoot_t *dmRoot, 1190 bit32 syncLockId 1191 ) 1192{ 1193 tdsaRoot_t *tdsaRoot; 1194 tdsaContext_t *tdsaAllShared; 1195 tiRoot_t *tiRoot; 1196 bit32 offset = 0; 1197 1198 TI_DBG7(("tddmSingleThreadedEnter: start\n")); 1199 1200 tdsaRoot = (tdsaRoot_t *)dmRoot->tdData; 1201 if (tdsaRoot == agNULL) 1202 { 1203 TI_DBG1(("tddmSingleThreadedEnter: tdsaRoot is NULL\n")); 1204 return; 1205 } 1206 1207 tdsaAllShared = &(tdsaRoot->tdsaAllShared); 1208 if (tdsaAllShared == agNULL) 1209 { 1210 TI_DBG1(("tddmSingleThreadedEnter: tdsaAllShared is NULL\n")); 1211 return; 1212 } 1213 1214 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot; 1215 if (tiRoot == agNULL) 1216 { 1217 TI_DBG1(("tddmSingleThreadedEnter: tiRoot is NULL\n")); 1218 return; 1219 } 1220 offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS; 1221 1222 ostiSingleThreadedEnter(tiRoot, syncLockId + offset); 1223 return; 1224} 1225 1226osGLOBAL void 1227tddmSingleThreadedLeave( 1228 dmRoot_t *dmRoot, 1229 bit32 syncLockId 1230 ) 1231{ 1232 tdsaRoot_t *tdsaRoot; 1233 tdsaContext_t *tdsaAllShared; 1234 tiRoot_t *tiRoot; 1235 bit32 offset = 0; 1236 1237 TI_DBG7(("tddmSingleThreadedLeave: start\n")); 1238 1239 tdsaRoot = (tdsaRoot_t *)dmRoot->tdData; 1240 if (tdsaRoot == agNULL) 1241 { 1242 TI_DBG1(("tddmSingleThreadedLeave: tdsaRoot is NULL\n")); 1243 return; 1244 } 1245 1246 tdsaAllShared = &(tdsaRoot->tdsaAllShared); 1247 if (tdsaAllShared == agNULL) 1248 { 1249 TI_DBG1(("tddmSingleThreadedLeave: tdsaAllShared is NULL\n")); 1250 return; 1251 } 1252 1253 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot; 1254 if (tiRoot == agNULL) 1255 { 1256 TI_DBG1(("tddmSingleThreadedLeave: tiRoot is NULL\n")); 1257 return; 1258 } 1259 offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS; 1260 1261 ostiSingleThreadedLeave(tiRoot, syncLockId + offset); 1262 1263 return; 1264} 1265 1266osGLOBAL bit32 tddmGetTransportParam( 1267 dmRoot_t *dmRoot, 1268 char *key, 1269 char *subkey1, 1270 char *subkey2, 1271 char *subkey3, 1272 char *subkey4, 1273 char *subkey5, 1274 char *valueName, 1275 char *buffer, 1276 bit32 bufferLen, 1277 bit32 *lenReceived 1278 ) 1279{ 1280 bit32 ret = tiError; 1281 1282 TI_DBG7(("tddmGetTransportParam: start\n")); 1283 ret = ostiGetTransportParam(agNULL, 1284 key, 1285 subkey1, 1286 subkey2, 1287 subkey3, 1288 subkey4, 1289 subkey5, 1290 valueName, 1291 buffer, 1292 bufferLen, 1293 lenReceived 1294 ); 1295 1296 return ret; 1297} 1298 1299#endif /* FDS_DM */ 1300 1301