Lines Matching defs:asd_ha
25 static int asd_get_user_sas_addr(struct asd_ha_struct *asd_ha)
28 if (asd_ha->hw_prof.sas_addr[0])
31 return sas_request_addr(asd_ha->sas_ha.core.shost,
32 asd_ha->hw_prof.sas_addr);
35 static void asd_propagate_sas_addr(struct asd_ha_struct *asd_ha)
40 if (asd_ha->hw_prof.phy_desc[i].sas_addr[0] == 0)
45 SAS_ADDR(asd_ha->hw_prof.sas_addr));
46 memcpy(asd_ha->hw_prof.phy_desc[i].sas_addr,
47 asd_ha->hw_prof.sas_addr, SAS_ADDR_SIZE);
71 struct asd_ha_struct *asd_ha = phy->sas_phy.ha->lldd_ha;
83 phy->id_frm_tok = asd_alloc_coherent(asd_ha,
97 static void asd_init_ports(struct asd_ha_struct *asd_ha)
101 spin_lock_init(&asd_ha->asd_ports_lock);
103 struct asd_port *asd_port = &asd_ha->asd_ports[i];
112 static int asd_init_phys(struct asd_ha_struct *asd_ha)
115 u8 phy_mask = asd_ha->hw_prof.enabled_phys;
118 struct asd_phy *phy = &asd_ha->phys[i];
120 phy->phy_desc = &asd_ha->hw_prof.phy_desc[i];
127 phy->sas_phy.ha = &asd_ha->sas_ha;
133 int err = asd_init_phy(&asd_ha->phys[i]);
143 static int asd_init_sw(struct asd_ha_struct *asd_ha)
145 struct pci_dev *pcidev = asd_ha->pcidev;
171 asd_ha->io_handle[0].swa_base = REG_BASE_ADDR;
172 asd_ha->io_handle[0].swb_base = REG_BASE_ADDR_CSEQCIO;
173 asd_ha->io_handle[0].swc_base = REG_BASE_ADDR_EXSI;
174 MBAR0_SWB_SIZE = asd_ha->io_handle[0].len - 0x80;
175 if (!asd_ha->iospace) {
178 asd_ha->io_handle[1].swa_base = OCM_BASE_ADDR;
180 spin_lock_init(&asd_ha->iolock);
189 * @asd_ha: pointer to host adapter structure
198 static int asd_init_scbs(struct asd_ha_struct *asd_ha)
200 struct asd_seq_data *seq = &asd_ha->seq;
204 asd_ha->seq.tc_index_bitmap_bits = asd_ha->hw_prof.max_scbs;
205 asd_ha->seq.tc_index_array = kcalloc(asd_ha->seq.tc_index_bitmap_bits,
208 if (!asd_ha->seq.tc_index_array)
211 bitmap_bytes = (asd_ha->seq.tc_index_bitmap_bits+7)/8;
213 asd_ha->seq.tc_index_bitmap = kzalloc(bitmap_bytes, GFP_KERNEL);
214 if (!asd_ha->seq.tc_index_bitmap) {
215 kfree(asd_ha->seq.tc_index_array);
216 asd_ha->seq.tc_index_array = NULL;
223 seq->next_scb.vaddr = dma_pool_alloc(asd_ha->scb_pool, GFP_KERNEL,
226 kfree(asd_ha->seq.tc_index_bitmap);
227 kfree(asd_ha->seq.tc_index_array);
228 asd_ha->seq.tc_index_bitmap = NULL;
229 asd_ha->seq.tc_index_array = NULL;
240 static void asd_get_max_scb_ddb(struct asd_ha_struct *asd_ha)
242 asd_ha->hw_prof.max_scbs = asd_get_cmdctx_size(asd_ha)/ASD_SCB_SIZE;
243 asd_ha->hw_prof.max_ddbs = asd_get_devctx_size(asd_ha)/ASD_DDB_SIZE;
245 asd_ha->hw_prof.max_scbs,
246 asd_ha->hw_prof.max_ddbs);
253 static int asd_init_dl(struct asd_ha_struct *asd_ha)
255 asd_ha->seq.actual_dl
256 = asd_alloc_coherent(asd_ha,
259 if (!asd_ha->seq.actual_dl)
261 asd_ha->seq.dl = asd_ha->seq.actual_dl->vaddr;
262 asd_ha->seq.dl_toggle = ASD_DEF_DL_TOGGLE;
263 asd_ha->seq.dl_next = 0;
264 tasklet_init(&asd_ha->seq.dl_tasklet, asd_dl_tasklet_handler,
265 (unsigned long) asd_ha);
272 static int asd_alloc_edbs(struct asd_ha_struct *asd_ha, gfp_t gfp_flags)
274 struct asd_seq_data *seq = &asd_ha->seq;
283 seq->edb_arr[i] = asd_alloc_coherent(asd_ha, ASD_EDB_SIZE,
296 asd_free_coherent(asd_ha, seq->edb_arr[i]);
303 static int asd_alloc_escbs(struct asd_ha_struct *asd_ha,
306 struct asd_seq_data *seq = &asd_ha->seq;
316 escb = asd_ascb_alloc_list(asd_ha, &escbs, gfp_flags);
339 static void asd_assign_edbs2escbs(struct asd_ha_struct *asd_ha)
341 struct asd_seq_data *seq = &asd_ha->seq;
365 * @asd_ha: pointer to host adapter structure
370 static int asd_init_escbs(struct asd_ha_struct *asd_ha)
372 struct asd_seq_data *seq = &asd_ha->seq;
376 int edbs = 2*(1+asd_ha->hw_prof.num_phys);
381 err = asd_alloc_edbs(asd_ha, GFP_KERNEL);
387 err = asd_alloc_escbs(asd_ha, GFP_KERNEL);
393 asd_assign_edbs2escbs(asd_ha);
400 seq->can_queue = 1 + (asd_ha->hw_prof.max_scbs - seq->pending)/2;
409 * @asd_ha: pointer to host adapter structure
414 int asd_chip_hardrst(struct asd_ha_struct *asd_ha)
421 asd_write_reg_dword(asd_ha, COMBIST, HARDRST);
426 reg = asd_read_reg_dword(asd_ha, CHIMINT);
428 asd_write_reg_dword(asd_ha, CHIMINT,
439 * @asd_ha: pointer to host adapter structure
443 * enable HA interrupts with asd_enable_ints(asd_ha).
445 static int asd_init_chip(struct asd_ha_struct *asd_ha)
449 err = asd_chip_hardrst(asd_ha);
452 pci_name(asd_ha->pcidev));
456 asd_disable_ints(asd_ha);
458 err = asd_init_seqs(asd_ha);
461 pci_name(asd_ha->pcidev));
465 err = asd_start_seqs(asd_ha);
468 pci_name(asd_ha->pcidev));
489 static void asd_extend_devctx_ocm(struct asd_ha_struct *asd_ha)
494 dma_addr -= asd_ha->hw_prof.max_ddbs * ASD_DDB_SIZE;
495 asd_write_reg_addr(asd_ha, DEVCTXBASE, (dma_addr_t) dma_addr);
496 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
498 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
499 asd_ha->hw_prof.max_ddbs += MAX_DEVS;
502 static int asd_extend_devctx(struct asd_ha_struct *asd_ha)
509 asd_extend_devctx_ocm(asd_ha);
511 asd_ha->hw_prof.ddb_ext = NULL;
512 if (max_devs <= asd_ha->hw_prof.max_ddbs || max_devs > 0xFFFF) {
513 max_devs = asd_ha->hw_prof.max_ddbs;
517 size = (max_devs - asd_ha->hw_prof.max_ddbs + 1) * ASD_DDB_SIZE;
519 asd_ha->hw_prof.ddb_ext = asd_alloc_coherent(asd_ha, size, GFP_KERNEL);
520 if (!asd_ha->hw_prof.ddb_ext) {
523 max_devs = asd_ha->hw_prof.max_ddbs;
526 dma_handle = asd_ha->hw_prof.ddb_ext->dma_handle;
528 dma_addr -= asd_ha->hw_prof.max_ddbs * ASD_DDB_SIZE;
530 asd_write_reg_addr(asd_ha, DEVCTXBASE, dma_handle);
531 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
533 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
535 asd_ha->hw_prof.max_ddbs = max_devs;
540 static int asd_extend_cmdctx(struct asd_ha_struct *asd_ha)
547 asd_ha->hw_prof.scb_ext = NULL;
548 if (max_cmnds <= asd_ha->hw_prof.max_scbs || max_cmnds > 0xFFFF) {
549 max_cmnds = asd_ha->hw_prof.max_scbs;
553 size = (max_cmnds - asd_ha->hw_prof.max_scbs + 1) * ASD_SCB_SIZE;
555 asd_ha->hw_prof.scb_ext = asd_alloc_coherent(asd_ha, size, GFP_KERNEL);
556 if (!asd_ha->hw_prof.scb_ext) {
559 max_cmnds = asd_ha->hw_prof.max_scbs;
562 dma_handle = asd_ha->hw_prof.scb_ext->dma_handle;
564 dma_addr -= asd_ha->hw_prof.max_scbs * ASD_SCB_SIZE;
566 asd_write_reg_addr(asd_ha, CMDCTXBASE, dma_handle);
567 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
569 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
571 asd_ha->hw_prof.max_scbs = max_cmnds;
578 * @asd_ha: pointer to host adapter structure
588 static int asd_init_ctxmem(struct asd_ha_struct *asd_ha)
592 asd_get_max_scb_ddb(asd_ha);
593 asd_extend_devctx(asd_ha);
594 asd_extend_cmdctx(asd_ha);
597 bitmap_bytes = (asd_ha->hw_prof.max_ddbs+7)/8;
599 asd_ha->hw_prof.ddb_bitmap = kzalloc(bitmap_bytes, GFP_KERNEL);
600 if (!asd_ha->hw_prof.ddb_bitmap)
602 spin_lock_init(&asd_ha->hw_prof.ddb_lock);
607 int asd_init_hw(struct asd_ha_struct *asd_ha)
612 err = asd_init_sw(asd_ha);
616 err = pci_read_config_dword(asd_ha->pcidev, PCIC_HSTPCIX_CNTRL, &v);
619 pci_name(asd_ha->pcidev));
622 err = pci_write_config_dword(asd_ha->pcidev, PCIC_HSTPCIX_CNTRL,
626 pci_name(asd_ha->pcidev));
630 err = asd_read_ocm(asd_ha);
637 err = asd_read_flash(asd_ha);
645 asd_init_ctxmem(asd_ha);
647 if (asd_get_user_sas_addr(asd_ha)) {
649 pci_name(asd_ha->pcidev));
654 asd_propagate_sas_addr(asd_ha);
656 err = asd_init_phys(asd_ha);
659 pci_name(asd_ha->pcidev));
663 asd_init_ports(asd_ha);
665 err = asd_init_scbs(asd_ha);
668 pci_name(asd_ha->pcidev));
672 err = asd_init_dl(asd_ha);
679 err = asd_init_escbs(asd_ha);
685 err = asd_init_chip(asd_ha);
698 * @asd_ha: pointer to host adapter structure of interest
706 static void asd_chip_reset(struct asd_ha_struct *asd_ha)
708 ASD_DPRINTK("chip reset for %s\n", pci_name(asd_ha->pcidev));
709 asd_chip_hardrst(asd_ha);
716 struct asd_ha_struct *asd_ha = (struct asd_ha_struct *) data;
717 struct asd_seq_data *seq = &asd_ha->seq;
757 * @asd_ha: pointer to host adapter structure
759 static void asd_process_donelist_isr(struct asd_ha_struct *asd_ha)
761 tasklet_schedule(&asd_ha->seq.dl_tasklet);
766 * @asd_ha: pointer to host adapter structure
768 static void asd_com_sas_isr(struct asd_ha_struct *asd_ha)
770 u32 comstat = asd_read_reg_dword(asd_ha, COMSTAT);
773 asd_write_reg_dword(asd_ha, COMSTAT, 0xFFFFFFFF);
777 pci_name(asd_ha->pcidev));
780 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
784 pci_name(asd_ha->pcidev),
786 asd_read_reg_dword(asd_ha, CSDMAADR),
787 asd_read_reg_dword(asd_ha, CSDMAADR+4));
791 asd_read_reg_dword(asd_ha, CSBUFFER),
792 asd_read_reg_dword(asd_ha, CSBUFFER+4),
793 asd_read_reg_dword(asd_ha, CSBUFFER+8),
794 asd_read_reg_dword(asd_ha, CSBUFFER+12));
796 asd_dump_seq_state(asd_ha, 0);
798 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
801 pci_name(asd_ha->pcidev),
804 asd_chip_reset(asd_ha);
807 static void asd_arp2_err(struct asd_ha_struct *asd_ha, u32 dchstatus)
849 u32 arp2int = asd_read_reg_dword(asd_ha, CARP2INT);
853 pci_name(asd_ha->pcidev),
857 pci_name(asd_ha->pcidev),
861 pci_name(asd_ha->pcidev),
869 u32 arp2int = asd_read_reg_dword(asd_ha,
874 pci_name(asd_ha->pcidev),
879 pci_name(asd_ha->pcidev),
883 pci_name(asd_ha->pcidev), lseq,
887 asd_chip_reset(asd_ha);
892 * @asd_ha: pointer to host adapter structure
894 static void asd_dch_sas_isr(struct asd_ha_struct *asd_ha)
896 u32 dchstatus = asd_read_reg_dword(asd_ha, DCHSTATUS);
899 asd_printk("%s: CFIFTOERR\n", pci_name(asd_ha->pcidev));
900 asd_chip_reset(asd_ha);
902 asd_arp2_err(asd_ha, dchstatus);
907 * @asd_ha: pointer to host adapter structure
909 static void asd_rbi_exsi_isr(struct asd_ha_struct *asd_ha)
911 u32 stat0r = asd_read_reg_dword(asd_ha, ASISTAT0R);
920 pci_name(asd_ha->pcidev));
922 u32 stat1r = asd_read_reg_dword(asd_ha, ASISTAT1R);
925 pci_name(asd_ha->pcidev));
927 u32 statr = asd_read_reg_dword(asd_ha, ASIERRSTATR);
933 u32 addr = asd_read_reg_dword(asd_ha, ASIERRADDR);
934 u32 data = asd_read_reg_dword(asd_ha, ASIERRDATAR);
939 pci_name(asd_ha->pcidev),
948 asd_chip_reset(asd_ha);
953 * @asd_ha: pointer to host adapter structure
957 static void asd_hst_pcix_isr(struct asd_ha_struct *asd_ha)
963 pci_read_config_word(asd_ha->pcidev, PCI_STATUS, &status);
964 pci_read_config_dword(asd_ha->pcidev, PCIX_STATUS, &pcix_status);
965 pci_read_config_dword(asd_ha->pcidev, ECC_CTRL_STAT, &ecc_status);
968 asd_printk("parity error for %s\n", pci_name(asd_ha->pcidev));
970 asd_printk("master abort for %s\n", pci_name(asd_ha->pcidev));
972 asd_printk("target abort for %s\n", pci_name(asd_ha->pcidev));
974 asd_printk("data parity for %s\n", pci_name(asd_ha->pcidev));
977 pci_name(asd_ha->pcidev));
978 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
983 pci_name(asd_ha->pcidev));
984 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
989 pci_name(asd_ha->pcidev));
992 pci_name(asd_ha->pcidev));
993 asd_chip_reset(asd_ha);
1005 struct asd_ha_struct *asd_ha = dev_id;
1006 u32 chimint = asd_read_reg_dword(asd_ha, CHIMINT);
1011 asd_write_reg_dword(asd_ha, CHIMINT, chimint);
1012 (void) asd_read_reg_dword(asd_ha, CHIMINT);
1015 asd_process_donelist_isr(asd_ha);
1017 asd_com_sas_isr(asd_ha);
1019 asd_dch_sas_isr(asd_ha);
1021 asd_rbi_exsi_isr(asd_ha);
1023 asd_hst_pcix_isr(asd_ha);
1030 static struct asd_ascb *asd_ascb_alloc(struct asd_ha_struct *asd_ha,
1034 struct asd_seq_data *seq = &asd_ha->seq;
1042 ascb->dma_scb.vaddr = dma_pool_zalloc(asd_ha->scb_pool,
1049 asd_init_ascb(asd_ha, ascb);
1062 dma_pool_free(asd_ha->scb_pool, ascb->dma_scb.vaddr,
1071 * @asd_ha: pointer to host adapter structure
1086 *asd_ha, int *num,
1092 struct asd_ascb *ascb = asd_ascb_alloc(asd_ha, gfp_flags);
1113 * @asd_ha: pointer to host adapter structure
1129 static void asd_swap_head_scb(struct asd_ha_struct *asd_ha,
1132 struct asd_seq_data *seq = &asd_ha->seq;
1169 * @asd_ha: pointer to a host adapter structure
1186 int asd_post_ascb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1193 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1194 can_queue = asd_ha->hw_prof.max_scbs - asd_ha->seq.pending;
1196 asd_ha->seq.pending += num;
1201 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1202 asd_printk("%s: scb queue full\n", pci_name(asd_ha->pcidev));
1206 asd_swap_head_scb(asd_ha, ascb);
1212 asd_ha->seq.scbpro += num;
1213 list_splice_init(&list, asd_ha->seq.pend_q.prev);
1214 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1215 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1222 * @asd_ha: pointer to a host adapter structure
1238 int asd_post_escb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1243 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1244 asd_swap_head_scb(asd_ha, ascb);
1245 asd_ha->seq.scbpro += num;
1246 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1247 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1256 * @asd_ha: pointer to host adapter structure
1260 void asd_turn_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1263 u32 v = asd_read_reg_dword(asd_ha, LmCONTROL(phy_id));
1268 asd_write_reg_dword(asd_ha, LmCONTROL(phy_id), v);
1274 * @asd_ha: pointer to host adapter structure
1281 void asd_control_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1286 v = asd_read_reg_dword(asd_ha, GPIOOER);
1291 asd_write_reg_dword(asd_ha, GPIOOER, v);
1293 v = asd_read_reg_dword(asd_ha, GPIOCNFGR);
1298 asd_write_reg_dword(asd_ha, GPIOCNFGR, v);
1304 static int asd_enable_phy(struct asd_ha_struct *asd_ha, int phy_id)
1306 struct asd_phy *phy = &asd_ha->phys[phy_id];
1308 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, INT_ENABLE_2), 0);
1309 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, HOT_PLUG_DELAY),
1314 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_0),
1316 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_1),
1318 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_2),
1320 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_3),
1323 asd_write_reg_dword(asd_ha, LmSEQ_TEN_MS_COMINIT_TIMEOUT(phy_id),
1326 asd_write_reg_addr(asd_ha, LmSEQ_TX_ID_ADDR_FRAME(phy_id),
1329 asd_control_led(asd_ha, phy_id, 1);
1334 int asd_enable_phys(struct asd_ha_struct *asd_ha, const u8 phy_mask)
1349 asd_enable_phy(asd_ha, i);
1353 ascb_list = asd_ascb_alloc_list(asd_ha, &k, GFP_KERNEL);
1366 k = asd_post_ascb_list(asd_ha, ascb_list, num);