• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/scsi/aic94xx/

Lines Matching defs:asd_ha

41 static void asd_get_user_sas_addr(struct asd_ha_struct *asd_ha)
47 asd_destringify_sas_addr(asd_ha->hw_prof.sas_addr,
49 else if (asd_ha->hw_prof.sas_addr[0] != 0)
50 asd_stringify_sas_addr(sas_addr_str, 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 inline 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 asd_get_user_sas_addr(asd_ha);
661 if (!asd_ha->hw_prof.sas_addr[0]) {
663 pci_name(asd_ha->pcidev));
668 asd_propagate_sas_addr(asd_ha);
670 err = asd_init_phys(asd_ha);
673 pci_name(asd_ha->pcidev));
677 asd_init_ports(asd_ha);
679 err = asd_init_scbs(asd_ha);
682 pci_name(asd_ha->pcidev));
686 err = asd_init_dl(asd_ha);
693 err = asd_init_escbs(asd_ha);
699 err = asd_init_chip(asd_ha);
710 static void asd_chip_reset(struct asd_ha_struct *asd_ha)
712 struct sas_ha_struct *sas_ha = &asd_ha->sas_ha;
714 ASD_DPRINTK("chip reset for %s\n", pci_name(asd_ha->pcidev));
715 asd_chip_hardrst(asd_ha);
723 struct asd_ha_struct *asd_ha = (struct asd_ha_struct *) data;
724 struct asd_seq_data *seq = &asd_ha->seq;
764 * @asd_ha: pointer to host adapter structure
766 static inline void asd_process_donelist_isr(struct asd_ha_struct *asd_ha)
768 tasklet_schedule(&asd_ha->seq.dl_tasklet);
773 * @asd_ha: pointer to host adapter structure
775 static inline void asd_com_sas_isr(struct asd_ha_struct *asd_ha)
777 u32 comstat = asd_read_reg_dword(asd_ha, COMSTAT);
780 asd_write_reg_dword(asd_ha, COMSTAT, 0xFFFFFFFF);
784 pci_name(asd_ha->pcidev));
787 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
791 pci_name(asd_ha->pcidev),
793 asd_read_reg_dword(asd_ha, CSDMAADR),
794 asd_read_reg_dword(asd_ha, CSDMAADR+4));
798 asd_read_reg_dword(asd_ha, CSBUFFER),
799 asd_read_reg_dword(asd_ha, CSBUFFER+4),
800 asd_read_reg_dword(asd_ha, CSBUFFER+8),
801 asd_read_reg_dword(asd_ha, CSBUFFER+12));
803 asd_dump_seq_state(asd_ha, 0);
805 u32 dmaerr = asd_read_reg_dword(asd_ha, DMAERR);
808 pci_name(asd_ha->pcidev),
811 asd_chip_reset(asd_ha);
814 static inline void asd_arp2_err(struct asd_ha_struct *asd_ha, u32 dchstatus)
856 u32 arp2int = asd_read_reg_dword(asd_ha, CARP2INT);
860 pci_name(asd_ha->pcidev),
864 pci_name(asd_ha->pcidev),
868 pci_name(asd_ha->pcidev),
876 u32 arp2int = asd_read_reg_dword(asd_ha,
881 pci_name(asd_ha->pcidev),
885 pci_name(asd_ha->pcidev),
889 pci_name(asd_ha->pcidev), lseq,
893 asd_chip_reset(asd_ha);
898 * @asd_ha: pointer to host adapter structure
900 static inline void asd_dch_sas_isr(struct asd_ha_struct *asd_ha)
902 u32 dchstatus = asd_read_reg_dword(asd_ha, DCHSTATUS);
905 asd_printk("%s: CFIFTOERR\n", pci_name(asd_ha->pcidev));
906 asd_chip_reset(asd_ha);
908 asd_arp2_err(asd_ha, dchstatus);
913 * @asd_ha: pointer to host adapter structure
915 static inline void asd_rbi_exsi_isr(struct asd_ha_struct *asd_ha)
917 u32 stat0r = asd_read_reg_dword(asd_ha, ASISTAT0R);
926 pci_name(asd_ha->pcidev));
928 u32 stat1r = asd_read_reg_dword(asd_ha, ASISTAT1R);
931 pci_name(asd_ha->pcidev));
933 u32 statr = asd_read_reg_dword(asd_ha, ASIERRSTATR);
939 u32 addr = asd_read_reg_dword(asd_ha, ASIERRADDR);
940 u32 data = asd_read_reg_dword(asd_ha, ASIERRDATAR);
945 pci_name(asd_ha->pcidev),
954 asd_chip_reset(asd_ha);
959 * @asd_ha: pointer to host adapter structure
963 static inline void asd_hst_pcix_isr(struct asd_ha_struct *asd_ha)
969 pci_read_config_word(asd_ha->pcidev, PCI_STATUS, &status);
970 pci_read_config_dword(asd_ha->pcidev, PCIX_STATUS, &pcix_status);
971 pci_read_config_dword(asd_ha->pcidev, ECC_CTRL_STAT, &ecc_status);
974 asd_printk("parity error for %s\n", pci_name(asd_ha->pcidev));
976 asd_printk("master abort for %s\n", pci_name(asd_ha->pcidev));
978 asd_printk("target abort for %s\n", pci_name(asd_ha->pcidev));
980 asd_printk("data parity for %s\n", pci_name(asd_ha->pcidev));
983 pci_name(asd_ha->pcidev));
984 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
988 pci_name(asd_ha->pcidev));
989 pci_write_config_dword(asd_ha->pcidev,PCIX_STATUS,pcix_status);
994 pci_name(asd_ha->pcidev));
997 pci_name(asd_ha->pcidev));
998 asd_chip_reset(asd_ha);
1010 struct asd_ha_struct *asd_ha = dev_id;
1011 u32 chimint = asd_read_reg_dword(asd_ha, CHIMINT);
1016 asd_write_reg_dword(asd_ha, CHIMINT, chimint);
1017 (void) asd_read_reg_dword(asd_ha, CHIMINT);
1020 asd_process_donelist_isr(asd_ha);
1022 asd_com_sas_isr(asd_ha);
1024 asd_dch_sas_isr(asd_ha);
1026 asd_rbi_exsi_isr(asd_ha);
1028 asd_hst_pcix_isr(asd_ha);
1035 static inline struct asd_ascb *asd_ascb_alloc(struct asd_ha_struct *asd_ha,
1039 struct asd_seq_data *seq = &asd_ha->seq;
1047 ascb->dma_scb.vaddr = dma_pool_alloc(asd_ha->scb_pool,
1055 asd_init_ascb(asd_ha, ascb);
1068 dma_pool_free(asd_ha->scb_pool, ascb->dma_scb.vaddr,
1077 * @asd_ha: pointer to host adapter structure
1092 *asd_ha, int *num,
1098 struct asd_ascb *ascb = asd_ascb_alloc(asd_ha, gfp_flags);
1119 * @asd_ha: pointer to host adapter structure
1135 static inline void asd_swap_head_scb(struct asd_ha_struct *asd_ha,
1138 struct asd_seq_data *seq = &asd_ha->seq;
1177 * @asd_ha: pointer to a host adapter structure
1195 int asd_post_ascb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1202 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1203 can_queue = asd_ha->hw_prof.max_scbs - asd_ha->seq.pending;
1205 asd_ha->seq.pending += num;
1210 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1211 asd_printk("%s: scb queue full\n", pci_name(asd_ha->pcidev));
1215 asd_swap_head_scb(asd_ha, ascb);
1221 asd_ha->seq.scbpro += num;
1222 list_splice_init(&list, asd_ha->seq.pend_q.prev);
1223 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1224 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1231 * @asd_ha: pointer to a host adapter structure
1247 int asd_post_escb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
1252 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
1253 asd_swap_head_scb(asd_ha, ascb);
1254 asd_ha->seq.scbpro += num;
1255 asd_write_reg_dword(asd_ha, SCBPRO, (u32)asd_ha->seq.scbpro);
1256 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
1265 * @asd_ha: pointer to host adapter structure
1269 void asd_turn_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1272 u32 v = asd_read_reg_dword(asd_ha, LmCONTROL(phy_id));
1277 asd_write_reg_dword(asd_ha, LmCONTROL(phy_id), v);
1283 * @asd_ha: pointer to host adapter structure
1290 void asd_control_led(struct asd_ha_struct *asd_ha, int phy_id, int op)
1295 v = asd_read_reg_dword(asd_ha, GPIOOER);
1300 asd_write_reg_dword(asd_ha, GPIOOER, v);
1302 v = asd_read_reg_dword(asd_ha, GPIOCNFGR);
1307 asd_write_reg_dword(asd_ha, GPIOCNFGR, v);
1313 static int asd_enable_phy(struct asd_ha_struct *asd_ha, int phy_id)
1315 struct asd_phy *phy = &asd_ha->phys[phy_id];
1317 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, INT_ENABLE_2), 0);
1318 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, HOT_PLUG_DELAY),
1322 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_0),
1324 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_1),
1326 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_2),
1328 asd_write_reg_byte(asd_ha, LmSEQ_OOB_REG(phy_id, PHY_CONTROL_3),
1331 asd_write_reg_dword(asd_ha, LmSEQ_TEN_MS_COMINIT_TIMEOUT(phy_id),
1334 asd_write_reg_addr(asd_ha, LmSEQ_TX_ID_ADDR_FRAME(phy_id),
1337 asd_control_led(asd_ha, phy_id, 1);
1342 int asd_enable_phys(struct asd_ha_struct *asd_ha, const u8 phy_mask)
1357 asd_enable_phy(asd_ha, i);
1361 ascb_list = asd_ascb_alloc_list(asd_ha, &k, GFP_KERNEL);
1374 k = asd_post_ascb_list(asd_ha, ascb_list, num);