pm8001_sas.h revision 7c8356d969e203a8f2f740a9a80d4944eb8cf1d1
1dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/* 2dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * PMC-Sierra SPC 8001 SAS/SATA based host adapters driver 3dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 4dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * Copyright (c) 2008-2009 USI Co., Ltd. 5dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * All rights reserved. 6dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 7dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * Redistribution and use in source and binary forms, with or without 8dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * modification, are permitted provided that the following conditions 9dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * are met: 10dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 1. Redistributions of source code must retain the above copyright 11dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * notice, this list of conditions, and the following disclaimer, 12dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * without modification. 13dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 2. Redistributions in binary form must reproduce at minimum a disclaimer 14dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * substantially similar to the "NO WARRANTY" disclaimer below 15dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * ("Disclaimer") and any redistribution must be conditioned upon 16dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * including a substantially similar Disclaimer requirement for further 17dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * binary redistribution. 18dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 3. Neither the names of the above-listed copyright holders nor the names 19dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * of any contributors may be used to endorse or promote products derived 20dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * from this software without specific prior written permission. 21dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 22dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * Alternatively, this software may be distributed under the terms of the 23dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * GNU General Public License ("GPL") version 2 as published by the Free 24dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * Software Foundation. 25dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 26dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * NO WARRANTY 27dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 28dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 29dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 30dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 31dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 35dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 36dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * POSSIBILITY OF SUCH DAMAGES. 38dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * 39dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 40dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 41dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#ifndef _PM8001_SAS_H_ 42dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define _PM8001_SAS_H_ 43dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 44dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/kernel.h> 45dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/module.h> 46dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/spinlock.h> 47dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/delay.h> 48dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/types.h> 49dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/ctype.h> 50dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/dma-mapping.h> 51dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/pci.h> 52dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/interrupt.h> 53dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <linux/smp_lock.h> 54dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <scsi/libsas.h> 55dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <scsi/scsi_tcq.h> 56dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <scsi/sas_ata.h> 57dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include <asm/atomic.h> 58dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#include "pm8001_defs.h" 59dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 60dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define DRV_NAME "pm8001" 61dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define DRV_VERSION "0.1.36" 62dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_FAIL_LOGGING 0x01 /* libsas EH function logging */ 63dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_INIT_LOGGING 0x02 /* driver init logging */ 64dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_DISC_LOGGING 0x04 /* discovery layer logging */ 65dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_IO_LOGGING 0x08 /* I/O path logging */ 66dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_EH_LOGGING 0x10 /* Error message logging */ 67dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_IOCTL_LOGGING 0x20 /* IOCTL message logging */ 68dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_MSG_LOGGING 0x40 /* misc message logging */ 69dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define pm8001_printk(format, arg...) printk(KERN_INFO "%s %d:" format,\ 70dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __func__, __LINE__, ## arg) 71dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_CHECK_LOGGING(HBA, LEVEL, CMD) \ 72dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangdo { \ 73dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang if (unlikely(HBA->logging_level & LEVEL)) \ 74dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang do { \ 75dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang CMD; \ 76dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang } while (0); \ 77dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang} while (0); 78dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 79dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_EH_DBG(HBA, CMD) \ 80dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_EH_LOGGING, CMD) 81dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 82dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_INIT_DBG(HBA, CMD) \ 83dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_INIT_LOGGING, CMD) 84dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 85dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_DISC_DBG(HBA, CMD) \ 86dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_DISC_LOGGING, CMD) 87dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 88dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_IO_DBG(HBA, CMD) \ 89dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_IO_LOGGING, CMD) 90dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 91dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_FAIL_DBG(HBA, CMD) \ 92dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_FAIL_LOGGING, CMD) 93dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 94dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_IOCTL_DBG(HBA, CMD) \ 95dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_IOCTL_LOGGING, CMD) 96dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 97dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_MSG_DBG(HBA, CMD) \ 98dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang PM8001_CHECK_LOGGING(HBA, PM8001_MSG_LOGGING, CMD) 99dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 100dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 101dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_USE_TASKLET 102dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_USE_MSIX 1037c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang#define PM8001_READ_VPD 104dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 105dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 106dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define DEV_IS_EXPANDER(type) ((type == EDGE_DEV) || (type == FANOUT_DEV)) 107dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 108dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_NAME_LENGTH 32/* generic length of strings */ 109dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangextern struct list_head hba_list; 110dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangextern const struct pm8001_dispatch pm8001_8001_dispatch; 111dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 112dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_hba_info; 113dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_ccb_info; 114dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_device; 1157c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang/* define task management IU */ 1167c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wangstruct pm8001_tmf_task { 1177c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u8 tmf; 1187c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u32 tag_of_task_to_be_managed; 1197c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang}; 1207c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wangstruct pm8001_ioctl_payload { 1217c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u32 signature; 1227c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u16 major_function; 1237c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u16 minor_function; 1247c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u16 length; 1257c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u16 status; 1267c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u16 offset; 1277c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u16 id; 1287c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang u8 *func_specific; 1297c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang}; 1307c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang 131dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_dispatch { 132dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang char *name; 133dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*chip_init)(struct pm8001_hba_info *pm8001_ha); 134dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*chip_soft_rst)(struct pm8001_hba_info *pm8001_ha, u32 signature); 135dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*chip_rst)(struct pm8001_hba_info *pm8001_ha); 136dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*chip_ioremap)(struct pm8001_hba_info *pm8001_ha); 137dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*chip_iounmap)(struct pm8001_hba_info *pm8001_ha); 13872d0baa089ebd058cdb8b87fde835e9157c4597ajack_wang irqreturn_t (*isr)(struct pm8001_hba_info *pm8001_ha); 139dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 (*is_our_interupt)(struct pm8001_hba_info *pm8001_ha); 140dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*isr_process_oq)(struct pm8001_hba_info *pm8001_ha); 141dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*interrupt_enable)(struct pm8001_hba_info *pm8001_ha); 142dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*interrupt_disable)(struct pm8001_hba_info *pm8001_ha); 143dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*make_prd)(struct scatterlist *scatter, int nr, void *prd); 144dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*smp_req)(struct pm8001_hba_info *pm8001_ha, 145dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb); 146dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*ssp_io_req)(struct pm8001_hba_info *pm8001_ha, 147dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb); 148dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*sata_req)(struct pm8001_hba_info *pm8001_ha, 149dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb); 150dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*phy_start_req)(struct pm8001_hba_info *pm8001_ha, u8 phy_id); 151dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*phy_stop_req)(struct pm8001_hba_info *pm8001_ha, u8 phy_id); 152dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*reg_dev_req)(struct pm8001_hba_info *pm8001_ha, 153dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *pm8001_dev, u32 flag); 154dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*dereg_dev_req)(struct pm8001_hba_info *pm8001_ha, u32 device_id); 155dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*phy_ctl_req)(struct pm8001_hba_info *pm8001_ha, 156dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phy_id, u32 phy_op); 157dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*task_abort)(struct pm8001_hba_info *pm8001_ha, 158dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *pm8001_dev, u8 flag, u32 task_tag, 159dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 cmd_tag); 160dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*ssp_tm_req)(struct pm8001_hba_info *pm8001_ha, 161dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb, struct pm8001_tmf_task *tmf); 162dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*get_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); 163dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*set_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); 164dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*fw_flash_update_req)(struct pm8001_hba_info *pm8001_ha, 165dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *payload); 166dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*set_dev_state_req)(struct pm8001_hba_info *pm8001_ha, 167dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *pm8001_dev, u32 state); 168dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*sas_diag_start_end_req)(struct pm8001_hba_info *pm8001_ha, 169dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 state); 170dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*sas_diag_execute_req)(struct pm8001_hba_info *pm8001_ha, 171dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 state); 172d0b68041bdd0e5ea6dae1210541bf124443d72ecjack_wang int (*sas_re_init_req)(struct pm8001_hba_info *pm8001_ha); 173dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 174dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 175dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_chip_info { 176dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 n_phy; 177dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang const struct pm8001_dispatch *dispatch; 178dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 179dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_CHIP_DISP (pm8001_ha->chip->dispatch) 180dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 181dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_port { 182dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct asd_sas_port sas_port; 1831cc943ae5003e4612a73119cb6fb637a45c2714djack wang u8 port_attached; 1841cc943ae5003e4612a73119cb6fb637a45c2714djack wang u8 wide_port_phymap; 1851cc943ae5003e4612a73119cb6fb637a45c2714djack wang u8 port_state; 1861cc943ae5003e4612a73119cb6fb637a45c2714djack wang struct list_head list; 187dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 188dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 189dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_phy { 190dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_hba_info *pm8001_ha; 191dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_port *port; 192dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct asd_sas_phy sas_phy; 193dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_identify identify; 194dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct scsi_device *sdev; 195dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u64 dev_sas_addr; 196dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phy_type; 197dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *enable_completion; 198dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 frame_rcvd_size; 199dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 frame_rcvd[32]; 200dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 phy_attached; 201dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 phy_state; 202dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang enum sas_linkrate minimum_linkrate; 203dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang enum sas_linkrate maximum_linkrate; 204dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 205dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 206dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_device { 207dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang enum sas_dev_type dev_type; 208dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct domain_device *sas_device; 209dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 attached_phy; 210dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 id; 211dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *dcompletion; 212dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *setds_completion; 213dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 device_id; 214dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 running_req; 215dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 216dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 217dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_prd_imt { 218dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 len; 219dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 e; 220dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 221dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 222dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_prd { 223dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le64 addr; /* 64-bit buffer address */ 224dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_prd_imt im_len; /* 64-bit length */ 225dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang} __attribute__ ((packed)); 226dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/* 227dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * CCB(Command Control Block) 228dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 229dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_ccb_info { 230dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head entry; 231dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_task *task; 232dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 n_elem; 233dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ccb_tag; 234dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t ccb_dma_handle; 235dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *device; 236dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_prd buf_prd[PM8001_MAX_DMA_SG]; 237dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct fw_control_ex *fw_control_context; 238dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 239dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 240dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct mpi_mem { 241dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *virt_ptr; 242dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t phys_addr; 243dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phys_addr_hi; 244dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phys_addr_lo; 245dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_len; 246dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 num_elements; 247dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 element_size; 248dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 alignment; 249dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 250dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 251dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct mpi_mem_req { 252dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang /* The number of element in the mpiMemory array */ 253dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 count; 254dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang /* The array of structures that define memroy regions*/ 255dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct mpi_mem region[USI_MAX_MEMCNT]; 256dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 257dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 258dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct main_cfg_table { 259dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 signature; 260dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 interface_rev; 261dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 firmware_rev; 262dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 max_out_io; 263dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 max_sgl; 264dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ctrl_cap_flag; 265dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 gst_offset; 266dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 inbound_queue_offset; 267dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_queue_offset; 268dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 inbound_q_nppd_hppd; 269dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_hw_event_pid0_3; 270dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_hw_event_pid4_7; 271dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_ncq_event_pid0_3; 272dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_ncq_event_pid4_7; 273dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ITNexus_event_pid0_3; 274dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ITNexus_event_pid4_7; 275dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ssp_event_pid0_3; 276dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ssp_event_pid4_7; 277dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_smp_event_pid0_3; 278dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_smp_event_pid4_7; 279dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_event_log_addr; 280dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_event_log_addr; 281dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 event_log_size; 282dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 event_log_option; 283dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_iop_event_log_addr; 284dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_iop_event_log_addr; 285dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iop_event_log_size; 286dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iop_event_log_option; 287dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_interrupt; 288dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_offset0; 289dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_length0; 290dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_offset1; 291dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_length1; 292dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 hda_mode_flag; 293dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 anolog_setup_table_offset; 294dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 295dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct general_status_table { 296dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 gst_len_mpistate; 297dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iq_freeze_state0; 298dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iq_freeze_state1; 299dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 msgu_tcnt; 300dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iop_tcnt; 301dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved; 302dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phy_state[8]; 303dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved1; 304dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved2; 305dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved3; 306dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 recover_err_info[8]; 307dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 308dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct inbound_queue_table { 309dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 element_pri_size_cnt; 310dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_base_addr; 311dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_base_addr; 312dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_upper_base_addr; 313dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_lower_base_addr; 314dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_pci_bar; 315dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_offset; 316dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_length; 317dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *base_virt; 318dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *ci_virt; 319dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved; 320dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 consumer_index; 321dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 producer_idx; 322dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 323dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct outbound_queue_table { 324dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 element_size_cnt; 325dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_base_addr; 326dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_base_addr; 327dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *base_virt; 328dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_upper_base_addr; 329dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_lower_base_addr; 330dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_pci_bar; 331dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_offset; 332dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_length; 333dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *pi_virt; 334dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 interrup_vec_cnt_delay; 335dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 dinterrup_to_pci_offset; 336dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 producer_index; 337dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 consumer_idx; 338dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 339dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_hba_memspace { 340dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *memvirtaddr; 341dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u64 membase; 342dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 memsize; 343dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 344dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_hba_info { 345dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang char name[PM8001_NAME_LENGTH]; 346dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head list; 347dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang unsigned long flags; 348dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang spinlock_t lock;/* host-wide lock */ 349dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pci_dev *pdev;/* our device */ 350dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct device *dev; 351dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_hba_memspace io_mem[6]; 352dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct mpi_mem_req memoryMap; 353dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *msg_unit_tbl_addr;/*Message Unit Table Addr*/ 354dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *main_cfg_tbl_addr;/*Main Config Table Addr*/ 355dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *general_stat_tbl_addr;/*General Status Table Addr*/ 356dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *inbnd_q_tbl_addr;/*Inbound Queue Config Table Addr*/ 357dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *outbnd_q_tbl_addr;/*Outbound Queue Config Table Addr*/ 358dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct main_cfg_table main_cfg_tbl; 359dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct general_status_table gs_tbl; 360dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct inbound_queue_table inbnd_q_tbl[PM8001_MAX_INB_NUM]; 361dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct outbound_queue_table outbnd_q_tbl[PM8001_MAX_OUTB_NUM]; 362dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 sas_addr[SAS_ADDR_SIZE]; 363dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_ha_struct *sas;/* SCSI/SAS glue */ 364dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct Scsi_Host *shost; 365dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 chip_id; 366dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang const struct pm8001_chip_info *chip; 367dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *nvmd_completion; 368dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int tags_num; 369dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang unsigned long *tags; 370dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_phy phy[PM8001_MAX_PHYS]; 371dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_port port[PM8001_MAX_PHYS]; 372dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 id; 373dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 irq; 374dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *devices; 375dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb_info; 376dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#ifdef PM8001_USE_MSIX 377dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct msix_entry msix_entries[16];/*for msi-x interrupt*/ 378dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int number_of_intr;/*will be used in remove()*/ 379dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#endif 380dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#ifdef PM8001_USE_TASKLET 381dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct tasklet_struct tasklet; 382dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#endif 383dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head wq_list; 384dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 logging_level; 385dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fw_status; 386dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang const struct firmware *fw_image; 387dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 388dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 389dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_wq { 390dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct delayed_work work_q; 391dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_hba_info *pm8001_ha; 392dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *data; 393dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int handler; 394dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head entry; 395dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 396dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 397dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_fw_image_header { 398dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 vender_id[8]; 399dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 product_id; 400dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 hardware_rev; 401dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 dest_partition; 402dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 reserved; 403dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 fw_rev[4]; 404dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __be32 image_length; 405dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __be32 image_crc; 406dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __be32 startup_entry; 407dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang} __attribute__((packed, aligned(4))); 408dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 4097c8356d969e203a8f2f740a9a80d4944eb8cf1d1jack wang 410dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/** 411dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * FW Flash Update status values 412dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 413dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_COMPLETE_PENDING_REBOOT 0x00 414dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_IN_PROGRESS 0x01 415dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_HDR_ERR 0x02 416dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_OFFSET_ERR 0x03 417dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_CRC_ERR 0x04 418dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_LENGTH_ERR 0x05 419dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_HW_ERR 0x06 420dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_DNLD_NOT_SUPPORTED 0x10 421dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_DISABLED 0x11 422dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 423dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/** 424dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * brief param structure for firmware flash update. 425dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 426dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct fw_flash_updata_info { 427dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 cur_image_offset; 428dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 cur_image_len; 429dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_image_len; 430dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_prd sgl; 431dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 432dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 433dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct fw_control_info { 434dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 retcode;/*ret code (status)*/ 435dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phase;/*ret code phase*/ 436dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phaseCmplt;/*percent complete for the current 437dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang update phase */ 438dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 version;/*Hex encoded firmware version number*/ 439dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 offset;/*Used for downloading firmware */ 440dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 len; /*len of buffer*/ 441dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 size;/* Used in OS VPD and Trace get size 442dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang operations.*/ 443dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved;/* padding required for 64 bit 444dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang alignment */ 445dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 buffer[1];/* Start of buffer */ 446dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 447dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct fw_control_ex { 448dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct fw_control_info *fw_control; 449dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *buffer;/* keep buffer pointer to be 450dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang freed when the responce comes*/ 451dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *virtAddr;/* keep virtual address of the data */ 452dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *usrAddr;/* keep virtual address of the 453dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang user data */ 454dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t phys_addr; 455dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 len; /* len of buffer */ 456dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *payload; /* pointer to IOCTL Payload */ 457dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 inProgress;/*if 1 - the IOCTL request is in 458dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang progress */ 459dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *param1; 460dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *param2; 461dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *param3; 462dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 463dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 464dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/******************** function prototype *********************/ 465dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_tag_alloc(struct pm8001_hba_info *pm8001_ha, u32 *tag_out); 466dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_tag_init(struct pm8001_hba_info *pm8001_ha); 467dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangu32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag); 468dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_ccb_free(struct pm8001_hba_info *pm8001_ha, u32 ccb_idx); 469dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_ccb_task_free(struct pm8001_hba_info *pm8001_ha, 470dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_task *task, struct pm8001_ccb_info *ccb, u32 ccb_idx); 471dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, 472dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *funcdata); 473dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_slave_alloc(struct scsi_device *scsi_dev); 474dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_slave_configure(struct scsi_device *sdev); 475dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_scan_start(struct Scsi_Host *shost); 476dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time); 477dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_queue_command(struct sas_task *task, const int num, 478dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang gfp_t gfp_flags); 479dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_abort_task(struct sas_task *task); 480dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_abort_task_set(struct domain_device *dev, u8 *lun); 481dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_clear_aca(struct domain_device *dev, u8 *lun); 482dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_clear_task_set(struct domain_device *dev, u8 *lun); 483dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_dev_found(struct domain_device *dev); 484dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_dev_gone(struct domain_device *dev); 485dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_lu_reset(struct domain_device *dev, u8 *lun); 486dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_I_T_nexus_reset(struct domain_device *dev); 487dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_query_task(struct sas_task *task); 488dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr, 489dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo, 490dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 mem_size, u32 align); 491dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 492dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 493dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/* ctl shared API */ 494dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangextern struct device_attribute *pm8001_host_attrs[]; 495dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 496dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#endif 497dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 498