1 /* 2 * Copyright (c) 2006 David Gwynne <dlg@openbsd.org> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * 16 * $OpenBSD: sili.c,v 1.147 2009/02/16 21:19:07 miod Exp $ 17 */ 18 19 #if defined(__DragonFly__) 20 #include "sili_dragonfly.h" 21 #else 22 #error "build for OS unknown" 23 #endif 24 #include "pmreg.h" 25 #include "atascsi.h" 26 27 /* change to SILI_DEBUG for dmesg spam */ 28 #define NO_SILI_DEBUG 29 30 #ifdef SILI_DEBUG 31 #define DPRINTF(m, f...) do { if ((silidebug & (m)) == (m)) kprintf(f); } \ 32 while (0) 33 #define SILI_D_TIMEOUT 0x00 34 #define SILI_D_VERBOSE 0x01 35 #define SILI_D_INTR 0x02 36 #define SILI_D_XFER 0x08 37 int silidebug = SILI_D_VERBOSE; 38 #else 39 #define DPRINTF(m, f...) 40 #endif 41 42 /* 43 * BAR0 - Global Registers 128-byte aligned, 128-byte region 44 * BAR1 - Port Registers and LRAM 32KB-aligned 45 * BAR2 - Indirect I/O registers (we don't use this) 46 */ 47 48 /* 49 * Port-N Slot Status. 50 * 51 * NOTE: Mirrors SILI_PREG_SLOTST 52 */ 53 #define SILI_REG_SLOTST(n) (0x0000 + ((n) * 4)) 54 #define SILI_REG_SLOTST_ATTN 0x80000000 /* attention required */ 55 56 #define SILI_REG_GCTL 0x0040 /* Global Control */ 57 #define SILI_REG_GCTL_PORTEN(n) (1 << (n)) /* Port interrupt ena */ 58 #define SILI_REG_GCTL_300CAP 0x01000000 /* 3Gb/s capable (R) */ 59 #define SILI_REG_GCTL_I2C_IEN 0x20000000 /* I2C Int enable */ 60 #define SILI_REG_GCTL_MSIACK 0x40000000 /* MSI Ack W1C */ 61 #define SILI_REG_GCTL_GRESET 0x80000000 /* global reset */ 62 63 #define SILI_REG_GINT 0x0044 /* Global Interrupt Status */ 64 #define SILI_REG_GINT_I2C 0x20000000 /* I2C Int Status */ 65 #define SILI_REG_GINT_PORTST(n) (1 << (n)) /* Port interrupt stat */ 66 #define SILI_REG_GINT_PORTMASK 0x0000FFFF 67 68 /* 69 * Most bits in phyconf should not be modified. Setting the low four bits 70 * to 1's, all channel Tx outputs spread spectrum clocking. 71 */ 72 #define SILI_REG_PHYCONF 0x0048 /* PHY Configuration */ 73 #define SILI_REG_PHYCONF_ALLSS 0x000F /* spread spectrum tx */ 74 75 /* 76 * BIST_CTL_TEN - Enable data paths for running data loopback BIST 77 * BIST_CTL_TPAT - Select repeating pattern (1) or pseudo-random 78 * pattern (0) 79 * BIST_CTL_RXSEL- Select the rx port for pattern comparison 80 * BIST_CTL_TXSEL- Select the tx ports that transmit loopback data 81 */ 82 #define SILI_REG_BIST_CTL 0x0050 83 #define SILI_REG_BIST_CTL_TEN 0x80000000 84 #define SILI_REG_BIST_CTL_TPAT 0x40000000 85 #define SILI_REG_BIST_CTL_RXSEL(n) ((n) << 16) 86 #define SILI_REG_BIST_CTL_TXSEL(n) (1 << (n)) 87 88 #define SILI_REG_BIST_PATTERN 0x0054 /* 32 bit pattern */ 89 90 /* 91 * GOOD is set to 1 on BIST initiation, and reset to 0 on the first 92 * comparison failure. 93 */ 94 #define SILI_REG_BIST_STATUS 0x0058 95 #define SILI_REG_BIST_STATUS_CNT 0x000007FF /* pattern counter */ 96 #define SILI_REG_BIST_STATUS_GOOD 0x80000000 /* set to 0 on compare fail */ 97 98 #define SILI_REG_I2C_CTL 0x0060 99 #define SILI_REG_I2C_CTL_START 0x00000001 100 #define SILI_REG_I2C_CTL_STOP 0x00000002 101 #define SILI_REG_I2C_CTL_NACK 0x00000004 /* send nack on data byte rx */ 102 #define SILI_REG_I2C_CTL_TFDATA 0x00000008 /* set to initiate txfer */ 103 /* to/from data buffer */ 104 #define SILI_REG_I2C_CTL_MABORT 0x00000010 /* set w/STOP to send stop */ 105 /* without first xfering a */ 106 /* byte */ 107 #define SILI_REG_I2C_CTL_SCLEN 0x00000020 /* clock-en for master mode */ 108 #define SILI_REG_I2C_CTL_UNITEN 0x00000040 /* enable controller */ 109 #define SILI_REG_I2C_CTL_GCALLD 0x00000080 /* Disable detect of a */ 110 /* general call address */ 111 #define SILI_REG_I2C_CTL_TXBEI 0x00000100 /* xmit buffer empty int en */ 112 #define SILI_REG_I2C_CTL_RXBFI 0x00000200 /* rx buffer full int en */ 113 #define SILI_REG_I2C_CTL_BERRI 0x00000400 /* bus error int en */ 114 #define SILI_REG_I2C_CTL_STOPI 0x00000800 /* stop detect int en */ 115 #define SILI_REG_I2C_CTL_ARBLI 0x00001000 /* arb loss int en */ 116 #define SILI_REG_I2C_CTL_ARBDI 0x00002000 /* arb detect int en */ 117 #define SILI_REG_I2C_CTL_UNITRS 0x00004000 /* reset I2C controller */ 118 #define SILI_REG_I2C_CTL_FASTM 0x00008000 /* 400kbit/s (else 100kbit/s)*/ 119 120 #define SILI_REG_I2C_STS 0x0064 121 #define SILI_REG_I2C_STS_RW 0x00000001 122 #define SILI_REG_I2C_STS_ACKSTS 0x00000002 /* ack/nack status(R) last */ 123 /* ack or nack sent or rcvd */ 124 #define SILI_REG_I2C_STS_UNTBSY 0x00000004 /* unit busy (R) */ 125 #define SILI_REG_I2C_STS_BUSBSY 0x00000008 /* bus busy with activity(R) */ 126 /* other then from controller*/ 127 #define SILI_REG_I2C_STS_STOPDT 0x00000010 /* stop detect (R/W1C) */ 128 #define SILI_REG_I2C_STS_ARBLD 0x00000020 /* arb loss detect (R/W1C) */ 129 #define SILI_REG_I2C_STS_TXBED 0x00000040 /* tx buffer empty (R) */ 130 #define SILI_REG_I2C_STS_RXBFD 0x00000080 /* rx buffer full (R/W1C) */ 131 #define SILI_REG_I2C_STS_GCALLD 0x00000100 /* Gen Call detect (R/W1C) */ 132 #define SILI_REG_I2C_STS_SADDRD 0x00000200 /* Slave addr detect (R/W1C) */ 133 #define SILI_REG_I2C_STS_BERRD 0x00000400 /* Bus error detect (R/W1C) */ 134 135 #define SILI_REG_I2C_SADDR 0x0068 /* our slave address */ 136 #define SILI_REG_I2C_SADDR_MASK 0x0000003F /* 6 bits */ 137 138 #define SILI_REG_I2C_DATA 0x006C /* data buffer (8 bits) */ 139 140 #define SILI_REG_FLASH_ADDR 0x0070 /* Flash control & addr reg */ 141 #define SILI_REG_FLASH_ADDR_MEMPRS 0x04000000 /* Flash memory present */ 142 #define SILI_REG_FLASH_ADDR_GPIOEN 0x80000000 /* use flash data pins for */ 143 /* GPIO */ 144 #define SILI_REG_FLASH_ADDR_MEMST 0x02000000 /* Mem Access Start (R/W) */ 145 /* (clears on op complete) */ 146 #define SILI_REG_FLASH_ADDR_MEMRD 0x01000000 /* 0=write, 1=read */ 147 #define SILI_REG_FLASH_ADDR_MASK 0x0003FFFF /* 18 bit memory address */ 148 149 /* 150 * NOTE: In order to set a GPIO pin to read the DATA bit must be written to 151 * 1and the DCTL (drain control) bit must be written to 1 as well 152 * to make it open-drain only (drive on low only). 153 */ 154 #define SILI_REG_GPIO 0x0074 155 #define SILI_REG_GPIO_DATA_SHIFT 0 /* 8 bits Flash or GPIO data */ 156 #define SILI_REG_GPIO_TDET_SHIFT 8 /* 8 bits transition detect */ 157 #define SILI_REG_GPIO_DCTL_SHIFT 16 /* 8 bits drain control */ 158 159 /* 160 * Per-port registers 161 * 162 */ 163 164 #define SILI_PORT_REGION(port) (8192 * (port)) 165 #define SILI_PORT_SIZE 8192 166 #define SILI_PREG_LRAM 0x0000 /* 0x0000-0x0F7F */ 167 #define SILI_PREG_LRAM_SLOT(n) (0x0000 + (128 * (n))) 168 169 #define SILI_PREG_LRAM_SLOT_FIS 0x0000 /* Current FIS and Control */ 170 #define SILI_PREG_LRAM_DMA0 0x0020 /* DMA Entry 0 or ATAPI cmd */ 171 #define SILI_PREG_LRAM_DMA1 0x0030 /* DMA Entry 0 or ATAPI cmd */ 172 #define SILI_PREG_LRAM_CMDACT 0x0040 /* Cmd Act Reg (actual) 64b */ 173 #define SILI_PREG_LRAM_DMATAB 0x0040 /* Scatter Gather Table */ 174 175 /* 176 * Each port has a port status and qactive register for each target behind 177 * the port multiplier, if there is a port multiplier. 178 * 179 * SERVICE - Service received from device, service command from controller 180 * not yet acknowledged. 181 * 182 * LEGACY - One or more legacy queued commands is outstanding. 183 * 184 * NATIVE - One or more NCQ queued commands is outstanding. 185 * 186 * VBSY - A virtual device busy indicating that a command has been issued 187 * to the device and the device has not yet sent the final D2H 188 * register FIS, or that a data transfer is in progress. 189 * 190 * The PM_QACTIVE register contains a demultiplexed bitmap of slots queued 191 * to each target behind the port multiplier. 192 * 193 */ 194 #define SILI_PREG_PM_STATUS(n) (0x0F80 + (8 * (n))) 195 #define SILI_PREG_PM_QACTIVE(n) (0x0F84 + (8 * (n))) 196 197 #define SILI_PREG_PM_STATUS_SERVICE 0x00010000 /* Service pending */ 198 #define SILI_PREG_PM_STATUS_LEGACY 0x00008000 /* Legacy outstanding*/ 199 #define SILI_PREG_PM_STATUS_NATIVE 0x00004000 /* NCQ outstanding */ 200 #define SILI_PREG_PM_STATUS_VBSY 0x00002000 /* virtual dev busy */ 201 #define SILI_PREG_PM_STATUS_EXEC_SHIFT 8 /* last active slot */ 202 #define SILI_PREG_PM_STATUS_EXEC_MASK 0x1F 203 #define SILI_PREG_PM_STATUS_PIO_MASK 0xFF /* last PIO setup */ 204 205 /* 206 * NOTE: SILI_PREG_STATUS uses the same address as SILI_PREG_CTL_SET, 207 * but for read. 208 */ 209 #define SILI_PREG_STATUS 0x1000 /* Port Control Status (R) */ 210 #define SILI_PREG_STATUS_READY 0x80000000 /* Port Ready (R) */ 211 #define SILI_PREG_STATUS_SLOT 0x001F0000 /* Active Slot (R) */ 212 #define SILI_PREG_STATUS_SLOT_SHIFT 16 /* Shift value */ 213 #define SILI_PREG_STATUS_MASK 0x0200FFFF /* see PREG_CTL_xxx */ 214 215 /* 216 * NOTE: Reset sequence. Set CTL_RESET, Clear CTL_RESET, then Wait for 217 * the port to become ready. 218 * 219 * NOTE: NOAUTOCC. If set to 1 a 1 must be written to the command completion 220 * bit in the port interrupt status register to clear it. When set to 221 * 0 then reading the port slot status register will automatically clear 222 * the command completion interrupt. 223 * 224 * NOTE: ATA16 controls whether a PACKET mode command is 12 or 16 bytes. 225 * 226 * NOTE: RESUME if set to 1 processing is enabled for outstanding commands 227 * to additional targets connected to a port multiplier after a command 228 * error has occured. When set the internal BUSY status will be set 229 * for the target that errored, preventing additional commands from 230 * being sent until a Port Initialize operation is performed. 231 * 232 * NOTE: 32BITDMA if 1 causes a write to the low 32 bits of a Command 233 * Activation register to copy PREG_32BIT_ACTUA to the upper 32 234 * bits and start command execution. If 0 you must write to the 235 * low 32 bits and then the high 32 bits and your write to the 236 * high 32 bits will start command execution. 237 * 238 * NOTE: OOB_BYP is set on global reset and not changed by a port reset. 239 */ 240 #define SILI_PREG_CTL_SET 0x1000 /* Port Control Set (W1S) */ 241 #define SILI_PREG_CTL_CLR 0x1004 /* Port Control Clear (W1C) */ 242 #define SILI_PREG_CTL_RESET 0x00000001 /* Hold port in reset */ 243 #define SILI_PREG_CTL_DEVRESET 0x00000002 /* Device reset */ 244 /* (Self clearing) */ 245 #define SILI_PREG_CTL_INIT 0x00000004 /* Port initialize */ 246 /* (Self clearing) */ 247 #define SILI_PREG_CTL_NOAUTOCC 0x00000008 248 #define SILI_PREG_CTL_NOLED 0x00000010 /* Disable the LED port */ 249 /* activity indicator. */ 250 #define SILI_PREG_CTL_ATA16 0x00000020 /* 0=12 byte 1=16 byte */ 251 #define SILI_PREG_CTL_RESUME 0x00000040 /* PM special error handling */ 252 #define SILI_PREG_CTL_TXBIST 0x00000080 /* transmit a BIST FIS */ 253 #define SILI_PREG_CTL_CONT_DIS 0x00000100 /* no CONT on repeat primitves*/ 254 #define SILI_PREG_CTL_NOSCRAM 0x00000200 /* Disable link scrambler */ 255 #define SILI_PREG_CTL_32BITDMA 0x00000400 /* see above */ 256 #define SILI_PREG_CTL_ACC_ILCK 0x00000800 /* accept interlocked FIS rx */ 257 /* (Self clearing) */ 258 #define SILI_PREG_CTL_REJ_ILCK 0x00001000 /* reject interlocked FIS rx */ 259 /* (Self clearing) */ 260 #define SILI_PREG_CTL_PMA 0x00002000 /* Enable PM support */ 261 #define SILI_PREG_CTL_AUTO_ILCK 0x00004000 /* Auto interlock accept */ 262 #define SILI_PREG_CTL_LEDON 0x00008000 /* LED on */ 263 #define SILI_PREG_CTL_OOB_BYP 0x02000000 /* Bypass OOB initialization */ 264 265 /* 266 * Status bits in the upper half of the register report the actual condition 267 * while the status bits in the lower half of the register are masked by 268 * the interrupt enable bits or threshold registers. Writing a 1 to either 269 * version will clear it. 270 * 271 * NOTE: The steering bits written to INT_ENABLE will not show up in the 272 * status register. The INT_ENABLE/INT_DISABLE registers are R+W1S 273 * or R+W1C and thus can be read. 274 * 275 * NOTE: PHYRDYCHG, COMWAKE, UNRECFIS, DEVEXCHG: Can be cleared by writing 276 * W1C either here or via the DIAG.xxx bit bit in SError. 277 */ 278 #define SILI_PREG_INT_STATUS 0x1008 /* Control clear */ 279 #define SILI_PREG_INT_ENABLE 0x1010 /* Interrupt Enable Set */ 280 #define SILI_PREG_INT_DISABLE 0x1014 /* Interrupt Enable Clear */ 281 282 #define SILI_PREG_INT_STEER(n) ((n) << 30) /* Port Int -> INTA...INTD */ 283 #define SILI_PREG_INT_CCOMPLETE 0x00000001 /* one or more cmds completed*/ 284 #define SILI_PREG_INT_CERROR 0x00000002 /* read port error register */ 285 /* to get error */ 286 #define SILI_PREG_INT_READY 0x00000004 /* Port is ready for cmds */ 287 #define SILI_PREG_INT_PMCHANGE 0x00000008 /* Change in power mng state */ 288 #define SILI_PREG_INT_PHYRDYCHG 0x00000010 /* Mirrors DIAG.N in SError */ 289 #define SILI_PREG_INT_COMWAKE 0x00000020 /* Mirrors DIAG.W in SError */ 290 #define SILI_PREG_INT_UNRECFIS 0x00000040 /* Mirrors DIAG.F in SError */ 291 #define SILI_PREG_INT_DEVEXCHG 0x00000080 /* Mirrors DIAG.X in SError */ 292 #define SILI_PREG_INT_DECODE 0x00000100 /* 8b/10b dec err cnt > thr */ 293 #define SILI_PREG_INT_CRC 0x00000200 /* CRC err count > thr */ 294 #define SILI_PREG_INT_HANDSHK 0x00000400 /* Handshake err count > thr */ 295 #define SILI_PREG_INT_SDB 0x00000800 /* Set Device Bits (SNotify) */ 296 #define SILI_PREG_INT_SHIFT 16 /* shift upper bits of status*/ 297 298 #define SILI_PREG_IST_CCOMPLETE 0x00010000 /* one or more cmds completed*/ 299 #define SILI_PREG_IST_CERROR 0x00020000 /* read port error register */ 300 /* to get error */ 301 #define SILI_PREG_IST_READY 0x00040000 /* Port is ready for cmds */ 302 #define SILI_PREG_IST_PMCHANGE 0x00080000 /* Change in power mng state */ 303 #define SILI_PREG_IST_PHYRDYCHG 0x00100000 /* Mirrors DIAG.N in SError */ 304 #define SILI_PREG_IST_COMWAKE 0x00200000 /* Mirrors DIAG.W in SError */ 305 #define SILI_PREG_IST_UNRECFIS 0x00400000 /* Mirrors DIAG.F in SError */ 306 #define SILI_PREG_IST_DEVEXCHG 0x00800000 /* Mirrors DIAG.X in SError */ 307 #define SILI_PREG_IST_DECODE 0x01000000 /* 8b/10b dec err cnt > thr */ 308 #define SILI_PREG_IST_CRC 0x02000000 /* CRC err count > thr */ 309 #define SILI_PREG_IST_HANDSHK 0x04000000 /* Handshake err count > thr */ 310 #define SILI_PREG_IST_SDB 0x08000000 /* Set Device Bits (SNotify) */ 311 312 #define SILI_PREG_INT_MASK (SILI_PREG_INT_CCOMPLETE | \ 313 SILI_PREG_INT_CERROR | \ 314 SILI_PREG_INT_READY | \ 315 SILI_PREG_INT_PMCHANGE | \ 316 SILI_PREG_INT_PHYRDYCHG | \ 317 SILI_PREG_INT_COMWAKE | \ 318 SILI_PREG_INT_UNRECFIS | \ 319 SILI_PREG_INT_DEVEXCHG | \ 320 SILI_PREG_INT_DECODE | \ 321 SILI_PREG_INT_CRC | \ 322 SILI_PREG_INT_HANDSHK | \ 323 SILI_PREG_INT_SDB) 324 #define SILI_PREG_IST_MASK (SILI_PREG_INT_MASK << 16) 325 326 #define SILI_PFMT_INT_STATUS "\020" \ 327 "\034SDB" \ 328 "\033HANDSHK" \ 329 "\032CRC" \ 330 "\031DECODE" \ 331 "\030DEVEXCHG" \ 332 "\027UNRECFIS" \ 333 "\026COMWAKE" \ 334 "\025PHYRDYCHG" \ 335 "\024PMCHANGE" \ 336 "\023READY" \ 337 "\022ERROR" \ 338 "\021COMPLETE" \ 339 \ 340 "\014SDBm" \ 341 "\013HANDSHKm" \ 342 "\012CRCm" \ 343 "\011DECODEm" \ 344 "\010DEVEXCHGm" \ 345 "\007UNRECFISm" \ 346 "\006COMWAKEm" \ 347 "\005PHYRDYCHGm" \ 348 "\004PMCHANGEm" \ 349 "\003READYm" \ 350 "\002ERRORm" \ 351 "\001COMPLETEm" 352 353 /* 354 * 32BIT_ACTUA is only used when DMA is 32 bits. It is typically set to 0. 355 */ 356 #define SILI_PREG_32BIT_ACTUA 0x101C /* 32b activation upper addr */ 357 358 /* 359 * Writing a slot number 0-30 to CMD_FIFO starts the command from LRAM. 360 */ 361 #define SILI_PREG_CMD_FIFO 0x1020 /* Command execution FIFO */ 362 363 /* 364 * If the port is interrupted via INT_CERROR this register contains 365 * the error code. 366 * 367 * Most errors write the task file register back to the PRB slot for host 368 * scrutiny. 369 */ 370 #define SILI_PREG_CERROR 0x1024 /* Command error */ 371 #define SILI_PREG_CERROR_DEVICE 1 /* ERR set in D2H FIS */ 372 #define SILI_PREG_CERROR_SDBERROR 2 /* ERR set in SDB from device*/ 373 #define SILI_PREG_CERROR_DATAFISERR 3 /* Sil3132 error on send */ 374 #define SILI_PREG_CERROR_SENDFISERR 4 /* Sil3132 error on send */ 375 #define SILI_PREG_CERROR_BADSTATE 5 /* Sil3132 inconsistency */ 376 #define SILI_PREG_CERROR_DIRECTION 6 /* DMA direction mismatch */ 377 #define SILI_PREG_CERROR_UNDERRUN 7 /* DMA SG H2D list too small */ 378 #define SILI_PREG_CERROR_OVERRUN 8 /* DMA SG D2H list too small */ 379 #define SILI_PREG_CERROR_LLOVERUN 9 /* Too much data from device */ 380 #define SILI_PREG_CERROR_PKTPROTO 11 /* Packet protocol error */ 381 #define SILI_PREG_CERROR_BADALIGN 16 /* Bad SG list, not 8-byte */ 382 /* aligned */ 383 #define SILI_PREG_CERROR_PCITGTABRT 17 /* PCI target abort received */ 384 #define SILI_PREG_CERROR_PCIMASABRT 18 /* PCI master abort received */ 385 #define SILI_PREG_CERROR_PCIPARABRT 19 /* PCI parity abort received */ 386 #define SILI_PREG_CERROR_PRBALIGN 24 /* PRB addr not 8-byte algned*/ 387 #define SILI_PREG_CERROR_PCITGTABRT2 25 /* During fetch of PRB */ 388 #define SILI_PREG_CERROR_PCIMASABRT2 26 /* During fetch of PRB */ 389 #define SILI_PREG_CERROR_PCIPARABRT3 33 /* During data transfer */ 390 #define SILI_PREG_CERROR_PCITGTABRT3 34 /* During data transfer */ 391 #define SILI_PREG_CERROR_PCIMASABRT3 35 /* During data transfer */ 392 #define SILI_PREG_CERROR_SERVICE 36 /* FIS received during tx */ 393 /* phase */ 394 395 /* 396 * Port FIS Configuration. Fir each possible FIS type, a 2-bit code 397 * defines the desired reception behavior as follows. Bits [1:0] define 398 * the code for all other FIS types not defined by [29:2]. 399 * 400 * 00 Accept FIS without interlock 401 * 01 Reject FIS without interlock 402 * 10 Interlock FIS 403 * 11 (reserved) 404 * 405 * FIS Code Name Start Default 406 * -------- ------ ------ ------- 407 * ---- (reserved) 30 408 * 0x27 Register (H2D) 28 01 409 * 0x34 Register (D2H) 26 00 410 * 0x39 DMA Activate 24 00 411 * 0x41 DMA Setup 22 00 412 * 0x46 Data 20 00 413 * 0x58 BIST Activate 18 00 414 * 0x5F PIO Setup 16 00 415 * 0xA1 Set Device Bits 14 00 416 * 0xA6 (reserved) 12 01 417 * 0xB8 (reserved) 10 01 418 * 0xBF (reserved) 8 01 419 * 0xC7 (reserved) 6 01 420 * 0xD4 (reserved) 4 01 421 * 0xD9 (reserved) 2 01 422 * ALL OTHERS (reserved) 0 01 423 */ 424 #define SILI_PREG_FIS_CONFIG 0x1028 /* FIS configuration */ 425 426 /* 427 * The data FIFO is 2KBytes in each direction. 428 * 429 * When DMAing from the device the Write Request Threshold is used. 430 * When DMAing to the device the Read Request Threshold is used. 431 * 432 * The threshold can be set from 1-2040 bytes (write 0-2039), in multiples 433 * of 8 bits. The low 3 bits are hardwired to 0. A value of 0 causes a 434 * request whenever possible. 435 */ 436 #define SILI_PREG_FIFO_CTL 0x102C /* PCIex request FIFO thresh */ 437 #define SILI_PREG_FIFO_CTL_READ_SHIFT 0 438 #define SILI_PREG_FIFO_CTL_WRITE_SHIFT 16 439 #define SILI_PREG_FIFO_CTL_MASK 0xFF 440 #define SILI_PREG_FIFO_CTL_ENCODE(rlevel, wlevel) (rlevel | (wlevel << 16)) 441 442 /* 443 * Error counters and thresholds. The counter occupies the low 16 bits 444 * and the threshold occupies the high 16 bits. The appropriate interrupt 445 * occurs when the counter exceeds the threshold. Clearing the interrupt 446 * clears the counter as well. A threshold of 0 disables the interrupt 447 * assertion and masks the interrupt status bit in the port interrupt status 448 * register. 449 */ 450 #define SILI_PREG_CTR_DECODE 0x1040 /* 8B/10B Decode Error Ctr */ 451 #define SILI_PREG_CTR_CRC 0x1044 /* CRC Error Counter */ 452 #define SILI_PREG_CTR_HANDSHK 0x1048 /* Handshake Error Counter */ 453 454 /* 455 * NOTE: This register is reset only by the global reset and will not be 456 * reset by a port reset. 457 * 458 * NOTE: Bits 15:5 configure the PHY and should not be changed unless you 459 * want to blow up the part. 460 * 461 * Bits 4:0 define the nominal output swing for the transmitter 462 * and are set to 0x0C by default. Generally speaking, don't mess 463 * with them. 464 */ 465 #define SILI_PREG_PHY_CONFIG 0x1050 /* Handshake Error Counter */ 466 #define SILI_PREG_PHY_CONFIG_AMP_MASK 0x1F 467 468 #define SILI_PREG_SLOTST 0x1800 /* Slot Status */ 469 #define SILI_PREG_SLOTST_ATTN 0x80000000 /* 0-30 bit for each slot */ 470 471 /* 472 * Shadow command activation register, shadows low or high 32 bits 473 * of actual command activation register. 474 */ 475 #define SILI_PREG_CMDACT(n) (0x1C00 + (8 * (n))) 476 477 /* 478 * Port Context Register. Contains the port multipler target (0-15) and 479 * the command slot (0-31) for the PM port state machine. 480 * 481 * Upon a processing halt due to a device specific error, the port multipler 482 * target is the one that returned the error status. 483 * 484 * The command slot is NOT deterministic in this case and should not be 485 * assumed valid. Use READ LOG EXTENDED to determine the tag number. 486 * However, the documentation does appear to indicate that for non-NCQ 487 * errors the command slot does contain the tag that errored (since there 488 * will be only one truely active). 489 */ 490 #define SILI_PREG_CONTEXT 0x1E04 491 #define SILI_PREG_CONTEXT_SLOT_MASK 0x1F 492 #define SILI_PREG_CONTEXT_PMPORT_MASK 0x0F 493 #define SILI_PREG_CONTEXT_SLOT_SHIFT 0 494 #define SILI_PREG_CONTEXT_PMPORT_SHIFT 5 495 496 /* 497 * SControl register - power management, speed negotiation, and COMRESET 498 * operation. 499 */ 500 #define SILI_PREG_SCTL 0x1F00 501 502 /* 503 * PMP: Identify the PM port for accessing the SActive register and some 504 * bit fields of the Diagnostic registers. 505 */ 506 #define SILI_PREG_SCTL_PMP 0x000F0000 507 #define SILI_PREG_SCTL_PMP_SHIFT 16 508 509 /* 510 * SPM: It is unclear from mode 4 is. "Transition from a power management 511 * state initiate (ComWake asserted)". When setting a state, the field 512 * will self-reset to 0 as soon as the action is initiated. 513 */ 514 #define SILI_PREG_SCTL_SPM 0x0000F000 515 #define SILI_PREG_SCTL_SPM_NONE 0x00000000 516 #define SILI_PREG_SCTL_SPM_PARTIAL 0x00010000 517 #define SILI_PREG_SCTL_SPM_SLUMBER 0x00020000 518 #define SILI_PREG_SCTL_SPM_FROM 0x00040000 519 520 /* 521 * IPM: Identify interface power management states not supported (bits). 522 */ 523 #define SILI_PREG_SCTL_IPM 0x00000F00 524 #define SILI_PREG_SCTL_IPM_NONE 0x00000000 525 #define SILI_PREG_SCTL_IPM_NPARTIAL 0x00000100 526 #define SILI_PREG_SCTL_IPM_NSLUMBER 0x00000200 527 528 /* 529 * SPD: Limit speed negotiation (0000 for no restrictions) 530 */ 531 #define SILI_PREG_SCTL_SPD 0x000000F0 532 #define SILI_PREG_SCTL_SPD_NONE 0x00000000 533 #define SILI_PREG_SCTL_SPD_GEN1 0x00000010 534 #define SILI_PREG_SCTL_SPD_GEN2 0x00000020 535 536 /* 537 * DET: Control host adapter device detection and interface initialization 538 */ 539 #define SILI_PREG_SCTL_DET 0x0000000F 540 #define SILI_PREG_SCTL_DET_NONE 0x00000000 /* nop/complete */ 541 #define SILI_PREG_SCTL_DET_INIT 0x00000001 /* hold in COMRESET */ 542 543 /* 544 * SStatus register - Probe status 545 */ 546 #define SILI_PREG_SSTS 0x1F04 547 #define SILI_PREG_SSTS_IPM 0x00000F00 548 #define SILI_PREG_SSTS_IPM_NOCOMM 0x00000000 549 #define SILI_PREG_SSTS_IPM_ACTIVE 0x00000100 550 #define SILI_PREG_SSTS_IPM_PARTIAL 0x00000200 551 #define SILI_PREG_SSTS_IPM_SLUMBER 0x00000600 552 553 #define SILI_PREG_SSTS_SPD 0x000000F0 554 #define SILI_PREG_SSTS_SPD_NONE 0x00000000 555 #define SILI_PREG_SSTS_SPD_GEN1 0x00000010 556 #define SILI_PREG_SSTS_SPD_GEN2 0x00000020 557 558 #define SILI_PREG_SSTS_DET 0x0000000F 559 #define SILI_PREG_SSTS_DET_NOPHY 0x00000000 /* no dev, no phy */ 560 #define SILI_PREG_SSTS_DET_DEV_NE 0x00000001 /* dev, no phy */ 561 #define SILI_PREG_SSTS_DET_DEV 0x00000003 /* dev and phy */ 562 #define SILI_PREG_SSTS_DET_OFFLINE 0x00000004 /* BIST/LOOPBACK */ 563 564 /* 565 * These are mostly R/W1C bits. "B", "C", and "H" operate independantly 566 * and depend on the corresponding error counter register. 567 */ 568 #define SILI_PREG_SERR 0x1F08 569 #define SILI_PREG_SERR_ERR_I (1<<0) /* Recovered Data Integrity */ 570 #define SILI_PREG_SERR_ERR_M (1<<1) /* Recovered Communications */ 571 #define SILI_PREG_SERR_ERR_T (1<<8) /* Transient Data Integrity */ 572 #define SILI_PREG_SERR_ERR_C (1<<9) /* Persistent Comm/Data */ 573 #define SILI_PREG_SERR_ERR_P (1<<10) /* Protocol */ 574 #define SILI_PREG_SERR_ERR_E (1<<11) /* Internal */ 575 #define SILI_PREG_SERR_DIAG_N (1<<16) /* PhyRdy Change */ 576 #define SILI_PREG_SERR_DIAG_I (1<<17) /* Phy Internal Error */ 577 #define SILI_PREG_SERR_DIAG_W (1<<18) /* Comm Wake */ 578 #define SILI_PREG_SERR_DIAG_B (1<<19) /* 10B to 8B Decode Error */ 579 #define SILI_PREG_SERR_DIAG_D (1<<20) /* Disparity Error */ 580 #define SILI_PREG_SERR_DIAG_C (1<<21) /* CRC Error */ 581 #define SILI_PREG_SERR_DIAG_H (1<<22) /* Handshake Error */ 582 #define SILI_PREG_SERR_DIAG_S (1<<23) /* Link Sequence Error */ 583 #define SILI_PREG_SERR_DIAG_T (1<<24) /* Transport State Trans Err */ 584 #define SILI_PREG_SERR_DIAG_F (1<<25) /* Unknown FIS Type */ 585 #define SILI_PREG_SERR_DIAG_X (1<<26) /* Exchanged */ 586 587 #define SILI_PFMT_SERR "\020" \ 588 "\033DIAG.X" "\032DIAG.F" "\031DIAG.T" "\030DIAG.S" \ 589 "\027DIAG.H" "\026DIAG.C" "\025DIAG.D" "\024DIAG.B" \ 590 "\023DIAG.W" "\022DIAG.I" "\021DIAG.N" \ 591 "\014ERR.E" "\013ERR.P" "\012ERR.C" "\011ERR.T" \ 592 "\002ERR.M" "\001ERR.I" 593 594 /* 595 * SACT provides indirect access to the Port Device QActive registers. 596 * We have direct access and do not have to use this. 597 */ 598 #define SILI_PREG_SACT 0x1F0C 599 600 /* 601 * Indicate which devices have sent a Set Device Bits FIS with Notifcation 602 * set. R/W1C 603 */ 604 #define SILI_PREG_SNTF 0x1F10 605 606 /* 607 * Internal register space indirect register access via the PCI I/O space. 608 * (This is for BIOSes running in 16-bit mode, we use the direct map). 609 * 610 * All offsets must be 4-byte aligned 611 */ 612 #define SILI_BAR2_GRO 0x0000 /* Global Register Offset */ 613 #define SILI_BAR2_GRD 0x0004 /* Global Register Data */ 614 #define SILI_BAR2_PRO 0x0008 /* Port Register Offset */ 615 #define SILI_BAR2_PRD 0x000C /* Port Register Data */ 616 617 /* 618 * SILI mapped structures 619 */ 620 struct sili_sge { 621 u_int64_t sge_paddr; 622 u_int32_t sge_count; 623 u_int32_t sge_flags; 624 } __packed; 625 626 #define SILI_SGE_FLAGS_TRM 0x80000000 /* last SGE associated w/cmd */ 627 #define SILI_SGE_FLAGS_LNK 0x40000000 /* link to SGE array */ 628 #define SILI_SGE_FLAGS_DRD 0x20000000 /* discard (ign sge_paddr) */ 629 #define SILI_SGE_FLAGS_XCF 0x10000000 /* external cmd fetch */ 630 631 /* 632 * Each sge is 16 bytes. 633 * 634 * We want our prb structure to be power-of-2 aligned (it is required to be 635 * at least 8-byte aligned). the prb base header is 4 SGE's but includes 2 636 * SGE's within it. 637 * The prb structure also can't cross a 64KB boundary, and thus can only 638 * have a maximum size of 65536 / 16 / 32 == ~128 entries (128 - 4) 639 */ 640 #define SILI_MAX_SGET (128 - 4) 641 #define SILI_MAX_PMPORTS 16 642 #define SILI_MAXPHYS (256 * 1024) /* 256 KB */ 643 644 #if SILI_MAXPHYS / PAGE_SIZE + 1 > (SILI_MAX_SGET * 3 / 4) 645 #error "SILI_MAX_SGET is not big enough" 646 #endif 647 648 649 /* 650 * The PRB 651 * 652 * NOTE: ATAPI PACKETS. The packet is stored in prb_sge[0] and sge[1] 653 * is the first SGE. 654 * 655 * NOTE: LRAM PRB. The PRB layout in the LRAM includes a single struct 656 * sili_sge[4]. We could use the LRAM for the PRB and host memory 657 * for an external SGE array, but LRAM in general has some serious 658 * hardware bugs. 659 * 660 * From linux: Reading the LRAM for a port while a command is 661 * outstanding can corrupt DMA. So we use a completely external PRB. 662 */ 663 struct sili_prb { 664 u_int16_t prb_control; 665 u_int16_t prb_override; 666 u_int32_t prb_xfer_count; 667 union { 668 struct ata_fis_h2d h2d; 669 struct ata_fis_d2h d2h; 670 } prb_fis; 671 u_int32_t prb_reserved1c; 672 struct sili_sge prb_sge_base[2]; 673 struct sili_sge prb_sge[SILI_MAX_SGET]; 674 } __packed; 675 676 #define prb_h2d prb_fis.h2d 677 #define prb_d2h prb_fis.d2h 678 #define prb_activation prb_ext[0].sge_paddr 679 #define prb_packet(prb) ((u_int8_t *)&(prb)->prb_sge[0]) 680 #define prb_sge_normal prb_sge_base[0] 681 #define prb_sge_packet prb_sge_base[1] 682 683 /* 684 * NOTE: override may be left 0 and the SIL3132 will decode the 685 * 8-bit ATA command and use the correct protocol. 686 */ 687 #define SILI_PRB_CTRL_OVERRIDE 0x0001 /* use protocol field override */ 688 #define SILI_PRB_CTRL_REXMIT 0x0002 /* ok to rexmit ext command */ 689 #define SILI_PRB_CTRL_EXTCMD 0x0004 /* FIS fetched from host memory */ 690 /* (else from LRAM) */ 691 #define SILI_PRB_CTRL_RECEIVE 0x0008 /* Reserve cmd slot to receive */ 692 /* an interlocked FIS */ 693 #define SILI_PRB_CTRL_READ 0x0010 /* device to host data */ 694 #define SILI_PRB_CTRL_WRITE 0x0020 /* host to device data */ 695 #define SILI_PRB_CTRL_NOINT 0x0040 /* do not post int on completion*/ 696 #define SILI_PRB_CTRL_SOFTRESET 0x0080 /* issue soft reset (special) */ 697 698 #define SILI_PRB_OVER_ATAPI 0x0001 699 #define SILI_PRB_OVER_ATA 0x0002 700 #define SILI_PRB_OVER_NCQ 0x0004 701 #define SILI_PRB_OVER_READ 0x0008 /* device to host data */ 702 #define SILI_PRB_OVER_WRITE 0x0010 /* host to device data */ 703 #define SILI_PRB_OVER_RAW 0x0020 /* no protocol special case */ 704 705 #define SILI_MAX_PORTS 16 706 #define SILI_MAX_CMDS 31 /* not 32 */ 707 708 struct sili_dmamem { 709 bus_dma_tag_t adm_tag; 710 bus_dmamap_t adm_map; 711 bus_dma_segment_t adm_seg; 712 bus_addr_t adm_busaddr; 713 caddr_t adm_kva; 714 }; 715 #define SILI_DMA_MAP(_adm) ((_adm)->adm_map) 716 #define SILI_DMA_DVA(_adm) ((_adm)->adm_busaddr) 717 #define SILI_DMA_KVA(_adm) ((void *)(_adm)->adm_kva) 718 719 struct sili_softc; 720 struct sili_port; 721 struct sili_device; 722 723 struct sili_ccb { 724 /* ATA xfer associated with this CCB. Must be 1st struct member. */ 725 struct ata_xfer ccb_xa; 726 struct callout ccb_timeout; 727 728 int ccb_slot; 729 struct sili_port *ccb_port; 730 731 bus_dmamap_t ccb_dmamap; 732 struct sili_prb *ccb_prb; 733 struct sili_prb *ccb_prb_lram; 734 u_int64_t ccb_prb_paddr; /* phys addr of prb */ 735 736 void (*ccb_done)(struct sili_ccb *); 737 738 TAILQ_ENTRY(sili_ccb) ccb_entry; 739 }; 740 741 struct sili_port { 742 struct sili_softc *ap_sc; 743 bus_space_handle_t ap_ioh; 744 745 int ap_num; 746 int ap_pmcount; 747 int ap_flags; 748 #define AP_F_BUS_REGISTERED 0x0001 749 #define AP_F_CAM_ATTACHED 0x0002 750 #define AP_F_IN_RESET 0x0004 751 #define AP_F_SCAN_RUNNING 0x0008 752 #define AP_F_SCAN_REQUESTED 0x0010 753 #define AP_F_SCAN_COMPLETED 0x0020 754 #define AP_F_IGNORE_IFS 0x0040 755 #define AP_F_UNUSED0200 0x0200 756 #define AP_F_ERR_CCB_RESERVED 0x0400 757 #define AP_F_REINIT_ACTIVE 0x0800 758 int ap_signal; /* os per-port thread sig */ 759 thread_t ap_thread; /* os per-port thread */ 760 struct lock ap_lock; /* os per-port lock */ 761 struct lock ap_sim_lock; /* cam sim lock */ 762 struct lock ap_sig_lock; /* signal thread */ 763 #define AP_SIGF_INIT 0x0001 764 #define AP_SIGF_TIMEOUT 0x0002 765 #define AP_SIGF_PORTINT 0x0004 766 #define AP_SIGF_STOP 0x8000 767 struct cam_sim *ap_sim; 768 769 struct sili_prb *ap_prbs; 770 771 struct sili_dmamem *ap_dmamem_prbs;/* separate sge tables */ 772 773 u_int32_t ap_active; /* active bmask */ 774 u_int32_t ap_active_cnt; /* active count */ 775 u_int32_t ap_expired; /* deferred expired bmask */ 776 struct sili_ccb *ap_ccbs; 777 struct sili_ccb *ap_err_ccb; /* used to read LOG page */ 778 int ap_run_flags; /* used to check excl mode */ 779 780 TAILQ_HEAD(, sili_ccb) ap_ccb_free; 781 TAILQ_HEAD(, sili_ccb) ap_ccb_pending; 782 struct lock ap_ccb_lock; 783 784 int ap_type; /* ATA_PORT_T_xxx */ 785 int ap_probe; /* ATA_PROBE_xxx */ 786 struct ata_port *ap_ata; 787 788 u_int32_t ap_state; 789 #define AP_S_NORMAL 0 790 #define AP_S_FATAL_ERROR 1 791 792 /* For error recovery. */ 793 u_int8_t *ap_err_scratch; 794 795 char ap_name[16]; 796 }; 797 798 #define PORTNAME(_ap) ((_ap)->ap_name) 799 #define ATANAME(_ap, _at) ((_at) ? (_at)->at_name : (_ap)->ap_name) 800 801 struct sili_softc { 802 device_t sc_dev; 803 const struct sili_device *sc_ad; /* special casing */ 804 805 struct resource *sc_irq; /* bus resources */ 806 struct resource *sc_regs; /* bus resources */ 807 struct resource *sc_pregs; /* bus resources */ 808 bus_space_tag_t sc_iot; /* split from sc_regs */ 809 bus_space_handle_t sc_ioh; /* split from sc_regs */ 810 bus_space_tag_t sc_piot; /* split from sc_pregs */ 811 bus_space_handle_t sc_pioh; /* split from sc_pregs */ 812 813 int sc_irq_type; 814 int sc_rid_irq; /* saved bus RIDs */ 815 int sc_rid_regs; 816 int sc_rid_pregs; 817 818 void *sc_irq_handle; /* installed irq vector */ 819 820 bus_dma_tag_t sc_tag_prbs; 821 bus_dma_tag_t sc_tag_data; 822 823 int sc_flags; 824 #define SILI_F_NO_NCQ 0x0001 825 #define SILI_F_IGN_FR 0x0002 826 #define SILI_F_INT_GOOD 0x0004 827 #define SILI_F_64BIT 0x0008 828 #define SILI_F_300 0x0010 829 #define SILI_F_NCQ 0x0020 830 #define SILI_F_SSNTF 0x0040 831 #define SILI_F_SPM 0x0080 832 833 u_int sc_ncmds; /* max 31, NOT 32 */ 834 835 struct sili_port *sc_ports[SILI_MAX_PORTS]; 836 }; 837 #define DEVNAME(_s) ((_s)->sc_dev.dv_xname) 838 839 struct sili_device { 840 pci_vendor_id_t ad_vendor; 841 pci_product_id_t ad_product; 842 int ad_nports; 843 int (*ad_attach)(device_t dev); 844 int (*ad_detach)(device_t dev); 845 char *name; 846 }; 847 848 /* Wait for all bits in _b to be cleared */ 849 #define sili_pwait_clr(_ap, _r, _b) \ 850 sili_pwait_eq((_ap), SILI_PWAIT_TIMEOUT, (_r), (_b), 0) 851 #define sili_pwait_clr_to(_ap, _to, _r, _b) \ 852 sili_pwait_eq((_ap), _to, (_r), (_b), 0) 853 854 /* Wait for all bits in _b to be set */ 855 #define sili_pwait_set(_ap, _r, _b) \ 856 sili_pwait_eq((_ap), SILI_PWAIT_TIMEOUT, (_r), (_b), (_b)) 857 #define sili_pwait_set_to(_ap, _to, _r, _b) \ 858 sili_pwait_eq((_ap), _to, (_r), (_b), (_b)) 859 860 /* 861 * Misc defines 862 */ 863 #define SILI_PWAIT_TIMEOUT 1000 864 865 /* 866 * Prototypes 867 */ 868 const struct sili_device *sili_lookup_device(device_t dev); 869 int sili_init(struct sili_softc *); 870 int sili_port_init(struct sili_port *ap); 871 int sili_port_alloc(struct sili_softc *, u_int); 872 void sili_port_state_machine(struct sili_port *ap, int initial); 873 void sili_port_free(struct sili_softc *, u_int); 874 int sili_port_reset(struct sili_port *, struct ata_port *at, int); 875 void sili_exclusive_access(struct sili_port *ap); 876 877 u_int32_t sili_read(struct sili_softc *, bus_size_t); 878 void sili_write(struct sili_softc *, bus_size_t, u_int32_t); 879 int sili_wait_ne(struct sili_softc *, bus_size_t, u_int32_t, u_int32_t); 880 u_int32_t sili_pread(struct sili_port *, bus_size_t); 881 void sili_pwrite(struct sili_port *, bus_size_t, u_int32_t); 882 int sili_pwait_eq(struct sili_port *, int, bus_size_t, 883 u_int32_t, u_int32_t); 884 void sili_intr(void *); 885 void sili_port_intr(struct sili_port *ap, int blockable); 886 887 int sili_cam_attach(struct sili_port *ap); 888 void sili_cam_changed(struct sili_port *ap, struct ata_port *at, int found); 889 void sili_cam_detach(struct sili_port *ap); 890 int sili_cam_probe(struct sili_port *ap, struct ata_port *at); 891 892 struct ata_xfer *sili_ata_get_xfer(struct sili_port *ap, struct ata_port *at); 893 void sili_ata_put_xfer(struct ata_xfer *xa); 894 int sili_ata_cmd(struct ata_xfer *xa); 895 896 int sili_pm_port_probe(struct sili_port *ap, int); 897 int sili_pm_port_init(struct sili_port *ap, struct ata_port *at); 898 int sili_pm_identify(struct sili_port *ap); 899 int sili_pm_set_feature(struct sili_port *ap, int feature, int enable); 900 int sili_pm_hardreset(struct sili_port *ap, int target, int hard); 901 int sili_pm_softreset(struct sili_port *ap, int target); 902 int sili_pm_phy_status(struct sili_port *ap, int target, u_int32_t *datap); 903 int sili_pm_read(struct sili_port *ap, int target, 904 int which, u_int32_t *res); 905 int sili_pm_write(struct sili_port *ap, int target, 906 int which, u_int32_t data); 907 void sili_pm_check_good(struct sili_port *ap, int target); 908 void sili_ata_cmd_timeout(struct sili_ccb *ccb); 909 void sili_quick_timeout(struct sili_ccb *ccb); 910 struct sili_ccb *sili_get_ccb(struct sili_port *ap); 911 void sili_put_ccb(struct sili_ccb *ccb); 912 struct sili_ccb *sili_get_err_ccb(struct sili_port *); 913 void sili_put_err_ccb(struct sili_ccb *); 914 int sili_poll(struct sili_ccb *ccb, int timeout, 915 void (*timeout_fn)(struct sili_ccb *)); 916 917 int sili_port_signature(struct sili_port *ap, struct ata_port *at, 918 u_int32_t sig); 919 void sili_port_thread_core(struct sili_port *ap, int mask); 920 921 void sili_os_sleep(int ms); 922 void sili_os_hardsleep(int us); 923 int sili_os_softsleep(void); 924 void sili_os_start_port(struct sili_port *ap); 925 void sili_os_stop_port(struct sili_port *ap); 926 void sili_os_signal_port_thread(struct sili_port *ap, int mask); 927 void sili_os_lock_port(struct sili_port *ap); 928 int sili_os_lock_port_nb(struct sili_port *ap); 929 void sili_os_unlock_port(struct sili_port *ap); 930 931 extern u_int32_t SiliForceGen1; 932 extern u_int32_t SiliNoFeatures; 933