1*f11c7f63SJim Harris /*- 2*f11c7f63SJim Harris * This file is provided under a dual BSD/GPLv2 license. When using or 3*f11c7f63SJim Harris * redistributing this file, you may do so under either license. 4*f11c7f63SJim Harris * 5*f11c7f63SJim Harris * GPL LICENSE SUMMARY 6*f11c7f63SJim Harris * 7*f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 8*f11c7f63SJim Harris * 9*f11c7f63SJim Harris * This program is free software; you can redistribute it and/or modify 10*f11c7f63SJim Harris * it under the terms of version 2 of the GNU General Public License as 11*f11c7f63SJim Harris * published by the Free Software Foundation. 12*f11c7f63SJim Harris * 13*f11c7f63SJim Harris * This program is distributed in the hope that it will be useful, but 14*f11c7f63SJim Harris * WITHOUT ANY WARRANTY; without even the implied warranty of 15*f11c7f63SJim Harris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*f11c7f63SJim Harris * General Public License for more details. 17*f11c7f63SJim Harris * 18*f11c7f63SJim Harris * You should have received a copy of the GNU General Public License 19*f11c7f63SJim Harris * along with this program; if not, write to the Free Software 20*f11c7f63SJim Harris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21*f11c7f63SJim Harris * The full GNU General Public License is included in this distribution 22*f11c7f63SJim Harris * in the file called LICENSE.GPL. 23*f11c7f63SJim Harris * 24*f11c7f63SJim Harris * BSD LICENSE 25*f11c7f63SJim Harris * 26*f11c7f63SJim Harris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 27*f11c7f63SJim Harris * All rights reserved. 28*f11c7f63SJim Harris * 29*f11c7f63SJim Harris * Redistribution and use in source and binary forms, with or without 30*f11c7f63SJim Harris * modification, are permitted provided that the following conditions 31*f11c7f63SJim Harris * are met: 32*f11c7f63SJim Harris * 33*f11c7f63SJim Harris * * Redistributions of source code must retain the above copyright 34*f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer. 35*f11c7f63SJim Harris * * Redistributions in binary form must reproduce the above copyright 36*f11c7f63SJim Harris * notice, this list of conditions and the following disclaimer in 37*f11c7f63SJim Harris * the documentation and/or other materials provided with the 38*f11c7f63SJim Harris * distribution. 39*f11c7f63SJim Harris * 40*f11c7f63SJim Harris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41*f11c7f63SJim Harris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42*f11c7f63SJim Harris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43*f11c7f63SJim Harris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44*f11c7f63SJim Harris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45*f11c7f63SJim Harris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46*f11c7f63SJim Harris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47*f11c7f63SJim Harris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48*f11c7f63SJim Harris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49*f11c7f63SJim Harris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50*f11c7f63SJim Harris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51*f11c7f63SJim Harris */ 52*f11c7f63SJim Harris 53*f11c7f63SJim Harris #include <sys/cdefs.h> 54*f11c7f63SJim Harris __FBSDID("$FreeBSD$"); 55*f11c7f63SJim Harris 56*f11c7f63SJim Harris /** 57*f11c7f63SJim Harris * @file 58*f11c7f63SJim Harris * 59*f11c7f63SJim Harris * @brief This file contains all of the method implementations for the 60*f11c7f63SJim Harris * SCIF_SAS_LIBRARY object. 61*f11c7f63SJim Harris */ 62*f11c7f63SJim Harris 63*f11c7f63SJim Harris 64*f11c7f63SJim Harris #include <dev/isci/scil/scic_library.h> 65*f11c7f63SJim Harris #include <dev/isci/scil/sci_pool.h> 66*f11c7f63SJim Harris 67*f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_library.h> 68*f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_logger.h> 69*f11c7f63SJim Harris #include <dev/isci/scil/scif_sas_controller.h> 70*f11c7f63SJim Harris 71*f11c7f63SJim Harris 72*f11c7f63SJim Harris /** 73*f11c7f63SJim Harris * This macro simply calculates the size of the framework library. This 74*f11c7f63SJim Harris * includes the memory for each controller object. 75*f11c7f63SJim Harris */ 76*f11c7f63SJim Harris #define SCIF_LIBRARY_SIZE(max_controllers) \ 77*f11c7f63SJim Harris ( \ 78*f11c7f63SJim Harris sizeof(SCIF_SAS_LIBRARY_T) + \ 79*f11c7f63SJim Harris (sizeof(SCIF_SAS_CONTROLLER_T) * (max_controllers)) \ 80*f11c7f63SJim Harris ) 81*f11c7f63SJim Harris 82*f11c7f63SJim Harris 83*f11c7f63SJim Harris //****************************************************************************** 84*f11c7f63SJim Harris //* P U B L I C M E T H O D S 85*f11c7f63SJim Harris //****************************************************************************** 86*f11c7f63SJim Harris 87*f11c7f63SJim Harris 88*f11c7f63SJim Harris U32 scif_library_get_object_size( 89*f11c7f63SJim Harris U8 max_controller_count 90*f11c7f63SJim Harris ) 91*f11c7f63SJim Harris { 92*f11c7f63SJim Harris return ( SCIF_LIBRARY_SIZE(max_controller_count) + 93*f11c7f63SJim Harris scic_library_get_object_size(max_controller_count) ); 94*f11c7f63SJim Harris } 95*f11c7f63SJim Harris 96*f11c7f63SJim Harris // --------------------------------------------------------------------------- 97*f11c7f63SJim Harris 98*f11c7f63SJim Harris SCI_LIBRARY_HANDLE_T scif_library_construct( 99*f11c7f63SJim Harris void * library_memory, 100*f11c7f63SJim Harris U8 max_controller_count 101*f11c7f63SJim Harris ) 102*f11c7f63SJim Harris { 103*f11c7f63SJim Harris SCI_STATUS status; 104*f11c7f63SJim Harris SCIF_SAS_LIBRARY_T * fw_library = (SCIF_SAS_LIBRARY_T *) library_memory; 105*f11c7f63SJim Harris 106*f11c7f63SJim Harris // Just clear out the memory of the structure to be safe. 107*f11c7f63SJim Harris memset(fw_library, 0, scif_library_get_object_size(max_controller_count)); 108*f11c7f63SJim Harris 109*f11c7f63SJim Harris // Invoke the parent object constructor. 110*f11c7f63SJim Harris SCI_BASE_LIBRARY_CONSTRUCT(fw_library, 111*f11c7f63SJim Harris &fw_library->parent, 112*f11c7f63SJim Harris max_controller_count, 113*f11c7f63SJim Harris struct SCIF_SAS_CONTROLLER, 114*f11c7f63SJim Harris status); 115*f11c7f63SJim Harris 116*f11c7f63SJim Harris // The memory for the framework controller objects start immediately 117*f11c7f63SJim Harris // after the library object. 118*f11c7f63SJim Harris fw_library->controllers = (SCIF_SAS_CONTROLLER_T*) 119*f11c7f63SJim Harris ((U8*)library_memory + sizeof(SCIF_SAS_LIBRARY_T)); 120*f11c7f63SJim Harris 121*f11c7f63SJim Harris // Construct the core library. 122*f11c7f63SJim Harris fw_library->core_object = scic_library_construct( 123*f11c7f63SJim Harris (U8 *)library_memory + 124*f11c7f63SJim Harris SCIF_LIBRARY_SIZE(max_controller_count), 125*f11c7f63SJim Harris max_controller_count 126*f11c7f63SJim Harris ); 127*f11c7f63SJim Harris 128*f11c7f63SJim Harris // Ensure construction completed successfully for the core. 129*f11c7f63SJim Harris if (fw_library->core_object != SCI_INVALID_HANDLE) 130*f11c7f63SJim Harris { 131*f11c7f63SJim Harris // Set the association in the core library to this framework library. 132*f11c7f63SJim Harris sci_object_set_association( 133*f11c7f63SJim Harris (SCI_OBJECT_HANDLE_T) fw_library->core_object, 134*f11c7f63SJim Harris (void *) fw_library 135*f11c7f63SJim Harris ); 136*f11c7f63SJim Harris 137*f11c7f63SJim Harris return fw_library; 138*f11c7f63SJim Harris } 139*f11c7f63SJim Harris 140*f11c7f63SJim Harris return SCI_INVALID_HANDLE; 141*f11c7f63SJim Harris } 142*f11c7f63SJim Harris 143*f11c7f63SJim Harris // --------------------------------------------------------------------------- 144*f11c7f63SJim Harris 145*f11c7f63SJim Harris SCI_STATUS scif_library_allocate_controller( 146*f11c7f63SJim Harris SCI_LIBRARY_HANDLE_T library, 147*f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T * new_controller 148*f11c7f63SJim Harris ) 149*f11c7f63SJim Harris { 150*f11c7f63SJim Harris SCI_STATUS status; 151*f11c7f63SJim Harris 152*f11c7f63SJim Harris // Ensure the user supplied a valid library handle. 153*f11c7f63SJim Harris if (library != SCI_INVALID_HANDLE) 154*f11c7f63SJim Harris { 155*f11c7f63SJim Harris SCIF_SAS_LIBRARY_T * fw_library = (SCIF_SAS_LIBRARY_T *) library; 156*f11c7f63SJim Harris 157*f11c7f63SJim Harris // Allocate the framework library. 158*f11c7f63SJim Harris SCI_BASE_LIBRARY_ALLOCATE_CONTROLLER(fw_library, new_controller, &status); 159*f11c7f63SJim Harris if (status == SCI_SUCCESS) 160*f11c7f63SJim Harris { 161*f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller; 162*f11c7f63SJim Harris 163*f11c7f63SJim Harris // Allocate the core controller and save the handle in the framework 164*f11c7f63SJim Harris // controller object. 165*f11c7f63SJim Harris fw_controller = (SCIF_SAS_CONTROLLER_T*) *new_controller; 166*f11c7f63SJim Harris 167*f11c7f63SJim Harris // Just clear out the memory of the structure to be safe. 168*f11c7f63SJim Harris memset(fw_controller, 0, sizeof(SCIF_SAS_CONTROLLER_T)); 169*f11c7f63SJim Harris 170*f11c7f63SJim Harris status = scic_library_allocate_controller( 171*f11c7f63SJim Harris fw_library->core_object, &(fw_controller->core_object) 172*f11c7f63SJim Harris ); 173*f11c7f63SJim Harris 174*f11c7f63SJim Harris // Free the framework controller if the core controller allocation 175*f11c7f63SJim Harris // failed. 176*f11c7f63SJim Harris if (status != SCI_SUCCESS) 177*f11c7f63SJim Harris scif_library_free_controller(library, fw_controller); 178*f11c7f63SJim Harris } 179*f11c7f63SJim Harris 180*f11c7f63SJim Harris if (status != SCI_SUCCESS) 181*f11c7f63SJim Harris { 182*f11c7f63SJim Harris SCIF_LOG_WARNING(( 183*f11c7f63SJim Harris sci_base_object_get_logger(fw_library), 184*f11c7f63SJim Harris SCIF_LOG_OBJECT_LIBRARY, 185*f11c7f63SJim Harris "Library:0x%x Status:0x%x controller allocation failed\n", 186*f11c7f63SJim Harris fw_library, status 187*f11c7f63SJim Harris )); 188*f11c7f63SJim Harris } 189*f11c7f63SJim Harris } 190*f11c7f63SJim Harris else 191*f11c7f63SJim Harris status = SCI_FAILURE_INVALID_PARAMETER_VALUE; 192*f11c7f63SJim Harris 193*f11c7f63SJim Harris return status; 194*f11c7f63SJim Harris } 195*f11c7f63SJim Harris 196*f11c7f63SJim Harris // --------------------------------------------------------------------------- 197*f11c7f63SJim Harris 198*f11c7f63SJim Harris SCI_STATUS scif_library_free_controller( 199*f11c7f63SJim Harris SCI_LIBRARY_HANDLE_T library, 200*f11c7f63SJim Harris SCI_CONTROLLER_HANDLE_T controller 201*f11c7f63SJim Harris ) 202*f11c7f63SJim Harris { 203*f11c7f63SJim Harris SCI_STATUS status; 204*f11c7f63SJim Harris 205*f11c7f63SJim Harris if ( (library != SCI_INVALID_HANDLE) && (controller != SCI_INVALID_HANDLE) ) 206*f11c7f63SJim Harris { 207*f11c7f63SJim Harris SCI_STATUS core_status; 208*f11c7f63SJim Harris SCIF_SAS_LIBRARY_T * fw_library = (SCIF_SAS_LIBRARY_T*) library; 209*f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) controller; 210*f11c7f63SJim Harris 211*f11c7f63SJim Harris core_status = scic_library_free_controller( 212*f11c7f63SJim Harris fw_library->core_object, fw_controller->core_object 213*f11c7f63SJim Harris ); 214*f11c7f63SJim Harris 215*f11c7f63SJim Harris scif_sas_controller_destruct(fw_controller); 216*f11c7f63SJim Harris 217*f11c7f63SJim Harris SCI_BASE_LIBRARY_FREE_CONTROLLER( 218*f11c7f63SJim Harris (SCIF_SAS_LIBRARY_T *) library, 219*f11c7f63SJim Harris controller, 220*f11c7f63SJim Harris SCIF_SAS_CONTROLLER_T, 221*f11c7f63SJim Harris &status 222*f11c7f63SJim Harris ); 223*f11c7f63SJim Harris 224*f11c7f63SJim Harris if ( (status == SCI_SUCCESS) && (core_status != SCI_SUCCESS) ) 225*f11c7f63SJim Harris status = core_status; 226*f11c7f63SJim Harris 227*f11c7f63SJim Harris if (status != SCI_SUCCESS) 228*f11c7f63SJim Harris { 229*f11c7f63SJim Harris SCIF_LOG_WARNING(( 230*f11c7f63SJim Harris sci_base_object_get_logger(fw_library), 231*f11c7f63SJim Harris SCIF_LOG_OBJECT_LIBRARY, 232*f11c7f63SJim Harris "Library:0x%x Controller:0x%x Status:0x%x free controller failed\n", 233*f11c7f63SJim Harris fw_library, fw_controller, status 234*f11c7f63SJim Harris )); 235*f11c7f63SJim Harris } 236*f11c7f63SJim Harris } 237*f11c7f63SJim Harris else 238*f11c7f63SJim Harris status = SCI_FAILURE_INVALID_PARAMETER_VALUE; 239*f11c7f63SJim Harris 240*f11c7f63SJim Harris return status; 241*f11c7f63SJim Harris } 242*f11c7f63SJim Harris 243*f11c7f63SJim Harris // --------------------------------------------------------------------------- 244*f11c7f63SJim Harris 245*f11c7f63SJim Harris SCI_LIBRARY_HANDLE_T scif_library_get_scic_handle( 246*f11c7f63SJim Harris SCI_LIBRARY_HANDLE_T scif_library 247*f11c7f63SJim Harris ) 248*f11c7f63SJim Harris { 249*f11c7f63SJim Harris SCIF_SAS_LIBRARY_T * fw_library = (SCIF_SAS_LIBRARY_T*) scif_library; 250*f11c7f63SJim Harris 251*f11c7f63SJim Harris return fw_library->core_object; 252*f11c7f63SJim Harris } 253*f11c7f63SJim Harris 254*f11c7f63SJim Harris // --------------------------------------------------------------------------- 255*f11c7f63SJim Harris 256*f11c7f63SJim Harris #define SCIF_SAS_LIBRARY_MAX_TIMERS 32 257*f11c7f63SJim Harris 258*f11c7f63SJim Harris U16 scif_library_get_max_timer_count( 259*f11c7f63SJim Harris void 260*f11c7f63SJim Harris ) 261*f11c7f63SJim Harris { 262*f11c7f63SJim Harris /// @todo Need to calculate the exact maximum number of timers needed. 263*f11c7f63SJim Harris return SCIF_SAS_LIBRARY_MAX_TIMERS + scic_library_get_max_timer_count(); 264*f11c7f63SJim Harris } 265*f11c7f63SJim Harris 266*f11c7f63SJim Harris //****************************************************************************** 267*f11c7f63SJim Harris //* P R O T E C T E D M E T H O D S 268*f11c7f63SJim Harris //****************************************************************************** 269*f11c7f63SJim Harris 270*f11c7f63SJim Harris 271