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.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;
81 phy->id_frm_tok = asd_alloc_coherent(asd_ha,
95 static void asd_init_ports(struct asd_ha_struct *asd_ha)
99 spin_lock_init(&asd_ha->asd_ports_lock);
101 struct asd_port *asd_port = &asd_ha->asd_ports[i];
110 static int asd_init_phys(struct asd_ha_struct *asd_ha)
113 u8 phy_mask = asd_ha->hw_prof.enabled_phys;
116 struct asd_phy *phy = &asd_ha->phys[i];
118 phy->phy_desc = &asd_ha->hw_prof.phy_desc[i];
125 phy->sas_phy.ha = &asd_ha->sas_ha;
131 int err = asd_init_phy(&asd_ha->phys[i]);
141 static int asd_init_sw(struct asd_ha_struct *asd_ha)
143 struct pci_dev *pcidev = asd_ha->pcidev;
169 asd_ha->io_handle[0].swa_base = REG_BASE_ADDR;
170 asd_ha->io_handle[0].swb_base = REG_BASE_ADDR_CSEQCIO;
171 asd_ha->io_handle[0].swc_base = REG_BASE_ADDR_EXSI;
172 MBAR0_SWB_SIZE = asd_ha->io_handle[0].len - 0x80;
173 if (!asd_ha->iospace) {
176 asd_ha->io_handle[1].swa_base = OCM_BASE_ADDR;
178 spin_lock_init(&asd_ha->iolock);
187 * @asd_ha: pointer to host adapter structure
196 static int asd_init_scbs(struct asd_ha_struct *asd_ha)
198 struct asd_seq_data *seq = &asd_ha->seq;
202 asd_ha->seq.tc_index_bitmap_bits = asd_ha->hw_prof.max_scbs;
203 asd_ha->seq.tc_index_array = kcalloc(asd_ha->seq.tc_index_bitmap_bits,
206 if (!asd_ha->seq.tc_index_array)
209 bitmap_bytes = (asd_ha->seq.tc_index_bitmap_bits+7)/8;
211 asd_ha->seq.tc_index_bitmap = kzalloc(bitmap_bytes, GFP_KERNEL);
212 if (!asd_ha->seq.tc_index_bitmap) {
213 kfree(asd_ha->seq.tc_index_array);
214 asd_ha->seq.tc_index_array = NULL;
221 seq->next_scb.vaddr = dma_pool_alloc(asd_ha->scb_pool, GFP_KERNEL,
224 kfree(asd_ha->seq.tc_index_bitmap);
225 kfree(asd_ha->seq.tc_index_array);
226 asd_ha->seq.tc_index_bitmap = NULL;
227 asd_ha->seq.tc_index_array = NULL;
238 static void asd_get_max_scb_ddb(struct asd_ha_struct *asd_ha)
240 asd_ha->hw_prof.max_scbs = asd_get_cmdctx_size(asd_ha)/ASD_SCB_SIZE;
241 asd_ha->hw_prof.max_ddbs = asd_get_devctx_size(asd_ha)/ASD_DDB_SIZE;
243 asd_ha->hw_prof.max_scbs,
244 asd_ha->hw_prof.max_ddbs);
251 static int asd_init_dl(struct asd_ha_struct *asd_ha)
253 asd_ha->seq.actual_dl
254 = asd_alloc_coherent(asd_ha,
257 if (!asd_ha->seq.actual_dl)
259 asd_ha->seq.dl = asd_ha->seq.actual_dl->vaddr;
260 asd_ha->seq.dl_toggle = ASD_DEF_DL_TOGGLE;
261 asd_ha->seq.dl_next = 0;
262 tasklet_init(&asd_ha->seq.dl_tasklet, asd_dl_tasklet_handler,
263 (unsigned long) asd_ha);
270 static int asd_alloc_edbs(struct asd_ha_struct *asd_ha, gfp_t gfp_flags)
272 struct asd_seq_data *seq = &asd_ha->seq;
281 seq->edb_arr[i] = asd_alloc_coherent(asd_ha, ASD_EDB_SIZE,
294 asd_free_coherent(asd_ha, seq->edb_arr[i]);
301 static int asd_alloc_escbs(struct asd_ha_struct *asd_ha,
304 struct asd_seq_data *seq = &asd_ha->seq;
314 escb = asd_ascb_alloc_list(asd_ha, &escbs, gfp_flags);
337 static void asd_assign_edbs2escbs(struct asd_ha_struct *asd_ha)
339 struct asd_seq_data *seq = &asd_ha->seq;
363 * @asd_ha: pointer to host adapter structure
368 static int asd_init_escbs(struct asd_ha_struct *asd_ha)
370 struct asd_seq_data *seq = &asd_ha->seq;
374 int edbs = 2*(1+asd_ha->hw_prof.num_phys);
379 err = asd_alloc_edbs(asd_ha, GFP_KERNEL);
385 err = asd_alloc_escbs(asd_ha, GFP_KERNEL);
391 asd_assign_edbs2escbs(asd_ha);
398 seq->can_queue = 1 + (asd_ha->hw_prof.max_scbs - seq->pending)/2;
407 * @asd_ha: pointer to host adapter structure
412 int asd_chip_hardrst(struct asd_ha_struct *asd_ha)
419 asd_write_reg_dword(asd_ha, COMBIST, HARDRST);
424 reg = asd_read_reg_dword(asd_ha, CHIMINT);
426 asd_write_reg_dword(asd_ha, CHIMINT,
437 * @asd_ha: pointer to host adapter structure
441 * enable HA interrupts with asd_enable_ints(asd_ha).
443 static int asd_init_chip(struct asd_ha_struct *asd_ha)
447 err = asd_chip_hardrst(asd_ha);
450 pci_name(asd_ha->pcidev));
454 asd_disable_ints(asd_ha);
456 err = asd_init_seqs(asd_ha);
459 pci_name(asd_ha->pcidev));
463 err = asd_start_seqs(asd_ha);
466 pci_name(asd_ha->pcidev));
487 static void asd_extend_devctx_ocm(struct asd_ha_struct *asd_ha)
492 dma_addr -= asd_ha->hw_prof.max_ddbs * ASD_DDB_SIZE;
493 asd_write_reg_addr(asd_ha, DEVCTXBASE, (dma_addr_t) dma_addr);
494 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
496 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
497 asd_ha->hw_prof.max_ddbs += MAX_DEVS;
500 static int asd_extend_devctx(struct asd_ha_struct *asd_ha)
507 asd_extend_devctx_ocm(asd_ha);
509 asd_ha->hw_prof.ddb_ext = NULL;
510 if (max_devs <= asd_ha->hw_prof.max_ddbs || max_devs > 0xFFFF) {
511 max_devs = asd_ha->hw_prof.max_ddbs;
515 size = (max_devs - asd_ha->hw_prof.max_ddbs + 1) * ASD_DDB_SIZE;
517 asd_ha->hw_prof.ddb_ext = asd_alloc_coherent(asd_ha, size, GFP_KERNEL);
518 if (!asd_ha->hw_prof.ddb_ext) {
521 max_devs = asd_ha->hw_prof.max_ddbs;
524 dma_handle = asd_ha->hw_prof.ddb_ext->dma_handle;
526 dma_addr -= asd_ha->hw_prof.max_ddbs * ASD_DDB_SIZE;
528 asd_write_reg_addr(asd_ha, DEVCTXBASE, dma_handle);
529 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
531 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
533 asd_ha->hw_prof.max_ddbs = max_devs;
538 static int asd_extend_cmdctx(struct asd_ha_struct *asd_ha)
545 asd_ha->hw_prof.scb_ext = NULL;
546 if (max_cmnds <= asd_ha->hw_prof.max_scbs || max_cmnds > 0xFFFF) {
547 max_cmnds = asd_ha->hw_prof.max_scbs;
551 size = (max_cmnds - asd_ha->hw_prof.max_scbs + 1) * ASD_SCB_SIZE;
553 asd_ha->hw_prof.scb_ext = asd_alloc_coherent(asd_ha, size, GFP_KERNEL);
554 if (!asd_ha->hw_prof.scb_ext) {
557 max_cmnds = asd_ha->hw_prof.max_scbs;
560 dma_handle = asd_ha->hw_prof.scb_ext->dma_handle;
562 dma_addr -= asd_ha->hw_prof.max_scbs * ASD_SCB_SIZE;
564 asd_write_reg_addr(asd_ha, CMDCTXBASE, dma_handle);
565 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
567 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
569 asd_ha->hw_prof.max_scbs = max_cmnds;
576 * @asd_ha: pointer to host adapter structure
586 static int asd_init_ctxmem(struct asd_ha_struct *asd_ha)
590 asd_get_max_scb_ddb(asd_ha);
591 asd_extend_devctx(asd_ha);
592 asd_extend_cmdctx(asd_ha);
595 bitmap_bytes = (asd_ha->hw_prof.max_ddbs+7)/8;
597 asd_ha->hw_prof.ddb_bitmap = kzalloc(bitmap_bytes, GFP_KERNEL);
598 if (!asd_ha->hw_prof.ddb_bitmap)
600 spin_lock_init(&asd_ha->hw_prof.ddb_lock);
605 int asd_init_hw(struct asd_ha_struct *asd_ha)
610 err = asd_init_sw(asd_ha);
614 err = pci_read_config_dword(asd_ha->pcidev, PCIC_HSTPCIX_CNTRL, &v);
617 pci_name(asd_ha->pcidev));
620 err = pci_write_config_dword(asd_ha->pcidev, PCIC_HSTPCIX_CNTRL,
624 pci_name(asd_ha->pcidev));
628 err = asd_read_ocm(asd_ha);
635 err = asd_read_flash(asd_ha);
643 asd_init_ctxmem(asd_ha);
645 if (asd_get_user_sas_addr(asd_ha)) {
647 pci_name(asd_ha->pcidev));
652 asd_propagate_sas_addr(asd_ha);
654 err = asd_init_phys(asd_ha);
657 pci_name(asd_ha->pcidev));
661 asd_init_ports(asd_ha);
663 err = asd_init_scbs(asd_ha);
666 pci_name(asd_ha->pcidev));
670 err = asd_init_dl(asd_ha);
677 err = asd_init_escbs(asd_ha);
683 err = asd_init_chip(asd_ha);
696 * @asd_ha: pointer to host adapter structure of interest
704 static void asd_chip_reset(struct asd_ha_struct *asd_ha)
706 ASD_DPRINTK("chip reset for %s\n", pci_name(asd_ha->pcidev));
707 asd_chip_hardrst(asd_ha);
714 struct asd_ha_struct *asd_ha = (struct asd_ha_struct *) data;
715 struct asd_seq_data *seq = &asd_ha->seq;
755 * @asd_ha: pointer to host adapter structure
757 static void asd_process_donelist_isr(struct asd_ha_struct *asd_ha)
759 tasklet_schedule(&asd_ha->seq.dl_tasklet);
764 * @asd_ha: pointer to host adapter structure
766 static void asd_com_sas_isr(struct asd_ha_struct *asd_ha)
768 u32 comstat = asd_read_reg_dword(asd_ha, COMSTAT);
771 asd_write_reg_dword(asd_ha, COMSTAT, 0xFFFFFFFF);
775 pci_name(asd_ha->pcidev));
778 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
782 pci_name(asd_ha->pcidev),
784 asd_read_reg_dword(asd_ha, CSDMAADR),
785 asd_read_reg_dword(asd_ha, CSDMAADR+4));
789 asd_read_reg_dword(asd_ha, CSBUFFER),
790 asd_read_reg_dword(asd_ha, CSBUFFER+4),
791 asd_read_reg_dword(asd_ha, CSBUFFER+8),
792 asd_read_reg_dword(asd_ha, CSBUFFER+12));
794 asd_dump_seq_state(asd_ha, 0);
796 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
799 pci_name(asd_ha->pcidev),
802 asd_chip_reset(asd_ha);
805 static void asd_arp2_err(struct asd_ha_struct *asd_ha, u32 dchstatus)
847 u32 arp2int = asd_read_reg_dword(asd_ha, CARP2INT);
851 pci_name(asd_ha->pcidev),
855 pci_name(asd_ha->pcidev),
859 pci_name(asd_ha->pcidev),
867 u32 arp2int = asd_read_reg_dword(asd_ha,
872 pci_name(asd_ha->pcidev),
877 pci_name(asd_ha->pcidev),
881 pci_name(asd_ha->pcidev), lseq,
885 asd_chip_reset(asd_ha);
890 * @asd_ha: pointer to host adapter structure
892 static void asd_dch_sas_isr(struct asd_ha_struct *asd_ha)
894 u32 dchstatus = asd_read_reg_dword(asd_ha, DCHSTATUS);
897 asd_printk("%s: CFIFTOERR\n", pci_name(asd_ha->pcidev));
898 asd_chip_reset(asd_ha);
900 asd_arp2_err(asd_ha, dchstatus);
905 * @asd_ha: pointer to host adapter structure
907 static void asd_rbi_exsi_isr(struct asd_ha_struct *asd_ha)
909 u32 stat0r = asd_read_reg_dword(asd_ha, ASISTAT0R);
918 pci_name(asd_ha->pcidev));
920 u32 stat1r = asd_read_reg_dword(asd_ha, ASISTAT1R);
923 pci_name(asd_ha->pcidev));
925 u32 statr = asd_read_reg_dword(asd_ha, ASIERRSTATR);
931 u32 addr = asd_read_reg_dword(asd_ha, ASIERRADDR);
932 u32 data = asd_read_reg_dword(asd_ha, ASIERRDATAR);
937 pci_name(asd_ha->pcidev),
946 asd_chip_reset(asd_ha);
951 * @asd_ha: pointer to host adapter structure
955 static void asd_hst_pcix_isr(struct asd_ha_struct *asd_ha)
961 pci_read_config_word(asd_ha->pcidev, PCI_STATUS, &status);
962 pci_read_config_dword(asd_ha->pcidev, PCIX_STATUS, &pcix_status);
963 pci_read_config_dword(asd_ha->pcidev, ECC_CTRL_STAT, &ecc_status);
966 asd_printk("parity error for %s\n", pci_name(asd_ha->pcidev));
968 asd_printk("master abort for %s\n", pci_name(asd_ha->pcidev));
970 asd_printk("target abort for %s\n", pci_name(asd_ha->pcidev));
972 asd_printk("data parity for %s\n", pci_name(asd_ha->pcidev));
975 pci_name(asd_ha->pcidev));
976 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
981 pci_name(asd_ha->pcidev));
982 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
987 pci_name(asd_ha->pcidev));
990 pci_name(asd_ha->pcidev));
991 asd_chip_reset(asd_ha);
1003 struct asd_ha_struct *asd_ha = dev_id;
1004 u32 chimint = asd_read_reg_dword(asd_ha, CHIMINT);
1009 asd_write_reg_dword(asd_ha, CHIMINT, chimint);
1010 (void) asd_read_reg_dword(asd_ha, CHIMINT);
1013 asd_process_donelist_isr(asd_ha);
1015 asd_com_sas_isr(asd_ha);
1017 asd_dch_sas_isr(asd_ha);
1019 asd_rbi_exsi_isr(asd_ha);
1021 asd_hst_pcix_isr(asd_ha);
1028 static struct asd_ascb *asd_ascb_alloc(struct asd_ha_struct *asd_ha,
1032 struct asd_seq_data *seq = &asd_ha->seq;
1040 ascb->dma_scb.vaddr = dma_pool_zalloc(asd_ha->scb_pool,
1047 asd_init_ascb(asd_ha, ascb);
1060 dma_pool_free(asd_ha->scb_pool, ascb->dma_scb.vaddr,
1069 * @asd_ha: pointer to host adapter structure
1084 *asd_ha, int *num,
1090 struct asd_ascb *ascb = asd_ascb_alloc(asd_ha, gfp_flags);
1111 * @asd_ha: pointer to host adapter structure
1127 static void asd_swap_head_scb(struct asd_ha_struct *asd_ha,
1130 struct asd_seq_data *seq = &asd_ha->seq;
1167 * @asd_ha: pointer to a host adapter structure
1184 int asd_post_ascb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1191 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1192 can_queue = asd_ha->hw_prof.max_scbs - asd_ha->seq.pending;
1194 asd_ha->seq.pending += num;
1199 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1200 asd_printk("%s: scb queue full\n", pci_name(asd_ha->pcidev));
1204 asd_swap_head_scb(asd_ha, ascb);
1210 asd_ha->seq.scbpro += num;
1211 list_splice_init(&list, asd_ha->seq.pend_q.prev);
1212 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1213 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1220 * @asd_ha: pointer to a host adapter structure
1236 int asd_post_escb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1241 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1242 asd_swap_head_scb(asd_ha, ascb);
1243 asd_ha->seq.scbpro += num;
1244 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1245 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1254 * @asd_ha: pointer to host adapter structure
1258 void asd_turn_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1261 u32 v = asd_read_reg_dword(asd_ha, LmCONTROL(phy_id));
1266 asd_write_reg_dword(asd_ha, LmCONTROL(phy_id), v);
1272 * @asd_ha: pointer to host adapter structure
1279 void asd_control_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1284 v = asd_read_reg_dword(asd_ha, GPIOOER);
1289 asd_write_reg_dword(asd_ha, GPIOOER, v);
1291 v = asd_read_reg_dword(asd_ha, GPIOCNFGR);
1296 asd_write_reg_dword(asd_ha, GPIOCNFGR, v);
1302 static int asd_enable_phy(struct asd_ha_struct *asd_ha, int phy_id)
1304 struct asd_phy *phy = &asd_ha->phys[phy_id];
1306 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, INT_ENABLE_2), 0);
1307 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, HOT_PLUG_DELAY),
1312 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_0),
1314 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_1),
1316 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_2),
1318 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_3),
1321 asd_write_reg_dword(asd_ha, LmSEQ_TEN_MS_COMINIT_TIMEOUT(phy_id),
1324 asd_write_reg_addr(asd_ha, LmSEQ_TX_ID_ADDR_FRAME(phy_id),
1327 asd_control_led(asd_ha, phy_id, 1);
1332 int asd_enable_phys(struct asd_ha_struct *asd_ha, const u8 phy_mask)
1347 asd_enable_phy(asd_ha, i);
1351 ascb_list = asd_ascb_alloc_list(asd_ha, &k, GFP_KERNEL);
1364 k = asd_post_ascb_list(asd_ha, ascb_list, num);