1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Marvell 88SE64xx/88SE94xx main function head file 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2007 Red Hat, Inc. 6*4882a593Smuzhiyun * Copyright 2008 Marvell. <kewei@marvell.com> 7*4882a593Smuzhiyun * Copyright 2009-2011 Marvell. <yuxiangl@marvell.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _MV_SAS_H_ 11*4882a593Smuzhiyun #define _MV_SAS_H_ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/kernel.h> 14*4882a593Smuzhiyun #include <linux/module.h> 15*4882a593Smuzhiyun #include <linux/spinlock.h> 16*4882a593Smuzhiyun #include <linux/delay.h> 17*4882a593Smuzhiyun #include <linux/types.h> 18*4882a593Smuzhiyun #include <linux/ctype.h> 19*4882a593Smuzhiyun #include <linux/dma-mapping.h> 20*4882a593Smuzhiyun #include <linux/pci.h> 21*4882a593Smuzhiyun #include <linux/platform_device.h> 22*4882a593Smuzhiyun #include <linux/interrupt.h> 23*4882a593Smuzhiyun #include <linux/irq.h> 24*4882a593Smuzhiyun #include <linux/slab.h> 25*4882a593Smuzhiyun #include <linux/vmalloc.h> 26*4882a593Smuzhiyun #include <asm/unaligned.h> 27*4882a593Smuzhiyun #include <scsi/libsas.h> 28*4882a593Smuzhiyun #include <scsi/scsi.h> 29*4882a593Smuzhiyun #include <scsi/scsi_tcq.h> 30*4882a593Smuzhiyun #include <scsi/sas_ata.h> 31*4882a593Smuzhiyun #include "mv_defs.h" 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define DRV_NAME "mvsas" 34*4882a593Smuzhiyun #define DRV_VERSION "0.8.16" 35*4882a593Smuzhiyun #define MVS_ID_NOT_MAPPED 0x7f 36*4882a593Smuzhiyun #define WIDE_PORT_MAX_PHY 4 37*4882a593Smuzhiyun #define mv_printk(fmt, arg ...) \ 38*4882a593Smuzhiyun printk(KERN_DEBUG"%s %d:" fmt, __FILE__, __LINE__, ## arg) 39*4882a593Smuzhiyun #ifdef MV_DEBUG 40*4882a593Smuzhiyun #define mv_dprintk(format, arg...) \ 41*4882a593Smuzhiyun printk(KERN_DEBUG"%s %d:" format, __FILE__, __LINE__, ## arg) 42*4882a593Smuzhiyun #else 43*4882a593Smuzhiyun #define mv_dprintk(format, arg...) 44*4882a593Smuzhiyun #endif 45*4882a593Smuzhiyun #define MV_MAX_U32 0xffffffff 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun extern int interrupt_coalescing; 48*4882a593Smuzhiyun extern struct mvs_tgt_initiator mvs_tgt; 49*4882a593Smuzhiyun extern struct mvs_info *tgt_mvi; 50*4882a593Smuzhiyun extern const struct mvs_dispatch mvs_64xx_dispatch; 51*4882a593Smuzhiyun extern const struct mvs_dispatch mvs_94xx_dispatch; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define bit(n) ((u64)1 << n) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define for_each_phy(__lseq_mask, __mc, __lseq) \ 56*4882a593Smuzhiyun for ((__mc) = (__lseq_mask), (__lseq) = 0; \ 57*4882a593Smuzhiyun (__mc) != 0 ; \ 58*4882a593Smuzhiyun (++__lseq), (__mc) >>= 1) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define MVS_PHY_ID (1U << sas_phy->id) 61*4882a593Smuzhiyun #define MV_INIT_DELAYED_WORK(w, f, d) INIT_DELAYED_WORK(w, f) 62*4882a593Smuzhiyun #define UNASSOC_D2H_FIS(id) \ 63*4882a593Smuzhiyun ((void *) mvi->rx_fis + 0x100 * id) 64*4882a593Smuzhiyun #define SATA_RECEIVED_FIS_LIST(reg_set) \ 65*4882a593Smuzhiyun ((void *) mvi->rx_fis + mvi->chip->fis_offs + 0x100 * reg_set) 66*4882a593Smuzhiyun #define SATA_RECEIVED_SDB_FIS(reg_set) \ 67*4882a593Smuzhiyun (SATA_RECEIVED_FIS_LIST(reg_set) + 0x58) 68*4882a593Smuzhiyun #define SATA_RECEIVED_D2H_FIS(reg_set) \ 69*4882a593Smuzhiyun (SATA_RECEIVED_FIS_LIST(reg_set) + 0x40) 70*4882a593Smuzhiyun #define SATA_RECEIVED_PIO_FIS(reg_set) \ 71*4882a593Smuzhiyun (SATA_RECEIVED_FIS_LIST(reg_set) + 0x20) 72*4882a593Smuzhiyun #define SATA_RECEIVED_DMA_FIS(reg_set) \ 73*4882a593Smuzhiyun (SATA_RECEIVED_FIS_LIST(reg_set) + 0x00) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun enum dev_status { 76*4882a593Smuzhiyun MVS_DEV_NORMAL = 0x0, 77*4882a593Smuzhiyun MVS_DEV_EH = 0x1, 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun enum dev_reset { 81*4882a593Smuzhiyun MVS_SOFT_RESET = 0, 82*4882a593Smuzhiyun MVS_HARD_RESET = 1, 83*4882a593Smuzhiyun MVS_PHY_TUNE = 2, 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct mvs_info; 87*4882a593Smuzhiyun struct mvs_prv_info; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct mvs_dispatch { 90*4882a593Smuzhiyun char *name; 91*4882a593Smuzhiyun int (*chip_init)(struct mvs_info *mvi); 92*4882a593Smuzhiyun int (*spi_init)(struct mvs_info *mvi); 93*4882a593Smuzhiyun int (*chip_ioremap)(struct mvs_info *mvi); 94*4882a593Smuzhiyun void (*chip_iounmap)(struct mvs_info *mvi); 95*4882a593Smuzhiyun irqreturn_t (*isr)(struct mvs_info *mvi, int irq, u32 stat); 96*4882a593Smuzhiyun u32 (*isr_status)(struct mvs_info *mvi, int irq); 97*4882a593Smuzhiyun void (*interrupt_enable)(struct mvs_info *mvi); 98*4882a593Smuzhiyun void (*interrupt_disable)(struct mvs_info *mvi); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun u32 (*read_phy_ctl)(struct mvs_info *mvi, u32 port); 101*4882a593Smuzhiyun void (*write_phy_ctl)(struct mvs_info *mvi, u32 port, u32 val); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun u32 (*read_port_cfg_data)(struct mvs_info *mvi, u32 port); 104*4882a593Smuzhiyun void (*write_port_cfg_data)(struct mvs_info *mvi, u32 port, u32 val); 105*4882a593Smuzhiyun void (*write_port_cfg_addr)(struct mvs_info *mvi, u32 port, u32 addr); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun u32 (*read_port_vsr_data)(struct mvs_info *mvi, u32 port); 108*4882a593Smuzhiyun void (*write_port_vsr_data)(struct mvs_info *mvi, u32 port, u32 val); 109*4882a593Smuzhiyun void (*write_port_vsr_addr)(struct mvs_info *mvi, u32 port, u32 addr); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun u32 (*read_port_irq_stat)(struct mvs_info *mvi, u32 port); 112*4882a593Smuzhiyun void (*write_port_irq_stat)(struct mvs_info *mvi, u32 port, u32 val); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun u32 (*read_port_irq_mask)(struct mvs_info *mvi, u32 port); 115*4882a593Smuzhiyun void (*write_port_irq_mask)(struct mvs_info *mvi, u32 port, u32 val); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun void (*command_active)(struct mvs_info *mvi, u32 slot_idx); 118*4882a593Smuzhiyun void (*clear_srs_irq)(struct mvs_info *mvi, u8 reg_set, u8 clear_all); 119*4882a593Smuzhiyun void (*issue_stop)(struct mvs_info *mvi, enum mvs_port_type type, 120*4882a593Smuzhiyun u32 tfs); 121*4882a593Smuzhiyun void (*start_delivery)(struct mvs_info *mvi, u32 tx); 122*4882a593Smuzhiyun u32 (*rx_update)(struct mvs_info *mvi); 123*4882a593Smuzhiyun void (*int_full)(struct mvs_info *mvi); 124*4882a593Smuzhiyun u8 (*assign_reg_set)(struct mvs_info *mvi, u8 *tfs); 125*4882a593Smuzhiyun void (*free_reg_set)(struct mvs_info *mvi, u8 *tfs); 126*4882a593Smuzhiyun u32 (*prd_size)(void); 127*4882a593Smuzhiyun u32 (*prd_count)(void); 128*4882a593Smuzhiyun void (*make_prd)(struct scatterlist *scatter, int nr, void *prd); 129*4882a593Smuzhiyun void (*detect_porttype)(struct mvs_info *mvi, int i); 130*4882a593Smuzhiyun int (*oob_done)(struct mvs_info *mvi, int i); 131*4882a593Smuzhiyun void (*fix_phy_info)(struct mvs_info *mvi, int i, 132*4882a593Smuzhiyun struct sas_identify_frame *id); 133*4882a593Smuzhiyun void (*phy_work_around)(struct mvs_info *mvi, int i); 134*4882a593Smuzhiyun void (*phy_set_link_rate)(struct mvs_info *mvi, u32 phy_id, 135*4882a593Smuzhiyun struct sas_phy_linkrates *rates); 136*4882a593Smuzhiyun u32 (*phy_max_link_rate)(void); 137*4882a593Smuzhiyun void (*phy_disable)(struct mvs_info *mvi, u32 phy_id); 138*4882a593Smuzhiyun void (*phy_enable)(struct mvs_info *mvi, u32 phy_id); 139*4882a593Smuzhiyun void (*phy_reset)(struct mvs_info *mvi, u32 phy_id, int hard); 140*4882a593Smuzhiyun void (*stp_reset)(struct mvs_info *mvi, u32 phy_id); 141*4882a593Smuzhiyun void (*clear_active_cmds)(struct mvs_info *mvi); 142*4882a593Smuzhiyun u32 (*spi_read_data)(struct mvs_info *mvi); 143*4882a593Smuzhiyun void (*spi_write_data)(struct mvs_info *mvi, u32 data); 144*4882a593Smuzhiyun int (*spi_buildcmd)(struct mvs_info *mvi, 145*4882a593Smuzhiyun u32 *dwCmd, 146*4882a593Smuzhiyun u8 cmd, 147*4882a593Smuzhiyun u8 read, 148*4882a593Smuzhiyun u8 length, 149*4882a593Smuzhiyun u32 addr 150*4882a593Smuzhiyun ); 151*4882a593Smuzhiyun int (*spi_issuecmd)(struct mvs_info *mvi, u32 cmd); 152*4882a593Smuzhiyun int (*spi_waitdataready)(struct mvs_info *mvi, u32 timeout); 153*4882a593Smuzhiyun void (*dma_fix)(struct mvs_info *mvi, u32 phy_mask, 154*4882a593Smuzhiyun int buf_len, int from, void *prd); 155*4882a593Smuzhiyun void (*tune_interrupt)(struct mvs_info *mvi, u32 time); 156*4882a593Smuzhiyun void (*non_spec_ncq_error)(struct mvs_info *mvi); 157*4882a593Smuzhiyun int (*gpio_write)(struct mvs_prv_info *mvs_prv, u8 reg_type, 158*4882a593Smuzhiyun u8 reg_index, u8 reg_count, u8 *write_data); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct mvs_chip_info { 163*4882a593Smuzhiyun u32 n_host; 164*4882a593Smuzhiyun u32 n_phy; 165*4882a593Smuzhiyun u32 fis_offs; 166*4882a593Smuzhiyun u32 fis_count; 167*4882a593Smuzhiyun u32 srs_sz; 168*4882a593Smuzhiyun u32 sg_width; 169*4882a593Smuzhiyun u32 slot_width; 170*4882a593Smuzhiyun const struct mvs_dispatch *dispatch; 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun #define MVS_MAX_SG (1U << mvi->chip->sg_width) 173*4882a593Smuzhiyun #define MVS_CHIP_SLOT_SZ (1U << mvi->chip->slot_width) 174*4882a593Smuzhiyun #define MVS_RX_FISL_SZ \ 175*4882a593Smuzhiyun (mvi->chip->fis_offs + (mvi->chip->fis_count * 0x100)) 176*4882a593Smuzhiyun #define MVS_CHIP_DISP (mvi->chip->dispatch) 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun struct mvs_err_info { 179*4882a593Smuzhiyun __le32 flags; 180*4882a593Smuzhiyun __le32 flags2; 181*4882a593Smuzhiyun }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun struct mvs_cmd_hdr { 184*4882a593Smuzhiyun __le32 flags; /* PRD tbl len; SAS, SATA ctl */ 185*4882a593Smuzhiyun __le32 lens; /* cmd, max resp frame len */ 186*4882a593Smuzhiyun __le32 tags; /* targ port xfer tag; tag */ 187*4882a593Smuzhiyun __le32 data_len; /* data xfer len */ 188*4882a593Smuzhiyun __le64 cmd_tbl; /* command table address */ 189*4882a593Smuzhiyun __le64 open_frame; /* open addr frame address */ 190*4882a593Smuzhiyun __le64 status_buf; /* status buffer address */ 191*4882a593Smuzhiyun __le64 prd_tbl; /* PRD tbl address */ 192*4882a593Smuzhiyun __le32 reserved[4]; 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct mvs_port { 196*4882a593Smuzhiyun struct asd_sas_port sas_port; 197*4882a593Smuzhiyun u8 port_attached; 198*4882a593Smuzhiyun u8 wide_port_phymap; 199*4882a593Smuzhiyun struct list_head list; 200*4882a593Smuzhiyun }; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun struct mvs_phy { 203*4882a593Smuzhiyun struct mvs_info *mvi; 204*4882a593Smuzhiyun struct mvs_port *port; 205*4882a593Smuzhiyun struct asd_sas_phy sas_phy; 206*4882a593Smuzhiyun struct sas_identify identify; 207*4882a593Smuzhiyun struct scsi_device *sdev; 208*4882a593Smuzhiyun struct timer_list timer; 209*4882a593Smuzhiyun u64 dev_sas_addr; 210*4882a593Smuzhiyun u64 att_dev_sas_addr; 211*4882a593Smuzhiyun u32 att_dev_info; 212*4882a593Smuzhiyun u32 dev_info; 213*4882a593Smuzhiyun u32 phy_type; 214*4882a593Smuzhiyun u32 phy_status; 215*4882a593Smuzhiyun u32 irq_status; 216*4882a593Smuzhiyun u32 frame_rcvd_size; 217*4882a593Smuzhiyun u8 frame_rcvd[32]; 218*4882a593Smuzhiyun u8 phy_attached; 219*4882a593Smuzhiyun u8 phy_mode; 220*4882a593Smuzhiyun u8 reserved[2]; 221*4882a593Smuzhiyun u32 phy_event; 222*4882a593Smuzhiyun enum sas_linkrate minimum_linkrate; 223*4882a593Smuzhiyun enum sas_linkrate maximum_linkrate; 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun struct mvs_device { 227*4882a593Smuzhiyun struct list_head dev_entry; 228*4882a593Smuzhiyun enum sas_device_type dev_type; 229*4882a593Smuzhiyun struct mvs_info *mvi_info; 230*4882a593Smuzhiyun struct domain_device *sas_device; 231*4882a593Smuzhiyun u32 attached_phy; 232*4882a593Smuzhiyun u32 device_id; 233*4882a593Smuzhiyun u32 running_req; 234*4882a593Smuzhiyun u8 taskfileset; 235*4882a593Smuzhiyun u8 dev_status; 236*4882a593Smuzhiyun u16 reserved; 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* Generate PHY tunning parameters */ 240*4882a593Smuzhiyun struct phy_tuning { 241*4882a593Smuzhiyun /* 1 bit, transmitter emphasis enable */ 242*4882a593Smuzhiyun u8 trans_emp_en:1; 243*4882a593Smuzhiyun /* 4 bits, transmitter emphasis amplitude */ 244*4882a593Smuzhiyun u8 trans_emp_amp:4; 245*4882a593Smuzhiyun /* 3 bits, reserved space */ 246*4882a593Smuzhiyun u8 Reserved_2bit_1:3; 247*4882a593Smuzhiyun /* 5 bits, transmitter amplitude */ 248*4882a593Smuzhiyun u8 trans_amp:5; 249*4882a593Smuzhiyun /* 2 bits, transmitter amplitude adjust */ 250*4882a593Smuzhiyun u8 trans_amp_adj:2; 251*4882a593Smuzhiyun /* 1 bit, reserved space */ 252*4882a593Smuzhiyun u8 resv_2bit_2:1; 253*4882a593Smuzhiyun /* 2 bytes, reserved space */ 254*4882a593Smuzhiyun u8 reserved[2]; 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun struct ffe_control { 258*4882a593Smuzhiyun /* 4 bits, FFE Capacitor Select (value range 0~F) */ 259*4882a593Smuzhiyun u8 ffe_cap_sel:4; 260*4882a593Smuzhiyun /* 3 bits, FFE Resistor Select (value range 0~7) */ 261*4882a593Smuzhiyun u8 ffe_rss_sel:3; 262*4882a593Smuzhiyun /* 1 bit reserve*/ 263*4882a593Smuzhiyun u8 reserved:1; 264*4882a593Smuzhiyun }; 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun /* 267*4882a593Smuzhiyun * HBA_Info_Page is saved in Flash/NVRAM, total 256 bytes. 268*4882a593Smuzhiyun * The data area is valid only Signature="MRVL". 269*4882a593Smuzhiyun * If any member fills with 0xFF, the member is invalid. 270*4882a593Smuzhiyun */ 271*4882a593Smuzhiyun struct hba_info_page { 272*4882a593Smuzhiyun /* Dword 0 */ 273*4882a593Smuzhiyun /* 4 bytes, structure signature,should be "MRVL" at first initial */ 274*4882a593Smuzhiyun u8 signature[4]; 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* Dword 1-13 */ 277*4882a593Smuzhiyun u32 reserved1[13]; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* Dword 14-29 */ 280*4882a593Smuzhiyun /* 64 bytes, SAS address for each port */ 281*4882a593Smuzhiyun u64 sas_addr[8]; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* Dword 30-31 */ 284*4882a593Smuzhiyun /* 8 bytes for vanir 8 port PHY FFE seeting 285*4882a593Smuzhiyun * BIT 0~3 : FFE Capacitor select(value range 0~F) 286*4882a593Smuzhiyun * BIT 4~6 : FFE Resistor select(value range 0~7) 287*4882a593Smuzhiyun * BIT 7: reserve. 288*4882a593Smuzhiyun */ 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun struct ffe_control ffe_ctl[8]; 291*4882a593Smuzhiyun /* Dword 32 -43 */ 292*4882a593Smuzhiyun u32 reserved2[12]; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /* Dword 44-45 */ 295*4882a593Smuzhiyun /* 8 bytes, 0: 1.5G, 1: 3.0G, should be 0x01 at first initial */ 296*4882a593Smuzhiyun u8 phy_rate[8]; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun /* Dword 46-53 */ 299*4882a593Smuzhiyun /* 32 bytes, PHY tuning parameters for each PHY*/ 300*4882a593Smuzhiyun struct phy_tuning phy_tuning[8]; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /* Dword 54-63 */ 303*4882a593Smuzhiyun u32 reserved3[10]; 304*4882a593Smuzhiyun }; /* total 256 bytes */ 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun struct mvs_slot_info { 307*4882a593Smuzhiyun struct list_head entry; 308*4882a593Smuzhiyun union { 309*4882a593Smuzhiyun struct sas_task *task; 310*4882a593Smuzhiyun void *tdata; 311*4882a593Smuzhiyun }; 312*4882a593Smuzhiyun u32 n_elem; 313*4882a593Smuzhiyun u32 tx; 314*4882a593Smuzhiyun u32 slot_tag; 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun /* DMA buffer for storing cmd tbl, open addr frame, status buffer, 317*4882a593Smuzhiyun * and PRD table 318*4882a593Smuzhiyun */ 319*4882a593Smuzhiyun void *buf; 320*4882a593Smuzhiyun dma_addr_t buf_dma; 321*4882a593Smuzhiyun void *response; 322*4882a593Smuzhiyun struct mvs_port *port; 323*4882a593Smuzhiyun struct mvs_device *device; 324*4882a593Smuzhiyun void *open_frame; 325*4882a593Smuzhiyun }; 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun struct mvs_info { 328*4882a593Smuzhiyun unsigned long flags; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun /* host-wide lock */ 331*4882a593Smuzhiyun spinlock_t lock; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* our device */ 334*4882a593Smuzhiyun struct pci_dev *pdev; 335*4882a593Smuzhiyun struct device *dev; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /* enhanced mode registers */ 338*4882a593Smuzhiyun void __iomem *regs; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun /* peripheral or soc registers */ 341*4882a593Smuzhiyun void __iomem *regs_ex; 342*4882a593Smuzhiyun u8 sas_addr[SAS_ADDR_SIZE]; 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun /* SCSI/SAS glue */ 345*4882a593Smuzhiyun struct sas_ha_struct *sas; 346*4882a593Smuzhiyun struct Scsi_Host *shost; 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun /* TX (delivery) DMA ring */ 349*4882a593Smuzhiyun __le32 *tx; 350*4882a593Smuzhiyun dma_addr_t tx_dma; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* cached next-producer idx */ 353*4882a593Smuzhiyun u32 tx_prod; 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* RX (completion) DMA ring */ 356*4882a593Smuzhiyun __le32 *rx; 357*4882a593Smuzhiyun dma_addr_t rx_dma; 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun /* RX consumer idx */ 360*4882a593Smuzhiyun u32 rx_cons; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* RX'd FIS area */ 363*4882a593Smuzhiyun __le32 *rx_fis; 364*4882a593Smuzhiyun dma_addr_t rx_fis_dma; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /* DMA command header slots */ 367*4882a593Smuzhiyun struct mvs_cmd_hdr *slot; 368*4882a593Smuzhiyun dma_addr_t slot_dma; 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun u32 chip_id; 371*4882a593Smuzhiyun const struct mvs_chip_info *chip; 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun int tags_num; 374*4882a593Smuzhiyun unsigned long *tags; 375*4882a593Smuzhiyun /* further per-slot information */ 376*4882a593Smuzhiyun struct mvs_phy phy[MVS_MAX_PHYS]; 377*4882a593Smuzhiyun struct mvs_port port[MVS_MAX_PHYS]; 378*4882a593Smuzhiyun u32 id; 379*4882a593Smuzhiyun u64 sata_reg_set; 380*4882a593Smuzhiyun struct list_head *hba_list; 381*4882a593Smuzhiyun struct list_head soc_entry; 382*4882a593Smuzhiyun struct list_head wq_list; 383*4882a593Smuzhiyun unsigned long instance; 384*4882a593Smuzhiyun u16 flashid; 385*4882a593Smuzhiyun u32 flashsize; 386*4882a593Smuzhiyun u32 flashsectSize; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun void *addon; 389*4882a593Smuzhiyun struct hba_info_page hba_info_param; 390*4882a593Smuzhiyun struct mvs_device devices[MVS_MAX_DEVICES]; 391*4882a593Smuzhiyun void *bulk_buffer; 392*4882a593Smuzhiyun dma_addr_t bulk_buffer_dma; 393*4882a593Smuzhiyun void *bulk_buffer1; 394*4882a593Smuzhiyun dma_addr_t bulk_buffer_dma1; 395*4882a593Smuzhiyun #define TRASH_BUCKET_SIZE 0x20000 396*4882a593Smuzhiyun void *dma_pool; 397*4882a593Smuzhiyun struct mvs_slot_info slot_info[]; 398*4882a593Smuzhiyun }; 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun struct mvs_prv_info{ 401*4882a593Smuzhiyun u8 n_host; 402*4882a593Smuzhiyun u8 n_phy; 403*4882a593Smuzhiyun u8 scan_finished; 404*4882a593Smuzhiyun u8 reserve; 405*4882a593Smuzhiyun struct mvs_info *mvi[2]; 406*4882a593Smuzhiyun struct tasklet_struct mv_tasklet; 407*4882a593Smuzhiyun }; 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun struct mvs_wq { 410*4882a593Smuzhiyun struct delayed_work work_q; 411*4882a593Smuzhiyun struct mvs_info *mvi; 412*4882a593Smuzhiyun void *data; 413*4882a593Smuzhiyun int handler; 414*4882a593Smuzhiyun struct list_head entry; 415*4882a593Smuzhiyun }; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun struct mvs_task_exec_info { 418*4882a593Smuzhiyun struct sas_task *task; 419*4882a593Smuzhiyun struct mvs_cmd_hdr *hdr; 420*4882a593Smuzhiyun struct mvs_port *port; 421*4882a593Smuzhiyun u32 tag; 422*4882a593Smuzhiyun int n_elem; 423*4882a593Smuzhiyun }; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /******************** function prototype *********************/ 426*4882a593Smuzhiyun void mvs_get_sas_addr(void *buf, u32 buflen); 427*4882a593Smuzhiyun void mvs_tag_clear(struct mvs_info *mvi, u32 tag); 428*4882a593Smuzhiyun void mvs_tag_free(struct mvs_info *mvi, u32 tag); 429*4882a593Smuzhiyun void mvs_tag_set(struct mvs_info *mvi, unsigned int tag); 430*4882a593Smuzhiyun int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out); 431*4882a593Smuzhiyun void mvs_tag_init(struct mvs_info *mvi); 432*4882a593Smuzhiyun void mvs_iounmap(void __iomem *regs); 433*4882a593Smuzhiyun int mvs_ioremap(struct mvs_info *mvi, int bar, int bar_ex); 434*4882a593Smuzhiyun void mvs_phys_reset(struct mvs_info *mvi, u32 phy_mask, int hard); 435*4882a593Smuzhiyun int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, 436*4882a593Smuzhiyun void *funcdata); 437*4882a593Smuzhiyun void mvs_set_sas_addr(struct mvs_info *mvi, int port_id, u32 off_lo, 438*4882a593Smuzhiyun u32 off_hi, u64 sas_addr); 439*4882a593Smuzhiyun void mvs_scan_start(struct Scsi_Host *shost); 440*4882a593Smuzhiyun int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time); 441*4882a593Smuzhiyun int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags); 442*4882a593Smuzhiyun int mvs_abort_task(struct sas_task *task); 443*4882a593Smuzhiyun int mvs_abort_task_set(struct domain_device *dev, u8 *lun); 444*4882a593Smuzhiyun int mvs_clear_aca(struct domain_device *dev, u8 *lun); 445*4882a593Smuzhiyun int mvs_clear_task_set(struct domain_device *dev, u8 * lun); 446*4882a593Smuzhiyun void mvs_port_formed(struct asd_sas_phy *sas_phy); 447*4882a593Smuzhiyun void mvs_port_deformed(struct asd_sas_phy *sas_phy); 448*4882a593Smuzhiyun int mvs_dev_found(struct domain_device *dev); 449*4882a593Smuzhiyun void mvs_dev_gone(struct domain_device *dev); 450*4882a593Smuzhiyun int mvs_lu_reset(struct domain_device *dev, u8 *lun); 451*4882a593Smuzhiyun int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc, u32 flags); 452*4882a593Smuzhiyun int mvs_I_T_nexus_reset(struct domain_device *dev); 453*4882a593Smuzhiyun int mvs_query_task(struct sas_task *task); 454*4882a593Smuzhiyun void mvs_release_task(struct mvs_info *mvi, 455*4882a593Smuzhiyun struct domain_device *dev); 456*4882a593Smuzhiyun void mvs_do_release_task(struct mvs_info *mvi, int phy_no, 457*4882a593Smuzhiyun struct domain_device *dev); 458*4882a593Smuzhiyun void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events); 459*4882a593Smuzhiyun void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st); 460*4882a593Smuzhiyun int mvs_int_rx(struct mvs_info *mvi, bool self_clear); 461*4882a593Smuzhiyun struct mvs_device *mvs_find_dev_by_reg_set(struct mvs_info *mvi, u8 reg_set); 462*4882a593Smuzhiyun int mvs_gpio_write(struct sas_ha_struct *, u8 reg_type, u8 reg_index, 463*4882a593Smuzhiyun u8 reg_count, u8 *write_data); 464*4882a593Smuzhiyun #endif 465*4882a593Smuzhiyun 466