1 /* 2 * Copyright (c) 2004-2005 HighPoint Technologies, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include <sys/param.h> 31 #include <sys/systm.h> 32 #include <sys/kernel.h> 33 #include <sys/bus.h> 34 #include <sys/malloc.h> 35 #include <sys/resource.h> 36 #include <sys/time.h> 37 #include <sys/callout.h> 38 #include <sys/signalvar.h> 39 #include <sys/eventhandler.h> 40 #include <sys/proc.h> 41 #include <sys/kthread.h> 42 43 #include <sys/mutex.h> 44 #include <sys/module.h> 45 #include <sys/sx.h> 46 47 #include <dev/pci/pcireg.h> 48 #include <dev/pci/pcivar.h> 49 50 #ifndef __KERNEL__ 51 #define __KERNEL__ 52 #endif 53 54 #include <dev/hptmv/global.h> 55 #include <dev/hptmv/hptintf.h> 56 #include <dev/hptmv/osbsd.h> 57 #include <dev/hptmv/access601.h> 58 59 60 #ifdef DEBUG 61 #ifdef DEBUG_LEVEL 62 int hpt_dbg_level = DEBUG_LEVEL; 63 #else 64 int hpt_dbg_level = 0; 65 #endif 66 #endif 67 68 #define MV_ERROR printf 69 70 /* 71 * CAM SIM entry points 72 */ 73 static int hpt_probe (device_t dev); 74 static void launch_worker_thread(void); 75 static int hpt_attach(device_t dev); 76 static int hpt_detach(device_t dev); 77 static int hpt_shutdown(device_t dev); 78 static void hpt_poll(struct cam_sim *sim); 79 static void hpt_intr(void *arg); 80 static void hpt_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg); 81 static void hpt_action(struct cam_sim *sim, union ccb *ccb); 82 83 static device_method_t driver_methods[] = { 84 /* Device interface */ 85 DEVMETHOD(device_probe, hpt_probe), 86 DEVMETHOD(device_attach, hpt_attach), 87 DEVMETHOD(device_detach, hpt_detach), 88 89 DEVMETHOD(device_shutdown, hpt_shutdown), 90 DEVMETHOD_END 91 }; 92 93 static driver_t hpt_pci_driver = { 94 __str(PROC_DIR_NAME), 95 driver_methods, 96 sizeof(IAL_ADAPTER_T) 97 }; 98 99 static devclass_t hpt_devclass; 100 101 #define __DRIVER_MODULE(p1, p2, p3, p4, p5, p6) DRIVER_MODULE(p1, p2, p3, p4, p5, p6) 102 __DRIVER_MODULE(PROC_DIR_NAME, pci, hpt_pci_driver, hpt_devclass, 0, 0); 103 MODULE_DEPEND(PROC_DIR_NAME, cam, 1, 1, 1); 104 105 #define ccb_ccb_ptr spriv_ptr0 106 #define ccb_adapter ccb_h.spriv_ptr1 107 108 static void SetInquiryData(PINQUIRYDATA inquiryData, PVDevice pVDev); 109 static void HPTLIBAPI OsSendCommand (_VBUS_ARG union ccb * ccb); 110 static void HPTLIBAPI fOsCommandDone(_VBUS_ARG PCommand pCmd); 111 static void ccb_done(union ccb *ccb); 112 static void hpt_queue_ccb(union ccb **ccb_Q, union ccb *ccb); 113 static void hpt_free_ccb(union ccb **ccb_Q, union ccb *ccb); 114 static void hpt_intr_locked(IAL_ADAPTER_T *pAdapter); 115 static void hptmv_free_edma_queues(IAL_ADAPTER_T *pAdapter); 116 static void hptmv_free_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum); 117 static void handleEdmaError(_VBUS_ARG PCommand pCmd); 118 static int hptmv_init_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum); 119 static int fResetActiveCommands(PVBus _vbus_p); 120 static void fRegisterVdevice(IAL_ADAPTER_T *pAdapter); 121 static int hptmv_allocate_edma_queues(IAL_ADAPTER_T *pAdapter); 122 static void hptmv_handle_event_disconnect(void *data); 123 static void hptmv_handle_event_connect(void *data); 124 static int start_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum); 125 static void init_vdev_params(IAL_ADAPTER_T *pAdapter, MV_U8 channel); 126 static int hptmv_parse_identify_results(MV_SATA_CHANNEL *pMvSataChannel); 127 static int HPTLIBAPI fOsBuildSgl(_VBUS_ARG PCommand pCmd, FPSCAT_GATH pSg, 128 int logical); 129 static MV_BOOLEAN CommandCompletionCB(MV_SATA_ADAPTER *pMvSataAdapter, 130 MV_U8 channelNum, MV_COMPLETION_TYPE comp_type, MV_VOID_PTR commandId, 131 MV_U16 responseFlags, MV_U32 timeStamp, 132 MV_STORAGE_DEVICE_REGISTERS *registerStruct); 133 static MV_BOOLEAN hptmv_event_notify(MV_SATA_ADAPTER *pMvSataAdapter, 134 MV_EVENT_TYPE eventType, MV_U32 param1, MV_U32 param2); 135 136 #define ccb_ccb_ptr spriv_ptr0 137 #define ccb_adapter ccb_h.spriv_ptr1 138 139 static struct sx hptmv_list_lock; 140 SX_SYSINIT(hptmv_list_lock, &hptmv_list_lock, "hptmv list"); 141 IAL_ADAPTER_T *gIal_Adapter = NULL; 142 IAL_ADAPTER_T *pCurAdapter = NULL; 143 static MV_SATA_CHANNEL gMvSataChannels[MAX_VBUS][MV_SATA_CHANNELS_NUM]; 144 145 typedef struct st_HPT_DPC { 146 IAL_ADAPTER_T *pAdapter; 147 void (*dpc)(IAL_ADAPTER_T *, void *, UCHAR); 148 void *arg; 149 UCHAR flags; 150 } ST_HPT_DPC; 151 152 #define MAX_DPC 16 153 UCHAR DPC_Request_Nums = 0; 154 static ST_HPT_DPC DpcQueue[MAX_DPC]; 155 static int DpcQueue_First=0; 156 static int DpcQueue_Last = 0; 157 static struct mtx DpcQueue_Lock; 158 MTX_SYSINIT(hpmtv_dpc_lock, &DpcQueue_Lock, "hptmv dpc", MTX_DEF); 159 160 char DRIVER_VERSION[] = "v1.16"; 161 162 /******************************************************************************* 163 * Name: hptmv_free_channel 164 * 165 * Description: free allocated queues for the given channel 166 * 167 * Parameters: pMvSataAdapter - pointer to the RR18xx controller this 168 * channel connected to. 169 * channelNum - channel number. 170 * 171 ******************************************************************************/ 172 static void 173 hptmv_free_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum) 174 { 175 HPT_ASSERT(channelNum < MV_SATA_CHANNELS_NUM); 176 pAdapter->mvSataAdapter.sataChannel[channelNum] = NULL; 177 } 178 179 static void failDevice(PVDevice pVDev) 180 { 181 PVBus _vbus_p = pVDev->pVBus; 182 IAL_ADAPTER_T *pAdapter = (IAL_ADAPTER_T *)_vbus_p->OsExt; 183 184 pVDev->u.disk.df_on_line = 0; 185 pVDev->vf_online = 0; 186 if (pVDev->pfnDeviceFailed) 187 CallWhenIdle(_VBUS_P (DPC_PROC)pVDev->pfnDeviceFailed, pVDev); 188 189 fNotifyGUI(ET_DEVICE_REMOVED, pVDev); 190 191 #ifndef FOR_DEMO 192 if (pAdapter->ver_601==2 && !pAdapter->beeping) { 193 pAdapter->beeping = 1; 194 BeepOn(pAdapter->mvSataAdapter.adapterIoBaseAddress); 195 set_fail_led(&pAdapter->mvSataAdapter, pVDev->u.disk.mv->channelNumber, 1); 196 } 197 #endif 198 } 199 200 int MvSataResetChannel(MV_SATA_ADAPTER *pMvSataAdapter, MV_U8 channel); 201 202 static void 203 handleEdmaError(_VBUS_ARG PCommand pCmd) 204 { 205 PDevice pDevice = &pCmd->pVDevice->u.disk; 206 MV_SATA_ADAPTER * pSataAdapter = pDevice->mv->mvSataAdapter; 207 208 if (!pDevice->df_on_line) { 209 KdPrint(("Device is offline")); 210 pCmd->Result = RETURN_BAD_DEVICE; 211 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 212 return; 213 } 214 215 if (pCmd->RetryCount++>5) { 216 hpt_printk(("too many retries on channel(%d)\n", pDevice->mv->channelNumber)); 217 failed: 218 failDevice(pCmd->pVDevice); 219 pCmd->Result = RETURN_IDE_ERROR; 220 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 221 return; 222 } 223 224 /* reset the channel and retry the command */ 225 if (MvSataResetChannel(pSataAdapter, pDevice->mv->channelNumber)) 226 goto failed; 227 228 fNotifyGUI(ET_DEVICE_ERROR, Map2pVDevice(pDevice)); 229 230 hpt_printk(("Retry on channel(%d)\n", pDevice->mv->channelNumber)); 231 fDeviceSendCommand(_VBUS_P pCmd); 232 } 233 234 /**************************************************************** 235 * Name: hptmv_init_channel 236 * 237 * Description: allocate request and response queues for the EDMA of the 238 * given channel and sets other fields. 239 * 240 * Parameters: 241 * pAdapter - pointer to the emulated adapter data structure 242 * channelNum - channel number. 243 * Return: 0 on success, otherwise on failure 244 ****************************************************************/ 245 static int 246 hptmv_init_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum) 247 { 248 MV_SATA_CHANNEL *pMvSataChannel; 249 dma_addr_t req_dma_addr; 250 dma_addr_t rsp_dma_addr; 251 252 if (channelNum >= MV_SATA_CHANNELS_NUM) 253 { 254 MV_ERROR("RR18xx[%d]: Bad channelNum=%d", 255 pAdapter->mvSataAdapter.adapterId, channelNum); 256 return -1; 257 } 258 259 pMvSataChannel = &gMvSataChannels[pAdapter->mvSataAdapter.adapterId][channelNum]; 260 pAdapter->mvSataAdapter.sataChannel[channelNum] = pMvSataChannel; 261 pMvSataChannel->channelNumber = channelNum; 262 pMvSataChannel->lba48Address = MV_FALSE; 263 pMvSataChannel->maxReadTransfer = MV_FALSE; 264 265 pMvSataChannel->requestQueue = (struct mvDmaRequestQueueEntry *) 266 (pAdapter->requestsArrayBaseAlignedAddr + (channelNum * MV_EDMA_REQUEST_QUEUE_SIZE)); 267 req_dma_addr = pAdapter->requestsArrayBaseDmaAlignedAddr + (channelNum * MV_EDMA_REQUEST_QUEUE_SIZE); 268 269 270 KdPrint(("requestQueue addr is 0x%llX", (HPT_U64)(ULONG_PTR)req_dma_addr)); 271 272 /* check the 1K alignment of the request queue*/ 273 if (req_dma_addr & 0x3ff) 274 { 275 MV_ERROR("RR18xx[%d]: request queue allocated isn't 1 K aligned," 276 " dma_addr=%llx channel=%d\n", pAdapter->mvSataAdapter.adapterId, 277 (HPT_U64)(ULONG_PTR)req_dma_addr, channelNum); 278 return -1; 279 } 280 pMvSataChannel->requestQueuePciLowAddress = req_dma_addr; 281 pMvSataChannel->requestQueuePciHiAddress = 0; 282 KdPrint(("RR18xx[%d,%d]: request queue allocated: 0x%p", 283 pAdapter->mvSataAdapter.adapterId, channelNum, 284 pMvSataChannel->requestQueue)); 285 pMvSataChannel->responseQueue = (struct mvDmaResponseQueueEntry *) 286 (pAdapter->responsesArrayBaseAlignedAddr + (channelNum * MV_EDMA_RESPONSE_QUEUE_SIZE)); 287 rsp_dma_addr = pAdapter->responsesArrayBaseDmaAlignedAddr + (channelNum * MV_EDMA_RESPONSE_QUEUE_SIZE); 288 289 /* check the 256 alignment of the response queue*/ 290 if (rsp_dma_addr & 0xff) 291 { 292 MV_ERROR("RR18xx[%d,%d]: response queue allocated isn't 256 byte " 293 "aligned, dma_addr=%llx\n", 294 pAdapter->mvSataAdapter.adapterId, channelNum, (HPT_U64)(ULONG_PTR)rsp_dma_addr); 295 return -1; 296 } 297 pMvSataChannel->responseQueuePciLowAddress = rsp_dma_addr; 298 pMvSataChannel->responseQueuePciHiAddress = 0; 299 KdPrint(("RR18xx[%d,%d]: response queue allocated: 0x%p", 300 pAdapter->mvSataAdapter.adapterId, channelNum, 301 pMvSataChannel->responseQueue)); 302 303 pAdapter->mvChannel[channelNum].online = MV_TRUE; 304 return 0; 305 } 306 307 /****************************************************************************** 308 * Name: hptmv_parse_identify_results 309 * 310 * Description: this functions parses the identify command results, checks 311 * that the connected deives can be accesed by RR18xx EDMA, 312 * and updates the channel structure accordingly. 313 * 314 * Parameters: pMvSataChannel, pointer to the channel data structure. 315 * 316 * Returns: =0 ->success, < 0 ->failure. 317 * 318 ******************************************************************************/ 319 static int 320 hptmv_parse_identify_results(MV_SATA_CHANNEL *pMvSataChannel) 321 { 322 MV_U16 *iden = pMvSataChannel->identifyDevice; 323 324 /*LBA addressing*/ 325 if (! (iden[IDEN_CAPACITY_1_OFFSET] & 0x200)) 326 { 327 KdPrint(("IAL Error in IDENTIFY info: LBA not supported\n")); 328 return -1; 329 } 330 else 331 { 332 KdPrint(("%25s - %s\n", "Capabilities", "LBA supported")); 333 } 334 /*DMA support*/ 335 if (! (iden[IDEN_CAPACITY_1_OFFSET] & 0x100)) 336 { 337 KdPrint(("IAL Error in IDENTIFY info: DMA not supported\n")); 338 return -1; 339 } 340 else 341 { 342 KdPrint(("%25s - %s\n", "Capabilities", "DMA supported")); 343 } 344 /* PIO */ 345 if ((iden[IDEN_VALID] & 2) == 0) 346 { 347 KdPrint(("IAL Error in IDENTIFY info: not able to find PIO mode\n")); 348 return -1; 349 } 350 KdPrint(("%25s - 0x%02x\n", "PIO modes supported", 351 iden[IDEN_PIO_MODE_SPPORTED] & 0xff)); 352 353 /*UDMA*/ 354 if ((iden[IDEN_VALID] & 4) == 0) 355 { 356 KdPrint(("IAL Error in IDENTIFY info: not able to find UDMA mode\n")); 357 return -1; 358 } 359 360 /* 48 bit address */ 361 if ((iden[IDEN_SUPPORTED_COMMANDS2] & 0x400)) 362 { 363 KdPrint(("%25s - %s\n", "LBA48 addressing", "supported")); 364 pMvSataChannel->lba48Address = MV_TRUE; 365 } 366 else 367 { 368 KdPrint(("%25s - %s\n", "LBA48 addressing", "Not supported")); 369 pMvSataChannel->lba48Address = MV_FALSE; 370 } 371 return 0; 372 } 373 374 static void 375 init_vdev_params(IAL_ADAPTER_T *pAdapter, MV_U8 channel) 376 { 377 PVDevice pVDev = &pAdapter->VDevices[channel]; 378 MV_SATA_CHANNEL *pMvSataChannel = pAdapter->mvSataAdapter.sataChannel[channel]; 379 MV_U16_PTR IdentifyData = pMvSataChannel->identifyDevice; 380 381 pMvSataChannel->outstandingCommands = 0; 382 383 pVDev->u.disk.mv = pMvSataChannel; 384 pVDev->u.disk.df_on_line = 1; 385 pVDev->u.disk.pVBus = &pAdapter->VBus; 386 pVDev->pVBus = &pAdapter->VBus; 387 388 #ifdef SUPPORT_48BIT_LBA 389 if (pMvSataChannel->lba48Address == MV_TRUE) 390 pVDev->u.disk.dDeRealCapacity = ((IdentifyData[101]<<16) | IdentifyData[100]) - 1; 391 else 392 #endif 393 if(IdentifyData[53] & 1) { 394 pVDev->u.disk.dDeRealCapacity = 395 (((IdentifyData[58]<<16 | IdentifyData[57]) < (IdentifyData[61]<<16 | IdentifyData[60])) ? 396 (IdentifyData[61]<<16 | IdentifyData[60]) : 397 (IdentifyData[58]<<16 | IdentifyData[57])) - 1; 398 } else 399 pVDev->u.disk.dDeRealCapacity = 400 (IdentifyData[61]<<16 | IdentifyData[60]) - 1; 401 402 pVDev->u.disk.bDeUsable_Mode = pVDev->u.disk.bDeModeSetting = 403 pAdapter->mvChannel[channel].maxPioModeSupported - MV_ATA_TRANSFER_PIO_0; 404 405 if (pAdapter->mvChannel[channel].maxUltraDmaModeSupported!=0xFF) { 406 pVDev->u.disk.bDeUsable_Mode = pVDev->u.disk.bDeModeSetting = 407 pAdapter->mvChannel[channel].maxUltraDmaModeSupported - MV_ATA_TRANSFER_UDMA_0 + 8; 408 } 409 } 410 411 static void device_change(IAL_ADAPTER_T *pAdapter , MV_U8 channelIndex, int plugged) 412 { 413 PVDevice pVDev; 414 MV_SATA_ADAPTER *pMvSataAdapter = &pAdapter->mvSataAdapter; 415 MV_SATA_CHANNEL *pMvSataChannel = pMvSataAdapter->sataChannel[channelIndex]; 416 417 if (!pMvSataChannel) return; 418 419 if (plugged) 420 { 421 pVDev = &(pAdapter->VDevices[channelIndex]); 422 init_vdev_params(pAdapter, channelIndex); 423 424 pVDev->VDeviceType = pVDev->u.disk.df_atapi? VD_ATAPI : 425 pVDev->u.disk.df_removable_drive? VD_REMOVABLE : VD_SINGLE_DISK; 426 427 pVDev->VDeviceCapacity = pVDev->u.disk.dDeRealCapacity-SAVE_FOR_RAID_INFO; 428 pVDev->pfnSendCommand = pfnSendCommand[pVDev->VDeviceType]; 429 pVDev->pfnDeviceFailed = pfnDeviceFailed[pVDev->VDeviceType]; 430 pVDev->vf_online = 1; 431 432 #ifdef SUPPORT_ARRAY 433 if(pVDev->pParent) 434 { 435 int iMember; 436 for(iMember = 0; iMember < pVDev->pParent->u.array.bArnMember; iMember++) 437 if((PVDevice)pVDev->pParent->u.array.pMember[iMember] == pVDev) 438 pVDev->pParent->u.array.pMember[iMember] = NULL; 439 pVDev->pParent = NULL; 440 } 441 #endif 442 fNotifyGUI(ET_DEVICE_PLUGGED,pVDev); 443 fCheckBootable(pVDev); 444 RegisterVDevice(pVDev); 445 446 #ifndef FOR_DEMO 447 if (pAdapter->beeping) { 448 pAdapter->beeping = 0; 449 BeepOff(pAdapter->mvSataAdapter.adapterIoBaseAddress); 450 } 451 #endif 452 453 } 454 else 455 { 456 pVDev = &(pAdapter->VDevices[channelIndex]); 457 failDevice(pVDev); 458 } 459 } 460 461 static int 462 start_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum) 463 { 464 MV_SATA_ADAPTER *pMvSataAdapter = &pAdapter->mvSataAdapter; 465 MV_SATA_CHANNEL *pMvSataChannel = pMvSataAdapter->sataChannel[channelNum]; 466 MV_CHANNEL *pChannelInfo = &(pAdapter->mvChannel[channelNum]); 467 MV_U32 udmaMode,pioMode; 468 469 KdPrint(("RR18xx [%d]: start channel (%d)", pMvSataAdapter->adapterId, 470 channelNum)); 471 472 473 /* Software reset channel */ 474 if (mvStorageDevATASoftResetDevice(pMvSataAdapter, channelNum) == MV_FALSE) 475 { 476 MV_ERROR("RR18xx [%d,%d]: failed to perform Software reset\n", 477 pMvSataAdapter->adapterId, channelNum); 478 return -1; 479 } 480 481 /* Hardware reset channel */ 482 if (mvSataChannelHardReset(pMvSataAdapter, channelNum) == MV_FALSE) 483 { 484 /* If failed, try again - this is when trying to hardreset a channel */ 485 /* when drive is just spinning up */ 486 StallExec(5000000); /* wait 5 sec before trying again */ 487 if (mvSataChannelHardReset(pMvSataAdapter, channelNum) == MV_FALSE) 488 { 489 MV_ERROR("RR18xx [%d,%d]: failed to perform Hard reset\n", 490 pMvSataAdapter->adapterId, channelNum); 491 return -1; 492 } 493 } 494 495 /* identify device*/ 496 if (mvStorageDevATAIdentifyDevice(pMvSataAdapter, channelNum) == MV_FALSE) 497 { 498 MV_ERROR("RR18xx [%d,%d]: failed to perform ATA Identify command\n" 499 , pMvSataAdapter->adapterId, channelNum); 500 return -1; 501 } 502 if (hptmv_parse_identify_results(pMvSataChannel)) 503 { 504 MV_ERROR("RR18xx [%d,%d]: Error in parsing ATA Identify message\n" 505 , pMvSataAdapter->adapterId, channelNum); 506 return -1; 507 } 508 509 /* mvStorageDevATASetFeatures */ 510 /* Disable 8 bit PIO in case CFA enabled */ 511 if (pMvSataChannel->identifyDevice[86] & 4) 512 { 513 KdPrint(("RR18xx [%d]: Disable 8 bit PIO (CFA enabled) \n", 514 pMvSataAdapter->adapterId)); 515 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 516 MV_ATA_SET_FEATURES_DISABLE_8_BIT_PIO, 0, 517 0, 0, 0) == MV_FALSE) 518 { 519 MV_ERROR("RR18xx [%d]: channel %d: mvStorageDevATASetFeatures" 520 " failed\n", pMvSataAdapter->adapterId, channelNum); 521 return -1; 522 } 523 } 524 /* Write cache */ 525 #ifdef ENABLE_WRITE_CACHE 526 if (pMvSataChannel->identifyDevice[82] & 0x20) 527 { 528 if (!(pMvSataChannel->identifyDevice[85] & 0x20)) /* if not enabled by default */ 529 { 530 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 531 MV_ATA_SET_FEATURES_ENABLE_WCACHE, 0, 532 0, 0, 0) == MV_FALSE) 533 { 534 MV_ERROR("RR18xx [%d]: channel %d: mvStorageDevATASetFeatures failed\n", 535 pMvSataAdapter->adapterId, channelNum); 536 return -1; 537 } 538 } 539 KdPrint(("RR18xx [%d]: channel %d, write cache enabled\n", 540 pMvSataAdapter->adapterId, channelNum)); 541 } 542 else 543 { 544 KdPrint(("RR18xx [%d]: channel %d, write cache not supported\n", 545 pMvSataAdapter->adapterId, channelNum)); 546 } 547 #else /* disable write cache */ 548 { 549 if (pMvSataChannel->identifyDevice[85] & 0x20) 550 { 551 KdPrint(("RR18xx [%d]: channel =%d, disable write cache\n", 552 pMvSataAdapter->adapterId, channelNum)); 553 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 554 MV_ATA_SET_FEATURES_DISABLE_WCACHE, 0, 555 0, 0, 0) == MV_FALSE) 556 { 557 MV_ERROR("RR18xx [%d]: channel %d: mvStorageDevATASetFeatures failed\n", 558 pMvSataAdapter->adapterId, channelNum); 559 return -1; 560 } 561 } 562 KdPrint(("RR18xx [%d]: channel=%d, write cache disabled\n", 563 pMvSataAdapter->adapterId, channelNum)); 564 } 565 #endif 566 567 /* Set transfer mode */ 568 KdPrint(("RR18xx [%d] Set transfer mode XFER_PIO_SLOW\n", 569 pMvSataAdapter->adapterId)); 570 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 571 MV_ATA_SET_FEATURES_TRANSFER, 572 MV_ATA_TRANSFER_PIO_SLOW, 0, 0, 0) == 573 MV_FALSE) 574 { 575 MV_ERROR("RR18xx [%d] channel %d: Set Features failed\n", 576 pMvSataAdapter->adapterId, channelNum); 577 return -1; 578 } 579 580 if (pMvSataChannel->identifyDevice[IDEN_PIO_MODE_SPPORTED] & 1) 581 { 582 pioMode = MV_ATA_TRANSFER_PIO_4; 583 } 584 else if (pMvSataChannel->identifyDevice[IDEN_PIO_MODE_SPPORTED] & 2) 585 { 586 pioMode = MV_ATA_TRANSFER_PIO_3; 587 } 588 else 589 { 590 MV_ERROR("IAL Error in IDENTIFY info: PIO modes 3 and 4 not supported\n"); 591 pioMode = MV_ATA_TRANSFER_PIO_SLOW; 592 } 593 594 KdPrint(("RR18xx [%d] Set transfer mode XFER_PIO_4\n", 595 pMvSataAdapter->adapterId)); 596 pAdapter->mvChannel[channelNum].maxPioModeSupported = pioMode; 597 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 598 MV_ATA_SET_FEATURES_TRANSFER, 599 pioMode, 0, 0, 0) == MV_FALSE) 600 { 601 MV_ERROR("RR18xx [%d] channel %d: Set Features failed\n", 602 pMvSataAdapter->adapterId, channelNum); 603 return -1; 604 } 605 606 udmaMode = MV_ATA_TRANSFER_UDMA_0; 607 if (pMvSataChannel->identifyDevice[IDEN_UDMA_MODE] & 0x40) 608 { 609 udmaMode = MV_ATA_TRANSFER_UDMA_6; 610 } 611 else if (pMvSataChannel->identifyDevice[IDEN_UDMA_MODE] & 0x20) 612 { 613 udmaMode = MV_ATA_TRANSFER_UDMA_5; 614 } 615 else if (pMvSataChannel->identifyDevice[IDEN_UDMA_MODE] & 0x10) 616 { 617 udmaMode = MV_ATA_TRANSFER_UDMA_4; 618 } 619 else if (pMvSataChannel->identifyDevice[IDEN_UDMA_MODE] & 8) 620 { 621 udmaMode = MV_ATA_TRANSFER_UDMA_3; 622 } 623 else if (pMvSataChannel->identifyDevice[IDEN_UDMA_MODE] & 4) 624 { 625 udmaMode = MV_ATA_TRANSFER_UDMA_2; 626 } 627 628 KdPrint(("RR18xx [%d] Set transfer mode XFER_UDMA_%d\n", 629 pMvSataAdapter->adapterId, udmaMode & 0xf)); 630 pChannelInfo->maxUltraDmaModeSupported = udmaMode; 631 632 /*if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 633 MV_ATA_SET_FEATURES_TRANSFER, udmaMode, 634 0, 0, 0) == MV_FALSE) 635 { 636 MV_ERROR("RR18xx [%d] channel %d: Set Features failed\n", 637 pMvSataAdapter->adapterId, channelNum); 638 return -1; 639 }*/ 640 if (pChannelInfo->maxUltraDmaModeSupported == 0xFF) 641 return TRUE; 642 else 643 do 644 { 645 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 646 MV_ATA_SET_FEATURES_TRANSFER, 647 pChannelInfo->maxUltraDmaModeSupported, 648 0, 0, 0) == MV_FALSE) 649 { 650 if (pChannelInfo->maxUltraDmaModeSupported > MV_ATA_TRANSFER_UDMA_0) 651 { 652 if (mvStorageDevATASoftResetDevice(pMvSataAdapter, channelNum) == MV_FALSE) 653 { 654 MV_REG_WRITE_BYTE(pMvSataAdapter->adapterIoBaseAddress, 655 pMvSataChannel->eDmaRegsOffset + 656 0x11c, /* command reg */ 657 MV_ATA_COMMAND_IDLE_IMMEDIATE); 658 mvMicroSecondsDelay(10000); 659 mvSataChannelHardReset(pMvSataAdapter, channelNum); 660 if (mvStorageDevATASoftResetDevice(pMvSataAdapter, channelNum) == MV_FALSE) 661 return FALSE; 662 } 663 if (mvSataChannelHardReset(pMvSataAdapter, channelNum) == MV_FALSE) 664 return FALSE; 665 pChannelInfo->maxUltraDmaModeSupported--; 666 continue; 667 } 668 else return FALSE; 669 } 670 break; 671 }while (1); 672 673 /* Read look ahead */ 674 #ifdef ENABLE_READ_AHEAD 675 if (pMvSataChannel->identifyDevice[82] & 0x40) 676 { 677 if (!(pMvSataChannel->identifyDevice[85] & 0x40)) /* if not enabled by default */ 678 { 679 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 680 MV_ATA_SET_FEATURES_ENABLE_RLA, 0, 0, 681 0, 0) == MV_FALSE) 682 { 683 MV_ERROR("RR18xx [%d] channel %d: Set Features failed\n", 684 pMvSataAdapter->adapterId, channelNum); 685 return -1; 686 } 687 } 688 KdPrint(("RR18xx [%d]: channel=%d, read look ahead enabled\n", 689 pMvSataAdapter->adapterId, channelNum)); 690 } 691 else 692 { 693 KdPrint(("RR18xx [%d]: channel %d, Read Look Ahead not supported\n", 694 pMvSataAdapter->adapterId, channelNum)); 695 } 696 #else 697 { 698 if (pMvSataChannel->identifyDevice[86] & 0x20) 699 { 700 KdPrint(("RR18xx [%d]:channel %d, disable read look ahead\n", 701 pMvSataAdapter->adapterId, channelNum)); 702 if (mvStorageDevATASetFeatures(pMvSataAdapter, channelNum, 703 MV_ATA_SET_FEATURES_DISABLE_RLA, 0, 0, 704 0, 0) == MV_FALSE) 705 { 706 MV_ERROR("RR18xx [%d]:channel %d: ATA Set Features failed\n", 707 pMvSataAdapter->adapterId, channelNum); 708 return -1; 709 } 710 } 711 KdPrint(("RR18xx [%d]:channel %d, read look ahead disabled\n", 712 pMvSataAdapter->adapterId, channelNum)); 713 } 714 #endif 715 716 717 { 718 KdPrint(("RR18xx [%d]: channel %d config EDMA, Non Queued Mode\n", 719 pMvSataAdapter->adapterId, 720 channelNum)); 721 if (mvSataConfigEdmaMode(pMvSataAdapter, channelNum, 722 MV_EDMA_MODE_NOT_QUEUED, 0) == MV_FALSE) 723 { 724 MV_ERROR("RR18xx [%d] channel %d Error: mvSataConfigEdmaMode failed\n", 725 pMvSataAdapter->adapterId, channelNum); 726 return -1; 727 } 728 } 729 /* Enable EDMA */ 730 if (mvSataEnableChannelDma(pMvSataAdapter, channelNum) == MV_FALSE) 731 { 732 MV_ERROR("RR18xx [%d] Failed to enable DMA, channel=%d\n", 733 pMvSataAdapter->adapterId, channelNum); 734 return -1; 735 } 736 MV_ERROR("RR18xx [%d,%d]: channel started successfully\n", 737 pMvSataAdapter->adapterId, channelNum); 738 739 #ifndef FOR_DEMO 740 set_fail_led(pMvSataAdapter, channelNum, 0); 741 #endif 742 return 0; 743 } 744 745 static void 746 hptmv_handle_event(void * data, int flag) 747 { 748 IAL_ADAPTER_T *pAdapter = (IAL_ADAPTER_T *)data; 749 MV_SATA_ADAPTER *pMvSataAdapter = &pAdapter->mvSataAdapter; 750 MV_U8 channelIndex; 751 752 mtx_assert(&pAdapter->lock, MA_OWNED); 753 /* mvOsSemTake(&pMvSataAdapter->semaphore); */ 754 for (channelIndex = 0; channelIndex < MV_SATA_CHANNELS_NUM; channelIndex++) 755 { 756 switch(pAdapter->sataEvents[channelIndex]) 757 { 758 case SATA_EVENT_CHANNEL_CONNECTED: 759 /* Handle only connects */ 760 if (flag == 1) 761 break; 762 KdPrint(("RR18xx [%d,%d]: new device connected\n", 763 pMvSataAdapter->adapterId, channelIndex)); 764 hptmv_init_channel(pAdapter, channelIndex); 765 if (mvSataConfigureChannel( pMvSataAdapter, channelIndex) == MV_FALSE) 766 { 767 MV_ERROR("RR18xx [%d,%d] Failed to configure\n", 768 pMvSataAdapter->adapterId, channelIndex); 769 hptmv_free_channel(pAdapter, channelIndex); 770 } 771 else 772 { 773 /*mvSataChannelHardReset(pMvSataAdapter, channel);*/ 774 if (start_channel( pAdapter, channelIndex)) 775 { 776 MV_ERROR("RR18xx [%d,%d]Failed to start channel\n", 777 pMvSataAdapter->adapterId, channelIndex); 778 hptmv_free_channel(pAdapter, channelIndex); 779 } 780 else 781 { 782 device_change(pAdapter, channelIndex, TRUE); 783 } 784 } 785 pAdapter->sataEvents[channelIndex] = SATA_EVENT_NO_CHANGE; 786 break; 787 788 case SATA_EVENT_CHANNEL_DISCONNECTED: 789 /* Handle only disconnects */ 790 if (flag == 0) 791 break; 792 KdPrint(("RR18xx [%d,%d]: device disconnected\n", 793 pMvSataAdapter->adapterId, channelIndex)); 794 /* Flush pending commands */ 795 if(pMvSataAdapter->sataChannel[channelIndex]) 796 { 797 _VBUS_INST(&pAdapter->VBus) 798 mvSataFlushDmaQueue (pMvSataAdapter, channelIndex, 799 MV_FLUSH_TYPE_CALLBACK); 800 CheckPendingCall(_VBUS_P0); 801 mvSataRemoveChannel(pMvSataAdapter,channelIndex); 802 hptmv_free_channel(pAdapter, channelIndex); 803 pMvSataAdapter->sataChannel[channelIndex] = NULL; 804 KdPrint(("RR18xx [%d,%d]: channel removed\n", 805 pMvSataAdapter->adapterId, channelIndex)); 806 if (pAdapter->outstandingCommands==0 && DPC_Request_Nums==0) 807 Check_Idle_Call(pAdapter); 808 } 809 else 810 { 811 KdPrint(("RR18xx [%d,%d]: channel already removed!!\n", 812 pMvSataAdapter->adapterId, channelIndex)); 813 } 814 pAdapter->sataEvents[channelIndex] = SATA_EVENT_NO_CHANGE; 815 break; 816 817 case SATA_EVENT_NO_CHANGE: 818 break; 819 820 default: 821 break; 822 } 823 } 824 /* mvOsSemRelease(&pMvSataAdapter->semaphore); */ 825 } 826 827 #define EVENT_CONNECT 1 828 #define EVENT_DISCONNECT 0 829 830 static void 831 hptmv_handle_event_connect(void *data) 832 { 833 hptmv_handle_event (data, 0); 834 } 835 836 static void 837 hptmv_handle_event_disconnect(void *data) 838 { 839 hptmv_handle_event (data, 1); 840 } 841 842 static MV_BOOLEAN 843 hptmv_event_notify(MV_SATA_ADAPTER *pMvSataAdapter, MV_EVENT_TYPE eventType, 844 MV_U32 param1, MV_U32 param2) 845 { 846 IAL_ADAPTER_T *pAdapter = pMvSataAdapter->IALData; 847 848 switch (eventType) 849 { 850 case MV_EVENT_TYPE_SATA_CABLE: 851 { 852 MV_U8 channel = param2; 853 854 if (param1 == EVENT_CONNECT) 855 { 856 pAdapter->sataEvents[channel] = SATA_EVENT_CHANNEL_CONNECTED; 857 KdPrint(("RR18xx [%d,%d]: device connected event received\n", 858 pMvSataAdapter->adapterId, channel)); 859 /* Delete previous timers (if multiple drives connected in the same time */ 860 callout_reset(&pAdapter->event_timer_connect, 10 * hz, hptmv_handle_event_connect, pAdapter); 861 } 862 else if (param1 == EVENT_DISCONNECT) 863 { 864 pAdapter->sataEvents[channel] = SATA_EVENT_CHANNEL_DISCONNECTED; 865 KdPrint(("RR18xx [%d,%d]: device disconnected event received \n", 866 pMvSataAdapter->adapterId, channel)); 867 device_change(pAdapter, channel, FALSE); 868 /* Delete previous timers (if multiple drives disconnected in the same time */ 869 /*callout_reset(&pAdapter->event_timer_disconnect, 10 * hz, hptmv_handle_event_disconnect, pAdapter); */ 870 /*It is not necessary to wait, handle it directly*/ 871 hptmv_handle_event_disconnect(pAdapter); 872 } 873 else 874 { 875 876 MV_ERROR("RR18xx: illegal value for param1(%d) at " 877 "connect/disconnect event, host=%d\n", param1, 878 pMvSataAdapter->adapterId ); 879 880 } 881 } 882 break; 883 case MV_EVENT_TYPE_ADAPTER_ERROR: 884 KdPrint(("RR18xx: DEVICE error event received, pci cause " 885 "reg=%x, don't how to handle this\n", param1)); 886 return MV_TRUE; 887 default: 888 MV_ERROR("RR18xx[%d]: unknown event type (%d)\n", 889 pMvSataAdapter->adapterId, eventType); 890 return MV_FALSE; 891 } 892 return MV_TRUE; 893 } 894 895 static int 896 hptmv_allocate_edma_queues(IAL_ADAPTER_T *pAdapter) 897 { 898 pAdapter->requestsArrayBaseAddr = (MV_U8 *)contigmalloc(REQUESTS_ARRAY_SIZE, 899 M_DEVBUF, M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0ul); 900 if (pAdapter->requestsArrayBaseAddr == NULL) 901 { 902 MV_ERROR("RR18xx[%d]: Failed to allocate memory for EDMA request" 903 " queues\n", pAdapter->mvSataAdapter.adapterId); 904 return -1; 905 } 906 pAdapter->requestsArrayBaseDmaAddr = fOsPhysicalAddress(pAdapter->requestsArrayBaseAddr); 907 pAdapter->requestsArrayBaseAlignedAddr = pAdapter->requestsArrayBaseAddr; 908 pAdapter->requestsArrayBaseAlignedAddr += MV_EDMA_REQUEST_QUEUE_SIZE; 909 pAdapter->requestsArrayBaseAlignedAddr = (MV_U8 *) 910 (((ULONG_PTR)pAdapter->requestsArrayBaseAlignedAddr) & ~(ULONG_PTR)(MV_EDMA_REQUEST_QUEUE_SIZE - 1)); 911 pAdapter->requestsArrayBaseDmaAlignedAddr = pAdapter->requestsArrayBaseDmaAddr; 912 pAdapter->requestsArrayBaseDmaAlignedAddr += MV_EDMA_REQUEST_QUEUE_SIZE; 913 pAdapter->requestsArrayBaseDmaAlignedAddr &= ~(ULONG_PTR)(MV_EDMA_REQUEST_QUEUE_SIZE - 1); 914 915 if ((pAdapter->requestsArrayBaseDmaAlignedAddr - pAdapter->requestsArrayBaseDmaAddr) != 916 (pAdapter->requestsArrayBaseAlignedAddr - pAdapter->requestsArrayBaseAddr)) 917 { 918 MV_ERROR("RR18xx[%d]: Error in Request Quueues Alignment\n", 919 pAdapter->mvSataAdapter.adapterId); 920 contigfree(pAdapter->requestsArrayBaseAddr, REQUESTS_ARRAY_SIZE, M_DEVBUF); 921 return -1; 922 } 923 /* response queues */ 924 pAdapter->responsesArrayBaseAddr = (MV_U8 *)contigmalloc(RESPONSES_ARRAY_SIZE, 925 M_DEVBUF, M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0ul); 926 if (pAdapter->responsesArrayBaseAddr == NULL) 927 { 928 MV_ERROR("RR18xx[%d]: Failed to allocate memory for EDMA response" 929 " queues\n", pAdapter->mvSataAdapter.adapterId); 930 contigfree(pAdapter->requestsArrayBaseAddr, RESPONSES_ARRAY_SIZE, M_DEVBUF); 931 return -1; 932 } 933 pAdapter->responsesArrayBaseDmaAddr = fOsPhysicalAddress(pAdapter->responsesArrayBaseAddr); 934 pAdapter->responsesArrayBaseAlignedAddr = pAdapter->responsesArrayBaseAddr; 935 pAdapter->responsesArrayBaseAlignedAddr += MV_EDMA_RESPONSE_QUEUE_SIZE; 936 pAdapter->responsesArrayBaseAlignedAddr = (MV_U8 *) 937 (((ULONG_PTR)pAdapter->responsesArrayBaseAlignedAddr) & ~(ULONG_PTR)(MV_EDMA_RESPONSE_QUEUE_SIZE - 1)); 938 pAdapter->responsesArrayBaseDmaAlignedAddr = pAdapter->responsesArrayBaseDmaAddr; 939 pAdapter->responsesArrayBaseDmaAlignedAddr += MV_EDMA_RESPONSE_QUEUE_SIZE; 940 pAdapter->responsesArrayBaseDmaAlignedAddr &= ~(ULONG_PTR)(MV_EDMA_RESPONSE_QUEUE_SIZE - 1); 941 942 if ((pAdapter->responsesArrayBaseDmaAlignedAddr - pAdapter->responsesArrayBaseDmaAddr) != 943 (pAdapter->responsesArrayBaseAlignedAddr - pAdapter->responsesArrayBaseAddr)) 944 { 945 MV_ERROR("RR18xx[%d]: Error in Response Queues Alignment\n", 946 pAdapter->mvSataAdapter.adapterId); 947 contigfree(pAdapter->requestsArrayBaseAddr, REQUESTS_ARRAY_SIZE, M_DEVBUF); 948 contigfree(pAdapter->responsesArrayBaseAddr, RESPONSES_ARRAY_SIZE, M_DEVBUF); 949 return -1; 950 } 951 return 0; 952 } 953 954 static void 955 hptmv_free_edma_queues(IAL_ADAPTER_T *pAdapter) 956 { 957 contigfree(pAdapter->requestsArrayBaseAddr, REQUESTS_ARRAY_SIZE, M_DEVBUF); 958 contigfree(pAdapter->responsesArrayBaseAddr, RESPONSES_ARRAY_SIZE, M_DEVBUF); 959 } 960 961 static PVOID 962 AllocatePRDTable(IAL_ADAPTER_T *pAdapter) 963 { 964 PVOID ret; 965 if (pAdapter->pFreePRDLink) { 966 KdPrint(("pAdapter->pFreePRDLink:%p\n",pAdapter->pFreePRDLink)); 967 ret = pAdapter->pFreePRDLink; 968 pAdapter->pFreePRDLink = *(void**)ret; 969 return ret; 970 } 971 return NULL; 972 } 973 974 static void 975 FreePRDTable(IAL_ADAPTER_T *pAdapter, PVOID PRDTable) 976 { 977 *(void**)PRDTable = pAdapter->pFreePRDLink; 978 pAdapter->pFreePRDLink = PRDTable; 979 } 980 981 extern PVDevice fGetFirstChild(PVDevice pLogical); 982 extern void fResetBootMark(PVDevice pLogical); 983 static void 984 fRegisterVdevice(IAL_ADAPTER_T *pAdapter) 985 { 986 PVDevice pPhysical, pLogical; 987 PVBus pVBus; 988 int i,j; 989 990 for(i=0;i<MV_SATA_CHANNELS_NUM;i++) { 991 pPhysical = &(pAdapter->VDevices[i]); 992 pLogical = pPhysical; 993 while (pLogical->pParent) pLogical = pLogical->pParent; 994 if (pLogical->vf_online==0) { 995 pPhysical->vf_bootmark = pLogical->vf_bootmark = 0; 996 continue; 997 } 998 if (pLogical->VDeviceType==VD_SPARE || pPhysical!=fGetFirstChild(pLogical)) 999 continue; 1000 1001 pVBus = &pAdapter->VBus; 1002 if(pVBus) 1003 { 1004 j=0; 1005 while(j<MAX_VDEVICE_PER_VBUS && pVBus->pVDevice[j]) j++; 1006 if(j<MAX_VDEVICE_PER_VBUS){ 1007 pVBus->pVDevice[j] = pLogical; 1008 pLogical->pVBus = pVBus; 1009 1010 if (j>0 && pLogical->vf_bootmark) { 1011 if (pVBus->pVDevice[0]->vf_bootmark) { 1012 fResetBootMark(pLogical); 1013 } 1014 else { 1015 do { pVBus->pVDevice[j] = pVBus->pVDevice[j-1]; } while (--j); 1016 pVBus->pVDevice[0] = pLogical; 1017 } 1018 } 1019 } 1020 } 1021 } 1022 } 1023 1024 PVDevice 1025 GetSpareDisk(_VBUS_ARG PVDevice pArray) 1026 { 1027 IAL_ADAPTER_T *pAdapter = (IAL_ADAPTER_T *)pArray->pVBus->OsExt; 1028 LBA_T capacity = LongDiv(pArray->VDeviceCapacity, pArray->u.array.bArnMember-1); 1029 LBA_T thiscap, maxcap = MAX_LBA_T; 1030 PVDevice pVDevice, pFind = NULL; 1031 int i; 1032 1033 for(i=0;i<MV_SATA_CHANNELS_NUM;i++) 1034 { 1035 pVDevice = &pAdapter->VDevices[i]; 1036 if(!pVDevice) 1037 continue; 1038 thiscap = pArray->vf_format_v2? pVDevice->u.disk.dDeRealCapacity : pVDevice->VDeviceCapacity; 1039 /* find the smallest usable spare disk */ 1040 if (pVDevice->VDeviceType==VD_SPARE && 1041 pVDevice->u.disk.df_on_line && 1042 thiscap < maxcap && 1043 thiscap >= capacity) 1044 { 1045 maxcap = pVDevice->VDeviceCapacity; 1046 pFind = pVDevice; 1047 } 1048 } 1049 return pFind; 1050 } 1051 1052 /****************************************************************** 1053 * IO ATA Command 1054 *******************************************************************/ 1055 int HPTLIBAPI 1056 fDeReadWrite(PDevice pDev, ULONG Lba, UCHAR Cmd, void *tmpBuffer) 1057 { 1058 return mvReadWrite(pDev->mv, Lba, Cmd, tmpBuffer); 1059 } 1060 1061 void HPTLIBAPI fDeSelectMode(PDevice pDev, UCHAR NewMode) 1062 { 1063 MV_SATA_CHANNEL *pSataChannel = pDev->mv; 1064 MV_SATA_ADAPTER *pSataAdapter = pSataChannel->mvSataAdapter; 1065 MV_U8 channelIndex = pSataChannel->channelNumber; 1066 UCHAR mvMode; 1067 /* 508x don't use MW-DMA? */ 1068 if (NewMode>4 && NewMode<8) NewMode = 4; 1069 pDev->bDeModeSetting = NewMode; 1070 if (NewMode<=4) 1071 mvMode = MV_ATA_TRANSFER_PIO_0 + NewMode; 1072 else 1073 mvMode = MV_ATA_TRANSFER_UDMA_0 + (NewMode-8); 1074 1075 /*To fix 88i8030 bug*/ 1076 if (mvMode > MV_ATA_TRANSFER_UDMA_0 && mvMode < MV_ATA_TRANSFER_UDMA_4) 1077 mvMode = MV_ATA_TRANSFER_UDMA_0; 1078 1079 mvSataDisableChannelDma(pSataAdapter, channelIndex); 1080 /* Flush pending commands */ 1081 mvSataFlushDmaQueue (pSataAdapter, channelIndex, MV_FLUSH_TYPE_NONE); 1082 1083 if (mvStorageDevATASetFeatures(pSataAdapter, channelIndex, 1084 MV_ATA_SET_FEATURES_TRANSFER, 1085 mvMode, 0, 0, 0) == MV_FALSE) 1086 { 1087 KdPrint(("channel %d: Set Features failed\n", channelIndex)); 1088 } 1089 /* Enable EDMA */ 1090 if (mvSataEnableChannelDma(pSataAdapter, channelIndex) == MV_FALSE) 1091 KdPrint(("Failed to enable DMA, channel=%d", channelIndex)); 1092 } 1093 1094 int HPTLIBAPI fDeSetTCQ(PDevice pDev, int enable, int depth) 1095 { 1096 MV_SATA_CHANNEL *pSataChannel = pDev->mv; 1097 MV_SATA_ADAPTER *pSataAdapter = pSataChannel->mvSataAdapter; 1098 MV_U8 channelIndex = pSataChannel->channelNumber; 1099 IAL_ADAPTER_T *pAdapter = pSataAdapter->IALData; 1100 MV_CHANNEL *channelInfo = &(pAdapter->mvChannel[channelIndex]); 1101 int dmaActive = pSataChannel->queueCommandsEnabled; 1102 int ret = 0; 1103 1104 if (dmaActive) { 1105 mvSataDisableChannelDma(pSataAdapter, channelIndex); 1106 mvSataFlushDmaQueue(pSataAdapter,channelIndex,MV_FLUSH_TYPE_CALLBACK); 1107 } 1108 1109 if (enable) { 1110 if (pSataChannel->queuedDMA == MV_EDMA_MODE_NOT_QUEUED && 1111 (pSataChannel->identifyDevice[IDEN_SUPPORTED_COMMANDS2] & (0x2))) { 1112 UCHAR depth = ((pSataChannel->identifyDevice[IDEN_QUEUE_DEPTH]) & 0x1f) + 1; 1113 channelInfo->queueDepth = (depth==32)? 31 : depth; 1114 mvSataConfigEdmaMode(pSataAdapter, channelIndex, MV_EDMA_MODE_QUEUED, depth); 1115 ret = 1; 1116 } 1117 } 1118 else 1119 { 1120 if (pSataChannel->queuedDMA != MV_EDMA_MODE_NOT_QUEUED) { 1121 channelInfo->queueDepth = 2; 1122 mvSataConfigEdmaMode(pSataAdapter, channelIndex, MV_EDMA_MODE_NOT_QUEUED, 0); 1123 ret = 1; 1124 } 1125 } 1126 1127 if (dmaActive) 1128 mvSataEnableChannelDma(pSataAdapter,channelIndex); 1129 return ret; 1130 } 1131 1132 int HPTLIBAPI fDeSetNCQ(PDevice pDev, int enable, int depth) 1133 { 1134 return 0; 1135 } 1136 1137 int HPTLIBAPI fDeSetWriteCache(PDevice pDev, int enable) 1138 { 1139 MV_SATA_CHANNEL *pSataChannel = pDev->mv; 1140 MV_SATA_ADAPTER *pSataAdapter = pSataChannel->mvSataAdapter; 1141 MV_U8 channelIndex = pSataChannel->channelNumber; 1142 IAL_ADAPTER_T *pAdapter = pSataAdapter->IALData; 1143 MV_CHANNEL *channelInfo = &(pAdapter->mvChannel[channelIndex]); 1144 int dmaActive = pSataChannel->queueCommandsEnabled; 1145 int ret = 0; 1146 1147 if (dmaActive) { 1148 mvSataDisableChannelDma(pSataAdapter, channelIndex); 1149 mvSataFlushDmaQueue(pSataAdapter,channelIndex,MV_FLUSH_TYPE_CALLBACK); 1150 } 1151 1152 if ((pSataChannel->identifyDevice[82] & (0x20))) { 1153 if (enable) { 1154 if (mvStorageDevATASetFeatures(pSataAdapter, channelIndex, 1155 MV_ATA_SET_FEATURES_ENABLE_WCACHE, 0, 0, 0, 0)) 1156 { 1157 channelInfo->writeCacheEnabled = MV_TRUE; 1158 ret = 1; 1159 } 1160 } 1161 else { 1162 if (mvStorageDevATASetFeatures(pSataAdapter, channelIndex, 1163 MV_ATA_SET_FEATURES_DISABLE_WCACHE, 0, 0, 0, 0)) 1164 { 1165 channelInfo->writeCacheEnabled = MV_FALSE; 1166 ret = 1; 1167 } 1168 } 1169 } 1170 1171 if (dmaActive) 1172 mvSataEnableChannelDma(pSataAdapter,channelIndex); 1173 return ret; 1174 } 1175 1176 int HPTLIBAPI fDeSetReadAhead(PDevice pDev, int enable) 1177 { 1178 MV_SATA_CHANNEL *pSataChannel = pDev->mv; 1179 MV_SATA_ADAPTER *pSataAdapter = pSataChannel->mvSataAdapter; 1180 MV_U8 channelIndex = pSataChannel->channelNumber; 1181 IAL_ADAPTER_T *pAdapter = pSataAdapter->IALData; 1182 MV_CHANNEL *channelInfo = &(pAdapter->mvChannel[channelIndex]); 1183 int dmaActive = pSataChannel->queueCommandsEnabled; 1184 int ret = 0; 1185 1186 if (dmaActive) { 1187 mvSataDisableChannelDma(pSataAdapter, channelIndex); 1188 mvSataFlushDmaQueue(pSataAdapter,channelIndex,MV_FLUSH_TYPE_CALLBACK); 1189 } 1190 1191 if ((pSataChannel->identifyDevice[82] & (0x40))) { 1192 if (enable) { 1193 if (mvStorageDevATASetFeatures(pSataAdapter, channelIndex, 1194 MV_ATA_SET_FEATURES_ENABLE_RLA, 0, 0, 0, 0)) 1195 { 1196 channelInfo->readAheadEnabled = MV_TRUE; 1197 ret = 1; 1198 } 1199 } 1200 else { 1201 if (mvStorageDevATASetFeatures(pSataAdapter, channelIndex, 1202 MV_ATA_SET_FEATURES_DISABLE_RLA, 0, 0, 0, 0)) 1203 { 1204 channelInfo->readAheadEnabled = MV_FALSE; 1205 ret = 1; 1206 } 1207 } 1208 } 1209 1210 if (dmaActive) 1211 mvSataEnableChannelDma(pSataAdapter,channelIndex); 1212 return ret; 1213 } 1214 1215 #ifdef SUPPORT_ARRAY 1216 #define IdeRegisterVDevice fCheckArray 1217 #else 1218 void 1219 IdeRegisterVDevice(PDevice pDev) 1220 { 1221 PVDevice pVDev = Map2pVDevice(pDev); 1222 1223 pVDev->VDeviceType = pDev->df_atapi? VD_ATAPI : 1224 pDev->df_removable_drive? VD_REMOVABLE : VD_SINGLE_DISK; 1225 pVDev->vf_online = 1; 1226 pVDev->VDeviceCapacity = pDev->dDeRealCapacity; 1227 pVDev->pfnSendCommand = pfnSendCommand[pVDev->VDeviceType]; 1228 pVDev->pfnDeviceFailed = pfnDeviceFailed[pVDev->VDeviceType]; 1229 } 1230 #endif 1231 1232 static __inline PBUS_DMAMAP 1233 dmamap_get(struct IALAdapter * pAdapter) 1234 { 1235 PBUS_DMAMAP p = pAdapter->pbus_dmamap_list; 1236 if (p) 1237 pAdapter->pbus_dmamap_list = p-> next; 1238 return p; 1239 } 1240 1241 static __inline void 1242 dmamap_put(PBUS_DMAMAP p) 1243 { 1244 p->next = p->pAdapter->pbus_dmamap_list; 1245 p->pAdapter->pbus_dmamap_list = p; 1246 } 1247 1248 static int num_adapters = 0; 1249 static int 1250 init_adapter(IAL_ADAPTER_T *pAdapter) 1251 { 1252 PVBus _vbus_p = &pAdapter->VBus; 1253 MV_SATA_ADAPTER *pMvSataAdapter; 1254 int i, channel, rid; 1255 1256 PVDevice pVDev; 1257 1258 mtx_init(&pAdapter->lock, "hptsleeplock", NULL, MTX_DEF); 1259 callout_init_mtx(&pAdapter->event_timer_connect, &pAdapter->lock, 0); 1260 callout_init_mtx(&pAdapter->event_timer_disconnect, &pAdapter->lock, 0); 1261 1262 sx_xlock(&hptmv_list_lock); 1263 pAdapter->next = 0; 1264 1265 if(gIal_Adapter == NULL){ 1266 gIal_Adapter = pAdapter; 1267 pCurAdapter = gIal_Adapter; 1268 } 1269 else { 1270 pCurAdapter->next = pAdapter; 1271 pCurAdapter = pAdapter; 1272 } 1273 sx_xunlock(&hptmv_list_lock); 1274 1275 pAdapter->outstandingCommands = 0; 1276 1277 pMvSataAdapter = &(pAdapter->mvSataAdapter); 1278 _vbus_p->OsExt = (void *)pAdapter; 1279 pMvSataAdapter->IALData = pAdapter; 1280 1281 if (bus_dma_tag_create(bus_get_dma_tag(pAdapter->hpt_dev),/* parent */ 1282 4, /* alignment */ 1283 BUS_SPACE_MAXADDR_32BIT+1, /* boundary */ 1284 BUS_SPACE_MAXADDR, /* lowaddr */ 1285 BUS_SPACE_MAXADDR, /* highaddr */ 1286 NULL, NULL, /* filter, filterarg */ 1287 PAGE_SIZE * (MAX_SG_DESCRIPTORS-1), /* maxsize */ 1288 MAX_SG_DESCRIPTORS, /* nsegments */ 1289 0x10000, /* maxsegsize */ 1290 BUS_DMA_WAITOK, /* flags */ 1291 busdma_lock_mutex, /* lockfunc */ 1292 &pAdapter->lock, /* lockfuncarg */ 1293 &pAdapter->io_dma_parent /* tag */)) 1294 { 1295 return ENXIO; 1296 } 1297 1298 1299 if (hptmv_allocate_edma_queues(pAdapter)) 1300 { 1301 MV_ERROR("RR18xx: Failed to allocate memory for EDMA queues\n"); 1302 return ENOMEM; 1303 } 1304 1305 /* also map EPROM address */ 1306 rid = 0x10; 1307 if (!(pAdapter->mem_res = bus_alloc_resource_any(pAdapter->hpt_dev, 1308 SYS_RES_MEMORY, &rid, RF_ACTIVE)) 1309 || 1310 !(pMvSataAdapter->adapterIoBaseAddress = rman_get_virtual(pAdapter->mem_res))) 1311 { 1312 MV_ERROR("RR18xx: Failed to remap memory space\n"); 1313 hptmv_free_edma_queues(pAdapter); 1314 return ENXIO; 1315 } 1316 else 1317 { 1318 KdPrint(("RR18xx: io base address 0x%p\n", pMvSataAdapter->adapterIoBaseAddress)); 1319 } 1320 1321 pMvSataAdapter->adapterId = num_adapters++; 1322 /* get the revision ID */ 1323 pMvSataAdapter->pciConfigRevisionId = pci_read_config(pAdapter->hpt_dev, PCIR_REVID, 1); 1324 pMvSataAdapter->pciConfigDeviceId = pci_get_device(pAdapter->hpt_dev); 1325 1326 /* init RR18xx */ 1327 pMvSataAdapter->intCoalThre[0]= 1; 1328 pMvSataAdapter->intCoalThre[1]= 1; 1329 pMvSataAdapter->intTimeThre[0] = 1; 1330 pMvSataAdapter->intTimeThre[1] = 1; 1331 pMvSataAdapter->pciCommand = 0x0107E371; 1332 pMvSataAdapter->pciSerrMask = 0xd77fe6ul; 1333 pMvSataAdapter->pciInterruptMask = 0xd77fe6ul; 1334 pMvSataAdapter->mvSataEventNotify = hptmv_event_notify; 1335 1336 if (mvSataInitAdapter(pMvSataAdapter) == MV_FALSE) 1337 { 1338 MV_ERROR("RR18xx[%d]: core failed to initialize the adapter\n", 1339 pMvSataAdapter->adapterId); 1340 unregister: 1341 bus_release_resource(pAdapter->hpt_dev, SYS_RES_MEMORY, rid, pAdapter->mem_res); 1342 hptmv_free_edma_queues(pAdapter); 1343 return ENXIO; 1344 } 1345 pAdapter->ver_601 = pMvSataAdapter->pcbVersion; 1346 1347 #ifndef FOR_DEMO 1348 set_fail_leds(pMvSataAdapter, 0); 1349 #endif 1350 1351 /* setup command blocks */ 1352 KdPrint(("Allocate command blocks\n")); 1353 _vbus_(pFreeCommands) = 0; 1354 pAdapter->pCommandBlocks = 1355 malloc(sizeof(struct _Command) * MAX_COMMAND_BLOCKS_FOR_EACH_VBUS, M_DEVBUF, M_NOWAIT); 1356 KdPrint(("pCommandBlocks:%p\n",pAdapter->pCommandBlocks)); 1357 if (!pAdapter->pCommandBlocks) { 1358 MV_ERROR("insufficient memory\n"); 1359 goto unregister; 1360 } 1361 1362 for (i=0; i<MAX_COMMAND_BLOCKS_FOR_EACH_VBUS; i++) { 1363 FreeCommand(_VBUS_P &(pAdapter->pCommandBlocks[i])); 1364 } 1365 1366 /*Set up the bus_dmamap*/ 1367 pAdapter->pbus_dmamap = (PBUS_DMAMAP)malloc (sizeof(struct _BUS_DMAMAP) * MAX_QUEUE_COMM, M_DEVBUF, M_NOWAIT); 1368 if(!pAdapter->pbus_dmamap) { 1369 MV_ERROR("insufficient memory\n"); 1370 free(pAdapter->pCommandBlocks, M_DEVBUF); 1371 goto unregister; 1372 } 1373 1374 memset((void *)pAdapter->pbus_dmamap, 0, sizeof(struct _BUS_DMAMAP) * MAX_QUEUE_COMM); 1375 pAdapter->pbus_dmamap_list = 0; 1376 for (i=0; i < MAX_QUEUE_COMM; i++) { 1377 PBUS_DMAMAP pmap = &(pAdapter->pbus_dmamap[i]); 1378 pmap->pAdapter = pAdapter; 1379 dmamap_put(pmap); 1380 1381 if(bus_dmamap_create(pAdapter->io_dma_parent, 0, &pmap->dma_map)) { 1382 MV_ERROR("Can not allocate dma map\n"); 1383 free(pAdapter->pCommandBlocks, M_DEVBUF); 1384 free(pAdapter->pbus_dmamap, M_DEVBUF); 1385 goto unregister; 1386 } 1387 callout_init_mtx(&pmap->timeout, &pAdapter->lock, 0); 1388 } 1389 /* setup PRD Tables */ 1390 KdPrint(("Allocate PRD Tables\n")); 1391 pAdapter->pFreePRDLink = 0; 1392 1393 pAdapter->prdTableAddr = (PUCHAR)contigmalloc( 1394 (PRD_ENTRIES_SIZE*PRD_TABLES_FOR_VBUS + 32), M_DEVBUF, M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0ul); 1395 1396 KdPrint(("prdTableAddr:%p\n",pAdapter->prdTableAddr)); 1397 if (!pAdapter->prdTableAddr) { 1398 MV_ERROR("insufficient PRD Tables\n"); 1399 goto unregister; 1400 } 1401 pAdapter->prdTableAlignedAddr = (PUCHAR)(((ULONG_PTR)pAdapter->prdTableAddr + 0x1f) & ~(ULONG_PTR)0x1fL); 1402 { 1403 PUCHAR PRDTable = pAdapter->prdTableAlignedAddr; 1404 for (i=0; i<PRD_TABLES_FOR_VBUS; i++) 1405 { 1406 /* KdPrint(("i=%d,pAdapter->pFreePRDLink=%p\n",i,pAdapter->pFreePRDLink)); */ 1407 FreePRDTable(pAdapter, PRDTable); 1408 PRDTable += PRD_ENTRIES_SIZE; 1409 } 1410 } 1411 1412 /* enable the adapter interrupts */ 1413 1414 /* configure and start the connected channels*/ 1415 for (channel = 0; channel < MV_SATA_CHANNELS_NUM; channel++) 1416 { 1417 pAdapter->mvChannel[channel].online = MV_FALSE; 1418 if (mvSataIsStorageDeviceConnected(pMvSataAdapter, channel) 1419 == MV_TRUE) 1420 { 1421 KdPrint(("RR18xx[%d]: channel %d is connected\n", 1422 pMvSataAdapter->adapterId, channel)); 1423 1424 if (hptmv_init_channel(pAdapter, channel) == 0) 1425 { 1426 if (mvSataConfigureChannel(pMvSataAdapter, channel) == MV_FALSE) 1427 { 1428 MV_ERROR("RR18xx[%d]: Failed to configure channel" 1429 " %d\n",pMvSataAdapter->adapterId, channel); 1430 hptmv_free_channel(pAdapter, channel); 1431 } 1432 else 1433 { 1434 if (start_channel(pAdapter, channel)) 1435 { 1436 MV_ERROR("RR18xx[%d]: Failed to start channel," 1437 " channel=%d\n",pMvSataAdapter->adapterId, 1438 channel); 1439 hptmv_free_channel(pAdapter, channel); 1440 } 1441 pAdapter->mvChannel[channel].online = MV_TRUE; 1442 /* mvSataChannelSetEdmaLoopBackMode(pMvSataAdapter, 1443 channel, 1444 MV_TRUE);*/ 1445 } 1446 } 1447 } 1448 KdPrint(("pAdapter->mvChannel[channel].online:%x, channel:%d\n", 1449 pAdapter->mvChannel[channel].online, channel)); 1450 } 1451 1452 #ifdef SUPPORT_ARRAY 1453 for(i = MAX_ARRAY_DEVICE - 1; i >= 0; i--) { 1454 pVDev = ArrayTables(i); 1455 mArFreeArrayTable(pVDev); 1456 } 1457 #endif 1458 1459 KdPrint(("Initialize Devices\n")); 1460 for (channel = 0; channel < MV_SATA_CHANNELS_NUM; channel++) { 1461 MV_SATA_CHANNEL *pMvSataChannel = pMvSataAdapter->sataChannel[channel]; 1462 if (pMvSataChannel) { 1463 init_vdev_params(pAdapter, channel); 1464 IdeRegisterVDevice(&pAdapter->VDevices[channel].u.disk); 1465 } 1466 } 1467 #ifdef SUPPORT_ARRAY 1468 CheckArrayCritical(_VBUS_P0); 1469 #endif 1470 _vbus_p->nInstances = 1; 1471 fRegisterVdevice(pAdapter); 1472 1473 for (channel=0;channel<MV_SATA_CHANNELS_NUM;channel++) { 1474 pVDev = _vbus_p->pVDevice[channel]; 1475 if (pVDev && pVDev->vf_online) 1476 fCheckBootable(pVDev); 1477 } 1478 1479 #if defined(SUPPORT_ARRAY) && defined(_RAID5N_) 1480 init_raid5_memory(_VBUS_P0); 1481 _vbus_(r5).enable_write_back = 1; 1482 printf("RR18xx: RAID5 write-back %s\n", _vbus_(r5).enable_write_back? "enabled" : "disabled"); 1483 #endif 1484 1485 mvSataUnmaskAdapterInterrupt(pMvSataAdapter); 1486 return 0; 1487 } 1488 1489 int 1490 MvSataResetChannel(MV_SATA_ADAPTER *pMvSataAdapter, MV_U8 channel) 1491 { 1492 IAL_ADAPTER_T *pAdapter = (IAL_ADAPTER_T *)pMvSataAdapter->IALData; 1493 1494 mvSataDisableChannelDma(pMvSataAdapter, channel); 1495 /* Flush pending commands */ 1496 mvSataFlushDmaQueue (pMvSataAdapter, channel, MV_FLUSH_TYPE_CALLBACK); 1497 1498 /* Software reset channel */ 1499 if (mvStorageDevATASoftResetDevice(pMvSataAdapter, channel) == MV_FALSE) 1500 { 1501 MV_ERROR("RR18xx [%d,%d]: failed to perform Software reset\n", 1502 pMvSataAdapter->adapterId, channel); 1503 hptmv_free_channel(pAdapter, channel); 1504 return -1; 1505 } 1506 1507 /* Hardware reset channel */ 1508 if (mvSataChannelHardReset(pMvSataAdapter, channel)== MV_FALSE) 1509 { 1510 MV_ERROR("RR18xx [%d,%d] Failed to Hard reser the SATA channel\n", 1511 pMvSataAdapter->adapterId, channel); 1512 hptmv_free_channel(pAdapter, channel); 1513 return -1; 1514 } 1515 1516 if (mvSataIsStorageDeviceConnected(pMvSataAdapter, channel) == MV_FALSE) 1517 { 1518 MV_ERROR("RR18xx [%d,%d] Failed to Connect Device\n", 1519 pMvSataAdapter->adapterId, channel); 1520 hptmv_free_channel(pAdapter, channel); 1521 return -1; 1522 }else 1523 { 1524 MV_ERROR("channel %d: perform recalibrate command", channel); 1525 if (!mvStorageDevATAExecuteNonUDMACommand(pMvSataAdapter, channel, 1526 MV_NON_UDMA_PROTOCOL_NON_DATA, 1527 MV_FALSE, 1528 NULL, /* pBuffer*/ 1529 0, /* count */ 1530 0, /*features*/ 1531 /* sectorCount */ 1532 0, 1533 0, /* lbaLow */ 1534 0, /* lbaMid */ 1535 /* lbaHigh */ 1536 0, 1537 0, /* device */ 1538 /* command */ 1539 0x10)) 1540 MV_ERROR("channel %d: recalibrate failed", channel); 1541 1542 /* Set transfer mode */ 1543 if((mvStorageDevATASetFeatures(pMvSataAdapter, channel, 1544 MV_ATA_SET_FEATURES_TRANSFER, 1545 MV_ATA_TRANSFER_PIO_SLOW, 0, 0, 0) == MV_FALSE) || 1546 (mvStorageDevATASetFeatures(pMvSataAdapter, channel, 1547 MV_ATA_SET_FEATURES_TRANSFER, 1548 pAdapter->mvChannel[channel].maxPioModeSupported, 0, 0, 0) == MV_FALSE) || 1549 (mvStorageDevATASetFeatures(pMvSataAdapter, channel, 1550 MV_ATA_SET_FEATURES_TRANSFER, 1551 pAdapter->mvChannel[channel].maxUltraDmaModeSupported, 0, 0, 0) == MV_FALSE) ) 1552 { 1553 MV_ERROR("channel %d: Set Features failed", channel); 1554 hptmv_free_channel(pAdapter, channel); 1555 return -1; 1556 } 1557 /* Enable EDMA */ 1558 if (mvSataEnableChannelDma(pMvSataAdapter, channel) == MV_FALSE) 1559 { 1560 MV_ERROR("Failed to enable DMA, channel=%d", channel); 1561 hptmv_free_channel(pAdapter, channel); 1562 return -1; 1563 } 1564 } 1565 return 0; 1566 } 1567 1568 static int 1569 fResetActiveCommands(PVBus _vbus_p) 1570 { 1571 MV_SATA_ADAPTER *pMvSataAdapter = &((IAL_ADAPTER_T *)_vbus_p->OsExt)->mvSataAdapter; 1572 MV_U8 channel; 1573 for (channel=0;channel< MV_SATA_CHANNELS_NUM;channel++) { 1574 if (pMvSataAdapter->sataChannel[channel] && pMvSataAdapter->sataChannel[channel]->outstandingCommands) 1575 MvSataResetChannel(pMvSataAdapter,channel); 1576 } 1577 return 0; 1578 } 1579 1580 void fCompleteAllCommandsSynchronously(PVBus _vbus_p) 1581 { 1582 UINT cont; 1583 ULONG ticks = 0; 1584 MV_U8 channel; 1585 MV_SATA_ADAPTER *pMvSataAdapter = &((IAL_ADAPTER_T *)_vbus_p->OsExt)->mvSataAdapter; 1586 MV_SATA_CHANNEL *pMvSataChannel; 1587 1588 do { 1589 check_cmds: 1590 cont = 0; 1591 CheckPendingCall(_VBUS_P0); 1592 #ifdef _RAID5N_ 1593 dataxfer_poll(); 1594 xor_poll(); 1595 #endif 1596 for (channel=0;channel< MV_SATA_CHANNELS_NUM;channel++) { 1597 pMvSataChannel = pMvSataAdapter->sataChannel[channel]; 1598 if (pMvSataChannel && pMvSataChannel->outstandingCommands) 1599 { 1600 while (pMvSataChannel->outstandingCommands) { 1601 if (!mvSataInterruptServiceRoutine(pMvSataAdapter)) { 1602 StallExec(1000); 1603 if (ticks++ > 3000) { 1604 MvSataResetChannel(pMvSataAdapter,channel); 1605 goto check_cmds; 1606 } 1607 } 1608 else 1609 ticks = 0; 1610 } 1611 cont = 1; 1612 } 1613 } 1614 } while (cont); 1615 } 1616 1617 void 1618 fResetVBus(_VBUS_ARG0) 1619 { 1620 KdPrint(("fMvResetBus(%p)", _vbus_p)); 1621 1622 /* some commands may already finished. */ 1623 CheckPendingCall(_VBUS_P0); 1624 1625 fResetActiveCommands(_vbus_p); 1626 /* 1627 * the other pending commands may still be finished successfully. 1628 */ 1629 fCompleteAllCommandsSynchronously(_vbus_p); 1630 1631 /* Now there should be no pending commands. No more action needed. */ 1632 CheckIdleCall(_VBUS_P0); 1633 1634 KdPrint(("fMvResetBus() done")); 1635 } 1636 1637 /*No rescan function*/ 1638 void 1639 fRescanAllDevice(_VBUS_ARG0) 1640 { 1641 } 1642 1643 static MV_BOOLEAN 1644 CommandCompletionCB(MV_SATA_ADAPTER *pMvSataAdapter, 1645 MV_U8 channelNum, 1646 MV_COMPLETION_TYPE comp_type, 1647 MV_VOID_PTR commandId, 1648 MV_U16 responseFlags, 1649 MV_U32 timeStamp, 1650 MV_STORAGE_DEVICE_REGISTERS *registerStruct) 1651 { 1652 PCommand pCmd = (PCommand) commandId; 1653 _VBUS_INST(pCmd->pVDevice->pVBus) 1654 1655 if (pCmd->uScratch.sata_param.prdAddr) 1656 FreePRDTable(pMvSataAdapter->IALData,pCmd->uScratch.sata_param.prdAddr); 1657 1658 switch (comp_type) 1659 { 1660 case MV_COMPLETION_TYPE_NORMAL: 1661 pCmd->Result = RETURN_SUCCESS; 1662 break; 1663 case MV_COMPLETION_TYPE_ABORT: 1664 pCmd->Result = RETURN_BUS_RESET; 1665 break; 1666 case MV_COMPLETION_TYPE_ERROR: 1667 MV_ERROR("IAL: COMPLETION ERROR, adapter %d, channel %d, flags=%x\n", 1668 pMvSataAdapter->adapterId, channelNum, responseFlags); 1669 1670 if (responseFlags & 4) { 1671 MV_ERROR("ATA regs: error %x, sector count %x, LBA low %x, LBA mid %x," 1672 " LBA high %x, device %x, status %x\n", 1673 registerStruct->errorRegister, 1674 registerStruct->sectorCountRegister, 1675 registerStruct->lbaLowRegister, 1676 registerStruct->lbaMidRegister, 1677 registerStruct->lbaHighRegister, 1678 registerStruct->deviceRegister, 1679 registerStruct->statusRegister); 1680 } 1681 /*We can't do handleEdmaError directly here, because CommandCompletionCB is called by 1682 * mv's ISR, if we retry the command, than the internel data structure may be destroyed*/ 1683 pCmd->uScratch.sata_param.responseFlags = responseFlags; 1684 pCmd->uScratch.sata_param.bIdeStatus = registerStruct->statusRegister; 1685 pCmd->uScratch.sata_param.errorRegister = registerStruct->errorRegister; 1686 pCmd->pVDevice->u.disk.QueueLength--; 1687 CallAfterReturn(_VBUS_P (DPC_PROC)handleEdmaError,pCmd); 1688 return TRUE; 1689 1690 default: 1691 MV_ERROR(" Unknown completion type (%d)\n", comp_type); 1692 return MV_FALSE; 1693 } 1694 1695 if (pCmd->uCmd.Ide.Command == IDE_COMMAND_VERIFY && pCmd->uScratch.sata_param.cmd_priv > 1) { 1696 pCmd->uScratch.sata_param.cmd_priv --; 1697 return TRUE; 1698 } 1699 pCmd->pVDevice->u.disk.QueueLength--; 1700 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1701 return TRUE; 1702 } 1703 1704 void 1705 fDeviceSendCommand(_VBUS_ARG PCommand pCmd) 1706 { 1707 MV_SATA_EDMA_PRD_ENTRY *pPRDTable = 0; 1708 MV_SATA_ADAPTER *pMvSataAdapter; 1709 MV_SATA_CHANNEL *pMvSataChannel; 1710 PVDevice pVDevice = pCmd->pVDevice; 1711 PDevice pDevice = &pVDevice->u.disk; 1712 LBA_T Lba = pCmd->uCmd.Ide.Lba; 1713 USHORT nSector = pCmd->uCmd.Ide.nSectors; 1714 1715 MV_QUEUE_COMMAND_RESULT result; 1716 MV_QUEUE_COMMAND_INFO commandInfo; 1717 MV_UDMA_COMMAND_PARAMS *pUdmaParams = &commandInfo.commandParams.udmaCommand; 1718 MV_NONE_UDMA_COMMAND_PARAMS *pNoUdmaParams = &commandInfo.commandParams.NoneUdmaCommand; 1719 1720 MV_BOOLEAN is48bit; 1721 MV_U8 channel; 1722 int i=0; 1723 1724 DECLARE_BUFFER(FPSCAT_GATH, tmpSg); 1725 1726 if (!pDevice->df_on_line) { 1727 MV_ERROR("Device is offline"); 1728 pCmd->Result = RETURN_BAD_DEVICE; 1729 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1730 return; 1731 } 1732 1733 pDevice->HeadPosition = pCmd->uCmd.Ide.Lba + pCmd->uCmd.Ide.nSectors; 1734 pMvSataChannel = pDevice->mv; 1735 pMvSataAdapter = pMvSataChannel->mvSataAdapter; 1736 channel = pMvSataChannel->channelNumber; 1737 1738 /* old RAID0 has hidden lba. Remember to clear dDeHiddenLba when delete array! */ 1739 Lba += pDevice->dDeHiddenLba; 1740 /* check LBA */ 1741 if (Lba+nSector-1 > pDevice->dDeRealCapacity) { 1742 pCmd->Result = RETURN_INVALID_REQUEST; 1743 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1744 return; 1745 } 1746 1747 /* 1748 * always use 48bit LBA if drive supports it. 1749 * Some Seagate drives report error if you use a 28-bit command 1750 * to access sector 0xfffffff. 1751 */ 1752 is48bit = pMvSataChannel->lba48Address; 1753 1754 switch (pCmd->uCmd.Ide.Command) 1755 { 1756 case IDE_COMMAND_READ: 1757 case IDE_COMMAND_WRITE: 1758 if (pDevice->bDeModeSetting<8) goto pio; 1759 1760 commandInfo.type = MV_QUEUED_COMMAND_TYPE_UDMA; 1761 pUdmaParams->isEXT = is48bit; 1762 pUdmaParams->numOfSectors = nSector; 1763 pUdmaParams->lowLBAAddress = Lba; 1764 pUdmaParams->highLBAAddress = 0; 1765 pUdmaParams->prdHighAddr = 0; 1766 pUdmaParams->callBack = CommandCompletionCB; 1767 pUdmaParams->commandId = (MV_VOID_PTR )pCmd; 1768 if(pCmd->uCmd.Ide.Command == IDE_COMMAND_READ) 1769 pUdmaParams->readWrite = MV_UDMA_TYPE_READ; 1770 else 1771 pUdmaParams->readWrite = MV_UDMA_TYPE_WRITE; 1772 1773 if (pCmd->pSgTable && pCmd->cf_physical_sg) { 1774 FPSCAT_GATH sg1=tmpSg, sg2=pCmd->pSgTable; 1775 do { *sg1++=*sg2; } while ((sg2++->wSgFlag & SG_FLAG_EOT)==0); 1776 } 1777 else { 1778 if (!pCmd->pfnBuildSgl || !pCmd->pfnBuildSgl(_VBUS_P pCmd, tmpSg, 0)) { 1779 pio: 1780 mvSataDisableChannelDma(pMvSataAdapter, channel); 1781 mvSataFlushDmaQueue(pMvSataAdapter, channel, MV_FLUSH_TYPE_CALLBACK); 1782 1783 if (pCmd->pSgTable && pCmd->cf_physical_sg==0) { 1784 FPSCAT_GATH sg1=tmpSg, sg2=pCmd->pSgTable; 1785 do { *sg1++=*sg2; } while ((sg2++->wSgFlag & SG_FLAG_EOT)==0); 1786 } 1787 else { 1788 if (!pCmd->pfnBuildSgl || !pCmd->pfnBuildSgl(_VBUS_P pCmd, tmpSg, 1)) { 1789 pCmd->Result = RETURN_NEED_LOGICAL_SG; 1790 goto finish_cmd; 1791 } 1792 } 1793 1794 do { 1795 ULONG size = tmpSg->wSgSize? tmpSg->wSgSize : 0x10000; 1796 ULONG_PTR addr = tmpSg->dSgAddress; 1797 if (size & 0x1ff) { 1798 pCmd->Result = RETURN_INVALID_REQUEST; 1799 goto finish_cmd; 1800 } 1801 if (mvStorageDevATAExecuteNonUDMACommand(pMvSataAdapter, channel, 1802 (pCmd->cf_data_out)?MV_NON_UDMA_PROTOCOL_PIO_DATA_OUT:MV_NON_UDMA_PROTOCOL_PIO_DATA_IN, 1803 is48bit, 1804 (MV_U16_PTR)addr, 1805 size >> 1, /* count */ 1806 0, /* features N/A */ 1807 (MV_U16)(size>>9), /*sector count*/ 1808 (MV_U16)( (is48bit? (MV_U16)((Lba >> 16) & 0xFF00) : 0 ) | (UCHAR)(Lba & 0xFF) ), /*lbalow*/ 1809 (MV_U16)((Lba >> 8) & 0xFF), /* lbaMid */ 1810 (MV_U16)((Lba >> 16) & 0xFF),/* lbaHigh */ 1811 (MV_U8)(0x40 | (is48bit ? 0 : (UCHAR)(Lba >> 24) & 0xFF )),/* device */ 1812 (MV_U8)(is48bit ? (pCmd->cf_data_in?IDE_COMMAND_READ_EXT:IDE_COMMAND_WRITE_EXT):pCmd->uCmd.Ide.Command) 1813 )==MV_FALSE) 1814 { 1815 pCmd->Result = RETURN_IDE_ERROR; 1816 goto finish_cmd; 1817 } 1818 Lba += size>>9; 1819 if(Lba & 0xF0000000) is48bit = MV_TRUE; 1820 } 1821 while ((tmpSg++->wSgFlag & SG_FLAG_EOT)==0); 1822 pCmd->Result = RETURN_SUCCESS; 1823 finish_cmd: 1824 mvSataEnableChannelDma(pMvSataAdapter,channel); 1825 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1826 return; 1827 } 1828 } 1829 1830 pPRDTable = (MV_SATA_EDMA_PRD_ENTRY *) AllocatePRDTable(pMvSataAdapter->IALData); 1831 KdPrint(("pPRDTable:%p\n",pPRDTable)); 1832 if (!pPRDTable) { 1833 pCmd->Result = RETURN_DEVICE_BUSY; 1834 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1835 HPT_ASSERT(0); 1836 return; 1837 } 1838 1839 do{ 1840 pPRDTable[i].highBaseAddr = (sizeof(tmpSg->dSgAddress)>4 ? (MV_U32)(tmpSg->dSgAddress>>32) : 0); 1841 pPRDTable[i].flags = (MV_U16)tmpSg->wSgFlag; 1842 pPRDTable[i].byteCount = (MV_U16)tmpSg->wSgSize; 1843 pPRDTable[i].lowBaseAddr = (MV_U32)tmpSg->dSgAddress; 1844 pPRDTable[i].reserved = 0; 1845 i++; 1846 }while((tmpSg++->wSgFlag & SG_FLAG_EOT)==0); 1847 1848 pUdmaParams->prdLowAddr = (ULONG)fOsPhysicalAddress(pPRDTable); 1849 if ((pUdmaParams->numOfSectors == 256) && (pMvSataChannel->lba48Address == MV_FALSE)) { 1850 pUdmaParams->numOfSectors = 0; 1851 } 1852 1853 pCmd->uScratch.sata_param.prdAddr = (PVOID)pPRDTable; 1854 1855 result = mvSataQueueCommand(pMvSataAdapter, channel, &commandInfo); 1856 1857 if (result != MV_QUEUE_COMMAND_RESULT_OK) 1858 { 1859 queue_failed: 1860 switch (result) 1861 { 1862 case MV_QUEUE_COMMAND_RESULT_BAD_LBA_ADDRESS: 1863 MV_ERROR("IAL Error: Edma Queue command failed. Bad LBA " 1864 "LBA[31:0](0x%08x)\n", pUdmaParams->lowLBAAddress); 1865 pCmd->Result = RETURN_IDE_ERROR; 1866 break; 1867 case MV_QUEUE_COMMAND_RESULT_QUEUED_MODE_DISABLED: 1868 MV_ERROR("IAL Error: Edma Queue command failed. EDMA" 1869 " disabled adapter %d channel %d\n", 1870 pMvSataAdapter->adapterId, channel); 1871 mvSataEnableChannelDma(pMvSataAdapter,channel); 1872 pCmd->Result = RETURN_IDE_ERROR; 1873 break; 1874 case MV_QUEUE_COMMAND_RESULT_FULL: 1875 MV_ERROR("IAL Error: Edma Queue command failed. Queue is" 1876 " Full adapter %d channel %d\n", 1877 pMvSataAdapter->adapterId, channel); 1878 pCmd->Result = RETURN_DEVICE_BUSY; 1879 break; 1880 case MV_QUEUE_COMMAND_RESULT_BAD_PARAMS: 1881 MV_ERROR("IAL Error: Edma Queue command failed. (Bad " 1882 "Params), pMvSataAdapter: %p, pSataChannel: %p.\n", 1883 pMvSataAdapter, pMvSataAdapter->sataChannel[channel]); 1884 pCmd->Result = RETURN_IDE_ERROR; 1885 break; 1886 default: 1887 MV_ERROR("IAL Error: Bad result value (%d) from queue" 1888 " command\n", result); 1889 pCmd->Result = RETURN_IDE_ERROR; 1890 } 1891 if(pPRDTable) 1892 FreePRDTable(pMvSataAdapter->IALData,pPRDTable); 1893 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1894 } 1895 pDevice->QueueLength++; 1896 return; 1897 1898 case IDE_COMMAND_VERIFY: 1899 commandInfo.type = MV_QUEUED_COMMAND_TYPE_NONE_UDMA; 1900 pNoUdmaParams->bufPtr = NULL; 1901 pNoUdmaParams->callBack = CommandCompletionCB; 1902 pNoUdmaParams->commandId = (MV_VOID_PTR)pCmd; 1903 pNoUdmaParams->count = 0; 1904 pNoUdmaParams->features = 0; 1905 pNoUdmaParams->protocolType = MV_NON_UDMA_PROTOCOL_NON_DATA; 1906 1907 pCmd->uScratch.sata_param.cmd_priv = 1; 1908 if (pMvSataChannel->lba48Address == MV_TRUE){ 1909 pNoUdmaParams->command = MV_ATA_COMMAND_READ_VERIFY_SECTORS_EXT; 1910 pNoUdmaParams->isEXT = MV_TRUE; 1911 pNoUdmaParams->lbaHigh = (MV_U16)((Lba & 0xff0000) >> 16); 1912 pNoUdmaParams->lbaMid = (MV_U16)((Lba & 0xff00) >> 8); 1913 pNoUdmaParams->lbaLow = 1914 (MV_U16)(((Lba & 0xff000000) >> 16)| (Lba & 0xff)); 1915 pNoUdmaParams->sectorCount = nSector; 1916 pNoUdmaParams->device = 0x40; 1917 result = mvSataQueueCommand(pMvSataAdapter, channel, &commandInfo); 1918 if (result != MV_QUEUE_COMMAND_RESULT_OK){ 1919 goto queue_failed; 1920 } 1921 return; 1922 } 1923 else{ 1924 pNoUdmaParams->command = MV_ATA_COMMAND_READ_VERIFY_SECTORS; 1925 pNoUdmaParams->isEXT = MV_FALSE; 1926 pNoUdmaParams->lbaHigh = (MV_U16)((Lba & 0xff0000) >> 16); 1927 pNoUdmaParams->lbaMid = (MV_U16)((Lba & 0xff00) >> 8); 1928 pNoUdmaParams->lbaLow = (MV_U16)(Lba & 0xff); 1929 pNoUdmaParams->sectorCount = 0xff & nSector; 1930 pNoUdmaParams->device = (MV_U8)(0x40 | 1931 ((Lba & 0xf000000) >> 24)); 1932 pNoUdmaParams->callBack = CommandCompletionCB; 1933 result = mvSataQueueCommand(pMvSataAdapter, channel, &commandInfo); 1934 /*FIXME: how about the commands already queued? but marvel also forgets to consider this*/ 1935 if (result != MV_QUEUE_COMMAND_RESULT_OK){ 1936 goto queue_failed; 1937 } 1938 } 1939 break; 1940 default: 1941 pCmd->Result = RETURN_INVALID_REQUEST; 1942 CallAfterReturn(_VBUS_P (DPC_PROC)pCmd->pfnCompletion, pCmd); 1943 break; 1944 } 1945 } 1946 1947 /********************************************************** 1948 * 1949 * Probe the hostadapter. 1950 * 1951 **********************************************************/ 1952 static int 1953 hpt_probe(device_t dev) 1954 { 1955 if ((pci_get_vendor(dev) == MV_SATA_VENDOR_ID) && 1956 (pci_get_device(dev) == MV_SATA_DEVICE_ID_5081 1957 #ifdef FOR_DEMO 1958 || pci_get_device(dev) == MV_SATA_DEVICE_ID_5080 1959 #endif 1960 )) 1961 { 1962 KdPrintI((CONTROLLER_NAME " found\n")); 1963 device_set_desc(dev, CONTROLLER_NAME); 1964 return (BUS_PROBE_DEFAULT); 1965 } 1966 else 1967 return(ENXIO); 1968 } 1969 1970 /*********************************************************** 1971 * 1972 * Auto configuration: attach and init a host adapter. 1973 * 1974 ***********************************************************/ 1975 static int 1976 hpt_attach(device_t dev) 1977 { 1978 IAL_ADAPTER_T * pAdapter = device_get_softc(dev); 1979 int rid; 1980 union ccb *ccb; 1981 struct cam_devq *devq; 1982 struct cam_sim *hpt_vsim; 1983 1984 device_printf(dev, "%s Version %s \n", DRIVER_NAME, DRIVER_VERSION); 1985 1986 pAdapter->hpt_dev = dev; 1987 1988 rid = init_adapter(pAdapter); 1989 if (rid) 1990 return rid; 1991 1992 rid = 0; 1993 if ((pAdapter->hpt_irq = bus_alloc_resource_any(pAdapter->hpt_dev, SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) 1994 { 1995 hpt_printk(("can't allocate interrupt\n")); 1996 return(ENXIO); 1997 } 1998 1999 if (bus_setup_intr(pAdapter->hpt_dev, pAdapter->hpt_irq, 2000 INTR_TYPE_CAM | INTR_MPSAFE, 2001 NULL, hpt_intr, pAdapter, &pAdapter->hpt_intr)) 2002 { 2003 hpt_printk(("can't set up interrupt\n")); 2004 free(pAdapter, M_DEVBUF); 2005 return(ENXIO); 2006 } 2007 2008 2009 if((ccb = (union ccb *)malloc(sizeof(*ccb), M_DEVBUF, M_WAITOK)) != (union ccb*)NULL) 2010 { 2011 bzero(ccb, sizeof(*ccb)); 2012 ccb->ccb_h.pinfo.priority = 1; 2013 ccb->ccb_h.pinfo.index = CAM_UNQUEUED_INDEX; 2014 } 2015 else 2016 { 2017 return ENOMEM; 2018 } 2019 /* 2020 * Create the device queue for our SIM(s). 2021 */ 2022 if((devq = cam_simq_alloc(8/*MAX_QUEUE_COMM*/)) == NULL) 2023 { 2024 KdPrint(("ENXIO\n")); 2025 return ENOMEM; 2026 } 2027 2028 /* 2029 * Construct our SIM entry 2030 */ 2031 hpt_vsim = cam_sim_alloc(hpt_action, hpt_poll, __str(PROC_DIR_NAME), 2032 pAdapter, device_get_unit(pAdapter->hpt_dev), 2033 &pAdapter->lock, 1, 8, devq); 2034 if (hpt_vsim == NULL) { 2035 cam_simq_free(devq); 2036 return ENOMEM; 2037 } 2038 2039 mtx_lock(&pAdapter->lock); 2040 if (xpt_bus_register(hpt_vsim, dev, 0) != CAM_SUCCESS) 2041 { 2042 cam_sim_free(hpt_vsim, /*free devq*/ TRUE); 2043 mtx_unlock(&pAdapter->lock); 2044 hpt_vsim = NULL; 2045 return ENXIO; 2046 } 2047 2048 if(xpt_create_path(&pAdapter->path, /*periph */ NULL, 2049 cam_sim_path(hpt_vsim), CAM_TARGET_WILDCARD, 2050 CAM_LUN_WILDCARD) != CAM_REQ_CMP) 2051 { 2052 xpt_bus_deregister(cam_sim_path(hpt_vsim)); 2053 cam_sim_free(hpt_vsim, /*free_devq*/TRUE); 2054 mtx_unlock(&pAdapter->lock); 2055 hpt_vsim = NULL; 2056 return ENXIO; 2057 } 2058 mtx_unlock(&pAdapter->lock); 2059 2060 xpt_setup_ccb(&(ccb->ccb_h), pAdapter->path, /*priority*/5); 2061 ccb->ccb_h.func_code = XPT_SASYNC_CB; 2062 ccb->csa.event_enable = AC_LOST_DEVICE; 2063 ccb->csa.callback = hpt_async; 2064 ccb->csa.callback_arg = hpt_vsim; 2065 xpt_action((union ccb *)ccb); 2066 free(ccb, M_DEVBUF); 2067 2068 if (device_get_unit(dev) == 0) { 2069 /* Start the work thread. XXX */ 2070 launch_worker_thread(); 2071 } 2072 2073 return 0; 2074 } 2075 2076 static int 2077 hpt_detach(device_t dev) 2078 { 2079 return (EBUSY); 2080 } 2081 2082 2083 /*************************************************************** 2084 * The poll function is used to simulate the interrupt when 2085 * the interrupt subsystem is not functioning. 2086 * 2087 ***************************************************************/ 2088 static void 2089 hpt_poll(struct cam_sim *sim) 2090 { 2091 IAL_ADAPTER_T *pAdapter; 2092 2093 pAdapter = cam_sim_softc(sim); 2094 2095 hpt_intr_locked((void *)cam_sim_softc(sim)); 2096 } 2097 2098 /**************************************************************** 2099 * Name: hpt_intr 2100 * Description: Interrupt handler. 2101 ****************************************************************/ 2102 static void 2103 hpt_intr(void *arg) 2104 { 2105 IAL_ADAPTER_T *pAdapter; 2106 2107 pAdapter = arg; 2108 mtx_lock(&pAdapter->lock); 2109 hpt_intr_locked(pAdapter); 2110 mtx_unlock(&pAdapter->lock); 2111 } 2112 2113 static void 2114 hpt_intr_locked(IAL_ADAPTER_T *pAdapter) 2115 { 2116 2117 mtx_assert(&pAdapter->lock, MA_OWNED); 2118 /* KdPrintI(("----- Entering Isr() -----\n")); */ 2119 if (mvSataInterruptServiceRoutine(&pAdapter->mvSataAdapter) == MV_TRUE) 2120 { 2121 _VBUS_INST(&pAdapter->VBus) 2122 CheckPendingCall(_VBUS_P0); 2123 } 2124 2125 /* KdPrintI(("----- Leaving Isr() -----\n")); */ 2126 } 2127 2128 /********************************************************** 2129 * Asynchronous Events 2130 *********************************************************/ 2131 #if (!defined(UNREFERENCED_PARAMETER)) 2132 #define UNREFERENCED_PARAMETER(x) (void)(x) 2133 #endif 2134 2135 static void 2136 hpt_async(void * callback_arg, u_int32_t code, struct cam_path * path, 2137 void * arg) 2138 { 2139 /* debug XXXX */ 2140 panic("Here"); 2141 UNREFERENCED_PARAMETER(callback_arg); 2142 UNREFERENCED_PARAMETER(code); 2143 UNREFERENCED_PARAMETER(path); 2144 UNREFERENCED_PARAMETER(arg); 2145 2146 } 2147 2148 static void 2149 FlushAdapter(IAL_ADAPTER_T *pAdapter) 2150 { 2151 int i; 2152 2153 hpt_printk(("flush all devices\n")); 2154 2155 /* flush all devices */ 2156 for (i=0; i<MAX_VDEVICE_PER_VBUS; i++) { 2157 PVDevice pVDev = pAdapter->VBus.pVDevice[i]; 2158 if(pVDev) fFlushVDev(pVDev); 2159 } 2160 } 2161 2162 static int 2163 hpt_shutdown(device_t dev) 2164 { 2165 IAL_ADAPTER_T *pAdapter; 2166 2167 pAdapter = device_get_softc(dev); 2168 2169 EVENTHANDLER_DEREGISTER(shutdown_final, pAdapter->eh); 2170 mtx_lock(&pAdapter->lock); 2171 FlushAdapter(pAdapter); 2172 mtx_unlock(&pAdapter->lock); 2173 /* give the flush some time to happen, 2174 *otherwise "shutdown -p now" will make file system corrupted */ 2175 DELAY(1000 * 1000 * 5); 2176 return 0; 2177 } 2178 2179 void 2180 Check_Idle_Call(IAL_ADAPTER_T *pAdapter) 2181 { 2182 _VBUS_INST(&pAdapter->VBus) 2183 2184 if (mWaitingForIdle(_VBUS_P0)) { 2185 CheckIdleCall(_VBUS_P0); 2186 #ifdef SUPPORT_ARRAY 2187 { 2188 int i; 2189 PVDevice pArray; 2190 for(i = 0; i < MAX_ARRAY_PER_VBUS; i++){ 2191 if ((pArray=ArrayTables(i))->u.array.dArStamp==0) 2192 continue; 2193 else if (pArray->u.array.rf_auto_rebuild) { 2194 KdPrint(("auto rebuild.\n")); 2195 pArray->u.array.rf_auto_rebuild = 0; 2196 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, DUPLICATE); 2197 } 2198 } 2199 } 2200 #endif 2201 } 2202 /* launch the awaiting commands blocked by mWaitingForIdle */ 2203 while(pAdapter->pending_Q!= NULL) 2204 { 2205 _VBUS_INST(&pAdapter->VBus) 2206 union ccb *ccb = (union ccb *)pAdapter->pending_Q->ccb_h.ccb_ccb_ptr; 2207 hpt_free_ccb(&pAdapter->pending_Q, ccb); 2208 CallAfterReturn(_VBUS_P (DPC_PROC)OsSendCommand, ccb); 2209 } 2210 } 2211 2212 static void 2213 ccb_done(union ccb *ccb) 2214 { 2215 PBUS_DMAMAP pmap = (PBUS_DMAMAP)ccb->ccb_adapter; 2216 IAL_ADAPTER_T * pAdapter = pmap->pAdapter; 2217 KdPrintI(("ccb_done: ccb %p status %x\n", ccb, ccb->ccb_h.status)); 2218 2219 dmamap_put(pmap); 2220 xpt_done(ccb); 2221 2222 pAdapter->outstandingCommands--; 2223 2224 if (pAdapter->outstandingCommands == 0) 2225 { 2226 if(DPC_Request_Nums == 0) 2227 Check_Idle_Call(pAdapter); 2228 wakeup(pAdapter); 2229 } 2230 } 2231 2232 /**************************************************************** 2233 * Name: hpt_action 2234 * Description: Process a queued command from the CAM layer. 2235 * Parameters: sim - Pointer to SIM object 2236 * ccb - Pointer to SCSI command structure. 2237 ****************************************************************/ 2238 2239 void 2240 hpt_action(struct cam_sim *sim, union ccb *ccb) 2241 { 2242 IAL_ADAPTER_T * pAdapter = (IAL_ADAPTER_T *) cam_sim_softc(sim); 2243 PBUS_DMAMAP pmap; 2244 _VBUS_INST(&pAdapter->VBus) 2245 2246 mtx_assert(&pAdapter->lock, MA_OWNED); 2247 CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("hpt_action\n")); 2248 KdPrint(("hpt_action(%lx,%lx{%x})\n", (u_long)sim, (u_long)ccb, ccb->ccb_h.func_code)); 2249 2250 switch (ccb->ccb_h.func_code) 2251 { 2252 case XPT_SCSI_IO: /* Execute the requested I/O operation */ 2253 { 2254 /* ccb->ccb_h.path_id is not our bus id - don't check it */ 2255 2256 if (ccb->ccb_h.target_lun) { 2257 ccb->ccb_h.status = CAM_LUN_INVALID; 2258 xpt_done(ccb); 2259 return; 2260 } 2261 if (ccb->ccb_h.target_id >= MAX_VDEVICE_PER_VBUS || 2262 pAdapter->VBus.pVDevice[ccb->ccb_h.target_id]==0) { 2263 ccb->ccb_h.status = CAM_TID_INVALID; 2264 xpt_done(ccb); 2265 return; 2266 } 2267 2268 if (pAdapter->outstandingCommands==0 && DPC_Request_Nums==0) 2269 Check_Idle_Call(pAdapter); 2270 2271 pmap = dmamap_get(pAdapter); 2272 HPT_ASSERT(pmap); 2273 ccb->ccb_adapter = pmap; 2274 memset((void *)pmap->psg, 0, sizeof(pmap->psg)); 2275 2276 if (mWaitingForIdle(_VBUS_P0)) 2277 hpt_queue_ccb(&pAdapter->pending_Q, ccb); 2278 else 2279 OsSendCommand(_VBUS_P ccb); 2280 2281 /* KdPrint(("leave scsiio\n")); */ 2282 break; 2283 } 2284 2285 case XPT_RESET_BUS: 2286 KdPrint(("reset bus\n")); 2287 fResetVBus(_VBUS_P0); 2288 xpt_done(ccb); 2289 break; 2290 2291 case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */ 2292 case XPT_ABORT: /* Abort the specified CCB */ 2293 case XPT_TERM_IO: /* Terminate the I/O process */ 2294 /* XXX Implement */ 2295 ccb->ccb_h.status = CAM_REQ_INVALID; 2296 xpt_done(ccb); 2297 break; 2298 2299 case XPT_GET_TRAN_SETTINGS: 2300 case XPT_SET_TRAN_SETTINGS: 2301 /* XXX Implement */ 2302 ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; 2303 xpt_done(ccb); 2304 break; 2305 2306 case XPT_CALC_GEOMETRY: 2307 cam_calc_geometry(&ccb->ccg, 1); 2308 xpt_done(ccb); 2309 break; 2310 2311 case XPT_PATH_INQ: /* Path routing inquiry */ 2312 { 2313 struct ccb_pathinq *cpi = &ccb->cpi; 2314 2315 cpi->version_num = 1; /* XXX??? */ 2316 cpi->hba_inquiry = PI_SDTR_ABLE; 2317 cpi->target_sprt = 0; 2318 /* Not necessary to reset bus */ 2319 cpi->hba_misc = PIM_NOBUSRESET; 2320 cpi->hba_eng_cnt = 0; 2321 2322 cpi->max_target = MAX_VDEVICE_PER_VBUS; 2323 cpi->max_lun = 0; 2324 cpi->initiator_id = MAX_VDEVICE_PER_VBUS; 2325 2326 cpi->bus_id = cam_sim_bus(sim); 2327 cpi->base_transfer_speed = 3300; 2328 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); 2329 strlcpy(cpi->hba_vid, "HPT ", HBA_IDLEN); 2330 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); 2331 cpi->unit_number = cam_sim_unit(sim); 2332 cpi->transport = XPORT_SPI; 2333 cpi->transport_version = 2; 2334 cpi->protocol = PROTO_SCSI; 2335 cpi->protocol_version = SCSI_REV_2; 2336 cpi->ccb_h.status = CAM_REQ_CMP; 2337 xpt_done(ccb); 2338 break; 2339 } 2340 2341 default: 2342 KdPrint(("invalid cmd\n")); 2343 ccb->ccb_h.status = CAM_REQ_INVALID; 2344 xpt_done(ccb); 2345 break; 2346 } 2347 /* KdPrint(("leave hpt_action..............\n")); */ 2348 } 2349 2350 /* shall be called at lock_driver() */ 2351 static void 2352 hpt_queue_ccb(union ccb **ccb_Q, union ccb *ccb) 2353 { 2354 if(*ccb_Q == NULL) 2355 ccb->ccb_h.ccb_ccb_ptr = ccb; 2356 else { 2357 ccb->ccb_h.ccb_ccb_ptr = (*ccb_Q)->ccb_h.ccb_ccb_ptr; 2358 (*ccb_Q)->ccb_h.ccb_ccb_ptr = (char *)ccb; 2359 } 2360 2361 *ccb_Q = ccb; 2362 } 2363 2364 /* shall be called at lock_driver() */ 2365 static void 2366 hpt_free_ccb(union ccb **ccb_Q, union ccb *ccb) 2367 { 2368 union ccb *TempCCB; 2369 2370 TempCCB = *ccb_Q; 2371 2372 if(ccb->ccb_h.ccb_ccb_ptr == ccb) /*it means SCpnt is the last one in CURRCMDs*/ 2373 *ccb_Q = NULL; 2374 else { 2375 while(TempCCB->ccb_h.ccb_ccb_ptr != (char *)ccb) 2376 TempCCB = (union ccb *)TempCCB->ccb_h.ccb_ccb_ptr; 2377 2378 TempCCB->ccb_h.ccb_ccb_ptr = ccb->ccb_h.ccb_ccb_ptr; 2379 2380 if(*ccb_Q == ccb) 2381 *ccb_Q = TempCCB; 2382 } 2383 } 2384 2385 #ifdef SUPPORT_ARRAY 2386 /*************************************************************************** 2387 * Function: hpt_worker_thread 2388 * Description: Do background rebuilding. Execute in kernel thread context. 2389 * Returns: None 2390 ***************************************************************************/ 2391 static void hpt_worker_thread(void) 2392 { 2393 2394 for(;;) { 2395 mtx_lock(&DpcQueue_Lock); 2396 while (DpcQueue_First!=DpcQueue_Last) { 2397 ST_HPT_DPC p; 2398 p = DpcQueue[DpcQueue_First]; 2399 DpcQueue_First++; 2400 DpcQueue_First %= MAX_DPC; 2401 DPC_Request_Nums++; 2402 mtx_unlock(&DpcQueue_Lock); 2403 p.dpc(p.pAdapter, p.arg, p.flags); 2404 2405 mtx_lock(&p.pAdapter->lock); 2406 mtx_lock(&DpcQueue_Lock); 2407 DPC_Request_Nums--; 2408 /* since we may have prevented Check_Idle_Call, do it here */ 2409 if (DPC_Request_Nums==0) { 2410 if (p.pAdapter->outstandingCommands == 0) { 2411 _VBUS_INST(&p.pAdapter->VBus); 2412 Check_Idle_Call(p.pAdapter); 2413 CheckPendingCall(_VBUS_P0); 2414 } 2415 } 2416 mtx_unlock(&p.pAdapter->lock); 2417 mtx_unlock(&DpcQueue_Lock); 2418 2419 /*Schedule out*/ 2420 if (SIGISMEMBER(curproc->p_siglist, SIGSTOP)) { 2421 /* abort rebuilding process. */ 2422 IAL_ADAPTER_T *pAdapter; 2423 PVDevice pArray; 2424 PVBus _vbus_p; 2425 int i; 2426 2427 sx_slock(&hptmv_list_lock); 2428 pAdapter = gIal_Adapter; 2429 2430 while(pAdapter != NULL){ 2431 mtx_lock(&pAdapter->lock); 2432 _vbus_p = &pAdapter->VBus; 2433 2434 for (i=0;i<MAX_ARRAY_PER_VBUS;i++) 2435 { 2436 if ((pArray=ArrayTables(i))->u.array.dArStamp==0) 2437 continue; 2438 else if (pArray->u.array.rf_rebuilding || 2439 pArray->u.array.rf_verifying || 2440 pArray->u.array.rf_initializing) 2441 { 2442 pArray->u.array.rf_abort_rebuild = 1; 2443 } 2444 } 2445 mtx_unlock(&pAdapter->lock); 2446 pAdapter = pAdapter->next; 2447 } 2448 sx_sunlock(&hptmv_list_lock); 2449 } 2450 mtx_lock(&DpcQueue_Lock); 2451 } 2452 mtx_unlock(&DpcQueue_Lock); 2453 2454 /*Remove this debug option*/ 2455 /* 2456 #ifdef DEBUG 2457 if (SIGISMEMBER(curproc->p_siglist, SIGSTOP)) 2458 pause("hptrdy", 2*hz); 2459 #endif 2460 */ 2461 kproc_suspend_check(curproc); 2462 pause("-", 2*hz); /* wait for something to do */ 2463 } 2464 } 2465 2466 static struct proc *hptdaemonproc; 2467 static struct kproc_desc hpt_kp = { 2468 "hpt_wt", 2469 hpt_worker_thread, 2470 &hptdaemonproc 2471 }; 2472 2473 /*Start this thread in the hpt_attach, to prevent kernel from loading it without our controller.*/ 2474 static void 2475 launch_worker_thread(void) 2476 { 2477 IAL_ADAPTER_T *pAdapTemp; 2478 2479 kproc_start(&hpt_kp); 2480 2481 sx_slock(&hptmv_list_lock); 2482 for (pAdapTemp = gIal_Adapter; pAdapTemp; pAdapTemp = pAdapTemp->next) { 2483 2484 _VBUS_INST(&pAdapTemp->VBus) 2485 int i; 2486 PVDevice pVDev; 2487 2488 for(i = 0; i < MAX_ARRAY_PER_VBUS; i++) 2489 if ((pVDev=ArrayTables(i))->u.array.dArStamp==0) 2490 continue; 2491 else{ 2492 if (pVDev->u.array.rf_need_rebuild && !pVDev->u.array.rf_rebuilding) 2493 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapTemp, pVDev, 2494 (UCHAR)((pVDev->u.array.CriticalMembers || pVDev->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY)); 2495 } 2496 } 2497 sx_sunlock(&hptmv_list_lock); 2498 2499 /* 2500 * hpt_worker_thread needs to be suspended after shutdown sync, when fs sync finished. 2501 */ 2502 EVENTHANDLER_REGISTER(shutdown_post_sync, kproc_shutdown, hptdaemonproc, 2503 SHUTDOWN_PRI_LAST); 2504 } 2505 /* 2506 *SYSINIT(hptwt, SI_SUB_KTHREAD_IDLE, SI_ORDER_FIRST, launch_worker_thread, NULL); 2507 */ 2508 2509 #endif 2510 2511 /********************************************************************************/ 2512 2513 int HPTLIBAPI fOsBuildSgl(_VBUS_ARG PCommand pCmd, FPSCAT_GATH pSg, int logical) 2514 { 2515 union ccb *ccb = (union ccb *)pCmd->pOrgCommand; 2516 2517 if (logical) { 2518 pSg->dSgAddress = (ULONG_PTR)(UCHAR *)ccb->csio.data_ptr; 2519 pSg->wSgSize = ccb->csio.dxfer_len; 2520 pSg->wSgFlag = SG_FLAG_EOT; 2521 return TRUE; 2522 } 2523 /* since we have provided physical sg, nobody will ask us to build physical sg */ 2524 HPT_ASSERT(0); 2525 return FALSE; 2526 } 2527 2528 /*******************************************************************************/ 2529 ULONG HPTLIBAPI 2530 GetStamp(void) 2531 { 2532 /* 2533 * the system variable, ticks, can't be used since it hasn't yet been active 2534 * when our driver starts (ticks==0, it's a invalid stamp value) 2535 */ 2536 ULONG stamp; 2537 do { stamp = random(); } while (stamp==0); 2538 return stamp; 2539 } 2540 2541 2542 static void 2543 SetInquiryData(PINQUIRYDATA inquiryData, PVDevice pVDev) 2544 { 2545 int i; 2546 IDENTIFY_DATA2 *pIdentify = (IDENTIFY_DATA2*)pVDev->u.disk.mv->identifyDevice; 2547 2548 inquiryData->DeviceType = T_DIRECT; /*DIRECT_ACCESS_DEVICE*/ 2549 inquiryData->AdditionalLength = (UCHAR)(sizeof(INQUIRYDATA) - 5); 2550 #ifndef SERIAL_CMDS 2551 inquiryData->CommandQueue = 1; 2552 #endif 2553 2554 switch(pVDev->VDeviceType) { 2555 case VD_SINGLE_DISK: 2556 case VD_ATAPI: 2557 case VD_REMOVABLE: 2558 /* Set the removable bit, if applicable. */ 2559 if ((pVDev->u.disk.df_removable_drive) || (pIdentify->GeneralConfiguration & 0x80)) 2560 inquiryData->RemovableMedia = 1; 2561 2562 /* Fill in vendor identification fields. */ 2563 for (i = 0; i < 20; i += 2) { 2564 inquiryData->VendorId[i] = ((PUCHAR)pIdentify->ModelNumber)[i + 1]; 2565 inquiryData->VendorId[i+1] = ((PUCHAR)pIdentify->ModelNumber)[i]; 2566 2567 } 2568 2569 /* Initialize unused portion of product id. */ 2570 for (i = 0; i < 4; i++) inquiryData->ProductId[12+i] = ' '; 2571 2572 /* firmware revision */ 2573 for (i = 0; i < 4; i += 2) 2574 { 2575 inquiryData->ProductRevisionLevel[i] = ((PUCHAR)pIdentify->FirmwareRevision)[i+1]; 2576 inquiryData->ProductRevisionLevel[i+1] = ((PUCHAR)pIdentify->FirmwareRevision)[i]; 2577 } 2578 break; 2579 default: 2580 memcpy(&inquiryData->VendorId, "RR18xx ", 8); 2581 #ifdef SUPPORT_ARRAY 2582 switch(pVDev->VDeviceType){ 2583 case VD_RAID_0: 2584 if ((pVDev->u.array.pMember[0] && mIsArray(pVDev->u.array.pMember[0])) || 2585 (pVDev->u.array.pMember[1] && mIsArray(pVDev->u.array.pMember[1]))) 2586 memcpy(&inquiryData->ProductId, "RAID 1/0 Array ", 16); 2587 else 2588 memcpy(&inquiryData->ProductId, "RAID 0 Array ", 16); 2589 break; 2590 case VD_RAID_1: 2591 if ((pVDev->u.array.pMember[0] && mIsArray(pVDev->u.array.pMember[0])) || 2592 (pVDev->u.array.pMember[1] && mIsArray(pVDev->u.array.pMember[1]))) 2593 memcpy(&inquiryData->ProductId, "RAID 0/1 Array ", 16); 2594 else 2595 memcpy(&inquiryData->ProductId, "RAID 1 Array ", 16); 2596 break; 2597 case VD_RAID_5: 2598 memcpy(&inquiryData->ProductId, "RAID 5 Array ", 16); 2599 break; 2600 case VD_JBOD: 2601 memcpy(&inquiryData->ProductId, "JBOD Array ", 16); 2602 break; 2603 } 2604 #endif 2605 memcpy(&inquiryData->ProductRevisionLevel, "3.00", 4); 2606 break; 2607 } 2608 } 2609 2610 static void 2611 hpt_timeout(void *arg) 2612 { 2613 PBUS_DMAMAP pmap = (PBUS_DMAMAP)((union ccb *)arg)->ccb_adapter; 2614 IAL_ADAPTER_T *pAdapter = pmap->pAdapter; 2615 _VBUS_INST(&pAdapter->VBus) 2616 2617 mtx_assert(&pAdapter->lock, MA_OWNED); 2618 fResetVBus(_VBUS_P0); 2619 } 2620 2621 static void 2622 hpt_io_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nsegs, int error) 2623 { 2624 PCommand pCmd = (PCommand)arg; 2625 union ccb *ccb = pCmd->pOrgCommand; 2626 struct ccb_hdr *ccb_h = &ccb->ccb_h; 2627 PBUS_DMAMAP pmap = (PBUS_DMAMAP) ccb->ccb_adapter; 2628 IAL_ADAPTER_T *pAdapter = pmap->pAdapter; 2629 PVDevice pVDev = pAdapter->VBus.pVDevice[ccb_h->target_id]; 2630 FPSCAT_GATH psg = pCmd->pSgTable; 2631 int idx; 2632 _VBUS_INST(pVDev->pVBus) 2633 2634 HPT_ASSERT(pCmd->cf_physical_sg); 2635 2636 if (error) 2637 panic("busdma error"); 2638 2639 HPT_ASSERT(nsegs<= MAX_SG_DESCRIPTORS); 2640 2641 if (nsegs != 0) { 2642 for (idx = 0; idx < nsegs; idx++, psg++) { 2643 psg->dSgAddress = (ULONG_PTR)(UCHAR *)segs[idx].ds_addr; 2644 psg->wSgSize = segs[idx].ds_len; 2645 psg->wSgFlag = (idx == nsegs-1)? SG_FLAG_EOT: 0; 2646 /* KdPrint(("psg[%d]:add=%p,size=%x,flag=%x\n", idx, psg->dSgAddress,psg->wSgSize,psg->wSgFlag)); */ 2647 } 2648 /* psg[-1].wSgFlag = SG_FLAG_EOT; */ 2649 2650 if (pCmd->cf_data_in) { 2651 bus_dmamap_sync(pAdapter->io_dma_parent, pmap->dma_map, 2652 BUS_DMASYNC_PREREAD); 2653 } 2654 else if (pCmd->cf_data_out) { 2655 bus_dmamap_sync(pAdapter->io_dma_parent, pmap->dma_map, 2656 BUS_DMASYNC_PREWRITE); 2657 } 2658 } 2659 2660 callout_reset(&pmap->timeout, 20 * hz, hpt_timeout, ccb); 2661 pVDev->pfnSendCommand(_VBUS_P pCmd); 2662 CheckPendingCall(_VBUS_P0); 2663 } 2664 2665 2666 2667 static void HPTLIBAPI 2668 OsSendCommand(_VBUS_ARG union ccb *ccb) 2669 { 2670 PBUS_DMAMAP pmap = (PBUS_DMAMAP)ccb->ccb_adapter; 2671 IAL_ADAPTER_T *pAdapter = pmap->pAdapter; 2672 struct ccb_hdr *ccb_h = &ccb->ccb_h; 2673 struct ccb_scsiio *csio = &ccb->csio; 2674 PVDevice pVDev = pAdapter->VBus.pVDevice[ccb_h->target_id]; 2675 2676 KdPrintI(("OsSendCommand: ccb %p cdb %x-%x-%x\n", 2677 ccb, 2678 *(ULONG *)&ccb->csio.cdb_io.cdb_bytes[0], 2679 *(ULONG *)&ccb->csio.cdb_io.cdb_bytes[4], 2680 *(ULONG *)&ccb->csio.cdb_io.cdb_bytes[8] 2681 )); 2682 2683 pAdapter->outstandingCommands++; 2684 2685 if (pVDev == NULL || pVDev->vf_online == 0) { 2686 ccb->ccb_h.status = CAM_REQ_INVALID; 2687 ccb_done(ccb); 2688 goto Command_Complished; 2689 } 2690 2691 switch(ccb->csio.cdb_io.cdb_bytes[0]) 2692 { 2693 case TEST_UNIT_READY: 2694 case START_STOP_UNIT: 2695 case SYNCHRONIZE_CACHE: 2696 /* FALLTHROUGH */ 2697 ccb->ccb_h.status = CAM_REQ_CMP; 2698 break; 2699 2700 case INQUIRY: 2701 ZeroMemory(ccb->csio.data_ptr, ccb->csio.dxfer_len); 2702 SetInquiryData((PINQUIRYDATA)ccb->csio.data_ptr, pVDev); 2703 ccb_h->status = CAM_REQ_CMP; 2704 break; 2705 2706 case READ_CAPACITY: 2707 { 2708 UCHAR *rbuf=csio->data_ptr; 2709 unsigned int cap; 2710 2711 if (pVDev->VDeviceCapacity > 0xfffffffful) { 2712 cap = 0xfffffffful; 2713 } else { 2714 cap = pVDev->VDeviceCapacity - 1; 2715 } 2716 2717 rbuf[0] = (UCHAR)(cap>>24); 2718 rbuf[1] = (UCHAR)(cap>>16); 2719 rbuf[2] = (UCHAR)(cap>>8); 2720 rbuf[3] = (UCHAR)cap; 2721 /* Claim 512 byte blocks (big-endian). */ 2722 rbuf[4] = 0; 2723 rbuf[5] = 0; 2724 rbuf[6] = 2; 2725 rbuf[7] = 0; 2726 2727 ccb_h->status = CAM_REQ_CMP; 2728 break; 2729 } 2730 2731 case 0x9e: /*SERVICE_ACTION_IN*/ 2732 { 2733 UCHAR *rbuf = csio->data_ptr; 2734 LBA_T cap = pVDev->VDeviceCapacity - 1; 2735 2736 rbuf[0] = (UCHAR)(cap>>56); 2737 rbuf[1] = (UCHAR)(cap>>48); 2738 rbuf[2] = (UCHAR)(cap>>40); 2739 rbuf[3] = (UCHAR)(cap>>32); 2740 rbuf[4] = (UCHAR)(cap>>24); 2741 rbuf[5] = (UCHAR)(cap>>16); 2742 rbuf[6] = (UCHAR)(cap>>8); 2743 rbuf[7] = (UCHAR)cap; 2744 rbuf[8] = 0; 2745 rbuf[9] = 0; 2746 rbuf[10] = 2; 2747 rbuf[11] = 0; 2748 2749 ccb_h->status = CAM_REQ_CMP; 2750 break; 2751 } 2752 2753 case READ_6: 2754 case WRITE_6: 2755 case READ_10: 2756 case WRITE_10: 2757 case 0x88: /* READ_16 */ 2758 case 0x8a: /* WRITE_16 */ 2759 case 0x13: 2760 case 0x2f: 2761 { 2762 UCHAR Cdb[16]; 2763 UCHAR CdbLength; 2764 _VBUS_INST(pVDev->pVBus) 2765 PCommand pCmd = AllocateCommand(_VBUS_P0); 2766 int error; 2767 HPT_ASSERT(pCmd); 2768 2769 CdbLength = csio->cdb_len; 2770 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) != 0) 2771 { 2772 if ((ccb->ccb_h.flags & CAM_CDB_PHYS) == 0) 2773 { 2774 bcopy(csio->cdb_io.cdb_ptr, Cdb, CdbLength); 2775 } 2776 else 2777 { 2778 KdPrintE(("ERROR!!!\n")); 2779 ccb->ccb_h.status = CAM_REQ_INVALID; 2780 break; 2781 } 2782 } 2783 else 2784 { 2785 bcopy(csio->cdb_io.cdb_bytes, Cdb, CdbLength); 2786 } 2787 2788 pCmd->pOrgCommand = ccb; 2789 pCmd->pVDevice = pVDev; 2790 pCmd->pfnCompletion = fOsCommandDone; 2791 pCmd->pfnBuildSgl = fOsBuildSgl; 2792 pCmd->pSgTable = pmap->psg; 2793 2794 switch (Cdb[0]) 2795 { 2796 case READ_6: 2797 case WRITE_6: 2798 case 0x13: 2799 pCmd->uCmd.Ide.Lba = ((ULONG)Cdb[1] << 16) | ((ULONG)Cdb[2] << 8) | (ULONG)Cdb[3]; 2800 pCmd->uCmd.Ide.nSectors = (USHORT) Cdb[4]; 2801 break; 2802 2803 case 0x88: /* READ_16 */ 2804 case 0x8a: /* WRITE_16 */ 2805 pCmd->uCmd.Ide.Lba = 2806 (HPT_U64)Cdb[2] << 56 | 2807 (HPT_U64)Cdb[3] << 48 | 2808 (HPT_U64)Cdb[4] << 40 | 2809 (HPT_U64)Cdb[5] << 32 | 2810 (HPT_U64)Cdb[6] << 24 | 2811 (HPT_U64)Cdb[7] << 16 | 2812 (HPT_U64)Cdb[8] << 8 | 2813 (HPT_U64)Cdb[9]; 2814 pCmd->uCmd.Ide.nSectors = (USHORT)Cdb[12] << 8 | (USHORT)Cdb[13]; 2815 break; 2816 2817 default: 2818 pCmd->uCmd.Ide.Lba = (ULONG)Cdb[5] | ((ULONG)Cdb[4] << 8) | ((ULONG)Cdb[3] << 16) | ((ULONG)Cdb[2] << 24); 2819 pCmd->uCmd.Ide.nSectors = (USHORT) Cdb[8] | ((USHORT)Cdb[7]<<8); 2820 break; 2821 } 2822 2823 switch (Cdb[0]) 2824 { 2825 case READ_6: 2826 case READ_10: 2827 case 0x88: /* READ_16 */ 2828 pCmd->uCmd.Ide.Command = IDE_COMMAND_READ; 2829 pCmd->cf_data_in = 1; 2830 break; 2831 2832 case WRITE_6: 2833 case WRITE_10: 2834 case 0x8a: /* WRITE_16 */ 2835 pCmd->uCmd.Ide.Command = IDE_COMMAND_WRITE; 2836 pCmd->cf_data_out = 1; 2837 break; 2838 case 0x13: 2839 case 0x2f: 2840 pCmd->uCmd.Ide.Command = IDE_COMMAND_VERIFY; 2841 break; 2842 } 2843 /*///////////////////////// */ 2844 pCmd->cf_physical_sg = 1; 2845 error = bus_dmamap_load_ccb(pAdapter->io_dma_parent, 2846 pmap->dma_map, 2847 ccb, 2848 hpt_io_dmamap_callback, 2849 pCmd, BUS_DMA_WAITOK 2850 ); 2851 KdPrint(("bus_dmamap_load return %d\n", error)); 2852 if (error && error!=EINPROGRESS) { 2853 hpt_printk(("bus_dmamap_load error %d\n", error)); 2854 FreeCommand(_VBUS_P pCmd); 2855 ccb->ccb_h.status = CAM_REQ_CMP_ERR; 2856 dmamap_put(pmap); 2857 pAdapter->outstandingCommands--; 2858 if (pAdapter->outstandingCommands == 0) 2859 wakeup(pAdapter); 2860 xpt_done(ccb); 2861 } 2862 goto Command_Complished; 2863 } 2864 2865 default: 2866 ccb->ccb_h.status = CAM_REQ_INVALID; 2867 break; 2868 } 2869 ccb_done(ccb); 2870 Command_Complished: 2871 CheckPendingCall(_VBUS_P0); 2872 return; 2873 } 2874 2875 static void HPTLIBAPI 2876 fOsCommandDone(_VBUS_ARG PCommand pCmd) 2877 { 2878 union ccb *ccb = pCmd->pOrgCommand; 2879 PBUS_DMAMAP pmap = (PBUS_DMAMAP)ccb->ccb_adapter; 2880 IAL_ADAPTER_T *pAdapter = pmap->pAdapter; 2881 2882 KdPrint(("fOsCommandDone(pcmd=%p, result=%d)\n", pCmd, pCmd->Result)); 2883 2884 callout_stop(&pmap->timeout); 2885 2886 switch(pCmd->Result) { 2887 case RETURN_SUCCESS: 2888 ccb->ccb_h.status = CAM_REQ_CMP; 2889 break; 2890 case RETURN_BAD_DEVICE: 2891 ccb->ccb_h.status = CAM_DEV_NOT_THERE; 2892 break; 2893 case RETURN_DEVICE_BUSY: 2894 ccb->ccb_h.status = CAM_BUSY; 2895 break; 2896 case RETURN_INVALID_REQUEST: 2897 ccb->ccb_h.status = CAM_REQ_INVALID; 2898 break; 2899 case RETURN_SELECTION_TIMEOUT: 2900 ccb->ccb_h.status = CAM_SEL_TIMEOUT; 2901 break; 2902 case RETURN_RETRY: 2903 ccb->ccb_h.status = CAM_BUSY; 2904 break; 2905 default: 2906 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; 2907 break; 2908 } 2909 2910 if (pCmd->cf_data_in) { 2911 bus_dmamap_sync(pAdapter->io_dma_parent, pmap->dma_map, BUS_DMASYNC_POSTREAD); 2912 } 2913 else if (pCmd->cf_data_out) { 2914 bus_dmamap_sync(pAdapter->io_dma_parent, pmap->dma_map, BUS_DMASYNC_POSTWRITE); 2915 } 2916 2917 bus_dmamap_unload(pAdapter->io_dma_parent, pmap->dma_map); 2918 2919 FreeCommand(_VBUS_P pCmd); 2920 ccb_done(ccb); 2921 } 2922 2923 int 2924 hpt_queue_dpc(HPT_DPC dpc, IAL_ADAPTER_T * pAdapter, void *arg, UCHAR flags) 2925 { 2926 int p; 2927 2928 mtx_lock(&DpcQueue_Lock); 2929 p = (DpcQueue_Last + 1) % MAX_DPC; 2930 if (p==DpcQueue_First) { 2931 KdPrint(("DPC Queue full!\n")); 2932 mtx_unlock(&DpcQueue_Lock); 2933 return -1; 2934 } 2935 2936 DpcQueue[DpcQueue_Last].dpc = dpc; 2937 DpcQueue[DpcQueue_Last].pAdapter = pAdapter; 2938 DpcQueue[DpcQueue_Last].arg = arg; 2939 DpcQueue[DpcQueue_Last].flags = flags; 2940 DpcQueue_Last = p; 2941 mtx_unlock(&DpcQueue_Lock); 2942 2943 return 0; 2944 } 2945 2946 #ifdef _RAID5N_ 2947 /* 2948 * Allocate memory above 16M, otherwise we may eat all low memory for ISA devices. 2949 * How about the memory for 5081 request/response array and PRD table? 2950 */ 2951 void 2952 *os_alloc_page(_VBUS_ARG0) 2953 { 2954 return (void *)contigmalloc(0x1000, M_DEVBUF, M_NOWAIT, 0x1000000, 0xffffffff, PAGE_SIZE, 0ul); 2955 } 2956 2957 void 2958 *os_alloc_dma_page(_VBUS_ARG0) 2959 { 2960 return (void *)contigmalloc(0x1000, M_DEVBUF, M_NOWAIT, 0x1000000, 0xffffffff, PAGE_SIZE, 0ul); 2961 } 2962 2963 void 2964 os_free_page(_VBUS_ARG void *p) 2965 { 2966 contigfree(p, 0x1000, M_DEVBUF); 2967 } 2968 2969 void 2970 os_free_dma_page(_VBUS_ARG void *p) 2971 { 2972 contigfree(p, 0x1000, M_DEVBUF); 2973 } 2974 2975 void 2976 DoXor1(ULONG *p0, ULONG *p1, ULONG *p2, UINT nBytes) 2977 { 2978 UINT i; 2979 for (i = 0; i < nBytes / 4; i++) *p0++ = *p1++ ^ *p2++; 2980 } 2981 2982 void 2983 DoXor2(ULONG *p0, ULONG *p2, UINT nBytes) 2984 { 2985 UINT i; 2986 for (i = 0; i < nBytes / 4; i++) *p0++ ^= *p2++; 2987 } 2988 #endif 2989