• 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.36/drivers/scsi/aic94xx/

Lines Matching refs:asd_ha

90 static int __devinit asd_map_memio(struct asd_ha_struct *asd_ha)
95 asd_ha->iospace = 0;
97 io_handle = &asd_ha->io_handle[i==0?0:1];
98 io_handle->start = pci_resource_start(asd_ha->pcidev, i);
99 io_handle->len = pci_resource_len(asd_ha->pcidev, i);
100 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i);
104 i==0?0:1, pci_name(asd_ha->pcidev));
107 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME);
110 pci_name(asd_ha->pcidev));
121 pci_name(asd_ha->pcidev));
128 pci_release_region(asd_ha->pcidev, i);
131 io_handle = &asd_ha->io_handle[0];
133 pci_release_region(asd_ha->pcidev, 0);
138 static void asd_unmap_memio(struct asd_ha_struct *asd_ha)
142 io_handle = &asd_ha->io_handle[1];
144 pci_release_region(asd_ha->pcidev, 2);
146 io_handle = &asd_ha->io_handle[0];
148 pci_release_region(asd_ha->pcidev, 0);
151 static int __devinit asd_map_ioport(struct asd_ha_struct *asd_ha)
154 struct asd_ha_addrspace *io_handle = &asd_ha->io_handle[0];
156 asd_ha->iospace = 1;
157 io_handle->start = pci_resource_start(asd_ha->pcidev, i);
158 io_handle->len = pci_resource_len(asd_ha->pcidev, i);
159 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i);
163 pci_name(asd_ha->pcidev));
166 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME);
169 pci_name(asd_ha->pcidev));
175 static void asd_unmap_ioport(struct asd_ha_struct *asd_ha)
177 pci_release_region(asd_ha->pcidev, PCI_IOBAR_OFFSET);
180 static int __devinit asd_map_ha(struct asd_ha_struct *asd_ha)
185 err = pci_read_config_word(asd_ha->pcidev, PCI_COMMAND, &cmd_reg);
188 pci_name(asd_ha->pcidev));
194 if ((err = asd_map_memio(asd_ha)))
197 if ((err = asd_map_ioport(asd_ha)))
200 pci_name(asd_ha->pcidev));
203 pci_name(asd_ha->pcidev));
212 static void asd_unmap_ha(struct asd_ha_struct *asd_ha)
214 if (asd_ha->iospace)
215 asd_unmap_ioport(asd_ha);
217 asd_unmap_memio(asd_ha);
226 static int __devinit asd_common_setup(struct asd_ha_struct *asd_ha)
230 asd_ha->revision_id = asd_ha->pcidev->revision;
233 if (asd_ha->revision_id < AIC9410_DEV_REV_B0) {
235 pci_name(asd_ha->pcidev),
236 asd_dev_rev[asd_ha->revision_id],
237 asd_ha->revision_id);
241 asd_ha->hw_prof.max_scbs = 512;
242 asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS;
243 asd_ha->hw_prof.num_phys = ASD_MAX_PHYS;
245 asd_ha->hw_prof.enabled_phys = 0xFF;
247 asd_ha->hw_prof.phy_desc[i].max_sas_lrate =
249 asd_ha->hw_prof.phy_desc[i].min_sas_lrate =
251 asd_ha->hw_prof.phy_desc[i].max_sata_lrate =
253 asd_ha->hw_prof.phy_desc[i].min_sata_lrate =
262 static int __devinit asd_aic9410_setup(struct asd_ha_struct *asd_ha)
264 int err = asd_common_setup(asd_ha);
269 asd_ha->hw_prof.addr_range = 8;
270 asd_ha->hw_prof.port_name_base = 0;
271 asd_ha->hw_prof.dev_name_base = 8;
272 asd_ha->hw_prof.sata_name_base = 16;
277 static int __devinit asd_aic9405_setup(struct asd_ha_struct *asd_ha)
279 int err = asd_common_setup(asd_ha);
284 asd_ha->hw_prof.addr_range = 4;
285 asd_ha->hw_prof.port_name_base = 0;
286 asd_ha->hw_prof.dev_name_base = 4;
287 asd_ha->hw_prof.sata_name_base = 8;
295 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
297 asd_dev_rev[asd_ha->revision_id]);
304 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
305 return snprintf(buf, PAGE_SIZE, "%d\n", asd_ha->hw_prof.bios.bld);
312 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
313 return snprintf(buf, PAGE_SIZE, "%s\n", asd_ha->hw_prof.pcba_sn);
360 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
394 if (asd_ha->bios_status == FLASH_IN_PROGRESS) {
398 err = request_firmware(&asd_ha->bios_image,
400 &asd_ha->pcidev->dev);
408 hdr_ptr = (struct bios_file_header *)asd_ha->bios_image->data;
410 if ((hdr_ptr->contrl_id.vendor != asd_ha->pcidev->vendor ||
411 hdr_ptr->contrl_id.device != asd_ha->pcidev->device) &&
412 (hdr_ptr->contrl_id.sub_vendor != asd_ha->pcidev->vendor ||
413 hdr_ptr->contrl_id.sub_device != asd_ha->pcidev->device)) {
422 asd_ha->pcidev->vendor,
423 asd_ha->pcidev->device);
428 if (hdr_ptr->filelen != asd_ha->bios_image->size) {
435 csum += asd_ha->bios_image->data[i];
443 asd_ha->bios_status = FLASH_IN_PROGRESS;
444 err = asd_write_flash_seg(asd_ha,
445 &asd_ha->bios_image->data[sizeof(*hdr_ptr)],
448 err = asd_verify_flash_seg(asd_ha,
449 &asd_ha->bios_image->data[sizeof(*hdr_ptr)],
452 asd_ha->bios_status = FLASH_IN_PROGRESS;
453 err = asd_verify_flash_seg(asd_ha,
454 &asd_ha->bios_image->data[sizeof(header)],
459 release_firmware(asd_ha->bios_image);
463 asd_ha->bios_status = err;
475 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
478 if (flash_error_table[i].err_code == asd_ha->bios_status)
481 if (asd_ha->bios_status != FLASH_IN_PROGRESS)
482 asd_ha->bios_status = FLASH_OK;
492 static int asd_create_dev_attrs(struct asd_ha_struct *asd_ha)
496 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_revision);
500 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
504 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
507 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
514 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
516 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
518 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
522 static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha)
524 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
525 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
526 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
527 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
535 int (*setup)(struct asd_ha_struct *asd_ha);
549 static int asd_create_ha_caches(struct asd_ha_struct *asd_ha)
551 asd_ha->scb_pool = dma_pool_create(ASD_DRIVER_NAME "_scb_pool",
552 &asd_ha->pcidev->dev,
555 if (!asd_ha->scb_pool) {
565 * asd_ha: pointer to host adapter structure
567 static void asd_free_edbs(struct asd_ha_struct *asd_ha)
569 struct asd_seq_data *seq = &asd_ha->seq;
573 asd_free_coherent(asd_ha, seq->edb_arr[i]);
578 static void asd_free_escbs(struct asd_ha_struct *asd_ha)
580 struct asd_seq_data *seq = &asd_ha->seq;
593 static void asd_destroy_ha_caches(struct asd_ha_struct *asd_ha)
597 if (asd_ha->hw_prof.ddb_ext)
598 asd_free_coherent(asd_ha, asd_ha->hw_prof.ddb_ext);
599 if (asd_ha->hw_prof.scb_ext)
600 asd_free_coherent(asd_ha, asd_ha->hw_prof.scb_ext);
602 if (asd_ha->hw_prof.ddb_bitmap)
603 kfree(asd_ha->hw_prof.ddb_bitmap);
604 asd_ha->hw_prof.ddb_bitmap = NULL;
607 struct asd_phy *phy = &asd_ha->phys[i];
609 asd_free_coherent(asd_ha, phy->id_frm_tok);
611 if (asd_ha->seq.escb_arr)
612 asd_free_escbs(asd_ha);
613 if (asd_ha->seq.edb_arr)
614 asd_free_edbs(asd_ha);
615 if (asd_ha->hw_prof.ue.area) {
616 kfree(asd_ha->hw_prof.ue.area);
617 asd_ha->hw_prof.ue.area = NULL;
619 if (asd_ha->seq.tc_index_array) {
620 kfree(asd_ha->seq.tc_index_array);
621 kfree(asd_ha->seq.tc_index_bitmap);
622 asd_ha->seq.tc_index_array = NULL;
623 asd_ha->seq.tc_index_bitmap = NULL;
625 if (asd_ha->seq.actual_dl) {
626 asd_free_coherent(asd_ha, asd_ha->seq.actual_dl);
627 asd_ha->seq.actual_dl = NULL;
628 asd_ha->seq.dl = NULL;
630 if (asd_ha->seq.next_scb.vaddr) {
631 dma_pool_free(asd_ha->scb_pool, asd_ha->seq.next_scb.vaddr,
632 asd_ha->seq.next_scb.dma_handle);
633 asd_ha->seq.next_scb.vaddr = NULL;
635 dma_pool_destroy(asd_ha->scb_pool);
636 asd_ha->scb_pool = NULL;
687 static int asd_register_sas_ha(struct asd_ha_struct *asd_ha)
701 asd_ha->sas_ha.sas_ha_name = (char *) asd_ha->name;
702 asd_ha->sas_ha.lldd_module = THIS_MODULE;
703 asd_ha->sas_ha.sas_addr = &asd_ha->hw_prof.sas_addr[0];
706 sas_phys[i] = &asd_ha->phys[i].sas_phy;
707 sas_ports[i] = &asd_ha->ports[i];
710 asd_ha->sas_ha.sas_phy = sas_phys;
711 asd_ha->sas_ha.sas_port= sas_ports;
712 asd_ha->sas_ha.num_phys= ASD_MAX_PHYS;
714 asd_ha->sas_ha.lldd_queue_size = asd_ha->seq.can_queue;
715 asd_ha->sas_ha.lldd_max_execute_num = lldd_max_execute_num;
717 return sas_register_ha(&asd_ha->sas_ha);
720 static int asd_unregister_sas_ha(struct asd_ha_struct *asd_ha)
724 err = sas_unregister_ha(&asd_ha->sas_ha);
726 sas_remove_host(asd_ha->sas_ha.core.shost);
727 scsi_remove_host(asd_ha->sas_ha.core.shost);
728 scsi_host_put(asd_ha->sas_ha.core.shost);
730 kfree(asd_ha->sas_ha.sas_phy);
731 kfree(asd_ha->sas_ha.sas_port);
741 struct asd_ha_struct *asd_ha;
765 asd_ha = kzalloc(sizeof(*asd_ha), GFP_KERNEL);
766 if (!asd_ha) {
770 asd_ha->pcidev = dev;
771 asd_ha->sas_ha.dev = &asd_ha->pcidev->dev;
772 asd_ha->sas_ha.lldd_ha = asd_ha;
774 asd_ha->bios_status = FLASH_OK;
775 asd_ha->name = asd_dev->name;
776 asd_printk("found %s, device %s\n", asd_ha->name, pci_name(dev));
778 SHOST_TO_SAS_HA(shost) = &asd_ha->sas_ha;
779 asd_ha->sas_ha.core.shost = shost;
789 err = asd_dev->setup(asd_ha);
805 pci_set_drvdata(dev, asd_ha);
807 err = asd_map_ha(asd_ha);
811 err = asd_create_ha_caches(asd_ha);
815 err = asd_init_hw(asd_ha);
821 pci_name(dev), SAS_ADDR(asd_ha->hw_prof.sas_addr),
822 asd_ha->hw_prof.pcba_sn, asd_ha->hw_prof.max_phys,
823 asd_ha->hw_prof.num_phys,
824 asd_ha->hw_prof.flash.present ? "present" : "not present",
825 asd_ha->hw_prof.bios.present ? "build " : "not present",
826 asd_ha->hw_prof.bios.bld);
828 shost->can_queue = asd_ha->seq.can_queue;
831 pci_enable_msi(asd_ha->pcidev);
833 err = request_irq(asd_ha->pcidev->irq, asd_hw_isr, IRQF_SHARED,
834 ASD_DRIVER_NAME, asd_ha);
837 asd_ha->pcidev->irq, pci_name(asd_ha->pcidev));
840 asd_enable_ints(asd_ha);
842 err = asd_init_post_escbs(asd_ha);
845 pci_name(asd_ha->pcidev));
850 err = asd_create_dev_attrs(asd_ha);
854 err = asd_register_sas_ha(asd_ha);
863 asd_remove_dev_attrs(asd_ha);
866 asd_disable_ints(asd_ha);
867 free_irq(dev->irq, asd_ha);
871 asd_chip_hardrst(asd_ha);
873 asd_destroy_ha_caches(asd_ha);
875 asd_unmap_ha(asd_ha);
879 kfree(asd_ha);
887 static void asd_free_queues(struct asd_ha_struct *asd_ha)
893 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
894 asd_ha->seq.pending = 0;
895 list_splice_init(&asd_ha->seq.pend_q, &pending);
896 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
918 static void asd_turn_off_leds(struct asd_ha_struct *asd_ha)
920 u8 phy_mask = asd_ha->hw_prof.enabled_phys;
924 asd_turn_led(asd_ha, i, 0);
925 asd_control_led(asd_ha, i, 0);
931 struct asd_ha_struct *asd_ha = pci_get_drvdata(dev);
933 if (!asd_ha)
936 asd_unregister_sas_ha(asd_ha);
938 asd_disable_ints(asd_ha);
940 asd_remove_dev_attrs(asd_ha);
943 free_irq(dev->irq, asd_ha);
945 pci_disable_msi(asd_ha->pcidev);
946 asd_turn_off_leds(asd_ha);
947 asd_chip_hardrst(asd_ha);
948 asd_free_queues(asd_ha);
949 asd_destroy_ha_caches(asd_ha);
950 asd_unmap_ha(asd_ha);
951 kfree(asd_ha);
958 struct asd_ha_struct *asd_ha;
961 asd_ha = SHOST_TO_SAS_HA(shost)->lldd_ha;
962 err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys);