1/* Driver for Realtek PCI-Express card reader 2 * Header file 3 * 4 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2, or (at your option) any 9 * later version. 10 * 11 * This program is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License along 17 * with this program; if not, see <http://www.gnu.org/licenses/>. 18 * 19 * Author: 20 * Wei WANG (wei_wang@realsil.com.cn) 21 * Micky Ching (micky_ching@realsil.com.cn) 22 */ 23 24#ifndef __REALTEK_RTSX_H 25#define __REALTEK_RTSX_H 26 27#include <linux/io.h> 28#include <linux/bitops.h> 29#include <linux/delay.h> 30#include <linux/interrupt.h> 31#include <linux/kernel.h> 32#include <linux/module.h> 33#include <linux/moduleparam.h> 34#include <linux/slab.h> 35#include <linux/pci.h> 36#include <linux/mutex.h> 37#include <linux/cdrom.h> 38#include <linux/workqueue.h> 39#include <linux/timer.h> 40#include <linux/time.h> 41 42#include <scsi/scsi.h> 43#include <scsi/scsi_cmnd.h> 44#include <scsi/scsi_device.h> 45#include <scsi/scsi_devinfo.h> 46#include <scsi/scsi_eh.h> 47#include <scsi/scsi_host.h> 48 49#define CR_DRIVER_NAME "rts5208" 50 51#define pci_get_bus_and_slot(bus, devfn) \ 52 pci_get_domain_bus_and_slot(0, (bus), (devfn)) 53 54/* 55 * macros for easy use 56 */ 57#define rtsx_writel(chip, reg, value) \ 58 iowrite32(value, (chip)->rtsx->remap_addr + reg) 59#define rtsx_readl(chip, reg) \ 60 ioread32((chip)->rtsx->remap_addr + reg) 61#define rtsx_writew(chip, reg, value) \ 62 iowrite16(value, (chip)->rtsx->remap_addr + reg) 63#define rtsx_readw(chip, reg) \ 64 ioread16((chip)->rtsx->remap_addr + reg) 65#define rtsx_writeb(chip, reg, value) \ 66 iowrite8(value, (chip)->rtsx->remap_addr + reg) 67#define rtsx_readb(chip, reg) \ 68 ioread8((chip)->rtsx->remap_addr + reg) 69 70#define rtsx_read_config_byte(chip, where, val) \ 71 pci_read_config_byte((chip)->rtsx->pci, where, val) 72 73#define rtsx_write_config_byte(chip, where, val) \ 74 pci_write_config_byte((chip)->rtsx->pci, where, val) 75 76#define wait_timeout_x(task_state, msecs) \ 77do { \ 78 set_current_state((task_state)); \ 79 schedule_timeout((msecs) * HZ / 1000); \ 80} while (0) 81#define wait_timeout(msecs) wait_timeout_x(TASK_INTERRUPTIBLE, (msecs)) 82 83 84#define STATE_TRANS_NONE 0 85#define STATE_TRANS_CMD 1 86#define STATE_TRANS_BUF 2 87#define STATE_TRANS_SG 3 88 89#define TRANS_NOT_READY 0 90#define TRANS_RESULT_OK 1 91#define TRANS_RESULT_FAIL 2 92 93#define SCSI_LUN(srb) ((srb)->device->lun) 94 95typedef unsigned long DELAY_PARA_T; 96 97struct rtsx_chip; 98 99struct rtsx_dev { 100 struct pci_dev *pci; 101 102 /* pci resources */ 103 unsigned long addr; 104 void __iomem *remap_addr; 105 int irq; 106 107 /* locks */ 108 spinlock_t reg_lock; 109 110 struct task_struct *ctl_thread; /* the control thread */ 111 struct task_struct *polling_thread; /* the polling thread */ 112 113 /* mutual exclusion and synchronization structures */ 114 struct completion cmnd_ready; /* to sleep thread on */ 115 struct completion control_exit; /* control thread exit */ 116 struct completion polling_exit; /* polling thread exit */ 117 struct completion notify; /* thread begin/end */ 118 struct completion scanning_done; /* wait for scan thread */ 119 120 wait_queue_head_t delay_wait; /* wait during scan, reset */ 121 struct mutex dev_mutex; 122 123 /* host reserved buffer */ 124 void *rtsx_resv_buf; 125 dma_addr_t rtsx_resv_buf_addr; 126 127 char trans_result; 128 char trans_state; 129 130 struct completion *done; 131 /* Whether interrupt handler should care card cd info */ 132 u32 check_card_cd; 133 134 struct rtsx_chip *chip; 135}; 136 137typedef struct rtsx_dev rtsx_dev_t; 138 139/* Convert between rtsx_dev and the corresponding Scsi_Host */ 140static inline struct Scsi_Host *rtsx_to_host(struct rtsx_dev *dev) 141{ 142 return container_of((void *) dev, struct Scsi_Host, hostdata); 143} 144static inline struct rtsx_dev *host_to_rtsx(struct Scsi_Host *host) 145{ 146 return (struct rtsx_dev *) host->hostdata; 147} 148 149static inline void get_current_time(u8 *timeval_buf, int buf_len) 150{ 151 struct timeval tv; 152 153 if (!timeval_buf || (buf_len < 8)) 154 return; 155 156 do_gettimeofday(&tv); 157 158 timeval_buf[0] = (u8)(tv.tv_sec >> 24); 159 timeval_buf[1] = (u8)(tv.tv_sec >> 16); 160 timeval_buf[2] = (u8)(tv.tv_sec >> 8); 161 timeval_buf[3] = (u8)(tv.tv_sec); 162 timeval_buf[4] = (u8)(tv.tv_usec >> 24); 163 timeval_buf[5] = (u8)(tv.tv_usec >> 16); 164 timeval_buf[6] = (u8)(tv.tv_usec >> 8); 165 timeval_buf[7] = (u8)(tv.tv_usec); 166} 167 168/* The scsi_lock() and scsi_unlock() macros protect the sm_state and the 169 * single queue element srb for write access */ 170#define scsi_unlock(host) spin_unlock_irq(host->host_lock) 171#define scsi_lock(host) spin_lock_irq(host->host_lock) 172 173#define lock_state(chip) spin_lock_irq(&((chip)->rtsx->reg_lock)) 174#define unlock_state(chip) spin_unlock_irq(&((chip)->rtsx->reg_lock)) 175 176/* struct scsi_cmnd transfer buffer access utilities */ 177enum xfer_buf_dir {TO_XFER_BUF, FROM_XFER_BUF}; 178 179int rtsx_read_pci_cfg_byte(u8 bus, u8 dev, u8 func, u8 offset, u8 *val); 180 181#define _MSG_TRACE 182 183#include "trace.h" 184#include "rtsx_chip.h" 185#include "rtsx_transport.h" 186#include "rtsx_scsi.h" 187#include "rtsx_card.h" 188#include "rtsx_sys.h" 189#include "general.h" 190 191#endif /* __REALTEK_RTSX_H */ 192