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 void asd_can_dequeue(
struct asd_ha_struct *asd_ha,
int num)
41 asd_ha->
seq.can_queue += num;
42 spin_unlock_irqrestore(&asd_ha->
seq.pend_q_lock, flags);
47 static const u8 data_dir_flags[] = {
90 ascb->
sg_arr = asd_alloc_coherent(asd_ha,
91 num_sg*
sizeof(
struct sg_el),
114 memset(&sg_arr[2], 0,
sizeof(*sg_arr));
134 static void asd_unmap_scatterlist(
struct asd_ascb *ascb)
150 asd_free_coherent(asd_ha, ascb->
sg_arr);
158 static void asd_get_response_tasklet(
struct asd_ascb *ascb,
165 struct tc_resp_sb_struct {
172 int edb_id = ((resp_sb->flags & 0x70) >> 4)-1;
178 escb = asd_tc_index_find(&asd_ha->
seq,
180 spin_unlock_irqrestore(&asd_ha->
seq.tc_index_lock, flags);
191 struct ssp_response_iu *
iu =
192 r + 16 +
sizeof(
struct ssp_frame_hdr);
212 static void asd_task_tasklet_complete(
struct asd_ascb *ascb,
220 asd_can_dequeue(ascb->
ha, 1);
242 asd_get_response_tasklet(ascb, dl);
323 ASD_DPRINTK(
"%s: dl opcode: 0x%x?\n", __func__, opcode);
330 asd_unbuild_ata_ascb(ascb);
333 asd_unbuild_smp_ascb(ascb);
336 asd_unbuild_ssp_ascb(ascb);
348 ASD_DPRINTK(
"task 0x%p done with opcode 0x%x resp 0x%x "
349 "stat 0x%x but aborted by upper layer!\n",
381 scb->
ata_task.proto_conn_rate = (1 << 5);
404 flags |= data_dir_flags[task->
data_dir];
419 res = asd_map_scatterlist(task, scb->
ata_task.sg_element,
425 static void asd_unbuild_ata_ascb(
struct asd_ascb *
a)
427 asd_unmap_scatterlist(a);
469 static void asd_unbuild_smp_ascb(
struct asd_ascb *
a)
474 pci_unmap_sg(a->
ha->pcidev, &task->
smp_task.smp_req, 1,
476 pci_unmap_sg(a->
ha->pcidev, &task->
smp_task.smp_resp, 1,
493 scb->
ssp_task.proto_conn_rate = (1 << 4);
504 if (task->
ssp_task.enable_first_burst)
518 res = asd_map_scatterlist(task, scb->
ssp_task.sg_element, gfp_flags);
523 static void asd_unbuild_ssp_ascb(
struct asd_ascb *
a)
525 asd_unmap_scatterlist(a);
530 static int asd_can_queue(
struct asd_ha_struct *asd_ha,
int num)
536 if ((asd_ha->
seq.can_queue - num) < 0)
539 asd_ha->
seq.can_queue -= num;
540 spin_unlock_irqrestore(&asd_ha->
seq.pend_q_lock, flags);
555 res = asd_can_queue(asd_ha, num);
580 res = asd_build_ata_ascb(a, t, gfp_flags);
583 res = asd_build_smp_ascb(a, t, gfp_flags);
586 res = asd_build_ssp_ascb(a, t, gfp_flags);
601 list_del_init(&alist);
624 asd_unbuild_ata_ascb(a);
627 asd_unbuild_smp_ascb(a);
630 asd_unbuild_ssp_ascb(a);
637 list_del_init(&alist);
640 asd_ascb_free_list(ascb);
641 asd_can_dequeue(asd_ha, num);