xge.c revision da14cebe459d3275048785f25bd869cb09b5307f
2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 2N/A * Use is subject to license terms. 2N/A * Copyright (c) 2002-2005 Neterion, Inc. 2N/A * All right Reserved. 2N/A * Description: Xge main Solaris specific initialization & routines 2N/A * for upper layer driver 2N/A/* Standard Module linkage initialization for a Streams driver */ 2N/A/* Xge device attributes */ 2N/A * xgell_callback_crit_err 2N/A * This function called by HAL on Serious Error event. XGE_HAL_EVENT_SERR. 2N/A * Upper layer must analyze it based on %type. 2N/A * xge_xpak_alarm_log 2N/A * This function called by HAL on XPAK alarms. Upper layer must log the msg 2N/A * based on the xpak alarm type 2N/A "service. Excessive temperatures may result in " 2N/A "premature transceiver failure \n");
"service Excessive bias currents may indicate " "imminent laser diode failure \n");
"service Excessive laser output power may saturate " * To initialize HAL portion of driver. * Solaris standard _init function for a device driver "Unable to install the driver");
* Solaris standard _fini function for device driver * Solaris standard _info function for device driver * @arg: pointer to device private strucutre(hldev) * This is the ISR scheduled by the OS to indicate to the * Interrupt handler for transmit when MSI-X interrupt mechasnism is used * Interrupt handler for receive when MSI-X interrupt mechasnism is used /* no point to configure it further if unconfigured */ "ring%d_backoff_interval_us",
index);
* Enable RTH steering if needed HERE!!!! /* no point to configure it further */ * @device_config: pointer to xge_hal_device_config_t * This function will lookup properties from .conf file to init * the configuration data structure. If a property is not in .conf * file, the default value should be set. * Initialize link layer configuration first * Enable layer 2 steering for better virtualization * Configure layer 4 RTH to hashing inbound traffic * Disable both RTS and RTH for single ring configuration * Initialize common properties * Initialize ring properties * Bimodal Interrupts - TTI 56 configuration * Go through all possibly configured rings. Each ring could be * set ring->configured = [1|0]. * By default *all* rings enabled. * Initialize mac properties 1);
/* HAL never provide a good named macro */ * Initialize fifo properties * Go through all possibly configured fifos. Each fifo could be * set fifo->configured = [0|1]. * By default *all* fifos enabled. * Initialize errors dumping * Initialize other link layer configuration first * Allocate FIXED or MSIX interrupts. /* Get number of interrupts */ /* Get number of available interrupts */ /* Allocate an array of interrupt handles */ /* Call ddi_intr_alloc() */ * Get priority for first msi, assume remaining are all the same /* Free already allocated intr */ for (i = 0; i <
actual; i++) {
* Free previously allocated interrupts. /* Free already allocated intr */ * Register FIXED or MSI interrupts. int msix_idx =
1;
/* 0 by default is reserved for Alarms. */ /* partition MSIX vectors */ "Channel-A: using MSI-X #0");
for (j = 0; j < i; j++) {
* Enable FIXED or MSI interrupts /* Call ddi_intr_block_enable() for MSI(X) interrupts */ /* Call ddi_intr_enable for MSI(X) or FIXED interrupts */ "failed, ret 0x%x",
ret);
for (j = 0; j < i; j++) {
* Disable FIXED or MSI interrupts /* Call ddi_intr_block_disable() */ * Unregister FIXED or MSI interrupts /* Call ddi_intr_remove_handler() */ * @dev_info: pointer to dev_info_t structure * @cmd: attach command to process * This is a solaris standard attach function. This * function initializes the Xframe identified * by the dev_info_t structure and setup the driver * data structures corresponding to the Xframe Card. * This function also registers the XFRAME device * instance with the MAC Layer. * If this function returns success then the OS * will attach the HBA controller to this * Initialize all configurations /* Determine which types of interrupts supported */ "fixed type interrupt is not supported");
/* preallocate memory for new HAL device and private LL part */ /* Get the PCI Configuartion space handle */ "unable to allocate new LL device");
* Init multiple rings configuration * Init MSI-X configuration "Unable to allocate MSI-X handlers" " - defaulting to IRQA");
"driver is not initialized");
"device is not quiescent");
"unable to allocate memory");
"can't initialize the device: %d",
status);
/* register interrupt handler for handling xge device interrupts */ /* allocate and register Link Layer */ /* store ll as a HAL private part */ * quiesce(9E) entry point. * This function is called when the system is single-threaded at high * PIL with preemption disabled. Therefore, this function must not be * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure. * DDI_FAILURE indicates an error condition and should almost never happen. * @dev_info: pointer to dev_info_t structure * @cmd: attach command to process * This function is called by OS when the system is about * to shutdown or when the super user tries to unload * the driver. This function frees all the memory allocated * during xge_attach() and also unregisters the Xframe * device instance from the GLD framework. "can not detach: device is not unplumbed");