| /******************************************************************************* |
| Copyright (C) Marvell International Ltd. and its affiliates |
| |
| This software file (the "File") is owned and distributed by Marvell |
| International Ltd. and/or its affiliates ("Marvell") under the following |
| alternative licensing terms. Once you have made an election to distribute the |
| File under one of the following license alternatives, please (i) delete this |
| introductory statement regarding license alternatives, (ii) delete the two |
| license alternatives that you have not elected to use and (iii) preserve the |
| Marvell copyright notice above. |
| |
| |
| ******************************************************************************** |
| Marvell GPL License Option |
| |
| If you received this File from Marvell, you may opt to use, redistribute and/or |
| modify this File in accordance with the terms and conditions of the General |
| Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| available along with the File in the license.txt file or by writing to the Free |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| |
| THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| DISCLAIMED. The GPL License provides additional details about this warranty |
| disclaimer. |
| *******************************************************************************/ |
| /******************************************************************************* |
| * file_name - mvLinuxIalHt.h |
| * |
| * DESCRIPTION: header file for the layer that emulates SCSI adapter on the |
| * SATA adapter |
| * |
| * |
| * DEPENDENCIES: |
| * None. |
| * |
| * |
| ******************************************************************************/ |
| #ifndef __INCmvLinuxIalHth |
| #define __INCmvLinuxIalHth |
| |
| #include <linux/version.h> |
| #include <linux/autoconf.h> |
| #include <linux/module.h> |
| #include <linux/autoconf.h> |
| #include <linux/init.h> |
| #include <linux/types.h> |
| |
| |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) |
| #include <scsi/scsi.h> |
| #include <scsi/scsi_cmnd.h> |
| #include <scsi/scsi_device.h> |
| #include <scsi/scsi_host.h> |
| #include <scsi/scsi_tcq.h> |
| #include <scsi/scsi_eh.h> |
| #else |
| #include <linux/blk.h> |
| #include "scsi.h" |
| #include "hosts.h" |
| #endif |
| |
| #include "mvOs.h" |
| #include "mvSata.h" |
| #include "mvStorageDev.h" |
| #include "mvScsiAtaLayer.h" |
| #include "mvLinuxIalLib.h" |
| #include "mvIALCommon.h" |
| |
| #include <linux/blkdev.h> |
| #include <linux/spinlock.h> |
| /* Common forward declarations for all Linux-versions: */ |
| |
| /* Interfaces to the midlevel Linux SCSI driver */ |
| #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) |
| extern int mv_ial_ht_detect (Scsi_Host_Template *); |
| #else |
| typedef struct scsi_host_template Scsi_Host_Template; |
| #endif |
| extern int mv_ial_ht_release (struct Scsi_Host *); |
| extern int mv_ial_ht_queuecommand (struct scsi_cmnd *, void (*done) (struct scsi_cmnd *)); |
| extern int mv_ial_ht_bus_reset (struct scsi_cmnd *); |
| extern int mv_ial_ht_abort(struct scsi_cmnd *SCpnt); |
| extern int mv_ial_ht_ioctl(struct scsi_device *, int, void __user *); |
| |
| #define HOSTDATA(host) ((IAL_HOST_T *)&host->hostdata) |
| #define MV_IAL_ADAPTER(host) (HOSTDATA(host)->pAdapter) |
| |
| #define TEMP_DATA_BUFFER_LENGTH 512 |
| |
| /*#define MV_SUPPORT_1MBYTE_IOS*/ |
| #ifdef CONFIG_PCI_MSI |
| /*#define MV_SUPPORT_MSI*/ |
| #endif |
| |
| |
| /* Set the MRVL_SATA_BUFF_BOUNDARY to SATA minimal window size (according to CS) */ |
| #ifndef MRVL_SATA_BUFF_BOUNDARY |
| #define MRVL_SATA_BUFF_BOUNDARY (1 << 24) |
| #endif /* MRVL_SATA_BUFF_BOUNDARY */ |
| |
| #define MRVL_SATA_BOUNDARY_MASK (MRVL_SATA_BUFF_BOUNDARY - 1) |
| |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) |
| #define mvSata \ |
| { \ |
| module: THIS_MODULE,\ |
| proc_name: "mvSata", /* proc_name */ \ |
| proc_info: mv_ial_ht_proc_info, /*proc info fn */ \ |
| slave_configure: mv_ial_ht_slave_configure,\ |
| name: "Marvell SCSI to SATA adapter", /*name*/ \ |
| release: mv_ial_ht_release, /*release fn*/ \ |
| queuecommand: mv_ial_ht_queuecommand, /*queuecommand fn*/ \ |
| ioctl: mv_ial_ht_ioctl, /*ioctl fn */ \ |
| bios_param: NULL /*mv_ial_ht_biosparam*/,/*bios fn*/ \ |
| eh_device_reset_handler: NULL/*mv_ial_ht_dev_reset*/, \ |
| eh_bus_reset_handler: mv_ial_ht_bus_reset, \ |
| eh_abort_handler: mv_ial_ht_abort, \ |
| can_queue: MV_SATA_SW_QUEUE_SIZE, /* unlimited */ \ |
| this_id: MV_SATA_PM_MAX_PORTS, /*set by detect*/ \ |
| sg_tablesize: 64, /*sg_tablesize*/ \ |
| max_sectors: 256, \ |
| cmd_per_lun: MV_SATA_SW_QUEUE_SIZE, /*cmd_per_lun*/ \ |
| unchecked_isa_dma: 0, /*32-Bit Busmaster*/\ |
| emulated: 1, /* not real scsi adapter */ \ |
| support_scattered_spinup: 1, /* support_scattered_spinup */ \ |
| use_clustering: ENABLE_CLUSTERING /*use_clustering*/ \ |
| } |
| #else |
| #define mvSata \ |
| { \ |
| proc_name: "mvSata", /* proc_name */ \ |
| proc_info: mv_ial_ht_proc_info24, /*proc info fn */ \ |
| select_queue_depths: NULL, \ |
| name: "Marvell SCSI to SATA adapter", /*name*/ \ |
| detect: mv_ial_ht_detect, /*detect fn*/ \ |
| release: mv_ial_ht_release, /*release fn*/ \ |
| command: NULL, /*command fn*/ \ |
| queuecommand: mv_ial_ht_queuecommand, /*queuecommand fn*/ \ |
| ioctl: mv_ial_ht_ioctl, /*ioctl fn */ \ |
| bios_param: NULL /*mv_ial_ht_biosparam*/,/*bios fn*/ \ |
| eh_device_reset_handler: NULL/*mv_ial_ht_dev_reset*/, \ |
| eh_bus_reset_handler: mv_ial_ht_bus_reset, \ |
| eh_abort_handler: mv_ial_ht_abort, \ |
| can_queue: MV_SATA_SW_QUEUE_SIZE, /* unlimited */ \ |
| this_id: MV_SATA_PM_MAX_PORTS, /*set by detect*/ \ |
| sg_tablesize: 64, /*sg_tablesize*/ \ |
| max_sectors: 256, \ |
| cmd_per_lun: MV_SATA_SW_QUEUE_SIZE, /*cmd_per_lun*/ \ |
| unchecked_isa_dma: 0, /*32-Bit Busmaster*/\ |
| emulated: 1, /* not real scsi adapter */ \ |
| use_new_eh_code: 1, \ |
| highmem_io: 1, /*highmem_io enabled*/\ |
| use_clustering: ENABLE_CLUSTERING /*use_clustering*/ \ |
| } |
| #endif |
| |
| |
| #define MV_IAL_HT_SACOALT_DEFAULT 4 |
| #define MV_IAL_HT_SAITMTH_DEFAULT (150 * 50) |
| |
| /****************************************/ |
| /* GENERAL Definitions */ |
| /****************************************/ |
| |
| struct IALHost; |
| |
| /*struct prdPool;*/ |
| typedef struct IALAdapter |
| { |
| MV_SATA_ADAPTER mvSataAdapter; |
| MV_U8 activeHosts; |
| int maxHosts; |
| struct IALHost *host[MV_SATA_CHANNELS_NUM]; |
| struct pci_dev *pcidev; |
| u8 rev_id; /* adapter revision id */ |
| u8 *requestsArrayBaseAddr; |
| u8 *requestsArrayBaseAlignedAddr; |
| dma_addr_t requestsArrayBaseDmaAddr; |
| dma_addr_t requestsArrayBaseDmaAlignedAddr; |
| u8 *responsesArrayBaseAddr; |
| u8 *responsesArrayBaseAlignedAddr; |
| dma_addr_t responsesArrayBaseDmaAddr; |
| dma_addr_t responsesArrayBaseDmaAlignedAddr; |
| u32 requestQueueSize; |
| u32 responseQueueSize; |
| u32 procNumOfInterrupts; |
| MV_IAL_COMMON_ADAPTER_EXTENSION ialCommonExt; |
| MV_BOOLEAN stopAsyncTimer; |
| struct timer_list asyncStartTimer; |
| MV_SAL_ADAPTER_EXTENSION *ataScsiAdapterExt; |
| spinlock_t adapter_lock; |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) |
| struct semaphore rescan_mutex; |
| atomic_t stopped; |
| #endif |
| MV_U16 tempDataBuffer[TEMP_DATA_BUFFER_LENGTH/2]; |
| } IAL_ADAPTER_T; |
| |
| typedef struct IALHost |
| { |
| struct Scsi_Host* scsihost; |
| MV_U8 channelIndex; |
| IAL_ADAPTER_T* pAdapter; |
| MV_EDMA_MODE mode; |
| MV_SATA_SWITCHING_MODE switchingMode; |
| MV_BOOLEAN use128Entries; |
| void *prdPool[MV_SATA_GEN2E_SW_QUEUE_SIZE]; |
| void *prdPoolAligned[MV_SATA_GEN2E_SW_QUEUE_SIZE]; |
| MV_U32 freePRDsNum; |
| struct scsi_cmnd *scsi_cmnd_done_head, *scsi_cmnd_done_tail; |
| MV_BOOLEAN hostBlocked; |
| } IAL_HOST_T; |
| |
| /****************************************************************************** |
| * We use the Scsi_Pointer structure that's included with each command |
| * SCSI_Cmnd as a scratchpad for our SRB. This allows us to accept |
| * an unlimited number of commands. |
| * |
| * SCp will always point to mv_comp_info structure |
| *******************************************************************************/ |
| |
| /* UDMA command completion info */ |
| struct mv_comp_info |
| { |
| struct scsi_cmnd *SCpnt; |
| MV_SATA_EDMA_PRD_ENTRY *cpu_PRDpnt; |
| dma_addr_t dma_PRDpnt; |
| dma_addr_t single_buff_busaddr; |
| unsigned int allocated_entries; |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) |
| unsigned int kmap_buffer; |
| #endif |
| unsigned int seq_number; |
| MV_SATA_SCSI_CMD_BLOCK *pSALBlock; |
| struct scsi_cmnd *next_done; |
| }; |
| |
| #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) |
| #define scsi_bufflen(p) ((p)->request_bufflen) |
| #define use_sg(p) ((p)->use_sg) |
| #else |
| #define use_sg(p) 1 |
| #endif |
| |
| |
| /* Once pci64_ DMA mapping interface is in, kill this. */ |
| /*#define pci64_alloc_consistent(d,s,p) pci_alloc_consistent((d),(s),(p))*/ |
| /*#define pci64_free_consistent(d,s,c,a) pci_free_consistent((d),(s),(c),(a))*/ |
| |
| #define pci64_map_single(d,c,s,dir) pci_map_single((d),(c),(s),(dir)) |
| #define pci64_map_sg(d,s,n,dir) pci_map_sg((d),(s),(n),(dir)) |
| #define pci64_unmap_single(d,a,s,dir) pci_unmap_single((d),(a),(s),(dir)) |
| #define pci64_unmap_sg(d,s,n,dir) pci_unmap_sg((d),(s),(n),(dir)) |
| |
| #if (BITS_PER_LONG > 32) || defined(CONFIG_HIGHMEM64G) |
| #define pci64_dma_hi32(a) ((u32) (0xffffffff & (((u64)(a))>>32))) |
| #define pci64_dma_lo32(a) ((u32) (0xffffffff & (((u64)(a))))) |
| #else |
| #define pci64_dma_hi32(a) 0 |
| #define pci64_dma_lo32(a) (a) |
| #endif /* BITS_PER_LONG */ |
| #define sg_dma64_address(s) sg_dma_address(s) |
| #define sg_dma64_len(s) sg_dma_len(s) |
| |
| |
| #endif /* __INCmvLinuxIalHth */ |