1dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik/* 220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * Marvell 88SE64xx/88SE94xx main function head file 320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * 420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * Copyright 2007 Red Hat, Inc. 520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * Copyright 2008 Marvell. <kewei@marvell.com> 60b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yu * Copyright 2009-2011 Marvell. <yuxiangl@marvell.com> 720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * 820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * This file is licensed under GPLv2. 920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * 1020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * This program is free software; you can redistribute it and/or 1120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * modify it under the terms of the GNU General Public License as 1220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * published by the Free Software Foundation; version 2 of the 1320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * License. 1420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * 1520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * This program is distributed in the hope that it will be useful, 1620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * but WITHOUT ANY WARRANTY; without even the implied warranty of 1720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * General Public License for more details. 1920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * 2020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * You should have received a copy of the GNU General Public License 2120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * along with this program; if not, write to the Free Software 2220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 2320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan * USA 2420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan*/ 25dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 26dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#ifndef _MV_SAS_H_ 27dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#define _MV_SAS_H_ 28dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 29dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/kernel.h> 30dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/module.h> 31dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/spinlock.h> 32dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/delay.h> 33dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/types.h> 34dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/ctype.h> 35dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/dma-mapping.h> 36dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/pci.h> 37dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/platform_device.h> 38dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/interrupt.h> 39dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/irq.h> 405a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 41dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <linux/vmalloc.h> 42dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <scsi/libsas.h> 439dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivas#include <scsi/scsi.h> 44dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <scsi/scsi_tcq.h> 45dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include <scsi/sas_ata.h> 46dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#include "mv_defs.h" 47dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 4820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define DRV_NAME "mvsas" 494f3f812dd3b638d0c92661122dcccd6aaef66bfbXiangliang Yu#define DRV_VERSION "0.8.16" 50dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#define MVS_ID_NOT_MAPPED 0x7f 5120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define WIDE_PORT_MAX_PHY 4 5220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define mv_printk(fmt, arg ...) \ 5320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan printk(KERN_DEBUG"%s %d:" fmt, __FILE__, __LINE__, ## arg) 5420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#ifdef MV_DEBUG 5520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define mv_dprintk(format, arg...) \ 5620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan printk(KERN_DEBUG"%s %d:" format, __FILE__, __LINE__, ## arg) 5720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#else 5820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define mv_dprintk(format, arg...) 5920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#endif 6020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define MV_MAX_U32 0xffffffff 6120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 6283c7b61cf49c2659829050fec240601415c7f9d9Xiangliang Yuextern int interrupt_coalescing; 6320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanextern struct mvs_tgt_initiator mvs_tgt; 6420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanextern struct mvs_info *tgt_mvi; 6520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanextern const struct mvs_dispatch mvs_64xx_dispatch; 6620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanextern const struct mvs_dispatch mvs_94xx_dispatch; 670b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yuextern struct kmem_cache *mvs_task_list_cache; 6820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 6920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define DEV_IS_EXPANDER(type) \ 7020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan ((type == EDGE_DEV) || (type == FANOUT_DEV)) 71dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 7220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define bit(n) ((u32)1 << n) 7320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 7420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define for_each_phy(__lseq_mask, __mc, __lseq) \ 7520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan for ((__mc) = (__lseq_mask), (__lseq) = 0; \ 7620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan (__mc) != 0 ; \ 77dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik (++__lseq), (__mc) >>= 1) 78dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 7920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define MV_INIT_DELAYED_WORK(w, f, d) INIT_DELAYED_WORK(w, f) 8020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define UNASSOC_D2H_FIS(id) \ 8120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan ((void *) mvi->rx_fis + 0x100 * id) 8220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define SATA_RECEIVED_FIS_LIST(reg_set) \ 8320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan ((void *) mvi->rx_fis + mvi->chip->fis_offs + 0x100 * reg_set) 8420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define SATA_RECEIVED_SDB_FIS(reg_set) \ 8520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan (SATA_RECEIVED_FIS_LIST(reg_set) + 0x58) 8620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define SATA_RECEIVED_D2H_FIS(reg_set) \ 8720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan (SATA_RECEIVED_FIS_LIST(reg_set) + 0x40) 8820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define SATA_RECEIVED_PIO_FIS(reg_set) \ 8920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan (SATA_RECEIVED_FIS_LIST(reg_set) + 0x20) 9020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define SATA_RECEIVED_DMA_FIS(reg_set) \ 9120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan (SATA_RECEIVED_FIS_LIST(reg_set) + 0x00) 9220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 9320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanenum dev_status { 9420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan MVS_DEV_NORMAL = 0x0, 9520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan MVS_DEV_EH = 0x1, 9620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan}; 9720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 98a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yuenum dev_reset { 99a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yu MVS_SOFT_RESET = 0, 100a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yu MVS_HARD_RESET = 1, 101a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yu MVS_PHY_TUNE = 2, 102a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yu}; 10320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 10420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanstruct mvs_info; 10520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 10620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanstruct mvs_dispatch { 10720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan char *name; 10820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*chip_init)(struct mvs_info *mvi); 10920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*spi_init)(struct mvs_info *mvi); 11020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*chip_ioremap)(struct mvs_info *mvi); 11120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*chip_iounmap)(struct mvs_info *mvi); 11220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan irqreturn_t (*isr)(struct mvs_info *mvi, int irq, u32 stat); 11320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*isr_status)(struct mvs_info *mvi, int irq); 11420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*interrupt_enable)(struct mvs_info *mvi); 11520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*interrupt_disable)(struct mvs_info *mvi); 11620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 11720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*read_phy_ctl)(struct mvs_info *mvi, u32 port); 11820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_phy_ctl)(struct mvs_info *mvi, u32 port, u32 val); 11920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 12020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*read_port_cfg_data)(struct mvs_info *mvi, u32 port); 12120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_port_cfg_data)(struct mvs_info *mvi, u32 port, u32 val); 12220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_port_cfg_addr)(struct mvs_info *mvi, u32 port, u32 addr); 12320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 12420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*read_port_vsr_data)(struct mvs_info *mvi, u32 port); 12520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_port_vsr_data)(struct mvs_info *mvi, u32 port, u32 val); 12620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_port_vsr_addr)(struct mvs_info *mvi, u32 port, u32 addr); 12720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 12820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*read_port_irq_stat)(struct mvs_info *mvi, u32 port); 12920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_port_irq_stat)(struct mvs_info *mvi, u32 port, u32 val); 13020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 13120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*read_port_irq_mask)(struct mvs_info *mvi, u32 port); 13220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*write_port_irq_mask)(struct mvs_info *mvi, u32 port, u32 val); 13320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 13420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*command_active)(struct mvs_info *mvi, u32 slot_idx); 1359dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivas void (*clear_srs_irq)(struct mvs_info *mvi, u8 reg_set, u8 clear_all); 13620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*issue_stop)(struct mvs_info *mvi, enum mvs_port_type type, 13720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 tfs); 13820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*start_delivery)(struct mvs_info *mvi, u32 tx); 13920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*rx_update)(struct mvs_info *mvi); 14020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*int_full)(struct mvs_info *mvi); 14120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 (*assign_reg_set)(struct mvs_info *mvi, u8 *tfs); 14220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*free_reg_set)(struct mvs_info *mvi, u8 *tfs); 14320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*prd_size)(void); 14420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*prd_count)(void); 14520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*make_prd)(struct scatterlist *scatter, int nr, void *prd); 14620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*detect_porttype)(struct mvs_info *mvi, int i); 14720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*oob_done)(struct mvs_info *mvi, int i); 14820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*fix_phy_info)(struct mvs_info *mvi, int i, 14920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct sas_identify_frame *id); 15020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*phy_work_around)(struct mvs_info *mvi, int i); 15120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*phy_set_link_rate)(struct mvs_info *mvi, u32 phy_id, 15220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct sas_phy_linkrates *rates); 15320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*phy_max_link_rate)(void); 15420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*phy_disable)(struct mvs_info *mvi, u32 phy_id); 15520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*phy_enable)(struct mvs_info *mvi, u32 phy_id); 15620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*phy_reset)(struct mvs_info *mvi, u32 phy_id, int hard); 15720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*stp_reset)(struct mvs_info *mvi, u32 phy_id); 15820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*clear_active_cmds)(struct mvs_info *mvi); 15920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 (*spi_read_data)(struct mvs_info *mvi); 16020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void (*spi_write_data)(struct mvs_info *mvi, u32 data); 16120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*spi_buildcmd)(struct mvs_info *mvi, 16220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 *dwCmd, 16320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 cmd, 16420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 read, 16520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 length, 16620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 addr 16720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan ); 16820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*spi_issuecmd)(struct mvs_info *mvi, u32 cmd); 16920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int (*spi_waitdataready)(struct mvs_info *mvi, u32 timeout); 1708882f081329a82737b7471b97e59ce8c407f6655Xiangliang Yu void (*dma_fix)(struct mvs_info *mvi, u32 phy_mask, 1718882f081329a82737b7471b97e59ce8c407f6655Xiangliang Yu int buf_len, int from, void *prd); 17283c7b61cf49c2659829050fec240601415c7f9d9Xiangliang Yu void (*tune_interrupt)(struct mvs_info *mvi, u32 time); 173534ff10104427ccad071ef87ae7017d47d08e50bXiangliang Yu void (*non_spec_ncq_error)(struct mvs_info *mvi); 17420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 17520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan}; 17620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 177dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_chip_info { 17820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 n_host; 17920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 n_phy; 18020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 fis_offs; 18120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 fis_count; 18220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 srs_sz; 183a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yu u32 sg_width; 18420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 slot_width; 18520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan const struct mvs_dispatch *dispatch; 186dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 187a4632aae8b662b1f32fe3fc558a813cd5c3daae6Xiangliang Yu#define MVS_MAX_SG (1U << mvi->chip->sg_width) 18820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define MVS_CHIP_SLOT_SZ (1U << mvi->chip->slot_width) 18920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define MVS_RX_FISL_SZ \ 19020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan (mvi->chip->fis_offs + (mvi->chip->fis_count * 0x100)) 19120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define MVS_CHIP_DISP (mvi->chip->dispatch) 192dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 193dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_err_info { 194dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 flags; 195dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 flags2; 196dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 197dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 198dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_cmd_hdr { 199dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 flags; /* PRD tbl len; SAS, SATA ctl */ 200dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 lens; /* cmd, max resp frame len */ 201dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 tags; /* targ port xfer tag; tag */ 202dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 data_len; /* data xfer len */ 20320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan __le64 cmd_tbl; /* command table address */ 204dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le64 open_frame; /* open addr frame address */ 205dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le64 status_buf; /* status buffer address */ 206dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le64 prd_tbl; /* PRD tbl address */ 207dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 reserved[4]; 208dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 209dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 210dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_port { 211dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct asd_sas_port sas_port; 212dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u8 port_attached; 213dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u8 wide_port_phymap; 214dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct list_head list; 215dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 216dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 217dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_phy { 21820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_info *mvi; 219dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct mvs_port *port; 220dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct asd_sas_phy sas_phy; 221dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct sas_identify identify; 222dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct scsi_device *sdev; 22320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct timer_list timer; 224dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u64 dev_sas_addr; 225dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u64 att_dev_sas_addr; 226dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 att_dev_info; 227dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 dev_info; 228dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 phy_type; 229dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 phy_status; 230dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 irq_status; 231dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 frame_rcvd_size; 232dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u8 frame_rcvd[32]; 233dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u8 phy_attached; 23420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 phy_mode; 23520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 reserved[2]; 23620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 phy_event; 237dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik enum sas_linkrate minimum_linkrate; 238dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik enum sas_linkrate maximum_linkrate; 239dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 240dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 24120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanstruct mvs_device { 2429870d9a2428550e7ac3164a26306ad07a99051aeAndy Yan struct list_head dev_entry; 24320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan enum sas_dev_type dev_type; 2449870d9a2428550e7ac3164a26306ad07a99051aeAndy Yan struct mvs_info *mvi_info; 24520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct domain_device *sas_device; 2469dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivas struct timer_list timer; 24720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 attached_phy; 24820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 device_id; 2499dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivas u32 running_req; 25020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 taskfileset; 25120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 dev_status; 25220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u16 reserved; 25320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan}; 25420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 255f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu/* Generate PHY tunning parameters */ 256f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yustruct phy_tuning { 257f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 1 bit, transmitter emphasis enable */ 258f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 trans_emp_en:1; 259f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 4 bits, transmitter emphasis amplitude */ 260f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 trans_emp_amp:4; 261f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 3 bits, reserved space */ 262f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 Reserved_2bit_1:3; 263f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 5 bits, transmitter amplitude */ 264f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 trans_amp:5; 265f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 2 bits, transmitter amplitude adjust */ 266f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 trans_amp_adj:2; 267f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 1 bit, reserved space */ 268f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 resv_2bit_2:1; 269f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 2 bytes, reserved space */ 270f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 reserved[2]; 271f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu}; 272f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 273f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yustruct ffe_control { 274f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 4 bits, FFE Capacitor Select (value range 0~F) */ 275f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 ffe_cap_sel:4; 276f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 3 bits, FFE Resistor Select (value range 0~7) */ 277f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 ffe_rss_sel:3; 278f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 1 bit reserve*/ 279f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 reserved:1; 280f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu}; 281f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 282f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu/* 283f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu * HBA_Info_Page is saved in Flash/NVRAM, total 256 bytes. 284f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu * The data area is valid only Signature="MRVL". 285f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu * If any member fills with 0xFF, the member is invalid. 286f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu */ 287f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yustruct hba_info_page { 288f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 0 */ 289f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 4 bytes, structure signature,should be "MRVL" at first initial */ 290f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 signature[4]; 291f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 292f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 1-13 */ 293f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u32 reserved1[13]; 294f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 295f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 14-29 */ 296f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 64 bytes, SAS address for each port */ 297f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u64 sas_addr[8]; 298f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 299f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 30-31 */ 300f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 8 bytes for vanir 8 port PHY FFE seeting 301f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu * BIT 0~3 : FFE Capacitor select(value range 0~F) 302f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu * BIT 4~6 : FFE Resistor select(value range 0~7) 303f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu * BIT 7: reserve. 304f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu */ 305f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 306f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu struct ffe_control ffe_ctl[8]; 307f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 32 -43 */ 308f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u32 reserved2[12]; 309f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 310f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 44-45 */ 311f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 8 bytes, 0: 1.5G, 1: 3.0G, should be 0x01 at first initial */ 312f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u8 phy_rate[8]; 313f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 314f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 46-53 */ 315f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* 32 bytes, PHY tuning parameters for each PHY*/ 316f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu struct phy_tuning phy_tuning[8]; 317f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 318f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu /* Dword 54-63 */ 319f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu u32 reserved3[10]; 320f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu}; /* total 256 bytes */ 321f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu 322dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_slot_info { 32320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct list_head entry; 32420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan union { 32520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct sas_task *task; 32620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void *tdata; 32720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan }; 328dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 n_elem; 329dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 tx; 33020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 slot_tag; 331dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 332dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* DMA buffer for storing cmd tbl, open addr frame, status buffer, 333dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik * and PRD table 334dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik */ 335dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik void *buf; 336dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik dma_addr_t buf_dma; 337dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik void *response; 338dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct mvs_port *port; 33920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_device *device; 34020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void *open_frame; 341dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 342dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 343dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikstruct mvs_info { 344dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik unsigned long flags; 345dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 346dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* host-wide lock */ 347dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik spinlock_t lock; 348dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 349dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* our device */ 350dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct pci_dev *pdev; 35120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct device *dev; 352dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 353dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* enhanced mode registers */ 354dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik void __iomem *regs; 355dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 35620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan /* peripheral or soc registers */ 35720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void __iomem *regs_ex; 358dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u8 sas_addr[SAS_ADDR_SIZE]; 359dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 360dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* SCSI/SAS glue */ 36120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct sas_ha_struct *sas; 362dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct Scsi_Host *shost; 363dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 364dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* TX (delivery) DMA ring */ 365dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 *tx; 366dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik dma_addr_t tx_dma; 367dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 368dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* cached next-producer idx */ 369dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 tx_prod; 370dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 371dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* RX (completion) DMA ring */ 37220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan __le32 *rx; 373dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik dma_addr_t rx_dma; 374dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 375dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* RX consumer idx */ 376dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik u32 rx_cons; 377dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 378dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* RX'd FIS area */ 379dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik __le32 *rx_fis; 380dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik dma_addr_t rx_fis_dma; 381dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 382dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik /* DMA command header slots */ 383dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct mvs_cmd_hdr *slot; 384dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik dma_addr_t slot_dma; 385dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 38620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 chip_id; 387dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik const struct mvs_chip_info *chip; 388dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 38920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int tags_num; 390b89e8f539ff8bcf2a1464578fa91cb96cc433fc3Xiangliang Yu unsigned long *tags; 39120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan /* further per-slot information */ 392dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct mvs_phy phy[MVS_MAX_PHYS]; 393dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik struct mvs_port port[MVS_MAX_PHYS]; 39420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 id; 39520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u64 sata_reg_set; 39620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct list_head *hba_list; 39720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct list_head soc_entry; 39820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct list_head wq_list; 39920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan unsigned long instance; 40020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u16 flashid; 40120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 flashsize; 40220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 flashsectSize; 40320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 40420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void *addon; 405f1f82a919d7fff21ee8c0ef4b9731fb38f2a65dbXiangliang Yu struct hba_info_page hba_info_param; 40620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_device devices[MVS_MAX_DEVICES]; 40720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void *bulk_buffer; 40820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan dma_addr_t bulk_buffer_dma; 4098882f081329a82737b7471b97e59ce8c407f6655Xiangliang Yu void *bulk_buffer1; 4108882f081329a82737b7471b97e59ce8c407f6655Xiangliang Yu dma_addr_t bulk_buffer_dma1; 41120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan#define TRASH_BUCKET_SIZE 0x20000 4120b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yu void *dma_pool; 41320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_slot_info slot_info[0]; 41420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan}; 41520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 41620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanstruct mvs_prv_info{ 41720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 n_host; 41820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u8 n_phy; 41984fbd0cea11b80d7b7097343d5262004d42b8a9aXiangliang Yu u8 scan_finished; 42084fbd0cea11b80d7b7097343d5262004d42b8a9aXiangliang Yu u8 reserve; 42120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_info *mvi[2]; 4226f8ac161b8b3332a9d96d6650ed3bae81baab30bXiangliang Yu struct tasklet_struct mv_tasklet; 42320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan}; 42420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 42520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanstruct mvs_wq { 42620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct delayed_work work_q; 42720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_info *mvi; 42820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan void *data; 42920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int handler; 43020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct list_head entry; 431dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik}; 432dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik 43320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanstruct mvs_task_exec_info { 43420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct sas_task *task; 43520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_cmd_hdr *hdr; 43620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct mvs_port *port; 43720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 tag; 43820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan int n_elem; 43920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan}; 44020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 4410b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yustruct mvs_task_list { 4420b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yu struct sas_task *task; 4430b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yu struct list_head list; 4440b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yu}; 4450b15fb1fdfd403726542cb6111bc916b7a9f7fadXiangliang Yu 44620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 44720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan/******************** function prototype *********************/ 44820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_get_sas_addr(void *buf, u32 buflen); 44920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_tag_clear(struct mvs_info *mvi, u32 tag); 45020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_tag_free(struct mvs_info *mvi, u32 tag); 45120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_tag_set(struct mvs_info *mvi, unsigned int tag); 45220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out); 45320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_tag_init(struct mvs_info *mvi); 45420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_iounmap(void __iomem *regs); 45520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_ioremap(struct mvs_info *mvi, int bar, int bar_ex); 45620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_phys_reset(struct mvs_info *mvi, u32 phy_mask, int hard); 457dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikint mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, 458dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik void *funcdata); 45920b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid __devinit mvs_set_sas_addr(struct mvs_info *mvi, int port_id, 46020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan u32 off_lo, u32 off_hi, u64 sas_addr); 461dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikvoid mvs_scan_start(struct Scsi_Host *shost); 462dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikint mvs_scan_finished(struct Scsi_Host *shost, unsigned long time); 46320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_queue_command(struct sas_task *task, const int num, 46420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan gfp_t gfp_flags); 46520b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_abort_task(struct sas_task *task); 46620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_abort_task_set(struct domain_device *dev, u8 *lun); 46720b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_clear_aca(struct domain_device *dev, u8 *lun); 46820b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_clear_task_set(struct domain_device *dev, u8 * lun); 469dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikvoid mvs_port_formed(struct asd_sas_phy *sas_phy); 47020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_port_deformed(struct asd_sas_phy *sas_phy); 47120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_dev_found(struct domain_device *dev); 47220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_dev_gone(struct domain_device *dev); 47320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_lu_reset(struct domain_device *dev, u8 *lun); 47420b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc, u32 flags); 475dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzikint mvs_I_T_nexus_reset(struct domain_device *dev); 47620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_query_task(struct sas_task *task); 4779dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivasvoid mvs_release_task(struct mvs_info *mvi, 4789dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivas struct domain_device *dev); 4799dc9fd9484c5168d23fe855e6c56543d96b6695bSrinivasvoid mvs_do_release_task(struct mvs_info *mvi, int phy_no, 48020b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan struct domain_device *dev); 48120b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events); 48220b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanvoid mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st); 48320b09c2992fefbe78f8cede7b404fb143a413c52Andy Yanint mvs_int_rx(struct mvs_info *mvi, bool self_clear); 484534ff10104427ccad071ef87ae7017d47d08e50bXiangliang Yustruct mvs_device *mvs_find_dev_by_reg_set(struct mvs_info *mvi, u8 reg_set); 485dd4969a892ea522ecf9d7d826ba1531ce044d46fJeff Garzik#endif 48620b09c2992fefbe78f8cede7b404fb143a413c52Andy Yan 487