[libata] sata_sx4: convert to new exception handling methods

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

authored by Jeff Garzik and committed by Jeff Garzik 67651ee5 5d41343a

+121 -45
+121 -45
drivers/ata/sata_sx4.c
··· 213 213 214 214 215 215 static int pdc_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); 216 - static void pdc_eng_timeout(struct ata_port *ap); 217 - static void pdc_20621_phy_reset(struct ata_port *ap); 216 + static void pdc_error_handler(struct ata_port *ap); 217 + static void pdc_freeze(struct ata_port *ap); 218 + static void pdc_thaw(struct ata_port *ap); 218 219 static int pdc_port_start(struct ata_port *ap); 219 220 static void pdc20621_qc_prep(struct ata_queued_cmd *qc); 220 221 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf); ··· 234 233 void *psource, u32 offset, u32 size); 235 234 static void pdc20621_irq_clear(struct ata_port *ap); 236 235 static unsigned int pdc20621_qc_issue(struct ata_queued_cmd *qc); 236 + static int pdc_softreset(struct ata_link *link, unsigned int *class, 237 + unsigned long deadline); 238 + static void pdc_post_internal_cmd(struct ata_queued_cmd *qc); 239 + static int pdc_check_atapi_dma(struct ata_queued_cmd *qc); 237 240 238 241 239 242 static struct scsi_host_template pdc_sata_sht = { ··· 248 243 249 244 /* TODO: inherit from base port_ops after converting to new EH */ 250 245 static struct ata_port_operations pdc_20621_ops = { 251 - .sff_tf_load = pdc_tf_load_mmio, 252 - .sff_tf_read = ata_sff_tf_read, 253 - .sff_check_status = ata_sff_check_status, 254 - .sff_exec_command = pdc_exec_command_mmio, 255 - .sff_dev_select = ata_sff_dev_select, 256 - .phy_reset = pdc_20621_phy_reset, 246 + .inherits = &ata_sff_port_ops, 247 + 248 + .check_atapi_dma = pdc_check_atapi_dma, 257 249 .qc_prep = pdc20621_qc_prep, 258 250 .qc_issue = pdc20621_qc_issue, 259 - .qc_fill_rtf = ata_sff_qc_fill_rtf, 260 - .sff_data_xfer = ata_sff_data_xfer, 261 - .eng_timeout = pdc_eng_timeout, 262 - .sff_irq_clear = pdc20621_irq_clear, 263 - .sff_irq_on = ata_sff_irq_on, 251 + 252 + .freeze = pdc_freeze, 253 + .thaw = pdc_thaw, 254 + .softreset = pdc_softreset, 255 + .error_handler = pdc_error_handler, 256 + .lost_interrupt = ATA_OP_NULL, 257 + .post_internal_cmd = pdc_post_internal_cmd, 258 + 264 259 .port_start = pdc_port_start, 260 + 261 + .sff_tf_load = pdc_tf_load_mmio, 262 + .sff_exec_command = pdc_exec_command_mmio, 263 + .sff_irq_clear = pdc20621_irq_clear, 265 264 }; 266 265 267 266 static const struct ata_port_info pdc_port_info[] = { ··· 317 308 ap->private_data = pp; 318 309 319 310 return 0; 320 - } 321 - 322 - static void pdc_20621_phy_reset(struct ata_port *ap) 323 - { 324 - VPRINTK("ENTER\n"); 325 - ap->cbl = ATA_CBL_SATA; 326 - ata_port_probe(ap); 327 - ata_bus_reset(ap); 328 311 } 329 312 330 313 static inline void pdc20621_ata_sg(struct ata_taskfile *tf, u8 *buf, ··· 860 859 return IRQ_RETVAL(handled); 861 860 } 862 861 863 - static void pdc_eng_timeout(struct ata_port *ap) 862 + static void pdc_freeze(struct ata_port *ap) 864 863 { 865 - u8 drv_stat; 866 - struct ata_host *host = ap->host; 867 - struct ata_queued_cmd *qc; 868 - unsigned long flags; 864 + void __iomem *mmio = ap->ioaddr.cmd_addr; 865 + u32 tmp; 869 866 870 - DPRINTK("ENTER\n"); 867 + /* FIXME: if all 4 ATA engines are stopped, also stop HDMA engine */ 871 868 872 - spin_lock_irqsave(&host->lock, flags); 869 + tmp = readl(mmio + PDC_CTLSTAT); 870 + tmp |= PDC_MASK_INT; 871 + tmp &= ~PDC_DMA_ENABLE; 872 + writel(tmp, mmio + PDC_CTLSTAT); 873 + readl(mmio + PDC_CTLSTAT); /* flush */ 874 + } 873 875 874 - qc = ata_qc_from_tag(ap, ap->link.active_tag); 876 + static void pdc_thaw(struct ata_port *ap) 877 + { 878 + void __iomem *mmio = ap->ioaddr.cmd_addr; 879 + void __iomem *mmio_base; 880 + u32 tmp; 875 881 876 - switch (qc->tf.protocol) { 877 - case ATA_PROT_DMA: 878 - case ATA_PROT_NODATA: 879 - ata_port_printk(ap, KERN_ERR, "command timeout\n"); 880 - qc->err_mask |= __ac_err_mask(ata_wait_idle(ap)); 881 - break; 882 + /* FIXME: start HDMA engine, if zero ATA engines running */ 882 883 883 - default: 884 - drv_stat = ata_sff_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); 884 + /* reading SEQ mask register clears IRQ */ 885 + mmio_base = ap->host->iomap[PDC_MMIO_BAR] + PDC_CHIP0_OFS; 886 + readl(mmio_base + PDC_20621_SEQMASK); 885 887 886 - ata_port_printk(ap, KERN_ERR, 887 - "unknown timeout, cmd 0x%x stat 0x%x\n", 888 - qc->tf.command, drv_stat); 888 + /* turn IRQ back on */ 889 + tmp = readl(mmio + PDC_CTLSTAT); 890 + tmp &= ~PDC_MASK_INT; 891 + writel(tmp, mmio + PDC_CTLSTAT); 892 + readl(mmio + PDC_CTLSTAT); /* flush */ 893 + } 889 894 890 - qc->err_mask |= ac_err_mask(drv_stat); 891 - break; 895 + static void pdc_reset_port(struct ata_port *ap) 896 + { 897 + void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT; 898 + unsigned int i; 899 + u32 tmp; 900 + 901 + /* FIXME: handle HDMA copy engine */ 902 + 903 + for (i = 11; i > 0; i--) { 904 + tmp = readl(mmio); 905 + if (tmp & PDC_RESET) 906 + break; 907 + 908 + udelay(100); 909 + 910 + tmp |= PDC_RESET; 911 + writel(tmp, mmio); 892 912 } 893 913 894 - spin_unlock_irqrestore(&host->lock, flags); 895 - ata_eh_qc_complete(qc); 896 - DPRINTK("EXIT\n"); 914 + tmp &= ~PDC_RESET; 915 + writel(tmp, mmio); 916 + readl(mmio); /* flush */ 917 + } 918 + 919 + static int pdc_softreset(struct ata_link *link, unsigned int *class, 920 + unsigned long deadline) 921 + { 922 + pdc_reset_port(link->ap); 923 + return ata_sff_softreset(link, class, deadline); 924 + } 925 + 926 + static void pdc_error_handler(struct ata_port *ap) 927 + { 928 + if (!(ap->pflags & ATA_PFLAG_FROZEN)) 929 + pdc_reset_port(ap); 930 + 931 + ata_std_error_handler(ap); 932 + } 933 + 934 + static void pdc_post_internal_cmd(struct ata_queued_cmd *qc) 935 + { 936 + struct ata_port *ap = qc->ap; 937 + 938 + /* make DMA engine forget about the failed command */ 939 + if (qc->flags & ATA_QCFLAG_FAILED) 940 + pdc_reset_port(ap); 941 + } 942 + 943 + static int pdc_check_atapi_dma(struct ata_queued_cmd *qc) 944 + { 945 + u8 *scsicmd = qc->scsicmd->cmnd; 946 + int pio = 1; /* atapi dma off by default */ 947 + 948 + /* Whitelist commands that may use DMA. */ 949 + switch (scsicmd[0]) { 950 + case WRITE_12: 951 + case WRITE_10: 952 + case WRITE_6: 953 + case READ_12: 954 + case READ_10: 955 + case READ_6: 956 + case 0xad: /* READ_DVD_STRUCTURE */ 957 + case 0xbe: /* READ_CD */ 958 + pio = 0; 959 + } 960 + /* -45150 (FFFF4FA2) to -1 (FFFFFFFF) shall use PIO mode */ 961 + if (scsicmd[0] == WRITE_10) { 962 + unsigned int lba = 963 + (scsicmd[2] << 24) | 964 + (scsicmd[3] << 16) | 965 + (scsicmd[4] << 8) | 966 + scsicmd[5]; 967 + if (lba >= 0xFFFF4FA2) 968 + pio = 1; 969 + } 970 + return pio; 897 971 } 898 972 899 973 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)