pm8001_sas.h revision 72d0baa089ebd058cdb8b87fde835e9157c4597a
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 103dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 104dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 105dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define DEV_IS_EXPANDER(type) ((type == EDGE_DEV) || (type == FANOUT_DEV)) 106dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 107dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_NAME_LENGTH 32/* generic length of strings */ 108dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangextern struct list_head hba_list; 109dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangextern const struct pm8001_dispatch pm8001_8001_dispatch; 110dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 111dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_hba_info; 112dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_ccb_info; 113dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_device; 114dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_tmf_task; 115dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_dispatch { 116dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang char *name; 117dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*chip_init)(struct pm8001_hba_info *pm8001_ha); 118dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*chip_soft_rst)(struct pm8001_hba_info *pm8001_ha, u32 signature); 119dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*chip_rst)(struct pm8001_hba_info *pm8001_ha); 120dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*chip_ioremap)(struct pm8001_hba_info *pm8001_ha); 121dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*chip_iounmap)(struct pm8001_hba_info *pm8001_ha); 12272d0baa089ebd058cdb8b87fde835e9157c4597ajack_wang irqreturn_t (*isr)(struct pm8001_hba_info *pm8001_ha); 123dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 (*is_our_interupt)(struct pm8001_hba_info *pm8001_ha); 124dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*isr_process_oq)(struct pm8001_hba_info *pm8001_ha); 125dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*interrupt_enable)(struct pm8001_hba_info *pm8001_ha); 126dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*interrupt_disable)(struct pm8001_hba_info *pm8001_ha); 127dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void (*make_prd)(struct scatterlist *scatter, int nr, void *prd); 128dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*smp_req)(struct pm8001_hba_info *pm8001_ha, 129dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb); 130dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*ssp_io_req)(struct pm8001_hba_info *pm8001_ha, 131dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb); 132dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*sata_req)(struct pm8001_hba_info *pm8001_ha, 133dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb); 134dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*phy_start_req)(struct pm8001_hba_info *pm8001_ha, u8 phy_id); 135dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*phy_stop_req)(struct pm8001_hba_info *pm8001_ha, u8 phy_id); 136dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*reg_dev_req)(struct pm8001_hba_info *pm8001_ha, 137dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *pm8001_dev, u32 flag); 138dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*dereg_dev_req)(struct pm8001_hba_info *pm8001_ha, u32 device_id); 139dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*phy_ctl_req)(struct pm8001_hba_info *pm8001_ha, 140dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phy_id, u32 phy_op); 141dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*task_abort)(struct pm8001_hba_info *pm8001_ha, 142dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *pm8001_dev, u8 flag, u32 task_tag, 143dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 cmd_tag); 144dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*ssp_tm_req)(struct pm8001_hba_info *pm8001_ha, 145dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb, struct pm8001_tmf_task *tmf); 146dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*get_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); 147dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*set_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); 148dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*fw_flash_update_req)(struct pm8001_hba_info *pm8001_ha, 149dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *payload); 150dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*set_dev_state_req)(struct pm8001_hba_info *pm8001_ha, 151dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *pm8001_dev, u32 state); 152dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*sas_diag_start_end_req)(struct pm8001_hba_info *pm8001_ha, 153dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 state); 154dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int (*sas_diag_execute_req)(struct pm8001_hba_info *pm8001_ha, 155dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 state); 156d0b68041bdd0e5ea6dae1210541bf124443d72ecjack_wang int (*sas_re_init_req)(struct pm8001_hba_info *pm8001_ha); 157dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 158dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 159dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_chip_info { 160dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 n_phy; 161dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang const struct pm8001_dispatch *dispatch; 162dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 163dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define PM8001_CHIP_DISP (pm8001_ha->chip->dispatch) 164dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 165dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_port { 166dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct asd_sas_port sas_port; 167dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 168dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 169dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_phy { 170dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_hba_info *pm8001_ha; 171dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_port *port; 172dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct asd_sas_phy sas_phy; 173dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_identify identify; 174dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct scsi_device *sdev; 175dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u64 dev_sas_addr; 176dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phy_type; 177dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *enable_completion; 178dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 frame_rcvd_size; 179dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 frame_rcvd[32]; 180dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 phy_attached; 181dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 phy_state; 182dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang enum sas_linkrate minimum_linkrate; 183dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang enum sas_linkrate maximum_linkrate; 184dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 185dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 186dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_device { 187dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang enum sas_dev_type dev_type; 188dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct domain_device *sas_device; 189dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 attached_phy; 190dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 id; 191dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *dcompletion; 192dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *setds_completion; 193dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 device_id; 194dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 running_req; 195dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 196dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 197dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_prd_imt { 198dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 len; 199dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 e; 200dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 201dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 202dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_prd { 203dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le64 addr; /* 64-bit buffer address */ 204dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_prd_imt im_len; /* 64-bit length */ 205dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang} __attribute__ ((packed)); 206dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/* 207dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * CCB(Command Control Block) 208dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 209dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_ccb_info { 210dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head entry; 211dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_task *task; 212dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 n_elem; 213dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ccb_tag; 214dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t ccb_dma_handle; 215dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *device; 216dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_prd buf_prd[PM8001_MAX_DMA_SG]; 217dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct fw_control_ex *fw_control_context; 218dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 219dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 220dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct mpi_mem { 221dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *virt_ptr; 222dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t phys_addr; 223dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phys_addr_hi; 224dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phys_addr_lo; 225dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_len; 226dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 num_elements; 227dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 element_size; 228dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 alignment; 229dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 230dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 231dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct mpi_mem_req { 232dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang /* The number of element in the mpiMemory array */ 233dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 count; 234dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang /* The array of structures that define memroy regions*/ 235dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct mpi_mem region[USI_MAX_MEMCNT]; 236dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 237dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 238dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct main_cfg_table { 239dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 signature; 240dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 interface_rev; 241dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 firmware_rev; 242dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 max_out_io; 243dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 max_sgl; 244dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ctrl_cap_flag; 245dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 gst_offset; 246dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 inbound_queue_offset; 247dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_queue_offset; 248dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 inbound_q_nppd_hppd; 249dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_hw_event_pid0_3; 250dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_hw_event_pid4_7; 251dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_ncq_event_pid0_3; 252dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_ncq_event_pid4_7; 253dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ITNexus_event_pid0_3; 254dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ITNexus_event_pid4_7; 255dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ssp_event_pid0_3; 256dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_ssp_event_pid4_7; 257dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_smp_event_pid0_3; 258dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 outbound_tgt_smp_event_pid4_7; 259dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_event_log_addr; 260dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_event_log_addr; 261dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 event_log_size; 262dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 event_log_option; 263dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_iop_event_log_addr; 264dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_iop_event_log_addr; 265dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iop_event_log_size; 266dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iop_event_log_option; 267dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_interrupt; 268dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_offset0; 269dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_length0; 270dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_offset1; 271dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fatal_err_dump_length1; 272dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 hda_mode_flag; 273dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 anolog_setup_table_offset; 274dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 275dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct general_status_table { 276dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 gst_len_mpistate; 277dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iq_freeze_state0; 278dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iq_freeze_state1; 279dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 msgu_tcnt; 280dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 iop_tcnt; 281dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved; 282dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phy_state[8]; 283dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved1; 284dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved2; 285dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved3; 286dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 recover_err_info[8]; 287dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 288dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct inbound_queue_table { 289dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 element_pri_size_cnt; 290dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_base_addr; 291dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_base_addr; 292dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_upper_base_addr; 293dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_lower_base_addr; 294dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_pci_bar; 295dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_offset; 296dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_length; 297dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *base_virt; 298dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *ci_virt; 299dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved; 300dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 consumer_index; 301dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 producer_idx; 302dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 303dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct outbound_queue_table { 304dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 element_size_cnt; 305dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 upper_base_addr; 306dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 lower_base_addr; 307dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *base_virt; 308dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_upper_base_addr; 309dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 pi_lower_base_addr; 310dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_pci_bar; 311dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 ci_offset; 312dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_length; 313dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *pi_virt; 314dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 interrup_vec_cnt_delay; 315dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 dinterrup_to_pci_offset; 316dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __le32 producer_index; 317dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 consumer_idx; 318dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 319dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_hba_memspace { 320dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *memvirtaddr; 321dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u64 membase; 322dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 memsize; 323dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 324dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_hba_info { 325dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang char name[PM8001_NAME_LENGTH]; 326dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head list; 327dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang unsigned long flags; 328dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang spinlock_t lock;/* host-wide lock */ 329dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pci_dev *pdev;/* our device */ 330dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct device *dev; 331dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_hba_memspace io_mem[6]; 332dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct mpi_mem_req memoryMap; 333dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *msg_unit_tbl_addr;/*Message Unit Table Addr*/ 334dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *main_cfg_tbl_addr;/*Main Config Table Addr*/ 335dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *general_stat_tbl_addr;/*General Status Table Addr*/ 336dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *inbnd_q_tbl_addr;/*Inbound Queue Config Table Addr*/ 337dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void __iomem *outbnd_q_tbl_addr;/*Outbound Queue Config Table Addr*/ 338dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct main_cfg_table main_cfg_tbl; 339dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct general_status_table gs_tbl; 340dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct inbound_queue_table inbnd_q_tbl[PM8001_MAX_INB_NUM]; 341dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct outbound_queue_table outbnd_q_tbl[PM8001_MAX_OUTB_NUM]; 342dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 sas_addr[SAS_ADDR_SIZE]; 343dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_ha_struct *sas;/* SCSI/SAS glue */ 344dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct Scsi_Host *shost; 345dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 chip_id; 346dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang const struct pm8001_chip_info *chip; 347dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct completion *nvmd_completion; 348dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int tags_num; 349dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang unsigned long *tags; 350dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_phy phy[PM8001_MAX_PHYS]; 351dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_port port[PM8001_MAX_PHYS]; 352dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 id; 353dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 irq; 354dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_device *devices; 355dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_ccb_info *ccb_info; 356dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#ifdef PM8001_USE_MSIX 357dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct msix_entry msix_entries[16];/*for msi-x interrupt*/ 358dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int number_of_intr;/*will be used in remove()*/ 359dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#endif 360dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#ifdef PM8001_USE_TASKLET 361dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct tasklet_struct tasklet; 362dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#endif 363dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head wq_list; 364dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 logging_level; 365dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 fw_status; 366dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang const struct firmware *fw_image; 367dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 368dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 369dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_wq { 370dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct delayed_work work_q; 371dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_hba_info *pm8001_ha; 372dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *data; 373dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang int handler; 374dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct list_head entry; 375dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 376dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 377dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_fw_image_header { 378dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 vender_id[8]; 379dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 product_id; 380dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 hardware_rev; 381dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 dest_partition; 382dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 reserved; 383dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 fw_rev[4]; 384dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __be32 image_length; 385dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __be32 image_crc; 386dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang __be32 startup_entry; 387dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang} __attribute__((packed, aligned(4))); 388dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 389dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/* define task management IU */ 390dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct pm8001_tmf_task { 391dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 tmf; 392dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 tag_of_task_to_be_managed; 393dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 394dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/** 395dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * FW Flash Update status values 396dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 397dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_COMPLETE_PENDING_REBOOT 0x00 398dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_IN_PROGRESS 0x01 399dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_HDR_ERR 0x02 400dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_OFFSET_ERR 0x03 401dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_CRC_ERR 0x04 402dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_LENGTH_ERR 0x05 403dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_HW_ERR 0x06 404dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_DNLD_NOT_SUPPORTED 0x10 405dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#define FLASH_UPDATE_DISABLED 0x11 406dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 407dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/** 408dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang * brief param structure for firmware flash update. 409dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang */ 410dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct fw_flash_updata_info { 411dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 cur_image_offset; 412dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 cur_image_len; 413dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 total_image_len; 414dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct pm8001_prd sgl; 415dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 416dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 417dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct fw_control_info { 418dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 retcode;/*ret code (status)*/ 419dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phase;/*ret code phase*/ 420dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 phaseCmplt;/*percent complete for the current 421dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang update phase */ 422dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 version;/*Hex encoded firmware version number*/ 423dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 offset;/*Used for downloading firmware */ 424dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 len; /*len of buffer*/ 425dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 size;/* Used in OS VPD and Trace get size 426dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang operations.*/ 427dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 reserved;/* padding required for 64 bit 428dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang alignment */ 429dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 buffer[1];/* Start of buffer */ 430dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 431dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangstruct fw_control_ex { 432dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct fw_control_info *fw_control; 433dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *buffer;/* keep buffer pointer to be 434dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang freed when the responce comes*/ 435dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *virtAddr;/* keep virtual address of the data */ 436dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *usrAddr;/* keep virtual address of the 437dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang user data */ 438dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t phys_addr; 439dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 len; /* len of buffer */ 440dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *payload; /* pointer to IOCTL Payload */ 441dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u8 inProgress;/*if 1 - the IOCTL request is in 442dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang progress */ 443dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *param1; 444dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *param2; 445dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *param3; 446dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang}; 447dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 448dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/******************** function prototype *********************/ 449dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_tag_alloc(struct pm8001_hba_info *pm8001_ha, u32 *tag_out); 450dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_tag_init(struct pm8001_hba_info *pm8001_ha); 451dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangu32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag); 452dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_ccb_free(struct pm8001_hba_info *pm8001_ha, u32 ccb_idx); 453dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_ccb_task_free(struct pm8001_hba_info *pm8001_ha, 454dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang struct sas_task *task, struct pm8001_ccb_info *ccb, u32 ccb_idx); 455dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, 456dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang void *funcdata); 457dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_slave_alloc(struct scsi_device *scsi_dev); 458dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_slave_configure(struct scsi_device *sdev); 459dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_scan_start(struct Scsi_Host *shost); 460dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time); 461dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_queue_command(struct sas_task *task, const int num, 462dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang gfp_t gfp_flags); 463dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_abort_task(struct sas_task *task); 464dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_abort_task_set(struct domain_device *dev, u8 *lun); 465dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_clear_aca(struct domain_device *dev, u8 *lun); 466dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_clear_task_set(struct domain_device *dev, u8 *lun); 467dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_dev_found(struct domain_device *dev); 468dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangvoid pm8001_dev_gone(struct domain_device *dev); 469dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_lu_reset(struct domain_device *dev, u8 *lun); 470dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_I_T_nexus_reset(struct domain_device *dev); 471dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_query_task(struct sas_task *task); 472dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangint pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr, 473dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo, 474dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang u32 mem_size, u32 align); 475dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 476dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 477dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang/* ctl shared API */ 478dbf9bfe615717d1145f263c0049fe2328e6ed395jack wangextern struct device_attribute *pm8001_host_attrs[]; 479dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 480dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang#endif 481dbf9bfe615717d1145f263c0049fe2328e6ed395jack wang 482