Lines Matching defs:asd_ha

65 static int asd_map_memio(struct asd_ha_struct *asd_ha)
70 asd_ha->iospace = 0;
72 io_handle = &asd_ha->io_handle[i==0?0:1];
73 io_handle->start = pci_resource_start(asd_ha->pcidev, i);
74 io_handle->len = pci_resource_len(asd_ha->pcidev, i);
75 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i);
79 i==0?0:1, pci_name(asd_ha->pcidev));
82 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME);
85 pci_name(asd_ha->pcidev));
91 pci_name(asd_ha->pcidev));
99 pci_release_region(asd_ha->pcidev, i);
102 io_handle = &asd_ha->io_handle[0];
104 pci_release_region(asd_ha->pcidev, 0);
109 static void asd_unmap_memio(struct asd_ha_struct *asd_ha)
113 io_handle = &asd_ha->io_handle[1];
115 pci_release_region(asd_ha->pcidev, 2);
117 io_handle = &asd_ha->io_handle[0];
119 pci_release_region(asd_ha->pcidev, 0);
122 static int asd_map_ioport(struct asd_ha_struct *asd_ha)
125 struct asd_ha_addrspace *io_handle = &asd_ha->io_handle[0];
127 asd_ha->iospace = 1;
128 io_handle->start = pci_resource_start(asd_ha->pcidev, i);
129 io_handle->len = pci_resource_len(asd_ha->pcidev, i);
130 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i);
134 pci_name(asd_ha->pcidev));
137 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME);
140 pci_name(asd_ha->pcidev));
146 static void asd_unmap_ioport(struct asd_ha_struct *asd_ha)
148 pci_release_region(asd_ha->pcidev, PCI_IOBAR_OFFSET);
151 static int asd_map_ha(struct asd_ha_struct *asd_ha)
156 err = pci_read_config_word(asd_ha->pcidev, PCI_COMMAND, &cmd_reg);
159 pci_name(asd_ha->pcidev));
165 if ((err = asd_map_memio(asd_ha)))
168 if ((err = asd_map_ioport(asd_ha)))
171 pci_name(asd_ha->pcidev));
174 pci_name(asd_ha->pcidev));
183 static void asd_unmap_ha(struct asd_ha_struct *asd_ha)
185 if (asd_ha->iospace)
186 asd_unmap_ioport(asd_ha);
188 asd_unmap_memio(asd_ha);
197 static int asd_common_setup(struct asd_ha_struct *asd_ha)
201 asd_ha->revision_id = asd_ha->pcidev->revision;
204 if (asd_ha->revision_id < AIC9410_DEV_REV_B0) {
206 pci_name(asd_ha->pcidev),
207 asd_dev_rev[asd_ha->revision_id],
208 asd_ha->revision_id);
212 asd_ha->hw_prof.max_scbs = 512;
213 asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS;
214 asd_ha->hw_prof.num_phys = ASD_MAX_PHYS;
216 asd_ha->hw_prof.enabled_phys = 0xFF;
218 asd_ha->hw_prof.phy_desc[i].max_sas_lrate =
220 asd_ha->hw_prof.phy_desc[i].min_sas_lrate =
222 asd_ha->hw_prof.phy_desc[i].max_sata_lrate =
224 asd_ha->hw_prof.phy_desc[i].min_sata_lrate =
233 static int asd_aic9410_setup(struct asd_ha_struct *asd_ha)
235 int err = asd_common_setup(asd_ha);
240 asd_ha->hw_prof.addr_range = 8;
241 asd_ha->hw_prof.port_name_base = 0;
242 asd_ha->hw_prof.dev_name_base = 8;
243 asd_ha->hw_prof.sata_name_base = 16;
248 static int asd_aic9405_setup(struct asd_ha_struct *asd_ha)
250 int err = asd_common_setup(asd_ha);
255 asd_ha->hw_prof.addr_range = 4;
256 asd_ha->hw_prof.port_name_base = 0;
257 asd_ha->hw_prof.dev_name_base = 4;
258 asd_ha->hw_prof.sata_name_base = 8;
266 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
268 asd_dev_rev[asd_ha->revision_id]);
275 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
276 return snprintf(buf, PAGE_SIZE, "%d\n", asd_ha->hw_prof.bios.bld);
283 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
284 return snprintf(buf, PAGE_SIZE, "%s\n", asd_ha->hw_prof.pcba_sn);
331 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
365 if (asd_ha->bios_status == FLASH_IN_PROGRESS) {
369 err = request_firmware(&asd_ha->bios_image,
371 &asd_ha->pcidev->dev);
379 hdr_ptr = (struct bios_file_header *)asd_ha->bios_image->data;
381 if ((hdr_ptr->contrl_id.vendor != asd_ha->pcidev->vendor ||
382 hdr_ptr->contrl_id.device != asd_ha->pcidev->device) &&
383 (hdr_ptr->contrl_id.sub_vendor != asd_ha->pcidev->vendor ||
384 hdr_ptr->contrl_id.sub_device != asd_ha->pcidev->device)) {
393 asd_ha->pcidev->vendor,
394 asd_ha->pcidev->device);
399 if (hdr_ptr->filelen != asd_ha->bios_image->size) {
406 csum += asd_ha->bios_image->data[i];
414 asd_ha->bios_status = FLASH_IN_PROGRESS;
415 err = asd_write_flash_seg(asd_ha,
416 &asd_ha->bios_image->data[sizeof(*hdr_ptr)],
419 err = asd_verify_flash_seg(asd_ha,
420 &asd_ha->bios_image->data[sizeof(*hdr_ptr)],
423 asd_ha->bios_status = FLASH_IN_PROGRESS;
424 err = asd_verify_flash_seg(asd_ha,
425 &asd_ha->bios_image->data[sizeof(header)],
430 release_firmware(asd_ha->bios_image);
434 asd_ha->bios_status = err;
446 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
449 if (flash_error_table[i].err_code == asd_ha->bios_status)
452 if (asd_ha->bios_status != FLASH_IN_PROGRESS)
453 asd_ha->bios_status = FLASH_OK;
463 static int asd_create_dev_attrs(struct asd_ha_struct *asd_ha)
467 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
471 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
475 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
478 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
485 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
487 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
489 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
493 static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha)
495 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
496 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
497 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
498 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
506 int (*setup)(struct asd_ha_struct *asd_ha);
520 static int asd_create_ha_caches(struct asd_ha_struct *asd_ha)
522 asd_ha->scb_pool = dma_pool_create(ASD_DRIVER_NAME "_scb_pool",
523 &asd_ha->pcidev->dev,
526 if (!asd_ha->scb_pool) {
536 * asd_ha: pointer to host adapter structure
538 static void asd_free_edbs(struct asd_ha_struct *asd_ha)
540 struct asd_seq_data *seq = &asd_ha->seq;
544 asd_free_coherent(asd_ha, seq->edb_arr[i]);
549 static void asd_free_escbs(struct asd_ha_struct *asd_ha)
551 struct asd_seq_data *seq = &asd_ha->seq;
564 static void asd_destroy_ha_caches(struct asd_ha_struct *asd_ha)
568 if (asd_ha->hw_prof.ddb_ext)
569 asd_free_coherent(asd_ha, asd_ha->hw_prof.ddb_ext);
570 if (asd_ha->hw_prof.scb_ext)
571 asd_free_coherent(asd_ha, asd_ha->hw_prof.scb_ext);
573 kfree(asd_ha->hw_prof.ddb_bitmap);
574 asd_ha->hw_prof.ddb_bitmap = NULL;
577 struct asd_phy *phy = &asd_ha->phys[i];
579 asd_free_coherent(asd_ha, phy->id_frm_tok);
581 if (asd_ha->seq.escb_arr)
582 asd_free_escbs(asd_ha);
583 if (asd_ha->seq.edb_arr)
584 asd_free_edbs(asd_ha);
585 if (asd_ha->hw_prof.ue.area) {
586 kfree(asd_ha->hw_prof.ue.area);
587 asd_ha->hw_prof.ue.area = NULL;
589 if (asd_ha->seq.tc_index_array) {
590 kfree(asd_ha->seq.tc_index_array);
591 kfree(asd_ha->seq.tc_index_bitmap);
592 asd_ha->seq.tc_index_array = NULL;
593 asd_ha->seq.tc_index_bitmap = NULL;
595 if (asd_ha->seq.actual_dl) {
596 asd_free_coherent(asd_ha, asd_ha->seq.actual_dl);
597 asd_ha->seq.actual_dl = NULL;
598 asd_ha->seq.dl = NULL;
600 if (asd_ha->seq.next_scb.vaddr) {
601 dma_pool_free(asd_ha->scb_pool, asd_ha->seq.next_scb.vaddr,
602 asd_ha->seq.next_scb.dma_handle);
603 asd_ha->seq.next_scb.vaddr = NULL;
605 dma_pool_destroy(asd_ha->scb_pool);
606 asd_ha->scb_pool = NULL;
655 static int asd_register_sas_ha(struct asd_ha_struct *asd_ha)
669 asd_ha->sas_ha.sas_ha_name = (char *) asd_ha->name;
670 asd_ha->sas_ha.lldd_module = THIS_MODULE;
671 asd_ha->sas_ha.sas_addr = &asd_ha->hw_prof.sas_addr[0];
674 sas_phys[i] = &asd_ha->phys[i].sas_phy;
675 sas_ports[i] = &asd_ha->ports[i];
678 asd_ha->sas_ha.sas_phy = sas_phys;
679 asd_ha->sas_ha.sas_port= sas_ports;
680 asd_ha->sas_ha.num_phys= ASD_MAX_PHYS;
682 return sas_register_ha(&asd_ha->sas_ha);
685 static int asd_unregister_sas_ha(struct asd_ha_struct *asd_ha)
689 err = sas_unregister_ha(&asd_ha->sas_ha);
691 sas_remove_host(asd_ha->sas_ha.core.shost);
692 scsi_host_put(asd_ha->sas_ha.core.shost);
694 kfree(asd_ha->sas_ha.sas_phy);
695 kfree(asd_ha->sas_ha.sas_port);
704 struct asd_ha_struct *asd_ha;
728 asd_ha = kzalloc(sizeof(*asd_ha), GFP_KERNEL);
729 if (!asd_ha) {
733 asd_ha->pcidev = dev;
734 asd_ha->sas_ha.dev = &asd_ha->pcidev->dev;
735 asd_ha->sas_ha.lldd_ha = asd_ha;
737 asd_ha->bios_status = FLASH_OK;
738 asd_ha->name = asd_dev->name;
739 asd_printk("found %s, device %s\n", asd_ha->name, pci_name(dev));
741 SHOST_TO_SAS_HA(shost) = &asd_ha->sas_ha;
742 asd_ha->sas_ha.core.shost = shost;
752 err = asd_dev->setup(asd_ha);
765 pci_set_drvdata(dev, asd_ha);
767 err = asd_map_ha(asd_ha);
771 err = asd_create_ha_caches(asd_ha);
775 err = asd_init_hw(asd_ha);
781 pci_name(dev), SAS_ADDR(asd_ha->hw_prof.sas_addr),
782 asd_ha->hw_prof.pcba_sn, asd_ha->hw_prof.max_phys,
783 asd_ha->hw_prof.num_phys,
784 asd_ha->hw_prof.flash.present ? "present" : "not present",
785 asd_ha->hw_prof.bios.present ? "build " : "not present",
786 asd_ha->hw_prof.bios.bld);
788 shost->can_queue = asd_ha->seq.can_queue;
791 pci_enable_msi(asd_ha->pcidev);
793 err = request_irq(asd_ha->pcidev->irq, asd_hw_isr, IRQF_SHARED,
794 ASD_DRIVER_NAME, asd_ha);
797 asd_ha->pcidev->irq, pci_name(asd_ha->pcidev));
800 asd_enable_ints(asd_ha);
802 err = asd_init_post_escbs(asd_ha);
805 pci_name(asd_ha->pcidev));
810 err = asd_create_dev_attrs(asd_ha);
814 err = asd_register_sas_ha(asd_ha);
823 asd_remove_dev_attrs(asd_ha);
826 asd_disable_ints(asd_ha);
827 free_irq(dev->irq, asd_ha);
831 asd_chip_hardrst(asd_ha);
833 asd_destroy_ha_caches(asd_ha);
835 asd_unmap_ha(asd_ha);
839 kfree(asd_ha);
847 static void asd_free_queues(struct asd_ha_struct *asd_ha)
853 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
854 asd_ha->seq.pending = 0;
855 list_splice_init(&asd_ha->seq.pend_q, &pending);
856 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
878 static void asd_turn_off_leds(struct asd_ha_struct *asd_ha)
880 u8 phy_mask = asd_ha->hw_prof.enabled_phys;
884 asd_turn_led(asd_ha, i, 0);
885 asd_control_led(asd_ha, i, 0);
891 struct asd_ha_struct *asd_ha = pci_get_drvdata(dev);
893 if (!asd_ha)
896 asd_unregister_sas_ha(asd_ha);
898 asd_disable_ints(asd_ha);
900 asd_remove_dev_attrs(asd_ha);
904 free_irq(dev->irq, asd_ha);
906 pci_disable_msi(asd_ha->pcidev);
907 asd_turn_off_leds(asd_ha);
908 asd_chip_hardrst(asd_ha);
909 asd_free_queues(asd_ha);
910 asd_destroy_ha_caches(asd_ha);
911 asd_unmap_ha(asd_ha);
912 kfree(asd_ha);
919 struct asd_ha_struct *asd_ha;
922 asd_ha = SHOST_TO_SAS_HA(shost)->lldd_ha;
923 err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys);