Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/arcmsr/arcmsr.c
39536 views
1
/*
2
********************************************************************************
3
** OS : FreeBSD
4
** FILE NAME : arcmsr.c
5
** BY : Erich Chen, Ching Huang
6
** Description: SCSI RAID Device Driver for
7
** ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX/ARC188x)
8
** SATA/SAS RAID HOST Adapter
9
********************************************************************************
10
********************************************************************************
11
**
12
** SPDX-License-Identifier: BSD-3-Clause
13
**
14
** Copyright (C) 2002 - 2012, Areca Technology Corporation All rights reserved.
15
**
16
** Redistribution and use in source and binary forms, with or without
17
** modification, are permitted provided that the following conditions
18
** are met:
19
** 1. Redistributions of source code must retain the above copyright
20
** notice, this list of conditions and the following disclaimer.
21
** 2. Redistributions in binary form must reproduce the above copyright
22
** notice, this list of conditions and the following disclaimer in the
23
** documentation and/or other materials provided with the distribution.
24
** 3. The name of the author may not be used to endorse or promote products
25
** derived from this software without specific prior written permission.
26
**
27
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
28
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
29
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
30
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
31
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT
32
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY
34
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35
**(INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF
36
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
********************************************************************************
38
** History
39
**
40
** REV# DATE NAME DESCRIPTION
41
** 1.00.00.00 03/31/2004 Erich Chen First release
42
** 1.20.00.02 11/29/2004 Erich Chen bug fix with arcmsr_bus_reset when PHY error
43
** 1.20.00.03 04/19/2005 Erich Chen add SATA 24 Ports adapter type support
44
** clean unused function
45
** 1.20.00.12 09/12/2005 Erich Chen bug fix with abort command handling,
46
** firmware version check
47
** and firmware update notify for hardware bug fix
48
** handling if none zero high part physical address
49
** of srb resource
50
** 1.20.00.13 08/18/2006 Erich Chen remove pending srb and report busy
51
** add iop message xfer
52
** with scsi pass-through command
53
** add new device id of sas raid adapters
54
** code fit for SPARC64 & PPC
55
** 1.20.00.14 02/05/2007 Erich Chen bug fix for incorrect ccb_h.status report
56
** and cause g_vfs_done() read write error
57
** 1.20.00.15 10/10/2007 Erich Chen support new RAID adapter type ARC120x
58
** 1.20.00.16 10/10/2009 Erich Chen Bug fix for RAID adapter type ARC120x
59
** bus_dmamem_alloc() with BUS_DMA_ZERO
60
** 1.20.00.17 07/15/2010 Ching Huang Added support ARC1880
61
** report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
62
** prevent cam_periph_error removing all LUN devices of one Target id
63
** for any one LUN device failed
64
** 1.20.00.18 10/14/2010 Ching Huang Fixed "inquiry data fails comparion at DV1 step"
65
** 10/25/2010 Ching Huang Fixed bad range input in bus_alloc_resource for ADAPTER_TYPE_B
66
** 1.20.00.19 11/11/2010 Ching Huang Fixed arcmsr driver prevent arcsas support for Areca SAS HBA ARC13x0
67
** 1.20.00.20 12/08/2010 Ching Huang Avoid calling atomic_set_int function
68
** 1.20.00.21 02/08/2011 Ching Huang Implement I/O request timeout
69
** 02/14/2011 Ching Huang Modified pktRequestCount
70
** 1.20.00.21 03/03/2011 Ching Huang if a command timeout, then wait its ccb back before free it
71
** 1.20.00.22 07/04/2011 Ching Huang Fixed multiple MTX panic
72
** 1.20.00.23 10/28/2011 Ching Huang Added TIMEOUT_DELAY in case of too many HDDs need to start
73
** 1.20.00.23 11/08/2011 Ching Huang Added report device transfer speed
74
** 1.20.00.23 01/30/2012 Ching Huang Fixed Request requeued and Retrying command
75
** 1.20.00.24 06/11/2012 Ching Huang Fixed return sense data condition
76
** 1.20.00.25 08/17/2012 Ching Huang Fixed hotplug device no function on type A adapter
77
** 1.20.00.26 12/14/2012 Ching Huang Added support ARC1214,1224,1264,1284
78
** 1.20.00.27 05/06/2013 Ching Huang Fixed out standing cmd full on ARC-12x4
79
** 1.20.00.28 09/13/2013 Ching Huang Removed recursive mutex in arcmsr_abort_dr_ccbs
80
** 1.20.00.29 12/18/2013 Ching Huang Change simq allocation number, support ARC1883
81
** 1.30.00.00 11/30/2015 Ching Huang Added support ARC1203
82
** 1.40.00.00 07/11/2017 Ching Huang Added support ARC1884
83
** 1.40.00.01 10/30/2017 Ching Huang Fixed release memory resource
84
** 1.50.00.00 09/30/2020 Ching Huang Added support ARC-1886, NVMe/SAS/SATA controller
85
** 1.50.00.01 02/26/2021 Ching Huang Fixed no action of hot plugging device on type_F adapter
86
** 1.50.00.02 04/16/2021 Ching Huang Fixed scsi command timeout on ARC-1886 when
87
** scatter-gather count large than some number
88
** 1.50.00.03 05/04/2021 Ching Huang Fixed doorbell status arrived late on ARC-1886
89
** 1.50.00.04 12/08/2021 Ching Huang Fixed boot up hung under ARC-1886 with no volume created
90
** 1.50.00.05 03/23/2023 Ching Huang Fixed reading buffer empty length error
91
** 1.50.00.06 08/07/2023 Ching Huang Add support adapter using system memory as XOR buffer,
92
** Add support device ID 1883,1886
93
******************************************************************************************
94
*/
95
96
#include <sys/cdefs.h>
97
#if 0
98
#define ARCMSR_DEBUG1 1
99
#endif
100
#include <sys/param.h>
101
#include <sys/systm.h>
102
#include <sys/malloc.h>
103
#include <sys/kernel.h>
104
#include <sys/bus.h>
105
#include <sys/queue.h>
106
#include <sys/stat.h>
107
#include <sys/devicestat.h>
108
#include <sys/kthread.h>
109
#include <sys/module.h>
110
#include <sys/proc.h>
111
#include <sys/lock.h>
112
#include <sys/sysctl.h>
113
#include <sys/poll.h>
114
#include <sys/ioccom.h>
115
#include <vm/vm.h>
116
#include <vm/vm_param.h>
117
#include <vm/pmap.h>
118
119
#include <isa/rtc.h>
120
121
#include <machine/bus.h>
122
#include <machine/resource.h>
123
#include <machine/atomic.h>
124
#include <sys/conf.h>
125
#include <sys/rman.h>
126
127
#include <cam/cam.h>
128
#include <cam/cam_ccb.h>
129
#include <cam/cam_sim.h>
130
#include <cam/cam_periph.h>
131
#include <cam/cam_xpt_periph.h>
132
#include <cam/cam_xpt_sim.h>
133
#include <cam/cam_debug.h>
134
#include <cam/scsi/scsi_all.h>
135
#include <cam/scsi/scsi_message.h>
136
/*
137
**************************************************************************
138
**************************************************************************
139
*/
140
#include <sys/selinfo.h>
141
#include <sys/mutex.h>
142
#include <sys/endian.h>
143
#include <dev/pci/pcivar.h>
144
#include <dev/pci/pcireg.h>
145
146
#define arcmsr_callout_init(a) callout_init(a, /*mpsafe*/1);
147
148
#define ARCMSR_DRIVER_VERSION "arcmsr version 1.50.00.06 2023-08-07"
149
#include <dev/arcmsr/arcmsr.h>
150
/*
151
**************************************************************************
152
**************************************************************************
153
*/
154
static void arcmsr_free_srb(struct CommandControlBlock *srb);
155
static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb);
156
static u_int8_t arcmsr_seek_cmd2abort(union ccb *abortccb);
157
static int arcmsr_probe(device_t dev);
158
static int arcmsr_attach(device_t dev);
159
static int arcmsr_detach(device_t dev);
160
static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg);
161
static void arcmsr_iop_parking(struct AdapterControlBlock *acb);
162
static int arcmsr_shutdown(device_t dev);
163
static void arcmsr_interrupt(struct AdapterControlBlock *acb);
164
static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb);
165
static void arcmsr_free_resource(struct AdapterControlBlock *acb);
166
static void arcmsr_bus_reset(struct AdapterControlBlock *acb);
167
static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
168
static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
169
static void arcmsr_iop_init(struct AdapterControlBlock *acb);
170
static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb);
171
static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, struct QBUFFER *prbuffer);
172
static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb);
173
static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb);
174
static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag);
175
static void arcmsr_iop_reset(struct AdapterControlBlock *acb);
176
static void arcmsr_report_sense_info(struct CommandControlBlock *srb);
177
static void arcmsr_build_srb(struct CommandControlBlock *srb, bus_dma_segment_t *dm_segs, u_int32_t nseg);
178
static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb);
179
static int arcmsr_resume(device_t dev);
180
static int arcmsr_suspend(device_t dev);
181
static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb);
182
static void arcmsr_polling_devmap(void *arg);
183
static void arcmsr_srb_timeout(void *arg);
184
static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb);
185
static void arcmsr_hbe_postqueue_isr(struct AdapterControlBlock *acb);
186
static void arcmsr_hbf_postqueue_isr(struct AdapterControlBlock *acb);
187
static void arcmsr_teardown_intr(device_t dev, struct AdapterControlBlock *acb);
188
#ifdef ARCMSR_DEBUG1
189
static void arcmsr_dump_data(struct AdapterControlBlock *acb);
190
#endif
191
/*
192
**************************************************************************
193
**************************************************************************
194
*/
195
static void UDELAY(u_int32_t us) { DELAY(us); }
196
/*
197
**************************************************************************
198
**************************************************************************
199
*/
200
static bus_dmamap_callback_t arcmsr_map_free_srb;
201
static bus_dmamap_callback_t arcmsr_execute_srb;
202
/*
203
**************************************************************************
204
**************************************************************************
205
*/
206
static d_open_t arcmsr_open;
207
static d_close_t arcmsr_close;
208
static d_ioctl_t arcmsr_ioctl;
209
210
static device_method_t arcmsr_methods[]={
211
DEVMETHOD(device_probe, arcmsr_probe),
212
DEVMETHOD(device_attach, arcmsr_attach),
213
DEVMETHOD(device_detach, arcmsr_detach),
214
DEVMETHOD(device_shutdown, arcmsr_shutdown),
215
DEVMETHOD(device_suspend, arcmsr_suspend),
216
DEVMETHOD(device_resume, arcmsr_resume),
217
DEVMETHOD_END
218
};
219
220
static driver_t arcmsr_driver={
221
"arcmsr", arcmsr_methods, sizeof(struct AdapterControlBlock)
222
};
223
224
DRIVER_MODULE(arcmsr, pci, arcmsr_driver, 0, 0);
225
MODULE_DEPEND(arcmsr, pci, 1, 1, 1);
226
MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
227
#ifndef BUS_DMA_COHERENT
228
#define BUS_DMA_COHERENT 0x04 /* hint: map memory in a coherent way */
229
#endif
230
static struct cdevsw arcmsr_cdevsw={
231
.d_version = D_VERSION,
232
.d_open = arcmsr_open, /* open */
233
.d_close = arcmsr_close, /* close */
234
.d_ioctl = arcmsr_ioctl, /* ioctl */
235
.d_name = "arcmsr", /* name */
236
};
237
/*
238
**************************************************************************
239
**************************************************************************
240
*/
241
static int arcmsr_open(struct cdev *dev, int flags, int fmt, struct thread *proc)
242
{
243
return (0);
244
}
245
/*
246
**************************************************************************
247
**************************************************************************
248
*/
249
static int arcmsr_close(struct cdev *dev, int flags, int fmt, struct thread *proc)
250
{
251
return 0;
252
}
253
/*
254
**************************************************************************
255
**************************************************************************
256
*/
257
static int arcmsr_ioctl(struct cdev *dev, u_long ioctl_cmd, caddr_t arg, int flags, struct thread *proc)
258
{
259
struct AdapterControlBlock *acb = dev->si_drv1;
260
261
return (arcmsr_iop_ioctlcmd(acb, ioctl_cmd, arg));
262
}
263
/*
264
**********************************************************************
265
**********************************************************************
266
*/
267
static u_int32_t arcmsr_disable_allintr( struct AdapterControlBlock *acb)
268
{
269
u_int32_t intmask_org = 0;
270
271
switch (acb->adapter_type) {
272
case ACB_ADAPTER_TYPE_A: {
273
/* disable all outbound interrupt */
274
intmask_org = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intmask); /* disable outbound message0 int */
275
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
276
}
277
break;
278
case ACB_ADAPTER_TYPE_B: {
279
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
280
/* disable all outbound interrupt */
281
intmask_org = READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell_mask)
282
& (~ARCMSR_IOP2DRV_MESSAGE_CMD_DONE); /* disable outbound message0 int */
283
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell_mask, 0); /* disable all interrupt */
284
}
285
break;
286
case ACB_ADAPTER_TYPE_C: {
287
/* disable all outbound interrupt */
288
intmask_org = CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_mask); /* disable outbound message0 int */
289
CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
290
}
291
break;
292
case ACB_ADAPTER_TYPE_D: {
293
/* disable all outbound interrupt */
294
intmask_org = CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable); /* disable outbound message0 int */
295
CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, ARCMSR_HBDMU_ALL_INT_DISABLE);
296
}
297
break;
298
case ACB_ADAPTER_TYPE_E:
299
case ACB_ADAPTER_TYPE_F: {
300
/* disable all outbound interrupt */
301
intmask_org = CHIP_REG_READ32(HBE_MessageUnit, 0, host_int_mask); /* disable outbound message0 int */
302
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_mask, intmask_org | ARCMSR_HBEMU_ALL_INTMASKENABLE);
303
}
304
break;
305
}
306
return (intmask_org);
307
}
308
/*
309
**********************************************************************
310
**********************************************************************
311
*/
312
static void arcmsr_enable_allintr( struct AdapterControlBlock *acb, u_int32_t intmask_org)
313
{
314
u_int32_t mask;
315
316
switch (acb->adapter_type) {
317
case ACB_ADAPTER_TYPE_A: {
318
/* enable outbound Post Queue, outbound doorbell Interrupt */
319
mask = ~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
320
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, intmask_org & mask);
321
acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
322
}
323
break;
324
case ACB_ADAPTER_TYPE_B: {
325
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
326
/* enable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
327
mask = (ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE|ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
328
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt disable*/
329
acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f;
330
}
331
break;
332
case ACB_ADAPTER_TYPE_C: {
333
/* enable outbound Post Queue, outbound doorbell Interrupt */
334
mask = ~(ARCMSR_HBCMU_UTILITY_A_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR_MASK);
335
CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org & mask);
336
acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f;
337
}
338
break;
339
case ACB_ADAPTER_TYPE_D: {
340
/* enable outbound Post Queue, outbound doorbell Interrupt */
341
mask = ARCMSR_HBDMU_ALL_INT_ENABLE;
342
CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, intmask_org | mask);
343
CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable);
344
acb->outbound_int_enable = mask;
345
}
346
break;
347
case ACB_ADAPTER_TYPE_E:
348
case ACB_ADAPTER_TYPE_F: {
349
/* enable outbound Post Queue, outbound doorbell Interrupt */
350
mask = ~(ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR | ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR);
351
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_mask, intmask_org & mask);
352
acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f;
353
}
354
break;
355
}
356
}
357
/*
358
**********************************************************************
359
**********************************************************************
360
*/
361
static u_int8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb)
362
{
363
u_int32_t Index;
364
u_int8_t Retries = 0x00;
365
366
do {
367
for(Index=0; Index < 100; Index++) {
368
if(CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
369
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
370
return TRUE;
371
}
372
UDELAY(10000);
373
}/*max 1 seconds*/
374
}while(Retries++ < 20);/*max 20 sec*/
375
return (FALSE);
376
}
377
/*
378
**********************************************************************
379
**********************************************************************
380
*/
381
static u_int8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb)
382
{
383
u_int32_t Index;
384
u_int8_t Retries = 0x00;
385
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
386
387
do {
388
for(Index=0; Index < 100; Index++) {
389
if(READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
390
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
391
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
392
return TRUE;
393
}
394
UDELAY(10000);
395
}/*max 1 seconds*/
396
}while(Retries++ < 20);/*max 20 sec*/
397
return (FALSE);
398
}
399
/*
400
**********************************************************************
401
**********************************************************************
402
*/
403
static u_int8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock *acb)
404
{
405
u_int32_t Index;
406
u_int8_t Retries = 0x00;
407
408
do {
409
for(Index=0; Index < 100; Index++) {
410
if(CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
411
CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);/*clear interrupt*/
412
return TRUE;
413
}
414
UDELAY(10000);
415
}/*max 1 seconds*/
416
}while(Retries++ < 20);/*max 20 sec*/
417
return (FALSE);
418
}
419
/*
420
**********************************************************************
421
**********************************************************************
422
*/
423
static u_int8_t arcmsr_hbd_wait_msgint_ready(struct AdapterControlBlock *acb)
424
{
425
u_int32_t Index;
426
u_int8_t Retries = 0x00;
427
428
do {
429
for(Index=0; Index < 100; Index++) {
430
if(CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE) {
431
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);/*clear interrupt*/
432
return TRUE;
433
}
434
UDELAY(10000);
435
}/*max 1 seconds*/
436
}while(Retries++ < 20);/*max 20 sec*/
437
return (FALSE);
438
}
439
/*
440
**********************************************************************
441
**********************************************************************
442
*/
443
static u_int8_t arcmsr_hbe_wait_msgint_ready(struct AdapterControlBlock *acb)
444
{
445
u_int32_t Index, read_doorbell;
446
u_int8_t Retries = 0x00;
447
448
do {
449
for(Index=0; Index < 100; Index++) {
450
read_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
451
if((read_doorbell ^ acb->in_doorbell) & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
452
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0);/*clear interrupt*/
453
acb->in_doorbell = read_doorbell;
454
return TRUE;
455
}
456
UDELAY(10000);
457
}/*max 1 seconds*/
458
}while(Retries++ < 20);/*max 20 sec*/
459
return (FALSE);
460
}
461
/*
462
************************************************************************
463
************************************************************************
464
*/
465
static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
466
{
467
int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
468
469
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
470
do {
471
if(arcmsr_hba_wait_msgint_ready(acb)) {
472
break;
473
} else {
474
retry_count--;
475
}
476
}while(retry_count != 0);
477
}
478
/*
479
************************************************************************
480
************************************************************************
481
*/
482
static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb)
483
{
484
int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
485
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
486
487
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_FLUSH_CACHE);
488
do {
489
if(arcmsr_hbb_wait_msgint_ready(acb)) {
490
break;
491
} else {
492
retry_count--;
493
}
494
}while(retry_count != 0);
495
}
496
/*
497
************************************************************************
498
************************************************************************
499
*/
500
static void arcmsr_flush_hbc_cache(struct AdapterControlBlock *acb)
501
{
502
int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
503
504
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
505
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
506
do {
507
if(arcmsr_hbc_wait_msgint_ready(acb)) {
508
break;
509
} else {
510
retry_count--;
511
}
512
}while(retry_count != 0);
513
}
514
/*
515
************************************************************************
516
************************************************************************
517
*/
518
static void arcmsr_flush_hbd_cache(struct AdapterControlBlock *acb)
519
{
520
int retry_count = 30; /* enlarge wait flush adapter cache time: 10 minute */
521
522
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
523
do {
524
if(arcmsr_hbd_wait_msgint_ready(acb)) {
525
break;
526
} else {
527
retry_count--;
528
}
529
}while(retry_count != 0);
530
}
531
/*
532
************************************************************************
533
************************************************************************
534
*/
535
static void arcmsr_flush_hbe_cache(struct AdapterControlBlock *acb)
536
{
537
int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
538
539
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
540
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
541
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
542
do {
543
if(arcmsr_hbe_wait_msgint_ready(acb)) {
544
break;
545
} else {
546
retry_count--;
547
}
548
}while(retry_count != 0);
549
}
550
/*
551
************************************************************************
552
************************************************************************
553
*/
554
static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
555
{
556
switch (acb->adapter_type) {
557
case ACB_ADAPTER_TYPE_A: {
558
arcmsr_flush_hba_cache(acb);
559
}
560
break;
561
case ACB_ADAPTER_TYPE_B: {
562
arcmsr_flush_hbb_cache(acb);
563
}
564
break;
565
case ACB_ADAPTER_TYPE_C: {
566
arcmsr_flush_hbc_cache(acb);
567
}
568
break;
569
case ACB_ADAPTER_TYPE_D: {
570
arcmsr_flush_hbd_cache(acb);
571
}
572
break;
573
case ACB_ADAPTER_TYPE_E:
574
case ACB_ADAPTER_TYPE_F: {
575
arcmsr_flush_hbe_cache(acb);
576
}
577
break;
578
}
579
}
580
/*
581
*******************************************************************************
582
*******************************************************************************
583
*/
584
static int arcmsr_suspend(device_t dev)
585
{
586
struct AdapterControlBlock *acb = device_get_softc(dev);
587
588
/* flush controller */
589
arcmsr_iop_parking(acb);
590
/* disable all outbound interrupt */
591
arcmsr_disable_allintr(acb);
592
return(0);
593
}
594
/*
595
*******************************************************************************
596
*******************************************************************************
597
*/
598
static int arcmsr_resume(device_t dev)
599
{
600
struct AdapterControlBlock *acb = device_get_softc(dev);
601
602
arcmsr_iop_init(acb);
603
return(0);
604
}
605
/*
606
*********************************************************************************
607
*********************************************************************************
608
*/
609
static void arcmsr_async(void *cb_arg, u_int32_t code, struct cam_path *path, void *arg)
610
{
611
u_int8_t target_id, target_lun;
612
613
switch (code) {
614
case AC_LOST_DEVICE:
615
target_id = xpt_path_target_id(path);
616
target_lun = xpt_path_lun_id(path);
617
if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN)) {
618
break;
619
}
620
break;
621
default:
622
break;
623
}
624
}
625
/*
626
**********************************************************************
627
**********************************************************************
628
*/
629
static void arcmsr_report_sense_info(struct CommandControlBlock *srb)
630
{
631
union ccb *pccb = srb->pccb;
632
633
pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
634
pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
635
if(pccb->csio.sense_len) {
636
memset(&pccb->csio.sense_data, 0, sizeof(pccb->csio.sense_data));
637
memcpy(&pccb->csio.sense_data, srb->arcmsr_cdb.SenseData,
638
get_min(sizeof(struct SENSE_DATA), sizeof(pccb->csio.sense_data)));
639
((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70); /* Valid,ErrorCode */
640
pccb->ccb_h.status |= CAM_AUTOSNS_VALID;
641
}
642
}
643
/*
644
*********************************************************************
645
*********************************************************************
646
*/
647
static void arcmsr_abort_hba_allcmd(struct AdapterControlBlock *acb)
648
{
649
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
650
if(!arcmsr_hba_wait_msgint_ready(acb)) {
651
printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
652
}
653
}
654
/*
655
*********************************************************************
656
*********************************************************************
657
*/
658
static void arcmsr_abort_hbb_allcmd(struct AdapterControlBlock *acb)
659
{
660
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
661
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_ABORT_CMD);
662
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
663
printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
664
}
665
}
666
/*
667
*********************************************************************
668
*********************************************************************
669
*/
670
static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
671
{
672
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
673
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
674
if(!arcmsr_hbc_wait_msgint_ready(acb)) {
675
printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
676
}
677
}
678
/*
679
*********************************************************************
680
*********************************************************************
681
*/
682
static void arcmsr_abort_hbd_allcmd(struct AdapterControlBlock *acb)
683
{
684
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
685
if(!arcmsr_hbd_wait_msgint_ready(acb)) {
686
printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
687
}
688
}
689
/*
690
*********************************************************************
691
*********************************************************************
692
*/
693
static void arcmsr_abort_hbe_allcmd(struct AdapterControlBlock *acb)
694
{
695
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
696
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
697
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
698
if(!arcmsr_hbe_wait_msgint_ready(acb)) {
699
printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
700
}
701
}
702
/*
703
*********************************************************************
704
*********************************************************************
705
*/
706
static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
707
{
708
switch (acb->adapter_type) {
709
case ACB_ADAPTER_TYPE_A: {
710
arcmsr_abort_hba_allcmd(acb);
711
}
712
break;
713
case ACB_ADAPTER_TYPE_B: {
714
arcmsr_abort_hbb_allcmd(acb);
715
}
716
break;
717
case ACB_ADAPTER_TYPE_C: {
718
arcmsr_abort_hbc_allcmd(acb);
719
}
720
break;
721
case ACB_ADAPTER_TYPE_D: {
722
arcmsr_abort_hbd_allcmd(acb);
723
}
724
break;
725
case ACB_ADAPTER_TYPE_E:
726
case ACB_ADAPTER_TYPE_F: {
727
arcmsr_abort_hbe_allcmd(acb);
728
}
729
break;
730
}
731
}
732
/*
733
**********************************************************************
734
**********************************************************************
735
*/
736
static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag)
737
{
738
struct AdapterControlBlock *acb = srb->acb;
739
union ccb *pccb = srb->pccb;
740
741
if(srb->srb_flags & SRB_FLAG_TIMER_START)
742
callout_stop(&srb->ccb_callout);
743
if((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
744
bus_dmasync_op_t op;
745
746
if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
747
op = BUS_DMASYNC_POSTREAD;
748
} else {
749
op = BUS_DMASYNC_POSTWRITE;
750
}
751
bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
752
bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
753
}
754
if(stand_flag == 1) {
755
atomic_subtract_int(&acb->srboutstandingcount, 1);
756
if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
757
acb->srboutstandingcount < (acb->maxOutstanding -10))) {
758
acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
759
pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
760
}
761
}
762
if(srb->srb_state != ARCMSR_SRB_TIMEOUT)
763
arcmsr_free_srb(srb);
764
acb->pktReturnCount++;
765
xpt_done(pccb);
766
}
767
/*
768
**************************************************************************
769
**************************************************************************
770
*/
771
static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
772
{
773
int target, lun;
774
775
target = srb->pccb->ccb_h.target_id;
776
lun = srb->pccb->ccb_h.target_lun;
777
if(error == FALSE) {
778
if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
779
acb->devstate[target][lun] = ARECA_RAID_GOOD;
780
}
781
srb->pccb->ccb_h.status |= CAM_REQ_CMP;
782
arcmsr_srb_complete(srb, 1);
783
} else {
784
switch(srb->arcmsr_cdb.DeviceStatus) {
785
case ARCMSR_DEV_SELECT_TIMEOUT: {
786
if(acb->devstate[target][lun] == ARECA_RAID_GOOD) {
787
printf( "arcmsr%d: Target=%x, Lun=%x, selection timeout, raid volume was lost\n", acb->pci_unit, target, lun);
788
}
789
acb->devstate[target][lun] = ARECA_RAID_GONE;
790
srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
791
arcmsr_srb_complete(srb, 1);
792
}
793
break;
794
case ARCMSR_DEV_ABORTED:
795
case ARCMSR_DEV_INIT_FAIL: {
796
acb->devstate[target][lun] = ARECA_RAID_GONE;
797
srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
798
arcmsr_srb_complete(srb, 1);
799
}
800
break;
801
case SCSISTAT_CHECK_CONDITION: {
802
acb->devstate[target][lun] = ARECA_RAID_GOOD;
803
arcmsr_report_sense_info(srb);
804
arcmsr_srb_complete(srb, 1);
805
}
806
break;
807
default:
808
printf("arcmsr%d: scsi id=%d lun=%d isr got command error done,but got unknown DeviceStatus=0x%x \n"
809
, acb->pci_unit, target, lun ,srb->arcmsr_cdb.DeviceStatus);
810
acb->devstate[target][lun] = ARECA_RAID_GONE;
811
srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
812
/*unknown error or crc error just for retry*/
813
arcmsr_srb_complete(srb, 1);
814
break;
815
}
816
}
817
}
818
/*
819
**************************************************************************
820
**************************************************************************
821
*/
822
static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
823
{
824
struct CommandControlBlock *srb;
825
826
/* check if command done with no error*/
827
switch (acb->adapter_type) {
828
case ACB_ADAPTER_TYPE_A:
829
case ACB_ADAPTER_TYPE_B:
830
srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
831
break;
832
case ACB_ADAPTER_TYPE_C:
833
case ACB_ADAPTER_TYPE_D:
834
srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0)); /*frame must be 32 bytes aligned*/
835
break;
836
case ACB_ADAPTER_TYPE_E:
837
case ACB_ADAPTER_TYPE_F:
838
srb = acb->psrb_pool[flag_srb];
839
break;
840
default:
841
srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
842
break;
843
}
844
if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
845
if(srb->srb_state == ARCMSR_SRB_TIMEOUT) {
846
arcmsr_free_srb(srb);
847
printf("arcmsr%d: srb='%p' return srb has been timeouted\n", acb->pci_unit, srb);
848
return;
849
}
850
printf("arcmsr%d: return srb has been completed\n"
851
"srb='%p' srb_state=0x%x outstanding srb count=%d \n",
852
acb->pci_unit, srb, srb->srb_state, acb->srboutstandingcount);
853
return;
854
}
855
arcmsr_report_srb_state(acb, srb, error);
856
}
857
/*
858
**************************************************************************
859
**************************************************************************
860
*/
861
static void arcmsr_srb_timeout(void *arg)
862
{
863
struct CommandControlBlock *srb = (struct CommandControlBlock *)arg;
864
struct AdapterControlBlock *acb;
865
int target, lun;
866
u_int8_t cmd;
867
868
target = srb->pccb->ccb_h.target_id;
869
lun = srb->pccb->ccb_h.target_lun;
870
acb = srb->acb;
871
ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
872
if(srb->srb_state == ARCMSR_SRB_START)
873
{
874
cmd = scsiio_cdb_ptr(&srb->pccb->csio)[0];
875
srb->srb_state = ARCMSR_SRB_TIMEOUT;
876
srb->pccb->ccb_h.status |= CAM_CMD_TIMEOUT;
877
arcmsr_srb_complete(srb, 1);
878
printf("arcmsr%d: scsi id %d lun %d cmd=0x%x srb='%p' ccb command time out!\n",
879
acb->pci_unit, target, lun, cmd, srb);
880
}
881
ARCMSR_LOCK_RELEASE(&acb->isr_lock);
882
#ifdef ARCMSR_DEBUG1
883
arcmsr_dump_data(acb);
884
#endif
885
}
886
887
/*
888
**********************************************************************
889
**********************************************************************
890
*/
891
static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
892
{
893
int i=0;
894
u_int32_t flag_srb;
895
u_int16_t error;
896
897
switch (acb->adapter_type) {
898
case ACB_ADAPTER_TYPE_A: {
899
u_int32_t outbound_intstatus;
900
901
/*clear and abort all outbound posted Q*/
902
outbound_intstatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
903
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
904
while(((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_queueport)) != 0xFFFFFFFF) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
905
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
906
arcmsr_drain_donequeue(acb, flag_srb, error);
907
}
908
}
909
break;
910
case ACB_ADAPTER_TYPE_B: {
911
struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
912
913
/*clear all outbound posted Q*/
914
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
915
for(i=0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
916
if((flag_srb = phbbmu->done_qbuffer[i]) != 0) {
917
phbbmu->done_qbuffer[i] = 0;
918
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
919
arcmsr_drain_donequeue(acb, flag_srb, error);
920
}
921
phbbmu->post_qbuffer[i] = 0;
922
}/*drain reply FIFO*/
923
phbbmu->doneq_index = 0;
924
phbbmu->postq_index = 0;
925
}
926
break;
927
case ACB_ADAPTER_TYPE_C: {
928
while((CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
929
flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
930
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
931
arcmsr_drain_donequeue(acb, flag_srb, error);
932
}
933
}
934
break;
935
case ACB_ADAPTER_TYPE_D:
936
arcmsr_hbd_postqueue_isr(acb);
937
break;
938
case ACB_ADAPTER_TYPE_E:
939
arcmsr_hbe_postqueue_isr(acb);
940
break;
941
case ACB_ADAPTER_TYPE_F:
942
arcmsr_hbf_postqueue_isr(acb);
943
break;
944
}
945
}
946
/*
947
****************************************************************************
948
****************************************************************************
949
*/
950
static void arcmsr_iop_reset(struct AdapterControlBlock *acb)
951
{
952
struct CommandControlBlock *srb;
953
u_int32_t intmask_org;
954
u_int32_t i=0;
955
956
if(acb->srboutstandingcount>0) {
957
/* disable all outbound interrupt */
958
intmask_org = arcmsr_disable_allintr(acb);
959
/*clear and abort all outbound posted Q*/
960
arcmsr_done4abort_postqueue(acb);
961
/* talk to iop 331 outstanding command aborted*/
962
arcmsr_abort_allcmd(acb);
963
for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
964
srb = acb->psrb_pool[i];
965
if(srb->srb_state == ARCMSR_SRB_START) {
966
srb->srb_state = ARCMSR_SRB_ABORTED;
967
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
968
arcmsr_srb_complete(srb, 1);
969
printf("arcmsr%d: scsi id=%d lun=%jx srb='%p' aborted\n"
970
, acb->pci_unit, srb->pccb->ccb_h.target_id
971
, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
972
}
973
}
974
/* enable all outbound interrupt */
975
arcmsr_enable_allintr(acb, intmask_org);
976
}
977
acb->srboutstandingcount = 0;
978
acb->workingsrb_doneindex = 0;
979
acb->workingsrb_startindex = 0;
980
acb->pktRequestCount = 0;
981
acb->pktReturnCount = 0;
982
}
983
/*
984
**********************************************************************
985
**********************************************************************
986
*/
987
static void arcmsr_build_srb(struct CommandControlBlock *srb,
988
bus_dma_segment_t *dm_segs, u_int32_t nseg)
989
{
990
struct ARCMSR_CDB *arcmsr_cdb = &srb->arcmsr_cdb;
991
u_int8_t *psge = (u_int8_t *)&arcmsr_cdb->u;
992
u_int32_t address_lo, address_hi;
993
union ccb *pccb = srb->pccb;
994
struct ccb_scsiio *pcsio = &pccb->csio;
995
u_int32_t arccdbsize = 0x30;
996
997
memset(arcmsr_cdb, 0, sizeof(struct ARCMSR_CDB));
998
arcmsr_cdb->Bus = 0;
999
arcmsr_cdb->TargetID = pccb->ccb_h.target_id;
1000
arcmsr_cdb->LUN = pccb->ccb_h.target_lun;
1001
arcmsr_cdb->Function = 1;
1002
arcmsr_cdb->CdbLength = (u_int8_t)pcsio->cdb_len;
1003
bcopy(scsiio_cdb_ptr(pcsio), arcmsr_cdb->Cdb, pcsio->cdb_len);
1004
if(nseg != 0) {
1005
struct AdapterControlBlock *acb = srb->acb;
1006
bus_dmasync_op_t op;
1007
u_int32_t length, i, cdb_sgcount = 0;
1008
1009
if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
1010
op = BUS_DMASYNC_PREREAD;
1011
} else {
1012
op = BUS_DMASYNC_PREWRITE;
1013
arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE;
1014
srb->srb_flags |= SRB_FLAG_WRITE;
1015
}
1016
bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
1017
for(i=0; i < nseg; i++) {
1018
/* Get the physical address of the current data pointer */
1019
length = arcmsr_htole32(dm_segs[i].ds_len);
1020
address_lo = arcmsr_htole32(dma_addr_lo32(dm_segs[i].ds_addr));
1021
address_hi = arcmsr_htole32(dma_addr_hi32(dm_segs[i].ds_addr));
1022
if(address_hi == 0) {
1023
struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge;
1024
pdma_sg->address = address_lo;
1025
pdma_sg->length = length;
1026
psge += sizeof(struct SG32ENTRY);
1027
arccdbsize += sizeof(struct SG32ENTRY);
1028
} else {
1029
u_int32_t sg64s_size = 0, tmplength = length;
1030
1031
while(1) {
1032
u_int64_t span4G, length0;
1033
struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge;
1034
1035
span4G = (u_int64_t)address_lo + tmplength;
1036
pdma_sg->addresshigh = address_hi;
1037
pdma_sg->address = address_lo;
1038
if(span4G > 0x100000000) {
1039
/*see if cross 4G boundary*/
1040
length0 = 0x100000000-address_lo;
1041
pdma_sg->length = (u_int32_t)length0 | IS_SG64_ADDR;
1042
address_hi = address_hi+1;
1043
address_lo = 0;
1044
tmplength = tmplength - (u_int32_t)length0;
1045
sg64s_size += sizeof(struct SG64ENTRY);
1046
psge += sizeof(struct SG64ENTRY);
1047
cdb_sgcount++;
1048
} else {
1049
pdma_sg->length = tmplength | IS_SG64_ADDR;
1050
sg64s_size += sizeof(struct SG64ENTRY);
1051
psge += sizeof(struct SG64ENTRY);
1052
break;
1053
}
1054
}
1055
arccdbsize += sg64s_size;
1056
}
1057
cdb_sgcount++;
1058
}
1059
arcmsr_cdb->sgcount = (u_int8_t)cdb_sgcount;
1060
arcmsr_cdb->DataLength = pcsio->dxfer_len;
1061
if( arccdbsize > 256) {
1062
arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE;
1063
}
1064
} else {
1065
arcmsr_cdb->DataLength = 0;
1066
}
1067
srb->arc_cdb_size = arccdbsize;
1068
arcmsr_cdb->msgPages = (arccdbsize/256) + ((arccdbsize % 256) ? 1 : 0);
1069
}
1070
/*
1071
**************************************************************************
1072
**************************************************************************
1073
*/
1074
static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct CommandControlBlock *srb)
1075
{
1076
u_int32_t cdb_phyaddr_low = (u_int32_t) srb->cdb_phyaddr;
1077
struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&srb->arcmsr_cdb;
1078
1079
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, (srb->srb_flags & SRB_FLAG_WRITE) ? BUS_DMASYNC_POSTWRITE:BUS_DMASYNC_POSTREAD);
1080
atomic_add_int(&acb->srboutstandingcount, 1);
1081
srb->srb_state = ARCMSR_SRB_START;
1082
1083
switch (acb->adapter_type) {
1084
case ACB_ADAPTER_TYPE_A: {
1085
if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
1086
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_queueport, cdb_phyaddr_low|ARCMSR_SRBPOST_FLAG_SGL_BSIZE);
1087
} else {
1088
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_queueport, cdb_phyaddr_low);
1089
}
1090
}
1091
break;
1092
case ACB_ADAPTER_TYPE_B: {
1093
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1094
int ending_index, index;
1095
1096
index = phbbmu->postq_index;
1097
ending_index = ((index+1) % ARCMSR_MAX_HBB_POSTQUEUE);
1098
phbbmu->post_qbuffer[ending_index] = 0;
1099
if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
1100
phbbmu->post_qbuffer[index] = cdb_phyaddr_low | ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
1101
} else {
1102
phbbmu->post_qbuffer[index] = cdb_phyaddr_low;
1103
}
1104
index++;
1105
index %= ARCMSR_MAX_HBB_POSTQUEUE; /*if last index number set it to 0 */
1106
phbbmu->postq_index = index;
1107
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
1108
}
1109
break;
1110
case ACB_ADAPTER_TYPE_C: {
1111
u_int32_t ccb_post_stamp, arc_cdb_size, cdb_phyaddr_hi32;
1112
1113
arc_cdb_size = (srb->arc_cdb_size > 0x300) ? 0x300 : srb->arc_cdb_size;
1114
ccb_post_stamp = (cdb_phyaddr_low | ((arc_cdb_size-1) >> 6) | 1);
1115
cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
1116
if(cdb_phyaddr_hi32)
1117
{
1118
CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_high, cdb_phyaddr_hi32);
1119
CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
1120
}
1121
else
1122
{
1123
CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
1124
}
1125
}
1126
break;
1127
case ACB_ADAPTER_TYPE_D: {
1128
struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1129
u_int16_t index_stripped;
1130
u_int16_t postq_index;
1131
struct InBound_SRB *pinbound_srb;
1132
1133
ARCMSR_LOCK_ACQUIRE(&acb->postDone_lock);
1134
postq_index = phbdmu->postq_index;
1135
pinbound_srb = (struct InBound_SRB *)&phbdmu->post_qbuffer[postq_index & 0xFF];
1136
pinbound_srb->addressHigh = (u_int32_t)((srb->cdb_phyaddr >> 16) >> 16);
1137
pinbound_srb->addressLow = (u_int32_t)srb->cdb_phyaddr;
1138
pinbound_srb->length = srb->arc_cdb_size >> 2;
1139
arcmsr_cdb->Context = (u_int32_t)srb->cdb_phyaddr;
1140
if (postq_index & 0x4000) {
1141
index_stripped = postq_index & 0xFF;
1142
index_stripped += 1;
1143
index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
1144
phbdmu->postq_index = index_stripped ? (index_stripped | 0x4000) : index_stripped;
1145
} else {
1146
index_stripped = postq_index;
1147
index_stripped += 1;
1148
index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
1149
phbdmu->postq_index = index_stripped ? index_stripped : (index_stripped | 0x4000);
1150
}
1151
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inboundlist_write_pointer, postq_index);
1152
ARCMSR_LOCK_RELEASE(&acb->postDone_lock);
1153
}
1154
break;
1155
case ACB_ADAPTER_TYPE_E: {
1156
u_int32_t ccb_post_stamp, arc_cdb_size;
1157
1158
arc_cdb_size = (srb->arc_cdb_size > 0x300) ? 0x300 : srb->arc_cdb_size;
1159
ccb_post_stamp = (srb->smid | ((arc_cdb_size-1) >> 6));
1160
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_queueport_high, 0);
1161
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_queueport_low, ccb_post_stamp);
1162
}
1163
break;
1164
case ACB_ADAPTER_TYPE_F: {
1165
u_int32_t ccb_post_stamp, arc_cdb_size;
1166
1167
if (srb->arc_cdb_size <= 0x300)
1168
arc_cdb_size = (srb->arc_cdb_size - 1) >> 6 | 1;
1169
else {
1170
arc_cdb_size = ((srb->arc_cdb_size + 0xff) >> 8) + 2;
1171
if (arc_cdb_size > 0xF)
1172
arc_cdb_size = 0xF;
1173
arc_cdb_size = (arc_cdb_size << 1) | 1;
1174
}
1175
ccb_post_stamp = (srb->smid | arc_cdb_size);
1176
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_queueport_high, 0);
1177
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_queueport_low, ccb_post_stamp);
1178
}
1179
break;
1180
}
1181
}
1182
/*
1183
************************************************************************
1184
************************************************************************
1185
*/
1186
static struct QBUFFER *arcmsr_get_iop_rqbuffer( struct AdapterControlBlock *acb)
1187
{
1188
struct QBUFFER *qbuffer=NULL;
1189
1190
switch (acb->adapter_type) {
1191
case ACB_ADAPTER_TYPE_A: {
1192
struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu;
1193
1194
qbuffer = (struct QBUFFER *)&phbamu->message_rbuffer;
1195
}
1196
break;
1197
case ACB_ADAPTER_TYPE_B: {
1198
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1199
1200
qbuffer = (struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_rbuffer;
1201
}
1202
break;
1203
case ACB_ADAPTER_TYPE_C: {
1204
struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu;
1205
1206
qbuffer = (struct QBUFFER *)&phbcmu->message_rbuffer;
1207
}
1208
break;
1209
case ACB_ADAPTER_TYPE_D: {
1210
struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1211
1212
qbuffer = (struct QBUFFER *)&phbdmu->phbdmu->message_rbuffer;
1213
}
1214
break;
1215
case ACB_ADAPTER_TYPE_E: {
1216
struct HBE_MessageUnit *phbcmu = (struct HBE_MessageUnit *)acb->pmu;
1217
1218
qbuffer = (struct QBUFFER *)&phbcmu->message_rbuffer;
1219
}
1220
break;
1221
case ACB_ADAPTER_TYPE_F:
1222
qbuffer = (struct QBUFFER *)acb->message_rbuffer;
1223
break;
1224
}
1225
return(qbuffer);
1226
}
1227
/*
1228
************************************************************************
1229
************************************************************************
1230
*/
1231
static struct QBUFFER *arcmsr_get_iop_wqbuffer( struct AdapterControlBlock *acb)
1232
{
1233
struct QBUFFER *qbuffer = NULL;
1234
1235
switch (acb->adapter_type) {
1236
case ACB_ADAPTER_TYPE_A: {
1237
struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu;
1238
1239
qbuffer = (struct QBUFFER *)&phbamu->message_wbuffer;
1240
}
1241
break;
1242
case ACB_ADAPTER_TYPE_B: {
1243
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1244
1245
qbuffer = (struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_wbuffer;
1246
}
1247
break;
1248
case ACB_ADAPTER_TYPE_C: {
1249
struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu;
1250
1251
qbuffer = (struct QBUFFER *)&phbcmu->message_wbuffer;
1252
}
1253
break;
1254
case ACB_ADAPTER_TYPE_D: {
1255
struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1256
1257
qbuffer = (struct QBUFFER *)&phbdmu->phbdmu->message_wbuffer;
1258
}
1259
break;
1260
case ACB_ADAPTER_TYPE_E: {
1261
struct HBE_MessageUnit *phbcmu = (struct HBE_MessageUnit *)acb->pmu;
1262
1263
qbuffer = (struct QBUFFER *)&phbcmu->message_wbuffer;
1264
}
1265
break;
1266
case ACB_ADAPTER_TYPE_F:
1267
qbuffer = (struct QBUFFER *)acb->message_wbuffer;
1268
break;
1269
}
1270
return(qbuffer);
1271
}
1272
/*
1273
**************************************************************************
1274
**************************************************************************
1275
*/
1276
static void arcmsr_iop_message_read(struct AdapterControlBlock *acb)
1277
{
1278
switch (acb->adapter_type) {
1279
case ACB_ADAPTER_TYPE_A: {
1280
/* let IOP know data has been read */
1281
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
1282
}
1283
break;
1284
case ACB_ADAPTER_TYPE_B: {
1285
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1286
/* let IOP know data has been read */
1287
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
1288
}
1289
break;
1290
case ACB_ADAPTER_TYPE_C: {
1291
/* let IOP know data has been read */
1292
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
1293
}
1294
break;
1295
case ACB_ADAPTER_TYPE_D: {
1296
/* let IOP know data has been read */
1297
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, ARCMSR_HBDMU_DRV2IOP_DATA_OUT_READ);
1298
}
1299
break;
1300
case ACB_ADAPTER_TYPE_E:
1301
case ACB_ADAPTER_TYPE_F: {
1302
/* let IOP know data has been read */
1303
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
1304
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
1305
}
1306
break;
1307
}
1308
}
1309
/*
1310
**************************************************************************
1311
**************************************************************************
1312
*/
1313
static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb)
1314
{
1315
switch (acb->adapter_type) {
1316
case ACB_ADAPTER_TYPE_A: {
1317
/*
1318
** push inbound doorbell tell iop, driver data write ok
1319
** and wait reply on next hwinterrupt for next Qbuffer post
1320
*/
1321
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
1322
}
1323
break;
1324
case ACB_ADAPTER_TYPE_B: {
1325
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1326
/*
1327
** push inbound doorbell tell iop, driver data write ok
1328
** and wait reply on next hwinterrupt for next Qbuffer post
1329
*/
1330
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
1331
}
1332
break;
1333
case ACB_ADAPTER_TYPE_C: {
1334
/*
1335
** push inbound doorbell tell iop, driver data write ok
1336
** and wait reply on next hwinterrupt for next Qbuffer post
1337
*/
1338
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
1339
}
1340
break;
1341
case ACB_ADAPTER_TYPE_D: {
1342
/*
1343
** push inbound doorbell tell iop, driver data write ok
1344
** and wait reply on next hwinterrupt for next Qbuffer post
1345
*/
1346
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, ARCMSR_HBDMU_DRV2IOP_DATA_IN_READY);
1347
}
1348
break;
1349
case ACB_ADAPTER_TYPE_E:
1350
case ACB_ADAPTER_TYPE_F: {
1351
/*
1352
** push inbound doorbell tell iop, driver data write ok
1353
** and wait reply on next hwinterrupt for next Qbuffer post
1354
*/
1355
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK;
1356
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
1357
}
1358
break;
1359
}
1360
}
1361
/*
1362
************************************************************************
1363
************************************************************************
1364
*/
1365
static void arcmsr_stop_hba_bgrb(struct AdapterControlBlock *acb)
1366
{
1367
acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1368
CHIP_REG_WRITE32(HBA_MessageUnit,
1369
0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1370
if(!arcmsr_hba_wait_msgint_ready(acb)) {
1371
printf("arcmsr%d: wait 'stop adapter background rebuild' timeout \n"
1372
, acb->pci_unit);
1373
}
1374
}
1375
/*
1376
************************************************************************
1377
************************************************************************
1378
*/
1379
static void arcmsr_stop_hbb_bgrb(struct AdapterControlBlock *acb)
1380
{
1381
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1382
acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1383
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_STOP_BGRB);
1384
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
1385
printf( "arcmsr%d: wait 'stop adapter background rebuild' timeout \n"
1386
, acb->pci_unit);
1387
}
1388
}
1389
/*
1390
************************************************************************
1391
************************************************************************
1392
*/
1393
static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
1394
{
1395
acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1396
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1397
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
1398
if(!arcmsr_hbc_wait_msgint_ready(acb)) {
1399
printf("arcmsr%d: wait 'stop adapter background rebuild' timeout \n", acb->pci_unit);
1400
}
1401
}
1402
/*
1403
************************************************************************
1404
************************************************************************
1405
*/
1406
static void arcmsr_stop_hbd_bgrb(struct AdapterControlBlock *acb)
1407
{
1408
acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1409
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1410
if(!arcmsr_hbd_wait_msgint_ready(acb)) {
1411
printf("arcmsr%d: wait 'stop adapter background rebuild' timeout \n", acb->pci_unit);
1412
}
1413
}
1414
/*
1415
************************************************************************
1416
************************************************************************
1417
*/
1418
static void arcmsr_stop_hbe_bgrb(struct AdapterControlBlock *acb)
1419
{
1420
acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1421
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1422
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
1423
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
1424
if(!arcmsr_hbe_wait_msgint_ready(acb)) {
1425
printf("arcmsr%d: wait 'stop adapter background rebuild' timeout \n", acb->pci_unit);
1426
}
1427
}
1428
/*
1429
************************************************************************
1430
************************************************************************
1431
*/
1432
static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
1433
{
1434
switch (acb->adapter_type) {
1435
case ACB_ADAPTER_TYPE_A: {
1436
arcmsr_stop_hba_bgrb(acb);
1437
}
1438
break;
1439
case ACB_ADAPTER_TYPE_B: {
1440
arcmsr_stop_hbb_bgrb(acb);
1441
}
1442
break;
1443
case ACB_ADAPTER_TYPE_C: {
1444
arcmsr_stop_hbc_bgrb(acb);
1445
}
1446
break;
1447
case ACB_ADAPTER_TYPE_D: {
1448
arcmsr_stop_hbd_bgrb(acb);
1449
}
1450
break;
1451
case ACB_ADAPTER_TYPE_E:
1452
case ACB_ADAPTER_TYPE_F: {
1453
arcmsr_stop_hbe_bgrb(acb);
1454
}
1455
break;
1456
}
1457
}
1458
/*
1459
************************************************************************
1460
************************************************************************
1461
*/
1462
static void arcmsr_poll(struct cam_sim *psim)
1463
{
1464
struct AdapterControlBlock *acb;
1465
int mutex;
1466
1467
acb = (struct AdapterControlBlock *)cam_sim_softc(psim);
1468
mutex = mtx_owned(&acb->isr_lock);
1469
if( mutex == 0 )
1470
ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
1471
arcmsr_interrupt(acb);
1472
if( mutex == 0 )
1473
ARCMSR_LOCK_RELEASE(&acb->isr_lock);
1474
}
1475
/*
1476
**************************************************************************
1477
**************************************************************************
1478
*/
1479
static u_int32_t arcmsr_Read_iop_rqbuffer_data_D(struct AdapterControlBlock *acb,
1480
struct QBUFFER *prbuffer) {
1481
u_int8_t *pQbuffer;
1482
u_int8_t *buf1 = NULL;
1483
u_int32_t *iop_data, *buf2 = NULL;
1484
u_int32_t iop_len, data_len;
1485
1486
iop_data = (u_int32_t *)prbuffer->data;
1487
iop_len = (u_int32_t)prbuffer->data_len;
1488
if ( iop_len > 0 )
1489
{
1490
buf1 = malloc(128, M_DEVBUF, M_NOWAIT | M_ZERO);
1491
buf2 = (u_int32_t *)buf1;
1492
if( buf1 == NULL)
1493
return (0);
1494
data_len = iop_len;
1495
while(data_len >= 4)
1496
{
1497
*buf2++ = *iop_data++;
1498
data_len -= 4;
1499
}
1500
if(data_len)
1501
*buf2 = *iop_data;
1502
buf2 = (u_int32_t *)buf1;
1503
}
1504
while (iop_len > 0) {
1505
pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex];
1506
*pQbuffer = *buf1;
1507
acb->rqbuf_lastindex++;
1508
/* if last, index number set it to 0 */
1509
acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1510
buf1++;
1511
iop_len--;
1512
}
1513
if(buf2)
1514
free( (u_int8_t *)buf2, M_DEVBUF);
1515
/* let IOP know data has been read */
1516
arcmsr_iop_message_read(acb);
1517
return (1);
1518
}
1519
/*
1520
**************************************************************************
1521
**************************************************************************
1522
*/
1523
static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb,
1524
struct QBUFFER *prbuffer) {
1525
u_int8_t *pQbuffer;
1526
u_int8_t *iop_data;
1527
u_int32_t iop_len;
1528
1529
if(acb->adapter_type >= ACB_ADAPTER_TYPE_B) {
1530
return(arcmsr_Read_iop_rqbuffer_data_D(acb, prbuffer));
1531
}
1532
iop_data = (u_int8_t *)prbuffer->data;
1533
iop_len = (u_int32_t)prbuffer->data_len;
1534
while (iop_len > 0) {
1535
pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex];
1536
*pQbuffer = *iop_data;
1537
acb->rqbuf_lastindex++;
1538
/* if last, index number set it to 0 */
1539
acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1540
iop_data++;
1541
iop_len--;
1542
}
1543
/* let IOP know data has been read */
1544
arcmsr_iop_message_read(acb);
1545
return (1);
1546
}
1547
/*
1548
**************************************************************************
1549
**************************************************************************
1550
*/
1551
static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
1552
{
1553
struct QBUFFER *prbuffer;
1554
int my_empty_len;
1555
1556
/*check this iop data if overflow my rqbuffer*/
1557
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1558
prbuffer = arcmsr_get_iop_rqbuffer(acb);
1559
if (acb->rqbuf_lastindex >= acb->rqbuf_firstindex)
1560
my_empty_len = (ARCMSR_MAX_QBUFFER - 1) - (acb->rqbuf_lastindex - acb->rqbuf_firstindex);
1561
else
1562
my_empty_len = acb->rqbuf_firstindex - acb->rqbuf_lastindex - 1;
1563
if(my_empty_len >= prbuffer->data_len) {
1564
if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
1565
acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1566
} else {
1567
acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1568
}
1569
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1570
}
1571
/*
1572
**********************************************************************
1573
**********************************************************************
1574
*/
1575
static void arcmsr_Write_data_2iop_wqbuffer_D(struct AdapterControlBlock *acb)
1576
{
1577
u_int8_t *pQbuffer;
1578
struct QBUFFER *pwbuffer;
1579
u_int8_t *buf1 = NULL;
1580
u_int32_t *iop_data, *buf2 = NULL;
1581
u_int32_t allxfer_len = 0, data_len;
1582
1583
if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1584
buf1 = malloc(128, M_DEVBUF, M_NOWAIT | M_ZERO);
1585
buf2 = (u_int32_t *)buf1;
1586
if( buf1 == NULL)
1587
return;
1588
1589
acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1590
pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1591
iop_data = (u_int32_t *)pwbuffer->data;
1592
while((acb->wqbuf_firstindex != acb->wqbuf_lastindex)
1593
&& (allxfer_len < 124)) {
1594
pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1595
*buf1 = *pQbuffer;
1596
acb->wqbuf_firstindex++;
1597
acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1598
buf1++;
1599
allxfer_len++;
1600
}
1601
pwbuffer->data_len = allxfer_len;
1602
data_len = allxfer_len;
1603
buf1 = (u_int8_t *)buf2;
1604
while(data_len >= 4)
1605
{
1606
*iop_data++ = *buf2++;
1607
data_len -= 4;
1608
}
1609
if(data_len)
1610
*iop_data = *buf2;
1611
free( buf1, M_DEVBUF);
1612
arcmsr_iop_message_wrote(acb);
1613
}
1614
}
1615
/*
1616
**********************************************************************
1617
**********************************************************************
1618
*/
1619
static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb)
1620
{
1621
u_int8_t *pQbuffer;
1622
struct QBUFFER *pwbuffer;
1623
u_int8_t *iop_data;
1624
int32_t allxfer_len=0;
1625
1626
if(acb->adapter_type >= ACB_ADAPTER_TYPE_B) {
1627
arcmsr_Write_data_2iop_wqbuffer_D(acb);
1628
return;
1629
}
1630
if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1631
acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1632
pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1633
iop_data = (u_int8_t *)pwbuffer->data;
1634
while((acb->wqbuf_firstindex != acb->wqbuf_lastindex)
1635
&& (allxfer_len < 124)) {
1636
pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1637
*iop_data = *pQbuffer;
1638
acb->wqbuf_firstindex++;
1639
acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1640
iop_data++;
1641
allxfer_len++;
1642
}
1643
pwbuffer->data_len = allxfer_len;
1644
arcmsr_iop_message_wrote(acb);
1645
}
1646
}
1647
/*
1648
**************************************************************************
1649
**************************************************************************
1650
*/
1651
static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb)
1652
{
1653
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1654
acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READ;
1655
/*
1656
*****************************************************************
1657
** check if there are any mail packages from user space program
1658
** in my post bag, now is the time to send them into Areca's firmware
1659
*****************************************************************
1660
*/
1661
if(acb->wqbuf_firstindex != acb->wqbuf_lastindex) {
1662
arcmsr_Write_data_2iop_wqbuffer(acb);
1663
}
1664
if(acb->wqbuf_firstindex == acb->wqbuf_lastindex) {
1665
acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED;
1666
}
1667
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1668
}
1669
/*
1670
**************************************************************************
1671
**************************************************************************
1672
*/
1673
static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb)
1674
{
1675
/*
1676
if (ccb->ccb_h.status != CAM_REQ_CMP)
1677
printf("arcmsr_rescanLun_cb: Rescan Target=%x, lun=%x,"
1678
"failure status=%x\n", ccb->ccb_h.target_id,
1679
ccb->ccb_h.target_lun, ccb->ccb_h.status);
1680
else
1681
printf("arcmsr_rescanLun_cb: Rescan lun successfully!\n");
1682
*/
1683
xpt_free_path(ccb->ccb_h.path);
1684
xpt_free_ccb(ccb);
1685
}
1686
1687
static void arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
1688
{
1689
struct cam_path *path;
1690
union ccb *ccb;
1691
1692
if ((ccb = (union ccb *)xpt_alloc_ccb_nowait()) == NULL)
1693
return;
1694
if (xpt_create_path(&path, NULL, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
1695
{
1696
xpt_free_ccb(ccb);
1697
return;
1698
}
1699
/* printf("arcmsr_rescan_lun: Rescan Target=%x, Lun=%x\n", target, lun); */
1700
xpt_setup_ccb(&ccb->ccb_h, path, 5);
1701
ccb->ccb_h.func_code = XPT_SCAN_LUN;
1702
ccb->ccb_h.cbfcnp = arcmsr_rescanLun_cb;
1703
ccb->crcn.flags = CAM_FLAG_NONE;
1704
xpt_action(ccb);
1705
}
1706
1707
static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
1708
{
1709
struct CommandControlBlock *srb;
1710
u_int32_t intmask_org;
1711
int i;
1712
1713
/* disable all outbound interrupts */
1714
intmask_org = arcmsr_disable_allintr(acb);
1715
for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
1716
{
1717
srb = acb->psrb_pool[i];
1718
if (srb->srb_state == ARCMSR_SRB_START)
1719
{
1720
if((target == srb->pccb->ccb_h.target_id) && (lun == srb->pccb->ccb_h.target_lun))
1721
{
1722
srb->srb_state = ARCMSR_SRB_ABORTED;
1723
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
1724
arcmsr_srb_complete(srb, 1);
1725
printf("arcmsr%d: abort scsi id %d lun %d srb=%p \n", acb->pci_unit, target, lun, srb);
1726
}
1727
}
1728
}
1729
/* enable outbound Post Queue, outbound doorbell Interrupt */
1730
arcmsr_enable_allintr(acb, intmask_org);
1731
}
1732
/*
1733
**************************************************************************
1734
**************************************************************************
1735
*/
1736
static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
1737
u_int32_t devicemap;
1738
u_int32_t target, lun;
1739
u_int32_t deviceMapCurrent[4]={0};
1740
u_int8_t *pDevMap;
1741
1742
switch (acb->adapter_type) {
1743
case ACB_ADAPTER_TYPE_A:
1744
devicemap = offsetof(struct HBA_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1745
for (target = 0; target < 4; target++)
1746
{
1747
deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1748
devicemap += 4;
1749
}
1750
break;
1751
1752
case ACB_ADAPTER_TYPE_B:
1753
devicemap = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1754
for (target = 0; target < 4; target++)
1755
{
1756
deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1], devicemap);
1757
devicemap += 4;
1758
}
1759
break;
1760
1761
case ACB_ADAPTER_TYPE_C:
1762
devicemap = offsetof(struct HBC_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1763
for (target = 0; target < 4; target++)
1764
{
1765
deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1766
devicemap += 4;
1767
}
1768
break;
1769
case ACB_ADAPTER_TYPE_D:
1770
devicemap = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1771
for (target = 0; target < 4; target++)
1772
{
1773
deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1774
devicemap += 4;
1775
}
1776
break;
1777
case ACB_ADAPTER_TYPE_E:
1778
devicemap = offsetof(struct HBE_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1779
for (target = 0; target < 4; target++)
1780
{
1781
deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1782
devicemap += 4;
1783
}
1784
break;
1785
case ACB_ADAPTER_TYPE_F:
1786
devicemap = ARCMSR_FW_DEVMAP_OFFSET;
1787
for (target = 0; target < 4; target++)
1788
{
1789
deviceMapCurrent[target] = acb->msgcode_rwbuffer[devicemap];
1790
devicemap += 1;
1791
}
1792
break;
1793
}
1794
1795
if(acb->acb_flags & ACB_F_BUS_HANG_ON)
1796
{
1797
acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
1798
}
1799
/*
1800
** adapter posted CONFIG message
1801
** copy the new map, note if there are differences with the current map
1802
*/
1803
pDevMap = (u_int8_t *)&deviceMapCurrent[0];
1804
for (target = 0; target < ARCMSR_MAX_TARGETID - 1; target++)
1805
{
1806
if (*pDevMap != acb->device_map[target])
1807
{
1808
u_int8_t difference, bit_check;
1809
1810
difference = *pDevMap ^ acb->device_map[target];
1811
for(lun=0; lun < ARCMSR_MAX_TARGETLUN; lun++)
1812
{
1813
bit_check = (1 << lun); /*check bit from 0....31*/
1814
if(difference & bit_check)
1815
{
1816
if(acb->device_map[target] & bit_check)
1817
{/* unit departed */
1818
if (target != 0x0f)
1819
printf("arcmsr_dr_handle: Target=0x%x, lun=%x, GONE!!!\n",target,lun);
1820
arcmsr_abort_dr_ccbs(acb, target, lun);
1821
arcmsr_rescan_lun(acb, target, lun);
1822
acb->devstate[target][lun] = ARECA_RAID_GONE;
1823
}
1824
else
1825
{/* unit arrived */
1826
printf("arcmsr_dr_handle: Target=0x%x, lun=%x, Plug-IN!!!\n",target,lun);
1827
arcmsr_rescan_lun(acb, target, lun);
1828
acb->devstate[target][lun] = ARECA_RAID_GOOD;
1829
}
1830
}
1831
}
1832
/* printf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
1833
acb->device_map[target] = *pDevMap;
1834
}
1835
pDevMap++;
1836
}
1837
}
1838
/*
1839
**************************************************************************
1840
**************************************************************************
1841
*/
1842
static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
1843
u_int32_t outbound_message;
1844
1845
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);
1846
outbound_message = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[0]);
1847
if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1848
arcmsr_dr_handle( acb );
1849
}
1850
/*
1851
**************************************************************************
1852
**************************************************************************
1853
*/
1854
static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
1855
u_int32_t outbound_message;
1856
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1857
1858
/* clear interrupts */
1859
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);
1860
outbound_message = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0]);
1861
if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1862
arcmsr_dr_handle( acb );
1863
}
1864
/*
1865
**************************************************************************
1866
**************************************************************************
1867
*/
1868
static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
1869
u_int32_t outbound_message;
1870
1871
CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);
1872
outbound_message = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[0]);
1873
if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1874
arcmsr_dr_handle( acb );
1875
}
1876
/*
1877
**************************************************************************
1878
**************************************************************************
1879
*/
1880
static void arcmsr_hbd_message_isr(struct AdapterControlBlock *acb) {
1881
u_int32_t outbound_message;
1882
1883
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);
1884
outbound_message = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[0]);
1885
if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1886
arcmsr_dr_handle( acb );
1887
}
1888
/*
1889
**************************************************************************
1890
**************************************************************************
1891
*/
1892
static void arcmsr_hbe_message_isr(struct AdapterControlBlock *acb) {
1893
u_int32_t outbound_message;
1894
1895
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0);
1896
if (acb->adapter_type == ACB_ADAPTER_TYPE_E)
1897
outbound_message = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[0]);
1898
else
1899
outbound_message = acb->msgcode_rwbuffer[0];
1900
if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1901
arcmsr_dr_handle( acb );
1902
}
1903
/*
1904
**************************************************************************
1905
**************************************************************************
1906
*/
1907
static void arcmsr_hba_doorbell_isr(struct AdapterControlBlock *acb)
1908
{
1909
u_int32_t doorbell_status;
1910
1911
/*
1912
*******************************************************************
1913
** Maybe here we need to check wrqbuffer_lock is lock or not
1914
** DOORBELL: din! don!
1915
** check if there are any mail need to pack from firmware
1916
*******************************************************************
1917
*/
1918
doorbell_status = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_doorbell);
1919
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_doorbell, doorbell_status); /* clear doorbell interrupt */
1920
if(doorbell_status & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK) {
1921
arcmsr_iop2drv_data_wrote_handle(acb);
1922
}
1923
if(doorbell_status & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK) {
1924
arcmsr_iop2drv_data_read_handle(acb);
1925
}
1926
}
1927
/*
1928
**************************************************************************
1929
**************************************************************************
1930
*/
1931
static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
1932
{
1933
u_int32_t doorbell_status;
1934
1935
/*
1936
*******************************************************************
1937
** Maybe here we need to check wrqbuffer_lock is lock or not
1938
** DOORBELL: din! don!
1939
** check if there are any mail need to pack from firmware
1940
*******************************************************************
1941
*/
1942
doorbell_status = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
1943
CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, doorbell_status); /* clear doorbell interrupt */
1944
if(doorbell_status & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
1945
arcmsr_iop2drv_data_wrote_handle(acb);
1946
}
1947
if(doorbell_status & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK) {
1948
arcmsr_iop2drv_data_read_handle(acb);
1949
}
1950
if(doorbell_status & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
1951
arcmsr_hbc_message_isr(acb); /* messenger of "driver to iop commands" */
1952
}
1953
}
1954
/*
1955
**************************************************************************
1956
**************************************************************************
1957
*/
1958
static void arcmsr_hbd_doorbell_isr(struct AdapterControlBlock *acb)
1959
{
1960
u_int32_t doorbell_status;
1961
1962
/*
1963
*******************************************************************
1964
** Maybe here we need to check wrqbuffer_lock is lock or not
1965
** DOORBELL: din! don!
1966
** check if there are any mail need to pack from firmware
1967
*******************************************************************
1968
*/
1969
doorbell_status = CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_F0_DOORBELL_CAUSE;
1970
if(doorbell_status)
1971
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, doorbell_status); /* clear doorbell interrupt */
1972
while( doorbell_status & ARCMSR_HBDMU_F0_DOORBELL_CAUSE ) {
1973
if(doorbell_status & ARCMSR_HBDMU_IOP2DRV_DATA_WRITE_OK) {
1974
arcmsr_iop2drv_data_wrote_handle(acb);
1975
}
1976
if(doorbell_status & ARCMSR_HBDMU_IOP2DRV_DATA_READ_OK) {
1977
arcmsr_iop2drv_data_read_handle(acb);
1978
}
1979
if(doorbell_status & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE) {
1980
arcmsr_hbd_message_isr(acb); /* messenger of "driver to iop commands" */
1981
}
1982
doorbell_status = CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_F0_DOORBELL_CAUSE;
1983
if(doorbell_status)
1984
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, doorbell_status); /* clear doorbell interrupt */
1985
}
1986
}
1987
/*
1988
**************************************************************************
1989
**************************************************************************
1990
*/
1991
static void arcmsr_hbe_doorbell_isr(struct AdapterControlBlock *acb)
1992
{
1993
u_int32_t doorbell_status, in_doorbell;
1994
1995
/*
1996
*******************************************************************
1997
** Maybe here we need to check wrqbuffer_lock is lock or not
1998
** DOORBELL: din! don!
1999
** check if there are any mail need to pack from firmware
2000
*******************************************************************
2001
*/
2002
in_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
2003
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0); /* clear doorbell interrupt */
2004
doorbell_status = in_doorbell ^ acb->in_doorbell;
2005
if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK) {
2006
arcmsr_iop2drv_data_wrote_handle(acb);
2007
}
2008
if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK) {
2009
arcmsr_iop2drv_data_read_handle(acb);
2010
}
2011
if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
2012
arcmsr_hbe_message_isr(acb); /* messenger of "driver to iop commands" */
2013
}
2014
acb->in_doorbell = in_doorbell;
2015
}
2016
/*
2017
**************************************************************************
2018
**************************************************************************
2019
*/
2020
static void arcmsr_hbf_doorbell_isr(struct AdapterControlBlock *acb)
2021
{
2022
u_int32_t doorbell_status, in_doorbell;
2023
2024
/*
2025
*******************************************************************
2026
** Maybe here we need to check wrqbuffer_lock is lock or not
2027
** DOORBELL: din! don!
2028
** check if there are any mail need to pack from firmware
2029
*******************************************************************
2030
*/
2031
while(1) {
2032
in_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
2033
if ((in_doorbell != 0) && (in_doorbell != 0xFFFFFFFF))
2034
break;
2035
}
2036
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0); /* clear doorbell interrupt */
2037
doorbell_status = in_doorbell ^ acb->in_doorbell;
2038
if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK) {
2039
arcmsr_iop2drv_data_wrote_handle(acb);
2040
}
2041
if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK) {
2042
arcmsr_iop2drv_data_read_handle(acb);
2043
}
2044
if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
2045
arcmsr_hbe_message_isr(acb); /* messenger of "driver to iop commands" */
2046
}
2047
acb->in_doorbell = in_doorbell;
2048
}
2049
/*
2050
**************************************************************************
2051
**************************************************************************
2052
*/
2053
static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
2054
{
2055
u_int32_t flag_srb;
2056
u_int16_t error;
2057
2058
/*
2059
*****************************************************************************
2060
** areca cdb command done
2061
*****************************************************************************
2062
*/
2063
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2064
BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2065
while((flag_srb = CHIP_REG_READ32(HBA_MessageUnit,
2066
0, outbound_queueport)) != 0xFFFFFFFF) {
2067
/* check if command done with no error*/
2068
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0) ? TRUE : FALSE;
2069
arcmsr_drain_donequeue(acb, flag_srb, error);
2070
} /*drain reply FIFO*/
2071
}
2072
/*
2073
**************************************************************************
2074
**************************************************************************
2075
*/
2076
static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb)
2077
{
2078
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
2079
u_int32_t flag_srb;
2080
int index;
2081
u_int16_t error;
2082
2083
/*
2084
*****************************************************************************
2085
** areca cdb command done
2086
*****************************************************************************
2087
*/
2088
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2089
BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2090
index = phbbmu->doneq_index;
2091
while((flag_srb = phbbmu->done_qbuffer[index]) != 0) {
2092
phbbmu->done_qbuffer[index] = 0;
2093
index++;
2094
index %= ARCMSR_MAX_HBB_POSTQUEUE; /*if last index number set it to 0 */
2095
phbbmu->doneq_index = index;
2096
/* check if command done with no error*/
2097
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
2098
arcmsr_drain_donequeue(acb, flag_srb, error);
2099
} /*drain reply FIFO*/
2100
}
2101
/*
2102
**************************************************************************
2103
**************************************************************************
2104
*/
2105
static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
2106
{
2107
u_int32_t flag_srb,throttling = 0;
2108
u_int16_t error;
2109
2110
/*
2111
*****************************************************************************
2112
** areca cdb command done
2113
*****************************************************************************
2114
*/
2115
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2116
do {
2117
flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
2118
if (flag_srb == 0xFFFFFFFF)
2119
break;
2120
/* check if command done with no error*/
2121
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
2122
arcmsr_drain_donequeue(acb, flag_srb, error);
2123
throttling++;
2124
if(throttling == ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
2125
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
2126
throttling = 0;
2127
}
2128
} while(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR);
2129
}
2130
/*
2131
**********************************************************************
2132
**
2133
**********************************************************************
2134
*/
2135
static uint16_t arcmsr_get_doneq_index(struct HBD_MessageUnit0 *phbdmu)
2136
{
2137
uint16_t doneq_index, index_stripped;
2138
2139
doneq_index = phbdmu->doneq_index;
2140
if (doneq_index & 0x4000) {
2141
index_stripped = doneq_index & 0xFF;
2142
index_stripped += 1;
2143
index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
2144
phbdmu->doneq_index = index_stripped ?
2145
(index_stripped | 0x4000) : index_stripped;
2146
} else {
2147
index_stripped = doneq_index;
2148
index_stripped += 1;
2149
index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
2150
phbdmu->doneq_index = index_stripped ?
2151
index_stripped : (index_stripped | 0x4000);
2152
}
2153
return (phbdmu->doneq_index);
2154
}
2155
/*
2156
**************************************************************************
2157
**************************************************************************
2158
*/
2159
static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb)
2160
{
2161
struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
2162
u_int32_t outbound_write_pointer;
2163
u_int32_t addressLow;
2164
uint16_t doneq_index;
2165
u_int16_t error;
2166
/*
2167
*****************************************************************************
2168
** areca cdb command done
2169
*****************************************************************************
2170
*/
2171
if((CHIP_REG_READ32(HBD_MessageUnit, 0, outboundlist_interrupt_cause) &
2172
ARCMSR_HBDMU_OUTBOUND_LIST_INTERRUPT) == 0)
2173
return;
2174
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2175
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2176
outbound_write_pointer = phbdmu->done_qbuffer[0].addressLow;
2177
doneq_index = phbdmu->doneq_index;
2178
while ((doneq_index & 0xFF) != (outbound_write_pointer & 0xFF)) {
2179
doneq_index = arcmsr_get_doneq_index(phbdmu);
2180
addressLow = phbdmu->done_qbuffer[(doneq_index & 0xFF)+1].addressLow;
2181
error = (addressLow & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
2182
arcmsr_drain_donequeue(acb, addressLow, error); /*Check if command done with no error */
2183
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outboundlist_read_pointer, doneq_index);
2184
outbound_write_pointer = phbdmu->done_qbuffer[0].addressLow;
2185
}
2186
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outboundlist_interrupt_cause, ARCMSR_HBDMU_OUTBOUND_LIST_INTERRUPT_CLEAR);
2187
CHIP_REG_READ32(HBD_MessageUnit, 0, outboundlist_interrupt_cause); /*Dummy ioread32 to force pci flush */
2188
}
2189
/*
2190
**************************************************************************
2191
**************************************************************************
2192
*/
2193
static void arcmsr_hbe_postqueue_isr(struct AdapterControlBlock *acb)
2194
{
2195
u_int16_t error;
2196
uint32_t doneq_index;
2197
uint16_t cmdSMID;
2198
2199
/*
2200
*****************************************************************************
2201
** areca cdb command done
2202
*****************************************************************************
2203
*/
2204
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2205
doneq_index = acb->doneq_index;
2206
while ((CHIP_REG_READ32(HBE_MessageUnit, 0, reply_post_producer_index) & 0xFFFF) != doneq_index) {
2207
cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
2208
error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
2209
arcmsr_drain_donequeue(acb, (u_int32_t)cmdSMID, error);
2210
doneq_index++;
2211
if (doneq_index >= acb->completionQ_entry)
2212
doneq_index = 0;
2213
}
2214
acb->doneq_index = doneq_index;
2215
CHIP_REG_WRITE32(HBE_MessageUnit, 0, reply_post_consumer_index, doneq_index);
2216
}
2217
2218
static void arcmsr_hbf_postqueue_isr(struct AdapterControlBlock *acb)
2219
{
2220
uint16_t error;
2221
uint32_t doneq_index;
2222
uint16_t cmdSMID;
2223
2224
/*
2225
*****************************************************************************
2226
** areca cdb command done
2227
*****************************************************************************
2228
*/
2229
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2230
doneq_index = acb->doneq_index;
2231
while (1) {
2232
cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
2233
if (cmdSMID == 0xffff)
2234
break;
2235
error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
2236
arcmsr_drain_donequeue(acb, (u_int32_t)cmdSMID, error);
2237
acb->pCompletionQ[doneq_index].cmdSMID = 0xffff;
2238
doneq_index++;
2239
if (doneq_index >= acb->completionQ_entry)
2240
doneq_index = 0;
2241
}
2242
acb->doneq_index = doneq_index;
2243
CHIP_REG_WRITE32(HBF_MessageUnit, 0, reply_post_consumer_index, doneq_index);
2244
}
2245
2246
/*
2247
**********************************************************************
2248
**********************************************************************
2249
*/
2250
static void arcmsr_handle_hba_isr( struct AdapterControlBlock *acb)
2251
{
2252
u_int32_t outbound_intStatus;
2253
/*
2254
*********************************************
2255
** check outbound intstatus
2256
*********************************************
2257
*/
2258
outbound_intStatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
2259
if(!outbound_intStatus) {
2260
/*it must be share irq*/
2261
return;
2262
}
2263
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intStatus); /*clear interrupt*/
2264
/* MU doorbell interrupts*/
2265
if(outbound_intStatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) {
2266
arcmsr_hba_doorbell_isr(acb);
2267
}
2268
/* MU post queue interrupts*/
2269
if(outbound_intStatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
2270
arcmsr_hba_postqueue_isr(acb);
2271
}
2272
if(outbound_intStatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
2273
arcmsr_hba_message_isr(acb);
2274
}
2275
}
2276
/*
2277
**********************************************************************
2278
**********************************************************************
2279
*/
2280
static void arcmsr_handle_hbb_isr( struct AdapterControlBlock *acb)
2281
{
2282
u_int32_t outbound_doorbell;
2283
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
2284
/*
2285
*********************************************
2286
** check outbound intstatus
2287
*********************************************
2288
*/
2289
outbound_doorbell = READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & acb->outbound_int_enable;
2290
if(!outbound_doorbell) {
2291
/*it must be share irq*/
2292
return;
2293
}
2294
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ~outbound_doorbell); /* clear doorbell interrupt */
2295
READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell);
2296
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
2297
/* MU ioctl transfer doorbell interrupts*/
2298
if(outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK) {
2299
arcmsr_iop2drv_data_wrote_handle(acb);
2300
}
2301
if(outbound_doorbell & ARCMSR_IOP2DRV_DATA_READ_OK) {
2302
arcmsr_iop2drv_data_read_handle(acb);
2303
}
2304
/* MU post queue interrupts*/
2305
if(outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
2306
arcmsr_hbb_postqueue_isr(acb);
2307
}
2308
if(outbound_doorbell & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
2309
arcmsr_hbb_message_isr(acb);
2310
}
2311
}
2312
/*
2313
**********************************************************************
2314
**********************************************************************
2315
*/
2316
static void arcmsr_handle_hbc_isr( struct AdapterControlBlock *acb)
2317
{
2318
u_int32_t host_interrupt_status;
2319
/*
2320
*********************************************
2321
** check outbound intstatus
2322
*********************************************
2323
*/
2324
host_interrupt_status = CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) &
2325
(ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR |
2326
ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR);
2327
if(!host_interrupt_status) {
2328
/*it must be share irq*/
2329
return;
2330
}
2331
do {
2332
/* MU doorbell interrupts*/
2333
if(host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR) {
2334
arcmsr_hbc_doorbell_isr(acb);
2335
}
2336
/* MU post queue interrupts*/
2337
if(host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
2338
arcmsr_hbc_postqueue_isr(acb);
2339
}
2340
host_interrupt_status = CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status);
2341
} while (host_interrupt_status & (ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR | ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR));
2342
}
2343
/*
2344
**********************************************************************
2345
**********************************************************************
2346
*/
2347
static void arcmsr_handle_hbd_isr( struct AdapterControlBlock *acb)
2348
{
2349
u_int32_t host_interrupt_status;
2350
u_int32_t intmask_org;
2351
/*
2352
*********************************************
2353
** check outbound intstatus
2354
*********************************************
2355
*/
2356
host_interrupt_status = CHIP_REG_READ32(HBD_MessageUnit, 0, host_int_status) & acb->outbound_int_enable;
2357
if(!(host_interrupt_status & ARCMSR_HBDMU_OUTBOUND_INT)) {
2358
/*it must be share irq*/
2359
return;
2360
}
2361
/* disable outbound interrupt */
2362
intmask_org = CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable) ; /* disable outbound message0 int */
2363
CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, ARCMSR_HBDMU_ALL_INT_DISABLE);
2364
/* MU doorbell interrupts*/
2365
if(host_interrupt_status & ARCMSR_HBDMU_OUTBOUND_DOORBELL_INT) {
2366
arcmsr_hbd_doorbell_isr(acb);
2367
}
2368
/* MU post queue interrupts*/
2369
if(host_interrupt_status & ARCMSR_HBDMU_OUTBOUND_POSTQUEUE_INT) {
2370
arcmsr_hbd_postqueue_isr(acb);
2371
}
2372
/* enable all outbound interrupt */
2373
CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, intmask_org | ARCMSR_HBDMU_ALL_INT_ENABLE);
2374
// CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable);
2375
}
2376
/*
2377
**********************************************************************
2378
**********************************************************************
2379
*/
2380
static void arcmsr_handle_hbe_isr( struct AdapterControlBlock *acb)
2381
{
2382
u_int32_t host_interrupt_status;
2383
/*
2384
*********************************************
2385
** check outbound intstatus
2386
*********************************************
2387
*/
2388
host_interrupt_status = CHIP_REG_READ32(HBE_MessageUnit, 0, host_int_status) &
2389
(ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
2390
ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR);
2391
if(!host_interrupt_status) {
2392
/*it must be share irq*/
2393
return;
2394
}
2395
do {
2396
/* MU doorbell interrupts*/
2397
if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR) {
2398
arcmsr_hbe_doorbell_isr(acb);
2399
}
2400
/* MU post queue interrupts*/
2401
if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR) {
2402
arcmsr_hbe_postqueue_isr(acb);
2403
}
2404
host_interrupt_status = CHIP_REG_READ32(HBE_MessageUnit, 0, host_int_status);
2405
} while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR | ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR));
2406
}
2407
2408
static void arcmsr_handle_hbf_isr( struct AdapterControlBlock *acb)
2409
{
2410
u_int32_t host_interrupt_status;
2411
/*
2412
*********************************************
2413
** check outbound intstatus
2414
*********************************************
2415
*/
2416
host_interrupt_status = CHIP_REG_READ32(HBF_MessageUnit, 0, host_int_status) &
2417
(ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
2418
ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR);
2419
if(!host_interrupt_status) {
2420
/*it must be share irq*/
2421
return;
2422
}
2423
do {
2424
/* MU doorbell interrupts*/
2425
if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR) {
2426
arcmsr_hbf_doorbell_isr(acb);
2427
}
2428
/* MU post queue interrupts*/
2429
if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR) {
2430
arcmsr_hbf_postqueue_isr(acb);
2431
}
2432
host_interrupt_status = CHIP_REG_READ32(HBF_MessageUnit, 0, host_int_status);
2433
} while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR | ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR));
2434
}
2435
/*
2436
******************************************************************************
2437
******************************************************************************
2438
*/
2439
static void arcmsr_interrupt(struct AdapterControlBlock *acb)
2440
{
2441
switch (acb->adapter_type) {
2442
case ACB_ADAPTER_TYPE_A:
2443
arcmsr_handle_hba_isr(acb);
2444
break;
2445
case ACB_ADAPTER_TYPE_B:
2446
arcmsr_handle_hbb_isr(acb);
2447
break;
2448
case ACB_ADAPTER_TYPE_C:
2449
arcmsr_handle_hbc_isr(acb);
2450
break;
2451
case ACB_ADAPTER_TYPE_D:
2452
arcmsr_handle_hbd_isr(acb);
2453
break;
2454
case ACB_ADAPTER_TYPE_E:
2455
arcmsr_handle_hbe_isr(acb);
2456
break;
2457
case ACB_ADAPTER_TYPE_F:
2458
arcmsr_handle_hbf_isr(acb);
2459
break;
2460
default:
2461
printf("arcmsr%d: interrupt service,"
2462
" unknown adapter type =%d\n", acb->pci_unit, acb->adapter_type);
2463
break;
2464
}
2465
}
2466
/*
2467
**********************************************************************
2468
**********************************************************************
2469
*/
2470
static void arcmsr_intr_handler(void *arg)
2471
{
2472
struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
2473
2474
ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
2475
arcmsr_interrupt(acb);
2476
ARCMSR_LOCK_RELEASE(&acb->isr_lock);
2477
}
2478
/*
2479
******************************************************************************
2480
******************************************************************************
2481
*/
2482
static void arcmsr_polling_devmap(void *arg)
2483
{
2484
struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
2485
switch (acb->adapter_type) {
2486
case ACB_ADAPTER_TYPE_A:
2487
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2488
break;
2489
2490
case ACB_ADAPTER_TYPE_B: {
2491
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
2492
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_GET_CONFIG);
2493
}
2494
break;
2495
2496
case ACB_ADAPTER_TYPE_C:
2497
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2498
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
2499
break;
2500
2501
case ACB_ADAPTER_TYPE_D:
2502
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2503
break;
2504
2505
case ACB_ADAPTER_TYPE_E:
2506
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2507
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
2508
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
2509
break;
2510
2511
case ACB_ADAPTER_TYPE_F: {
2512
u_int32_t outMsg1 = CHIP_REG_READ32(HBF_MessageUnit, 0, outbound_msgaddr1);
2513
if (!(outMsg1 & ARCMSR_HBFMU_MESSAGE_FIRMWARE_OK) ||
2514
(outMsg1 & ARCMSR_HBFMU_MESSAGE_NO_VOLUME_CHANGE))
2515
goto nxt6s;
2516
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2517
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
2518
CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
2519
break;
2520
}
2521
}
2522
nxt6s:
2523
if((acb->acb_flags & ACB_F_SCSISTOPADAPTER) == 0)
2524
{
2525
callout_reset(&acb->devmap_callout, 5 * hz, arcmsr_polling_devmap, acb); /* polling per 5 seconds */
2526
}
2527
}
2528
2529
/*
2530
*******************************************************************************
2531
**
2532
*******************************************************************************
2533
*/
2534
static void arcmsr_iop_parking(struct AdapterControlBlock *acb)
2535
{
2536
u_int32_t intmask_org;
2537
2538
if(acb != NULL) {
2539
/* stop adapter background rebuild */
2540
if(acb->acb_flags & ACB_F_MSG_START_BGRB) {
2541
intmask_org = arcmsr_disable_allintr(acb);
2542
arcmsr_stop_adapter_bgrb(acb);
2543
arcmsr_flush_adapter_cache(acb);
2544
arcmsr_enable_allintr(acb, intmask_org);
2545
}
2546
}
2547
}
2548
/*
2549
***********************************************************************
2550
**
2551
************************************************************************
2552
*/
2553
static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg)
2554
{
2555
struct CMD_MESSAGE_FIELD *pcmdmessagefld;
2556
u_int32_t retvalue = EINVAL;
2557
2558
pcmdmessagefld = (struct CMD_MESSAGE_FIELD *) arg;
2559
if(memcmp(pcmdmessagefld->cmdmessage.Signature, "ARCMSR", 6)!=0) {
2560
return retvalue;
2561
}
2562
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2563
switch(ioctl_cmd) {
2564
case ARCMSR_MESSAGE_READ_RQBUFFER: {
2565
u_int8_t *pQbuffer;
2566
u_int8_t *ptmpQbuffer = pcmdmessagefld->messagedatabuffer;
2567
u_int32_t allxfer_len=0;
2568
2569
while((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
2570
&& (allxfer_len < 1031)) {
2571
/*copy READ QBUFFER to srb*/
2572
pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
2573
*ptmpQbuffer = *pQbuffer;
2574
acb->rqbuf_firstindex++;
2575
acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2576
/*if last index number set it to 0 */
2577
ptmpQbuffer++;
2578
allxfer_len++;
2579
}
2580
if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2581
struct QBUFFER *prbuffer;
2582
2583
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2584
prbuffer = arcmsr_get_iop_rqbuffer(acb);
2585
if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
2586
acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
2587
}
2588
pcmdmessagefld->cmdmessage.Length = allxfer_len;
2589
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2590
retvalue = ARCMSR_MESSAGE_SUCCESS;
2591
}
2592
break;
2593
case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
2594
u_int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
2595
u_int8_t *pQbuffer;
2596
u_int8_t *ptmpuserbuffer = pcmdmessagefld->messagedatabuffer;
2597
2598
user_len = pcmdmessagefld->cmdmessage.Length;
2599
/*check if data xfer length of this request will overflow my array qbuffer */
2600
wqbuf_lastindex = acb->wqbuf_lastindex;
2601
wqbuf_firstindex = acb->wqbuf_firstindex;
2602
if(wqbuf_lastindex != wqbuf_firstindex) {
2603
arcmsr_Write_data_2iop_wqbuffer(acb);
2604
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_ERROR;
2605
} else {
2606
my_empty_len = (wqbuf_firstindex - wqbuf_lastindex - 1) &
2607
(ARCMSR_MAX_QBUFFER - 1);
2608
if(my_empty_len >= user_len) {
2609
while(user_len > 0) {
2610
/*copy srb data to wqbuffer*/
2611
pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2612
*pQbuffer = *ptmpuserbuffer;
2613
acb->wqbuf_lastindex++;
2614
acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2615
/*if last index number set it to 0 */
2616
ptmpuserbuffer++;
2617
user_len--;
2618
}
2619
/*post fist Qbuffer*/
2620
if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2621
acb->acb_flags &= ~ACB_F_MESSAGE_WQBUFFER_CLEARED;
2622
arcmsr_Write_data_2iop_wqbuffer(acb);
2623
}
2624
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2625
} else {
2626
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_ERROR;
2627
}
2628
}
2629
retvalue = ARCMSR_MESSAGE_SUCCESS;
2630
}
2631
break;
2632
case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
2633
u_int8_t *pQbuffer = acb->rqbuffer;
2634
2635
if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2636
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2637
arcmsr_iop_message_read(acb);
2638
/*signature, let IOP know data has been readed */
2639
}
2640
acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2641
acb->rqbuf_firstindex = 0;
2642
acb->rqbuf_lastindex = 0;
2643
memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2644
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2645
retvalue = ARCMSR_MESSAGE_SUCCESS;
2646
}
2647
break;
2648
case ARCMSR_MESSAGE_CLEAR_WQBUFFER:
2649
{
2650
u_int8_t *pQbuffer = acb->wqbuffer;
2651
2652
if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2653
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2654
arcmsr_iop_message_read(acb);
2655
/*signature, let IOP know data has been readed */
2656
}
2657
acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
2658
acb->wqbuf_firstindex = 0;
2659
acb->wqbuf_lastindex = 0;
2660
memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2661
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2662
retvalue = ARCMSR_MESSAGE_SUCCESS;
2663
}
2664
break;
2665
case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
2666
u_int8_t *pQbuffer;
2667
2668
if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2669
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2670
arcmsr_iop_message_read(acb);
2671
/*signature, let IOP know data has been readed */
2672
}
2673
acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED
2674
|ACB_F_MESSAGE_RQBUFFER_CLEARED
2675
|ACB_F_MESSAGE_WQBUFFER_READ);
2676
acb->rqbuf_firstindex = 0;
2677
acb->rqbuf_lastindex = 0;
2678
acb->wqbuf_firstindex = 0;
2679
acb->wqbuf_lastindex = 0;
2680
pQbuffer = acb->rqbuffer;
2681
memset(pQbuffer, 0, sizeof(struct QBUFFER));
2682
pQbuffer = acb->wqbuffer;
2683
memset(pQbuffer, 0, sizeof(struct QBUFFER));
2684
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2685
retvalue = ARCMSR_MESSAGE_SUCCESS;
2686
}
2687
break;
2688
case ARCMSR_MESSAGE_REQUEST_RETURNCODE_3F: {
2689
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_3F;
2690
retvalue = ARCMSR_MESSAGE_SUCCESS;
2691
}
2692
break;
2693
case ARCMSR_MESSAGE_SAY_HELLO: {
2694
u_int8_t *hello_string = "Hello! I am ARCMSR";
2695
u_int8_t *puserbuffer = (u_int8_t *)pcmdmessagefld->messagedatabuffer;
2696
2697
if(memcpy(puserbuffer, hello_string, (int16_t)strlen(hello_string))) {
2698
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_ERROR;
2699
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2700
return ENOIOCTL;
2701
}
2702
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2703
retvalue = ARCMSR_MESSAGE_SUCCESS;
2704
}
2705
break;
2706
case ARCMSR_MESSAGE_SAY_GOODBYE: {
2707
arcmsr_iop_parking(acb);
2708
retvalue = ARCMSR_MESSAGE_SUCCESS;
2709
}
2710
break;
2711
case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE: {
2712
arcmsr_flush_adapter_cache(acb);
2713
retvalue = ARCMSR_MESSAGE_SUCCESS;
2714
}
2715
break;
2716
}
2717
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2718
return (retvalue);
2719
}
2720
/*
2721
**************************************************************************
2722
**************************************************************************
2723
*/
2724
static void arcmsr_free_srb(struct CommandControlBlock *srb)
2725
{
2726
struct AdapterControlBlock *acb;
2727
2728
acb = srb->acb;
2729
ARCMSR_LOCK_ACQUIRE(&acb->srb_lock);
2730
srb->srb_state = ARCMSR_SRB_DONE;
2731
srb->srb_flags = 0;
2732
acb->srbworkingQ[acb->workingsrb_doneindex] = srb;
2733
acb->workingsrb_doneindex++;
2734
acb->workingsrb_doneindex %= ARCMSR_MAX_FREESRB_NUM;
2735
ARCMSR_LOCK_RELEASE(&acb->srb_lock);
2736
}
2737
/*
2738
**************************************************************************
2739
**************************************************************************
2740
*/
2741
static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb)
2742
{
2743
struct CommandControlBlock *srb = NULL;
2744
u_int32_t workingsrb_startindex, workingsrb_doneindex;
2745
2746
ARCMSR_LOCK_ACQUIRE(&acb->srb_lock);
2747
workingsrb_doneindex = acb->workingsrb_doneindex;
2748
workingsrb_startindex = acb->workingsrb_startindex;
2749
srb = acb->srbworkingQ[workingsrb_startindex];
2750
workingsrb_startindex++;
2751
workingsrb_startindex %= ARCMSR_MAX_FREESRB_NUM;
2752
if(workingsrb_doneindex != workingsrb_startindex) {
2753
acb->workingsrb_startindex = workingsrb_startindex;
2754
} else {
2755
srb = NULL;
2756
}
2757
ARCMSR_LOCK_RELEASE(&acb->srb_lock);
2758
return(srb);
2759
}
2760
/*
2761
**************************************************************************
2762
**************************************************************************
2763
*/
2764
static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb)
2765
{
2766
struct CMD_MESSAGE_FIELD *pcmdmessagefld;
2767
int retvalue = 0, transfer_len = 0;
2768
char *buffer;
2769
uint8_t *ptr = scsiio_cdb_ptr(&pccb->csio);
2770
u_int32_t controlcode = (u_int32_t ) ptr[5] << 24 |
2771
(u_int32_t ) ptr[6] << 16 |
2772
(u_int32_t ) ptr[7] << 8 |
2773
(u_int32_t ) ptr[8];
2774
/* 4 bytes: Areca io control code */
2775
if ((pccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) {
2776
buffer = pccb->csio.data_ptr;
2777
transfer_len = pccb->csio.dxfer_len;
2778
} else {
2779
retvalue = ARCMSR_MESSAGE_FAIL;
2780
goto message_out;
2781
}
2782
if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) {
2783
retvalue = ARCMSR_MESSAGE_FAIL;
2784
goto message_out;
2785
}
2786
pcmdmessagefld = (struct CMD_MESSAGE_FIELD *) buffer;
2787
switch(controlcode) {
2788
case ARCMSR_MESSAGE_READ_RQBUFFER: {
2789
u_int8_t *pQbuffer;
2790
u_int8_t *ptmpQbuffer = pcmdmessagefld->messagedatabuffer;
2791
int32_t allxfer_len = 0;
2792
2793
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2794
while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
2795
&& (allxfer_len < 1031)) {
2796
pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
2797
*ptmpQbuffer = *pQbuffer;
2798
acb->rqbuf_firstindex++;
2799
acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2800
ptmpQbuffer++;
2801
allxfer_len++;
2802
}
2803
if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2804
struct QBUFFER *prbuffer;
2805
2806
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2807
prbuffer = arcmsr_get_iop_rqbuffer(acb);
2808
if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
2809
acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
2810
}
2811
pcmdmessagefld->cmdmessage.Length = allxfer_len;
2812
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2813
retvalue = ARCMSR_MESSAGE_SUCCESS;
2814
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2815
}
2816
break;
2817
case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
2818
int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
2819
u_int8_t *pQbuffer;
2820
u_int8_t *ptmpuserbuffer = pcmdmessagefld->messagedatabuffer;
2821
2822
user_len = pcmdmessagefld->cmdmessage.Length;
2823
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2824
wqbuf_lastindex = acb->wqbuf_lastindex;
2825
wqbuf_firstindex = acb->wqbuf_firstindex;
2826
if (wqbuf_lastindex != wqbuf_firstindex) {
2827
arcmsr_Write_data_2iop_wqbuffer(acb);
2828
/* has error report sensedata */
2829
if(pccb->csio.sense_len) {
2830
((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70);
2831
/* Valid,ErrorCode */
2832
((u_int8_t *)&pccb->csio.sense_data)[2] = 0x05;
2833
/* FileMark,EndOfMedia,IncorrectLength,Reserved,SenseKey */
2834
((u_int8_t *)&pccb->csio.sense_data)[7] = 0x0A;
2835
/* AdditionalSenseLength */
2836
((u_int8_t *)&pccb->csio.sense_data)[12] = 0x20;
2837
/* AdditionalSenseCode */
2838
}
2839
retvalue = ARCMSR_MESSAGE_FAIL;
2840
} else {
2841
my_empty_len = (wqbuf_firstindex-wqbuf_lastindex - 1)
2842
&(ARCMSR_MAX_QBUFFER - 1);
2843
if (my_empty_len >= user_len) {
2844
while (user_len > 0) {
2845
pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2846
*pQbuffer = *ptmpuserbuffer;
2847
acb->wqbuf_lastindex++;
2848
acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2849
ptmpuserbuffer++;
2850
user_len--;
2851
}
2852
if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2853
acb->acb_flags &=
2854
~ACB_F_MESSAGE_WQBUFFER_CLEARED;
2855
arcmsr_Write_data_2iop_wqbuffer(acb);
2856
}
2857
} else {
2858
/* has error report sensedata */
2859
if(pccb->csio.sense_len) {
2860
((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70);
2861
/* Valid,ErrorCode */
2862
((u_int8_t *)&pccb->csio.sense_data)[2] = 0x05;
2863
/* FileMark,EndOfMedia,IncorrectLength,Reserved,SenseKey */
2864
((u_int8_t *)&pccb->csio.sense_data)[7] = 0x0A;
2865
/* AdditionalSenseLength */
2866
((u_int8_t *)&pccb->csio.sense_data)[12] = 0x20;
2867
/* AdditionalSenseCode */
2868
}
2869
retvalue = ARCMSR_MESSAGE_FAIL;
2870
}
2871
}
2872
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2873
}
2874
break;
2875
case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
2876
u_int8_t *pQbuffer = acb->rqbuffer;
2877
2878
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2879
if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2880
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2881
arcmsr_iop_message_read(acb);
2882
}
2883
acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2884
acb->rqbuf_firstindex = 0;
2885
acb->rqbuf_lastindex = 0;
2886
memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2887
pcmdmessagefld->cmdmessage.ReturnCode =
2888
ARCMSR_MESSAGE_RETURNCODE_OK;
2889
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2890
}
2891
break;
2892
case ARCMSR_MESSAGE_CLEAR_WQBUFFER: {
2893
u_int8_t *pQbuffer = acb->wqbuffer;
2894
2895
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2896
if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2897
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2898
arcmsr_iop_message_read(acb);
2899
}
2900
acb->acb_flags |=
2901
(ACB_F_MESSAGE_WQBUFFER_CLEARED |
2902
ACB_F_MESSAGE_WQBUFFER_READ);
2903
acb->wqbuf_firstindex = 0;
2904
acb->wqbuf_lastindex = 0;
2905
memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2906
pcmdmessagefld->cmdmessage.ReturnCode =
2907
ARCMSR_MESSAGE_RETURNCODE_OK;
2908
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2909
}
2910
break;
2911
case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
2912
u_int8_t *pQbuffer;
2913
2914
ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2915
if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2916
acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2917
arcmsr_iop_message_read(acb);
2918
}
2919
acb->acb_flags |=
2920
(ACB_F_MESSAGE_WQBUFFER_CLEARED
2921
| ACB_F_MESSAGE_RQBUFFER_CLEARED
2922
| ACB_F_MESSAGE_WQBUFFER_READ);
2923
acb->rqbuf_firstindex = 0;
2924
acb->rqbuf_lastindex = 0;
2925
acb->wqbuf_firstindex = 0;
2926
acb->wqbuf_lastindex = 0;
2927
pQbuffer = acb->rqbuffer;
2928
memset(pQbuffer, 0, sizeof (struct QBUFFER));
2929
pQbuffer = acb->wqbuffer;
2930
memset(pQbuffer, 0, sizeof (struct QBUFFER));
2931
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2932
ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2933
}
2934
break;
2935
case ARCMSR_MESSAGE_REQUEST_RETURNCODE_3F: {
2936
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_3F;
2937
}
2938
break;
2939
case ARCMSR_MESSAGE_SAY_HELLO: {
2940
int8_t *hello_string = "Hello! I am ARCMSR";
2941
2942
memcpy(pcmdmessagefld->messagedatabuffer, hello_string
2943
, (int16_t)strlen(hello_string));
2944
pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2945
}
2946
break;
2947
case ARCMSR_MESSAGE_SAY_GOODBYE:
2948
arcmsr_iop_parking(acb);
2949
break;
2950
case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE:
2951
arcmsr_flush_adapter_cache(acb);
2952
break;
2953
default:
2954
retvalue = ARCMSR_MESSAGE_FAIL;
2955
}
2956
message_out:
2957
return (retvalue);
2958
}
2959
/*
2960
*********************************************************************
2961
*********************************************************************
2962
*/
2963
static void arcmsr_execute_srb(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
2964
{
2965
struct CommandControlBlock *srb = (struct CommandControlBlock *)arg;
2966
struct AdapterControlBlock *acb = (struct AdapterControlBlock *)srb->acb;
2967
union ccb *pccb;
2968
int target, lun;
2969
2970
pccb = srb->pccb;
2971
target = pccb->ccb_h.target_id;
2972
lun = pccb->ccb_h.target_lun;
2973
acb->pktRequestCount++;
2974
if(error != 0) {
2975
if(error != EFBIG) {
2976
printf("arcmsr%d: unexpected error %x"
2977
" returned from 'bus_dmamap_load' \n"
2978
, acb->pci_unit, error);
2979
}
2980
if((pccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG) {
2981
pccb->ccb_h.status |= CAM_REQ_TOO_BIG;
2982
}
2983
arcmsr_srb_complete(srb, 0);
2984
return;
2985
}
2986
if(nseg > ARCMSR_MAX_SG_ENTRIES) {
2987
pccb->ccb_h.status |= CAM_REQ_TOO_BIG;
2988
arcmsr_srb_complete(srb, 0);
2989
return;
2990
}
2991
if(acb->acb_flags & ACB_F_BUS_RESET) {
2992
printf("arcmsr%d: bus reset and return busy \n", acb->pci_unit);
2993
pccb->ccb_h.status |= CAM_SCSI_BUS_RESET;
2994
arcmsr_srb_complete(srb, 0);
2995
return;
2996
}
2997
if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
2998
u_int8_t block_cmd, cmd;
2999
3000
cmd = scsiio_cdb_ptr(&pccb->csio)[0];
3001
block_cmd = cmd & 0x0f;
3002
if(block_cmd == 0x08 || block_cmd == 0x0a) {
3003
printf("arcmsr%d:block 'read/write' command "
3004
"with gone raid volume Cmd=0x%2x, TargetId=%d, Lun=%d \n"
3005
, acb->pci_unit, cmd, target, lun);
3006
pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
3007
arcmsr_srb_complete(srb, 0);
3008
return;
3009
}
3010
}
3011
if((pccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
3012
if(nseg != 0) {
3013
bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
3014
}
3015
arcmsr_srb_complete(srb, 0);
3016
return;
3017
}
3018
if(acb->srboutstandingcount >= acb->maxOutstanding) {
3019
if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) == 0)
3020
{
3021
xpt_freeze_simq(acb->psim, 1);
3022
acb->acb_flags |= ACB_F_CAM_DEV_QFRZN;
3023
}
3024
pccb->ccb_h.status &= ~CAM_SIM_QUEUED;
3025
pccb->ccb_h.status |= CAM_REQUEUE_REQ;
3026
arcmsr_srb_complete(srb, 0);
3027
return;
3028
}
3029
pccb->ccb_h.status |= CAM_SIM_QUEUED;
3030
arcmsr_build_srb(srb, dm_segs, nseg);
3031
arcmsr_post_srb(acb, srb);
3032
if (pccb->ccb_h.timeout != CAM_TIME_INFINITY)
3033
{
3034
arcmsr_callout_init(&srb->ccb_callout);
3035
callout_reset_sbt(&srb->ccb_callout, SBT_1MS *
3036
(pccb->ccb_h.timeout + (ARCMSR_TIMEOUT_DELAY * 1000)), 0,
3037
arcmsr_srb_timeout, srb, 0);
3038
srb->srb_flags |= SRB_FLAG_TIMER_START;
3039
}
3040
}
3041
/*
3042
*****************************************************************************************
3043
*****************************************************************************************
3044
*/
3045
static u_int8_t arcmsr_seek_cmd2abort(union ccb *abortccb)
3046
{
3047
struct CommandControlBlock *srb;
3048
struct AdapterControlBlock *acb = (struct AdapterControlBlock *) abortccb->ccb_h.arcmsr_ccbacb_ptr;
3049
u_int32_t intmask_org;
3050
int i = 0;
3051
3052
acb->num_aborts++;
3053
/*
3054
***************************************************************************
3055
** It is the upper layer do abort command this lock just prior to calling us.
3056
** First determine if we currently own this command.
3057
** Start by searching the device queue. If not found
3058
** at all, and the system wanted us to just abort the
3059
** command return success.
3060
***************************************************************************
3061
*/
3062
if(acb->srboutstandingcount != 0) {
3063
/* disable all outbound interrupt */
3064
intmask_org = arcmsr_disable_allintr(acb);
3065
for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
3066
srb = acb->psrb_pool[i];
3067
if(srb->srb_state == ARCMSR_SRB_START) {
3068
if(srb->pccb == abortccb) {
3069
srb->srb_state = ARCMSR_SRB_ABORTED;
3070
printf("arcmsr%d:scsi id=%d lun=%jx abort srb '%p'"
3071
"outstanding command \n"
3072
, acb->pci_unit, abortccb->ccb_h.target_id
3073
, (uintmax_t)abortccb->ccb_h.target_lun, srb);
3074
arcmsr_polling_srbdone(acb, srb);
3075
/* enable outbound Post Queue, outbound doorbell Interrupt */
3076
arcmsr_enable_allintr(acb, intmask_org);
3077
return (TRUE);
3078
}
3079
}
3080
}
3081
/* enable outbound Post Queue, outbound doorbell Interrupt */
3082
arcmsr_enable_allintr(acb, intmask_org);
3083
}
3084
return(FALSE);
3085
}
3086
/*
3087
****************************************************************************
3088
****************************************************************************
3089
*/
3090
static void arcmsr_bus_reset(struct AdapterControlBlock *acb)
3091
{
3092
int retry = 0;
3093
3094
acb->num_resets++;
3095
acb->acb_flags |= ACB_F_BUS_RESET;
3096
while(acb->srboutstandingcount != 0 && retry < 400) {
3097
arcmsr_interrupt(acb);
3098
UDELAY(25000);
3099
retry++;
3100
}
3101
arcmsr_iop_reset(acb);
3102
acb->acb_flags &= ~ACB_F_BUS_RESET;
3103
}
3104
/*
3105
**************************************************************************
3106
**************************************************************************
3107
*/
3108
static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
3109
union ccb *pccb)
3110
{
3111
if (pccb->ccb_h.target_lun) {
3112
pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
3113
xpt_done(pccb);
3114
return;
3115
}
3116
pccb->ccb_h.status |= CAM_REQ_CMP;
3117
switch (scsiio_cdb_ptr(&pccb->csio)[0]) {
3118
case INQUIRY: {
3119
unsigned char inqdata[36];
3120
char *buffer = pccb->csio.data_ptr;
3121
3122
inqdata[0] = T_PROCESSOR; /* Periph Qualifier & Periph Dev Type */
3123
inqdata[1] = 0; /* rem media bit & Dev Type Modifier */
3124
inqdata[2] = 0; /* ISO, ECMA, & ANSI versions */
3125
inqdata[3] = 0;
3126
inqdata[4] = 31; /* length of additional data */
3127
inqdata[5] = 0;
3128
inqdata[6] = 0;
3129
inqdata[7] = 0;
3130
strncpy(&inqdata[8], "Areca ", 8); /* Vendor Identification */
3131
strncpy(&inqdata[16], "RAID controller ", 16); /* Product Identification */
3132
strncpy(&inqdata[32], "R001", 4); /* Product Revision */
3133
memcpy(buffer, inqdata, sizeof(inqdata));
3134
xpt_done(pccb);
3135
}
3136
break;
3137
case WRITE_BUFFER:
3138
case READ_BUFFER: {
3139
if (arcmsr_iop_message_xfer(acb, pccb)) {
3140
pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
3141
pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
3142
}
3143
xpt_done(pccb);
3144
}
3145
break;
3146
default:
3147
xpt_done(pccb);
3148
}
3149
}
3150
/*
3151
*********************************************************************
3152
*********************************************************************
3153
*/
3154
static void arcmsr_action(struct cam_sim *psim, union ccb *pccb)
3155
{
3156
struct AdapterControlBlock *acb;
3157
3158
acb = (struct AdapterControlBlock *) cam_sim_softc(psim);
3159
if(acb == NULL) {
3160
pccb->ccb_h.status |= CAM_REQ_INVALID;
3161
xpt_done(pccb);
3162
return;
3163
}
3164
switch (pccb->ccb_h.func_code) {
3165
case XPT_SCSI_IO: {
3166
struct CommandControlBlock *srb;
3167
int target = pccb->ccb_h.target_id;
3168
int error;
3169
3170
if (pccb->ccb_h.flags & CAM_CDB_PHYS) {
3171
pccb->ccb_h.status = CAM_REQ_INVALID;
3172
xpt_done(pccb);
3173
return;
3174
}
3175
3176
if(target == ARCMSR_VIRTUAL_DEVICE_ID) {
3177
/* virtual device for iop message transfer */
3178
arcmsr_handle_virtual_command(acb, pccb);
3179
return;
3180
}
3181
if((srb = arcmsr_get_freesrb(acb)) == NULL) {
3182
pccb->ccb_h.status |= CAM_RESRC_UNAVAIL;
3183
xpt_done(pccb);
3184
return;
3185
}
3186
pccb->ccb_h.arcmsr_ccbsrb_ptr = srb;
3187
pccb->ccb_h.arcmsr_ccbacb_ptr = acb;
3188
srb->pccb = pccb;
3189
error = bus_dmamap_load_ccb(acb->dm_segs_dmat
3190
, srb->dm_segs_dmamap
3191
, pccb
3192
, arcmsr_execute_srb, srb, /*flags*/0);
3193
if(error == EINPROGRESS) {
3194
xpt_freeze_simq(acb->psim, 1);
3195
pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
3196
}
3197
break;
3198
}
3199
case XPT_PATH_INQ: {
3200
struct ccb_pathinq *cpi = &pccb->cpi;
3201
3202
cpi->version_num = 1;
3203
cpi->hba_inquiry = PI_SDTR_ABLE | PI_TAG_ABLE;
3204
cpi->target_sprt = 0;
3205
cpi->hba_misc = 0;
3206
cpi->hba_eng_cnt = 0;
3207
cpi->max_target = ARCMSR_MAX_TARGETID; /* 0-16 */
3208
cpi->max_lun = ARCMSR_MAX_TARGETLUN; /* 0-7 */
3209
cpi->initiator_id = ARCMSR_SCSI_INITIATOR_ID; /* 255 */
3210
cpi->bus_id = cam_sim_bus(psim);
3211
strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
3212
strlcpy(cpi->hba_vid, "ARCMSR", HBA_IDLEN);
3213
strlcpy(cpi->dev_name, cam_sim_name(psim), DEV_IDLEN);
3214
cpi->unit_number = cam_sim_unit(psim);
3215
if(acb->adapter_bus_speed == ACB_BUS_SPEED_12G)
3216
cpi->base_transfer_speed = 1200000;
3217
else if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
3218
cpi->base_transfer_speed = 600000;
3219
else
3220
cpi->base_transfer_speed = 300000;
3221
if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
3222
(acb->vendor_device_id == PCIDevVenIDARC1883) ||
3223
(acb->vendor_device_id == PCIDevVenIDARC1884) ||
3224
(acb->vendor_device_id == PCIDevVenIDARC1886) ||
3225
(acb->vendor_device_id == PCIDevVenIDARC1680) ||
3226
(acb->vendor_device_id == PCIDevVenIDARC1214))
3227
{
3228
cpi->transport = XPORT_SAS;
3229
cpi->transport_version = 0;
3230
cpi->protocol_version = SCSI_REV_SPC2;
3231
}
3232
else
3233
{
3234
cpi->transport = XPORT_SPI;
3235
cpi->transport_version = 2;
3236
cpi->protocol_version = SCSI_REV_2;
3237
}
3238
cpi->protocol = PROTO_SCSI;
3239
cpi->ccb_h.status |= CAM_REQ_CMP;
3240
xpt_done(pccb);
3241
break;
3242
}
3243
case XPT_ABORT: {
3244
union ccb *pabort_ccb;
3245
3246
pabort_ccb = pccb->cab.abort_ccb;
3247
switch (pabort_ccb->ccb_h.func_code) {
3248
case XPT_ACCEPT_TARGET_IO:
3249
case XPT_CONT_TARGET_IO:
3250
if(arcmsr_seek_cmd2abort(pabort_ccb)==TRUE) {
3251
pabort_ccb->ccb_h.status |= CAM_REQ_ABORTED;
3252
xpt_done(pabort_ccb);
3253
pccb->ccb_h.status |= CAM_REQ_CMP;
3254
} else {
3255
xpt_print_path(pabort_ccb->ccb_h.path);
3256
printf("Not found\n");
3257
pccb->ccb_h.status |= CAM_PATH_INVALID;
3258
}
3259
break;
3260
case XPT_SCSI_IO:
3261
pccb->ccb_h.status |= CAM_UA_ABORT;
3262
break;
3263
default:
3264
pccb->ccb_h.status |= CAM_REQ_INVALID;
3265
break;
3266
}
3267
xpt_done(pccb);
3268
break;
3269
}
3270
case XPT_RESET_BUS:
3271
case XPT_RESET_DEV: {
3272
u_int32_t i;
3273
3274
arcmsr_bus_reset(acb);
3275
for (i=0; i < 500; i++) {
3276
DELAY(1000);
3277
}
3278
pccb->ccb_h.status |= CAM_REQ_CMP;
3279
xpt_done(pccb);
3280
break;
3281
}
3282
case XPT_TERM_IO: {
3283
pccb->ccb_h.status |= CAM_REQ_INVALID;
3284
xpt_done(pccb);
3285
break;
3286
}
3287
case XPT_GET_TRAN_SETTINGS: {
3288
struct ccb_trans_settings *cts;
3289
3290
if(pccb->ccb_h.target_id == ARCMSR_VIRTUAL_DEVICE_ID) {
3291
pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
3292
xpt_done(pccb);
3293
break;
3294
}
3295
cts = &pccb->cts;
3296
{
3297
struct ccb_trans_settings_scsi *scsi;
3298
struct ccb_trans_settings_spi *spi;
3299
struct ccb_trans_settings_sas *sas;
3300
3301
scsi = &cts->proto_specific.scsi;
3302
scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
3303
scsi->valid = CTS_SCSI_VALID_TQ;
3304
cts->protocol = PROTO_SCSI;
3305
3306
if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
3307
(acb->vendor_device_id == PCIDevVenIDARC1883) ||
3308
(acb->vendor_device_id == PCIDevVenIDARC1884) ||
3309
(acb->vendor_device_id == PCIDevVenIDARC1886) ||
3310
(acb->vendor_device_id == PCIDevVenIDARC1680) ||
3311
(acb->vendor_device_id == PCIDevVenIDARC1214))
3312
{
3313
cts->protocol_version = SCSI_REV_SPC2;
3314
cts->transport_version = 0;
3315
cts->transport = XPORT_SAS;
3316
sas = &cts->xport_specific.sas;
3317
sas->valid = CTS_SAS_VALID_SPEED;
3318
if (acb->adapter_bus_speed == ACB_BUS_SPEED_12G)
3319
sas->bitrate = 1200000;
3320
else if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
3321
sas->bitrate = 600000;
3322
else if(acb->adapter_bus_speed == ACB_BUS_SPEED_3G)
3323
sas->bitrate = 300000;
3324
}
3325
else
3326
{
3327
cts->protocol_version = SCSI_REV_2;
3328
cts->transport_version = 2;
3329
cts->transport = XPORT_SPI;
3330
spi = &cts->xport_specific.spi;
3331
spi->flags = CTS_SPI_FLAGS_DISC_ENB;
3332
if (acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
3333
spi->sync_period = 1;
3334
else
3335
spi->sync_period = 2;
3336
spi->sync_offset = 32;
3337
spi->bus_width = MSG_EXT_WDTR_BUS_16_BIT;
3338
spi->valid = CTS_SPI_VALID_DISC
3339
| CTS_SPI_VALID_SYNC_RATE
3340
| CTS_SPI_VALID_SYNC_OFFSET
3341
| CTS_SPI_VALID_BUS_WIDTH;
3342
}
3343
}
3344
pccb->ccb_h.status |= CAM_REQ_CMP;
3345
xpt_done(pccb);
3346
break;
3347
}
3348
case XPT_SET_TRAN_SETTINGS: {
3349
pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
3350
xpt_done(pccb);
3351
break;
3352
}
3353
case XPT_CALC_GEOMETRY:
3354
if(pccb->ccb_h.target_id == ARCMSR_VIRTUAL_DEVICE_ID) {
3355
pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
3356
xpt_done(pccb);
3357
break;
3358
}
3359
cam_calc_geometry(&pccb->ccg, 1);
3360
xpt_done(pccb);
3361
break;
3362
default:
3363
pccb->ccb_h.status |= CAM_REQ_INVALID;
3364
xpt_done(pccb);
3365
break;
3366
}
3367
}
3368
/*
3369
**********************************************************************
3370
**********************************************************************
3371
*/
3372
static void arcmsr_start_hba_bgrb(struct AdapterControlBlock *acb)
3373
{
3374
acb->acb_flags |= ACB_F_MSG_START_BGRB;
3375
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3376
if(!arcmsr_hba_wait_msgint_ready(acb)) {
3377
printf("arcmsr%d: wait 'start adapter background rebuild' timeout \n", acb->pci_unit);
3378
}
3379
}
3380
/*
3381
**********************************************************************
3382
**********************************************************************
3383
*/
3384
static void arcmsr_start_hbb_bgrb(struct AdapterControlBlock *acb)
3385
{
3386
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3387
acb->acb_flags |= ACB_F_MSG_START_BGRB;
3388
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_START_BGRB);
3389
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3390
printf( "arcmsr%d: wait 'start adapter background rebuild' timeout \n", acb->pci_unit);
3391
}
3392
}
3393
/*
3394
**********************************************************************
3395
**********************************************************************
3396
*/
3397
static void arcmsr_start_hbc_bgrb(struct AdapterControlBlock *acb)
3398
{
3399
acb->acb_flags |= ACB_F_MSG_START_BGRB;
3400
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3401
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
3402
if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3403
printf("arcmsr%d: wait 'start adapter background rebuild' timeout \n", acb->pci_unit);
3404
}
3405
}
3406
/*
3407
**********************************************************************
3408
**********************************************************************
3409
*/
3410
static void arcmsr_start_hbd_bgrb(struct AdapterControlBlock *acb)
3411
{
3412
acb->acb_flags |= ACB_F_MSG_START_BGRB;
3413
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3414
if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3415
printf("arcmsr%d: wait 'start adapter background rebuild' timeout \n", acb->pci_unit);
3416
}
3417
}
3418
/*
3419
**********************************************************************
3420
**********************************************************************
3421
*/
3422
static void arcmsr_start_hbe_bgrb(struct AdapterControlBlock *acb)
3423
{
3424
acb->acb_flags |= ACB_F_MSG_START_BGRB;
3425
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3426
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
3427
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
3428
if(!arcmsr_hbe_wait_msgint_ready(acb)) {
3429
printf("arcmsr%d: wait 'start adapter background rebuild' timeout \n", acb->pci_unit);
3430
}
3431
}
3432
/*
3433
**********************************************************************
3434
**********************************************************************
3435
*/
3436
static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb)
3437
{
3438
switch (acb->adapter_type) {
3439
case ACB_ADAPTER_TYPE_A:
3440
arcmsr_start_hba_bgrb(acb);
3441
break;
3442
case ACB_ADAPTER_TYPE_B:
3443
arcmsr_start_hbb_bgrb(acb);
3444
break;
3445
case ACB_ADAPTER_TYPE_C:
3446
arcmsr_start_hbc_bgrb(acb);
3447
break;
3448
case ACB_ADAPTER_TYPE_D:
3449
arcmsr_start_hbd_bgrb(acb);
3450
break;
3451
case ACB_ADAPTER_TYPE_E:
3452
case ACB_ADAPTER_TYPE_F:
3453
arcmsr_start_hbe_bgrb(acb);
3454
break;
3455
}
3456
}
3457
/*
3458
**********************************************************************
3459
**
3460
**********************************************************************
3461
*/
3462
static void arcmsr_polling_hba_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3463
{
3464
struct CommandControlBlock *srb;
3465
u_int32_t flag_srb, outbound_intstatus, poll_srb_done=0, poll_count=0;
3466
u_int16_t error;
3467
3468
polling_ccb_retry:
3469
poll_count++;
3470
outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
3471
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus); /*clear interrupt*/
3472
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3473
while(1) {
3474
if((flag_srb = CHIP_REG_READ32(HBA_MessageUnit,
3475
0, outbound_queueport)) == 0xFFFFFFFF) {
3476
if(poll_srb_done) {
3477
break;/*chip FIFO no ccb for completion already*/
3478
} else {
3479
UDELAY(25000);
3480
if ((poll_count > 100) && (poll_srb != NULL)) {
3481
break;
3482
}
3483
goto polling_ccb_retry;
3484
}
3485
}
3486
/* check if command done with no error*/
3487
srb = (struct CommandControlBlock *)
3488
(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
3489
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
3490
poll_srb_done = (srb == poll_srb) ? 1:0;
3491
if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3492
if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3493
printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'"
3494
"poll command abort successfully \n"
3495
, acb->pci_unit
3496
, srb->pccb->ccb_h.target_id
3497
, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3498
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3499
arcmsr_srb_complete(srb, 1);
3500
continue;
3501
}
3502
printf("arcmsr%d: polling get an illegal srb command done srb='%p'"
3503
"srboutstandingcount=%d \n"
3504
, acb->pci_unit
3505
, srb, acb->srboutstandingcount);
3506
continue;
3507
}
3508
arcmsr_report_srb_state(acb, srb, error);
3509
} /*drain reply FIFO*/
3510
}
3511
/*
3512
**********************************************************************
3513
**
3514
**********************************************************************
3515
*/
3516
static void arcmsr_polling_hbb_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3517
{
3518
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3519
struct CommandControlBlock *srb;
3520
u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
3521
int index;
3522
u_int16_t error;
3523
3524
polling_ccb_retry:
3525
poll_count++;
3526
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
3527
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3528
while(1) {
3529
index = phbbmu->doneq_index;
3530
if((flag_srb = phbbmu->done_qbuffer[index]) == 0) {
3531
if(poll_srb_done) {
3532
break;/*chip FIFO no ccb for completion already*/
3533
} else {
3534
UDELAY(25000);
3535
if ((poll_count > 100) && (poll_srb != NULL)) {
3536
break;
3537
}
3538
goto polling_ccb_retry;
3539
}
3540
}
3541
phbbmu->done_qbuffer[index] = 0;
3542
index++;
3543
index %= ARCMSR_MAX_HBB_POSTQUEUE; /*if last index number set it to 0 */
3544
phbbmu->doneq_index = index;
3545
/* check if command done with no error*/
3546
srb = (struct CommandControlBlock *)
3547
(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
3548
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
3549
poll_srb_done = (srb == poll_srb) ? 1:0;
3550
if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3551
if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3552
printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'"
3553
"poll command abort successfully \n"
3554
, acb->pci_unit
3555
, srb->pccb->ccb_h.target_id
3556
, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3557
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3558
arcmsr_srb_complete(srb, 1);
3559
continue;
3560
}
3561
printf("arcmsr%d: polling get an illegal srb command done srb='%p'"
3562
"srboutstandingcount=%d \n"
3563
, acb->pci_unit
3564
, srb, acb->srboutstandingcount);
3565
continue;
3566
}
3567
arcmsr_report_srb_state(acb, srb, error);
3568
} /*drain reply FIFO*/
3569
}
3570
/*
3571
**********************************************************************
3572
**
3573
**********************************************************************
3574
*/
3575
static void arcmsr_polling_hbc_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3576
{
3577
struct CommandControlBlock *srb;
3578
u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
3579
u_int16_t error;
3580
3581
polling_ccb_retry:
3582
poll_count++;
3583
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3584
while(1) {
3585
if(!(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR)) {
3586
if(poll_srb_done) {
3587
break;/*chip FIFO no ccb for completion already*/
3588
} else {
3589
UDELAY(25000);
3590
if ((poll_count > 100) && (poll_srb != NULL)) {
3591
break;
3592
}
3593
if (acb->srboutstandingcount == 0) {
3594
break;
3595
}
3596
goto polling_ccb_retry;
3597
}
3598
}
3599
flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
3600
/* check if command done with no error*/
3601
srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes aligned*/
3602
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
3603
if (poll_srb != NULL)
3604
poll_srb_done = (srb == poll_srb) ? 1:0;
3605
if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3606
if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3607
printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'poll command abort successfully \n"
3608
, acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3609
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3610
arcmsr_srb_complete(srb, 1);
3611
continue;
3612
}
3613
printf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
3614
, acb->pci_unit, srb, acb->srboutstandingcount);
3615
continue;
3616
}
3617
arcmsr_report_srb_state(acb, srb, error);
3618
} /*drain reply FIFO*/
3619
}
3620
/*
3621
**********************************************************************
3622
**
3623
**********************************************************************
3624
*/
3625
static void arcmsr_polling_hbd_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3626
{
3627
struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
3628
struct CommandControlBlock *srb;
3629
u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
3630
u_int32_t outbound_write_pointer;
3631
u_int16_t error, doneq_index;
3632
3633
polling_ccb_retry:
3634
poll_count++;
3635
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3636
while(1) {
3637
outbound_write_pointer = phbdmu->done_qbuffer[0].addressLow;
3638
doneq_index = phbdmu->doneq_index;
3639
if ((outbound_write_pointer & 0xFF) == (doneq_index & 0xFF)) {
3640
if(poll_srb_done) {
3641
break;/*chip FIFO no ccb for completion already*/
3642
} else {
3643
UDELAY(25000);
3644
if ((poll_count > 100) && (poll_srb != NULL)) {
3645
break;
3646
}
3647
if (acb->srboutstandingcount == 0) {
3648
break;
3649
}
3650
goto polling_ccb_retry;
3651
}
3652
}
3653
doneq_index = arcmsr_get_doneq_index(phbdmu);
3654
flag_srb = phbdmu->done_qbuffer[(doneq_index & 0xFF)+1].addressLow;
3655
/* check if command done with no error*/
3656
srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes aligned*/
3657
error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
3658
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outboundlist_read_pointer, doneq_index);
3659
if (poll_srb != NULL)
3660
poll_srb_done = (srb == poll_srb) ? 1:0;
3661
if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3662
if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3663
printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'poll command abort successfully \n"
3664
, acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3665
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3666
arcmsr_srb_complete(srb, 1);
3667
continue;
3668
}
3669
printf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
3670
, acb->pci_unit, srb, acb->srboutstandingcount);
3671
continue;
3672
}
3673
arcmsr_report_srb_state(acb, srb, error);
3674
} /*drain reply FIFO*/
3675
}
3676
/*
3677
**********************************************************************
3678
**
3679
**********************************************************************
3680
*/
3681
static void arcmsr_polling_hbe_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3682
{
3683
struct CommandControlBlock *srb;
3684
u_int32_t poll_srb_done=0, poll_count=0, doneq_index;
3685
u_int16_t error, cmdSMID;
3686
3687
polling_ccb_retry:
3688
poll_count++;
3689
bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3690
while(1) {
3691
doneq_index = acb->doneq_index;
3692
if((CHIP_REG_READ32(HBE_MessageUnit, 0, reply_post_producer_index) & 0xFFFF) == doneq_index) {
3693
if(poll_srb_done) {
3694
break;/*chip FIFO no ccb for completion already*/
3695
} else {
3696
UDELAY(25000);
3697
if ((poll_count > 100) && (poll_srb != NULL)) {
3698
break;
3699
}
3700
if (acb->srboutstandingcount == 0) {
3701
break;
3702
}
3703
goto polling_ccb_retry;
3704
}
3705
}
3706
cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
3707
doneq_index++;
3708
if (doneq_index >= acb->completionQ_entry)
3709
doneq_index = 0;
3710
acb->doneq_index = doneq_index;
3711
srb = acb->psrb_pool[cmdSMID];
3712
error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
3713
if (poll_srb != NULL)
3714
poll_srb_done = (srb == poll_srb) ? 1:0;
3715
if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3716
if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3717
printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'poll command abort successfully \n"
3718
, acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3719
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3720
arcmsr_srb_complete(srb, 1);
3721
continue;
3722
}
3723
printf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
3724
, acb->pci_unit, srb, acb->srboutstandingcount);
3725
continue;
3726
}
3727
arcmsr_report_srb_state(acb, srb, error);
3728
} /*drain reply FIFO*/
3729
CHIP_REG_WRITE32(HBE_MessageUnit, 0, reply_post_producer_index, doneq_index);
3730
}
3731
/*
3732
**********************************************************************
3733
**********************************************************************
3734
*/
3735
static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3736
{
3737
switch (acb->adapter_type) {
3738
case ACB_ADAPTER_TYPE_A:
3739
arcmsr_polling_hba_srbdone(acb, poll_srb);
3740
break;
3741
case ACB_ADAPTER_TYPE_B:
3742
arcmsr_polling_hbb_srbdone(acb, poll_srb);
3743
break;
3744
case ACB_ADAPTER_TYPE_C:
3745
arcmsr_polling_hbc_srbdone(acb, poll_srb);
3746
break;
3747
case ACB_ADAPTER_TYPE_D:
3748
arcmsr_polling_hbd_srbdone(acb, poll_srb);
3749
break;
3750
case ACB_ADAPTER_TYPE_E:
3751
case ACB_ADAPTER_TYPE_F:
3752
arcmsr_polling_hbe_srbdone(acb, poll_srb);
3753
break;
3754
}
3755
}
3756
/*
3757
**********************************************************************
3758
**********************************************************************
3759
*/
3760
static void arcmsr_get_hba_config(struct AdapterControlBlock *acb)
3761
{
3762
char *acb_firm_model = acb->firm_model;
3763
char *acb_firm_version = acb->firm_version;
3764
char *acb_device_map = acb->device_map;
3765
size_t iop_firm_model = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]); /*firm_model,15,60-67*/
3766
size_t iop_firm_version = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3767
size_t iop_device_map = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3768
int i;
3769
3770
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3771
if(!arcmsr_hba_wait_msgint_ready(acb)) {
3772
printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3773
}
3774
i = 0;
3775
while(i < 8) {
3776
*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3777
/* 8 bytes firm_model, 15, 60-67*/
3778
acb_firm_model++;
3779
i++;
3780
}
3781
i=0;
3782
while(i < 16) {
3783
*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3784
/* 16 bytes firm_version, 17, 68-83*/
3785
acb_firm_version++;
3786
i++;
3787
}
3788
i=0;
3789
while(i < 16) {
3790
*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3791
acb_device_map++;
3792
i++;
3793
}
3794
printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3795
acb->firm_request_len = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3796
acb->firm_numbers_queue = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3797
acb->firm_sdram_size = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3798
acb->firm_ide_channels = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3799
acb->firm_cfg_version = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3800
if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3801
acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3802
else
3803
acb->maxOutstanding = acb->firm_numbers_queue - 1;
3804
}
3805
/*
3806
**********************************************************************
3807
**********************************************************************
3808
*/
3809
static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb)
3810
{
3811
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3812
char *acb_firm_model = acb->firm_model;
3813
char *acb_firm_version = acb->firm_version;
3814
char *acb_device_map = acb->device_map;
3815
size_t iop_firm_model = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]); /*firm_model,15,60-67*/
3816
size_t iop_firm_version = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3817
size_t iop_device_map = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3818
int i;
3819
3820
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_GET_CONFIG);
3821
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3822
printf( "arcmsr%d: wait" "'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3823
}
3824
i = 0;
3825
while(i < 8) {
3826
*acb_firm_model = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_model+i);
3827
/* 8 bytes firm_model, 15, 60-67*/
3828
acb_firm_model++;
3829
i++;
3830
}
3831
i = 0;
3832
while(i < 16) {
3833
*acb_firm_version = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_version+i);
3834
/* 16 bytes firm_version, 17, 68-83*/
3835
acb_firm_version++;
3836
i++;
3837
}
3838
i = 0;
3839
while(i < 16) {
3840
*acb_device_map = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_device_map+i);
3841
acb_device_map++;
3842
i++;
3843
}
3844
printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3845
acb->firm_request_len = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3846
acb->firm_numbers_queue = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3847
acb->firm_sdram_size = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3848
acb->firm_ide_channels = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3849
acb->firm_cfg_version = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3850
if(acb->firm_numbers_queue > ARCMSR_MAX_HBB_POSTQUEUE)
3851
acb->maxOutstanding = ARCMSR_MAX_HBB_POSTQUEUE - 1;
3852
else
3853
acb->maxOutstanding = acb->firm_numbers_queue - 1;
3854
}
3855
/*
3856
**********************************************************************
3857
**********************************************************************
3858
*/
3859
static void arcmsr_get_hbc_config(struct AdapterControlBlock *acb)
3860
{
3861
char *acb_firm_model = acb->firm_model;
3862
char *acb_firm_version = acb->firm_version;
3863
char *acb_device_map = acb->device_map;
3864
size_t iop_firm_model = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]); /*firm_model,15,60-67*/
3865
size_t iop_firm_version = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3866
size_t iop_device_map = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3867
int i;
3868
3869
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3870
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
3871
if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3872
printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3873
}
3874
i = 0;
3875
while(i < 8) {
3876
*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3877
/* 8 bytes firm_model, 15, 60-67*/
3878
acb_firm_model++;
3879
i++;
3880
}
3881
i = 0;
3882
while(i < 16) {
3883
*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3884
/* 16 bytes firm_version, 17, 68-83*/
3885
acb_firm_version++;
3886
i++;
3887
}
3888
i = 0;
3889
while(i < 16) {
3890
*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3891
acb_device_map++;
3892
i++;
3893
}
3894
printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3895
acb->firm_request_len = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3896
acb->firm_numbers_queue = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3897
acb->firm_sdram_size = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3898
acb->firm_ide_channels = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3899
acb->firm_cfg_version = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3900
if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3901
acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3902
else
3903
acb->maxOutstanding = acb->firm_numbers_queue - 1;
3904
}
3905
/*
3906
**********************************************************************
3907
**********************************************************************
3908
*/
3909
static void arcmsr_get_hbd_config(struct AdapterControlBlock *acb)
3910
{
3911
char *acb_firm_model = acb->firm_model;
3912
char *acb_firm_version = acb->firm_version;
3913
char *acb_device_map = acb->device_map;
3914
size_t iop_firm_model = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]); /*firm_model,15,60-67*/
3915
size_t iop_firm_version = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3916
size_t iop_device_map = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3917
int i;
3918
3919
if(CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE)
3920
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);
3921
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3922
if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3923
printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3924
}
3925
i = 0;
3926
while(i < 8) {
3927
*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3928
/* 8 bytes firm_model, 15, 60-67*/
3929
acb_firm_model++;
3930
i++;
3931
}
3932
i = 0;
3933
while(i < 16) {
3934
*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3935
/* 16 bytes firm_version, 17, 68-83*/
3936
acb_firm_version++;
3937
i++;
3938
}
3939
i = 0;
3940
while(i < 16) {
3941
*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3942
acb_device_map++;
3943
i++;
3944
}
3945
printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3946
acb->firm_request_len = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3947
acb->firm_numbers_queue = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3948
acb->firm_sdram_size = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3949
acb->firm_ide_channels = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3950
acb->firm_cfg_version = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3951
if(acb->firm_numbers_queue > ARCMSR_MAX_HBD_POSTQUEUE)
3952
acb->maxOutstanding = ARCMSR_MAX_HBD_POSTQUEUE - 1;
3953
else
3954
acb->maxOutstanding = acb->firm_numbers_queue - 1;
3955
}
3956
/*
3957
**********************************************************************
3958
**********************************************************************
3959
*/
3960
static void arcmsr_get_hbe_config(struct AdapterControlBlock *acb)
3961
{
3962
char *acb_firm_model = acb->firm_model;
3963
char *acb_firm_version = acb->firm_version;
3964
char *acb_device_map = acb->device_map;
3965
size_t iop_firm_model = offsetof(struct HBE_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]); /*firm_model,15,60-67*/
3966
size_t iop_firm_version = offsetof(struct HBE_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3967
size_t iop_device_map = offsetof(struct HBE_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3968
int i;
3969
3970
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3971
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
3972
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
3973
if(!arcmsr_hbe_wait_msgint_ready(acb)) {
3974
printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3975
}
3976
3977
i = 0;
3978
while(i < 8) {
3979
*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3980
/* 8 bytes firm_model, 15, 60-67*/
3981
acb_firm_model++;
3982
i++;
3983
}
3984
i = 0;
3985
while(i < 16) {
3986
*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3987
/* 16 bytes firm_version, 17, 68-83*/
3988
acb_firm_version++;
3989
i++;
3990
}
3991
i = 0;
3992
while(i < 16) {
3993
*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3994
acb_device_map++;
3995
i++;
3996
}
3997
printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3998
acb->firm_request_len = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3999
acb->firm_numbers_queue = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
4000
acb->firm_sdram_size = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
4001
acb->firm_ide_channels = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
4002
acb->firm_cfg_version = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
4003
if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
4004
acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
4005
else
4006
acb->maxOutstanding = acb->firm_numbers_queue - 1;
4007
}
4008
/*
4009
**********************************************************************
4010
**********************************************************************
4011
*/
4012
static void arcmsr_get_hbf_config(struct AdapterControlBlock *acb)
4013
{
4014
u_int32_t *acb_firm_model = (u_int32_t *)acb->firm_model;
4015
u_int32_t *acb_firm_version = (u_int32_t *)acb->firm_version;
4016
u_int32_t *acb_device_map = (u_int32_t *)acb->device_map;
4017
size_t iop_firm_model = ARCMSR_FW_MODEL_OFFSET; /*firm_model,15,60-67*/
4018
size_t iop_firm_version = ARCMSR_FW_VERS_OFFSET; /*firm_version,17,68-83*/
4019
size_t iop_device_map = ARCMSR_FW_DEVMAP_OFFSET;
4020
int i;
4021
4022
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
4023
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
4024
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4025
if(!arcmsr_hbe_wait_msgint_ready(acb))
4026
printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
4027
4028
i = 0;
4029
while(i < 2) {
4030
*acb_firm_model = acb->msgcode_rwbuffer[iop_firm_model];
4031
/* 8 bytes firm_model, 15, 60-67*/
4032
acb_firm_model++;
4033
iop_firm_model++;
4034
i++;
4035
}
4036
i = 0;
4037
while(i < 4) {
4038
*acb_firm_version = acb->msgcode_rwbuffer[iop_firm_version];
4039
/* 16 bytes firm_version, 17, 68-83*/
4040
acb_firm_version++;
4041
iop_firm_version++;
4042
i++;
4043
}
4044
i = 0;
4045
while(i < 4) {
4046
*acb_device_map = acb->msgcode_rwbuffer[iop_device_map];
4047
acb_device_map++;
4048
iop_device_map++;
4049
i++;
4050
}
4051
printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
4052
acb->firm_request_len = acb->msgcode_rwbuffer[1]; /*firm_request_len, 1, 04-07*/
4053
acb->firm_numbers_queue = acb->msgcode_rwbuffer[2]; /*firm_numbers_queue, 2, 08-11*/
4054
acb->firm_sdram_size = acb->msgcode_rwbuffer[3]; /*firm_sdram_size, 3, 12-15*/
4055
acb->firm_ide_channels = acb->msgcode_rwbuffer[4]; /*firm_ide_channels, 4, 16-19*/
4056
acb->firm_cfg_version = acb->msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]; /*firm_cfg_version, 25*/
4057
acb->firm_PicStatus = acb->msgcode_rwbuffer[ARCMSR_FW_PICSTATUS]; /* firm_PicStatus, 30 */
4058
if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
4059
acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
4060
else
4061
acb->maxOutstanding = acb->firm_numbers_queue - 1;
4062
}
4063
/*
4064
**********************************************************************
4065
**********************************************************************
4066
*/
4067
static void arcmsr_get_firmware_spec(struct AdapterControlBlock *acb)
4068
{
4069
switch (acb->adapter_type) {
4070
case ACB_ADAPTER_TYPE_A:
4071
arcmsr_get_hba_config(acb);
4072
break;
4073
case ACB_ADAPTER_TYPE_B:
4074
arcmsr_get_hbb_config(acb);
4075
break;
4076
case ACB_ADAPTER_TYPE_C:
4077
arcmsr_get_hbc_config(acb);
4078
break;
4079
case ACB_ADAPTER_TYPE_D:
4080
arcmsr_get_hbd_config(acb);
4081
break;
4082
case ACB_ADAPTER_TYPE_E:
4083
arcmsr_get_hbe_config(acb);
4084
break;
4085
case ACB_ADAPTER_TYPE_F:
4086
arcmsr_get_hbf_config(acb);
4087
break;
4088
}
4089
}
4090
/*
4091
**********************************************************************
4092
**********************************************************************
4093
*/
4094
static void arcmsr_wait_firmware_ready( struct AdapterControlBlock *acb)
4095
{
4096
int timeout=0;
4097
4098
switch (acb->adapter_type) {
4099
case ACB_ADAPTER_TYPE_A: {
4100
while ((CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0)
4101
{
4102
if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4103
{
4104
printf( "arcmsr%d:timed out waiting for firmware \n", acb->pci_unit);
4105
return;
4106
}
4107
UDELAY(15000); /* wait 15 milli-seconds */
4108
}
4109
}
4110
break;
4111
case ACB_ADAPTER_TYPE_B: {
4112
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4113
while ((READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & ARCMSR_MESSAGE_FIRMWARE_OK) == 0)
4114
{
4115
if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4116
{
4117
printf( "arcmsr%d: timed out waiting for firmware \n", acb->pci_unit);
4118
return;
4119
}
4120
UDELAY(15000); /* wait 15 milli-seconds */
4121
}
4122
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
4123
}
4124
break;
4125
case ACB_ADAPTER_TYPE_C: {
4126
while ((CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0)
4127
{
4128
if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4129
{
4130
printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
4131
return;
4132
}
4133
UDELAY(15000); /* wait 15 milli-seconds */
4134
}
4135
}
4136
break;
4137
case ACB_ADAPTER_TYPE_D: {
4138
while ((CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBDMU_MESSAGE_FIRMWARE_OK) == 0)
4139
{
4140
if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4141
{
4142
printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
4143
return;
4144
}
4145
UDELAY(15000); /* wait 15 milli-seconds */
4146
}
4147
}
4148
break;
4149
case ACB_ADAPTER_TYPE_E:
4150
case ACB_ADAPTER_TYPE_F: {
4151
while ((CHIP_REG_READ32(HBE_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0)
4152
{
4153
if (timeout++ > 4000) /* (4000*15)/1000 = 60 sec */
4154
{
4155
printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
4156
return;
4157
}
4158
UDELAY(15000); /* wait 15 milli-seconds */
4159
}
4160
}
4161
break;
4162
}
4163
}
4164
/*
4165
**********************************************************************
4166
**********************************************************************
4167
*/
4168
static void arcmsr_clear_doorbell_queue_buffer( struct AdapterControlBlock *acb)
4169
{
4170
u_int32_t outbound_doorbell;
4171
4172
switch (acb->adapter_type) {
4173
case ACB_ADAPTER_TYPE_A: {
4174
/* empty doorbell Qbuffer if door bell ringed */
4175
outbound_doorbell = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_doorbell);
4176
CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_doorbell, outbound_doorbell); /*clear doorbell interrupt */
4177
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
4178
}
4179
break;
4180
case ACB_ADAPTER_TYPE_B: {
4181
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4182
WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN);/*clear interrupt and message state*/
4183
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
4184
/* let IOP know data has been read */
4185
}
4186
break;
4187
case ACB_ADAPTER_TYPE_C: {
4188
/* empty doorbell Qbuffer if door bell ringed */
4189
outbound_doorbell = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
4190
CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell); /*clear doorbell interrupt */
4191
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
4192
CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell_clear); /* Dummy read to force pci flush */
4193
CHIP_REG_READ32(HBC_MessageUnit, 0, inbound_doorbell); /* Dummy read to force pci flush */
4194
}
4195
break;
4196
case ACB_ADAPTER_TYPE_D: {
4197
/* empty doorbell Qbuffer if door bell ringed */
4198
outbound_doorbell = CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell);
4199
CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, outbound_doorbell); /*clear doorbell interrupt */
4200
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, ARCMSR_HBDMU_DRV2IOP_DATA_OUT_READ);
4201
}
4202
break;
4203
case ACB_ADAPTER_TYPE_E:
4204
case ACB_ADAPTER_TYPE_F: {
4205
/* empty doorbell Qbuffer if door bell ringed */
4206
acb->in_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
4207
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0); /*clear doorbell interrupt */
4208
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
4209
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4210
}
4211
break;
4212
}
4213
}
4214
/*
4215
************************************************************************
4216
************************************************************************
4217
*/
4218
static u_int32_t arcmsr_iop_confirm(struct AdapterControlBlock *acb)
4219
{
4220
unsigned long srb_phyaddr;
4221
u_int32_t srb_phyaddr_hi32;
4222
u_int32_t srb_phyaddr_lo32;
4223
4224
/*
4225
********************************************************************
4226
** here we need to tell iop 331 our freesrb.HighPart
4227
** if freesrb.HighPart is not zero
4228
********************************************************************
4229
*/
4230
srb_phyaddr = (unsigned long) acb->srb_phyaddr.phyaddr;
4231
srb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
4232
srb_phyaddr_lo32 = acb->srb_phyaddr.B.phyadd_low;
4233
switch (acb->adapter_type) {
4234
case ACB_ADAPTER_TYPE_A: {
4235
if(srb_phyaddr_hi32 != 0) {
4236
CHIP_REG_WRITE32(HBA_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
4237
CHIP_REG_WRITE32(HBA_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
4238
CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4239
if(!arcmsr_hba_wait_msgint_ready(acb)) {
4240
printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4241
return FALSE;
4242
}
4243
}
4244
}
4245
break;
4246
/*
4247
***********************************************************************
4248
** if adapter type B, set window of "post command Q"
4249
***********************************************************************
4250
*/
4251
case ACB_ADAPTER_TYPE_B: {
4252
u_int32_t post_queue_phyaddr;
4253
struct HBB_MessageUnit *phbbmu;
4254
4255
phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4256
phbbmu->postq_index = 0;
4257
phbbmu->doneq_index = 0;
4258
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_SET_POST_WINDOW);
4259
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4260
printf( "arcmsr%d: 'set window of post command Q' timeout\n", acb->pci_unit);
4261
return FALSE;
4262
}
4263
post_queue_phyaddr = srb_phyaddr + ARCMSR_SRBS_POOL_SIZE
4264
+ offsetof(struct HBB_MessageUnit, post_qbuffer);
4265
CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG); /* driver "set config" signature */
4266
CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1], srb_phyaddr_hi32); /* normal should be zero */
4267
CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2], post_queue_phyaddr); /* postQ size (256+8)*4 */
4268
CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3], post_queue_phyaddr+1056); /* doneQ size (256+8)*4 */
4269
CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4], 1056); /* srb maxQ size must be --> [(256+8)*4] */
4270
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_SET_CONFIG);
4271
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4272
printf( "arcmsr%d: 'set command Q window' timeout \n", acb->pci_unit);
4273
return FALSE;
4274
}
4275
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_START_DRIVER_MODE);
4276
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4277
printf( "arcmsr%d: 'start diver mode' timeout \n", acb->pci_unit);
4278
return FALSE;
4279
}
4280
}
4281
break;
4282
case ACB_ADAPTER_TYPE_C: {
4283
if(srb_phyaddr_hi32 != 0) {
4284
CHIP_REG_WRITE32(HBC_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
4285
CHIP_REG_WRITE32(HBC_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
4286
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4287
CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
4288
if(!arcmsr_hbc_wait_msgint_ready(acb)) {
4289
printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4290
return FALSE;
4291
}
4292
}
4293
}
4294
break;
4295
case ACB_ADAPTER_TYPE_D: {
4296
u_int32_t post_queue_phyaddr, done_queue_phyaddr;
4297
struct HBD_MessageUnit0 *phbdmu;
4298
4299
phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
4300
phbdmu->postq_index = 0;
4301
phbdmu->doneq_index = 0x40FF;
4302
post_queue_phyaddr = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE
4303
+ offsetof(struct HBD_MessageUnit0, post_qbuffer);
4304
done_queue_phyaddr = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE
4305
+ offsetof(struct HBD_MessageUnit0, done_qbuffer);
4306
CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG); /* driver "set config" signature */
4307
CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
4308
CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[2], post_queue_phyaddr); /* postQ base */
4309
CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[3], done_queue_phyaddr); /* doneQ base */
4310
CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[4], 0x100);
4311
CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4312
if(!arcmsr_hbd_wait_msgint_ready(acb)) {
4313
printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4314
return FALSE;
4315
}
4316
}
4317
break;
4318
case ACB_ADAPTER_TYPE_E: {
4319
u_int32_t cdb_phyaddr_lo32;
4320
cdb_phyaddr_lo32 = srb_phyaddr_lo32 + offsetof(struct CommandControlBlock, arcmsr_cdb);
4321
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
4322
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[1], ARCMSR_SIGNATURE_1884);
4323
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[2], cdb_phyaddr_lo32);
4324
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[3], srb_phyaddr_hi32);
4325
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[4], SRB_SIZE);
4326
cdb_phyaddr_lo32 = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE;
4327
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[5], cdb_phyaddr_lo32);
4328
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[6], srb_phyaddr_hi32);
4329
CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[7], COMPLETION_Q_POOL_SIZE);
4330
CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4331
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
4332
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4333
if(!arcmsr_hbe_wait_msgint_ready(acb)) {
4334
printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4335
return FALSE;
4336
}
4337
}
4338
break;
4339
case ACB_ADAPTER_TYPE_F: {
4340
u_int32_t cdb_phyaddr_lo32;
4341
cdb_phyaddr_lo32 = srb_phyaddr_lo32 + offsetof(struct CommandControlBlock, arcmsr_cdb);
4342
acb->msgcode_rwbuffer[0] = ARCMSR_SIGNATURE_SET_CONFIG;
4343
acb->msgcode_rwbuffer[1] = ARCMSR_SIGNATURE_1886;
4344
acb->msgcode_rwbuffer[2] = cdb_phyaddr_lo32;
4345
acb->msgcode_rwbuffer[3] = srb_phyaddr_hi32;
4346
acb->msgcode_rwbuffer[4] = SRB_SIZE;
4347
cdb_phyaddr_lo32 = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE;
4348
acb->msgcode_rwbuffer[5] = cdb_phyaddr_lo32;
4349
acb->msgcode_rwbuffer[6] = srb_phyaddr_hi32;
4350
acb->msgcode_rwbuffer[7] = COMPLETION_Q_POOL_SIZE;
4351
if (acb->xor_mega) {
4352
acb->msgcode_rwbuffer[8] = 0x555AA; //FreeBSD init 2
4353
acb->msgcode_rwbuffer[9] = 0;
4354
acb->msgcode_rwbuffer[10] = (uint32_t)acb->xor_sgtable_phy;
4355
acb->msgcode_rwbuffer[11] = (uint32_t)((acb->xor_sgtable_phy >> 16) >> 16);
4356
}
4357
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4358
acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
4359
CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4360
if(!arcmsr_hbe_wait_msgint_ready(acb)) {
4361
printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4362
return FALSE;
4363
}
4364
}
4365
break;
4366
}
4367
return (TRUE);
4368
}
4369
/*
4370
************************************************************************
4371
************************************************************************
4372
*/
4373
static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb)
4374
{
4375
if (acb->adapter_type == ACB_ADAPTER_TYPE_B)
4376
{
4377
struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4378
WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_ACTIVE_EOI_MODE);
4379
if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4380
printf( "arcmsr%d: 'iop enable eoi mode' timeout \n", acb->pci_unit);
4381
return;
4382
}
4383
}
4384
}
4385
/*
4386
**********************************************************************
4387
**********************************************************************
4388
*/
4389
static void arcmsr_iop_init(struct AdapterControlBlock *acb)
4390
{
4391
u_int32_t intmask_org;
4392
4393
/* disable all outbound interrupt */
4394
intmask_org = arcmsr_disable_allintr(acb);
4395
arcmsr_wait_firmware_ready(acb);
4396
arcmsr_iop_confirm(acb);
4397
arcmsr_get_firmware_spec(acb);
4398
/*start background rebuild*/
4399
arcmsr_start_adapter_bgrb(acb);
4400
/* empty doorbell Qbuffer if door bell ringed */
4401
arcmsr_clear_doorbell_queue_buffer(acb);
4402
arcmsr_enable_eoi_mode(acb);
4403
/* enable outbound Post Queue, outbound doorbell Interrupt */
4404
arcmsr_enable_allintr(acb, intmask_org);
4405
acb->acb_flags |= ACB_F_IOP_INITED;
4406
}
4407
/*
4408
**********************************************************************
4409
**********************************************************************
4410
*/
4411
static void arcmsr_map_free_srb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
4412
{
4413
struct AdapterControlBlock *acb = arg;
4414
struct CommandControlBlock *srb_tmp;
4415
u_int32_t i;
4416
unsigned long srb_phyaddr = (unsigned long)segs->ds_addr;
4417
4418
acb->srb_phyaddr.phyaddr = srb_phyaddr;
4419
srb_tmp = (struct CommandControlBlock *)acb->uncacheptr;
4420
for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
4421
if(bus_dmamap_create(acb->dm_segs_dmat,
4422
/*flags*/0, &srb_tmp->dm_segs_dmamap) != 0) {
4423
acb->acb_flags |= ACB_F_MAPFREESRB_FAILD;
4424
printf("arcmsr%d:"
4425
" srb dmamap bus_dmamap_create error\n", acb->pci_unit);
4426
return;
4427
}
4428
if((acb->adapter_type == ACB_ADAPTER_TYPE_C) || (acb->adapter_type == ACB_ADAPTER_TYPE_D)
4429
|| (acb->adapter_type == ACB_ADAPTER_TYPE_E) || (acb->adapter_type == ACB_ADAPTER_TYPE_F))
4430
{
4431
srb_tmp->cdb_phyaddr = srb_phyaddr;
4432
}
4433
else
4434
srb_tmp->cdb_phyaddr = srb_phyaddr >> 5;
4435
srb_tmp->acb = acb;
4436
srb_tmp->smid = i << 16;
4437
acb->srbworkingQ[i] = acb->psrb_pool[i] = srb_tmp;
4438
srb_phyaddr = srb_phyaddr + SRB_SIZE;
4439
srb_tmp = (struct CommandControlBlock *)((unsigned long)srb_tmp + SRB_SIZE);
4440
}
4441
srb_tmp = (struct CommandControlBlock *)(acb->uncacheptr + ARCMSR_SRBS_POOL_SIZE);
4442
srb_phyaddr = (unsigned long)segs->ds_addr + ARCMSR_SRBS_POOL_SIZE;
4443
switch (acb->adapter_type) {
4444
case ACB_ADAPTER_TYPE_B: {
4445
struct HBB_MessageUnit *phbbmu;
4446
4447
acb->pmu = (struct MessageUnit_UNION *)srb_tmp;
4448
phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4449
phbbmu->hbb_doorbell = (struct HBB_DOORBELL *)acb->mem_base0;
4450
phbbmu->hbb_rwbuffer = (struct HBB_RWBUFFER *)acb->mem_base1;
4451
if (acb->vendor_device_id == PCIDevVenIDARC1203) {
4452
phbbmu->drv2iop_doorbell = offsetof(struct HBB_DOORBELL_1203, drv2iop_doorbell);
4453
phbbmu->drv2iop_doorbell_mask = offsetof(struct HBB_DOORBELL_1203, drv2iop_doorbell_mask);
4454
phbbmu->iop2drv_doorbell = offsetof(struct HBB_DOORBELL_1203, iop2drv_doorbell);
4455
phbbmu->iop2drv_doorbell_mask = offsetof(struct HBB_DOORBELL_1203, iop2drv_doorbell_mask);
4456
} else {
4457
phbbmu->drv2iop_doorbell = offsetof(struct HBB_DOORBELL, drv2iop_doorbell);
4458
phbbmu->drv2iop_doorbell_mask = offsetof(struct HBB_DOORBELL, drv2iop_doorbell_mask);
4459
phbbmu->iop2drv_doorbell = offsetof(struct HBB_DOORBELL, iop2drv_doorbell);
4460
phbbmu->iop2drv_doorbell_mask = offsetof(struct HBB_DOORBELL, iop2drv_doorbell_mask);
4461
}
4462
}
4463
break;
4464
case ACB_ADAPTER_TYPE_D:
4465
acb->pmu = (struct MessageUnit_UNION *)srb_tmp;
4466
acb->pmu->muu.hbdmu.phbdmu = (struct HBD_MessageUnit *)acb->mem_base0;
4467
break;
4468
case ACB_ADAPTER_TYPE_E:
4469
acb->pCompletionQ = (pCompletion_Q)srb_tmp;
4470
break;
4471
case ACB_ADAPTER_TYPE_F: {
4472
unsigned long host_buffer_dma;
4473
acb->pCompletionQ = (pCompletion_Q)srb_tmp;
4474
acb->completeQ_phys = srb_phyaddr;
4475
memset(acb->pCompletionQ, 0xff, COMPLETION_Q_POOL_SIZE);
4476
acb->message_wbuffer = (u_int32_t *)((unsigned long)acb->pCompletionQ + COMPLETION_Q_POOL_SIZE);
4477
acb->message_rbuffer = (u_int32_t *)((unsigned long)acb->message_wbuffer + 0x100);
4478
acb->msgcode_rwbuffer = (u_int32_t *)((unsigned long)acb->message_wbuffer + 0x200);
4479
memset((void *)acb->message_wbuffer, 0, MESG_RW_BUFFER_SIZE);
4480
arcmsr_wait_firmware_ready(acb);
4481
host_buffer_dma = acb->completeQ_phys + COMPLETION_Q_POOL_SIZE;
4482
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, (u_int32_t)(host_buffer_dma | 1)); /* host buffer low addr, bit0:1 all buffer active */
4483
CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr1, (u_int32_t)((host_buffer_dma >> 16) >> 16));/* host buffer high addr */
4484
CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, ARCMSR_HBFMU_DOORBELL_SYNC1); /* set host buffer physical address */
4485
acb->firm_PicStatus = CHIP_REG_READ32(HBF_MessageUnit, 0, outbound_msgaddr1); /* get firmware spec info */
4486
break;
4487
}
4488
}
4489
acb->vir2phy_offset = (unsigned long)srb_tmp - (unsigned long)srb_phyaddr;
4490
}
4491
4492
static void arcmsr_map_xor_sgtable(void *arg, bus_dma_segment_t *segs, int nseg, int error)
4493
{
4494
struct AdapterControlBlock *acb = arg;
4495
4496
acb->xor_sgtable_phy = (unsigned long)segs->ds_addr;
4497
if ((nseg != 1) || ((u_int32_t)segs->ds_len != acb->init2cfg_size)) {
4498
acb->acb_flags |= ACB_F_MAPXOR_FAILD;
4499
printf("arcmsr%d: alloc xor table seg num or size not as i wish!\n", acb->pci_unit);
4500
return;
4501
}
4502
}
4503
4504
static void arcmsr_map_xor_sg(void *arg, bus_dma_segment_t *segs, int nseg, int error)
4505
{
4506
struct AdapterControlBlock *acb = arg;
4507
int i;
4508
struct HostRamBuf *pRamBuf;
4509
struct XorSg *pxortable = (struct XorSg *)(acb->xortable + sizeof(struct HostRamBuf));
4510
4511
if (nseg != acb->xor_mega) {
4512
acb->acb_flags |= ACB_F_MAPXOR_FAILD;
4513
printf("arcmsr%d: alloc xor seg NUM not as i wish!\n", acb->pci_unit);
4514
return;
4515
}
4516
for (i = 0; i < nseg; i++) {
4517
if ((u_int32_t)segs->ds_len != ARCMSR_XOR_SEG_SIZE) {
4518
acb->acb_flags |= ACB_F_MAPXOR_FAILD;
4519
printf("arcmsr%d: alloc xor seg SIZE not as i wish!\n", acb->pci_unit);
4520
return;
4521
}
4522
pxortable->xorPhys = (u_int64_t)segs->ds_addr;
4523
pxortable->xorBufLen = (u_int64_t)segs->ds_len;
4524
pxortable++;
4525
segs++;
4526
}
4527
pRamBuf = (struct HostRamBuf *)acb->xortable;
4528
pRamBuf->hrbSignature = 0x53425248; //HRBS
4529
pRamBuf->hrbSize = ARCMSR_XOR_SEG_SIZE * nseg;
4530
pRamBuf->hrbRes[0] = 0;
4531
pRamBuf->hrbRes[1] = 0;
4532
bus_dmamap_sync(acb->xortable_dmat, acb->xortable_dmamap, BUS_DMASYNC_PREREAD);
4533
bus_dmamap_sync(acb->xor_dmat, acb->xor_dmamap, BUS_DMASYNC_PREWRITE);
4534
}
4535
4536
/*
4537
************************************************************************
4538
************************************************************************
4539
*/
4540
static void arcmsr_free_resource(struct AdapterControlBlock *acb)
4541
{
4542
/* remove the control device */
4543
if(acb->ioctl_dev != NULL) {
4544
destroy_dev(acb->ioctl_dev);
4545
}
4546
if (acb->acb_flags & ACB_F_DMAMAP_SG)
4547
bus_dmamap_unload(acb->xor_dmat, acb->xor_dmamap);
4548
if (acb->xor_dmamap) {
4549
bus_dmamem_free(acb->xor_dmat, acb->xorptr, acb->xor_dmamap);
4550
}
4551
if (acb->acb_flags & ACB_F_DMAMAP_SGTABLE)
4552
bus_dmamap_unload(acb->xortable_dmat, acb->xortable_dmamap);
4553
if (acb->xortable_dmamap) {
4554
bus_dmamem_free(acb->xortable_dmat, acb->xortable, acb->xortable_dmamap);
4555
}
4556
if (acb->acb_flags & ACB_F_DMAMAP_SRB)
4557
bus_dmamap_unload(acb->srb_dmat, acb->srb_dmamap);
4558
if (acb->srb_dmamap) {
4559
bus_dmamem_free(acb->srb_dmat, acb->uncacheptr, acb->srb_dmamap);
4560
}
4561
if (acb->srb_dmat)
4562
bus_dma_tag_destroy(acb->srb_dmat);
4563
if (acb->dm_segs_dmat)
4564
bus_dma_tag_destroy(acb->dm_segs_dmat);
4565
if (acb->parent_dmat)
4566
bus_dma_tag_destroy(acb->parent_dmat);
4567
switch(acb->adapter_type) {
4568
case ACB_ADAPTER_TYPE_A:
4569
if (acb->sys_res_arcmsr[0])
4570
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(0), acb->sys_res_arcmsr[0]);
4571
break;
4572
case ACB_ADAPTER_TYPE_B:
4573
if (acb->sys_res_arcmsr[0])
4574
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(0), acb->sys_res_arcmsr[0]);
4575
if (acb->sys_res_arcmsr[1])
4576
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(2), acb->sys_res_arcmsr[1]);
4577
break;
4578
case ACB_ADAPTER_TYPE_C:
4579
if (acb->sys_res_arcmsr[0])
4580
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(1), acb->sys_res_arcmsr[0]);
4581
break;
4582
case ACB_ADAPTER_TYPE_D:
4583
if (acb->sys_res_arcmsr[0])
4584
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(0), acb->sys_res_arcmsr[0]);
4585
break;
4586
case ACB_ADAPTER_TYPE_E:
4587
if (acb->sys_res_arcmsr[0])
4588
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(1), acb->sys_res_arcmsr[0]);
4589
break;
4590
case ACB_ADAPTER_TYPE_F:
4591
if (acb->sys_res_arcmsr[0])
4592
bus_release_resource(acb->pci_dev, SYS_RES_MEMORY, PCIR_BAR(0), acb->sys_res_arcmsr[0]);
4593
break;
4594
}
4595
}
4596
/*
4597
************************************************************************
4598
************************************************************************
4599
*/
4600
static void arcmsr_mutex_init(struct AdapterControlBlock *acb)
4601
{
4602
ARCMSR_LOCK_INIT(&acb->isr_lock, "arcmsr isr lock");
4603
ARCMSR_LOCK_INIT(&acb->srb_lock, "arcmsr srb lock");
4604
ARCMSR_LOCK_INIT(&acb->postDone_lock, "arcmsr postQ lock");
4605
ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr RW buffer lock");
4606
}
4607
/*
4608
************************************************************************
4609
************************************************************************
4610
*/
4611
static void arcmsr_mutex_destroy(struct AdapterControlBlock *acb)
4612
{
4613
ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
4614
ARCMSR_LOCK_DESTROY(&acb->postDone_lock);
4615
ARCMSR_LOCK_DESTROY(&acb->srb_lock);
4616
ARCMSR_LOCK_DESTROY(&acb->isr_lock);
4617
}
4618
/*
4619
************************************************************************
4620
************************************************************************
4621
*/
4622
static int arcmsr_define_adapter_type(struct AdapterControlBlock *acb)
4623
{
4624
int rc = 0;
4625
4626
switch (acb->vendor_device_id) {
4627
case PCIDevVenIDARC1880:
4628
case PCIDevVenIDARC1882:
4629
case PCIDevVenIDARC1883:
4630
case PCIDevVenIDARC1213:
4631
case PCIDevVenIDARC1223: {
4632
acb->adapter_type = ACB_ADAPTER_TYPE_C;
4633
if ((acb->sub_device_id == ARECA_SUB_DEV_ID_1883) ||
4634
(acb->sub_device_id == ARECA_SUB_DEV_ID_1216) ||
4635
(acb->sub_device_id == ARECA_SUB_DEV_ID_1226))
4636
acb->adapter_bus_speed = ACB_BUS_SPEED_12G;
4637
else
4638
acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
4639
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE;
4640
}
4641
break;
4642
case PCIDevVenIDARC1884:
4643
acb->adapter_type = ACB_ADAPTER_TYPE_E;
4644
acb->adapter_bus_speed = ACB_BUS_SPEED_12G;
4645
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE + COMPLETION_Q_POOL_SIZE;
4646
acb->completionQ_entry = COMPLETION_Q_POOL_SIZE / sizeof(struct deliver_completeQ);
4647
break;
4648
case PCIDevVenIDARC1886_0:
4649
case PCIDevVenIDARC1886_:
4650
case PCIDevVenIDARC1886:
4651
acb->adapter_type = ACB_ADAPTER_TYPE_F;
4652
acb->adapter_bus_speed = ACB_BUS_SPEED_12G;
4653
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE + COMPLETION_Q_POOL_SIZE + MESG_RW_BUFFER_SIZE;
4654
acb->completionQ_entry = COMPLETION_Q_POOL_SIZE / sizeof(struct deliver_completeQ);
4655
break;
4656
case PCIDevVenIDARC1214:
4657
case PCIDevVenIDARC1224: {
4658
acb->adapter_type = ACB_ADAPTER_TYPE_D;
4659
acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
4660
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE + (sizeof(struct HBD_MessageUnit0));
4661
}
4662
break;
4663
case PCIDevVenIDARC1200:
4664
case PCIDevVenIDARC1201: {
4665
acb->adapter_type = ACB_ADAPTER_TYPE_B;
4666
acb->adapter_bus_speed = ACB_BUS_SPEED_3G;
4667
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE + (sizeof(struct HBB_MessageUnit));
4668
}
4669
break;
4670
case PCIDevVenIDARC1203: {
4671
acb->adapter_type = ACB_ADAPTER_TYPE_B;
4672
acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
4673
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE + (sizeof(struct HBB_MessageUnit));
4674
}
4675
break;
4676
case PCIDevVenIDARC1110:
4677
case PCIDevVenIDARC1120:
4678
case PCIDevVenIDARC1130:
4679
case PCIDevVenIDARC1160:
4680
case PCIDevVenIDARC1170:
4681
case PCIDevVenIDARC1210:
4682
case PCIDevVenIDARC1220:
4683
case PCIDevVenIDARC1230:
4684
case PCIDevVenIDARC1231:
4685
case PCIDevVenIDARC1260:
4686
case PCIDevVenIDARC1261:
4687
case PCIDevVenIDARC1270:
4688
case PCIDevVenIDARC1280:
4689
case PCIDevVenIDARC1212:
4690
case PCIDevVenIDARC1222:
4691
case PCIDevVenIDARC1380:
4692
case PCIDevVenIDARC1381:
4693
case PCIDevVenIDARC1680:
4694
case PCIDevVenIDARC1681: {
4695
acb->adapter_type = ACB_ADAPTER_TYPE_A;
4696
acb->adapter_bus_speed = ACB_BUS_SPEED_3G;
4697
acb->max_coherent_size = ARCMSR_SRBS_POOL_SIZE;
4698
}
4699
break;
4700
default: {
4701
printf("arcmsr%d:"
4702
" unknown RAID adapter type \n", acb->pci_unit);
4703
rc = ENOMEM;
4704
}
4705
}
4706
return rc;
4707
}
4708
4709
static int arcmsr_map_pcireg(device_t dev, struct AdapterControlBlock *acb)
4710
{
4711
switch(acb->adapter_type) {
4712
case ACB_ADAPTER_TYPE_A: {
4713
u_int32_t rid0 = PCIR_BAR(0);
4714
vm_offset_t mem_base0;
4715
4716
acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev,SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4717
if(acb->sys_res_arcmsr[0] == NULL) {
4718
arcmsr_free_resource(acb);
4719
printf("arcmsr%d: bus_alloc_resource failure!\n", acb->pci_unit);
4720
return ENOMEM;
4721
}
4722
if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4723
arcmsr_free_resource(acb);
4724
printf("arcmsr%d: rman_get_start failure!\n", acb->pci_unit);
4725
return ENXIO;
4726
}
4727
mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4728
if(mem_base0 == 0) {
4729
arcmsr_free_resource(acb);
4730
printf("arcmsr%d: rman_get_virtual failure!\n", acb->pci_unit);
4731
return ENXIO;
4732
}
4733
acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4734
acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4735
acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4736
acb->rid[0] = rid0;
4737
}
4738
break;
4739
case ACB_ADAPTER_TYPE_B: {
4740
u_int32_t rid[]={ PCIR_BAR(0), PCIR_BAR(2) };
4741
vm_offset_t mem_base[]={0,0};
4742
u_int16_t i;
4743
4744
for(i=0; i < 2; i++) {
4745
acb->sys_res_arcmsr[i] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid[i], RF_ACTIVE);
4746
if(acb->sys_res_arcmsr[i] == NULL) {
4747
arcmsr_free_resource(acb);
4748
printf("arcmsr%d: bus_alloc_resource %d failure!\n", acb->pci_unit, i);
4749
return ENOMEM;
4750
}
4751
if(rman_get_start(acb->sys_res_arcmsr[i]) <= 0) {
4752
arcmsr_free_resource(acb);
4753
printf("arcmsr%d: rman_get_start %d failure!\n", acb->pci_unit, i);
4754
return ENXIO;
4755
}
4756
mem_base[i] = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[i]);
4757
if(mem_base[i] == 0) {
4758
arcmsr_free_resource(acb);
4759
printf("arcmsr%d: rman_get_virtual %d failure!\n", acb->pci_unit, i);
4760
return ENXIO;
4761
}
4762
acb->btag[i] = rman_get_bustag(acb->sys_res_arcmsr[i]);
4763
acb->bhandle[i] = rman_get_bushandle(acb->sys_res_arcmsr[i]);
4764
}
4765
acb->mem_base0 = mem_base[0];
4766
acb->mem_base1 = mem_base[1];
4767
acb->rid[0] = rid[0];
4768
acb->rid[1] = rid[1];
4769
}
4770
break;
4771
case ACB_ADAPTER_TYPE_C: {
4772
u_int32_t rid0 = PCIR_BAR(1);
4773
vm_offset_t mem_base0;
4774
4775
acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4776
if(acb->sys_res_arcmsr[0] == NULL) {
4777
arcmsr_free_resource(acb);
4778
printf("arcmsr%d: bus_alloc_resource failure!\n", acb->pci_unit);
4779
return ENOMEM;
4780
}
4781
if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4782
arcmsr_free_resource(acb);
4783
printf("arcmsr%d: rman_get_start failure!\n", acb->pci_unit);
4784
return ENXIO;
4785
}
4786
mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4787
if(mem_base0 == 0) {
4788
arcmsr_free_resource(acb);
4789
printf("arcmsr%d: rman_get_virtual failure!\n", acb->pci_unit);
4790
return ENXIO;
4791
}
4792
acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4793
acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4794
acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4795
acb->rid[0] = rid0;
4796
}
4797
break;
4798
case ACB_ADAPTER_TYPE_D: {
4799
u_int32_t rid0 = PCIR_BAR(0);
4800
vm_offset_t mem_base0;
4801
4802
acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4803
if(acb->sys_res_arcmsr[0] == NULL) {
4804
arcmsr_free_resource(acb);
4805
printf("arcmsr%d: bus_alloc_resource failure!\n", acb->pci_unit);
4806
return ENOMEM;
4807
}
4808
if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4809
arcmsr_free_resource(acb);
4810
printf("arcmsr%d: rman_get_start failure!\n", acb->pci_unit);
4811
return ENXIO;
4812
}
4813
mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4814
if(mem_base0 == 0) {
4815
arcmsr_free_resource(acb);
4816
printf("arcmsr%d: rman_get_virtual failure!\n", acb->pci_unit);
4817
return ENXIO;
4818
}
4819
acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4820
acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4821
acb->mem_base0 = mem_base0;
4822
acb->rid[0] = rid0;
4823
}
4824
break;
4825
case ACB_ADAPTER_TYPE_E: {
4826
u_int32_t rid0 = PCIR_BAR(1);
4827
vm_offset_t mem_base0;
4828
4829
acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4830
if(acb->sys_res_arcmsr[0] == NULL) {
4831
arcmsr_free_resource(acb);
4832
printf("arcmsr%d: bus_alloc_resource failure!\n", acb->pci_unit);
4833
return ENOMEM;
4834
}
4835
if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4836
arcmsr_free_resource(acb);
4837
printf("arcmsr%d: rman_get_start failure!\n", acb->pci_unit);
4838
return ENXIO;
4839
}
4840
mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4841
if(mem_base0 == 0) {
4842
arcmsr_free_resource(acb);
4843
printf("arcmsr%d: rman_get_virtual failure!\n", acb->pci_unit);
4844
return ENXIO;
4845
}
4846
acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4847
acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4848
acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4849
acb->doneq_index = 0;
4850
acb->in_doorbell = 0;
4851
acb->out_doorbell = 0;
4852
acb->rid[0] = rid0;
4853
CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0); /*clear interrupt*/
4854
CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, ARCMSR_HBEMU_DOORBELL_SYNC); /* synchronize doorbell to 0 */
4855
}
4856
break;
4857
case ACB_ADAPTER_TYPE_F: {
4858
u_int32_t rid0 = PCIR_BAR(0);
4859
vm_offset_t mem_base0;
4860
4861
acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4862
if(acb->sys_res_arcmsr[0] == NULL) {
4863
arcmsr_free_resource(acb);
4864
printf("arcmsr%d: bus_alloc_resource failure!\n", acb->pci_unit);
4865
return ENOMEM;
4866
}
4867
if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4868
arcmsr_free_resource(acb);
4869
printf("arcmsr%d: rman_get_start failure!\n", acb->pci_unit);
4870
return ENXIO;
4871
}
4872
mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4873
if(mem_base0 == 0) {
4874
arcmsr_free_resource(acb);
4875
printf("arcmsr%d: rman_get_virtual failure!\n", acb->pci_unit);
4876
return ENXIO;
4877
}
4878
acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4879
acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4880
acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4881
acb->doneq_index = 0;
4882
acb->in_doorbell = 0;
4883
acb->out_doorbell = 0;
4884
acb->rid[0] = rid0;
4885
CHIP_REG_WRITE32(HBF_MessageUnit, 0, host_int_status, 0); /*clear interrupt*/
4886
CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, ARCMSR_HBEMU_DOORBELL_SYNC); /* synchronize doorbell to 0 */
4887
}
4888
break;
4889
}
4890
return (0);
4891
}
4892
4893
static int arcmsr_alloc_srb(device_t dev, struct AdapterControlBlock *acb)
4894
{
4895
int rc;
4896
4897
if(bus_dma_tag_create( /*PCI parent*/ bus_get_dma_tag(dev),
4898
/*alignemnt*/ 1,
4899
/*boundary*/ 0,
4900
/*lowaddr*/ BUS_SPACE_MAXADDR,
4901
/*highaddr*/ BUS_SPACE_MAXADDR,
4902
/*filter*/ NULL,
4903
/*filterarg*/ NULL,
4904
/*maxsize*/ BUS_SPACE_MAXSIZE_32BIT,
4905
/*nsegments*/ BUS_SPACE_UNRESTRICTED,
4906
/*maxsegsz*/ BUS_SPACE_MAXSIZE_32BIT,
4907
/*flags*/ 0,
4908
/*lockfunc*/ NULL,
4909
/*lockarg*/ NULL,
4910
&acb->parent_dmat) != 0)
4911
{
4912
printf("arcmsr%d: parent_dmat bus_dma_tag_create failure!\n", acb->pci_unit);
4913
return ENOMEM;
4914
}
4915
4916
/* Create a single tag describing a region large enough to hold all of the s/g lists we will need. */
4917
if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
4918
/*alignment*/ 1,
4919
/*boundary*/ 0,
4920
#ifdef PAE
4921
/*lowaddr*/ BUS_SPACE_MAXADDR_32BIT,
4922
#else
4923
/*lowaddr*/ BUS_SPACE_MAXADDR,
4924
#endif
4925
/*highaddr*/ BUS_SPACE_MAXADDR,
4926
/*filter*/ NULL,
4927
/*filterarg*/ NULL,
4928
/*maxsize*/ ARCMSR_MAX_SG_ENTRIES * PAGE_SIZE * ARCMSR_MAX_FREESRB_NUM,
4929
/*nsegments*/ ARCMSR_MAX_SG_ENTRIES,
4930
/*maxsegsz*/ BUS_SPACE_MAXSIZE_32BIT,
4931
/*flags*/ 0,
4932
/*lockfunc*/ busdma_lock_mutex,
4933
/*lockarg*/ &acb->isr_lock,
4934
&acb->dm_segs_dmat) != 0)
4935
{
4936
arcmsr_free_resource(acb);
4937
printf("arcmsr%d: dm_segs_dmat bus_dma_tag_create failure!\n", acb->pci_unit);
4938
return ENOMEM;
4939
}
4940
4941
/* DMA tag for our srb structures.... Allocate the freesrb memory */
4942
if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
4943
/*alignment*/ 0x20,
4944
/*boundary*/ 0,
4945
/*lowaddr*/ BUS_SPACE_MAXADDR_32BIT,
4946
/*highaddr*/ BUS_SPACE_MAXADDR,
4947
/*filter*/ NULL,
4948
/*filterarg*/ NULL,
4949
/*maxsize*/ acb->max_coherent_size,
4950
/*nsegments*/ 1,
4951
/*maxsegsz*/ BUS_SPACE_MAXSIZE_32BIT,
4952
/*flags*/ 0,
4953
/*lockfunc*/ NULL,
4954
/*lockarg*/ NULL,
4955
&acb->srb_dmat) != 0)
4956
{
4957
arcmsr_free_resource(acb);
4958
printf("arcmsr%d: srb_dmat bus_dma_tag_create failure!\n", acb->pci_unit);
4959
return ENXIO;
4960
}
4961
/* Allocation for our srbs */
4962
if(bus_dmamem_alloc(acb->srb_dmat, (void **)&acb->uncacheptr, ARCMSR_DMA_ALLOC_FLAG, &acb->srb_dmamap) != 0) {
4963
arcmsr_free_resource(acb);
4964
printf("arcmsr%d: srb_dmat bus_dmamem_alloc failure!\n", acb->pci_unit);
4965
return ENXIO;
4966
}
4967
/* And permanently map them */
4968
rc = bus_dmamap_load(acb->srb_dmat, acb->srb_dmamap, acb->uncacheptr, acb->max_coherent_size, arcmsr_map_free_srb, acb, /*flags*/0);
4969
if((rc != 0) && (rc != EINPROGRESS)) {
4970
arcmsr_free_resource(acb);
4971
printf("arcmsr%d: srb_dmat bus_dmamap_load failure!\n", acb->pci_unit);
4972
return ENXIO;
4973
}
4974
acb->acb_flags |= ACB_F_DMAMAP_SRB;
4975
return (0);
4976
}
4977
4978
static int arcmsr_alloc_xor_mem(device_t dev, struct AdapterControlBlock *acb)
4979
{
4980
int rc, xor_ram;
4981
4982
xor_ram = (acb->firm_PicStatus >> 24) & 0x0f;
4983
acb->xor_mega = (xor_ram - 1) * 32 + 128 + 3;
4984
acb->init2cfg_size = sizeof(struct HostRamBuf) + (sizeof(struct XorSg) * acb->xor_mega);
4985
/* DMA tag for XOR engine of Raid 5,6 */
4986
if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
4987
/*alignment*/ 0x40,
4988
/*boundary*/ 0,
4989
/*lowaddr*/ BUS_SPACE_MAXADDR_32BIT,
4990
/*highaddr*/ BUS_SPACE_MAXADDR,
4991
/*filter*/ NULL,
4992
/*filterarg*/ NULL,
4993
/*maxsize*/ acb->init2cfg_size,
4994
/*nsegments*/ 1,
4995
/*maxsegsz*/ acb->init2cfg_size,
4996
/*flags*/ 0,
4997
/*lockfunc*/ NULL,
4998
/*lockarg*/ NULL,
4999
&acb->xortable_dmat) != 0)
5000
{
5001
arcmsr_free_resource(acb);
5002
printf("arcmsr%d: xor table bus_dma_tag_create failure!\n", acb->pci_unit);
5003
return ENXIO;
5004
}
5005
/* Allocation for xors */
5006
if(bus_dmamem_alloc(acb->xortable_dmat, (void **)&acb->xortable, ARCMSR_DMA_ALLOC_FLAG, &acb->xortable_dmamap) != 0) {
5007
arcmsr_free_resource(acb);
5008
printf("arcmsr%d: xor table bus_dmamem_alloc failure!\n", acb->pci_unit);
5009
return ENXIO;
5010
}
5011
/* And permanently map xor segs */
5012
rc = bus_dmamap_load(acb->xortable_dmat, acb->xortable_dmamap, acb->xortable, acb->init2cfg_size, arcmsr_map_xor_sgtable, acb, /*flags*/0);
5013
if((rc != 0) && (rc != EINPROGRESS)) {
5014
arcmsr_free_resource(acb);
5015
printf("arcmsr%d: xor table bus_dmamap_load failure!\n", acb->pci_unit);
5016
return ENXIO;
5017
}
5018
acb->acb_flags |= ACB_F_DMAMAP_SGTABLE;
5019
5020
/* DMA tag for XOR engine of Raid 5,6 */
5021
if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
5022
/*alignment*/ 0x1000,
5023
/*boundary*/ 0,
5024
/*lowaddr*/ BUS_SPACE_MAXADDR_32BIT,
5025
/*highaddr*/ BUS_SPACE_MAXADDR,
5026
/*filter*/ NULL,
5027
/*filterarg*/ NULL,
5028
/*maxsize*/ (ARCMSR_XOR_SEG_SIZE * acb->xor_mega),
5029
/*nsegments*/ acb->xor_mega,
5030
/*maxsegsz*/ ARCMSR_XOR_SEG_SIZE,
5031
/*flags*/ 0,
5032
/*lockfunc*/ NULL,
5033
/*lockarg*/ NULL,
5034
&acb->xor_dmat) != 0)
5035
{
5036
arcmsr_free_resource(acb);
5037
printf("arcmsr%d: xor bus_dma_tag_create failure!\n", acb->pci_unit);
5038
return ENXIO;
5039
}
5040
/* Allocation for xors */
5041
if(bus_dmamem_alloc(acb->xor_dmat, (void **)&acb->xorptr, ARCMSR_DMA_ALLOC_FLAG, &acb->xor_dmamap) != 0) {
5042
arcmsr_free_resource(acb);
5043
printf("arcmsr%d: xor bus_dmamem_alloc failure!\n", acb->pci_unit);
5044
return ENXIO;
5045
}
5046
/* And permanently map xor segs */
5047
rc = bus_dmamap_load(acb->xor_dmat, acb->xor_dmamap, acb->xorptr, (ARCMSR_XOR_SEG_SIZE * acb->xor_mega), arcmsr_map_xor_sg, acb, /*flags*/0);
5048
if((rc != 0) && (rc != EINPROGRESS)) {
5049
arcmsr_free_resource(acb);
5050
printf("arcmsr%d: xor bus_dmamap_load failure!\n", acb->pci_unit);
5051
return ENXIO;
5052
}
5053
acb->acb_flags |= ACB_F_DMAMAP_SG;
5054
return (0);
5055
}
5056
5057
static u_int32_t arcmsr_initialize(device_t dev)
5058
{
5059
struct AdapterControlBlock *acb = device_get_softc(dev);
5060
int i, j, rc;
5061
u_int32_t vendor_dev_id;
5062
5063
vendor_dev_id = pci_get_devid(dev);
5064
acb->vendor_device_id = vendor_dev_id;
5065
acb->sub_device_id = pci_read_config(dev, PCIR_SUBDEV_0, 2);
5066
rc = arcmsr_define_adapter_type(acb);
5067
if (rc)
5068
return rc;
5069
rc = arcmsr_map_pcireg(dev, acb);
5070
if (rc)
5071
return rc;
5072
rc = arcmsr_alloc_srb(dev, acb);
5073
if (rc)
5074
return rc;
5075
// allocate N times 1 MB physical continuous memory for XOR engine of Raid 5, 6.
5076
if ((acb->firm_PicStatus >> 24) & 0x0f) {
5077
rc = arcmsr_alloc_xor_mem(dev, acb);
5078
if (rc)
5079
return rc;
5080
}
5081
if(acb->acb_flags & (ACB_F_MAPFREESRB_FAILD | ACB_F_MAPXOR_FAILD)) {
5082
arcmsr_free_resource(acb);
5083
printf("arcmsr%d: map free srb or xor buffer failure!\n", acb->pci_unit);
5084
return ENXIO;
5085
}
5086
acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_RQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
5087
acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
5088
/*
5089
********************************************************************
5090
** init raid volume state
5091
********************************************************************
5092
*/
5093
for(i=0; i < ARCMSR_MAX_TARGETID; i++) {
5094
for(j=0; j < ARCMSR_MAX_TARGETLUN; j++) {
5095
acb->devstate[i][j] = ARECA_RAID_GONE;
5096
}
5097
}
5098
arcmsr_iop_init(acb);
5099
return(0);
5100
}
5101
5102
static int arcmsr_setup_msix(struct AdapterControlBlock *acb)
5103
{
5104
int i;
5105
5106
for (i = 0; i < acb->msix_vectors; i++) {
5107
acb->irq_id[i] = 1 + i;
5108
acb->irqres[i] = bus_alloc_resource_any(acb->pci_dev,
5109
SYS_RES_IRQ, &acb->irq_id[i], RF_ACTIVE);
5110
if (acb->irqres[i] == NULL) {
5111
printf("arcmsr: Can't allocate MSI-X resource\n");
5112
goto irq_alloc_failed;
5113
}
5114
if (bus_setup_intr(acb->pci_dev, acb->irqres[i],
5115
INTR_MPSAFE | INTR_TYPE_CAM, NULL, arcmsr_intr_handler,
5116
acb, &acb->ih[i])) {
5117
printf("arcmsr: Cannot set up MSI-X interrupt handler\n");
5118
goto irq_alloc_failed;
5119
}
5120
}
5121
printf("arcmsr: MSI-X INT enabled\n");
5122
acb->acb_flags |= ACB_F_MSIX_ENABLED;
5123
return TRUE;
5124
5125
irq_alloc_failed:
5126
arcmsr_teardown_intr(acb->pci_dev, acb);
5127
return FALSE;
5128
}
5129
5130
/*
5131
************************************************************************
5132
************************************************************************
5133
*/
5134
static int arcmsr_attach(device_t dev)
5135
{
5136
struct make_dev_args args;
5137
struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
5138
u_int32_t unit=device_get_unit(dev);
5139
struct ccb_setasync csa;
5140
struct cam_devq *devq; /* Device Queue to use for this SIM */
5141
struct resource *irqres;
5142
5143
if(acb == NULL) {
5144
printf("arcmsr%d: cannot allocate softc\n", unit);
5145
return (ENOMEM);
5146
}
5147
arcmsr_mutex_init(acb);
5148
acb->pci_dev = dev;
5149
acb->pci_unit = unit;
5150
if(arcmsr_initialize(dev)) {
5151
printf("arcmsr%d: initialize failure!\n", unit);
5152
goto initialize_failed;
5153
}
5154
/* After setting up the adapter, map our interrupt */
5155
acb->msix_vectors = ARCMSR_NUM_MSIX_VECTORS;
5156
if (pci_alloc_msix(dev, &acb->msix_vectors) == 0) {
5157
if (arcmsr_setup_msix(acb) == TRUE)
5158
goto irqx;
5159
}
5160
acb->irq_id[0] = 0;
5161
irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &acb->irq_id[0], RF_SHAREABLE | RF_ACTIVE);
5162
if(irqres == NULL ||
5163
bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY|INTR_MPSAFE, NULL, arcmsr_intr_handler, acb, &acb->ih[0])) {
5164
printf("arcmsr%d: unable to register interrupt handler!\n", unit);
5165
goto setup_intr_failed;
5166
}
5167
acb->irqres[0] = irqres;
5168
irqx:
5169
/*
5170
* Now let the CAM generic SCSI layer find the SCSI devices on
5171
* the bus * start queue to reset to the idle loop. *
5172
* Create device queue of SIM(s) * (MAX_START_JOB - 1) :
5173
* max_sim_transactions
5174
*/
5175
devq = cam_simq_alloc(acb->maxOutstanding);
5176
if(devq == NULL) {
5177
printf("arcmsr%d: cam_simq_alloc failure!\n", unit);
5178
goto simq_alloc_failed;
5179
}
5180
acb->psim = cam_sim_alloc(arcmsr_action, arcmsr_poll, "arcmsr", acb, unit, &acb->isr_lock, 1, ARCMSR_MAX_OUTSTANDING_CMD, devq);
5181
if(acb->psim == NULL) {
5182
printf("arcmsr%d: cam_sim_alloc failure!\n", unit);
5183
goto sim_alloc_failed;
5184
}
5185
ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
5186
if(xpt_bus_register(acb->psim, dev, 0) != CAM_SUCCESS) {
5187
printf("arcmsr%d: xpt_bus_register failure!\n", unit);
5188
goto xpt_bus_failed;
5189
}
5190
if(xpt_create_path(&acb->ppath, /* periph */ NULL, cam_sim_path(acb->psim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
5191
printf("arcmsr%d: xpt_create_path failure!\n", unit);
5192
goto xpt_path_failed;
5193
}
5194
/*
5195
****************************************************
5196
*/
5197
memset(&csa, 0, sizeof(csa));
5198
xpt_setup_ccb(&csa.ccb_h, acb->ppath, /*priority*/5);
5199
csa.ccb_h.func_code = XPT_SASYNC_CB;
5200
csa.event_enable = AC_FOUND_DEVICE|AC_LOST_DEVICE;
5201
csa.callback = arcmsr_async;
5202
csa.callback_arg = acb->psim;
5203
xpt_action((union ccb *)&csa);
5204
ARCMSR_LOCK_RELEASE(&acb->isr_lock);
5205
/* Create the control device. */
5206
make_dev_args_init(&args);
5207
args.mda_devsw = &arcmsr_cdevsw;
5208
args.mda_uid = UID_ROOT;
5209
args.mda_gid = GID_WHEEL /* GID_OPERATOR */;
5210
args.mda_mode = S_IRUSR | S_IWUSR;
5211
args.mda_si_drv1 = acb;
5212
(void)make_dev_s(&args, &acb->ioctl_dev, "arcmsr%d", unit);
5213
5214
(void)make_dev_alias(acb->ioctl_dev, "arc%d", unit);
5215
arcmsr_callout_init(&acb->devmap_callout);
5216
callout_reset(&acb->devmap_callout, 60 * hz, arcmsr_polling_devmap, acb);
5217
return (0);
5218
xpt_path_failed:
5219
xpt_bus_deregister(cam_sim_path(acb->psim));
5220
xpt_bus_failed:
5221
cam_sim_free(acb->psim, /* free_simq */ TRUE);
5222
sim_alloc_failed:
5223
cam_simq_free(devq);
5224
simq_alloc_failed:
5225
arcmsr_teardown_intr(dev, acb);
5226
setup_intr_failed:
5227
arcmsr_free_resource(acb);
5228
initialize_failed:
5229
arcmsr_mutex_destroy(acb);
5230
return ENXIO;
5231
}
5232
5233
/*
5234
************************************************************************
5235
************************************************************************
5236
*/
5237
static int arcmsr_probe(device_t dev)
5238
{
5239
u_int32_t id;
5240
u_int16_t sub_device_id;
5241
char x_type[]={"unknown"};
5242
char *type;
5243
int raid6 = 1;
5244
5245
if (pci_get_vendor(dev) != PCI_VENDOR_ID_ARECA) {
5246
return (ENXIO);
5247
}
5248
sub_device_id = pci_read_config(dev, PCIR_SUBDEV_0, 2);
5249
switch(id = pci_get_devid(dev)) {
5250
case PCIDevVenIDARC1110:
5251
case PCIDevVenIDARC1200:
5252
case PCIDevVenIDARC1201:
5253
case PCIDevVenIDARC1210:
5254
raid6 = 0;
5255
/*FALLTHRU*/
5256
case PCIDevVenIDARC1120:
5257
case PCIDevVenIDARC1130:
5258
case PCIDevVenIDARC1160:
5259
case PCIDevVenIDARC1170:
5260
case PCIDevVenIDARC1220:
5261
case PCIDevVenIDARC1230:
5262
case PCIDevVenIDARC1231:
5263
case PCIDevVenIDARC1260:
5264
case PCIDevVenIDARC1261:
5265
case PCIDevVenIDARC1270:
5266
case PCIDevVenIDARC1280:
5267
type = "SATA 3G";
5268
break;
5269
case PCIDevVenIDARC1212:
5270
case PCIDevVenIDARC1222:
5271
case PCIDevVenIDARC1380:
5272
case PCIDevVenIDARC1381:
5273
case PCIDevVenIDARC1680:
5274
case PCIDevVenIDARC1681:
5275
type = "SAS 3G";
5276
break;
5277
case PCIDevVenIDARC1880:
5278
case PCIDevVenIDARC1882:
5279
case PCIDevVenIDARC1883:
5280
case PCIDevVenIDARC1213:
5281
case PCIDevVenIDARC1223:
5282
if ((sub_device_id == ARECA_SUB_DEV_ID_1883) ||
5283
(sub_device_id == ARECA_SUB_DEV_ID_1216) ||
5284
(sub_device_id == ARECA_SUB_DEV_ID_1226))
5285
type = "SAS 12G,SATA 6G";
5286
else
5287
type = "SAS,SATA 6G";
5288
break;
5289
case PCIDevVenIDARC1884:
5290
type = "SAS 12G";
5291
break;
5292
case PCIDevVenIDARC1886_0:
5293
case PCIDevVenIDARC1886_:
5294
case PCIDevVenIDARC1886:
5295
type = "NVME,SAS-12G,SATA-6G";
5296
break;
5297
case PCIDevVenIDARC1214:
5298
case PCIDevVenIDARC1224:
5299
if ((sub_device_id == ARECA_SUB_DEV_ID_1214) ||
5300
(sub_device_id == ARECA_SUB_DEV_ID_1224))
5301
type = "SAS 6G";
5302
else
5303
type = "SATA 6G";
5304
break;
5305
case PCIDevVenIDARC1203:
5306
type = "SATA 6G";
5307
break;
5308
default:
5309
type = x_type;
5310
raid6 = 0;
5311
break;
5312
}
5313
if(type == x_type)
5314
return(ENXIO);
5315
device_set_descf(dev, "Areca %s Host Adapter RAID Controller %s\n%s\n",
5316
type, raid6 ? "(RAID6 capable)" : "", ARCMSR_DRIVER_VERSION);
5317
return (BUS_PROBE_DEFAULT);
5318
}
5319
/*
5320
************************************************************************
5321
************************************************************************
5322
*/
5323
static int arcmsr_shutdown(device_t dev)
5324
{
5325
u_int32_t i;
5326
struct CommandControlBlock *srb;
5327
struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
5328
5329
/* stop adapter background rebuild */
5330
ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
5331
/* disable all outbound interrupt */
5332
arcmsr_disable_allintr(acb);
5333
arcmsr_stop_adapter_bgrb(acb);
5334
arcmsr_flush_adapter_cache(acb);
5335
/* abort all outstanding command */
5336
acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
5337
acb->acb_flags &= ~ACB_F_IOP_INITED;
5338
if(acb->srboutstandingcount != 0) {
5339
/*clear and abort all outbound posted Q*/
5340
arcmsr_done4abort_postqueue(acb);
5341
/* talk to iop 331 outstanding command aborted*/
5342
arcmsr_abort_allcmd(acb);
5343
for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
5344
srb = acb->psrb_pool[i];
5345
if(srb->srb_state == ARCMSR_SRB_START) {
5346
srb->srb_state = ARCMSR_SRB_ABORTED;
5347
srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
5348
arcmsr_srb_complete(srb, 1);
5349
}
5350
}
5351
}
5352
acb->srboutstandingcount = 0;
5353
acb->workingsrb_doneindex = 0;
5354
acb->workingsrb_startindex = 0;
5355
acb->pktRequestCount = 0;
5356
acb->pktReturnCount = 0;
5357
ARCMSR_LOCK_RELEASE(&acb->isr_lock);
5358
return (0);
5359
}
5360
/*
5361
************************************************************************
5362
************************************************************************
5363
*/
5364
static void arcmsr_teardown_intr(device_t dev, struct AdapterControlBlock *acb)
5365
{
5366
int i;
5367
5368
if (acb->acb_flags & ACB_F_MSIX_ENABLED) {
5369
for (i = 0; i < acb->msix_vectors; i++) {
5370
if (acb->ih[i])
5371
bus_teardown_intr(dev, acb->irqres[i], acb->ih[i]);
5372
if (acb->irqres[i] != NULL)
5373
bus_release_resource(dev, SYS_RES_IRQ,
5374
acb->irq_id[i], acb->irqres[i]);
5375
5376
acb->ih[i] = NULL;
5377
}
5378
pci_release_msi(dev);
5379
} else {
5380
if (acb->ih[0])
5381
bus_teardown_intr(dev, acb->irqres[0], acb->ih[0]);
5382
if (acb->irqres[0] != NULL)
5383
bus_release_resource(dev, SYS_RES_IRQ,
5384
acb->irq_id[0], acb->irqres[0]);
5385
acb->ih[0] = NULL;
5386
}
5387
5388
}
5389
/*
5390
************************************************************************
5391
************************************************************************
5392
*/
5393
static int arcmsr_detach(device_t dev)
5394
{
5395
struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
5396
5397
callout_stop(&acb->devmap_callout);
5398
arcmsr_teardown_intr(dev, acb);
5399
arcmsr_shutdown(dev);
5400
arcmsr_free_resource(acb);
5401
ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
5402
xpt_async(AC_LOST_DEVICE, acb->ppath, NULL);
5403
xpt_free_path(acb->ppath);
5404
xpt_bus_deregister(cam_sim_path(acb->psim));
5405
cam_sim_free(acb->psim, TRUE);
5406
ARCMSR_LOCK_RELEASE(&acb->isr_lock);
5407
arcmsr_mutex_destroy(acb);
5408
return (0);
5409
}
5410
5411
#ifdef ARCMSR_DEBUG1
5412
static void arcmsr_dump_data(struct AdapterControlBlock *acb)
5413
{
5414
if((acb->pktRequestCount - acb->pktReturnCount) == 0)
5415
return;
5416
printf("Command Request Count =0x%x\n",acb->pktRequestCount);
5417
printf("Command Return Count =0x%x\n",acb->pktReturnCount);
5418
printf("Command (Req-Rtn) Count =0x%x\n",(acb->pktRequestCount - acb->pktReturnCount));
5419
printf("Queued Command Count =0x%x\n",acb->srboutstandingcount);
5420
}
5421
#endif
5422
5423