• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/scsi/aic94xx/

Lines Matching refs:asd_ha

43 static int asd_get_user_sas_addr(struct asd_ha_struct *asd_ha)
46 if (asd_ha->hw_prof.sas_addr[0])
49 return sas_request_addr(asd_ha->sas_ha.core.shost,
50 asd_ha->hw_prof.sas_addr);
53 static void asd_propagate_sas_addr(struct asd_ha_struct *asd_ha)
58 if (asd_ha->hw_prof.phy_desc[i].sas_addr[0] == 0)
63 SAS_ADDR(asd_ha->hw_prof.sas_addr));
64 memcpy(asd_ha->hw_prof.phy_desc[i].sas_addr,
65 asd_ha->hw_prof.sas_addr, SAS_ADDR_SIZE);
89 struct asd_ha_struct *asd_ha = phy->sas_phy.ha->lldd_ha;
101 phy->id_frm_tok = asd_alloc_coherent(asd_ha,
115 static void asd_init_ports(struct asd_ha_struct *asd_ha)
119 spin_lock_init(&asd_ha->asd_ports_lock);
121 struct asd_port *asd_port = &asd_ha->asd_ports[i];
130 static int asd_init_phys(struct asd_ha_struct *asd_ha)
133 u8 phy_mask = asd_ha->hw_prof.enabled_phys;
136 struct asd_phy *phy = &asd_ha->phys[i];
138 phy->phy_desc = &asd_ha->hw_prof.phy_desc[i];
145 phy->sas_phy.ha = &asd_ha->sas_ha;
151 int err = asd_init_phy(&asd_ha->phys[i]);
161 static int asd_init_sw(struct asd_ha_struct *asd_ha)
163 struct pci_dev *pcidev = asd_ha->pcidev;
189 asd_ha->io_handle[0].swa_base = REG_BASE_ADDR;
190 asd_ha->io_handle[0].swb_base = REG_BASE_ADDR_CSEQCIO;
191 asd_ha->io_handle[0].swc_base = REG_BASE_ADDR_EXSI;
192 MBAR0_SWB_SIZE = asd_ha->io_handle[0].len - 0x80;
193 if (!asd_ha->iospace) {
196 asd_ha->io_handle[1].swa_base = OCM_BASE_ADDR;
198 spin_lock_init(&asd_ha->iolock);
207 * @asd_ha: pointer to host adapter structure
216 static int asd_init_scbs(struct asd_ha_struct *asd_ha)
218 struct asd_seq_data *seq = &asd_ha->seq;
222 asd_ha->seq.tc_index_bitmap_bits = asd_ha->hw_prof.max_scbs;
223 asd_ha->seq.tc_index_array = kzalloc(asd_ha->seq.tc_index_bitmap_bits*
225 if (!asd_ha->seq.tc_index_array)
228 bitmap_bytes = (asd_ha->seq.tc_index_bitmap_bits+7)/8;
230 asd_ha->seq.tc_index_bitmap = kzalloc(bitmap_bytes, GFP_KERNEL);
231 if (!asd_ha->seq.tc_index_bitmap)
237 seq->next_scb.vaddr = dma_pool_alloc(asd_ha->scb_pool, GFP_KERNEL,
240 kfree(asd_ha->seq.tc_index_bitmap);
241 kfree(asd_ha->seq.tc_index_array);
242 asd_ha->seq.tc_index_bitmap = NULL;
243 asd_ha->seq.tc_index_array = NULL;
254 static void asd_get_max_scb_ddb(struct asd_ha_struct *asd_ha)
256 asd_ha->hw_prof.max_scbs = asd_get_cmdctx_size(asd_ha)/ASD_SCB_SIZE;
257 asd_ha->hw_prof.max_ddbs = asd_get_devctx_size(asd_ha)/ASD_DDB_SIZE;
259 asd_ha->hw_prof.max_scbs,
260 asd_ha->hw_prof.max_ddbs);
267 static int asd_init_dl(struct asd_ha_struct *asd_ha)
269 asd_ha->seq.actual_dl
270 = asd_alloc_coherent(asd_ha,
273 if (!asd_ha->seq.actual_dl)
275 asd_ha->seq.dl = asd_ha->seq.actual_dl->vaddr;
276 asd_ha->seq.dl_toggle = ASD_DEF_DL_TOGGLE;
277 asd_ha->seq.dl_next = 0;
278 tasklet_init(&asd_ha->seq.dl_tasklet, asd_dl_tasklet_handler,
279 (unsigned long) asd_ha);
286 static int asd_alloc_edbs(struct asd_ha_struct *asd_ha, gfp_t gfp_flags)
288 struct asd_seq_data *seq = &asd_ha->seq;
296 seq->edb_arr[i] = asd_alloc_coherent(asd_ha, ASD_EDB_SIZE,
309 asd_free_coherent(asd_ha, seq->edb_arr[i]);
316 static int asd_alloc_escbs(struct asd_ha_struct *asd_ha,
319 struct asd_seq_data *seq = &asd_ha->seq;
329 escb = asd_ascb_alloc_list(asd_ha, &escbs, gfp_flags);
352 static void asd_assign_edbs2escbs(struct asd_ha_struct *asd_ha)
354 struct asd_seq_data *seq = &asd_ha->seq;
378 * @asd_ha: pointer to host adapter structure
383 static int asd_init_escbs(struct asd_ha_struct *asd_ha)
385 struct asd_seq_data *seq = &asd_ha->seq;
389 int edbs = 2*(1+asd_ha->hw_prof.num_phys);
394 err = asd_alloc_edbs(asd_ha, GFP_KERNEL);
400 err = asd_alloc_escbs(asd_ha, GFP_KERNEL);
406 asd_assign_edbs2escbs(asd_ha);
413 seq->can_queue = 1 + (asd_ha->hw_prof.max_scbs - seq->pending)/2;
422 * @asd_ha: pointer to host adapter structure
427 int asd_chip_hardrst(struct asd_ha_struct *asd_ha)
434 asd_write_reg_dword(asd_ha, COMBIST, HARDRST);
439 reg = asd_read_reg_dword(asd_ha, CHIMINT);
441 asd_write_reg_dword(asd_ha, CHIMINT,
452 * @asd_ha: pointer to host adapter structure
456 * enable HA interrupts with asd_enable_ints(asd_ha).
458 static int asd_init_chip(struct asd_ha_struct *asd_ha)
462 err = asd_chip_hardrst(asd_ha);
465 pci_name(asd_ha->pcidev));
469 asd_disable_ints(asd_ha);
471 err = asd_init_seqs(asd_ha);
474 pci_name(asd_ha->pcidev));
478 err = asd_start_seqs(asd_ha);
481 pci_name(asd_ha->pcidev));
502 static void asd_extend_devctx_ocm(struct asd_ha_struct *asd_ha)
507 dma_addr -= asd_ha->hw_prof.max_ddbs * ASD_DDB_SIZE;
508 asd_write_reg_addr(asd_ha, DEVCTXBASE, (dma_addr_t) dma_addr);
509 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
511 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
512 asd_ha->hw_prof.max_ddbs += MAX_DEVS;
515 static int asd_extend_devctx(struct asd_ha_struct *asd_ha)
522 asd_extend_devctx_ocm(asd_ha);
524 asd_ha->hw_prof.ddb_ext = NULL;
525 if (max_devs <= asd_ha->hw_prof.max_ddbs || max_devs > 0xFFFF) {
526 max_devs = asd_ha->hw_prof.max_ddbs;
530 size = (max_devs - asd_ha->hw_prof.max_ddbs + 1) * ASD_DDB_SIZE;
532 asd_ha->hw_prof.ddb_ext = asd_alloc_coherent(asd_ha, size, GFP_KERNEL);
533 if (!asd_ha->hw_prof.ddb_ext) {
536 max_devs = asd_ha->hw_prof.max_ddbs;
539 dma_handle = asd_ha->hw_prof.ddb_ext->dma_handle;
541 dma_addr -= asd_ha->hw_prof.max_ddbs * ASD_DDB_SIZE;
543 asd_write_reg_addr(asd_ha, DEVCTXBASE, dma_handle);
544 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
546 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
548 asd_ha->hw_prof.max_ddbs = max_devs;
553 static int asd_extend_cmdctx(struct asd_ha_struct *asd_ha)
560 asd_ha->hw_prof.scb_ext = NULL;
561 if (max_cmnds <= asd_ha->hw_prof.max_scbs || max_cmnds > 0xFFFF) {
562 max_cmnds = asd_ha->hw_prof.max_scbs;
566 size = (max_cmnds - asd_ha->hw_prof.max_scbs + 1) * ASD_SCB_SIZE;
568 asd_ha->hw_prof.scb_ext = asd_alloc_coherent(asd_ha, size, GFP_KERNEL);
569 if (!asd_ha->hw_prof.scb_ext) {
572 max_cmnds = asd_ha->hw_prof.max_scbs;
575 dma_handle = asd_ha->hw_prof.scb_ext->dma_handle;
577 dma_addr -= asd_ha->hw_prof.max_scbs * ASD_SCB_SIZE;
579 asd_write_reg_addr(asd_ha, CMDCTXBASE, dma_handle);
580 d = asd_read_reg_dword(asd_ha, CTXDOMAIN);
582 asd_write_reg_dword(asd_ha, CTXDOMAIN, d);
584 asd_ha->hw_prof.max_scbs = max_cmnds;
591 * asd_ha: pointer to host adapter structure
601 static int asd_init_ctxmem(struct asd_ha_struct *asd_ha)
605 asd_get_max_scb_ddb(asd_ha);
606 asd_extend_devctx(asd_ha);
607 asd_extend_cmdctx(asd_ha);
610 bitmap_bytes = (asd_ha->hw_prof.max_ddbs+7)/8;
612 asd_ha->hw_prof.ddb_bitmap = kzalloc(bitmap_bytes, GFP_KERNEL);
613 if (!asd_ha->hw_prof.ddb_bitmap)
615 spin_lock_init(&asd_ha->hw_prof.ddb_lock);
620 int asd_init_hw(struct asd_ha_struct *asd_ha)
625 err = asd_init_sw(asd_ha);
629 err = pci_read_config_dword(asd_ha->pcidev, PCIC_HSTPCIX_CNTRL, &v);
632 pci_name(asd_ha->pcidev));
635 pci_write_config_dword(asd_ha->pcidev, PCIC_HSTPCIX_CNTRL,
639 pci_name(asd_ha->pcidev));
643 err = asd_read_ocm(asd_ha);
650 err = asd_read_flash(asd_ha);
658 asd_init_ctxmem(asd_ha);
660 if (asd_get_user_sas_addr(asd_ha)) {
662 pci_name(asd_ha->pcidev));
667 asd_propagate_sas_addr(asd_ha);
669 err = asd_init_phys(asd_ha);
672 pci_name(asd_ha->pcidev));
676 asd_init_ports(asd_ha);
678 err = asd_init_scbs(asd_ha);
681 pci_name(asd_ha->pcidev));
685 err = asd_init_dl(asd_ha);
692 err = asd_init_escbs(asd_ha);
698 err = asd_init_chip(asd_ha);
709 static void asd_chip_reset(struct asd_ha_struct *asd_ha)
711 struct sas_ha_struct *sas_ha = &asd_ha->sas_ha;
713 ASD_DPRINTK("chip reset for %s\n", pci_name(asd_ha->pcidev));
714 asd_chip_hardrst(asd_ha);
722 struct asd_ha_struct *asd_ha = (struct asd_ha_struct *) data;
723 struct asd_seq_data *seq = &asd_ha->seq;
763 * @asd_ha: pointer to host adapter structure
765 static void asd_process_donelist_isr(struct asd_ha_struct *asd_ha)
767 tasklet_schedule(&asd_ha->seq.dl_tasklet);
772 * @asd_ha: pointer to host adapter structure
774 static void asd_com_sas_isr(struct asd_ha_struct *asd_ha)
776 u32 comstat = asd_read_reg_dword(asd_ha, COMSTAT);
779 asd_write_reg_dword(asd_ha, COMSTAT, 0xFFFFFFFF);
783 pci_name(asd_ha->pcidev));
786 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
790 pci_name(asd_ha->pcidev),
792 asd_read_reg_dword(asd_ha, CSDMAADR),
793 asd_read_reg_dword(asd_ha, CSDMAADR+4));
797 asd_read_reg_dword(asd_ha, CSBUFFER),
798 asd_read_reg_dword(asd_ha, CSBUFFER+4),
799 asd_read_reg_dword(asd_ha, CSBUFFER+8),
800 asd_read_reg_dword(asd_ha, CSBUFFER+12));
802 asd_dump_seq_state(asd_ha, 0);
804 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
807 pci_name(asd_ha->pcidev),
810 asd_chip_reset(asd_ha);
813 static void asd_arp2_err(struct asd_ha_struct *asd_ha, u32 dchstatus)
855 u32 arp2int = asd_read_reg_dword(asd_ha, CARP2INT);
859 pci_name(asd_ha->pcidev),
863 pci_name(asd_ha->pcidev),
867 pci_name(asd_ha->pcidev),
875 u32 arp2int = asd_read_reg_dword(asd_ha,
880 pci_name(asd_ha->pcidev),
884 pci_name(asd_ha->pcidev),
888 pci_name(asd_ha->pcidev), lseq,
892 asd_chip_reset(asd_ha);
897 * @asd_ha: pointer to host adapter structure
899 static void asd_dch_sas_isr(struct asd_ha_struct *asd_ha)
901 u32 dchstatus = asd_read_reg_dword(asd_ha, DCHSTATUS);
904 asd_printk("%s: CFIFTOERR\n", pci_name(asd_ha->pcidev));
905 asd_chip_reset(asd_ha);
907 asd_arp2_err(asd_ha, dchstatus);
912 * @asd_ha: pointer to host adapter structure
914 static void asd_rbi_exsi_isr(struct asd_ha_struct *asd_ha)
916 u32 stat0r = asd_read_reg_dword(asd_ha, ASISTAT0R);
925 pci_name(asd_ha->pcidev));
927 u32 stat1r = asd_read_reg_dword(asd_ha, ASISTAT1R);
930 pci_name(asd_ha->pcidev));
932 u32 statr = asd_read_reg_dword(asd_ha, ASIERRSTATR);
938 u32 addr = asd_read_reg_dword(asd_ha, ASIERRADDR);
939 u32 data = asd_read_reg_dword(asd_ha, ASIERRDATAR);
944 pci_name(asd_ha->pcidev),
953 asd_chip_reset(asd_ha);
958 * @asd_ha: pointer to host adapter structure
962 static void asd_hst_pcix_isr(struct asd_ha_struct *asd_ha)
968 pci_read_config_word(asd_ha->pcidev, PCI_STATUS, &status);
969 pci_read_config_dword(asd_ha->pcidev, PCIX_STATUS, &pcix_status);
970 pci_read_config_dword(asd_ha->pcidev, ECC_CTRL_STAT, &ecc_status);
973 asd_printk("parity error for %s\n", pci_name(asd_ha->pcidev));
975 asd_printk("master abort for %s\n", pci_name(asd_ha->pcidev));
977 asd_printk("target abort for %s\n", pci_name(asd_ha->pcidev));
979 asd_printk("data parity for %s\n", pci_name(asd_ha->pcidev));
982 pci_name(asd_ha->pcidev));
983 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
987 pci_name(asd_ha->pcidev));
988 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
993 pci_name(asd_ha->pcidev));
996 pci_name(asd_ha->pcidev));
997 asd_chip_reset(asd_ha);
1009 struct asd_ha_struct *asd_ha = dev_id;
1010 u32 chimint = asd_read_reg_dword(asd_ha, CHIMINT);
1015 asd_write_reg_dword(asd_ha, CHIMINT, chimint);
1016 (void) asd_read_reg_dword(asd_ha, CHIMINT);
1019 asd_process_donelist_isr(asd_ha);
1021 asd_com_sas_isr(asd_ha);
1023 asd_dch_sas_isr(asd_ha);
1025 asd_rbi_exsi_isr(asd_ha);
1027 asd_hst_pcix_isr(asd_ha);
1034 static struct asd_ascb *asd_ascb_alloc(struct asd_ha_struct *asd_ha,
1038 struct asd_seq_data *seq = &asd_ha->seq;
1046 ascb->dma_scb.vaddr = dma_pool_alloc(asd_ha->scb_pool,
1054 asd_init_ascb(asd_ha, ascb);
1067 dma_pool_free(asd_ha->scb_pool, ascb->dma_scb.vaddr,
1076 * @asd_ha: pointer to host adapter structure
1091 *asd_ha, int *num,
1097 struct asd_ascb *ascb = asd_ascb_alloc(asd_ha, gfp_flags);
1118 * @asd_ha: pointer to host adapter structure
1134 static void asd_swap_head_scb(struct asd_ha_struct *asd_ha,
1137 struct asd_seq_data *seq = &asd_ha->seq;
1176 * @asd_ha: pointer to a host adapter structure
1194 int asd_post_ascb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1201 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1202 can_queue = asd_ha->hw_prof.max_scbs - asd_ha->seq.pending;
1204 asd_ha->seq.pending += num;
1209 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1210 asd_printk("%s: scb queue full\n", pci_name(asd_ha->pcidev));
1214 asd_swap_head_scb(asd_ha, ascb);
1220 asd_ha->seq.scbpro += num;
1221 list_splice_init(&list, asd_ha->seq.pend_q.prev);
1222 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1223 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1230 * @asd_ha: pointer to a host adapter structure
1246 int asd_post_escb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1251 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1252 asd_swap_head_scb(asd_ha, ascb);
1253 asd_ha->seq.scbpro += num;
1254 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1255 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1264 * @asd_ha: pointer to host adapter structure
1268 void asd_turn_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1271 u32 v = asd_read_reg_dword(asd_ha, LmCONTROL(phy_id));
1276 asd_write_reg_dword(asd_ha, LmCONTROL(phy_id), v);
1282 * @asd_ha: pointer to host adapter structure
1289 void asd_control_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1294 v = asd_read_reg_dword(asd_ha, GPIOOER);
1299 asd_write_reg_dword(asd_ha, GPIOOER, v);
1301 v = asd_read_reg_dword(asd_ha, GPIOCNFGR);
1306 asd_write_reg_dword(asd_ha, GPIOCNFGR, v);
1312 static int asd_enable_phy(struct asd_ha_struct *asd_ha, int phy_id)
1314 struct asd_phy *phy = &asd_ha->phys[phy_id];
1316 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, INT_ENABLE_2), 0);
1317 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, HOT_PLUG_DELAY),
1321 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_0),
1323 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_1),
1325 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_2),
1327 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_3),
1330 asd_write_reg_dword(asd_ha, LmSEQ_TEN_MS_COMINIT_TIMEOUT(phy_id),
1333 asd_write_reg_addr(asd_ha, LmSEQ_TX_ID_ADDR_FRAME(phy_id),
1336 asd_control_led(asd_ha, phy_id, 1);
1341 int asd_enable_phys(struct asd_ha_struct *asd_ha, const u8 phy_mask)
1356 asd_enable_phy(asd_ha, i);
1360 ascb_list = asd_ascb_alloc_list(asd_ha, &k, GFP_KERNEL);
1373 k = asd_post_ascb_list(asd_ha, ascb_list, num);