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