2 * Aic94xx SAS/SATA Tasks
4 * Copyright (C) 2005 Adaptec, Inc. All rights reserved.
5 * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
7 * This file is licensed under GPLv2.
9 * This file is part of the aic94xx driver.
11 * The aic94xx driver is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; version 2 of the
16 * The aic94xx driver is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with the aic94xx driver; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 #include <linux/spinlock.h>
29 #include "aic94xx_sas.h"
30 #include "aic94xx_hwi.h"
32 static void asd_unbuild_ata_ascb(struct asd_ascb
*a
);
33 static void asd_unbuild_smp_ascb(struct asd_ascb
*a
);
34 static void asd_unbuild_ssp_ascb(struct asd_ascb
*a
);
36 static inline void asd_can_dequeue(struct asd_ha_struct
*asd_ha
, int num
)
40 spin_lock_irqsave(&asd_ha
->seq
.pend_q_lock
, flags
);
41 asd_ha
->seq
.can_queue
+= num
;
42 spin_unlock_irqrestore(&asd_ha
->seq
.pend_q_lock
, flags
);
45 /* PCI_DMA_... to our direction translation.
47 static const u8 data_dir_flags
[] = {
48 [PCI_DMA_BIDIRECTIONAL
] = DATA_DIR_BYRECIPIENT
, /* UNSPECIFIED */
49 [PCI_DMA_TODEVICE
] = DATA_DIR_OUT
, /* OUTBOUND */
50 [PCI_DMA_FROMDEVICE
] = DATA_DIR_IN
, /* INBOUND */
51 [PCI_DMA_NONE
] = DATA_DIR_NONE
, /* NO TRANSFER */
54 static inline int asd_map_scatterlist(struct sas_task
*task
,
58 struct asd_ascb
*ascb
= task
->lldd_task
;
59 struct asd_ha_struct
*asd_ha
= ascb
->ha
;
60 struct scatterlist
*sc
;
63 if (task
->data_dir
== PCI_DMA_NONE
)
66 if (task
->num_scatter
== 0) {
67 void *p
= task
->scatter
;
68 dma_addr_t dma
= pci_map_single(asd_ha
->pcidev
, p
,
71 sg_arr
[0].bus_addr
= cpu_to_le64((u64
)dma
);
72 sg_arr
[0].size
= cpu_to_le32(task
->total_xfer_len
);
73 sg_arr
[0].flags
|= ASD_SG_EL_LIST_EOL
;
77 /* STP tasks come from libata which has already mapped
79 if (sas_protocol_ata(task
->task_proto
))
80 num_sg
= task
->num_scatter
;
82 num_sg
= pci_map_sg(asd_ha
->pcidev
, task
->scatter
,
83 task
->num_scatter
, task
->data_dir
);
90 ascb
->sg_arr
= asd_alloc_coherent(asd_ha
,
91 num_sg
*sizeof(struct sg_el
),
97 for_each_sg(task
->scatter
, sc
, num_sg
, i
) {
99 &((struct sg_el
*)ascb
->sg_arr
->vaddr
)[i
];
100 sg
->bus_addr
= cpu_to_le64((u64
)sg_dma_address(sc
));
101 sg
->size
= cpu_to_le32((u32
)sg_dma_len(sc
));
103 sg
->flags
|= ASD_SG_EL_LIST_EOL
;
106 for_each_sg(task
->scatter
, sc
, 2, i
) {
108 cpu_to_le64((u64
)sg_dma_address(sc
));
109 sg_arr
[i
].size
= cpu_to_le32((u32
)sg_dma_len(sc
));
111 sg_arr
[1].next_sg_offs
= 2 * sizeof(*sg_arr
);
112 sg_arr
[1].flags
|= ASD_SG_EL_LIST_EOS
;
114 memset(&sg_arr
[2], 0, sizeof(*sg_arr
));
115 sg_arr
[2].bus_addr
=cpu_to_le64((u64
)ascb
->sg_arr
->dma_handle
);
118 for_each_sg(task
->scatter
, sc
, num_sg
, i
) {
120 cpu_to_le64((u64
)sg_dma_address(sc
));
121 sg_arr
[i
].size
= cpu_to_le32((u32
)sg_dma_len(sc
));
123 sg_arr
[i
-1].flags
|= ASD_SG_EL_LIST_EOL
;
128 if (sas_protocol_ata(task
->task_proto
))
129 pci_unmap_sg(asd_ha
->pcidev
, task
->scatter
, task
->num_scatter
,
134 static inline void asd_unmap_scatterlist(struct asd_ascb
*ascb
)
136 struct asd_ha_struct
*asd_ha
= ascb
->ha
;
137 struct sas_task
*task
= ascb
->uldd_task
;
139 if (task
->data_dir
== PCI_DMA_NONE
)
142 if (task
->num_scatter
== 0) {
143 dma_addr_t dma
= (dma_addr_t
)
144 le64_to_cpu(ascb
->scb
->ssp_task
.sg_element
[0].bus_addr
);
145 pci_unmap_single(ascb
->ha
->pcidev
, dma
, task
->total_xfer_len
,
150 asd_free_coherent(asd_ha
, ascb
->sg_arr
);
151 if (task
->task_proto
!= SAS_PROTOCOL_STP
)
152 pci_unmap_sg(asd_ha
->pcidev
, task
->scatter
, task
->num_scatter
,
156 /* ---------- Task complete tasklet ---------- */
158 static void asd_get_response_tasklet(struct asd_ascb
*ascb
,
159 struct done_list_struct
*dl
)
161 struct asd_ha_struct
*asd_ha
= ascb
->ha
;
162 struct sas_task
*task
= ascb
->uldd_task
;
163 struct task_status_struct
*ts
= &task
->task_status
;
165 struct tc_resp_sb_struct
{
169 } __attribute__ ((packed
)) *resp_sb
= (void *) dl
->status_block
;
171 /* int size = ((resp_sb->flags & 7) << 8) | resp_sb->len_lsb; */
172 int edb_id
= ((resp_sb
->flags
& 0x70) >> 4)-1;
173 struct asd_ascb
*escb
;
174 struct asd_dma_tok
*edb
;
177 spin_lock_irqsave(&asd_ha
->seq
.tc_index_lock
, flags
);
178 escb
= asd_tc_index_find(&asd_ha
->seq
,
179 (int)le16_to_cpu(resp_sb
->index_escb
));
180 spin_unlock_irqrestore(&asd_ha
->seq
.tc_index_lock
, flags
);
183 ASD_DPRINTK("Uh-oh! No escb for this dl?!\n");
187 ts
->buf_valid_size
= 0;
188 edb
= asd_ha
->seq
.edb_arr
[edb_id
+ escb
->edb_index
];
190 if (task
->task_proto
== SAS_PROTO_SSP
) {
191 struct ssp_response_iu
*iu
=
192 r
+ 16 + sizeof(struct ssp_frame_hdr
);
194 ts
->residual
= le32_to_cpu(*(__le32
*)r
);
195 ts
->resp
= SAS_TASK_COMPLETE
;
196 if (iu
->datapres
== 0)
197 ts
->stat
= iu
->status
;
198 else if (iu
->datapres
== 1)
199 ts
->stat
= iu
->resp_data
[3];
200 else if (iu
->datapres
== 2) {
201 ts
->stat
= SAM_CHECK_COND
;
202 ts
->buf_valid_size
= min((u32
) SAS_STATUS_BUF_SIZE
,
203 be32_to_cpu(iu
->sense_data_len
));
204 memcpy(ts
->buf
, iu
->sense_data
, ts
->buf_valid_size
);
205 if (iu
->status
!= SAM_CHECK_COND
) {
206 ASD_DPRINTK("device %llx sent sense data, but "
207 "stat(0x%x) is not CHECK_CONDITION"
209 SAS_ADDR(task
->dev
->sas_addr
),
214 struct ata_task_resp
*resp
= (void *) &ts
->buf
[0];
216 ts
->residual
= le32_to_cpu(*(__le32
*)r
);
218 if (SAS_STATUS_BUF_SIZE
>= sizeof(*resp
)) {
219 resp
->frame_len
= le16_to_cpu(*(__le16
*)(r
+6));
220 memcpy(&resp
->ending_fis
[0], r
+16, 24);
221 ts
->buf_valid_size
= sizeof(*resp
);
225 asd_invalidate_edb(escb
, edb_id
);
228 static void asd_task_tasklet_complete(struct asd_ascb
*ascb
,
229 struct done_list_struct
*dl
)
231 struct sas_task
*task
= ascb
->uldd_task
;
232 struct task_status_struct
*ts
= &task
->task_status
;
234 u8 opcode
= dl
->opcode
;
236 asd_can_dequeue(ascb
->ha
, 1);
241 ts
->resp
= SAS_TASK_COMPLETE
;
245 ts
->resp
= SAS_TASK_COMPLETE
;
246 ts
->stat
= SAS_DATA_UNDERRUN
;
247 ts
->residual
= le32_to_cpu(*(__le32
*)dl
->status_block
);
250 ts
->resp
= SAS_TASK_COMPLETE
;
251 ts
->stat
= SAS_DATA_OVERRUN
;
256 ts
->resp
= SAS_TASK_COMPLETE
;
257 ts
->stat
= SAS_PROTO_RESPONSE
;
258 asd_get_response_tasklet(ascb
, dl
);
261 ts
->resp
= SAS_TASK_UNDELIVERED
;
262 ts
->stat
= SAS_OPEN_REJECT
;
263 if (dl
->status_block
[1] & 2)
264 ts
->open_rej_reason
= 1 + dl
->status_block
[2];
265 else if (dl
->status_block
[1] & 1)
266 ts
->open_rej_reason
= (dl
->status_block
[2] >> 4)+10;
268 ts
->open_rej_reason
= SAS_OREJ_UNKNOWN
;
271 ts
->resp
= SAS_TASK_UNDELIVERED
;
272 ts
->stat
= SAS_OPEN_TO
;
276 ts
->resp
= SAS_TASK_UNDELIVERED
;
277 ts
->stat
= SAS_PHY_DOWN
;
280 ts
->resp
= SAS_TASK_COMPLETE
;
281 ts
->stat
= SAS_PHY_DOWN
;
287 case TF_SMP_XMIT_RCV_ERR
:
288 case TC_ATA_R_ERR_RECV
:
289 ts
->resp
= SAS_TASK_COMPLETE
;
290 ts
->stat
= SAS_INTERRUPTED
;
296 ts
->resp
= SAS_TASK_UNDELIVERED
;
297 ts
->stat
= SAS_DEV_NO_RESPONSE
;
300 ts
->resp
= SAS_TASK_COMPLETE
;
301 ts
->stat
= SAS_NAK_R_ERR
;
303 case TA_I_T_NEXUS_LOSS
:
304 opcode
= dl
->status_block
[0];
307 case TF_INV_CONN_HANDLE
:
308 ts
->resp
= SAS_TASK_UNDELIVERED
;
309 ts
->stat
= SAS_DEVICE_UNKNOWN
;
311 case TF_REQUESTED_N_PENDING
:
312 ts
->resp
= SAS_TASK_UNDELIVERED
;
313 ts
->stat
= SAS_PENDING
;
315 case TC_TASK_CLEARED
:
317 ts
->resp
= SAS_TASK_COMPLETE
;
318 ts
->stat
= SAS_ABORTED_TASK
;
324 case TF_TMF_TAG_FREE
:
325 case TF_TMF_TASK_DONE
:
326 case TF_TMF_NO_CONN_HANDLE
:
329 case TF_DATA_OFFS_ERR
:
330 ts
->resp
= SAS_TASK_UNDELIVERED
;
331 ts
->stat
= SAS_DEV_NO_RESPONSE
;
334 case TC_LINK_ADM_RESP
:
337 case TC_PARTIAL_SG_LIST
:
339 ASD_DPRINTK("%s: dl opcode: 0x%x?\n", __FUNCTION__
, opcode
);
343 switch (task
->task_proto
) {
346 asd_unbuild_ata_ascb(ascb
);
349 asd_unbuild_smp_ascb(ascb
);
352 asd_unbuild_ssp_ascb(ascb
);
357 spin_lock_irqsave(&task
->task_state_lock
, flags
);
358 task
->task_state_flags
&= ~SAS_TASK_STATE_PENDING
;
359 task
->task_state_flags
&= ~SAS_TASK_AT_INITIATOR
;
360 task
->task_state_flags
|= SAS_TASK_STATE_DONE
;
361 if (unlikely((task
->task_state_flags
& SAS_TASK_STATE_ABORTED
))) {
362 spin_unlock_irqrestore(&task
->task_state_lock
, flags
);
363 ASD_DPRINTK("task 0x%p done with opcode 0x%x resp 0x%x "
364 "stat 0x%x but aborted by upper layer!\n",
365 task
, opcode
, ts
->resp
, ts
->stat
);
366 complete(&ascb
->completion
);
368 spin_unlock_irqrestore(&task
->task_state_lock
, flags
);
369 task
->lldd_task
= NULL
;
372 task
->task_done(task
);
376 /* ---------- ATA ---------- */
378 static int asd_build_ata_ascb(struct asd_ascb
*ascb
, struct sas_task
*task
,
381 struct domain_device
*dev
= task
->dev
;
388 if (unlikely(task
->ata_task
.device_control_reg_update
))
389 scb
->header
.opcode
= CONTROL_ATA_DEV
;
390 else if (dev
->sata_dev
.command_set
== ATA_COMMAND_SET
)
391 scb
->header
.opcode
= INITIATE_ATA_TASK
;
393 scb
->header
.opcode
= INITIATE_ATAPI_TASK
;
395 scb
->ata_task
.proto_conn_rate
= (1 << 5); /* STP */
396 if (dev
->port
->oob_mode
== SAS_OOB_MODE
)
397 scb
->ata_task
.proto_conn_rate
|= dev
->linkrate
;
399 scb
->ata_task
.total_xfer_len
= cpu_to_le32(task
->total_xfer_len
);
400 scb
->ata_task
.fis
= task
->ata_task
.fis
;
401 if (likely(!task
->ata_task
.device_control_reg_update
))
402 scb
->ata_task
.fis
.flags
|= 0x80; /* C=1: update ATA cmd reg */
403 scb
->ata_task
.fis
.flags
&= 0xF0; /* PM_PORT field shall be 0 */
404 if (dev
->sata_dev
.command_set
== ATAPI_COMMAND_SET
)
405 memcpy(scb
->ata_task
.atapi_packet
, task
->ata_task
.atapi_packet
,
407 scb
->ata_task
.sister_scb
= cpu_to_le16(0xFFFF);
408 scb
->ata_task
.conn_handle
= cpu_to_le16(
409 (u16
)(unsigned long)dev
->lldd_dev
);
411 if (likely(!task
->ata_task
.device_control_reg_update
)) {
413 if (task
->ata_task
.dma_xfer
)
414 flags
|= DATA_XFER_MODE_DMA
;
415 if (task
->ata_task
.use_ncq
&&
416 dev
->sata_dev
.command_set
!= ATAPI_COMMAND_SET
)
417 flags
|= ATA_Q_TYPE_NCQ
;
418 flags
|= data_dir_flags
[task
->data_dir
];
419 scb
->ata_task
.ata_flags
= flags
;
421 scb
->ata_task
.retry_count
= task
->ata_task
.retry_count
;
424 if (task
->ata_task
.set_affil_pol
)
425 flags
|= SET_AFFIL_POLICY
;
426 if (task
->ata_task
.stp_affil_pol
)
427 flags
|= STP_AFFIL_POLICY
;
428 scb
->ata_task
.flags
= flags
;
430 ascb
->tasklet_complete
= asd_task_tasklet_complete
;
432 if (likely(!task
->ata_task
.device_control_reg_update
))
433 res
= asd_map_scatterlist(task
, scb
->ata_task
.sg_element
,
439 static void asd_unbuild_ata_ascb(struct asd_ascb
*a
)
441 asd_unmap_scatterlist(a
);
444 /* ---------- SMP ---------- */
446 static int asd_build_smp_ascb(struct asd_ascb
*ascb
, struct sas_task
*task
,
449 struct asd_ha_struct
*asd_ha
= ascb
->ha
;
450 struct domain_device
*dev
= task
->dev
;
453 pci_map_sg(asd_ha
->pcidev
, &task
->smp_task
.smp_req
, 1,
455 pci_map_sg(asd_ha
->pcidev
, &task
->smp_task
.smp_resp
, 1,
460 scb
->header
.opcode
= INITIATE_SMP_TASK
;
462 scb
->smp_task
.proto_conn_rate
= dev
->linkrate
;
464 scb
->smp_task
.smp_req
.bus_addr
=
465 cpu_to_le64((u64
)sg_dma_address(&task
->smp_task
.smp_req
));
466 scb
->smp_task
.smp_req
.size
=
467 cpu_to_le32((u32
)sg_dma_len(&task
->smp_task
.smp_req
)-4);
469 scb
->smp_task
.smp_resp
.bus_addr
=
470 cpu_to_le64((u64
)sg_dma_address(&task
->smp_task
.smp_resp
));
471 scb
->smp_task
.smp_resp
.size
=
472 cpu_to_le32((u32
)sg_dma_len(&task
->smp_task
.smp_resp
)-4);
474 scb
->smp_task
.sister_scb
= cpu_to_le16(0xFFFF);
475 scb
->smp_task
.conn_handle
= cpu_to_le16((u16
)
476 (unsigned long)dev
->lldd_dev
);
478 ascb
->tasklet_complete
= asd_task_tasklet_complete
;
483 static void asd_unbuild_smp_ascb(struct asd_ascb
*a
)
485 struct sas_task
*task
= a
->uldd_task
;
488 pci_unmap_sg(a
->ha
->pcidev
, &task
->smp_task
.smp_req
, 1,
490 pci_unmap_sg(a
->ha
->pcidev
, &task
->smp_task
.smp_resp
, 1,
494 /* ---------- SSP ---------- */
496 static int asd_build_ssp_ascb(struct asd_ascb
*ascb
, struct sas_task
*task
,
499 struct domain_device
*dev
= task
->dev
;
505 scb
->header
.opcode
= INITIATE_SSP_TASK
;
507 scb
->ssp_task
.proto_conn_rate
= (1 << 4); /* SSP */
508 scb
->ssp_task
.proto_conn_rate
|= dev
->linkrate
;
509 scb
->ssp_task
.total_xfer_len
= cpu_to_le32(task
->total_xfer_len
);
510 scb
->ssp_task
.ssp_frame
.frame_type
= SSP_DATA
;
511 memcpy(scb
->ssp_task
.ssp_frame
.hashed_dest_addr
, dev
->hashed_sas_addr
,
512 HASHED_SAS_ADDR_SIZE
);
513 memcpy(scb
->ssp_task
.ssp_frame
.hashed_src_addr
,
514 dev
->port
->ha
->hashed_sas_addr
, HASHED_SAS_ADDR_SIZE
);
515 scb
->ssp_task
.ssp_frame
.tptt
= cpu_to_be16(0xFFFF);
517 memcpy(scb
->ssp_task
.ssp_cmd
.lun
, task
->ssp_task
.LUN
, 8);
518 if (task
->ssp_task
.enable_first_burst
)
519 scb
->ssp_task
.ssp_cmd
.efb_prio_attr
|= EFB_MASK
;
520 scb
->ssp_task
.ssp_cmd
.efb_prio_attr
|= (task
->ssp_task
.task_prio
<< 3);
521 scb
->ssp_task
.ssp_cmd
.efb_prio_attr
|= (task
->ssp_task
.task_attr
& 7);
522 memcpy(scb
->ssp_task
.ssp_cmd
.cdb
, task
->ssp_task
.cdb
, 16);
524 scb
->ssp_task
.sister_scb
= cpu_to_le16(0xFFFF);
525 scb
->ssp_task
.conn_handle
= cpu_to_le16(
526 (u16
)(unsigned long)dev
->lldd_dev
);
527 scb
->ssp_task
.data_dir
= data_dir_flags
[task
->data_dir
];
528 scb
->ssp_task
.retry_count
= scb
->ssp_task
.retry_count
;
530 ascb
->tasklet_complete
= asd_task_tasklet_complete
;
532 res
= asd_map_scatterlist(task
, scb
->ssp_task
.sg_element
, gfp_flags
);
537 static void asd_unbuild_ssp_ascb(struct asd_ascb
*a
)
539 asd_unmap_scatterlist(a
);
542 /* ---------- Execute Task ---------- */
544 static inline int asd_can_queue(struct asd_ha_struct
*asd_ha
, int num
)
549 spin_lock_irqsave(&asd_ha
->seq
.pend_q_lock
, flags
);
550 if ((asd_ha
->seq
.can_queue
- num
) < 0)
551 res
= -SAS_QUEUE_FULL
;
553 asd_ha
->seq
.can_queue
-= num
;
554 spin_unlock_irqrestore(&asd_ha
->seq
.pend_q_lock
, flags
);
559 int asd_execute_task(struct sas_task
*task
, const int num
,
564 struct sas_task
*t
= task
;
565 struct asd_ascb
*ascb
= NULL
, *a
;
566 struct asd_ha_struct
*asd_ha
= task
->dev
->port
->ha
->lldd_ha
;
569 res
= asd_can_queue(asd_ha
, num
);
574 ascb
= asd_ascb_alloc_list(asd_ha
, &res
, gfp_flags
);
580 __list_add(&alist
, ascb
->list
.prev
, &ascb
->list
);
581 list_for_each_entry(a
, &alist
, list
) {
584 t
= list_entry(t
->list
.next
, struct sas_task
, list
);
586 list_for_each_entry(a
, &alist
, list
) {
589 if (t
->task_proto
& SAS_PROTO_STP
)
590 t
->task_proto
= SAS_PROTO_STP
;
591 switch (t
->task_proto
) {
594 res
= asd_build_ata_ascb(a
, t
, gfp_flags
);
597 res
= asd_build_smp_ascb(a
, t
, gfp_flags
);
600 res
= asd_build_ssp_ascb(a
, t
, gfp_flags
);
603 asd_printk("unknown sas_task proto: 0x%x\n",
611 spin_lock_irqsave(&t
->task_state_lock
, flags
);
612 t
->task_state_flags
|= SAS_TASK_AT_INITIATOR
;
613 spin_unlock_irqrestore(&t
->task_state_lock
, flags
);
615 list_del_init(&alist
);
617 res
= asd_post_ascb_list(asd_ha
, ascb
, num
);
620 __list_add(&alist
, ascb
->list
.prev
, &ascb
->list
);
627 struct asd_ascb
*b
= a
;
628 list_for_each_entry(a
, &alist
, list
) {
632 spin_lock_irqsave(&t
->task_state_lock
, flags
);
633 t
->task_state_flags
&= ~SAS_TASK_AT_INITIATOR
;
634 spin_unlock_irqrestore(&t
->task_state_lock
, flags
);
635 switch (t
->task_proto
) {
638 asd_unbuild_ata_ascb(a
);
641 asd_unbuild_smp_ascb(a
);
644 asd_unbuild_ssp_ascb(a
);
651 list_del_init(&alist
);
654 asd_ascb_free_list(ascb
);
655 asd_can_dequeue(asd_ha
, num
);